pax_global_header00006660000000000000000000000064147575767600014542gustar00rootroot0000000000000052 comment=15bbb752ebd00d55d8937c4cc1f6f52094fb114c yoshimi-2.3.3.3/000077500000000000000000000000001475757676000133715ustar00rootroot00000000000000yoshimi-2.3.3.3/CHECK_ON_RELEASE000066400000000000000000000027451475757676000156750ustar00rootroot00000000000000 ***** 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! Rebase yoshipi branch to release version. This is so that owners of newer versions of this unit can upgrade to a stable version. 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. After commit Update wikipedia entry. Tell everyone :) yoshimi-2.3.3.3/COPYING000066400000000000000000001426541475757676000144400ustar00rootroot00000000000000Foreword: 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.3.3/Changelog000066400000000000000000010214121475757676000152040ustar00rootroot00000000000000yoshimi 2.3.3.3 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.3.3/Dependencies000066400000000000000000000025271475757676000157100ustar00rootroot00000000000000Packages 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.3.3/INSTALL000066400000000000000000000076751475757676000144410ustar00rootroot00000000000000---- 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.3.3/INSTALL_CUSTOM000066400000000000000000000054451475757676000155240ustar00rootroot00000000000000---- 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.3.3/README.md000066400000000000000000000011641475757676000146520ustar00rootroot00000000000000## Yoshimi Yoshimi is a software audio synthesizer, currently only available for Linux. ### Current version Version 2.3.3.3 * This is just a minor update with bugfixes and some new instruments in the banks. ### 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.3.3/README.txt000066400000000000000000000005711475757676000150720ustar00rootroot00000000000000Version 2.3.3.3 This is just a minor update with bugfixes and some new instruments in the banks. 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.3.3/Util/000077500000000000000000000000001475757676000143065ustar00rootroot00000000000000yoshimi-2.3.3.3/Util/1stReadMe.txt000066400000000000000000000034641475757676000166430ustar00rootroot00000000000000The 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.3.3/Util/ControlModel.svg000066400000000000000000001225201475757676000174320ustar00rootroot00000000000000 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.3.3/Util/MakeSplash.sh000077500000000000000000000043651475757676000167050ustar00rootroot00000000000000#!/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.3.3/Util/YoshimiSplash.svg000066400000000000000000012207251475757676000176340ustar00rootroot00000000000000 image/svg+xml yoshimi-2.3.3.3/Util/incBuildNumber.py000066400000000000000000000011301475757676000175550ustar00rootroot00000000000000#!/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.3.3/Util/midiListGen.cpp000066400000000000000000000050241475757676000172230ustar00rootroot00000000000000/* * 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.3.3/Util/splashdefault.png000066400000000000000000002472461475757676000176720ustar00rootroot00000000000000PNG  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.3.3/Util/updateGuideVersion.py000066400000000000000000000012051475757676000204640ustar00rootroot00000000000000#!/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.3.3/Yoshimi_Helpers000066400000000000000000000012251475757676000164170ustar00rootroot00000000000000Some 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.3.3/banks/000077500000000000000000000000001475757676000144675ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Arpeggios/000077500000000000000000000000001475757676000164075ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Arpeggios/.bankdir000066400000000000000000000000061475757676000200160ustar00rootroot000000000000000.0.0 yoshimi-2.3.3.3/banks/Arpeggios/0001-Arpeggio1.xiz000066400000000000000000000050371475757676000213440ustar00rootroot00000000000000\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.3.3/banks/Arpeggios/0002-Arpeggio2.xiz000066400000000000000000000045451475757676000213510ustar00rootroot00000000000000[[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.3.3/banks/Arpeggios/0003-Arpeggio3.xiz000066400000000000000000000046501475757676000213500ustar00rootroot00000000000000r}= 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.3.3/banks/Arpeggios/0004-Arpeggio4.xiz000066400000000000000000000054121475757676000213470ustar00rootroot00000000000000][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.3.3/banks/Arpeggios/0006-Arpeggio6.xiz000066400000000000000000000053401475757676000213530ustar00rootroot00000000000000r8=_ջ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.3.3/banks/Arpeggios/0007-Arpeggio7.xiz000066400000000000000000000074241475757676000213620ustar00rootroot00000000000000]]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.3.3/banks/Arpeggios/0008-Arpeggio8.xiz000066400000000000000000000046361475757676000213660ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0009-Arpeggio9.xiz000066400000000000000000000052641475757676000213660ustar00rootroot00000000000000r6}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.3.3/banks/Arpeggios/0010-Arpeggio10.xiz000066400000000000000000000047541475757676000214310ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0011-Arpeggio11.xiz000066400000000000000000000047711475757676000214320ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0039-Soft Arpeggio1.xiz000066400000000000000000000047451475757676000222600ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0040-Soft Arpeggio2.xiz000066400000000000000000000047411475757676000222450ustar00rootroot00000000000000\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.3.3/banks/Arpeggios/0041-Soft Arpeggio3.xiz000066400000000000000000000044741475757676000222520ustar00rootroot00000000000000[[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.3.3/banks/Arpeggios/0042-Soft Arpeggio4.xiz000066400000000000000000000050411475757676000222430ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0043-Soft Arpeggio5.xiz000066400000000000000000000047241475757676000222540ustar00rootroot00000000000000\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.3.3/banks/Arpeggios/0065-Hyper Organ1.xiz000066400000000000000000000051761475757676000217430ustar00rootroot00000000000000\[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.3.3/banks/Arpeggios/0068-Glass Arpeggio1.xiz000066400000000000000000000047301475757676000224120ustar00rootroot00000000000000\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.3.3/banks/Arpeggios/0069-Glass Arpeggio2.xiz000066400000000000000000000047261475757676000224210ustar00rootroot00000000000000\[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.3.3/banks/Bass/000077500000000000000000000000001475757676000153575ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Bass/.bankdir000066400000000000000000000000061475757676000167660ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Bass/0001-Bass 1.xiz000066400000000000000000000041221475757676000175010ustar00rootroot00000000000000[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.3.3/banks/Bass/0004-Bass 4.xiz000066400000000000000000000041521475757676000175120ustar00rootroot00000000000000[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.3.3/banks/Bass/0005-Bass 5.xiz000066400000000000000000000041401475757676000175110ustar00rootroot00000000000000[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.3.3/banks/Bass/0065-upright bass.xiz000066400000000000000000000163261475757676000211060ustar00rootroot00000000000000][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.3.3/banks/Brass/0003-Synth Brazz 1.xiz000066400000000000000000000045651475757676000211660ustar00rootroot00000000000000\[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.3.3/banks/Brass/0004-Synth Brazz 2.xiz000066400000000000000000000045441475757676000211650ustar00rootroot00000000000000\[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.3.3/banks/Brass/0005-Synth Brass 3.xiz000066400000000000000000000050501475757676000211420ustar00rootroot00000000000000]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.3.3/banks/Brass/0006-Synth Brass 4.xiz000066400000000000000000000051651475757676000211530ustar00rootroot00000000000000][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.3.3/banks/Brass/0007-Synth Brass 5.xiz000066400000000000000000000052721475757676000211540ustar00rootroot00000000000000][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.3.3/banks/Brass/0009-Wah Brass.xiz000066400000000000000000000047431475757676000204450ustar00rootroot00000000000000\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.3.3/banks/Brass/0010-Solo Synth1.xiz000066400000000000000000000042161475757676000207410ustar00rootroot00000000000000[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.3.3/banks/Brass/0011-Brazz 1.xiz000066400000000000000000000046171475757676000200750ustar00rootroot00000000000000[[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.3.3/banks/Brass/0012-Brazz 2.xiz000066400000000000000000000054011475757676000200670ustar00rootroot00000000000000]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.3.3/banks/Brass/0033-Analog Brass 1.xiz000066400000000000000000000042061475757676000212370ustar00rootroot00000000000000[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.3.3/banks/Brass/0034-Analog Brass 2.xiz000066400000000000000000000043051475757676000212410ustar00rootroot00000000000000[[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.3.3/banks/Brass/0036-Analog Brass 4.xiz000066400000000000000000000046341475757676000212520ustar00rootroot00000000000000\_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.3.3/banks/Brass/0065-Simple Brass.xiz000066400000000000000000000041041475757676000211500ustar00rootroot00000000000000ZYs6~ϯ`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.3.3/banks/Brass/0066-Fat Brass.xiz000066400000000000000000000046761475757676000204500ustar00rootroot00000000000000]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.3.3/banks/Brass/0067-Brass Pad1.xiz000066400000000000000000000043741475757676000205170ustar00rootroot00000000000000\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.3.3/banks/Brass/0068-Brass Pad2.xiz000066400000000000000000000041151475757676000205120ustar00rootroot00000000000000Zms8_=;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.3.3/banks/Choir_and_Voice/0004-Voice OOH.xiz000066400000000000000000000052721475757676000223000ustar00rootroot00000000000000]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.3.3/banks/Choir_and_Voice/0005-Choir Pad1.xiz000066400000000000000000000036571475757676000224450ustar00rootroot00000000000000Zms8_=%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.3.3/banks/Choir_and_Voice/0006-Choir Pad2.xiz000066400000000000000000000036731475757676000224450ustar00rootroot00000000000000Zms8_=%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.3.3/banks/Choir_and_Voice/0007-Choir Pad3.xiz000066400000000000000000000075171475757676000224500ustar00rootroot00000000000000][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.3.3/banks/Choir_and_Voice/0008-Choir Pad4.xiz000066400000000000000000000036421475757676000224450ustar00rootroot00000000000000Zs8~_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.3.3/banks/Choir_and_Voice/0033-Choir.xiz000066400000000000000000000023121475757676000216630ustar00rootroot00000000000000Xr8}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.3.3/banks/Choir_and_Voice/0035-Wah Choir.xiz000066400000000000000000000025521475757676000223730ustar00rootroot00000000000000YmW8`Ţ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.3.3/banks/Choir_and_Voice/0037-Voiced Synth.xiz000066400000000000000000000072761475757676000231400ustar00rootroot00000000000000]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.3.3/banks/Choir_and_Voice/0039-Ohh Choir.xiz000066400000000000000000000037001475757676000223720ustar00rootroot00000000000000Zs8~_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.3.3/banks/Choir_and_Voice/0065-Vocal Morph 1.xiz000066400000000000000000000061611475757676000230650ustar00rootroot00000000000000]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.3.3/banks/Choir_and_Voice/0066-Vocal Morph 2.xiz000066400000000000000000000060331475757676000230650ustar00rootroot00000000000000]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.3.3/banks/Choir_and_Voice/0067-Vocal Morph 3.xiz000066400000000000000000000062641475757676000230750ustar00rootroot00000000000000][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.3.3/banks/Choir_and_Voice/0068-Vocal Morph 4.xiz000066400000000000000000000062561475757676000231000ustar00rootroot00000000000000][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.3.3/banks/Choir_and_Voice/0069-Vocal Morph 5.xiz000066400000000000000000000064571475757676000231050ustar00rootroot00000000000000][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.3.3/banks/Choir_and_Voice/0070-Vocal Morph 6.xiz000066400000000000000000000060221475757676000230620ustar00rootroot00000000000000][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.3.3/banks/Choir_and_Voice/0097-Dooo.xiz000066400000000000000000000052001475757676000215300ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/000077500000000000000000000000001475757676000167105ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Cormi_Sound/.bankdir000066400000000000000000000000061475757676000203170ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Cormi_Sound/0001-Bassoon.xiz000066400000000000000000000116221475757676000214300ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0002-Bassoon2.xiz000066400000000000000000000100531475757676000215100ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0003-Bassoon3.xiz000066400000000000000000000121421475757676000215130ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0004-Volo.xiz000066400000000000000000000057221475757676000207520ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0006-Arpeggio 01.xiz000066400000000000000000000070471475757676000217750ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0007-Arpeggio 02.xiz000066400000000000000000000047771475757676000220060ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0008-Arpeggio 03.xiz000066400000000000000000000152301475757676000217720ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0009-Glass Arpeggio2.xiz000066400000000000000000000051561475757676000227120ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0012-Ghost Whistle.xiz000066400000000000000000000061251475757676000225140ustar00rootroot00000000000000vڸ_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.3.3/banks/Cormi_Sound/0013-Spazio1.xiz000066400000000000000000000025231475757676000213550ustar00rootroot00000000000000Ys8~_=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.3.3/banks/Cormi_Sound/0014-Spazio2.xiz000066400000000000000000000030141475757676000213530ustar00rootroot00000000000000Yr6}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.3.3/banks/Cormi_Sound/0015-Space Synth.xiz000066400000000000000000000055031475757676000221530ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0017-friendly sines.xiz000066400000000000000000000063761475757676000227630ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0019-Acquoso_1.xiz000066400000000000000000000064301475757676000216700ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0024-Fagotto_02.xiz000066400000000000000000000111451475757676000217350ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0025-Fagotto_03.xiz000066400000000000000000000114041475757676000217350ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0027-Delicato_01.xiz000066400000000000000000000100011475757676000220460ustar00rootroot00000000000000rF=_ջ-;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.3.3/banks/Cormi_Sound/0028-Delicato_02.xiz000066400000000000000000000057421475757676000220700ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0029-Delicato_03.xiz000066400000000000000000000161501475757676000220650ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0031-Wah_dolce_1.xiz000066400000000000000000000051341475757676000221350ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0032-Wah_dolce_2.xiz000066400000000000000000000070251475757676000221400ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0033-Long Space Choir 2.xiz000066400000000000000000000041151475757676000231120ustar00rootroot00000000000000Zms6~=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.3.3/banks/Cormi_Sound/0034-Choir Pad4.xiz000066400000000000000000000040531475757676000216470ustar00rootroot00000000000000Zs6~#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.3.3/banks/Cormi_Sound/0035-Ancient_Echos.xiz000066400000000000000000000024411475757676000225340ustar00rootroot00000000000000,`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.3.3/banks/Cormi_Sound/0036-Campane.xiz000066400000000000000000000047101475757676000214000ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0037-Chorus.xiz000066400000000000000000000030011475757676000212700ustar00rootroot00000000000000Y]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.3.3/banks/Cormi_Sound/0038-HellVoice.xiz000066400000000000000000000072571475757676000217210ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0039-Chorus2.xiz000066400000000000000000000123071475757676000213650ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0041-DarkNight.xiz000066400000000000000000000115721475757676000217070ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0042-LightDawn.xiz000066400000000000000000000161631475757676000217170ustar00rootroot00000000000000]]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.3.3/banks/Cormi_Sound/0043-Fiiuu.xiz000066400000000000000000000104601475757676000211120ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0046-Spazio_Profondo2.xiz000066400000000000000000000054731475757676000232410ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0047-Spazio_Profondo3.xiz000066400000000000000000000056431475757676000232420ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0049-DolcePiano_01.xiz000066400000000000000000000042031475757676000223520ustar00rootroot00000000000000ZmsF_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.3.3/banks/Cormi_Sound/0050-DolcePiano_02.xiz000066400000000000000000000076031475757676000223520ustar00rootroot00000000000000rF=_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.3.3/banks/Cormi_Sound/0051-DolcePiano_03.xiz000066400000000000000000000043151475757676000223510ustar00rootroot00000000000000ZKsH`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.3.3/banks/Cormi_Sound/0053-Ding_01.xiz000066400000000000000000000045101475757676000212120ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0056-Senza_tempo.xiz000066400000000000000000000124341475757676000223240ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0062-Sospirato_01.xiz000066400000000000000000000050371475757676000223210ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0064-Sospirato_03.xiz000066400000000000000000000134031475757676000223210ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0065-Synth_Piano_3.xiz000066400000000000000000000037631475757676000225220ustar00rootroot00000000000000ZmsF_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.3.3/banks/Cormi_Sound/0066-Synth_Piano_2.xiz000066400000000000000000000042531475757676000225150ustar00rootroot00000000000000Zms6~ 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.3.3/banks/Cormi_Sound/0069-Pianola.xiz000066400000000000000000000151541475757676000214310ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0072-Zufolo_1.xiz000066400000000000000000000100521475757676000215260ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0073-Zufolo_2.xiz000066400000000000000000000055411475757676000215370ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0074-Zufolo_3.xiz000066400000000000000000000101041475757676000215300ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0075-Zufolo_4.xiz000066400000000000000000000173711475757676000215470ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0076-Pinkollo.xiz000066400000000000000000000031101475757676000216200ustar00rootroot00000000000000ZS8~ 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.3.3/banks/Cormi_Sound/0078-Tremulo_01.xiz000066400000000000000000000051371475757676000217750ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0079-Tremulo_02.xiz000066400000000000000000000051621475757676000217750ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0081-Organetto_01.xiz000066400000000000000000000124051475757676000222760ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0082-Organetto_02.xiz000066400000000000000000000115471475757676000223060ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0084-Organo_01.xiz000066400000000000000000000047551475757676000215750ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0085-Organo_02.xiz000066400000000000000000000031011475757676000215570ustar00rootroot00000000000000ZMs6W2qfdhI$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.3.3/banks/Cormi_Sound/0086-Organo_03.xiz000066400000000000000000000061051475757676000215700ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0087-Harp_3.xiz000066400000000000000000000061131475757676000211550ustar00rootroot00000000000000,`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.3.3/banks/Cormi_Sound/0088-Harp4.xiz000066400000000000000000000053501475757676000210220ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0090-Dolcino_01.xiz000066400000000000000000000115441475757676000217260ustar00rootroot00000000000000]]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.3.3/banks/Cormi_Sound/0091-Dolcino_02.xiz000066400000000000000000000271571475757676000217370ustar00rootroot00000000000000ksWWpV/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.3.3/banks/Cormi_Sound/0095-Accordian.xiz000066400000000000000000000065671475757676000217400ustar00rootroot00000000000000 ]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.3.3/banks/Cormi_Sound/0096-padNice.xiz000066400000000000000000000220531475757676000214050ustar00rootroot00000000000000 ]]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.3.3/banks/Cormi_Sound/0097-k.xiz000066400000000000000000000062171475757676000203010ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0099-a.xiz000066400000000000000000000075301475757676000202700ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0100-Steel Rhodes.xiz000066400000000000000000000064021475757676000223050ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0101-Sweet_Night.xiz000066400000000000000000000111661475757676000222500ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0104-Ice Rhodes2.xiz000066400000000000000000000053671475757676000220300ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0105-Voluttuoso.xiz000066400000000000000000000117261475757676000222410ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0106-Entropia.xiz000066400000000000000000000070331475757676000216140ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0108-Arcano.xiz000066400000000000000000000032661475757676000212440ustar00rootroot00000000000000ZMs6W2eYgdh}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.3.3/banks/Cormi_Sound/0109-Arcano2.xiz000066400000000000000000000114171475757676000213240ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0110-Arcano3.xiz000066400000000000000000000027021475757676000213120ustar00rootroot00000000000000YS6~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.3.3/banks/Cormi_Sound/0113-Glass_02a.xiz000066400000000000000000000052201475757676000215400ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0114-Glass_02b.xiz000066400000000000000000000052141475757676000215450ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0115-Glass_03.xiz000066400000000000000000000031051475757676000214020ustar00rootroot00000000000000YS6~"; 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.3.3/banks/Cormi_Sound/0116-Glass_04.xiz000066400000000000000000000027261475757676000214140ustar00rootroot00000000000000Ys6~=%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.3.3/banks/Cormi_Sound/0119-Arcadia_1.xiz000066400000000000000000000271341475757676000216070ustar00rootroot00000000000000ے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.3.3/banks/Cormi_Sound/0120-Arcadia_2.xiz000066400000000000000000000102371475757676000215740ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0121-Arcadia_3.xiz000066400000000000000000000076601475757676000216040ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0122-Arcadia_4.xiz000066400000000000000000000034451475757676000216030ustar00rootroot00000000000000,`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.3.3/banks/Cormi_Sound/0124-Armonica.xiz000066400000000000000000000053441475757676000215670ustar00rootroot00000000000000\[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.3.3/banks/Cormi_Sound/0125-Fanfara.xiz000066400000000000000000000117731475757676000214000ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0126-Polvere.xiz000066400000000000000000000132761475757676000214570ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0127-Comb Filter.xiz000066400000000000000000000047201475757676000221240ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0131-Carino.xiz000066400000000000000000000033701475757676000212440ustar00rootroot00000000000000ZQS8~ 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.3.3/banks/Cormi_Sound/0132-Cigno.xiz000066400000000000000000000047451475757676000211000ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0133-fluido.xiz000066400000000000000000000144541475757676000213220ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0136-Romantico.xiz000066400000000000000000000046771475757676000220040ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0137-Romantico2.xiz000066400000000000000000000130071475757676000220520ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0138-romanticone.xiz000066400000000000000000000054011475757676000223530ustar00rootroot00000000000000\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.3.3/banks/Cormi_Sound/0139-Emptyness3.xiz000066400000000000000000000047151475757676000221170ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0140-Foglie.xiz000066400000000000000000000044311475757676000212350ustar00rootroot00000000000000Zs8} @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.3.3/banks/Cormi_Sound/0142-Solitudine.xiz000066400000000000000000000137031475757676000221530ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0145-c.xiz000066400000000000000000000076201475757676000202620ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0146-Ancestrale.xiz000066400000000000000000000101601475757676000221130ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0147-Attesa.xiz000066400000000000000000000075071475757676000212670ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0148-vento.xiz000066400000000000000000000064311475757676000211750ustar00rootroot00000000000000r۶=_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.3.3/banks/Cormi_Sound/0149-pioggia.xiz000066400000000000000000000050771475757676000214670ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0151-Memory.xiz000066400000000000000000000053351475757676000213060ustar00rootroot00000000000000[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.3.3/banks/Cormi_Sound/0152-Memory2.xiz000066400000000000000000000046531475757676000213730ustar00rootroot00000000000000[[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.3.3/banks/Cormi_Sound/0155-contorno.xiz000066400000000000000000000100531475757676000216740ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0156-fantasia.xiz000066400000000000000000000047301475757676000216270ustar00rootroot00000000000000[_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.3.3/banks/Cormi_Sound/0157-nostalgia.xiz000066400000000000000000000056671475757676000220350ustar00rootroot00000000000000]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.3.3/banks/Cormi_Sound/0158-patetico.xiz000066400000000000000000000103531475757676000216510ustar00rootroot00000000000000][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.3.3/banks/Cormi_Sound/0159-Destino.xiz000066400000000000000000000172211475757676000214500ustar00rootroot00000000000000]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.3.3/banks/Drums/0002-subliminal-kit.xiz000066400000000000000000000301351475757676000216220ustar00rootroot00000000000000tdJE./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.3.3/banks/Drums/0004-Natural Drum Kit.xiz000066400000000000000000000252731475757676000217150ustar00rootroot00000000000000]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.3.3/banks/Drums/0005-Natural Snare - variable deca.xiz000066400000000000000000000067201475757676000241030ustar00rootroot00000000000000]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.3.3/banks/Drums/0006-HiHat closed - variable decay.xiz000066400000000000000000000026121475757676000240610ustar00rootroot00000000000000YKs8+>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.3.3/banks/Drums/0011-Drums 1 LHR.xiz000066400000000000000000000161661475757676000205270ustar00rootroot00000000000000 ]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.3.3/banks/Drums/0017-Soft Kick.xiz000066400000000000000000000054651475757676000204710ustar00rootroot00000000000000\[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.3.3/banks/Drums/0018-Tuned Bass Drum.xiz000066400000000000000000000056561475757676000215370ustar00rootroot00000000000000\[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.3.3/banks/Drums/0022-Big_Drum.xiy000066400000000000000000001236471475757676000204020ustar00rootroot00000000000000 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.3.3/banks/Drums/0023-synTaiko.xiy000066400000000000000000000105211475757676000204760ustar00rootroot00000000000000][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.3.3/banks/Drums/0040-Crash Full 2.xiz000066400000000000000000000134701475757676000207500ustar00rootroot00000000000000][w8~ϯi!cd,>ۙ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.3.3/banks/Drums/0054-Tambourine-01.xiy000066400000000000000000001720231475757676000212320ustar00rootroot00000000000000 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.3.3/banks/Drums/0067-rimshot low.xiz000066400000000000000000000132461475757676000211640ustar00rootroot00000000000000]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.3.3/banks/Drums/0068-rimshot.xiy000066400000000000000000000136121475757676000203770ustar00rootroot00000000000000]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.3.3/banks/Drums/0069-rimshot lite.xiy000066400000000000000000000137551475757676000213260ustar00rootroot00000000000000][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.3.3/banks/Drums/0086-tambourine tap.xiy000066400000000000000000000317011475757676000216230ustar00rootroot00000000000000 tambourine tap Art Horan CC-BY-SA Appoximation of a light tap on a tambourine tambourine tap yoshimi-2.3.3.3/banks/Drums/0087-tambourine shake.xiy000066400000000000000000000332611475757676000221360ustar00rootroot00000000000000 tambourine shake Art Horan CC-BY-SA Approximation of a single shake of a tambourine tambourine shake yoshimi-2.3.3.3/banks/Drums/0088-tambourine shakes.xiy000066400000000000000000000340731475757676000223240ustar00rootroot00000000000000 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.3.3/banks/Drums/0097-Stick Hit.xiz000066400000000000000000000121161475757676000204750ustar00rootroot00000000000000]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.3.3/banks/Drums/0098-Wood Block.xiz000066400000000000000000000054241475757676000206430ustar00rootroot00000000000000\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.3.3/banks/Drums/0099-Finger Snap.xiz000066400000000000000000000044521475757676000210150ustar00rootroot00000000000000\[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.3.3/banks/Drums/0100-Tom Toms.xiy000066400000000000000000000055541475757676000203450ustar00rootroot00000000000000\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.3.3/banks/Drums/0100-Tom Toms.xiz000066400000000000000000000051351475757676000203410ustar00rootroot00000000000000\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.3.3/banks/Drums/0104-Ride Crash.xiz000066400000000000000000000122231475757676000206030ustar00rootroot00000000000000]]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.3.3/banks/Drums/0105-Soft Shaker.xiz000066400000000000000000000041221475757676000210100ustar00rootroot00000000000000Zs8޿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.3.3/banks/Drums/0106-Gritty Shaker.xiz000066400000000000000000000043241475757676000213640ustar00rootroot00000000000000[[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.3.3/banks/Drums/0111-pipe_hit.xiy000066400000000000000000002441411475757676000205030ustar00rootroot00000000000000 Tube hit A pipe hitting style instrument (think industrial) Lorenzo Sutton GPL 3 pipe_hit yoshimi-2.3.3.3/banks/Drums/0123-Hugh's Kit.xiy000066400000000000000000001132031475757676000205340ustar00rootroot00000000000000rH5x?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.3.3/banks/Drums/0123-Hugh's Kit.xiz000066400000000000000000001125731475757676000205460ustar00rootroot00000000000000[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.3.3/banks/Drums/0126-Drum Kit2.xiz000066400000000000000000000203331475757676000204050ustar00rootroot00000000000000][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.3.3/banks/Drums/0128-Moor Drums.xiz000066400000000000000000000225621475757676000207030ustar00rootroot00000000000000][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.3.3/banks/Dual/0002-Layered2.xiz000066400000000000000000000074331475757676000201450ustar00rootroot00000000000000][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.3.3/banks/Dual/0008-Organ Choir Pad2.xiz000066400000000000000000000047541475757676000213510ustar00rootroot00000000000000\]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.3.3/banks/Dual/0065-Dream of the Saw.xiz000066400000000000000000000053401475757676000213730ustar00rootroot00000000000000r8=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.3.3/banks/Fantasy/000077500000000000000000000000001475757676000160745ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Fantasy/.bankdir000066400000000000000000000000061475757676000175030ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Fantasy/0001-Emptyness1.xiz000066400000000000000000000043361475757676000212640ustar00rootroot00000000000000[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.3.3/banks/Fantasy/0002-Emptyness2.xiz000066400000000000000000000043231475757676000212620ustar00rootroot00000000000000[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.3.3/banks/Fantasy/0003-Space Synth.xiz000066400000000000000000000053741475757676000213420ustar00rootroot00000000000000]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.3.3/banks/Fantasy/0004-Weird Pad.xiz000066400000000000000000000030121475757676000207440ustar00rootroot00000000000000Ys6~=%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.3.3/banks/Fantasy/0008-Space Voice1.xiz000066400000000000000000000067331475757676000213700ustar00rootroot00000000000000]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.3.3/banks/Fantasy/0009-Space Voice2.xiz000066400000000000000000000072511475757676000213660ustar00rootroot00000000000000]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.3.3/banks/Fantasy/0010-Space Voice3.xiz000066400000000000000000000053171475757676000213600ustar00rootroot00000000000000\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.3.3/banks/Fantasy/0012-Space Choir2.xiz000066400000000000000000000037671475757676000213670ustar00rootroot00000000000000ZrH}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.3.3/banks/Fantasy/0035-ImpossibleDream3.xiz000066400000000000000000000067041475757676000223660ustar00rootroot00000000000000rF_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.3.3/banks/Fantasy/0037-ImpossibleDream5.xiz000066400000000000000000000065051475757676000223710ustar00rootroot00000000000000][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.3.3/banks/Fantasy/0040-Delayed Echo.xiz000066400000000000000000000057511475757676000214270ustar00rootroot00000000000000][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.3.3/banks/Fantasy/0041-Fade Down Echo.xiz000066400000000000000000000060161475757676000216030ustar00rootroot00000000000000][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.3.3/banks/Fantasy/0042-Rhodes Space1.xiz000066400000000000000000000066311475757676000215420ustar00rootroot00000000000000][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.3.3/banks/Fantasy/0043-Rhodes Space2.xiz000066400000000000000000000066571475757676000215540ustar00rootroot00000000000000r}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.3.3/banks/Fantasy/0065-Long SpaceChoir1.xiz000066400000000000000000000072061475757676000222060ustar00rootroot00000000000000]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.3.3/banks/Fantasy/0066-Long SpaceChoir2.xiz000066400000000000000000000041071475757676000222050ustar00rootroot00000000000000Zms8>{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.3.3/banks/Guitar/000077500000000000000000000000001475757676000157225ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Guitar/.bankdir000066400000000000000000000000061475757676000173310ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Guitar/0001-Dist Guitar 1.xiz000066400000000000000000000050601475757676000212750ustar00rootroot00000000000000\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.3.3/banks/Guitar/0002-Dist Guitar 2.xiz000066400000000000000000000053601475757676000213020ustar00rootroot00000000000000\_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.3.3/banks/Guitar/0003-Dist Guitar 3.xiz000066400000000000000000000053661475757676000213120ustar00rootroot00000000000000\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.3.3/banks/Guitar/0005-Dist Guitar 5.xiz000066400000000000000000000055671475757676000213210ustar00rootroot00000000000000]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.3.3/banks/Guitar/0007-Dist Guitar 6.xiy000066400000000000000000000057401475757676000213140ustar00rootroot00000000000000ko8{ϟ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.3.3/banks/Guitar/0007-Dist Guitar 6.xiz000066400000000000000000000053111475757676000213070ustar00rootroot00000000000000ks۸{~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.3.3/banks/Guitar/0034-Trash Guitar 2.xiz000066400000000000000000000055671475757676000214760ustar00rootroot00000000000000]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.3.3/banks/Guitar/0047-folk guitar.xiz000066400000000000000000000134271475757676000212640ustar00rootroot00000000000000]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.3.3/banks/Guitar/0048-resonator.xiz000066400000000000000000000162501475757676000210670ustar00rootroot00000000000000][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.3.3/banks/Guitar/0065-Clean Guitar1.xiz000066400000000000000000000045071475757676000213730ustar00rootroot00000000000000\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.3.3/banks/Guitar/0066-Electric Guitar.xiz000066400000000000000000000054771475757676000220320ustar00rootroot00000000000000][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.3.3/banks/Guitar/0103-Twang.xiy000066400000000000000000000110501475757676000201130ustar00rootroot00000000000000]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.3.3/banks/Guitar/0104-Twang 2.xiy000066400000000000000000000111531475757676000202420ustar00rootroot00000000000000][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.3.3/banks/Misc/0002-Bells 1.xiz000066400000000000000000000037401475757676000176630ustar00rootroot00000000000000Zms8_{ & !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.3.3/banks/Misc/0003-Bells 2.xiz000066400000000000000000000037451475757676000176720ustar00rootroot00000000000000Zms8_=; &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.3.3/banks/Misc/0004-Bells 3.xiz000066400000000000000000000037221475757676000176670ustar00rootroot00000000000000Zs8~_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.3.3/banks/Misc/0033-Trash Synth 1.xiz000066400000000000000000000050251475757676000207730ustar00rootroot00000000000000\[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.3.3/banks/Misc/0034-Trash Synth 2.xiz000066400000000000000000000050761475757676000210030ustar00rootroot00000000000000\[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.3.3/banks/Misc/0035-Trash Synth 3.xiz000066400000000000000000000050741475757676000210030ustar00rootroot00000000000000\[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.3.3/banks/Misc/0036-Trash Synth 4.xiz000066400000000000000000000047261475757676000210100ustar00rootroot00000000000000\]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.3.3/banks/Misc/0065-SuperSaw 1.xiz000066400000000000000000000045501475757676000204040ustar00rootroot00000000000000]]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.3.3/banks/Misc/0067-SuperSaw 3.xiz000066400000000000000000000046401475757676000204100ustar00rootroot00000000000000][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.3.3/banks/Misc/0068-SuperSaw 4.xiz000066400000000000000000000047461475757676000204210ustar00rootroot00000000000000\[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.3.3/banks/Misc/0069-SuperSaw 5.xiz000066400000000000000000000037011475757676000204110ustar00rootroot00000000000000Zms8_%& 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.3.3/banks/Misc/0070-SuperSaw 6.xiz000066400000000000000000000036611475757676000204070ustar00rootroot00000000000000Z[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.3.3/banks/Misc/0097-Tubular Bells.xiy000066400000000000000000000044541475757676000211610ustar00rootroot00000000000000Zs8~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.3.3/banks/Misc/0097-Tubular Bells.xiz000066400000000000000000000040441475757676000211550ustar00rootroot00000000000000Zs8~` &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.3.3/banks/Noises/0002-Ioioioioioi.xiz000066400000000000000000000047411475757676000213300ustar00rootroot00000000000000\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.3.3/banks/Noises/0003-Noise1.xiz000066400000000000000000000023231475757676000202010ustar00rootroot00000000000000XQS6~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.3.3/banks/Noises/0004-Noise2.xiz000066400000000000000000000061261475757676000202100ustar00rootroot00000000000000]]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.3.3/banks/Noises/0006-Wind.xiz000066400000000000000000000022661475757676000177550ustar00rootroot00000000000000X]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.3.3/banks/Noises/0010-Slow Wind.xiz000066400000000000000000000024641475757676000206550ustar00rootroot00000000000000YR6}+\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.3.3/banks/Noises/0033-Metal Sound 1.xiz000066400000000000000000000037231475757676000213070ustar00rootroot00000000000000ZKs6W;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.3.3/banks/Noises/0035-Metal Sound 3.xiz000066400000000000000000000037771475757676000213240ustar00rootroot00000000000000Zms8_=%@`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.3.3/banks/Noises/0037-Metal Sound 4.xiz000066400000000000000000000037331475757676000213170ustar00rootroot00000000000000ZMs6W'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.3.3/banks/Noises/0038-Metal Sound 5.xiz000066400000000000000000000040521475757676000213140ustar00rootroot00000000000000Zs8} !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.3.3/banks/Noises/0065-Short noise.xiz000066400000000000000000000037371475757676000212620ustar00rootroot00000000000000ZS8~_;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.3.3/banks/Noises/0097-Frogs.xiz000066400000000000000000000053421475757676000201440ustar00rootroot00000000000000]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.3.3/banks/Noises/0101-Explosion.xiz000066400000000000000000000043321475757676000210240ustar00rootroot00000000000000[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.3.3/banks/Noises/0102-Explosion Canyon.xiz000066400000000000000000000053621475757676000222410ustar00rootroot00000000000000\[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.3.3/banks/Organ/000077500000000000000000000000001475757676000155355ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Organ/.bankdir000066400000000000000000000000071475757676000171450ustar00rootroot000000000000002.3.2 Myoshimi-2.3.3.3/banks/Organ/0001-Organ 1.xiz000066400000000000000000000044351475757676000200440ustar00rootroot00000000000000\[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.3.3/banks/Organ/0002-Organ 2.xiz000066400000000000000000000046121475757676000200430ustar00rootroot00000000000000\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.3.3/banks/Organ/0003-Organ 3.xiz000066400000000000000000000047031475757676000200460ustar00rootroot00000000000000\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.3.3/banks/Organ/0004-Organ 4.xiz000066400000000000000000000044211475757676000200450ustar00rootroot00000000000000\[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.3.3/banks/Organ/0005-Organ 5.xiz000066400000000000000000000043571475757676000200570ustar00rootroot00000000000000\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.3.3/banks/Organ/0006-Organ 6.xiz000066400000000000000000000046071475757676000200570ustar00rootroot00000000000000\[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.3.3/banks/Organ/0008-Organ 8.xiz000066400000000000000000000075521475757676000200650ustar00rootroot00000000000000]]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.3.3/banks/Organ/0009-Organ 9.xiz000066400000000000000000000043101475757676000200540ustar00rootroot00000000000000\[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.3.3/banks/Organ/0012-Organ 12.xiz000066400000000000000000000045061475757676000201270ustar00rootroot00000000000000]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.3.3/banks/Organ/0033-Cathedral Organ1.xiz000066400000000000000000000045401475757676000216560ustar00rootroot00000000000000\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.3.3/banks/Organ/0034-Cathedral Organ2.xiz000066400000000000000000000050121475757676000216530ustar00rootroot00000000000000\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.3.3/banks/Organ/0035-Cathedral Organ3.xiz000066400000000000000000000051021475757676000216550ustar00rootroot00000000000000\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.3.3/banks/Organ/0038-Church Organ 2.xiz000066400000000000000000000065741475757676000212620ustar00rootroot00000000000000]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.3.3/banks/Organ/0039-Church Organ 3.xiz000066400000000000000000000042411475757676000212510ustar00rootroot00000000000000Zms6~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.3.3/banks/Organ/0040-Church Organ 4.xiz000066400000000000000000000041551475757676000212460ustar00rootroot00000000000000Zs6~~%'!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.3.3/banks/Organ/0041-Church Organ Soft.xiz000066400000000000000000000040221475757676000220100ustar00rootroot00000000000000Zs8~_ނ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.3.3/banks/Organ/0065-Nice Organ 1.xiz000066400000000000000000000042331475757676000207110ustar00rootroot00000000000000[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.3.3/banks/Organ/0066-Nice Organ 2.xiz000066400000000000000000000044451475757676000207200ustar00rootroot00000000000000[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.3.3/banks/Organ/0068-Square Organ.xiz000066400000000000000000000043471475757676000211630ustar00rootroot00000000000000\[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.3.3/banks/Organ/0069-Soft Organ 1.xiz000066400000000000000000000044631475757676000207570ustar00rootroot00000000000000\[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.3.3/banks/Organ/0071-Synth Organ.xiz000066400000000000000000000047711475757676000210230ustar00rootroot00000000000000\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.3.3/banks/Organ/0072-Fantasy Organ.xiz000066400000000000000000000053401475757676000213150ustar00rootroot00000000000000][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.3.3/banks/Organ/0077-True Drawbars.xiz000066400000000000000000000063601475757676000213360ustar00rootroot00000000000000R; 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.3.3/banks/Organ/0097-Accordion Pad 1.xiz000066400000000000000000000072421475757676000214020ustar00rootroot00000000000000]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.3.3/banks/Organ/0099-Synth Accordion1.xiz000066400000000000000000000043411475757676000217420ustar00rootroot00000000000000[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.3.3/banks/Organ/0100-Synth Accordion2.xiz000066400000000000000000000046601475757676000217260ustar00rootroot00000000000000\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.3.3/banks/Organ/0101-Accordion 1.xiz000066400000000000000000000046371475757676000207040ustar00rootroot00000000000000[[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.3.3/banks/Pads/0002-sin2x pad.xiz000066400000000000000000000036611475757676000203270ustar00rootroot00000000000000Zms8_=%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.3.3/banks/Pads/0003-Analog Pad 1.xiz000066400000000000000000000042061475757676000205030ustar00rootroot00000000000000[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.3.3/banks/Pads/0005-Square Pad 1.xiz000066400000000000000000000044371475757676000205520ustar00rootroot00000000000000\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.3.3/banks/Pads/0008-Resonance Pad1.xiz000066400000000000000000000045711475757676000211710ustar00rootroot00000000000000\[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.3.3/banks/Pads/0009-Resonance Pad2.xiz000066400000000000000000000042371475757676000211720ustar00rootroot00000000000000\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.3.3/banks/Pads/0034-Synth Pad 2.xiz000066400000000000000000000037231475757676000204170ustar00rootroot00000000000000Zs8_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.3.3/banks/Pads/0035-Synth Pad 3.xiz000066400000000000000000000036471475757676000204260ustar00rootroot00000000000000Zs8_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.3.3/banks/Pads/0065-Soft Pad.xiz000066400000000000000000000036431475757676000201100ustar00rootroot00000000000000ZQs8~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.3.3/banks/Pads/0066-Flanged Pad 1.xiz000066400000000000000000000040451475757676000206540ustar00rootroot00000000000000Zs8_ނ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.3.3/banks/Pads/0075-fm_sweep_01.xiy000066400000000000000000001132051475757676000206110ustar00rootroot00000000000000 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.3.3/banks/Pads/0097-Bell Pad.xiz000066400000000000000000000037671475757676000200670ustar00rootroot00000000000000ZrH}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.3.3/banks/Plucked/0003-Plucked 3.xiz000066400000000000000000000043211475757676000207040ustar00rootroot00000000000000\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.3.3/banks/Plucked/0004-Plucked 4.xiz000066400000000000000000000074241475757676000207150ustar00rootroot00000000000000]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.3.3/banks/Plucked/0005-Plucked 5.xiz000066400000000000000000000050221475757676000207070ustar00rootroot00000000000000\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.3.3/banks/Plucked/0006-Plucked 6.xiz000066400000000000000000000073601475757676000207200ustar00rootroot00000000000000][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.3.3/banks/Plucked/0033-Plucked String1.xiz000066400000000000000000000075101475757676000220770ustar00rootroot00000000000000][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.3.3/banks/Plucked/0034-Plucked String2.xiz000066400000000000000000000075401475757676000221040ustar00rootroot00000000000000]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.3.3/banks/Plucked/0036-Plucked Wah.xiz000066400000000000000000000053431475757676000212740ustar00rootroot00000000000000]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.3.3/banks/Plucked/0065-Plucked Pad1.xiz000066400000000000000000000037151475757676000213450ustar00rootroot00000000000000Zms8_=%&@`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.3.3/banks/Reed_and_Wind/000077500000000000000000000000001475757676000171515ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Reed_and_Wind/.bankdir000066400000000000000000000000071475757676000205610ustar00rootroot000000000000002.3.2 Myoshimi-2.3.3.3/banks/Reed_and_Wind/0001-Flute 1.xiz000066400000000000000000000037461475757676000214750ustar00rootroot00000000000000Zms8_=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.3.3/banks/Reed_and_Wind/0002-Flute 2.xiz000066400000000000000000000060661475757676000214750ustar00rootroot00000000000000]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.3.3/banks/Reed_and_Wind/0005-FM Reed.xiz000066400000000000000000000042621475757676000214350ustar00rootroot00000000000000[[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.3.3/banks/Reed_and_Wind/0006-Clarinet.xiz000066400000000000000000000071111475757676000220310ustar00rootroot00000000000000]]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.3.3/banks/Reed_and_Wind/0007-Breathy1.xiz000066400000000000000000000074041475757676000217550ustar00rootroot00000000000000][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.3.3/banks/Reed_and_Wind/0033-Reed 1.xiz000066400000000000000000000071131475757676000212720ustar00rootroot00000000000000]]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.3.3/banks/Reed_and_Wind/0034-Reed 2.xiz000066400000000000000000000071131475757676000212740ustar00rootroot00000000000000]]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.3.3/banks/Reed_and_Wind/0035-Reed 3.xiz000066400000000000000000000067311475757676000213030ustar00rootroot00000000000000]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.3.3/banks/Reed_and_Wind/0036-Reed 4.xiz000066400000000000000000000071271475757676000213050ustar00rootroot00000000000000]]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.3.3/banks/Reed_and_Wind/0037-Reed 5.xiz000066400000000000000000000071321475757676000213030ustar00rootroot00000000000000]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.3.3/banks/Reed_and_Wind/0039-Reed 7.xiz000066400000000000000000000040571475757676000213120ustar00rootroot00000000000000Zs8_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.3.3/banks/Reed_and_Wind/0040-Reed 8.xiz000066400000000000000000000061221475757676000212760ustar00rootroot00000000000000][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.3.3/banks/Reed_and_Wind/0067-Fat Reed3 square.xiz000066400000000000000000000074741475757676000232310ustar00rootroot00000000000000]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.3.3/banks/Reed_and_Wind/0068-Chorused Flute.xiz000066400000000000000000000051561475757676000231230ustar00rootroot00000000000000\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!v_O)\.ԇٿoӧxddIKh%=) 2/E0"iM:@cgӫ7}/ %Jm,Nr I)(#UE&߭Oۉw=]Lf]yW7o.B~Jcy'^,SKzaol0JvD0X򒀐<<s  LT|PQZ>b7q8'"x^ySrnWKS?~'~'.ċM 0KcI??n#4~l+2ǻ$H ?Z4M o$n$Ov w#}YLWHC$Î1]nS ~lSL OțV)6I3e+WZ;&pEdKrU|t~إKp0/ˍ)}I-4fa}5Utwr0*`=oLJ]\N+sQ q[ta`; e@iEe]$煾,֓T%$,yx0 ^6I9cF'pDL+ʥ!3q=tΌV:krD}WٓYQ8v 37vND'Nί')UA (v+0& I`b@|V&y7`me'UzFX{J#oA |ofa \6Hń - ̵AXammֶAXammֶAXamvѱAXaulֱAXaulֱA$ GXa]umֵAXaŲmumֵA$Jsa=n g z6 g0, 6 cAXa}9n e 9ji l0Qÿc ,"`l`ӭ pE6oiѲ †6Z NZtaC9p~;-9-9-9- f9,F Y~ƀOC1iGDuZl,Ec!"QH#` fX:il`ӫku 1i!I<ш!Į:=V%RpB#$%MzI 𩚹Ó(ؠA@.WXL+Yx5AcL?]KlUзNE7|{BmT3~7 ah!,Jy ccq ;CI$X">/W0rK29 Bf C|_Ff+hC 7&pUwCXT&7p8Na\-¹=l)Y'd =HKV0$gep «=v,?YV^)L g)԰7AV[fv:[38g/]<`g_QKx2Jً؁zQhAUTq ?iXҟWt>3*:Q\፻3$9aV{X _Ӊ^Rk˚ya@LsS2ЇnR3r翕F/d;d-AyAB֊$o!!I/vDo7LT g,e\53e"G?*u5@Q3snRTIAZu$kTXiXKR=cUnѝs͌(XR~ZM'P?IjmIOvk079W5&C2%TEIs1I$7(&zI ')UWvNk6Kk K"m($!I,ܰf &){5FரH9I MZ-G"^KT%H@Т5IuVnH4DH(R8IپIRuft1 ;DfČT<''Z e窫LџZb?Zf0Q:xEq2EF-T:ax~_B%hvu3 ,wKvt|@P*wTi*%+pJ+ǩvӞt?nԟTqZE 8N|8EqdOS !6ٽ0 Y|p>wfv6uef +x-tKfw_N~3x-2܎ZH9{Z} 'f.\:\+zS\t^"$6|$vśRoaX}8i}pZ31%7rSG/x"^з9%J` 53!R m&W2Q\NI@t yL or#UWu޿?;5;u;0rB]@ov<3:OC gWzs]շzSrv| }2vSq;@+%ZD]GNpO?{,.HW'uZl~:~3gt/nEGg <ϳw6\M+Zшz/W^ܯ_{aw~U..CׯPuy56yv^qAK!W+.I;&?^NxF1v?һs5WxuVD\6j~^(?e.'V巔r¹kVH}(s֬y8qJ91'Wp$*.vrz \OK hAmoSQoc/Az"Ћϫ(czaF'9靧Epdo ~fR.ϺbYbIQ!>y0r |6|} `Å<Қ l8Fiϣó|e2N"XZEsm ;Ki Ck mT%X}.Z#( cqQx꛼L"}f0yʮb {7)D46޴t(4/ԛ0}XQHAquy᧽m214]/72$cW,#ML*AZP@`3zLx|;Hur-,N|\@Zi~UOӻyoshimi-2.3.3.3/banks/Reed_and_Wind/0071-Dooo Flute.xiz000066400000000000000000000131661475757676000222410ustar00rootroot00000000000000]Yw8~ϯ%R9̑LɼmsZ""@%1tGAa㇪B׿~[-k/&SYy<\ӧl_z4r35.wۇ>.؅ʪrn>:/ɏOۮsr[wF.&]BquE+ݰ0pv~}[! ]y8z ggy ¯^T5wgA,|3TUn:Mr2Nr9+;S K;iuf*r(lW^SE97ghJƤi-UywMKɇH;Vސnv{9اCu ï_mI,_?p^R[yE6ĵ|E] 7{:}T|yQ{rMSA9./Кeˢ=~ Z'/ɰ0Mۘ&_2[9?'G'H6&D7a=Lق50f8e_|7aZOW0#t3V8xˍ)`=ϑ,8da}5tsj0*`=onƤ2LS HO sV5f-܈"Z/k6])p,͝NrVs,qǜcQ>Te쎢Q D!9Ip|'8&8X^]m(QIHs:=w j6xl^tޚʹs@R+XR1xlE+і%?1t8+/5ww^%TCfk C!r/3EA -Dz%"z;1?pvKm@RHnsg;@ v3U]KY%Ei C6ƂJ˩xK!g' SjVe^tgTJTqa|*p T|Nv5mT%|YT",*/E]t2[th%ӤMλCL) [O+<8S&WJXjMlo{y}'U$5G=uّbwZ]~?w7?ǎh4pBQ_ mRpLQz %AfHv7CEnXAHNW#Eܨ0d'3) 7)2TsCJ3nZOIɋx>g$;7pA7a q,L*ẘ0=1d.+¬\_͸wCQR V0?D6ɗ)C8h-ٶl@k 3 da{Le@2e.]5m|Y&L1&Mf 6AD &a4ha Z&k e Z&k e Z&k / &k m &k m q8:& c :&-l c Qr& Nta]uM5AXa]ApOgi M3AXa4 z& ̲Wa(@ʎ?K`o1*&``d_c}Mn=S L Z6A|KM60bpР& ̂㘇j`jjjb0Kϑg1ҳp4x"!-M;"ը,fSg1-,I'w g*Dl4ǂwI#`+! 6~['46-бP?9$'X?Gt҈b+!` :VBtm#XXNZ ik%APsD饱?.5mcaִ [wu[q mZ݄E!V:646fdL (!M$̉nJH#X+!h6z`4҈fKcHiƍ%JH#X+!XQcXKcXKcXZ2 7tlՍÚ^ÚV {JHcX4s (1n#aɁma K%A i#a)ma KhkXDFXDA i#akk4*(s#aɂma K},_PBZR%1﹑e J_%5azM/m5p-m,u5mk6'p mcr:gц {qF?&`&`܁cҘv=@kl,uPB3Тnm@ i k11ŦRqcJHcMs̈11#6l#aKvְ+Ѩ,wP$m#a=7vsDF 4seJHcM6Ҙb[lt)6]Ʈе(6P[:ikzi,s W69(!`-,vб%FD*E~d^V`pO܉2̮IH Νh THT̪MAGIZظqL)Der$T1}`dx&#ac-)L*)87U|%szk[ $y2ٷ O9eWbI5 @JAu2b@K0RegWuFJ&tnytfFVsbҕ2| xY:41D#',_.}" NAe`cr2}G+AOa-cr\rgX4y]̐8Xن=-D `__&aLq2z{sY?@Bw ܃J&LJDWj͋ï yKvMu wLjiNnH+VբMh T0&;|DOalj}j$|/lKLjɼfYRͯ$떕H-ͭ0NhkW ^>Į:=V%qB#$9MzI 𩚹Óm)ؠ~jC.WXL+Yx4 DZ%T$S"B}YTзNE7-{@m3~7 ahJ9 ccv ;CI$X">/0rK29 Bf C|_Ff+hz 7&:pUw꒒SL5_¹m ڭfq0 ֠d韨F) - [U8$y>1 0 g[-zY&w0P8K=({lefA=V9yj(@ppW.BBZ‰Wl^KgҐGT(Lǒ~䂆әQщ oə䄁[a%|M'*z} J-k݆ /;a3 N@$Ҟ dK(jS̀~@ @f Ϳ1o]Iv_ Y+~%y? IZ~ ($g/ⱶ[B_`E0taHZ/yIyNbuEebaK"  (w(k@90 TiXs~}` huYĐe&\&KrIЧ= +T?*֓# z2G]="MXOƉG$Jut~b=2zDCH]Z{e7U{UAVH;Q@͐RYA]ֹ^s4n$j~NϏȯZeO=.kRrM~z&g:Yrfx;Ikz~rČT<'%Z eLџZ`?Z?P:xEq2EF-T:Q0Jrpv}3 ,wKvt|@P*wTh*%pJ+ǩvӜt?nԟTqZD 8N8Ӊ]f?1SצxEÝn~Z00f7Zd&};結OsvZDN^L8?lR{䍈g3;@ )I*:Q[8f}OO6Gxۨ$9;^Qr.׉=H0H;Ⴞ%)Qh)A(6Rhf/*Oq%(d4NˤvO)7t _E{U{%1n~y[f,76nM꜉]uͶU]%OA|0Bxhu, ;8#w,.HG'궛l~:~+C.$._N&yTK t)O۶^s("Kgsx^P)8`͒ @"a {bPך䯮3,@"Lyr9;uxv@ӁYų#N{7sjt;i}(|H>EGWw <s>\¦M+Z[W^8ۯ0_{s~U U]{eߠ4[]&+fz / ȇd _a۳o$&pxe;N'9ǔHK΅^kYIۻjd#sly bh0p[R Y,Yr3)ǜ\:j=\V+lPW*Psp=E/1_C#MiG&B? t@>܏e R`J_ _n~?3yoshimi-2.3.3.3/banks/Rhodes/000077500000000000000000000000001475757676000157135ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Rhodes/.bankdir000066400000000000000000000000061475757676000173220ustar00rootroot000000000000000.0.0 yoshimi-2.3.3.3/banks/Rhodes/0001-DX Rhodes 1.xiz000066400000000000000000000047131475757676000206730ustar00rootroot00000000000000\[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.3.3/banks/Rhodes/0003-DX Rhodes 3.xiz000066400000000000000000000052321475757676000206740ustar00rootroot00000000000000][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.3.3/banks/Rhodes/0004-DX Rhodes 4.xiz000066400000000000000000000046521475757676000207030ustar00rootroot00000000000000\_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.3.3/banks/Rhodes/0005-DX Rhodes 5.xiz000066400000000000000000000047041475757676000207030ustar00rootroot00000000000000\_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.3.3/banks/Rhodes/0007-Dig Rhodes.xiz000066400000000000000000000051451475757676000207500ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0008-Synth Rhodes1.xiz000066400000000000000000000047661475757676000214440ustar00rootroot00000000000000\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.3.3/banks/Rhodes/0009-Synth Rhodes2.xiz000066400000000000000000000055501475757676000214360ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0010-Synth Rhodes3.xiz000066400000000000000000000055501475757676000214270ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0012-Ice Rhodes1.xiz000066400000000000000000000046511475757676000210230ustar00rootroot00000000000000\[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.3.3/banks/Rhodes/0013-Ice Rhodes2.xiz000066400000000000000000000046571475757676000210330ustar00rootroot00000000000000\_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.3.3/banks/Rhodes/0014-Ice Rhodes3.xiz000066400000000000000000000047251475757676000210310ustar00rootroot00000000000000\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.3.3/banks/Rhodes/0033-FM Rhodes 1.xiz000066400000000000000000000051441475757676000206660ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0035-FM Rhodes 3.xiz000066400000000000000000000047341475757676000206760ustar00rootroot00000000000000\[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.3.3/banks/Rhodes/0036-FM Rhodes 4.xiz000066400000000000000000000055211475757676000206730ustar00rootroot00000000000000][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.3.3/banks/Rhodes/0037-FM Rhodes 5.xiz000066400000000000000000000047101475757676000206740ustar00rootroot00000000000000\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.3.3/banks/Rhodes/0038-FM Rhodes 6.xiz000066400000000000000000000047021475757676000206770ustar00rootroot00000000000000\[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.3.3/banks/Rhodes/0041-Soft Rhodes.xiz000066400000000000000000000050721475757676000211550ustar00rootroot00000000000000\[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.3.3/banks/Rhodes/0043-Hard Rhodes2.xiz000066400000000000000000000046701475757676000212070ustar00rootroot00000000000000\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.3.3/banks/Rhodes/0044-Echo Rhodes.xiz000066400000000000000000000053761475757676000211320ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0045-A long time ago.xiz000066400000000000000000000052401475757676000216040ustar00rootroot00000000000000\_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.3.3/banks/Rhodes/0065-Steel Rhodes.xiz000066400000000000000000000055631475757676000213310ustar00rootroot00000000000000]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.3.3/banks/Rhodes/0067-RhodesPad1.xiz000066400000000000000000000036051475757676000207770ustar00rootroot00000000000000Zs8~_@`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.3.3/banks/Rhodes/0068-RhodesPad2.xiz000066400000000000000000000035421475757676000210010ustar00rootroot00000000000000Zms8_%&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.3.3/banks/Splited/000077500000000000000000000000001475757676000160735ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Splited/.bankdir000066400000000000000000000000061475757676000175020ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Splited/0001-Strings and Reed1.xiz000066400000000000000000000116741475757676000223130ustar00rootroot00000000000000][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.3.3/banks/Splited/0002-Strings and Reed2.xiz000066400000000000000000000120621475757676000223050ustar00rootroot00000000000000]]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.3.3/banks/Splited/0003-Strings and Flute.xiz000066400000000000000000000104511475757676000224240ustar00rootroot00000000000000]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.3.3/banks/Splited/0033-Choir and Reed.xiz000066400000000000000000000150751475757676000216510ustar00rootroot00000000000000]]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.3.3/banks/Strings/000077500000000000000000000000001475757676000161205ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Strings/.bankdir000066400000000000000000000000111475757676000175230ustar00rootroot000000000000002.3.3.2 Myoshimi-2.3.3.3/banks/Strings/0001-Saw Strings 1.xiz000066400000000000000000000046301475757676000215220ustar00rootroot00000000000000\[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.3.3/banks/Strings/0003-Saw Strings 3.xiz000066400000000000000000000046631475757676000215340ustar00rootroot00000000000000\[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.3.3/banks/Strings/0004-Saw Strings 4.xiz000066400000000000000000000052221475757676000215260ustar00rootroot00000000000000][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.3.3/banks/Strings/0005-Saw Strings 5.xiz000066400000000000000000000046401475757676000215330ustar00rootroot00000000000000\[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.3.3/banks/Strings/0006-Saw Strings 6.xiz000066400000000000000000000046621475757676000215410ustar00rootroot00000000000000\[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.3.3/banks/Strings/0007-Saw Strings 7.xiz000066400000000000000000000046401475757676000215370ustar00rootroot00000000000000\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.3.3/banks/Strings/0008-Saw Strings 8.xiz000066400000000000000000000046511475757676000215430ustar00rootroot00000000000000\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.3.3/banks/Strings/0011-Strings Pad2.xiz000066400000000000000000000036701475757676000214410ustar00rootroot00000000000000Z[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.3.3/banks/Strings/0012-Strings Pad3.xiz000066400000000000000000000036431475757676000214430ustar00rootroot00000000000000Zms8_=%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.3.3/banks/Strings/0015-Strings Pad6.xiz000066400000000000000000000037071475757676000214520ustar00rootroot00000000000000ZQs8~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.3.3/banks/Strings/0019-Sweep Pad 3Wah.xiz000066400000000000000000000036411475757676000216020ustar00rootroot00000000000000Zs6~#@`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.3.3/banks/Strings/0020-Sweep Pad 4.xiz000066400000000000000000000036451475757676000211370ustar00rootroot00000000000000Zs8~_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.3.3/banks/Strings/0033-Strings1.xiz000066400000000000000000000052361475757676000207570ustar00rootroot00000000000000]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.3.3/banks/Strings/0034-Dark Strings.xiz000066400000000000000000000046251475757676000215420ustar00rootroot00000000000000\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.3.3/banks/Strings/0036-Fast Attack.xiz000066400000000000000000000054041475757676000213320ustar00rootroot00000000000000]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.3.3/banks/Strings/0042-Saw 2.xiz000066400000000000000000000042371475757676000201210ustar00rootroot00000000000000[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.3.3/banks/Strings/0045-Soft Saw Pad.xiz000066400000000000000000000042641475757676000213630ustar00rootroot00000000000000[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.3.3/banks/Strings/0046-Echoed Saw.xiz000066400000000000000000000043561475757676000211550ustar00rootroot00000000000000[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.3.3/banks/Strings/0048-Wah1.xiz000066400000000000000000000045241475757676000200520ustar00rootroot00000000000000\[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.3.3/banks/Strings/0050-Synth Violin 1.xiz000066400000000000000000000067411475757676000217150ustar00rootroot00000000000000]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.3.3/banks/Strings/0051-Synth Violin 2 Fat.xiz000066400000000000000000000075201475757676000224060ustar00rootroot00000000000000]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.3.3/banks/Strings/0065-Simple Strings.xiz000066400000000000000000000042761475757676000221200ustar00rootroot00000000000000[[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.3.3/banks/Strings/0066-Dual Strings.xiz000066400000000000000000000054641475757676000215550ustar00rootroot00000000000000\_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.3.3/banks/Strings/0067-Dual Strings Oct1.xiz000066400000000000000000000055341475757676000223430ustar00rootroot00000000000000rH=_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.3.3/banks/Strings/0068-Dual Strings Oct2.xiz000066400000000000000000000055261475757676000223460ustar00rootroot00000000000000]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.3.3/banks/Strings/0073-Morph Strings1.xiz000066400000000000000000000044021475757676000220230ustar00rootroot00000000000000\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.3.3/banks/Strings/0077-stringish.xiz000066400000000000000000000117131475757676000212640ustar00rootroot00000000000000]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.3.3/banks/Strings/0085-Vintage_Strings_01.xiz000066400000000000000000000645231475757676000226660ustar00rootroot00000000000000 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.3.3/banks/Strings/0086-Vintage_Strings_low_01.xiy000066400000000000000000000520271475757676000235430ustar00rootroot00000000000000 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.3.3/banks/Strings/0086-Vintage_Strings_low_01.xiz000066400000000000000000000474741475757676000235560ustar00rootroot00000000000000 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.3.3/banks/Strings/0087-Vintage_Strings_02.xiy000066400000000000000000000552341475757676000226670ustar00rootroot00000000000000 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.3.3/banks/Strings/0087-Vintage_Strings_02.xiz000066400000000000000000000527011475757676000226640ustar00rootroot00000000000000 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.3.3/banks/Strings/0088-Vintage_Strings_03.xiy000066400000000000000000000671171475757676000226740ustar00rootroot00000000000000 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.3.3/banks/Strings/0088-Vintage_Strings_03.xiz000066400000000000000000000645641475757676000227000ustar00rootroot00000000000000 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.3.3/banks/Strings/0089-Vintage_Strings_04.xiy000066400000000000000000000402711475757676000226660ustar00rootroot00000000000000 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.3.3/banks/Strings/0089-Vintage_Strings_04.xiz000066400000000000000000000357361475757676000227010ustar00rootroot00000000000000 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.3.3/banks/Strings/0097-Smooth Strings.xiy000066400000000000000000000076151475757676000221440ustar00rootroot00000000000000]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.3.3/banks/Strings/0098-Antique Strings.xiy000066400000000000000000000077711475757676000223050ustar00rootroot00000000000000]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.3.3/banks/Strings/0098-Antique Strings.xiz000066400000000000000000000073521475757676000223010ustar00rootroot00000000000000][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.3.3/banks/Synth/000077500000000000000000000000001475757676000155745ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Synth/.bankdir000066400000000000000000000000061475757676000172030ustar00rootroot000000000000002.2.0 yoshimi-2.3.3.3/banks/Synth/0001-Soft Synth 1.xiz000066400000000000000000000050231475757676000210300ustar00rootroot00000000000000][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.3.3/banks/Synth/0002-Soft Synth 2.xiz000066400000000000000000000047731475757676000210450ustar00rootroot00000000000000\[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.3.3/banks/Synth/0004-Pulse Pad 1.xiz000066400000000000000000000043641475757676000206160ustar00rootroot00000000000000\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.3.3/banks/Synth/0005-Pulse Pad 2.xiz000066400000000000000000000044571475757676000206230ustar00rootroot00000000000000\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.3.3/banks/Synth/0006-Pulse Pad 3.xiz000066400000000000000000000042541475757676000206200ustar00rootroot00000000000000[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.3.3/banks/Synth/0007-Analog Filter 1.xiz000066400000000000000000000042301475757676000214430ustar00rootroot00000000000000[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.3.3/banks/Synth/0008-Analog Filter 2.xiz000066400000000000000000000044501475757676000214510ustar00rootroot00000000000000\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.3.3/banks/Synth/0034-Phased Pad 2.xiz000066400000000000000000000043351475757676000207340ustar00rootroot00000000000000[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.3.3/banks/Synth/0035-Phased Pad 3.xiz000066400000000000000000000054011475757676000207310ustar00rootroot00000000000000]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.3.3/banks/Synth/0065-Computer Lead1.xiz000066400000000000000000000041011475757676000214210ustar00rootroot00000000000000[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.3.3/banks/Synth/0066-Computer Lead2.xiz000066400000000000000000000044631475757676000214360ustar00rootroot00000000000000\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.3.3/banks/Synth/0067-Detuned Harmonic.xiz000066400000000000000000000040621475757676000220350ustar00rootroot00000000000000Zs~_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.3.3/banks/Synth/0070-Solo Synth 1.xiz000066400000000000000000000046631475757676000210500ustar00rootroot00000000000000\[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.3.3/banks/Synth/0097-FM Synth.xiz000066400000000000000000000057221475757676000203230ustar00rootroot00000000000000]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.3.3/banks/Synth/0100-Dungeon Lead.xiy000066400000000000000000000043651475757676000211420ustar00rootroot00000000000000Z[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.3.3/banks/Synth/0100-Dungeon Lead.xiz000066400000000000000000000037471475757676000211460ustar00rootroot00000000000000Z[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.3.3/banks/Synth/0103-Shepard Synth.xiy000066400000000000000000000063331475757676000213710ustar00rootroot00000000000000ksڸ{/ٖ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.3.3/banks/Synth/0103-Shepard Synth.xiz000066400000000000000000000057021475757676000213710ustar00rootroot00000000000000r8=_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.3.3/banks/Synth/0105-Nostalgia.xiy000066400000000000000000000121361475757676000206360ustar00rootroot00000000000000]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.3.3/banks/Synth/0105-Nostalgia.xiz000066400000000000000000000115031475757676000206340ustar00rootroot00000000000000]]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.3.3/banks/SynthPiano/0005-Synth Piano1.xiz000066400000000000000000000042631475757676000221230ustar00rootroot00000000000000[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.3.3/banks/SynthPiano/0007-Termollo1.xiz000066400000000000000000000043201475757676000215600ustar00rootroot00000000000000[[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.3.3/banks/SynthPiano/0008-Termollo2.xiz000066400000000000000000000044701475757676000215700ustar00rootroot00000000000000[[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.3.3/banks/SynthPiano/0009-Termollo3.xiz000066400000000000000000000042751475757676000215750ustar00rootroot00000000000000[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.3.3/banks/SynthPiano/0012-Drop2.xiz000066400000000000000000000043121475757676000206650ustar00rootroot00000000000000ks8 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.3.3/banks/SynthPiano/0033-Analog Piano 1.xiz000066400000000000000000000043201475757676000222520ustar00rootroot00000000000000[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.3.3/banks/SynthPiano/0037-FM Synth1.xiz000066400000000000000000000050641475757676000213640ustar00rootroot00000000000000\[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.3.3/banks/SynthPiano/0065-Synth Piano 1.xiz000066400000000000000000000036741475757676000221760ustar00rootroot00000000000000Zms8_%&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.3.3/banks/SynthPiano/0066-Synth Piano 2.xiz000066400000000000000000000037461475757676000222000ustar00rootroot00000000000000Zs8_ 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.3.3/banks/SynthPiano/0069-Synth Piano 3 det.xiz000066400000000000000000000037551475757676000227410ustar00rootroot00000000000000Zmo8{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.3.3/banks/SynthPiano/0070-Synth Piano 4.xiz000066400000000000000000000042121475757676000221620ustar00rootroot00000000000000ZmsF_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.3.3/banks/SynthPiano/0071-Synth Piano 5.xiz000066400000000000000000000062061475757676000221710ustar00rootroot00000000000000]]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.3.3/banks/SynthPiano/0111-Grand Piano v3.xiz000066400000000000000000021576441475757676000223150ustar00rootroot00000000000000 Grand Piano Aleksey Zhehanov 2025 Grand Piano v3 yoshimi-2.3.3.3/banks/The_Mysterious_Bank/000077500000000000000000000000001475757676000204055ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/The_Mysterious_Bank/.bankdir000066400000000000000000000000051475757676000220130ustar00rootroot000000000000002.3.0yoshimi-2.3.3.3/banks/The_Mysterious_Bank/0001-percussive_lead.xiz000066400000000000000000000043641475757676000247030ustar00rootroot00000000000000 -`\[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.3.3/banks/The_Mysterious_Bank/0002-heavy_funky.xiz000066400000000000000000000037651475757676000240630ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0003-funky_lead.xiz000066400000000000000000000045521475757676000236500ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0004-funky_lead_2.xiz000066400000000000000000000042211475757676000240630ustar00rootroot00000000000000Zw8_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.3.3/banks/The_Mysterious_Bank/0005-delay_lead.xiz000066400000000000000000000037561475757676000236210ustar00rootroot00000000000000-`[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.3.3/banks/The_Mysterious_Bank/0006-old_lead.xiz000066400000000000000000000040311475757676000232650ustar00rootroot00000000000000-`[_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.3.3/banks/The_Mysterious_Bank/0007-8bit_evolved.xiz000066400000000000000000000046351475757676000241270ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0008-pulse_bell.xiz000066400000000000000000000041311475757676000236530ustar00rootroot00000000000000 -`\]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.3.3/banks/The_Mysterious_Bank/0009-vangelis_bell.xiz000066400000000000000000000047631475757676000243470ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0011-dreaming_bells.xiz000066400000000000000000000042101475757676000244640ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0012-fantastic_bell.xiz000066400000000000000000000045131475757676000244760ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0013-outerspace_bell.xiz000066400000000000000000000046241475757676000247000ustar00rootroot00000000000000]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.3.3/banks/The_Mysterious_Bank/0014-fantasy_bell.xiz000066400000000000000000000046321475757676000241730ustar00rootroot00000000000000-`\[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.3.3/banks/The_Mysterious_Bank/0015-mystic_bell.xiz000066400000000000000000000045471475757676000240440ustar00rootroot00000000000000r>_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.3.3/banks/The_Mysterious_Bank/0016-pulse_bell_2.xiz000066400000000000000000000041421475757676000240750ustar00rootroot00000000000000Z[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.3.3/banks/The_Mysterious_Bank/0018-synth_bell.xiz000066400000000000000000000045251475757676000237000ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0020-popcorn.xiz000066400000000000000000000044671475757676000232130ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0021-popcorn_2.xiz000066400000000000000000000044461475757676000234320ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0022-china_synth.xiz000066400000000000000000000045171475757676000240400ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0023-weird.xiz000066400000000000000000000044761475757676000226500ustar00rootroot00000000000000\[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.3.3/banks/The_Mysterious_Bank/0026-60s_organ.xiz000066400000000000000000000036151475757676000233310ustar00rootroot00000000000000N-`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.3.3/banks/The_Mysterious_Bank/0027-metronomy_organ.xiz000066400000000000000000000045071475757676000247540ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0028-hard_organ.xiz000066400000000000000000000044011475757676000236330ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0029-cool_organ.xiz000066400000000000000000000041211475757676000236510ustar00rootroot00000000000000b-`\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.3.3/banks/The_Mysterious_Bank/0030-cool_organ 2.xiz000066400000000000000000000040751475757676000237730ustar00rootroot00000000000000g-`\[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.3.3/banks/The_Mysterious_Bank/0031-cool_organ_3.xiz000066400000000000000000000042201475757676000240640ustar00rootroot00000000000000m-`\[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.3.3/banks/The_Mysterious_Bank/0032-rock_organ.xiz000066400000000000000000000040261475757676000236510ustar00rootroot00000000000000u-`\[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.3.3/banks/The_Mysterious_Bank/0033-organ.xiz000066400000000000000000000037101475757676000226330ustar00rootroot00000000000000}-`[[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.3.3/banks/The_Mysterious_Bank/0034-organ_2.xiz000066400000000000000000000036761475757676000230700ustar00rootroot00000000000000-`[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.3.3/banks/The_Mysterious_Bank/0036-organ_4.xiz000066400000000000000000000040561475757676000230650ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0037-organ_5.xiz000066400000000000000000000043701475757676000230660ustar00rootroot00000000000000-`\[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.3.3/banks/The_Mysterious_Bank/0038-space_organ.xiz000066400000000000000000000041261475757676000240150ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0039-space_organ_2.xiz000066400000000000000000000040231475757676000242330ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0042-80s_pad.xiz000066400000000000000000000045651475757676000227740ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0043-analog_strings.xiz000066400000000000000000000045201475757676000245400ustar00rootroot00000000000000[_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.3.3/banks/The_Mysterious_Bank/0046-synth_strings_2.xiz000066400000000000000000000044001475757676000246650ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0049-strings_pad_3.xiz000066400000000000000000000044271475757676000243010ustar00rootroot00000000000000Zw~߿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.3.3/banks/The_Mysterious_Bank/0050-soft_pad.xiz000066400000000000000000000044371475757676000233320ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0051-trance_pad.xiz000066400000000000000000000043451475757676000236320ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0053-another_galaxy.xiz000066400000000000000000000045651475757676000245450ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0055-will_in_space.xiz000066400000000000000000000044671475757676000243530ustar00rootroot00000000000000 -`\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.3.3/banks/The_Mysterious_Bank/0056-in_space.xiz000066400000000000000000000036351475757676000233210ustar00rootroot00000000000000ZYs6~ϯ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.3.3/banks/The_Mysterious_Bank/0057-near_saturnus.xiz000066400000000000000000000050431475757676000244250ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0058-echoes.xiz000066400000000000000000000047171475757676000230120ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0059-far_far_away.xiz000066400000000000000000000043751475757676000241660ustar00rootroot00000000000000[_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.3.3/banks/The_Mysterious_Bank/0060-not_so_far.xiz000066400000000000000000000044441475757676000236630ustar00rootroot00000000000000[_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.3.3/banks/The_Mysterious_Bank/0062-somewhere.xiz000066400000000000000000000043501475757676000235260ustar00rootroot000000000000007-`\[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.3.3/banks/The_Mysterious_Bank/0063-chip_pad.xiz000066400000000000000000000040051475757676000232750ustar00rootroot00000000000000=-`[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.3.3/banks/The_Mysterious_Bank/0065-bell_pad.xiz000066400000000000000000000042421475757676000232750ustar00rootroot00000000000000ZIsϯ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.3.3/banks/The_Mysterious_Bank/0066-sines.xiz000066400000000000000000000037041475757676000226570ustar00rootroot00000000000000V-`[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.3.3/banks/The_Mysterious_Bank/0067-res_strings_pad.xiz000066400000000000000000000037311475757676000247250ustar00rootroot00000000000000]-`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.3.3/banks/The_Mysterious_Bank/0068-sine_pad_1.xiz000066400000000000000000000037071475757676000235450ustar00rootroot00000000000000c-`[[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.3.3/banks/The_Mysterious_Bank/0069-sine_pad_2.xiz000066400000000000000000000036261475757676000235470ustar00rootroot00000000000000i-`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.3.3/banks/The_Mysterious_Bank/0070-sine_pad_3.xiz000066400000000000000000000040211475757676000235260ustar00rootroot00000000000000r-`[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.3.3/banks/The_Mysterious_Bank/0071-sine_pad_4.xiz000066400000000000000000000036151475757676000235400ustar00rootroot00000000000000w-`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.3.3/banks/The_Mysterious_Bank/0072-sine_pad_5.xiz000066400000000000000000000042321475757676000235360ustar00rootroot00000000000000}-`\[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.3.3/banks/The_Mysterious_Bank/0073-sine_pad_6.xiz000066400000000000000000000041041475757676000235360ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0074-violent_pad.xiz000066400000000000000000000040561475757676000240420ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0075-violent_pad_2.xiz000066400000000000000000000042041475757676000242570ustar00rootroot00000000000000-`\[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.3.3/banks/The_Mysterious_Bank/0076-compad.xiz000066400000000000000000000044231475757676000230010ustar00rootroot00000000000000ks8{~/[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.3.3/banks/The_Mysterious_Bank/0079-supersaw.xiz000066400000000000000000000036311475757676000234120ustar00rootroot00000000000000-`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.3.3/banks/The_Mysterious_Bank/0080-supersaw_2.xiz000066400000000000000000000036301475757676000236220ustar00rootroot00000000000000-`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.3.3/banks/The_Mysterious_Bank/0081-supersaw_3.xiz000066400000000000000000000033651475757676000236310ustar00rootroot00000000000000-`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.3.3/banks/The_Mysterious_Bank/0082-supersaw_4.xiz000066400000000000000000000037301475757676000236270ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0083-good_pad.xiz000066400000000000000000000037671475757676000233220ustar00rootroot00000000000000-`[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.3.3/banks/The_Mysterious_Bank/0087-bass.xiz000066400000000000000000000040721475757676000224700ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0088-bass_2.xiz000066400000000000000000000036261475757676000227160ustar00rootroot00000000000000-`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.3.3/banks/The_Mysterious_Bank/0089-bass_pad.xiz000066400000000000000000000044671475757676000233260ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0090-bass_pad_fat.xiz000066400000000000000000000044531475757676000241430ustar00rootroot00000000000000\[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.3.3/banks/The_Mysterious_Bank/0091-depeche_mode.xiz000066400000000000000000000047211475757676000241350ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0092-dubstep_bass.xiz000066400000000000000000000047461475757676000242220ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0093-fat_bass.xiz000066400000000000000000000043571475757676000233250ustar00rootroot00000000000000[[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.3.3/banks/The_Mysterious_Bank/0094-fingered_bass.xiz000066400000000000000000000036751475757676000243410ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0095-fm_bass.xiz000066400000000000000000000045261475757676000231550ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0097-powerful_bass.xiz000066400000000000000000000044661475757676000244230ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0098-doublebass.xiz000066400000000000000000000045641475757676000236730ustar00rootroot00000000000000r6}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.3.3/banks/The_Mysterious_Bank/0099-small_bass.xiz000066400000000000000000000043111475757676000236570ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0101-synth_bass_2.xiz000066400000000000000000000045351475757676000241250ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0103-synth_bass_4.xiz000066400000000000000000000043521475757676000241260ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0104-synth_bass_5.xiz000066400000000000000000000076511475757676000241350ustar00rootroot00000000000000][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.3.3/banks/The_Mysterious_Bank/0105-synth_bass_6.xiz000066400000000000000000000051571475757676000241360ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0107-synth_bass_8.xiz000066400000000000000000000053341475757676000241370ustar00rootroot00000000000000]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.3.3/banks/The_Mysterious_Bank/0109-synth_bass_10.xiz000066400000000000000000000055551475757676000242170ustar00rootroot00000000000000r8=_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.3.3/banks/The_Mysterious_Bank/0111-synth_bass_12.xiz000066400000000000000000000043501475757676000242020ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0112-vintage_bass.xiz000066400000000000000000000052451475757676000241750ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0114-80s_rhodes.xiz000066400000000000000000000046351475757676000235120ustar00rootroot00000000000000]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.3.3/banks/The_Mysterious_Bank/0116-rhodes_2.xiz000066400000000000000000000051461475757676000232410ustar00rootroot00000000000000r6}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.3.3/banks/The_Mysterious_Bank/0118-musicbox.xiz000066400000000000000000000040421475757676000233610ustar00rootroot00000000000000-`\]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.3.3/banks/The_Mysterious_Bank/0119-jazz_guitar.xiz000066400000000000000000000041631475757676000240660ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0120-heavy_metal_guitar.xiz000066400000000000000000000044301475757676000253730ustar00rootroot00000000000000[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.3.3/banks/The_Mysterious_Bank/0121-percussive.xiz000066400000000000000000000024541475757676000237170ustar00rootroot00000000000000Y[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.3.3/banks/The_Mysterious_Bank/0123-synth_reed.xiz000066400000000000000000000037241475757676000236760ustar00rootroot00000000000000-`[[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.3.3/banks/The_Mysterious_Bank/0124-brass.xiz000066400000000000000000000065221475757676000226440ustar00rootroot00000000000000][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.3.3/banks/The_Mysterious_Bank/0129-falling_stars.xiz000066400000000000000000000052101475757676000243600ustar00rootroot00000000000000\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.3.3/banks/The_Mysterious_Bank/0131-radio.xiz000066400000000000000000000036101475757676000226210ustar00rootroot00000000000000-`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.3.3/banks/The_Mysterious_Bank/0133-strange_world.xiz000066400000000000000000000044241475757676000244030ustar00rootroot00000000000000-`\[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.3.3/banks/The_Mysterious_Bank/0134-ufo_invasion.xiz000066400000000000000000000042551475757676000242330ustar00rootroot00000000000000-`\[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.3.3/banks/Will_Godfrey_Collection/000077500000000000000000000000001475757676000212305ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Will_Godfrey_Collection/.bankdir000066400000000000000000000000061475757676000226370ustar00rootroot000000000000002.3.0 yoshimi-2.3.3.3/banks/Will_Godfrey_Collection/0001-Xylophone.xiz000066400000000000000000000067321475757676000243370ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Collection/0003-Soft Vibes.xiz000066400000000000000000000036331475757676000243150ustar00rootroot00000000000000Zs8_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.3.3/banks/Will_Godfrey_Collection/0004-Simple Chimes.xiz000066400000000000000000000041701475757676000247710ustar00rootroot00000000000000Zs6߿ԑ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.3.3/banks/Will_Godfrey_Collection/0005-Silver Bell.xiz000066400000000000000000000050651475757676000244570ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0007-Ethereal.xiz000066400000000000000000000046301475757676000241040ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0009-Trem Lead.xiz000066400000000000000000000077751475757676000241270ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Collection/0010-Trem Synth Piano 3.xiz000066400000000000000000000035071475757676000255160ustar00rootroot00000000000000ZMs6W<;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.3.3/banks/Will_Godfrey_Collection/0011-Trem Synth.xiz000066400000000000000000000040131475757676000243360ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0012-Simple Square.xiz000066400000000000000000000040061475757676000250160ustar00rootroot00000000000000Z[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.3.3/banks/Will_Godfrey_Collection/0013-Full Square.xiz000066400000000000000000000042131475757676000244700ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0014-Super Square.xiz000066400000000000000000000046311475757676000246710ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0016-Echo Bubbles.xiz000066400000000000000000000043661475757676000245760ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0019-Soft.xiz000066400000000000000000000040441475757676000232700ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Collection/0020-Ultra Soft.xiz000066400000000000000000000036071475757676000243340ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Collection/0021-Whistle.xiz000066400000000000000000000036401475757676000237660ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Collection/0022-Wipe Whistle.xiz000066400000000000000000000037671475757676000246660ustar00rootroot00000000000000Zms6 _{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.3.3/banks/Will_Godfrey_Collection/0023-Ghost Whistle.xiz000066400000000000000000000042641475757676000250400ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Collection/0025-Slow Strings.xiz000066400000000000000000000036611475757676000247140ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Collection/0026-Pizzicato Strings.xiz000066400000000000000000000042601475757676000257410ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0027-Sweep Synth.xiz000066400000000000000000000047211475757676000245270ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0029-Hard Synth.xiz000066400000000000000000000045041475757676000243230ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0030-Bright Synth.xiz000066400000000000000000000045251475757676000246570ustar00rootroot00000000000000\_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.3.3/banks/Will_Godfrey_Collection/0033-Medium Saw.xiz000066400000000000000000000040501475757676000243010ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0034-Hard Saw.xiz000066400000000000000000000040451475757676000237440ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0035-Voiced Saw.xiz000066400000000000000000000045761475757676000243110ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0036-Sweep Saw.xiz000066400000000000000000000036661475757676000241630ustar00rootroot00000000000000Z]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.3.3/banks/Will_Godfrey_Collection/0037-Stereo Sweep Saw.xiz000066400000000000000000000047621475757676000254040ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0038-Wipe Synth.xiz000066400000000000000000000045751475757676000243610ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0039-Hard Stereo Sweep Synth.xiz000066400000000000000000000054541475757676000266170ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0041-Master Synth High.xiz000066400000000000000000000076501475757676000255370ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Collection/0043-Fretless Bass.xiz000066400000000000000000000035351475757676000250160ustar00rootroot00000000000000Zr8 }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.3.3/banks/Will_Godfrey_Collection/0044-Decay Bass.xiz000066400000000000000000000035531475757676000242550ustar00rootroot00000000000000ZKs8 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.3.3/banks/Will_Godfrey_Collection/0045-Steel Bass.xiz000066400000000000000000000102641475757676000243020ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Collection/0047-Distorted Bass.xiz000066400000000000000000000037711475757676000251760ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0048-Variable Reed.xiz000066400000000000000000000037021475757676000247440ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0049-Reed Organ.xiz000066400000000000000000000072331475757676000242710ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Collection/0051-Thin Pipe.xiz000066400000000000000000000073611475757676000241360ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0052-Great Organ.xiz000066400000000000000000000045271475757676000244510ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0053-64ft Organ.xiz000066400000000000000000000056461475757676000241760ustar00rootroot00000000000000Vݯ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.3.3/banks/Will_Godfrey_Collection/0056-Sines.xiz000066400000000000000000000042351475757676000234410ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0057-Soft Flute.xiz000066400000000000000000000054701475757676000243360ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0058-Warm Flute.xiz000066400000000000000000000317251475757676000243340ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0060-Beyond.xiz000066400000000000000000000043141475757676000235710ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Collection/0061-Sweep Pad.xiz000066400000000000000000000040341475757676000241210ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0062-Sweep Matrix.xiz000066400000000000000000000042531475757676000246650ustar00rootroot00000000000000v8_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.3.3/banks/Will_Godfrey_Collection/0063-Matrix.xiz000066400000000000000000000041441475757676000236210ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0065-Ice Field.xiz000066400000000000000000000053211475757676000240610ustar00rootroot00000000000000]_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.3.3/banks/Will_Godfrey_Collection/0067-Smooth.xiz000066400000000000000000000022211475757676000236240ustar00rootroot00000000000000X[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.3.3/banks/Will_Godfrey_Collection/0070-Bright Rushes.xiz000066400000000000000000000046731475757676000250330ustar00rootroot00000000000000[_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.3.3/banks/Will_Godfrey_Collection/0071-Bright Rush Long Tail.xiz000066400000000000000000000047131475757676000262310ustar00rootroot00000000000000[_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.3.3/banks/Will_Godfrey_Collection/0072-Extended Rushes.xiz000066400000000000000000000060411475757676000253450ustar00rootroot00000000000000\_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.3.3/banks/Will_Godfrey_Collection/0073-Bright Rush Pipe.xiz000066400000000000000000000061031475757676000253520ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0075-Breathy Pad.xiz000066400000000000000000000041531475757676000244430ustar00rootroot00000000000000Zw~߿>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.3.3/banks/Will_Godfrey_Collection/0076-ReedBank.xiz000066400000000000000000000025671475757676000240430ustar00rootroot00000000000000Y[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.3.3/banks/Will_Godfrey_Collection/0078-Soft Voyager.xiz000066400000000000000000000025661475757676000247010ustar00rootroot00000000000000Y]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.3.3/banks/Will_Godfrey_Collection/0080-Echo Choir.xiz000066400000000000000000000041161475757676000242560ustar00rootroot00000000000000rH=_`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.3.3/banks/Will_Godfrey_Collection/0103-Pan Pipe.xiz000066400000000000000000000103261475757676000237430ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Collection/0105-Lite Guitar.xiz000066400000000000000000000035541475757676000244670ustar00rootroot00000000000000ZYs6~`'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.3.3/banks/Will_Godfrey_Collection/0106-Trem Guitar.xiz000066400000000000000000000035601475757676000244770ustar00rootroot00000000000000ZYs6~`'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.3.3/banks/Will_Godfrey_Collection/0109-Tunnel Piano.xiz000066400000000000000000000044341475757676000246540ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0110-Home Piano.xiz000066400000000000000000000071421475757676000242660ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0111-Moonlight Piano.xiz000066400000000000000000000071471475757676000253440ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0112-Soft Piano1.xiz000066400000000000000000000037431475757676000243770ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Collection/0113-Soft Piano2.xiz000066400000000000000000000043611475757676000243760ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0114-Space Piano.xiz000066400000000000000000000101431475757676000244300ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0115-Space Voice.xiz000066400000000000000000000026371475757676000244410ustar00rootroot00000000000000Y]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.3.3/banks/Will_Godfrey_Collection/0116-Far Space Voice.xiz000066400000000000000000000026221475757676000251250ustar00rootroot00000000000000Y]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.3.3/banks/Will_Godfrey_Collection/0117-Space Voice 2.xiz000066400000000000000000000044541475757676000245640ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Collection/0118-Soft Choir.xiz000066400000000000000000000030051475757676000243110ustar00rootroot00000000000000Z]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.3.3/banks/Will_Godfrey_Collection/0120-Soft Ahh.xiz000066400000000000000000000037311475757676000237440ustar00rootroot00000000000000Zs8_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.3.3/banks/Will_Godfrey_Collection/0121-Breathy Ahh.xiz000066400000000000000000000037171475757676000244340ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Collection/0122-Another Choir.xiz000066400000000000000000000050551475757676000250000ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0123-Light Choir.xiz000066400000000000000000000042141475757676000244440ustar00rootroot00000000000000ZKs6ϯ꒓#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.3.3/banks/Will_Godfrey_Collection/0124-Super Pad.xiz000066400000000000000000000042051475757676000241340ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0125-Hyper Pad.xiz000066400000000000000000000042611475757676000241300ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0126-Hyper Matrix.xiz000066400000000000000000000075151475757676000246760ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0127-Extreme.xiz000066400000000000000000000051731475757676000237720ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Collection/0128-Wind and Surf.xiz000066400000000000000000000054401475757676000247030ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/000077500000000000000000000000001475757676000210605ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/Will_Godfrey_Companion/.bankdir000066400000000000000000000000071475757676000224700ustar00rootroot000000000000002.3.2 Myoshimi-2.3.3.3/banks/Will_Godfrey_Companion/0004-Muffled Bells.xiz000066400000000000000000000043631475757676000246070ustar00rootroot00000000000000Zw߿>@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.3.3/banks/Will_Godfrey_Companion/0006-Tinkle Bell.xiz000066400000000000000000000051761475757676000242750ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Companion/0010-Metal Sweep.xiz000066400000000000000000000046441475757676000243100ustar00rootroot00000000000000\_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.3.3/banks/Will_Godfrey_Companion/0011-Slow Steel.xiz000066400000000000000000000051331475757676000241560ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0014-Metal Tines.xiz000066400000000000000000000264321475757676000243120ustar00rootroot00000000000000v6޾ؤ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.3.3/banks/Will_Godfrey_Companion/0016-Soft Metal.xiz000066400000000000000000000046061475757676000241440ustar00rootroot00000000000000\_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.3.3/banks/Will_Godfrey_Companion/0021-Bubbles.xiz000066400000000000000000000257701475757676000235650ustar00rootroot00000000000000vFں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.3.3/banks/Will_Godfrey_Companion/0024-Solo.xiz000066400000000000000000000037711475757676000231230ustar00rootroot00000000000000Zs6_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.3.3/banks/Will_Godfrey_Companion/0025-Wind Whistle.xiz000066400000000000000000000050571475757676000245100ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0028-Theramin.xiz000066400000000000000000000037071475757676000237610ustar00rootroot00000000000000Zs6=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.3.3/banks/Will_Godfrey_Companion/0033-AddSynth Morph.xiz000066400000000000000000000041461475757676000247700ustar00rootroot00000000000000[[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.3.3/banks/Will_Godfrey_Companion/0034-DynaPad.xiz000066400000000000000000000051501475757676000235210ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Companion/0035-Modular Sines.xiz000066400000000000000000000077201475757676000246540ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0036-Echo Multimod.xiz000066400000000000000000000050251475757676000246350ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Companion/0038-Smooth Saw.xiz000066400000000000000000000041511475757676000241710ustar00rootroot00000000000000ZQS8~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.3.3/banks/Will_Godfrey_Companion/0039-Slow Morph.xiz000066400000000000000000000046171475757676000242070ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Companion/0040-Shimmer.xiz000066400000000000000000000045641475757676000236120ustar00rootroot00000000000000\]{_}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.3.3/banks/Will_Godfrey_Companion/0041-Buzz.xiz000066400000000000000000000035651475757676000231410ustar00rootroot00000000000000Zs6 _=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.3.3/banks/Will_Godfrey_Companion/0045-Bite.xiz000066400000000000000000000051751475757676000230750ustar00rootroot00000000000000v6=_ջ+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.3.3/banks/Will_Godfrey_Companion/0047-Accordian.xiz000066400000000000000000000076151475757676000241000ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Companion/0048-Pad Organ.xiz000066400000000000000000000035641475757676000237500ustar00rootroot00000000000000Z[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.3.3/banks/Will_Godfrey_Companion/0049-Pad Kit.xiz000066400000000000000000000057261475757676000234340ustar00rootroot00000000000000kWF;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.3.3/banks/Will_Godfrey_Companion/0050-Thin Trem Pipe.xiz000066400000000000000000000077221475757676000246560ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0051-Orc Voice.xiz000066400000000000000000000103671475757676000237570ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0052-Smooth Organ.xiz000066400000000000000000000042211475757676000244770ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Companion/0053-B3.xiz000066400000000000000000000046231475757676000224520ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Companion/0055-Thick Bass.xiz000066400000000000000000000035421475757676000241220ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Companion/0058-Simple Bass.xiz000066400000000000000000000037621475757676000243200ustar00rootroot00000000000000ZYs9~`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.3.3/banks/Will_Godfrey_Companion/0059-Rich Bass.xiz000066400000000000000000000044671475757676000237600ustar00rootroot00000000000000\[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.3.3/banks/Will_Godfrey_Companion/0060-Stopped Pipe.xiz000066400000000000000000000040371475757676000244770ustar00rootroot00000000000000ZKs6Wzر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.3.3/banks/Will_Godfrey_Companion/0062-Deep Matrix Kit.xiz000066400000000000000000000057201475757676000250170ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0064-SuperFat.xiz000066400000000000000000000071531475757676000237420ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Companion/0066-Sharp Sweep Multi.xiz000066400000000000000000000123711475757676000254050ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Companion/0070-Voyager Chime.xiz000066400000000000000000000031151475757676000246220ustar00rootroot00000000000000Z[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.3.3/banks/Will_Godfrey_Companion/0072-Cathedral Sound.xiz000066400000000000000000000045341475757676000251500ustar00rootroot00000000000000v6=_ݕ)_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.3.3/banks/Will_Godfrey_Companion/0074-Smooth Expanded.xiz000066400000000000000000000046201475757676000251700ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0078-Brassy.xiz000066400000000000000000000274061475757676000234640ustar00rootroot00000000000000vFں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.3.3/banks/Will_Godfrey_Companion/0079-Brassy Flutter.xiz000066400000000000000000000272251475757676000250720ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0081-Post Horn.xiz000066400000000000000000000073011475757676000240170ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0084-Cathedral Pipe Organ.xiz000066400000000000000000000077251475757676000260140ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0085-Theatre Organ.xiz000066400000000000000000000106341475757676000246350ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0087-Sub Choir.xiz000066400000000000000000000030031475757676000237620ustar00rootroot00000000000000Y]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.3.3/banks/Will_Godfrey_Companion/0094-Yet Another Flute.xiz000066400000000000000000000101721475757676000253710ustar00rootroot00000000000000]YsF~&RU#SvmI+8/(%$$%@ʯc|M/~:5eۦlx8槛׃^'7/Gdr=č])#\m5/~|i7_U||>w۸Kw5kF ghxQ8qg2Ȁ-f~S&zv~zqqxsvq.[K6 g{o wV7|}fC_ia]AUOs9~݌7c_?YZ| ~7t vfc$o:!S! |`O ۬L6[V_\}8:I-ɺnd7}0{o8b Y㟍t=CW.37plx|@،^ Ἔ֓V,YM.A<mӦN0Q]x"Q4,O9}luvV>58(oʊsAHʄ3O1ߺb*+ݯW'HIWunBq"C7hv!"fͧFgycm 7sƴ,#0hB5U䆭 {3bkWV/}-Ό+U߻ycgp.*$rjnD:_G..G:(yU/xp RH6HH6ذ'*M؛8KoQA/&]6Ot ġH$Τޫvԟn9CGP{uUӋfj=enfR$9hC{_q&0_Nv#B4 @ ,cgqYg4tJFJawVUNq\hzrr,%3jO&jūuq8tT ^t1JέH/Dꊙ>:MNc:=],{,,{tGg@Esoivz~iL1+S)=Ud 2r&S5a]am,)8+wH㒚Ф_IkvLt/N4Mv;(Y7 +\S l[HyrtN";%"c7 9Ea'|" R-Ы93:h67GZj, Ğ.$`EF0Ux-a,a5g & bwnWuQ0pWu&`QI vճqAujRejk푹m1=J=M㜻6gnk}^ bTqd*8ث,hcsN&3+qGl!eyڀqqfEIlo^3/>2"0Bi6Y 5ۀ:2 $e 2AfjgRhpMw|ğYY5p#nwQ132y %̡%36r'~[m)ykƬ6>6"4kXm$8]Cn%Sg'Mg8hJq&95&Y,{}޴,8(P_2s9E0:(oXi@lQ 5ȵ#>6 ePjA.$l`)? s|݂>Tv\Q\1I˚M)Ur$B:PQcL$y)PzpLQtj`9ϒ, ݂4`uo@w f(P*$"J-l ݂Q: ;f( d3G4k(# zR=҄QV&d-9QpLEy~%cfZ롸-75zBN(9u(PT*hHc(A Z@T[(Go5j+,?e\<=f P|(S9TshJlk(E|sesԂ(]ݧ1Kd/ڔQ@D<=m=hhDQ`ub';cPutlT  6JP.7`[h`-YϽ(q@(q@36JH sF6J2sx36JPF0qmt;s8mԴac sik84Dful8C.Y2ņlQ@ D=gkMJ(q@0q@9%DFXQ mq>?a3G Q*[P 9AHec 9犣ZrwF $QQ؃b1tj9Jk=6JpR SE==Og'k Vo_.;RU9wT*qnU4pE .8.+ҵ3RL+z2H;_RBU~mʼ,VR+Yk*}0Eѳz霂e6Pҝ^X̊?Kj2 5ා 7*jt5I͑}Ȼ>9Py{G*&x a , *ΕaJ}{"HV|)4RN^풪 sRk~eH42$Dn4q*؟nhK (֓hS(Mr'UrʛdUhLI@ORwj-+ɘ9"!WJ8O*G Le;wB%YBh[:*XY`u9nȚex$){mT,yHqV֣t; ZZpvz咴bUAMF8mQTW5Z eu_*}euw(J }VS|Lv)ZrHj%eв UE镜~(4uԧ^.ʞk6%PުuI5?#kKB<[uE!}xuEs*Nv* {^|jg)Xaڙ(6&&ꚭ-ڮp3v*qZ|qf/NOt7*>w.S:׊ksċ $/>؄/>wz񹕇CnPPۼ+R /Oxͽ=ouO|w$@Vqͳ{6<;MgN[[;5GIACey<`~`/:l3ᕓ$._~ƀ9ͳmJ 4[M! ˻dM.իce2Swg8@ig  !9B2URW@mS]/6 ȖtgO>Y?]ƃ;>{Ne`8&ٟNE+@&>~Et۬wvz'kwvz'mwv:;uv9ί =Gȏ3rd~=9<)OW^V>NOG'7ɉcqvT:5X~VjmYZcng=%U~-? xf&sVK4*NvC^O噜9d-d6\w4K}ק-Nc0LWbKyoshimi-2.3.3.3/banks/Will_Godfrey_Companion/0096-Cello.xiz000066400000000000000000000073061475757676000232540ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0100-Pad Chimes.xiz000066400000000000000000000037401475757676000240730ustar00rootroot00000000000000Zms8_{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.3.3/banks/Will_Godfrey_Companion/0106-Harpsichord.xiz000066400000000000000000000072001475757676000244450ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0107-Cathedral Harp.xiz000066400000000000000000000037541475757676000247540ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Companion/0108-Angel Harp.xiz000066400000000000000000000322241475757676000241060ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0114-Space Pipes.xiz000066400000000000000000000310151475757676000242730ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0117-Boy Choir.xiz000066400000000000000000000064311475757676000237640ustar00rootroot00000000000000b `]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.3.3/banks/Will_Godfrey_Companion/0119-Ghost Choir.xiz000066400000000000000000000056371475757676000243300ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Companion/0120-Ghost Chime.xiz000066400000000000000000000057171475757676000243000ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0121-Ghost Ensemble.xiz000066400000000000000000000370051475757676000250010ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0122-Choir Stabs.xiz000066400000000000000000000037461475757676000243110ustar00rootroot00000000000000Zs8~_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.3.3/banks/Will_Godfrey_Companion/0123-Cathedral Ahh.xiz000066400000000000000000000075301475757676000245540ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0125-Hollow Ghost Ensemble.xiz000066400000000000000000000165771475757676000262450ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Companion/0127-Hoover.xiz000066400000000000000000000046561475757676000234600ustar00rootroot00000000000000v6=_ԕ([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.3.3/banks/Will_Godfrey_Companion/0128-Surf.xiz000066400000000000000000000046601475757676000231310ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Companion/0129-Scaffold Pole.xiz000066400000000000000000000037021475757676000246100ustar00rootroot00000000000000Zms8_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.3.3/banks/chip/000077500000000000000000000000001475757676000154125ustar00rootroot00000000000000yoshimi-2.3.3.3/banks/chip/.bankdir000066400000000000000000000000051475757676000170200ustar00rootroot000000000000002.3.0yoshimi-2.3.3.3/banks/chip/0001-Fantasy_Canyon.xiz000066400000000000000000000074351475757676000214510ustar00rootroot00000000000000]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.3.3/banks/chip/0002-Fantasy_Canyon_X.xiz000066400000000000000000000166501475757676000217400ustar00rootroot00000000000000][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.3.3/banks/chip/0003-Chip_Bass.xiz000066400000000000000000000054631475757676000203710ustar00rootroot00000000000000>,`][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.3.3/banks/chip/0004-Chip_Bass_2.xiz000066400000000000000000000041261475757676000206060ustar00rootroot00000000000000E,`\]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.3.3/banks/chip/0006-Chip_Bass_4.xiz000066400000000000000000000044001475757676000206050ustar00rootroot00000000000000R,`]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.3.3/banks/chip/0007-Chip_Hop1.xiz000066400000000000000000000056601475757676000203130ustar00rootroot00000000000000\,`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.3.3/banks/chip/0008-Chip_Hop2.xiz000066400000000000000000000064511475757676000203140ustar00rootroot00000000000000c,`]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.3.3/banks/chip/0009-Chip_Strange_1.xiz000066400000000000000000000070441475757676000213270ustar00rootroot00000000000000]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.3.3/banks/chip/0011-Chip.xiz000066400000000000000000000060431475757676000174130ustar00rootroot00000000000000\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.3.3/banks/chip/0012-Chips_Funky_Flute.xiz000066400000000000000000000047031475757676000221130ustar00rootroot00000000000000w,`][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.3.3/banks/chip/0013-ChipSaw_1.xiz000066400000000000000000000077621475757676000203210ustar00rootroot00000000000000]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.3.3/banks/chip/0015-ChipSaw_3.xiz000066400000000000000000000077601475757676000203230ustar00rootroot00000000000000]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.3.3/banks/chip/0016-ChipSaw_4.xiz000066400000000000000000000115121475757676000203130ustar00rootroot00000000000000]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.3.3/banks/chip/0017-SuperSquare1.xiz000066400000000000000000000052531475757676000211000ustar00rootroot00000000000000r8갵{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.3.3/banks/chip/0019-Alien_Chatter.xiz000066400000000000000000000643701475757676000212510ustar00rootroot00000000000000[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.3.3/banks/chip/0021-Batman_2.xiz000066400000000000000000000077471475757676000201700ustar00rootroot00000000000000]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.3.3/banks/chip/0022-1234.xiz000066400000000000000000000053131475757676000171220ustar00rootroot00000000000000\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.3.3/banks/chip/0024-Boink.xiz000066400000000000000000000117211475757676000175750ustar00rootroot00000000000000][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.3.3/banks/chip/0025-Boink_120.xiz000066400000000000000000000120031475757676000201520ustar00rootroot00000000000000][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.3.3/banks/chip/0027-Ping_Chip.xiz000066400000000000000000000042311475757676000203740ustar00rootroot00000000000000,`\[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.3.3/banks/chip/0028-ChipsPlucks.xiz000066400000000000000000000054001475757676000207640ustar00rootroot00000000000000\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.3.3/banks/chip/0029-Order_of_Chaos.xiz000066400000000000000000000077401475757676000214220ustar00rootroot00000000000000]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.3.3/banks/chip/0030-Chips_Thing.xiz000066400000000000000000000077671475757676000207460ustar00rootroot00000000000000,`]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.3.3/banks/chip/0031-Chips_Plunks.xiz000066400000000000000000000077721475757676000211460ustar00rootroot00000000000000]]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.3.3/banks/chip/0032-Chips_Plunks_2.xiz000066400000000000000000000100471475757676000213550ustar00rootroot00000000000000]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.3.3/banks/chip/0033-Chips_Pulse.xiz000066400000000000000000000057031475757676000207540ustar00rootroot00000000000000]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.3.3/banks/chip/0035-Darkness.xiz000066400000000000000000000057431475757676000203160ustar00rootroot00000000000000]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.3.3/banks/chip/0036-Darkness_2.xiz000066400000000000000000000054401475757676000205320ustar00rootroot00000000000000][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.3.3/banks/chip/0038-iBrazz_1.xiz000066400000000000000000000057411475757676000202260ustar00rootroot00000000000000]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.3.3/banks/chip/0040-WindSaw.xiz000066400000000000000000000072641475757676000201140ustar00rootroot00000000000000]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.3.3/banks/chip/0041-WindSawModu.xiz000066400000000000000000000073141475757676000207360ustar00rootroot00000000000000]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.3.3/banks/chip/0044-ChipBass.xiz000066400000000000000000000047761475757676000202450ustar00rootroot00000000000000\[ڸ~ϯ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.3.3/banks/chip/0045-No_Trash_1.xiz000066400000000000000000000046001475757676000204710ustar00rootroot00000000000000\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.3.3/banks/chip/0046-plucker.xiz000066400000000000000000000043221475757676000202030ustar00rootroot00000000000000Z[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.3.3/banks/chip/0048-Glitch_in_the_Machine.xiz000066400000000000000000000150071475757676000227260ustar00rootroot00000000000000]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.3.3/banks/chip/0050-Ghost_Bells.xiz000066400000000000000000000075511475757676000207450ustar00rootroot00000000000000]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.3.3/desktop/256/000077500000000000000000000000001475757676000153565ustar00rootroot00000000000000yoshimi-2.3.3.3/desktop/256/yoshimi.png000066400000000000000000000243501475757676000175510ustar00rootroot00000000000000PNG  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.3.3/desktop/metainfo/000077500000000000000000000000001475757676000166445ustar00rootroot00000000000000yoshimi-2.3.3.3/desktop/metainfo/yoshimi.metainfo.xml000066400000000000000000000105641475757676000226560ustar00rootroot00000000000000 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 configurastion control, and expands theme colour control, and adds realtime theme editing.

    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://sourceforge.net/projects/yoshimi/ http://yoshimi.github.io/docs/user-guide/ yoshimi-2.3.3.3/desktop/yoshimi.1000066400000000000000000000104521475757676000166070ustar00rootroot00000000000000.TH yoshimi 1 " 2025" "yoshimi 2.3.3" .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 The latest 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. .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.3.3/desktop/yoshimi.desktop.in000066400000000000000000000006601475757676000205250ustar00rootroot00000000000000[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.3.3/desktop/yoshimi.png000066400000000000000000000057341475757676000172420ustar00rootroot00000000000000PNG  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.3.3/desktop/yoshimi.svg000066400000000000000000000156741475757676000172610ustar00rootroot00000000000000 image/svg+xml yoshimi-2.3.3.3/desktop/yoshimi_alt.svg000066400000000000000000000161511475757676000201100ustar00rootroot00000000000000 yoshimi-2.3.3.3/dev_notes/000077500000000000000000000000001475757676000153575ustar00rootroot00000000000000yoshimi-2.3.3.3/dev_notes/0_WARNING_0000066400000000000000000000003411475757676000170430ustar00rootroot00000000000000 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.3.3/dev_notes/1st_ReadMe.txt000066400000000000000000000006201475757676000200420ustar00rootroot00000000000000 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 Yoshimi Control Numbers.ods 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.3.3/dev_notes/Automated_Testing_Support.txt000066400000000000000000000271601475757676000233020ustar00rootroot00000000000000 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.3.3/dev_notes/CLI_zread000066400000000000000000000013371475757676000171020ustar00rootroot00000000000000This 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.3.3/dev_notes/CLI_zset000066400000000000000000000007031475757676000167560ustar00rootroot00000000000000This 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.3.3/dev_notes/ControlModel.pdf000066400000000000000000000347171475757676000204670ustar00rootroot00000000000000%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.3.3/dev_notes/Control_Block_Test.txt000066400000000000000000000002471475757676000216540ustar00rootroot00000000000000This 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.3.3/dev_notes/Default_Maths.txt000066400000000000000000000013351475757676000206420ustar00rootroot00000000000000There 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.3.3/dev_notes/Defaults_V_MagicNumbers.txt000066400000000000000000000015701475757676000226130ustar00rootroot00000000000000A 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.3.3/dev_notes/Effect_Inserts.txt000066400000000000000000000040001475757676000210150ustar00rootroot00000000000000This 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.3.3/dev_notes/Envelope_Inserts.txt000066400000000000000000000037701475757676000214130ustar00rootroot00000000000000This 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.3.3/dev_notes/Escape_chars.txt000066400000000000000000000007341475757676000205040ustar00rootroot00000000000000use 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.3.3/dev_notes/FLTK_color_map.png000066400000000000000000001477461475757676000207030ustar00rootroot00000000000000PNG  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.3.3/dev_notes/FLTK_colours000066400000000000000000000003231475757676000176060ustar00rootroot00000000000000 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.3.3/dev_notes/FLTK_event_keys.txt000066400000000000000000000023471475757676000211220ustar00rootroot00000000000000 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.3.3/dev_notes/FLTK_event_names.txt000066400000000000000000000021211475757676000212400ustar00rootroot00000000000000 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.3.3/dev_notes/GUI_Interpretations.txt000066400000000000000000000052541475757676000220240ustar00rootroot00000000000000 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.3.3/dev_notes/GuiDataExchange.txt000066400000000000000000000167241475757676000211130ustar00rootroot00000000000000 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.3.3/dev_notes/GuiDataExchangeTest.cpp000066400000000000000000000152001475757676000217020ustar00rootroot00000000000000/* 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.3.3/dev_notes/MIDI_Learn.txt000066400000000000000000000060721475757676000177700ustar00rootroot00000000000000The 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.3.3/dev_notes/MIDI_Learn_Sequence.txt000066400000000000000000000012251475757676000216130ustar00rootroot00000000000000 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.3.3/dev_notes/Major_control_updates_on_window_refresh000066400000000000000000000007571475757676000254510ustar00rootroot00000000000000Main 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.3.3/dev_notes/Note_Tests.txt000066400000000000000000000030531475757676000202100ustar00rootroot00000000000000 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.3.3/dev_notes/PadThread_Explanation.txt000066400000000000000000000321041475757676000223160ustar00rootroot00000000000000-------- 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.3.3/dev_notes/Part_On_Off.txt000066400000000000000000000013271475757676000202570ustar00rootroot00000000000000This 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.3.3/dev_notes/Reading_Values.txt000066400000000000000000000007431475757676000210140ustar00rootroot00000000000000updated 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.3.3/dev_notes/Resize.txt000066400000000000000000000035531475757676000173670ustar00rootroot00000000000000FLTK 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.3.3/dev_notes/Root_Bank_Program.txt000066400000000000000000000016041475757676000214660ustar00rootroot00000000000000 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.3.3/dev_notes/Scales.txt000066400000000000000000000035071475757676000173370ustar00rootroot00000000000000Microtonal 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.3.3/dev_notes/Simple_Message.txt000066400000000000000000000032211475757676000210130ustar00rootroot00000000000000This 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.3.3/dev_notes/Some_Coding_Notes.txt000066400000000000000000000041101475757676000214520ustar00rootroot00000000000000By 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). 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.3.3/dev_notes/Startup_Synth_instances.txt000066400000000000000000000240571475757676000230260ustar00rootroot00000000000000 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.3.3/dev_notes/System_Values.txt000066400000000000000000000020001475757676000207130ustar00rootroot00000000000000This 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.3.3/dev_notes/ToDo.txt000066400000000000000000000021631475757676000167670ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/000077500000000000000000000000001475757676000212335ustar00rootroot00000000000000yoshimi-2.3.3.3/dev_notes/Yoshimi Control Data/Design Notes000066400000000000000000000025201475757676000234370ustar00rootroot00000000000000General design has been tested on Palemoon, Vivaldi, Brave and Firefox browsers. Layout of table cells is designed to be easy to follow while allowing maximum space for descriptions. Titles of data fields have exactly the same case as the actual commands. Currently 'type' and 'source' fields are not presented. In the previous version these had either not been filled in at all or only for a few commands - may be reviewed. General design and layout is set in a single css file - 'style.css' Pages are fixed width to keep the layout structure consistent and easy to maintain. A fixed location footer duplicate of table headers is only used for tables long enough to need scrolling - it would look odd with short tables! To divide sections in long tables an 'empty' table row is used. In some cases this is followed by a table row with a single full width cell acting as a heading. When editing files, table cells are arranged vertically rather than as the line they represent. They're much easier to edit that way! Mostly in the descriptions, line breaks
    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.3.3/dev_notes/Yoshimi Control Data/Sections/000077500000000000000000000000001475757676000230225ustar00rootroot00000000000000yoshimi-2.3.3.3/dev_notes/Yoshimi Control Data/Sections/LFOinsert.html000066400000000000000000000074101475757676000255570ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/addsynth.html000066400000000000000000000131361475757676000255320ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/addvoice.html000066400000000000000000000411421475757676000254700ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/bank.html000066400000000000000000000172111475757676000246250ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/config.html000066400000000000000000000415371475757676000251670ustar00rootroot00000000000000 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
    BanksChecked 0,1 7 248 255 255 255 255 255 255 Confirm a valid set of banks - system defined
    XMLcompressionLevel 0~9 8 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.3.3/dev_notes/Yoshimi Control Data/Sections/display.html000066400000000000000000000104221475757676000253540ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/effect.html000066400000000000000000000274001475757676000251470ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/envelopeinsert.html000066400000000000000000000156331475757676000267620ustar00rootroot00000000000000Envelope 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.3.3/dev_notes/Yoshimi Control Data/Sections/filterinsert.html000066400000000000000000000213321475757676000264230ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/main.html000066400000000000000000000336341475757676000246450ustar00rootroot00000000000000 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
    panLawType 0~2 16 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.3.3/dev_notes/Yoshimi Control Data/Sections/midi.html000066400000000000000000000077341475757676000246450ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/midilearn.html000066400000000000000000000163731475757676000256660ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/oscillator.html000066400000000000000000000274721475757676000260770ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/padsynth.html000066400000000000000000000403151475757676000255450ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/part.html000066400000000000000000000660551475757676000246720ustar00rootroot00000000000000 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~15 255 32,255 255 255 255 255 Enable AddSynth
    enableSub 0,1 2 0~15 255 32,255 255 255 255 255 Enable SubSynth
    enablePad 0,1 3 0~15 255 32,255 255 255 255 255 Enable PadSynth
    volume 0~127 5 0~63 255 255 255 255 255 255 Part volume
    velocitySense 0~127 6 0~63 255 255 255 255 255 255 Velocity sensitivity
    panning 0~127 7 0~63 255 255 255 255 255 255 Part panning
    velocityOffset 0~127 8 0~63 255 255 255 255 255 255 Velocity start offset
    midiChannel 0~16 9 0~63 255 255 255 255 255 255 Incoming MIDI channel
    keyMode 0~2 10 0~63 255 255 255 255 255 255 Mode -- Poly, Mono, Legato
    channelATset 0~127 11 0~63 255 255 255 255
    ret. 0~127
    255 255 Channel aftertouch -- off, filter cutoff + filter Q
    + pitchbend + modulation
    keyATset 0,127 12 0~63 255 255 255 255
    ret. 0~127
    255 255 Key aftertouch -- off, filter cutoff + filter Q
    + pitchbend + modulation
    portamento 0,1 13 0~63 255 255 255 255 255 255 Portamento
    minNote 0~126 15 0~63 255 255 255 255 255 255 Minimum note accepted
    maxNote 1~127 16 0~63 255 255 255 255 255 255 Maximum note accepted
    minToLast ~ ~ 17 0~63 255 255 255 255 255 255 Set minimum to last key press
    maxToLast ~ ~ 18 0~63 255 255 255 255 255 255 Set maximum to last key press
    resetMinMax ~ ~ 19 0~63 255 255 255 255 255 255 Clear key limits
    maxNotes 1~60 33 0~63 255 255 255 255 255 255 Maximum number of sounding notes
    keyShift -36~36 35 0~63 255 255 255 255 255 255 Key shift
    partToSystemEffect1 0~127 40 0~63 255 255 255 255 255 255 Part output to System Effect 1
    partToSystemEffect2 0~127 41 0~63 255 255 255 255 255 255 Part output to System Effect 2
    partToSystemEffect3 0~127 42 0~63 255 255 255 255 255 255 Part output to System Effect 3
    partToSystemEffect4 0~127 43 0~63 255 255 255 255 255 255 Part output to System Effect 4
    humanise 0~50 48 0~63 255 255 255 255 255 255 Small frequency randmisation
    humanisVelocity 0~50 49 0~63 255 255 255 255 255 255 Small amplitude randomisation
    effectNumber 0~2 64 0~63 17 255 255 255 255 255 Set effect number
    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 14 0~63 0~15 255 32 255 255 255 Mute this kit line
    minNote ~ ~ 15 0~63 0~15 255 32 255 255 255 Kit item min note
    maxNote ~ ~ 16 0~63 0~15 255 32 255 255 255 Kit item max note
    minToLastKey ~ ~ 17 0~63 0~15 255 32 255 255 255 Kit item min to last key press
    maxToLastKey ~ ~ 18 0~63 0~15 255 32 255 255 255 Kit item max to last key press
    resetMinMaxKey ~ ~ 19 0~63 0~15 255 32 255 255 255 Kit item clear key limits
    kitEffectNum 0~3 24 0~63 0~15 255 32 255 255 255 Effect to use -- Off, 1, 2, 3
    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
    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.3.3/dev_notes/Yoshimi Control Data/Sections/resonance.html000066400000000000000000000066631475757676000257000ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/scales.html000066400000000000000000000143211475757676000251630ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/style.css000066400000000000000000000030621475757676000246750ustar00rootroot00000000000000body { 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.3.3/dev_notes/Yoshimi Control Data/Sections/subsynth.html000066400000000000000000000214041475757676000255700ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/toplevel.html000066400000000000000000000131021475757676000255370ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/Sections/vector.html000066400000000000000000000121041475757676000252100ustar00rootroot00000000000000 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.3.3/dev_notes/Yoshimi Control Data/index.html000066400000000000000000000050151475757676000232310ustar00rootroot00000000000000 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.3

    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.3.3/dev_notes/Yoshimi_Policies.txt000066400000000000000000000070551475757676000213770ustar00rootroot00000000000000Updated 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.3.3/dev_notes/Yoshimi_Timeline.txt000066400000000000000000000002761475757676000213740ustar00rootroot000000000000002009 Yoshimi forked from ZynAddSubFX by Alan Calvert. Officially acknowledged on September 1st. 2011 Maintenance taken over by Jeremy Jongpier. 2014 Maintenance passed on to Will Godfrey. yoshimi-2.3.3.3/dev_notes/switches_and_flags.txt000066400000000000000000000034301475757676000217470ustar00rootroot00000000000000Details 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.3.3/dev_notes/z-Release_Code_Names.txt000066400000000000000000000007511475757676000220270ustar00rootroot00000000000000Mostly 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.3.3/doc/000077500000000000000000000000001475757676000141365ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/1stReadMe.txt000066400000000000000000000011061475757676000164620ustar00rootroot00000000000000These 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.3.3/doc/Colour_Themes.txt000066400000000000000000000044041475757676000174510ustar00rootroot00000000000000With 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.3.3/doc/Formant_Filter000066400000000000000000000022451475757676000167770ustar00rootroot00000000000000All 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.3.3/doc/Formant_Filter_Design.txt000066400000000000000000000023601475757676000211040ustar00rootroot00000000000000The 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.3.3/doc/Formant_Filter_Extension.txt000066400000000000000000000024531475757676000216520ustar00rootroot00000000000000If 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.3.3/doc/Histories/000077500000000000000000000000001475757676000161075ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/Histories/ALSA_Setup.txt000066400000000000000000000015201475757676000205460ustar00rootroot00000000000000To 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.3.3/doc/Histories/AddSynthModulation.txt000066400000000000000000000011101475757676000224130ustar00rootroot00000000000000 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.3.3/doc/Histories/Aftertouch.txt000066400000000000000000000025151475757676000207570ustar00rootroot00000000000000This 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.3.3/doc/Histories/Banks.txt000066400000000000000000000101231475757676000177030ustar00rootroot00000000000000You 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.3.3/doc/Histories/Banks_Presets_Update.txt000066400000000000000000000056061475757676000227240ustar00rootroot00000000000000Banks 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.3.3/doc/Histories/Channel_Switcher.txt000066400000000000000000000052231475757676000220720ustar00rootroot00000000000000This 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.3.3/doc/Histories/Command_Line.txt000066400000000000000000000071561475757676000212060ustar00rootroot00000000000000When 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.3.3/doc/Histories/Command_line_Config_Roots_Banks.txt000066400000000000000000000017411475757676000250310ustar00rootroot00000000000000On 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.3.3/doc/Histories/Direct_Part_Control.txt000066400000000000000000000016641475757676000225570ustar00rootroot00000000000000Using 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.3.3/doc/Histories/Instrument_Kits.txt000066400000000000000000000017141475757676000220150ustar00rootroot00000000000000The 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.3.3/doc/Histories/Jack_Audio_Destination.txt000066400000000000000000000023411475757676000232020ustar00rootroot00000000000000When 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.3.3/doc/Histories/Kit_Mode_Access.txt000066400000000000000000000013621475757676000216260ustar00rootroot00000000000000 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.3.3/doc/Histories/MIDI.txt000066400000000000000000000033141475757676000173730ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/MIDI_Learn.txt000066400000000000000000000064701475757676000205220ustar00rootroot00000000000000This 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.3.3/doc/Histories/NRPN_System_Settings.txt000066400000000000000000000020631475757676000226520ustar00rootroot00000000000000If 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.3.3/doc/Histories/Output_Levels.txt000066400000000000000000000026061475757676000214660ustar00rootroot00000000000000Audio 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.3.3/doc/Histories/Part_Kit_Crossfade.txt000066400000000000000000000024341475757676000223610ustar00rootroot00000000000000 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.3.3/doc/Histories/README.txt000066400000000000000000000111741475757676000176110ustar00rootroot00000000000000This 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.3.3/doc/Histories/Scales.txt000066400000000000000000000031511475757676000200620ustar00rootroot00000000000000It 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.3.3/doc/Histories/Selection_Structure.txt000066400000000000000000000064731475757676000226670ustar00rootroot00000000000000 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.3.3/doc/Histories/Shortform_NRPN.txt000066400000000000000000000012501475757676000214660ustar00rootroot00000000000000 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.3.3/doc/Histories/Solo.txt000066400000000000000000000064541475757676000175750ustar00rootroot00000000000000There 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.3.3/doc/Histories/Using_More_Parts.txt000066400000000000000000000064301475757676000220730ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/Using_NRPNs.txt000066400000000000000000000045541475757676000207650ustar00rootroot00000000000000 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.3.3/doc/Histories/Vector_Control.txt000066400000000000000000000160311475757676000216130ustar00rootroot00000000000000 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.3.3/doc/Histories/Voice_Mod_Oscillators.txt000066400000000000000000000022621475757676000230740ustar00rootroot00000000000000The 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.3.3/doc/Histories/Yoshi-Zyn_Sound_Differences.txt000066400000000000000000000063041475757676000241710ustar00rootroot00000000000000 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.3.3/doc/Histories/Yoshi_Zyn_NRPNs.txt000066400000000000000000000111471475757676000216270ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/Yoshimi CCs and NRPNs.pdf000066400000000000000000000531431475757676000223260ustar00rootroot00000000000000%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.3.3/doc/Histories/Yoshimi_1.3.5-features.txt000066400000000000000000000117731475757676000226420ustar00rootroot00000000000000In 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.3.3/doc/Histories/Yoshimi_1.3.6-features.txt000066400000000000000000000057601475757676000226420ustar00rootroot00000000000000One 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.3.3/doc/Histories/Yoshimi_1.3.7-features.txt000066400000000000000000000044541475757676000226420ustar00rootroot00000000000000This 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.3.3/doc/Histories/Yoshimi_1.3.8-features.txt000066400000000000000000000070071475757676000226400ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/Yoshimi_1.3.9-features.txt000066400000000000000000000033201475757676000226330ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/Yoshimi_1.4.0-features.txt000066400000000000000000000057561475757676000226420ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.4.1-features.txt000066400000000000000000000103331475757676000226260ustar00rootroot00000000000000Yoshimi 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.3.3/doc/Histories/Yoshimi_1.5.0-features.txt000066400000000000000000000052571475757676000226370ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.1-features.txt000066400000000000000000000043311475757676000226300ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.10_features.txt000066400000000000000000000034741475757676000230010ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.11_features.txt000066400000000000000000000056531475757676000230030ustar00rootroot000000000000001.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.3.3/doc/Histories/Yoshimi_1.5.2-features.txt000066400000000000000000000023231475757676000226300ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.3-features.txt000066400000000000000000000047621475757676000226420ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.4_features.txt000066400000000000000000000013031475757676000227110ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.5_1.5.6_features.txt000066400000000000000000000113321475757676000234440ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.7_features.txt000066400000000000000000000075641475757676000227330ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.8_features.txt000066400000000000000000000025711475757676000227250ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.5.9_features.txt000066400000000000000000000113321475757676000227210ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.6.0_features.txt000066400000000000000000000171111475757676000227120ustar00rootroot000000000000001.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.3.3/doc/Histories/Yoshimi_1.6.1_features.txt000066400000000000000000000046471475757676000227250ustar00rootroot000000000000001.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.3.3/doc/Histories/Yoshimi_1.7.0_features000066400000000000000000000025751475757676000221050ustar00rootroot000000000000001.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.3.3/doc/Histories/Yoshimi_1.7.1_features.txt000066400000000000000000000071351475757676000227210ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.7.2_features.txt000066400000000000000000000046711475757676000227240ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.7.3_features.txt000066400000000000000000000007021475757676000227140ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_1.7.4_features.txt000066400000000000000000000013561475757676000227230ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_2.0.1_features.txt000066400000000000000000000015051475757676000227060ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_2.0.2_features.txt000066400000000000000000000014401475757676000227050ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_2.0_features.txt000066400000000000000000000136231475757676000225530ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_2.1.0_features.txt000066400000000000000000000027111475757676000227060ustar00rootroot00000000000000V 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.3.3/doc/Histories/Yoshimi_2.1.1_features.txt000066400000000000000000000042241475757676000227100ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.1.2_features.txt000066400000000000000000000034711475757676000227140ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.2.0_features.txt000066400000000000000000000045651475757676000227200ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.2.1_features.txt000066400000000000000000000025231475757676000227110ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.2.2_features.txt000066400000000000000000000007121475757676000227100ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.2.3_features.txt000066400000000000000000000025411475757676000227130ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.3.0_features.txt000066400000000000000000000047101475757676000227110ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.3.1.2_features.txt000066400000000000000000000027041475757676000230530ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.3.1_features.txt000066400000000000000000000026471475757676000227210ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_2.3.2_features.txt000066400000000000000000000016231475757676000227130ustar00rootroot00000000000000Version 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.3.3/doc/Histories/Yoshimi_Early_History.txt000066400000000000000000000115041475757676000231470ustar00rootroot00000000000000Written 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.3.3/doc/Histories/Yoshimi_License_History.txt000066400000000000000000000047051475757676000234620ustar00rootroot00000000000000Software 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.3.3/doc/Histories/Yoshimi_Only_NRPNs.txt000066400000000000000000000016371475757676000223210ustar00rootroot00000000000000 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.3.3/doc/Histories/Zyn_ChangeLog000066400000000000000000002013301475757676000205200ustar00rootroot000000000000006 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.3.3/doc/Histories/Zyn_HISTORY.txt000066400000000000000000000255101475757676000206540ustar00rootroot000000000000002.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.3.3/doc/Note_Envelopes.txt000066400000000000000000000044521475757676000176310ustar00rootroot00000000000000 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.3.3/doc/The Short Yoshimi Guide.odt000066400000000000000000001443631475757676000211010ustar00rootroot00000000000000PKV^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.3.3/doc/examples/Arram_Koth_Finale.txt000066400000000000000000000010671475757676000220260ustar00rootroot00000000000000Arram_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.3.3/doc/examples/CoolSound.txt000066400000000000000000000004321475757676000204210ustar00rootroot00000000000000 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.3.3/doc/examples/CoolSound.xvy000066400000000000000000000271441475757676000204410ustar00rootroot00000000000000}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.3.3/doc/examples/Microtonal Keymap Demo.kbm000066400000000000000000000013401475757676000226300ustar00rootroot00000000000000! 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.3.3/doc/examples/Microtonal Ratio Scale.xsz000066400000000000000000000015621475757676000227040ustar00rootroot00000000000000W]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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio 3.xmz000066400000000000000000000063271475757676000246300ustar00rootroot00000000000000\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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio 4.xmz000066400000000000000000000062051475757676000246240ustar00rootroot00000000000000\[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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio 5.xmz000066400000000000000000000055761475757676000246370ustar00rootroot00000000000000\[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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio 6.xmz000066400000000000000000000060411475757676000246240ustar00rootroot00000000000000\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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio Dist 1.xmz000066400000000000000000000066101475757676000255050ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio Dist 2.xmz000066400000000000000000000066171475757676000255150ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio Flange 1.xmz000066400000000000000000000066301475757676000260000ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Arpeggio Flange 2.xmz000066400000000000000000000071011475757676000257730ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Choir Reeds.xmz000066400000000000000000000076261475757676000250420ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Choir Strings SynthBrass.xmz000066400000000000000000000132111475757676000274750ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Dist Guitar Strings 2.xmz000066400000000000000000000107361475757676000266220ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Drop.xmz000066400000000000000000000060411475757676000236450ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Fantasy 1.xmz000066400000000000000000000064371475757676000245000ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Glass Choir.xmz000066400000000000000000000126761475757676000250520ustar00rootroot00000000000000]]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.3.3/doc/examples/Original Zyn Patchsets/HighPass Saw Strings.xmz000066400000000000000000000104141475757676000265730ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Ice Rhodes Strings.xmz000066400000000000000000000103661475757676000262650ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Legatto 2.xmz000066400000000000000000000066551475757676000244750ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Legatto Strings.xmz000066400000000000000000000102461475757676000257540ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Octave Strings.xmz000066400000000000000000000064071475757676000256020ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Saw.xmz000066400000000000000000000054141475757676000234760ustar00rootroot00000000000000r8=_{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.3.3/doc/examples/Original Zyn Patchsets/Space 1.xmz000066400000000000000000000131271475757676000241200ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/String Reverb.xmz000066400000000000000000000067421475757676000254250ustar00rootroot00000000000000rI_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.3.3/doc/examples/Original Zyn Patchsets/Strings Reeds 2.xmz000066400000000000000000000076571475757676000255550ustar00rootroot00000000000000]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.3.3/doc/examples/Original Zyn Patchsets/Struck String Big Reverb 1.xmz000066400000000000000000000075551475757676000274670ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Struck String Big Reverb 2.xmz000066400000000000000000000075501475757676000274630ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/Synth Piano Reverb.xmz000066400000000000000000000055421475757676000263100ustar00rootroot00000000000000\[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.3.3/doc/examples/Original Zyn Patchsets/Synth.xmz000066400000000000000000000102441475757676000240460ustar00rootroot00000000000000][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.3.3/doc/examples/Original Zyn Patchsets/bent_synth.xmz000066400000000000000000000063441475757676000251240ustar00rootroot00000000000000\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.3.3/doc/examples/Original Zyn Patchsets/photons.xmz000066400000000000000000000136671475757676000244470ustar00rootroot00000000000000]]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.3.3/doc/examples/Out_There.mid000066400000000000000000000226251475757676000203540ustar00rootroot00000000000000MThdMTrk%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.3.3/doc/examples/Out_There.txt000066400000000000000000000005151475757676000204140ustar00rootroot00000000000000 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.3.3/doc/examples/Out_There.xmz000066400000000000000000000515341475757676000204220ustar00rootroot00000000000000}[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.3.3/doc/examples/synth_prelude.txt000066400000000000000000000015331475757676000214040ustar00rootroot00000000000000Courtesy 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.3.3/doc/examples/themes/000077500000000000000000000000001475757676000172415ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/examples/themes/blue_tint.clr000066400000000000000000000072241475757676000217350ustar00rootroot00000000000000Slightly 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.3.3/doc/examples/themes/demo.clr000066400000000000000000000070721475757676000206750ustar00rootroot00000000000000Demo ------------------ 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.3.3/doc/examples/themes/gray-dark-01.clr000066400000000000000000000073761475757676000220570ustar00rootroot00000000000000A 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.3.3/doc/examples/themes/green_tint.clr000066400000000000000000000072251475757676000221070ustar00rootroot00000000000000Slightly 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.3.3/doc/examples/themes/largosdark.clr000066400000000000000000000073541475757676000221050ustar00rootroot00000000000000Do 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.3.3/doc/examples/themes/photon.clr000066400000000000000000000075711475757676000212640ustar00rootroot00000000000000Do 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) 255,255,255, 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 255,255,255, 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 255,255,255, 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 255,255,255, 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 255,255,255, 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 0,0,0, 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.3.3/doc/examples/themes/red_tint.clr000066400000000000000000000072161475757676000215610ustar00rootroot00000000000000Slightly 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.3.3/doc/examples/themes/retro_classic.clr000066400000000000000000000071771475757676000226130ustar00rootroot00000000000000Demo ------------------ 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.3.3/doc/yoshimi_user_guide/000077500000000000000000000000001475757676000200325ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/000077500000000000000000000000001475757676000205625ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/add.html000066400000000000000000000101601475757676000221760ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/add/images/000077500000000000000000000000001475757676000220275ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/images/global.png000066400000000000000000006156241475757676000240130ustar00rootroot00000000000000PNG  IHDR>sBIT|d IDATxw|ulzoBIE6~=Yy^],yֳ멇b=EP H/B )2c7dS6$g>3|>%<<\C!B!A|һ;B!B!D>}7,ڲ{s$B!BAU֍B!B!f fB!B MY+6#8Ulv~:G2 v-ƱB2k/ԩyӿ>凍{)i*'߿}5oZʏ?OBlifOs K #2<}3mS 覵ˡcylqŕ|b+[v% FdX01aL79F)_ltfPBC>(;uv=hIye-t=iGNV//ƶ{КCw:7G!ęnWi5̘0(E/7^\qN??hj v{Qen,ky_Ӽ('ir:212aTJ{7C9 <$}bIa<ԙ-n +((`,Jʫ;e=^|Q^Yˆi{:OM]hIڑ\؜wiH+.:rKY]ogT./3y3GQ[ge?u1TUW1~D4~>mփ}s@|>v88熶tU=8 śgf +vM?Uߒʗ=MWLaöt*ظ0?n=kvSoq 7^l6/oP5fBL uLd`J̼rx=L~DE/ItD0~RYU˳omeC(¸} e?nA|HJo/}ņmW媝l} W_xW\07gכ).&59{n< OmIzF>̙6_v1Y eUlߗ!niWl^Q|T Zݦۛ6  /bδa2_~a'/Fm }{"BL|/eװb^h4GpGzUZk@v{/^}?g,kcԪ޺:Ee O-McW5&]fm|z9eTV*aAMWL%&2re6<$Q1;ӲVCxs~BOsoyozo{N|t͗ Qޛ^z+#sm'^Z xmly?s G|Jb)",BVn Y%\>g &4qYEU5by6lv۴5%e뭼jgaa='㳟r[bW֮cy8b>̞2΋7cgWNjҿ*//|AfcۼJʱ"kꉥLq CKŲ;4Xz'ovt+%#Y([/Z(ylzA޼LfIn4WLƮz?COߛ:^[rD1;Ӳ0 PSWOaI%3y屛m1_ɭTS[6|?eTT+k뮽ys4ݖ:/1b4173}q}q6EQ 5eQRzle1\ii7ޝgk3ǙKmy/_|pb~h|/_go4w(Mh5i0k6YE{n[*lvEoÄ)lߗɳoĮ*FҊ=s̛9Z=NH`>8ծk1[ٰ0VF[Zѵ((ݵsy lvKfix9Ciy ;Ӳ7O<4,%v 9Mu~a1 HP?5l~;vUYLš͇xenbmwZΕeǾXv` |LWN[bB7/gݖCrTM~|P_SbʮOb2lvŏ~xҹ~߰_ /˽ɲڪ U1%;gi}}|@M]oZ/CMye ϾG2 9S̪ 3m&1u\RcPŹ7;)*ǭ=y|u2g1Kʪ9Og+ӓ"5:o_OJh K*7zǡ7݌9nKWsFNwtkO-ws3M`x?DWJVn)?1u^`-=tE]U:&\Hu2W>l6VlXVMbڸߚߩ_xOp#iYhFAq9Q۹v/[0o<)/,Lx$|| LʞAʱ塭}zE;06/vwI4 އu[ө3[iOFN^q\vH۰BGJαvl&G;ٶ7jǼNhf!~F.5m{c4.:w8?/1. VvW˶]umaj^ez8 ]']-u3>>0%mƓߵ]iY̚4lߗɺ-)fS)-isSsݦ30][7u+ 'a:k/>1w6zv݌=N9ќ3o6:4֙yH[UM~hOPg)e1a۰ٌ6sHMūs͸`֓4N[B<v8[FNԏj=]Txq._Rf'˪~c{Dh gti.ՙ%״69B(.*͆!IG˂ͦ2zkŷ嶦LGl#bmߗEep\8KL-8/5ب`|Ekvͫ Esuӹ@6AMrҎ`G!$$+6g@I=]Ld>קav.o'a& UհZd+6 9UӸoQT-o6Dh>29:VOR?hj,*[>Z$ۨzfSPRE\TcɸNJnA969׸-grKLjFXv\ꡜ  #>gq[nWWxe~Qec@3_R4<`veϷa{*?p,l;G:oz=Ճpom_wTsr . 7Qg<G&:4oQ:gKwKZ{C7vC= !f|#}&i~>#\'-Btow|8ᡁWr(#u[37stҰéiLه}c7qÒزm-0l0(2ӆV][ʃ'9%EG+شqܾ`jiVk55/va֤A6v4cE$'Dp('6חl}HI&(J9m1qT~3;ǨthfRobtifY-<]ؼ+:fN@LdյfypۼM$&2Ptv}xjI ll~DjˈPǿmk;;mՃhFuuf[ʜv!Amqp*9}`>]C>$5y/1.@*jٶ/m{3zHoʫز8%UxN+ ovd9Y%] -݆v1^gz:@)9 ~#K6wҒmp`Ps4'owc 8Пznvyylۅ%Hĭ%TVO>qˆ>y{{Xϼxm̜П+ɻ_lnW _DIy >F,VGM;mqfn):rP/cCݶGfNϲ5isKKh4`| ot jY-IIණ'[8 5nnWgtK;.#PZ^CEuōUA7 f:5mՃH`|v-Tsjꌇڹy^zlvg5&_|j7 f},9&&ڭtK9cXYC{oyB[0ZZ^ 4Sa-&Bk:{QB_ϊp$: &?Rh/v4UcdP\VCe_#aL 09g|G[n}[nkI[88LK!sXQYcKb\2adr۲HMa冃TE3f,B!Pl{UB!MyYB!z]̾1cbB!D !ݬӃHII!%%-Bƌ˿v쐀V/޽_Wm{衇7oy׿2u6kkyի^乁h$((dMe]_$hKZfSRRH;p+-BtvB vJǾ}شi?Q&D%0uŢBnW^^Yݻ7!!!ͦwHee{rr2AAAHJTT߿={غuR%l^^ ]h!uwnwƍ{ێ:kVgӦMO̔`V%dd2uŢBn'ѯ_?ݔ! ]H0+jK/\]O>kog[6m֭rm5K3ϰ/ܦݿd 1}D)SrtUj:ߢ'`-ncK韼2KK[Dv+!ӧ'Zf&D''3`$Fϝ``Ғm>ːiZC׫`/3 ,ZI&uwV$g2nڤNNm[]b0*?Df5Mc'?D3@kˬnb̙Xf& }f,f3~woZ~]ܭŋm)/waݒ%hG_}v/{aOW)Seǎdee**6뮻r*| AsJT`p 2vĉ61豝;;|6Q 3:7?着Rs#(<|i ӪKK塻Bq;w.{/C ѧ{9ǡBtx2p$B\n χnpn#|4~f19m`0;ͼ&/_{[ÅBӍ/{btc8dds}9 F̞ͦO?]/VĠɓ9i;Is觟{;Ok{˗cXIKeၓ&ujYD|< 55Tr7_7 B!k#-O… Ou 4qƱ}vV\M7DDDDO*@G̖p|겦]{-7mRWۿ>R [={R[Yby=9 !FŪU:m,ԩS5og/2P⌱}v$mÆ6ӝsٳ;]LR!!-_}6wuK``}}$OUIZ"0Fw^yMꪪ(u{V`0p_WzۅB!D#8#]y+yԱc7m)Funf۩$'$wu ﺋ}8s'j2vrK O<``i)\ <|tǶ !BEYqFpb٫ƌn%fcʕLSǞߟ_*[}GUUGdB&Nd…D F#~GF׷/Neyzm!B!N ~[aĉlٲ?#!!/B!zrvzzXdI7BxVB|o+@ !B!y$B!BH0+B!Ǒ>=Cx|I!•-Pm6r-ߏln5Km-}M& >Y1 dlBT線j6c5"7xǎĉwe;q s 7/$uSy0UX[MZ, Z~ '_?BOFB!D+$mիI_f[C"I54 6+>Uc;Om#Lֶmdmۆp0gbЬY:Uv@zDp^Z}ٴ%KCݐhFή]\IIF4c% ߱!DoeVor-_Nt~ ;QP6E!i0N:Dme%=ʪ=TÐS1/{9/_MO=Ų'7=X_wӯm]WbūRKTb"u)Viՙڅc_S ~`~cEY[YUc[)ٱ;%rhӰ!{I0dX[+8ө6G%ky%e!|:B6b˖qty 7oWmi2V})5A3 s\_Pܻ '.{`UO+s΂rvfGe^tKdefSw5}aLpX_j01ֿ a JGw<CC  qȨ'0<'w8qu|p~El߾;xbj8x)ަ33)ڲY+`(aqGJj)+ zBN|~LHprrlB!z& fq\o_R}ZMaZDňRՋ^B[!Yiٿ|97of…zgX}GP\xLr2r UUlHMV>`!"!7~D'WM4G۰qb !v|]n !uVv|uiICȾA8RoU)Yi.R5,!B`׏Q:"BoE`!jJKY 91W_}Z v26#T qnh!$gjthgC Y۶5W;NlAk4X0}ʒĞ=>o$yܸ/dܾO_)W]6nᣏS_x(3-3@ATޔ;;4}}n%Nd^]ި:vQ-@Lߡ8Vca?0, L $2Ln63i*ՙ?c!u !w{%ʲrbOYCDĮHGQ.[3P<)x 1]yƺj׮Qfwi?7= S22Yㄥm"b*ra{Zde4Ueҥn7#* gcݻ|*vYiDm[Aѝt5%ֺ:6:gb܂|E=FD|w>#GHmE/X봿Q{>>Xbme%6Иf~~UV6)jZEuf&H)D'i6fJrcd ~~~X-XJKJ(.*$';iO?A$/ QFT;ecyB!Y f ghd_[Ka0LL{!ϛð#05HUU͚?aZ + )9p u?~MSSRs~Bbc;}Ofe<xͧuX&zcV6^1el ^~3n}nJ{uحDEE3L1۵UU#~-k@iI"gɺ^b=3'dGa34 6 8F#EQH>C73[饹efOͪ6'V%`R!0enT0FL#Oz˾ٳ{GvQpl}0p,F#Pc8{ǠQǏbsb9 !gmY?<dλ o ӧܾS@W,K/OhR Fa1/n/ 7MYd.#04~%"^߼=ǜ&0"fqޅ;Nwc]ɟ޵B聬b =T=̜}ׁlS_;" ٽ|R(EQ,*bW_p@!Cx: ;ۿ?͙3v<YѢMŦLj d5N־ 5>˸9jׁlS0b~^t F56ig}L | `cՙIW!=t(:ĉٲeKGBBG8.?/YG #;Lhq\8cRSWbj:1 1菿5j߭X;oAb]ϻl3gr˳w;2.3_)-cj=h1h:-ܶo@}Lku8Fs )=aiF~~<ɑm{wt(gGB4RեNJkNŧ{И?g.M:S6qYy9;wGo /dɒVn !7sŭ;fkdUidm%_ȟ}!C5nW)ՎfSP ̀k$4(EAu8;o\z%O-]qKeÏ4 dmvegPTZjǠ4 _}x4 ,6c}\pa-xmOC'`F=C&+)/b\qٮ0{5y΀HL@X(ܸB!Ng|0rjJ ɞ|j(>$)R櫷8]Hai%h8.Ɯ` ^^Am@YU-'1۰\NJΠnçrzc35%%Xq K{ne|կ[NjyOo:\ƾ¥'qW;g{G>鍯ga{P S^U+kQh؏.LJA!mNb?o Uf˨1qBcM2yV!gn}DTgfR|+,6ؾ724pŗv8Λvʹ0h0Kؔn B!8l}u5V]_K&^烿[Qw͠KhN!VX\p_5[r6FAi5u 4U_\wMDn_閟Va2KHص?zܓ*lu>'+ʸ5sw5MF_zX6bDoAC0[TNNA9cDQ iVc)n/4()]U4MiyȝeeuF4u*#o8 5Zf2{ESyz>j]$ϧ !g3:M_[}=9 cs%|:&Ol z疠iZpzw9ClӴMZ#⯤z[scev9fMVǸqſ88c;;2֜?-,㖜erv2/ɗQ| @o~_JYEs/F՜]=91[(u) yLi"7WYx:3Ky9I h|4szL&\{[bo9]y !:ieeT?~JM! fUk;z<y-6dCWW%Pu(S={&l3ο&e(}ށz¸ Y5'~}R!B`6w~̺^UDG5M#;US1(u{u ܺ5i)T 4<<( Æ f?"w߾+p-sջF\E@N)c{`}}}Ϻ2jyy;@9`  ѧo_.2yʫj)i `nJ8o$4ݯ&oV982-v1|ZܦcǨ,(:sY˩sYt@[k):Hl\<&#ula# (V~`-B!839y3vC vL&.[j-o}v_ >MP(,?ү`R ŮjY߫x9YK #fnJQ::ACk>~OY[l\Έ2j[K]+ zYЭ[ͮWT[/SRXqYl#W/9hPUGZb@CCS5.-lh ^xq[asdsQfsgb04h=^ 7wٰ{0`:r-?^p r|>=r;k[j}0"4Hsi=t㈵4;E~~}H?@R[KYv6}t,2.}>=b*ce(hs)cgCޒ#M/VW^w-s>xWH6|8nV:.M bZ;oJ(h3::PZ`WiwVq*1WUa 邒kk}m?r~Z;nDB gr;/ n u#`W (qai돿zm+<|ʸO(ԩels8d2yl3hi aPUDž (=ZKRB8i3f/4$[ڛto_qv-mbi 8UP `@Cv0>bY4CH!rݩ95@h\3\(l5]qq'UoZc7N\B":Y =T5g׹^-Z( e\Oj*8buj7> t.5-L(D8^,f2xXg؇ Վ Vvޔ8E ؏8Ӝ;7tԆ;"כVvHJˑ,ُ'O1W:``^Ν@Ո McnHHhyn!'s ֙`S,G޽-ņ:<6v28/N4i˯wQUiNM=ZU"M@(ֵ?UW]E];* "=B - )M$ScJfHȤ߯p˹UY"#$a4Yo|9|E:ϣʽ®lָ?جVKO.%UVuO~DۆƳwBe v{`W7xTYhlM 4-~jJ%Ĥ;$V]둝ݻ3v,]mXن#j㘦$]Qe$DѾV8-ǢՅN&߻W9Vk&f] ʀjT,sZ0]sYe,^!-Y;eU8,zX\;6Nѣ*ӫg^ CvCRSq UV%C-ݲlSطA$\6JZ:g#V\XQFu{p`N>HC?:FsȨ/'u>2AA^F#V\JSvqf^}ƌi޵l_z =RC*b hUjDRcb%g׸\a4={qݥ+lTY$Zԡ}DmK!6(㐐Pǽ1166lqsaW$eU*JWmGTfjT*,KO$Ir9mJs):zlp({Ngiu{p!ACX3S_om{Pݕe|&Sddd:nc,/gʕٿbaUL&ں7; dRUk9**8btՅξ83n#kc;tvw9W!XwFCn-Q-IpkYwڱcMpqU2nn4 DMxlvMϸmC}֜ylٴu(v>U 6%pvMǖD_zn  ٌJqS۬ =0hGd1@[-Mx,v+l4Jy%# K5+h^;4F#nʞիȠ Q ȑzA«ri|ٲGV`wߑXcg9};~ ;W޽x3;xm'EEtۗ#gO1f8LEI 5<@huwg믳2"KذlGPQRˋpsOZei.:2TQZ j "]"HsUUU˞"`U :;v9Q:)kΫ2IEpq-++wlm= 2]. :fMiUi&zfa[lI8,u(3nnwlDZsDm 9.n]PUVf]5bmc0L2 `L9BSg̶_{`=8I0㓑4RoH充$o]xOիjj۪.IXd 2*+t&uʴR F_X8qL͚ ;"Zڝi6Q3IsEJ hjlu- Xj/"˸}uArss\*T[59d4_8YU\Y{`[(Qa۔ QVWcQa>uLJTY8@WT@sP'l u3Xߏx*ʭSBc{6ѽ{[C(ln;WB۹fm+T*_.}ڶ|wHON;|睌7_dt99?r^#G"Z,~U,f3<'GGλw݅A矓n_}^`lBiJr(|١.xY|3:/(F22ATf"";{ϼco0RŅ ]bJ[F\IZmU-ͪ;A2[TT@`7P(H9v+ ͜@oSf|O&{+&JHFFgj^rLT2wǿ{ݻIWJ fʜ_Hm\C\&5?b%8:ڡz3GP 6dls֙3JIPTnڡC JhJ[`6Qi4Xf}9N&<.xϜ*7iruq3oϔiR W(Q뉾ROBk(W?IP:Y k ^-MJ@ ʝll29̌:o㐱KCc eN+JQK%zJ I; ձϟ# WuUUjuGm9u.ֲ}CB0sUh!';GFGP sLRS65QE+K FlD0Qk59ӔAM/ߦ$/8C˗WoߋFmkcϔz:2s!cH^c>y>};:hT`Y1m7דڤT8P %PvJNBQЗX13/c2]& XrUoUfKaY퀠]?=nu9~n{8QR 1pw^}SF%Eem\9'лcɺ2JA11nX<Ч4a7wř3nM [^M:Crss p{Tpy(PpaJL~}߃",@HX|Vy^x1[22Y=|ɓk7 |]=BSRRNق)VOH5ΐiӸ7}~Sr<c̙d8A d<Ɂ+Wr+4}C*L蚙LԦۻ^}`%̂5FK$kr;8Ra.q(!R7'9.7]STW$??a!ѿ.epRO'V)}%|$%k89 9)Vƾ!95WK{U7%l8\z}˦Dꩪ5P(oFW괦2T<J/PfRO,B@ǎڣHLnfރlGaǻxZ~ {1ςƺ+gk=WnLU KPd$$qؖj]?,|Rv?ZZ;YY婧v 2ض" >ÇspN͛1 ^ w!YRIԀd:D(FD]ڏ u, k̥R gxz9N- NhXDJuPU':ۋE=u5[gpX @7Hq;(Jsr?qd@aނ@t$QB5%FB:pMU.۷)ERkz1 * O?&JsFE Eђv׌cu9o@ZhJ=r Ha^j'aUqx ɗ.]]oϟoׯwy|W3֦kSVTāu(ˣ4/̺CUZTX|?E'CVS0xT1Rk;wݨCE6>Vw@z o8wAFN:=nh nwϛ"XlGZT/l_N kUӲ[YK=h,"#`=x1QU)2n't6 mQ6>;OX#q^D[QQ+,Λ}N(jd.جpyXDLf3%:GDQc?kHįk(**4/z}9igN7{`Wh 8v*EEyVW0[z#m\_M*--uו˻W[kw5ޣ=j5-"v@<}})/*Bӯ } GO'^I[({k'_ {3ho끴l˗I6udt79`k!-닱_S4z G!Oرm N 00a9THF, [&]zؾ+$BBR)^ub̂``,Mf/"X,KGYi Ǔv#jU"R0f>(MOe͉_;݃({#on`5P(%E!E- ?(7$lHXE0?ߑG$,É{m+nԨ&˦3߻7VѼ) @x@S8z8n{B3 5)=?uE$b: *eM]4Xm٘d s_.})j+skqkfcjdhlBK)ϼ>UGm}il[AT2gԟ|v{_4~g>;( |5eP(s0v7ʸkUO3p1]r(DErźvٱ`GقI`2[ܜKFKǞ[sm<)[g{榻^,vd$=zt4bAM˹ܱiDDɱ`YDWkg{zږŶ!!X06%tEK9"r,źPi+ m` ^6ea6VX{c%:N<$IL6︗I=ȽtCxXk *)ιWD#SL]4^22k~Eܰ8>D§'<1?8M]Y A&{-kR[lϔk2S[ JOF7|)[ػkN,X h=|\ڲzJ5ڏTJ9Yd0fLDL*++\NKb:ǡ 1 ->*Jh,Rne7c/Ga1wd(93!8W64FR⁂*4I֒,vPjYD`U^Mfc^u" uI().&9rgrX:Ce (w>.}(tե+޶8||1uJr2ϡ&wkr$ڏCEN22`ڴilݺd:8d7;j[peU2'ԜRG!-5p0(/JsMhJI:+Zil܈w)Bbu2>O6(uw۴P)h=}*HZE%TEDiž(*Y&@Y,L&BP"'"vQ8Nۻ$x\d| ;VqyU|Ӓeqb% :l"XE0wGfc|)JUR!T j & -yJU*X,56%L&| 6$o^ls, 4n ¨q98!] DuXmeϟ[2cK2~D…3-↍C`(/&u1on-+NʢEޖ`ٳ]ȴiӚ|^}U9rF[>ᄏY WО4' IDAT޻_|1ӯc%%qS2?zUymc!%uHq'j4_MҷuF:fc]E9>> F/>K..`F_C_Vj]X-m- h41JJ#+ + + deey~1$!2c;MJb矷^Ge,]@UYF/^"OJ!ќk>}y1Nu5l*h~BJm]VӔ#I)}N%vH'ůGl.&Md>@ݎT"Ԉn{ I99Pd"T"i0RAg+3Y3g`0N'ŋ]JAA.]"V~b4]*> P(Xjeee|( /8(**7$7ʿJ=if;ټ2{6߽2iNuWETMpttJLo/ ج X?nw;r//vFлT+y >&z5߽{w}&:&B +(dezigoꌧSUe曩(*ѣxe]hdI>7BQcj״ȹԓKNDWؠ  2nWnj\VFŋTQYV 9{(Yv'4Ct$I r˾R_grU%֍1c4äIظq#_5999L&rr𝩣dË/H@@17"tHNNv\;qDnVsN9rj˗/0fGݧz˗slԚ,MUd;UNC>5kN:2 .+/SǏp4Z-] o?5f }9%E_rNV%Dj'$?_;}eܾQ(]|@W Ϳa-H> ""\H;CSTk~PEd~]X&PuudYYWM=AhD4!QxW~$IR_JqaŅ1_!i3]uu.$I̛77yMeee{8Y=<<?& Vwb;]vu9딘+//mЭZ)nݺ2 5ZwXd[-YEo/)%Kؼ|9.XO@@suQPc0o0݂< gY'&Eusϯ-f3%ǧO>Y5Κ_wϘ1<{nut,_D3{g.3M&2/#9)86I>WeܾQkLzQ~)7}yq8iZQZA`2fJK(w9q] c}u,͍R&f,m…c2H';#J^>xxzPP*XQ`4TbSQ^Zo#PTP8Gɏ?Hll,k׮%!!{NjMipup9wbU|YxxK?2+kq9so'0S*^x9YCj_LaM7uMYFՍ?ȥtBMԩ _Pȶ .ӧoFk )mxc8Z,vNÆ #66IΖ,>|8dggk.+n6ln[ h @dd$ݻYfg2p"YQY+*nSPP@hhhDt^x}V^"\f+={'4;vspO` g*=z8tꕽJaĢEDkK; a䭷]G,BdĢEMW_aǽz{3;*'{jy ǎ+2ܝ;[qj4 ZÝ#F˗O"++ɮMmWV|r,X u][e_{5^$Ir\RJ.ԴgSȠ{-K,aɒ%En#ɠS XYə}H޼&@d&njݛ3cq+0|,EFMw═$;w2)|[G6m`:`٨⇚ 'e?i,YkaF̐!!C~RYmez .!j-o\q7Y???6mĤId߾} 2˗z7p{eV cٳQ{aʕ VYn#VP$'P{I##|t)?9iiz!t0y2.X|²@eLD #ax8 <`:eFӦq?Hݱ6??LBh[8W[@q'$?L^OͰmebdZ]fDA~b"FٟDصS-Pggذaر;ƱVWY9r$k֬UӧOΜ9RD$V^MRRcǎm{p\2:}S*,|Ec'#xyrlMʎt߿]’jh}|4w.'HɓO՞7Q7jQ섉J#˸}=hQu('t'Cٓ~3g3xplӵ+/Rt(++2s{2m/2n8<<<GQn+ǻ=9ALs2`Me&9s&Q|ڨn3'kiе =h<2[J.e`$QDI^Z99]^ä;=zjɴ}ATfgc(,\R(&JZm@j$###\ʬL1U2-3#G6K)--ms߸Zȸ̮|)ҏ͛Qk5+*xy LƢ_np)?djIZ[e_pyz=~!!ǘGjpdի7&4&k':.]!|ǏG8.lތÃY\1?OcMCj*TέY{P*Z޽]VHѸ!ϴ]'}TÙh-WN{sRQVoP]_<5΂B۠A䤥QQ\op0αOpeEEo8a<΋Lˢ omL MYzD'e67csv6STTo_gV?1=̙k,eeT;ECGxyHIo!axuFϟ_c}%%qSᄏy:+#####t8ȹsGlq9H'=ӓx^|y严?&_|3fpoڵ+_-#_#$<<9iiV*;5eKYa! _z{~`?0NrKBcd>w43)˫) />Gѻ7))eek<{wj5ӧ?}:'V5b?pMD#F q̗/ymݫW{=wm~Q<}}9ȼgYCYfODܸq78~_<|9Z//\{-v~Sy&!4Fw! 1r95tJss)X^`4߰0## уx<AcyXEڞ=䥦RaDEX*h "<>^ХKv*p,9s{gdKƉ]@ /8L&2Od]w, "#1|8璓Vu7(ߠ zPd"{87`,f3i2[ X9Okҿ>`BX0c,/GəmP{z4^ IDAT=`C,ז=!k_?6pspFZ-æOw\SYV$Bsn鋗/j1jj -T0(+";˵ł$n_CiLDےKJx6/_ε  Z,zfm1*MX+Y3ۙtWJPd$w邧 ˖o<(ۛ_sچ̋Lˣ q .:8تĆ"VTԛI2@Qzz8W۱[m]P"Y, nDne?d4)bgu ~)3b!i;;Ѝ=XKxoZ?0\P(_dԩŬ_ @xh{HO#70UVxxz*VdSOݻ7DPt4[/丶 3$cmbN;iv9fP?ưX,>ZObWAkm-1v122H+22Ǯv|@ơCd:Dpl,ﺋ][j(WMTf6mbsdL"RIierjZZO(EQ^(Jt.tKMA2m>0b2O$Ebu3ùyRjHg~`ȴinyFG o_G68$N8yd L]CB0]PT/':$eZ-(ĝKfUICy9]o̵vPTbqWӑwAnZ;tM 5D޽,[QyfSdϞ{I#l$ Pcs֭#AeSTu_UAAs*SR0gePP;e: uPB^8ÊX]];9i{!I'N0{]ՋP< QTz9ic$_5g5)c23J ';߄PUbwnGR(3>*!jJB5kĸǯ}s ~jam2OvZoppIdf= +,aŒ%[Se%[>'SζLo+V0;(+,䧷vhyO<Ō[%% s{̭ϻ ;#ɠS XYə}H޼&grr6ka(J;ASL( GfO?1`D##9ܰ&TXsn.@Nqj5\ԡpž}RgT>fg7ƸW"&9klHO@@w栩Sٿf c8};:cOKy0?@EL..zX< Q#ɿ}4^Π-)*SI!"~cw@yMQ\\ݫqbqcKQbct.\ui9Dr 9xeC]V|uctЎxdZN@O0; 5!7!j<<2m?YjM?z4/[Ɩ+P.YSnݸ7ؼ|9.]x1֬qy/m 6,[FeyVp=nLyO>?`?PB kWf=SYGx\{˗QD=oھbXa:wnz%~zM޻>DC׷k4{n 5q~UR;AΜAG^PsD6.Ù3H&S:^#Grf>*JK7xj)/*qȑh)!=wM|doREҪUHH[t..~"BwxuˀzX#ōWVVGfENl/˨ prf-FRZW*+Y;W룏ym0Ex%juccqΜ> f< LxQi!.occܻr%Z||'6oF1GNk z*+WkFMMmNQQQ]LF@>H LGEW\d>-[7|俛ŋk-AK߾8a/fw;oX?^ykfO>aʕZ=?LyQO|e?FVGZo/ZDٌs:ϯY7r,x9*j;-@zr25]Zi]<+\oqNi67DmYI\dseeec;|.O\o߿Bym4ɭリ1^nMcSh1ᢥ^;|ԖD9qar| | ɸŋ=\l]2}; v>111deey>???RF3r/` 7'1x$&&俛xo9};JJp(;uò ֍yGQ}fI{3"]E|ED^EĎEl|`P(MHxCj l|lIlHB6$}]{esfٝ=/vj zv<-Smf&>6oΟVqz~*L9ñ[9|=zP+4?V$).7WOGp-1S@ݺXӓkg; <;1KB7Z__zMBŵHum{Z~-i"%eHNy%aj4m_7^O"~}|F3˭1,>11}+O;Uc5v#LoLqouR6fedddddJe ڶ%gOR^Ν߶K'NϨiӷ/`INb?c+pd&;cNÆd߼9Ϝ޿~>O`  !6C7rx&O@F!CmWP+4F8s'[ 1m.D ۵#a]˹(n̈́޳KUcVݺ"Ǝu͕Mvr2/d0pI6¶>¿xzhҴ5F:=:("IR Kd{5hCu5?'ntM0zw*A.߲TZy5j Xdsƴ4.^$9Mca}Wn>@1"{'k9t)@Ry2G[Ql3+#####ShخmU> _P0~ϙSdߠF%!t2Vj*qqt6n= u3c̘q}8]cƔضB48l c5 6}ƴ_`E#Gh =%P*x{SF%DIMiiڬ9}3)r?Ve2{vַjL1fKgNO̟igTeK5tXX_Jqu"ц+V>YchT9}1 |ŕ 1f5 **_FFFFFh*1kU%_e_мGI~+V&s5/YB}ouEsnnү^E[F`+u| ~[ 87/䛙Ki(ѥH`LfME-?O4n*Dd!xyyHJ-={iW.p~^Z}w56h͵GRq6*O9H]R.V}yurm~h̞z]Fr"݅Jr>YcXzlM#}΢BYƖ1KFFFFF!OJEFr2mf&jOOu ʔ4l#⢣iخcgvje!/#S[")\~ [a+4-3y$Abji(B'7HLSM(!I"vǟdwo.Jͥަ8e wCFWz I:-uZbj+_氝wѪAA"z^;Ofg+I|B$I"-5=R}ƚ~$WP~9zxƬLE>Zͤ +\J9OIݵ c~>7#G[ߜcDaȧ:x0#Fg3"WP(lϙ=&P$W,L 5'π`A2@  1/Іm$7sn.:wS{EnѨѪw\iA#V}i]W:hPe YdLBa5]OX34V}aTf,?߸\DR8d΁u)LT[\MIN_0LL=c% ,KQ$ Q$=K<E|qN:mGˆgH<Ûݿ6#F,F!kYI})uO$#=H=ehӧP8lo/iHh,XMRp>YcX]LNjjA9yάL||һC_+4B.ɗ^$d . yJ\! HH6 R8FDV<usS3f|{r_?i7?Gм2kL>YcMBv}ϓPcfMN;HmhԤyiniQ|Y5ڮa!̙U,_kh </5 M7kd* 1fu:ZFFFFFt:d_E^WVѻo?[Yn^>陹9kK_,!DA  s|R!$ICݴ҂1\#GACѨnH-׮ij}U$'%KU_Zׂl۵lqP;BAԂ`*}ƚ:~TUN7f[5QQ4nUT ˜W7Ceeq3>o YD?0rCv73 VO X=HD%P@^N R%U"h:ڻ@HSeg)FZd7l+'FN|XjwsbQٴn5)7(2kDT " 5Z<|jiY&J޷k(J Dfh:zEP!هeM|<QK 11d7ԫxѷ~Zy6,(̃M )'H\~;r2(njw*0%D$I}'L&]$nҠsgJª1U` xeVfw_qR%-OL~ORi4oi2 LS5Ze다2uY)庆FvBp>YcXm?:A2tc 0`uu.#####S|>}uqkd*ԋnVVVZi$l)` +1wֆPlͅھse!qr1MÓ l1(om{iƜ&meq'J3_Us9G&>EDz% 2 b!DAB!Nhէ ib+KО庆}>O KkOՖ"lƍ9slET-#####S%hܸ1EG2@~N@[:#u0L`NZ;Oɭܷ[7q3~RѣWA``L$PxQM&$I?aFPb6#i./>!+3o<% ,k ZCY cgk]CZ2uZbaa`zBfh$Q,Q_EP!ٳgydddddj4nL%a=m+ k0&$Q`0Yip6zV\f$ 24D$ݐܱF9 klܴ_-W.cf7hD^}IK(@j4[.X彆{}ƚ:+\T1('$&]k"Q))`,%dI [dd2DWbFex= 0x^:E)?sł`^G4C&hB%#,JƤ3 Hb5zxxr(*AA!X4 ѪOMH %ҭ>(,;Rfh gLL*ĘY<ӧmiu ~~Mٳ0e 11;plYlw/(^ް Ǔίfn}S%#j<*wNt|NN)ڕ___ZLۜR_n$ߠy9d]J]'лoWż%\BA_%hyk]]*V FAQ4Ze$eNrv^U@fhB+I#/#ckv,={1mZdFTkhűYǎNo G8RR*).=>J7ް+m*̸BYc+uJ@WpkdJC͛]7nrfseO@u /86ȴ YhiE@UEM .M&FQDSTmSh jXc4ZӒlF6,5 YayES!Ƭ+9m[>uBIGO IDAT cĉt>Rȫ ]GСve!!.jse羷&0֖[_Ose7nTXݾ!!$>6n@Vxwb%ED.lLL뼶[) yPafuYcXy8r\ƬL m㯝;IOL$hRh=/ɽ{xoؿz5碢cG8q#{W '-z-[2WiVspbN|Q{aYx˽w nȪ_ʩS?|ŋiWSpѲ{.~-O{W #): 2bbs=&hxҼ{wNB JnЀn/w~57l(U*{_ח_.$r= ۵ĉ\9}oa,Sq1+#s+u4=x]>EJ6nOܖ/IP*`0@:֊5p`AfR Kȟum0)J":mmpÍm]74}. 5bEc-|!aUVxv|S#k/E_ n .W ηQmxl={ȼq>gkkEG͌ Ufq1:JEV_;vtڴbw %xmw%z=|K\s(>8vW@DoΧ&xBz 碢^,e̙˳s>~zuX; $5 ]eٳmacsusؾ};&MuԪU ///ZjŌ3HJrV] ATm&Ñk",Ē(!&ٍ2-K˫\۲Vdxb2ss-ʤ!d+nW@hsv sGX#kjh֧O*٘QX yxprϞnV-^G9Vvj>O˿b'&:w;v]0{:o/u_X e-,)6 F$vIDMFNFuXGMq/eb4|boFhSe}`EJ5Bfh4|KWƬLd4VUj5AR(/;3,2gkΓˈinܘӊY[#P*Q(zA[yQ_&ErmK{; ~>J`}rϓio&"kcԩ6M i'DOZn 쬔X;y 7wvv5Ɓ>ӌsQ?Ù׺tW}gM{>Ǎ{h8le|ճח_wi-T*&L޽{ILLd׮]$%%W_QԉV0YnqaDh 3! d[JCDLd)xSc?4a4dYw2?dtxeX&[#IHY#4Z g[YJ$e}ƚ: -4YC0ְ-HJ"EB uߺu,AՅ2֪[%;o,b†-EoBkͭf֫g-2b5zRS=r+Þ}Uwj{'ao'!&8fze9ݙ?!^x+vW*ؓ}1&n" Á;1UqGeرFPPcƌhm-lyٲe#cƌM<ٶoByʕ+0`!!! ;s *G.yGE3p~{{pu\ʦM`Æ ܸqHJJ 7n$""¶$MmvEFFp%Ym E߿-ZؼiZf͚U޽BU{zҬODg+O nlX e0i2y z9h$WzF&Is,9w;9ۼ_2/ah2;[yҐI$W{V}H"!Wʓg#25]n.L'v6XxUȫѼ3!qqE<uޟ 8֭ [۴Hx8EG`yo^xmiSqР5'-?oe3(TLe%.'?Coﺫ-iިƨf~݉F/;ŖS79z% 0i9&P4We_`[yP/JBCӥKOW],a4hDV^Mvv6k֬At (0f )));wdbb~Ş,x9yiAN am?K{0G6dd`xz-ZVK"U+*&?l3ܬt>C7ojqswǐoGT2g0|:a'&R;~F1*9͠Ƕn-aݍ;to-S=VwF@ݺ'& 2|ܕkVQ}k2դۢō:q W9~]Y--cD !::DKF߾}yx衇ٿ? 8q]2p@?ΥK~{~z"##/Q1{Njj*<ݻsOQkzz/-GRm؆ oy\<<=iզ9!$aC郻;&QR)bR*0*(&ruM/9/hl\h;j;^Xcßn6hMyl^1Zk,qHJF/?.?<ͫުd5CcuW}{nVٸ18^hٝ#Gޢ{wsr0`gĂt17t2)_~i\BBx7jM;w_Nj˜8> ڴ)o灹sm nn{59ѺO^XNC[Z-D{2p6-!^ׅ-r>4(-bQ$憶#*_5yӷ?P| 9 W&{n7gؽbcϹY.#ŒD s_ Ӡ7,H"##h4⋀9j 322޽{sؾ}; r2pAՠc<ݤtϫss hBOfZ i7@ա'G#+7<3L\\/ǓkN"S'coHLհ!e|XFϫg mqƎHtwhq_}``Æ ?~ѳgO2wm۶Ԯ]ۮc m۶%TX=ΚKP*5y2{}k5$8Bv v$Idoz߇9S$aӒ%=-RR$ FLF#z}m w`shnb?]Ãޓ'!(?"/ k9@j:֡ jȍ{%6!5Fͯ^!{9<.B6fedddWuD B@㦠E'璫wI#ҴFg+DgI<3<$W7҉e-kZХKBCCIHH 22~{-[:ұcG֭QQQ_0J]vַ5xҥ<쳈H@@-"''Ca߾,U8;)OPw=$KP|b}>#b,} #٠ј$wt0$سڇ6B]&<56X()'k>YcD#8m[fp˭ƬL!;ğ2œyI'~<7qS0}mFlONݻ{Ƿnݞ ELJ~ȇ~X}uf .8Lѯ_b@ŭZiګNw}EQ$9ɉn_iqhx)ok@x+Qcω -+E8ڎI{uZ}Bf,###SXu,e8E77q6YIN$#Svڕ9sڷgkQarjؐsV`k@XQT3*5Jf̙UҐ3+###S% /W 'OLsu3d\7;aÇE5k>AA y?7c,3qhhw=\DMXљJcHVY-['+\a:{k2VݖѣnBEAܹs VwM=8s';m Ьo_Z}7__y't5]KUШR7mׯsh .;71c`Fxq+yg#222222UСԍaMLR%Yjs+35t76#Fp.>Lj||4iBiؽ;jOryt5]D_!'57p FCh۶t~oYC*#22222U&TCY]ӓӢt܈!5.$rRRؼE*ww4>>x׮oHu6%E ܽݎk@X4z׮MɓLL܈!7=C^T`  7i>P#22222UQ6f8èq=tB.]\ݔ k@X[ǻlT06FFئi+%2222222٘`|\wUMV֥^#ȁJnQsȔjo̊&7/]FL ׯ}tLz=7Zg@׫GPjRW:r ʆ_) b #X 86ybZFDoٻ|9DFѣ\9}Oj]cҢ{ TPۛEEqswvGTU~G6$bX0\=}5k=|LutoueIEv8jeJHCݹre;x[ÆѨ{J_ع"l_'i]ރ&1X[ aw<>_22 gO5r13R#4ȮlթSsI~cτ>&y$Nh,WM&{/a% RzC[uɓl3: ̄߷Hב#afC>lݧ^~~۲šwlVBBhz@#!M%K78q"&f`Sm8b8{;m(OʑM\oe[z-=6썘YCFBLLsvN>0A͛;_ep6hMʣSH8ѽlHt7ꘙCP/dr65%#S.ׅ \v/(7m 16߿zZdӤS'[-m<:o۾Xz͘_.UNf?֪ݶ%Saʕ?^*_Kݻپd i ֫g j^YP"\Rb쫯y FGaҥ>LxϞ.І fdoۖD\t4&MChv\XH/(>=D*8ob"[>ǎ; ZȻ^uL4TUVX7;CGt"K'O_:ՋSEzo->g{~;,1k2b/e$uv/\H~4n W(_z`O|C OEwOnGQ+z'6}^K|);ӧ<+jζP*K52y2-[O(U!@BL ?!M0H IDATxyqpLᄈ3ΜIhRu߾spƿ3lC$.=JΝsOٹt)GT1 f֮Νz[ymHtcqj># /~#{%5Νi6r+`3{6k1 WO~I|G=||JuLzb"գxv:{ϗ\}ek{~;n׮ʤJ7oIzN*IGŋ}Y+DakH( #Et+0=J6nY=}jQAT{=PH2 []K|8sUVU@Km%AVhݶ-ϳK0{dᣏoǶ}z=cgϦYnenB1bmvhF==4tm_Yhخ=kgϲsRzB,Sˋ.']n.]irS5(_Kqҥ4km޷&Ml^"?7OOE{z9 [&Imjg۶FSy_z46/ZE Et5f^sߺ5`ټihٳO?,r*ʆr\4oDDrt |4m_9Hdd$xk.q\Fj˻H<}@]];ij_KƙXXB5+֕i+y ){y>cPкOm`B’yZNر nL#-dﺋuHKH $L8^Ir|.4eKjׯ_9,Hr]Gd矓r u4ܸtZ~AAL[:ĥ޽ݲӦ1h$۾jfX ##) 0{B7gek4֍M+U[Y'UYq=Gڱ@LF#~'=)M|lIJIע# 1k /$VAK 2n{^rPB~~>GbϮ?v7޼Lv/\YSFW#WٰWڛYߡ jXd1!b w}7L{I(ڰp};"nS9Zq= ڴqd4O_춉&-ʕͧV- ȡ;{]a+/"sެa)){yEˋ'ki6+ ^wZEqPVhqm?%$ ImCT+.Ç/9e çN֭j:}wmт-dϳ}zc: UT a>h;.ewDGY~R[?{ix } ѿNm[/|9o'Lxi =_iEUG7T9c6'5}^]L$ %twwO~ۏK\-G*vV˾?_ƫJ_e_*b?}"p;T'&&dzblsϕu}n =]-K|9 Ν#Ⱦqc~m^;>ԬxJ!#L|BkqFCINBq7Q-Ye8WHD\Tl!7- mV_;/nGXI>#G4")e]4iQ'roZM͹w xixizp06lNoKĸql?__::T{x}t99lƧgܜ9nwKp! y#GR+4l.=߻w'p!>yÆ9Kq),yYϚE1cIOgǒ%֮]~eqǎ|y,^LFR/bc\dbw, ˋW]Ä=MF@H$04< 2baa R^֭hQ@=8q#m?$vq̲VuG}^op=4TcFLybбlZnec0AB0O&ygkQ)y$H.}8O9lCҰk*=NfkKit&8n_)Ǒ>}^Û}P7P/m9h߿1X8Wd''sprR 'C۠uކܛ79r%Iqќ3I9f mVuƶmh+ٱt)[/&/'ǶcDv4 m(Tju<`?Xg 3ƶ+ߺ5ZşV7۴ą("bVc]yٱd ϚE09uu;eֲ%~͋޷>aVݝsÞ}& >>5j~d*!M0m4JCuiخWBNZ*: m("ƍycǽ,B4hܱ#?/zLZ\ߎ{`ieh2уÇ}Mb"u% s$Qw%-[ F&7XylvX{-nuI$*%P*KDN,#^sdgk%yu-[@Fr_%g^Y.2i|_}.]޿Qhk2%Grzp9d*d\T9hpOK$RMDŽ 4pѼ۱sQ6{i̖7qzFEGbxbVZΑMwE8mof,SvLJE\~y=mʔ?wyS3y(oj~Ucly퍷ιy]KA7P`y/( _JE2(x3΀$"&n*M b&Cg\ƥ#G*J?ΐhsn_ ß7dd^z^7/)=H>J#cɜݵ}-7u˫70w |&GdWxɧ>CB9Nǁoܞ=)GFƩ$s&2KЦoj$L;{6M;w滙3ms,edddʋÌ%In~L9yy\J(A " $K IH(IHDZ?w,!??4/tئ3۷ӸGYAk27D a/]PCҺ VoG]_SF˵rނO]QwǷUC>ޞ;wy+kצQiwcK)UKٷw[6N+$v-(Ҫ Jȸ}D\t4 ۵cٮnL%P*nL lsd޲&wEУgW(ţ# `n(kmIY$ D c=~*DQ]mߑS'xd&&t;𨪭g&e  M&*Urkbgؽ+ zUN@z $sǔ$ )yfYk}~ZGf`+;MKr£ܥ^EW> }{p{+q̼N]}-˾_׮vor|CBS.,zδft~…Kg?ӌ3wSR>NmHl8~8:4JwTRP[RgFE$IB$z.mژcfzEz~zz}ه[guA%zR~NQkYw85 P>R$o6q* T 雞;%9,|89fQ2NqyQVYl({__ev-]JuN摶c6lp9WAFf%QaÓkJhr9i4ڢAb3H, $ Y Θ$ԂxDTw/{>g8glz i_YMi.]%͔+XYVb[U0(rh*W@ZDFZREz]+A3Y5TݺeELH754?o̭/+rDHL<[kkGqf:->jSg}Y"j%Ne{zCe,4Ptvrld˵$ H4Gړ蘞^*$IfUWcFSNn֮Y(kf:3rͬe{dddY#'2fJDw:zѠS=D, H2JL%AaS ,Y"#]vkV݅Ssʬ_f;= >|\}Jxk 4΢asJ IӾꤊ@wuگЕw1CkvݵȀzzsy9 rdSeh4GNxx$gly?8A5O d &*jjSmU6e9J@Ef-{Z,"2?:0- }e%@ *z:][wCAAAAA-ztnphԙ5 .}}DKd6ccKmb]hقDZs/j*HT5Uz-벟 qfS +,<ǟ}?Ny)=s ߞ-3Yxg})-1jb)mc_~Q]ox}|Ad$t&V̳/) - Y)R[L,bb?rw9%Q9:*׽zzxXY,λ e$ & OADeOʲLc&%]sW|mqqqg?YAAAAAqF^2jC[6uf|j||v-։W4ZGv}}r(" 6.lVM${!$cKxxzd#wQSƧ[G/험f9Hl||KwjSt礗ީGqDO?AHJN9gԕN=]TfSROIEpIݽ ];)XώeY@R5rl)b0[-|z.E`Dt6}D<23P[9}6цNqgDwZEcP ATdS[g2H^ENHFyg\{w"8* ]P}rKj/5u x?",3dH+;ĩߞUx=Žn<"u*ž\P7BEE%Z*[m6dYDiЖt)W^ͯkV2iEdY5%[T6'Iqd6Կ~ݺsvΜ9,HKk޴=lͣi)wm̆l6w7F$[&ς$˨s}{vբO9#SԮMSՆzj,hR# ɖhBZ$E~'鿻d{)4^8lYu:d<@sY LI~ZUc"0]gvq?% MjT1ӝplr%iW(OϊBߒ{JJZTnn-)c}],e}$QYQF_;櫯rCOyyyJ'NK S3%6۶nfȰHIZeI 97Q%blם8Dyy}OMY9zp˾{56Uth*6mwrf+fO/7u>Sǧə͟4??UJmY^ס|G<|]TSnoc)l[b_u Ż4wU w̪U%n˷W8~֢ʳ5Xe]+k,c4٢|׭;*8-[榞=M;+(((((w}Ƶ3R1x0;v;vd-"I^fFStFRq?`Dr$B5=!#Jh)֢騩_(*'I2AU;=>' n@/ITCvp>NGgL$OodsM+ʡE'ͥ^0d 6KF?aе;[4}!0"õk؍A ZS=ʵk+ŵšlՍ-)VU˶ߠY @d<^A$'vřU8Oln$a5pO /pp-qmlB}]܍4g\m+ :;>љ9ҥ3+2?=wd oz'G^EV;g3tHILcS1f` ɺo,sSMJj^!6Q:r{]_O/Ak$Avr@:^]v8o^^)"I2{QOz/vxT^!7P2 {{[wr Oҷl( Ch /]:}=$`2*ٚN-\r! rʲ%eIBd2!YUwڵ;h HpH>h|VmQV5h4.ۊ32{`7q3ƕ {vn?ߦϳ1{@u]|Αlsg6o_"#pG}~G8YĜ^d{{t4$!U$:Cf,b4MfFy9 {d)3Y" uZ7,teʰƐxGB/A-c2{!iţ%{x) -zHN;J|B4~ɪWj觥S2ᛖ 6-dT^ژl_/c;( $*vl$x2FY@ZBa}j5sV< 6ksJU^A ܍ ɑUPh+_y%C&Ovj ݷz̙ jYz^VшW=۸#=nyӻ-\=qV͝YA?e -ry" 0> $Vc6)RBP`2c0 &jtzrdi++ٲam}0e"^|h ˜2K_ΓQ5s h?sw6OA.2 5:=Y#d= C})sMRˊOp0a l7P>hV~ De$DA@% H%%[,k[,Yfb$*!&0'uSGVA-&) W߸d g~ny,Xk=o9Ǐq"N70>IILد_g޿`[;wS*r|?f۾#G'70XY]T;3:|/^\o_&!ado>n`.w{>mω]?v,>8!;%_ w9m]dII nQSS7,;E ل,Z:f{d`2c0L&z#5:5zkT Wp:3Qۨ7aHmT&ӱwÒ%*z9`+zۨo^ǟC⥋Ϋ^7ij]]C93vc_.DV6x"sCk60 ξ,b"fQ,:W5`{fu߸Z-8COIʲ]=aʴ>% YN[CyeLABTT{,;MNg`kLewAٰy?8]To"}F ˊ^uYZ6~NU[>/zEY@{:BܒgݣYb_~N]/žG"}߿EU>jO|ϗ<A!]%SMz?>>xE>POWUdҳ_؉iWάӓqgкxhkjXӗ&-4iRl]4ס54i.-.dώ͜9h|CBw}R|Ws(֦zEYZWE {jA`ԬY}U? TgP^Vgϵ7Ftxkیoo{NN=[/gFaݙᧃ|=J#! JW?O<-9|-@M]P uM/9'^;Y-kڕ >ooQm'qD={o`bP{xX*62i6Mdes!rξב/|_h8e=iEWNҌD&.DY#F=_-ZCG2n">H%`4Pm/%9EXmM5wo#_=A y [ŁUP:TO/pJ[힘H`h(EEڴ[oܿ~=%99\裭[}8+'k諫$e߮cѷ}ػz5ǎȖ-d -͟o2~B{{6Ѿ3UqvGEaYU VF[ӗO-s%KEQ~xЙ.?'6g{;g {w&=ϛ3eNgs:#ZMXDB [ダe^B \.wop0|JE<Fі,NHe$@ngubK 9y(GE4|Ӊ>mcsokң_?f3[y3޾,~ DO~A'6vfg*Zw#FIY^gVCcZݢ1j? xI]w7o{BC'Onqj V3wmr|BU']_fw>}mCtf{b7I&?6h͞ 6^Cѫy(z5~]RFl2gB@`ѱ/^^ztJ9AuY ;Co^D?βǛu]$=]RPPh!gڷXZߗ,}T#Oz )SڨMCj|3`8sZ:1g">70؋/; fzM~7oF$õO<ӳU`!:DE u^ oO3q 7fNm/^ 7o7_ܹ򈌌$$uvdbߴY{3@„ >k^Cѫy(z5={عt)&mhH9C wqT -z2ٗ#㫯: >_~+{ xvO~~ֲ$ffN>.Dzf(\A6fwC\^sjgsf׮Y t63sΜ9 eh}Ɠ_Ȭ 'oa79gDG3 mp7^Cѫy(z5 aEg4^\֫fkdۋ3􈒌Z%T˱I\ӿ[7.6YXAAAAA#Re# /_Ǎ;/-foU&sםnv:3 5 q#GLcڵsJ&')'^Cѫy(z5A >%#9{7'm0-Y{SR:rf*3^}qN1w0*z nϣH`oԍ.\`[wUpU?Dۊ~׏3(9u'(ɡ]y9&NNHC=/IWPj^gGPMN&69}e%ii8Ae^UEEZ}4 O8l{pٖY/-hڢ{Ϳ><H߽Ç8kV+w4t{b"CLᢉαNgضml\L 55tJ~u$$%>36.^k[組v 8"'3;:wj-/իyѺWdʕʦM-lPAAAAAY IDATAiY_@ڵL{!Tjulv3n)? aaM&9y3Kzđ#;įj5t(SgFOin.Ƕm͙֭J_SÁYgtd=TSĝ}nOz4RIz]qVv2m ]h5:3{oh'ǶmرmݭvKa=[,uVΛǵ?vkcK"zQ9T؝8s&b'zG2y2~;;S:#EHȈG߾{.z\H6p.͝g>i=+W/ܫbϪUMvf7ΟOin.]wgʽ:?a˲e<6|8Aaa" |'XǜLMl4ңo_|A 9mׯ2RS1DD0b4.gdÛouݺ1{ͭ-߼"Wo`-pc5IǑڠ…͂4{ϷltZ=|)ʢ"Ũ NGWYY&/{g?v,<(5;HHwkFEv\|XcuF]8sCs˘ڊ<| hhSMYW]͊7G%OF#Ǐw =Ϗ+V0ׯ{9z=zpcFQv6y'N8Ϩ׳yu6lȏoMhL }SRZ]i?LbJ _>,w>qqN_4GS㊦ڠ/nw}|?3dg͚6F.žի%aW^ bߺu[ou o`YtAKT;DFPY\9]k{R~y=~y=HHJbUWsODڵ\vm] )S7f ƌ_kPy[KO'woЍz Z-~;vpOXGl6]gٕ qHsm3xF `΢E>rcohbv[Y`v 04^ңsΎh$sGeA*D Y#"2^CRx8ڲ2L:$mJߐ=z4Aݻ7~v…^cT}E3;l.:3jbb4>wժFYY:t3g'1r[ K&~fAaaܿp!Ǐc7{JF_q;{ ]bݺ l[R׬,?6գRGm喳~Qm%vbCVk06d"}tqT*ˎ+h$#5qt+<;jT3޽)?k݁+=387HıI߲ꢢ/2fsI 5%%>̮/$ 4^c\շ%EErl04~,#"j Քega Q0?^^ a:_CKwf #3g~EYYĸV[Yh$04ޱ mIl`Q^HE%$@ME |3 ryMܐ!tbU$$%QəcǸrȮ#^^Wz4g5 . 0lT6/[<իe%ٻz-۲q=WM5n_{&4XP3TS1|QTLn8j* }m{9LmKcHçRt%XxuMd6e ;v0It|a6غ`YY;]-i1vtTJLB=kE@aT&&hckڃR:|*}G";8И&9(vPK&׭#f@z?ػzS# 3p i;v8RtSIgesb.ROopw!hV=Zq.KFvZnH5 8Ѯ,˘zhl{$w&4=ōvTj4^^>{%*z?ֽCvS {G%i vZ-^z~h6c [?3'h2oXϣ=s#Hxqul\a1uӳzGr﬎l]5x]ةdr2gBŀ1N,빯UTAGflBMEy:+_^޽>;tnye{{a猹FKK楗}hd˲e4O/zۯt$8;Dy~>l!}nGw!jE'5* NG]ڣZ.8U~HEa!î~L 7_kAg㢉鞘K2}:^^Ʀj'~ﺋﺋ7@px85NX3{O{!>.ޟ5 Npx8%99?O?^a@K;El|=KyH56yM^:Өը5~xI&>0n^ [gl40e on}օ{(zcTu$䯍]xe >#GtxYVv's+/xeJyETTBC;Wח'Mry|;YÇ#K$99=|8*ׅ gŒ&&L`uױOVV!Lm寽7]Уo_fMTBG￳A͔ٳd y1+Xի<7;D[|xnFw>~;M5NΥQ <[桫?$~HqH=n=?g;FDF2jwm^Z2W6ؙ޻ "2Qd|؁Nxez>6Db~'&jPT$S^^N^^.'I;vt&6ch_*>S;w6\2`EDƚ(*,$;4$1DQ<=]KMY)Gk8FcHwFME} :oY17Q44Usg; H5!y~yQ]FoߪZ;i;S,/}O^F>TIHppuRAAAAAQV^ξTi`OnyW_s3{>| 2F1UD% ~LOe$&]~9#F݄u];wa:r;!C5租rzӓ+q/!쫪cFVM($sFuWT.idz_mq/;vdVAAAAABq.X`\dKH0Z `Qxl!=Z7oooƎq9?c _ l]˞xn-Y-Yа03{ pմkilc>_Hq#ۊ޽P.f=!.iIA4 +c٩/R:loQhtc=gC$2m#k^ss1VW[{j "f0RRjFuV =z ''㇪ pcTddܹ믿U?7Z-kEE*8y֬{b3v3f@WfIDT*lYe ƌ@||oCC[2vĉ-N#v}%A4;Sx᥹A0&z#z QeP'2=bzrS(--TfF*:q>}Z::~04ƾhY7?GIҕcI~_(9u|_Q]TYwL$z=EE85k;|h|lU韙ɍ\v(ά¹VW_EWQk'$̠` .ej+/˫)*JhB8Gv6DeA6׬A[VVm-[ڷ}ov$gVAAAAAlƍd؁R~By#zF tJKv~},K2J@%C$ f*uTTP F-Eۼ5F(.r oŝu/}O?g6\a>ʲ= 5tcۨLd/_`PWf IY,|u δ"dN}ϤՋͲ.Kpyz b6Y:dY&mVbWřUPPPPP^ lF]!QUyC8[LYe98uud~u& J1fE'1zl)6 5ЭWή]xhk?~Rw}[6&O;z*_Ĕ6NKQ*K;=O#j~~9*=/$ ^C< /˯0ǘ< CBGE^?> YřUPPPPPhHDKϼ@a*#|.[Ym~ Z%82^YR(IȐ(rmoprZz4M߅:`}VJ߰hWfzڐNUj7|zʛmAU^Z) 1~% 3")ߝ_˃=e0")^zӫWoF$%s<,;z}h8UV_Y^R"*(((((s_d6?{E>l˦)@=*D(**z;rzz;wbJ RBOH!mߙ1dSdO>dgߙy},3OOި~]>#GψcNP -_/:?SteN\nQQE ߀,_2;`8#c0}rm~!YEXN H?yO>}O\}(Sju"F+U.|a 2âQ_?bdeTT{դhQjUv1‚m5cJ2f,~>\n2;.Q0 zڄ BS%S>믽-+ݣ(#]_|3+Q{Ę 6_CCCCC\N5L`Dx2t8NJJ؝.U <ʳWۥk R0YGAYH:dABd. ߡ#}qϽ^{dQFnWhJ{ Vs/Ve0y$I>#7'+NWhddA@FF=2J&@S& !Kǎ?6v;YYDTSZX8hzm5TpxÆ͸j&7|.HNA ťVdOi׊uXmNNɄ F' Fw>m۵cVס9nm|ƙ0`͘8i5{\l:}pu,+fc"Pl  IYtxN"Q&H'!ˊ"=dȀ &[>zt|8/wbaGvl+a qV;6 ouz rsֻ BI[.:t-# !2ۯ bjk k=GF;{70JFcq虬}MOKdj1OX.yt:mpk72ϐ-8uddBl,V Ȳtv6;m0mM1Gk5o4XgVCCCC\Hϥ 8Lf2ۍN(]8V1-b0)o"˲֨dI=.2YPi((}MwQ95/) IDAT)V>z%STeKjN _=Ϟp>^y zz} %T DI(Ҋ| JD$YBBΜ́^a 2$isd'Ag-=\9HJVqh&~h[T+*^G.??W]?ﵴ}ZkDݺs߂Tc5yj+ߓ2o:g͔b+mM%v;YJOoѩSX5*jhhhhhԁʙ*]I걨?6+7&SWRfSj}ɊUT7tSp 6+^!FdD^%Z@P@HΜ8~IZTء\6ww`?U>Y):|d_ĜJ|^-,s:;'q/={%W9C7n t IȞGITu-`-,Qְ^˺RS/2l23~:IxIYY),̨d$7"$Ai1" :Ȓ$Km8i(_kXCgd\YGem5$'+6|}S =9_ƓT2P8ݭG} `?8$y|3ލ[z-[ڵk}_ZCCCCCٰ~zb,KGt)S|蠜7QR$Y_/eYx$<_6W&ߧObYTsw]Ljz -i!?V)(QrdU-$tUYYR DɢSĨW yM<1+K'~n_ 4g=x?hrFW ͡1P$rbG?5ONr QT!!"|VEUzlCϿJ4d.@ 2J%&H{dڽ {NztJ ROh'$Ey R*(J,c4];+30ԋPۧHRSYW^ :]}hW.O} yDGGܻxeKj["˲,y¨Yp:щ,tԅ6ᔕM۱C3f@_FKgOP$a)Wݢ0oXTWP^GEz'2,W,* H^ A T\ XK(z}UBP{en˃<;^g<@-O7Q])&IT_WZUKU/2fe*^K^Or>=J@F<\WyO!]'~ <<\ۧ E >࠸ԪH`~o1o, t "$ӻo?o?S,W WyV-5Ę}}>T@ SHJJORUuU+;zS/Ǖ˘t47d*'WCt$%~6ÂaS4ZAP*tXEQd4ISe`~nل  A(JuXrPTQQt#JiR1:5!kCEƉLd*MO1eN e,+9jm6:*KJND^Ǡw8/G@.s]٭SDŽlߘu4@#*(^o1TϘ*aV‚:+^ǘ vW7X+\ vF}zOe -*gKFB^sf=az˽׾s@(1`j557-1f88)lhqIiOXYA8ѯ§Q/@; WCy HHjKW9vOSE<xm*{ *T,]IH=N-l#K==]/T[Q<=*˫z^ފGH)6#k (׶mQOyI{M5_]C{8ѻOͧS4 䑤\ۧBEDx=,g[JyNn{<ޜYo%YɊ7]^Y*{3 Ao418 P7qqX=`Mnc0N8xZ/Q$M3AP:dd$In"t:8xID||%%QN{u%qlśr:%ӫ{{Tz*(Ҫ(MTEkHjQ KY9ٙ۫W5vb)3t32zi=2vϱ^澆B%lAA> z?σRnvLĂcJO`OlN]O%I5fKLʖnBfh4s$? ?U=Vs.Yf 6BQ0%MetW5$j&wDP xz|/ eO?KIta[=(tEA))\NQ@Qc0(+c.IyHRVFx3tTaJ ML6ͪ[eYZk k1>XQ189#wF؂ ,]ai YC^X!7 ?_12eŠ*xٲRS!cOcA' .57ؿ-`MfT9|CCȘ ֌Y&d_Jbti ?8{׭%KhXfj*7oרQtLN|ڢT{oow6So­2nbL~c/9`0i@οjaa"ƙHu9m~ 41HA! Ȗ4d'_NQ2EYxmdtrY+7=\DQQwRex@ב#k1}{ f3N53gl~ZR* $cܲiC"d* ʅB_y6ˍ(% AQc0̈́(_kXCt9'vpE猌>.Jz  [m54a"rp*Cjq.SVZ«/)ykWɰiex@h>HIa7k'Kz~-KQeD|HSS:S_ddDw-J"vYH,/Fѣk-+$mNv%һpF oK7ןԧ&č[(* $(ւ) 2:A}IRrE\.KUu8|5Wƶ@ƴۑFʺsFFuYGPn:NC#ɜ7}m65L< NbkȒMo3318jشN҆C8/))t"I2Yiج{&Z+ꛖlܐICsJAA 8¬,K?t(=|,='LaguRr37nO?~an xx3O ?$7Wo/zJ}gUݦ4=Z}^y%ŋfӦ*瓑 Ix`H9q">yiiq6KL$y(n׼nbNC9o|m"ׯRVpmt!mZP2_='dSdsR";(Bۧ| eEDQDSqX]̠}# AznQtQ\|DmXs*@[ܹYKa!QQXصjzlKK-~?O4\u߹Ơ F\~֭hht:>VΩvJ&g,C E IENk).X0E0E׾J,ˊp*JÅj'=$VEUTKٴnUsv@i_@-K I?GO}l٣ċժxn\._[Q? ;nlv'e;݁$;4pyY?vrUu 7la }eU[sBF٧[ | &R^f:;W:o:[h-J 4c{C${ZYY8SiI*ݶk3އgJE\0dA3f5!^Y]D c:Ng¢Om/ûgOk>'׬5k7v,x:w˷"|3yD}=cB^ڱv yԨJ D5kv=WSO!\DƲoy|J/Yln/Z3a=oOyƠ KLNEفkիйŭ^hTIUoO]q9{obw%Sp]ʊp8~pq8fwa;XYXl 9yVO Ip[=pOyȐ3XƨD: It^4<$ܧ/.$ZFIQ>V#"W6\e%e6J,6J-v8~(U@$NI׍kgk kXC2f\z9#w"Kt^[/\m911m65:kV_/ 1h]VtCOd6J BWV EVfRDQ=97j>9bȂ3q L&(a'))\[i)7ofΝ׿Lt|1ڂÙr Λ0cvPPE_1gtk޾a^ZDѣد/S2"Ι/_~ImQ(=|C#;w"*ccSertmkf&&GJ/rSj!omP;}Y7wLe-n/dVg#>[j˧*Wo >Zo׎n2iؠ%$0r F^qZ;NxtٲJ?l; }Ȑ3 1KS L1 #;o2k-&O^10&D[CS~Ȍ-bZɡD-f#2.˿!t}v͘Q6v̟OH{+JUܼ?.O?`ʥW2xHLJn7ф)Lpp@,t:)))LN5U*{ nN51_Ɨoj2B> : (z mi3^Νؑ YX\sMvn70?#з(IjY[T vԩt,e V/0?|">yq{ Ց3i84cV7<5!9YuHJRB\<1& ۣ|9VuW6]{dBżBsm+x =6UPVV z Lpp0FIUASZR͊$Ib `v7T @҅YFĘ;`+luk> zjdYfw_v Lh4T6+6‚u!wUį,I>mk8occUz]DDFqiyt:0C R tD[E^^>\.dIBa 8Z :PIh3:=V̨aЌYs]>!'Ҙ[`-)!$<>=ߪR-B1O"S(I_a[+j.v: AJj ꊯ} &L@Hۗ{W_1 p۷ߪ{.( IDATբ\c2K8w{x,N8e~mi0՗ؔ;[7ǤD&&Gc 0YI!Cޮ='%B! ߱&Mٳ/;M ?Y{Y~A&RF Xc}&>r% To2/A^}TZ$nE.*TdACt[Qc}#^N;VUw }B|2?W g ?k{ǏfEջ:wEv ˒Z s7dYl߲H\B\=ͷ5h*ʡ[sFF}isxQ~}<װMl,IshݺJmyyL F$tb)-` lh2b4AۅKY)N#rq݊,@ Ψ@יp[^pCЌYbQzCtسf f̨9~M54r%=?ڧվMvl+5LK ;wu0{خ]d>7c^P˾ 8y3=% سf ~95-TQ~j} oY ]`-.frI^\xzZWՐjO.WW^c{Z)KDp|g8 _>'CP:l36!ϿvW;Nܿ?YG`-*{ 3tT/[ƩH׮h6'%0fM!!^־"'9sNZ,|#LqhV˂vlȩǪqwyӧS+^JKYs~ݸCFУW_ZvcGr]a7}zְ1Wo2B}8Uۧs ̜IH!ۿwrsKIEn,q"I^C+RVFmZGA~nG&$0Bqgfjx|; 8yC[]wJqCeEE<~:&%1B՚Hv8vV+$EZudd1ܙľ}ٱ|jX&`hF{lޝѷƦE*)=|ѹ[wzHnI ?%:bvH;~x!6x nȱ *RdžqJb:оc'"&9STTtrk6m(FΝ["56o-YF)5GnBl%kJboѥ{OFKljNsUF,dgέL^^dhhƬFgO۝SVz?ip"bc)7>(;U{7퓒=~O~ݻ)+(J=>h&OS\x t2MslnJ 0ԉ~cǒrWoj:E{H["5q4M {# {3^Gw)8XXعr%۶oܸ9aCNeos}Qt4a]wTVZ2 "[5T9y'A߁v1qGFdF@@$6+%E君U)*ѷBAG ;(Ux@I8uYj[[MO5ak}Pg00Yث?Ü8zP:wI\C C$,2l 93I?qR=Ly:G5Zjƌ!~*߿g*y2e CLZ#OgD]xbzq]Ԗw]ٌ%o_VYnA"޹3#w%>tSD#2ŹlZ;~ۯ1 0pD|4i߿2l!!;tyӦ)4d""X+k-"dg&wzU1ˈٓUYo &cﺫ^r5ak}KKZà0.YV>4řUZ-طi L^P3dϬF=^hG+lԑR $Y\/1aU3*Jm Mȭ5Si윧wagԆ \3UX y(%} 8у+ȄFodB3^x /{sK/qWyqְAFiCk3$OPe;A'L`ʣjl=}LC#EO)]E$oyjuչM͕6m#B2P 3ȑ:m=$1HsSHS}ԟ~b_sRWF#5=`21;)`Rp~y.]q DVhi5l 2O닦XW_MҸql(ȄqGU-nhƬF*LXC'#NA1,_)u1r[{z͆BVP}FCF"4%I^Hϱc9mW6dLЁ'y0]vEvirb6NyǏy\ ӭ]B&—ְAFi]i5 aca+*"uN3l ˈ$]x!J fjhhh4[s'ygV/FhiN=_#;w,˔˗_"\'L1L}zeC:r$]Fض]pg|-SH e{vcc !i8ƍ^ZJNj*yǎQMYn.2ܞ토 m֮tNlRA*b7ZhfGFr3`t >x'(ZXf!QQҶkWz":1YЌY zyc;rqr4B/$%ϪEGӡGg M|ތzO a22(=}[Q.͆18cP#*!؞=ܹɽ[ܦ C8dHSOh kdEۧ-o A sg;wnh@3f5444y6H [JFϜ3ku~mf\[NGnh׭[SOE5l 2hkhƬF'M}j*SS[ 3% VfjhhhhmzYxСzfjhhhhm|w1fl~5>M~)w܁dW^'ofZ5?6̈́EGӱW/OLeU46M(` 2>&11LuncPrԅٛlarq mڶ%woΟ1$O},? ;W?X{o_Gaf&F7lu|iN‹fjhhhhh`\] U{M<=};ь (;?7nȑ嗛D9lhC^NJxe[,~=k}VoK!|tY]Nzt4k{_hviϰK/墛nkc,}yMv\{-)^[KO/[Y|ZT9riƬ$JTyt1M&q\;Dt-&5h/)t Ã!<>vݺHJs\æΫ+s4|H5gƟfljT$7m8+߸q'l%%W]oXaa\i>fiAԻ0+9oB"#)`qwnW pd>^>))L߱/#"=ފ,l_KJNXSgRmt<-u &季¬,B nӦq]\fٷa>A'LMo{w: 35|3ݺq?94_7︃yGB^ԁq뭴MH`DƒN~s|`#s|$&V\z5O~[^}]T%Sm,sAoʩ={pUuv%%<7t4.#FܨjCkipb6NlFޱ=1et$JiNYɡuh׭]ˈBBs5Ҝ\ȫ|"bbu!|FC\fNJȒĐS6mWf51 &MUz]U@>e++Dƒ4|8CMSZgv:C6^#42|Sp0F9sX^W_ܦ _==V+ϧgvlnvZU1Ix۶TwU2vNP4{cV$oʁ8+K=nkߍҞð&gT,6u:cIGH͡ ~cJD<.ÇdMEU2,eq`lڤz^aQ& ҹ/>8b͡H&3__Vޱc;ƞK鑒B hLq*\35r_UM cr%&ezAxL ;/Ѹ:e }-wP \BFvn7?]+WRjU=y:+2i1~\~h Y_Q[VGM2uwzI5ƿ(_]7#bcLM֭wX˖1; >d1Ȏt:oخ]3@L&?@=(ήqUH3}_4ژIMeefhۑ?| e WD z9n*Ȣ=YGΚElƢIqVV(\}˗v8FM TJzungv;\#64z ˆZ&̛Kq'"bc6oƏg_ᣏ(+,s\cDU:gosaQQ̚Ÿ _|x4okH߿ǎ1~\l^/ 7-*:h:sr:x9:fk_3<`A!!Xy[pyL6g#IxRGsz@5dnI8穧?Mط Ds.r@ڛ萔ロUo+$gHhDD%gfӒ%~IXP leeHT5 xv}1L5UH3}_4Ҙ].v}%7nYH[)gJ.P O*,W_U_Ϙ֊}:;oecY`MSiNln[NhڟgPUqiiziο&)9V.~z (9iVbҥ[,|s&:Z=_t|:9u?#/t_׉q&\=sjG\niZ+<駟6L4D=Wد|A~ cf8W[94<}8q]V:y]4Lt:;wr=Tnk*&vCltiVlѩSk؊u_־ߘ_%^ɽ֫.BDD$N@d3=JqQdMY5$ Pn$sqyD&$4h4*2vAUY!MgȒDި+Ia[BJrIL~t(bc0{l699}{9t (V{oΦE6{6=(%L&5 ,*(z ݕ͢l?cVs>(O|ԩVsĬ' *>^}xs&/~pBrY\C!|"=m o?)vRT94N}20~NfMX*y3frtNz ʡ[ygmbB7ALBɽz12(swLM德bł綾^Zoϐ+{91\4B||܊nWaÆyj_KI zOgb h-3osV&+3ɖ-ŶRVv&<tl>bdٸyIo+,@MRqct}qqqǬ5z)Vuk~ޠĉjD{u*sgsᣏ}yf"J^2dg/crՃżnEC~Yx?l죟|RnG3rڴjs[t邪<6jv̚sW_MΝP+xꩧN3{嗇f~crsUy{$5<vl 0o<,YR7 $j?~W:\_?M}>͟{!B$h,~ÆW{$YV0DfRIUUTU%S'?e&^}_TMpטc]!7hѢ cc5i=/z UQ8RIȶm=zq=VMoWBe|Jl10LX#!ȴ1 47^|[o1'O(ԙWWW~YAO-qMZ-\τ;޽dgӺsYcXSas+wߴ rt> [j``````Ќir1)>zw㟺5;Ӯ%O-+yTU塬܍@LLd16&_C[qv6?1C3%3FEYnN>g/9g˪kw)p8H u&HLhQTEEQU,tqo v7NЙu3""#v^k'5.mnK W靇bԩ8Y`A6=[m@*UG,~z ̌r5 NM=΁kQ,V2n{92^sobp$?G9SHqY9$#&Q.2%vNj8tv' +2,">' v֬!@xQxZEqv69z-vg/WEȖ 3W3f &Nl)4gVU-] J;p%i͌Eo>Lvx/φ$M Pťy@UdE!NIb|4&Q@UU,| {O=_ʶ>'RX.6#%o˗ 9fKt1}#G%# s =ETU KNSU>eDECy,~v]%U __zbbx~<bd,LbPjhoقPbm>fgm_wR8D no 1"X̖J˪^MIV;ȲfiYI<ְ9^!^.AD[ T]tҊئV WT2DUKTT)W^o~C]ڲv{2 0F@PU.QUư7hpE5ז[ӵM"T<!6?d uRUT, jwIݛ5KfKJ!OfΝKZḞÆ1kl>+Ŭfn6-voB;}{=kUU/WJG{?w 3AQA󘩀GV AC >¬,+p"tm*( 93ƼtJs&c.Ht6XFIZ#TԀ'?ȲORPPUO>@8@Oj߹'#{EEu>֞϶>`ʕ z:}:>;-c(TAH׭#㧟Hb]~y 9v):.}@i1nUժЍ1ǕMHtkK{`a5u׏?_9R'e:]L#ff50 b6 s-aJ"D*nVN>IBE("L$^/{K?a#?`""SMI&R{d2#UoQ$T׳bԛUoƱ!SmG3%XSUUJNsY;KHرn?6p.f#|} + *2bcrgge{Mb\Xp(֥K9~};@yQkϧGZOG4ϟ{~>^GO<$g r!iݺ^Wh%LObG-`;IPsRR %唏_=iY>jt1[uq:^DDX02KA"*W@覠o~-v :z(j@ i2YHԙCU_r76V>mu6eyy:зD}uTU AW)$7`wph !w%"( (ZıZUcqŠٲk\Xn־yՈhB^IHhIl\2ػw۷mq׭ÞϘ{r7EG+Sjr :zUbf-c;'lVΝ9sh٩i&sP4R"|>I61w?ظA6W!F`O ♵j]n}k(:؅ze;6}; hBA &dك*(JIaE/jcceuJ .X6r(*QqpE;+( &Q"dwQ7JUAQ@.*Z+EPEUh&T9( II26FWME$6_{&RѼY;>͙sC{~>?̛nn+k#:&q:u s)w8Yg!]Vq#&t qΑ_39E طʈk96h:Y&gUR/ZxG +Z.HhDB@ zN.~S?ﰑ?`^<(PV ~!$hJ YB-[/ mlLN Ϟf^!k {ǎ*9QQQ<ؓ : DR ICIEl2e%!6 +^KN !7׭}>$P\Jxf*;E\T;(eKyŹ~G:N㫉gWzc)+`{j6slt٣6nr:V^&L.u:4 dK [dT* 9"( mI?lmwiTxP갪t.-U* j<3 s:6 {o?ۯ**6-ZYjRdY*A{Wx^_Hn(2UJrr'ah@{EE ~8gcGlE1DȖ:\hٻ VURq"`~(JZl#:[k }ȶ{ؓOcZI2s z%Ql?^;PXVNiĸHL&3gGg[iiV*0S82DW xQ<\1t ;{`dff6P ꝿM mt1k*jau9î q7CVbaX׌dф1,I(F ԦJʜスPA^tk46#"ݮu4Y(wkRQ|e O GLC4rTBp#kUkTy,KȊC,Vk kph*wny. ! .buM(Jah(>_W_V"m@ϱck5=+VXlߟх|TUd(?X*)ȊJ^q91VD{#O?^"YBu_cW i|fM9.VBoceNFx3v7ϼ]ao"11xN,%yx[vЖ|뙊´M!慆+4jX݃k#^,dQU$IfqqaU\XCWk4oa^Q&QT*(t\z h_n`aXG N\6BveKȶ+֭QUù4@kĶ"(*Pkkqۯkdmi0GM_!iDdn\ԇͱ/m6&`sl< 4B R].f#qQzBE(V TܢsVouGn9H)JQAa2uU彷a] #51[c'.fS>\W¯a0Q/UJBVe$EUQ-xbk>z.aAFFͷ̸ Ʉ(T,Q .fj uG"ʬ1Oj}u}{^YYcٵ+$9"ªr> (b gH*R!$Y1 cOW-<EkǓShfrk?& _64=k׮FάYˀyv:0p`l\v>-zZҬ_CZL>9(O2NpUW<**JpFqjB!xnǶm[k+QkQw`Md2~#xڇաTElI xн Vʣ+@ _6Ԋ" Yn _XQUɪv쵱l_{fĨ(bD`(T`5OYPЊq}&Aw"#C SЪ*hDGGŎ 'A?>UEUbVEEd"VzLeoB}b=Za!@sl xfb ]ve޽M= k׮ؾb6ŋG(5C?rcX7Z4==1'@ ADvh9hnE2^yS'%:xV6ʒŋiش{ݺۿ,e+QVRBTLnϧZq@|zG[9TTUUxq@VxU,ׅtA‘ؽ{!spቌl6*eWHf]l 6>!fQ IDATU)9g/vZGP)y=x0TUD]VlB%0**"*>HL"fKۺp"#}A=Đ~}j=ǒ3Zنc޽{<g-%ulY[]̶9<blӷO?oef$ht"7KZtϟ ߬־~{**>&JߏTp&kcce$WoiZ /YDؘ@lVEAEʻ;[6Ę.FQTD-UY )y"EЃ JV xq[Er깤{wTw ={l9)eۇ$WBhA 6!Zߤ!Bx0`!۶m$ɔ;=߂rep]13w+wU1)* SAdZ C=/V9|~fsEq̱A 77(d````p֒>tit1۲K8M!"r|>ٸ~- >Iq{Abu9zJ#:Z 5TQTeEAebbcOzpT HW0t=Z-/wbѧIUZdQ!PX$C]^2Á/NRj=ǁXfslӟ!>Uǎa大ozRF$)5J]gb̙5`ۻ_^TbUǎJKcĴijL l]'s&'܊*p&bҏe_|ܧUETȂUS7~_8!dRHE/)=y$xE%UU~B6VƋ&Na`N"e0~swz"Odxr//>]B}Xmz$$U,ZH 7E@rEPLUŞhv$O)++ _z6`t2kX\VZ$Iz^+Hlyg9MRdF,/X"wT@k%$I2J^l.кm;* ǖ;{]мނ?w6(L'IHDIih4Kdd汦 &\Zq \z؋DX9jLαA >!4fo+&97LvJv[AFz mѿe6]?,^5(-JIO''=˗3Wh{U:+%}M7qO7ɵ j&>!23M"fۦҢ}{Jssh \@u3&v}׽pBF(PV@k^-O$IA^'8{ ǣ{z3Hcnѡ4ƪZ ɐiMk6FDE#-}Vnջ).V[ⳏ0S%**Q4QIJ=>^cZWwo)wÎ /$"*kh H 7Q UӅO-$wQQu>I(+ MV GLbb=s)JQ;/o;3oşo WV*A*^I)Ԧ6-jCDkcMjqq\zٔl96000hÒC%u7s&.z{{:H^/戈z=gMݰi7@1c(/)ŋ޳yy1Y,:$m5t \2hD @Ii"G5GL3hɻᧈ#SvQm' 5!BHUU<> ǧrcGqzu[LFn6lׄ \Mp8]j`oe$uQTUQvd)[dߛj4??TrDUZB8>Ilp{$),E*۵~ ;NF dپqڅX:/&\hEԀRa/^E(jU`IxEX*ׯN(_gFE@ )(꿞#7GOV8I F.qp_ȵ;v}9f͛Xz:~C۷,-%*.e]wة~{O<_w H߼֭yON jEv{wZ]}59Ž+~SOQMf)\g"|]IN^ [T,VY1dMօjavNt9u Yijwlqqul^n IصW</ `*9X9Fd/o bSQTeHpF7u-Z$MIڊbZ{~ۅnjaBAQD^[:&.^XC@4 Ջj!I.CC_CxRbn~Tg^ցs*Zi5!TeJ,Y}W`700h9¾C%Mt=]طq#o= χ(Ĵj~˞u7iߣG?"uLprG~x>kCX *V.\M 1k`P M&fQd 7iMJ1b%v--wbDWZb%2:%٤ 4WpI(dN'e8PU˪q"rт믯uQl A}$댷 9u+EG2H\E/%v>\]>CFhZUE$ѢM[:p<#g]^β^^rndbּy$P-CNfI~'kZiѦM[yK6kg+N￟hnL̂ /?bdk#Y*nILl\E%[ɉYADH,_ ȍAÎDQ]83 #sZ쬍sׂ(H4{vH~}QQ$vkaW#o }U*{ׯgp}Р:X4x:Dq0fϣݪturW_bp^Jo]$iBX:(""y86deN qz6f}l1MF~;,"&s' ; gmd:'ҫ/>vMyS"2UU{ٺGADFL=8[0e8}D~}q&c3DX̚PDAh{py|^rrr*?o@YJu8Qd*=lFaE#٩5nKCaq)DzzzS$ɧ_O4]h2neJxڱ*s,U77$ 8˖bv7Oʈ~]?Ai;u⢙3Y;\xM<~|=n}Rм/ 1k` 4{6A PT""˸ $7` 6mDUQݔWGV߶m9q6}S*H^m6LA- c,\/}Z1][T'AQoҥվwߦ pa~|=v?Zi`_+(a9!El׌֐ۖ/&&1g? [Y^g,y;mC~%]U' ٶi-GgTJQ ^ʬFgqq}t:^pOg[Ei?h=R`EJĺ]N2c픖etzl]GwJʃnKڶky)QTCZ )?Wkd -OQpr4;Î(8ȎCHQj=Ƙ֭I0=V9v%.f`6q{<\VcbZ#$f$8nX 5za2 B_/@8G=—]׬渡~ռmS.ЩOO> )xC]xF/*`OyINqyVί;Ƣ<9, -f&(*.1>4wa;`D^F6|1w!{7mĬ`5 8_~ِ& M.f[b9z8^8t`?uWtS p@|<ȁ}9vFQQ3{gf~Hߴ] v}R2-[z8J)))"/'z%"Co|36ba׳v|}(|\3}{(^.(FX1LLM;R\T$IJC*-MB=No-3ka/d6c6GU>nөϿ^ʪ?"d7eJ'$||ZAIEnBn6sܐtՋ=zH9b ,k1@o~H,je`` *ޘ2B\֔8d=м|ǎqXo W)*.N}<C\Hpwd\rI )]u!/'VEG| ZDֿt9^rR7='sŚg9'%ՏaA 6t5 [l,|3i8E!/(yGO_ml?^Wq ;OTŋ3n"CGo %E dF$Ns}Yf-ز1f)yM ロsW>{7dX""z(JXDaM*9V>U#49nh]}5.4?Ӫg7kghX毿׺5htj5k 1k`pѱW/Lf3$Y}ZQQL{ yadIblᏢ:S.vzu:Oѣr,ݒ%/߶-bz8PZM\أ-PurvTH,ۍDUN9Š_E6t8cC4ńlݹ3a庘ݶ|9Ǐ||%>M Fe Ɍ=,p.tLzI6,ZD5Pܙѳfkh85<}:'WkUUU|-n1ֳ ( !+~vh?1ƶiEϏ(c5eɝѩKw^ƊJAYiY=,WGh'6LE"0Ǽr7O:BdХ/Serrj100h$ڵf՛oRZO߿.?.vQT-:G0iRf.1nR2v^Tb!19^HDB[3&H ..I1zq9+oyݲCf͛GDdd}S^|C-;sDD}Mwo%yyd w+X4+1 Z(%>ʎO?%öCwc2k-d 6&>.yQ^ͮ/۫7~_Nʸq^mk(͌=F^r%Ņ|ܥm%jԊ[?#ްo˜ٳO{-;uGe݂U$ȒD֡t ɤs1 g03e [L ƍca=%î K7݄`21|T+L.b,EGӡgO.4$L3J疿m.L/ns\mYjkW]ЩOn l(T.-ߥF Ɋʣ;yݒg%];TU -]woRB >H8e/ľ9?-;t'(b9,zL OӠAlJOj8<}:4nHAkkޕ+9vmZF1c5a&xryfgz=Jˡu:o4O^o"+&1K}]_~ɾG!W:Dx IDAT7eJp)s|*:F_wI)gФIa -?j4FMvc50000h^d(`lžƭ*EN2x#lI֖-YҜz;w3i i4o^8A p2l!kf 23Mhݭ]СDT*EMk( f:~R帮DjŠoMBS鑖ƞ+ڲIk{Op)s\8طaoo435KS+j˺rۿUٯEfoy&Ϯh$26mے{@* ߚl!{ #"*e0ڥ4&炍"9v,=ǎmNAFeǏ8qáՊ-6Dڵukٶ}>ڰWc˫qmے2nFjpgL fNƱ]ۿl ޼D'&29tڠ g/LMM=f-bLx̢ԗE?o1ʕ'2 w5PbJۀ}ޣGhѺً ЮW/Ű[n0+(9v {^|> Kd$xb۶%cGڜw-;wnr8l KA4hPS8d 8g'͆56V{ЭeJFCGsD3zesƈ`Q$[7uk4炍g;g҅VuW1; 5+? +20000hlcSV_ĄԖtNG=x/Liْ=zp嫯rСM8穧j!,9Tlk<,ǖ5ln1={VVuݷ6NKmjuݦ|z5wv40000l'>=ukX0C:kibvGܹaߛ5o#G6N6ElĴlIRJ 'M߸q X֭7zk/o~kre\wƍ~]23۪{b5Qꃆ8wCwow3Wa2o׎'2;¶]ih{/u?233O_~e=\宔HI9,lz[lKJMm<8m |?ok2|8Rغ}Ԩ7[-ÿrbb(aƍ]^Yoȱ5乛j-+psj{M<.WM=fIs8Wo!bhVb6e:Df/ z bӘod'ռy\CM7zfӮ{wY1︙3}vc|Υ 1`Dul CVCC~  f%fOF ;#wHM~Zv:r dc;~|;Ѣukzťދ-ludtֲ2?Cޣc^!/^,^`V $ñq7?IOE6a?'sOzGMO]vϲ;(g6'$H)J& *}$%%BTT:ubĉyڶ?+W̙3hѢM2bj\jZ%fz=gQ7 @\Ǐ觟"L$>͂)Sj֌/_` {~Ӧ1ϴCgdZFaPմ׏q?i֥>ssWغUo?ǎe裏2׭+K] >K1cݶ5QI '7Ё;vo>IXÆoْMu6- 99\;}II!uyyHF#^T!QQm֌Ȗ-A:WK&r09׮aE6QUUFtEΝ)GHܿ? UUr :u:wL69{}7M8H۾}GTU ~F[SqpDT4ˋNܪW/vIIC^ 'DhAVJJ| _',!iNs?8m׭cēOr,IZCJfJ F^[w%Z)*2{e%Wzl6ZpΪK&{XeeS??MڨӨv]A> YΗ奢TuExŁ2ubۿ;ҌSnʢEظq# : ȑ#[ܹt""";xW[+/{v[lsTUZBE9`p`l0`!%m&"[.}oiK3ҤcMM% Nm @f͈ޝ= (B͜#RWUdBJO'?='7׫G}i=dR$55/x-M-] K"wdC6p׌79zPZ%fkWbPXʒD܊Yք>'d"FeU=n]}X404Kȏ=^>>+hO-i`9?;%O=ņ 9ff3}{Vb?Iӎ @SbYZ)*2pD "~*zm̤W!Y<GEo˖4i׎.Ç'K.mpH?@?ֵP}LL YYYߟ{wnݺ,=uL%Ib娪_{0Lt:"##v˗/gݺuڵlb˖-n ڛ UQMNN֖D7#n蛴P?Sx}ຨ ;' \=M𩽐|{p~Bi;|81ݻoAV'"O*]RVΟ'y^M}i3t(܋U"I_ {H 9Mۡo}ÖH~AF=^r_ȏ?ri֫ߏX e8%>(ul2s&u+(܎mߎ!?6'an[IV=7ccURly BEzǻ. $/rӋϮί:8ڴAE|Q`К d[mĎIr%;vt_~40A[afXSo7{1.?ΞU!Y4jZ#٪W/޽>~ ЮS=\Sl>'ʠ,Ge3k,6l؀h$..8|~~~3~eZԩׯ`0pmq5{kTUGd2ѰaCvELL 'N{OyJ4A{EeSOߒNC{Ez"\g0^>Caql)}2o=u&;9=M0UM/ EHغWXE2Iزqqt5VՈ;mGVBXSxw}$ :"IB|<ƎevX(%ܭ(Erup+ƨQX5{tVϝKɓ֯Ϩ8hWbW_IK/Yl{V7ScUmnx1CX<]3f|$Mڷ֭ :UKr$ikڴlٷ~'j`ϑM>І ԭ[zT9LyvRlUk79[ܙmb6ZzTߕ1PvuBT#:ĄW_#Ϗfĉ66lx9X3~ kwlEgϞ>|w}uqݚh0X|9ȑ#y Ϟ=PBCCeHDRR)))\zMڧ1۾w؁$IxUxp%ho&!+{ ~?Jfa"I>qp#u5-Ӳ:ujrSSٵx1UzhU\ڿ}JJY- ^w%"RQH1 ʍf3W\\}ҫm㐵4:P?Nĉ߿L\}u~mNANEM̞:N $?;+'O0jt= xB䛗ƅ [xY:}:^{!e<=xD$Nqv~Z>aB yyڗމ;7{~լDܷҴcG}|苞|(: D 0pjm@ӨQуիiׯaQQټ֕Ɇ*҆ eq;iȐJ"t4Z=n^>>2-}F#/#vyW?JiӆϬVN<Ɇ xWɓݻn5kLxFR#$ۥڐ$lԩel~z:;?2Q}I6kwLB9LA>w2~@%oຘ£Ȼm\REFi0Q[ Ŝޱ'qx0_|Qboeq2|^?LN\ϞeX:H6kwLB-m]8_Y]BgCg/y^e3hLUqvϏ>NXU'/_垷v_~AU @Q8q#7o.&0z=<z,_6C6ի~'wp(q+gytJUk#s)>˖-Knnn 1۠eKf~/fGQGPx8۴]gXqB>Y6j觟f?8OUE)]V޾EDШuk|: H]|yh\V.Ig]3gkmvs6/]>'ztUǶogߓ}: Pqc?'M*նq/sY0e ,sKN<|neb7ͺr}DAv6? H]v/]Eg3~l~$nb[pD5-:%] ]j,L;Q6ܵ %FuP;[1u;tv}{Qu_LBNNǏ'660XzMVtLWtܙ Ě5kX~=#юTV\y+|%qS ٫W2>&=97e.oa 9.5;7ݺth4oo<[7oiѕ%dge|?,aom"VM4e nێm_/NU} pkSUK#a,U%M/?_dB/=d7hIUU,(ҸHMdEYn YA,>Z%>Ybɵidwqe5i-wX3H#1/kJ~R6t_ήcͼyDoD£1qf~5ϯdggwyĬ*k.~ .]~eT=N׍=Һ {yyh"ƌlfԨQꎭn7:yiiX^Of\V, 4e!ۗѳg/&g M=K~ۯ?/\/>eS0G HkMz=;,`XIW+VMާ_ f]w3b]?[BZ X0v[ӧٵx&d>:˒e#H&_YJýwPUv-^̐瞣]@E~Ln̮٫7|}e…?\nZ/$pp`:6LhS-jy6Vx(kͣÀLz-=wYn0V.i5p{fo˗IIIˋ[o~R7j(ܹsٹs'бcGĉ+|73L>3ܖQO&JƌW^{.$# :{9hóq&W-x-33' 5]s]cgZ^G**b ]b1w;{Ʃm{MUVYfג%.=ȓg2lbrs d"zt"A烪(O<9-n% ֺ ~_f)wE61iGX"rWiᣴ`53T18jWZ3jG_~??X=)@ϱcY[;xNcllX9?ͺt!Hmg޻ӧ"6o `Yhmۂ<ּ.w? cb8ikͣ^&ݛ>*_gW+R{HeFϮĚ&i܉B+76s w \=g.r))̜|$IFt$d+#+ "2aiޙy5kQ [~GEfR1!_`T.'WVDDAW@QUr \ɥt (%'+ =bJ˗9m[;mII !@[L0#=Ejx֩s_ۋ-߿nb~.Æ[E5bɌ\tɡQ)cŋ|lKF?Cm0aϧBh]vy0' K&̡y׮שC hв%6l,~z*d7 AAAݻEQj]YU|-*æPа%HOCT^z 9&DbJA--Q1PUYQaDUUf/;|*V^(\4 8~oc*ӲGgKwO_Kj,|=ƒQUUۍ?8>wlveut?HGV ȏ|d3{<;6_"<.O=P aZBB\[nS;SU!Rk]eYز:lWZcϲ4z(d"?o(;֒g4ܻsڴJ zP]HzRR%171~Æ}4ߞ>]ӦT9>,#UU9q#՚yWR6 \LJGA&Т^@PP-Wi쏏? ϟl=x[#_L~1>hSܰ[z79t]yHLN'`*Mb+~¨E*%>(ɜ8~b9s'F' :g(kt$y(A瓑\1ڢӪA V^~qt^ݻ>q>zPݴ֍S{)n?8̙7171j4__ŧNմ \KH ;9cFdv-oً={kl) E,-Q/k ©??"*  y&Bp['wGٜLJBQmڸ}\FeCYBGYE`HJބ?o'\ڷ[ p˿͛Q$ Sxiі,cX( BTnyEz]ieHR|lnƞFɓ9s'߿FyϜA$iCvjʚJĬV>FDն-ύ.Ս18>KLǎ3?';r$ Pc{x '߬TngZo U2" Mҧ V,ƞv\KO2KK ]dECI2kZ a'UP1ru}bfK#IXANJ,cŘKŋݹ/__bwҦ9g^rUUFNN֭DE߲e>(޾rc/-_P+|(O߅dhܶ--[o˖P۵sieFj"1nj+)E Z` Җ}VUԌBPDjD:{vi;a2AAZ=%bFYWTPUڽS`.( E(\t{yyѯ@s@ь(|,Gl; KТzjYȲYRPPUȲhz MJ5nB1gW1GNGdKVP@pҥ. Z(+zZjGWz!/y_hl\wᮻy{W7(.9))l?€ݮL}7lIt-+>9TW .{54Ёo]an6,͸X{5mM[~h>@fF̒(Z[B @_ʯ?ӎۣ7:wӚ#)bUTkIV@mۣy!˅)&Νse[ zŢjSX) bCA@V@TdU?Fry&f_=*Ux @yy-+c ]{{{Wu}tFJB}1\%HnH WBdzq!>/(1]g/W}`ƕ/cI d|RO)~caSOY$*گ6jQz堺jf3\@߰0,)ZnfW zDuon^ ĞX9u:o7i EiիsڷSU\N؉"6+D~j[hVEA*"(lOUU̩uRl1 ?Rd4ϿXCWb2S&PcQ.Ǟ>s껯/uB=hذadfrJ"Ç0izȦsSD4iRf9fuO6+;׼3zsh}DhiGaG޽JJĬ`PPPjjD7ז^8BE(`7,CDF7t*r]U{_wQ&(F(D Xw*" "  ")* Pn}v{9N Ж'Y=(Xjf\UYʹN6iS Y?F}/cG`PP4iJ:qȻW!'}'4.;žv=:UMSfbGUUgպut1;E -Rهj ۶m!Cϯde`+|hMJtt/dR *$#,B{! :MF zS=zSXA;GeNOA(Q@VdIRDkl1/:u!bK,&hUUٻUD`G4 QP2F <^"z@ ҉:<%zYcѱ>X@kUC>dg͛`˯Q*T`,Yꭽt獟? w ;o΅"ۘˮE:kVkh bk}e!yM}UM_#~/f*}1Ν[#u**NmтgrEgB/mCqB7vރ~???TU%=;x*]PO>r49rejh ]Q^YqpϏ_y]YS1%t:m:QKgWWY'%Ȋʵ| & QŴOcw?(̟7eۍ`>D7##v8-K/Z\d.@Yo >> NW(`mE8 YTI( 8DžfZl.le 1,[CWG7`175^{R^=TURr:jD"tEQ0 @VI g縸oVnp#z H︿o||PxĬO9>2SxM5(*_ētbxHǗ1 =;YF-ȡ* 7HĀKF;v_|Cmh>M1W>x^e֬Y}%<<-Z0h ut4hЀQF1rHV\ɥK((( <<-[2j(tÇ9u⊊XcP^_z%;w}bC3~x?=˖-oeݺuewDEq~oLr]Zufٮ[Ա0AdwTFPmNV+ZOg4]j-5RH|L>qӧLIEUeKٽ7m_{^0H^Zm0 [;+ʕ]^!!Hii'{eY^\<CW\pmQ/;nakǴ"M;wB`` *5EN/e UAT* K9yP\];u7}BnXd@|Ӯлa>(/Q1C]ԩSʡ<>lذyѱcGyINNfݻWRGa͚55&fmF?tPvM||<}-~ΝFdGX$&.ܮ0FUUt"$,鸚ڳR(&D!!2ik$bv EQ1(l6dZ7lX5֭Ŗ?{,4fU[UψP?)M+OXYEڽ&rф*#5%ɩu7wܞHx7jŹM4c(#ΞqGUUYRؽ諥GsctlJ"tv)lx`IPlƪ( M "Ѳu;uŹ7}H [zذDcu5惇#f=x":uDƍcǎeڵ|,Y'|L4h=?< ?üy,Uˌlv j8Ֆ1(/egϞyfbvԯ_nm j 9-i k7ÞNP1Q-| 0UMEk(מvUU1KUλMf 5br)dٮSKU!2;PS>} G[jGAQ[V\z˴/ǴOٲe5ԉ'Iז4cJJTEo>'nȔG@ZcQ"#$|)-I=pj Y0H2uΕ{yzdDuȮlL狗NQ}:#F`̙3K.9h"Ə޽{yǹ;0a}UQGddSey'l2?OF… Ʃ"cIcpy^~e^FC=ķ~[{yy1p@Gv)*RSS9z(C qxy^|EnF38VK"bb?>v}ؽkV ( :6G*9 4,+deeXȊcOR} -8]}&K#&kWa/d-zz%!ۻ&Oy26g]Tu E$+HBfFV)!hV IDATIGwzz͛l^eOLϞd${2o]4cاL|\J!{{<4Z4Xаp$I$IZV,Zm>?_^KtlNd|QUK㱀@s B'3mthqO橧"))iӦo2n8Ǫl$Iرa-[PU!ChΝ;駟W^!,,{ӧOWފ"t4 :Ֆ'ŸǏx]QL?b)Cj"E `j"De"+qnf'ttyJr|TUU6(*!aZd>TkIc'8XIRPo,+>y2\/U}iưQ׮.ו#YgÏB|jE% IQFdZUpۯs9̒١s|Tyk}P re+nmٺV{PDZLdd8@AAz-[p!nv/ 22z N@}#FhW6iӦɢEXhգs :Nև`(' Xf3ӧOsU=e4k>,^ ,XuʋEyoժM6e}͛7Ӷm[5j-[d ̛7O[n<,[W_}\vW&Ʌx!:[ӁUn_b{S, RETms$+Hh"Z2"k){==8z1֬ZI˶FQUP%$U/~L4҄*R_fIl1errrHOKģdd˔IMusۿ}rk)CA%?Ymz4c*XU}8l6.3~a>ړFȨb"y$]Ma<7k^:ђ,. XkSšO$!IYٙswZv+oZ٢}P}xĬՌO<A0`O=&9ӡC=p,AnݺvZRRRhFP[.>Ν8q86mĔ)S0aBtjcuRc`69z(ƍau0d.]ʕ+WhԨ Z I8rs гgO֯_NdքFGDw@}GmZQ }¦AZ\پE"ڐ$3eLf LJULF%p6:9AZvGZK–-eeew?a&NT_?dVHj%U`0L̬l%_akmujSBv@QZџ+?Cf^I#q|b :q#.}ܭ7zeE6u^^nXT_MJVm,Ey|$]BFy [^(`RL$Y&-5LUs_V&J>B >x>Q>%]ZxrzbWK2x{h̜ |}u α1-akddz=h@UUf[k. @;d\\l(\#Cn,ZUE$^>EؚC99搟 ba.MjРr&zyyXXAedtͩy ?u[FEY /c"z(;q"?E&cTI0 ]O%a#QQ)̕kXfI&7/ܜldY8)м|}iС o;2B +( f_N5Q[[|p 4 b\8rAg/XK?Ae;ӦQI ݿd=0YUUoؽj٩iԈ;G2k*f\ء stW:p`~HHv7/aC4 $p|-\syP9rxXj=~!L2E :m۶=̚5]ve˖gã>d'! J RzS (^zk"F"RTDW!ˤM;dHOfRCoN=e˖t:6nŋMi,b_M`ʔ)K/}v?ζmʽ7ӳgOٰaj4 $&&+cN<޽{Yb+VuoH!}"ii4I11\4 FSXHA^.wHNCZZ:M.Zr 擝O&ԌLo&.6X21 &17GorVIGLh~Y2?C֢/? ?_XBǔ%7?/TnܼqxnܸA\\Wbbs4 t:-轿:89;3<5C0z6 ) Փ>tiFGWWB.FJIݽdz=FmJG'zw/Tή bptV&' t:R9{ձ-#"PTx}2x4m@I=g.Xi 3' 5Z+*Uٽ{,zЦMu;++Wrr+}DoY~=C^x-~ʙ?U=A̖WQ6lhпݵrŕs!zkɪEje8:֏X+T(6FqfӦ2ץFA^,]Ə'-kZ^S_zBAA(J)ޗrit^ɭ7jhZ~߶^gi_PЦfC*Fjp.MzV_h0\Eٮɉsx+\rpQiݽ帖ӹpwIv\IIg*cZָ#mD}avDP-G{Bdddqfܹn̛~^٧N|3kOD: LГxٳ9z4 Oiu޻,WkWT,^|6m2@|37 /Q(DZ0zMSx ʰ|rvźu WDEEzrp6M6ų R9\tJ,}UBPH==OcQ"g, -%cΞ =% f^3+ F޴Ip붨TNrbrr gNQq'ҷoM%YHe#@tjAgӨeKh0s&99WjtedXm k˘ OP(0EJG\\ptT PM" 4IL$3#ݴ V[yݺn!C0j=e_e5dDY yVh d6P~3?:ľ '篿͢ Ջӧltlɨ7ߴs)x9>ػxMTu3gf N8k:yLTT3f("{̖5j oDΝW/- E#ݤɹP˂m(((zs^=ϏT$"+WriiL&r{;w6aѢpt:{p UIBBBBåQ#2>pdbc.sA@PF΁^+\<˭Wlߌٙ~/lSGLod GZ vOc?6 @7wJSLV&+4$$%)r/e2"&O&gO[J'(^S2Y>D5eYG-b/bԗ4ƍ# 02g]zY?ZMvrB\nʴ%/7עMɮ_7b]*3 zjo7ɾhZ1//C0t5ȕJգRz4 ضmу\]T{]Ə?ҤݜYzCkR瓐`rhJl:tHgȐ4kfJOh`̟ϝ{ooS-rp>h(]+\$0Pƍٰ!Vƺu-x-SL,L_osR{gϪY (T<*AAlԫVbذ[Ut !!!!qn֌_?,ҧqWw\o?}Qd)WKVF:)I$'h\^ g~/N彂zDFW_/Xȝܹok;TxYoo&cGz?<+ -d kO-Oa6XbNߗ^ŋ--c:vAnpP*j9w19XڂΜ8Ĺ3K8'nn2y5987V}Ufo\ }*Ջ-"Gb?DP.4ڙ3V_=}wT..j#Y[avhm].1je\ [ׂ,}&d ,,dS`Jeo$ hF}s朥}{Qna$.cbR;:Y8EKifR/FMǿe~4۲eřMKs$'GYjL:Sֵ6FϠٳٷt)7oVx` MoU|le ϴiر@vYL[բ&1й3zx{bٕuʕJ*>v8kٕ:"&M":UIXݟy_mt:DhHA=M"9 YiܼGBu c:;g׷֍tNߵWAdz$,̮KCgܴWi lܺ|=V1SO>ɮŅݻڙ3zz_rJ%*͑I'T֬ION8zU״ .xl+G61QEYg\g?thܶrd^b <, *J#P|V[D20ˈ͛7%>>233-OJ%x{{OPP6QTW % uOC4jĠٳ9a1A _?:S&5חAgsin޺}A]Rq0兪Op0,`'oYʠgo(#s-\ܽ?hkGxmYϨ/" z=b/s-r  /j{7_}Ub]] =&U{i?cwũO\]o8@RJEI^v6&MB6z4}2WOOZ-rq/4?^2jh&=ݶ8|-bUϤX|hBa,3 qPPy-F]Tt|˖988_<.70PBQ Z'33hN7zgM;8exw̱kyex|vHH.;1̩uPӇQW|Q:;?? .r:CH~vFi @؀6V{hbuWoh(,Ϩ(RV.n4d a>}Ætn]mݚ_A8Bxk}YnzGq=&3)CP*KS88̙}29v,=UWԲښ:F  vD3[rN)@^^ۿKf#Y Y{yyEݠY^[[?`^#''Gby IDATBOq222سg'""R{A ЮdMn@8Y~VmG Y# ANaT }&%֥ r:٦;Y#6jAr'PsTߐ6׎d&$جm??B]kmƲ,Tt3=ĵ#Gv0)WV}VZ eD-""| :{s]"ί& {q6^.%=. lr8 GGF~!JW׊Jggw.]5d%&V\#-#"h3df;`ڵhsst{&DLT3ʒſ" ?ڜzݿvhmu ˗wtJ`GG#W{wQmaÊ2޾]%wP*eѼy}LmLzk\8rěGӀu'/ WKccVdgO6!#H:u*~!`9sGy&ڋ{Aq '7@JQi5:tHRfsVn',,/8Jxx)>M~oWѣ_bl.SצM&:qh*SM裓R=`RM媐Ú5kGAVO.fVwO$qsM 7Pݏ8߼Pk[(gNAbux\8s(r@ 8AeMUdbr MzgwrG{k@$<'5bbȸu;w@WP./''qRqkO|CBjѢga+͍;Ӽsy*"26f`z=qdgcLc,QA0 PѴ);22Nga+BV3a22o JAÃgeoS+ݝ,!K\}|]9R?ί,ior=78>\Bj#Z OO-aa ~N ?UTĸZA0Ss1 s5>}ވ_b|wmuϰzuKrHȑ7K,ht:V^ͅ ;8^DtFXXԞxf MKM%==K.pA2lСCdff2i$: kЪ}{dtK4 }^kй7i9N]~ jO!KUx6w Z#E}0ٲ=89Lw` ށ,Q/)MpumhޜKԵ߱Mh̘1.5Z-Z0ٲ)pd'DFF9ra"##y5rۖh {Ο/CmkD$MD 3 5;ZsӦM:Yא4s!+>aihJ̴ѹ7BIu<{֠j8<[q奦>NQ^ի4mOJmKHHHHؖ;;wn] Yz5Ç/әM֩SmDEE1cƌrWT7ldd$III:_rd%e6o\#*0DvU=A o;gN\WϳeF,E56oC/;|!Kg `45 Kлz|<+^#[]5DEELnPSyt2_L'qzoD6m5fmaLٚ͝"9"Nȑ#ݧ/|U::<5 tz2s7gΎeFQ$,-/s(@koA=ob^Zjv?͋+>G v^%~M (zejݚ*^^4kݚNCp߀v|Qn;ǀھub+]{1:~˝W)Q#裄FDk-G˝_}+h~Zy Mi`|RK؛eӧP*ynZvU^j Iٺu ,>6uf%GTB$ϥ{t8zyu@RZٹ~@@7 sIquQLP(xi/[6͛ ƹKO DgUsoQ*`4BOpF3ٕ `ҡjj]Cjj*Aڤwѹ7EUi>#g:ss:6<Eӑȹ}vlZw3ms(~VGl#S'NՕ.FGs`ݞٳ+ xd̺6^R$U7Sz=A&hHl߾3zg'DGYafJ( ( b[ D&q'1cGY]/'';w#W] RzAx?2m>߼E=*Ԑ~c&=SM$;4TBR4R\d܏prqU +WDE` ::!COt1f ɽƠwvYg0ŕ\.';+A4$=8+'<gawqqA.jMyzRݼp;׉߫l sOLV(%/DL.DZ<3bLBBk$\>K@ƾ6*nȲәזAcXЮF:t~ٸ17m#ğ?O`N͖E4nՊ=}A?h0pt6f] hY9kFIٽO5Onq}ݳ=OA-qLy߾Wf8դݺ|íKx髯)^prw/WI_2郺qcnط߶r&WVۤ߾;NnnV۪ҧ._ǷeKN{ ݛGf$'#-h0>Pw`UhBJJ gϞʙ=$gVBNɓ'KlISl_t[&3--̃"fD((.J"iמgX]ԩS <خTo @mKӫ)IdҸ_h@k MZ`ՆH||<2MվF#Ϙ"sTxʕZ-]Z-* i˖trLK?4_} +h̓[6 ɓm<6 +%J :#g͢}Lבr?@&f4kAѣG1h;so2=Ge?\r &Mi(R0oMX~wtq/ jAʱcz1 dݛC77Ξgl`9"KeB5R,L݉^ (Jºw/jOhLFbb4y_p2Ӝٽ۶Ћ/O{A?rHOLX~׭&}Y6j;FGŠqtV:?5/zO@GV>UTGL#}i~<őK|yQ]j|k׮V?iN߿?=\ϟ_bq˗/gǎ8880h >s,m:u>}<.!!!5t7>`۵kͯ]$gVBNˋp@fvi&0O& bJf&̓¤;(".4F FAh h;,+;bcc>5d6ktx+^U.@zZ*2N4|˄Zp92ۚf*8d2N467Ŝ]9Q~e \V+n߾mN&cU~9svaqfsd\]d3cǖy; P ߏB?5?yYY%fe3l |ؒz۷SPP_XXR1zhP+:t_~!??￟;wn:VZ(ԫ| Ԕ幵!irV?>kC4ЁW+1dffۘ-sdJ%A]{8_y2 м];{r_@͛hQk6G_Ȏ#82诌w"F~bvܽ--JeT;WҸUo]̀f()smUmݶKNh֨(N`¼y5RC*_yogƍ8f}j _:tȪkZBׯլ~G5ݺuɓ,\m۶ @~~>k֬ɓ:u e%9s၇]t_~Aד@bb"nLy/c6ٳ^ rh# v;wnYz͐sJP7"ZXբ٤IF-E0 FL 7F]Ky-6[s/ĠrLCvZ4664$'YZTAIv?tQU,f־ F:7/d2mG9쯯xUx9x9zqcr23pa3f0xMfIOgDze{{[w!7c{jdur8)7oHL\9zݺK/UYɉ˖X۷1sX7 DղhѾ=J%MV/g&7`(ؾv}Ҩp{YFFrh&郺INɱm۪d=uۣ/Pe=ƌa8a@h @֭s*zBI kz&-(oƖϰQ_(\p۷3oc/_IOOGTOnxG`%tPFL&$Iד^CәQPP@~^!ys5JMK,¥(`,>G0٥wԥ~Z̚ 9#9l>_49VkZ KY5HMMF&j]!3d^@PkDQDb^jd*>?G/4W+V-*<WOOQlgp.LCv,[7fψ3^ު=pʲᣏppt 0? Z!PY NN<`.$!&᯾Jѣ-Ǵ׏nG#7+ w[kD[Gfr2 i6ٴ`?,FV:…|쳕їũxuذJA:}:{lB1clҧ) 嗨7㏗pfm ۊ>QU~kӦ mڴŋ|ܹsڊϨޝ߷X cO?U][bvh# fW^LJ\իgڴin͛Yd  >???Z-/^dƍ8qŵT@^a дh5` /WÎmMC09V4E IDATdQ@(Fc:uBDஙŸM6|onݤe`PWhҫA&:  4dpL $5 Ժ6oANӋ˜ۆ7^ƕ{W_e߷eK aXw;a=zɱcUt7e2s0ve}nyV67//Jw_w/vMW_|Ys*^b}={Z[>-3,>;-a[S磼z}Y;v,]tAVsE6md9u֕n<:v숟 l޼_~~$~GOmr,4gC3m4~Zwfϝ;ǒ%KӧsA^,+Axgؾ}{mt:(KoJ%Z\y~KZZ*["F䂀+Ͼ:ٙT8; J%NN8;;P-jLIkdR2*7ҟgn3j+)rd0kŜѯT*kz6YoۇJmna—&A2Cې에{\Jj|<ۗ-m>f('O궗ˆ#l]XP|rFNcذaj,r&Lwf#[ʕ+dggV |rv;Ê+ۛQF1j(6ʕ+ILLiӦ[6-\H܉>}뭺6Gh"6o̟ɍ7HLLDP¸q9sM7l0>̂ طoIIIӾ}{ĉmzLrf WWW/ӧ={Xd ͚5#PSx޽;ӧO'##Kb0->,"N}%[(^xt},[7|͛o>>3T*Ç"Q&11+hU{bb.ӳw?\ _W`*3+i'S#"2F$>??ވQ4r+zTF&;~@­x#O#[-}x;M7>4kpLe;r7, dee|١]d܋ֵ > ~tԉN:Ukײv +lLǎK+$aM]呖ƦM8~8t:f̘Add$>>>S_|p\\\:t(CeժU +6Kzǻƚdԉcz 24E0X'Lu2XdEH^^^O\̥2m']",^`rdy=L8k |[)6HܹAihڴ)l۳A/!!!!!Q_96~fѣG:sX"iӦb4ǏrKuRSVrOxֽtСsAcǎVۺv֭[ILLY=%Q1'wrgd;<@\D`DL1SyP^Ԇ@QLVtߚʏ`*Baш`$++ V(r rsJfgO7Y~M^6KĄ[5ͷ{7k8;&0Y[hP}h~0"5rxp}q%&#VZ4XϝmJzGy?߽kI3܀0;>`에hLilT/++.1aO3 лwo駟1bD>^#G… Q*ۮ];MҥKz*VKBB;w *oZh}W_,Q? ""2O'CYJ4" ]1MK uVuzwNn>7MpQD4ٳc)%쉈mŹ`lK7G5L [cs6ynF4 4iĔO`{9RTlڦDƍ6S2U~]gsgvΝU>׷ O?o۫TƦC̝;+Wj*|}};vlѣGƍ@TϠA1bDK899;dbccQL:aÆUZD`РA>}F9 M`|sxlC(bj PqqqEa0KYhD_8OII%55Nh4"p4zbKsqqaРAu?77jߧOl|HZh;|QSLZ4Do"4"QS'x }s4Sd_ ' Jev%$$$$$Nv'jqՂE Y >|III2*mCgڵuյ)ӧYf :_.=:7/ZG[i~z ”F4"2TN8(L/\Dukhd-6tR'OI `_ EYV˥+Ѫ}ix4]=h=kcаe/\|k |hn>>[Xzu7}N:IHHHHH܃ddd/Z9z1cFm7lddd/DC'66Çd:m{)IIN⁡hY8S_@vV)3kae#o?HKM.={3GMC_\Cd WWl 66 #F &&$7vٿ_*no%$$$$$|;3+9e3rH9|:IHHHHHHHHHHHHH)DCrf%$$$$$$$$$$$$3+!!!!!!!!!!!!V̬De9}4z͜9zsr9...4oޜ^z1bJeW_sΑhÃ֭[3`z ^s޼yǓ@=xm縹j*\]]-Ξ=˫jo! Dnb۶m:uDrssqvvUVDDD0tP:u*7nՕ///9œ9s,:R$$$$$$JHHHH4 YYY={g'|R¹,Z?ľd9pڵw)%O<3>GE[V^(%;s gΜɓ̟?7x3f "ػ㿙I!!4B @7EwւkaamkAEqU*bA`A(E5IHHS?&dL~>w{ss0gN쓝̙3^^^;''BCY!U^zZQ>aaax{{©S0 ?~Ν;Wx1۷oW^k4°̙37|3ghJ> rJ Vvy+VXa~j&)) @hh(Æ Sٱc{-nRʚ4iEKBam !R?|.y'}c"xʕٲﯿdCBB ++3fg.\o?^(|>`n]d &L(uӧO[۴iFYg28z(GU`0k,ڴiYj]dddA!DXd K.eڵ̙3Gy_RMxx8cƌ!00-[gѪU+e${1<<uy^v-qqqn믿Z~뭷,Y0pi۶-ߕub l||< ,>SZpx饗*|.B!jI&1}t} Çyuր9D~ǏGѐ̵k N *]?iBQ-[Vh̙3QK~ƚjѢHN*}'O*냃iڴi===ر#vڵk%2*9ٳgyWJ(ڷo7?~#G*۝8qmrU?nQƉ'J fBTׯ`}BxKMTF#)))zb*^bbՃي|>;wf֭hBQq_56m7o%::}*d9~8:Ms^czul߾`n}}Gpww0gOLL\X!]GV3rHtbKzR\e޾<dl4mz,WWWi\\\VZѡC<Ȏ;V$11˗/X<$''о}{BQt:'N,4lov|899^4cǎeɒ%%;n8̘1C) PZY?N9qN||Jd2?Qvx'!gggW(^ѣDDDX*.]X(Λo_|[o':7nP GIu 7o=⽖-[#$Bqppp_T^k۷l25kE𙓓NvvnРArz,T?,Ok޼y\MeȐ!?n``9b.B!*ݽƴ4z=Vo߾~'RSSK-iӦlْp~af̘AFF/.<<'Ob28~E-[rqZe HI&Mѣz{Ξ=[j2!f͚Ѿ}{: =zT:},YF>޽@زeK8}EpڥKzꥼVT׏0'=z4 6$)) ;ݻw/Rߒg׮]T9EiѢCUKՠA!::re:Bq711.h*mȈ *wiiZeθ۰a:OsVӹV8p JjբN:DGG[oժ[l!**[LիwU0gҤI鈋c޽L6:0m4UѣG_%BЈ#`Vղ|r"yfCBB,^O>a퀹k_UhH^yBbyTp9;;o\칕 W^_Ə˖-S2%_r+WXlg`Ba err,ߺuٱ×O?=LHHZ1%cCFtOnݚcǎ1vXLՓB\\\4oJ=%,,Ly/<hOٰa[n%::t]v 6ĩel޼NW6*g}^zvZ;Fll,ҰaCz!za !DY__O?5Mpt4䓗i:DG1df3{v3f>Xϝ3ZӦw[_fҤI <___RSS9{,/B=z7n`2HHH`B-AAAxxxw^6mjжI&8;;w^ڴicՙ5ٹs'֭Cυ4o͏} IDAT}:999|GxxxXdBa[+W)]dBCSQLL! ii5'GʹiؿbDGNrUb٨Q:jL{V40][DG\qe&8:LJ#iihj퍌;{/sh 6֙%K}[ë.g3vXƎ[AAA%1rHF2dHd:uj?)WYeUp'bYBrssJUZ:)SЬY3 t f+;7B_-,2^pVZ4BQEvQz|YYvJ an7/D d۷OS^ׯp:$|N7s&Ν23xoFcNwoan<~C f5JWz+)\eذkfg9p$22VͤI8ލM0,..xjf-T*e.!C9ҺuzlFy>B!j6mO!sg fHH1Ǽ֭x'.`UFO? c2@fWo_^CBɓ+u옠7'z͓q O;NdVW/PF8u69z+FFbѢ`5:СԮ%%^Fc˖ɸz=9o߾ŝH2$#%9u18|a=Yd9F .Ү];ZIKRelE6mԩSYֹvJYx1iiix{{l2:u*?+W$ ~kVޕI!BQ9!!i|.m^$&:`n,:tH`f[g֬c#")I ͗_dDnHKsk `ʔ(<_jӦclrܬg`񾻻ٳpa#"9VMzQ+?lAk׮e;sߦ7nG\Iɾp:'2F#ĉ5MZΥQyxx}¹Q uܙۺ^B!B!࣏>")) l"F\F\%3RJ*Xݺucw֬YL8mUG@ !B!Sc?|0 #v9ٳ -qHߟ:PqNjJ* ܺuÇp+dUv"))ѣGWũI0+B!@d!c?@֞1ܺc[oO<4^^-NppC 4[c4(**իW<ǐMY[['2rꮆB!6dɒRΝ;WlwwwO^}[iCKΟYWV^ɭ{`By/R/_Z Go0Mf`N.NrqNh4V6ϏOO,<ݻ iR(̾۶>]iɒ%reB"?F)BQM.]T׬Y,m1GX2]Nݻ6}d 4֧2Y+g踕Bzf@e iY`JowWԘ&ZiǴ3[ eѢE{6J~WUB{BKe~#ݵZtkk3f ۿׇNyi~&R3PT*eԴd|7Һ}gL&&TdD-g nN`2_WxiIZjE]rrrXjÇW3 !d֬YʿviBq2 ̛7ꊻ;ݻwgʕ]2IMM%#0:h:x7  `$eVrQ٩z"7_*jN`0ø /{AzMηJ@xbvEBBtؑ1cc2q}:oPs={6ᤴ.'зZ-Wc֙XEVUr^/c rTɄdh23ILDft0;mhd͚5 :BT*kdɬX[nILLdÆ L0[EL8B!zٳJtR%b޼y|ۛ}];V%u9v}d>;~!#G)N!3[gn^leJkV2Zک&2 #} ѱPlUY0d._ Xx1?HLL䫯j8B!0oaܸq楗^]^n ɕ԰n`2k0'{JJɸ/Z4 j;nw^Zh j-Geeefs`vƍ3n8yꩧ`Ϟ=`yʰB!էZeZEHe{Ν;>Ps߱cq;ǤX"~DVB *"b2%W٩SYyLu(:'ŋ+IJ)h`0pڶm[2+}4k֬ꮂBsO{P,Sb@ƍt:嵿F3~6++ &p;HN;F`P3fVm5fl„ɤd2&sk2Zڤ€Ad/O/-w%ڴicOƬJټRKWV$BQB2?3rFF&I¦&1嶦fm @Gh׾)%-S V=U;AmnVةUP喣B 0׫M*Fz#`4`4i_{wYSV~ꕘXh]eUIˬgc(#kaUΝ;]!!X!ߦM4 AjK&M< 6:)4=FGgq`h2TӝXVCf3Si5PaԘ0b4PhŵVzeggW(JY___<<sxyyѻwoΝU˰B!kӦM *b̙3mLZ`Ŋ[URX 11lRZKcM@V8Z%ʚ[zřj6VljUs*N1n8ƍWv={, LY(B!}'Nduy+ ;;;&L  dU*9.ϒJf;rګbYCe+6w! ZM&+?FP&.]]sk 5OЮ\2>B[,40LX?tUNy7ё%+GKRr 17r>|gObV0`US)& !B!R...Jw?6Nݦ'KؘT=z=df9:=9Z=9ZY9:2r֒Mjzi٤efs3&ׯj1 $܎g5t{{۴J0+B!7xM SSIkFrBuk8h2b2n4a̝?d2F 63#p"t֍M<%B!B{oԩSQ<&saڴBHh &ގ(N?A/aaa 8Ц !B!=iڴiJ@[N};9o'n n.88:MVfI ~5ҧAjѢGIY!B!GM6?$&&]Zj ԱwN+UFyH6c!B!tfk4{* dAZfB!׿z_|A||UTtЁC4kqq$B!B= |ܺul%Q4nܘ1c`o_}!B!Bqqrrb>}7`(2Uh4ѣ 6*f.٪h!k%'%1];\]]sduVI!$ގ ##k#FXXXuWBl~ڶEBq|%s|_ !gM߲E h6KcbhذaizBmv|~0})ֶ];ܩ<šl2۰aCNGE٢h!5lؐ#+})^'$";+E !]/99YYK!S~}wZ|70a|v.[ƹqq[;M;u /P~}Z$)6`Ϟ+ڵ Nm__sӶm *w@R:?q_~ޕ+9w/v4҅}ŋlY ƍ;~sp:[gY|ګYl֌?OA//.XWݺFG3sh32Xg7^φ2RԴi> ֯gXGU ?`SCBxnLtZ-}I9iOӴiʏc#8:;TԈ{Zv]4L$ds)Jj|bw(&n QSɽ& ʢ&)FUTW%ovYRD]?lGV^ڴϸqԫG2t(jb;Z;kzk ^~_M}.믿2gΜ;I&Mѣ%>*Α#G8{,O>5kYYY 8킃Yo(CLqxg˴mPq@Ro&B HIQyYlW0Fup]bw`?^(,!;ߨ[Pv.\ЮOV9z#SÃ[l*D;_gP?B\h\Ǚ>_ɱ*>^- 6D%9Մ{AYt<|}Q՘F٤ Rn_a൨ {1_FX;\(o<|}1_¶E|S!DyfsxV̘A͛%83buиY[ӤIA޽{6m:t`ڴi83 ѣG_kd0hZ ;g}F`` O<յvא`VˡT={27TDb}S?/\/JI1b|7Νc_'m}u)FCqdFo٢$MQt0fѡث͵mV O'3=1;VjZ'$ѣ,ԼB؂ V8ժE-r/Ha*uRu,r/&vSMʕ'ܹmzݿB YV=zp@0iۻ7֬)M6ku>|8k֬a̙|7L0fmjݻ[={6ޅ֋KDfpmJJ0?%Og4n(|8^MZBۗ,!Be{(˧w`Jwԡ\ּٳ9829};gSm߯?:7f޽qtv.1ywr=OhO?>PhkPnwW~(DM v/jY\8x73ϰNPm{*jqK%ΠחJAx89d&'[סnEGs=zl&~+ik׎u֑wa׏I&q"yXd ٓ={*-3f`|>yLbZ_cq ^z%ѣYjU}KOe޽={rܹBʹw;}2b~^U*2+LmgcoAg/憝2&Uʶ}Ǎ?Mf^;ޣ`v}/KaOAAK7P)=4h@-8n2uhӳ'5#xÇsYZjŋ4iL2ggg֭[ǫʬY aԨQF6nlvїEzz:sam6ΝK`` :u(S}*{>>>])S(oܸѣG ۸];|zx?~Cy4{&/ZD~닝=4lӆMZlc)]4)UMUK-lE% ܻȹ_HZtoO=~3l])Ŗ-/[;Տ#Bf5^L郇vh\\l֌/+KVkrOy{wz!=d5^yoj|<[sEXDE<Ȇ  oѣS6N7Pvm>S"##ԩWjJ|*cM1eZnÆ qlݺU٦, Z̀غu+4[gggz{0aҷo_ˢE06xغUEZf_zCF}a6kӥl!T^msV3%K27QTՋaVdm{fgqfn=Wݺ4lZ_%RTz=ʐ!Cp7_RѥKPYf͚Y ֭[UV~h"6olذ={:n۶m-ر#k֬!66??*lIY!ͬ;71Lxܷs^K`4aV&ׅ36d"1SK|U\J)} x>x׫gƚ5k8rÇW֭[s1ƎC Ijk. Ҋµk-0Osi\jժ|7?~_nJ>}[l 쪬&\Ja3, '5CZaH:Ԥ*j˖ٲwuaaT#!w/p]d2z6NG't>SQ#BBp-^>iW{=4 $\Lܹs$߸AZ\II6]<=q#0ߐ4@]ڽ 5O=)Slr kϬ"{~,wZ5^qtR]fkbvWw/W$;-M .;T._R=.;m.eAmܹ3~͛[LT_ߛ5ئM^&5 }|,6o^M e~HmVgϞeƌ8pRSSqss#,,'xco'9x ;v,ҎWӜ;wx(8]^5>:s=a]nEFdEcR,=ypvZgl-7oN+bꪔLԟraNnGGs;:V$"^p]J5]ZhW!3(6߾Vj95e2oQ7 hLFVd6%nSt~kTLE k^s貳޻{@X>wT= ^fװA 2$30'Zs2 o`ekX9V֭dgdD͙={TUY.y{V*$D8q .X̞={سgS{ѹsx>|Mٚg9@V&2}лyU3g=svhczU2ټUXAlą; 0f=z\4Il9&*w}Kqw;wK|&ZO?!C_6)q_s-r_ PJL {0bMJa'#+Vp|y|}~v9>9;UZLvyGQ=ɦC AJG,?{oςTD=E)dzmb*ʈ ȳ\|Cz%LjK>|AN ҷla#K߿2<(͝w_C^l7~11rEuN'f#J_Y^7>˴{s߾HY{ӱwo.~aX7umL]8a{/|/uv-}j'Of~ǦLG^CiӦq饗KJJx?>GwΔ)Sx yg8t 2{i˖qn|MѣO<9QFʹ38EQTT??@ff&6d̥^C#ڱD"/سx1"ٓ'gu(Q~ًsKN߈;'A摿oC/䘆_elrҏ×B9 1̢ÇylF_{-]O:|.kȚr ًs߿mK=ND@C鮹(,dٛoRa'{uN%?St;9H߈=DTj]Ɠwn1TU,YBVڶ=VoqúMС-I7{ƕA @%Jt>sascsUCXV G!DUs=M¦ 3I5 Ilg誨gQTD+Kԍr}c Fw;wo3뜧﫮E<@J@W^!.1[z {L ,p,VߔtLIg57zt3\ߨKlU-'7x<ֻwoz {kdx\wu5?rcǎ *sNL21c8|ybҥ,]{3g'|lKZ޽{+4h v\p˖-;AFFu"gyf/kK42H+o܈,mU%v,x}I׏OBSҥ+ !I2e%9ɞݻٶe3wBgb\r$lTE!oɼkRp[ynDDR0pݺw}DGGPYYI~^s6vڅ,U~bܹ rRAΏUwބd^߿FͤKu7뮹(d+PYZ'#{4{q.]ĭReR;5Һu"(**%%%dggq`>vGF⭁8#_} ӧص1q^Æۺ :t@s3[$n]B~)t?$wl2:XDFFj2Is΍"~ {wz!}G$];6C7b{|RII fY}PGfQzѣYWee\€$uhhgPIgk IDATc˾D cDzo$޾36]<ڶOþwxv~16m"-3|?6s7] 60tΜ9#F f6_WE/Gb."?yCU{nB5O#.߿J¾ӡUƪ &ĉ.cƎ8W_;xV|ΒG.GCp^qqA8:TY*uq;dIbgǗ_2NΜeeH!:jPXy:ɸ/'Sq #  8 .T^/~!;[A7+$O8n<履~m۶̝;RRR{1c'E8>}:wy'K`~߶m2f A@UUJKK9piii;q[ p!D?PnGEouL6ˮxbMСCGZ.o|ч໰V6"s(r|^Ta}߸~Snju[VZqrT/]{Σ ???DxbeНcoބd?Υo3m4.bq~)K.e„ ۷$;dmwW^СCٲe ?CdvϞ=1SNa[X+,,$2L..KF Fih\\\vlV1m4[֯_g @BB'Nc%< mCYhdкuYoB2{x OWϿHZZpAUUq<<^$IAl6QbUUQTX&F:L˞ŋirwz]TE=Gd6-ׇ1ӹۉXHHWHNd&SƎØ7M0TEaջ2ᇏ;)>lYSI&5o3u|9˪,.fϒ%YYeVvMJȑ0XBۂ7qSsId#ʋIy:ǟdQa$s3"†kJyYz5eaBE,{ &=Q+w(5iqnZuX:Ba%JڿoSZVáuu&%_>p yg߾~ɷZͿKᗍ?LBr2m:wGNaؿaS+lA>p [n.2w #v=z4䰛5DDFrY-D0bĉٲe ;v젨 pW;l5$S.],y6[[Z[=5|>^zo?EYY_}+WdaU!,42(*bG r'$i!E7d_yON’rʝn-'A~ (cMX(IϽȳ`!ǶhקII!߯,b<.y.ph%c} &MtQIӅ$+x>`F*.h;H[oN;ﭐ9FqN|\4QvTTTE# C ^_;732 :'y<,}Ͱx\ӡmg\OG ІY:RӘMN˗SQZԻ'uE|=g7l ~~-\f5?-o=dγݫW\ Zߘ6cpp^|1:PQZJΝ9N&޺V޿>F]x![$$'ݯ!o:zBl@FiiiLe<~'s͚5 6̏ʲڵkCU>"55 fÆ ~e.TTDQ@E37Ywl+TpNY%^dYAQy'%t:oe%rFj]Q[2/I&y,9s搒#<7|̔)SؤGU)99 :u*: .dܹ[h׮&M ??/M6ͦMxW>|8K.dqt] b 2Jcǎ^cdeez*0bSEyfsw"sfmuέN?MjN}u2EfN1 /s ' :6ɨz6!Hf3x(,]wx{[nSNY>T J(*@.'1n `dk'U C 7/8/X@# bUCwuy_nϮk@ 4Uhk2,Wh./y۽a]R(* ?TSؽ;3m<)9DFN.AЈ,Hqa>&v;_{q"'ɉqDmFFڹwCyО/UegqZŇ}{o*?Meݴ0{MTZcPZpoIj̝?@UFѡUPHM_yzd/:>g}L1#YtǠAƸ}@ k S^1\˜K.p6оgO|j?뤳⤳;~[Ђꐑ>t<--CzoF믿SN9Xzz:O=T~\px뭷;v,";;;|0/zvN|$%%Q\\̑#G:U+8O2k,VZŊ+B^ѣu< F]nsϾEj/ɣ~/* #U5<^`xߝN_=ףY ~:q8(fɍ[6ܭPعp!Mqvr*E<ɤ3dʹjƲp( DQ`e<}H^9@tl(P^%,i>YԱpz].v- #V${;뻵ҝR#6BxX[٤6L:{ w}=1__Ǟe)$Vw2fP׬$+ wd+>WRÏӏ h|\yW,&'+s9EA+)d:p[dO0E^J23Ihk>0{']/On:nO^~]{Ύ:p6{P\T@qQ:4d ģ>6-hAC!:>8 M 3gdʔ)t֍"##ҥ SN/ jSO2l0:t@DDL<.$qnݺi&z!HLL qכуM6p 'Mll,}c޼y5"_СCyG83ܹ3vz-ҥKC^s:Кe@Uuh1qQSCK2|8WYV͛1c3$ooO?5DIII̞=ٳgWy^۶m3gs̩ZQF-4aևxǪ̚`РAA}|kzYf8 4ʮʕ䏽Uضp]mJd %XmVEF-xg :*x%Y^L0VXCk"9 Oְ>~5kO,Nu4hpϬ(^U)> x_3uyZ69NcgYp%WeGET0=` (]DVP{T4ur5\y F_'3fϓYQ馸T 3% APDm%"pat؉ܜ5k;~|S0w뤻ظXbpVTzp:\w}^Zٷ|yƎ;IߡW)Q$2Fhc$oV سd 1l/pp;3EG/.}.窷:3rP՜|x|^#C}kau%(UJG f[sϻ?m i!N_[WB\{h m &tX4lBt!{C\U@^Xmi@QF&nlJ=>Lya!^ndl,mےԽ;RS2h@y~>?VV}' Cѣ0y2MwRYEZb7>5FV9x0{/_x.aCΝ);ޱ)-hX+X̚5^ud8#AyxZ5Τ?`9].sb>`)Vkk8hᜈ1I@ +9T~ǠUVFIff!2 DK|Wt׶m;Z^iIQ!IImPF6 CDhe(L8pPξeˈ0y2-mVb_щu8doHؑW\q }\(*RN]}b3|v_DE}6-|5_dt;~1K?fIfGI^^٧i㏃uA^^kքNM-Kiv%55} K}w@m:"¦RUm? yd@FQU۴KdN=Ւ={4N8 S?ز|Ɲ6+uZQ kv,+x%0ςKo*y{}Ȑ*3tH5okRSꬻп|퇙SڀkwEE1cO#ed?A9P-s+T8ݴiCTdp߯ 7'k=6nmϰK/Ѹ(JOrIꈻ]wx8UU%77,9|={sSQp*QjoQ!ItZub:Z7AYzq4tГZ-SI9s}^V!ԡ!c(9G:OBc׺vorZEg0hTluG8TSOQYZZrrX $k'^ܼezig~䍿@K^U-b=iS}OXSt^AgzlMGS/685|TvN1޾'j9-( ˴Њƿa`e?:&Z0>+BOTQ~eH/$iWĊpv?<{xRh[UU4Ɏ5jvy~vTUϭ8o7)P(A03PDZCC IDATj) *)kxccvS޾=Jwm}E ,ˆ]s9z7jAI9fobSˡbQT JeCUTVr0y215_)߱?BaHQ+IhMs>VJ?k['ilTmMy.2U/# K;a 6[ۻZ{wuY7Yn:Lsd/Qt: 4ڛ 0}i###eE^Pp|\J23k}$_ޱ7L8լ~bj3;ЀaϚ#?)>iwR8\^UEmKgc/#&'o 뮣1$N7Q|GoY;Kׂ:+i=ơ( Rt9 KgM/F ABPDA̍(J G^^/V2z* hC< KvcXRoϘ?MY5%J9(Z;䦬,'Z yǢ]{_|րk`!~*Rc% ߮:EQ5Hl\rٕu?Eسd 'Vӌઢju>}zm.MV{֑=+ͰZ+!#sS RpON]tyDT-\5Ȟ+6[$ݺ 9RΒ `4huae_a%C,&:FeR\a\}( #(2a*8! 1.]J9ukٲi# ~}9y'm^k?)laOz}u1"ԭ_Θ>'sx[GzhG/;h2pY2|]*pZdDc.ȲfAuy޺yZ`VˣMvh<K(j)XUTPd$ivաѵX=`Š 3Ʀkz<Ϧ kW;VlF*.ha66}C{U(*BEMr{E! tlOAAguל祪!)1 bC"cAZ_%ήN c+k|ND]JWnH]a+QYGD}ye8=`=vȲ;q2}AU9 KlȲUgN]BHT!wֽN7;릡C,&kS^V}Jj1OQd w+֍Acbv\K{ >$>g*||7?*+c+0i>WIdc|wNHcZZW|x++)=T<-ݜ,.7^y2VA=6)^Fݣ-ho#{<6YB\\"#+2^d&Ckhp|ظ8K<+0,2QѡA0@V˵s}<&CdYz&c™sEb";EUuBݣ*R|3XEE>*ݵ`G-uלe8Cʼ͟rd-/l|3a,/& D}GF[ 9ϯ(,Сj_PVF&6ԩzD{I :'攡[Xq`/wJ_yhCk_c%Q] Цm5aVnhuWfr6Һi|~CCct'^6ds>}Rxs눋G d痐_BAgG__K}v8X1w.e~9>UUYk+XAEQ}"iGz`3ZЂ4z].dKҾͭ-$'k?_ȑDl:lMdU1#4ǃj KDEE#+)ze_q ?be2\֯]{=}? ˧N )_j߁AdZ.9rGY9Plmڴ!dJNs3߸`5X,6A|K$k[ķ nU%*־HG!q(7zbGߜԊ0N 87/Y{| _oj9ƺRI|Y7>|o}~huС,bMQ_|wt5~:T >b$Ͼoڵo` +vPpRpW ==9J$icO>Cݳ83m_qyc1>e+z|5?DḱkfFI^5Kvsz! GٽgodPUЂd62:jWEor.Xbt`2CPxO>g}yZ+Z} rx<jޛUAuBȲ~-d*`ZVBf^a[|M]NEѬҲ,|~mصhtgG2iQL:F]sAdž]pj{(`356fxhr(H]zHE!Mp*z\Ddk ?GgzmXؼ&n(PƲasFFyg~Qe-ho'~h| PQЍ|6(, 3Njw`עEfRMfMPc9k5`?@ƅmݎ}je7xx\Ũڂhp2kۉ(/BCEAEPRRlnzcL4^_zS.hZmt,K(z(R#tXD HCݎh!JT, MɆ)Ǚ[[1㰆~g"PU tOAvݎ(Iq y|ŗ6 /-$ !6?yg-fHDet40V؜F9 {6 C&9GLl%\SyȁgБ%m]QW2P##/.&|۬ٱOF\7@xwEeBnVΩ g4;~Ң)::G(deJ~M$B \ mnEQu?oMsg|' gI zS4l2yGg28z!yk-úO>WZЂ4,Ƶi KDj+;owpެrlXŒ}-^VA "tQ3f1p8&ѫbBEhsWψ$Xus:C+*BBD1c&#@Ɵ 7֨릡C{σITo:Ԍeר:C"};Hwu* *wܮr(ЬvoNO0 $I?}g]6 G^^PgS_M=JD-Kǎ +*S e(ɩ7ZЂ4<̶ DJW>VpO_B`xXblll\8jsWчu%;+K'Z! #?3Tۥ=YQ(*jX>‘11!fTUB5"{0R#w`/6y:6+;2|n(lbʘmۣoPXZ+GX<6$/gpe$IbCKn7Gmv|Mm|5 Q#씜x:]V[cM7ѵ7ZЂ4<o2̟n3 EȊMuQ4 ,ꐡn@*UYf!z Z]:jy~dIٽ˔Ke"lFCn&Z/x,ȚY iȇuC4 (dNrUb:{ lk2dYF4N`5+0I+y62mTd m j2XSe4i* u oEG/; 識nIY&7';BlRJ5]7UrqM㜨,Xy}>z,CdYʓ !..(,.x #tOafz$أHVgB~7HGTA&tiScv{dЂdCj* VOkzq"EPj>ԞAFܴ;UfRQQy9Yw>ЮwoZYo+O}{)+)1s/mlVBdgob 2C>#L<HQ\ sCXp/Op@kXɠqܿ]sJEEfͺ 4<#h<}>Z؂f$ubzEXB|UaEK0oQi=EnuWs] 1 1FDUU+*%hiZ'6>?Q+)HD~UzVknj)*hAk% C ZЂEĮ]nՊmfҾYwK~h%4^{-)77`٬( P^r!dor 5zصOMA aZЫ_> W|[֮Ye&UmCJZ O~EEe$E{vn Qn(0t2@ +My9!tEf , @ß>$&&<"c:GU$ku#&W @\/t8< LCMP|dC`jX M0x=^\.1UؿgbUر!˲\3nxY!)w`59ūFΑ$o2*g}U~ \dd,/(CHLR7>Tk.-ԊZi*HLR~AvpP"}'5 }ҷ_Z-hAâQl阖FT~I[AX{/muWj r.V}alCI+x[";+Ӗy6kIڵƲ9(.^쫀{sFaYكj2bEV73UBox2LYYyfGŚC^Ek,6g\xW,=u\eeTEA|/&;+]rÏ`ъPbJn5 O,+xdT:+ѡ9ׅUk5 #^@+ T2sNToKޣ6F.0{ͨX~)f1.Zs5ua_#z5TEAlth4UR %m2:ˮ65=HD`\c\Qg|-3hou$!I%-U M}|`6ZW+z|6<1IЂaX<ٵ_(X]S9t=|ˮJ]'Up<ګ#ڦN_^T;Bia|:ƢأqvOƹ֜e^MJr3PIQ-בuNp?f:]^x)-.4ڕ˂kۖ=zXAItڳOd :o!hݩٴٸS̀+ٺy' lzU9*A 2 J  $iDx%\/9Gݦ]>/[wLǴB|r2mwJJîQ1#J^7:L+#umlfCs2<KM4=MQd>GQ9`[^ҥk7~IZ'CUA;[UA[UUq!2yy~]PFmS_MrvP V ; -ܹm۶QVVFll,L2aj-47̜9ٳkuݦMؽ{7^z1YBiit2<2Ͽ S/UΛ\sDFD% oi1Xcctkmm6lbVVm"nDQQ1yx-9_S.L}PڥZgži_Swgt=]`1(HNCtLI1pMdȊX#(CG$(,37ck&38#YOw?E3yMǵ#F_o߶=wҫw_J Ia#:|QQQEMniKܜl<r$#!~=G d21Mp^m 0y2{.߽F(QTvG)yC IDATWpYJH@se5|NˮІښő \NcV^V~{'Z#<ׯYu\Vvi'b-.k: ǻIݻSnyN;A/ߨ搝i)ڬ+*a73U땴l}>;Q811x&;(v?Gڦ C N'W9/=1ӣG.":vHEE7n''`Th͛?~ m brvO(="~K[r7?$7 1qDM}$hn VV#/VRXTL9n'Ѿ+מ&4;9-\.'5%G''KDBv?q1ʹth^ÑFR9{B"Qk(QP,/Xɤ6XPRѾ7Z,m^T///$P+عj Cűmzm>}z *Ph4\h48_<-`3%UH$8i~L} 4[Nm/̰/{-Ԛ};s3:{ut@pX-_ٽ{}#QQQ9oW~_b[ŹՕ6mɧ~7|Æ SN q+V`ʕc޽$''ӽ{wZ>.]ߒKHHiii,]o~0.\@HH6؍端bٲeYSNGJTta>#VZExx8baaѣնlܸRɯʯʮ]>}zih """ qUݖ[_0o0 + ȎLDZNKO sQT&ZRD#/*Br9Ŋ?]+>qGPȫMSȑA鯎D*#0'vSk }y`5ׯ3T{WZ,F^TLK~^2|rsssw23H'/?bBbL,bJ^Рa%jR۵IYOuUf^.%J&~ѨՔPȋP5H-,w\zP(HA~Դt)*k¥Qk8}.TJ^x{Ng]Y(}XGVBpu^}Ulmm3gcǎ%11;wݻ /ХK~iӦ65d( nݺ?ԩSyq0US,YnݐRp /~5 )I@.삕MS^K/Ϟ%߮;@;FxVq+* Kcrtg]i\<;GZi{U ^B,F!P(P*QT!}h́][HK]m$R)Υ*Zb,qhӆ3{Hu3T;"H())A( "W e\I^AyL,URɡaU}־GKP`30h)8];KVx<dDŵ uR\^H^^.9YY搛˝;E~A~^O7ܜjח!ջG9G77j5qqӜM>LI߇ۿhq'E{{zg &3=7}"~ >ݛ39v-g~+Oέ8q йkwlm8:vȋ vΐUkzgĻwo%ﻖ]WKϓǯ,W+ȓhby0pW""%Gu'ߋ,sy%c\-S@C[7oVOu{S%+3ȓG}3tٻ2l|5gdpᔚkYy6<}b/9nn˥=w;JNǞBAQ NXSTaiiQ>k~Trs))Q,.毽a7pˮ_Hgl(n0oS 1Xxo[` }}'1)SX23qnۖS}'5;nץo;oS,/WZvvre\r3fWNϞ=p uJŶm8x tHDz'0n%Y"틟ϝ;ɓFK$Ν;F̜9SEPPFYGK$Y(:{6trnW\zj 驕>>ΝWaKùsǏ8_֝LɑqhW{\Z+KkԚ 9_KNNiɉdV;|KE j>VZbނg 9xjº_ǯSBBXFCzjNx1iLfFSЦ gUY]p=*;ԣ~XXZ{U*[ ׈r[ ._K"ؗ6sPE=a2e)JtO+3uS89XYL~ KK,-(iXD^THQa6oyصRSƿ.xC/7E,+uN!Bg?EľIDb<ԗwP^;FPx)nrMY l@!=)U UQ~~>֭[W[֭yn?ٳ֭d2.\Hqqol믿vZVXӦMcRغu+e}T'//RYe3:-P8Lx}l LJ"!p~kO?+ sVIK]c4h˫%ﻖ7%>}Tm3q={{:wë=v98Q)(ȧdo\u:;3LƽƧo_Ν˱~y:hאZXَn8(F^T,';dTSU$R)Co_do?Z5viekKٴի}{Ƽ-_NQnn svڻ0Wpi8haeŐgߒ%(6WMMIo}uYc VB3'U)8qrbȼyWٙ{ DJ;}2U"d[Gnz:iS޸ O8a{ǎXsp fKdd$yyy899U;#ʭkpuL2Sjqm۲h"CݻwrJ4hRz~Nurrʊ|qd2mazkW}`ZEaN4} }y40^&ޥ G_T5_~њѴ}-+o6Lv1WXX|\ϘV_R^UQXeaamͨ q3sуիk ܍u eE.;k/އ>> {Ej蘤Zb`FRDuŵt,d|dY$ވ'MJJ*XΌ\'wzfgs~6HD"!tl<k_X2ˁ1g:6qJ?a˖qbVf~Ag%'|9N%)6Ck0vtO?́~˹q%*C3f|WCȑ#Gxg󥧧̈́5 r\TC;~~~ l߾7n0|pzy4D"!((HqaSSS}6^e[[[++JO[&TU]] ;kGG$$tf(GGN9so䱽:f 9II䥥t]޽{3wtReM"0bJ; 4'%nja؋/]斠@Uк5#FSSvSp?lLJGt<*^-}L!'ۻ4eQwnVب$FdyϖGV׏JǞF&'7{9Kp9,׮Ɛx3Yn6M&>>ZVZ.]pNP M.4YkӧQTnS<@+ xPuUښ7JIa# "w$04EA[?Kǎ1pΙm۹윜8i~sS(c04J+Konnn8;;yf=\.'33K.qFVXAl۶/booOll,_|%%%[ڧW^ԩS8͛ 2GKSZZ. |RSSY~=<3xxxЩS'6mDZ$//XGTT6Y :uDFFK,!77OOOmPC&ͿL&ՕHyڷopSR$...5KN\BBBRR7O޽ܮH$\ 7^BNR'W&'6~~I4g99=sO//՗͛z" ++MN#Lڤ]Jrt4qGR(L+[[:Fر4MklqqD_oC̙uluԤD$zof,Xy:yߚO0[NVHrd(ڗޡ􉓅θz{$C~f&n%ET-z)|]}W--N_ϝB"ҦcG{1\t0E0 Vܰǫ|G,,-<>dr)nDDu$߀t0ɼ;QqjծǏ}DKc~FƩSdoo"ׯ38{z2`,L2#rQ^$R)xKLƕf {"mrSR~鱱dg,**BM"AjaxtJCq0o…EVs)n>M( J#rhai>>qhBySf`Z\?vP'77:JИ1MzH%3>Yj*A NN8m'n:hMCѐv 7N"imow>ٵ+i nciyT)$EGv*ىdfR\TTV;;ڶ˲1*K~FדR.tR"bekh(ƍ3kK>L hjɉ!sބީͿ'L@QXȸy.Y B3``VZ" n;Gnj*V*DD")m5D+^AS IDAT//|/$9z2f^WΟ5s.܊a3!9q#[,~ӓ~1fl,̛P-W'|jPԦ AA 6nÆ,{ҥDŇ5M8Od''cek ,Jꚻ|9:4dmkcִڕ~s(P]5Uy,לj_6٘9\sjSe㣥kH RΘv\h崄֭ԶqC4`VPpC7XtKbƝ>ͱRO{m\ݑp!M!j*~G\}a…L:kvT0_ <͕B;-iyܿ?~~7xmۚIo٩/\7~D2U3#1uI Mw-^}ju@z ߴ͟~JL~u%Lq1½/ \)"eBEcƌ@C7ty'`zӎ=ѣGYx1n۳1o f#°svfxD"w5;?k~׭ëK`L^[9ܸp,Z4x0̟O^˝?p=+WL z-kNZp0׮]̈́$ >ݻt*2[fhBY,ϧ]@ɿP6,oV9kbvXAr\!'37HcwqTx+߷o.U?sbWOO{!F?^ZSٺd .^ĩm[ΜЙ3=!!Ȇ>_{͠V]u-X89eK6Q >pNl„_#ʃ!uʣ#ՕEץ ٗ5k _MTWOu>gXXZWY.k;6U>Utt4/ԩS$''쌧'};sL6l@\\;w:ƌS.1[Nȶnݚŋÿ/T*|'Nwލ6`VAS 2GWWzA_Q$aWañut$jn&yYYFDhNIu3{8$]?ho^EF6t(/ZDAN~mESR0^/;`,8^dvJ 998_SΛ!yh eCϞ\nܸ N9r$s̩4g}Vnj*݋?| [.ܹs|'9r;wкukF͇~H 1^ccڒY$:|{u?0F@kզI.Ϩk6kHmHƭ[V}Һ];v$`} yS. \~x\Sqhժ:jwM5KT*_7uI jV ڗvewuYZ[gT׺_Vʷ{;j~,?u.9U1/Н۶sYupS|1Qk0kXc.HUe\/u֭9j'7o&t4.͠Fːz.TrrΩesY}qyrrr>|8SL#88۲bҤI(Jbڵh4֮] ݻk[:r~f۶64G}ِcXHc~ԉ˗s̙F*[QU u96E:9{,>,n:7r9k׮eܸqzHmyZjeT*9{,IIIj̙Ø1cxW͡CPTF]40<ڷo ^Ru^WܱcFMWU7{0{Q rs >NW7p4SSՓ'ٳGo9no%;5&h&H ֭ǣ(,$?,{Jڜ:nDe{O?wJ+TŴIockHZ*+MQxiͤE8ij:j'`eccxgs(&WΎg,a矓 -\ȠSNijzĔ6žU=-}}'bnTUO`9՘ǰ\V^~N:[nt֍+W?fp,uؔ]gGy7\c*orl%?6}Q*7 Jy͙fGYn/{vkAHHHw֥八)Вdp<]}r|,tRKkVhf,{NmΆ77m4%߻{u wĈd2yqqqʕ+,Z̲!.\Iz3.0}t6oެGHNNʊ[`0lذx.OBBޓ硇fѯ_ 2]ﻖWLL&1r/^\eh{ec#Wxb5֭㡇0hWml>/_ ԘmO  BZBwnfʕt6LB={gVI&waKKKVZԩSQ*L8`6~cȐ!\r … j5D0+ Bω?s={2̝ꫯضmn"55KKKt£>ʢE'%K8r8;;ӫW/ ?n ‚^z^zIj,`VA_s'`-\C ;5*4M_-cu_RҪlA}nݺ%TQfXAAcR!lbL_s\mOfAA5x9j=E0GUٿі[KyJ^M6n(  /N6wTjѶ&0.Lf$]M1Z  4qe]lbrqFXLSk'MQS YAA6kWh֪gVL$-vvX Bg+,KA-s'٫\{c3I0kgk)-ԏAZ2;qL4Ofř B5t^RAhD#LX܅A\~ В9N0!ά B#  ά`J& fr9"S,ZٓE}) d>!43)ʍ ^l^q!`2{+|8v:F$z3AOG3wfHAfAAN r#Bc  'lB}r#Bc  'lB}r#BcWP  l'Ds'Zfͪu8~0,B#YAA*P4;NB&8_SM?y͌AAD(ԇ(7 4fd쎝z9vμ3yOLC[ R_Kɇx&ԇ(70klxi9)jj4.Ćp(.,{VkAFi͍3~r;7oós.x[V[.v?y`Mc#(3ߟv)1E͓DTb40$5\w˥88ׇCXZ[#B"ޙ5/;+) bjjb6*g3(,.1w2+Y8›v4kEl:ᷛd U\SDFFsv EErZrӝA2`@̝fǼF>ډzd2d2J$q]\py3%Ҵz?F{BU^ ~ZZmzπ.:6k]žZe "&@Mnjc$d2n_>_D"1zzMuՖXJ%DRXwjHv<ܳ-CH6w,%%e~&55Co;9ܹCLL,%%joڝh5Ef f9whGһ2䤤V̕F0lKU^0^:saתUu`\7݂plUq1)Wb) /#}˾OdUq1V66&Y~KҶD-%zV^'+?uN!Of=-+IDAT{38`_'6s* s=o$a)>nqXz趙SX7|ܹSz+J IިT*jT6_f fo;٥3OX$) v"v^5.D޳;Ybc39nl_9|<{{;s3 \e`ai?¶jD6{S7{{e_֘v+B\>t/B;Oҥ䤤jLϕŹ]$_BavVvxz܏sg ΅"j,|l J15 )R`y6}J+rRR8n#iqDFՅvAAO}=]qfÞ{em znjwެr fq~ 3Bl`@ FuߛD5C1l HtO˼y`Nm! qu\wkc ]Wp|@< dUj 9zƾ7c XwЋ\]0sg6/Qo k]LGXX8_Ν,--h΃9r Rݾ} ٺu_&;;T>>^!4vBv ??oƍF߾ݍ%Lìn"+[[$U2%%{8sV;έDv~Vhg\ KoE27Ϟs\=r).GQXHJEX{@ѐ|/h/o_ۻAۡ œ\nD.JurM'Cz9gwԛVOj5Ү=!j4+쫴S?uAdg ZoMll[jjrsrw'+1sa*F,=G27-KjuIZ5XEo~=^;ᣤ'0+hܿॻ 16nrfGYk~כ&GOVmy"uS)Q7_s:FLͽw;''MZ.*^{Kwk \4C<5ܵW\)HVhdō,u%"*[кKȸ 'GRE|-`3ڀv_z5^g %de吕TfejnRŕ+׹r:3fLF#ìl@m 1"x٥3^Awӻ;ZEA7ΜŧWOlv$*l;o^$_BBdPz,$R)={p=/^»gүS\X]1U~۠Сoݐ9`Tpa#cauZ]T3۶ Z8l(NNǓp:JȭjO66 IΉuPTX4aȔ ޭ $R9D]:%t<ܱkLAvv%)'h*/N]ûGww B-͈OK sr$YٹK윝 ݌v}'MħwO])Qzk(mvf{vA]PW䤤p:RaS&Rn2>CCeS2v@R$qzwKkk#P}WzRQXHҥ87t|@qk>{.g15c!0ϙܴbӋjEӓ_HV gϮ^/lL8|6n s.qp#G"?Pvօ%\rR@vL8CCeS2-4[''&OC]]cKCkc ]WS:>ēb9<ε;kҥ^*OiT%YSzĉ39++K$ "9wr' #],+8:3ӱіㇳvh4N8Ô)Ms i73~\ؽz5V{J^䦤2.'dtgπzT*>]ҋUݓT'"d\ӡ'I1@Kz~n߉R.'z<׮kPpz?F{R}nG5si rz:wMM~:8=߹CnZv+9beM^6ئ^S\ pnn.;@zOt{ԝ2.B"NW+Xn[F؝={9δݱNth3vSGUD 2 "(y#\% $$s=w__~ֆRVgԴY#K ِb0w:[[pmqsK=B&a|X(&L@Dly&r4b)4K_;sϩ9=ļ<ı cC: $?\iFnWu\ꁖv",Δ[!>&Ӧ#kk<3g˨oP<% D]m1v<&ۯ7#{? +b_r[o eu6~Tx@fo] VB}^~vjE`T䳣 5b-HhC.4)$mƗ`^3AڰPCܣB٩bKk>)I^Nf]365F exK-)daw}_nXGZ//vooh^[#\S,/{xB-ĝkU(=q~ vz޶1o0o.gJ#o,ίɘ2ځpt'zrt XbvXZփ1j)w:rN9}eXn&o>wkh7NW{mG-֯cX6YYPщxpqqJitq);j5gDu#56T@|ghP/YIzpn@ Bbg@ɱh L%WPUXKQWa+b,UC#|U!qzk4aYW^oqLS$?[x|qIJ#[}:9)=B!jz5i81#cļZ)X-.} RӃOmI۩Ov!f|LaɽvS8Ir⥹*Jqd {Wfkg9vXC-}f>~{כ\8{6(㋵q<#Dֶ|hB+^{ؾ}7>-cqj0||4ZIa۶?…8q"%q׿ކPQQJ~냷BK{Z[PUuTTdbךv|ϡE@x8jܾ-C Ӧz{sY^t{^ވqDPX/SRG0a( t 4Ys5/"A< Zx=&S?6gGwtH\ )=-r6"TThyg pB!O%7p"\\]Ň|9O{|&CW+xC7`Wcy&4$g?5w-I#e[E [PtgB.H{fXГs,9֎=đkf]kE'gMzS}h4jlذ[|;C^^ds<<Ux|GэEP^^JaM8^ E/͌u7滨*4\/E~Y ގ1oy`MPQ#~ג4bNZ%[JnG sʹvSkKSH郣Oi];ǿ   (u{qyM~'OEAA1jjj  < 6-^}e>|EE%hhh+'"-mOLEeeymm/bcʁ?Z?^{9r.\ P(AHH c0uˮԟq(?s7(AkC#ښP(XZiC KD˯pjmZS"naȯ.;AM&ΐ<0%`LIF#xb=kI RPxKwm`)z @M+hw'4Z-&DD`Zrͧ5wюÌE ^pZD9N_s(Qw!?pG\;wu/Gkc:݃C&!*5bŸ1o2ļ:,M##eU$,!0];{`^B\q,9V{dN7+r'k.L…îfXqz#;;#!+W.1{45VZUG%eƧL!"+Će+F\y4&)$`ͬ%IIIϱRUK/4:yǠ/)) `=)'[PWuNlmfDDDX%9oto=sd 'fc7D4fdp…]Y\XXCfc_5+ȊoDDr(wv*b_]OzU~:q=YDs tCgI|#rT55ޅNHH¨qs5v[^iO;D3!y  nj]x@}ki,%""""""kCkf919f0KDDDDDDNY""""""r:,aa DDDDDDt~~~ """""""K(}EC0 gGmA8o 58a {sm """"""*,9RPyBIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/images/voice.png000066400000000000000000006255351475757676000236620ustar00rootroot00000000000000PNG  IHDR<BiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N3ϰ`0 \`0 tN{r,?k`0 P %@A `0 C$ `0x%AF0NCԢOUG͜п6ٝ_\+1_OO'}~^d݉/~bdC?f!0 NX`kM⪃'2r5BAA|fIa~^7JN//ě^R\sEo:f瑘#g,a`S: oMɸruK'L >4B>[:o5Zgig 7tK h9Qs U K`0))x Xx;HQo Qa/r(q:LО:Z[ޟԪJ٥EQXDH"+(r +8p"Ml;]K#" wz}zv)Rގ6f ΋@Q_T;%eoZ-*5Uu֟il3kU|1r oR^L2U K`0)Y l`^o7O^~(oRn>p%zմCnxjOHhAyx#"j@X;wG4kw,zk(갏otj ‚<,KHtӌZE1PcPO %q;!qazŸ{js.:/T--ş42t\dFR)JטμA5)> oOoژ>~^.tG > ^ociMe>E:潧{Gh*-ϨiHP ZG/DÚ5/L2oʀ;բI92/LmR0}\_WGK r +U*M z8av/w"IvX*7׳0rywF Kܟbݖefbߏ}qqzwgIIH716xsL)Byrƒ/Ws\tjGh]삊:#ݱtsxߊϬ$w}PU+vu?u PGǑU`bl0kBz78rPOd^z l8ǽٓ;TPRmjlK2*5ӯ=NL+pt}hf^9k/W7r?۫ _W\BV\q71{p_9pgͣ),9q)!5^$54ws?uP JW\uBRIؠw), >Z8jGVИ^xƣҊ:q(KqySXy?kߺp#51obbk[x̡PU#jiZlC\5ԧ6]Ӑ%;k~e쵤}|ܵ$z%PTzͿ~O,m[N?'RW/Ц D;^> Y34٥yŕ M%6{CPўiªʘ0[6  ; EE_x8Mwr%)|7惬C-kHlR(5' rB|-x-@^@_[+Ӱ@DžY 42п aĀ º9Ymp"AR+ՋQ}gkwl,3l̐-h]!\L ibPDF (C*_!9qD#B8Orx\ßieni4;k2h)v)/iںFԕDR20ՆbuR Y3Ubw*\-J[:e\A_|B`wRi>`AOCz<(9r˃V; }GS-'-[gmpU`A/)0[ml=};+z m%ß0ł!ȁAU 88z^픞-7f嗻9YqlN]I/v7ww-@^)OU*UeM1[=-Qlh7wR?.= +-* |hy|b`Yݘ$I;4Eber܁a5r|Ĩ?珞W/Ҝ /W?{쵔E(yEU?~ J|\(oR^t1T9edOmB>Ij6:mV0˱J=(AJ=]iv̫]PNV4BEUh+Fz@&orԲPOrƆ<_;K.z6b=A^IEuF%(AqYZKF@p" ƾNv4vkkڬ/AӐ%$G(L$`5u_@ApOQ;l{PtV8޿`^XēN+vn_,1PkzGh֮jGh\*@aXmz@l[TɿN27f FU! FȖR& VbgeJу*ce^J5zPw˄O^`w¶vWhOJ{ŀhZ<*k9e es^711gFX1o6UWݥj>&tj+F zV&)O8ìg tST;2ERcyf ˳x>;\>Y(jXQ[h'+xzl9iwAaa_G`0/,5_{-<ZB-׊v2Ջ *bCSy75t7ojR\4"&K|jIY'hSj SR]TE((ݸ" zסּʤv:u/9wXf&ӼjWBA }j{S s. Y|jaUdfaflo  \QԀ I-7Eͬ oeRШ@>oH <.<){h/6OI1$+ X!AU:`oON/V|6rf:s yX_G`0/,pli}q$5s_-4tWyl;GQ=ߡS٬T w9\O"mB}gCt5R̿fhgfNS >5d3_p')/&$a+szA(RshʄEeB pt}6q POzSbp$I]yn&Ong='"؍AP̳P`r-Gb zW3n;GOoq9l B_YĻ󑀋{+d5|۩*ujk?\scj؅ݤIyzO/ SEWQdCod]6{0==[ }n%(oRqJ}ٝkxPh.,LxJFt_̀~umkAoKOo]57kqvFnqT02r;ي HϷN*nq9N!}}ZmQk-L}S'UR@ ]-FBQcAi~@ElᏳR3;Lޏ2YBQAfl-MzC-cC½.=%IɎ`No>L O{)iM]G$pZU~I-'ȕXsh}_,uNFvAX*sl̜l(gG^SX-<=';m`|2@`r+rJJQY]~IM=zsj*\C;lhs:ۭoUEi6n^.V&z'V$67;$vR^f~%twAaa;qenn^~WSp`0W*wTz `0]'#bѻ\ho Qfم[O*̰O ~a0 ;B CH=.jڨ@`0Xc0L&,1,r yDe`0 `tASW `0 277ǵ`0 \?o?6`0 `sYb,,;#3j`0 `3l\ `0  `0 %}~)(Еխ U[3>|xR]{EM7! 蘈 4$DӍLJwgnܸփVt=?nB 1[yL.ס⅄tӧO=<}:>>LPXXXL0wmfx<>6p(:epp?H?~<?KCHϜ9s۶mgϞE ƏojjJd|ΝM6555 CZeh!** -_~ϧS"?dȐqƽ`IM#G={6$) pNE `0]LJ+Wŋ*ʊ{.Zw\}}}dhРAsA˷nݢ(BQTll,p8e˖YYY@rr}5+W6%}m9K|e^^փ%%O4hs6mUP(?~Y[[ZuϞ='NRѺ+W<}4??^*r8 //~D꒒޺RCHÇʨAUUT*U*zzz<ёiJnddd0 dr###yDRHDQ122rqqA!144:ŋ'Mq ndd>ҫ J˻J,  $$2̙3Eݺuk?:QRH'˯]֌3")/hFGG,+++++q?f̘_JR/Awލ㏻v7?T*}L&c* DߝE+@qqqvv6s AbX,Zg}C|[n=wZ޳g'Z.--pBZZZyyyccCpp SII… ?#VDr|Dfz16Km8q͛b17n܎;r,,,e&k jN9nܸu#22̙3puE|JZTTD.3k֬sSur!IrΝźR>A[n;Sw iN\P$%% YYYY[[wsڂ;翩)''kccB׼RT6;v, Z"R8p“'OfggK$$%Ivvɓ',XpAJ9sٳ'11Q(*ʦ&@pʕ5k\t _W={"F- ;6]k~2wD)ی0Zh/AO;w 3p@@(//8/^R$pjY *eTakk;}H /%:jeH$ꫯhY>}tK$":.<++KPŅ ΙU[YTTD...9"]]]QYHsR1|矔t IDATs4G#r׮]NxyyVUU*ȑ# bŚO}m۶MMM}||x<^mmm~~>Am5;88?~'O Z'H>}4,,yeG Z|#ASLQz #_3+ipp?aÆݻwXkEϖ 񺂯Ν;.NNNoݻߊ_ 5>E+PR>}Rm#˫в+s+y*-w2Mhtms8D<#iq#F@<<4 pz{7Q+/j~ǎCˑ"m())z(oK&111ZNbyyy\>˗/Ϝ9SxV@i]t(9HCQQ2*++I733׉B Bloo_[[[WWGxԨQ]]MqrrNsssC$ CCC4~jm;v,˯^l2\WWG{4 0`5k92{lzn?O>i蠟OFO>sLVccSKʠjժ??#8… Ǐm3Bu׌$'Ow 7< A X,???]vDBZ龐㥦2oa077~f̘1HċDx4nЫW/L[ Z>ollndiԔ\ B20:M^8p̙rBann0a„6waX(G vqĉZckk۷o3fhо4 P4`$o޼xb-;()СC_QQP(Μ9!pݼy3r-prrZvv$I۷Çׯ:F :!4`llleeeeeeddbbqvvvCCTn.♣X,VϞ=mllbqZZҔMWB2#Jw[rssU*Ų100 BÇAAAuf c4իA_oH0wWiӦiaÆ6[XX;΋\ k׾HGަa@-ff9r1,⻆s߿=]\\6=-OVTb8++h`_jjS'Zи[>:Dm KKː;w$HnqJUWW"^PTVVe333a(4DR233uˣhС h3<5jhz2^/踷hccSZZ bV{c|H xLg8tɓ'~tÆ fff:W @zA7-!..dڽ tȋ 344D"@R),9m)--?,~t˶hBhhh'?رcp'ի{dxx83w^ؗ/_5k 3i8]hh(p̙w}u7UM㭏go/í@pR) &ajj`aa%v@͛iz̿ew|e `h}7ON9E74W3뜹̜AۢRE nN{s0_ku%;D;tT/o1ǹ>z'Np)SЯ'7T*=s [U"+Tc R@#=<< -JRc`KsP(dž rJݚq'follܿ?@WRYYY^^fiibI̤atsoii񐔬( yn#YcκVYYITWWue@B7a̘1( |H>??S>}=3?cooo4Snn.lŋQxJgϞ~חԠɞ :: [N' -[C,0`k+_*m56&p#ļTJKK缋cC|eE|3)/_Fj-43/ m)..r֭[-,,Ӷ6TxrGR(e5Oh}PTBP(r8 <<>ҒN'|'xzOqh,PґtqʭQF/pĈߥ.] ̄+77)Y,ٳ,XMfdd}v4;D"aԁdZG]:4yFs]Q>bΚ5ʪﴨ.E$+*bݺ'8ww<ccbԒY [cc^LƱGEUΝ6+=N߿7 LLL,5̿uuu ,ӓ~fddd2fT.۳gO˫+((J>>>g/,,(R@$QebbٹXUT>}R&+ޗnX@@ zԩQQQ -$)6yzzėƂ0 PׂKKˈ{ieXw}w/^LMM-//ollDk;v/_TXX(Q={FEE1g6m1xI냂oܰ򬬚`>/d疔d4 K&]WcСUMM>>_OVT=^S[YZ䘵yj뀙YMMMiiZ,N?~:/$ SRR´ GDnn1H$=244x2 Gr8ԐNLi^Gx ss'OTVVbRidddoo0b]g.zzz555IPX,yYf򲴴,))W*\.Q'R%)u򭬬H$*Y[[tswItt)]\\}-SV3f̘1cFjx2geДs~ʪ)%ŢFdN?7o Z}ÇVl/҇R(+W/_edDҧTkBCiB:/>_RRlBQӉ4??冄 wkMzzzzB,--;a|g.t!C 2D---[tX, t Ecnn',*6xoo_o6`@͞=8mZ 098 89}C^u+``@]t$Y\$ 8 ݻwCCC]]X,puu(J,'iQmuӘ(HzJwrrbn#_逈`0 !56rAfjnn JD/+=Ǐ`l.Of_f?Yb%EbWFYZ60OKcbbBz(Ǐ:88 7i5J==󑷇Z46 T*U.J931}b`0 =_`gOуf{5hJ3Kel<8.yРAU̓׮}2rdE&I Gr1zzzvvvD&!YP(6-l&B"eXmD"| `0 ފmVVM11%xѐ@s5mmm^^^m6 ^PZ_Z)//\s \:<<"zEM7!?n? O~II0n\٠A/R:;71`0!)( 5`0ߏ/7n:>!FF>fLܹM6=p0,;P0 ÇuoioK#`[#o`ڏ`0 oFx|5_.L6t9鸨I/%%%\gU`0 ƫb_~=/µkת[֫;c4:>$x `q(4G͜9_all܉R;;؊t<6 #i^Ow"((֝yޏ$/A̙3祾bu߲e : fffbCj_ๆ8-񯕃{m%)QÇc0V?We#ݻG_3b0rm۶5*\a~m===\94/oyW[occ`)S/_7nZ>yi`jjZWWp#G3gLb#77W"KZZRywЦʽ{J$sss__u@bbÇsss\npp{ڽ{wLL̗_~gϞǏ"]H$O@.'$$# :8I׮]KOO +W|H$%%}{^~\.?tʕ+wmggаm۶e˖ܺukNNN}E:tYyyo4i7;;{ժU˖-yT*T*(**Zr%LL<۷'OL\xE755i&M:}4l޼I/'O>uV#FhNͯWzzzFF(X, """MLT*JMMMd̃+ڢÇİ4DiMb &L}ŋ}]Z\5X|޽aÆ;v0ޚ5kR;^:2L&&%%Xw^>@>},Yrѯ ?vĤ̘1z$TTT脈נJcZ4B!x񢡡a& |綶'O<}*D"!̙3ΝSE(>|رc۷o6mڛoРR'Ҳj]*Jw .,Z( H,G }(jshW`^7Vkm~z-:8vҥȑ#&>qĞ={N:չXuNO1;@Hħ#"""\.a*66vҥ]fxĜ9s>󊊊m۶1!GE|:^'RDhё(\ IDATgggghhyMM 2ףNNNG9C/Q4Q߅ $X,s\5[|Ǎ믿^~}„ A\zuĈM>>>hA>}-Zk׮x|`h[{dd˗Bۙ*J.]i&5mll~l@8EyfƦ \Ei6YOׯS\ALw4-(0 |#ҿs=5Ioˠ_~Æ CocbbtHċD/$͛7޻wOM'n+%%豧<M(;w={`ٲeᓲ)x$|>)++S(HWVVҮ/r͑GMYYY]]mdFFFra@Dwu8l׸|ΝZCCCWWYfE6qYPvn@ 8p@rrrSS[o6TI"ܹE=WB"=O6Gڋjرp ֺxw&}533ѣ ɯP(bbb4( FGƍ...&&&MMM΁<@brssi^L׋Eb%$XݺeɯW(8&&Ji~ǗxxM*T7 l3(,4vteg7OygIݻ}vƎykʕ}\|y̙tH$ؼ<4U|~LL S _vА _~)S{=@ykn߾24x`;;/~';wD~駻wN2M""a344?&hIuu+Jɓo޼w߉bC,::rѢEٳZ[ɜO>.;pW>޾FSSSaHmD"$'R)|~hxgg砠 '2illDs{1m"o}g6|zg]6mz_F'sss/r~ઍwȐ![l5j~׬KJsrL 2)x^'>CC =#lItw=]H禼Mmüwb:H>}|}}):q˞i۶m۶mޜ9sfΜI744 "..ns%o߾i͚5k֬r $$t;v;si4&Mg)baEEEj3SD"c~~>,n&LXrGEk\++eײ\ ԩя3L!4 vpp˫( UssskjjU*dz?G9m```vv6fwBW_#XK|`@yƍv%p8:m[:gΜ9se_O`0xo>+ޣ>' X,rs`Ԩrww)z`cӄy>~cyEd~-\zuJO Gp8C[G}7xݻ'JG<3NHH̓гJ=j8===D&& w?Ѳ֭[|I B LѣGg)SQݫe^~~~Z԰ċF6nܸqF055wMcnn޷h@0dNNNg y<3oরdժPD , L>) i,3d>0 _eee߿? h5t2YW <&$X@߾rCdt mv5 d`СﯨP(gΜYp;ib92b4ڵkH_vV-nZ4t;;;$I?~<&&F RNdɒg>|8E4lbrՂaO2EWlR]nnn@hl6Qra^AAAׯ_]>yA ፥Rķ-e}h ' uG33H#CII77֭[?~b \6r7?Ξu ::22~_`Sw-4#PG}ݘ6m hbǎ]{j$9TWxx7(%G޹sgyyabb3)fkv:{izmjjfGKaÆݻ)))?L&5\]] Iupi4b̢i5 嘘|wϻWTTEQ8:HD*?{DI! BA@D"w`׻g{ˁ "6@JH ChgٝٝfBFxxR˩Q7yݔ)2 Ym֗| vvD .NS,F tGĉH% ȩ;f88$'+X{$=vIde5ve,pZ" A@'N<|XXH$JI7モrKP(3gΜ9s&ݺuk$JCҌ3͛pjjj2wv7}j%bLb~}rFkbJR}$&&JVmfk[9qtGRH^'5]ٓ^ 8}#+Lܵ?y:c}xiS #"**::Gy=vsF/lp'UUU͔aZ>xx񢾾^FBInj|]NN,E"ϗS##;wǏ===eyںS'Odff6 {ܻwOQQQR˜L<Ճ899UVV"ɠsTjo|`2]FN.Mj6y9eLy<& _+xXodİÑH8xٲe|;?O0IHHCð7odff:88K]%LY:*~G/_ LOO/((חq0E|MM޽a_8LrrNN57ghh4.?jq8E})8GTBr޽(m۶!>Y؊ 'xL:8\^r2L()֌I-- }^*=.rcfBK$&&~qDa 8/A؎#ޫD|7BZjUng6.,`~~o*둠3= c"ˁ820#aл"~ 6j^߹xb`` lٲe˖I>}ѣGul믿º" @SS?ċ˗ \ND" >|ѢE2\r%Kڪy,bddtVOϚ5kdʆb---OG&ny̘1cӦMڄx7-AD#.G@@@h,Y]qpb}FYYtж t1̸Ç;88 : O> )vҪjp1*?~GRRRjjjrss1 XZZN2`ಲv+ #"" X,V,+!!al)Ç>|(F]v`?` E˟x n$—KE7B)jϞgm=`q|ZhΒӧK`1:pvvR###[[[qd2 Tvmmd|Ȑ!$Cnbb m);,gK`VVV>>>Ç s\Nv"PRc҇Zx+3*//&!|h{WR  l}h hbЗ~2}tظ|֬Y-HLa #PSS>J}VҤ8X|u}}J_ X_"-{>- g9Db˕ mГi__(4=@Nbb௿Be}Fzdd}u5@$N\VMGpn͚OOuO׮ʕ5ŶZZIb01M쯿2cbq˗xz¥ {>bq8#&^ah\o ̟1yr;Y*"@ej:}f-O~(jҤI-:T]]&55544OKKN`d2C^^IJJJ^^^;Wp8m-mfΜ٩rvD"QS888`0Hoeeia0~-KJJi4Z||2szxG@@(""P(ܚ C J>~D"kk4S]0X,"#2R$8<3cb|>xg|xB1**Stu~=98Ś:80h츸/Stttvm-6355 B;Y@ Djmyx? OuAxd2mv1M6߿_$?~\f?< jժ?C(_^SSFp8xU|>cݒ;w헳Ȭ>uTΣdɒׯbo9_3^*W"W 6 .h!HwZ)"r+h4dDB>3g*ˏS&Y<4+\#(@,m|ZcqӣP]cqӦAb1nOHHu||HTkjZ]\#b7nߞsAG߻G2d]n IDATв"íSQWUWDT#g@~>R2,H$Z[[/ZhذapiӦ`?X,v111|$4MsS0FШdڴl2##Gleee33ٳgRRVVVWW1cAK"GG74P( E|fGRß;W_S#Jm``m prDN]: @qz:/IҬ /g13#R(,:}$ sss'a͚52fL6 XXX߿s:uj;ZݏB\˓2eepwwQuM6D<UH$R]]R_7ʪ_Yt(A#&M?dw<@ Ij6\J$+UnZ1)rsJHM+Z"gMׯ}HˌˌCИ4dɒq{v$2g@@@tl̑! 4ߍ08)ͅ-[T*(Ozy074 =.K22M6 ',-Kp x?jUAJJQZZKP%w1'<rxAJ~>Va>xb1"tŷ~M2ݞMf~tTjx"T]TTUT4sFc;;YYy||ʲG;fe MM)::"0- dČxiˑ{k:` 6o2nXD":t Q'傭 P }~\Nr2ɜm===uppIf&Ut3>:j̄B<~(yzgd$%4 MsFD,T1-YEW\L"a݌. m0|Bdj(GʑvȺjiFIZ۝J/K<@cKgx55o,w,'In#bLTAQ6-#- .WUV}.8xݒ-oGl= .ž >氂?SvYAy_?BƮX4+l(Zmx9-֤@6_ٻwojj۷pqm߾3<~HXޣ,3!%|~ARTXl&K}ܴR93C 茞=[,fffDEh99顡KҠVW&Ü9.aaZi-@8N$MM+6Q_`ٳY"2Դ'7jmm˗_mcԐI,CLḺcǒi4ĉ۶m5=?>-2FQEEpq& }9["?&fZkΆwV.iQ(uh5oAG(lZp8׮]f0&&&}hhh͛7i4ի]^0~!Ǝ+?**yyy} U=2"#^^^GD,+)8̨(-J5%%oJKxI2޴m %K ָ2 &PQJ ,m'NthӢZxIJu]7QQwp,:=۷WA"l?}m{weA͛FFڼNR0zQWV`ŢQx,AfR@FYFVrA-^_۱u>Փ'Ofddl޼Y[[;,,lǎ.\$%%Wvrrz/sssQDL"BCCeD|hh(J1b a{i"֭ZZ:i43߽MJq8 4>nHⅇﻐHVVi>Vl>ȍF% C$óp 24o%%O{7=S_<`ѢE+W`0ݰkG ={l'Loߟ " N%瘹(0aakqzkS>(Nj޲eѣ+WovttY͛7۹s'("|XCBBLjSʔŋK~ׯ_bk׮5l2:E ܿ?3fH"~矯_pq]"O_aɇ::FL(߇}Lbi₂sN 8ϙSaW05} M\'VXR }}ɡܷo:8|59x;wJJJX,MMMAU̒%K.]rO~3 N ĜFN+P(5LӂnhߏEDX1*H$W (##cʕCFlnqgU"EVpBzyy=|0""bْ76AMVo޼_vr]qsiii :?GJJH-I0gH5yz켼o=k)c, ..:rdhsu~ @c0 :Q&% ADGG|,{weffJ&%%>|XV^}5СC^z'֭[R'Naaa]M]A_t@Ǐ׷29vD$Q?Je1X7=+,ii~jxA(-2rwcoݺeiiAP \.WMM t*988y\{VjeeyU--Gb0x iٲec]l\UĄd u=# mlL&@ڜڦB/+ 8{y:u_{2/-?i/=|Xm`{^0XƆŠ SSkJKuue 133-HII XJE"_u{ӈP2] m[7҇TԑR S>@& @CCݻw ,{+@EE%--MSSsĉ/_E|aaiӦL&sĈ{8qb^^ޭ[ׯʆe/0@nac}05055+!!ڵ6x,]X3098H]44dED ut5.\8鱿{$tEG X, VTT$RC< Cz`-ۍpM`N4ҥK+W UPPhkb 49l|)BDw)_UQAY93>~ގ!Vbs''8Ÿɰ1c>%&/YjXfߍ2*GLI6IѱJm+la/!Y WUPP[^Od7J4ZSƽ%^ DB}w-\pܹ555?@$IHB&#' Ivvy%";e SAҪꊄB!ST*(@mW/BK8|ѱТcE]>Ô3}4WRjgrZd3$)svkkQzx<///ONN^v-㵴|7o3+2Dl5ܲF 3f @$Q(!N'}9k2MD_+98]C QVSjO;;ut1q@n8XڲEz ҥʂҬ,] kyNuG)- in}ĤIz];ڐ!bk\nRSK77\ p\niffN eS(*BxXzzz[~FѣL'O$Q(Anrqq)++Ԯe邎֭[&cǎ={vȑw V=k9H,z~3ä{G/++))Hɏ [, a.~/I||w؃ҿ>WTMMMMMF ._Z&$ٳ.WJ5udoOqz oo>#(1E2Ç41/h4Htuu]z5=z7o޼z޾}'mꪤt]2 {,bŊ;wܹs\.ƍ\ "^ѣ lzܸHHXYI4>`puNXŋ,6ޢ*aŋ6|q?s'MׯGܸm]u5V2dؘ1-#EP(@TS44p>Zz}^zUSSsTK.YYY]r%77@ L8qϞ=~\Νbp8۶mȸ}vwK.]ڍ5vPhob FmȐ.\9yݺ!/)i̓aKiIkNVOOOQU>cÆ _7nӧO'NigԨQG~#G`?RKGP!6;-も-YL&ܾM˃E|Enn˗nnb&Bm+ZlZp_}sf'M; 6߸ɇ-:pBJ 1oo KֶɓEh ''Ǡ^l}:~֭[yWFC#%dwʂ߽'KpE?qU55||A~xvT.za-H B޽{QFp8A"vjb"xyN( %Y]Lw$2gXgaZrceH"|-͆/XKD|g'6d{ɓW:<5,g^ΚӧEl(xɓti:|E16m$sNDڽ{w˛ GHI<#y߶]#3"_'ڄo_bb""1XC@mP(YY:% PvRAJJ=i:uzIlGNydN.VRH?YzY~q813g7XxH޷_a B/M/BDBylr%IYlmy9EWwĤIJd2+YY?64XNu+4 INkرla3C,";j5Ќݻzrst"GWIL4\.q8²)-hfoXXxqyN33x_{`E=z,⟟?O52Z{408b. !@G޽W9LG@@@@D̬ɩx.W@*ZZ$mm"Hߴ]hLS?H(uӧ<YUX(8A_{APQZڄ% {*ᔖ6TT ) |>Cc8UUpD0b(997&'IBFH-r율( E577uu5pp@7IqnC϶CԴYÇOzwNGC[[{'+F |NRmS@bq}n.3+S^W F/|ᔗ322 4d)3K0@1NHnݡ<ߨ0\6P,)1Ecƀ }*R"N'~ HLqlCk5O]GXcuG&K7Wo0; oGNY{xaek+Y:ZSVV>j@>g3a/bVV*ڦc,0M4z-<ؖ6ї9|,\TX DeyJ$TM S_ύqYRJnȆmlW* 11*S'5tfظCfql6p:"{'Ȩή-. 䛂"IKKM_jnmi{BviiCy9dy<@VP@8UU ۋ_FIIEVVunn=Ʈr,ij5lYWW[ s8aaeiijAC$7VhEEIpo IDAT"@aRRBiP佳OzH}G`9B%WˈejWo\gȰǰGzmpXu^޳Ç|} ?Įݛa!Yᗨ&$q,.D j_jyZGڗe\:G8W\ra:e3;44cO5yݺv7N6%>?_0X@@ b@bqJKAJ S16z.77&&7&Y^ފdlvmIIћ7US7737.o"aX[@bRfBBPûwi"Fo,$l:M/,L{DJ_@IwwX\:@А5(UkikrMHTIu::F}v]B]ᵪ1}g\hd8qIKfo`؎Y߇)*: -P4Yƶ +TTr+>IoypG#VMfUcz8h$ZEEB_qc,Xի"'^ZS98,=rٳ/.\ kiyvVSRFVV.(4F$WgUl559lGTQQVRfsجzFmmΧ̜8EYHUˠ8-0,,fc3|M|x +Vh._mۖ7Qh,Cڜso>mIIf~#(+Nxى+7n|s==s&ㅻwS cܹq㎠ {ڵ_ zxdzT̈́ N]]Zd'v]PPar†6nCCnlln\…ݞNٕ e5*܌OPV-J*l`L3YY$33Mg/WBBlbi!!63f{xtt+m飦Y8rĦRq)3W[ F= SA4Z?(~""M,YhO|?)/ݽ aqvGOh$>8E3g?Ȩ/_FT4xaoCbe_4k؅s7CX^#MQoY®մhU;d؎gwӿs$=о{U{Q'w> gB<-dr2B,;vL`M3=rDO;OO;HShuj+R@2vHv[yi^'U|zo`F22qSVDUCDiRHelVS%>N65ո<^č+,m'Ns /ڿ#`ΝBϏ };l?g۶䨀Iill0r`XĿ}TLpq]$&&P(_0),5qRv|wD]N-&FjBiTbQʸ.'UTFjԕh.w!/~sV^\ۺuݙ~s[to-)0h^m~/ >EF:]55O2?ǧW}*O%K k&'w(:ƴvG87Q"N FFW9kN7_FN=P8]bryǻw v [Y iԬE\5_/ydzyb>IO/6oaƈ +;?w}=7qKU (~Y߿bV8vr?QձZZړ89x0u=s4V!MXUBJ 5@CW=T6'h)+ \ީkFu6-))#GP(#hyy3\y˗UW44^?|8z tg!;/_):~jX_zb 2fjj-l.7Ś 2>65Ul쩢 UBvmV]C@Pr|~3pnUK}Ҕ؋RZL$,V[ j:fMW:ZAJ_G#-kF"F)([AWWZ 9B/.R}w WssW_H,D5u4Z cZc̡g~cUp&BpBH$c0h,D4J,TTU~~('O`$ƽ`^{^߸A103F͊F<°oS+Iy8㔌4Tge3֝p>n`TDEƓ|nN3auFW AIi&fCe<4sm y{Uuzzh "/fV% ̝7^JcƈVRoj;WA5@*NѳbfŘ1e>-- %\_gᔿPe3yUEv#Ǹ:9h4@ZUYuBB\woe:zZyfs܀h_m[&Wvso_v#io_ٻOڷޭYY 4Hֳr Ê+W k*2g7b+m@ʅ@$7hٹ?bO.^p~ǏWX"{=8yRbSF/+c3Xna/ܺUUTTsWNRRuQcǸ,ܝpc}|Ǩʂ~~c55u*2}Nv~ ^ t_~Bc4cY_w~;|L"!ɦԕU2h5ut&/B$ML8-2FaaIIr Ԧ:xPhZ^J3g\bDS--EKϘ=i6SR#EܥK2 jKWWY'QcsvO(ϼ|=o>lXXr}ee'Za3,^5c m} ^@r@@mII^Tؗ7VWWo۶oѢEnrrrggg*?44Jhm\ ((oڴiƍ9yڵk=HX$J ajo_PR#~>7d@$Up|4%qP@(@ j*xuMw]XI%7ߜ葱SlԬTÒ9&Wv+!ѬU:6 o 4܇ (Xd X ʮGm!漁5I,V}g$VSeaJALOO,yg`eLZ(n>D״YnViY9~V ̬Ͱ+W¯^eTV*ɺK/;v쁟_DڵE?J2)NO?rwM^{NSeesp6.o݊UPp?Ib'3!ΡCzCמ>-qM*"f„ Gϧ _v(hF߱yqvqa,&O8U,@8Ԗp X5%N,=Z~IE{9tR!l6-:b2jԕtmTU8c5bb *+T^ c?s6ZP Atry| <^W%*BRSW{3DEK[O޹nI#!@ >k~/^XKeȎ0qqͫ# ;v ,--rÇoذqg# XCBBLjYieeeJJŋQ۳X,SSSP&Ν ۻwsss544Ν;w$v…>דdss;w*rȅ~IIl:̞i5}6-i F1Fr7Ab"1KRR }<:1L,S{0)Hl/?l}x݄9O#6aZ8A'i_6P(A;lߨ˱kjܾOaÆYY]^Xd*@$:vk6SJ*@Le3*ssIC@PljUsGoK)5ũ6d.H'v]е5oϾ}<:oi'FA!yQS`q8o]P-\[g'f yWr|4 ?2vPTICk(`lb]G6Y ߻7fժv P  'aqҌUkL*J 2R\'ȔV 5d܅wol|~Ubv{5Y^9y֟PQh@cRO3 BzBRT+PuAPt+mjnV_Pg|V]={s{OB}, (g>7X{{ÇA]]}ԩs̑|o;;;E|߸Gs=}//FDDnY ȳ VVVwlhDGDD? 6P(:$:E|^l,fhIZy5`(xZJ6`ɋ  B!X\+b14eƬh e oszO7jVnG7$2-cنA^TVLhFݒ}^  򴯴{ݻ{-̬,@U~Mԃџ2+ >jiMefem?}**254D&u<ܷoՉ-++LNP7 fw`-lp5dxtwr#3;PO^(WԓU hʵW.nyzԩm撵T5nW̃ fmMeYEhjjOzTr\#ۊ%Қ aV?n oWT3k,4 AKf53*H()Őʵ%y9mBBL]]ۊʵ%o #(ɠ}rr#|{ ҔUQQ/^8;;DFF~ٳ=gp6l`aaahh*񡡡VVVzzz_~}mmsΝ;9rH///;;;I@e y?+GGGPӧ[Je {m`0*?}jDs``.OPd7]4 Fa(4F1Bc`Cah AP|$q^`zU+RY'-hFԬ{A14hƠB1TD"Hu[rܸWDPrX3殜+x<^m6ٽA7Ep1X*PU2H$c+ZXTT,S^.CPKsŊꢢ.\ 6!~>>wi3aa*V_\v430]w|?3C ^IQg6DŎlCEA U%D zI!ݙ3?&ln:0ݝ{{|33|8VUe;aF7 ې YM#4o\?ǵ}FN;4.x(Ͼ8xF}S`2Z *o`PuJ:t0H˯p{5m3p#q3XB=ݲÍִPz7ՂG$-p~..pq0/O#S{ѤO6>(Z`ȰB{E\Q0h9  Z΀h9eᶕFc* w뀣lw!L}1Dyq1p)B -r]-4D] bCCCWeZmY#8Le__V LLL<ٽᮻo㞞NHtΛ6n-5tŋ>|xȑm&RCRM2eEEEkf//{8aooqu;́}@V?4eYaz5c78M@̾!_ c pQ)?7Y}@ug7 g5L~q=8 8YYguU99/MQ ׯc]΂U5Q}j@tR w86n$ON9~1cM8>̶ck'3ꉯ",>!`B]HsWI:K\J/  ױ.og@t^VwQWf^o"w 4HzEVtmDeVh ?,X^ȄQa4bh64 R,$;몢c$aD"L`d1//kmmSsrH ,ݜ0w &C!oP]nnZˬ8e^mE )HKĝ &Wll믿裏nٲeҥgbԨQ2l׮]nnnÆ sٳSLIIh?;vHKK;xo92PQQOogϞ=wG}Dt7e+e8$rt*Ba!r(ZnORa"1&b +R+!c @#2L4J Y9c mG:bq80i$jYc޽ðKs"YB+++AXX믿>9ۊ3R@.#E>mgk[)Y4~1B,Ղ $EH,suMb2OO1jBt uY)\ү @"8rZeoQ{I`=/ x3+l , C#Dшh+93 uȻToWq "g5z\ڑuoJeۜXD4c+_QJT)6A/`,fkF:DE"h)@(ezfe,5Uu?H$4lJd@fABGץT S %b$t:3bw3,\PdTGfX c0 h19]]B!hJI%}pF{d2\dv[dCQ;oEDڳ2c` ]™IOz3 0@+ܝB#cAW]2thv{'W'SMqm8$Wx{DrLe OsS-a,``${TU4{yu%gr5tԪ^YkJ}_YP(Z笔 Z"EJٷ[[F,~᷺~;(h5jD᦭8,r WWW釹|@$,z]DISd*[R RQ H4bXƶr̾zb*j-., \hz:Msޠ.˛!8AzgdjL4[G Fl9bf4?|ҒϯIYp/M4(-lNT*-$S9Jy060ӌG8>;ݙx|Ox_ev906⅃ bXVaYgo:Y=:k 4B,4JsVqM -W[|\j7|W }s͋V87 rVNLSp) ,fm\-sJ,پuSuUΟ~3@$nYj*܃b+:L/5 .&Ք|0Z(ݣ>;O6*kbg2EX-!mrS4IRY*@iTW%dDݬKn*dNuU}{79Қj#v ;@SBH ^ьB+,S`th InA(;W'=1|GIU܊XaY. ˲S8y*miDH,0&(PEy^mZoWpVg) 9۹M7CysQo"r!q -͜kgUi$~~p3EGwY~~.wN{N7B!_xwMuծ-͢j'tU kEshv#$D`҉.  XQzf ',˲J(;j B4i5j@ʹՉT4X6Lv*Beܾ ɲ`>z ;wssoqQ˛V+IQ4By9TIy.Cwz\w --$xqxߘ WR14T'<ð,8 k3# b1ad!FLׯ\t0ߘ.}G[N}5ʼn NKS[bB\Ng66b7 ˰ Јhr;zʅ K61YU*oRR\;oP4ݔ~x Q3]&4nSj̼ެGcbf8G;LOSֺ|zAwYd2EK} z=IRb1*J C@S(_ qwcen`iiiӧOF|еվ}P8zvvn !E )hjM d2u4J %f,04eyYVZZ^V)hji(pY +SV_5IQ_|nYi`FRq.C}]nΰ44BF(?Q?@?ڍݬb&Mn'Lw4#P=j;G|YD!C#!1ܿzf:0bH $kS#G5I9J^!5)g=/&]׭I:U?@e&LuY11P{ NO?ݎfK$s.8/ @eP7{nW\pt CU]f#2ݿ24jJC۰F$EʲRG9@MBn-7i"Ox;E\*u P;{z`!D#ÐUS[,W(u`X`.]]]EQ4B̉TGWlf9-/ rq Y =.d2o7ȠAxI|w lp" $]u+/q&iiDшM#3ncR+i:myYw_W˻Y =.ϝ ]*ϙÓ'j *((XfͤIBCCҼT*UvvveeeZZ߿~ɍLN2g\k/lM,-lXeA X5P$+$ 'p aY!X]Ui9=V&q (qVh(,,7n7GvrU^uK]o[\x?dRXs1 P&"2#3 !1 c zSiYgaԔ?*k8c a  fx gg^%.^MqmormЪs;Ivv@woAV[zPMEmq6X-3 4 EY+j*JG9IQS ~c6ׯ&LHX,~׭[±\x5Æg$'ǽՍhz?]>fo_aX, IDAT\ʲ'6r>SC@e\|.^ \9(/<\n]AWVcpH:6|?~X/1~ڍauZ qqaI)N0u]YQh>ᇝxq-`AuN\ÇΟӦ >sO{ &Ν̅SW.IIժjøW- Z7>UI=a!NH4F,r;,ׯo41Oz!gB w5kPРAzA7vn`H|>婩(AVzQB74z|r3rm?Eb1Vk0GDzA7ӷofwFnގ^4gΜYnݲe:k}gѷ}=`g믟|I;}Wۑr"#,YD(#"Ğ+*:Ro^AVZƍ7nhp… 6x\i\ K/^ڙC >sg36jaÇ3G1%*##U'OrrT#F:'p_~_71D:ȑ# ƣML&`79zrseff8oܸq*l۶m7n7[,z?ݻ|͹s^zuٲeE}~h_oذaժU!!!GO$Ɍ3nmM"#GQpL㕙m1092tذ^=笷~;hUT>7Wa*+su+ P(#"zm|pLonsܕv[zKO׿"3"3SST$FbJ$"\C8tw;wHSYZSC!dHH&0Q&Dy#--7-?q 5*r$_~s=t͛b1맟~hݘ'|266瞬-[L6pz*f`8h*23+uee*bfT*H>>*??>}|cbsV^YTQQ(l6ɺ:Re(#^P(REnnR??Y`BC2uVֶRn7_=r B( ߿=ݝթyp'"bqIN-++~*'G_QaVW+2?6ϽP =.d{os˶ݻg#޽[&?csd@傿q=~СC&Sɢ"; C_C LaaaPUUe' 2^װaS^^t6-J:lXh@~.\())=KY}Ŋu-vANW_]9rD_S#U*/^=|xUR:n 6eӦGh%rWpS͘!nD]K#¥aݦ}C+0yɓ'`[aYa'X,vssӧϚ5kƌcwsgׯ_O3 ӿ^{駟 Rt͚5yNN˧OR D]ymk'w?A'O}QAoM_=[\QOVÜarr„ze4꒓F ޘeI瞻'V!Zxz`2X'<<@ܮb4w+v=- Rmw =wVVzw' #Mk~QQO|%w= k<{>[s!"Bhɺux;$b48s&ę3,˶T54I>k tf5 yժK))"!3(~k*v+$˺uK =[SZ*7|8;\̲rhL Bxy2_$o7z̞=Sm.Dg5o^FI22жsi /2Z/7a'_Ǐ⋊%wW.wrIL &9c8"|:KQT M~fϞ)=xasNW^ -];pDɴoCN+W[|uH\ڴWCN1jd_Di6'w+W>&iVgs{W!ѝh["O=Vup)uSP+JFh&6_c~u2ˋ梧բ F"$^\FWTȇ e2Kf&U^. Y|`&vVh56 ,еŸ\hdV #A42ãK㸠ÚïTX,=ȭ{'a~% ttPlTٽ{cF,~Ko~^gPN幹l']m>ciÐ^/l5㸋f7M:ݙ={djubqvxO>9c￟;747TKՌcݻǾ"'vuH\˳ n6IrS#F6{n E}2f4"[d jNu*.r6_cmnur9.L jOF%tlݳPچOxP,zHXgJݶM[Y:%缋U2Yܘ1i?4z|GhV+S\:JEeNZDQ%Q@ %ssvx!kNQU 4u?{w½h&IQ[qB oʣ~dr$DdqGm>j޼nҔO|AY,;q8$yq&\Ϡ Hwg9fY6f(<<8BU!.8'hi)A6Kk!H=BzDpOO4q\&G:bz o-:<rϟ--dRjƒ&X.IJ,KM/<{''~u:^--Igde޲es]g}t C,䤧5`qzɏ8JEB8iΜ~p;V +8p1I߾BFKF`X :s4I~ChBQW_Ō:].ɹtPjo"^l+Ui֪U.]z(OB (,rRzZژ7t}aW{i$͚ԷT(~>{/[/曚}V}ƩssYg5wK:WCO ݽRMi365qw1Rbf͒4iR+v fLh4'vԩիWt󃿿{$W""f9?D+B}qo|Y 5xܢk$EєTLd鯿vKlݺfK^pUrCkNYtз.Lݾ=*>>>+<|}Sl% Eplݏ<µ@Ш"ѐIݻwzbqM5kƓOrRް4B p\"݋^M'Vwג%-r5 շ[& v88j7߼=GD"_ѕltØҖ{@.FCޕ'Hڕaj;%q\ N ƊJӉE"aYw&׻uC'>wѱ!/J4yܹ#=$bXfyC`XNx~σO]g8s?+ bbzm0f3]U#qqܺCAd\qI>Ti)&Ks7{ab1YT aBazi#@6d($D*ƳgM9net*+@,۠hB)#VTSjks2YP2W:h&pJ4"zR$,[VZ*) l{;V1Cj*Lkj!0\yjAoՒK?>57 7q8?C/}3p[ _4櫪qq!#ןJX\!ki6LuWZ0mNISbFN/?inG7jq:;;ZBg›plMPsmJ@joAh 7ZeE #>԰I$nS(<}WUaGj'3_oU<~TVcqt'Û[ U-YEYz"^&{ǫX:DIabȄ  KMw:y#fpލ$85R Rw#X9s&Py5OJqZ᫬zzǃÒ8R)bZZ|$v'Tk⥅I"LlʊҪլ9(QwMMPʻ 9,eXݿ9s[0\nEhEVP[o U2|E|Jdcϐ׍0\&t7~~~kzB(Z$>lD4-|*iK+eˬ놧4VqӮK$|DT_)<߳"سZ;!NWn_0Qƨ:K{`V%X>[ZR(ź`*ݙaqj*TMFEd]8qfbafvCoF\V\~xټ:2h>b;;9UNk4*E1mV3--ݎ( dlQJXSqZ:w, 4L-MlBUw]ybB}] /E>[݆ׯXcV#͋۶) *J*nMzt&aJ. {rްA?ժf<<˟2͛b$kO=+@WLHL5&iim=§Vsjl|}-?eq 32JR6tMYSSPWǏ΢O']5Ùzk2 R'g "woVXSrǵ-.U!yIrBx< Xݹsg3z͋g"n% +#fQKE5|?hzJo|{o|{@(93 Da9P0sOLO;~kj1sժә;o{ӟ|VK +WL*]ƍ5eԩ Jza"?"%AqAQjPpvNȨ%>fHn ;Xj[e()[2v5Y(*0F$+\ K/Ճe'q [aFݻGPu"J@F4JJd$ wwl_,7< VXT}?㢍?dj=Swe^8OJ)B2 #%b$$$o oF¥8=]\ _T8TwyFX>1pg"n%;HLJ6ی6r%=G'8 UKb aQYnnK~7UlA/bF4))Eg9/cSs#'{%|jInw*v݉YrrVc~~ErQ-Y]ϼ@̟^kr<4l(X,_' quǵ \eD3|Jv "z{O!a=k+{dx?0l=OfYsl~{jKKKwK~5wڴv>&~csl8k#G\VfTĒfZu?[u:)K_׌Vj6 ʖ,IXE`PjPw'ն'Q)v&"a<<5ZmD{B_x7Ӵѻ`uhGY"^cO;2DGwQwD#fۼ4sxG~,]*OH\fyEE_4ۼ&H g^S=˗-K8lM7 #8Є CdJ ]WG">_'q{ԢΨ:;;ce>V+#ftbaO;x'gT?򧞊@W*MRcEmM#ޏ1j?ԧ-pUZLqCA}wQN#ǎb,1ZA;<nF;<./ij׍; `uǍe͔~ۛ;ciɗ};zƮ0!>iwQU.ѣK8oB"B.(HxQ|?&!h4cMt$l>7htB14( C4[T*t>*31n~~qOS[,dT~qA'ު^>p, |Ǟ 0>[}66Z$e D"c~x܍FDL…%GƈXUH `6 X;w عq8BRHI1c :pNCԊR96u1盏1V 4B_z Y1(*GS/NwZrqBDE0m:bz='#| LQ.-_ԥHk"Xcu;ͭ&wSSBnqRJxMo-VZ$5 TluMMvSsli Ӻys(Z(Ԥd&S2p]vSSC9swSS0yZcrPpettL1E\qCaf#&b1o/Ϗ#elΖl{_΍Lć믿#͇ΟTWY":-R#)i|c,-՝\+'fKƂY%4\Ņ8x&QH֋ 1Wk9Zct:&4զDZXYDՒ~86 K zLKץ\e;PxZ[w$'* I٥lĸdw QŒ4)Y಴U-b6x:93l&%ԞhݲN$9kn9 ŊCr8MФT'gfM)!)֓'y ȭ s^!'䌬) 5SG|F&<0q18b56zW|DoU{9bh^GqD R-~Xmʍ3$5xO{ pJm \sߴx\>Z$z^_1ccGw(%XA0ܻUQ(X({xlhe;wξ.*~ z^s)ee#Q}pS}uwDBg3}B8jm2y9xj&9gڒDiK*sWT8s+!ع-JHJWjJ5-xƺ\-~(*yݔ)q?~R[2Ivb0] ؈&OV"BR֦!xN z&)AgrD)%`?s{ڻUp5&bǘQkWɓJO2 M#z-Mꪝ;ryVEEXRpRϐåjT0tƖ^mL ~8:.\ЧErlmm-'O&--‚ E1`Ox&@(ԥ<[|Ғ;/x>B@ ^yW`Ybz^Z. "T^s[,ueehٰRr4)YnRV6:QN Uj"Ѻy3]5d<[wl۔ɓGwj9IY%HB!Hə1dsXbjRs&w7]F47o:1%o.5z O06>sl=5&}]]C~`#*KNN?_n0gDBliK5,2JsNsuVYR҄XIӖj E͖wt5[&58^ƍ'N! [I-mCS;كʞ9#u'V>eQ 1}`*w^N:c!@Dj;5{^زxXvb'{2xIz:&> 8::N-[ZUd V „c!ԠgM&ԫ Φ5YVBO}yt=*$A!Ƙ,Zjt:BG:).WqBDRyZLh<ې Bh|W8D1i.44%QUܜ1ihYzPlBaYtf_ތ[Kf:H#=--",tNbfU\S3s1>5 4{ԥK ϛWVlsww˦MIRC4=ֱs,tW܄D Q}|BتS2+--ݶ#^|jGc;zoviE!l)լhSI7}ڴm~h&c 1iA/8 i[䶱D^d)Z5}"ήjkmjꯘݏ{hsMOT:@9aCáC ~:a 'm6HΙD^ij|ߦiLVA/RBl C {4E/[u+4|7sxQ]=L} `:-8=GCBAFLc0Ӵep[Zgw:9Ð_^}|Pi"27?;s&%+pzиq#ӣ*n˔=,M2R ӊKT*nRMuC}^.OH=p1ݾ}h`uue\)Rƚ- fM9<ͳDF*QT}s[-}`qݶ.6"Sj2֐%Ǐd*]斦3ⱽF1ځI^Qzݻ * "3F r$11IRyncofiό[m+|EOR]s,{KkSSŽF[@΁դ4>Wl@O`e9Z9^C}. j7*?@{@xNw꓄crSTv8 7u//x Up&CѢIr 8>MQE`7M>L6QH.W_8{*t GM0B$IYqT4 L"1Fɹhl94W'g$u^:=|(6-$g SrLO&%+ (zv_i^>eKy!)99|nر#G;w}Y<;oջv1NlXϜ>Ep%0mдs/3gh:zkqy/٦#I8b.2U(Haǎ9}-/x"g Up'KIdoZ0!&BH(2 jZ/Œ97B`} V<|zsfnX{f눊! Bx:wj1Zpsii1 BdPxJM&%0T(Zc6EN sƜiUukۥhҢJL͟!\_h@|>q2L&%R>b] ~H v׾}}B<%E5ҵDsϠ ^/eEٔT2JFh22O?wvOl~)|nݲ%;E# V!Z), ͕ŋw~R}ZyoSr`ؚ/^\6~J+N(\U4ouݱm18 ۦ/o|GkOf= IrJܱjͥ'^񟸊f_zo'([TZ>f?FSGA 03f>Cïj/ypkW|_"SSWr:63L_i -J3NV0VHHNGWs^A>oִ}%*Oʚ-*ukLjT,d˱3fO2b{+(Z?k#[o ̲oGjeNamJ"ղDEZ2+K˿ Mǎ*%(xx_y+mX \bhB*јܼ_ɞ;5~޼G^mջv%DXP-N<迿 ?!|X6rF"C}m8TQ|ibON3C<+TǞ~Z[]O_~ AO LY ^ܹJw:.H"՚Բ)S:ݍVv*9+nB 5HQBBE؄ r J0!(LDsc`bL WϾAQnk™#qgp$XYxsZ8* *m 8ͭo]A+BBqEPR @C3ڱ PDB3͕.K04ZlR?gb1͝VD4@G?qߣbbuz_ZZy~f3tQR>n~{*r^ě X ><9=.g S$*T!Ys'nxuMj59b]-GPvӵm۶]ӫWT~1lyxB sU#c}ǖ̩$2%-\^olg]uu@@3hiԒ,f{U%%$NUpk-FZ -6~}ҧ,) ./ewymneދEJ!,\$`^FZP?+Cz+Pq +NlxD$I] <Nڳ3+mB^zy*4}᧞I?uۜ_~kb"y%&O?}O +j h3~EWM͹͛8.LYPTtݷ"L*Oۖc̲\ai*XtԋBWPgO7u)EV40(BOQ<1ƺ~R 䉥 DN]n"ʦ,1|4bXyqD!!  ۆyN"S"P q[R<9P8kk?u7]>\B;R% ((B0"c; dr夲iΜރuu)E>~UyQݝС4MCnc9bE!hQ{ 9a9 qlu!wc\vl.]ZwlC![cȎ![1GR|ڵkFvɒ;l9e{ 6|аU5Sn*]twbFE>B[ᆓ%9ᇬ|m2W, ?lҡ hiduy 99yKз yˍ|§&c,N )Bo4MvO<<񅼂\ز B; ? `Ey⶟DX{z%ʱ2x8@WҋmLͧFB8'bq\Fn>8@Kd19pQBs_1-}4-G`Û 뽋 DÄB$!8r7^ݳ gOuw!I%.]G E u7-ð\x%ܰ<D* C?@q\iTw8OK˵zrļ}NnY)NO*Q!(WшaXqjZƬy dy1`k+8@wӧĄmIanOGی9>96lSf/m ńmqAYmZь0!-M bzF̴mK=t+fs&,L1gǿw6~}כlß3_6"|X j׭D@%<ǡ&!ӊpሤ15m⛃/>caoAir.\L" )sM0HB!<y+.uO}k=MKWLhtц`J$3͘,mi`bHDQ"T_'HdH3E:A[0!-K<qCm"CY{ssܼCwv#߿ip|m[2`>^ ÃÎ ô<ίf?煏ZM6, "*SG5ǡF(rڬ@!w.kZNH#9{rEq[p`VH@ShތbW nط~w_?+~ 8 M@_^6))mJKWXNxFh-j8xp.XG|%\g/X]}7IXuYO}XR$ z Ix8eXedEEǿ+<BT@bRr@Äiܷѧw?gނT6PՉj)**!=>c_*b0Q@8ΐї}F׼nY)8t6t^Ó=D9 3[ZѰMw7W.Y,lʧv5fRVIL3 z/)rIع>mHv)WBֳO?śc,6Wgn>"X>cj;v$Qdz sbju>^>E𳻼 cᣟW뗿w>gx3 JBb09اӻ+&G3gě IDAT¡/ji EA `F춞KO:Z h%B-O4]se6a5XX_T2| y[V.Hk ^N^1+> }ϯ[H4WOn{smwygfe}/=/G_u ;('/ uAÓAT`f8yWr=[1\0.("T)ĤdsVd|!CPȔxF<:o x# pD" SE#D!8^;  *I\Q688ܽQ URA݆'!ב/!J)tvŜ(\ FPhS{{mZl!+l <ɻnYq7<1?a'1ϱ/E2yB0zsR ۾(8۲w@ ,=~,,C*B48G$2&rJꁇKJNZ7nx3 A"@lsP@41~"4=#H,xBqq=Wh b1MS~q8,U*@0Dd YXT$26!“=(ga=BQ,LR3QH7ɤԦUwJ7ƜNs^U"S.12l @$Jm[`Nֳ?D"a9lu "u9):=m ֳI}>9stkЧvXLۯI6N $gRj9_aXQ0)?L2[qn~PcK';Vk0|l!j(*.M#^%`kk*oZ2 (/|[s,fY?iMRX2x,*cs͇mCݦNۥ #V)~q5eMJVc}-!`B~ѤB+ {=nyv+!|~@j# :wrP'g>L(w:#zشZBi;(IXN9?Q]G%f KS :`B!@"Qq<ǘ-}GE SjM-Z%#dvػL]]MHM ={d *gC{mw{6bG^s<&8r5(GGQ~9wOxϫ5:c!0epZc >!>Zq~AB.F~)rA@O敷S?;rb~VQ4w6VRm5L)4۴Rٯq v}aEx]ΝpR}&,f뮯ɎǞxn* C * AȚx^H|vl35frpP(>op0 a W'ʔZMMÄ"JgP@6jR3bOǣޚ0!A ]bs< SP{w}yL(˕Y X0S}\s/H0;3aBx^,7atF0b\G–BđO3ƈ-ݻ7?,u2^pZ$qbii!g+k=V7ֳB8{Ҳϟyzgc*!y1,fp)DΜR(y|ނŘaؔ0zՍ X54J!.SL,cBsFāT"g|/7h=v򕷏0: s*+<#DQJJKi"!(6(J&{eVĆϟ%PZqYsBSMfv8) E;B CA  `L/,r߄T`n`,>inѭ%er1dT{Q(BA_Q  0v91~_JSR2 xԤ䖥ή>ciHu@OڐW9y~-r>029[ ͕EFk!wJZ;?[(4gJ&#$8B֗ Ba AaYaݝ=(Sb';jI$FBB@PI4Q}<;}rMKD&a!n8_z6n=K`y$L'Aَ`舋xL88t<1FOɐpoAł45kH,AcbY0"p 8(R`o7 BqnfKURRɓR_t!*uAl_{X4Ť-Xq A\r\?P֐ 7Eѩ gߛ_\sX{}Y`Tr@+ΧϜqb8#Rı-¦ҳ89g G?8@a4hHzʐ}(@+M5778p'R |jw GaaSʰNA;epp_ !FheXsP+?*F` ̳5ϰ٬2݋=V;7٬Fж)1qV3oX,gWNR|lW2[fy )>߁p0eVMO7#v>k* N!˞>0D6E$JerTKa,2MڎvNX!C}4(H=eʀ4︣zUpopt5EzF7}qkMoH:$vuEsChMY|mj)r< 4o}qA'.Z b*~RT&G 8;TXqfm4hZL͚դIYEޓAXb&##n=';E7{I0\vN6?5ݱTᰵG 鋭s6 l)g{ ]˻|4t燴l}Aı-(7gq'Y8Ohҳ/C; RSSG?:HRk 2G^dJ! @; * 8/(q+-*p9W?dUxcts HkѦQ ]S‚ 9P.8oE!Ɵ/#8t6)/[&))$ ~<]1r0,::WM&}^Srz{&*aXo\ri:+sl5հܠM˘'Bm0uƫ !a(fh> Z]zlԹ$–/wGXPRICBMMvͣ@C-jD}Խ۔a [ ֮ߘ6}QA_hra+Uͺ։c[Kҳ¹{Bo"dd7^8H.0Yh#ya2Ǻ~{vޓxYhhǵk?k*(HuJ9~./䗒:}J8.qB,ˢnKÇö:B RumskOgp`V[PȲ4A$rUmvPln] ׮"e.^B1X2u4J 1%=;( S<dTS欻?+"c0C!Iܗ9_ΰ 1,k2yYFM]uss߷,m9W7y]߿mS:dnjUڴe2#2ejR;mIaaD |Zב2omiJe.d45uQO?Wqކ|ͰN <7oV @,[[YP||I0CaXzmApÖ-;w|kTh\Y bhٳe )7lG'gnjndrt)AO$I5lF8Y:GIF];̟(F s5v6z\bS-[Ƒt){1ǰCA4ǡ:a$nN\k *Cb]"!ighТ [ ֮` c(3g:c[J5gV$9>}Z^WlLjZ7_bye qu7'Pϰ ǻ9Y>xOkQɍK2Μ 4-ja/Slj[xґnv<_9\ *.uqġ&U߰0:Pa4kOj _KCg1 a%- 0ULl>>p]_}E @,x0K$8"⦛8K?g7iD[We(+3f)֭kt%B6/:dIKq(L q,4W6v5k&popUX9 !\K4ͲòT ILpMY1UM R c0vei,u'&f8$<Є+sٲ?Cɶ~ 7ʕ+bӦR$ljcTN(JgK_z֥EzaK6spUaa?͏6fefifXaXE4òNkP4ce0Y5u56ekW몝SVCqՎF/sH^ "} WVe -аommaXchϸ!"u=eYj; v,*nw¦NuνtfXBz[xASϼ=}qZma., IDATT۲?me/!u놬CO74—/]ZM79 -wD[?"rX(>ˑܳ5MFhk[[k+jv_L1 `YDt_d$=x,SUU?}ACcEb٪w6sXD$#wjyF3V1,|Y%RR϶ħ;e69G0l٪Sp:۠s4[ mQ&m %cJzvy9s,9oBs *#0ı,~zMXxO=T$BXaZinj)NA橧O׿"a%K#BbV}8-II>qq}gkkES("#ooCUPш۲Ess:ښ;ښ9{زeġ}~~ǚ] RU.vJMwՋHVkr#IQFTܥ$+"!JJkuu54M!:j =O lW_l-- SU^VȤ0q55G$7P&!'%FřdHo[}$#PTyybBq:848rup 'p'0ǻJQuzc[k3˲%]#xc.`h4SN#o2?I._"-]bm2>}]UrJ*bMWQ4kQ&duZ!Xt*HmuY2n-ߩn 3W[ClQ "usgeH[[kzl!p_z˝TJUgWOͰXƦfeQCz=J4)ir3S^͵kג.&ZƆLTOPD>11r7ch |bcnwdOycB$ ]8ASRTIIQ;1HqeBzTZ oP%&DDPq,$dȧ.Z7IΝ;7wܞ0Joy2 <|ct6E+*>ql6!VaJ`XDьjkjjҶK ,nAjߐH67s3e ~a5ms?\0j~ehеl4ljҤ1(=;|K? Wsݻ?Hlw|[jz86MF E" N83,CӔll6qrϜ>qξn>^0M P.pū&/]Z9uS2ӗ[qlp3˲g~=ZZt۽eL̀v'K~0W!mӦzA_]qF-ZAHz!(h6M}C[k3е+[i6n i` t%%;bPȂ|S<3(Ʊ,t0͞=B4>>[ZWRbinfm6ιg$ tMAJ7}Фjh#h\A,8X-JR6멟1w@0m2X&drqh0!.gHXGchlNNYE$:,avF"*R1ilZ)ڙi[+,FCƂN=SvX_hMA!aG[V8{WbIc)W̚5 ț} ?ѿ%J|}s ʥ-M7ߺUvShzPsSKyZ2kۼoQ !'MP`וI2QMP "amBE1Z`4 +ϝj 6/E~ ߠa2gsACθ|y妚K0LbCx xufDe6R$KEb lVh2BAa^Y(Jg~SW+)/6x1L4x>H2r͚p8z^mUYL┠Ι1U86NXWA\+H"r FC`{מbPr]Sfm̙ZOIJ?876{ E?w}|$f5._reƖ-^Qk963wCb/;r\tlBL\bXdLM&QS[[]I;wFľ ʐy۷^!toJ .)0((N-/࠭ٓu5vP>PRd_s,@8cke\z: H$'iVfwtmj>>Q֑#-u'm1_~cҳTrgozѩl o{z](ahG^_Ismvfqms戤3|rv+J*:K$@lXC7W!z,bw#^YVRU^09,>qBsK@!YispL6BzqWzKj8 @VlXwhO $ۚۚ?$ rjG`+!b*r:͑#]6,[SQ\WU$HR8Y)YfзsugIBϜ/ʹZ :#$%-t5dSJ%g1Cñ2,goUd2ry?8FV# T&X[CB33rU[HټŎ|,{gB 1aasoukSqqSqqGm2hU$ ep_TTHRRHRR_KF㓗-?,;";[[?c1uDD‚ (/\7o>XsIIޡCee90,811mӦI`cYgBeڷ6CȒGk4خ07nj[E(W D#I^d@(4pU^.qE VUY,B!ILGGuF[yY,X,Eq DGKJkL.[\P\ia` {bZ[צ!ocbqemee9s3r`UW;KN ߿L[ hQiDW} }bc}el'8[\$R&$(TF db*@H B qr4] Qphj蠛eeIbf(bA֊z}`2\g5Xj| @AVy|Fpڙ8զ#cYcބ-{-I]2ـ=9s6փx @awO"zڹJd#z}ad@ ILX_$$  DAAtK28Xx1.inI72xꔵLWЌ7팋Jn8˖ |sҿKˀj=8xnn!%+7ӹs<#3¡q+Wt?[V&xzD{}^0FWkw~o?⥗YYj㈼kj))ʥKꡎ^x5gCG NG77{< \.8㢰0hp v"4N`NiR!G)#t+|UyLk/ ]WwCQUs3ڱC0HHncA5Z).mbRS۳g$w nn.|=!WBZ5of[F#AfF苃oPŋ>t G>,z޻v℡MTOt۶s nٗGɓyYY}*(H2evy&DQ̩EJaN F"3#Ilb[Y2A Ib"ðFCbV^NOGIqL Ra"YEAA|vDEϜAf(2?8.`"$(ʒdp0.[KKe7Bu/$&JJ0s,˴I{+IHb8Nr4ttH<:"Fnn7R?Rnba%v$$fGnRөugf-n dO&*%?CȤՖ]x/oy@jWm˝??n34WUm|XSGGŕ+恗`i^ڀsPg%c20[ 28͎RiJ%/OI!!"'1%I|<8$ D"BN"qܑa(4EF#,&##II= d@.p\1{%?VZD$֣"ŒիD\*.{d"MN$RP$+,wW:e &YKKQ^.X~޳'g ;d?y=;W_ ;{wɓV/`jY>yryǏ^3;dFq\kml.?)}}KΟO&QUz}۞zߞ~i.9r˓O}KR"mŊwj?0sqsfzXQ"LI[W_裫Ǐ?}]}K&@#plJyKvPcG;MĬ5HƀxTujكg[}ERiɓi=e*Քs'@ڵaӋ7UVU2v櫯4o/=Yǟvm5Byn͙7(w)o}/̲eQ))3fXG~ݴ ~w+7更gmy3FE:I?ѣΥ?; @ o,WwԨSڱnbD%f=k7;1D;IGUV]ðkƌv|GZbsv|ǀQhԺs"^ZMM-S-pĉIg;wݿy}q,M4p#=qXQkQ>3X*Ǩ/|FgqKOKO_mwoyw֭J6$_ߞ;ػ ø}?lP0rǰʅ# X;^EN397q_#bf QViW7+z4 )EURov,GQkz"xHL.He^j7D{- IDATߛ%?o_/^>*Ϟ?ttuIbq嗎1iʀ зt46.^>l(-efDDbqCY_X5'v'"Dz18'g#Gi#8>lT5:? "e2YDI[^Ay%ُ\Rk.O \L^cz%T*?qDUS=TM)'xXkQGQЋhG29We Z\l<}Evr~VYɴz=U[krGETUUOXv7R޴jv%Z[E2YVYѸ8KUW#jm^0CvPmjrKhB_ⳃzSf][s3֬|e*aCtH"ɼN쳎zqë]k7iȽ_jmj|߇MK[t4d{Ieie=WKMM}Iə:ϯLŋ;۶_~9*J<}x/?v^h)"\ڱnƒ D?S; mYW<%'͛Xz7;C=tO?4_eo߾98cÆ zn@zzCCC<嵷∈[nETcǎロs޽~!yoV^R8ثoxbss3_>&&߲e =0oGݼyt3  A3>|wfc'0?ŋ?CN_}ջq8GyWbccG0Mӟ~6__{5xO%K7_|O2eӦM9DxU AEK>}zp1eVZ|` 6mڴvZFoիWs .<[n;w`طoߵkZZZ{>@$m8z֭[{E~+ϟ?ݺu~~~---999zn喯jӟx)$$x Ä aYCVk0=>WPոj $- pMK҉LJ666:tBM-`0L6m֭III 9樨;w!22rlXXX_@KKOwܱcM&>++~SqgYO>={ŋ{9ͤ :۹sӧϜ9s̙Ou]# |ZlRyUjBpcN܌žk˛tqL (ki)Ԅf Qx$!#=<.̬,]~^v| ;X~={\R[[^UUEڵkBpΜ9/:Vt999/Bff&:iEEs=v[ѫ… ?'O|ztu7:>H$֭O 77whAW\O?[nW8*$?+bbbqlkk_˦NIKr7#d6OB|vÀXigBL,>Dў}C&jp`ć?B70cJ `"qҥooX`K̲o,aO=Tffٳgϙ3oOfff;vl׮]nr8vرc+.nޮh@./\НixD\ɿy^~?~g?jiiAH$r03g\jձcð$9՞n֣G췿{g6E ZjTm,%: Ǐ#Q嶊 qIhK~>]_I$dqTxd$&PPXoi_u<@7+2~ 3Ѻl6IB,5L/ V+,-yytC$.:{\8[EU]͚LAҔ©o}Pbӝp|2?RSűqki)k0X];{q5p/7ovR#Iʕ0\ĦM.]O?6msޠMW/[kkk+//'_~ʔ)k֬-[:t# y'JջG#?رc'OFܨk/\[xƍS9xxgߠŖ$'?.9jo8E[gmh_tgƥjk0H1sqfDbO<e1hr?g6/_&qrJ ߟnj4!Ŝ9s T*dr6㸯/`ɀWŶR>rWRՀ㢠 d6ӍL[r#}` imQH$!DB77:ȦOFқ \й1膃"F8xz3i8\&<\p74͛KƦ:ܻxh u u3wt|8A0 8f;>rp _;9B8^{Y,OjPdd""  rYZPn)Jש Upɏt28IAD%!1 LۨJ[,fpE PUHkaʝSy|ܽ؜D"B]b.%dj-228'3sF"<^N )-"ߋx sEA1"xqiokĿs$abǎwqlj' ?~DDĀ;*d,۶mG2u5pQUUf)Y ˧O~e裏\mL&b Mzlw4V"mu6ɂXVO|^8-˧5]!D9{+ z?aO~|eNGtqLs>v^--CƬh%?=Z MVIExZbm~+ @t$fh$ )JO#q_PnhJ%GQF+MM@15Ʒm h|xcm .b|QZ~k"w/˲\;w|yᇃb{n{=j2.]LSSSx ̼q;x饗 򠠠O>Al۶-00ЅL_gS6ԩS?(ӧO=n&FJZW$:~W!b) uE Kc?8vz$Dztg GMs %gڊ,pqY" 8qDd;ON|Gp9 x§V^α,GӖB-O1BR+6[k4*kɟPuuTW #BqtHUWǜvC70\pco… }}} ]`oYnݺ@?q*Q|{n7ںu[orʐG~ll"Y}{nƌJqR9cƌ^x{JVX{[n%::Z"Ho?QS,Q)т,H5 ɠ VN&4:t}ioG&r\ ޹EHĚLhMJ9tL$KI韶<=ݘV˵kG@@(|h$GD~X112=:iPV-oXpD1o^/ttP":Eqd Ͳ4kJ]o1Z iD\pEx <<ק֭[n˛III.,vjsk[nݺ2e7˞/^ܳnش* G/ AfXhkWoe[i$ULFg&ͱWikJlf\BBJwzh=0\UVbAʧOwk(qk+̷q4) YLSk2IbbXvj[pnh`<=PFpJ11PY)ʥKeetc#g6>>0Ib9ym )jrkm1*ٳ>K82mLk!~8GEH$ jj0 ծEzch .b\^ V]>CByf&B k/^a( i)7L6Mo@䔱>C,XЋ7ܕb5{k{oSeewY1?1(p}S"wgf $$8Wg T9$ԩ2/P4΂(ZGZ5Ϙ8&LGGss$eۏ)o1,7D+P-"Ƈlٲe˖- ҍIUsNpԇJEh1C+|p j z.@`Q+ PfF) Mή5tsjHPAAE!@p @X 1 v<룐+4bMY_IdWJghGRMS$Y+'`p3PI@Y|bǢd!0,/MӶ*Eqe \E.B7Vw'^0y覇nz]~RX[2IAHT)%0 6/HOzk\U㺿j#I\T̞=fDo .B"!@1KW+)WR6a p#E\Qi(%ʇUYDtmtSѭW;wAx EsΝ;F $m++.~f??Tq;ؼ 1>3 ͱcǚ[ F1xa `"\ĸBλo߾n.ۼ+g8{ݷozLa$ X֝;w!3^{570 }Yvvv[[J={}Xj;v8u:m*7^/@D3fxdw?< q}U#8$$&&oVcbb?$}_ѣ.\xC.:XphH˜,\8$evlh.isw7Vf͊_|ׯ#dJJJTjZ޽{~Æ wygVV֞={wO cFcihQ:M".}}pEx64"#%%@UWKbcZ` ʑ j<='޹|I0'Kaa ϡPY/-60] I48Xsh\/~'eee$I=$ګ~7RSSޱch4{_;wN8K/{7zw}.4q^^f ^z֭[}yyy޷L޻,ْd˽wb)1)/R ^<=^{IVKHᅐ`0mp,K,]h4FҨ̝s{o>pWPP. ~ />Sȑ#@׿uB~СCgΜq\xL̮9v36ֆXhR1u ƈg|AjkI\c.+Gwg w 6Қ00CCVPL"CQ)Ԍ IDAT(ZқI 0vZn*!L0LC,lwvZ,lggi3g(b EE,իlw7Aʢ"yf+ZqՊgea$h2 ׋2L{;HF#䫭zz$ 1 ;ᇞ.,=`s=W8k577Zj .lP(7Ahnny 0R7띷gщ=s\--K1늌t4;+'QE_6T]-0Lt١긥K3>"T S0_7auZG9 ,[% 3OtpJE ŋѡѮ][,ZӮ]{\H*vuEzR?T(;}[ѡ.+SnUi) viYj*AJojeii/ȼdw~@GGE@II_y{l&Aeee5551ݽ{oT*UMM͢EcC.oذĉ=N81޲e˔o~j+Ju| ?W/ߍM饗jqm$ԫho_=zѣ{1 sE'<ᇈeM)9)*}07{V N5* Y}Ƌfwggڵ`'ufGSS-1i(V\ s>uz ;s%w'gdOP/Z@`P3A( CC3vHFQP45gy曁F݆ YY@$Y|9ZpYj*MUQA'$i,(e%%%A$I !!#s!̎[<]]=GL 6wWW횑,QDXoSZעͲlCCþ}DKKKkkk'p&w /,vwС˗_reΝݺu;sJ8vXeel^Hjkk>M5CyfϞ=Xro{ao| Hw ĉocVgmuur6{v]\*gie2NW*U~tr6ě 2 U:s޲NKwG'KUw℘>Jq7Vk믧l٢YldJMm4@H_{l2-*!.>t< IJ3Q(xл0%- 4vtYkRBCF(>51G Mx%FxBsmۍ}lI׋I$I m6Nzb1bC#rRWȒ؝;Gj4&)F.bmv&V#s!̎[/UWO|ͤ$yw.} D1EH:|EEEa7-gVZP= c$dd.qK#>L$`%OZF"fGBZmNNΆ vEq|'--3}J1j }sxxX?[999&]QQqD\ l?GUTk׮Z(k$FCݻٸ#bbz׿_կ~KNNݻwF>000/(jJ@^:9sċY(ܜA::kOgf#$+V-_{Kn]\j;۪OؚH2q)?|e2mبR딦il2+Vy'Y>${}R&F]UT19;wV 23F֖L f^Am;c \grbYvou5٩HP! JLo:p?Bj5$o6wkW[oBæM&EVV<#~BG%K49s0B\_(23t[PcK|̜Rrs*7U͍\V c=$د]x"n_,Z!QSS /8q?\._q? \^TTtԩ/~`]]ݮ]f-1-ҥKwuĿ j8ks,m/>}֭^HLVVVv#2qW\W*ibǎ*?/WjGj쒜yV[&}'NyY? ,s2Rh0 r˶˖ګ=]3ĉ{&?^T>!]Жk4 7sUW(@ ](70XVEP<-ioWN5^ߵkl`6zz4S (J454-KLĂƊ\zRwOy<+l/ٮ.uy9ղmmg[#]UQ.+nS(KMUWVbtH=}pdF/͎˗ތI ]JIѤKqSP( 'eeek֬yx}CY֔_Lя~$e>-[>OM=*''|2''eӧO$s/}K;>^3_/ֵ+7 ?wHTLcۮ_◿2m%BEQb(A"T_}=o#[v Bdeas}<;;e yf)mk]&.+G<Ř= $) vw12gJKyii ztbw$bU 䇜M aScnfG4s|Ϙr "I=r _(B"//Ӣ?|_~wٲe;9ѠR]UUU]]nݺh_b_hЍ{ٳgx/[lF0|s n }= 333hswGL[RHYʌ~zbP$$$L\q t:׿ |Ap~(jJ N;Rf$?L۾]-E9SRR@E /dggG<2j1$GG?}/HJ³̛@l6f߸kgQTRAd=mC}1>;=#IOWWFD "---/^ֳ ř3g"^)B=ut:v1q$,@ A,kN朜\PeX$ D@$A¨( 1:wZnkrFHqɩXӣs3CpZ%q|bJRZ&EhƩAވL`m/K;0$euӺ5*AtSrh1)OTRkj,^\*i3#wa3 C|H ^eVZta"ڊЬ6>^wk ̔bU H`gƶ{+Fcv//izrgO8E6/$rrr|;3G7o~+Frw/ ü{,7mڴ&0 0A$ܞN>AR|>rMXos2=Ux,>)YҙCx-Y ʌ2_EA c2Aer~KիfN\_Xp`՚VdCRcry1 FD/E~$)LXwd0F>,<lؠ/,tjEH vsȴxZNb +) INy KXnEB A `*(^+0Lǣg|h^Y1W`QI_w{SW^I*2+' H1cL$AbHQ'onwD%j(CJ1Eb 9@NO a86L9aϺ&^_WS_W VR(3 Ç&x;GGa G}FS#>_;Y9x,'?̫.WjSn۱aMBYvA~{L6o/]XRZc22Qa2 |^x$ϳB,'IxqiLfǼCn0$'t IDATG^y3Qp`,NLڸD$Hx#)ZtU*5/!@ dj$D+tMRmvgN^!! 09b:DS'{;-TBC** ^8;If8ׯ^inHIM߻s a c$" 9 v7xnr\,!0@9>!>jZ`[sSksR}AחWV\uduε7u}~HRT t?sOpc,ロwx xz)(Wj$iP kv'GIijސe#7S#0;@5w~ (*4-~dCo*z=yF3 ħbvj\e\6.Q a>&yx3^'ڐ FaqJAz18[恈G 3 ˲ оqq (p HVj `Hb$4*#6f~ a9a`Xw1~ 4ĹW2>^Y!~pwt/s./&iM4%>i) Z>!199k[:7jyF3}Twb2vq"$H3Jze4R.iޞ>^, A@`4b'}3:N]N!fR.@Z >C?G#]xh#2{ BX0˰noų`Jk%r !@Tr:h(W/ 'DF$AR,)G=9nH˕9%swa %b-UxcoS'Z(JF&BJIJΜ5!x86bwI J<&Lk)3 uX+0OsA>qa$4iR5$(J69Y d%C'9k\1CL'5 ?pۙ%3 ~`+**^^SjJ[tLZL|[sڣO.x{*hC9t+ٟB(J xYgmvgoO72cڅ>//Ҡo=T]r%.c֜O:}@ fT@))xyxl_Ղ0Fz&1TNċJ77;; ˶_>=r˅rjepޜ[/{{Cڵ\AHR8^%(BIfX`ƍ$ISN]paOPo_~9+%MHr苻2R-;s x Q2ZU*#ف˜c 1Fr7b|0ryʕ-(dqK9s|Vܥ[ꅳ+A!qJErBH 0B,/Y.B %~ٲYa{ԢsPoOcJJ-Z>g(V+,.-#C?ZVL y.D7">j C.HA0Bt0*v#Ŵch<~\u+V>Nq*-f<~>ma=]n֔VrVrr\mmwsIEH1),#;}M#if\.W^)5FIhsi&iھ'Z/-X H9ytU)Yax=n e2IS$AqeFL0lnkK^nUNΦ&kg!)˘UbWÇ?\R^E8)JZT71 c ;v$aPw[ðoHHtZ.)\)c% Pb1gh33eAKUϪIHc qniډM;Gک1$`!؝ v1nHvF5nF`;:脄t oxΝoJj@H~=!<۰!C h Xmݝ UVWc؝x69ܐ]~J~afXAbu >%%ł1%'tJ#g>EaBN 4qC/$%(bR[>;t8555PUU%^[o;w`0~,ir@ǼIVW}"&IJ&WP4-<2[TZjՔzfelo"Ajj4' Zɀ 1B>>~ҋ'mJɉ7ԤJL?}Ow,'_͝F|R.;q"w$Öᑓ)!$=47k23o9%̋Iߏ1nz2ؗD:v=ŜZqe(2m$ݥnλs@k]?v LsvKJBg:;e#_B(oMT0񃃲yOx] S9=Cf T]I.[T"b-[/mmm2lŊ_җӧq񔚒 AroBJI;lij$yy +W3)ڻq^ADLj )7GEД0/Zmwv`e@o0Lr$)cev;0r R9iYm AE>>>mvZ罻 46 &rRюRM,Q-Ypg'szfy}jO@ &+QDno8p2o?'>LL'^2CC.,bYR.rѨSSSc4ׯ;I0 EEiXy@fhltI<%h.NaiV& R@69ʽmx)OWy4IS9mT"$ܖXb!pNɉC&##IӦRSi)kyzz|݈hVn441 -(%̽I ^wGpzR*iZʚG2{w8| UE̚0If@L۾<&08$iJT%$-!"$p{ ,>^n'~!@n2M&?f/Kfy. ;nFiI4YY?$QDSż}ϟ\Isw{x {znEKJJ>rB $EsZ),gTͻ /ɉ A 7o EDD=at[Aڝ)ւG3ѨZiIJUVvK@Q+<0kR.DED +s ﭮfBѮ]K;&B.t:YZ"+kVxΝ#5Ui锾9#HAO'$L(%%J,9Yx1A/Y^&íEHh$I͉h sc"4K)Qt)`YZ\wfjb7{/]\.Ւ%NFS,Q?m-%L r|uuX |bLVx{N3;;*R!GaA"fN!$HE'ij3g(<70@5kinf۱Gj4|H2Tdg#7P%'Nd[Zx#$RAx`Z[@e ƾzBt78./{PSXbn\. IlV#/)T¾KE:(dJQ*W_oؾ=h~</BˣZ-P:oqݓЃN TaC%b*W[;vO6jllx<A( TTTdӅ$(B ?e02uy9F lw[SCдȃz~pP|9R~YZt:,)=ޮP/]<G "/O]YY6l=ggk׬N˔~H5Ir9omPNyc݆ P4=V*!,긁YJ `4ϣ 1vUELpݧNu4UUZolPScĸrJss3Ax<ɢ޶mƘXIs$(bAG?ё#G(VaÆ]vQQTwϪ>o?ԧ>/M^=% pzw{"Id~;ΝW=?p>{b1 wuի:N "s#0rFh4%%%P]]JdbbX,۶mĆ &0ҳ ,?H!QĤ1 "c䜬5kdzz|2qvztJ5co^qirUl{j۵KVMt܆ g <6j֫f%'3_KtRS}{v34طo-onVN0?ǯ~y{o~|gyf7of´o,չv5Z $lr1BpJ4znpP\ڞ7YH2f#əx 1 ϧ,(-tĉSfJJR*yVڊ}>:>JP(-\$)!dA@phbv8r7͝NbX,''&&* )0 sΝ;w.xnXP#=/Yy"$X}awl2HNNnkk{wVVVnٲElzݺu3o_Tn޼âq,xm۶@ZZھ}^y/? 47n`уEBn7QdE?Wu:eɾ>UVjU _\>*n=]>tʇ= zzlwm[֚ ᡇ].-y_q}oV֚NNƉ!+++,˾>#ԼO,VO=ݻ;::GJKKNqaUV%$$@zzlՅg%&bAcEn.AQl}=P0߼y\Ofժ2`46幹0K^5Evp0E !iB&aܧNɳ((KHB$rB&e}uu…tLEX*yz5c&DR߸*)qGQv6 inF^oC%JD+#Ie0fYdwuuUUUi\ 47774Ok+K0 QDEvuu1 sOSl؈IFqhh(Vڵl>|;ȑչě|*6G@cc _k"W7n p~<?{gDnI;ޥ\7* "ȃ*x}AAT[+*@Wk[b쑦m(zQ6ٙg,]#f:@TvQ;pPPu?oo#23=}}LVc<|8Hg6Du$r[UUED1 ޽{II x˖-oVt>r&izD2hР &&&&$$ 2ӳWnl,ᘋ YY;![7b]8 egMJJ)0bDܸ8NhmtiE40vXm'<ܪTjNV'$sYՂՊx SQ$͛;w0cmvMm6\Gfs\*b2cw$'"p'2rEݺ23թ9s8&r)1X:,ŋ}||x<푌x[Mxu v}}juQpOE."$IؼysBϡnomʿ%Rɓ' m4`8aԆEj] DfCÛjݳ'tH6=08Xw R-'NH||Ӧ@f<=cTO紊?())4w}711of0ǏovX >ÜK.lٲ/gͶr^B"߂[sQ8R)|OH&իvnllKo߻746nvQ499(g Mhr5.YFk|KARԦM  vpFmVi[mzD;)^/eO`f3望҄5u`P߾ulї_ƙ8MΟ_ Z-3'G^Ϭ@pV'N/X;6T!^~9!) IxBzN<{'9Ʃ߿z){xZ- Y,֭[hnݺշo_Q(ӦM |Κ5kiii/R/Gx@fB{Bz]QQQ__o4IȪo߾"q'J%v&jux TVVFZ~}u6i$p8ӦM۱cOLL4Lo߶X,'ODrMLBa>}>Oq[y!Cl1jl?^_b0'NCӸw/4|qݡii~2LZ59oZ\,G'*|5Vv6xq޺u1 9iJ׬FQx>gɸg+cUX/!4ty>>>6lعs]Ş"##{=eΜ9$I]Vфg)|={^x!''SpÇk4ooɓ's^W ۷;b_$5jT3ٽ{3(G9sիW###;Sץzu֮mxY x4p~N9u":̬Y}#G?~>s__ߥK:s͛7f3,^C.QVޢ(jĈ'O޽{mm|sy >څ:G@ FTTԄ ^}cǎ}'Ώ?XwwaׯO6ߟfK$3g޹sjҤIƍ׭[aH/ 6, s8s疗N:l0 0 ST4ڿ .J nݺEi D">|88q^3:YZH#xPYbD"Ju8vXrr޽{}||jjjvܙxMddd矵l6~4h^o0V%k;HYYGoM]WW{x}8jD<@ . ɴ8,..X,7́7njv9xÇV(6N0ڵkF_7Gxŋ=a(8ۭ]eZZ-jϞ=;.T>.j@ tlԡ@8"\ƺvZEE$9o á7FEQl뼫]"g ϟ>}Z"z^/ ?QEZ'!&j5ddd|;vH&w9zhIIÇm!_>>PYYyGN0 Ş={ f3MXLHH (jݍ҄G={ h7n߾?sL.fz٣>4_t} <8@t2۶m۶m+Vd27n8e &N(Y,Vuu54ۓ'˷lRQQQQQa Ii/蹪sYxVxmboh4nnn;ԩS4]MZVN@ k`0<<wK.^ĉ322OjVkϞ=-Zlٲr ǎ:t(˽pB^Fiyh/A CBBlf[JӣGg*+hL@ k֬Yf3)vҷ'Nl40!!!--~?(ܹsΝkO{FN8/ /R1>3g3rH$@"6lh7FDD4Ma 9rO>ipLV4*jf#..n„ }mZ={]ai4/իW;[obҏZvd:~ٳg u:gpp# dɒ=zmBL& Cwpخ3iV\Io)Vۙ9_p:qWܙ*HĻŒJY 1<.כ4GDDtDעT*ozb3<==b1>Et쒒^{M߼ysժUUϜ9㏿._۷o5jh)AYYo:BP(W^ZK.})JII?~<rX^ynH啕uuul6l编Bt& !6?iv]|}}Etܳ[Vlg|uƝ_qg܎#ʧ¥K\kXf^S7_RR҃PT)N~5"Yf:Y_]]o%%%9ϰa4} xꩧF3g y@;nj#^z5:7ooYfݻ*@UUɓ'Ǐl&jzGEEweq֭۸q#ܺukMM DMGlaaaVV=dh4׭[{:hGT:ؾ)))U322)[[NG4;S6xT*y_}&)ZF$f%85f?хB/(cGoyh}/,Lp7hxBܤȸ~s=Nx{{ӓG=c ZuuuNfk.Zoܸ^$e֭-߳gϤID"=^5zfǵvM+x~Xuu5=0 .Օ۷/99t^{Ϟ=T*'3 W^-,,8p GVDjvP'q2YWܵG"5o8xs@|L/E?˞ IDAT7FsJL1/m`U ' z *x҅)g#_\ _{yr pְOaFRAXO߽Gg=w?nJ(ѣ^^^ߙdff/f(j2T3gFۋq8JR;Łj,`Ο?cǎK^j:3$%%98СCO$ݻw/]w)JJJ>cz`zoF6N2eJ[k׮={FY~}TT.qphVhOVʕ+>lSߖihlFzZ-t鍦 BDDϞ=sFh>t~~~SLٹs'5?VӴh4KOHH|F}g֊DٳgӾOyf:9sfΜi31,4P*EEE@ H?$X,˗z̦5j&1d EQ$E$%ӊ'F*q:uo߾⋓'OB022rE*! YV4z&q0^GQ`2pnjfբxaoM/^T*b_~/ͻ֭> ^``+(ܐ ٳ_~YXXj*LqFzergrwwŴIHH}R***`]/JeKf2l. Wf֬YΝD"ڣʕ+wDA~GF7xUWWwĉ˗/7~~~-ʢcbiLG3!GMsrrrAbb3EZ%MT@ &Ylwe:g"(U;~`d9 ONy&V&EQ* &&>瘘+V@}}?bŊ{v~ ybĜǵzRg2 bIfYL0V+UU$m/ ŢE<==,YXUUm۶ B 78EDDk;vlN>hР#G&L`BcLy҃K2\N+W;qoM4(===;;WÇ߻w/9rdttU"//\.QFgرV'N>}ӧᇺ~!38>f;jiP|6Iz( LBv1`OWWWӇhqp@jģh"n߾]7UH?2yFo&,L2>nuyF!$,0`xI# |xC 3grV<E/GgƍG[oIRٜq^z%f_ZZŚ0aBť`nf0͈aXRq3q8L&d2p02VPUYN ؋o֮]KiCCC{={G}F m۶˗/,+44wkM z=?d%")))::://$ɽ{6Z頻j{ B3fiں 3F \vsa'I|7n2N8A'KNN6)/ٳgӧOOKKS(eҥʼn_d .$ɵkג$9gΜfu{d2 .p83f8rB8F Δ]>cI}|t@AQM((UPYYH3 {-+ F#:yہ* ðfA=ЪG^Jx$AYE!0Si/g8q <'Q'1N(jFxu%O>m[w۶mNzWCCCܹ_!C9rdٲeK,)--]dItt`˖-/^o~šCZR,6l@h3Af&~a ca`0V H D5 تs…_|1N2e:nժUw>so? ?p֬Y#F0Lٴ髥6yU*գNVy'Ns:id?C:͘1'&.]rJ  Ş={l)=<<^}զErpަ 2?l_$}+WZiiiiirwoٷo_~~ Ҭw@Pг)$-BXXBZ^[E^sfTtlK5aEQ$a Ew~AMhxSZZZ[[ksGt\+@MxDQ*%2Y;t<8b0@o3AMqg3AWy9 cʴC!,V3a {x,1ry&%A| =j2Gў>}9~&%%_6L~飖-[s9e"Y 7`4a8>&X,rH0`n 7; TUU$7&44$ʨ(d2 0~"Q[mDK :t˖-2l68p`Μ9Nسg6-xb۷ݛY[[`0|}}7m4~Μ9iӦǏt:X4r{E&mݺ/Y l~mL)))--JozÃю^bql,͎Φ2+FQ q޵84}gP*$&&bbb111Ϋ3py<%jRģJ(oZ  gna( Àָ̽q>/'_XIp+8AX^Kφh'^=zo}||L&vHHm[,l6૯}YYY/_H$h,((Mxu_(r!&=ޖ/_^WWb>䓈,zbZgGm6~?ۧ[L&$FA?%x=h4r;x8~HĻOӿ@уP@F`]'1b@d"KMuC5gC򅆆r8ϷIX":<EQŽzj`܌V@F$IQEQFl"LA|~:4yd۫hܿlYf-^8--^r&,˙׈ңG> ?? J@L&kmvv ^{5D8OW^ye˖-5k-$I-j}zjj*uc9Bʕ+ _ yzz‚n=zAe]3Ͻ&tkUTx4LiZW0L Ѓ,喔Xd=z8KdC^˹FnjMRa8\E/tue.X,ݛWM1S׋]Sߝ[?3@RTb7*\gk%yNJ~͛O>?qqqYὯ ++-$X8I҆i hx00p(jjuZ.(mݺ5977eCBBVZeg͚%:w iӦZԹs~7fIIItȚE|nG K{mH 6hX,L:6vfmpodH$ׯ*JwwG`rss>h'OLOu&'O͝;wdB!&dN yY[M0š#GЫ_%qFff&vڵk3f̠^*+ʪ $ {33|~KVR+.kh^j`07p՚a,tfܶdNI֮3p`2)/(n ,*f|~n9ddj/?-jSzQoCHQ/7bl{C,(;Mۻwsʁh|O?tȑ>,է~-[;q"##'6ц˟CQ`l[1 #+i4LXBE~~m}'iŋ›oox;%_+Bb( &Co0jLR3o,tҖN:}ӧ7Q"!o?? u[34KW۷o?{lmmH$JJJ={v"34 g0(t!}q$i bsV רִ__gدG/00-Yfǚ5( U/]-j}wM 3 P\kW*[($]= ݳ'T"1l~m2ZͶZ! 0yrOTrM~xs -Juǫvݸ!jY>>ɓ˦L):@cǾ)716[4v{М>mh8k*-ŘLѨQ@QBsIU [7ݑ+ DU0ͥhHP?NL^r`B:Ü $Y~~^0zE%%V P\\l.-e 3ў;ga kOS4wvbH$>Nx˙>>n]f8!nBOn\NxWEn)>m&s|ic5h e2[nţW[VoԗW.ҙ9buQ#FW%>w &r7\M 08YdmZ_=pѣG#a@<$''+]v9#i#KS|||' .l7oc޼ykjeϪј=R奷nOՍ`"ZeEZ:⌷aCEaB!7b3kǍܾ] ł+VXp˹J%[e*+yf0G%\QR" |RuqqHHDլM"`y|Um`*C~}HD%:7ʕ+|˗l3;}2DuUlcĺ}7v3bQQAQa87%%,R'd2KmpP\ De%\)?Mu3cqT*8ύCfV8cUI#KK*UbS&Ώ)=;;8\\lUj5C$fvQ\.Q\G.v1piIII 6cBݘ'j0L,&jh4zRR$ūm6\wwwXYm)qck5E$i6,V+i%s.<ӧOGH;%5J3Uk0V;U T.+ܹ#a䴂a&xV\ł'$}-0*^hOo/$ШQ)S ZͮeZ"TT##5aaLrddxgfzp85GX LZ KHOR")OC  &e6cy|J:٬:|Q4z4n7(  IR3OV` P?׳' у2ԧOad8ڦNTWsHV,Ab"8e6S 3bRi.)Id@Qk_S4{v'FjDEC$"$1&0Ǣ|xb0Й2NAon=LDg KBИe 277JARAH؅1U]#)a҅ qis[WUV~/^|Ů?2..nN#G(JuyoxI@0ϷNUɩ3`'ND!JK  b2(ʹuZQӝskQ ʒ;e 4U,w;070NKsBl24Tyy"NQpXCAy{ <\Q^Χ(#`ڴAz=6lyc IDATڰ!ʡ|(Ks"!$^IA(u7Q/ɼLS<~~'Kn }FLooK㖻Nw \bKcU*zwEV` `ۛ8g`P&Hkc168R5sy9{wse%b}\Q3+(k9  ▤()2UKq]ֺ!KXl?;=_)oYǷ5FjJ+_\\LGo5y^ w۔ >?A F<>p:Ply. p@aHՆ{q{6O<'IRV_~}߾}ݺu4iQ>}>|駟vww?x`III"}QۇX,^h˗SSSDsww5jTbb\$M2eĈ999/W\\\\\܃2@ A|Q </>>^*be{webb+^eeٳ` T E'Jv^hlP6E{ԩÆiի^۶I/_.,@t;Àݽrp9PũSK""455رUPv,~?mzp5-'J W1| si!+X,NGjx.JSQ!Qfs#ՄLMOtqέf*.&*+U558Kj60S~>}V'6DEnvpE MV"4hZCW'16ri#yӑ= mm6J0"yP(J?~-'MTVV6w\6=|:sEUo Ǔ[PPp2FP( ֭[DDDWEʀ x0,<<<,,LPTTTFzX.,{whZL}~5Syy>k֞=ł*^P~9xzx"-Waegy[Ppϝ6t͚n~~Fa+}+~%TV{zy? Lw}N"Km6Gkh<>i \ZjQ*1Ǹ\vh(n T~'(DFv,7&4-rUㄆZZ{y9;׳'.KJHpXBnƥ``AuoLT,9V&Gڬ>[ yml2:0|#Gwj#&>B0@ 8K$Dff͚h}CCʛ^˱ӧO֭lGh[fs͞b(YW Dqh:_d*%IŌ3p*A:Բ,swshK'"ufk~ѷDrnT~^|1#rZ愋DPiogpǝisJ"bߖ}l>NrC,O:r ط5L@ x P^)kc8P$:ku$`wgJAtKK ˁ]0d ot[&k}lKyFvs'fpJW {!@ / Nw=ų AA!E> ZhoW!}FԀmR_OTU\.':UNj-!2ýy 1We`3Y6S;mjmdo+~]"-Y$99y̙C =}ִcͬV=z~z_ꕜjt! wXfdMFEc%>G!m/YK~E '#_~G)*jqB\ P(T11D< ${K|qyWxp#M+;vjk!; m]~h4*\rj>(_pXDפ~ҥaaaΜ9eeeY,՚ۂ:!#7!߿^4p K<ooG@|Fڑ42짟~:qą BCCo5Q[%8$tF9:7;c}\eo?wΝ;LfϞ=͛־m @ Qw/\ jBl6K$׍@Lu7oWF?܆ u=g}FQhxbff ۚMY!h*xغu+Xkw}wƍxt,=]H4CX]]{*ݷAdž)R-*rLp" UZ M~&?^>+e6d >  gWt{ڒ*U ׀L{|$Inڴ?\TΛ7OVoݺwmS6e@ #KKKr9HR]n|||iibvڈ._7.JU~K( 3/^̤^"` ^VUhd.,"5X#pE`M P_UT_YWܣܯh/**aÆ8ٻw3g\nnQlj۔UtDdǎw@:H|)ݶӶe̸;,:]%4_ ؑ2mBY.J֣:dqX<|} ʼJYqPvĒ0^n~~MNEZ,dq<8|$$^US~҅W!OnyzzF16 ~8qj~ ]E#B,pW&6]lJιUXHTkjdiiaڧE>A>#,.iTdgԔHpP[3CEށqC^MT->M$AdV$/(6a+`InvUW@Fz5 Pv8qj[JG#B Z..!!! Xnn& 5z\@ 0~%(O=q?e^V.MaR^\|Eww~qVx(qނ~G=U:~_|AK.]|੧xh. vlLOMݧrh&bZIg1n| )O/޸ױ#Y$l}f&[L\_{(C@l?_iwip|~j4 #8SQUѾFX]-?wtllԹ*8_1K5RM0 ̇)6^ڵk֬Yt⌌ ooV@ HӬ\ѣYYY7nܸq#S"|zբ3^BTjZ3A4fP@f1=|7>$vz[VgLq*SR(b"0\^pCY5g.E~=>ߙ2JKL6W0ǙYuE[FPfeGGs}|)@ʪ|>UW4kkg7 E~`x&1‡cqȑ#WZ FrrW_}Ԏm @ Ww0P믇X,D2{K.v8w +YsGq3{{, .M")-S]%2%ٲ-9bGo$r[޼c[bǎe5"-Q".vp˶ Ds`3Fޠ I$I5+n.:^`əzsuӖ!OC'W]Yi[rZl<M}ܼzh2?y`% Xk&FQU.\X+ lSy +g?~B>(yuuj pؼyݻwL}(&_+,?|(\1DV`JeHL HXY9ykOϘQޟ(!--7i24֟8r8Z`<%B==`L knQA?=WJYLS nG?Y}6ZP\A6'Xy5{$ =Z&uZ~?m= RW@^G$~8_@W0 \ӟ(Ay!1r]2/=& _V^A) /:J)z0&{@R@)DB J(BHFְwHD) >=ag{+diFE2%$cXޜDtOAG>y=)iVI`ڛlO}kSxrz{9  ˲e2 $((}em۶|][XUu+jI>O (Vf$I@!Eۡ̆QQ ڀ)BLc (IRkt Fv=**v/Dž55J+%H ]B"21 XweٛoCŲi+!oX)19CgNy\6na*nOr|F. ``"A"J !.جej7}r!%.^ Qpus'&r]A$^ (P`n`4$Q"p!H"$Dy"cT.Xj䆈PQA!BA$JV K7^*pp ( X^^ƘBhk7ߪ$2}0`Ё5RRSgX\<11|^wޣ}79==cq:`4h{% Ju,XO] B^]F [v^vCGsA@ (`L]xcv]$"S QjJbYVѲ*˲ZVV/XT%gD"DxiIDI"e/VǓ X DrpY0F 3Wxja 6*.f0X8J]~| bJ#2id_3=e:$Qp} ߦxn (L;m1$'`tT%B\jaX3 2a01099*B2EQf\8hƓ@7}h qaz}͊q x3l,]j0 28ђ(b0yM FXI^#*!J(C !aAt#BHN:$'-z{O/IJW:RoW xs ."2 S#+,!^pi Rʅâ$9 IDATY:!abZ(s/xH ק"!P RJ9ygWD<"^ެOH{V ~  !dF \^wg2 PJ%D0@ah~rxtYΘ@|N4~ ODws(|n[[FIubfQkscy"BD)$%G "$ tD$I~ǰxh}V8D)8 &fϽ ,osޖQ\Yx ` #Džv@39%dERB FIDEI$a( _RH ^i \_!g˖7tZ3J fKJIA#B!Jl 鈦Cܑ>/!uy\`zB}scڶm^ɺ7Z[뎗#כ K)%D (h(DC1 !N!^3p&KLgk<]슕ieH]Oe%d|#^=LIXrQ5PJ >_I){HgGe#D$ $9lݗghyy/?zTtǯV+*O};.oM4.6ymm1Z uQTUꄭ[%& UV|cq^(//g !ٳ/ҁ~򓟨cHz=jo}ћo_Rj6pfm>LH+ZԱ]:ɒL( <љ(СlI" #!Q"a^ycyPZ꣫0'6V/4sZM)م57<׹pa߉%| 2 3ڹ` ~ ?g@SåRJPrZ&a.I" B\W>5^^>&|pb)I_: e˖'_lhZ_؄5ymS}ٞOLL{g^,˖yxe7n;KVdSB! * FXDAC q2q>[w[}X6%Y77|8U#y.<299S{n-4 Ϸ9 h[P@< :z/HNj JwzIZ6!dYps{b"Lf,H<g8ݚO^IkEVJ)ĢsXJAnMcg ==ZyJN\ jEj5wwc^[Y v`FzI ),;;%Gxqb?LGSUŘssvRȘ͔煾>P_11gZvtŢn5>5}j2-pXt:@j,Vݒ%, [%sw߽톫aݻwq˗@FFF[[|0 tҍ7ʅXk׮yZ[nٽ{Lߟb  6o wu >AXt 0CGz:+KSQ0WF{3B\s3f8|JeJWWq>0dyD^Abǫo@RRݻlقۢoJJJNg0MŎkoe1tXRSRUM4q买|#$NoV /Gfd(~䑦.o~P/7b{G-XCy>B!!Dg:gwP:u$-Mk!%0ps%!{*8T'K{rwvoO<{;!!MtΑRR8NSs$$OѰ))2- h tRVSR"G#ZϜỻu==əvFKժ任@3dW vJZ֬e=!}@]AV3TtPw|cYF+}jԘ4p˼t7,e@9.\_?z4a˖ȃQ5 J(!6WmJJP,4xߧ'Cdk" >?)sPٓzc}jzvBrZ!$qt9P`X/cټq5)$~xPzfcw: V]r]7h{y!"!g<ʥx1f/б:??zy#"y =f˹)b[ANG?qĪvunnr]<$Sg=Vs,@b^H޽LzM%i'` ZV74HT*Dѩ&(wM6Yҧ%^N+jppB/N'_~J|P#ݻw|PכQA_-HR cAXZļxG^շd3(zt@%O!(ʿ|Ar;?!PP&c4jJJ"=WG|Bw7D8N/: p d5HO\rRq--SAz:/kn_0f300jhAlV˦GYHA~Y -a4qx>57} klJt \K 75Ig) 힓"ݍ a N<2*8"x޳gϾ ,ؾ};h4xO^_|9q.]E .vNg2.]{ NGGǤ$~cƍܹnス/mZZZ^~8NE=䮫=|x*ɔ}뭓|.cԩӧqm\dٺ5hZ?e(≦q_a3#`,,޼Q4hO]0l&[\g=,$"36 T[+lH.d\BO&Glj v!)&_[ۼȠ.}Qwmmɓ1zfC@Gq>29F˿.Vv)$>B$!|yT}j=zovҕkr*%1NF#VƂF єPl*/'+|䉡f3A|>`9V*-Mp8!uN,EΟ#~n#{c]9w*mJ> ӆ fn FUf$=]rL cnjG~=ǫӣ'?HRefHbSR~wz4;s/B/<~=SO=K}#۸q T*ՓO>o;3]v>8GDqFkRRyyx+k&nhի-N8qܹo}[Ww1rm_TC; Ftil^VIBFaoQ]" 6^Zf"<Ɛ &eY;vqNnz{Aγ1 e%h eK@hh土fğKHvHhSdaqvmSO]3eòr2^'xC׾ܸlt@ߓ''>VV6̎+rg&[UB9upc"GkTVV\,].fZ񚞙N1k٢]Qs3Q{^ԅe\-}랱RvQ\%SAR1󫯾:#bx(Ppx-mK9խ&>aqM_|B_]OFŽ/"*MX&-Bb\t~0{Ԣs) F޽{%sqEo_*IkgI>nBl2;XnB~e ^?vLT! ;Ԧqwxh,t1X@! 9;stUpe"ϪTn5T1-[";?a*f㚚$0ftc~VJHyj5IrV+L72S܄(V1DKmb1>'Dp8ժ,MIOHEQefM7̵P y1okiH(jUNHi%i <)F~]l07m92<CTH+3gfڗGiuu\f)fxb.ݯC0Y8s=}ٟ'gJe4WZO\rJE}>tuuxO|^ӧO{m۶0zzNǘSfNUvvOޗJ`$ib1pi>W_$Vz}AU_|\B;/g &1>b_*;{cut諪rbp}=ݭ[1$;x,bYUVkuu\kn"6%p\tt 7$y3gepF1+MMBOiqE==Á57 jhT[, CNlک(֐=qDJ5uB69YeʚH/ twv۟ghun7?VkxD`5 }V&)VBW IDAT|c:cD/Jãgu(_!ڃ .r]x_1^s<1.))aFR]ӧO{+lJ bnͫJJKe)l*.%|tǻXķ骫坡u55‡KB+@,5KKCO{?ILdTLB¸59Yc*I\saJ^1Ң]P lǘVlVoL<JOHѣF4|YNos3-2M{<wq\d:L4A AΟj0J=miqֆz{cFcLbfGծ3'VuZ`O}+A8~_k+h****p\ü+!LR9$$!|W .^任j+*dF#餄u>IJc9a{W`k_җ;wٳ~򓟤}ߎ .<O=~Y$Cs uN?3unn*Ia.UV$/|rQ,3Q RB" a/u1wvp8:Tfx_ڲE\.77,oCh $> c(戮 }/TVӍgZbQgO1/z{էOx>;{@q옯%OC$ujvas2ݎ#Gx[է-N*'?xyn?R;EjGhV|b^ QBܵOKCXȮӧ-,Xfw%̒Maq/t`5k=xgpe$)h4SPٽpV:]1^W0(--;~Wj0ٳ?я>7>󥥥}w}W.?7x㗿ecc$)33sƍ"a66lv'$$Dý7W$t'|Iؽ{m6^6m4m۷o @w!Bx'6#l6UjgQ6-ʹnj!Ν0݄B &3E!Y,CqN17#&'ɚPmmNS\4W "cinwρ9q#GwvjGˁ0Vef ݔV+/! bJ6]ƒY)|Fs&NmyyIM^>W,RJb&*G]+):{-tH9^.;xᇗ,YE;~zX&;v쥗^zW׾)`Bo/yM~>R/wl][V񝝂j\#$Tȶ[ JQ]0%1 FSPgZ57`0$D,Tٴ4ׇt0^q?%'|lF*To# ))˪Ҩ$@hKc6% ri tX?7BVlyEQABNg_Cݥ3*{yw9%*i?x8RT,XX^Q0l uj[[yq6LCw/Y[{OL:e+*-X>9}]]˖WT3W 7?sJvMJ3'YOP"MMGw@Z]\RV^QYPXd2YQ}^o[[Kc}}Ks.K36l9|~l 0K}Ԏ*X]_Lϡ /[`|N411 |"Ng*1?JJ>8Lſ? s` Y#0CYv.Z^EWQb. =;b%kͲ @ aG ըUfFͨԚ{;k/tTT0[:ĪkrںjrN V.K@UDިWB+.NH櫡Ç3@w.9<%Hb=eyc޾ ړKs$x^g0ƫ8O #Y <{<Çu)˗O+rS댅57#{[ϻ:.©:b?Wӈ~0*Yhu cq(p?lSD1$B7e-JwjAǂ?ygXo~sw m6ŢR`e=˗/ؼVj6558_o[xGz)߯&YlJ/~ + |!r0 9 11Ƙaa1rB/; VW;rZZ,I}|]ȃw0̷tq ׎1 D}A$)55}-B--*[vgW`X)z>`<N4^/מQZ0*]N|K$ K Vko/:zKoj3)9u?4:[}n(蟍Gg*>oU{$#=sڝB`B;0 J$Һ[nMf?}z7>8(A`y m,,e&11qѢE;v8qď~ȡm۶?~$UUU}|g+d2޽{ZѣK,=׿Keee7Xrឥ’iV@, o޴Y7#FQ4)QD OӫZY|ա#\/Ƭu<.{e2!1RTZRVXWk.\Xnl.^dڤR;~ۭ>M~'-U}J^%px˭(_ k{! J++ &` >r&"=g|Ugj~Y^nq9?;r-ǽygW1*M۾wߑ#~#1BEp#@‚DAx폿Kᰧ>qpaY uo%˪22VMaatX!Ŕ%ᾶIPE(=ux^Yo0\6?8%!7(5R75Fo{%V5L ~'%&%ӊcF-JΨVС񯴬|ӭ[32[`4ofM'a?tՓ(Ϙ7|YwW1Bjښ.Y;{miYql~nh :/^FsBx~?:[K*ZmFzPQ"a^B@Xt:}墪NG$'on:Z Cy`3fΠ_jt<-+ZZlAkC.!Z^*"OF?aoܸ2Dxo]ܢ5Z\|аw+sG1#x64rgw tuY*+GGeei)((ɹ}A0F߷_mږ6Ig)ZL&J4KĤ䌬{`pj ( |Yݾɜ`B03nH*Gŕ1(_!hfX ٷhovU7(|? D2FVQGN?")&9*_bV1-E#Âe?;vġJ)cڀ!koB7ֶ6v7tŒ;@" ("DP^U5DQK=|Ý"_KT#0ĿηcJRjwt`P uƂ}VL&ZqXDbLׇMMfOLBarJJgRA`f 7`~2G䓞t޽{INvQx!iS\=ZNlK:ƴ=Q3%!*CbA_Yy%8>}n;;(3+ce ʏA(Eʜ@(ER#Cv,fcR& lX3h5sdwxf_npkAq0W`8 E@0`("aA"fEoCv|OoGY3Р9#ɜx1-qt=q!Q˲ .O}(1_ң%e z E/T .oeqIӰU5L愷|Uȑ[o@BZ. Xo^wӈ7T-kiu5ՕU.W Z`JOoGQITt$0jۿ͵o΋Clrl 'H$Uedeww_Yc+,O sx| 0⩯?}Zob0(鮫ce Ӭ>^uzKJ^ff( !qt6}y|ՕU{ԭ},k$[n`0`&L ,!72$$$$ ``/nbɖZZKK꽻{%ZRet9ԹU_{vo}Yq]RiW(ͬYY=4r… ۿ~{?ywBo+C^> !8:]tL(bK!TwB[\ѦgfgKHL( +MB@!H@DQ75ZYtUkҌRuB|MSBZrM'|U[};[ɼEBaH(ㄤQ twkphCDDt45Ve뇕'.4M15Fq7p 3s@ewSݻ cҪ*95}k)FŢ퟇3mZBF`Q؃B&BE|3rJŸ Q `kmXڜ)ڬW]{_46\ڷk«Λ5ݷ* BX$$$xo[55zXV lg0MA[eeڵKLhAY|,7 IDATb, v6[{蓌Ə#*[xZ-Ge|#Sc+FG!"BEnluغ+UWY93r@ "B $"X#yktLH C#"DQt}! )jզG>vi^~:R@ߪ> 0!"F<,J>.`CӾ˥J{F#8vBcriS@`HDT EScրҢ3s,Z V{M9H9T=,"D u*:rMnOf, 7Lcá EPWut{c-l6FVi uugr|/}EJrΞ8R~уvۢWuE0)J1;@\P#?+FYZ?|MvuB9y11jZ;:j.V5ISOڰ}{0]NhAu8Y\c k3t'ĨS%3QM& LiE7ޅ>eȸQqN(@DQ׋ Z}a9;l k/U;gO?{*1)emwJA00EP ,UPA b$0R#6 IgyAAQTќy&S{>t:pZ! "I `(S̟4OJ{Hd.e՞ N9ݫ7ܠTlpBzV6Q"#,JzKcP#?cX[[]7KVji3]!6.Itݻ>X g2VVxPqQVֱUnUq'HGro7|G5r$^ƷuuuSE(pA1=HQبW-hTSu"B $= a ~ah(h4ZI RM޹YZj+#0!Io>HT@諡xnDGa( i3c> f‘NQ(1)=2 .[ۿ7} dsVH4%$Y->nm ~E%$%-\;.y2^B(xQobUN~hڳsGcCݧ;AcKU #1H %s$1z?pkW!S:\0 %ZvW鱻>1)JR4Hn>|_%>_Ӯ]6 S>ײ⫕j-E/,@qv[WDIV82$K./ Jg@t ƃ IWV!DEHϩ(1zoQTjt]2`W>(w]T]-(#S"R%mDq}7*ئB~)(Dݺy8v_|w:aIcܤ딛.D' y|`5Bc"|L'Ť4?Q gZR(D(OGQhŪIIɹ@JVJ,J:쎌eI)l'i{Cpϼ{ҟDc?~?h**D9^0vq dmxYNDjK-WWxPq1R+ŵ|Y"N H Oð'0*cL!}lҟ! MƽG ALQ*ʊ)QgiBt:]+k!0dCO `}}V*US}FNFƴUN䊌LQ.!e!C_9u411`AL殐 RIpJ>L%|,M-_l46o~K"=1+GQACT~,d{]~V#LD;O͓Hv]s!PÄ`Lں\Fd^:O\qBDžʼ7`]v-ı^7pWc'C 2C\6Dc|(2"1)ǙtZB0&^GEƱ}]2jI[D)ۼtOLGbii{'BTQt]( V\e2MaU&MV^;i4ZAY^Dy R2MQz !,q+ bGk"' OHk("&YP2J/(-3>p{k/'/]D `zA#,+_d仟hĢzlB~Ay@}#T_^KeYQ첶_~{ݝ֨[nKӍ\ظxBOVar0Ik<8cb&#8EP("N 2dL%72fUUyADa1Cv?b!1D)"/-tkZ˵nޘ4%%SL,Vna;[ItnSR$K\,)iI E!~m/,bhh[b,7 >Tt&JΞ|^-Vw J+sK]iOa{*Iv1] OM|PFc^|wh5”+>ɓACQ4M34iC3 RiJ /)ڙ =).8igɐ!C)'&R EWS Ƃ!&("'X{8k1//tvvz;M&'SJRqEVEEDD,~.$Oš nthuڻ2[a0h㧪t c0ҙ]v (q L`[G8Gⓓ)DdLI-u[\AZI^с1/[҅Yp,\N >Տ钓2ksy/]uw7nM֎ZW.)g)A`+ϟy^ K(Dϫ{]`ЄFxT(j\B./CF<9P&27ƋiΞڗP*18BRh`s9^`Y]]6k{&g}- "iCfcj#c2 O;juГ) QQBI1i?DzlEI@Ai [IoMO_xԁIcn4bϻ1~ޠPO9Fi^ ]ֶmLCbr'TQQ*(O86w1"XĔ$ˆS+0TjyT_UQQAF?2)3)f+Tjq7”+/߮R%IMnYߧ*.Fn "BE+3iyN GSC3V)4=vq$wyȑ#7pÒ%Kz=ݻi^bŊkcO<|&/LdȘF$>n"[e)S CT.&/\¼ "j%&E0!i"qjv`QEr9>**ʐ9b{uuSeY΢f\ڋi3 XhJ 7{0w.,e9dfYclmkvWG(x( YYʓ'TG\Iץϗkkr L(dzΨ蘛oKl LB|[-}-ޙܯČykSg-9~yyGtԝO.I.XTUsf,FK0EL!5կJ:0EQ `"& rB{{|yF47Af̜E1v"0 j/w81ј9Lr?[mYz#~yyN֞I7D%fܷ LxƠG>M bXvY;0!X.W ,O!H ?rp20 0Zij;ԴL .ɨ6ou@c"%p,3τ6$OaT;;k,@H͛Qh\x%EEn(}8 u=o70??k=Ax7 Ñ//%%%i_{0̬Yx*?Ҽ^ѣG333ǏfYP?O>Zz*RR{#W]u߿}n j瞓`mofꘃ,rF qٱqt6^b cns%ByhFT) }^b}>)iXH hj b.tsdNJ_tx 4`YV(:ZDũv;v)v/#PJeEХ :+*cc ʲItok8Qv&"&3)r J(b!,dQĜ ub͗1&'϶نٓh%k8{`-1ɉ&("zÇ[.H+\:kImǏ,]p4Z=Vˢs4"sxbiqcIJ(%f<*d P2x*YPRAa#宏l]Q1n[oK "J@@xwJ;ɍy11nUx^{ӰV칬ncވի)WLLpMQD||k+dS9rd˖-k"{ O;viƄB;,M9XA_Բoߥ{r_{xS &<]Q bh Q(;gkEso2XPx"2.-2.mƂuՇI׳Gag^Jh5jME"vܶ.݆EcB0na7d0 l|TG{!҈1\>o4EtZ"rNawغCL@MhA/uD'nQ3] D6kh`bcX ˗#Jp=z5R*=NƆˑB᫪r;fX"daXDQLm߾x3gl۶M\sGydƍ ґ 60eŋ@JJ㗿y !!nΝxގ 2xOT6D"{(>oUIq)8F7AnGzV3P)ׇ_Dv>g>.3gI0|=E;,ai L9s 3fIbtktƞzOUi1qssDJ1/,# aL8N9;;[kfҴctb~>cl@TI[a6i{B{KS31ynQ(jRAS ,s\n c - 5G P90 14Wj޽,A[З%eddh&c{\/} @B+Wݦtz)Qttiid>Tv,!}fC "vy6kwSZ=sPѥCޙƃ(o|.aƜȌ9fE=!ҳ`ąUF!RX(ttBQm)|wF|0$>11醆Ki?y^~嘘7l <="~骪cǎٳ_UXڑ!C7Kdb]ww`ECy8XPx( W_MT^6!U(ZT # ϱC5e**t# $wJ+##VhٻWЈRqd[Ksf,q-@vZ/9hF!+W~UA,u5ƨXcT>2Q(QcAyu;65XDQ+W4/b(k`;;ٓ fdy}.Fh5ZQtm6݆1io{11SxPqUK> 7mh|K2- JjRK6KQhhEm߾o Lw8!11QP?^J!?~ܹ`Zo6)?Bx6 IDAT`mٲꫯ^JuQK.8q>hGP |!C7Tfzk׹slj(dꪱL-^k=xпĭ" 冬)h:~RCVVۡC:)nJփ7im4E&QR ñ>eNwv eW~hj/";R*- EwUa@ I(2i*]Zڕ8'_DQ)o&|;-3r a"a[joZn)i<5/v`BŅuk`kkE+٬HJ##z)JHL9).4B{")iBsG?я;"={?ܺuR_Ȕ;v477?`2 CYY7t:??pEfsss T*moky,[QQ!¦Mlcc#p9s>(((馛 t; 孭`0޽{_Dv=ޢIDpL+rdxx QQeeꠏ$$ cf$&v=t Bf+z|3b-ڤ|YW}TeҺ?%#(u~){e /aŊ,L7m+4 qh:66qժ̊L|>eÆ]D:[;;"""M1JhXir9l7XZIY~؂xPq+W4N>')) (LoypP:n")--UW",J&:Z1ݱyw}W);;'] /t:~Hwa?_~t:w]UU5T?ci&i-[F;^yN%U{(`Æ !ٴiSuu}e|`cLJ~?_xi~۶m+++kii8d2lܸqΜ9Y}@zz+&7;2Ώ |b&Pw[8nbokJT%qzJTJIKMU/5^iVEt;/_-R* YYQW(B,CVt gMND!+K~k8Х-YȌԺ222lNtLZ7/2/o):66}Ӧݻ{ޠq:+/ XYY)yAIigXIJ;ڞ|ɡpJ-C&2ctS8 #JIi2/ 1T'aBrqaCㆫCuN-<_UUUUUu_״Z?pkb0)1㪪'qɓ'O>k֬ SCIn&Kwq=qʕ+zsICb{0c[?m8iB| {tuu![~ۤo?I 2dgd77_q:&'d2-n…öSVVf͚gJj& . #˞={&N˻;l6۟gyȑO?T W-6LwygJJJKK˾޽,10In~/IIIP__p8$_RRC)grЪ;Ǐ gϾ{@mhll\pի^oBG?z=|g>:>Wp_Ȝ7WkNLeȐ!Cƕ+Hom4uuu!xg>䓓={O\_&v]J:(ꩧA^z%ػwƍvcǤ}- v˷zB[ZZN`V wADd2I$v+J!v[,ԢbwB::`VVGDDNφc@)3fxg_V\/s{Ζ篺ϕ@Jqmf?f#a$]VFi4^ xNN]e)W`,\FcH9{oi!c ߲eKFFư`8 Ē%KFT~'!7GV>_ŋZc5_ujYZ v+ ⢕cR';c33R?ʎe-/!ć(iW˽1i?~^4p^]ٳ!TwX21?L}x7Fs]*Ʀµ#O~wVa^xd\-k"Ih;gL5&c}(iF:9u!JV$$ W`\ąEyWUŷbR(Huv6;FsCom[Z˖QjL1:cK p #6ɪ1n502U2AF 4SpxN fnկ~m6~gy&]!NiZ%R~_2 y掎_"##FD+**w%鳴c=>|8s ./#KñmJp@trA~sx|㡷n 8EX^.BRA>EM/Tҿk|>63t֝</O?&^s{111:=ZE%H?/L)^go{7%~ͫy>">V(/<$p0W~YWs Bfi) IWvoܞ(\C*#klN:ىjBڹstzˉ(jKJtq'ES3ke0p81}8}FgLh RKeO V_EԤ[MG!<S~7p8222+?ҀѝW/t.[… ֿ/#G]Gƫd);jvttHcX)))s.^oPKo3fH[2uvvZ֑jtO>>뮻hIjz޼yh뮻ӝ.]JMM NmLjSjj9W"]:ztJ^k4FO>VsiӿY,-U)RS**6{UƂjs.nn9sl|+Ư}s{{5ޯi]F&Ͽe5v|@E6)?Ood ۛBw xuE+Q䚚KQmpުuA2ɓDt  [S#:@QLTmp49(J<| \Cp0OhA曚&Tpč9sz6>4;GD6:"BUֲt:Uv2-m.uu륔JEJJ#[Q54B4AtWR¼vA.M f΀=0s$ HHp]9S:8x^Z tM~> 4exv:rF4p¨g6{+*"׮3Tn1 B =ô@0-P{ `66n!RL&S^^)4 9xg%}=O5҇kVJZ??ixZڜIyO3'2!Tz霱h.ʤ2Q re4%|K TQErPIlXgUNm0A]>v̰b&|B[n|JUW󭭊dЖ)cr mmCE]jyBJѡHNP:lCX;g|UU\S6Ds bER*+˗5LL fYn]Qfd诺Jt8X$B"ڒܹv:DT3^?m.h40 #2BPrMx%LڣB=^SR-.].ׁ~u7mٳgkkkX BvįYAtf׿ /jW_}l6ر{oDӄwttlݺLMyᇥ2/]xu]'}~~ᶶw=JKKO:Ų~3{ @||37a[effRŲl[[ٳ'0FʮIKKEQLLL;w.0cr4T1#cCit;O7mmmS7f2͂ >}zUksGtx!11W^ٺukYYY[[C7 ƾ+Çi%O<+r1㊋{l$fϞol߾bpg4 6nX2w]wfӉ1?]w%qhUGa;T*z?O/_aDT*r_>`>QT/ֺzybc:o&!&&cni݉="8*5% LwJM][zk6 =S_Kae !7?ßaq N\$(SS=OQD476*[t**nlzGA{<c?{CŌ_ hԖƜٌ}S@8nyE\b:K}UvvpѱEDuH?, 韻;k4#ʷO)3ȯzS_aڡ3:Z>*#te8CB.b BhJOw8}>JfeZZ!<*WVPJd q} qzNgDDJJ 4+JNe6u:TԩS/_(*..񴴴tttYf(+1) 2yjnjr-q`{|G[_||0mM&PRزeKFB:Xp A3gQ6|EjqQ X uvڸYm5=g@lDQńg>t@;Eԝ8)%KaxSJru>|+>ڠnjjjZoRdèuk?seǼvD-W֨64!1!R@a o(bc%q#L\arJl|ZF&Pe 1$}܉P Lq`yh&:ZpWY1#ځa_B@ hj>p*hrtviV'z8y0.?cVHGDp8n׍dehq`Onmmmmmi:***555+++Dau֩T\˗/ RSS !wv8ե!"x|˒W~;# O"WW"fyg+0JeR^OUʹ"'ΒnQ)?73^c~o;Wz˅PqO8kwa1ѳې5oP\DbaҒ%wߑ6 +:̌^›E|)lV*}(J75jz׫9Sz|PZ-PN'RQq'ssǏҐT`(qnyJ%M֖2,*ҙ:—˜3J)h3j(v;. cyw{m:;*r!#v+3"#2=|xLL 5ڌ@1AC&>,fs{{ᐶ\08JҺ@G=zECϝ;7"_}&H?Dž5zo'2pp֚k~$@QsT{ 8]tw74~oƣ_|6Vkֆ9NNGD)9Ysf;`:[ʷs)CTH󖗏rIkؚ Ved[[=ݍ=qcd3L\jzAOC ίbN}Պ& IDATX)u$UŋvNn1෈T3f**v6;M)e1Avq \3gH@​8rN髮v:DE)<`{v֟? C(rD=eb) eJ zنJznz]%H{8:DEE͙3gڵ7p[{ccc@"pfVVV^).qgp(xܴ4{zta(`: ^)X#\C~wޤ$oEaG(DGSjt3ׁt{ٚPrsQ&s/@ K$D͹oQՌ޳gUٔZ= %n,G)Fr("Fmd^R: R扺7voHs(R11{/o;DǎE) T[z86s^@)tD:?_~ !Q.w~ a/=dD=0#9BHJ J~wB7BJocu8zhbbbllFP5ҥc_][p~>^ypbs6f`v 'Pזj-QbO9s`P54G!r6X!B=z))#ڣBH a`D,~,=Ri[(uuugϞmjjR*.t f}0%<'O/\ꫯj ?eL+ I$2dȐ 8]Ξ-[c,3gNssswwkYCs΍(Jdff&LaM&5  y۷DGG_gIԥe$^&2dȐ/(jf͢ƖY'#555\n]sΝ;B('''u:Li+&_|e1yd/CƷ ڹs'ZDlAџMʸv^_ueȘ>pV]=R&?8Hl0"Cl<50e&!曧V[yfYY~hxtr}៹gϞɴDE2FC{'ɐCrhV)Av~2ASvlej#۫V vub.? O ?lě ٳ'3%dxI 2/!C 2BcZ CUF>g͚54gϞϜvYYDE|25Wk4Qm')Cƕл2dy TȐ19~@&2dȐ!C 2ӧZmnVhVUUl2j$J{n@t\\܊+l٢쿭LGZ-#e|{ː2dȘ?_y?lQxp)2d|>e!6DQM!cDꪫx<Ei|酰b,VSSSd+*Jb"33СC޹s'0ׯ{B_{ ̚5olV(?x||wyꩧ^y}駷lٲj*e+++ħzk޽<@zzzMM?j/_ $eɞ$TdWː ^<8::ZRFqcccaaq\Oo0`#. nVZCJvKVlQ)\*%/Rn*U(K$R$E\ `9C3OX@os`D"^4߼ywߍo[+++O:ue]:t(3<$u]KJJtk޽{vVÝB$Olz %# C^^ޥKvf!`]Ik׮>|Bijj׿/߲eK|<߯K/B {O=޽{~'Iҳ>آ\/ơi( BP2ec zzzz<zH{&i޽$#POP( 0viii녟 e@ 088((EEEP^^.@WWqE,帿~ӟ'xM_e0_Gy䡇'|f?яfseec=^Ηl/+/z{UBP(FiBç~zh_x?yAHP( %#f #?Nm-Q( BP(&uJDP( B'OP( .3رc^'v"Ǐ_p*○S BbSКz$ܼ򍮼qSSS:7"~|F@P(߭% iL K&܄7*◞sC`ɡP(ʦ`bwCCkGoT|>ߒo]z~鍝Քe`4NS;P( e30筷 K Oo ϑea*x B>sܼ_tj>R8`9b B/Ƙ2Йe`0_ BP67 B*eeefvkVTTgy睉 ?`߾}儐[nP(IJl~~~}}}VVV].htˮϦKlK߯pܹsŗ78G pF4<<I+/ϧSu÷k_㢎ZQVGPZ 8 >Mc8Q}>X"ˉ;e`@0ܹP( %}x`!RYY)$Ln LNN^t JJJeYrJ}H׈`pv\"~}:t's.q>wt҄ò#\in/uu LBq1>iZLs.@@h4-Ϻ_; Vxj+7:O˿ Yf:L4<^j%dj <"mrRok% w+x>ٚ-[׮In7H˕{l(uL)1g(6ehbQvsl6ׯ)N4rwܨ` ws\~m9zj@4~]weX***nիWAB`pΝDZl B.^յn)OY1'5ڧ`({ Co->y'*+>_y<5ԀilDdG(/OgfSg0QE WA@ [ roŋƻ={c^N06رaQP%-4nߎV"IߏGo)z ?#d22 reP#.K@՝.={dee􌏏#FcEEEaa kii|$5665x (!LYWbWhKt"6H7ޣ?nYі(֘>?(^iL_8"AutăJS;Fnd2q99\AP\4"Iqyn@ŢSgړ qlV:9xS"hk # =Z,DUa6+r=gY`_ kה@HsxSjeexX`=tXNDlov ƀqM+ eܾ=}Y Q=C]]hr_XQX$Lu .q4#1m(狵PbVӞ=d'5NU_MʦKȑ#ٳgϞ=,{O$`ir%n9FP.Lpx\WSWN @0+)fn4RfNѨeOPRCXG8#y` nnd2> {f1=Ȃea:D-ܣ+WXmJ[߉kڹ@;M;wjP;Z[a}d+CC|h !=/.f;LwYNtzj&&"|p\3zb͛r_Y,裬C'SڋdP[ bexrѠ+TTX?)ݤHŪmjCm-_RV==FӞ=89o=qRjR(ٲb?ހ_IhPZu]-\zgE@{2 I&~snd"n݂;R#GL BII[ iLOϖ lVq66+K()=8xɉ\Z}Gimضs8bllvqinud$曡?!fvVӤNΝ|A2xSz{U RwqVX"e5+\8G]xmې[HK$i\a!2"ƷvTFTI*Ik>z4TSSo) nӤ3k):RbEXxL=iRD}}u%uͫ[t&Fq!WO-Q\.=vG]W1uO#C)!5]{=0zaBC|b02VLP #Dq7'!.qx?rDquvmglC!i>!Uq8 sw۵Lr!͕<MHrrbQd kH!N.?w:7(6gp,FTIn]͕'r2FU,[{֫BssF=W_}5ϟ?1LS駟"r3ksw29ӳPRdqѦB;LCeeN28%LlG |Qӣ{<._bmm[ò\<2L BxˌxdYfOcd rbuu%vXU51<5$٫y7N\'Y=FF-UC!Z[-wSg^s57$-*O{:>p+U?fߖ՟NEC@GY `ў^waU4.٪)enML&!?KJ@Ut|ASVL\fgsh$"O m٢ E!'Ěd)tbFz& qws-GY)"Y *CC 1FPRkM++DӬQhK qlva|M| Q6+r]馦I\#flFd9x0rSӤod ŏp6>.DQ VVK .Q㭧0NU]5\c1ּ7{y^54c$;4LYgjjhz*$_5\c Biii *}} MN-MPO͛7#HeedRerrR,!!qHTS(ʦ&I5WX x|~2225(ZBP xMMM-!!v+bX*++k/]p8JKK_[[[Yk׮FM~l޵k>4 IDATb1 *=J^$Ip-P( !H' =UFiMPO|8 ~vjjjL&g^oMMMmm-zzzl6(===>l6e3@P(5œ.F4t,D}>E ܯ;#7WM յ9sjfgg[, TWW@uuDu86MSgYcWYYYTTF1++K?~__ߎ;t{D^/&GFCO~%² HxEۍEE26I傐`d` 6:*OLhe +f79&s5:x"A M 52i9SLR(Tύn?p@ $aqdeeEKeJȺD0Ƴ#e׮]K\h\͚!|<2V+I'հ|ed6 t X4Wlz׮< D4es|v1'1% Mvt0KKvOF'_loWQa ,[ *²B+W8)&~t2gmVX_G,4bQj#1P;E5d><4O;Zzv5B">!dgggggvww 3$qӗݻל!kkSp,xegt\~~@J]p:CS*P[ gٷUg;; F"c|q#Ѿs'<3 [O0Tpt0} z{CP )D`c Bhrr2>; (r[lE"$Yf3Bh||tgRd}K`и};Z$~<Y2oVc22YMxRFO2y#]֭)|"޵`^ԗEĂQ5h2Xm`.j(jkl痿,ެ42B|]lmS$H@cXpDUG?8^ohV/cыeYN[=DUUo)*5[,O`))+)p_>=qB rx-zَ2Pp׵N/,rXU` CɉGz#GLKWhPo  w]9TU%'/lɅp(4x&1B_2N;<<Ӄ1E5]xѡ)..D"1Bp%TTTp+I C_^^^.@WWWԆ,1)>sS/p8CE2 Ce&b7oJ;<,IMYoܴ{wbpS |I h:>kcm6 "˙z%V&OXkGFcC(.ଓِ/.^ &,+^ >C156p$R雂hXSZDUc "ڪC&S=M+-0- _''JK\0}3qBEc@ۅܥp Sv<7> xkC_+,;8r$%=dZijCPm7[ntC͠z`jdt?E^$uϞh{Bwل,וty7af՛mxĝsEgƓ't:^v^xM6's0]jjE.?PS3oxiRWav729}jy s$i\a|/$V74G"lNz\[vSthv!022evlȰ,_R""^GOeӼ=8](-+n"utE|!alڽ{-dРellT~{"/Tԅis88WRRZ Fjs,B BǟWvom*O0pX."OL hn볼`ƺ.~ǧL ǿ"='Os $~# .jהZ?!_F}ۏn\C^M?kbhuv eQMx?rDquvmJ#/9p(LѴ7ʼM'7>c{(t4ppӉ⑬,“1'>q:2yNH`_Tiu2rb`=lvԷGb]6+ bDUKVu|H\V֔0[~e%[dr2hYQ&pLQT6qhY)(r~O_S *v@ O_.ѴC /#}>Id(Ja #k6 VAY ~%eoW!,˃zo.pom 3Tw i=ztVT_}Uhn e͒ {3;< rbuu%vXU5[TzSyt//@*tz34Txbfsr@JLwZY'?2kYYr_ph}2=4M#?2a&~xZ4gϲw5+yV/?" N" O"(,F/׼.mu}g9.^ƪ XhsU}[`$0  ZX2M!jdYT]SGGW\ؘ{=˲B.0TWWPϗwnlc zDqL&BITQ nҽ.ӽ`@ uttf'RlNz ZiGU0ȯ ):L&@H;}bFqon(NfC=K|g_!AO8Ѩa&Z0WSKoЦ*/ѡؠ:"T F!eX,XIJEHw E!PQMß>;<vo75INQkj}Gua #""IJ7vLzX28Eb9 OhtᆪߛP7<MfPp&d*)3<3q=eOoDEEOC/\lVdϟX #/ogsrtd^;ݺ{e0,+VUZ[<(XQKXLz` iuls89 ˊV$z`+Q|~cbAr`P>Nf)_Rkiz{M =p$mi˵I3Y=G2<,VVY^78Wm^MܒBO|dEwF 0SL[!a@,!{wonsKk:]+μDK 4glaN9$ 1 "0+ 0,a0\d,2 TTVozS7}PYz_Ia(s 2,_zP e}}In45aPáhc4 %%M^~}rY'2(v;k(zXaVcnkא Ӂ k:T{q& RoKO2~]uyVKJaض-zZw Eι} ƽe%u<A(.Lg2aD4nǮ>:g+U<xjjRU#{]kj2-0<6I ة9oVX].O`0D$Md /5v\7F"7,rU0}}^C(0T\7͛{"BY}Onӈ G"z֔&]6œJO3mMMdh`F+Be.1SZPʘh!`BjDD{$XMYsvHFe?йW &)HEwhe]G & `DQ5FQ5B6[H EF"dzRJ4,RP vmZts Smk穈_dOR8f,7/:^}:lP(H^ϐK~݈z+aL´_ϳOgN 唕 gUUS5M4ezҕ5U Y`F!!Yk)h "aLp(r[.!f=^c)[DBHU5q-'M剉 UZr4LP zDBJkrzzz<O]]]֬gϞv$i```ppQ̙3gx Μ91f`0b1zx9.TSd9{{hay/JCCC4gd}o=Nmn'r?e+kn'N:"ظjX 9I25SBA zhه`4U !ѧ{5i&`8,'fMMx*US &1i|[vA!TMŘ! q"&}^C?Y$3TbP ( u]w B.]+&zϝ;G|rQQQB5l{WӴwy'S/^xl6w}WQWtRtNR.ӓ%vDkVUU0L=HeB iox}Y413.N1FqǪ-j iŜ0Ͳ,00  aĨF0xahrY n;e_5k}ιX,eeePZZ522F'&&r:yzh4ŢѨn/N]MڄfTS֔{DTuKB:::nw8fYnoݺ5???vAaVkcccnnnkkk$QUUz ^T?=;v m /C}KO"="DP Қ4Ԃ)((iiiI\.M 0%%t34x c?B,=!DQa91QSOYS gWK_xGfɲ<<<~W\A d("FGG|A +xcǎQbYmxE;1ޣD#t1LM4#!b<'_{~˜h`}N(( &$  G,԰(Bx!4TU  LM~#1l2޻_!fE\Tbhb+ 3)=Ct0Ry.CnbCj1رɓSt" MÝ;y:+㩂9*+,"> ~˖- ۑHƍ͡PHW@ɲ( 455(I}Q8ys%_W>wtt4 ۷fz ^g:ettnl' fgf?oi|d4֭[甌&:;;+Pt,ee BUrKk^}L0abc(PK=dё-5'%I"xrK dΰr%8:`+-ѾǖK0#L0&zĸB4-0 Bh>j8 H&xdh`F+ 6T^&DӰiF1"\{B{ IDATܜ"O:tH?B,y>;;;)KP:֨_'AŃ=nW<\unG$ FQ/¬JO=WOVP!tݢ(V2]ghhR^^N\԰F⨬-qʐwОDj*bX&& ?qUzr28>6i88bU%5sYabəLclyu7?ezA40ABi͜8 R5$1UӤXthsdt{:.o(0VTMRDCM0ʈ 9K48pKflP(TY%c7ee׺򞞞[ny^YeYffǎ`X}>h B{Sŋ999UrUt%/g J!⛛w`0z6I<$I84 4*)U]Avyx?Й[RS㞏>8r@x250S?dE [Q}l|bp_UTE-` :cɮ)MYO.]سnLV5AS3HC â)<0UURԘ b1q-0][ g2Tڲ{32T$&NC81fl6gZzbe"S_\{=\.w{fee!p8mO1ب p8++bX}|>IW ^Wl6R#FRbFo`B:::NI?S}$TTT Յ1NWڃb`wwERVz.,+$<ɦ{ Ȓ(ق 0aIV"1;4M4~=x5שʱ-Ƃt)gǎ[U={_9cESњr"cYUHT #}}P8.goy>xCIRoj6GpTŋ˺=e{Dl.Aks'VcmϧQ"K>&[[]]=r\jѯ 4M;{iwuגWWK(|`RS5M KKK:XU{{>9]ﰳvo?z}w#CH8$&h ,"Ą_$[7'@z€ Mы'{l]2[^OYB0gϞԧ>R )}ĉ/0Y{{{ !Ƶ,*bl]|4M,d311֤>Cm;axVk}yOhq|h|8p[vf`Bb8&j1Ƙ@88}SZ츄5ur;Q2¾kW^)>s{8K0V$) L A4XV4I`(I11뺉m1/Ͼ帡o^@j8߿ 5'Ż&&|ٲ6ۯQ(Kzqwr}&"~ )r'b'sb z2U+_BPh(!_8̉\GQqY9+=!SBH$4 v\zС_7m> rWU/`EF#OpbUCcw$ZAlnfXv-Jgj6@7TS65M-H!ܹs>]牟yě]wF]~fZ,aR}!<8e#^pyy^䊢xBR,/Ef+>|-*u,٪4NF4u[|.ZTR(+ zO: t@ee$ISa[ei:>b+>SfXax/Lv||uuurssm6[GG?&''lBhyBv`YN\(ww$gZΒ|f୷ijϭ[h0 "UQh8Ҝ+>rd %RCQ(M$8?D# Yڞ9% ՘7_xָJY0vק(d+XP fZUe}Q7-去Z{Ã'X%K1Yഘ*K EPִ_i,֒s|"^ЫȢB|qy%#q'˲[lٴ #GCCW}}T[ee]6Jl6]_񼽡k5*BPsY@/>OFbj/];vle)*`,,,.,bǕ`P@[n**Z@lncnɎ5k2ePkP eYʶ|sK"e}g(x3 eF}P9SX!&fMthۿ?o߾|&IX (dgi**ZRP e(Os'Vha}tɘ"zl6777_M6kP _ )7]19.L EP1p"~uXarJM/4}k4sBPd~["~uXImrWNo) Bl,;V9F/ ֆ BP(GYMȆ>JI6RP(j5%}vUV\әx BP(H0>Y`&nijjjjjJahX BgJRĮRio{w0ek) BPWnq o>8euD(Z^!tԛ :OP(}Qf6VY4L+MgX,F~) ybRO-m7ezg1Kgعq#}Q( espݵG 9bYٴAk_{饗jkkHbs) 9ixL WV/J˲ /goo/Bp466>{0}Q( B ~gQ"^|E`Y|x BP(sReݞA3=wbNb@s'J._{5W/{j }iooa}k o?=z?={.^;vhii\^^K/b~ǎZ099b׿NP( e@람.$%D{~,`{{?_կ~??`˖-ɓ'zCŷaT[^}\?~r=~3?s ݵkby;*ttt FGGv\};߹j޸q… 0[Wx:::X]Rkt) BP,j&//?~ɖSN:uٳ/|vvg>cǎŗ<'N7nk@qqC~_.^9?>BP(:E+flXG?kFFF9>?u585MMVV>>]?,C>( BP旪,J?/sƈȲl3<̜km6۫lxΏ~G^:q^~ezP( @A,z礰3{QR( i^ _\YyR )<¡"BP(fd:ʌD*PLwַEoB Bl>St)ܦbw^'?7$BPցbmМ yV,ھ׼t#m.2Ά1>Soc$ B] P(J=wbjt:>6$O~qyzGR( ei%WWj5ޝ5qO ` rʡBTP@* cVmuvwբUvkZwW]{׶Z*֪UTjըUSpC d~Ĉ &GH|z}>L^jљQ 1WdwXk! A+YcP$<ABp;xC!ģ )VXB)֎mpz/w;A!#OOSo 8Yb ء$(@$;G7+5ĪVtxbQ h5 hEt&=b! ~L (cVdԔ(Y]wx".Rl`Euxܠ|>|9l`:Rilb^#  s -V\@Co?5EԊ7lذsN"Zrٳm:/1˹b]@=Y^~OlSSSSSS?LJN /1 o5!Ԏ/jx$xlNV1W;v=zJ"O6m֬Y"FSSG}tracӧ?䓢V\>lذy7[ 6-bBvsJG!bʕCVǏ?\ȸvaZ.īC>jll_jUZZ p,E v)_< U*բE7oެj9k.f2ׯC=Z^^`駟.\XvmGG ށ5\_| D$֬Y@D:.''7{솆cǎqÿ1119sp/߿m۶ׯ,˲,kZoool`FZ7K/--?h܋aJ![~ݻ{~SSB< 0Vi%wa;/MMM e2+gϞ{z[73J{/!>$$K555ܛj{ h.^m ܋!CK$ښlش.((tزe;'NNLL/… n 0uT"R(cǎ#gy"77wݺuF˗/?~}ǽȨh46lޔDXPPOBhhh&JAGIpxmjQM6͟??$$D"ĤnOD6mZhQDDL&daaa3g>_P(<<<׭[{pn/ Q BkPkQ*˖-[lYx{{/]tҥP(VZeζmیLOOOOO`4j9O`۵PJ`TSa$xUf. ߹6/`knz0{Ah0ٵU!1J?F3㢐m7:;Ŕ˦\)xRܜxF\`%,NfS~=wuVZkb$F(uc)%ƣr'h&x$ZMz>c߰aCjjjjj_|a;`[J.[wJptihhO}}}G1{x>/jiiinn.O4 e߸Sd>;mgΜYfMcc8p`ܹO<XzJLLJD4tPxO&LCϵ0/ aGqj'I)/W 2eD^ԆUfYC|UUճ>j7--mDsN Z{uWmoodײ?R ^ bobS~VWe\b URhVNyhEA)Ŀ{\W(oR$ }7YZ󟼼jX<`)Srjjj裏>\^^0{1"ڰaΝ;hʕg6>}O>)**ommÆ 7o޸q(==ܐFBB/LDuuu;v8zhUUD" 6mڬYD ;wVVV>3'N6:ۨe"EӏCA9cԀ!܋_\,^x'N2eʚ5kN>}骫4ϥ皚k׮P\\\[[˅QՇ2ؘjժ>FXrFPj?!s>䓒l7 7{ l!f-5ˇ:#?R(EEEDTTT%+WUVV:u~\}衇BCC˹NMR=QQQz… k׮ؾ}{ZZڟǏo޼F^JZhQ}}͛Z#Gv@l@ 3=c1((X.⛛ }||}˅fT0 ˲aaaqqqF2T;ƽ~cbbs̱dI߿m۶ׯ,˲,kڨ*n ס_$Y& t:]NN۷[2dȋ/hŻÄ 4 Ի6$rnrᇋ/fffgRRҒ%K"""JKKxT* rׯ߽{w555y{{s νwߍ8v(+ml8 f2aO 9˹D#DGGs7liiWZjŨL&{Wٳw^C(ܼoW~g&HaBYr$OD{/>3\ JD۷o'%%?oڵ?OBB^|944 ŋVY Ő!C%ImmmMMMkz焄pTWWsojEhh(6r%OOݝf…onnnhhxǦMݥ IDATmO<7q%##c111:@+c3<]ZQQnݺ-'OT*oqX'"CZ}Q//A$&&^xa…[n农:u*6ǟqX*UgPSmD-LH,CA^x{NսƟΚ5kѢEsOF nkQYYh6l}j\mmmO>$)0Cn`_SS3oۇz(##}YǏ8ҏׁ&xgsH  FuE 2S"O8_0tYyRD" ={u$ lڴiѢE2L&͜9Ӓ%_P(<<<׭[׭V J׬Y}M6͟??$$D"Ĥ~x)rKfUxRPCVfgX﮴Kc__ߥK.]a,YD{Hzzzzz(UVm۶nS7oR\lٲezy.aL8F#9pg'p;q4Cmh[ 5pe \EL"۞  dhJ;+cP&qx~Ek]yZP(+$N׵; 8mXD!$xeMT{p&R FኴIx5:;!pfBY!$x>e4۠uu`nqT()1rGN<#!tf .!l`2pc:SdJlbB<ː*3&9`!@%E^t-2(*E$uaɓ'===cbb TVV &DNVeN1/ Dsy\Zmt# A׋s,`k곻yv JޮgDG(Ļ_ǡnr4G&Lܶ 5hzqv%6]MhbIs.c2 ;Vggٳg#""!!CrV{EXU tU UAn>>REן>}xH.<\re\؞fݞLcdBNwt:H$nM3rHVh*++ GIJJXhsoP9}z=N ?@p9^qyzw@;;;ƌ#Hz"j~!u],^tI, 0xnnn3gc.DtܹҖN'J zyyae  9%%%RT.k4b\P(Z[[bB "LFDW\Dlii)//NKK3 dii^D}υjjjzH$)--1c8L4Џ˖͞rvntt xv rkW3xJ[{KYYٳg_n@L usՐя |^@[4Nlnlc CD,{jcTTT*5ni?KCCC~~>}cƌ3fOX~!AOkqԯqd[xt HǸa 'r 4m7ȠUn oJNG@D ho|%L;b\%uO׾0_$x>Nz!A@3_yóU4juM>J&nV v-F1S0$OF(lP!ă kVE'.6 2m+@rG)+|o;#Ûovqhñʴ2m#l`]Qgh2;Mػ/Z{hc{{2\oãB T> sֶ Sۍ˦g:7N|[X58>OBS p(~+[O!sO̵Sn$-)%Z@ֵlݼ߳ 6`A, gglGxC^q ˲Awun[Ki"tYϝvfve+8{m{v"u̓ s|&<8/lN.B_W>#@NX/pj/!_)eoN^~g: nL- e֪LJ )Ss&Ϟ1;ezvZ]|%;e-\lCy|T[9&qdj: R `& :ƬRX/8㐍8<RQqDIJlO?qzqL;g(tT}MU"zxveuQI"jomSf&B" gCa]-KPSt56mǶ<))4("dG͜MƋ}}}dIlnu@C]I%w(,.JΜ5.}vpsw޼xv;Z'2?쬯W+ ul4H<I'vy`a<,O|ب~nom{]I+;rop}&Chohomt^_QQ;R))=Gt2O{++q")X~ˣ^-{idr?ǒ]ϛm[džʪ`X}g7^ 0i/_/bYq57GWKS]Xg}j w6jHDlb~ο>W|4q}l C}3xߝvv/?o{{q/ yt͎뉈e0f';I*'oe: ?k6fQKD* Rٽ0ˈDެ),ԧ.{lDHD_a\ohneX?SM8lh-0f\"jknwӕ%S%xfO=auOpZ⹌^Y}g'#"!Q~z"4l(#zWF]&7#D~FqD!fN?׹޾p𐻷W]it{wSMO;?c ׵ZF$%*/\*uO(̚Q3>􉭃G߸{D* Vx떎!#foeXU *>c'6{q""aFvϑf vRɩ3fF%?Oã~U;u _UBx%x7ehu͘6 ZKQ00G#K[#Jqz?N]noLjG޲04{8oDwj]㗙K6=o0sޯÀcba<~me`)VB0E^^CS,Rw:HB%`"K E}Y7:{*e8#$xzb8N# ƼTv~TuPVЧ/[^O~egGRk$x^ފ?guvt3@:+ \.cm<fu咓VEo?r󑼿bϜ+VLMMy4&AM:OtkZWXa"&bmf޽VXz3k^'WvB4Nxncq \/CӲ-uxal \m `E\4f_-U\y׆dZ@+ARB+  t;G=]MJEX!P]qX]Œ$(ppu ۵L ,xvwʘYoAkCK-9,d0"tÇ7o޼{nD2cƌK2 CDz^*HF|@nRǏߺukqq[xxO?=h e?/&((1c7<B}{{;zݳfzW^z &Q[[… ï_{YfӦM ô>sK,IIIikk;H$"m۶۷o.]zW==='NUn9u ϟ?w1cpDEEw^|w\:uazjW^okk?~|@@r>x瓒(00p< Ӷa @!ӦMcYe˗s60F^;ΝklldY*++#""<)))!!aĉJms E;HBO=wwLfxfe^OD,>III7n3gt0=Z>vط~;KblulUz/Ļkjj|Ab+Wp @RT%KwK.d?B<1DQH6bo7x흗7|Vor!~ܸq~~~eee3gΔd>陔v9N7o'.\Shb5kDѡS/՗|p̙]?`[bErrr^^ESsxt-Oz#mWaOZuv"*QSSFs#FŘ>1࣢Ϛ5Um/[܁ySojjÖ,&S/wtt% ΚРݴ]v%$ pEX{~?S̊۬Z?#s u"j/Vsց!^\wM oWaXZmӹsH$=^ܾ":r`ʔnnaXmm^]]40::2&&k gΨG~% 1c{dYȑy~?KۼD:q0꬛aUeD' 9bX@,kNͣyvo_>!dßzv+<== CLڵewС܋j"ɤ # "p;wZhh`ee57G~Ċ*g,L'NȲުչV8hڅ`vv^@ b]lzw7Q@Ouee5-#P؀nSTh4 DOGX>ͮo/(8[VvCzӗ.eg2D"L&m N.lmx_7dƊ[Ҷu>%ڗ^EuSvůb-99᫯#0th#%,,(s]e5RAD/(jCwvwwٜ9is椱,[UUtAAr^{V,O!<*8G"bHTHE=G6wmgPDt})ǎX[[ٙfRҨC _d!~#={Qoܸm֬Ʀ?}:~|"8vl|ddOggV^sZmڴYR KW9rB<7I3/< zw7/Gr#ܵἼ?jmsMzԠ ;d[[3L#f;f'''۪)2vV6?Mх\ENN[M{g`oG,Iz3UVy83;7`xH"֖dkx`oaGxx0tJs}x37\=599KQ^q+lkhsmCmRv8cM$̗BREV6qS1E|"5 U'wxn-.K~11=x!!a-V窳SPH<p20 f,Bڻw/ rrrVXz3OWrPjw+$VjQ LI!pΊA)8 ]|}85`Ő[/~f?aw`\vMC\K_k}Öl's`'IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/images/voicelist.png000066400000000000000000001061671475757676000245510ustar00rootroot00000000000000PNG  IHDR$+AdiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|Nj Lgt.kw`Ǝ>Rۗ v}-Y:K/G/+'/ynb_bוu}OaNvq/y,."X๢z}ɩ#'[ͬ#uc$-~WLQSO^f~/_49h֘ ԲFΫ)V}H/3FsD͙6/UjE>= 55>{cVz?((y_t]UY-rĄP~hѹ]+ȾoFNs'aft=Fs,~Q$I5]Y?)уFg;G$_..Lg~$Mes~iU?T캲i{*yd .c/߬i֟3G#4 ҆aT[3DV48u%dO{,nqOwg6P9 mg(<.RF X#k\0혾sH߱Zܿ74g|a;/?sS  ?w$mDnAIS`? "ԇIs5N-ws \6 7G*$H7x F텩Ύvba_}?*-j)lzoo/߬pt}nƘ9Ff;~#,kŋSÂ?JzܡV6@cԓ 7b6I^A\ZA~L|P$GO 5X,`Ͽ~YY-tr_)a7sWoU7>]\^\O_9G0<`A%Ǝ;wD*S\ZYgb'LGҹ[ӼբN;[^?3 d—W5;_R#rrny;zĮVd]%}?\:m@U]CWpx֍6qiw1A/͙\mǙfW *]l'a^#b4O/Sl,MIKcsьDŽoy@wj8 &ҵ^T~Fӣ;ug['6kUAXPvP.)p7 /+e鲱| 6ߞ+ mެ1$E^UWHڋ yw.]/,!D )ZZJl *UnMJg.vyf"ITm[:?7{ JsaNީ`7,8Ūhǐ+k)@FNA\֡;3oǏuuoIxy8WT ;:e67",";<ěy '&˺R+'@M}ke&0aoQ0 )Z*Bǧ53VWA扱.@Ţq#{""{Q: }%M$޹ yw?10 sqI\{sC< ݻp{ĮVd z(9$AimXZRQppΫ5,RWc@t*J,;?v0Mps`*-ŧr8akA("I`1+}c h}JȘ@}Kxl¨5L愇xO_NA}S;BUT5@dX͸~5 J{Mߛ0kr2 E3'ŝRۅ$|Ia#lu5:?)֚ BkLv*@IRJ~z9S#c٘GDfV3߈!sMf*Tٽ&,wdv\#^ېRm۪BIީS`gp쭓g 0셧ǒ$Wp/;M,%IZ$2ZzTyc} 4O$ˤjuP]PAKw ڌ$Q5}bg.mn#($ A$Ih4 Z'% 6HXEj& R][",Za gUګ́1$v֑q9l7Pݯ>lmd $H$IRYw"IwtwIrew;h}:fTJ"IMj^AC4L?q_x%Q{'Q7ߙi (49w|m{Itv:uMp? sk_Nax'3elDtw`p9f~5l ˎa R H1 IҠy$_tAٶvi[zK_gGu&˃ ۪AKӭ'4ֿ7Zm8ۄx=5G$?>q=m~nIbTE1/e3GhAKcc34E pslno0ﳹz$կZc\damh ,&;dYj{1{_ܚ y9K`1[3`c[;ԏmh#ICBʪuMsWүX4 <?'73Rsôpܕ= W橛kZEY!HJ @Tcěn?S(ZEꫦ?[nⰐ۟ܝtOE5[B΍;u ew#؛f80zǨ>+H]dg4`:W2+tR^%d4ǐ@7O:^/ڴ=SpWϧNv?KAKcc3D䱑NqQhj%Sp ht xlT+s'%ST4JZ䱑ΎYQy}E0׭nm:jO'Hn߹.rL|ph^(|nABW% HeY*W(_/GɸIӪps`i=7աUYU׺襙p8Dٽ&vqsok^-w5IromjTiz=q{;^XfmUWٶG+ϲvu usu%IB^OAL*s1rum`cD/Dfz;($'j ?"$?ItVpo☡gsK~ ܸZ󰭓 3h Y/:Y~\9/D,RkA/;5ݰ/=5hZݯ988{JE+IkN]ppG{Ix==AņM?BBU1Jkܛ?%+?w+"q蜤a;^([]ZD\HRє;^]뽺 `- ġ0>6r q! ̵q ^*x"`X:? IҚ4-d$~(|wOԑC`Ӊ_rȲr\)_/䕫 俿|f R:u^¼r])kuwt56'sisʞcW\?K@!4Mޖ󷅏mag/\rJv#Z' *0h Y`9A+d>bZ?*,*А;gͲoU ; GIRѪ)c#*kZ:2.r?"^= #=.]l((t1\T4 pwomVִ6ƏiۭR_ZwVM~vmIeckT!qiTl` 8:"]|]g 槳O+jn`$E uYݐ@~Eu ͣw,^6tJSfz:{0x{5t;wNnv Jd#CKڟˠʺ>}Kq| ~9.7y\䏇.Azʈ}R55bFL%AK3h3ӻ5,Scs[;=\fN9W^\Ѩ0:|Xd\]]/|z8:ģI]S?]RK>qt0}},H!9n?[*T*7g1q" xɢP"R!BN@*@ ف@Q1~blj@XFv(o@ 9e f@ 󁹺\@ a8g/0 y@ Uq⻿(;@X$;@ ف@ #6mZRRW_}o&%%|ܶm[RRґ#G@*2[YY III}e2yҥvE-X ))驧z̚5otE˗'%%]suv&[i1Ś4cƌŋ=zwNMM}WΟ?DifϞ|={_!fvҳ ͋f3&ň}XbFz;?08g@~~>1822://rrrB ӧ@ff&oUUUYYwxD… i*++ׯ_/HлL̙3gĉ۷o[Hvv嶺._&Mcpr?Ӻu4رݻW^qrrв#??3??ٚcŊ2-99yҥ}YFFƍG% .\w]~~8qelmm 'qȑѣG9r$00`VرCR=_*L4i֭/^tpp`d Rmmŋ#""kOvֹs o_]\\W"b...R÷nݚ0aBo[>@ 8s挽UFΗ.] NNN6mtծ.779s̝; ,YW^z˗A~W %%vܩbuu u@yd |4Moݺ5++_=z4S(~~~Ç?+rĉtŚ囙 ҄r9ccƌ9{3^zI3C1O7dddٱi. g}6++\>}ƌs͛7D{uqq lkkϏ6lXAAB()) ǯ]vÆ {9w ++KRԼ2lݺug>z~&͞=2BWVWUUmڴI*Ν;[&LP(U*UVV.<-xmmT*>|xII#""^z)KTŠ7oV[bB644.\o1xgHTXX(Ν;s̴i6l /8::Wqxxx= f+`͚5~]V7EksA?bx]]H$Zt!CzWkР m筷jmmeմjkk'O̲`;wcǶo߮>T*̙3k֬3fdff^x(]լ;<]VRRd__Ç9s$aÆT*ھkHT*Ν;˖- <oicc3utBQYYrɘ9sΝ;7n4uTx]Y}5M3$''|6mZVVVfffPPPCCCttt``|(jժ!CkYYY7oެ5DL˙Æ 5kV[bz\\\-[a_[[k/2٭_VN<Ξ=+ ¦M^QF({ ôfo:;;'M`ﲶtt5/quu]r%a999EEE`oor8Rٻ,߃oBK,wwy@vvvvvvQQرc5noo''{ð46 .ܶm4{V** qÇ8???طoa9}ѣGKfggܹSP0B+++Mt͘1gՓEZaɓ'̙ccc"Gᑟg0hK=Qqvv0nEDLš5kCBBرcZmI8{ݺu_|W_}Ilrʕwر#==}׮]eЫQi,k@Gc,|>.*#6&n0 c\]]qg,bc>8.ٳg:tW ㏧N...&IrĉLM[dIccѣGG6dw IDAT66G="..qiӧO߾}$oߞPPP x )Y`_ߠ5jYYY#FF%%%۷\.'0hK-ݻw4 },W-N2رcZt7oDLRٳgT*=ztbbVrrrjmm=vX@@ȑ#bn]KoD"і-[ssscbbz]T|ٴZkB/|2QGEEY+-n]xO?ᄏzjJJ[o5@ "9s1c.]駟kzJ'LRbcclY~}pp֭[7nx ,?><+VZ6lr0`ܸqWllvvv۶m `cK%yW_~ oذO>qss[z5ˑ#G.]駟b˨,Xm۶oa-@Dk :;;Po@&$HfvhO@ ̄~ ɂ@  pP 18pqqQx6d@ @E@ =-Zr1rssQ"0 hl@ $;@ .zHiTd$5@  %%Qb+m]WW@ ~?~|֬Yf @ 0N<(x1N?yluʓǂ}1:*-ll`n($-Pao+knnqOIIavE6w+ow =]_t[lAYPk3++g8z { c]aeΘzd:{4M?'tI#NJ Ilii'M4cƌ0b@’_援b#3D,jCÔl:Gȁs.Sr钚u™`L;zЁ}2,;;RRRP zչa'0%YYeeNmm?6|x{%.XV.%#8i+WƤ*^n'O6gZЬàW)jZbYX'Sc[;vJMxgO1j??nifggѼrJ 4tTL0hn1-,L!Zl>zaFFF߻l]$in}z͛6mbUɎ:==mc?缣i@p\)_wHM'^?=#R(|8_H . bIaCk!}Ywn/ oh8N8 W*`oo#dJ 8A!elԆT(3$%%mݺ]_Z7a:k1SLw٦!1G[Q]PyT$r_rNY{7z-_r.G*%δU|F4 |t0a~JMK BI8DI-M0hqKpquvWO|>󛚚4E kMݴkUH:(-u0:Tk[fLrݻkf~:xYTub}pr`9o/5pHB 0xxDTxDvq0BIQ%Gk `t\,gAL3fvܹ'5BguqT*ڌ1G i/}W M EVPqT(8aaMc( B NNNkqZZZHp8$Izyy @Q7ÊcԩTARvTXE#zy˝x<*0Pjڶ 0eGڻԞl[酋.t/.㗽d*?( `P"z̚ZNŴa MӴJH ǹ0 0%F*],T@`N#WԣC Ș9sfFFFxx8Wuzk=ΞA_ިzcxI8 Vf`$v]$vfrlllXSS,_ZVڸq]׮]ܶmҥK'L+փy;zҙA1-__@n訥}7uj5Կ}"#bT(`'>&f3[x O>Pdy68cYcSkUսW.堠[8? @Ø}طe콅 áB?rJYZ٭Mro"iP̿k"{zwHl6Z3O"I%avCNa{@*@hhhT/#77Sf@ PwR*e JpP @^t@}:wYh.v, w[q}ig5ѿ(&st G*/ *I ǰtH #$)zzjͧ/ˏ?kVF EvDDHkqJOiݻ$pwua~~af+g1((,,;^0"alEi p$qCRTX4=Dڑ"=kkiuuƍE"ڵk0x@C;. 0L2w‹ cji()=˖!cFٻiRw]!<_.gB YL!剛ߛީ(.8Ntw rC`$NrɧOQUXXr#Mf͚5cƌӧOo޼yӦMl @ ١  m?0`[f9h\/>Wd]*DS$yIWOOrT$ ?'2bp`4{% f[6UH8A \T-t)IVUWWQFSPX^^ά.uVwww(2WX W9x;FN2Ŀ"iIS@h @QZ7uz!W=Z#L?+Gsl-cӖ<ӟ\ڬYf[=C@ t9\(RP`0 19r]p0LPRmZ)2W˺Y.lGo;Ѱ_0Vp76|8T] .ҶzzB1 0p #'pp h@T(fprr2XC}B$!I`_պ6XeԩS0ٴ)g'Onp{{׷˴mc;`kBGwui=&{7 u]Y_\/{]9T~PyEICeJ0 4a&k[8V P^64M*#5r0M$vDRWS:\#RzRxzz2$##c̙L_I^^^HH@Ad4؎>L);vS*} f־V1˶}sfKϭ8?[J&%OO׾ܸZU5ީ/.2f1aW0I uE$/ϗ7BR*hU)I],i]Ԥk,˗֪U6nܸk.wwk2m۶t & @ގ6b\O[G b~QKZok2ODF,ZzZrt3-p2B+Wn {UIb_ ӻCbc`ogGxGgEԘyI*1 KMMյrKPiBCC p}F2K;7Ri,NA394GG }&|EG/:sT˙=۹F&m<(")J%+wz.TĉumȂ4ƒ[deG(t@[Irr?e^?*5L.0Y^DZm}qgJŅ̋9g}\@ۛh &M4}tT4f%5=HK]]V3[)O~kulX@`fqrv/_M>q8>s̠'NU_sKTs9k0G63ٻ4Æ3@|5Ω3fw@w֌ &߲ULlllTTTQQQaaaMMM{{;aB KChh1PeaC6 ">>o`2hyhr @ GKԭCe@ Āe@ d\.G@ CP0?=R=77799Y4]keTש$EmlffZU)bd?anvmp&EQͲ;L )))\@XE{`GҹdIѭ,@ `Y=$wȧgO[6&T_w;yz]1U(";BK|sg?1s66:|ŒwlHܬydw_{ sL4MQ ;;ϭx8.bw-SRR|>466^v9GovӍ:cGM?BcAQMxT__Q#Tai鐈F&*HR!}s՚O?z_.?~<22RS]U@ ?wS͖-ZV5iZ{5I]]<;;_ز_lf֭ssscrð 6tttX/_0ZH4C8FJ8!)E,Ir"HKKKQQ5ԵVUzƍ"mڵl @ ѻ zMWW*T*>ŅS54eKU14O;Y^Z]x/c/,]{q<55555w:dGGǪUߑOmLּYՍYL!剛ߛީ(.8Ntw rC`$NrɧOQUXXr#Mf͚5cƌӧOo޼yӦMl @ s4Feʞ{`[f4s4 E_|T$򋉦HZ|H>~O1*ܢ֭[N:4f̘;w*z \}?Ek!}CQWDwn/ oh8N8 W*`oo#dJ 8A!elԆT(3$%%mݺ]_e|Fv8`:k1SnzacC}ΩS~vN 2a[Q]PyT$r_rNY{7z-_r.G*%4rщ IDATl+mah[\xYYYPPAGGo|~ n0Y|Ly(:7-U( %ʃCP$ v4€i.mw`\=mjjkljjZP*g5Mݴ{oX/j`Y<'ZvWq㆛wfJ'8t47?0'4,2_fPo%/5pHB 0xxDTxDvq0BIQ%Gk `t\,gAL3f\E¢Vz .nl)pT*Q}~n'cEǏW:t(0 Cvtt|]khGGfZ M0OH9 01 q1i RP(Z` 5nWKK I$V///(KZ찢:u#U;:PZgOHJJ]HHi26vזiVS{Mnn.˳_޻~sē@#}*!@[[۷8tM6M=4((\9s6_Eߢ٨5p/ #lhU*Fj8a)1VIb uzPzRxzz2$##c̙L_I^^^HH@Ad~؎>L);( ;p H(R6}z}sfKϭ8?[J&%OO׾ܸZU5ީ/.2fDrkǎk׮uss?y~U}}}YhN f}z[Uo !)CP4A* Ô$.D.Lkjj5WKkժU7nܵkڵk۶m[t tz@ oGO-h]b\O[G b~QKZok2ODF,{)F >h̙St*Rؘ.$ 111C.“Wgy"3qwZ5ܸr<<<Ȏ.mݺ~AǾ-c-Yܤ+K$߿_r'y6Ecͨ+Wl {UIb_ ӻCbc`ogGxGgEԘyI*1 KMMյr;PiBCC p}F2K;7Ri,N0۾nZpC[X@Yŏ^twTc67ZPsU'Re݂mB>>'V(WY£m  ;Dzz[:;;^c cJ)ºe2c߾ GWEDph$##]6er?ϵ 5QS;g'P0׮$qq|w 9؅{wttLIIIHHxڵӧO۽?jO75UDnn.?8œRFzzzU$c؍srYW uHݜ]g=}?JJ5<\)H"$;N_ʯ^凇{iZ{5Ixvv{ NJBklRf֭ssscrð 6ttt)=FUUUܔ bj!IAMS !)E,utv6|Ե+ J?~?RiqqRxQQQvvvl @ ~-pӦgml #8KL"i(#J.O,Un)]PSP~ҥKͱwlSSSSSS}}},X߫CvttZtdhf!bijsTʥީ(.8Np8!0 SdLs#2M*J#濔444&$$ `*dG7׮CئMRC;p\e޻VW  O):R*휝U*^{ZSC)|>ɩ:t nR/prС1cܹSΊէ@FYԗ3L{:8lI\PL8A H 0LRɔ$Rm8pa*;::ۻLPx<T*, Ms .>vRv:oau9:Nj)ʮ.e3bMD)/hxaշ;z_ 4 )׸FїohreeeAAAX~-wf%g}]ͳ :k\\P(J!) lmx4€i.΁È$d2a`riW#=ї! jO鋎?>>tP IE}8]Xrvlh4SN5o*\P⌫0b01 JB'CL֖4azv ͟k s{ف՚/_Z0R-fͱ9d+*KJ9XVk$In-/z[ 7* hAQ$޹/Xkoo'bΐFo0uQ$; DYGYe*JqYp\命Nr\g9 r߹TWWOMGzgUu;~OEQQ8~nvW4nZ+ PuՑ%Rdm^)C],9+Y}$Mr6IeGoo@a'c,Qk \4 ,nߵk 6H`dGMm+1z7nq<֯b+YHubA JՖITedՏ8 wZRgxeG|~_AMp8l'HrW4WWWnoW@w4Ts9'*}}}yNOtc;֪fbp"VFqmB.Y|_~hӧftl>֦~-ldY&Hn܈ؚVRc?Gjil0?fXv߸q… 5G/bkk\ܖS=w3x{$υ*|kyyȔD nvk8AX`CfSO}yfUUU^F= ƐH0??m[ y3rNGw`m}#DrݳG_qԩSfY*AxX isLdLzIR($m$EU(/Ӗ{o\eY˕$'=A(r:<4mu:]* Vͅ ʎ8˿P55}AoU֭ʊG"`4bJ͔A.۷RWA\8y9Ο?$yرcǎYg}7ވdY^R>7|˿gYEX>:@o1ȋZE(HjRQAۚw޼;em[tuu=3kꪪفT Aw8v64[?ѵ*5 AֵI8{[y$L\[*|SS"3ZՑ==='ή]oh~r1qX>##Sƿ@ R$VkKIR("EQV A,^ J*<>/յ֫F,VVV@eeq4M'O r\486bLdE\fͰhiYji+2o_ឞ>ʌAyM׵1e yE/ZӛۑF<STes0믿277˲,+lr9BFL722/#&e8^U]塢$Q$Q$$QN3@8NϑF"5A4F $IJ+6Y$wmVY VHQ2rUv?| \h^4}[0˹l_h#ň )%1qA$AQ"5V[ Vv!I (Njk\ByG6%̃c9[ш<ͻTb+\HmeI}'3C!hO{&a~~>veٿq&*e_xUq9ȑ#Ye!LrO* H(sS$ $ADqAU'l*#,ihV (#;iF=nC\l9hE#;Z6[]dRvg yjٻּ>cs;`.j.P ZM$VZ_$u:W;w4&9$_oQFƆDт,sH0\ܹk$uQ0#&6BR7[$ruRqOҳzI mmmmmmRʒX l9`6msK,td4 :Qha}y+;X-t%lM8Xg\2;;{o9 r0q  M.;.V*;o(ñСC^@lše  g.dR rAYIv  dG4E!  ],ۓỻ;::-U|LN=z4S]gUKYW%"٪!Iز IDATHXEH6f$cI>;.JՖITedɖrXfeR}VZH"o:5ml$W?N'޽k $K  3VfjkNouuX9|+8p8R.N/;2:?9i,7Pi4dwPsdU$NT5vA6ZpwZU;;>:E"^xֆmt,t:ʪD |L9MȐ!+-wumVaJJ0q3^tiC6Ct _\kSwI6Tg2,$ c7nDlMk+c)ͱ#4q6cokkX,voܸq…ؚ_|uE nKÉΞ;w= IBE>zbd "I7?FµM ,!䉧[߼y* Ӹ/EdȎE?^xY}-"f?|F.( r coHZ{+:ul6+V%˲Yd1==m l֖I I*Eͽ(Jcڲ}k,rjjj}'=A(r:<4mu:]* Vͅ ʎ5%%Pao\(ۺTYH$BLR_x~>2Å0u674Xj7#'OT4?$;v1Ͼ,˾K/}c,? (QXx GCh-yQT(E @ZMR* ^~[ΛM";յ}kfggRIj.APv*gfG;33o}?ǿ;>wMAum(Ny^g2ɲ037ז*ԔŢjFqu$l6@OOO,;Sk׮曱8+1_Mgq,^RÑ)s@ R$VkKIR("EQV A,^ J*<>/յ֫F,VVV@eeq4M'O r\486bLdE\iͤI1o9`ǎ>*sgK‡|@/<6 &{z~,u9%Vkzs;҈SYCCCuuu*b|y`^XbYxWM.GTȈFFFeԤqNjt. ^e>{NXЭlk|\Z/HbDȒ8d H(REV$D5B_K#֒AKۡH~ƍ܏b+\H%DOZS<=) 1OF{Ŏ755 ,5U, /ڏ͙6G / exRqAEǟ{"I B$8 ,:aSaICshZeD8N5q(J]v`sA,ֲّ"&T^쬫d{krGΈFRpx@E+Pk5@`n|"_0W[i}:~\-ܹh?#)uuupڵ;() (8÷46*I$YVEjOHXZ BK PZp<16C ]UUvF2V MӉ=͵z}߄uIAw_Q=|xĉ1\9HTTTdJbs;@jZ[݃W_eKEŢ;~/Km- EX60dG*:Ν;ꫯ'N?~{W#"̰a1=wwhDYD$9 ^ ScC\Y $^+bGt:ƔD DqhiYO~$xe'&&ikkK\Sc,>e;/_bq; .#!# MxܗXdlW%YosCrZP`o޾Ee٫W*s7 yّ/xI,ʈOm!zAAo_1vF;D>Տ8 wZRgxeGܗ-O=5~wuohHeZAӾH䤹r{8?tCѤݝC͑U;QyG8ˋtzhÅiV5^l2zぃ[Ң,++K9K0LT`X4ȝ}0o] Ξw߭Wǖ8}tܜ.]Z'ݣe?ՙ I؍JsH-M}wy, 7n\p!_lmm]ypΝݻח0Pfl "ϫh ɞޠo.K]m`+|՚܎4"mgo`STes0믿277˲,+lr9BFL722/#&e8^U]塢$Q$Q$$QN3@8NϑF"5A4F $IJ+6Y$wmVY VxrU_|jCj>t. ^e>{NXЭlk|\Z/HbDȒ8d H(REV$D5B_K#֒AKSկWTD6Tb+\HmeI}'3C!hO{&a~~>veٿq&*e_xUq9ȑ#Ye!LrO* H(sS$ $ADqAU'l*#,ihV (#;iF=nC\l9hE#;Z6[]d^vVF#ɟWv@yc\B\8/>Huwiiii4yؔҺ:vΔ_[l[xPJl$I,+R"I'$I,-Cy(-M8Mϡh rFQ+D ZX rSoºXJ˰옜4gR4vw\Fln@RTMk{p0KlXte傡FԜH~W¹s^}U|ĉǏ2433sjd\[T6:(T(Q$ R`qaajlHK9`keS(NؘV98<<\___VV(A܃# =PI"Ih?:~ؿV{CbFc}C*{̙{'MjA8}/F"_K܋iX=c2)$RC$F~vrI$;ͤ(;z={Vܷo_q"#}G1ٱj N晍;:;;;;;}'~=aqgϞ S444A>$In-/z[ 7* hAQ$޹/XkooO:ዤA&EȎ4<gq8IcdYʗɪja#{{8$nϢ8 ҳTWWOMGzgUu;~OEQQ8~nvW4nO! R<  uՑ%Rdm^)C],9+Y}$Mr6IeGoo@a'c,Qk \4 ,= 6H`dGMm+1z7nQy됥ⰟJgɍJݻ-˭[X%)2d0sl暗Yɒ5Rwibua*Vvbͱ"ZJ9ٚeq(;6N o٬V嚞|JRNWZZjl6["ʣPeǚ !7xq86\X$YSSo`"HX77AdυX \.1 4k<AA6Fh5AAr!;be;hwwwGGGe*#/ 6ѩGf+`,j8jD$[:$IA)$l_gL*Amp9|p~Vd<Ox*#|[ ?RJD\MFGGGGGsi^b&؀eى amŒck nY˗/oX4eaAȣȪ=sg,%UIwPD!* ؛/&DQdYիJ@6sĺ@#d^v ^2>l)W%n^&qlׯju$Fiᠣ]F"O~{+9tݻְA" @Eφ?.[XˣO>9;|+8p8R.N䴯;2:?9i,7Pi4dwPsdU$NT5vA6ZpwZU;;>:E"^xֆmt,t:EI 2 +s&b! 4Be$/%%_-[j~vmﻰӧO{ҥ }-|qM=Z&SL$ݸ 54~abqƅ bk^|.-':{σg( $I Un/-)//$A0 66q̦'Jo <ͪD3L>bA #;><6Ɯ?<G&%? Zs06޾j"k٣8^VVv)٬X k,fz&XY[F&$TE6j*ABi7}²JCĉL  9Ni:.Be]ZMeeOwx萧>_UubH 0;0 R3||e `m(ohnWG"N[ VQ*$)TA #7NYg-]]]<̚j``jvvv``-Be]ok_v,W2Pw| $Q-deyaf&n-U)Ej HlniiXwyg׮]uuu7cqVb4|d9䘸gq,^RÑ)s@ R$VkKIR("EQV A,^ J*<>/յ֫F,VVV@eeq4M'O r\486bLdE\iͰO._w{lgϱQp(36U4]FdOo760yjMonG63s 0 _~hhNRY,50:+\,˲ 1H¾T9xVQwDZdDIH G9p8?GWDhVAt4]. &$)ydqɷA6[]d2X%5~{=zا }%n?ᇚ+}ƠϞ"t+ۚ&~9 m$$F9 $(TQjժ.$ xq:R(&wdВv|i^/ֆn)[ǩh V$(ѓOEOgJB̓蟾{MMM L,5U, /ڏ͙6G / exRqAEǟ{"I B$8 ,:aSaICshZeD8N5q(J]v`sA,ֲّ" Uo]gnN?GSMM衇46 J'Qk5@`n|"_0W[i}:~\-ܹӵC 2IDATh?#)uuupڵ;() (8÷46*I$YVEjOHXZ BK PZp<16C ]UUvF2V MӉ=͵z}߄uI.G7lX<0scJGn"#W"/U x-[**~Yjk`(²@)5';RqxաpܹW_}l68q $ܻ1f 3sG *%J$ɱAX\XRmb0 Z;f966,Uח%J T71o$[p8<O(MBՙ{ڛ:5[)RqxdDx3gz<dR)I$Ib=E(0 Hv$IQv={8o߾ DeG:9 bcՔ$3w<tvvvvv&_OzΞ=Ahhh|xMIZ_귔oU#^H s ~_(4K!ޞh78tI M"ix&Rp8 Ȳ/U:G:qqHܞEqg럚r wXk~(( (p5hݞhCx$A"q#}ёK&;X-R`ŇlXrVHԛl|kˎ^7( }cNXhAh$Xue{AlEȎ$ VcnJl];ϙ!Ka?Jϒ%) ݻw[,[n,+KR`qeRa۳oٴ5/ %k(XFUĚcEЕ|s85PvlbfYV5==8:flD9 eEGʎ5 Bnpl I&=ް ENhAArÚ<ϣAdVQv  R,ߟ6 7Y?F[# &'ȅHAA\ɂ  AAPv  dXv,  ^x!dSJ ͇  H*m  &pn  (;AAف  AA lzThAdp8 M&ӥKPv  H!1::Zp_h쏃, b7nP޸b2>QRR~NGel Hp8FGG A|O.AV>+Ads񵯽^ƿ|k/v.ܹqn H,8ҥ>gf#IRYY]͏>PiiI^R)v  $ގ%̙HT$}}}P!"@A6Iw].?{੧:JJLO?1ܛX >r;VkF͛}s܂ Lƺ'd2ʲ__߹sjn3WWW&RH@A&cq1pf45?WJJLeȑ?ۿb&IiYXXя٪Z[u:͛}`Ν_Ͽ;;ݹzہ  reY~>G9կ>GN/Ν=yAj՟[!?.IrOUHE7|K_:ʲ]'Q>|񍆆p8rH$*3<GCCcO>yD9bV=|8~M e I'O=r?$II8"eUU>_ʭ[wX6 H|G_ȑ?TMMMՕ+ƦT*Î"v, fd ' yQv_v  Hp8neԴwttv  +@ف l::: Cy@A6 E3(\pJ)  (;AAف  AA QRRV@A$י;2m  >WPr.7] AAL=֧g}x;ᭋ?7ο  Af8AA+mIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/add/voice.html000066400000000000000000000142411475757676000225570ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/add/voicelist.html000066400000000000000000000035471475757676000234620ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/appendix.html000066400000000000000000000566621475757676000225470ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/bank/000077500000000000000000000000001475757676000207455ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/bank/bank.html000066400000000000000000000230321475757676000225460ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/bank/images/000077500000000000000000000000001475757676000222125ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/bank/images/banks.png000066400000000000000000001561531475757676000240310ustar00rootroot00000000000000PNG  IHDR<t׊&[sBIT|d IDATxwxf H% HP RU" W׊W(`خ * (J"kwB $l.!&y߷`H?ܹHPn֢p#KQswiS_Wl7n ۴O5'S:wvYe?fjԠT(.j9&@y?/.Xwdҋ=f?׭`js1وm۸;&wJ}M]ȯ~K+hT~umί˷q.3sj9o:L3C֐QGΔ=O-Fy~lsO_ϳ-Yi_/-౳1uLYd~ǧWۘrV+_!Y ON:i`eԹsǸwU^<.J9ON#쌂4uɖUCac0w\d1- 0.jƖGR Ӿ^NӆCIj;Q?9.7Iilu?O[l0b2a"._r%%״&sְ7>^? ӳmt#\ν'Hʶc[sZh9f;r.q&"^pm0̘-1vҘ,sX u\6IJeK`ӎ4l뙺.&Qp=nɺiu[řc4Y,V|L/_r; ~$-=߭}ԪQGϲ'$&{O.]T(Y=oWw\-ǎsB _7^p:iWzK?܁VM}>Αn69}O?ZDd#ǣӝܶ-y.Qדףzb`qY8?pwQᑓIN`_\?B*d2T) r K ~/kҊ`Նp]˲7+;-[bJ:]5^XeL&%B* kpg:m^TewIw4Upuud0wKj?5pG:]-0g+TkUs J T(pDhIX+.^n<ҧ5.m^vC551 ihHEf}0 Cߒ973gfUנvwz^XfKoXޑL~5V74Y ibS|<WY,V68Lt$_)j9:pj´oV\MN~ n/nΜD6 cöCwr\ 7n|k֣Y~^cth]]r8\0X7zSmޞn"BOt|FHEJ?P7z:s# lyg49|.יrxjfSeCA&{9]tڛGݪeKffr'$^uϞ dΖulR8u"'f~ӘtO .Ok(N>iyOz$;6m9r ?Vlw10] 6k=Oszvl5g0 OHNcC##gB1捪ӼQuSX&$թkoЁ;紎gkQˑ--0w(pL&sW72F f9DݚAU ӝ؃)uV5_oѴ!mm5<ݨW2'^ԹÙwV@FH/bޗs3{)s-jd gΓnw4ةDiP&51̷ܹۑsGdeҙ}λ\ga:U9p-yj]t8i2'Ε6hԗsy{7w 7Ѭa5v;I_o+E`\`1D6 ^JԫYՉޑ5"bjc{Q΋\V9/Ő'ƴ;Z Ԫ luVl6S';BrV#aގiœJȖG8ʶwҖ׻c\^G3q9kz on9Y |=It9t<U*p9KIlX;엵v};oe[ rw7#CmApzHMŸxoX],'gc,/U%[d,yv>v O3|..};VLً2{V\]] %ո^q9:5f&-E싦%쯫 fso +MՈ5=x:X?&mߤ/[eklx6jW'Γx1{ fَhHV|8s &ZFRRn5d}khv@L&uj\gu#iOvAn9xMlHvm:o:)Ճ1k6 B*/.w$g׹ _ۈl T\ddm1ddf:t,[amiw4uK^HIws?X-ȟ50NacVh+7fd=͜:"E%෴M p.W_ i+[r20^'1̒?b9p, =ݩ]#w6$Z_7V:9J˸Z`0PjEL&3H0Ȏ:7Q~!rބUȝ-jڏ\~p4NW Q%8z*CQ ]狹YGeQ6 bX/b࡞-w{ObpvmVo0oIDDDnrb/aXP΋ꌛC[Cgdֆ!mZjR.x 7W#5p lȍ5xDDDFh(BrCDJBO/- :Shkᓉ|\fLzؖUo#"""""R>?2z&.%HRGDDDDD,5xDDDDDRGDDDDD,ג@DJ?J:[V޸ADin,];rSGDkP)%-EyGCDan<];rSGD 8C )MB%g\)DD&놔&jHR22J:!&"""""ezxDDDEFFt"nРADEEt"$5xDD>[!H!m"""Roٝ[URH9wwB5'Pᆬ㫧L~&uhXz}_y]2eI"^/&K"/,Ҷ&R-NmB7ʥTbVβtH";PbRUGDJV'K'ϞslNLW2\w=(GI<~9/OoZ|z<#֍`Uxz32b$FjH6$֓ 6=Z׃7siUfД4x7fmPr%n;~͛y2nTVc~Hrڑya;ZȈx=0`7mgN$abx= F0lQQF窝zn2zM_HWF'<ы8_yt:vA휎MʎnFaDt@vs2b8x/+@ 0.jIn<0M;u+ڸ'VQO၄lAJ9áuhHjG`19}q$ǟߟgPZ5E+04'9l %lGܟ76kh`]\)/O5<׽*^זiGSrr9ᶴ KM }2zqyS9/Silƙ3 FNsʞ) @7rVo2)y9YSV:u ^ݬ}}Hj\<@#L7 2P,KEjM{ K'~7i d僳{H:yՊ`c \h>%jg475p6sol߶r['Ȱd؞k w IDATwՇ++_>o#i}Ol\@rqplKz&a\?5=иbcjP p wg=y鶗)K\Fr_y9syN3k(ʕKVt'cr1\>8tyfx<,ZvKE ):Wsz_7mVW…ӧ'"{W+M{?|r+qz>vЬ׽$W3W9?R/_/7M[.6bqsqccF۰MYzb) `A3qjU00lk^Ջ}q)**t^9p@~w|' m əxzS|ַpaWeVX] ŝQG95}7o{^\Pz2ZsGp{x/DZ;c-P5Gc*լIʹs޴/8^u]*zGDn !Uh!Of~ߛHړx$7mZD8xgvc:t$-lw9.]m֬QQ/tFojHb^~^Ĕ)oP!4&B\zֳu21yXO?3i҇7*|)eR>ܹ=iҤժw<E._laذ֭#;wbЁ"rve,]woxqȍg$`ZY-_At>K4&3sqG$`NW'ҢE61Ч=Vhta~xzzpQv%)O>9х[Ӯ幺|2qdffRzUT {DDDʩR'OO { fΜs=@l(7neɒ4hP4=zt|y?ls.૯~ !<...'xK hFj G0q:tΝkyHDD~Rr@*V`08<f٩X1WccƻlذuPJVJ?kΝ}?+))6sb*OgxG:ut~e $%]d֬y\N5kVsz.IXX /_'hܸ!,Yj\m޸lٲɌ>>޸jHi*?/^}u"wOOz`Z9s/<DZ|x6 Ϳhr4iwuj7wnt>ChԨhtOc̘g3\6ojj:2GN-1 )25xDDTqwwgW8k||=Po:˖X`+<+,/uƤm ^G\"""""".9r<4xxᎻpqqHHH={vOeرZn'!mcw?{Цͽ4jt'ݻ?Ć [skEDDDJ5xDF&}Hiٲ+...{o\'B6=x~"/"5jTemM_N`׮ ܟ_+ECDDDhHyvvǖ7x*U ˓KW1xϟAuΠJ\д}c>rM;wzz֭{жmOHLPDDDDJzxDJjر滻a6};vVEFF-?)">>>|7xٳ?*qGoVkb)I\+駅qG+%'tYrZ:ujo[ƬYXjX,L&3gΜeѢ ݻwIFg=zt)//Oj|/A&"""r3P`0jZ>`:闩^*/8̌je9xL&jGi4ܶEӤI#myyN0{l >̞e|͇v-8xwʳʳnjan݂B/"""R8<-::8DEEW}fdS]qLaay93uT)bbbV6 /+"][TWDv:cöZ}#.b~h#g:Y,܌ dlH6vS/-7nܪT_D"ĸA䦤RE.wm۶';wfM/{]䧦3/ѠA;"#3s m.'Iws}aÖ"mUݝnt2YNDELREFzUܐ URQb8w.kp}4zjӪU3r%CG2l`)LfmۅkZN<>}sI~E&M_{h\R#"""r޽;\9kL&g} jՌ=2g s).냿9:thG˖0}7< yI.5>޶4??_RS/;?%*&Ҽyg ԩx*W$29 .`uTO m:wDkWl>|(*P{p<:-дi'ƌyes1]8>|иv%!<#G+ϋgRr)cr5`RR.8;j*?/z<֭[bf̘7mEzw*T}5 k3z,]11kO |2]@^кuڶI|| +>>JmիW!>>иd#"""RT'mi11qԫWۡ|gUkyݺu 6v?dŊ?ׯsq1\W~~V-Ç;a"֭[@*AXBT3gr=s\0) Lf\b`6g}z3J0eʧ\̶mX`<ӡ|Yjպ|}I:ʕ 9̙sh֬mwzDTԿpBB޶9rzv].IXX /_'7"!/0Ll޼ ~o_rR2 }tk̙s5kw?(ʗ/Gddw {^-Z]/'NG!<=<80\=@/=pp4mډ^/'o1a[WNɸqDJ W}fd+$&ݩSg>lYOI#eĈcއg虎DGG-22^%leX,>l&{wScGnrpNt0"eUa=+zx]ҦN}soiܹDCi۶'-o߾= :ѣÄ 9ȑ 4ƍcY iٲ+wѡ}l߾""""""EWɟЦMz__]@߾۷;kܹ֬\[7+VcK۲e's|%8u XVxb!!_ٳ?or埘 E^]ٹsO>9_~Yl[fa9Y7o֭˘0F~={kW,ggؽ{5|3@]<&3sqG$`ϿivN>bkԜ>O5*qL&9~-0`@/o0m q{H[ZZ:.2k}'t?^аa]WSIMMl!oC /la֬Yo[fa9ED4$0"~&͛w`o۝lٲɌ>>޸v8OӦi-Z Л`*U  ?k{} ^kHƸ瓉O}>4mڑ^Krr FO_]Jw1}7ww7Bs2M; c?e""+LIiL&3#F<~YDDDDDົ||=s|͇Nم=mْk׊o^``ELy+߼ 1 ?,-[6u8ݺϵjf͚Exw_DDDDD^DGGgMs|"VUֲn&"WEEE/ EFW_TWD8 %xSN-R`"eʦ"[AEuE$7ػK?43ovy<?Y,܌ dlH6vS/-7nܪT_DW!t]>Zjm۞Shх}y9o>&L+rDDnejHa2 mqرڦIMMg^AvDFvg9NK6k։IJx7EDDJ 5xDDpu5cxӽ{'4o%vM{ߞƍۜZc9xp#??8̤InRrTUfL&~u)>-gϮ̙₫Օk#Uv;]}c <4oޅn /w]۶uYs>| ͛wm۞|i?D> oС#INvȵRk<@/Ǐ"--z]2iZPX,QBy6mZJnݺM< |xڷoj'F=3v.+Wlaذ֭#;wbЁ.[DDD.N!:z ----o[/iN-W'[|3f3NÇ1wzZl5~;/@ۻw?qq3 FV!Xpo IDAT+V )O>9х[ӮN%""RGDDJ9sЪUsU y{{Y=3>\rOӣGgʗN:C*AN~{z쒫7ĉdddҹL#>>`5jTs:6M )]̕Vz^^ۛGzZ/NEFFUHH0OǓY`W'G駇+WΗ+b0rM}ΟOʕvy5zDDHHq6ӣG\鮮}S|ŋl۶ =m̚5U9^GO|[^F >iddd\󦸀|=W>l& ֥z?4f b=4nOO,Y X"oȭN )uY@lCrzQ/_ >vzrݘ={5˨\9/3f/Ņ?L||iӎXS0]cҤE[H3iҫxG lُ[z,^]Wfw۲es*AYLVկ_y*p""<{x3JTT|lH6v=|TkQ*)\,.sY}vG5fÄ  URCc&j4EMlmht:=[~^w~oi#""""v[,xbCDDDDD """""jXQł- DR  ]ۘ;wܼ֯p9.\_D7ޑuٲ5XSΏHU,xZIEE%"""艾]_W}DBNde@@ \/\±ck8t`ʥ055_GZZ"|}䎗}rQQaffI Ù3IHKKjkkS]]M浢&"!a'Nǽ{qvq#+Wر4Cs#"""j ظ3_/PjܫI5 n!Y[[ ^z]U>""""U!j::055~)@XX:uK<:)(Ξ693?o_W͛U6a+1WH$,є)_y;~ Y2mzؼ9c6ȑ.@h ۙGd zM0~(;|xwqt::>DDDDO+<-Q,򤚚l oqƒA^0W+DQtV+<*C^eggM6|AA˟u -")Ea\3]hq8a{hWxbqD}gB$%/_+DR"(O?H9"唔>$>Z.^̖ZV\?W^=KSY Q1б})X  ^^c(H$/d D+sps޽_i33SME˖-S`azpuu矯 5/ĉٳ磬зpaGDDD e lOi;pv ߅;ܼ}._D7ޑyٲ5XSzu$BC`ڴڵ :v4;×*<4#?Yg1x饑x睺 ]ۘ;wܼ#{ɋ;Ç $$ IX[ """v***agWhFnU֭ۂ=1m[8}kjj7N8QNsde堬6Ouu ]gg;wXx.]"7 /Sq`pu1l`,YDe%ǎŢw,,$۷ vGjꏘ4'N3y=>555y1ȨN?W_\&HKK|beGX.\±ck8tHqq֚X3}}=+~ضmC˿*=ǠA.Ȩ+n~<tN2mbKϥte% `\\e O/䠨MMMaE$de場x#6l p9sAKK jjj|9Wt|hkk[7s̜CK8t(ĉ4ѱKKΩCOcŘk~Dze!׃̭(H$H$Сbde(5vkgx==]u.xtQ}}a!v`,ddCrr*b32g055…a{ W\XEۥ7aݧmUUZKtt,Nԝ!***q~yEioܸss3n[T%##Ca[GGwU%!"""jg,--< ΅uFDupvؽ C}b033ema`DuE133ŭ[E2(( 33STf۷=j=¢+:v2폌7￿W\űc'{` N$W[[+|#/KBTUUASScbESby6"""6H"?DMM }X\${<6l؊wp|`ʔgTTToQXXһCj)=L?&&Ǐ5:6Ŷmdn8b:}7n?޽PSm`b6} DgFbw񀃃 tt vwR 66/ҲVDyyk .9ᥗ`aU9-Y+#&&ueep1F=hkk={࣏֣>DFyXcθ~qQg_z0ck aa!ԩ#b",],!S0x'bptOJ:g/ȍa gH⒧G^Ś5`x9 NN .Q^:o_sptwYի߇}?hhcֵ(51aJ׍_XXa&qyg2\',7/{cp_ rϧ)1a۶(,,!^8pK7oV曃26%獚a5Ӆ^> (Zq=ײh?HJ^0WJIIn+GDqF#>r*_IOOo^dD툼$/D/")JUSSmۢ=N+PtV-T9J HJ^0W+CPg?*Eҷ=Ҧ X,n"!:B$\!RT~XHy 6r+Da5 KMDDDDDV л+{o7o)ѱ*?f\`e~W_˿6'd"""""iVcn!!okl+V%8u*7ªUdU-իHO?}{?hNDDDDDҬc4݇cG'$ S`066"66Q!iS2yyBڵ[0xھ i8s&S[ 01rd\pIn;?*=@7PQQ ;B5<ܤ+B[>=FFػ[.AZZ"o_RRB$!++v"""""jZ}}=+T? lm_IxyBĉab:uttqo4䢪 `nnh;O-VLs}H}~-yy3q_+30h'ܼPXX;ƒ%AMptCQ\\h;O-VXZZ@WW99yB[vv.{7i<---xx622ڵᇟOpLannZD$$ɓw>6n.ڟf<I5!jjjP]]-TD"cÆ{ g!1Lir稩DRJ$$|RbOܿ_]]p(({?C"> m'""""YW}6nRxޚ%Kaa!XxbtҥpuuOJ:m1b[s,\ à +ex{TXZZ}֭W"4c[0hE~ QԬgѢ@,Zh6oh?*j+?4tBC}7H>|x;97NDDDDDҷdDmJpp~ |aI1W:>Wx"##U=l"FB$\!R\ia5Ӆ^>-Q̏g,V~G,H@Dmw/DRB$\!RTzhAxxS1_SRC jwiZGV\bN77/\ݤcq,x!T剟?={Lp3O8i4Ý;eOT[73g 2|Om)7ѭyHD4!"H?}}=xx/""Tܹ#*ϳnr\(5k/\{"; J_~ɑi~b3 F,f"`CDDmm-'5$$H$RyuuuDqFҥB% |psĉٳ磬R]O3g2>1زe0|BB T7kΗ^D"Av@z9 @/ȴYYu)[Z"&"Ă[%`ʔWh_n ĴioMB%w,,$۷ vGjrk0n(\xgOIJЧOO$$DV %xo…K8p+;_CV:&푞~@]qꄁe4iDDԒXsƍ[HOτ?l۶Сb_U?  Dmm >`!<^ҥ󡭭n1s:"/++wPǰa0d@b8qJg.\[o-_݆1&>aߪ* lm¢+44#]XOĎ{PTT uuuodd(lh.4kNQQ{qnKѳgc0ܽ[+WB,vj!" zM~ZZV_}jjjprk#,l bcEWt&KWpKen.VxOov`: 733mҜee{ AffؽLaiM8O3&"[ڈ蹓qEE}:[EE%6E(-8Ä}bbpxsM6yy8u*66/ҲVDyyk .sp6S2?*rgG@AJ9Umm.B D*QKaCDDϝDxzL{mm-c1z 쉨ؼy5} Jϥ3a6cu(,,°a8 Seeihcֵ(51a¹l=S1sf23F߾s>2h3K0p,hɘZa5Ӆ^> (Zq=ײh?HJ^brDDϧrsW(̏g,V~'==y# `=N^0W+DQtV-T9J; ")y\!\!RLuX}JFDDDDDK+-Q̏g,gxR6Xܒq)rR/DRB$\!R.x <<\倈JJruDm)B4nn^x1YADDD԰!jeq}! `Lae"Wy씔1y7#311qQ7ѭ9@,`CDDDmJQ-[6 EDb 55ݵk?VڀKi*t.]W_}wa01p __/&mDR H㩌EDDD\!jE))ǡQ^n_$A[[ ZRzFDF,[ӧOEW F(vzb?ŧWx薶(*s '݂֮'exxLÙ3±..cexzNر~*^Z VRQQH-jtu``OLN>YY9(+/O#T\&HKKV~鉄:W-~qq;pXSX aѣ[~ضmC˿*5vIB__e \\r'IghhcIƵk sLT3S۷](†FmmWvy[ڈZ)x$' 99sLŀ/!>> @{6E(-8Ä1bb5MGGÊ{ܸQ df{ O|'N~=C1wˡ={6BDDDҸC tt-ӃZDGWC"W/+l޼v1IIGѿ-FpkpWabb[|uo,]:_x*\X",Z11qQ6ysᇟWcI54~=DDDD-38 zطoc6)ûGaQ2 @xAvf6oiKOOo8ڔ`")y\!b)GuX}JDFF Q{-7٘/D -")Ea\3]hq8a{hWxbqD}gB$%/_+DR"(O?H9"唔>$~877/\-w\q2#{Z5YQWczv{R-E~C { ::V7ofΔhpS!!o[7s/%{L< DLLk<#_ bgde̙u1D߾nprYqVihkk`CDDDwAHțۤ+:Waժ 8b3Ξ EEŨ_rdڮ_/X صk?. ɞHMݏ3g{o4iҘ[ӧg}Iuo!&ĉ88??o&*>9Ҝ‚  wa@~D,X/J_l-$ mz~Aʪ;L4֧FDF,[ӧOEW &&ׯ?#0j/_`g7 gGY}o0|lٲ0v ggwya]/o#ek|riH.iѵkthOOw/Ux>..c#FLP\7n߰9sFEE3 VJ_v [ۗ1 gdex{`p*Y8-?LA TTTήfggܫJ GG{PWܸ:a@GG;͑{T@uu ]gg;wXx.]"7 /Sq`pu1l`,YDe%ǎŢw,,$۷ vGjꏘ4'N0y=>555Hrr*RR`Ϟo,qws 11q2ff^DlHN_ }}DBNde@@ \/\±ck8tS&fei ,xa't@yyc 䂌槟c@' $&4;֒;ӕ5 `\\e O/䠨MMMa$de場x#6l p9sAKK jjj|9Wt|hkk[7s̜CK8t(ĉ4ѱKKΩC#й!zWW' 266/B__pe1g?D40{T|m7qxt:Nm\c ""CӤ%Xj""""jt=E{e EbgDEݻe(..EϞ=`jj pn\ ةٱuBEE%+6lD",CkWSDqGaa,,BCC>ۥ7aݧmUUZKtt,Nԝ!***q~yEyTLMe^Koii.(,,^ߟ;(,,BIQFF¶6JK6)fei \!"""rr\X[Vz g(+ݻ`G@033`ff Kn͎[tȨLM"n|&&LaffR1o.V8ma;v@j~||c&&Ǐ5:6Ŷm*]8b:}7n?޽PSm`b6} DgFbw񀃃 tt ?5Gbyݰzu$+P]]|\p O~/d iɒ \11q(+Ç!44B4_Dqq)JKbӦ+u:ٳd#eDO oi#"""j> l:&&o5 K)ŋW@,A,],S$%E1­ rƹs1pꄯTXH@011֭XSں7.Q^:o__wW{~[w?¶m&4z}ÆMÇU %3e+')5/:/zzptGP\0ylܹs[3ԭ6y{TXZZ}*HK\3]hbs-;;3_ sHJQrD7na<1ؽ&2ϣr*O8Z[ӛQ;"/ sHv`۶hx{{HuX}JDFF6+0F^1_d5/"Y"娲£tCDDDDD_(X"E ?CDu sHBEa6~XHy 6r+Da5 ڭf<_} <&yÇ8v$f ѣеk@.&2ߟ;(,,BI %KǛ݇aٲX7nllt~ DDDDD̴c4Q]ݴ hiic4ttq^h׮?|3gss3&"!a'Nǽ{qvDDDDDԶ5HQSSGOKķ&wS=zp|LLO;GMM $jTTT"!;{6AϞ=G?W3$jC__"v"""""jueg_`/11qxYX$﯆D"A^Vؼy5[ a0hjjʪ;>xll1F߾ Vmm- 4AAs{DDDDD5Y(6ا}In#{gf>> @xAûɾv"""""j-==% jS3_ sHBEa)r0D홼dcIegg7/") rJC kw.4iZ\e~=cq+V\Oe,""jg5 o㯿n zzBUXX]M!i(,,Baa,,BCCGÇUpw#'cؾ}7+5, oh̟RΉƂE(-ٳmm-XXg<OXZZ@WW99y1ٹ\jjjprk#,lRǘ֭"܄)L(Rn.-,cHMݏ??֭&"!a'Nǽ{"=7wqgDED"_F|| lm"aVܽ[糐xSx c 2M|:p_{{tƦM_B"ٟ||<`m$']? ؼKnX:A^^>.\ܫI5 H'"F!"H/\#G~@#1~нy?>aa!ԩ#b",] WW'?)(Ξzz16lS:o_sptwYի߇}?hhcֵ(51apzݱE6l"Gw+1WH4Ws "#""z89GEN#G>Ѷh[vfd^eo퍸mb6lݍGDDM OzzzKAԦgI sH9Sz'22R`ګl|!/"Y"]էfhhXstAOKEDDDDD*_-Q[/ |aI1W:>Zr@DT"0W\!j>- W9 gQ-Da5 oi#qsŋ: """V̞=VV.p ̛ XX3/0ySw\}&u3o*FDɓ'dVX۷KpT"^YamNJ߳g8nASSS׫'BDDDFpD"hkkA[[ ZZZBD"A|| ,xFpuuX&4I8pzDL Ǫoi[ 01rd\p PXXg ॗFw7紉/@__O(\Lɞ }rQQaffBuɓ⧟RM8["""g?CWW))ׯ***zP^^<^8pйzjp?H<@NN.bgXZv\t׮VTy‚9D sHNNE~} :ݻ/S){ƍ?TTT5, oB~opweBp-rGDDDV6gDKKKK ''O΅uo566 S+c7 ;qd<ݻ¢+n,DUUs=oXJ|m2 PZz11qHM=ѣ{xlذw,$&)8?|}.CÎ{?C"> `kk={࣏֣>DFaa!ԩ#b",],ٙ8{Run''{W"4c?!T#(hȠ!h IDAT.԰mZa/ 8%4ĉ1~a߾ ټ9Mr?rdo}yy4飮]v_|"w>"""@M |!/") r]է OddWrB$|aI\!RtVa5Ӆ^>-Q̏g,V~G,H@Dmw/DRB$\!RTzhAxxS1_\!Rj_v5῏ZZ-6" >5TᏩ3x&q4y xZ (MuMh@GCJ 'QWL+LM :} N (,1?tb^_+5>ӱ3o:*/ LZ擋1AiAx}]02D}}QSUq yㅘ0Ʈ?Ag8pPwKۣU_~Řc`eX͗~9KnU^}m ^7"j`mYֳ}'[[ V1V0Np'[W'W:,w~0"""v{,\{;S;j =p3{tdztߧ^'y8TpH66A(ƌ>Ռ}#dyx@˞=g2ogbG\;w<>z^Wď]GJíp4dX][ 1`N/֡[1\/>QYcׯ0`Y @@RR)ge+=%9wrǥH1_Čncwq9_ե{t_ sHeuQrZlkds0aҦMZ MBSіENRuJ^u|Ws65c5=٫J`@D#Pyld1a>,t,`c7;KٗW^ŵkXxE>n5﫾sc~3LMaZhk,cs &&e u d KѱeGk[68n64Kٗp9.&[u?|}kVmʙ)P SCDp|}6$CCMou{ ::HKڃlBZP¿?yNáb2TӢZ&"""Q3<ڍ^7(ГNDQil#mb8;wRI豿ȞUڧ:[no=z kFa*,mRrS+o`}w#&6:m*/ VVfwkܷo{.Q$/B_1u|y]v؍6^=hi Ou::xmh2VգU QP3<ikB^&m@;v04@d\_ǭQ76E/^H )t# :_`aBQeeeؚ#" D ~H|Zu5uDFFA|&{L_xЀZvLZeW"ap9b߃#X}cY ;| #u. wb/ ;s464 ؒNobtѢbTf٩hvaɥ%׌^C/^ywc#[/mGƖ-j_[8CDDDԌM/05,\X߫-qrs?- f7?v !CU=%ÎSXY ;C;'`k{->(A8 t;{W^$/LHt_'5ț7d7 7Q&ٳ8{6&x 22a allrUD}7 DEAY-EEoDtePGOOKCall/XYY߯d2<9sކ!>\tiV …s=fhժ%FB+< X`IKKO a`/Ĝ}W^ðe.'(k-w4w#/B?xxb@qƌF^aWHIwMbb2csmjj߶zq|v;Kq}sг=.]:Ub޼vJw ѻptC 1,|}j=}Z$_| QQ;qT$n޼ό`Ĉz &<Zpw bbNs>?04l~:~;=eeex`XZZ…#طoz?NYe|DDDDDY<Ř9sǢKBfѲ> D:S/0066+={Zh!0UUd{CSSS̘1n011:&MzZ}Oo"$ $ $&&#'~0\\^u,ƍ{ c8jgr ܾ- .455~RRR`lhiiʪ N kDDDDDMUK]L066ħxǏ(@O+-zMy}.߲0Uǥ]6HIU8ff&ڿ?v}PWWGff>|?+cii }066?\?~fdC6|n;wCн*xd29{op2߮%tt|HJJugQc۠U8tLB[YYʙssSܻL.w S5ܾ>3&\ׯs*reg?]xycøuO &&F¸bwf-ZxU+}>_q """"j*j|I\^_<|2(**\^ H$pÆ ۑDĜ.h9[Z?/_hܿ8z.\2>;;aӦ/!pOϑ5eA}#pI\xmx]{пwN:!.`%Xcu.#0r$L: Wе+ ul߾[?ٌ֬ѣv۶5bذ O555رYpqq믏}€c0s.A^c5Fje{Lt򬴣T*Ç)Q6kU.JR5^IIIU ssHeS態ቋ{ȈeI0_MY0W1WQuVV;LY1_)MssHU3<xITZ'5E>>>*!g ssHUaU{xxx"q@"qsfjXj"";^MzZ|=VX+cQ9j55co6fW_mL&GBB"$8rzDDT8CDDJzzFCGG;GR*H$҄&455E}Nrrr }}= z~Mӫ0s>ZJ璶 W"++sc!z ggw}-{- [󛍼'9LDD$ ""jTOATa>EZZ:Ο :+Yn owqEcmk 3/ٳWiǎE #nq/_SS|zeeex`XZZ…#طoz?Nry)f#F իg7 D~x,xQquu&[7 aРwvX/ЯpMQckii"*j' [cѢs(N BFFB??DD~~pj7 fCKKVVm0u>|y: ׫ ""R5O;^^HI  117 }\]]`g ;w@`4cNކU,[6gF#60JKå }LLff̪ܹs%:t\]u,¾̂44 o߶ """"j423 ?҄9<=pq̚5u45[@.h{榘8M,^Fayz߰믿annr,uuŧ'XZZU+}>jp5!CcDDD̙JOOoCjjH8:+۶m-YZ傃߁Ujm%mDbVZcGԪ߮Jlٲ }4zyWDDDDgxD"&4YvUOAxx$Tڞ@^9!뷡wᰳWױ| ;!?DϞC쎰Z!q[mAǎ`֬ۻZtnniN,Y2WM./E@5vm@B6-;mW_bb2;ǿ!D"AYYz+z G'N^q54_ رcÿ@~R7E3oAddd*,dde=3ТE 899}8B?DO>Err JJJЮڴ17 fCKKVVm0u>|uKTO\]]ׁ믗pitETX[a7lذ..N,XXB"k))ַz&ܺ'Eq]`qBߒwrccjNDDDTX5M5nWf֬2 mZ Mq^d2P߅sO0&Çb0Vq~UDӹ#"""OcBNN.""qy 2@T;DDD̙XQ۳4DŽ c.,6m2 /^ALnJJ*@&eK=B"Ukg+C_7nת\!eeeĐ!з(6o^ [QpI\xY6gGQQ^CCaaw C0w\1)_ WGAprrL&ǬYPW~ff ;w WQC`ꁞ. q;޽Ii)755u Z1G6lX^i[U5$3 /L&}I[^Oi:t<>hJJJjrH*łz tBvZ#%nӧOo1~Boܹh\ÇOT9^|UDF~c"q[{IT9t\WW Ǐ(@ddC6Ԭ)*cbb,633Fff8`CDDD dr!44}YBGG7eII),jlKK ܽYkڤ-믿%ł (**Fii)gy0\^_<|2(**\^ H$pÆ ۑDĜqOOƙ3n{wkt˖G~~ 5ޗmbӦx5"A 9r/^tjjjرc-23_}x_<^lfMWxk'OR==Wq5)AAAJۙ/D ssHUa v0DURRdcS/r/k8;æM 51)z ,,Y1չ[)H: )Q Q9e\!*\!GyXEzhÇ)e!5 "q+D5R+쎫W: і/_U66tDDDDDF |j]6'NU7Kcg79z<=kWg8:iAtjMîw`eFiD?ݻ _~QH"""""5aUc?"0p>N:ZcǎUo|c9<tuuqAϞ=D#!hToܕo6fW_mL&GBB"$~QcP==],]:=zt||`eeO"@KKZZ=ӧEX2 ΁XXXU5j(BB{A< 11_rի0lٲ Fyc ²ݻaР7ac˗GFF&&Lx 66> 1T]vNrrr }}= z~M,N^GV% ߐ}^ L.߸q cvf#/KDDDD2{x ==ݺuQXn; …KLLF^cxxxMMM ry)gO{\tV-ļyKqBKޅS"eǎFTW8~[||,Y2/GҶ%,,g^@nnBU|vԩHܼyƞ11W$| j)..̙ =]tNw_)j̜GՁ^={Zh''GW8&u-]`4}{+899uؼ ==]9׮]lsDTNƢEѳPLL17I YAo u ..eL&C`|O*ή:wipqyǎ5 I~홙Y0U7]6ޛ}C ƈƙ3ga{GOaU6m2 /^ALY]~6ii=ֶ+Ξ;8ym@[[K1}/>s-!QV'߽{O},Zo!<<2 :͛WV{I9W /ƶmxf@CCaa+5LMrǰV]6}}}ܹ)SflB}p2ŋ?,ADD4,--0xp?Pk˰cG8L1z:O""""JlϚNvJx0"jfZ*ۥR)BBB1"+))|ac,WVS I[\\܋EFԌ(K2BoBTB$D_Z`3e|!*7qr"qTT$6"""""Ʈ%mgxRiDQ/r"qTUTf9"/D8D QͼqjRCADD*!"F֭?1i;=sB=?3g.@n.JG"<S̎*ff&Bii] С=駃x 6n Ѷy,xQIHHٸ?ay6||<pÆ ۑDĜqDDD̙JNOoCjjH8: }^kcoo}}]|7K/8wО+hRzzzj)ǂӧƐ!Я{ hݺґ1,XH#GN˕;w20eLq0êU }fNJ`o?{~#h`۶㰷mv}45[ pj1NNn5+KDDWHDDԨwlͫl߽{Smvws 7 Oi6-֝(jޏU6"$d\]]eDGBLDVaCTO݂֮0t&pq ccC}8"#cDd<@CޯaE,%mDII)z''7=EE ֶ5RRREjrs0z0::6l ~.!:zN\^3q/80F.q$&xӧEBNE8|DQ]aCTBYYN G| ..7tuZG~~>|]]affsԄq>>}za #hhcҤ7۷&B"@"_?)""":Ƃhkkf̘#XZo"~<@WW ǏTZTHgPxoff"̂)? ڴ1WX3 ÇvC⍈1`CT̞Vi{vFr aYRR ;Z|r§8q,\\^;33dffTXvn駟]_~9ic2Qq54BffvCH$xxaÆCBB"bbN`8wah9[Z;=,[Ǐ 55 3&&F?ޣm/ry)~%]ڟ<ɇ6:vl8yCBDDDTXՓ>x:=0j7iBhݺґ1,X#GNU;˖}͛wq(ƍ --JבH4mqqĶm> -<+<Lv@D/I`\!>*x>d5W_~nӧ]v}KEvC?4Lkprru`̘?.]Ŋo H4^dy''Gmk֭[}CZZ:@&3mS!hð}g8z4\klمQ1|@N#+0ƒ%Ͼ5 wàAoƦ/_LLll} ׯ߆޽n \]k5>fDDDDDT^h֬لhCv=z( ==*}uCV- .wE9v4“'=WbGh SDDD4'!11C"yFDDDDD{'ŋqj@!l$MXx MMj8 FF022#ll^ͫ#ڵDO>Err Ҟh'""""OiӅ9<tnݺVZcGď_TT ?٘1_}2 H㐈 5n!--?::ӧtFd!~ZZ҄@NN.VpuuAޯmۍߞ΢Ekdg]e.xxb@O/L&,\YYggw#{v:DDTXQQZZP0m|Cu[з(x{ .m[KXX!8x1Ξ<7gc$|vԩHܼy?n055_Gll ܅u 8{6DD~HLLV@?nn!" Du޽cŊ pC6fBWWuC8 ..رӢae˖ٳш=R9>p?# ;`hh BAAm uuuDCDD5*֝wV\#v"=o88U_ScnnTdnW$'ԩ#E^'(Q`CDDJBB" ͛(((āǐ\DDD2d~DD4Μt~6iiGKKF APGx5[XZZii5s"" ,xQ9}g 2Kػw+tuueeeĐ!з(6o^ [a#GN˕;w20eLq0êU+7 \~T9+Vl }5xwnmzzط/Lwoа5֮]2++ hkkaԨ! 6ktnn6ZQ=Wq5)AAAJۙ/DKc̕Rkp%r:H Ohhh!j&󅨜|i2k Ts>:HlϚNuQ+-2/- """"5[,xЂn]eDDDD 5c n]"㺎^B111pwwo0=51 ։.x2"""""Z'!""O:f%Q該{{j <@}0n 汯]?pxFucOziǟǽ:Du ~ ~7 1-^r)mq;=Q]xu C1}y\T 0 (h{)id*z-A+3ijx2V֍2s[dy]2 qIQp7}AE@.l gmp`_/_œyΗ|癳^JMrr25k,[.;ث-((H*Tx <<\jMI#XJ1ͫGb%FGחCm-z=XoJZ+Kg]ag6Mx$!8$cu(I{ǐ6:X vǮgy\H>Vn?]Ѭ[ť>z`^/e \zرZVH=}t՟ݟ1nX#S{Tl<ލ}s/R:MrϪܓF{Ӯރ*^>xVb̴kٖC7~.OgoF%^~cvZS^GmccB0r)eQ_q!,:;YYԪӐ}P~#E۷%=p_5#7j]zQa3'pL2Vó*-KI}o zs̆z...|n|ڼ]̘<^/S}_YisloDlv_V%Űiݮ+}S\9zĞ9gX%= {;/'$ص7"b7Y{V.3{j\J=O^LJc`]{YޓO]ς"novf^o?psӑɣAh 8{(yP~ڴ1 7jΤ[]Ol*>wok|d.Yt ӋQ̚6]1ԃoT| Gw(9[ׯ$;+?I+wmwՍyC0\q7Rp&<&yƄ?hIv>F<ERP|z=b3_Pz|x~/'dK&;%zGt:7#7E@hKn+v7̯ۣ.oZJ}Yn,տȁvz%suu+rl=s\4w٢`50<8/o]9^EZl/pl(=fJL::;p1T`OF<wiq:۰)%'n#X0{y;ʹEs9~h,!8ES歂;GE0֖WTZk#w9?ϰ(qRySU/x0c~-7jA6 ~9\B^x /U|x~HsygJdp]Vqμ`g?{7srH/A?M/3*3ؚK+0tqq%ao7cۼ[&`[bmyEWQ:xV]z<3տ|ˏ>CߵNjKnD%';4o⺅GYܽ{sz5mY\ {-pdP8ٕxw ÷9Y|rJ\ߎʹCZ}"eۣ]TTJbX` 6sFJ9ǖ\,\i`$+V4>4+嘹{0:ݾloKo}/shh׹'ϚU-Pr)IؽFRGE#ሾ9q^}ݝ-]S}W65G^^[ׯˉc`7ġDIH='ixT+Ņk)Ud֒x{y24b gNӜJ|[DO ?גW\Y:`{@i }tQIȜv*}@v$%rb {L۟hܳi= \Yc`ٵW7ϰ7~3R[Dgge0)4y1 }@^ mMcg1o(uBɔ2泇wӹic {9/Hܝ[DTN:k('v쎛NGWlY:`{41,,|VڵrΨ}/S۩H >b~ q39w9M[޹4nj3MvOioV1;ye >~ phw\H>˜#/7ז] [3/׮~9Ľ۹s?'`ذO"#sxպ'>0T!#?b17uA8kKu6u'!]bv+$;K {& OHI*xMʹD>78)nrTXi=+İkNK9gds*v*%}[Ou򩆋+-n9xؘմxy3% &3ٙpVy@;J*f| ՍKe]P5lڒkW9w#;-V%)֯\xa̛N2mMCNlݺSTܸƴC֌9n:.;GqBz vxV}mߴ*׷ZSdg)S1,/|GF97u{^hK]T6ɭ[79u=is9gtsl,4}lα6y<;s040/1si֪-=DWWYFeͲ1޾7.qÆpqq-^hpӓ~aǎ ?0yn䇤$_;04+3OJܝ$(S5 >;6όx~|b8})S"5k C!??3CDF~`ÆmwvSz'!/ʆ5K^WW723oЫ+BvlYwŘ=a$j!؃=ީ3g[Ux{J4mHӖޓoy}hE[?)W\ׯgC8'&&qZ}tEKmۊmvӡCrrnrL2M4gϓVzuرcZ5sU ___hP4 6m҄Gxmdj֨HyaW{n^ m]dq,$$m^=bנB͜ەWo$a)w*)V"$D bvѣ̚5IODTzkWlL}L+VDxbbrboOd(NͥnZ9Įlf+m'Zm;ãq9¾<,__.w kqHW?${ǰS܋q_6s \f0xs5rspq1yre w*uԖNڒ~bE4;'.r0m# a$C 6kq{Wp)(,xcXq{gӹѯ,\Vӹp1xJԫ ^\Mhh7NƎARR YC֭_5/^M>HIHVV6 Uk+&<G:di{l:|E=j\tyUfF,X ZZQ^vf||2y{'˸pҴiCBCh45^џr-jg˓3<$cuD=c5r9C%Khգ;,v_3\F2 eҤw]ۋ_>uBrO%X2QyX}Vfrͽ#+3,^8JڽfӄGH2V @#m^=bc5Y-r󋉉aD%.;KZ<ᑄX!HWvN*Z9?%>cXqd#`/iQ`71b}t%; @#(mEdt~e\Q(ܺ_w=OΚjүs*d-yzs5T7{< ]Yb2:7dԩ[ho' V|_WO\0~q/Κ7ףG?z;ND'"/kH_/ЦI5>!Oj/Frn\ }{c{Xc^ύ;0 We|Q +{Ll"T,En( 6'{=ںeXqqQ҈hZZwyl(;8%Tpufoh7KwHy:s|oKasؕ0W`ul&;.v߯9Q1 Z4ůWrn8[ciaL姨F3tA尳Ќ<\1(68$&`gM`hDlKz|hc! dѱ^3/?f潏rDm6OEŞ×mi>ïlXP*( q}z/_ ()k {5|7 sWn1m%<{'8~J0b@K\^ Q#,%5C_&Q+OVSRvē?Gzc9g0-FLlA][vm3;+a:Ӭr]c~ M=QRLehmL%ceoSVrvyWtΟ>ӐpŅrVLul')i° };CTpR.-;~cnq73 jy?zJtkS gG:ZkDD&J>yRŤsU*( oi\YㆿgoI~z[iXZon(UY aJmP:#Tj_`-ccGkӲF /=#)ɩXZ}h&=#'q&d2hP3@z[p-3'\,66/i闋D&,;0dWwOɎ <=ڣ<VпKjT.gL̥fаV$)߫)\+(Jd2N6'뜺x9PAk3{UA&Vt3MzLJ2 d2J Wge)/]9|~ Ep֚MU(5hl9O.^c_Pa_Nk"  9q+Uf,ٮ#S70ScanV"‚؆6 Uzlߔ4 :}1Fp' Ii}\Nyq)o.MI{v{sʵ2L|hmDPrFċ^4pqcLp&1-7}6o&k[P?Z-wRxq}{9Pzy^?n2Wcl- )LFdbrfژ2ÁWiӤZѱ m~}cR&\vkU|WZbX :K c3Cxz¤kLΗuB9w>[Nf/UZT(L/gͯԦ(M[ר9 $C[2WSܳޗF>4&' @24[F{,WB,w_ ss9 -{q7<Δ/F:_<9ѿs}Uy.\ GV$&O7GӷctKrnIFfy_2_ƕ 4Sنt=yY6>+.o`kir~*x̜ X?jX^?鶫}l}wW{Z7|ޜrN Y2 dzGZXYa=9{^v5+rw1]t79mڣnJ uvMUwW{bYg.CRnqWk zfgcEP7TjN_ #gkgI&gA Z?̑+IIM,UT;zHdTzuײBX.6a1R^Vk(r)BxnwnQcм:G΄J/ĭWn1ӱ.>Cvnj%;Z8-^\eEm#CMgI&Puvͪ/f84 vM5}10Zy㦖:۩+itZrʔ4Qlؒ!Jk4@KU^߱+ -xY[!UJq'IܜmuvwɚMH"׍%5鹋-GufZ ),kmt-%U7~ O;rs@P`.ZǧYBPLZZF'޼\&p;e'g}ynȮ+pc] gѿyӥ=rTC~JUKKc'$CKdOh^ۯ߫EAc{[+ɭkv\ӦP(sM_%O(*N] 8*BY7l-~`+匽U刱nɣT$#*Z6ˑhg'ɤ㮳ck/Suޥ}B2M~vMYQŲw>k+ ꇔGPru1֓g DF?ҁa%,, k^AO4Z"{Rhze6,oհʋUF;nC2zԴkTۖ Xk[)XYhʯ'Z~/N36(m҄K ߙo Jr(z뎶?KfX$Vr\/NqrۙtvF{Tރ:|9uQ3. {½1:rR&?@ٸ,S~'[y4K_Řo}pdlޓjw( JUәUcxa^i00f֦Y@2jGPxg˼qSnS2)k+iV"NJ!Aii~SeoSVL^jӌ$??x!av0;O4KVFRף:rCVPiy6>{[+IS }8wSpөɪU:'О&W)smSҹp=wSh6>? NHc7Lwɴ>XY~"GOY5e=ۼFƇ1uKqR?-R)v&69 I)<ѿ>vRxoc[d(fi_+ϴ=g9m~ Y6oJZN~icceA5]FXSbԼZHUJ0wuQ(U,X6I|`kU-B3}u?Z<Q(TzʬS+nquIֳ\GL>ОCX4JivlXޕaT9nH2ɭIWn3'0)[Q˙5P(^l@vM)w-A_ڜj^ngĐbӆqSnS2~?NkUiqokiaNz] Y4)J+:/Uz./sj:7Fj+V7fϑyJ:֖ӡi2UjZDXSb,) s3z:ѨVި_IWwTQ>]VJc?->;^j#.0ԝzVe>]@\`VFМN:|$8XB̗Uxt-ͩP΍V Iw\FPyOtLVtiZGs1۞ 1TM0ؕ\oU(*GcinF7rӶԵ)~K !>1 gzѡiU] 9werm^Mxms:Ey*r+ z9Qߓ!~(<Ld2˺P( ur_*W-/yER̥-KJ ڨVT*5{^'6!\[r9oWq Q/<=:^!@ (T RK"J:xsnd $@ s3(@ @PhߜM@bF @ J)wIq@ @ 1%@ Ex @ A#:^@ @PĘxqT"HZ"aK%ю,^Fݻ7[|tЁ;r{ŏx 0Uxh|v>إ0aK%͎Sڷo/߻wCbmm͎;$~~~|:a,--quuZjՋ wh//G4v%AA#0KKKv%ocرd2i֬Y'(~~~ܹSk.yIa{?A IDAT#P(<~ݻw2uT4iRԢDtWgi- lIPLR_&!u2aĉ\rooo>#jԨ\uVlBbb"nݚ#F}rr2Wĉ$$$ŸqZ*,Y . ɨ[.#GAo\c„ Ԯ]h϶m۰g4k֌sq |}}Ϲy&k׮%11֭[3zh9|pׯ͛7`رRM!/ݤj*?Nrr23/// аaCǽ{(_<8pz\Á033|9ϟ?иqc;EQSN+͘1c;KLO/ J–A؏(ؾ};SL! 72sL6lؐ_DD+V`ٲeʽ{rw֬Y0o<<==\Ӭꫯppp`ըT*f͚Ō3={0m4|}}Yp!SL!$$e˖ѣ[.5;v ľ}rM! fddd?5k6mK.Ç&ܜvڱsNFő#GPe˖5YvVZg"""W3^'O.J9W@ JtB*U֭?3qqq377GVs-\]]e'**Ǐ?K: Ǐs%6l؀=#F`Сꚯttܙ+жm[ϒ%Kޞ:upMWNprr4HsћvC䥛h=/"{zզcǎ| 6;vйsgdgϊ9IK U*UQ!t$%%8GGBD >ݥmll2ooo&O̶mۘ?>*T`4h Gr|||r>>?sYlu+(('NT*ߊ4ʐn<==iԨ#::DJIzNƍ={67:jRIZZg۷QF N5i wN!9.K;;Ը!U ^RV IԝoK[٥D>ݽ+mnj*mG/Oќf %&HOOg͚5#/e>㧟~b̘1$%%ŧ~'Ofҥ;ҩy7dfϞСCqvvQF/b`wP%SR}k"R<ﱦ{y\]>@6\&}cW4/K[&g`O< fYϛ3b }/KeⰟLq)WZ5IΩ5;u(^6J")wI`3^ׯgҥ\xT222Lz>rH-[6|><ߛP33*l:t޽{Yr%~UjԨ~Oz5j.P<ƍ#88L&ʕ+:uj *5K|kT@R B򗚘ıq)bEۣ2feޅsŬRӃx)N%]NPaN+GI66Tj؀țæϧpػzH*6{#xB'HOno㛡R+51k_X=<4E}b'}oё6qfV.gQQpfգt"02U*1л?IOc '=7iз7On8;Yvr5'6lՅ~sfPAؑ@P)P͍ѣGd9h؜?ۘs$''K K,TZ5GkʕsDc7,n1$ƌ÷~BԩSt???}@n:$)yq"q${GƍT!?%nޕֺ?, FiiD \긖+Kr\<͑?NHv:=(WUZ4֖ }J0,mmF3 1rOk q1s6mˆbDi/<l纱㈹wgojSg8&\ R* ަ5IH<6Dqr}P)<3 (#*T;]t1ԥK¸r iii[!CH~.]J͚5uݹs ]-" O㏹r &MRJ(kժŤIhѢl۶ rJOTT LJ2eJ7> BDDrl4B'QVs|/,79;0c7.P'kSnfVVxe}r=2Biu^epq!I#,mmPsYTJ%vK49{T(/}m ANHg ɡ /"ZLk/uyrg<4 J^v<yoعf1ŽJ6nݚb 1|Rv*֎כo͛9t_~%7nYW >cmmͨQɓ'DDDuV,Y|ܺuK2C~zRSSYbÆ yH~XJSp*J֮]+raaaZ$$$`ggGs}r2D~wa…8;;Ʒ~ˮ]&Tb |||rʴoߞӇ@d2UTaȑ_:q 6Lk׮Rfru7nL^Xd3A4%'N_Kʳg8h욙7wq$ @rB&gwԸ4w|q׈"-[%wB#tvPZUz~5A&v VzJ ^}/kQ~fZ]241|s.[LQ#P)WҊx]PxX8=}2Gb/j^eGvm0Њ8G}M4֭[;Q?iˊ:us]SqSNgϞtؑw}+Wi'ߪU֩>Ю];?^hڗe𝘘ǏdmVǿ-?&$$ĨY&3gիٓyiӦ ( v @ _Xx1ÇFSNzfe˖U`nnN:2aT3`Kj5;?ŋsN͛ݻc~?3oOLL.[jU<8p֭[Ngp- OR*\jغ8Gp F̽{?dRcW(32GyPax*5iZ&q$7rZ_ !S^]xz? OvMҬBRrիR* pzQƄ=\.ǣBy<++/Yڈ}/{Ғ=z>*sr|Z5mi_obdr9tэuޝ_ǭ 澌у#FYr%9* k*E>Μ9ԩSҥ C ˋh˹shٲeP\{,--ϊ}gfN˰a߿?{ իG`` 6mb۶m |8#F3gOvXjtccc7oW^)%7^ ѯ_?V^͝;weԭ[ׯyXd .\ 9ra\zǷ~˖-[prrgll,'111ӢE {=C6|p5kƹsq|ܼykגH֭=z޶Zᆪ]v|/CEΚJaĉ\rooo>#)njPμאn o~)ЗT*Ȑ>l[[[|iWWW_رci߾=lڴ# ݺucذa|ٳI==zwhh3l0ϟύ73giڴ)xxxChhh@f7n˗/GT2~x:t vխ[;vйsg 3ZfCj jqF$T*5kD.S~'iXYn#Fe˖ݻOOO.ё#ߧH߼L&ը tl[6 omoÆư!zggicä^+V,Ätlh3fm?N^ ~A~sg)v2G_ّOՖoP:nŽr_|APPׯ_̙3,[ \|+W֭e29{l222ppp`͚5L6KJcǎ`طo3gdÆ |xxx믿—_~# 7Dګ9… quuO>իWRo5k3f`+W~T?Ì3!""ɓ'NϞ=0{aڴipBLBHH˖-#!!ѣGSn]5j}DFF6ڝ۷3eظqN35c'?hիW^(JlmmfG =߲e 4ˋӬY3֭['ſo>6mTdڵѢE ]6v2YnZg[v @XX7Y6ԩS͍3fyf鞲dzm6\]]充!ƍ133rTV www֮]+=1cЮ];/ lEaii57Ã_~,c9s&-[I& sss{=>|HXXSN899аaCѣG\|#Gbee!^7>7vI޽ڵ+˗/?$žC;J~1.]bԨQȈ#8u<|+W0|pprr{v͛7L2d2|}}ڵ+.\ ӹsg*Vm۶ѣG1{{{ʖ-K:uy4fʫ͜I.]R tMc- X:ttHD~b ȭs=uNspp`Μ9:3PƲ{\u9GHH'N5ƍs57CrgO7R_~~~9;v,yʜy-3~xӧK͛3c'dѪU.;wfÆ SV<㊌D&1a̤Rg&Q 4<}m eʔ1:~KKJŲe˨_y fٲe=T~m&,T:;f*<+n^ii{$=d2?`(U"1 qqv8?ꆝm/}w,2mڧ-KA;^)WH9{jaT`2 ,̋wWhν.0f׸:9ӨF-%NO|R"o~!e<]Z_eLm& B59rlo9 WIeϦ.eWШyq]dddd`aa+KJ-ڦsu_glw!c_8.\MO8{7򡒯Jo2*׺~#ZoT6 e|IJ~HHoNL4 LӨPլ7ȧ1y0[_O`Y?TVY}3H\֬ 3. )? [[[̙CǙ;w1oaiiIJ| ʖٰa'~ӧ`nn&k̘ʕQլXu6_9 }t˗noϞǟu.ԩ_|)e%?iiL:aee[oDVK[V:V9sԩ2Ə!2 _ɶCOzFLz{N4%-i+cױCXZZVDDEbmiŬQꭷFRr ii2}1~(d2Y'(znـ5?O|T5?+++T,л2 ,[ȶ1嫼-o5?sׯ'~EGU(^6Rs03?08pkw!XO'ܒ-qwCfF˘vS|8K.ێGA hוoO`U֯_bT}[# ,Orr2r劸8{A_Ç}1϶ddd0yLnݍYgz (K$U(bIl5*b ; !%D:b#XBA\]@yf޹enYBH{Z&t`Oo^ {At~`b8?g7aH5hVs@Ov))̞팯o"fģ%HNJeAAބ=f}Oh]zGig%nއ#-Gڽ ㇙=|,'lgu=~(+(_6l̅-lu+j6FX?e¿&3r$zʩS>:GǾH$j~=K/(%'p;;[V܈~Νɓ8q ر@/55'^^d89M";;[a켆`\]]BlCɧ&=#ߐ]0(l846i is j׉Jl,ӯsCTC4e-F5k+LٳHMMsvԪ@:9Cq,7+~Aǎm8xЏrzb?:;#55 7-]9iP{ֶ`܋|<,,",,ssSRSϢE*Yt6Z٪OiFKSةyFؼtz3i<]Z`ΰ1uGzө׉,76pN_S~״mk533C_{wQ={C{?{s_KVV c_07pz+5 L2QG({UšYML 5jo|RYv9oF/W*!zj+ܭkD%cߵ.oiicQo]ʬ!uAvlOPA7n3cx_fO222`ڴOxxj|w_I-}7U w;ܲqӰt~Lf&Eη?%%///K69׸ptN wAyB,AT鸡I]=Ur2Q qüyc[qѤlQ00EnÑvZҦM lm;SZ?;L4T8x[dܾ}T)uwxxBCqv^˵kHLLR'`nnJtt,iiX[4lOq[dN\ fJ ja]B%w 2DBRͭӘG̤ٛT]]& ^cjjNW2=)DJl9urJXԩhQYrSK+3+S8=q?[ LSy*j,Nz3 *Hps[9}:oo_+F~ni۶Xs -.$?\ΠAh׮%FꨩQ^+3l55hJ X׷ ,:W]lJ6:ܧr ש*5BӋ|T\9ژl;\iiSb6T!3S9gdz55)iizUpz59m/E*vk -5eAbxL#S3ZZ4TRk&hhhTd2AEI#)̧k9v4¸C*z\.g©|KlFa]7223 Ϡ (L;+4羧T-,R&}[-tSuҔq9}ͫﴩRIJ""5mj #8|xffu8z4@go#iҽ<Ǒ#TVѸuMҒqDɬ_Bc=z0޽pF>}9\ν{˲̐AzFANk kDS*[sr9E=B7{deeq'"Lq(iHź%r=@=v5w%95H x-TynHU+Wn(_|=jRYA[&CO яti6SǑijmmQP@hmѰ1lѲQ΃JZUWPB^U^[tMהD{-f?˞1EB.GOvWQy:JCHR]{,nVm]JJ Qղ>܉ȩ}{ҏOoHTB<~vhzLіiןuw܍ |Lư. 36,74Br*3]Wr }:tSɦ -ˤ Mthm^KX[2]zӍs0W29Y}[RB+^qA(+3'<~AQL^̑ !9͟Jrj!6a;݈J?p=U"VbbYh5QQd >|RYs=Ǖos:Yk`y߼/L9-<] 4޾^u Z5Y۬~Zc,rԶ( 1,YXذaJMIg>VM'q';|,e$)Qa#DB6U+UNNz[*ގ%Kp%""9s1/_3+'? Ӈam_x-zS(Tk8fiVM"=#QoVw!Z~ u MükEr:7j3cxRRR>45 ЗmmM-H;؍;RRR .r>$*U\8]'4r8g"uo* Ԛ}<gy7N&[M2>\Qe:T4B40ƍ*&R|l} XZ6ty:ΦC;СﵬωtS6X*Ru*ROrOuHWi!Tc'11]QG"eQ"eR}㜉8t+MJlLY@12;'h,YSbi"f9""ߘΥRmX<9ny\D}u;rIBc"H$425c4W$+8q?8=j/_]=w8Sˀvh}7­ުޖ.;v!BC Hl?)vYg絜:LJJ*&&F,Z4fdSTZJVwoJ2+Y%%Q߸3H LS~DE`hXzꔶ+"Ҕ1G_jع3[݊hmid{AaYTȷ`GNm0a$ lذFs^j*|?2>}bdҥV*hkkdS )}D>MsZ~<&j".ߵ='|Y:v*f\i\ЖJt/8wJC|ٖѹzvkf ShmrX7ۧp#2M[}K*7׀{| ]p>Y,ٱ='|m4`Ӗڋ$<{a O ?g7aH5hVs@&a.lޏ" Iʤk,Yx!ObwOq5j ~~'02Hg7cˈcL\r,]: 677%-- $ bןSB3f: L%33~.jq?˥;7SSb GN`#*;O 2퇑Je8ΙimCMM!y̍`%)iiٴc!ġkb')Sl j`m݄s'a`P[Q6>>[6mDR;[buhh'+F*pqYhjjR^֬ڵk45`T@r96yᱟ3bV *S쐚,qZ0a(B{p_tiKm0YCgOp=oee3g >|ȑ+?Ǯ}zS|>kWT̜?44ߎSǠ WHL/ܢ5[<*%]:6aT=Al9fEHݞgRJ5b9eAAԩcͻOlCtu+ѻwwf'++ŋgn444Tj _Jl?#+|QQt{N"HZYCbӡ=Uy0Ěml?߶Mjz:ptW j2r,|ۦ/}E+4ɩ-=zt%--ϓ^pݲ]]2uX,-ugt޴haťKxy}^=xЏ~F>ϑ |CN4)/*OϚ;Yy2xѿj3-`*1* 8ʗ sa7]߸ ^gϟxR4~q0xy"i4l%;UT9n"F@iZfXY}7/4_ IDATgrl 9r={v)ڎc_$L*LK+Wnc?sNL8 VrX`8"+;rZJɴ|yCKBn^%">șEp=.[ .kM'c5=~' BAGGcv< OOo6oNt/4bzAxo r9BЦmۦ͹_Rԩ-Cu+|++WndԨAu)k+Jٽ ݻݘ={"nnEn ,%6iLj07ءqr [#5=MqBjFGu([w; -c034N:4@Eo]?PWWsvd {o:p1tu+Ѯ]b}/Ѷ {ޙҡCk/ҽr̖-^\[Wcc rKDht$?#+;-M.c*qt"埖6_o;W6󷮱7Ƣ1: %- GY6nm GN?x,_>  Tq^0w &&o/j}Ǟ=6́1cru!++)g!55ΝQu -7kӨ60ͽ{xy`k۹He|.GㅕYCT7CR򛎙IFNvTNjzm/:ɘɜfJx+##MGc[!oa1'::NIASRHNMj%N*+$)QPBvUx'3fWtY۠A=4Ǒ#En ,%xFݺƞVfTy=M*xOcIIKyyd_ͅh&ݻ?/+z<]ƙ4e2 ĶU{d2M?~JUٳ0}uۃdjjt[G(;xЏgmXX(_wY¸fmter2'.3u%zoçmіɊtC32F$ 4",&J_!45k8NCzJv8;ڵ[$&&)4%DOBXh5]bMHRӋ';[E]Otœ#ضmJMAԢ[Hv-iӦV;HRRR8<錌\ˊ 3΅#&`nT6mqq030{߼ꕫzNxHZF:߼G&դ[nUBuܘKտ((K[XL/SP NZJxx$iiS e5b-R2k;w Wa\SP~P Q gޒ\ΐSr@*UQSSnddf(:} 555N\ MckBn^aǜ7k,-`n^ҡC+ -)57gVVvso9{ަq\z}caZ~hJ X׷ ,:W]lCI|ݔ ׺kθv5=Asij(|\.gРqkגÇwPFuԨWJBT-7={011T)TV%CNݺ&l\.G")D2_!x{O \+V^耀J-S@& %-BO CN@E60滁l3ܨcXoQ/4qަJa65ZYy`U{!?U< j֦OQJ?T(tjPy;L%*DEɖg3}rΟe՘R0)sy'mg~hkIfVLIV8t&ATM&J6vwݻѪUs kSTV%11I\Dqu{F `޼ey>/I?23Hȩ4n[8]eCK4Jwt A4QMKou\ LkW Cŝ0ħ'0z`k{dffefڴw&qy&DDD+ v횊ƥ!4mj #8|xffu8z4H>׭k'j[Re|hdV!C~.-9mtrQM"QtfXz/\.'4:"MaJJ$|D|L2^t|Mt_P *9nH$r㊒M4/VH.TiZ!!UG^8s䏓>SSq;=S윶LHۿnd8{*SQAWr&z-k3W.~ <6vvyv()ڶϞ%֭ {PxwP {q<_%ƌ 9͵;ܼLוܸB݀ f&J:ZP.缆zNOkAZI5ң/.8yqۼȇ ѷ@e2yn]#a,37erjTFII/7o;ߺUT&M&̝;sO<+rDqrr䯿b+ӛdw! oj7oѣ'\$22uIPZ5k7mnR-M^[s[c'(l۶9rgϓȖgÒ%k? s ɷZ*z7oG!gɝ<|XaSXw?N]/B#pQ6iYH.C\$&&Xt{$**7nc>U*RS "=#QIo #޻],'Lo6S< M{hknm^F/*a\v7O^-5j%]bX31*нלWë0-V aȐܸqΝ#%% o&M/ڵ[1c1Ubgg$RH*U$߹{qmllxxCPkq#133e)Q(~c1n8sNtq ͭSAnؐZ{c?Xb,-| u~~uuZ6O)*8C؈WYvQIJz!\pEm1PV.. eWG> ">+$~x/OuvM֩%)ROSnO4ᅲc""%An:y[FE>FX*Ru*R(lKЃp49$"R |o:5*!RS@~:͍~siBԩǎΫ)\]T, TQH}bdҥV*hkk)lW8~ֶs@*k(Zt΅kwX4z"kpL ?̛ߪ-*FD}JC|ٖγ.t/ŲIЫJXw,9? ]GjOl].8|>嵴;Ι i55 mˤÐH$wƭ|ddeÍ [?4,6ntQ黐l䁇~chψ|}/; {TuΝAmMZZ:g;sH2&}*"Pjd44[r223qt$zA}cS0R 91mȿ)]>Q$%-9Vs,48tA4e яhMIKK?DB~>~hhӿSANGaZ_h5شi9[xxZz@Z}s#fzrZj:GyWh44ڙ7O]edqO8{{Y@VVYٔV:_N廷Frj ̦GNq':ʳwsWVeߢ~9O+Ҥ1G?:::; gYxzzy7> cq*n~U92&#"[^zh Mf4h11q%~]"EXcё  ܔ4<|@s.}˲iF~9KRTPzRSܹjPNË. si&ge:Rl^Ӹڵи&Ff{/h1|đ1]u(Z~ً}P.GㅕYCT7CRre6yi|e+E5dФ.9SķAMƘُЄmGxbMZ/?Ӧ}ãpw)ǯbxAz+VEگ|P#qӰt~Lf&LKKg,X0];0w$ΟĖ-^Ҋ|e\6V29ZX׷()މq/*gJ $EâN=wݔ<~իga' G?Zi:;ڵ[$&&)z077%::tdXZ6TN-[6jJQx! 2DBQ~!q̣ddfאַNCe䞒[Gz 166o7^" CX[7jdg˱9{XXs~۶k׮XYY;e`Pn:ң#ڵMvZ*UtB đ՛:hhcaa^l^c@|<~ȿ)SֺxpZ(ITܳ O153$6i4n'ME>Y1aS׹vd$̍զ 7z0^n-FU/iӸ[Z%]M\uyʺXyI$U$ŹHzlڽ;;gquܘKտ/4jU$/·w1c MNxr{0::t*͛HkZS*La$6MpUx‚YL 4kN s:;wqnҚ.3 `b뿳g9S Gժ>$"g(姩)-XDuTi9-mR9}J{jX9Tяz酢)M>}66ذa"SZ<u0oqpP} @&) _7eFÆx{Ҿ}o]. |Q{MfFqFF.Dj%v8{ u%;T욿^~lڋMecWC%H$NׂU44:vz]FH?mr,JJ9䲡 cq*~͏u~n= I45|?A!kE>%:A8-3*+ҹ"Uh)o^]zoav>DV14T}mݺ&hi8q;mуׯ64GSS8'˹w~~YtBht$u&֨Tʥ1r.z5ЫTCw粲8~P/3HOO|4oބhsԮ]3O}L=JBk6`„>3:= wJde14T*ڵ7dffoy)uݸ׍+SMO:x( iG-hhMf曇5}=45ܿfT\.s?TY 2zU~?_KE)&3 l1GCNGOvWիخ\^5tt j =U"S<' IDATW!ѣQdfQS6ו\|z꼟)E~a9!zW麒WӡfI?ϟRm,4Ϟ'-fݿF(uZ#AyzÇص@^ŨQXv3۶( elݺѮX [^0o2=--}YU1 a&bcx" L8s$8kwxA󧒜} ,j2G_\<6q9㢙y-cңoidwN7ݺFXfn\dpYJ OI0}o=zknr_]LpQxb"_e W#97}U{w\9<{AƪTu^8Vq=zBHE"#c[7),am_xJ!L[[ {{;,Yùsfż|J1 ]zM|cV/Alt'dǦ sTZ/*| /^ldZu=$\a[^is9߷9 50b`^*KC#Xg;Q3Bn^%aus--P*SQAWr;Ò%k? ) ijs"95;1w"JH@H>Ei㫗߲^z{P&dP{xH]FDD CګsR\|DWnn֭C#%nnqqYdž ۩]&go>qq \rS _ks_ܹ_RFu /tCƍt))y{A̘1MM)m[TƢ^kudzNF]]>]04,Y3e7 :4;n ScdGnWǟЩPԭe~}lEܓ(CWLvtR)6rZ!zI*ܣ/:[d55X7i6atx/ގ:Æ3fe:!11=|ΦC;rHв.c8柠 1l,1M>:??DMiʃN6) ;KN_ WYhFi#" eWG> ">+$~x/OuvM֩{7(,IIIe&>Mo;3S".NE47F~uLD$-pQ"#oTԨLjKENEx zNؼ7DD€-"1[FE>6X*Ru*ROVOu.BԩΧƥ{nbiTu*O Q"eBEL[BӁĮ#ܲ8ΙNm&2k{;7dʔ,ϓg2muiQbg͛Vn|B88fɒ5^DDU>d[c@=1|'Em6­ު.9ΟeVvpeǎ:Oh$ <'6(mJ=w8SˀvhQ.Szl?IIKä> GL3swdt5KK۝O]9|I[>1Jo֍QIB)ܼa-߹Eҳ'LXߊksr*[Vx(OY9awcwTk$I&_V٦42d<̙3pO{r]N@[^}DQ"}%pwqㆥg-ߵ='|Y:v*f\i\Жѻ c}GY%5%tΓF;-)44wm<;_3.2i8:چg<45l#aINNœ~z1rvXѩv3tlޒ!A/NԪV]Oaddd JlȐ wRV_rj*V,` :~D?.uĨF-NoصS~ ۱S^K[[㜉?PS׶L0 Doy\`܊wOFV;ܸeo423ظEkl䁇~chψ|}/; {TuΝAmMZZ:g;sH2&}٪tܴi#7@p%_>'zZyKΟҝ{2-vqA]]f T*'#3Ow>Aҫ76e#e@nMkoj AcnT+IIKcΦ 9&]{8-MBB0ssSB"Я_/&OEnS3f: N[@hߕզ-]Zfm=sEys?6MzFe1bLjVƼa1V.~h/) 5p8_^?sF:?{g(FŮT vIT[bφ],"1`W,"ťݕX>xޙs߼N rY22jחA#R;;܈}pu 1uX1||2A,֤[{Pn6o߅Ug{ɣKti^=tjr1h!.~VO-8AO{`0ȑSMAsT6A-"q9QvT(iV鰊;Wa bʅ<ݰmӑt.IJzM`ի7ᱟ q~LâEIMM_p'^^hii2rTaqTl%6 AAgO.H$WQ4J =4Hz?B-4fEX M~B[9u%c'`,0t %< ;7Vo)wr f-gz_&͛[rR ^^رcN iݺ]z*Qq@LkwdR;SS|m;qjN:0w0ʳky܏y#sbv:mp6(@8eki/VT  #,tDG#yOp_Lwva<}Kg {DBXm4߶IS[pyBo8q1|+W\ҁN2lX}SSc"vc޼)y(d_|7sa˖wɌ=^ˡC;8"ZTMQ~A~2rJ_nq:]1a&[2ԶQDcZː4 bݻlݺXGtZBB.$&Tݳ۷~Ό;UVa- Ї3/#Yҕի71f`DZ)~!>"(=u44͑&AilMo^JsCc[6'zuavo2|׮3k1>x= شR(im%669NA-#gϜ<-Cr ޽(,,LIMMc?KOaI fd8ד~~ZF:ۏpD8w3mG|dphЈ]rb R:qfҦGO2\ڶm! knnJ H=|q ._naUB7uR 4Ζ0e0~w<DjzFi2&5SMMO6\L&Mhբ1#8q][4÷v04nlsA#)6a 4у1'=-c<;g MZ`F+.%T*WT"ϒ^#yZέۿiC@X6QN֫g̙?|8P}02272'22͛=92,Uyv>1%itbC͚];gFL"(< ? 7ä>6͵j*oŠ}slcQ 8ʕ h&;/EppB_ߜLۮ[۷A$RcXXm7.\%Tw1{DVVeehqP_jx=yynk>--e`L e+}U2ċIXdj<}U+g? uuz"#ʠAxfdW"""qt\OXM^HfcaaJLL,iiX[HKK [gtZΞ޽ ҆qZ̛dN\ aj ĺnΙРcc+ 2HDz_sQLXsCG O̤yY]]&z\rU$!oK`SQy~,۱7سdu܈8y~o^YϿE)N=&##K?ѪUS kJԩc'NYd3vkAxx$9hjjr}=DBx’,lf\L@)uWM3( sܬ6?kgryT2^MKwnJI$.3bTXCkuOz\|(m6'0p/͛[ҶmsVJK,-&-=JT 46ľ9삙1GBs}#58qRs{WЫR2euy4gq K՚kh!XoXS{yg@J$bG|PT(H$Ҽ>!.cUkaRue&VSH,UCz+7V e 4iҀIFs9(虊dKq%ΰgZ(bAω{vѯZ]z$4khX XLXXN33u- !CC/yɏ_Qjx)?]2+s?w7'pBimdi_%-f7]Kh5CNh|n߅'OؽRjh3f`֯az>emb󧣥E8r0>eΦ5INUPQ~>e`aa*l2baaZHoBDjtlڒM^!c:1?h+M8FDvn'E"71ub]?6Ŏav0reM|otEҾfP IDAT'RRR(ۑ=QWW;ix ʖڵٵk^z ڟ~z"#,&*vvހ-h !: &=#1w0 >LClp~8& !%-;0u>[ֱ׋rz_)TϗfgϞHJJ #Fжm(>ԩWX~+g/rerз<_QD*Trʫttj,-Zye39c4 ssS.BƏw`„ 2JN%tuA:bf:}K$NKF C5^GN جODJ-;f86-2):-Et`ǐ!6gOa:MypPA=xFa'}p*K ;QC~a×ӻK$o/ϓ^ҳuO5H~~UQz)Mޫѓ?uvTM+w#**Kˆl/[!B(L4hT( \S#TQ#*[K@S_F5TPB *TPBpjآE-C*T(À BD~4sCeKU| tK0G𮆥u.粀QEɠҩFU| tK@S_%wP 1yfnpV(Ψes_QAFܹ]'aE]*Tom迍n(iDz|O_ y?z@s[e+SG>8S*T{pdggSc۶4Lqqh˦_Xn3+V+WN.UN|s<9}<)iigXY4]J2qk\9Ci%֍[Dعs/#"" 1mo4iSg"Ufdϒ^zlzZ ܁@ggtnZt>%CN؀\ (Me@B|¨F- W"r-jj,鵺UXhkj1ԶFkO&Z^ nh ۬ŤKGGK[fg"ntVA05[|@_:ujˤIeĉԬ) )7O]z26ߡv3}H:Z 8FBQq)Me@Bddd ?ʻJoA^M(?-#p$$MnHȄH$l>~'>ǰz F|ߗ;(2cכ{k`UkA=N7.l݇{~m&YlڤTGD>F 矿ӱS޽X[7f=ҙ7ϑÇ$IaT!m:\7אsgtx2 ǓF{223q'HzƦe8 y©0עդ1}-ľ-Oboa)ii;v HD߾3moD"AߡM[Ň-mvwF]=ļyjzΝaٯSio)ʎvXkK*l5*UaD G&es_sO.Rl\Xj6͛w={tcƌqӉ1즯6&MQ\-4oM歋 ~pZ0懜Vg Eȵl=Փf NGEi9Uiݮތ[@VV.3ʵSԩn)X}Pؾfdd0g2|}PWJOyGYm֭[BZ5}V ї@Hy^8u<ێh+h滭¢{Xʼy=$š\@?[O3q4DEСȒ%94vi$%^=3f͚@dԘdNKK?h*<M}G}DD)i;2݁KiAɄY~130lH٢?1=GVpZbMF/K$6ILyWRk_?ŷ_zY`'Ogʔ1,Z ݻdFJ^С Hg_*B!aSNWLI' Co0Q\ҥlݺ(ҵ\}%>>[IL|YV gY3KҸy6_AOg^9w -[ga?U#Geݽ?ߕK_یţTߐW/q9EY\ʍ1?vM|4Ό+6\, cP1Qx8RT6'l0=(sChk] 9A*`cJ!55 7]ƦeN j/={wo+hРEaaaJjjYtѪUO 19y8Yhkj<~F=VgoGnOHgQHm?|n툏̈D%o* %- GX1a&mYx$N_=/yɥmҰtК!{W eɒYPNG͚*#gXnFy=YYY 'ꔡiݯ녥y}U`EܡJEaWIѹY+}6_l6И ~l FV<96Đ1cqvF9[S 111}{:RRHNMrYMV*_gI/J=[Ӳ)o߾CWGKKů#:O,_&Rb% ǎȬAWN6lXOF$$<wk^ jҽ{GlmbcӒ6mӳgTT3E!~"C~PG=zLFFyPA|nlqlٔ/oCp*Æs%Ν^Eb 4i@TT 4oאD4mڄ{Ȥ7Ɨ?2:0.Vxb q,e#k v% CϠ]frvzʨaSw223caTСC+܉Pxm  [8$ OƦ%~~;^*jjj"==C&k)Kc]bYKd½| !,R)̹KK3EsOl2aUU*V,ΰ!ۏ$ HDTHIKTӫİ31&lH$uB߻ i;+e֓Oa%ڻl2dff\gdcM=Ğ=nʏB::yK^R|MYܺ'8-sa$.3ʤ,:!zDڵ[>Q邥>  ͅ>BIBd*ğGVܹ{;6G˖֜;wJ*bm 9KKl"bRUOXahńGl%::FhkjqYHxgOkP "!Yj˾}~x{U*$Smm-N(zY|S;v5 <[ֱ׋ret߻S l2eѣ3'O7tRɓGS;we5+Wz=7)C[t))?HJz%{v lY]]WСׯ7?)4?F͘ %A~ts}4sDeKU| tK@ވ *TPB *TRS [heH e0`@UȯSFU|nl/NU| հΥU--]tsGQ_*PTŗF/0j滭-6K+)&N>ʻTPBY>]l~,˗dUN%LAabבGȑS;ױrWr|yT(}@|s<9}<)iigXY4Y v$:1Ԯihض( [8Tӫ3ABEIy/u>+Bo\e>nFF,'ͦw΀>sGD|mjδ#hlVc~N :ccϟ*?p)4!:},޶l8ݡDt,ΰzUNNufTy}yT(JzgèzMMJ=bƣ]SbmO&Z^ nh [s(Ng`n`̵{w-"VCFFbSgmbӥϒ^0d zn/gE[#h݂g8eU! ?P)E[[a12?gSREZnsJ}:ԥ'cFNDǦ-o0"Dz1pF*U?'TT_˭췏u,F?yaXC~~~瘧O /his341P8{n$}M]cSf2'-#p$$MnH(H$=O|S 5j ?4̱cpuɽ{5n̂S10ts@4D|(,sݴ^CΝR]7Zk6ըš3'vvXkK*8 &5 x7HHoo>htDp^CXaP-[vᱟ'Uw̞=Q\###' z̘5kLko?SSc9y/,,g))̛ѣAR?z6NNssQ@9)ii;v HD߾3moD"/ Z2}<)[lU ? IDATsAvzsesQ r4p MHHعPSsL0\wH$l>~'>X1ۏvmC޼yٳHOO_?;f?#FY&Ű/7Ҽ5]?*D>ilV&zr ?w!(/Ei9Uwqa>4ܛq+eB6fʔ:֭^:@VV˖/ ۦ YoJ8;o(45513ͺuKUFϊ4!:$2a"K#kߕJ_:,m:'L:bT&]YUh5|.ْ<\՛3f0AApuuVB\9ҥ9~+F ~fqq˱Iގq?ωu/۷c<?clٲ[ct9gi޼@QVYH$PSmt$=3]'HzC˷{٘+ԩ-Æ': W055 "oo7͛B]]]w8OO]2GOWnrHV3Ekҝ>h$ M͉ 洋'o,.V4okەׯrA>99>L!(#^O?zo}p32bw?ɍ>,9Q:08 c W NjzX2w5i q83oBHMOmnn+q j/={ݻl/ʕ4hЎ{0%55 ,]?i:NNhժRRQDcr`7#)+mdO_1a& {rQ4&2ٳ'ү_Y{XYT´\iil͢E3֭ LܹKl%֡E +ɃX,&%%//_V\@6Xx2Wri۶4):&$"=zRF #:>lޥJ eV*_gI/+DiZKsCc[6'z!5= C{4sYY[.VVĐ1cqvF9[cވHYYhkkbł/SNn^IM}l, z<-׮3e;yccTԫg̙?|8P!ddd odOdd47{ {bKRSņ5PvE> ݿ9+7^xܺX|_ѱc CFӥK̋foT( l jL hPی1BzFLH$i(8iXۼCKI#%FƐʠAx;r znEtT/.. SbbbIKK:[4iذRRQרͼIN渮ƠZM|z?Ye=U+V2Z-ѴkҌ6Ѻ=U*I36Sߤyn2D<Ýۼ|JϞbnhBdCRSӤ DF>墈%==]S$Ѵi{ FGҲ: ȖKy(\*L7ci^sCANNU^&δ4~qV R-۷-l޼}?ahX k p8{3=K rMӗTX'7+kc6]NQFU 7u|׍prZ/X5޽#iI6ٳ UT*ke8s[yhi}|BbEy;L@JJ*::<@Ϟ]ʙy!, Pza MoHܳfb qkڏ30ptJA3g9'@zDE]BCC 45^4hŘ`]3Mq͛ޱt ѫm',jsw}/pEkoR@:ȵ;0Y2q3% CϠrrv!b_ NAFf4Lqee_FUDB"(wh_x!Df eyR~⫗T./;PB4\ruk;Jo0QJ-3S\ddic^MMM,,Ln̬Yh  _GQ.ܲCgNx 57i9F >yO]dG@17mwH ݨ_oߛ}&Z(/IMK>ӧ3W/p_әCoj"|Ⱥ&y555O COi|cinxYmȃ#jU&Hk)sM=D;cf`\l2q"b:FhkkqğEJ\\az>emBhkj1wׯj>Wt3f0oavo<Νv϶mTR忒r2=Z ؇U\C)/%l =MXmBo\ejB_PѱiK6zx!'$ޢ4=;y?޸JyoVxDt|vh{Lɭ\"uqy g1­efĈ89m`ϞDGr-v'}.Ošɰaqt\OP"#` 1lXbhӿ˗KDE0g2޼y+R9quv#9FK ""& ]n܍~^?J|FAGKvذ; *.V!QK%::lڴ#Κ#GNvЋ @>#HNMv}nG4j?{f.s ^Ԭ\)b{[E1~8ܸWoPؔmsѯZ8dZڏ@eioٜ-m /ɓGS;we5+Wz=444ظq9 u2qH_33w#66S.:o:)/%XCf?fFln5:`:_?{UA"*5 bn7cŒĒbٰcMl "6+%hbhc ^RDy񜻳Sϼ;ӨV2z1qiYGKTgPϾ{oߩ_3*8t!TSUc4,cUPeut{b@reYܗIRr%Cu鸹ٳԫgK10oIƒİaN}OKZ>WN^:ɹokќ'tbR 3*F 8A蕯Ɛ fl9 _н#8:aЬhI^uuu,XާLLMk.]Isl%]߇>μIȃ12Kc d Z.S-q/lSg<؞~KRR|;`GB3 2e9w6nƳg/V ;`oߛw^~|Ju@N _v\{Nc$ ǡdTV+Ի(ha~ebbn|\yxQEio|*Tq<@v?*IJ &$폑ѣ3fBXiթ45mB4##v4uZZ5ZThԨ|7cq/Y>6_*Si^~Ӥ&IT-x.l:\͛XX4o{?=zBҶTɮSQAiS /_pqŬ?hsħSIn:͎KaAq]BȻ:F/|  >@ t 5$:[ (MdשШ!|c@T1N#yWOu.Xi!t*( >Ng&4J ;i޿Eم)S<{9cNf„@iP((nG1o޲^ |?}ύ9Oleͪ^xi_hvGQSVңO.nѪQ*薕_+k2uO|lٿ!%##5 a@O8Yп8!/jfhZ\P6lʎ\zLFÆ?G7nM)3ƅWy%&ѻmb!\gt/ڜRT q0e6ra<&5 LfcUːi\!@~)tYʯ&{~>\:jWi &5 ycΒCáwfbnF/dП0Z]^Fff&klo;qqRRzƤIcӋ2hqu"11ܼ.[xԩٳ_;wS14/ @]] K˯>CÚ !%%d2bd>CPZƍQvDFw(iR歰m*{LPȚmfdBJZ*:vǵPCff&>;o'aT`zstEFxcNnn?_Iӯ̚5\[hĊ}Mw0sݵ%&d)PS}ۼi;xǸL#""_""4ܹKټ955&'%((55BСc,Xknim-M͚Օˏ^$| Lߋ]NhkHN״~C?{q\ù`B!={j8Mv+wǰpD:X`pϾ :͠J;]Ko;ӧd%ݻ=; "#$&&v;,X̙3}6ӤI#Ý;ws-SJ᱌HK\ܿD~!%9?igNeɿ^ Q!Sc-rCk q 64S7#ؼٛS]+o BWW{71իDFp;s`;vɩ/2{R(u &6A (6 =..%6{(ka$K!CWxj6`Ys+þȶ''oEdu k} w|roߚڵoATUU!%%k73s;`tW$/O)v%'緝9sOglٽOo硤gdɂn/euhŗ ¬>U*A]~EiGHNMcT\ q,`׮30?65V!1i؝kwb132!))ի72iXګUː&M+Rhʪ e٠NRR2A,Z4֭F g*ѻw7EiР 11717#53CvY b#Fʕpv:[2?ܽ;Sαw# URT7Wa0e>9?7m:m^hT*W#12qh] 䛌 鍍 ~=z))PFUj6yQX:^a0IޣX23ZD]fƚTjb0/YDtutdHJJfs36~NRR2Zн- 55߾8d2M6&&Fe+|};T,-~)ԠaC1?]jU%>HL$D$`X_djIX{Td2̍k٪5Qע%oX]Zi܌֍ЭU[+TǩWB&uH᫷o1o5g/3T`fdHNNwl#Uyq ?, IDATvd Is.iiiXX݌DMM ]z={'Ox^Bo.Rܿ0gΜ9sIn]]֡)4?h4;u g 蕫ww#^=3͉˗-fݻԩ_ mm-v FxdeeN=0OS[]QUy;SXӰa=իp|ӽҲaF̟\ kХK{ztƦ[7{w[SAR;쑿8uqmŲ|^Rk ᇅmѠ|mPQQ!,͉<|W6[YRPWz.oZ~р۷ _0ZM3W/ZI!&bXUf 2 /D\Й c/Y֋uk4^gff2xm7cOUFEEo:MGKAɮaMMMk)133`cӂ;7PZTTT05mIjjB\UU\wٳ-[11Q>ոP_R4wox?+[9kzV La} y)z}/zڵ;%@mmtx8-T.8 OVF~ZnX sG[\uO y#+d2rE:J`<<ŗJ全AR5^CSC lFf)dd^p}&"U+9ڥNzu#yQ ZZVOSSn:®]aWʪ FFhhhp9yLN:iB)Ů7^rMky@4RrkkjR˟Nѩu Ȏbу{\T{?yĽeAjq5Bg=kRupVښs5q_sܻϨQ00s4JFF'"$$[WKjS(/-4ZIcE(SZU]24SThmݜlkk愄ljU"=L&¬>GN+G;E/nC>Yʴlߩ'e^Z~8. QΜQ\7| 7`ܸܹ3&^n: ,E^ml9D@{bԜThߴ6cX:F&D]_N:P{߻xlƾSO.ߺv@6VƉK{O-m-#Gd5`cӒN:ׯz;hwW/v\jjpe .c}OTer\]\,_ˤIs\|L(&MKRRÆ:J>-QMM+1}BS.c:( vڌ7Qe'ҳїp߇~ݙc:j^l b:Oʖ-xݻ;cH׌% hYm|1a3@O.ꔡk˶D-Y'*"ߒ,N88ؑLwLmΝ U'J *dn$ЮZYYh(̺ghzV:Msa]sΜciFF1h=C8|hs>uZZ5ZThԨ|7cq/Y>6_*{;y+++f]@PR\t)?M,=` >=r;LQqr 7obax =zHVS%NFO͗&|39OFGDKPڐrзKaAq]BȻ:F/fj J#xIx @ @:jhee  Cs] &ThTPTP9~xBFn4;w5|+C,sKB|l!:s'3)q-+r>.L@ %CKc'3amj;B56awA%:  xԼ5kH8bHi &5 ycΒJN=0Y>jaصs~t͠6~kϞ`n12UgV$#j0|}KiiiL<T'TTldj?#!>4R^Oyݲtki# \!WhY NSΒqx&FcӾ]%/-= ݆O IOOm07CJJ*d2?"pqFDD$DDܹKټ9555tRȯ Ec\v LMkllj֬^~:  ش~C?{q@׫sW/EffAW|w,9o*=;b=Tsm^L6epq̙Kػw2eMxxL?5k6/Y ?L> @{k Mu<㥥&3ʕo~~176E86l "?˗mے'B ^Ν 499~Ğ=x+8ˈkG$p55jOӦ:g( Kg^W ֍r? a>KiESL=['u*O%'my ͛[pd^_-rCk q 64S7#ؼٛS]B~mU"#Fם9x0;LE=):  r?:85UU222q?uZ|,`׮30?61o eףg $бYKWΚcRVªhӸ)M̉N@@ݻJ*ؐGۀcى7Na!>?]8Kl=:To2Lj`c\Rb^ʒ6Y̨m-s44Z/mҤ}d5ML9r +W9l޽G-rA6ܼ)mgΜҲewI4hgJ:&<~Ou3mԨQUr>;HLNr z+0zC.T9i6ٶ/][`p*+E3ykk+Ю]+"#OЭ[Ge׫g*׫gʮ]aҽAYOINNFڵ}nC(t+>=R)"Z43,JEuժp]ߤ.21]eX]Zi܌֍ЭU[+TzmRR=Ecc卐wl/WƑ̀? @ gUp-C]M W󢎁Hr1@zԯoN|^|n^rΞ' )cn^۷HIIҲ<MM 6/ن[M^(T=`﬛ꁶfOzb7a>JE=v*U-az իWGmWvwCtҞ=iA}}=C(tk:O~v_[wܸ6bYmc:^_+\VVQ9L4d2fsCgx0WUլŢ~7lL7S¶bn^'@;쑿gƚ=vͳ~Vue~Y\Ө{E4LM v@jUPQQԴ%i 44ԕ^2et055֭;M 򦌶6:ZZ’1ܸ6֢9o]mBo"e]zv] 0/]&s.rQO,,Tz : ? +#3TPNT*\T|]z+387 2c'F} u $ı٘3g.(|454Ѻ}{r!aˬ&P\(S4>3j jFtuΚ\rMIt5 ˫WܠJʅsD&aaVQ#ϝY ֍w_.kV!YwU+?:eZԓmBز/-lQ7xuuu[X 7`ܸܹ3&TDxThߴ6v<!B4Mi^q♻~;0뻬Y!?K #3u{ڝ/Wr̃]`ѼJNk\yMa2/wcΜ߉#$VmR}}=ʗ/'a.!9 fAhiiԗŋSV#.d\]s>Ξ@xaͫW8:~[g'}K78νqqxlJ |?h`fdOWK:Yov",{%Cv)l!#;qqx$:aR}~KܿGOp5Qz/?DJBO5+62g=Z aラǹ>g/*;tqFUE_3䝍5a4fZ|m݁NVy槣MTeBw 3g_|B|E61{'eR#F|gqp#!ݻ;CUbÆ̚e˖)p\{~ݑIMKcd8Ar_, K?!}TMM+1}BS.c:nn2^-KvڵdTTT7o>Br|UXs6N(߇>.?ڥEsmXI <'qW~Ueuеe["NEזm u[oIJJo'_TLmΝ U%B ;k笤VVV< wBú ^yKx Jѣ3fBg@ 9t钂Nߗ/- ԗ::Q]|ǮSǩ`jX wggwt#X{?iS ?v,.l@8`A#N/6rN^ ~v{Div$x-]X :FթШ4"|4WcVTPoKRK @ 񒴹{3H ( u]@PȮSQAiCRAi㹆 JHc BTP|  >:/F\qvva< ([V|ޗ}i >w2Ӽ/t\Pر0a6C QtqMz‵} |Q6@z ӾRMVͨPA|=XXs֮[KVNp=ߝ۸p*d$zT^fѦ5<ȣTG]TdҿojԄ eCgqLo2@>:=7ʚU:[ecH0wȠv CF9Ӻ}ؐ]wX$%%cbb̜9ҤImZA`˶mxLj0əZ/߶E|Ҕ)y2xXj2d4#":  xX٫3*>/j? \m4k^Rr2MmwFe;V*6aKv̰b0q55[NS/޿"%5U~0 fѭU[y&{ֽ3fL*@Es]BsOE_2qqЦ*gOlioiE+Q67ⱿʯUUAQWrj ah<=0uOi.r|vTUUc"1%տ&?LL-UhŗLU;MsȄTBukd2RRw={ - M~m'>FF w]V 3gp1,Xk7Դ6˖ͦfy񆴴4&OKPPjj* c d,ɬشoW[aۼU.)s?tSWɎ#ᜋ/k#ᨩүS& p ;zyDNZJKKc%!9chժ,ZʼncI,{ԩip2ПeF˦BN^:/u p-6/S_UAw ͯfffc+vF GQԮmċ8v$9^hh^^_1}+52uvc233%rZ IDATظqXX|)9?:x X1nydQ{mMM--yi3xl6T6o~ZNzz:n3ptyRRR @&ѯ_/ƏL4""" .@zz:s.e I!+kg "@Pr3Szz:hi+hjsIyhݎ^y<,197}!95Q}ٽT`ļ)ddf(i.oĉ/fCH)?oQY,.g?BKo;ӧd%ݻ_zȈ|ug bǎ89E&qY@@ݻ )fͦbsg)-PR4ߐp^5ve:XP9|::^?gӾ] 5υc&{%64 X`%3gmIF 8;wгg'?Ad] ;]w@h$dص턦FqRsЬi@I7X *J6NMuE@@m۶ĉP׳sgKNNg?^hjjJFw2"""Z@`/qq6E KFEGvg {%Zenݸ)g{ \}Sr9ʴܳu{R_*^ Q!ys N # Et`͐!9d26ofT餐{>?+kg "@PrjīMUAXէ^e=ȹѯXQRuҮGŽV!1i؝kwb132R̨m-s44ZڐB@nHFM5b-OFacP64Itu]юx))PFUj6066d6X||qvv*>W=ĩ+{Zka$K!CWxj6`Ys+þmJIIe̜F>ݕ:oӦR|9ڷoMppeջ}^ sYbйg{WoߢCI@KC$v=z@rj z*0PF_MNMa-86`ļhҤ}d5ML9r +W9l޽)_ȝ ss:$'緝9sOҲewIܹs-[v0t#?4/1}6|>w^%%L myD~])FB#?{'~_+צ27m:m^hT*Wf8Vrmա]VDF[7őԫg*O׫gʮ]aҽA{׻vw u@ (9 kIX{Td2̍k٪5Qע%a׶y&ӽe[ޫo1o5g/3ח(t(N+WOp~Mc71__~d 1'o04A. nݜmדҲaF̟/_Wd>G}޿nښﵬ{K]`fXkX*:_M(K21]b8RSSim\&ѴicbbnNRR2Zн-\-W¬{C5ٻćd 䤈ajtiцo\GЦq3Z7jBVmѯP)4$ z7'>/_BW W^c9g^ɓ;޽xpv))XZԠaH%## Yg4h`εk7YnhtN> ŗH@~qo^iپSO&T!}WudgTT[vÆWMey)zW(JD(t˰ju6XLRJ _j%=̚ajЬ%***u#K?͆i i gѦq3v,^eTTT0 ima۩(s:LBΝȡCG ܃r=`U[NOV^sfn]4 ?\sq7;7`fVݻ$;sFqmZU]2jDFM/{5ߐ֍,ٻćFGFf)d5dξC3ZI/.uuu32rFFhhhp9yXff&NԴ454Z)HMK?;|ec dOLj˜J]c44 ?qPptSQr{5j5PSS#:BgƯ\&$:Ri+n޼v-j֬.@&aaVQ#ϝy7zU 菕iپSOa1FU]IO/UAY;0mQ#^Ngԩi,ܴ vGB{}k>;MGn+TnY"N}Ix t&du :c7+TFe}VmEb"P9r ˗AWWpy^~-i넄CkVڵܺu~zK֭;̛ ;._:ƌVl}1eKWKM $n{W~}.ݼFŲkiYEB-Xê172!BwЩB[c7zru`|*8qqqѡ|rJ  r*U6l;ήȝ;ի|-cKzEG+Γ<Ѻ%5Lȱ:o?OQѫo:XJ\%߻]55agϊƢ9jŝ;3w˥KѬZc˗#""!CHHxB64qr^XX4b^G\=D߾CX؋^r%qu`O)~ҹw?Ϝthڂ\ޞ5~60R LbrºƢjw[[$ l FO,ĉ ~8Pwe팢ADJBw<7qa<ʚN ;q{x3˯\1wbYl5U5VN}2VPVG1'*r8p$) hkTGW 2ko-[z1{Ie)͹sq6={AjU<{{i/;ѽ#881t۹EO7g/4m` }g۝y?faO~pe&_,TTA=}$xAOgTUTܓ!J6Գ/Qעo':tf 3e(ע%s N^:ɹWWSg1&Τ4MTeBw 3g_5B|E61{'eXv<B+WcxylY]Ǝu&*JF3e66([VvZѵk6XX4{ s=5kVQ!Rd[,=68xNp y hdj+U(ꔡk˶D-Y'*ꢂ-]Y; u@ (9d*T8I];g%S%i{%#3? ``> b^Achwƌ] ~FɮSѷ8:Q]O՗:NSZ;+>11Os b׸ %ťKrӤ&I[7yILNgV%<{v4A!.lu*ȮSQAiS /_pqŬ?hs6rّ4tb5L ( \TPyWB҈L^YSAiXF*lSAi#NF KǏ.t*(mO#ysy2|O SAiGhT1 t* E>C2|dy^"e9;0eJGQ̛dƎ̄ 3?LaiIп.w@ )vGϟw6.\Ä',7m;0m݇0`3*ohը tK^O5;1kJawy`v9;d|YnjN{Eְ; R}wawΞ{AqqNV֬JiV-CMs?D(w~G[͡I f& Jq}>ܸ#Kvx{/ .x%%'Sߤ.vg\>{eL{K+gTXpGaԣO|\m4kގiߴc"CgPN]ZjWMk03Ź+L\mMM: }ljHIM_?Lx ntk6G\e:.*Ÿ Q\/߯?a\?M@B%ģpA㳘8p4ݻ~@OBwl¶/о#86`8Nk;KMT'XõhcjhL~UϝLu=}܇i M5 CUUqbߩ'֮ ~h8u*/qk+;Ijj*vpjdffz~~ۉÇ;w$=@ZZ'%((55eGHLNf1Mv8oWhwCK6suu5,-btW kIIIeTv CSSG>dffJ ǻ nYQOشo|9f;g_gi_߇C$|0jhg9R|(됒Jhh2~z1~d2\\ o@ wTGKG1* F5$јDE(-aGņQDj@coƂ` pR].(h9sw;;;3;[aӌE2-2(QYqɇ~Px3v;999vrrr?AA!hhh6_F:ʢEszZZZ5 )? J#-#1 Щѿo"tj}%j ֨0*Ufo3}p?jd %rCkωnd֭Rl>K3gNa쥄E < ۂ4,rl8%Y:hffB.=Q7m~;l;ƈ/~wߕ0oO~ٹ;ۣٮ3@Z٨? SYmaaʞ=%ҭ6kѣ'dddbooKu06n@RRJJѣ'ILLf@q걈u!tXޠv]>kי/]GӹU:W;jU/6NscSifD.Zy4UB~9wŋU; P PnݺE,\/^\&y>}aڂ߸ϲu245Wb4 sf[I5䦵E~}PEoLW᱒g/q w177!)),Zn)KC[[-,"#0rVfTqQ$/33&pYH{lXւD"\Ux>/ׯν{T׈Jif7m)ד"O@k`8tT_S"իͽ{GQ/D쳮88 ֶ;wo{jժ\Iزe'VV-077)Q<aWe]]*0\OYz1H$x8t81,ܼwbkxX &}cz W䎳-Wd䶷E:Y*}';rmȚa-4UGvnֺ=DМe4W  m[OAAޭmAR)Cֶwonڨajڞ,ykii*<y;>9wo#8x+ XUsq*buwE{>oy GCC+WV ?\IR\gG~cWp:V۲p{cYMikXZGIRN] SE)KINNr7_qƿkar l?֨07oa(*6_Fiժ'ݛ033fHAmm-^)""RzTxes):p;_©Ob{g W?772m6˭<&%|F.^½Ǐp;)4ihX}iu6-'11YQiØ1CYr6qF"/_e_$8ϛ7o`DDDzYeʺ034өDJy#%eLU9 ehcjVڭD\ދ)Ǒ2ebxN&AuSV>k?7ߒs mSVm%kfQ:C_.#U**ӳѧѳ}_kQ+ B4Z.y9uf Ї;މgɊsZEDDFRZ5慯ܧk\0Ի,;C#iR!ϸq?^.Cש"D WL ѷP}_05hNETڵ'E0wQ8\t?M*daS w,QP TQPFE*/M}#Qz 2y.H9Sڶfp۹Y:7(͇LmVM|VQX{;s֯W{[VMvo csx(wSŸġSr,h؀3\ڊu0~ύ[?Ě)y+os**s!`oCKkU)JCI4UشivEp $ -ZX0iOjլVj;c"ھw1ߐɃަ7T%;;ŋWgO$>NZ6p)=*w324j·q(z#N!6oWPʌwDݽM fC?խ@Ì_2]$;;MMMNϯsʒ?H}̰Yn`'ggȘ%~ѰϿVn$puĉH` ́ۨ_Ϟk;ѵ G1d( ջȻch L8o&ON7?Qʽoۡ6b썍AKSO"<H'18{)R]ؿbXw{FDDknA3s+ d6XZ+ĉ?0p`_f^BHH8zzqqqosrrn̞&K܄,""H$&D" ===ط/ mm-֭p4AYvv6S'$$ u 苛Xٛ+Tڵ6w_ /eѢ߹~=---LMKH`=-:mwO,Z~'/]|B|Mu 6gȱy{ ႙YD55 u렑_\:(~(;; '$$gXXС̦*~/YMtt,~~DG3m&&IKK?07o֭>oNOz,ICUTիBrX5Q)-$Џv. diu.?̟JpakQ/M0 ߢ잻(RS&&ccC?ѣ'*,O`ϞH֤Riq"$dqViٲ K_+"B[jmØ6bϝoN wE>{\ONBKSSF,eqɇ~Px3v;999vrrr?AA!hhhUP6 Ѩ"_eKyddeϑ}mM-F/FT^G[eKN&} C,Z̛amݒCsV̦4Rt==֭#F $14e[W[Vl!JF_hkjɝxVC~?&%N]xN228p"L^ue6onܺw|E\]{N 4t#wG=!ËXGr7~T UN}A*r%:~Z.SO8_)NőΘqԍ7p5>5]z%9N0UD"!(ȇ]UP6+Ө"_W?ئqq'q#¹sѭ['&"""򟏧L"v3:c'qdTB6Z߾7ddevVL#kPWSh؛134w̰1vVm;Zt 1,֯bl7ʙ3]9v$~~̘Zj]zml?o_@MMbJ[''=*ų$޽O-M3LV ߯c\z5k+M^Xz8 ;1B"3; 4m;0cX],ɧ[}ܻ[Rʪ켆:͚^EnݢqK.\ɋ/ILL&==!C~*QŠ>}ڶcǶmOZ5JTη͝ =Vh۸^–<-'b:崧I7Y迖W.SRܗӦICi65>ƽ'SP$%%E۶;O>iŵk7J]Tyu}ѣ#`efYȟukN]V؎q$>~8\P}z0˃Lt =EvE4$ݽCVvܨD"\Xd7E\U,,--͹{>/^DOR_Lff[fmm-ZT<-ѓl۶V዇M+N0]uKtnՆ-ZÁ`pSnM+P^m{(f!UJoaff… 3sbj׮)vDDʘb.fEm-~$ZMs:t<5k{&_hhh-F<%a Q)RɟM6"ȑ]ҐH$,&(KKsagׇgNR^\gL~iү;1g4םdZѺi3|?fEAꯑJ Fjٵh5WG dQQDȿ')G!?VWom%|J['=*ɳD.y;YpڴGMM'by4 ~e△ķ(+u$^KKS֭>*PYWJ::y+6~߱vp;7ņ};Y:U~$Qj3۾: ؗ 8z$ IL:_(n޼ł^$&&5j,1cr:6lƍD._;X>HPWijl.\޽ŝ[4i"|Ȼn% t*QR^xW~[ɾCz g꽔gfTիB?ܳVV;#F c%QQG̙IHňy_+oC;ɷy8LX}ѣ2WS$/Fs%Ne,72F i4zpI+jK[SX俖'ܼp~E) ߒ*u6-'11YIjժh3xp?,MZ֟ۂqwDZZ.]ҥ+!B4ש֭3ٿ7ob׮6oNϞ^""ek^7\_fO~p3Wd!NY TU[>k'쳳 FlaUec~蓷V-`x{oJ=&LpoM ==Q~AKKAѩi[%5){;}9r?F }6mƜ9˨R2f\Ysb<}uk3|@ Shjh(PIWSF2Om^IN55uXHJz=].Q9TMՙfs,,Lٸq ^X])Ç ٧ eexSX"ϫɇ-MܧRv?f5}JEފ.#FpV-4mli4]~T-)e_68/Ϟ==Gǯe~OCCwsǴi~E*ztҁ= .=deeN?H˕tt92x9ukbC?R2=}=w.-mQE.%~c*f̅<|uk1|Əw*yZj t WRFzzgY?RE 77.]2lD }T:5vptteKKDR`jw'kmHa]{Rd s}ǥ)K.7Be/l}w/_#!!+gv?>ϕDAaSEϺz^PFE*/M}CgssyG-"vD*EӂZbELD,((pQ"7u*jT""RLqNE*"FuDDDDDDDDDDDDDTCV U4hPDD*u*jT!RNj u*R(ʟDW 9ߊ~X:yu*> yߨ(Js"Z ]xdV\6ͣLrttfRSLeYFOY騴)-&Le] ̊sEDDp۹Y:7ʞ#z&&fL4M 'QaѯAeJ#J㏍1U@@rivІjķlͺۙ~۲j6Ei' >{n*M'Lyݡ! rgfbT!sywY\(B|1xmLʃoNtoAv>+Vq-&X7mΌc1SOw  "I{o\D"bѧ@tt0׮{׮@SS֭?fLW >t( hiiajj\,&::@. [6g JYn ;HN~5oMP@Cԩ GCC6555Ykᅢwchؐ~w}%( /͜ٲ68|}&X4Ԫ.X5!+vD]]2sN(*Vqt)K3+z/caaʯC6mYwBBHM}VeFaA_1iOH$[:0m&&IKK?07o֭>89 GGgM"""DR\L}Qhkk5nFGG ),_ŤUW{[Y-ji"hefQ|R)~{vw*_סz{񌦍Mh:Hs- $$=ʸ8_9::cll/9z$YYYVDDRߛ)RDji׆n cmĞ;ߞ,/ŧ6Ѷ#5`׼t! IDATo.cfbwrrrX6Ky[>B"ߦ$< LKLTa6lό+~v+RQUA&3y-LH22q>ZL#W+=lɉ/aSxSֺ#F $1411iLFF&?8} F[[ ''Wrs~2ѣ]O a׮ D OOwuT(͂xzztƌJTvҠA]c``zzzmc[Ev~5`I<1̞(y|H}s+.GZF:cLǡS7D KhFW2.~Q[&`P/u'ܗYunСu+Efh*2ooE(dPP( Owǟh׫jزe'mZq~~@@vzq6r͛]Ip=!*ꈠUtR)ۢkmM-YxXl}̸%ڇ^?dþ%t, \ϲwVl`dw1M/[y3vֽ;rڵرccʔ9ܾ}W.^``vv9q"Ѝ!緔^/c^DpwH!J9{?n-ީ'/'-p@LsW/ӭu;A(*d/sD. ScކGY]U^NN99T+ɓ_0TRY^oUR^x)p[;~Zfkf;ĝ?-&P}G<=i֬3׮%`nn£GOޖ`l,|dzzkn&0`@ޞi`mRp0eʸoH||"89 &##xbkא4ʕxC^Qqꟿ빶T6x4LiOyFgX5q捌DgfhĆt>v=bþ`f9MGێ|̙;v?@fp%33냘=ۍO?PF2YXgO$'իxkӼfv:ꡙ ]t+==<=gұc3WbbJ]ыgI{:ȅ'߿öa~7Wp]INN#Vi陙ƯCGӿGhz d `ȱx{>r,늃`lmѱc[zo){hT֭[8n…+y%ɤg0dOjyx>0]mmmaP.̗ܪ [Zӫlũ]]fMdZy4wΦeK9O>iŵk7lʢm[bmѢTzjsC׫b077Q6PhX_:=֭z]44i$0rVfr~ 7WJ3㼩͌MưA$22Һ͢9n% r5x𱜝ܱ9wŋUV{̢ue֢E K/R9/8f?aqX2 3Ɯ~YVRz A/ev@NvGԮ^mkO^(1Pg棨Ref3i,:tp@MM)~څ |m"""x'sof[ɮ#J/J>Ǎժkjn$~A45~-gi+E=txjgM\' ' ++/mDb|4'8xvv}8{b-$"#ɦI9]ѸR;ٙ&Ӥ_wb'?hү;) QD"maiԄH:2/$H I 賨B)<$OU뀶m7/S:Z^ZZ EʇʺTaGOPQyVC|ѩ捌{/?7 Gmaby#ccs):o"U}JQg`Ѐ5\˱cao!33SnmHV;^\~]I#l+U!ǹ@֮Wo*$'ݻ}.hذ>\_UfLwo̘{#L MM\܉73g.>}:ujWYUNCcKk/#l쯍e :lMR_d#M2Pv-ZacŨ\vúZ*r9LMl ũS犵TU@i04l&gϾ]^ W\**;b:׺i n&&)hPNv3E/VoԠq.N>/w|y{?xuDD%qO˅Ǟ;u@3AfV&[";5*[aXdy[>LQ])CWW:ujIv#;^i\JΥF/}.%\?2s8^a|m6Mp5U^/pvJ0]s"96_U?}(5e_r%e|p= .7oޢIA ,uuu5j ֭$&&slڴ]po޼ł^$&&5j,1cr:6lƍD._;X>ĿLeJTJp u A6XWXu#_G]8CZ5ЏEk9x(79s1 1"aZ1DE)k]]˂^=z$N/d#3WQz`_uNOď[qOI"f_liTW[_~â_Fx6QBzKI}JnIfC2[n3or ?Ț5d~VJ}6co4kIN]&Q6ߩOb{g W?77II;քy<;) ̦,>v}=ran!u@o+ߋ:¶m8}<;w055+yʋ^/eq/{I썍!+;1( {"|}kBRI#`C?.^[3fժ̜oTDŽ N?|+r_l޼OSnm(P8o4 #}T+Ԭ/]%5){;}9r?F }6mƜ9˨R2f}#<鴒.]?bO_LQ-(m))wJV@r> }օɓǢT_8L $m/}vI666̝;FDx.]Tȟ?d|x6:p5j <|?x[%ԩQƇKS_<Й^2dR3l:ؕCG勐6z-``'!Hc݃}knݺ NSX |*"& WPU ۖF9,ش!3od ӛ'"P?D_)B[jmØ62wNgK'FFV&ǎ0GW8qlܷS[eeFJoAy{+@_TgaG_lk׎8;`ʔqǟ[eQwY;Ǵl)8uGg//[y3vֽ;?n1ܡ !1$`eA̙8xp..c={)aaQrlI۶V<?e|Ѯ|ŧĄkFD ή='NDݻ#Xn|FF&?8} F[[ ''Wrsse6,]1co4hPWv~5ʯ ۂ4Yy7+hJnKA$ޠՐ/i;I OHĝ8tF]A}DCǮd"1}8w¶C˖XL6։#xӘ4 ((DBPӧODD2+Ұ{ ]$lܸM\-'68kzǣGO:"|2RmQa끶6ű>$ 1mOݵU3oC={Nl/yH6}I_7G*r%:~Z.SO8_@^%'7J:r6u9u|*O6eE~mLTٳI+;N_D俄#^Bt?$'7-ms<ڕņ}r@1r,.eRd.ֶ r%zXӿf$%-ظ\-ǣ{?^uν{V[M+<7>YY2=d/ n\I'-#!C&:ְamccm]z|uLNС-}tGG4MfF2瘘/_U[bpqYիy$\166 &҆ic.(~yXX6cٲu|r)Cq湯a<4ՋMբv4Gnrtkv_1|ժ Zӻ5:*A=a3c>V.d4JVjB+8nZܿHq4\BvuݻdeeanF{**4of]i< FzeJSsӼF&tMoMs"--MM OqF`_7CVNt3%ㆍiفHAy'yoW iBYbEq [[oQԅ."^!{EHLZvDrq_ߣX[ieʒСYSC<>Ol%TTT̒OH}.s'S1Á0؍W.po v#"ϫIFIJTD"mBDӁt7[7050¸ac|O'"6wbzG CQɏYPʅ% R13/F*$H L;n:D`?~Bp.O%zTԤR)5ҭ] Wr۟>]Ltk)e'yo ] ߥgV\J4yǏ{0E[7!ЫS5UU.5;77ЛDt_x̹I^VUU3l 5uN"V3ehȨ1GJN:hiU&9IIɌ7 ꡢBdd͚>ꄄ\,eq/_Y^e|(:m[EicbJ3 Bmq+9^-4ePn^#ԣN1ZBv^׊oJJq~WGUUWh/;57n~-8jjPrBҔ!~+7M}jݍ9|8XZϻD*s#` IDATB/ ukS[wX(=v,Qyʫo 3% 26<-˜Dq^t;"b^ Ŵz:HMO쟄_fsXv+ s35Jz ;K:YpQ_|DZDߍaSiZuqT *ĺu[ҪDNVdddzlȎ]vvmcst.ݻI,YDDDi';SU ((#HIyr;MM Fr`ٲhhӮݗ<#<<MM ƎZΝ8;Ά7oq&M%58JSICTiiTBV^#d͐!{7{Ic!u[/t~߸,f=S3 [1mȐohm>[!yX|*7ZjbGaذIlܸ])Rx]`7fk ˽`۽ցPUQk ɏRIS& 4k=-VzoC^6X(]+I|iّem>[!yxԞyuK]][=:wnϊ -Xᆾnn^""%DRZ]Kwh6.|ZZZd뽡Ժco?33ۋDʟ4i̾SyDN'.iE"''Νm6l# |iEhY51z[QQQOoiio)B~v!3L K\NܽDjץn҆*""W)/_?ѰN=\~N5m$"xBUU}Pdk׎L26n܉8N^:3xϸLÔ' [8VGY6q&FY]TWg|Euf`GXXr௓u. -,~HMMysclm3fRQLomOKMOgE,3/mаN=l"߸!**nڂ#Bv]鹃OHOLu4H$Lp<۶yKTm< -Y`y9sWDGǢF&Y7BB.켖PQyN0lڤxxNVVs,e a̟PRefO<===~ EMu <滢 @+f%*ϫYxTUiې5%\<ܹm*o4r'^~ƙ it0V^~ҥg***g H$1+ *\ܹ.4"55Sؐ{qtJ:Xh&7؀LH$JKKg<=qn,[6Wn|-ۼovV-03Lp yדEU*$w?HhX>:AXԿk Μ s62`֏choj^9Y;GO}~+L{q4nNj8{<- Hfdd2o J+<#ftimJ9d4al;USf ,~ȟN_AByXZÚ=˜FDDD1|Ӗ߱jaN6o a38bj`Dil =3q9+QWUcBnv?L3.ni%~fբ#Fw4"==qn8_Je̘i|MON <D~zɓIcHIyN` $5~hiiqn\\֭Wڄ~,ΩS:u,ر%}?i0B0[2q"Z@GviuG] Zeq[$uBfv&'/OyC_} ڵc!sDž=̛7wwO,O+V8[ж9.g۶_@عG&%K|͛W뻍Ǐ\7+)YY悶v1l{&)!׮ݺIWv^ߠ6Woqs/=gٮ͜=N_e,oo?x1vrP)\抯6E 77"BfV_rQ~+ϟ_i6E{Y"""Rx hB#+6k:u^>i}tҴFz6oKHe'Ʌ[f{ '7X x)tމzjиabރ]N} u5k7 &&-[ptLzzpw_ANy .]DFG>eY"D s# Ӗu~GRH̠[+֬~~Ս}'ѫW_TyihY&R4kքÇ H䞧Hai[ۼŦRz-йs{i\iix{b:th ſrtH+ \Z5!9{*qI'(22:a*2aw%(ߌLvedi?qUeȟ W!~ _矦(}֭FceÆ8:s3ϒ%'eaeէDq|x^NjAjTÔ'(O(#~?3EDDޣs_Îy.hk޷s3W##x♴g"/Cxj|QOV ..z:OHNJJ]z|uLNС-}tGGvv6#YY11H$|٬Qw='#+ͥU0+\fd혘/_UY'ś055)Q"oDɟ+6q Yi9w;zO<} zhA|ӱ+ nU2j*j着.l7>-sQSS-R񩬩I% };tٟCFf&$#ѧW.j\7%?4m$ȸ2܊Tf>/lK=M5@MM#22 D !eҺi1LGoRӈ&"6K|h=z@eJ|4*QR7g™˭Y:U佑 CHuk!,x$mTF))qrZ.}@dd WsZ?$$"w ܻwݻR|ܹZbceݺر۷yvg=%:B58ܸ}UۉI':~}%OcYw'ף#1!׮w/÷Nx-=2Z-k@˻g絜={xYʋ//B6͉C4T"""CC7?${OWݩ!D._c/w/C3_[vQuU5fN]:KLb$N[ײϛ*d#Q7K?~% -- _6lpf帹J-&Ov$q`65`㌅2kx}j~]ȵ 3^x鶫z\]ck;@4"""TV-wײ _<:>zo(;h Xp;sgD'&M$~/4m$ʼn tZQɡsg Ĉv:rN+FBQMn"KP~^)o9≈(iH2SXn9… WXDb"%4 \Y<N(bc077%--͛=y }~ZK"iEըBAhᅲk`""AA:SQ"KE*25fETDx NZZZDDJCDD*u*jT!zHE… Eu*R(O "oym?-DTtD| :y|l?52wKeo?geΧ`Lȇa9w_x/L<3}0DDDDRz}Rr z-|Ջ*UZ*+p/дQc ϗLw")BJ) )#_=<|8x0[n#H05mhժZD7^iC>sWl:ㆍY9W鶲6|Hq;-ajh\̔n?Ly°3ŗ ~8gHjj͛ck۟1c/1 D3׻rVKMA:$?:M6֩!.7PUUa(@H_^iD/Bϟ];2e$ظq'8q‡z_]DDDRxuo۞m+LaiagQVVfP9I*kVb Sxsa>T|ş;k6\ȟW/s I񨩩ѤIc֮+ `6o|qv^K:Xh&lݺO$$C[fɂWVVs,e a̟P477͛=Or0z`-?WRәrLaÅדEU*$ QSUnC2U |G|8n'`P_Wiøacb9ԭ< ?#=}2C@@[L>D@ZZ:pIհw`ٲ9sWDG~r87ŋW={BZ ̓ۨ`aђ [_OFF&pp4\on'AX:~mj?ByA=PFԦϣ[i+RYC y _O8{*Yˌ!(I8 ʩScll޽r5Hcg΄0~,];2tloy\]v/ 7}+"rȵ+ ~{qYN:6ׯYwCEE+BQ/K]'y!]fUu&8.))26|K[<'acuU5AXEI"aYth~;MiiC{wژqa/[oI>~m͹t)oo7v! Hz|ɒ5_`n㧜L ]y%?}>;r1"=_uccj<UdކćI̠[+ի @ Ǔͻ={2{֨.[ ΣaC]f͚ c/.WЩS;tu}t\ѐ3GVl%'a׳2=K)_(<ϲѫ)vhi022s_wnNJ !7d_9}:DzOIOϠ{N{f|]^E__caY‰Ϳ"**cc3ϒ%'e4h'E鯲f%lڂM~ޘPFM&Mt kV17nM4ۀ6nF}C|Ҳ5yީJ||\*XʕhѢ)gφbnnʹs jˆ yUh~C"-˫ѲXOGfMvfM8|8PyȫAykY}}=Y"""ƫE;v-Zi='phDfVum7~3|Q"S]GR͌qG05m&]n-$8vy/wK’%k8{>>""%佾颒&Mtq')D /MF7lDFsN ?׻ HpE111(zAdnJiV#믃O1x<0 Á8}p`7ޗI3/ IӁt7[7垧&l(cQ/נ)J$ݗg{-%СYSC<>Ol%TTT̒9OMMU<֮+OfLFV& oVQ"4-?'2FI|Ky1++ BCÉ˗05mFv;XX,T||(Ҳ?eeB dHʭ= D򮓲Ps?{WjzPKŠwʟ'aբze'lҔ)SFsFF9r$3ׯ 7:14GCCٹ/_vm*K?qR/Zs|6"11Vmv?}u55vRZ6idۡtHF 9 "偞^}TUUz_sFថVwE\..jr7n CEE5=}DFF#!TWv PzX2hxLؤ¯ ש]JŷҨA,^*U*ӬcX_D8.E\#&1տ)< aXW7HzNFZF',gϞLZZF*R:reMa׮}<{agg/ZNU6lpf帹J-&Ov$<\9s"sЩSTѢsUwz:ۮqu]+?f`n&Ee-zZvd`G7oE?!&17òpoڠ}y%:]o-yH$4`eՆ-uu5Z6%<8+MY B( }!^*:ILWj⯇ѲJO2S?gZj l\"Wa?6qRǕZ#)&Ntb$ǬSED999tlða1®LۏD&.QPFϟ13.'W:zZ~KKK~HDDDӴ)c4/8s g?t8"LAaǩ(bc077oO=zB߾:\5*RqԼT?ě.FQ~ZA=^{&"RS:5*RT"S\cVԩHEDQ/j; HD48889/AD"QPFE*Tt.\P~Q" j18ɓ[:(·"zǀSq{]@C2z滯y/eۏymqtܹ.n|z|Nɓ0cƢ'զzkWvhcn0 fuB?bf\>OZFxϴ6Tyxxp`nF"`jڌ'|klŢE+ݻnnˤX|#cja~L4"a4jm߾ ժOd ˟܎D"YLjOM>the&+;r$4RR[u8}H|~H6?`&w:_HA"h٤iެ5մ蜒Hi)u2-=}CRl/ן!.?{*t@S]ŊϟΝ;a 680هƍHl̤б7g L#0ЇiƳq6o|oeeey wd!5.kv*~\HrңYY{+{Oe__G7[Hy":c۽oVuhm+ w:_H’~|/J밾 XDDDCSmӽ}w|WheԬD ?zL}WĶG_f q> (l{8Vz EՋ,BtR:u"}:*BoM!ć]c#DDDJ;x!-r#q58B'6ߺe8wn@ %5=ױ+OqNêUς9uj?SeѢU;vRp~hiiqn\\֭ˣMn.hkW'Wdw}6tީmژr۷〼ޱڵ_Je̘i|MBzZ‰];2bqqA#vm͹t8۶.6//Ν>I/Y l޼_m<~'ɡC2ZNO`a=ꅷj8:N#''Ge-AA뻍{21אKuX&\BlR7nGv&]-y"B漎ʿ*m Zeq[y"/kH4֦9\֮ٳe;wvdC!|>z};t_,ݗΉ}0mL̊|Z)_x?m EʻZG=^BHxpSLH׌7ǦsOmXAlc7J1x{ѧOwAe4lˬY11qlⅣr+$,XVwEȑqbL>tterrr6m>QFirJhєgC177ܹPeÆ}S;3dȄB5l(baaZ`یe+ʥ ,Yg/YnS#)>湰sZ45W{GOv v ,Vntu]o0:ѓ< ',mܿwTTiܸӬ̶1xZZu+u\z'OR=II@FF&f<05-V֨{A=}8N6w;mTA}Y3lǎ#h~--]ԛ^5  ?{uxymDE%ox`qIe䴜GOw;zO~&?rr*ƍ߇_.fđ|4mjHTT,knt%Hpw_NX Μ ѓybSWW=ޞǐO~*dni'rss:t:!ԩMX)55UBXh'{!z>KvlMǼj Ǻ}k/*kjRICG)Oe{)5 睹rӁ,۵O2j&CyqI|iU4feeQQyh΂sBQ:-Q)As­8v {Qݒ=p %%%N\ !.1U9Eh\޴!&G}/$VE@YMM߼|n'ޥNm7]}ש]CUj5x&&6|[6iʔ)9t#9>8ʕ1_F:hiU.2䑓ìYgg9lcǶGi֜ᅦڵu!##7iBiժy!=APׯP꣪իo7"ǧ˗eCCåZNN~@RR2 Az#s5557Z/77hs#(<Ps+299ddfR $rkI$̍L ,&8,MK(j٤)mru#Mq$4 CyqyZQ1ț留NڴiVV_r\hwn +?{)ՐWuU5z[u'9DjXhY 0oSM!@i+5=h"bOͽGo^ ;ܸ}UۉI':~}9ϰ3喕 ;7p?߼̂c!gx,vqw+>5{wr=:r;wbhceݺر۷yvg=;w켖ظqF9[6͉C4T"""@ʕ066T\ --- PQQAII]m'ǏΝ<]ի4/ :r"#cXڝk" *簰HHHɓr g絜={xYʋ/ɿT"Mbɒ5%Mr9+o!ERFigf^/=EW:9CasN}Ӭb8*TѻwWBˮZVWWgɒYx{? 3jϴ&Nٹ3*E&o/}}"9W)} 3> f}ɜ^Ϟ[ʈobAsfǂk uX:v*&oKbދVNN钹h*4QL&IcNNDE]P֒ wؙ3R8'cǤQ~fi@ {=wU7s& CC}&OTiۤ=*Yٺ օw>鯨kG!]hEvФ2{RvǣGY:ݻwbA}x=Ɋ?34vX̞N6nJ`&bcHOOظ.}w,ZARWRr2KG伇F O?ՋMX%@.\fŊ`g;7vTΜ9/~m;Hݺuދhhh뽔{'@q&G*w,f Kٰ! ?ɘ}c'11 ٳ3C)f/)hkk3`߽@њ@ w\$O=%|R%ٓZո[hjh`__^ gjUΔ}f HIѺ#}"o VlD?~avGΒ}JMM!,,u2/_322X<-? e$V޼899̚5-29~g͚ R>| ?\zMMMLMYpsqUBeDLL ILL?17ƍxxFWӦyC[MHIgO2=;3fw M'%%3iv@KKWnܾ}mmm|}'韞^<: cc?ɱcgOk:vv D__OOJI|رcnj IW+[7 b_=uo GFFѶmKڶm>aazi6iӦp?X奁{ӭ[G>|Wa9j?/Ti|8Ν;znܸE]qs3fo1QQ^}ܹұ5v+ZAxeddn6ok:k"bZ.OP'W> e-#(h c8xpK'Ѥ=..;^իtʖQJԩ(I|Ȑ!|e[ c۶@ܺ#1gZjƀ=MliLL X7l8uj/V5O`&P9W9s ]O9pII!$$͝8yr[}%''ٵ+4$==]a㳐#{J>Sƒ#ׯ'KGTP L0JR=\Fx*mmR5@ /o6f130|~ ]5<=MlФ9+U:Vw}D~Yf9w/^$66dPe ݻ4ɇhj74ƌJ&PSannJ۶-8wB׼~mڵkINn8;7iS:vtQq3777dR2?;bcFehL~}sKʗ/Ǖ+Yٳy$A1xMu+9vvV<4>./a^H'e2 j\%ڵ gbff¹sMՊUX &/-'eվ*Ti qFW$}Ήg0cNqx$UTFCCkihOx^x} xy/>c߉#cd{M%:9A}[NД9X<죌Z3eU`Q}6InX _t"-==Svjdž HJJSfu4G)/d2G ݅"bcYiiiIʿL2^7}>#F 䫯…+Jjjهoz--/-'e~^Y[71'';֮DLu^xqx$UVή!Ҿ455ukߗ.ZA^xm9-MMhڲ@74Q=o)⍫TPQ15.>kpv=̚I7r]cjTոXbݡKbH^,޲::88 Q'2iiiy6f-w\tK0r2t:|8;;2\~y/W,ZZZJ'O111$66?%7=66mc׮fe„Q$%%1hЏhjjЧOw5sT R*zʿ>WյB,Y2 oRByF :Zĉ>8;wBhф[I:s?1e`lZ9^h 9̞oo_=znu{1ro1~~ٳbh_\z/Ѷm yi O&I=QQo4$:]-޽+WSSR5@ /J*euS$go9::@Qs#0rH4GGG8m^ǜ*-ǹJi0uAk&'~URN,n-=& ɵ[AܾL&33DCO͊L6Z[+Rؼ훙z Y2vd_-rml@PD㕔L}z|ґa>r~%wfDø~hi1K;-5^q\FMٓx.X7Z9 o>K41{/>޻AZ}/ JRвQcF KBp]F1נpQnd…ˬXUvD ;_k.\aX3Ϸ/R&uwyQR5,Jx84!7/M[fqh @Zzlc?Q1H.'qT.866^M5Ϟ«WX5ɣ130"%UΞ&GxL&s,"`ժ""Bx PWWgΌ2Lߩ/^^5,_DP``Pѣ{#z~֍udh͆HT$vla$N$5- l= BKL?0ڒidaIX3Sꃫ0 x%ǎB.gݞ=%&:5}}=E>))r&Maǎ}hiiڍ IAYihju/9r4=ZwTN^ 6oG sRN[Yߍmhj"%ΟE*g/CAJ\su!<'ظ1Ç緘Wo1 @OJ>|oǹsQW/ÍhѢ+nncƌ]u%*UbbÇgqJ)Rl9wӇ|;틔g&rz"7 Cjj* MB¿XX2~H4W/%Ky Z?@xշ3ܸduK>19&ѩY+"eR 5NM["Osq}‹?y._(݁}}+N%x\ֆ?=rZ5cƞ&6aaVd260ihس'BrCB(_͋dČa848Svqԝa!!a4oɓ{غ5(.99oϮ]' DDߏU?$ A)HL}FFT2TiT*ƞVn&w `Վ7qmppԩZ5/2ē/lˡCal[wduTކΟ_JJ;vJQiX9ύɓh|4Xg6έ+> RsȪרj;-!4t'3gN` ZѯHn߾U=k@ x7< ")%VEL3gk%mg $ShmDjijQl>?`RmrԴ]]030GO)/T Sƍǎ}9rZKn]}uڵXVÍ0g/ }}=._FHH;H*CƦL#&u x)K u5eRTTY麪TaIeӔT9kv2csYV -[VtÃCcɒ5xxdץۑ9sР܄0sO mNɩc)xCA 1]gIeR1o@m0U]{ |5GG[z3RCC[3kͰ[U-W,})ǎEbccד%KV#*T(Ot&L;w'22ݻ׫]G윳yzf<5~M^m9Wo`4/ڶm'Ǐbժ&Oz'boHL]J|Х]s[ʖMSRzDױx15*Wepײ:JyVXO,;Zjp#)2˱x%q$%%ӷwٮ[7!Ad}k3k?vZJ{SSoo#ψ ByNZ?ŋ/_+W㳈gIbݻ񘛛pV))ro%pΟehK bT, M##^$&r=q\9}ڴkגNpvnLӦtBUTqFW$}Ήg0cNqx$UTFCCkyLC`Bttuo~e$t Oa*ͩ"_W֭5 IDAT8r96J4jdMLu|MZa' 5sRݗ/29ˢ$ud2^SgNzh4efXa^טC{inX5U) )Jêr#DYYsy]}r ނwCYmL r::QS%ϞR9etZN&uL)*Ƞ_8;7f@MM SS'T455<SW.bl>ZQKrri%KokZY2DE]ᣄgKn INNv]xKK 7HV]CUtTϟOb~L!8 OMaWuoѫ^Se>qR+ryӧQfuʗ/GzFhkkE^ or&5d'ɰ1JvG"4_N9@FD^S}<ȱ/&22ZܽϰaS6\|Mf`PMMM窒/_EPH_2q&ҪTgJ7v.(_:O*U)_l5k|`o_1;w[Ȝ%ޚ2eprj㑒w5k}ߠspY37PfMMl*v[oIS+;v[A*Hyfvv rܻu|ReddM^18?@ PM;^I\q72x*=XFFY}'{HDDJ 2elZug\Ő˃lA',aǟ4o޷!&6c<~@zF:kv=e%l/ ._;wrIn޼MzFt (yVgkkݻ:S#UʕD\/_ssoJ3ؔ)_yT(z⼴,- 䭹w&gk7͍0 sE)1XʳV)q~^AOg}ɜ^Ϟ[ʈoq}x3/d2E\"h6xnԝou*-G{DD{//5IIɊ K]IHxFǎ)S޽2p`~BժUXvӧϧBrXX1d7y*/eYÄ'T*_+Ss~Yޛ{sfǂk uX:v^hׁ3nlxΧ&Cy޿Sw^$\N2usuН:K{6TPQ^ThTPT":]FN4+x-XH:D֩Ш$"b$[cVTPQKRK @ 񒴸;sH (}q^@PȪSQAICRAIĉ9 J9ӬH^P|ֹ bBxAhT! t*mS;@Y rcԨ;vZq!xϼ!(z&g];[F nE1g* eq.x3ھ׮0 @mU[KI߂Դ4_#xUҭe;F苚,󷱍v.|+wHOOǸ>CScAJb#%& AiEt5^q\FMEoRr2KGe٠(IMKCC]zMMM\v"A<ښZn ـ ^Ix/0!Jef̶¦^CJKUdUMclxάظh>q355_ń&!_,,L?~$M+)c-hjjbjj…3ӫ@ 8s˱ױ4'ܺQ9Vvqԝav=ۉ}}+N eO3H0+;g> 8ǁ&bշ3ܸ1D]D+9SSu0`_Jr99}e"?{ƁSǕlf$4b/3Hؚ7}Sms¦(>sKQb+dL߱|F⼟BCw2s̷݀~Uח/2ē/lˡCal[wd2>f/A)ӇI?{B>~8~]Mj5y @1t۱)қ6SؚТE9IIJJfuL0^2346!B@:ـkѱakkEn_`ddСXd {uA~Μ)4h9117077!99-̜_I89uxK?}B^ 3jdwM:0Whkj7+_oBdq4`9|/MJ5B1Jm?;C4px6V0yg}B{9VO ;X#>M'gRR^iӼh۶ޞ?~*__?~Jrr ..Ԯ]cqT :^RMַ?y+!wcow^\uߠ圽|ϟ)y@ޤuUT\v6uȱknL߾e;Wn[X)ׯoN|^xIr>>8{z'boHL]*u k{ '&~~}@e#5- k7L272Uߊ<5U-L&g܎Ums=Ӧ>sIQb+qy ~r`!h:__kӮ]K:urٹ1M:б իW\G@P/GEYmL ߰wqFFӽڞm~KѭZ 555̿nGjZmN_7.USy=j߾M47>fddЯH}Ztukrr]455w3lXԩ:/_Sj0ASSH =#5t딴T䩩yڼFfm4ՉrQ+.ވQBSCS+2227mL3m38xW19' tkIdd"-##Ȩ|7?ں?bffΝFCCj,ƞ:5tyHLNwN $n{3\q**l:Y3'rkrySN[+hWRe>)_ީ; /3u"~MRfР>.F[[ƍ|h3th?-ZIeqvv"%%sKR9oe_ӧ;/^fٲ@U䓊DDa$$˔)hkk֝srOX>R2FF]7nj|@n˗~VQfu^͛ٳKI |XTSFM yy`D;SByZhB]ʬo=~+StT]礡_ =uY6nm)lTit\$$3xOhjhK5CK͐ѮIOOgܒ<{O MX=ч:5tUԩ)\hd!%NJUi0xzիWxyMٳXX U_˕!*o̳֭gխ{obHDVRunAё3#/^dȑJi<:YL[l+2]]aeUqFK #FLQiIhzF:K/ީ{+J ?jJN∥4t64rj&]ߪ io%JmCAUũn^ؘ'197()(6ŏ64rYkE@PdЩ$NF%K%B7^:^@ @ N:::3ЧO%%:4D,tN8cЩS<͊U Ko1Ѷt!t*( >JN ۅwm'{G|h R0fZXn䊇h&N,=y%Q~fi토q<u$y?)Ix ʎ?rMd21 ~dۡ},ܼ;1]noRh),ڼ9W)U([s;R\Rpw>'{6Ɯ+yRJUlLj}sX{L_N,;<Ι~3ھ׮0 @mmA9|/RR0]CּN&|Zس׮ 0>`YvM w~3W?dXh_M;~$ g1̓vlC}&,M̊%T444ۍ5^q\FM1+E+B9Wq.|GxaoHT?[쇎Rp=7cYϼ|$%'Sߨ_tdϤ$xnm|z*=GGK^LhyKz 2a=ԍ[R] A*t"ㆦX#NӣuoHK[Gv WdՎ-~r&ƨ>/_rYrz}=_>54a7Chbi2q֣Q!ʕ B\=TD.0aTf9.&,l7 baa#i^Q0LL ILL?17ƍ܄9{D ٳ3c|L&+ z^U? @LM4ʨcgL86nGcf`DJ=DMMF3P̶ܴ9GO&"V Wlz6}edd|yAA[AvG so^؀_r)r9zukvDᅱhhcgooOŲSnPG8}o:6CScG.19s1}߻#~$Vp5'r|pbf˼J>{ ^bT\0Ce^Hі-ș4ɇ;k7222}?f\h)6KCף~)Sk3|6y4&zLN""8u 6WZw-Ʀȏû M?Q|Ty gMȾhhhҶ+dKFF֭``?Gu ~'hl_ECS}cS~W#/f*~֐֜RãxJ##V Jg\iC;%f֍8{8̈́.a&0^Ih^f +5o4/n߿2++ϙϼy:l==]y?%d ݻ[[+wY7l8uj/VW7gOD \u߯ppΠ?q֍c.͋07w=l{l+9oϮ]'K3NyݯB=ww̷ZQW.ʮݔ p̦@C:k"bZ.OPԴ%49NW'xG"-/9T*mIђB""Gh*q³4diBfo߷VXʟf*7߅L&#d|&6*ųʰg0S8VL;6!-e- Œ@ IDAT Sƍ);WWrr >}oMs[+d n#Т z& ;Z\yJ2{6wX>GИgF/d]ΐ Ӱ5qj݁/ `oٓGSoޚj]׈_tn- ߩ60¦s%"K2?%: CF{yj*od1Y9/^rmSh4[qr _d4jdMLu%[ssdJܿ0J o fPWB\uߠ圽|ϟ)~fF ;:JUXOp+^Z΢TSV k7IJJo]Wns67W<[˗f5||qyoշ4QXjuv cXMceyTT2!Uұ<--MNIySYʥqz<ۈy:ra]oUt/>gRtVCMM ۑdua 𺜵NJ`z]ƾ}Tvro^ey&SSSs̼_ٹ1۷EWjjj:!g_y<3SIf暥 /_6kd.s5.EV9 OMakwUg2 D3'=u 2k3wQQ\mKT@1j؂X1Qga7`OT#{î 1{oX0 ("6F .mD9ܙ3;3waiMlg/j7F- )Rb+/q)U ˊʝ*&f\.Ym-lgL,_96s'i߲*&뵌k\'s>5kM;sq >A;hcbzXY(@/csѰ;_՛<{‰+*>رYKb!W{+gOpN&ɣ9cHJxEDh!?&BQ[ wTfzW.=ѵj7`q,ز?VcQc(+.*_ʬkx%]cνN}HOOgܒ9<{斬IYcmpԨ_)^܀EV3aLJ6;kƎʳg/bݺjVjjxQ|%Sʆ=+"%sS u ,@Oa]z~#1߉1_e$&&)Ve~fMA1lm0 s y/h uuu~VlKCC%Kf6ea`=dG1ew Ȇ~ո\ȓgO16,MK.Ũ.7 γ/06*CN@7jơ7y>ƥ*ŖX;v('z`o}7o߷(}).˱dJlǬ%m]黊e~T(]W>j%]_N:%S3̭2qʾsCac5A?64wmuJ迁NG>س?:zz_ &h/?è1zҡ:߷Ԕ<\*2`8]( §"+Y|n;f)dgg?fMvFvAV{mW4ugذaJ>e~h9NQf5ƍRdN~~TCĨK˥?u>:y1|;;;Ok#9 ɒOooSi~ X(268 qZXc4 =kl#|D" Et Mv43IW,XP9E ѻq*bT(D. "NH/I/AAAA/Ik} B~8;;g\ &TĨP؈\*vgΜvS.f&yTp;$n$2֌vVUeN\[z+Gq1ZHſ4of n#ɨQÖѣSWjڢ-ڸZi^1RLÆmD#==LH~J2ssS&O B}.wCzp,omה~cTkܸ>%KUAm[ʕ8'?غ!EI;^ۏz ޵'2d, 𣛛+{筡B$&%Q͢ [cP~)RSS|ҢESFLKyoBcT̟+Ք/hiҾ3^R9%i\GkaSP+B&\JHNIQL?הmԻ*ťknOGG޽T){` q/A( :kV#ǯ\вAcZ6h^6 LxɫHIMKӽjtjZ+vx?/Sܒq=(5sθZZaI:vl˄ 3ً C|slm?~Rpr9 )hNС^C[x53g.`Ӧ444ė\.g ||"6!ff&M)~r$&&1iw@[[ '{7fϞq~lzoAݺ_6 Sӊ9SʕhhqLCb._\#%6\ٌ/^q9RRRՁc(MTn)yXJ~\16.ԩcitt <ٳDK"3^Ӑxڤ¦]ӫ0{ ;bέs|W^yc.Sr}Yjb2]=9p` ˖ͦbŷW<=u.f̘޽S&={{Jٸo4͹s{Yzbom&(PIjj64,$Q't cٔTv88W)yI) Į9NmM-̚H<]ƽ;_&glOtby_yyӢESzv$*QQ4`Ӧmd26mf$W}kh WׁL:={(1Ɍ9~ +Vxuj9kW Ar9Y+5򴮪\:oZ|`Rߡ_f"կ_d^  sm:u 몬Sn YF=Ķmر#Hm"%wKRd&#EJJ vѣ4heM"| 5eB,*`_AAmRW84oL&ü jfSSX{+cU&XV4cr!7aͮ*r/KЊ3f0]vXrr klb̘!nKKsFaaa]t鈦&Ŋ)7mjGǎmQWWڒs|77O,,h֬QRTlŴnlf ų/4~?T*v'*֌Z0 ϡctaGjЄJ+bknɜaͻQJ|]-QWS̜fp"{,gZ1nPlm{JJJ{ӦEVm ?ILL/qѤI*WĴi10W>?ҺusM˝ Nfѣ3Æ$%%w1ҡoW߶m%AN^DTl yriRJ2+3uHZmimdOwŊQzUNԩم{cNFTEj~)֩SLTMn)yXj~W^= EjdqW/Vo5|u9y硩Q Tbkn4]͢ O2!OtuB&Q϶:n'!/_"2.II4i}ΝhRRR~dԫWJeml,32a)֭5J GG:tÇ)[4;GŀImjJ9Rr;$&'}tw  ™3ۉ'qy K!i+*\gkk4]m2wKRsɍ)x%gbfVu A\w/iʪE9yMa^DeH{4LvIev$ȼomml˩ga{caazA.VDD+T|׭w"YU#D.2m,ԪvϥFMM mHMKU*y` (Dzvez}6Xّr=aoߐ;cl\555DGd ڵ+ըaqFxK ϟq-_KKL{ҩ{=^ë́WԨaKÆu9uX2lٲMӨQ=rCM UL*'s-W~mRRRXlB]]Fqyw'evBY&n)yXJ0힔TRR$5z{Okx^%%q2 )ShFG I)/1惁9qr~a_Xf[S vu.;%0`†Dޏf3Tngз3g/FGG z茶{;CRXX~""J}NP!ΝBBB!!ɲLҔ){'K6zcR֘',߶Dg &,IͺT(S$ODCQ&8-]% 8t4.;SV/R)UnYEΞDtt zzz(+: ؓEV}#9 iiiBXWWGGfZH2F/_K2e(Q8woG>G1bWv3gRÇ#88ϽuN]J@ƨmtau  >m~u}. +ܺwyq]R K+F5sKTQ\|]quK[[:uj|]]o9:: ڵsB]]'&RrS+X IDAT<,Lfs1?X1=*E6%AJ,)0bn,Y/n]Qņ{Pt ΰaÔ}8ЊRӼzu;W>]`mmɔ)c>~3ǩӧ_z#$$DOi5kVcܸ])y0섇?vȧBa]>MMc|]\PtelqܸNDDk ><~?U#>9̙̘1?sFP؈\y sO&|+^ ,(Њ BA"N81*F" YNYBaꊗ    ]n5`pvvA(L2ǩQT(Μ9|Ba]>Lqqa]!z}&…%EȥBQ Pʅ fZk~\81)J $ V^"/ Y~fo",625l=z{/7Oɒׯ\..177eQ mـJ qwWW´5KhȞ%c?FLAN\[z+Gq1ZLjZ^W?<J9C#~ Clc[B+@Zhʈ`u8;bT`,-—ɦRe>^1ܱUl>V T455?u5AfQ-1cRxm\:kSs.˸Şjkӿcm A{t(MתU5s~2rVڈ_DGа$;e„2_fl]t`d2 cL:ȸoccIrr AAdY :IJe u~(LM+J'\͛hiiaeU sYfZٳAhh=#-5˗{d:~:5˹PPC vuRחHW[jUr-İ?2m6ݙ}>w&£#TנNL3reMv̂NCMM/ߵcs'5- Oߕl;ϩjnɸhZ}v\Ί>ElCL߿gi$$$p1ll+i++NuuuFtIV홶f1ێN_ٗyCGOOٳ'm )Tc&hhg̞=?֊Ѹq}nfu^틟2o*U[?l߾n:!Ѿ}kS8pਢ||s;B׮oϭ~^^hє޽@T,-ͳ ?\YC{KuZK';Yʸ\@~$$3x;O50k"rxٸw'욭NS,㻊2}o[Ep:w}]_puԩsٳr7_eywn_͚5 m[ǎAZYS Vj58q"1@ƝnТnQ}ILNh.Yʔ,ȸ|ݞdj _F^6` YN7O*U2UJLu++}ׯ)YSҺusFq9߬Y#z̰aаaRRRpw%BaQ 3s96o^cCMJn݊$))&MZF [\ys CR)ԯ[&Q϶:U![$&&ѽ,Ud4*ߥ*lm֩V͆؇| }b*?k@^MOk?{s0 \'bmjNPZDRFy|Ul4]!_U~{KL&L)C?M) 퓺ukdًx? %% j+ջ^ZYr8|$[Pxv>7f.7 0Uvd*UWWqr=aoߐ;cl\555>2 o9\|ÇOun<<뻔ڵS-66V.7oča,_)~|.d2tiK9rVqq3HQ&\wYeM\˴|S>=blT555l:!5M9^#='>oof+l*UftlSgdP:ON~U&~v|I~e2ܹ>  ~+==qx͛Wd{9^JTb6'No5%6!11   hhhz+KRZbĈرkڵOс-[viv5A;TIHJ$N$e 3~lR{fܕՠIͺ왻rYAcb=d#&eP ,*y3hijrU<\װGT Jeϟ\2YS> P0$g$5LׇdT$qqW""-!}rU (򟙙 ZZZ?Y\.seưaӪU3~}$>XI,B+^Fts@HH(eʔV\Rf}u벾dPWW}={1::4lXgУGV]2e(Q8woG>'_˲zhєrpfw88eƌyl7^^nyYEΞDtt zzz(!- =]{Cj$2.f-с7Xt-Æ@[[޽Xa),,X~ w63g)OıqR 9r$#FLdӦ% xܹW~Ĉ9@r{bpJ5W7`ѢL0ҥ qphjK%psòe00g~_~b\|  4j>m~l䅋KWӲegC Xͣ8J {,Ʋ[^b=bh u ,@Oa]z~#uuqx|AUsKLĤL~#GȐ73m< akk̀=\7ĺϟ];'qr>}5UyC o] 9+㻒.-1khef: q['ϞblX^?80biٲ3::cZV\J>{A21ׯ_3vT={-Pӧ/b|}R1Q6]Xti,YRav7 Yqqa^_]`mmɔ)ftidu 6LiD5+NNYbT/СJqjgg?aAYHHȥBa" Mv46tlș3ի˧N9϶ ]T4FRT(l˧I` .T(ލSBa$rPԘq*FxIx   exI\UH90"FFR;sLE Mv43ɣ~|m?/"NNĨP8P|q/?&{׺Ç1S F—&s M~LX>O&SWC|F" —#ZGv7LFuKkF;k2!pQHOOrS88Ҿ鷹lj\% >kі xm\4@W|wLA*lܸ>%K_pԴ46bxrFm]YmmהďA‡wEV[a ߿Cbmj]mmwzFrJbGq2}j _Ĥ$YTsv 2c{r),\1)k̶#>ymU 2* >xmHik+[juW.wm`Rz5!]mmYTy29kfѯ+e:u,66$'tLF.=z02L>bnތ@KK +,\84ʕx'O#%%];vjuTlzoAݺ_6 Sӊ}rVڈ_DGа$;e„+V133nK>_хhmהV P|Ee,+)d/% h>OJMKcyl; 5u1)>w&£#TנNL3r8r,s|Vr3ZXVbo1x#m-4eU&)%SG(nSo;3IuɜCUWǏa /ʗ/n'xyVëWo̭}{F£:^SV.Ģ F؝Hڍtt:Vmz:|UيSW/)=9tF>}>ᡌ9dVlgi|Sv'rxաKijj_̘;wI4j.?FUbڀ߰41ɳ,ۏNㇰoʗ.+LnCӦvtqڒsY'OL˖TPʕ+)S&?f ؓ%K*:^o;_} XĊ0a8]f|MS'ǘd7왚V$4~~eks_i1;ꤧquZ|mW/cyW% _jfEǫ3l5qnf<~ORJ2olXT0 ZB_bzԫZ~ԶF9>nPT|oWUd2ŏii +{bmfiYc4F ZiRm7LICI#Ş45 Jimׄަ}C.3r$d25ܔnmYv޽Gjj*kDCCqFUn}#s{F;^SV-bl6YFZWW߉dYFVk!pwx@uKk~USW/cTuVGC] vfBѣ91U&3q1g'DL._'غu7]JHKKSZ'5,r=aoߐ;cl\555)nyQUt4 f]ʐi cQ,ڲ!Kg;s+}L7s)FQSSæsR2~2ec//a?a>^ԩc2~\y6NdzI9C#zOi9|mOJܾ1oZΟΝSq9.~ꧦuR[ȩ=#B_E੣ODTRRwܠZMRRSYG}Ѱz-N]kiXUL*'u<233AKK' ZBQH؝H+2IӢV1?;vں2vS,p!X+W}b>$&&AzabR BCo)u֪T@GG'f7?aIB榙L1]m--~hWr\ QzrF 112hkI,ڪ*ûdRuŲG֦wj4_ۑL IDAT,[e,Y6e913&.}6--5ׯ+_+]ڐxyQn[SSSs&% P45z;ĭP^%%qH)csϛgOφթ?r EVW[]YhnD'h;kwcѦ[N2%+|vOoBv?ĥ=I)cIHJTz>FJ,4ysJ<ĉDFޥJWލaƌDEExӷ3eQDqň\qw෮}:3{bMpu֯ߢX>p`O-Zڵ};7ذ/֬ǡ&Sz Y}gu;'hm6D7-ɲLUD޿obc:}enjJ,E }]8 @LYH1!@؝P=ĕDݿG3I#] |Cm|!7amԨ_)^܀EV3aLJ65#GȐ73m< akk̀=>Ήf: q['ϞblX^?80=r[0?ݎ_k?ں=XCC]ţ&j!0gXqROGmWNtiR?Bu)4nnoGٛ㻒9+Ҳ\`֍{KbknFoHۋ^#!) q_P1aú88#!!77O<}„$&&ҷohii܉Mnٳ 7oFҲegtt6nk_e$&&qVIUOVdI3t+g^Z С ^ j֬ƸqC?uUq*bT(lb.5e,:Cizz:͛;ЫWWzv`҄?vӧK/@>,46vū0'`˔9AĩPdSBaSrijZpvs=pF8QԮ]Weq?0..f&ׂ bP2S0z7NE ȥBaScVĩP/__߂ 'gg,D M81*6" EsS.f&yp qIW( -2벹S0NuϋS(mSc B?&{udžGi@ӯ+'z|O% BQh6VgW+>ylpd,*0mH|%i?k֡A[rq34o0wI)S_ۃ L&F [FLZ>‡wEV[at :ΛkhRVL}rv&hߣxICu7d_<Č]_tn]qvMiՠ Wd\7OeHMKcyl; 5u1)>w&£#TנNL3rVDL)'\͛hiiaeU Sb@@ZSfs?/t1 Fi R[g-RʖZgj?%˔%JE 6k|M &{vf6I.EJBR*Y0v#S"%ɖ^G\n=e͜9}|g֏+^xKK+}WactCuς_PFEEJl ڃу>~^]F,Hwr-TUUh w>sl(**ʲpSщ׽:5q,ټՆ%ao?KKsFEEibgg͢E A[ NN<,T*}>Pcʞ'yDFF@dd7n*%33s]@]] {s' Vw;v,ܤIҒٌㄞ^m-)wKSQQ@l-OKJv& &_0y"Z: ׏TF:z/-qv[ V3$?~S.#+qҷCW"7M<kCEl ;- |_ b;B_TY#҂ߦUz83cFjzv_ѽ1uñ#V-tDyZ[6%RvӵUrawx0ZZvd:zCY9ٌd.\P -MIҳ?J ϟgL~=8~< :HNBC*V!7wԭV(l0\:4oͅ*WH$fȉxջ{ sGO&|v~ɒm9r$Bf̈́ uu5ƌq۷;󌨨30ں7} ;;Sv[[X ٻw 'dE/Of,v S}C?}¦~ =5ۨ[pK{9vACz3[֓Ϩ+v/Z1cFtjцU2=zNVN6|,uXPkq߶FбK•طoʝ[64';+[p6օ_aѬ%Pp ɬUiԩo@R|h׭WACIIVP0J鋡ekŰ8]t&& F_-޲FpZTʈ3nBO&JJJX In^nJ oO|Ѳ+t'NDz|}7Ѣ`J#Pq[s v/^qW*hih(OY|J6$HdD>^R)tؖwW%%%̾"''Wf7QRR",:!* >>eכ6ms篸~=NܮQ)ZIs =/\%0;% mx$.6u^}oը)^kܺ{T6¬Smr݄ay9ϣSZUI{p)XOz(x3No5u 9]b/=n '@LI"Ub\kE[KiHyvCEYums8ZM6m,ܼ)WAAf-&$$={<+HIfe&'vxohᜀ5ѮVEt\V<PФQw%?ɉ_Bou۲;HILvuB܇J%n݄"]v Ѓ ix{BߏQ ֬յyp^ +IPߐ؛^+1ܾܿ} MJ8;/,X0 bbbCCsEY$?Iޣ2\81揞_5f /}qI x{w-FM:ֶl͎$$sM|Bضm7jRz5 z`JJ`m݋S~'-fcm݋{k~jTl[پ}7n%rzde†ѥKBZZ::: .|Y|:N$~eϞ+;t"88Ǐ(((`۶ܸq̸_]DSDj(INQC,Anha sK6ZVWNU+}.^{/yg֢pYZ-ϟm_1ȎCGYEغb7])\:Rn}/ЩI>* Q]GoZVm-0܇ '8ˋ[tj25\6B4j۽Ϟi JUU<[ױ9ЏZL7—}aӭ<ҥӧӫ͈v*رGO6ttE-cc:w +}`ӭ7'Υ:u\klЩEVNڽ;YI=}6X(l[3CY}ZU46ѹOqr_Vf1\\<ݶm[QVMnܸˊ]ZU^رdlK~]]vūZ am0YDF.P~y*jj 2PWW88nN~=ѣK̻ȧFRCe'4IZYYdɒ/2aʔ)r第xqrX<ǡ4lҔaSOܻNV3LL@NF_Ν\(:pweΝ>/_NźDIu[d#KFQalEARTFE>6D_fÉќ9sKo)p iѢ)YxzQ}}E)IbTc$EPڵkjDDE.Tcu}He@ԩHe@Qp*4eHD" 2""Eu*jTcC"Q"tZ~c NE>vDT>t t>tBE!lT}sュoo?}EDDD}b_1cчΆ 8>t6DDDkg:FܝH$>75g|aHf~7nUժϱH9o&waՁͳ S166`}"͛7)Wc7/""np+`z/|X?ozkciҰJxڇOA>LEZutlGM~Awn?<7CF!Hh;ug@Yn Ɋ=155&##c~¢!HRn݅>S{S_ϲekٽ;ll0}DYeˊ gިIjLiz('N꺁03kuK_B89#22 //?"#8q6}כcҙ4i6ZZZ2W![;Uê۴n}Nsdd)MpS68ُ$hvgIc8260cYZi3~x>[ONBMU3#4UO<{ӧ$''[[kfΜҋ%B|YvvspP'JRGtwDe &wܼ4k֙3|(B^R)>#5;F8&de<ܩH,XT*启{}xx.jб~Ѧ7X31fMFC -_IxT0h`OPn2-q,u2vۅߦUl ;,U՞HRpt/Oޓxflo IDATkOyH[[4֟6#1zPxWmcvYv;g,k=jH$fȉxo.î]iӦy/믛7΁~}=pw@"{s:Chh4]]7pKݴl )ܹsWaޖ.]CT<='DD ̈́ uu5ƌq@7Eace)R){"`ݩ;jJgC|iٌ]!r:\{;G2wdmG,ٶ'e6Y9ٌd.\JCi<3@v0t $/*ۊ4涀];0rIL{q+˯ngOر}89cѢ_9"OX.,[~Wo¸7}5DZ6 +7RK>B`OУ/D=A"Q*ZQgpLԫ338{"N}{}=c\9(y?Tǫ( ä>_|l`bǟ07'lǠٓ[5k[!l lGl h"gȸ3(*c`e}TUU_?Oֶ𼱱-[6 ׸fMPQQg2a۶,Z4=:03'^^~riJʛ_ nni߾/^<ǣ8ܱ470JfknnJc<}")[ъ`nhLmd:3ȟͳuԩK\R~e_)hj߻UTe֭#A#u(M5\!Φa(+SP iH[hjѺl%utk}KqשY*FzdH&F ;i:Y9|WǤ>o{lٌ+&&ƍ3pIE:gK;6ZWW_>bbbHN_KVV6xxɴ``P؛]WZjҊn/FèI-8LMwu hRpޞ="';/;}CMzF&ON*ZQUeΜ S^ %%T_~ȢnIdfgÂs^t>\ɳ^iԣg.;Ҿ}zFZi HE)-7՜rUH :,ܺڟ_ tpEI"¨=s9>\ihժlߌ J݇074=~MgGn%훵WNԪƿGrǖ>]ENΡUWhԲ\HtN={<ɼβLffÆM,NO_caCx&$';fV* h۵'i4kӞv{QCVJSk͛NvV&F闆>jjj;JRΝYa룪ŋxsګ/੩HIIeCEE؛^X%GQWSO.o=ݗZ?{TiHyvCEY忝߫y&L6wbnހÇkDUUXfM%$$'UY(C&D"k:uttI.{Jb\kE[K\¬Smr݄1ˮU8sSU?x9TJll<"fZLHH${xӡe;Uh% ZŮS!hhmˆ}OBJ2o'4Y3kW%^e+U؛^+1ܾܿ} Mkа>.Err iiС<~FAA۶.6DMPY,(IҺ-wv&{w91|BU؟s,_#Dvsa^\&DۃB ~W8KX㿃O{L $޻KC}7=Ia5$&&r͛w2z@/PgAZ.CrrE bbb)wn*11ܗ8;/,X0W>.W<{0MM ƍs`l߾[~=o}m/3^u MzW"H+y̪GxiA~۹sU?)>kJ\9ͽDMy4:ӧ8ח y{u M;ow+m,ȇsG''7q.sOq`ppNQC,An{tGQ6ԬQ+?$O::t/V*{˨YSn<|f\ӧh،;֢xoJff&G*C C+.6n\+qwAժL:˗KߟB4gnMbO" aptwH KoB[ ƦTU<[ױ9ЏZL7QUhr_x{gf;lm"Hid[._Fn"22oӭ`44ׯ'=zBEU θbu<~= cml ݇TML:FnM!އg4e%el{e䋅5OKC7[}aӭ<ΚyF(++coFV3'3g ;jUm:wnǷvH\x!C&Ȏ]]7 #''c7Z6m,?(8wS9J)K/?舮;waTZƍƾOtJjۺ%PC&qp)A^ō.ׇynm= -Zi|޺-5jέ8-_'wv4͎UKdtt,>KDD#Q{P _VVV<8>PjYMQ%Ν>VaYegL2ES:5Z2iR:4_r7˅4w:_TPN,Yr$"Rb:ͼu@>z>ՊBe$$$ҢEKQ}|K6:(SQ"%ҏ%ߤ$.tZA=^k׮}ySu*jTcD"Q"E=^^"""""""""""""©PC++w!0dȐ{|LթQ їTDTJiQjM-u*#jT2 T2 lw6t: o ON3 -((`ƌE4k#V\8kGo3c81gK6JYED'kg:FܝH$>75g|aH.#VxrdfgcRO~Ei c0TL3c]E'~7nUժòܼQW7 Mu vsEYY˕8<ӥ+4x氱D]:ס}:gg Ibf`Ě`@sssYbGHOƍ͘={ })1; 33s]@]] {s' V@hh$;q*j;c`P_.~ Ss D"`c3'"Hu?hciҰEto :Υ NC*%hGzu=F,:Ѓ}N ؝2܌x0***|Mo]GT>>HM}>clN8PSS̬-~,dd)MpS68ُ$hvgI0'ܼ'999Z3s$^|(+s;ׅCd>W* 7 $FF02ԩ :9#22 //?"#055ne[vtkSvzE I=x)t*G~}כcM4---[ބ(ZʽD5h`lB_!e-.$^ۏҜ<QQQcHe !nsagh߬%W-⏿.QGGn}pm-(TŸGɅм5GOɸsf;_w%+'Kq1( ȃF|/s^Ok~.忐 ҥk:uÛSC.++ cnnJff&megU8|}Xb.GдiczF}/xJ3F:sC֖M9[$ )ɘڭ\ Nc`ɘ׭JUM-z*mlhys_77*ƾg?&Nk9}Z_7s@Ō3]޽y#KVV.DV'- MZꚜ~@`a7O߾Ɍu.Ԭ†A>8.U(Io+?@\]z"n߾8ja̘NJuDFF~]֬,sK}7nȑW!_%PR"6%;0+&`մIL\'Hћ:DILU"lT6ݻ3 +"RYxk [aRO/$?ǞcGL47cYe=zW8gfEɅӭx4l+,`RO_a9l۶EfңGgwOYYƦp4UUU23 m>ޓŋgsx\ss[@&_sF:XlMܹQQgņ,'L y 1h$liyh2:q*Hq2uVPY9xybn:uKJ/0u"3;-A{M>@aZѹ0sX"|>Ǭl<>Xd_b._}ջ\(B}HqJTĦ$ZX4sa߸>mٴ.SB|G[B_LvvZ5šFӦGEE)^P^hl,-MfdS!>RBV:DIR<֛<Mo*He^ ^m>ôܹl?|T*Ҡ(*hih(OY D"}B.p<ޞ,peˊmW4rBHRбc[܉^m03XmEË- M ,;t&& F]8Y[Pëpt[|HPPP0K= S P"᱒KqD4w-Z|.("o:uٵp_2r, qu]JRF,Ϳ$uz5QRRbpOr "_&˓;}+T<.IWe cSyzyM?eTI|$RI~~q_\Q W BlJCHYօ@T)g[D2RIfot#S/^SнVr .w_/H$0$y9KhH1}aֈ6nИLP555Ν$;'J9wU 룪ŋWevW2~p롢BlbGFV&qISŰ@Z@vNEը$Tho:gO+9}BE.H NxI5oބirNppX&hSGG5 IDAT9P.qR]F]om~m=TUK] eҊr]NZhkW+_>/;'JѪ%V$k_*KJҩPYiire ۛ!^g<賥^pk:v'<+xb0ko7&qd8G;͞c! _8t1f /}qI x{w-FqI X=&ݥai]#GⲞSܼyWp# 5˗?IHH_ٿls֪Kd+Â+y3sPT$b8{3ĮGbJ%n݄"]v Ѓ ,jhmˆ}OBJ2o'4e6W-G!15+$,Bq_wsV"ׯmv{ի=r%}۷аaɽu"cfϱ}a͙FC#z˜"}){wq 15?~}ٮY3kW%@V eW/}S]ݹҥkHLL&$7d!0_СX]6$ӇA闄PmhXK"99O{ $sz!ZN~ʲILM!Sx˴\NH(WimnB&uP쫋NMMMaلuRt/EDKT_pqrrsWd?6L@ sK6ZVWNU)}.z!qtjцgvNVyaROM3gbxAt룰gE<}ƍرc-dff2zO2d :tuūqr_Vf1\\)JJaz5̂.䆯../oYOө>L"Nn dMhkUTn0'QT}>+5k("a=,^Uи9REK{/O>CO6#Fak;\yy{l ݇TML:uU5uE>k{ҟ=ї/ʪ(y csUbo\/˗ޫtegg? )Q"Eu*jTcC"t*6D>6JiQx]fLDmPTNE>F^שQїTDTx jxBC *וȻbȐ!%(SQ"/ : Ӣ^S-Nu*#jT2 T2 lF Ja1XŁ*VA3f,Y.ʕŁDDJ_0kFۏgu:oSaƌE:"2QԛGrCw6M͙>d4_5|3nݽS,llų1„yTJmܹZU{Xv<3U~id܀_FLu㦂Ӊ8{OozRES뭕( 9^ԩS*UD=B}^rfuNDMA!#x 1.4g};|<:1ccn ""֩p+d]Ze$l c|'FZ𘽘Yi _8^:y~l|T{caԀUSgˎ;zgnpb\ K;_['#atBV{axK{w1S37kn^*e?w04Y7K~:BICw"ϊhPH@CM}ɴ}IZNk⽕C#_&nx,_/wYcGԕ|M/Ll vUz}Qp:C9aiҐܼ<CYYi6vm8p2*Z8ُ]Jl ڃу>~^]Fyr"qԘ  {ˊ }"@p<2ӦΚEVv3xp? bu=kge'MffsqN X1Hwr-TUUh w~_ETWҤaײr &8өEGg4;3w$OX1O`b#zKɷQUVeϙ7jui}Cgeyw,R7n!!02j>N %~e('0aW@EE$:wfdIacu.]wTǕ ֦ڴ{ss繖QQSUžG_HlM(ԬI=x{f5wBG T>>HM}>cȥu.||| ؋*gٲJ1 $a2;;s]8t(LM>A!iݸ)!Ϙ+^'/eⓓPSU5?!\vzpk/*ʯǤ g̅ 3NN󈌌b=EiW賢FDDD>mWҦI !}srcqɣR ݹ=ĤN]lL-;[ܸ`ԠwFV\鲔<[6 ԩ"#0w!\E&J>:)OMF(_7')+Itn@6D1dx~!sLmVեSv BHHl`QSS׍^ X2ell,kxL9PXLȐ w18;7ohjj2";'>cܕz4L 횶NZңMGԨ&]h;r퍊H9Z+&;(ׯSyWJsO(KE͛7(Fę3<؅Snub5(_iuR^{ԻH8o ߧ!VQ$qTQGfHMϋ/IHH"==G0ddHhٲuoԩŽ{yW24*/H2qtPV]VWTz.0S}yΞ`" .j_͕/ҲQc:}ޚtݡ =&GԪǖ#| s{K;S!UF(7{7fZʾS4g1u x)Ϝ`_JUZ-B0~>J9Tʿ%?[UU2S΢@ ֖l۶6mZpZ{ωWsrLƀcqvnή]]***XZ 3S`[,ښZXr;%IHg-$]"1xkSd2q YAm`WH묡^-ͷE G֯B\M^x ͛;^u?CMMMC߻mŔͬ,̬7FΆtb2(Cib/.++"=r9o@\m60o2D"g.!A7{+,61'Z;4xVRȣ3EQ_e4P7A_!r|EѧOnŦM;iѢ uM>~E,sb|l\{[zTFjjj\OVVVaY+2҉MM-]Ǵ44#]CV.㇤<ψ}0U5U5bnx`- *oӦdff緎MQUUE&DFF)*NY/?Ƶ.s=![&)wT6nDGꙡC#5r'K?Xre`sz<)sHdJgk;}V`ilʞGzw#l> 1~kA#eP})ɽR2zk/DłqSy[7x.7l>n_G[S@>[1N*+GomۀȔpf7CEMRR TZ54<^^Kխ1o֭;J-PPE7o17ng&}s 5kQ>+Wy[UV!"!-ʓIKpvhaop wsT4:PfN}\UsO{(7zwg/_ePTUT[ +?>a+zz_9sSr%llpuIn6*U*tj~u>5jңGgJ2Kw1ݨ\Y6m>/iPF<ZZXrl::emM-b'O_<^MvIV-][&"*[|Qԛ+J=/h@e& UVM|y%xx8_Cq튕fM ЦM}ʥ1c<;v>AZeA~~ 7c"vq?LaQj,u Fx Uӏwt [\zNorr=^{cNr_+ڵ8nJ2A<|oi_ne6:TP:.TШ@ESi/s 20 .Fa:͏R=^G:& PS:4*PbǀSzjx (O:99Co߾HשQK> | (DZìڅynBQ? | :y |lxz.W7n'Wh0yl5G.]](c&,˔e>%JoD6GLJ-(>V ;^oaD$aggäIJ`<|}مcW>+ !A;t3C @cd^v~:Nxo_~M*U]$y!k8ҨojδA#ibc'YǏ{6"VL3YAajjČn TN^][˃,+[wP)NWʜ5™=j|PJ M,_;T 6m cL7܂HVXK@@{Hd5^<^'2{#{EKCSnų-W]I&-5 w069UTFUtB{Ѹ/a1¾)?yL"!5Enôvtb٤,s@IypC-#=#[zrN8wmŮu6Ҭ(uWXm{4jԆ'c/ر F#:/ҿlMPSSWnT IDATL4 H'.&b1sFFuy”W^q_X[cf$LObhh2LiߤR) GZ3ll,:u,޴ز3>݋{˾s'MMM+Qݬ-H2ٿ?HD^49"t#Zც*V6 6;6ec'g8X4^H1+c3$LGuƭ5feȎcH{LɕpÓX'KaQ;v eܸq uuu,-Yd.uQJbɄC^@A22%wu{{>C=*ry~lI$LfGQqѺC`45IOo+!TTOdx..#"W Am#5>Ɔ O[277:uLzhGPHRMOXX8jj+}o9= @Y`qKOa(*koD,2#HM H2'f!nuM8y,7o&pumV%{ӦD"6mgxF#wo0!!~hh3t999 lܸf8wW/k '!4t5IIw9|Ҿ,'4tʁhܸΝb˞7wN8C@BCWѓe+[$$ďuqT9xN >c4НNvvyZ&q1*-?sTHʾ Dem<8&`c}Wq#~!|*[7`lwܻ{|:6gP ;ʭE6^|~ۑGعsDCYm7c!!<Ǐ^(Hvv699hkj)"wf[*U.{CGNb-!=,ߛEG[= ?jfժ@Ѻ\m[1xpΓp S-ZIP6fΜđ#ۘ8q8g/b߾ 冄Ѻu Ξώصk\e CGG}6 wQu+~/.zA50 `6PVo \cK{3sffƴnBoҤQgߡJN 7÷%ƒ)S߽ 'NSvtw4[X[[;95Wb22$mc޼ohY)$L֬^3݈>A7ꖘ\z(L{O#ꟿٳ .Lvm?m4WsZp>$e7wN:ǖ- YٻKʂK0s/j(QNqhX:w|;66/\xǏ)) oDc#> ul+11L5sD4ibO\Me߹T*!o* (wWn tus'5Az|h`;%7Y/!o@FIiZ*NUƽ'HLKTJSAxH]F|m3Tc&& 66V ۶֤ŋ]Fx{//NEխ)Lwgיִ{N z6Vf X@@C)>xΙWן+ׯǏ?voߞ,YX2 1) 0`,5jkzn8ͭ[PSS#3SqR;Ґ=L#+I_RH\OիWИdTB[SiOl=}Bq( BWXcD"l䏭5{iݺ;/=D^(~6ZȕpNla$Lkj);bӜŘ1,$m+6 +OÅؒ=r7o!+ ep2.n?Eޥ<~F#׳z3?z#RYl u65ᕓÔ)s`˖999H$y***a 5>))1CCԸ~=ta?ܐd\~TGEE+Ҽu\7#+++WrOrqo͔$}7P>"H-'c+؜qeq:Ŝ{kގL&#Xbt޾c׮XYgXhihG⽻Efysasd9L]l;f%ktNLFl-;x¾[)w w1Vn_A_BSaxzfhjjpПŅ Ο$O_}n)N-5ٷ(P֎ٷ(}]{ ՠ0=~(\cJ^nnuIzWsu<ZB۶_緎qvφ [/lٲƔ5kQjJYiiUj+MM …~!A$%r%/>|̜˭[w|'ڽG/o{? 7r-G8˽~hԥ'>A9wD9w-G9ŽogdBNy+MZ01H\uCabQTנW]Y'Ϟ"ܹ v91=M#Gڽ۹QPwOBj O~/P.!St$%q >KWv&nLڵX6lƚ5ʽs'y~'!!#\^^2ܾ}O%$$$+VWFEխzzKws >[*8VLOGSڹTs{`ipȷEQp>({A2336LqØ0!w>4|}W0s7>v ԛc퓓S9Ri@MM=9?uTøqCQnzw1ݨ\Y6m>*]qwӧϱdݺ?044(6#==uu1}U+'08Xٲrl|WA }& a`Wkf[׳0d5f< ;$)q.Cr{sZ7/ k )إ'17q@%"TIٰa+O>vZ ԇ޽sxmcEFRZ1P4yä8JTp 5:PfN}\UsgA|r"DS]o[SUh{w2q(*؅!Cr0rР\}HO "" \e-̙ʕ+accO ӃgϞӹ |'/WAZSy>}z+ꖜ|z\~~3~} WO (SeP&USETZ5 '''?oL ''6mz0p`RJìTc:Ǝɉ>GJ*R0fN4jd+_PlȯQt*PxNΝ<(իW 4')%4ʇku+;3|M/l}PxɯSA ! | S%P(LQ?(Sʂt*Py[F*"B,t*1P\R /)PC''rsH@4۷:4*PbǀStW5T|G~hʍƺ7Tu*Lt4*1 ̟t*!|5' sƇvC#eiC! Nrd9LY}7sI- 1SxGsHDC +&,m^ba>Σ4ꛚ3mHؕʐ!A;t3C @ctջr9>iY4WA}2g*&u2}@L|xwLNNFCV_"Ϟ"<8/E_WJZJ( P6|٤9z@a!9`P|{y#&bX6;Ӆ)Ikh2j''l?I7PUS߾1C&@BfJ<uDקȊЍhih~[(شo9ߺve2Y|X Bq4ki(Q6Nvsn9wRql #`KLjplE0O&n#VUq2#:Y@âqIRMOXX8jjwѨn߿??D,V3ftȨЈxrüw2h;?<eC)^KPFM970{ l?8:%n'1gN0uJjc?e.t zWl \/, كH%oZށm=ÓaSgt+zbaې:N*ϜeƌY8GG0srmW E[223H)oMj@E8iZ.+=4EXAˎMwP_X{5m7{)/^DGxy-<~&/7%%kk /ҥiٲ;fM" Td{lƬUKy,ƴ{#:l+! ޅHV*7?Qؐ) 秸O]CC@d2D5dXGUMM>\ *,MNNNYz( IypOi}4'sEؚ#Aяk@C8.celcLd2qFYAփo?,iGF ]vZύujjjdf+e&lm Kݹx" TdJʑ0u#yE@_W{w+:Z)UF=C458uBǍkA],[s!d2QTiP:.SZtFE74BM,&hlnsU=cjFB|,YY%Uq3%Ia;ԭ_nsJ,3vؔ=' )J'%YR2o {ѣjFlmcMix/_J'%%#bhhׯǓUHoصk=VVsPcR5ċ`T^fs jVו:r=Ţ1n\E=#w&gˑp<^`H DC] y1qߩbuuOPzUbj`ȆܾĪ(a -Vנ P&oUEԢw}tkPaVsyOH5T"2OX3KaQ 0u Bչo\'.& ۼHdv\uꕫ_([GcsjFR wվ3;$OղuPU4)LuZ6rĠf-^ed~ONƜgirhFTթL ғϙz)*ȯ*:Q-&ݾ}O%ӃkbYb-c @͚zTZ ܇gxxW<~=#m }ܸq۷ЫW" TdJs(R)}h\=P"t#RRINo(bup;˙2*tX-i~Qm' !'')}y9M-Xj+eS҆ȉd|^<{e}~[ZJ,0`$鯘7ab:_}gN2Vy{v%::cJᩀ-+'x~a!gvNnsUtoH5 (^)NښZ]#hNxNm ғ^sإ'17q@%a9OXMOp  +̦S^XI52xZʰ*k0O)wͯEeӧiiOUUU!}sUScrOfo+0nPbb|TIٰa+O>vZ ԇ޽|*2jժ6x2/Q_ѥXN,0[[3..4ƺ4Ę1;VaߧSr#u*hTX:w䑀@A^*TSNorr /qT^!%vdbWP wltkiYr+.I}Nڏ:4*P(& IDAT,>|x" nڷo_`SFa:Rj5+Mcv\:XS9V,Uu_Ou*hT"?^zz T4 i~PRx999Co߾HשQK> | (:!C/Q|sŧSa̧QA‡^30=g|h7>(..#\(rd9LY}73l4f]+ƍɳtoD6i3tD~M drrr070µGRnу,ٺ2P5(9oaD$aggäIo]+WR=;(cO.`f`Ȝhl[;}wn#hhaŤ?eX(-L4&6vگڵ9kө3'{(]᳧<ζKգ67jL5eUO.zV. 1MMP>Cłs(Ӟw_~ŘxQ|ySU4hF̘VD*SꆗĤN؅ѭZYܖx2Pttb vYXM >RCXX8m۶bxWD"Xb}С-.>~hLj5z25t?- M?e="VoD,^AZOT뿢̇W7b"j1ū Wnk+vK\Nd`id"7H"hbY=~hߙ^ Q&*cUl>1XSg m-@@Ӧ nysW/^;6ec'8X4Wʑd޽H~nts@/@v;Dڋg7`Or) YR)K}8w/ajYMY^O ~5 KG`bi$x}ӱ SPd ONO:nơ&}cL~]#Y!͔yd?***#}G! ;,Lqg{4jԆ'Ju.*:+B7>~CF&sg6cNJųr#)uK#~7WJfL֬Ҭ,;*{ w.Y'SGd2 Fj} 6z;v#p1Tu+6mzЯ̝;eDG_!8x9̟6F^ݘ4i\Wŕ C,,LyGu=6oW*L #30e0ϝdL2Zn*# g3u<.Q9#gy_bRۀc+6uj1lC+c3$LGuƭOH;NC]]]Hfx{F$LObhh2DD*2m|QSSwFE%dwX GϘ9 #<;2nܸ:,Y2uyc}i߬*Rebrq7ZѡYKLeCD`'ⷕqj* S'ʯС]g3q ""NzuXXLƪU FR]tuѽ{'~5~RFC>MdWTޓx܀t1*-?sTme߄ t CְxZ͡?ֲ|u ^Ehūhl݀AݹsnlJB2_"v2b\o ǺQcfĽ; vC7b۸)`bObΜ`ꢕ_'8w\# zof#VWd99 vm֡)kce0s:bJ@Wz3'pjcΦt0{&=/zU*Uƫt{NKD,[+*TѮĖ3g_f.aQK۶oߞL2TyEV3'q6&Nًط/WSM: H|9{'OGWNyMv شɟ'JӬ`%J_!;;5kkhu>?hСTCO`rYXq+(Vv4m5{,d}xO%?Ώ1Y9uSTȣ5嵄>|D$$$ ۈojF #Gd`BBPgP7r^/_Ʒv0v\G~=T<_XZ&vt[)I@nOpt5:6Wth/:YQx`5~ ÇMݺyG >MJx>co_*#VArK$ f8p4{C5t׌!|5{B>dt6]ZL {C2t,>d .GEgLѠ@M,FΡ!K׾: ')Y[jcgҎ;7o`\/og[m-phٚ'id/̙>ӺuDl9~Ϩ}dgg33C_@çiddJh״uj030l1e0&HC~-Xfg\GddH߀s8rzNE`Gddb5ܿʕu"C `ccɔ)c}'ҩS;|SczէX,.Q iR!+BpE_{O%:5ν'YP>̑ιؔ8sN-IH9߱Sh٨1s\siyHFm̛?tZ\zunbbH|| ]4hqqѣ'ddHh}sq&&&biibr~LDBQQSU%'Gľ v& p?LDk>g_G޹655qFr4{5Leߢ@zš'#}=A]CHF_'1.RMMlw'Ai43[ 78۷I%b^OUU%h7/]y yZ(R]')Uy~ԩslI s40FR"#?JN]湋)w{ժWͿ+_7et55H -kUץy=tjaۤgп>o޼ OG1j Μ.:u(tu#),bg8NZܻDe %M_b_q_C+ިDXѩ%17p}^hih? zUq#ܻ4+ {Yv[#IH$8:SHSv/^Sxre?NᔔT-022૯K~8;7eftܞ5<_]10B`c17LqYRB+b(C|m22$lti OjxXXq HԹTB[SiO8v G! TҖL'Bj[T$/\ݢ#o!.&/^ΆBO:)]!^24$iKa㬅K$<{}]=ϙ~<~F#ir^_z=F/3TU ˋ+K#"Lƀcqvnή]]***XZ 337D"}±c' ݋RWаc:EҒw1o FПo[rGHJ` zަ.e:\%%S`eɘ 6'h\_z&hkp҅B׮X̹Bd26%1buu]̛##ɸQ&w|_vv6*~|RS;,㟃EPD(,~h5({/ Ƃ[b =Fc Ep?GCAP<<̻;}wfgf-~ Y55III;w.T+gǃ|Ac*oI$&XϹSr`V\bJXXٮ)] ]]9G]UcժMԨQmm-j׮ιs~iweWٝ{@O.Ը>5?Ԭ@Jc=Uհnj\S/7R k)1+11A)9 sd2{OMPp/4q˗cjjA>ßΐ!177C*ptp*=z {nlYk?ѾoMb&1Y]qqԒH$>p#\ !1QKH3ݟ Oru+ṲQ113Yd̀v]ª`\&SٞF =&e5 cVwDFE)cXNkDWWNYpUaddȚ5[ ұ?fΜ89Ν@Vȑ01)aNo_'""2}|s ajj½{A?KvZ&IwgQʵRMbrfZ֒hCZ{oi1l,/[鿵~-ڤ5w/OF< c(ŋW C__Chkӥn̛]]9jU'" ٳFґ汖ӣLԡҦ~՚’]Y+3sV Op+r8@>VɫQ`A6qoERβżHQlp:$V,˔c `hb@ttd4Lez7@[*e嬛7ˠܽ o8P㐣G}vyemqwqc=1+l~nTߦե2שw޼h!zHɍM4 2f̜Q|Y bWv ]ݒe+ִN-k)π}rYPK ^a_ܬ *WS.0aSѱ-РA7oprjODZtF[[' HbMϪUȟ߀Qr~ڵlٲ7o")Z}8ѵk;BCdkjmOKwX|tiܒ9RMb:-:3mR^yMQn՞?kVDDFzڴӣOߢqDGǨ}رC)P ?˖gҤ)\ؘ_򢉆`-Rgc~_ү/5K\-_ж iԋ}5o{c52btF[֩}vA 鷨$E gumwYDR@F:5kV.y$it`j6 = Ʈ*1QݺW/$kBI-l:=R[ {LUbXw'/"^Ӫ9oK_TtytF,Y Aj "ThTT5 t*Ȗ/J LuK;O_THSQA^CR׀Щk =Fk|S|o SA^GhT5 t* _⽦1`Lɹ0 oO-3d yy5]s AHR$܍*=~Īܸ#8;aΜ9@ _3:g7CIJJڬ;ѺJ3ׯ~.ny+*xAcn6mÇ!g]{ѦMv- y[pycc23gI~&ZԩdOA_LA>:8t/#"(gi>C^Nill[.~>{׸cs SB϶c|hr?쳛}8DBRe׭?˔S4ޓԡ.Ü>}FaiYSǪ7 ҕӺ#%p?\花aAU :&[tnܒ!NnDWW})Y2ccĈI*dD:5rٻ#]$&dQ3IAcB'Uh/AV 9&,wjmfy=gz&lJZpDo,~P,LQDl]|?z-Fu +=>m o$#˫'$6.Ny+zϘ@:q|k䵶@ ȜOxulzy;|Νjuh\g9P(XOKp ֱ {%7>!7>ywo)gY T̚dx[A""R|&NaqvBRDEEqillJcjc8p \s?CWWyp VݻёRZeMKU)Ell@"ХK[ƍD"Q{ m6W]F||Npokzr]6OuC[[*e˫heu)@bRs6R)?5jn5+d􁣀Vf%x^#..]3ap4ht;;ڂ={)h-66~˾}GU(Ar)~:Uk0ƹ/.aӁp\UO*g輩;U(YԌ+=>u VOH௓Gft^tmҚcgs_:5lgN"5l+eGJzn` nߕK6bt `:Nf֐_Y{ qOdV嵟ٳ'qv+ѫH?U۶/j֬ʥKY~1g֬Yz^|ͱcT2thosrƒb_G\ŦM;9tD'.. jr#<_#|qP ]Վ?cみ28|`H$<]303w8Vŋؽ{{bݺmM3L]ʉZ冗zBBѬHLL$1) }]=r=PUzH>?Wi\Ίcv7'W lDZc?ֱ.eRĸ0f/[baϟi\7LR,Z֭2m81c꺈Om!>y Q0-GbR29n#&dԬX^Ҥ%W͉c/f Euo8n\e~/~7\ʹSll6luM6`ڴ;w=Uk;8ӥKwtttӛ Qn3'gTh׮ S{7R9(m˖-EuH#8xͻ}S]!ϞAİݸq?kH;+>GtrL1P>ު6hߠ)++ Ŋ0{i>޾:$^zuZe?=Wk0ooԮ->ӧz{{R- s\ ֺ 3B)s ^yʿ<8q8G@E2)A=VHθ7Z-wJHY +6m,YoYCcݽ|X7vk)fOv)Vf8770< 5smm2vʕ+ƍ;H166ذa;.\}.~ 11^ի(cm 7-[|Ÿ22!H^"w?&+Klݻw9;ũVyuTNfP B頷JsN+Z LӔTՐ x=V|LӫڣG!QZ#˰U[@3Ąn-4uGolXJZ8ϣũg_Ѻ"FTN(H012śV.J̛Lcݕ(aFf?кuwkQnMZlIL or썫옵iM #Z֖V٩N;/R0+ڨ+R/^iuqS?zf߇Hݶ_57CCY +KA8T*o͇ա:4ޤ璺 \[Q(5…ٻw3'(RxkRLM)Uĉ#qpgM012JaϟѲ6c!<}8f'!6>E3LG|vtt)NMF$ WguqL 3-cϩlbڼ~#|4.H}Im ISffq@K+mى_?GTN?wm @cb03JDW&+(Z >Z P(s2%,5 d2w2eդ-Wȭ[)Oßΐ!177C*p?M mS UAcfhYN?R珩OU/_0&ZܦP( {ѓ15.ģO8}͏&5ehM`Q+WTק]|=K@*=z {nlYk?>AHb;Ŏ`e~ Ͽ#hU7kȎvY\(\ؘWTGTGtttT:cK[+G@7䩆V.nj!*&p2&I 'B?v=PKy܇gN/֓c'<"ɩU o޽n=ZE#O뎸m]CXgOBXll\.o_']VVl޼jԞ9sbbRbLqwLd;8B _u""-ӧ-vYaYԭ[ŋ%WL#X乁q^2ƹF-N?gɝ};w͌5@1{t1MzM+{,\U022d͚}q R8~,/߾Tq 2:J(qKXE2"ۉV-L_̙'ܹʕ9?s ajj½{A?Kv-sY0j"c*8zk.vY\[bndӦܽJR[XūaŲe00ѱ6]'!!>}f w䎗T7xeJŕ)OiܦMX|tiܒ9)WncQ +U(\1HJJe|޼e)6LyY c!11 \y&˰iԦ4i 2ݺu^=Tʊs6m>Vm"~FSm9O<%_>}ʔf4k [m7uĬ)cѻu74Sڤo߿eKgqv@~4NԞo#M&L)sqtlK4hP~ RX鵍g@Sz>@-oZZݼ(hPJelkri4%qrjODgIwqMlś7-Z>}ڵO2'94xר.ݵ׹ſL&=Ds,Յ{iܸ3rڴiFӦ#{}tw&::'A*d;9s1| 3[`-Rģgc~_ү/}\-?)) ӻwWuU_&Fȑ#U}k:>u vmc'y**.'鷦яX*4X1SWst:kַ5KGus4:~[[5Vpnp]R1Y/^ѪUcJR Ny:5D,| S5ij4ZdI:&d.t*ȋ|SQA^DR׀Щk@݈F/@ @ h'M5tpp1O[nu*4*kX*:| hVou5Kv!ǰ7~.|qU|; N_bk#{?},o2FMfxv㻧1ݲwvœ9Ks#ϋf틕5u1LyGgq [|v0<$J0|bn:N`$ Ke\T.S.[4! m]牎̜ަBu{w1s Zvd{}t =7p)^FDPҚ}R]Vt,d7g_a]ܸW,=)ͷ 5'$`:͋טS$`@/]>;RhG ]16,H?TŨ a'ݧ rБ~۹JB|+kVtc@scb*M-䞿`:v=([’kwezr9u1'ǣ#A䓣P[F*).ݾxyYbSLyhԨFt:R-x sؔu yeɣD{K9R,@P~ߟl=0c&nY}fHLAV3+!>ent,`s_]:æ[:VGbRs6R)?5jnBf|"СU>y}/_GRN eC(Uʒ(?MivH;Xg ɖqx9ɋW԰]|b *`O J\Xź_g0c^'3k/,^MN't =7xF%Y1~:3i;up7 \F?v<>/L>TuD>V; [?z_XsEы7_r1tq1t;9 BbwmVcώ͜?qHIN8r ^hs?6+f%ԮXF52oXdĜMęxop9XttfxX\GƠ9SHR$ekZ޿bРiӔfϞMtD+}MxwobC[-X́xzB.1`X>ܹK9q—UZOH;}o$&&v}~wn(kcu8zDbƚ=;8trM/&gG{zzc``ۘ;w ^Y`N^=g_!(,Hip- 8y[yVΟix TS<ux*WUWikQ,Ujk8 ;oN ؍v3Μߛ_ʈ~tn%{f+U96V= v-!e-4*Ҹ#ffX[ѣ i}%eʂ{bF H_vZ`:*w)ELL,[ٿ܈77jn^"ޞT-ki87`bdDǚPҚ =*{3iQ\crL\}ɒ%pqܿk=4`N^=lDpX$%)ӭ/6(ϘX<e֐__>SMӬPRoe˖A:^E >{h;6|ӧbr=Gժv;G^]XbϞ ~o1i(bcذa;hڴӦܹK_ԩcS.]M3Y |V˲Xq.ZKdTG/2y"JQ\9{*;f-rL(}x5DB!CKJW!öjPD"|<~pWN$Sb6mmm٪@.GDFV>~e)t S{ )IAip/z!>!*eSP[[[2*vu Wn:NC?ӸU͚@qtEݺ5iٲ1&&2ݧ ˫jֆg{|ge\zW"ccSGBZR.agm* GObr7 ꊖDMIk:^F5ŮbLx:j4u_]ߕ7oC52{}gNdʖ^3-Q!:_ŸΐȨ\Mjz*e؈Ol۽ۇ/_{F*T|mpZ9ޏapuK;燱::RT@P#Y3偶D"z*ܽ@%ORQAg oYs,d::Z Cʬޖnƺe9u3cY% WguqLiBBBP(k$ wf;OP%R)qqt2-Pi1X-OάɁkiQ:kJ^$xF!㘜ushNfW2}WkMIk~jfmXkKБnz:J{NLL{NޚZT<ٵkZ?vjs޽{]yjժƹs~?Gjy@!AcHb;Ŏ`eNWzX-LGKP(ݹI6/LW2ͫ5kq~ֹШdܹ2'[Pp%dLK !5DSѾ-~ T+gǃ|Ac"H[ɞࢵʿvԭTbjix S3tRabb"RF?zAg iyH> &!QN UmAaTٻw3eZe*155  gȐޘ!J Y0G& GO.Ը>5?ԬܧNفMŲ\YrG=?IDl\%)#> GA/\ؘW"T=(mj-پݝ}0}|ըQ8VDU֢v;秲CLKi/( Qu|Y |rk8s9s W-e:4ht.NgZv=nyDԖ}=cBʖӺ#n[pY>be? O@r#ߏpXˎcy{gO̭J4|ven\8Y7o:OڹOѤ[ˍgy(ٓz+X0 |:y!7w$Aoۙ[Y乁Q<W@V*O.N~ꘙNrf՜q'!Lv_LdTrpA# sr򺯈wX,wkU3'y&$EŽ),^osΜHpcJt&<~a>>qwL01)aNM?-ӧWՕӽ{G.\fVBB4*{<o}NSFSDIzhQcX1j4=teS3g)p Vܘ% =Ǔϔ6Z-~^ w'=}!ACfZ֕Gynk$YFQW$%%a4BVر{k {ʵk7];y\.o_']Ʊc?i}䧈AxHupXKQDI]\iQ7q N͏Q]z1;G IDATkož?J,?ƹIIIϛw,ņ)s1/RTŦ@>VɫQ`4|UifƔNH$iCǐ W޽}erLY"BltfP hKu}t47,HMղ汎Uޞ6es?z>GөKD0pɯ7nֆz!I"Ֆ|T[' ٥'wӳU{>䴩א&]SqMlś7-Z>}ڵO2ܧ NNy6-ٹ%7zR)+VaڴZ 5jd„L2GǶo@uh޼FϬFp 3C=uhOTuԞ7J :9ϒs޹pR^0c-=ҥqK'34:3mR^yMQn՞?TګF|_&j9jtzu޽`76mѴt)]ڊe~6M5vrtK.aoo-TIY6v07o")_ 6-,~,> *ܠg&c~_ү/5KvERC6S/#fYz#3rHmyII$AV}l*cPr!NF֨ g4::Hf%ܾ};NVcVF[AU%&:[u׺jJjaC=-Q11ݻiYA$}RTRA^#R =өt 45x-Y$[:E>֩Ш /"bk@T5nK@ @ 4'uK&O @ r@ Ft@  ;^llr@ _.^V ȋh8kAW9FF/@ rӺutyxx|ao̹pBn dxE@ <+ ,YD<|sh񊍍I?@ EW\\\N!@ ,⭆@ @È@ #FpvիW4nܘ7o+AG㩆}:(;dmcNE΢i=F\yQyħ/ ~~~iϛ7{sΔ,YIM\\-[pGr?nݺѹsgڵks'9guOQվjv"ȄNdzSuePW K!&)h׮T٦-y;::fK>d*#ig&_|5 D# oOx= ++GUYJ7UQ_D]|I5wu7Pr---d2Y D͚5 իW5 ;;;^x… uFFFtڕ兡!#FEuEGG~zΞ=KTT9SS4}D"Isc߾}^Z-,,޽{eLMM4hUVDEEP(6l*ToooDGGƍ3xO,Ouz p- qrr,_񲲲Ν; rJE]<ჍG\yQyMS^̙3,ZCCC9ζm9s&ܹ\]]?+sϲeȟ??7ndԩ\2ˣX5ݝlll^#144L4͛7chh?YwwwJ(ALL Y15!!!bbbŽ;f@=Y;w]2!uDE]|Rk" "oI|-ϱcTmڴЪU+ ]6DEEqM\]]rzɵk2-/###˞={ :Kǥ?666$%%qbעE ?ժUxRfLGPp]ɗ/ʕ˒JLƍڵKY=z`@Y'OPXE O؈y5wu7$>5gϞ* rx%zzz@"EԖQ~^B"(r^z@֭7nC ʕ+$&&Rvmcc4?NxxZ&OݻYp!VVVtt}J$&&ٞT+ZhyG&i~c23At֍#Ggutt._ <uePWlD]<;hr ===LLLPBDGG|={0o*333|}}i֬4k׮?u֥nݺsaN_~ۢE۷DFF<(OuMTTׯ_;Ermutu QhueФ%"}$vkdrБɰ*[݇WHgҠb֪hK(ӆ kT?mH߼!}DW/DM2 qMD] r6))8mR-?'ZxqlmmqwwgĈİyOH"ԩS 0bLLLʕ+ԫWmmOʷUVڵǏ3hР4>#Kf޽|zahh?O<ӧ!(X $C?5kƢEU+W&22իWcaaA5^QbEvA>}HJJbΝtx4ʖ@-"dr]ё)ecG>t+ @1s+)Ӈ=~% ƮymFi{)*\$yyx(>^}zҢRQa+'))yX?6:w4.lDKjЊsdTЈ 2NV"󐘘@טYXcTZ;C{wNأ5gʂP͟<{1)jN^#$Khii1Rik/:x|55aиU&`hTJQf,յ&6_ͅAX=i;܉<n/"}$^H:߯cVŠu*5kם~4ҶT?Vuu rv_IORFܲ,?DtZ0eFllRu!;b< hqRz(Iܳ)F|̭xٓG8oA.r2S[L{bcc*S=camc4Oݻٽ{ʶqѬY3iL… 駟022SN\v_G?an/BDD RJ y*իPŋOM6XPX1f͚Q̟86nȣGԔiӦ)OaÆűn:Ύٳg+GL< 2d pttӟ|rvvo6;IW6Kib!/7X4m8ql$Ͻq Kg\WWFK[GwiL-َ~\=w2_dtv{du, -ZF*}xImؙpu =L?WΟ$[/Rv S؄%ʹyF6'}D&KzM u5ōg0V^7?h 1ų0N٭rۨ v%^=ؤ( ,K۪AN3Ȟ;MF,Slw虫1JؓVC~QERz<ɻs/ft=iXr2SrvY5υ+N|3ШPƜ9s2:J&ĄOyvUϯt,姯|WLSNpj*fffiָi⏵uSGi޼y.\ٳglkӦM@44lWRb"kN&:=͔.ju۰5;DT 3 kMki{ kSOo]=fn:Nצ}m ?Rn \/gM_{'!>.BA̛4GY}GMC"IgaPмc/n_OUG$ EgNSn?s|uf~S yLF*)"Ѿ7զɉ]k4H:VIl^U\UƫTw4SEf1ܾvP\ ֯_?^rqsc ;^Yi<&;{ }ɋam쪥c855~~̂rv?˷/Ibb#Tr}a-\8u(|4ȩG9wаeg .s6 mo]a2W\ԑ]|c_886G&M\߫bcRԜ BSՠE>l\2C;no9pyKdh1scϷrhzБzBxH07Q_9p 6U?BiJ_|Ndk\\\h۶-#Ft?RұcGV^/@1!>4޾F+Je)^?vD֚|`PR*?2ha-$%&r9Vp:2r>=[wʡm_S/_?^C=MJOzOFmhT`߇ؘ(Ô[eS +峜8/%O'ҠN~>:I^#yNrύD{ӔkxESH~4j-ĿASXǹq)]N"%m(icp)톍KYNmϐ 6wn^ƕT*kடt8qmN6pB2o 6G@G899ѣ|:u? 13^<64c6v{VK<ɳ\;iUĹtC.Q>xJ;^qovVܱ.[pm<W.d[3~n:=wsW_}lިg7TD=y<9UZ7_ܼ8o}'㉌-_OTC靿Ϟ>λju71qg]^< rl (dRA^O|@xJe[SBK\w7:}[i,qu-E@@sk',\B`$ ҥILLR/߻(ÇE Y=#RRR İa8pkUWe<*׭旂2-m`Gws~M! h֦;j|NڨB@JUsq|l>5`aiɳOst3|v1giܹ3yQQ1v(uWamdT,Z¢Ea ڛH֮Cqu-EjS݋Pwɒ0?Oc„@ٸq7+81(_i_gFx,x,]E`OS9_SsCٱ~9+RY+5Ό{G-HF;an!s"&tfۚرȈoR}v>6-">&S2x #Q;lӆw;<}J 7lyˢclWo6I&8>{HMIROަy@/L>CeU`ڂ 2~nH׬.5%v >6 wJ FuH5d23+oz8~YZZZS͏ggKN߬m_agUٗydjh.dW`**[}EOBի2{83cƎE\\椧ET@LLhr-;eGәeUi™/.a#ORЬMIKScƝȌ2Z|U˗ϟsi_N)ccbcSj xI7L9z>V*(r,tM@^ 8}Cm8r9QiZn#ZuG ]Bu{rd}033{O7onӸʼnʕ B^T*VJ>Itt,*yaaQjf+q7l:vm=\|ڵann%^`ꏦ S~h: AhrN菴OAP]١˘8O{$Pcvoz II8*CU?MU˷A=pyJ+{{`[5IMIj>3-[™6;>}kRj\3`@WBC73jt _JtgϞa.Dbf8;;2xpw,-3Fׯ#7J?j&OxlҭJ?4vosBo}2ƺU*ք {d╞ΔA=Z۟9kv`k@;?qU{e7g$'vNFaݮRUAPPϸ~e#l߿Ke]sBaE-h߾ūUV3^B0hdܜ]8zR?#냝ޕX:c";/94d׺ {}(Sd;۹]'g-CYܾy_Q{4ٔvuf%$%0rLCV_ʉ Sh qnS^O/;rN藴OAIDsI1v?bnr#s8|J++VV i׍.h\/fffLa [Ci"nq [GOݴ^O @v]ٵ'Nm:yڸ&ێBi 蓑L6i=].Motќw" Ҋ1$!LMxI?g<˱mf~'sZ##%]k÷cW҆F~hՠ _\ȶh۰)ёP(q~OyײkZO%8`( TSP꿧:J-orD?|jw%w>z,?.̽goX[+ptΚ ʽ|U\V gZ@}!sxȱxUNB z]"l66lJ'SILN.>baiEVY;n^LYjLB.|tn#ߥN:on K\rNϾa΢QՠŊ|II)$%&8]S% !:w(~;.U[6n:]훔/㆟/ 7Rd:4-חϙƟW.Hғ^£Q7spFϔ46$z7ֵQؽ>Ȉ{m^?&I)'ŊMkzܔ(C>XUUK7BnB! ݳS;|B.5U*2g~ؕ[ yⰺ`i 59c|pŋVs˘9!bDpxǦlm'OW(S<゗cϢIYR ٕ:4hR_.3}0^@#+AfطkmN:e*7effd9O\v-ϕ4ndIBm۶ѢEyx 5@'*>S+T0t 9CW&geA˾(88U09E!Juȟ WpItH.!BUQpP!B!ȝ !B**ݽ0 B!x)y>Et gϞB!0R !DI%B!$(:JNNe=Ba`NnhH%׮q ]E!:^ 7E%f醮B!Bebc|C!B!І>rf%] : uu !B!Жs{1wMC: poC!B!EB!B?pHIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/bank/images/roots.png000066400000000000000000001051071475757676000240720ustar00rootroot00000000000000PNG  IHDR %iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|NLMM B!N6gE,!$=,OBfEp8IIl6,as@pAu3 2O}FM`_Wfa6UĻ7ҟ!nqw­ԯFLg}V޽o41ݤP_ |Lg{x`tު֦KB'O){󾾱媫*Yd>?Ŝ%ټtڥK/tDW KQvM)m%tit'q ?+$oâ^H=}n?:EwX4Ё\G N w0 Ear*0]XaFOwr^4_\&z_ߔU/%|s?&`q۲bKk4 Q:Đ[9/[[ ' 4?GjjYy%6]=px}Dr̉DԯlLtVCmLM0vN5 infdI i֋.1IPWc~Ool쭼qd]-Nkni~mݍ|pc6rE ?/vVc)_9[|0y7|ץx,MFDKTt@!Dq kOoD ySlABQl((ݐ)Yu CiU5,)BrZ'7忨0A˰ܿ.e(yO[ͰƔN9L37AdxwZ*|KQD[#= JP=Nq6y }XuU3U?k.BHF'a@S]yBhv7چ&NIy5Z@Wrk^Z" `N>ct/E9*c$#0Ш/mCAy.^t#ð Ql6S+u/SE?Ӊ$]dmOz 4}rKBgiMm#"1o5{+5k̞%飮e*giR/E}݇|\K\0LYQ~ჍٝZ}*ꪊgbIŸwYTƫS Qb{Bz0C/y[H۪# 96dk:rUu/J޼_3\!&b?\6&49F<-׃xGh4.)s|8eY !?GavvcSK{;^΋v6! GӰVNo<t;GqU6kğIYOne҂'4~rk7̠RZÍKH_! ]f3>FnJԴd0*Z:ڗhu:+ۯ~:N,ܖb+9? 񤏩'\R#v~8u)#qٜ?LʢeX3tǥ(KqlrɛI胟5NGzj>ܵG="f?k(+7ܼU\c,˝pJa۔{4(%]|𼩹-iٳ S>:D6Jp8+] !w]\?:ڗh뵵i'qۄ<?皗`Iׂ/Ou7{I0KMs)󒷬6E9NfFzl6幍{V}c,OKhE1&e7Q8vё%b!y9~Z, lLl& K_3~Я/(+mRʫ.=&6!n%'Kp2+!BKKCEQRQVx3Fl6GhTIP2TѾD[ә?*nG yZfòa|u6.II@򓸄LMM !t |aLxˎˀ9~I'~I'~I'~I]]`Dz ,ХӚ5k~w5]?. FGp 5!? $OMMMCCn.dYYa>>>DINNa!!!0hAn'9souttTVV0lRvXYYI,Xеr>\zȲ`MBMooo âܻwN8bb"COF^^844=h|@):駟233UTTWPP }Νr'OK6--4 7Q5-,,l2ww!CX,VPPaǏWRRl tԩ޽~I.k``okkk322:ts"'陘\pSϞ= -(lrrrL&'NBMv &̘1#==]NNp¢s &hBkr\OO%K|"a ƾ}M.tĉ={s"O6zhSSS úOOOF\~veffhѢF>>>FFF CMM?$~ݲeˀBN"J?ND#"&//K]]]II955+RTT4}t---{QUh#G`'8p;R#"""''xhBBVZEɓNNN*** cС[limm%WHJJ;vܶmH cĈ/^hR2?C'##̤bz~tŷ;r ,0lʔ)---,4?q…)S%-jnn>}zBBkWWׅ >{F:GGG*mE&EEE<;vl||0rȜj Ekkii_wKKKRSS z-Bm۶m߾UUUgիױce˖EFFr8+W?oM0ɓ'^^^˗/񑑑9x #F8qbvvgZZX捏_rNbb2^hccC{6|16C&N[ZZ#""N>O*Fi x wU|6mڄaB<):uRss3Z؈X,+++aII yb2#:m+TfjGdooo$;;˗YYY,Zdd$KԎ>|!n:rs???Н;wDIt+''?~xСCȿ޼y!dddTUU{xx 6mڄ888hׯ_ f.;v qE,%%% Pz99>2d:$ِ)^-88UWW3L ölB\E/L\\\CCCG uxRKK˥K<<)) Љ/Xme} -#J&жp ߏ7bccD߳GFF^^w8~%ǽ(2:::įǏ0`@LL̴itttn߾iN fΜ9sLrq- ʣF:s挂?X]]-QiAAAEE 1; pTUUɷ555dWbijj%;vhnnNHH3f QIeT Mb*++u.!u5>~hjj:f̘K.H&^͛7|/+ 5cƌ3f߽{7>>_WaʕgΜa2|9Z@JMLLrss?~i$^cc)SuVu֭[GbL766oܵk/uļyBCCSRRߩ%_$'++ѣW)!-Z$Ӿ}ݧOiӦmܸА\իk׮hkk\^^w5:~E._|)ghhhaai[!HYXbݭ6666lpssJ4v^zR*l߾z޽Gmoo755Zd u?^VV ***""B0+\,?!ѣG cccCDX@\;Np:"$$D^^믿]%cccFr| `jjj~tG\UVm޼ŋFFFjY6 HJJ0a¼ybbb`5%g|8q℧gzz__|eǻoٳg=Y6 e)l; 1O>>)YYY.]w-,,H5?_|jܹzj55{`J' L:BL~I' |a#yyyccϟЭ}ϣ*--9rW_}b򕖖RSS {-Zt)ɴB]v~2d/"И4i˗/k׮9RRRRbooojjٳ7ojjj\paر/^ rΨ1bĈ~UUU{zz^~ɩpΎqAQAZZZ믈_~_a߂޾}{KvAIPSSK<*>6m0'.;j(Е+Wx3uT%%f|4 >/aXeܰblmm FMM ^RXXim܌;RZZ&JX|9Q%++bEFFlDÇB֭#7CݹsS5eeegpBr۷o444TVVjkk3'O~^^㛚j>TVV6lh5E|Æ D!ݻw}r5k Xf ϱcph%99>2d:@V #ZZpp0ǫf2qpph_&>>qqq 6_9 aÆ{M2e̘1miit钇sb֯_(**FEE $<~iiiJ[A٤VK2U``w455nʷ6oWVV&K8YYYL&SAA!<<|᪪4ի۷oommSme} -#J&ж;w߿ˋ*))0lɗ/_F-\P2B |333jvUH;*looW wht:^(++5̙3ΝzU(((#22w{쉉߶mՅ@֯_a{{$E8NbbjqqqMM UjlldXDɎ;ȋ}. J[ILeeΉE l2553f̥K BCCj~{={vFF Khkk1SMibH4VuuuǏ=Gyzz4hժUcO\{n||ᑛߵS'-^xÆ GNNN$xj<}M|m_z RRRț-2BelW"""hϟr<~PXXXbNɓ'ݣ Őf۷o?i+Wܹ3;;UQQQ?~|LL̒%K=vA3$.;wܝ;w?ŋ|y'd9k׮*9sFFFۛ\X,^?566F]r(+%%%*֒Sѳ455===E7"j==$$$X[[EJT^lٸq6l?C\###tztt4jGr>҅bH3wު*%%%[[O?… cbbrss]\\ˉ+WlrMeNxYD_w۾}{llzxx8C.Y،***b2ZZZBwppK^quu3gNll/$]]]tȸ/N6J=#G F;q℥9slmm 6E-,,6f̘qYYYq8gϞS?)](4s#\v"nW01o<Pgg甔#tFKOOOMM5774iIx+=qOǏ'I~YY"o>gffo߾>}L6mƍ:vvvW^]vm||} }R.]t޽ׯ[XX|jp|~sի DFFFFF2XZZx< {"&? $O)_(++0G?:](swP_SSu=en&' <@[[[+++i4ڂ zE{#|1c /O^3gKTUU%ܹs\.w=[Kz}zEz$++ۅ_:{sO441/nRqOOOF./-- d0#Fx`ۓ'O:990CnٲHx)SUTT&LPPP ۷/`2|߽{W[[[NNNWW7((ٳg"ollstt$~mnnVPP0رcD޽{1 ;t.L üx***BIIIcǎՕa2۶mY%Xe{7?>aB\.w׮]fff -jll/q{4qi#.T/55i& xdРA|{QVVIԩSl5kp\xzzn޼222K=<<B6mjÆ Dٳg#zwY!e|3//OVVvMMMDÇ*++6L?B+h4^p444Mܭ&:R"tׇF[\!tFspph_&SSS#,Xt>>hyyyRqÇ766%, !d``@) |rNVV&" KJJX,[[[!@Ղy<^uu50-@7'..#߆>I<)88ʕ+MMMO>~СbFl#QG#$ p8כ뎧ܭ_^II /QTTۗӃu}A++w%&&i]]]eee}}ɓ1Q\\蘞~ر˗*z;R q\<::ZUUuӦM7ovrrFh'n ,+˗/kkkԈIf0|eeeݻwB...Be000*=e˖>E7Dw`0BBBvq}1τXB{]]NWWW'WPVV&KRN} -%]:&>|pUUUv۷eSKKKkkkA;?*$)'11Mw/M޼y߻t/s"kkk1B\ܮ\ryyybꚔښfnn%xt̘1.]*...(((** UQQh3f̘1cF}}ݻwW\|1_t:h~T Z\\\SSCvY,fLPee;ƌC|: Zj{rr2YNG\ p Xn޼Y]]-Y<Ϯ~:0??H>[,F:y)J)))xJ{MMMLL Œ>9Iϟr<~PXXFSQQ?~|LL̒%Kn >dIIILMvNPvv6߻#|W^{!+Wܹsgvv&bĥ9H~=zD.yADDB GٵkWUUUG]9sFFF[1f͚ڸq#bK,xRIӣ.NN-ڹsrss cͨ+DSOO |*Fr &zBHQQ;OhĈs{pp0Bh, /ijjŸa%gggijjzzz%@uS.\R^^NqiROׯݸqcҥ&&&FFF***/_x^^^| QQQEEEL&ext *8;;/^xǎSNUTTpB^^ҥKbaaacƌ7nyYJJ!lۑ222...ΝC$ĤFuKvhs]v`0tFKOOOMM5774iRwC0`@uuz?OEwWW9sZXXbv]]]H4!d2ۗXQQr8@xqqq999/^6m߫&%`޼y )))tĥ9H$ww9s(**fee%$$3رc񲲲bťʤo߾&&&G_0 JNN^Yfݿ?(((//oǎ|̙3wݩ{bkkWhcc#eGv'z hQQQ<{nݺ%4g[~Mׯo۶-!!ASStR0۱c\tt'_B-011s玲ݻlllɕ^jgg,+99Yerbgg/^qRnvO<1>Fzz:".lժU7o~⅑Q3(|NJJ0a¼ybbbMP!t OOOo$4 ˎwﻝ={v=/ [("Aﶒ=}_]gee]t޽{ׯ_s~еܹsg :`N'>Bj| vTSWdB w$Bg B."v'tdydv< ʅCdi$5lc#ɻ\$X#q0lxt{}ݺ*jIЎ+I<#ߓSqƟDE`&|: t@SJF[iDs*wmdcwoz`:p>'"2Y +Xr.IK}8~zxDܱѳ՟?Mn7oz{kwvߵs<8Xzr=ywHsYv77Ý;ƻ8N˕d{ v6YOib99n?,&Dyz| F'jqqB;q]O4i`H:sg杷sb?gpuu͛=q<sVӧ;vcm%rQO}]^9I0=4+Ȱa}? ߲]Ywlv8|ذ(L;o4%RBvt*fX#wo671{„mO7OR_iGVpĊj׭x!p@ ޕo47_zbI[׋˛j%L(Jٖڗ.=?{iK [̬|„*:FG-Ud3Ӂ;dg\̯ܰDIPQ&&ܞ,g'^I3XK,v{ܟ:O`bL2%%uB֮nkkknWjK$%奣 {n,vw7"nF6|+B&*F6 -L轞W]Ħ׍".0Tdkllc:|v3WM C}*ȟ`Н ĕ\r5>Oә@]wJ^wxOʭi=ۚ]hi) z2hX@(|i&C"*<!~ IB55! 0ږ(Rokj*zzࢮ[ߌ7볂]$6oFG,ܿ_~~EG!? IO?ML,;?!!}cϟט+3n#oG  P'JBȭ>}WQ`dP[ T_7 rsQ ߴCݸ,Tf^x4HPw˚xHUUZoΓQAA!B(%UZ?#FJJz.++\\]F~z%Os:{F[%D@]7]>rţ&NK99ھIJvWY@(|i&C"*neKL #i\v$8xSb\u4HP%%Y .R1&Gd%--o8I. $G|ߍMo9lal6ofoNWntJl.wxLUU!$xUT4RU'zBY It|ۑ&cki)hصO+/opw3yf㡔WRHGv _w|9ԹMK ;&GoZ9w%KE˼{[";K]}L.Oy94B(f߃EF͵NH04g5N^b.@GH0lIP9 ܚfr6"$ZAA/ࢨꌜ7YYrR1P[[9"񤸸-;w۹Qҫvs3;7z490%`23H B|>::ʂ;oϏ+|J˱c [[9T^d[%7Uvb4|ׯ /E ɫWu|Z̿x J8b/9%B4|B~_}ej`:pI_ͮowJoO FE_j|洛QR}N@U]AvzhUZRW".Ă6]+!1  q<3}m\99䶷swlgoBGuutz|Y++x*t ǃnnnFo R^3mdONnTvkiG&"ps5F˗_ؾn^rn;E2yhޘ22Pk_ 4PlT}!Jce#=:; #HQ}++m(81#sHpuͷ-le򵠣͍ xʟnj ||oѵǍ7BB/\8RKKnL6ryK ҡ98K'M0l)ݽ>[;SYY\-ރi݄r!t hםpx׹Cxŋc-:= yXc "B/H4#@#εUb.'AJEǏZZރ׋ TUwl'lG{ZEII/QTh*GPMMaj'8ݻ.ڕ>֍!H'u}~B()}*mhh53cnާ}?`jg޷nv3ΝRɖo,ޱţr?}:}CIK+ٶ펔>yR6}^\Fts3zpHx.wF DzIRII]Q{ ivݩo$KH/,`64CO:[\\ki=a€?I2e7nr8#=@,Vyh;?h.'AJEƶKL,kYN^Njج9s<믧<2epyy_F#o*7ήۥ::ʁCeda DK4e=uFo%%u=˜@'QO$#Gsyy RRݿ?""1BWOOE ->9h٢ КRǍ?Ƒ^CrF<~ѐ!}/5{qcE~ԩxoOq)3\))Fh11]$%mtנwPF1cedw#dǍ?/k~H{V'"bDxcLB;ByjBe#H`.CFev-]veÆ--..;OOB _X$v }GEq=lҋŎb{%4cԘfi71$${ EE`DEEEQH{X(~?dz;{登3={V-Bow&Mj=bWXigzQ77ѸW&xL&[(}?\y>>/{9rɓ_hN2puf- +{-fiHiLtzu#lذJxA9IAQm?@U0->fD'N1X988$$$P/OĜe3jȻsz &;+fDPߤ[[[S/iLIouY"f̈́Ν;zBXYY߷{WssswWIOOo͕VX]]OOɩC-[TSS)Ixmmmv/iL]Å 5q?xϪFVK}IU1"//oՏ-|̙/rC ={vjjOpqqqϞ=ue˖nݺ=jΚ5ڵkk׮kZ4rAB2mX*:ţǹuu-ܹ`_S55m#'.]mzmPD[M-*iBɟmڏY%w2VD]jdeتeA ̨* 0`˖-zXйsmV&۷СCsqssquuMHH}%%%BBbbb-Z}o_,X@MMmܹ2^^^eee'NH$^^^l$|&k驮~ƍLڑtW<{UVZJҮGSk;3F3c{3?H$ݼ~ʩM-l\RQQ<@xTˇ*qV>Ͽc~z}8-ӏ\7]JlTΝ;ٳ'1mٲtĈEEE9155mѢŋ_.#,111...~~~7nHKKB$%%>Ge2";_cւсZ۶ !z10^!!88186d[v5]k?c:RX%ד.=F)1sr_u"!b!.7iڭKAJ542G֬R!Dž} {~QSu}rmڮgR.$Y(ٓ;W&%ܚ3uMMNj.} y}}:{ {c]N ?YTomݔ}`SJ-mtwug<޻Mw>Æ]WکSewJ\ۏ{ޫy_9v]ک3yyF-|G0+w_ǎ94;+uziӦ-Z~3gӦMrLKKKwww---QAA*OE111 6|_)G$YY#4lؠn [CI;Ώjdir@_5vOVJ73Yбu"b?֮ӕɚv목 3[ߕ9]ƩmT=bwʱGzU!T^iobl}Cf e7_=vhWLYqqYXtvR'~<9o(k%Ƶ4[YWO?۴ȤM^Z:'ܰS'"}@*Uo̪}y9FJ>Zڥ]!Iŕt.?Ͽ􁝕 Xs& e&y9qG.Ac&Z /sϹkȈ$T~ Q^Vѽ[$׼WUk2S.ǝTAYWWLbݯoAf{ɀ/pi|ty:FNm|teݟx0rO۸+kF1s/?z֍fj֬oddÇ۶m[B|7ZZZkgg'8qDvv3g˽LMMO8 sRIIINNȈ9I!vz !Y9;e]jؓ[C-;uVNV[b۲nVSOE]'z2#!D G֮k;r*eK54"-1cHΞ>>_FEEuIE__СC999]t;J-Xf|l oO2d?9I!b !7chv{ՖT}I5ut4xFԴҔ!%Mo*.Jzfvؠ_^`k:ټ!{YE[:(/MO(B(~Yx;_ad\Ͳ3oOcj5LlTdAc&tJe˖NNN婩111VVV֬YHtիW%I͟`!DyyyAAAJJJJJJEEEӦM?S.MNB9F !6;{Ps=(/O9),,)*FΊPd !3GWr2sT)ShizYf-ܨuw/05rvAMuҐCNMK !Z鬣wdWGO*ˉ?qrJE]lZ௹3oLUwO||tj`q?~~7 *_u ==Rb.=޵sUM.vfVl%SLL$59hР7oV~XSSSEHREFF*ԢEWsҭ[kaaѳgώ;z{{K7r];JK\-W×Nd_Y[ !,2.&_WFJsXLuw4╙)iRF~SE];{,n!|j9BG;^αIڥNWv%%'릙7qZN\^V\yd]d(3iđ=2/UqUѸ}'&*=l%Q yq۶ !zLyy-**A{B\H>eb15Cqh*0lŢY !ώ7zy]CS3loKtֵg߃>zpS(jߥs+**'GFl;gD*m1@u%!㧾ϜQesBӱQ)Q>$' !W/_aƄTY[^VZ'bw]M"1JE+ӻ9OiٿD*=isJ}'),T\ ̜cϟ7Iؓi֮U yUkv-J{m'6^~a$}3JߝXLu<_<0z݆?MlOCK‘)m==| VՄmjk+JVyA:ԢcBl$?}lY?|ݫcKg㏚ZXni^Υw~#wn^5sݴO;x5{ձ[s kcv6o8JQf6.ZIC-WXX^L?~Un=ȸS@ ͠_ ~H~_cKmXd7WFe%%Wf]Q7#O"ne[z¹MO(/ߩ;4 ~LġUKK.YY>x:@{ w98xJs_35qk+ʿYY6nqG\ڷB]̖m7n֕\;px۩XLu]ޞhtbsȩe l:ʐRuj KسOTTYZ֏$5h"8\fb.oss֑ԫ3?ծu[J-N~'xBqCSo%%|0xբB{'i_y9I>/31a7RTԺ=ѭs[RO_?$UW7|e_50>6߻[JKJ\Ǝatt݆q'/jh뛚zwu܉:ǃ6oYQQaiiDKK3''ܹ11#""gx~e2يFɟ8.؀^t:WK˨&;+D̉4S=kZ)n6/sGٰaqf ٽav## {x;gΜ,̙6o煉'}'O~l‹w7l1!***{Uy338x'6lxRI[jvݽW,-ڶѣ-'Oݱcߕ+ t-,L=z(}/60sss۷ x$@\j?ɪR#k{Ѳ[U I Z}ڭ۷54mn]h|?(<ޡC##oo+WIEr34Կq#Ѹ'N}[ۑLU22jMl̜9@_1hPy}+ ݝRSozo$jWH֭[eEE~HIIB9)O422q#B]]6mZ$%]95Rg/rٹ$^-J2azzƭ[Y΍;EBܣXfvvnaaNntv>{!!СϿ-2eF׿|o@ I**8$$$:uM՝WWW-Wi';;Wsmzm]XXrĩD&/cdd`[#ou!_$?Rȑش* ?l^{B ]gnn<]GGӳɘ1:9$prBDEۯ4b"c_QAL .=u+~~j@=I$*߽8} GF3g3+B-[_ !׬RQQѡ+)O'!kvR$<`BBRpb[֕Gsܱ3|֠o hݾ~GmNy ZxS\\\Ǝ;i$+(S_v-//9gKKFjjj'%]Ͽa36i1,lߌsZnpu=;,\R":K$/'$$5h`ռaCc.vv 3L||^k,5'CC< #gohDUB7.((Ĥ_~zzzSNݷo߆ j}[k_?֭EDD&$\K())50sqqiѺ=lX}ݻ#:VZZfii6p`@@@'uu=%'ƞJfftNq$?W;{BBBLfڒ ==Hifu gw/b֭AAAGBAAAǏrԨ(`bbi?lΝv/mgg3qٳ<8186d[v5]k?c*ɻq#۵͗)[9=r_}׹6nB+g׮K;u0/Oоv LBiNj;8xکÑ5kTg_ž}~Կ {oɸp̸Mn]ZzU\NONm U7xy7nNwتCR2·Kol\lO_S}`SJ-mtwQf B=oLM^ِwoƛׯZ[dp|//f[xI\<sgb r ;o_qN;lbgyox'}CF MGT'wLJ-75kgV UZfo_6L̑vNFٲLu7:a]"pf3ʳ |UA6Oܝ*7n%%;^RTdo>wO.ylZS6n(>}<$ !fϞoP[rҎcYZWM;p(=|j͸:F[I55۶yS]cYv{'6ncBWo[6%کS6zĢ%6n-=GS,3j:]iIQ{Xz1ذ9%JgWZ1 M\.DEf00WKJÿ.$̛gMo(n[\T%X4?lr#6ziivؖv_$JsoZLutM .?97-}6SB5jhD,ZbdiQp'5Tu2k~+3Bt0~g}4j#?bżn᧓ÔbB !{Mɣ]ztĄmZnfiٜeFB':kjȰ{J;Gu N߿c'7o?[xI]:zz|uC偷g%&'V9==-yբݽ|ޝq*Y_[>C^7-~ s̰+9ZI.읮']xTLQ#:{M !NC?9j233hVܹsmڴ5,zwB3ZZZƏY̮cd7Ԕm'6VRTTRT$h`jbuF1C*ƎVqf~w!ڍ)IBT SI[玻.nHF;:4pwӛlИ -BH^QCO=u`yNRB6QZF3-,IחrHBZ<-a+++=xܝ;Ewof)31wk:6j߭tSw71;l~>{ZCS/U3=qb4ݩ|E1Դ[O?{Wl>}VX?6DQZZ:s̻G YY5O0Q^瓄v;ĶX:9jhɕ3 BUSc[FW !_i]M$spҾY!g+ n^z OW@2xNqi.M[<[xI\8/lMp6^ÌU.''"'96H?Yd\M}鉻,ͧNXYVڕZ^ qww۷].\䔔$U~G5$77z $R}{DMc_MM+M)B zUȏƊfOB}V$֭ۊ !Z~clHo[QQ-TC[VB?yV/02\ Ffٙ7 u T):ΗHzuZں꾅DaABDGW r}ftk{[nRzyyKLOem>Mw*$Rg Dq_u+VPWWo׮=i$!EmXJ_ >ZHH$-=EyyQNaaIQ0z|(~ZzzB=&.K[_?G\ϻy˸MuV8˿)P>&7ibќYiiWӛ խoVGW_uK1*'BORttoe*GE'x / y=gʰHoaJ' /05rv}vYj5!Dy}񱼴H灎a7uէN:uTŔXM֒֩ܨ\n$<1d/PCք**};MDomlԴLՃGTXQQm{8a!Ν:<ڕf6UH$R!*%:<1t GkSIDATB-,);E>ͻ8;$|꼜jM[:,HY|-t6rԌڗuK>vڿ~~{D*ݽuٓn+."7]C#uMd=`Ot*zXZ+**O }}}ܵA7VjޫW۶9~bO73UelJ5?qhҩqEy˩)1FVn; !O~wߖNxٷq%jyBKWj6H%|6|eu7IG? - Gn\6XŃ*>aIVξnTW&S}JmԻ{;79ipKnZZ'zٽEU/q1ԒgX5l$H[tj`_}\=[u>`M{ood&:ɩuZSꖆN#&~j_NJKKI :Z,0(|ꯦ o޺CYi({'7]y_{ f4w6vM*.?jjaݺ}jUHvY::-9~ o;)+)tS~Jwu5^#F~zӦM N>~zGGڳڵ$$!Dilv|f]̵1 lֳu.ǝojխs'E};:Dr\\H]#CsG xEG%'**,-.oOtv:9ԎR6Ə}e@7Mlֳǁkw\!5v.2bkYYuoFʼ1T̑+**, Χֶ{غX~=3!6rܩ1G6rнqSttEDFl3􍩣uwku⏟?#31k۩Wk]I.[tv705i3k#򔯫Jwu5kرV.((y7?Fն QRd+~uͱu7puٔ@=*\>'c*[CFD~,Zf,^1'zLj^TT^f͚@!Drr<*rH~φ _ i'?~\x]FR:ϿB} 7b$6P k瓒^9srIkÀs%::]mDNT_ x~QI1DH"'+WNW{ݧLkMK k3;*IM}[tuu% /ҡk3;*Q $q3/iLIPVRB=ց'XTN6{U%>>>/9 mPXT]H= /**e3Z>>>k֬xg)TٝBڮg+#&""4Sk&:Z>\OU.sRĤQ|8_j]d>Xrrr2b<ޗfDW;jjph/񦴿Qi Pp=n#'I$r9 @N 'I$I$gEM&Q RBde%><åHYx΄OPBw]ijZŽNF<rZ'm[c}jXF5O)R|G IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/bank/images/search.png000066400000000000000000001233351475757676000241740ustar00rootroot00000000000000PNG  IHDRiN-iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|Niii0@UW`hp5!= -oֆP+N`P6:ZdKț|tTΝ2~^e>A] [*Orw>|_^LTHVZb&ֻA: k2 ꓫ^? ߻\WS'{at0E'̋7Amq77T O2֋.kC6t[ӆF_;>z&۽$OKR-uӢ~[!A>=ZZB<0褭j!P¹Ml^G&6H7u B߃&~VZ{G0q1K(Ju+;)3X[) Q?iے\o ଣ95! q7;S ;R;Xwi-ifIq1'*oGqN{Q(;Ĺ~URS(*"*ԉ;Du~: vzwruv;u=^ikmkojnljICQ(P7`N^Yf;~>a-u/2sٳDTX!`GnS(ޑ#p5svzAɧ4a{7SW0)K-hhmo4Fj* o>(m:B oNz?.RQ{OܮoFIKu9AGbp}#ścF*3xlEU=~\_`J[!m]\FnQfQ ɧs _#> Fo?|)|l=e܀cFL1QWP(޼YQULs=@! UAjRZZEeD%54HopTQ1re񢨵=MYΛ2 R8`GIK$/}UKأv;hɗWֵur N{a!-;t3Zڈy5h62Bkח=m`uU xIut<4yY z1:_?xN﨩oe޽-Lt ,/u5Ӳ Ƨ5rRD$ҕv+J9@:,y73-!֞MAqO[ WV7*'/ޔ5ZGb3Q2BHKMMeMUqEf;i2BHOG93Q_8Rww내q!u6q(KBbN4@?NyyݖmDAV/7sit@K+!6\ZZRQvrx_^ڝ5ecGT4bյMյM2uMR#P!!:\ + ",\_8u}}Y ]NfӸ$;]) icGS(jktJCE-V~KgIKd ={oAl%L :v]/LZ6B6OJriuO5R_!jv 1a#rɇ.O!b-c/WCCt|Ƴ#Iu!k러Dkkk3 S[p28zOtfY:h.O##eiJz RG;fZqZ#E?T=('AU mJ{Q]do~wQye⹓z9BHMixUMUn>c1F@?\@7*d PٻufB.Hh% m[siMGGä$DhW464\ϔn}^],a0^.S~W\qAA't(~_UeQ*Rx/K&|Ho8|?_}c BhN]eD>;ssBW#=mE2jK[GkWHwt;/-x!CP03CM c:]w;ߖ|F;Qg=gn]{{{K?Qj7ߗ&$ෝ>s` ^.TUT@(JQaVݝyEu4>aAUa#5'WuQZ?xϺMaE]#MXH@YAJ ՠR??.켎!B0X駃ۧ%d4(h4 ncrss34 &lPs҆h4 Z AMpaEMM %!H m m m m mMHH@#o޼F__;wB;!۶mF(h [QJJ Z .=]n m0)//F i_vZ BPN< _Kֶ|z6],p?_y7n(&&'@t(??nJNNAB"mVVsZZr~amm BP]]/5jo>kO^z!g|]Jfn>o-ܻw!緞JO=̙wZ«޽ĪÇ;;O&6U__捴ZZvv&&555+W.GʆJjjjڵk?_VZ"?~ԩSeee;wtvv&YYY[\\,((hdda{{{8Y`tH--gai{ ϟ7S _M8H>!TYy۶?߶,^ޞg&9e_288Ǐ Pwoi4ڃ\yh=ܿc0xu115k֮Yvٲ{BRUUU!///k988(**ܹSCC!ÇO~wiuuuTƍq \t !nz_]:/^<_vvϟ?7 BB@}B0 P}}3ZD&$$4}L.UTT ϸ --=r7RRRÅՅWojj:~Ν;5۴iϟGnjj`eeXpaff233=:q: kBED8cǎ\FSS۷c%˖-9תqǩ_:ĒÇ'OZXX CYڦNyȺ",-gߺu|peg'O_)((<{+-OeՍMF8x`QQ;m! Cƾ}OYYY__WLr} QFxBPP̬ہod~IIIwE[WZZ:&:ɀ9;vرc}bŊ+Vtg' ٬-J0i)̫̌NN1%??[5qt[B ؄JOϕُC }tOvtt\|p(K!:4>_/{E۶mS6=/Ѷ6+-g|@@i466666@@@@@iii*8s洳Sbb ):jvg'''#Q)++a?/ޘ1cw, FX`0MMMo޼yMiiʕ^cb {t3W^Ag^7i%sX?N-**Bŋ|/\###޽DPzzZEEW{ F[[6"NjooVVVjkknܸg~~~5ӧY̝Ven {K>y !4n;v LBB!db21)vPuu wh4111--mkk B̙wZҫp\AAmjwq))8dD̎H㓔И2:u46ü;wX~G)O"& ~ӧ۷VWWmmmyyYYr)k:::22ұ ??[7u4-\CÇ#F輯g`]߼yKO#6;:x@nn.Qseg~~~Pr q݄?޽{gd߿GQQٳxIzzZss{mgP,^ށ|}K[]]ݓ'i4Ç3fSNWWwӼȋ iiݻ;k2>YYBc껺!S^e˖KJJ⏺#֫kHJJtttOmmmWXS__YYY ݄Wʕw#ƌUXX-ݎ뱮7~J/m!2}ԩӚ{$m޽={ʗ.E͙cxRT[[[nnnii|(͜SMM?yd*p$4 ~4ByܦMrr믧BgͲ"SFCC MIIѣzSaF|{(%&Ǐi4@}ABB(9q$kkМ96YYY?l<)|z[l8cw;P( ӧOzzzcƌkiMMd3FFF:;4 V쌌tڈL*~~Õ#"2dW2@xI{{{VV\QQ1 BHVVkBhoTdޡxFYYito/WTT433Ž{]V5662K 8466uMRRrz} L|YAA޽!QQ1gguuu2[61;]COeFZZ d>,|(4,w6fk.\@fE2?^ BgϞ>BUUUa]޹3bbb`t0oGLLC@?^fG..n:'OĜAFF뺏J%* IbR h:ѣ(7)߿ਤ{RUUU:Z~UBd (N?@fp~zsꪪ^cRRRuuU\\t!s.?y|gSNx]]]UTT8zqժ I.QQQRBBԩ3](3 @K 'hk16BhذaƍK~`Z?w%\b*2! ~yi^>̌ۉwBUUU Zqqы٥%G1l+y+oΝ7oTUU[[[=mL|??yNfDJJ!TWWv?rrrzqp@BII.X2l0/UƎ7oބghi~ODccCUUm#&Jkkkuuٳ"Fpתqǩ\4f7Uֆ27GG)))c"+oX#SFPPpӦﵵuz,JJÿ2$䠒pԩ$%DDD&XMˇ$;Ǎ/##+((( 4kUPP0n6t@@??Ғ%$NCF +) 8qҪUGI~;n+"--}O5Z222/AAMM˗/gn R6666@@@@zWyZ>Ν_@B۶mωbY #xWHII})y }6B hs! B8K;wYzz+WRSSg͚El}}=J=wcǬ8xb-[xzz/_'÷mۦ1IIIIIIƝWQuk}n<,9 BdèQzjIIIp]v,Y799yڵ$W\ihhځ+2eʔ[577sgXǶZ[[; ƣE#b]nСC&Lrss7nY?IgXzgDL뽼 1N(// =vUUUsV",,\]]M~ҥK?NNNú0i$!!dGich#~~˖-,tw{??焽N6͛?qDHHȑ#G֬YCzQ`ci366wޫWF<}/'Y` .. Ѝ7'_^^Nтך4iN~~>Bhĉ%%%DBnKNNƽ?111m+콭`x;߿ǗG-(>>>>>>3fعs'67:cmGǎ={6d`13?s͝;755=y򤸸hhh_B'Oī̟?_@@ԩSD"Dzzzrrr >ÇSSS8=zhWUUYRZZիW766v4O:μ_qqѣG^:@>b]島%K8q$666%%ȑ#s 9RWWLIIٳgBhĥ1ssiӦuw%JJJ,,,TTT޼ys5uu_~ś7o~ ))yaÇ'F6o޼wٳgϞ=;;;ܹs .$y ( JuBEJBCCFq9gGGǼ#G{xxvؑnjjҒ{{Q|֮]w5nRQQa'd$:::(((00),,+%%k׮]rERRRGGgӦMl#;$$$V\yׯihhٳgÆ ۱cdž%$$߽{:@OY~}s9_EZZ^{Y%###--Mr7o^n۶ kz:t( B^^Z =-**Ύ,555/_1 O|m m#0%C6 6m`0` iiix8 ml_8Vc͛7JJJ̙3ɓ'z*lSoXp۷===i4 `ۗ#FL0?"1`:-''ws^zɉ9Vc;w͚5ֶ˓'O?>FX`>ۦX{[F8'.,,,nݺxb<EYYիWspg aӦMfff~~~duX<<<ÉG l#isttl(! `B  0?5mڴ0"g񝉋P(xH6)|E/}DEE U>}Dh'6|RC /}ARRӧO,ȧc̆wŜ٦O uI[ss34r-W CwH*k޿)$$DNNʕ+=}-eee:::l6b y;@%ݹ6}-VVV=ݻi.;|RNΞ=,))v:N_|R/#սzXr}}R=} ֯^744ȴ0Y&}>),Ï />>IIIӧOOMMMMM%6>EEťK DEE06|RKؾK_ex.mbbb{UTT\fرc]ڦO 0B2?}t۶m\ھF A@iiiii9tB wɐtXk^:CPc^xٖرcm͛7KHH?~ sW5(T9`l_0NNN&L >~yO>Ŗ1VVV9rHDD#-W5(T/`ggl2nt:=99y򊊊@"' 2oC /$b0eee]Hr qя?>|YB gΜa;ZJ^^^\\ÇݍQt''aÆIIImܸQ[[[DDD^^J^j _xpBΕ_޼yB2xBw:^<>>>jjjϟo޼)..pB%]]]߾}eOO˗/?w\33+WΚ5'÷mۦ<5w9{ljjjw*++:ujuuÇnjcccpE2/^`3:_Kl_HYXXب/˖-khhXf O;a!!!%utt{11b63X[[!]]݈o6""ۛ^֬YB>ưfAAA!SSM6u۷o---SRRTUUB .$''tͳ- yrssɌ7w>#fK`~D'N044<~x/Eҡs1J͟?_e=z򄄄EuZE i`;p0JJJ<ܹs~>VPPDZ񉉉)++366޹sg/ѡ$?5k:+@dd˗t:(#o.m`Bׯ_3/_>JRR200B`nn߽{`9rݺu~~~蠠''0ObIHH\ׯ_okkسgφ zw5=?eҥkkkEEŚ>f:ؾ8tP@@@EEЮiGGI_ǝ |Iʺ{z;.~~~Ǐ_xwQF‘@pKNNh7 ^|~_6mڴiS_<~˯ztw m`ETTyM)H0`K}ټyʜ9sey 14BIIիfϞg<Kw5eʔ+))yzz8q|xlvɓɓ'틍 M ZZZӦMgଠ,XpirرPB6#""dddvE<WUU~z---aaaUU vJKK}}}nj#...%%eiiJl dee'󺴉a~0mPؾtɱ7KR0t@u떸xe͛WXX2eѣG---֬YGx͛7͜9ŋ[WQQ~ztttwq`! (AaBRRӧOYbcct7|аK|}$lX futtvE,hW;vl_.ڝ ^bbb&MDk SKK)KK5 ]@ J++xfKJk] """$$ԝ ^.))RZZڝ N߳ghBBBMM s2Xq`! (6(l_0g.++KHH`ۯ<$$ǧ!TRR^3g999].6ltƍ;v찶yG?~<}t8NB: i/FkkW^2^^^Nт… I&M6WA {bڵkƍVSS:sҥ N<̬A.61(l_h4]FFƭ[YVиX[[#"""NYn rrr{˗/ڵkٳgoU1ݿ?33g^m_|||O|/ݻ={.m_@ؠcooobb6v輼<Kb۷osrr022MHHظqٳg}||&M{i===f9] md۾R/q\lWL\6ӳ8pΝ(qq'2_IMMݵk͛7ϝ;`aa>,((xϏ?ڵkOfm/]_3`@/HHHHH H}Yb+._̫F(**ZlΚ5k3 իaȘٳgvb>˅00 .411}'Fc}x2bĈ &}Ν;f͚ekk[UUuɓ'GGG ח@]v}XvWZ5eʔ-[,YDGGgȑ/edd:/̞={ ?x{{pQoi/,)BGd֞0agww}b1cƠŝ~l k/$''}vѢEK ĉDƄSoL^E<%%/QMY?Ě5k bi/\FӧvU5DJ"KB !%%%B#Kz"""߿7g?6l_h4ZLL>g FUYY@r9fX0W" ;;gϞ&!!/JHH &PL YpuuMKKb# umؾoݺU[[ecnrtt~٥KFIc2ŕwbbgϬK;vyY֮]o=zibbڲeЌ3\Ȳ;v$&&^z޽{xu҆˅ \\\x'NLKK۽{7>|bŊ={U9 CTTTTTBHHHHSSsǎ[l!1bǏlrĉ&==HwwwرcCCC޽BJII߿ڵkW\ٴio=#`@/HH`6|'{g/?^ȱ̵$]^?:i+4~Dܴ$u{2~mgY04`q9tBOvWE%/ׯ_ϛ7OVVVLL< v23`?R(渇KAA9N~ܹs^ē,X0n8#VXfhؾ<~!i&333???{{{w{ IDATF@9::܍|3AL_=eeeSN~!Gݹ̀ }a2jԨ'OTTT(((%xAFi?ݻ QoZZZ b=K20چڵk߿"''wʕk׮!Ȅ?@FڦLB|?~bb#GDGG 2eee޺~7PQ/sd%C|A&00v̙/_$n ;}4s;DFF塡D2UQQ믿HLJ_|yDD7d7 3iss0Ύ' `ttپ455999~:((/7~~~t^Mw  I_6`ll|޽W^=/x¾@?Āl_۾=}DL!Dtzҥ 2+){y5 fzgFC_.{/YB`£FaOa0*_C1'/~GG%RȊ Lh2&ccd+--XbbgϬT*!4gϞ4iRnnӧH^'aCiiC~~~XXLh2 ml_o!***** !$$$cǎ-[>|XPP͛ϟ?~kN>ݣ'U$&&&((haaaĵ`v36|A+.Z @iiiii[ K=ZRRRFFfĉgΜ! {W˗/쌿ݖ{ }ؾ DۗL*:|pX'O$]QDDD܈%qqq"""і{$m ǐ M,,,nݺxb}eee< -}<<<É lBH[pppMM ai&333???{{{/\6vtt|wO޷o,vpttcccs֭ϟ?.-W^={vll,7[!!4A訯Ց7o imm87 0t d077g4t}a91پg#TUUegg?~ٳF1bV®(,KJJB%%%5_-`2m_ׯ_/..Hf;w'OrEE{mmmi4ڂ +++]fgg~~6n4}\]]Ϝ9Cy/Y< ills;3<|hsWWÇ.Y{r ؾ پ5 m/5!}U#&&&feeс=|02=BHWW7""o\G^-/_444꼝 & rss ֬YҹXPPЫWbcc阶n1|j kfΎ' `t7Y[OwѝKSSSjjׯzje#h4իW;<ٻo̙jjj]djd3))$Fkmmn/Ǘ RZZڹXLL̤IXc3K }Sþ 'pzf9dƎG^-"""BBB?v>t萇 UΖR+++6nQVV~K }IJJ+++`$ 7P^^P[[1BIII{{*OZ},jٲe W]ѣG䴶v8U]]]Mv8q"$$ȑ#}jO ɺC /7Byy9F  . &M4mڴ<9#lkk+((`DG^-21Kv5MMM4eeek:?, 삲+(""ŕE@Qp)"XZ\[x*WJkU(EA z<"&i }|JN&̜$f$󶰰8pe---|AmD@"I+˖-C%%%}c8~8qΞ=¶$O;v~UUUݦMZ[[###ϕ522 >RpoS<50 a틀'A^^ÃC%Khhh団iҥ~/ے޽ˢm];C#W"> PV3g*((8;;@+@' >{m&x%yhmmu֙3gf̘Ma]u\G3k8zzz9[|yPPTWWo۶mѢExy򼼼+V677NNNwcJuuEkk7\oSSSƆq}9tP|| 3Tjȁ;88.iCb͛7'&&">(dA`s*p^t!6otڵvڪZWxj#[ rO>?rssP _5ᐭGUקheeE9XWb*ϏP۱6b}66#ٳ?|Æ NNNO<ZWp!WSRRۍ7bbb#bVꡡ!b8ZWs6/dtO?tu+Bp!#ŋh`u 9~]ùGՁN}FE~~GsƠAFXWeϟo``@w&//o$H5CCCYYYɾGluw/\Gb|u@;pe,Q/?&zKKKDͺ"ws r~ׯwwwϘ1Weeed]= 8Yk}KHHȓ'OlmmM|ڵ/^_늀5ʞ={|}}]\\e499={q9s(33ٳ鉉]9XWFρNYо|{@ (m@@ X]666@4y𡳳ɓ233!8\qm}p0ƅZBBˋN:t"66?k~11 Pd/---%%%8sm۶`Ϙ16c \Qe8\ mBu AAAɁL{e=Kvv=Ν;ׯ_o o `F۸оd냂 Sqֲ])fΜXp"/#hjjzit}\` oL2(0ydii鶶6-Knn.O+Ftz[["G⍬zQBK IF7,,,:::=zDlaվp.0upՑk eɡe| D F2e z!|I!p[xr0&ƅeʕ?IHH@nMZ/\m틛 rrru&U.8kڗӧ޽K,YdIEEErr͚5kpZ/\8ڗEw=~H_gkT}`EPTTɓ'KÇKJJG,WsG[]RR[ccs75& 0ڀ/DDDDD0S Z1##4r劘XRRyիľ;vS 0zE/===v풕xh{{{%6IJJ20F--~?f)񫯾O|555###rR?~ڵ0^Tۛ3ʹ֦ )Rо i_>}71Rtܪ तڪ⡡!C͜9SVVVAAٙ.#GWZ7>}WYYYYYy[nUUU.? bm' PƆ<d틢r8/<̠ ;;;OOO^_XDǍ`̛7\II`Q$B'ڊ+ www111[[[7*++UBNNN>$ܼyq|||bb"[WWףG2kƌϟǷt:knn8wzE(m  IDAT޾};=h葑ª}\` `iiZWWGX9h_оƦި()T "h49I&soo︸8r;0@L1Q B"}+˖-C%%%}OJnnnYYmxLz֭bbt8TPPPVV&RT0L3B$h_DN"//A!֒%K444첲BLцf(B̙3Abb1u_ӧ+s!оULeeeM:|5mG裏233Ϟ=kjj/gG0ŌwvSAҥ:h_Dmmmmm`Gh_o-[qEu۾}ʒ%K| E/L6ӧO9::Rpuu611yuzzۮ];wڵlWGȿF(++377''޽#/ J{WR!MLLGҾ/քfΜ9SLJxmc{{שTy֬Y޽_Mt:)_# OBaoo/<:qDsss\\kIIIJJJ_]vIKKO6~ \.SYYf%%%YYYww/_;|6о i_~'@8%++zj튊+V,XpqggW^|[`044qƙ3g7mD}zM6Q_ÇfffRRR͝;!9s:tѣGW^ussÏٳaǷ ooC!CCCkkk&Tm}V]6hoooHu!6|"08kFq!3mT2 $x_2ϟ>}:^ 4MJJ +x|___}}ٳ666h222o޼!aka|@b\*Q6MMW^1_/ Axվ}V Ƴg֮]˺?X/.W`HHHDDIJe233o߾]RR0yVqS9JYXXttt>>:::#i_0nnn7n pmS?CXX؜9s)F[KKlmmeee4ԌN?^__v_~exxQQQA^ϒ3? pCCCssO6 9~W;Ɣk˗39mۦjfvoooss .utth4UUU;;Phh;Bx,϶V]]؈2 ))බ6b⡡!ţRa2kjmmݹs)D}RWW?{OʒT gϞo޼9''lfݶm[LL1痐g:uj߾}zzz zjjjaaaaa!ۅp`71o۸qcWWW@@P*+zg---]]]l)))Ibcc 3KdddKKKII m۶-X <<| LG700 hiiTI$:Xb.&&fkk`0Feee59T k]SSseΜ9~~~aaaB\9I\V Ti6*ڗ+W9s;***..ٳgɸ̙3oݺ{u߿BCCc޽+)6a} / z ii;wvuu?y䢢z*ڸ_c;;;Ђ ;w1BΡLXK.9::|*3 Z6/??v#J! ־tvv7edddddI'&fF###r3ggwȑ?SGGbϞ=#E{{.e ,޽{i4ʡ¬RׯːPWWǓ\M$ lo#k(·wk_s{xxxxxyKx qFDwɓ'N>>74oUVVVVV޾}{gg֭[UUU}}}{{{ h-bbb89\@&ƅ)#pi Ӿp888 o߾][[sO>O?mGJyyy^^ѣGw]]]TYYIޭԩS\Jl鍍[hw}w^|#99Ükˬdru Høо̘1onn&֞ lF[;E,rsQlaTqrrz!@͛ݺ=zX3f8<G _ss?Ź;FrMggg^_L.nh===L00҂XPPrҥt۷o711ٻwM V{g֭[z{{#q}}s纺ܹsرc>>>iii;*xU.\Hdקheeԕf!KX rss߾}a(L^0T3$I@g\h_<==߿=}Bڗ޻wb 'xg >XBOOo۶mg/]jTٳgOmmmCCQepp0&&&%%zhho$+`|UIIi kkkmVVV+W77Vֲ@sm1./]v5661ziĠp/\3 䯛`MӅƓQ%$$$""bٲeo.))qpp`Z@a#Sײ̀a [&4,,,=zDHX/ A08(##pO^/+`iiZWW7gA466]' Ggʋ/*.\vcUZAII>kq}"Gnݺ|r<F_;3cƌׯ_gx5;Aeee"N544#&4O:E. $ڗ:{{ŋO:?Ozz_njw&,,,++?/--pUo<UΜ9?$&&UDuu 6ܹSRR2%%O5MhEII _kjj2e#""TTTc}읱{322^|e˖h~Qѣ}QffٳgMMMwyN4իAAAVWW5k;Q-,}`, @*`i&xkl"Ǝ/ $m߾]___ZZZEEeɒ%>@/LӧO9:: $0 WW^oooׯ_ڵh|}}׮]vu{k2sssx;{{:B¹@___kk+}ٻw/ )ubƍ?}nll?u={vRR`]CCx'y֬Y޽_Et:)ߢRA`2*`-K*''Nhnn#r 3))III)22kںk.===iiiӦy{{㕂0͵2k֬QRRuww%·њk m駟<<<*deeʮ^i+jjj*** ?~9>>> իWo&<<< oܸq̙M6Q9\h_xmӧOo߾MѺ@III>gk5|[`X|6*Q#KYYق q6?~xo@ѤpxϞ=mhcccIII&##r&MFƧX!@T /<`<{lڵ QUUp!Hma]D!@T¢KR0Ơ}b>Ÿwww L]ӧϞ=[ZZZKK _O`Z[[ 3 ڄh_7--ښ8رc_|QUUEoڴ522{?R_bFE3/Ajoo$p@]]=--}޼yW5kV[[[jjjuuupp pggg{yy憄FE3D_ 6ѨԪUAPQQsƍYYYKK˸8P%%d555{{{< 7о0@P hhhhh8WfV>@־p-+W%%%7^ZLLo!oܱchMiiiddHKQԾp-{{{%6IJJ20F---uKiil2Қq0,))0ܹ~Ϟ=֭#/ hjjUjd4BjmmsNwww}}\|{{Ç.\p-555##"b׮]/ ㅆ:::***KErFBBBBB>0:  FRRRmmmZ CCCG ضm*i#$$D__F;v@ikkAt~~>JܹSGGGJJJOOoD4@FA«qc0377WRRb0h(I@ӟ={y朜uĝg:uj߾}zzz' gzjjjaaaaa!ە:;;쒓t'-[CeErx?Rо ak_ Ɗ+ www111[[[7*++3-k``oO4)660˴/?gcc5R kjjܹcbb̙3/,,Lk===L3ͬ0<<>>6o^h_4s"6lعsdJJ[ x[+h_5s+@I&]z5((frww' ոq@XAh x9rDLL Eew{pmǏ7l`dd$//diiyiBKK˾}h4 M|L@(XW8NCC_ݲe˝;w{RZZ:iҤs[n>}ym"۳޽{pįJYYJ|"[[[CYYYĊnF`t}ymd~ ō߽{_&?իcǎ1BhW&rPٱO*+++++o߾s֭򾾾*}}}jgg4m6UUUYYYww/_}䉷 WZ 7VVVYFII> Tǫ8p`Æ : Dttttvv޺u̙33f&kʒjꖆ???CC?3&&&t55}~wߗ޻waxfffPP̙3ݻwe˖^[[iӦׯmll/^H<}ŊW\ikk#6zxxYƍϟ? h}BWV0 6:t?(..Sx𡙙yb%5JE2cƌMMMqqqt:O577DeggƎT1|{ҤIxȖg`۶m ,_~=+^ꝌCBVVV> iiiV T.޽{ݺuﯨػw/JRl͛322N:Hdz /P`C䫨XBJ09^zETlEEE#Ս7'''гgψX'HKKܹBz{{R>6! ëubgϞ_vMOOɉi%[BѤf傂222222?!EuӉxJ ૯O $!!{ӓ *Rо i_>}7h4*Au&f$Jhh(^DW[[1G35?;;[LLA94^π Odgg~e$`FҬ |x-9sp8Vcc'OӦMcJ!D Irռr>U2TD0#iV >cGKKJw,88{Mggg^+(^h_(yZK,_P˄ZJJJё,cC]]}Æ ;wLIIghC/(Յs׉o"Yf ݼySh4iիW>0k,www/DDDDD }r?qӧS/zU8CźRUU{n333yyS.]0=h_^|iii988yf--ĜJTWkq8p ;;{ѢE/^MMMEh_Ο?Ғ₟QXXZ U=uꔊ 6gΜp6` HABx"؊@õYYYggbQ+d\\\\C}O< 0nb*ؐGٳgxBo߮9x'|駟R,@U!i(33ٳ鉉o<0a7F7nhF о0@P hhhhh0} /T Y Y"!!1eooooZGAj/׾Pٿg >>>fffutt|}}׮]+--=Jo)k"m}\]]/:$$$xZWoRоPٿgW-[z\ۑ#Gݻ5ydիW755ںsN)))==k"m}DH/_nmm}޽K./Z?iggLO8lٲu4RоYjnn~`EEEhh(BˋCB0)){RRB(::Ν;&&&9sX׏/3}D O88Rkq]tаcJ@ /sBBBUUU8뙧OtOֲ,x|}6hjj2P_/ &%a^CX8ݜGi|*r__SN͙3'<lD]RXXNMԾW^+//1qq[n}#1?c5k|o޼+,^|yŊdkw,88{͑āQx-8dhCQ}Yf “}Hp7>>>55?Geee_HZpG@"#:>}/(͕GhKMM'׋/!sE^/1&&)ЅBgg'Beđ/#1g33sh;w#XYYt: 5v%H@!z5`4#Є^ے% 0zP\RR 0oHhhhhh 68@@@I8 |K*((8D.555fï]RȘ޿/yT Hkjj9w44۷U6i6n €&Gmh/D|ؽ돍C[ZZ'^{ A>]7n?Ν;sB{ ^6Oر]]ogϞ1ol ƛ7;ǎEL^*DL^[WoMzwotb{ggWjjDBwnٲk!yy͛GzVcc<:uҥsC==YY7ݫhkѤ45njj~w^e{{d[[JHH@ abݫ6ッC S:;/@%'_rBS}y 8]<IDATz{>`=ej]݋_~)hll_ 6ًyQWw$w"lO\` ? ]Xxj~s4mɗ.u>] 6>500844$##ӳoz8B=z!$#Cimmg}N:00YX >|26^|>ιsg7N:!܊~琐hgϰz붭[dgggR!`OEŹaBbbb!++3߯|ɯKڵ\fYNLOWT 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.3.3/doc/yoshimi_user_guide/basic_example_page/000077500000000000000000000000001475757676000236225ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/basic_example_page/example.html000066400000000000000000000017371475757676000261530ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/cc_nrpn.html000066400000000000000000000405441475757676000223510ustar00rootroot00000000000000 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
    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.3.3/doc/yoshimi_user_guide/config/000077500000000000000000000000001475757676000212775ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/config.html000066400000000000000000000274231475757676000234420ustar00rootroot00000000000000 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 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.3.3/doc/yoshimi_user_guide/config/images/000077500000000000000000000000001475757676000225445ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/images/alsa.png000066400000000000000000001261421475757676000242000ustar00rootroot00000000000000PNG  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 IDATxw|SU4JGJwKt@B *A%" D%O -2(tϴMfMnq>1MCG_ͽsORD"`ƞ-{!}qְ,GhΉ-0zDNmt GtOyEUbf=_0̛[e9iXbg{N$En(b= Yye5ruCp׸Ⴣ-Cv~ElBȈ} Zr#' pWxG.β7NՉy635fpGb;*e%2rJ_];zecZ,:3+sŦfƭGV6nǯg !"+dz,˲?0`Ĩ1C!=%;]t|aӼǣb}y"%5Zleyw';Hl?dj3wHQ=gh-W0r !C,`*duG!$4g\t(,:]T5:Jl#BNBy7+hێnvթ;H29=*"h|uћӏ$_J+!XbƮ?e ~=}8!•rYG2sF\L+?Y͹˹IWo.]4)*7! {eugISvʸAR'[B_-Wקn0z?bX@g= !Yy穌KܲeGZ[Z)Z;=ܜKU7>t70z@hWl'ulgm7rbȉ5C-0f-OVOya[Ŧ q*;tMYh!Z;N0zV <3n^3>zTϲv^M//~B 酎[z|uc-uruVVBgF;w=#3|۞DBHID~sBڍRya_A`fψ֎cQ3s2s!bywH`7y9\Qe^?ӏ'f~)B9F| 7Zr_ו'3z;4-cg Ym8ך! -߶{"\zT1t=+EFBȸ!}{y0 W$ש !|FF! ѳ9eMv~EH$d#}уDBz|ICCxBy_^q\UM_Ex$WOW7 ls JQJc_ïhuO]'֎  wU#!DӟsH3b"́)klj,krIZnS !V}<.ҺRku BH^G%<`фJÜo ƑS#|Ӿ"r0*Jf1!d}ש軮R{xqszUo?ӣvF:~:dl#=\!_ACO/)͟M`MZa 0 ?n0H(p$e Ygp9\;9Y#9\Vw-#WԍrY`*E5(5Ύvod -֝ke%X$몮Apq04r+!1-ஈL?[7獭FP'dִ-B, 6"=$gΚNEVgw%;kя5 0\V_Rp1WѠEs$GAe=g9BqNh&֋#t>BJhrݫj|R^Uw BN0z{n^/? ꍞkez+U\˺s[( E_r[@7̶ŎV"Y~!ghHd_נ.OԿgjvY BY{}KN-lj)Fuz=crѿCIWW)(}oABHf0_Jhl &WT7ҷ<\tvqWk.e]J/ߓRlLN-*NJ+VR)oʏ6|UrwrvW5Vŧ {j~/pmwEΩֺ>|݇O_Mqg-!rh5׳]Aw ".ew'%BC81__H`oT7&_Mi9_ENȉ߃r־)ˋFp/~L`gOيEVB2OZJ׳8~!+gXZn*Vc [2-mV3-.Xg붬IRrJ790z ?>^Y0٬ju:mz2c( &y^ nє79߿w6vBTo7.͌;vرo1p8$ꊙiii^z}7- h3fT*BȤI^}S#uuu{xbiiVurrruu۷oDDDTT};w^R9awww銚ȦX5kւ on)&&eYB׏?xWWGN&w~D"quu }M?<=J;bذaAAAR833sٲeJ"\\\ssssssdSkou v[]TR3M4l"TVV3չ'd{{{z?U*B;|T*]x>ؑdYoݳgRTRefffffڵky^һ\*yۛS'ɓ'P/_޳gOII_]]O{?x@#L2w$P^^/\p0jkF"SgϞMqލ0}mllN: K.uHIIVVVk׮4hJcƌYfñǠ.ҾLmm-!D,{`5q-[9e˖j߾}4 zw^ 3k֬;v<.A]s1bĩSRRR 'N,SUUSgϞ|rEEBիWLLLllQa7nӧ+o?\vMx{{O0'eނ}||za:rȑ\Z1{lNѣׯ/^l...5k֬NYA\cǎWWQF=S۷o̙%vޝTYYɲWDDO<{aj~ƌr|۶m~~~VxǕJ>SS֬Y3dȐ>>cfsNHH8vXvvJrrrٳ#&LвUaa%Lw"Y~ ]reʕMMM-Hs3;w/}ѣGꦦ& ?0 c8Q,M69rٰΝ;X+֫}'䶲~oܸQ]]s{sttL8q&888 WםRˇ^322ZmPPܹsL/_\__O?}߅ȩCbbbN:u1`رqqq-?e˖d77޽{+/.[̒V,zyyt-[TVV^[;!2LT:::Z|pyBs```yyɓ'/_N$111&**ٙ~W^:e^{5\.0̞={RRRo4CRhѢ H`gg'oܸ1rp*iS8׮]#ymCCgΜYv-!w}ogn/ۗ.;߭INN6(tǏQ P(yCY<{[O`cc3iҤm۶]xaGr^黢|7?KMMݲe@ 𨪪xw?C7|hpÆ :Gmw!rj&%%W܂zyyȘ1c|ɐf͚#FvKa/0aW_߿ԩ={4HHo?S 5Eϟ}7 @aYv}ڵknhz)K:k׮ Xb]VVtRڧЁ***BCCW^]M5GN!M#$77AZ|oBƍ|ͨ(C'N899oXt-biа/}p#7jh~ر4r|-?zjbٲe=}}ƍ+Ww}|1wwx~~֫}']sss~~~߾}Y:hoWWRx7o:uylllt:O:W_,;x_~ёobcc{Ѷ~=k{[Nw:^cbbZѣCCC o[,YB,Ҡŋ ӦM 8xb++˗O<۰añcjQᲲCY[[^CP8{qi4?jՒLKKʲ[r%(ҥKz9Bh &8ƍw{6%+H[I޽{Ӆ7<ݛ2cƌQ,yBO:uڵF߸q|S%9'BHHHH'nnE:x7lؐvʢ)7ˏ~O ,~g8 .vvvQץ%KۖKk }ݾҏXr|7?kJ-v..._w/yȉsbb63P(.]hƏ?qĞ={J$PT*Nڲy K=^XreZZO?4m4z}1򍞝93+Hww'Ė2/>wY*7o޸qnNi !4rz GDDdgggddDFFn፬E-(3m mkһ[//NnҦ@K./ W\!ӦMk3gΔd8v{nZѣt C 䓌 zΛ7oǎ/4zPؑ߭n4kccs'[~tnk|pu).v8l0\0LLL(mcj9 l5і`BN/.U1Q"QHH̙37mB8j&ݕJeNNNFFF@@ D40`-߹;^nE,?HZ~υ {=Qڝs?p2U}Glj'Agڷ'O }O?M}뭷FF IDAT4M[7kGrNAӭ[Z ]'qL||2*j+ߝ|J߅ׯ_~l*}ĉ|JZfΝ;7gΜm۶h۷qFz%滎N0f͚s=ܹӆ9ʣf߿qժU~a˻͛7?~zT<Թ5ODwFT,^pX= 7nq+V0| XV߿O!}oN9HWnnn~iϞ= ,t:EbX|dsgΜi/>}> ?IgY_S^:eʔ˥u&555GYp! _.\,cEGGs|g7o]v͛7(ߝ;]Ҍ1"<<<==}ɒ%~~~a^{mÆ ]VVVr<.....N,Kf/V+Wttt&d:z0<%&&ŝ9s>44i$:`:~fϞ0L~~~@@q>l~NNΞ={T*U%%% xyyݞlk$?qG [^ZW^y.%%eҥ...2eM6c>sǷHgCWWO>dɒ%+W\j?KҾ ?̙3[+ӣG\βlQQQ ! ߲֚7oO_~0qqqiG9uӋ^W|J_~z]˗{=xmll_Dfw烫N)ww!rjKL(\v;+**$gϞw"G}W\)))Q(յwѱFX|ÇgeeٹEFF>|С|%K߿jy|}}7o޼}7o=ۼy3v?|ZZZUUUeeX, |Mv{~5OݻhԡbXӅ[ҁL|ᇧO>z(mtvv 9rd}oM.m:H]4xz7RRR:((5JB[^\]ݜ@*)]os?ua{W322{}? t.>lII… ?Svo?mB[5|{1}1f(B L6N:-!rÇ>5VXXrJ|A:-@k׮]˲aOKwtf?|^zM>~(O>ryqq1qFw}*((x饗ߟ>x7nKmݺd%CMC?' pC m)223k֬WVUUUTTX[[GGGO: ̽eYTMtWlK Ç[ӎ_u׹'8!r#}8;;/X/$n((((f>{r:{9= l rrN R9@k/#>GEE͙3'..[s͙3c: <wQlAAgcn?nL^sNw_;DNRx"'DN9 rDN9 r@ 9 r@ "'DN "'DN9"'DN9 r@ 9 rD螒Q px嗱3#r-[JZ\\*ò,*,Jվ:999# ?L&C%u9 r@  r'Z`رc322P( 0jÆ G!,[졇KXVVvk׮UUUT*{{{{{{[g޽Jr„ ayT*c=fa~,vkZX:dȐ#GtȉeovϞ=ǬRJܵkٳy{;r*//2dHdذaAAARv.@ H$S8h4{{{@`PحSǏr ?EժꢢK.ر#***)) g @hT*˗kjjܺ}G2eJ޽鵹6;G6|g֬Y&Mڳg6"CQQѡCk@oL8U\pڵkq9;;=zȩaIII,:;;{yyEDD<|g^|BP+&&&66֨Y%NsNBĉ&Q©~KHH(//gY{ĈӧO7$;}tBB~k׮i4oo &<F֦„9V#""fϞ2q\BB±cDzU*SϞ=G1a{{G_\x1 m`7ui [eeܹsvղUq|MddڵkJVܹ3++ǏHUο:u*_Մsr,߿?...%%E& B??1cƼ+}5*_'''WUU)FGGǠzh…{6,\WWB_K$Juu]|YP?~|رݓ'Oر#99Bzxx/&&_1.\裏Ν;h7΁ '_\~=$$JE***D"Q@@\.qFFFȑ#-[mllzP(.^l2+Wrz5pujkk|b@  O<~}333,銋lRYYiVΟ?Oqvv ,//?ydBBˇΗlnn^zurr2!D*edd7&&&11QDEE9;;@;xyy <ҥKǏos &Lhy߾}]``BO^UIz]ZZba@@1cӧ 'fggggg7Q8bŊ*) ҥK.]/N~9D]=S4,YRRRRRrĉszyyՖ-[^|EYp>ADNǏ 'z񎌌LNN>z-#TTT^766&&&BƌOARnn5kGZ&ۻZ:}Qqqq@@{Gs^^^_j_~ ϟoooO_O:gϞF3_~yy__7xc4E{nڵ[n廑mܸ1997ߌ˦VO8D h4O=Tl ĉ/]ta)33ɩem۶ǿKքСC3fL;$ÇRRRz=qĨ0̤IhKSnjjJII8N-\7JJMMmhhO?]PP`r9^z%>l^G KJRNV[[SFpBYQk׮]pt:>h҉'PEtP>>|Z6m>!d$0eƍׯ_nݾ}!yyy?HtpuRRR!AAA}||hVe40yd)ٳg90*LӫW% ! 3]]#bcc !馦&?G}Q UTT$Zflݺ'l9~ᇟyTM\\az'b̘1GQQ@/BPP͛78oٲe֭|g&B˗[[>}ĉyA&Mi @ 4h֭[=<>=],GuСGoJ8q޽{SRRf̘A[7Ã׬YS]]md~ i"5i0]{H j գG־Ԓ:$֭[gTXRB(,,$ܲUMGٽ{3g^|E[[[Bș3ggE7\___\\L˫ D<}tjjN3,7DEE͟?jR6###::޳gϲe˲[+\[[[S}Y79sLntZWpǃ'f;M;JHHhlltppx :tʕ+fF/vؑtYA7o5EQ(K.h4Ǐ8qbϞ=%P(T*SN5km+//phnG'Z&hײGuv6͆K۹?5nLMM.mˉ|HgyUҀhԔw-[ԟ~-!}?Ϝ9|a3--kdoI,>7vN 6!rnѣcqM6d&/_0LNNNzzzbbbVVlggGoO>```kF'EO8}GħzjժUVVVy/D"i.@qq!C,Y/kkkdp72tuKrРA... bϞ=-[p6ݣ[```BB%+ثWxKJZ>Rw֌91##&FZ$W\\ek!nMvv?/A)üi7!$22xff&??w0ӷ? ¶mۦM=<ipsנ8yyyb͛Aiiy,o>3eԍe_e8p\QT۷oJvQ׊sB ;j(@z􈎎鷼ӶKڞC F,f܃GZk#CURb G}tƍNJOOOJJz-`mx/ҥK3LKK[dIddѶ'Oܼysyܹ>㸴_|z@8z銉1 '虴yǏ!S__OׯB?q߭UVYưü{,::>>y&-|׮]ͻpJ/rk֬BHUUϲl߾}i`9'YܹsHw' Ǎq܊+ yS/++ЖJK5`Ror___~(6nϟ߽{7!0˫{,]eimѢEVjGZYY߿h qR"'B48xFڴiFILL47ϧUUUUVVx`ڴi|Pv;vWTTH$Ϟ=ȉ^*.\8iҤÇ_z>((5 WWW*!!&][j[˗/=|pVVV~~[dd >666~ӧ={Mgg簰#G,dɒ\Qw3&LieeE\mͰag--˫L&;rș3g]VPPP(z=]|o;t'N8x ݺJV8lذ &/x+N8QWW9~UV%$$R??\pB[gDRuOy?13E:qb+ڵo>|իMגme˖1 8JUPPit{Gq|/}ܷ~D?'hqtqMuU(++1q XYY'|T*R=Fb@555D"Yf>T o,_~A?29 rɻヒz'89k֬i맒Y駟PnǏkxf˖-> 6de;...ݟd:DN)rB%"'\l r@ "'DN "'DN9"'DN9 r@ 9 r@ O*IVVPPz@咓Q pW=z4*3k,Tܽd2*~N9 r@  r@p{` q.]V#""QVYYY}Y1 U^^Vz=8vX.]No߾?O"ԩSY9?Tvvvee%!$$$ݽ,Xjjj]]!D"DFF, !x{{~~~{n9CJ+, IDAT(D"kkk=z hVfeeer\Ѱ,+R8̙3 [-UqqR9=ej[EN>>٣&BQZZh_Գgv,^dF"G:NPTUULhAf:C >|||hF-P(dNj ήރ٦7o-/m"˵Z@ 0`aX Svvv0 9'*MMMߏX,VTUUU|Vӕ655V*ٓB4MMM\.ojjjVVV򅴲rssdr08ӓ.@GoP844I/疷F +ILL$5(k[^^OpV8^&ҪK`UWWWVV*JZL*K$[Z̬j߿_~fsW^^^\\LS{{{`GGGصkrss ?F|ҤI|\^__O7^/%GPP+'N׎Ǐߺzj^^}'&&t|>g9fbq~~Fihhea+W455 DbeejIBA˗S&UUUENN P]XX(9kk w1 }ZjSSSi;#k4vd]YeׯHAѭotejjjh1D(jjjo\.OHHt_RYVVڧd2DRT* """,_L0Zd^^^TT/zDN<==5G˛b1%xxxMReeeUWWd2 Gִ?8T*ZJ0HR:T*Ä )XMKK J柤h44TTׯ_;"nnnAAA4Frrrjkkbq~aLfjjjG8ƍC i'0ϟ&B@ 8d)11Q.󡧋^SXr劭- whRS#D"3- 0tyz}JJ#}BshkeeE0}vZUU]LCeua *ʌ @`ooϏG`tmhha/*ڎ􋲷߿a>LV@944pP.HDjll aaa FSUUU^^ޫW/_ZPPH_ H???aRSS M&T:j(dڭڵk>>> 44444԰.$$Ĩ044L:nEyy9 JJJZ>gC%ol ;|у~aa 0gV8JRrI6-WIIIUUq2ʪPׅOlSiiimmNSj* Ϗ/I̤RP vvvsXG"'`o2CTHR>l2 2BW^e2Y|6Ã~kkk-́>2R93v@Px-zz4LBwwJ󑓷wii\.pB=[6ogeenFښԡFht:g,LힳD"FRP(jjj47cõD"i8 &gb4EVBnK577߸qdܚTCCak_f={suiiiFFG#Z-"'DNQSSCq2JlxzzVTT( ;ua|(jz@ `ܹsFC XKTVUUѨMY_S]uuu={1BL~ ؾeGghغjEe& zZ,e;sk᎑$eZ[xDi^ۇpT*kjjnܸA d2^/J: ᑗWYYlllhoE BВ-=E˗/,T*bdL@'ZjCbuf2q39rX,w>}Zp2L~(%%MU~ 50Nbe;˲ TVVZ2@ 啕UTTKUcئ 3Do8]qյso ۠8z!V5Jݱ-!HM>ֲX!UUUC,k4%J_qqq 4Zrj8m2-OnF~,d# '[[ۨ(qUrrrccc}}F~0< q^r___h:eoܸA±@477b$orZ\\\WWg{|MMM44ѣ?ήGRlS|VXXX__o~.ZNPn >B*((ѣ}.--d(iiiΆX___XXXYYkɷ B>u$i&n޼ZHM 0 sվ}666^zLIm555"' ͛t2BORtD0LNNNGBRi7577߭>}iaK{{{ѫ2MTVVЅ899J USS9stt4ZZZZPP@K*ʬ,XgUUUFF}Gft<':gD]QQշo_Ö2m^zegg eً/^tL&00ĉNNNvvvzܖĊp߅ \]]k-}HѠwtn-ƲdXj̘1-QDNpM*f6uuu2T*MaFpG; ggT=\Vs׷o;X4q0|o!kk>}{@jBX,fYcoooCcH(7#SRRlmm9knnAO׷o_N'ӭmllt:]ss3q c>}0 S]])AE"}YۡC7nHI3Kamm%\_hoJJ ]JII;v,]RիWaQ @r 9HN$'HN$'vC|x.]VO^PP`eeihh?==]ѫWu5,PSS3f̘J!ȑ#Nsرc###V(111uss 022[3tޙ3gfϞ]QQ!022ٽ{y[ |?sr:vXAA_mjjhټ .?ȋo߾}v!4O lF+[(+//߰aCrrrYY믿/O:T__r]MLL>soڴ>#6 9ᾒRg?<99YaeeRPP0gi!$$$))IRZYYIի׮]bjjjggZZZ~رٳg'I&9;;;w.33gm:9I~ť4''/z>qĺujENb_nnnnnc߾}7޳lDTN:UT/.NNT(AAAmuaȑ#cbb;V]-~`%b2p@##>h:thUO޿!D}}-[E_#33SR?^ 8nܸ~ɧxCJ;wUXX>|9ݾ};))Ii111Æ {wMLLG]`={ Sxݺu󎍍FV: 7n}'he /^T*Ν+;Ϛ5KӟѣG7`{{60@Q]]}>}`>>-[)$IIV:t4hP~c̤۷o~#6{蹸L>]9'9RQQnݺ &HrssJrɒ%:5HD-nCFFFttt5ܺuK;(lݺ555u̘1>>>nnn/OqrrceeeeeU^^ߵkW_n}'hJx ;D٬H铕uʕ+WAȁhh4:Ig 0tзzkܹ7o~嗥St޽tҥK=\JKK?J5lذ#F_Ծнk׮7lpD!okI[ w7hxnn}'&"BkZR萖}eSu  eiiUSS#ɕ'Nض/RM2&9s쌌ŋSёwBucsRWCꫯw֭.]xyy<}Դ5O&MUmm! ٳެ^*hx&^Ȩ_~ʕ+_z%!Į]y-i,D[yyyyy˼fuB;VKvvꙹJJJjuHHH__]]{n!SO=Ղ[4MHNb9HKK6z)m 4HP>}ĉYxM;ccc!͛7w.E.fΝ:ItvvYԨfuB;V?SB鞢O8тENm>UW[[dɒbBk6Dl@r^9k\pA*j۶m˗/Bxyy^ >\}MAAM~7yj;C:uJSUUpc͚5ԾcByyt ?k]~}rKNN޲ekkV'S mU{.\XRR"|?OCC7{ҥK.mƍ틊BDEE5|@^“?'9= KJJbcccccENNN~vɓ'WUUϝ;Ҳ{BRYVV&AAAIIIB9ROOό3f8::ZXXiӦ-[LdvvO?P(\V|M}rDDDLLL||SYYYaa"44T9siΜ93n8WWWZw?c)UUUɋmllL"=HN훒"MД* [[[WW׀P$s ݻwoVVŋ3H?3fر#??ڵksC200Xhц  -,,|||uĉӯ_^TTdllOxMLL,,,lmm|||rjzȐ!iiiT6mڔ-m3_~|R ꄄi{߾}f(׻wokk붭\QWWWYYYZZz…{Z[[O;p@YYqfΜD;vƦ*JGG{O>rS~~|իB:%%%##륥o߶ݻs=}ǟ|Ii?ww}wժUSޭ#G$򊼽pV.@rh4?_}ʕgsFEEŤI JJJΝ;aڵ)))vvvǎjF6MTN:UT/~> ??_P8;;\tҥKqqqK.޽{kfjj:rȘcǎjyxMM,rqq)((KHH3g3<#޽3g>>СȦ-^XTϝ;WZ8?k,if.\g9:: !> .,X`ժU<0@ 1/^TVZ0}K#1[lo-Z~ziWPPЙ3g:._kjj*SRR>___TUU:tH{K4G-&!Z>u2Z=rH) !:vsΝTFS[[յkח^zIѩSnݺUTTT*4NֵkWjwޥKӧOK}믿h[t֭Zcmmmjj*#9y " B>|c\">|vN233 > :]|6c 9k#pӧO~VNNNӦMgΜ&g͚%&!~j``-[[npqڵ={̟?_J*B`JsNis=gddtق_{MǥKb?; mLCׯfͤѵ 6TVV޼y3""Ώs/^<|ѣG<(O˾jZjvQQw"yy.\pcǎٳ'!!~?-3H{oݺuE 9! CCCsĉb? u =( Tۿ҂$!Dii'|R 6bĈ={ZXXTTTuuu&H`dl"+**iHu"BYZZ^v-++KZ-? :TF=W41:***mOg)\+))ѧW_}2w֙L+Ço[Fsq5QӜ9sjuvvvFFFRRRVVŋ̤ũT*oooiaLѦ4Rh4wI9"mlM,$ғ4bjjګW/i4>q{902zvyС}J7aozNnЬ谴﷤T*ʪLڞ4i9pBy{svv644ܸqoѰ0N|2I^.T[[[YYy|ׯ_~^}իW/va*`I'kڰ BєdezFot%//O.bz)... zvyᨨGVVV:;;5}T^*m6wwwyD/J+t 0@B 87lXFRVϜ9#o/^G6iW{5&W^['>}\7&/I?6f͚5 ի}H!I^#bll,,ۣ B: 4;;;;++KzJ!S{'Y$~)iȑ#Biv.YXPhߺsРA ڏi:ѣرcT<ڄBt*jnci+a}۷z뭆W?Ǐk6==}ƌMLLmy!\\ܚ5kZUU5y .?󵵵z 9!h BBB?dY֬YsAg\K=bCIK'h}uZH)'RI[p>?^$-_ ,ӧƍ틊3{1S4k}nAAMtn)77m۶Bx6k4O?T ;v\vōEDDODرc׮]cbbV^ORO/$$$ n_|SW=: 'njАvYh+ݣKjժ;۷z-l. 41~I&駟 uUUՕ+Wj<陑1c GGG 1c˗#""2yyys;vF]]]UUfʔ) W9y䪪sZZZJw*W*2(򁁁7n桼\M{~'666]v-//W*+Wo,--P9H+3hРoF]Ǝ+eee#j$5mʼnR#1B;;I&͛7n$%%i?Aci1Ə-'uJ%g` 4iã' 4C*nL8q⫯ER;we„ k֬,Zh̘1ݺu+,,,,,Y|>+y[Hkk+Vvƍ/g[tF꫰0++/T^ziŊ򍔚fkkzꈈWW«W:::kk֬+*ׯ_///755}dž>gΜ͛77zocc9sDGG?쳦/^,,, OGSA=׆LMM̚5ǧ.77cҤI7bhnc}/KcEIIIaaa:tpww_xqBB>u떘8znݺ3 )d Mm@O)))gkaaa="+V2eIf~ϘHN$' @r 9@r 9;x Z׮]G]T*7oLWCHNpHNÊuN$' @r 9@r 9HN$'HN$' @r V0eʔW$'ٳgX:@bR .3fLpppPP7|P4{AAA111E"##233[_}KUжszmݺرcW^ԩm>}|}}[P֭[+**ޥK?mǪӧXYYyzz:88}bgΜ={vEEƦ:'''''goYr*((x'رc_)_v׻wokkk Ν;ͫpuuR(B8GL~~ӓԮ"##$'%%%-ܹ:00000.jj! @rzD !zhۗSUUeee"ؿҥKɓ'k ;n'&&+$$$44Tg֭[[l9zhQQQ}}ѣ;vD_yojӦMYYYNNNF6lΫȅjM222~_~YN۷o߾}zv=7lؐ\VVfgg}vXX044Ԯaʕ۷oxZְK.-_C嗄ݻ+MI䄦HgRYQQaiiy555yrrť ...!!aΜ9<!$$$))IRZYYIի׮]bjjjggZZZ~رٳgI&9;;;w.33gwfff...999_|EVV߰'֭[Vmmm5 \GGǾ}JIng3ZBR:uR422rss_RSS 5W+v> ??_P8;;\tҥKqqqK.޽;422裏ƏݡC&ʯZ*99aBoٲo]h<<<<<<233U*pOƍׯ|ɉ:ts׮]ϗ3۷3lذw}Dq ٳg g'׭[;h4J=;wƍO<؛5ܳltŋJܹsqYfccm5W+p|gg>Q^.\`UV9=v:ydCCϙ3gԨQߗ-[v*׮]۳g4Rv :]|6c !W\B >\;'뤍:u~~~cƌBlڴaaYf! e;54lFٳO644Z''iӦ"=?fieΜ9s)!ĬY$}~Avv6w@rBˍ1bڵÇ۷oߒ%KƎe퉡DFSɐ!C'OlMKj4|K.Yd۶mB .e{$$$ܹse&ϚI^x!˗Jeh}'hJ^8kV6,55Uջwo=zf*IN|=\\\O. ?ĉGXn]MM̈́ bBRdI!###::nݺnݚ:fOOO777'_tXYYYYYwUW:[ -a3ڤ^vJmYZ0@õRw%%%{pppppp:t[o5w͛7mĥҶå[O>QTÆ 1bDϞ=-,, ***^|ź:d׮]oذѣB{{7x#88Xג&,//}Oo}'&nޚT&:m?fieyTHNh3QQQQQQ555999 B !'Nض/R1MZ899͙3GVggggdd$%%eee-^, @vJoi/&: ?8yPP{Wr=P'9=|yZiC8{>7ڥW !o#iⵌꫯ\^BڵKג뭭\ezHG:jh5C ;n;[J_F &[^^\HNhb9HKK6z)m 4HP>}ĉYxM;ccc!͛7w.u;w\%ݦYgS TC[SO !{j?q℞+ E=gΜޟն ?uꔴKVXXx!Gybbb.\ Jm۶˗ !\\\.>rKAAM~7yj;CI !0YwL(//zyׯ/_\t[lB4qs;jh_WWp’i˗WbbbARʆ{{{K= ,XP__ߧO)ZuN(CCÒXccckkjyӇ~]~UUUsεŬT*ʄQQQrɠÇ !Fy"{zzfdd̘1"//OVO6mٲe:C?BppprZ7y111NNNeeeBP=7گ̙ӦM;s̸q\]]ju^^SHH޽{BpB~ڵkݺu+..0`ݻu a}ь3._lhhW__ooo?gn  ۷oJJ4RZZP(lmm]]]BCCxΜ9zGC IDAT{ʺx񢙙y̘1cǎ׮]CiE6l_XXhaas8qbrrrzz׋]\\~_~YyzzJϭ{F% INhڪ~{{Jz<ŋ^z_}Æ zŊ111Ǐqㆽ}DDīW_5 ]z:i1 xX(d M>uh#rRRR|}}>GOqqq+VL2Egۤ 3g WTn޼5ًnVHNJOHN=(ܕ@_9? cN$' @r 9@r 9HN$'HN$' @rL)))t#iʔ)| 9@ۛ={6@rR__O'}xyy OOOe``aaφ[VTT >K..&Mzj{o:e˿={deej4<44޲kX C]zU8::{{n] Μ93{슊 !MuuuNNNNNݻ͛sss)8֖gfffff8p/رcSAAO>)!!᫯jLzza w*JRs~~~ڿ;wܹs_5k|MhHNsΝyUTTFEEyyy) !DYYYZZZ\\֨Q"##۷ooݺu}ݻ ۑbǏcKJJƍ+ 3qF֭[Ç;ۻ< KMM-))144\h| ~g%ٸqゃ~[;{윜!D/^Ȑ E||SN:믿e򲳳mZ%ǚ~ߖh4(Z}x1G\QQG;w֧|~~~bbbZZZaaaiiY^BBBBCCuF^yonƍ555{0aOKK+//wpp=zajӦMYYYNNNF6l>a&>>~߾}999UUUVVV^^^...-pIuJ֮]syWW:/[?otӓ'O>~xN233g͚uI&ř_tiٲe;wlX9s.''/׿uϦ̝;??~qqqQQQ-1iظ=" O^ڰ555 ŷ~ĘS޽Zׯ_?z &777WWW9:T5B##!Cȿ:p)1'~8pQuuG}4~xoooqǍׯ_?y%''':::>>С:׬Y/K._z)SXZZj4uoCCCu.[6lػ+?z 3`&jժdӧ_Q__e˖ovѢEׯo1}szGbLJ5~}G͛wY!DTT{fff ,6m4hN<)ѣǦM Mi4lݺ577w+uQ:?VVVޟQxjtPrqq>}4q'N9rbݺu555&LKfddDGG7zuVÝ:{ z衳_T}~'''=VVVVVVwKNBR) hλz[KcUUUҁ:uhX=m^p4)]xO֭[EIwof͚%HOO ʒLIDl x888888 :ޚ;wnzz͛_~eVZZ'TaÆ1gϞ/b]]] tHH K#[ kOh,//otƥK.]h-6A~NW\׿]V{AX z=,E.KK7|S~͍77o444X߿_M?~(mqqqqqqB/Od.];HoYKJJm] O&GeTTTTTTMMMNN΀qqq*[Z19jlt[xxĉ۪%ĉ]q&=6K3t|Ғ_yyyi߿3///?iLvņUw4<hc80yիBsUҕ\D\46'yͥXuVfDNmnEڿy$$$Dߴ`}kPy?ቿ- 9b%4igϞ҆JWӏnܹSK}v!9 ! P(N>}ĉmO``cmmff[noe˖Tig҈bĈvQQ{WQQQQQ1e6R}Oy$'~;rks9Tm۶I7򲷷K:tHNUUUttta6t˗9#99y˖-Bwn}S6mZB!-ٳg3ҪyIm;whW/ !{=F#_6zh[[[iO?G@@NNN V^-^ZZ/?WXPZJZx[[[WWW˫sϻ3fpttSӦM[lY;0"""&&&>>ɩLE ɓΝkiiٽ{w!R,++BDEEf￿v?0iҤLPPPRRRllÇ2rHVF/^^W.޽m۴ד9믿4iRMMW^zȑ5wy$' ۷oJJʉ'\RZZP(lmm]]]BCCo``hѢ 6ZXX;::_r􌍍[c5Ji9sBCCݛuE333;;>3O=Td``k-Yd;wnV̘1cǎ׮]Bȍi6geeI矏9$22r_~^={ ~D{@QX[[gx3(+=@ۚ>RRRfϞ ʼw@rBUUU_^s˖-srr]tn={v͙Վ#G .{jssݻ{yyu]på'O{ܹ/P*7nLMMҥˠAƍe˖Xرc###ݗ6|֭ǏvJ255ԩ}>}|I&999..ܹseee k׮/ZO>D̟?_ގhرcjV4԰iii[lɩXdO<g 7nxʦBvv;#ttt+Yrۥ_~Y_ֿVmsEHvcǎm_-ҷo߬{"HNx8kOM:U;6\\\Vî]KF#_޸q#""B.wߕjUQQQQQ}?8 no޼ol3go~HJJ߿{澽nqqɓoܸ!QT*ԩSgϞ>/XԩS5\rʕ+{4iRüry_5O{˗RiT65WHmkE?oMc$'<"N<)ow駟nڱITfggήs=(+_y CP5CHX#+UWTJWwSV"jŲlFDP墛jk p#1[QAy Hfga _Ow3:J: ۷Ϝ9߿zz-[,?RwI{r_|| 8qh4Z.ޓ'O4Fq݁/00WZwԨQe#X[|'RlW0s֭[ɮͭP(:"N{H]|ؿ.N@A2exᑚYc^/0L .[jULLLxxAѸuQΞ=+u[ydYYYr-J z}Μ9pd\7nHcƌϔJ|.,,@O"&MJKKeeedB?6l7od2L$//7oL!ĩSnܸq޼y!###33s/1Rv0{W]:KllFqʾ2' .yǁV^xb!Z...>u4^^FZl6?S:Pt K%݆ JKK-[/gWlooϟ6mѣ*jy^wgϞ]ZZ*hllvڌ3\+rzlΝyfi:..No>//pD) \~}qqqSS ڜRv0{Sؿ. sW鐐yZjx}絵+򫫫噖Jetttvvcqzccc˥KϥTȩSΝ;w7oޔx-gNN1˭̚ysY>{[䔊8%٣Gx՜Ru[QɨT*,_rQΝۺu !|kJu:<3 ぁ^"p˖-j]YYyĉ7nݺU^GXu`ZpbUJ= >٣Gx՜UGFmN\i9???>>ޮ坈^[=zT^`Uj[vv*w=T*|b|5ؼyVpVOyyyϟ>>>եK>"V^^^V3 JVFB픊 >٣Gx՜RdNx|$$$8p@h۵kWDDDDDbӦMs`oߖ׬Y#,'NnF!Lܿ`yԶeZ>l\`ceKLfo0Ǎ&MˣVFgӧ<'bnnn*ۡޣ]SCQGk[Yz-55ueee|5kn'eN<*Xm0ݻsNT7ޯ:++˲%FTZÒo1Xv':pA͛k׮iُV+#X|%|1)IݱcΝ;oֿ 3::Zۢ'O:=p"PѮk5y뭷~mK"+ q\YF.l6_rE>+Wtʗڴi嗗g'N+ܠ9wfX?|CTn۶-::Z~ʕ+c>B Xn8޽{}}}6.0%&_LJi&TgYI&-YaFEEY68r_ c;{k6/(} 9u-ZSRRj;::zzz|}}#""f͚$ IDATeEdd޽{:TRRO?ƮZʉ=L!'ZWWWhhhBBŠ+v%/p7}WǏ_QQqή.ww Fd?--@6ѨR¢}Yӌ"00p׮]|rGGGG.0,+&7QQQR߿V*X&4iҤݻwعzo1pƖ U--m://' 6M !!Btxy&I1jϷ[Vk}EI/LȜHO?RTtIP$$%%&"IB!hjj-*u*99祴ח?\[-J?<Ehg6T*G6875L113RRT*oź33^Xf2|&̳\l6^ᇢ;z??(͢EcdžȜ67:: !RR.3--QPuuw痾r~mٲ=<\yV<332̩ט~wذƖҢԕ11jdN ip:B227׭["hnnCo{KΞonnhƯ_??zRqȉҫjuSOMBLܯܿ_N`? u^"4Ak״BkWHi"$$7ͭΥKפ MBg-$//9r2r\Q MB77ŋg90j5_th-\8K/!rs/HoIwl2'FQ]K\[7V¬YS׮ikk-77^B̚5bx@̙766 !Byfֽ^?Z[ۛFR6{:Rrؼª۵3f<=]n),,_Ŷm% ,Y05xOO%IȜȜȜȜȜȜ@@@nݺ_zbϞ=aғ'2'x,Cܭ s s s s s s)-B{;)N, `d&_eXi qmsg;YI]Cڜ;|s;E L`FSJ&ӤOIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/images/jack.png000066400000000000000000001104441475757676000241660ustar00rootroot00000000000000PNG  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 GIMPW IDATxg\tEHb-^M&FEE#_WI$&z5VDEA$Ap.K̞igfg=sfp(M)/OGEq:h'뎲 !s.F# ms"A F# Z!jkE>Y1!oǜ >^Y燓Fz=}#BH-3@g%NGf(ijh[dҲ B\l޳ [XD"ѓ7Go߃G MYԖOX$fQ59h,|__}ӫVjJU-HjfOEB8:̌^;]ފ6'ڜ~f3&zN& @WIENbFMrv${UWא[2TwGNuBX׈_:_Zƣo>EdP  _|Y^Mo<}7(#3?XʖB$UOAꚺ;NhecnlmnLHLz@ dX:ڛq^mǀɈ++56 Y,"$*<_eJ8h&t$bM]zP23с7VO]z ?%[l҃hpǎxfX,l8! _E,[$+)! =jh?B!WosS˫iYf\}6[I  K-p̹Nl%bϤzBX8W,0~Q oE#lC<'V\Y4ڬwϓ?%()[5k&?%44 o'?}Vor&|CrܔںzP$jrI.̿TՈr?39j U|BH 6]Jy^TNsm]89 _Z`>֍ U_{r !OGYE5}W|^ 苲jKS%]pTAIŃԼ3ajj J*gZf_^ɗQ,W:"!sYP$$ YwѫբTJL]UT-%6MNB@Y-S]T 柊L]V&o 7uKKC)-f>/%/ꮤ*G <<32+4*!es{ODCH 2ܧ&5&KLtX,ee&׽%X_ m + ^mÜSB4^574*jkn*`bCW[.#82>}pnJkt6f#֏?Z!E9Fr\b@mNItY0uw!Q"SLI%%)bQ@{_f+ikjidե4951D_KN$ߍrf!F>bYAٳ2c-6_Bѷ"4UJzB>P(vɵ;O!쭦nnZ5H8>qb1ۂbW:646 {>$R&;}7p@2=朿>L\v;53AS]ժר}X$7&5Uu*leHG &lrԿ4-WjP,KNbO,Oie:%%QO'[SQX{XtjFNiUM XhྴLmS_z>A *+.*dWmH$ol3uܠw䤦~.D)G]5eEYt&N$s{]<}>-.uuAoojT3=H Эj]C~}hk-뉘i٘uꩫ#-:qxS#ڐ&'dFcq8"؄_vϣhXNCH:G_W%T m؊uvvF}AsΝ|r-.XYZϨٓߪD6-ݚ_:Bܻ̐&&5.- ;5f\Xs&5e{wB|Ptw4dHAMn]e˾x͍(5}9 }iy  dq!q!q!q ݅6'$'xCڜ 28HN8HNoȒ%KRRRm֯QgvssAhKsss۷o_BGvwPʪU!G-]]]M4iҊ+NTTT={6!! =z׷qpppvvl4Ϟ=񼼼 ]5ߖMjDfީ8w^7n?ѭx[t9s,YDv+nn1&%_~~K9兇~PÙ_\TWW,--}}}n]QQx vYVNvZx+`TT֮NLL|⅁Awv? O2EUTTx鼼m۶Κ5K}HL:Ғ ~?S2 |?$B8`nn#Rwԁ w̘1jjjBPrxYYݻw{mggץ">>LYYyΝٚ?>00pȑcP]3h2eJ~bQc}@6118qbPPШQ!AAA魛Թsh ꫯVZeeez=gΜǏ.F椩/^~]$yxxˎ{r OOO%K߿Ϟ=~ /B?`ee5|'''BHaa᯿XYYrg͚5a„ ɩM<<<"""%?׮]cXnnn!!!ũXZZ'%%%%%%$$lܸQ#ˣGD"ܠ"ɳcs.BHII y똘ByAA7i3 κt\ --j_reYYJ~ӧ  5AlٲB6mffQVVɓQFu¡E5ooo0)33vJMMmhhPUU4E}}֭[h뗕UEEEJJJRRQ>[!S^^\|Y2|bSRR֯_}v==k҈srr8yV ɩccc3bFFFvvI?>8p s tqqi+Cyyy-^ 9sϟ>}z>}8tP6]__nݺy9::˟QLL ]z !"ԩS?Ν;';;;;;>?o<ӭھ;w,++f?{/ybٳ'9޹|&S DDD=Z(?Ϟ=_z\㕔h; Ժ}o߾M%Ȟ7&W](ϟ?ZdG /Y:{l||ݠA;) ""|>رOVUUehh(dv >HwW19ttt|}}}}}222h3|||/^+]&L o߾ ===999:::55u׮]]晖bɄxԩӧHKKںuQg:n1d0}n56%Sk}||N8ѢN'tUѽd׮]裏ڲպ!Nr_55),>STwKw]GRѼxֻΈ#FQzI)/?~DW ! .U&b+uUj6G<8c BŋZF)CCCbffFٱ85xVos}w3Eω}nӍ7[rONeΜ9o9bp8z2h}-j]u/]D>|x+ZQ+:-S::::::o/_JDgΜ鄅,--<=KJLLL$ѣGX޻wS&3Æ #VVVJh2N5MNj[t'O1_F8ȗՕb%''㑢ELm6 zeh_}9se9s(rWGA1N&&&7ȑ#,̭FjoM`o IDATr+466޽b][JUU6]xv;U]]}ر֕ㇻvCJٳgϞ=[S齎ׯ_gΝ;s ̤?IO Νۿ?=3O=177Mwܑ\PPzM6̭rj06 1۷oxȑk׮I_YYIo߿Wy^;1p%E"џI\M6I\SSsy~~iSp-ƐAo8D˗/C߿?uTْ+W1+!!Ayߟ>}:}ӧ3S?ᩍqP,37cbb2h ^jorx",,ח___Sдi\]]b_>}vZA%''YTKK+;;[ \r޽=wee岲S__?۷_~)Yϯ&22r:::z"TTT*:::$$֭[I&tF֭[reRR@ 233swwrOfX\. ̖<Ӟ$Y,p:<$$D,4yklhWTToذAOOȨD$'((f,Ė,8@/B+Jvlz%%%Nr{zz&%%ݺukٲeq8Rjo׾Ο?OOBU|runϞ={ҥK.gCЋl6[2?ܵ/OCk^HN-iSRڹs### |||LMM;2yݻw///b[ZZzzzJ֨{zz^r%555++KCC`С#G>|8Su͚5ϟ̻ͥrj#.{ȑcǎ>}`ƌ .+Vlٲ}"9ps{KB455ϟ?ߕWwm'ć59{rTuůJfUIIIg<[F~NS۱7Li߭mIW\k,''gbx̘1qR0d[l7lA6j~N2gFw7_^ rssbE Ӟ={ [hl1uumisNV Xr|]s{Μ9/...,,TUUvuu>}zLn!CٕMrQ+~ A][!w!9ƀ۠]dI_H3]0d|W?A][!w V !㝎nh3Q_[d7777wܐlbhs>\-֜uo_zt1 :~/M^ۜ ;po 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9@wF@J˱3#9t7[ A% 9tHJĉ 9 9 9 9 9 9 9k̞=-''U.۸q#uֵeR<o4޽ѫPQQN[[+ï@XjURRҜ9s,YҕbaaqQ ՄI&XB1TUU\]]lv+ٳ ϟ?ohhѣ&vcǎMLLRKN_{{{8[ MׯZDSS&PX]]]^^y7f̘V/G6n!l6[OO>#####ҥK...ؚmqy&6qBzfӥKk;;;$'$'74///<<\693)S$[O>m۶Yfb9x<"TTT$&&޸q mq=eߏ:Y1cƨEDDBeeewݻ][obb2qĠQFB+/-_VVsNGGG&'q89[jjj}Aa!!!V0aWZ&e 6̚5k„ ޫV:s mɓϝ;Etqq~uH.+n:CCCXڊ)BzڐKNq! ƏG 89dddFFF7)8]]ݵk:;;555ׯ_ѣGs?wܡCշlR9992$###;;ĤWޞ&,;tP6]__nݺy9::)cǎ\33-[V-[dffn۶СCm9=z>ŴKMvС.zfSN;w駟 )Ǜ5k!l6[ S[[`&Ugll\QQQ__Op85550 W7VDbmmf ɡnݺuĈLy--Sr&'~رG{U<6[cc[7.1kdd秬?eʔO>d޽ᒽsG=x~z!&&&6mRRRJOOgD똛_wbtttd/_VUUݺu+M%%%www>…fO?=VSS;~xuu˗/-Z$d3ioou֭k׮)++Vt>"x@@@ff._UZZ:uTnuuɓ'>*0/If֢W>sRo?@VQQHB2332o& [VVVSݻȑ#F8qT;bLꭱc^v-jr3/^`_.{e;vǏ;v !Ϟ=uuuUd.]JyijjjYYYmmX,jAPNNRٷ$Š?f޽vołؤUVV3A0Տ477_z5mIKKwޝ;wx<ѣGϟOann.;KK=gɉH Qp=}RRR{n%& ǒIy2v؟YÇ|AsMIIQ09>}zƍiiix%@)//߰aϟ0aĉ飥O.yokx7|Bn3==ڵk.ՑWB$*Zrq-]tIII'N9s&d M~ n2h_& 0zdGRL%Td])o}44449\bb]]HNw >H;61$[$O̊?{Æ  ؼysKo[ƍwᰰ*CCCv faa^mhhȠi6ٛdsM-&x>>>/nŚ2=JJJ$ߒխ-[\sv7o^@@?pBR7J3 ^v}U"22Rvxs۷z?s˖-[liEx1bDtt4!ã$>|x벝է/h1BdNvv6S8%˥r؊PpGEE)e%2vӦMc:""B}dd$}=tЏ?X WG׻vݻ7}\&3ϡx9T '-|DEEDs%X,VrrXCC}q͛73ENw]ZZbΝۊ)6Rɛ?|pBȃh"Faa;w!LpECd2 *x nѣGXJΉL¼駟;V[[[ZZt&CG}ļ/޽+nRRҚ5kUUU-{7n8rHs555~~~|AKwNü]q0@rw yzF :bxӦMԜ?je``o߾>}mٲqϞ={iŋ0___+ysܹs333~3|>ܹs9ӧlmm !L(..޶mH$ъ)*88)}vt&377 vPPP*JI-ba}}E+ϬfIIɰaj```oo7^)nf͚:dwwwPYǏg=r䈵?nzz:t萶I@jtA%''YTKK+;;[ \r޽R_DٰaQeeeIIH$:x`sF__oYfM\\͛ZtoϟPXSS[|9VPVV.++ QQQp8̉o߾_~du֭Yٳg-=rE"H7o/ZX(;88Hk)jjj"##7oެCf^RRB$67}ӓYk mllF?HWQQx9skyR i-Iڵt!E"m300XlY@@@sDGGK=mٹ_~-z0y|>Ǖ;9[$Ν; d]55۷_I(>}nٲeMl/LMM[}ٮ-|~qqqqqqeeZ~O8D .H]c >>>***}YdÇ~N(::zG]]v׮]QQQWall|Yf37p~=a9MNQgg6>z-9s&jZ'..nƍM>"8qɓqF8|rY/~E*ڵEQ9A;+--oE"6dHN<"O?U.[D"Q]]̙3} 94ʊ= =:ڵkP Э2x*tQ%%%'N@U@CrJ'@r+s@r@r@r@r@r@r$'$'$'$'$'$'@r@r@r@r@r@r@r$'c +k/_ 9@qV vu*--ݱc?-?[pp۴-Dڜg&$$<G666Κٳgy<;[` RVVro:Z*))baaqQ ՄI&XBj9s,YDv+nn1&ѣG7nx6W__qҥ%aÆ)!!~jjjofgggffOjxLL M-I#P(.//̼r 3f >o@]]]@@dzupp`X7nurss ! zci^^^xxlr g (>)SH%&&>}://o۶mf9uceee;wtttdr?~|``ȑ#QKV__Oyc!d̘1jjjBPrxYYݻw{mggז雘L81((hԨQt`Mͩ+**"ݻgϞ "###222jjjtuu|||iWٳcF\dɜ9slnn۷ 544,,,<<<<==ڽN:T$tuuMLLf͚-ggϞ]^^?Ԅwʔ)&L SX &''WTT_9s"pI3Bh"Sxbq Ǐ000pqqY`AKw$MMM~uHQ\\UUUuݺuO<)-- ݲe >F _uLL !DWWܼƍQQQzxxDGG|ggg]]]:)8 IDATXZZ'%%%%%%$$lܸ5<oٲel6LCCɓ')))F?رc|MjjUd ߻wѣ@___SSS,+X 4=}ӧ Ij|bq +Vlkk񶶶-ݗ<<<"""%ӵkX,[{د6iҤ@doq$'(Ce֭7orW8p 222###]\\ƍG^xv֭L&f/88x„ *!$66v۶m/_?~TG~gzzzbtVO2DM)v1ڸt]vn޼;_iS~ll,322MLLq'geeS 9ucFFF~~~iiiSLO^SS#U8??˪[ncڎ/\%7n%3kk5kv f e%444ݥFsLLLVXAc!dĈބPׯ#X,WB+ ?~𡲲W_}\۷ʕ+[#ڶx-:/ir| :xpD"QvvvXXݻ̙s) CofffR;v,!mY@@/߿Ϟ=w>w!$33)CqUWW׺L}J)))ٽ{EV/Crrr```S gϞvrr4hOO۷]]]]]\###ɷ,-- Z1h% xB!Mjjj^^^^^^ee;t ZV$'h7\.7nҥ7oNJJ:q̙3)wsrrrrrބ 6l&L8qb>}x<%ot722?{۷oBLLL.\ȼ-فmWB+ '"e | iݦLOOv}U_#nmB 9A;mhhȠ}riくŋwv7ncCI9_ '''GGGڵKCCU@EZG^ W->M]r*ƍwᰰ*CCCv_B߭ eۉnH_G=~X[ϟBd(g^l6{~g̘Ax"m!*+++++I3׭:h 5}ڙIB`1bDYY@ hg_t2|p<2HJbb"}ѧOb,Ç{k ^SQQ!|RrH$:s"%5zs.\ u}LT'&:h 5ÇB3E%߻wSNutttttlKuw.--eXsݹsgܹLΝۿ?!ˋx BCCo޼ rDׯ_RSS(qȑk׮I>1ނ׿EU\\~&Ĝ:u"ZT 4B;gϞ۷OYY gϞ={}]x",,722+y̻1ee岲S__.۷_~)Yϯ&22r:::z"TTTS-:::$$֭[I&12hР5k֘jiiegg +WݻWdzzӧY,p8555yyy?Vd-ZٷoߊBB[T 7_|rG}G ;;o߾W\y{i 555L}==˗_@r6y 4,K__S++WRSS444 :rHzruu]fsssɫkCMRRRڹs### |||LMMŋcbbTTT3g*+#F 4($$n]~LBix%tk&&&[e``0cƌ ?~|>rMݱ8/4,)Lȕ[x9;;nܸc(˗/Xuů]sIIɉ'ڒP^'O ] J(9A ̄C 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9wQ܉K&"E,9`bI1hOFSή`S&1Ccr&&FcS (EPR\v < {32/Y 9HN 9HN$'  @r 9@r 9HN$' $' @r 9@r 9HN$'HN$' @r @r 9HN 9HN$'  @r 9@r 9HN$'lj ]K'10g$'h .H HNzj5G׮] HN$' @r @rsJPPPff&] .T'|ҜJKKϟeii)M(..7׶m[)0W:III&M1cC?3gn޼Y]]ݮ];{{=zx{{ZZZrER 6,!!ګ;w^zUZ8qb^8R @]xq…B;;/[Ϗ^j_UM&&&vvvB?~iw$'*++-[VZZP( ҏhDyy֬Yaaa 8+,,466^rm````` ]rΝ$'Y?[TTdaaѥK#F9F>|+Wڵk׹sg??ѣG7<)11qɒ%fz,'ԩ4MTTSSSmll'O]W^)**ꫯT*Ν;Lnbb?kNq>>>k֬1~ &يk׮-]SL裏hZ_󍌌\]]}=z{/B~~(pqqyb˖-ɷn***ڵ>AIO<˗_;6l{رctrw+Vhtx$'em޼966ӳ()))))̙3]rɪ˗ !lmmvZ\\|…^zٳM;vlʕB6bW'OBxxxDFFFGG/ZhȐ!֭[U*ŋ;6~xB CmNي#Fܽ{WիK.ݻwo}3n߾=qģGjrʕ+Wnݺnݺ~[x[ni)**߰aCxx/X r ?)SK>FEE%bccmll>C___|yyyDDD1޽{7l`nnt4'411ONcnn@ 6۷4{zʕ|󍃃v[Ϝ9Nє]x1""B'9]~===駟6j7_cDR;w.))vyJ5vX)JYsqqq޽{!!!/]vNNNJR*omm- :::jWұc:?^ڟ^{-##C]LNvvvNNNUUU[[[333 <'@_^^^'ݻϛ7Oqyeff,z]\\o?Ѯ]k6ٳ\hѢǿk׮=|dIvvڴi|r)!&O<|pRo>xxx̟?_LPX[[?&&&.].)Oin7|#]5Bm߾Ν;jvm۶ɱ_~׮];vӧ9bll,U*t|MuwrrZjsnjgϞSNgddddd}_뭷)))FJ{<ڒCCC jJ*LpvګWzxxZ^a+W$&&8qt֭ӦM !W^St]vt;Kbbb"##䔜ogg=Hft钼>>&hvss,X~ӧO/[lɒ%&&MTZ[[TWWOaaa!|pԩK.]9I&` !<<<ߟ۷رc!!!O.++sww޽vnN+!Ç']ݻwOk_~QQQxeJwEyyժU:uۤ]mvvJ͛7ғ>M ZsYj={jc(dC>sӧO/YD=)((|.g:TP?^E_:uTRRrRupsڴ7|o|ϝ)Sq||o͛7p@=ަMyYe/22/gϞs갵|n8w|F ʪ}>|FYx|Ҭ>Ν;.]'^}m۶hJ޽{o[vvvgB'NhzsrrvܩȆIP(jӋa7' `UUUppp۶mmV_'|RZ4hP^FЯ_oGa]/.=Ԡ6 /w&''7%WɆ ڶm\vBu^铜s͛7۵kgooߣGooo___KK&?=C؎UT|ANNM>}]\\xHN/.\TabbbggWUUe˖5-9 4菜Μ9e333l-d]vmM+ F!@r\lYiigHHBB'$$DFFJ?i}!63f<@rÉ+,,466^retQsTUU !M%bQ^^SNڱa&**666ޓ'O :th͚5ٳ&MT_YYYǏOHH-**ҥˈ#Fs{ݻO>Vm+ IDATll_~m6篼JQQW_}U^^sΔ*77Ǐ5Jg+raJs~{„ t/O_~!ÇF3PVRR}'O;88kQΚ5+77¢.\x9):uo(**JMM.uVJeoooii)hѧڳgO)9ߍݍf$??711޽{~駸8///=Bzjݹs?R(FFFk֬ر}QMHN\411ONcnn@ 6۷BV޽믿^r7|лw޽{_pATN:U 8eʔ^zɧШ(??io|r9UTT?6l۶mFzwڴi#8}~z~վ:uV3gi42=;wǎ{ӳF3PzU󽼼,Y";fee͟?_3ԁkf؊+ݗ.]* .]4--O?ݰaCGU}ILBxCqW\Yh|͵k>|\pvvڴi|r|,Lv"6 9A3fͣGU\zIvޭ}n8~FvwwשdذaBg6gOT*t)-,,l͚5W޻w"--M.#= ::i[7n|L /!__stN&P{7 R|>ے.l^YRRRQQӛ MǸ7gJeb(ܱ\*ШDl@rBCCBBBBBSSS'BLQPP # BΝC*'&&޷f5=ߙ !ܹRVٳGKgng߾}:gItwwיTFuB `|I!LQzNr)N: !.^ի)))1Ν|rssO8!ܹѣvB _~#GPRR"O賭[nɑɓwB4|s;j0T^^^}YbEaac伲m6yի}5sǼ|||u֭O?TVCV' .&9= MMMmmmI*nnnvٳgGEE-YZzs~~~qq"$$D.~1{{{!رc{._>}͛jeeRΝvZ!_ ֶƍ*7Ч۶mrss+..B9R ꄖPGsνx)S<==U*UFFۈ#~nH'd޼yׯ_vww766P΋-!HNhq366VRTTP(===Gib?tѢE#GSRR]faa0p!Ch+?o޼_5+++;;[JV\}\++L}K[׭[K4zҿZCi&]K/k۷ogC8!ummgg?ϛ6m]s3w~ƍIN:hi [[VO~|?Пu>pGOu͙3Ggeŵ´ɘo~~]FBr'WBx@r@Pb ޏ?H' 9HN$'  @r 9@r 9HN$' $'@1 |ʕvuoіڻOJQQW_}%Ν;T*;v8z_~YܨҮFEEX[VVrss,,,t2bĈ#GjQVRR}'O;88kuÌ3233zCCl@r£'puu޲eˍ7.]ԫWU2bĈRkcc#ҥpΝ?0++KPefffffFFFYcǎrUUUU˗/ckk۵k .$%%իgϞPrō7jgg{eeem޼9//O;4puu_ד'O !lll<< 6gİX?WZ_^^Ѯ]&T(ٰaѣO.ZٳgӦM/عsgճ N<WVw_\oݷQ:N2W^rcSSSCCCv4WZdɒK[ϗWcM`T_xya yNIII999&&&Æ ֌1BqرŋϗNBggŋ]zU~sff/_>x`Lieeϻ4BY׮]gϞ-_0aF>p@6m/_.&!ɓT*רF5A@@v޽yp.]:_)6 !Νϓph["6 9F|IА!Cڶm[^^[Bx{{wU{}NKZB}6|aH eǏY#m"77v>~Fvww),Eҳg6QMRN:߆Yf{B5B쬽~r2'<&WYY% W:j%ܸqCQ{Ҵ3&&F* !{P e/I*+ѧpzz"??:ʄ-lT$''̻w6`[mщD:Ig *::m۶O=#G8p 11CݨRBR* /,+YXX9QiXR<>׹UUUjTc-X@T5j̘1;w222*--}kjjZ`7<:tH:=Γ֑#GLsҪ}s>҄:OryA %HjӧOgoۨƊT*>>>&YѦFm+L&yN$!]-ҠSfff ͛)i~Lc3rߛ/]pCH7J4{h?EIR{C:Reeeb+[I&$'61N?/T(7o޼x|"ԩB^#zjJJJ۴i#Rɞ|I!Ĺs礹A'N!,W( +l9CU(ϟOLLljdjj*sJZgϞځL(ӧ'&&wavT"6 9i4iܹѣjTX'QS CCC8zyy۷fŊׯ:ahMsB$%%I04rȤcǎ͚5L1yGfgg;99{:/ ?v옽bرz|ɼy_nll!={ѢEIw-..[`cIII~~Z^~#+l9g.//Zdtb!DHHHc@קOy湺ZYYeddTs]VpG}4w܋/N2SRedd1o< sBsI#I{n/jnnT*;ڮ[.00]vo633 ^jI޼y=zs5 ү7n陛{MWWW_}/33>l IOOw^޽g͚}SSE>fff׮]͵ Zx1cۨ:ʕ+'N䔛;`0څu7m4n8k׮)ʗ^ziݺuo9ph9߭*`BE}}}NDllo```^.[nݜ9stVV\+-L\PߵkWsPHNJOHN=* 9HN$' $' @r 9@r 9HN$'HN$' @r @r 9HN$'HN$'  @r 9HN 9HN$' $' aaB^7c 2"""!!!55ݻVVV>>>Æ ܹ3]}Migqwwolx Z7o\ZZ$)))))iǎ ,xgGKdddllQ} ̏cEЂ6mڴgϞ h4P277_llllѧj$'4¾}cq dggT*]vMlbqj$'4Zyy7|#ؾ}k׺kƍY^^^_%.]ڵkׅ \]]ǎ;n8OII(***++رq:v]Tٳg/_~!D~~;JKK;t0t)S޽;<<\*0iҤ3fvPRR?ggg+J33v9;;gРAڅ5ɓ'###/_\\\P(}||^z%h ,/ H/_./Ϙ1#99&Mz}ը>&$$޽;55t׿3e;v숏/++k W^9su۶mr%ׯ_吐 &4m4oncOј4iRjigϞ)))"HNx4DEEi_{cã~/BH?o|EEEگ*-----z/߿w_?YjjG}$7$''ᅬ۷o{ն[PP0{۷okJR;wܥKd%%%~skqƍ780k֬y'ؿXX.ۙ)))R4۬ms>y :gϞ;tSO5UUUڱIT:n8۷HOO@UUUVӧM+++Ou_YYl2gbbRSSsMNjڵK[߾}{OOO!ĝ;wnܸRK,\P¢{ݻ|FQT_|񅝝ή޽{Rmۚ߷+Dׯ~j4Fut^|u A>i 臡iz7baaaHNx(=zhxFӦM3g4k֬B길{N*߿SN U*O<)8z<֭{V6mzꩧ?&ClH_'PjzȐ!׮]mTg !~:thUU͛8iA94=?Mnc 4[nL^jB oرcNNN>''G.#*--h4ֵϔM_C&5jԈ#D{öPە,..>uT^:O.흘(uVJJJ޽[]dҿOtRiWqFuS=\@@}Vs2HC ҷD?M3Hk$'<>ڶm+/70reiAm۶7nWݻw\ffR{ϑ#G3A%%%I/ݗnii?[.y5yyU}iʔ):kۙYYYJiۻQFC9!|ۂ?2q$/_z3MLLڷo,W| ! /O]EEVvvvMo%y`IDAT;aJ{7o-m[[-Wj?u=IgvNj+ɪoH9臼ij#OcN;vLZ.((8uԐ!CuԾQ;w^u'''###GZQyR>1hJ֘&EۦMK>}:---;;;;;[>FGG8qB:XYYWWfSK}sss333LKKKyQ[{֭uAm'!oAXg[@rgٺuO[XXNLR٫W&lo)< ww;wHˉrw^BBBuaۭ[nݺI**<<モ~tS!ѣȑ#kSUUW[;|Y>}dLwwBi9>>^~jJҹg^>}˷o߮f15&+ٷ-n5o6g !=nx ™3gnٲٳ.]:p |&I2gϞݷoA9rhڵ%j{9xH5,t[v͛CBBWjcKNN}H_'M=xCJJJ{999_RYY#;;;))iMxmOt4w~Ku>k` 矿q޽{+**~~P%-[˫9#G-իVZzWIPܟ'Cm7== ѱM6wȐ G~e!Dqq̙3:tPUU%WyH/rAKKK!ƍ-@J>i.53G?H!޽{k֬YvFFF|||-ڷoEmOt4w~Ku>k` wޙ;wD: o5k4 .knڴiyssŋkt>+`N3v5M^^^RRR||aÆɣ&&&}۬ .ȷh, >pHOQQQMM`_'M/iiixbT݄]?w~S{(6]̾mOt4w~Ku>k` g̘1 iii%%%m۶uuuׯ_```ʢ77 6l߾=!!nРAg{cw9::>3jXX\ɯ;qDK.]~ݻeee۷֭[``ΌիWJ_UXXR,--{Ojfvvvaaa۷oONN.))=4r'MٳԄR''' ڳu/o;u4| &lڴɰ}ۨ4o[ Mkml6 [[VO~l:ߪ&J5}l>uI1zPm֨/x8Ynݜ9stVV\iuxEGGO1޴i|JirQ:< 7nܸe˖.]o߾2--M1zovK|]{srss޽[SSӶm[775JF`#xT0C?!`0$' @r 9@r 9HN$'HN$' MNx͙3&׵n::Ó*x1 @r 9HN$'̈́.@K'W_}Q<$ سg3q@r 9HN$'HNpؿu`˖+V|dggÁseB8:6ii))iBW$СYef<>EZ/x'sِ!0tXSSw bh؀!CTVVߧ8j$'J)4/ !zI{")鲴}{[!ę3IUUhz֩ίiX))p%eʪ& $1wյcBBrnn3 >r$&).=xE'BܹSWԦTV! K8j$'mw\llv,]h޽ϝ$pphK# xT)Ϋss5F]ŷnn$qiԪ/v4s4&3ի._߲eY!!Ǝ x8:<'ZVϞ۵B:g]:;; !"y3Oѱznܟ{nآEGxZqiWUSSqG;_g⧟WC~BݸNb!D~=؁ݻ'8B|9Efx Glo׍9FU~ǫΞX˻uٳbӦi;E6|V=<:'i;q"^ORZZ#ҥsgCBlxAig틌=!hq biw8qcNicjiiQQQ)=>80pH5֔UɹvqqR(jCYɷef `HTTKovӃ7r[vK{3gn*B8;w8ֽċW߹S\PPhjjҹw#KLLLfΜ?(::.=9fffvv6{?%`{b}6JssƏjݺyt'BRc1 @r 9HN$'HN$'ZOll,̙7o_@!֭[G'G=<A+j @r 9HN֖^Ї誡adkd c?Px-'0T2+Ҙ9PuW <$ L!.|IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/images/midi.png000066400000000000000000001360241475757676000242020ustar00rootroot00000000000000PNG  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"AxtEXtCommentCreated with GIMPW IDATxw\'a/ U8~ԉp|m~~ER8ꪨhUW *2"%0o| .w]>y;%BxNn|>UB!uY?Q#Ą9R+ Q#CrhtruIX'Zg/ !K?hުBBȲyX)#?-24@?BIϳ NF>yU\@ե`';%$=/Bۚ58$"hsx/a"x߱C|ɨ!$;46}lkԜoX$f~QɝNH~|a߿J˫J˫2^ Uɉ>9p"bͪS[dHNks -fy~'/W3[UʅcD"HoPX'wo0}= !uh!GCc.N uGj*O)H$9V}[dKNrڜF !\ Q0ejOxcp̽E݊G5BBt1( 2 _&?.Ѵ31ι{W:z^a)O*5Ռ um//.!Dwr*+o%.: re#;jBy7!d ,M;~\̽#aܣt])c{}r|+^mNK挴Fj 4#ÄW{Er+!5ޙbB\]?cIO+t4{ZlِzGmʶ_B-8gΎRsy^N–+B՘cr _Yvr):gC!w+^$:a}i/ !cn{m7VOhTTX_{ӄC/T!& 3SXդ~ZK9;B 9[XB1ש}zk_͈w+*.o%$ uBߠϿUBk{\O~2^}+%-o˩_~*;9$QM>8_UTVؠݭ;YwgO\ObiW݈M>zq&#E \Xe_@PbaHƤk-(pYuBnr1I$K'~C23с7VOrK%_4H/wy|oEcE"V`Nbs~-ԉD;F:_\ZI_z _^~R&~buޓDuЋ5{i556S@X' 똜MKId !$^ڸ}\N+,^VA ܛD"OvArf.iNBɃ;O),R(32aggNU'UGn_1);NYYVQnaiˢ4^ԕKf #18PX'9Tl::sꍹNMj rKLt, [.lDŽ.=s J"E). t5}.ptNںzS"X5߬WB.FbEnbw@ǚ;i:ְZj*BH NqBvLPWo⪐Z4n[_OsbB,-X+(^$'QkBN' 6' 9)hѢQF%''_JN:jԨLTo{6 EPإ}1+V$&&Bvo>ӦM 7nmFJJJΜ9][[ۡC##ݻ;:::;;kkk7agΜ)//www766V5j93-ZԮ<$$˄??_l>gDnΞ7oޛlիWUUU!;g;um6#wd'޽{O>- %M>oZ}6JEEŤI,|Qorbddd<{[nRܹCcSs 8g8%%ϯ~ kjj.\v!C4𜛛ۿɩZc۬VTACUSSM__|=JN 7l+5p-"(??ƌ[s&'O,(@pǏ_t[>bttt$b>OfXR߾,--_|yUDM~^vmyyŋf]RRrk׮Im孭k5Ni|nEE_z% j$::Z697֣~ٳ &;w 2qDXL}||!8}tuu@ hNC!۷o}Ԋ wذaׯ_^\\|=33^z+..VQQ ۷/s6009rdPPŠGM0[nb=<`Vi4cΜ9N _>vڦMjҤI4_zo3OY`烃!M(" Y+9ikk2qqq E"[AAXYYYnݺ~^^ڵѣ-Zm6&M:߿JHHSLi݂233ر(._VYYrʦMKJμa}o͘1EeeeFFFC={vXXӧg͚5|dYYcccE")Stuu[{+lTO6_dɓl”~zPPPmFO}'OTTTtbȐ!233Y) n3ma(u(K,QH$$$B\]]={vfPL֨k6UUUP(WX/0wMhZ /ӄ)Ѿl6ѣr׏ |-Oglݡ~lSs.9|:t(99vΜ9NNN&>|Rss)S3i,nnnׯ_zdr`XF %44jhhp8̞%%%e"D deeK墻r==?vw![[[^v-::ߟ6|ggg}}}:n׮]utt{E0''ۻXMM[nBɓqqq=z`yy%KTUUO?-U}qFBB={F;H֪(w: V }QSSn:.K[lmmKJJ{)UJeFSKڨ:t`Bw}7|$?#KKK=={|={T999Pϟ˳_n bbb[UjINW&$ի}2Z^tBȶm۸\UYYY١CeFSKڨ:d={v׮]Ahׯ˽rJIɵ]\ڜ!۷owww\.ٙӷ̙RɉҳgχBvܹf͚ƶh˯[j Uew)={xxx̝;2nڴ?H$rrrZlX,޷o߉'~ѣG3EYOۖ͛7s-QFaoo/LJ٣5vҥ̉OOO{{{Pj ,`||<I5QJN/ȏ~W5oaaaddTZZ '))|ȑl631wMz-BY)o3ma(̗u(nzΝ;O}_.0`Çֶ믿555S͉ F巙6F%ml<}422zU]]%uTSS:tŋ\Tk&9B/_~yBݻݻGdR5SFFӾ֎yͣg^x1ׯxmͩew) ٶ^\333ᆆy19BFӈzBZ:nj3vX 6]^^dl,{.v e1/ HLLJfff}ȯiTf.7^ԩS;wҫnݺE LLLΝK{{ekHӤI$;::>y$99_~7VV/2+Em}I[׭ɻ]UU+yE ݃]xEEE Zk]6>U'Lc()Z*ZTӧ;wN,ӛRFGGGGG?~ M8 N7qNӈ#~˗/+8]vۗob͡xŋ֦f yyy-\ W:{r䶟w_(>}4)))&&&55rqqiS5ϴ$=zH,K&}?~};&OL miqyyӧOhr^TUU=zD㔃C[_zoʹ5uةS-[ݽ{700Q ͗Oi```(^صڻ8e <ԚvHijBsZ'OFyH"ѧQ5a^|'N۷o߾}#גE"ѩSLw/K&BСCY,֣Gm۶#1s*kkkU }#GܸqCs遂GUUUk׮x 6ȞٳgODDbs}Sj'N hIHt]\U,YF2s6UG;_#-%mZr8-[XXX;$m411ݻ7\ʬ)F}H%Oo)̙3SN3gݰuttd'Oҵl7nի%7F3f%7nܠ^ۜ? G2dH޽|||,--utt222BwHHHkJqqqxxxxxAMM K.|dKVVVFEE陚B KJJ!/Ą߼y^44n8ziމ^^^B0==ҥKO]Aee˗/Bɼyzol3Ibb17bK eߒ8___CCN:D;v( P%wFZKڴ:422ڼy XvmQHѣo޼dz;)ʬŽ6PX_033;tPs5O<9mڴ:HDC& _^jJߋ6FޯBrjL |<'''///KK˷ƏߣG./_x<edddcc2zh555ѣG_t)555==]KKo `J;w.++fUV3ٳ',,,66gsݳgv .sNbbbAAA~~A<==΃>[ s666wWSS{VذaÍ7\BrO?mCfa&@Ҩ/i됆+WŽD[zEr :tǎ|>?&&fȑYk{Ycٝ:uڶm[תʕݻw;wNs3gΔMI oyh;ܥwƱ ~ܰj:;;7xnh/_زhm߾}ٲeZښf|r޶ gْۦŜŕf+Bhh;]mjrPa@rCҥK$ Æ k'U(88X$J$A}%9>|Xq]N:o޼~255p8YYYbꫯj#3m ꫯݥKzㇺ^>QGU\FSSm>Y]SJKKS\~fff3fxaAAA^^ef H$Tc7d`ˇm$ϟ?oYJ>~'vqHN ѣ6}}E6ڶ!muӆ >.~NQµ`O@re HN,>-h=Q_mp✝g͚h?f͚%{Os{k a`R} ϭxCsmvwJh%my6!9µuHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNUT;rQ Ml2 9;~~~ G%@;%RWTT4m:`$'hw222;ʟz$'h Q uHNHNHNԩSG@@ЮX"11QraϞ='MԫWnlէ~:~xuu0gΜ)//www766nԈ999.\HHH(((ҥ1cLMMiaa#2]t)((` 2$&&FP(s: ]֦ o޼xbOOkAiiirrrrrիW7oެSnnnON"h'O1RWW700HIIIII9v옗׼yqRnO%IVQQј1cgggGFF\zU*o 9/&LXhovv]ҹskΜ9sϟ}Wmp7lb>쳉'ذX,BHnnntt~]$'I;wJN;wT<ʼy$cSclRꘁ{![ _UU}}DDDTWWkjjJUUUu\Hdjj:dȐSʞk+W6mD_/]qѢE3f̐;cȑ#cǎ1Bn]]] N Vf뭣Ɩ :taaaO5k% ⨨˗/UVV;::zyyY[[7ak`޽t;$ߕ+))y&B9sbqjj23`jjaÆs1C ^HNHII q.]$r\ cccd)))wD&&& +++444??_2du`Bw}7|&,P($l555_^jUVVŲbٙ׮]۴idleJ|ggg}}}:n׮]$b\DJVf+oob55nݺ “'OCvVkkkׯ_Bunnkעܨ9s&w{USS{c軳fڷoXزԖbz{ߵkhʔիW^|ٳ)ɄcccssF-J(88a͚5Ⲝ__߫Wʝ;w\nB"Kpp8 >{'O:ujƌ&tUnrgcc3vXggg''^zٍ誑FH읠@?'rرQ4iҊ+233gΜqF&#FK!DDDNvҥ̅{bv١C&&Pm۶ݽ{6WH$$$Ц,d͚5l6ӧ̌)_^zE133kJVfkT--|sss___ɦuŋ֭c7ruu}`srΝuuu{?̯i$Ohh chh8}y{{X,Ĝ3gί_Cd#@{CWWCuuu5ǫٳeI||'OJJJX,}={&;e~}JJJ^^laHu .tT(%71oΝ;ϟ?ذa!r"+_h--Ǝ|e:' 89d2[[ϟKuX,vtt 4|JujВ%K~'X|4QɍԁTUUi2Ieee'N8qL;M(>>ig Or[ m7n] jjjΟ?aÆ0o%%%NLvlر#!JpHHӧOG##F-!ҡC;y|FN&&&hTƢ;rk@1%+5Qvv6m[Rɉ[XXqFtȝ7źu6f̘K.BNs̑JrU|Çoܸ#+pBUUzɓcۿHNmgAAӧ$'nj3vX 6]^^!{Fn }/ߖAlbbpX_{ ^|uo&44T:chh(;:JKEH^`$e*MQrɘ|R ADy_}MN Qʌ@3\uu5=sLhh(&E9zh}iӦM˗/3=sLz*$$I'&h @>6##i{v۷O=h7[-MkjjvZze\XZZ_8''СCy';K6m +**}G:In;l"q&̃dװat MMaÆm۶~`fee)[Uoo LM>aJKK zFpN:mٲݻ Oڴ!̙3h_om!LFdiԷo_ju_k=rTzzz J>>:::B;$$h>>>\.7 `ڵRwV999ǎcz^ŋϷRQQȠw<|QFĄ߼y6э7'޽{Ϝ9s… .hhhVVVҞ˪'Nl":ZzwbbP(LOOruutԍ%.]ZYYG^XXXRRBQVZ@55;vׯu×/_>}t7 L?_6occ3tPwww_l6;88QQQyyy:::NNN^^^-rʸ&'6=k֬7^pˋ^lodd{n4:ژdii":K;w.++lKEEeƍtÇKJJmmm?ѣG4Zoٳ',,,66gsΥ7/?zK.kiiq8~ }>C[[cǎn``B[[[[[.///,,,,,yŋ===DΎ zT@rՄ -Zk׮{tܹ X,g}6qDE͍޽䤤yIƦbٴꘁ{!_T_UUΞ=Kcӷ~b [[[z&͘1 jUƋ/.^H_X,7n$&&:thVVVyfP( sss'L OHHxj6'6ónݺu<յkW77ѣG3y:u*ۿ?!~KHHSL*,׃,Y2i$e#G!cǎ1b2r233[Ɩ :taaaO5k% ⨨˗/UVV;::zyyY[[zOJJb^{xxlڴyΜ9b855UInذܹs̐JJJ轘t"9<44jhhp8'RRRv-LLLAVVVhhh~~ҥK͛7 !}b\JX+-oNNwqqZn݄Bɓ'z!;ׯs!D__:77ڵkn.y-;;[ I`X={TrjbXrDKKK|>4D=zppp|wȑ3gٳ'҂ "k.ww Nϝ;aaaQ<={v׮]NNN 699blllnnިTrZiy֬YC/:zYs玹ʕ+DǏ_8pZjKv⎋;vS^Ftc^u IDAT|FH|C?'رcFmҤI+V̜9sƍUFaoo/9LJ!;e[[ۥK2yzzۋb.[ܹ̄C!!!c!իW33.3˛\onn+C\xQ]]}ݺuLe^^^|>eXkmm=m4`>}N>͛bh snΜ9ܤmNЊtuu;t@_WWWx={8PP(III@ Ŵ/Գgd,GOII˓-,nz…Ν; |>EV~Z|y !ח,igggkksɁnŎ=CNQtUUU{LRYYى'N8矇*Sk+'-OU5n8ɻԜ?>44Æ  `JJJ ***HYY@ӱcGBHUUlᐐOZ[[FFF9mݑ;5ŔXlB666Rɉ[XXqF:::|Çoܸ#pBUU1&&&R1 .>]Fef(di>xYb$J rppY9s&44{ӦM=kjjgΜIϨVUUsvR UUU05>߷o_GqKر#66vڵ XarrrIA2嶓ѓK*MSSsذaÆ ߮_}U`` rw4x`TTT^^e&'&<\2..𤢢xq]tÇ%%%ڶ|ѣMLL0{ }9Ùo5>~xm߾}ٲeRs>~N͒f..]$ٝ(333 @,6v>l͛7O8++K,[YY}W$'333f<| //O]]ã O/$'#ڵkC/AAADG =h .uQJ$'vٹ}7yB crB%4 9m HNHNHNHNHNHNHNHNHNHNHNHN𮩢 9.),[$'_ G8[﷩S5*33S‹-5jTrr2^5QSa#xkMbŊ533;tP6kmm=|>LEEb999.\HHH(((ҥ1cLMMQ? 555uuu k׮kjjb K$߿ɓD]]"%%%%%رc^^^CE)bb1 '-j50a***?~ÇQ`Æ QQQ,>8q "FGGwErj06>shI .O !Ξ=Kcӷ~b [[[&͘1 BE!6Ahsdԩ<o~-!!盚O2E0u֭x<--]=FJJʑ#GRSSkjjt2a„1c(stQQQ/_NKKwtt򲶶n֭[^А\|Pxȑ$TUU>}::::77W$2dԩRS...>x`lllYYСCgϞvYf͟?_e?Qe&RWWwСZ[[9s899B>|Rss)S3Fq#GBƎ;bĈxM6[iBl@rv'%%e"D dee/]TXhh(p8666<v=lܽ{7,,LKKښ㥥m޼955uŊ秶vw![[[^v-::-<طoP(422֦=T^~jժ,eeef333333]i&Ɏ999jjjݺu 'OѣG>ѣPwqM]yOf&ElYXjam]Pj.85V;Zjkmm;ncUܵUXVk;(*"H 8dyssO wwԍ7:;;/_ TZUU_I&.P(/pvvVT---O?]חRWWvڲo۶M]M6 !C^ɉW\y…ZM-Ν;̙ccc#7ooرCTFFF.ZAR޽߳g4@Y!#7kRr\fwb>s:vX}ۧrPP… շM:5,,LRi}>>vvvL&911Q)z]( iֻB[[1;ddvԝFگ^A}"Uc`Q?Q^'=|ƼGc6kR~\'&$'N]tI*:M1a>_vU!䔔k3m NW=TN]\ğޙTn9t>^WMw!555ZKb1r{!O^#3^@G휨T@}QIU-o:t(N;qD_8xaR IMHNzA Jɓ';{O?s? !AN#G2;wܺui믿N:+WBpBȰa!999ATiiigz̙3gdee]%##wcTn<4b~F_ޮOH$Kj[nUv !III?>>~U3;r;FoCKOO%tw֯_T* D-KHHL&OWjkk7nܨ;{LR6lW_;6gΜׯcf/~W'@qNUΝCܙ.[ήRP,Y/s۷/++O$Ǐg.\(H֬Y@'"2^(+-[V]]=w\caaQYYINKKbŊ%K$'') wyyݎ`<{ٳgmll%Ikk+!6c=w&/W}T[[[g i]A3ܴi|]dddrrog'>|n'OLfee6~ϗTTTX,77^{m}vu766Vw뼽wܙS^^;̙3gΝv],oO?[ou۷oՉD"[[۠W_}usɤ z껟ߣaN1jTT\,^hڵ3Zܨ(?dK -Ei-UH1Csx3PT-~TT@ 8zhW^^, G׫T7|| h񣢢H'$'-[|מnnnBFRq8 >tzyyy%%%ݾ}[[[&&&fʀ@OLHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNHNXO]nnnhѢoӧ766~wO\y޼yUUU[n G錱}SN͚5kܹ};gתU~Çq 9uҥK :ׁW*߿Ua&ioo?jԨ'ZXX#0.{[[[?? &xzzQ*=ѣ8r[[5 dffxaÆ!9+I)bqAAAAAK6mԯ_?ԧwߝ8qfkkk''cǎ%''OBɩM:u޼y/k ɓ'+rG:tƍ ĉ~@Ax/__}N)))#F (^?#Mߖ.]Dc!+))iP(0BSA%b7nZk9ro&LleM**++.--H$l6;"""99{1g666奥 .شiSdd/yf W7o^RRI 6Xk׮D"77?]/I5ްaî\㶶6ZO*#GD/SN%dSN]|)JOOϘӧkmY(߿?''uȑ^FFvhHGGǁۃfϞIyX,6mڄ  G.9r0zn|{z_^{SV\\}vR!kjjvUWW!v͵qss lllC[nܸj*ׯgddX,-[,]p{7lp5Bx.]|rZZûkΝ;;vXx1]ںqFB1}tz7n\vvT*bt̀ldŋepp\.?uT^^^XXXWffŭ[vޭP(\]]mmmU*!a555 0̪K.m޼Ys4]dP(8pB8qD^^^HHIh|Ν]v1 wwԍ7:;;/_ TZUU_I&.P(/=ܬIw. 9=e۶mOII~OΝ;̙ccc#7ooرCTFFF.ZAR޽߳gޔ@BޞFn֤;z?رccٷoAAA .Tt6u԰0J5ѣ4/[rEzxx,^X}.1c!^ =wu/!d&'%k^ IDAT'Iҟ~+7|BȖ-[?~/666F%l3lL޽{ o4.YDn`fҲgϞ+WD΄P\\OIMM0Wf2MVVV|euu\.6 Ɵgz=~ejm{ifM*~ws}NO~J'OZV\\+7nܿ_$rJ% !eee4i_!uʔ)z[~Jp4jԨ/޾}ۘ[oٟ|IMM !?TΟȌSpz\322Çvi:J@̞=[k̈́Eyyy ^^^Ç͍VcEGG/cAPPPyy޶>pBBy<޸q㬬ibi( \СC;+T*%X,S=4f&޹t$&&gf<=٬I*\@r.]$JJGN:4lkOڽׯ_g0*믿޵kSPi м6ٞfOwMoV:YGq\S?3O 3a(ݻw;{3I,1zQ Įm۶[:LZPB`f{mΉJ ^{ :v8q/=aR{ HN}РPTUBN6lmz:UZZ :̙3 !gΜһNKKKFFF=aR{ HN}_7B$Izz[Ƶk׎?NQϻYN||սڍ79mp2eJllJڰaW_}U^^~x<ޱc̙sy{Y\e8sӡCģ3xe˖UVV*%K|z2w}eeeD"z ?… %IVV֚5kt@$BKR7o8q255U=A\\\^^iӦ/R=رc>Օ[oѹ>%KϜ9300PPTVV7fͤ+V,[zܹ¢NiymtŊK,)((HNN R('..Z3_t FZZ?̳gϞ={^"B,--~m3s{gR{s mmmM0oC&iӦ3f 0ȭ[v/2,,aK.UZZZzz#lll***|رcW^moOX,T*UJJJppc/^<`C.[lРA w-A76Xǎ;&Mf+**R;7_o|Llquuݾ}ܹs|~mmYvܩ+oΝ'Nttt,//H$4]5'XXX̟?Ϟ=3fDVVVaaag0{nL*~/`899=VFEEi }ŋ֮]V2{GN4 ]7,ZHkG8'g[mmmqq1 E5q#sxӅGVEZ~Jz7տb񣢢ѣG:477oٲ믿tss 555*,Xy < 9xyy%%%ݾ}[[[&&&vۋ݌f̀@Oq$'$'$'$'$'$'@r̄ I$gg~={F^t/s@ 0f< ๕fyzแqNHN ڱcHNFŦP'@r0*6B D!<ʲ*++͂ٮ_beWݹsG$uW믛Y.+===mllPa 3 KKK;;{zz2 d2>/Z[[ G~PScv=BP(DJ.x׺>RZZZ__/GЀzl ODZHN/4&d0o\.W& 9+iiiIQ*r\$D"@0x`ST*VVV 1>]gmm[oBn޼X把^{iݻw HN/4oo@ԡxyy+P(>|XSS#QΔzYPXYY999i>鐈jHѯ_?OOO򪪪v777c`i5GڔJ%zU*joo ;AO~2LRX,777zPS{{;mB߿?ér~~~}FTcPnaaagg_s#bXTs8gggBHkkkuuucc\.gX>>>O9P*555wD4@vH$'-f응7 b}RO5ooooooﺺ'&R:r :&CrV|///| 9=bqKKKYY٠AŽwT*z#:?~beeET JeIIǏ !VVVvvv2L <~8$$MyRJ2,88Xs۷o1 RY[[+ xlI"BTبSQ{{;w詅VR*VWW׿+{e2Y~~~{{;ɴW7ghhh`2666bX, B#gb1ׯ_kkX,.,, .((P(,KPH$+J?HN5zF-5Rk4c`GGr@rzf0̐7o|^VV&՗l6˓dG7a=~bKl6R>|XYYy޽aÆi */++ #kkky<Rv޽6GGǰ0kkk- 6kFB 77 t RRR"JmmmlmmiGNqqqKKݻw_}U:;99* 7X3i|---t@ (//g2Jf)gg`***h=<<ޔa8/=-7Е]^ymt=pnfjB8AÇYhWdkk;p@BȃA]]MTF>wD3pz_+ booLJ4D" AۈkI5BNtOҶOgiiIA v~2fu)bqSSM{CCC 4XiôR=kԛib2d0RTTKꮬkkkBAikk-7-f15fRkh )u(Ze8^$. ?{.x4p@h\prr}{}}wJy6D>PB5!zm0ix<@@=+];dJwI8ruuu\]]5uoii۶.T*Pޮ7=' ٷ`0# fMabޙtS|3]5#?i~+=~3O1iV^zBs4hgx[[۽{~t~Lj~7F`fxbP7΄w&L:%ދvvv?V%'⒒_dee%.z:˘[Nw&ߌ7BWcv={fӜωf,{bك 9Wޞ~: Hi)=%hkkI5lu{v1ߠŽOOO[[[ P(^ŸFh(4E,b 떽 4fRklllf|vЎ~ N=^3*]S]ªYm0i=u\o3Bu?^0A ttt899KOeП6V]?;ޙT.LOֳ[899?UҤfwSO?}"d2=;$$ѱkJ_7^>]h|Llϡ:Z inV=rY_8Qڝs]ޙT.LOֳ[h^ ugJc¨CYR޽A cl>o߾P( ۷>[[[FU8p直hiiQMЯ_{:::jހb$H$]%%% ҜI~:GGG6MjNm|LlqtttrrD%%%oA@Gqttljj{zLv]f\n}};} Ńz3/z{{D"zggfcccޙTLO󳳳uWVV/:t(p0u}ꫯ///Wګ;?B0 9\ng?Ed466ɍԷ 0@( {+5:xuu@ f0}8pBxQqq:oAAA/ԔCoH$ 5`f{NHHC|Zωӧ;ʘ͛7vآ" USBz ,]zyy8pE@RRҼypjmmzcz fԩqyWd*.[ȇL|hY,̙3!׿}JJʈ#!k6 9>'mӧOoll!ϗJӦM:\r͛|>b7n99RRR7y &sQTYYY?siiD"a/_p[ZZ}||bbb5xdSN]|)JOOϘӧ}͞=;22:tMX=mڴ &hna޼yUUU[n 7oBsrr\]]G{edd:uj֬Ys5F222{-^y啋/D~=qaÆ]rmmm6665999uuuJf{xxDDDL6MBl@rx۷+J\^SSk׮ jk׮\77Ƃ7nZJq XZZe˖KnO{{ ]Fa<ҥK/_NKK>|xOi[[ۺu|?,,lݺul6[_`Yxz} ,!رccٷoAAA .T_:ujXXJҚyaaag`:8ŋXx=c Bȑ#G ;wzݺu46丸8TO?]cκu뢣kggo{{{;{ !46]^z5|/OOVVV|euu\.KKKKqqqQAAAII Zfx'RRT/:ZظrJT:a„;;;&ܜ=.2=ҡzWhkk='oEWl+~v'gLGںkXc^%l;s}kԜÇ_}UAA_]v1c'6;ʕ+[cΜ9tb]tI*:TkAMBgq(TfZ>iIUxg3f>}ٚ ݰaCJJ =p])fgg|g,+66֤w`8]Ewv%b\ѽFlO 0tTގJ }\EEٛ{w !3gnmmmi&ʅWcii~!߶ IMHN! Jɓ';{O?u?Ip8 r"9`ܹs֭[OeOccc FaaB Ͽz*!DkxSD\S rRKLLtqqѝۀ1cr]djcCt_ފOH$Kj[nUKv !III?>>~US;rޣ{RV^yoD"9}4˥ 79ׯW* Ѫv!!!2O>Q_^ݸqaư5kdZ0 :%s.]iΝ;/^(HKb?Hy饗 տ8'6ΝC1'&&f˖-T(K,/>dܹD>?qL… %IVV֚5kd@$Bϟ_HrJgggwwwX,J~EnŊ˖-;w.ñy٥WXdɒ䠠 BQQQpΟ?5yI~ᇺ:5f̘Cqcǎ}ݵ5'N`0NNNÇ O>.]sn ㇤dnڴiƌ |>?22r֭FFGGaaa \t1?koee>b >w@>_[[;k֬;wsΉ':::K$wyo+---?q8g nIcRRR}ݗ_~Y*޻w;w4{>z NNN?8QQQ3dEEEk׮}e/ܨ(ÿdK -Ei-UH1CZd>qMTT@ 8zhW BRaaѣտSUU~zJoiA39u}#OHNjnn޲e_& kjjT*Y`^^^IIIo߮s@r6>JHNHNHNHNHNHN` K-ZaժUf?( @:x͛7oرEEE<+akϕK$%%͛7|b28Έ#&MdmmGڙ߿VC.{[[[?? &xzzv}}@r֖"bqQQQQQх lbooG6lXJNJ;qvrrjii).....>vXrr'$'&Ofd{-//X`ә7fee1'ہ ._?\~]3 > 9@_bfΜË/_Bȑ?HcѣGk+))魷:qJ(߿?''uȑ^FFƩSf͚5w\ӧOoll!ϗJӦM d2٩S._JgLLӵ7P(9RXX(L:R~RDf#""W^yŋ"_~2隚?SWWT*lGDDĴi4[_6oLpB͛Ykjj\rM>bƍ7~xW rȑ#foo@2u} HN} ]dP(8pB8qD^^^HHHg)..޾}R555v<B/_^SS`08ɬt͛u ߺuk VRB7lp5Bx.]|rZZkBAa2VVVˍ|?[ZZr8% ݻWTT4bߘy{{7.;;[*FEEl؀ߵkWnn[```cccAAAAA7VZt-PHCmOod ٴiP(2dիhZr :{ȶmSRR'OرӉ>>>>ӚvZ___BH]]ڵk֯_m6ݻccc?gggJBڵk}ѐ!C!J{ٴi޽{k:)b@@֮tgΜaaa֭SgL[ /**Ji̘13g Uװ4===+++&&^9 Y@x`>'xX5kD{AV\٣.\Hc!dԩaaa*Js|BHjj*MիW3NLa0\.ܹs֭Ƀv%''Iҟ~Ԯnݺ널3gjut>$kY,V\\:u{5=:,,L3z/[rŮ?&xyy7nBuɓ'k- #|C'N`0NNNÇ CFoرc>Օ[ou6eLL -[kggWYYP(,Y_tׁ`0dff={ٳ666N%`iio$'>{Ν999nnnΜ9svIWW۷߭N[gUZZϟ?_RRRQQb^{Çq&9k֬?ٳtb#.%%ڵkuuuVVVNk7>66vٲeOrߗ;;kMߟ"##}}}19B,,,ϟ[o?uuu"6((W_?~yY@x0~+pUtgxv-^hڵ ܨ1cƘK.#[|7-Z(cLJ/b&jS%=ڕ2$'x!BRaaѣmll蒪׫T7|^xɩAx@r[l===܄BaMMJp8 ,@}/@@r+n߾]__󭭭cccW$'x!lotf@r@r@r@r@r@r$'$'$'$'$'$'@r0%Jvq -F ٰj*{awjy;}Jst}NXtiAAARRҼyФ^^^;lnn߿?^;$'xDGG999=fXYYY[[.SxÆ Cr@rQ?:u*z8'c C2ԩS/_xJ3&&fZk 45598uԬYΝkƳO>#ŋDddddggW^^+LP(d2+>|8566@"^~=;;{„ HNHNŦMJJJ$ɚ5klllr͚5ׯ 6o\[[zj6!lժUgΜaDDD,Z>|822رc\;v$''}2[SSSLLz?'޽;00_koo߶m۹s"##J{HHP(TT{W_w9gH[U_NNNLLFr*..y󦞞ބ ԏŋbwqq!"RyСj_H$zuvvvvvV(׈?SEET*]n$<'x䤧ʕ+Y " իW>>:::Mr?=8n .E _} 9 \WW-Vݿ}A-Iߪ> IDAT`ĉǏqrrjooOHHqhѢaaayyyYYY[l100Ʒ yNTaW(,,*oc1]ݺu-{|ڵk}uR_Z˗/߽{W"8::aclx@ =zkg͚5~'|U{5nIIID& 5{?IK</++;'URUCCCjj*<xtC.EkjjU@rRmܸV&+ʑ#GBD...NNNk׮JKK7l ]_.4}S|}}+W+[@CpppSSS|||xxP(d z"ZxqC[bbbttt\\M>'//~xbظoHNIkkk##ܛڵ롱obx|˗o޼)f͚޽״k== 6?lHy„ hRZ~Je=z4Ԙ ?ydnn[ D"Ѹq<=={ozرMvhѢ/fffVUUUVV={6~z366n|nd2-x{k֬Ph&99Y&ugRll,;w (lu`sҜ>*ڇd2\.?p@o1@r?<++LJ_^RM8- hǖz'$'G_׿oKKKHT[[[RRR$?ZqB@r謬̙sժA9::z{{v!V@r?.###m~SЪ HNHNHNHNHNHN0h~=~'d{mtt4h@O+~~~EEEh'Ԯ]ݫ^oeggQ){ A?rHjjjiii[[ې!CF*d?9sOebuw۾#G466 :_@r999qcc# yڵ^^^hCWWwРA{p=<<ՓSyyfrx* 1 99}Jԩ&###WWנ ;;;j%%%.\rJEEE]]çLqʯJ]]ݗ_~ѱg""mwzHp.kEEE;vpvv>}mXyppz9shYo &$''FPV999vR*%%%QQQ7Z"JJJx"" 4c $ܹ322X>9/ŅJC͛7";wѣw~~ƍ㽼|||4goo%KTw>lޖ-[rT* g%%%+W1=zNDD:::7n 9s_۷9s~[988ss͞=[*T*srrXZr%יdaazj>Uf}Hm8o4ydBqqT*Uy;::ٳg;nʕ&&&얯ޙMu~]Q_ڵk:::}7kkklٲ^eզ5[Bl@r@M`llT* O:u9s:t˻̙35JPEEWRzM+++6bYOVVX,Pcƌ{J*H4ޚ4i]zUҥK|͎;m۶u֣GQAAAMz%m{zzzCYB}[www.U&M=:\F,:1///;;[" ggg@┋K_=ƛ]H4ʵٶ-))Vݯ8}:[.+ 9uuuO<{-H4n8OOOo޼y߾}AAA666w^DʥEdd$ݺ[nDYf-\p߾}|whhcJJJqu>{a`R7Ue2e2o6?}bΝ!!!ͷ?,}NO&&{$'z'$'?'V%@r@r@r@r@r@r$'$'$'$'$'$'@r@r@r@r@r@r@r$'$'$'$'$'$'@r@r@r@r@r@r@rzd_TT ++D ϩ$}}=OOw. UU݉O,]&MDOtoii=w@hnna{ȸNDNN#llܤDyQjjfkk/*i04|\h2SKKkz.nX^UQ!g/_xKuvh7jD"fcyLII9A)DT[ۀ?LMH.X22z[FFBXfff|k/D$Κ[b"f55u)J;;kgYǓ~aO1wcbhpkVbmmQTTtZZ6w$`MNN%sxx<ޒ% :w9.A47ttt|}=;ݲewyyGmxJR)ѹSy<ްa"аB~=t֬,lnnIIعCCssJ׻D4wdHNIG?w>>׮߹SxW__J*u0aHdC×9s!55,,7Fw^~9 --ƍ55յkk W:@do )7o߾]gbbq%x  ?r]vsagFlf8B,XbV6Ti⨢j/\V8oqVu־'a,s(X! U#Daǟ&L 9P nԤJ@aǶ:ך'鍎=&;Г.#i "~Fߔ·@ߚ[{@Jx=ۿgGr4Vl pHYs~tIME$JtEXtCommentCreated with GIMPW IDATxy\ wD4\B*!n*XVhGEk-ڊ*((! A@nB8|,gfg)t:BuuPR =0B!~iBsNx<|9x|'_ۣ/^"W:Ϟ;,X5ڰer;w#%!t ]9 t#du\ŠWlUt&Nm˸y!{ tzO9폜rN~1@ ;skz:Kwq6 BtZ!k`4[jiqcɸMD5T?0tz9?ăƃ?u={& hTͫ @ <_`LiG#jwB/aOl,xʗuiEJTٗIԔ@ Ys;9I9 Bŝ"eJ{[dkR =z+C-1h@WP22:5'UCmp,Ucgr[()h \:BH&rjds~>GPl,\6MS]!tʽgc>72pB?mw(-H]mc;{WuMfFzO33'y# /u !`Ub%TBjAVCWx&X?ˎitURkmm+|]Zz5]sBH(g=/Բ[ y<>xp&P+7s˒T|ϔhKpJߤ|}t5j[7;3l& 9%!Wx<>BPgܺ45y1?ZtƊlQ| r]]O%<)*y0lyFN"rH!~){r̄'ʞ6R7Eċ]q0)?u(~T Bܶ'x|^4jXz΋ !'>mhƗ !TI.P_7]y(i/z۞mR<qҶur *%#̚:٤g͏X?/Aҏ"PѷS2rJ!%El ˉCW߷mfieg9-mof~w sy!txIE֜xk 6oBt| .Պi㬆%?{ZŪ/8DoCa/Go;^߉ti%IŠK&UN}nA9ُ1L`7#F dBhGqw9u*c Ǧ0& h4""!Y?e6ѓRPU&Q&E-a;@GW[ GN*O)L,Y9Bc?~C !@[ofmQT/ZBm;`}" BA7WriT@ qM:.NJTeDXav fN[}#!4r)v#B3>K)q}ǑIfa  P -EY}ߎ&_*}V/jL u<:pU]S|<][Sg }mM`OKOXKk# x<Gn6XG( x< m'8$nB:>XG}/Od?~Zv>6U|P*8u BPfAyM:.7)olg_h:|UI"r|oͿC?}.ˢq12f% 6&T&zOw%u%?;+ҚJVCQYM҃FG~H8RE~+wyޛg'ވD a/GBR$n:D0e}gfk7f؆S$O6_޺wPPT/^ՑEOt/8rZ?? .;~+#b^9S}!D]SW\o= 3*>mxɠ&l S3KZu "u|>O%BPg'"'G(.3$!`cfm?z&}0C]5Ūƴ/=uZyav sBݒYz^>wBHM:N}h)?HSK}@CSkAĴ|*Y DN9uZw|{qKq y^"50.;ΊcE$ £DI9cBA;wL142#C4s0E쭀#'O$}S ; /*kE[s7Щ$_7U(Ҩ f.Bz.`E*g)B-RVu4]zUlPyLT}AP44[6K rI.tb2)= /_RuDJ0@;O;O Kk[T(N5@ ©G~UԪH2&Zdp4)"oi4x/#:AG.O+_6pZ(z5l &$fe:xNO Jj[덳2e4;ZғWuMxOUt4]zUo1&0&Imgܩq)p䤬Ht_q$@QtzUʞ qF8\aXT~>U 0n]=Շ"Rh:=4rKk;]YlgZjZOB3rHiU=EB6Xw@-U8Q@[2st8.ENC9 ȩYQ5t: Be<(b:dDN9@DN9&{Q;;;/БKnذ/j=C ͑NEN! GGd]CzzdRSSW};K5 N:;;;8h@G<(/R=C ͑?:"C]$6ʀ r 9 9 9 9 9 9 9ɪ_egϞG$oE9'OOOGGǜ\… KJJlaoN)s:zBx1Ko``%Ę W^xtrr cǎݷoz"ك/^|Ayyy[[Έ#LjoŋlAt orww|6<(((66!';!4lذ0mmm-jjjB͚5kƍbmllh4ZKя?~eSSɜ>}!C_455͛7OI ŋ###E&=zzz=Xçq/r Ov_G¦\6h\. ::z׮]ǛtrTYY9vX8aMJJ¯cccȉP\\\XXL{nG=)TUU>TWWWXXCӽ?@ 8vعstzSSSnnnnn3g<<CPDW B}߾7Dkߊ~r&%NgϞG|```BBB6ںk.6mjjd2 >==ƍ"o $Ԕ+]]ݷ} ʮ_.9,;. ̙CBUWW;wl555 ,{mݛHPf̘1w\SSS|LJJݻGZϨ]t<!tAH{ݻg]Ctt4Co~zBBB\\1ᥥR[[[qN6mZ@@ĉAĜ9s>Pn=+++߼y瓧>|pСY̙3CCC'M ϗoQQQQ8 ڶm7|cffF~ &]nŜBMQk׮%8 NWĪU***DEPDr7ʕ+WSPUU%}vqćܹSmlnn?H:j5Ƅ_755=ܹ399<ȑ#ϡC7pٲeP~ΩiEֆ;O?eVVVDyf@@gIIIppE\\܁tooor^ݝXrRR򚚚455 ]]]]矏?p8C quu]`xL(&&&477kii1L_߯ZZZL&sYΝ;UUUuuu***Æ svvvqq!YFF_kke)}/_|1jiit.^RUUyfZZ9 ugg/_vSgϞԜ>}Zs)3gN:Ubuuu{ ;v999mmmfff˗/AUUU:u*==`,X`}䜺]PTTDѣ%R^^.Q ¹s677,U˾ڿ,߿?w\V/_ 8/Jk׊M!"l";vİ !9'|bXtcƌAkVXXg|i[[1a2`0aÆ\.gݩ!333EEŜ#GxBdiׯ{biiihhCDٳÇ!7nxyyݽ{(fׯ_YQQa``0rH%%gϞ:uG.odjj:`={|yTdo޾}{{{2l 'P8rHCCiӦQԲ'Ot:{MqDFOPzpleeYf!?''g>|oܸXRRDh $gvܹs~1"h"_~EwUAAAUU5""ȠBhz:rss#g}V^}q)32GվxM#n2\z_.]* |;݋<us?N.[К5kHt'Vsʕw荜-Freˬ; +qt֭Ǐ5IWWիW9YXXXXXp8e˖5J@pppjj֭[O愄MMM‡vuu]z5Ο?ȑ˗/ϟ?\ݻ cVVV!@y?իW---дiӖ,Y2zhoAAA@@@bb=wuܹK8鶶qqq#ȸdgccs}6?x̘1=AKrFѥy( b0QzB ̟?ʕy#G͆ 444BaXXٳg?⢤$gAIfIIJ_~]ٳБvBB* NKĊ <FXf ~1tP6!?{I!\]]q؄ / By{태7J3gΚ5k_.h9Ǐ?qtRr.BUU'n"O+ā6w\s7fnn. ɇAEEŵkהyTprrp8/R~S ?/B_~%F{E{{~i 8ߜ(gAI_ 6HR8{8e?;HItsΓg wrr"_ʼnnhF_ڊ_l޼\ٳRRYx2.ٳILtC ;饵k.P8oÙ2eß={:`MuPǽđNf~bE 0jjjŋ-Zdcccaaaii9|^A,쀀bmà|QGG﷫511QK8yk׮IoJqX{xĈO>-+++++khhprr=q1-E@W/W/R^:^YY)&gL:іI]]}֬YsΝ;'w`!PtP)`9uӁVZU^^Nuuus%덣B `0NvZ??͍8 3L9͛7 dJ.Yo>I_JJJ:z/:t߹s'oW\vpO>sL5556=| ]CJ__nҢ.r˵k222jjj*^zK~~~||<>'xSzs,qdVYYKN)R~S nnnGJѭ[$~PzzXG֭y&DNX/'N@ر[Bs{444 ~) uddǏ Ԇ.G(M;=zxx^FFF</???;;;99ӧ?xܸqX[[9R%];vܿ׮]~~~-*_Pdɒ5kL:ȑ# ׅ8㫬Lܩ*;<(Kﮖ_^=Ez?'yȘ2M?!1co6ܳQQQD0$K^m$>NNJ 4f㟶4-33SVVVf;*܋.;]?y:1*DGstH?|̙VGF4V<@P{L1yd !r+qF} w#Y @pA~gq}??^Hq[~Bɷd^5w\kkkkkokoo P(v׮RRR‰Wng⚚p\ǧ~YsGtttBBBBB'u_=(##c֭/fXxbddz !V hkksqq!v$~J -ďzոQ|O?>DsN)))K. /,,$>DEEHd`ow"p%{lqz_Wgd䄄b怀Q?C]]ݟ 55uΝ}< B|9}}}KKKEO"Y׫8pdիX///xyy2Dspp {sRYYy̙+WN)og}IvNq%_ts\~Zb6vXlݺ!QbZʿ q͛7ovznggGJPTT\.addw߉̂IBBBPCCHJ#""n߾5k믿OKK۱c^CC!!!]r444 bXb;wB0 :\VV[ZZfggoٲPMMmڴ)((H|uO?mٲ%55o׮]{CVV,KVV۷ׯ_/6YZj|2Xfmm 6ɇB=zŋxl<F#rT?z};9]T"mFE$ -{2R޺(t:eCؠoVOe$p GK?gy7}۹ 57GrRҖ{9~;t8*8'>j0:INNN7n ,_x@oO}駱 uuurO2xd?'//KqXj}_ 78ПܺϩlÆ [p!>S\\W_{;!(Ћ $IyF|}'Q( 6Hynsjhh贻-V@ 23BQ#'<$'6nܸq>F}{S 9DN]T 9 9 ﳮ!TccҥgoKiNCkihh$$${/%4Dy:H|9KB)#nB9' r "' r @DN9@@Ѡ ୖ ҆ "'x@%DN.P @FMMMͨ )..,W\z xOX,9u9@DN 9OOϒ` p5jjj;ѣ:P)e:T"'z+f̘!co&++;/lWWA{mڴ'jt6;vTUU655v#ǧ!ԯ? /_|ży===y<ѣG֯_?m4l.\XWWw1Пc3dWW ˌ;p~MIB011166YKKdzxxHDwuֹɸ2Xii;wӫTTT "_UHv]]vrncٸfT*|HHȥK>쳥K"Μ9.]B)((|_~S|[p=tЁʲ"=ķn*%|<VV#w/TjTTԄ H+55g2331cFHH4 nݺnڴ?2sssW@^ZZZ]]MI 999aÆmmm{{.BHKKĤƍIII♌0Jn^teTeee]]]SSӺ`T__edd$8{ G#x}#X,XYY%|2??!DyWW^D~~~zz:~=a„5ks@@P? rqϟ9sdjhhXXX4557oLUsbnne;wB&ill,)S 3gvȾ2<޽{'N>p@```TTBPPWW)JKKKbbbfff螭O񒡡t:] GFFv鮴#Gdddh4W^D}}=~N|JJJ 0y<B(,,L=UAkxt4%-Fnp▖Yf9Bbd٨Fdi7W&;;; @|Fb֬Y[\իWCCC}}};nܸ>=[LLL6oތCyyy)))l6;,,MIN訨(={[y"w}BhժU111gϞ%V`}=~!g3xi "'$pttY/)8!c_KJJJJJ$ޓIi\۱cÙ>}̙3 lc'v˗//\7S֧ `L:uڵ~~~YYY[K P(۶m]N(p؄Ӌ/ ihhZ*''O|1ׯsrrTx^}tC(3#G%%%~HW^SSÃxo߾6P^^^DD1;"'@_`0HҽQ&&&rVeeӧoݺճktp`Psss@@r˗/#L#6lp"ɔw^r^},]4<

    gϞ=jԨԌ: cjj"dDHƍ{pnjٳ(;]]qƭZjܹ}6*) N3p~b:OJQ;;;GCgRSS}||C:T\\&#-""bp>>pAo7;;; eXE r>rJ}} rd@DN9@ s؆ `$Lo17*ȨI555 r;]ʕ+Po9) "' r "'scxxx'.\XRR#OOOGGǜ.My[{F%=}Ŋ3f̐cޠX'|+___ijj1d٩ \xf4>ӧ_ږ666o7Nmܸ_~RѣGL&xbRSS333իW;vLu֭۷ogggWTTp855aÆM2kĈpb9\nRR~SnnFh4mmm.[PPPPPk.{{>WVV;</88 ESSJ|:>>~„ ۶m+t[Z{?lzzʅ d,\XX8zh׮] 8p8[lYdyzCCChhɢEdYNRRQWWojjJOOꕮnmEkk]lɤP(8~ & RSSi4ڢEΝ/rǽ{n+]=l޽T[[{dX[[{{{)ǎwvvq!ׯ_G͙3'--0!!ݽ6!--J߿t:>mڴiӦ󩩩 ח\h-[?n:8fРA/_.Ҡjժqƍ7./>}qeee``Ç9_|1o޼pOOOwQ55O6MT˗/?~rrr*,,(rjhh8yݻwuuuWXђe,\]]:t('Quu˩T3gě]"##lmmߏ,\??~p `~8_(RCIIH̙3%6;/Yɓ/_vww'6122@KKK__d.X@]]](&%%]~=//ISSՕh,)) +--sNzzzUUU]]ʰaÜ]\\T{---.\HJJC _p!y+>}:;;~ݺunnn9l$֭[=z$%"711166YKKdzxxt۪4~N͛7o޼yuLLԲѡC񔬬,8U==u=|uӦM_~](9PCCѣeeeO<?b6nbh4/\fnn.X 'bRVU__Ç ./B*2=77_e`8;;'''s8;;;9lذ.-#=GIeDDD[[[JJ̙3Bl6{UUU4XEEٳg999&M"b.-fff999YYYG5jTwTeee]]]SSӺ{֭[KKK)BIIIIIɍ780d x:::BP~t|ٳݻ!---7n$%%N8QO|eIIСC֭[;,Eޞ$ rqϟ9sdjhhXXXbddi&@ .RyyysYfMPPכE O0N>}T<(ۛhrss377 8O#;+^ Beee8FTTTuII |ǏO jjjs;5uTsssrd3|-[wrssq[ۉQ__~PPP=۷kkkOG.6wﮨڰaXQQq5%%%6!<<<8Ε+WSB0 ȑ#={ZHMMk*Jl 6 ]]+V?~|„ DMM͛7'vgƍG\'Nܜ,r:F?^__p@```TTBPBL&̌<}С8;(9͜9S.z6:rHFFF#W(2LcccR55+V\pٳgŋpϏz̙3۠1cm Z뀜:RKikkkbb"wXQQq׮]1r+Ld6oތedd찰6rʌ3"##o߾_۷o9T|Mi8 ҥ{98Mi1\@MM .^h" KKÇ t cmm;6u5$æK9lUUUܹyzz[ceիWJR(U(~AAA O6I@_tm18A_KKK%>K/~ؤI444rrrqiݼHָ tSRRF=z!!!~)Bի_'Oj#q>$l=Fmll:up ;ŋv7K "Z[[-ZDM6TDN8-oFPsssqq!dddwURᚚpH#EEEbû_*7rH_ŋ⑁D>}!4{lVqׯ[ K,L H:=|$<~"'{pH!w+H& ?I&OLP233322[ɪ*GGӧOWVV šG%g```kkK^1QӉb6=mڴsZZZ  Nw"'K(Yb@__iC[YY}?g**2{ ,]4<|8U~'`Ѐk#F211qrr ?&˗/wڳJ:\ xX؀YÎj!X/_޽[ 1Vr!ݿ_GG߿"MLLpDBVYYy[nɲ7nXt)hzzzk׮#"(?DGG+GL߉U?N,X0V ; 9>AD_cq...YYYo^~2BoݴiSnn%KLMMy<^qqc"d/LRkkk#"""""t:%:}wj8%#moƏ5kVOP(?s|||DDӧnKx~~s( eee<?׌(_קرC[[[OOb  doooiieCCC55bi&mHlŋ>ؘJ}}}n$!2ggϞI[nō͉~~~xsC///Yv%UQQ Y` w8daa! ɓCBB8Nrr2~~#G芊tuu?+VHrS³g5jTjj*n˫P(:::...:"\]]sssT6a˖-/_.--!]D9sdff~Z(<ɉ^^ݻYYY/_VTT4110af:ee{޺u+..ZZZ&MD(((߿ɓUUUjjj666⑓_spAu]"aHC nWTTuqqyiQQĉ;=Blll?~'OTUUq\MM#F8::~GN*Μ9sر'~KQ~S  n#DNtիW+**jggL***~'6GZf $9_kkkVVF322rww4i @  9i ]}v7uF]]= s  "'ox ;o "'xٱX,EDD=/z(Tcs5 +"' r "'{D UPJhiA @;NGr`CEO>~Ί =; T H3 |oI&2;;kY X o9kJ@|PN@o1ihh@555(' v_)L& 0('PN@9ʑ#Gh4ZDDD*i4Zii)T,[F,KTTT:mllwt!l6{֭T*UYY񬬬XV\¯}__/eeUTTLLL&M4m499O\v-33UMMMKKNYY p56=uA=<<-[ ;ͷl``PQQ}^jUXXX/)ܹsO::qĎ;w At222jkkBBBP@EAAa֬Y_ƽpmooobb"600Uʉb]|~ 1c$''EQQ!`0z萐2'O"Ο?pN:o< k֬!;6<<<ȗ(--<ҍIIIw-**jllTWWۈ+rܨ<bŊs [ZZfΜ&|MMM111>xzzzh8M裷lٲҰ0 I$ٻ GpBCCӛbŊ+Vݸq#222##d:;;677|ĉo555M8Դr۷ɓ'uuuqqq4ѣG%%%8w}G>|ݺu)7nܸq#BBKZ:t޽"6ebbbkk1c1NG/yf=i$55>z >ǏOOOWTT655P^d[d6-&&&##J p~6uuummmGݻwBSNH/((8rmkkc0Ǐ&d ⒒pq!C$:ttxwNMMETVV&$$<|0 `ܸqW|ixx8RVVĮǏ9sFIIĤ3lܸ`ʖ&$$u Y#])Rզoݺ7''ǧ|d%`|˗/_|~!m۶oߒS겲>9{sĉ+Vmo/mgg'=JTr{{{" !Ç>X9-~#t3!mmmpB9;;/\pȑH*** JJJrpp>>3gI(ޠArrrӥiɒ%t:]m`W^Mx;%%+##3zh!jjj:::l6UUUlKQ`B65JFFŋmmm455uttX,VKK N Wo+O0!D:Wihh8uTrr2B&OLRɝаaBqqqDsrrlB_ \kk֬{e@@̙3/_&0cǎ`0' pyܹsT*':!1ti+**n߾ݯ_]vaل2e É8d֭xhFFF]n.noo`PTTYfgg#n݊5 >p۶m^b6!IvjSjر˗/0'߹sD٬JJJuC|}}\.qΝ;wgff޾}Ç޽#F.]$0mmm3gμ|͛7bBwU]]|r33X k?c޼yяRWWGlK6. 𵐐plllpTJ'7S"^ZTTdeeE>}zNNΝ;w\]]X_Xxzz.]gD߄$+E ׏<~*r,U]]+Vٍ"NDΝ;Ν;  PAr"HZ<{͛Ϟ=+...**jnn&Wׯ_SV"O)@6r",t0ϟ?HQ C$";xg TUU˱i]{JÇU  C`y}}=vyrEt:MHJ VVVx !4zQ8!~D޽{q4XZZx*++st山!w޵kDŽr";:\X[[zQ`nE Fx<"oEU. >}*q;aD@MSPP!%s&D$@ 4H.PNUx<!$FR'fP2**J`ymXX!VRSSBԩT*va>000㙛c&$QtH]'<<]DI7qL&s̘1#Gtqqqttֶ:pyГ ۀ:aԨQyyy~~~ \.w ~,\Ԕt###b\mmmdddddFKK mڴI0&&&xy8B4-%%%22211GΘ1NuR5k466&%%m߾]UU3L#Qdddb}WWW#ؼy_YY7Vx=NF$jBՈE+(((ܼy8P`U3_g޽ɸ x<{^jΝ;+ða&L \w^񏕮<|>__4b0y.&&Piu9@O6hYِ TUUUUUچAdtuu=^RRp̙s!Swwcǎy{{[YYZiii3f'N  &99nyttt377a2OAA! ((IQQJSSFm۶XGw*Z^^^SS3tP___hn֑#GMMM -Ztر?"QF.RbРA񱱱׿rXr,ш#233=== ```lٲo+ek2!tzZZJZ7Ι3o4h|MLLfϞfE$''ϛ7OGGGث!>| yk8 d>ڵGtɓ'ǍGRC|WH_3wrT*իW%K={OÇ.gϊx7@%}--22 Zv@bSu sQn@僂vTTTYYY(}lzm L=͛7+**f;R3w\JPjjgz8.j rMEEŁl6^gȎ#GPiѷPNܜ+//oddA r033Ex{+W (':`ԨQuV:PQQ!ntwEPN@&..~r1L)L&+('>'kO@\`n('PN@9rszN'fڵ&Ї#|[x`@L;PMM  :tƂ@9W #H̭ ('PN@ȑ#4-""y4SZrٲe4-??Oܚpi/_Q/@bdAEE 5 _ʪL4iڴirrrW}ڵV555---ssskkk;;;ee.klԩS ԍ}'Bĉ]}]{{Q<(pիW=JPΞ=I3sȑ#g͚eaaчnaȐ!Z[[,X1cƺuV˗QQQ^ ,9rpS3J[[[}}}nnnnnnBBBHHH{l6!$//RTTTTTt֭;w:88|ePYY9f̘U ӫPN~!,--{I!|vbL&d&&&̝;Wۛihh|CHOMMzǏ ![__-֭[x))9sevCCCttŋ/\@;wd٦>>>222!ɓoʪ*''g֬Yt<ʊ{r"9BÙ'Npttё=͛7VN'29˗/틼)qNK:99!{Zrrr!!!666Npvv 7n\6&V?X +'PNNyWYYY}}=V]{yygϞ2O0AQQgIP[['FhmmGyM30f̘߷(**" Frr'Oꔔ *?{ljj*vppXdUB<Ջ/tHtttxxѣCBBpN<UGOOoԩ# |޽PfNXX,addDdr欬1cÇxصzÇ[nƌ8d 7oތۯ^zŬw;vҥ'NiItS,KSSo0͛|ikkŪUȵ i~޽oD8ɓ'.] "9~xDD˗/gjjڿ޽s2L7nXaÆĬ^p~ \.7..NxݻwBSNWZ`0?( }sG:::x Xz95jQaa!%'qGR\nbbpIF߉o߾{,ISSSBBOjjU`?~[PP`dd]TTtyo-X,U,B(> gl ..NFF\djjjVZQRRCP Fdd+.gwU pٳg… ]UUUNNN[ZZ8ׯ/\0i$//I)M!mp222~N%͏_1qiX_`s>Nff&BH[[;B .9r$*** JJJrpp|xԩK.}?vƍٳg ,,,,,,9׈#D^KK˸< Jx oԨQeee/^ "4>F+((9s&𲲲ׯ_+**AXRSS)ʆ x<^ttSBBBN>Q*0nnnWAiiio߶rvvČVPRRFQe(>VZZVUU6VVV" f0;v044N;v>|>-R[[{m-''7waÆގH455uttX,!}444g~skmm>}:yVIInHVdM566"TN4?̙3cbbBt:&~III޽s[gԩS!r7yd*J~T 6*999rrr[l!֯_5x5kɽ|2 `̙˗/߿2;VCC` ;h4!fffk֬!S͝;Jtlҕ`DVN/{|Nbĉϟ?pH [}v~vEYYYOO)Sp8Xq,#fȾus lTTT'W^tf---]p}zt.D?}Kmmms ;;!uV,pEl۶MVVիWD3U)/^lmm&LJW΃5PMM V3\.c5j ;1S?x@-99[[[ \hҤI!#)@ogQ3tWiUTTa222MMMIIIAݎ?Br<߿Ef@Y[[PN*}#6JVoӦMNLL\r%KLLljj>|I4&$}r==A{.77W__˗---X0! SPP.'':1QJJJBBd2555mmml_F1} ;B"%#ڀ@z}}= œΘ1rǏٳoߗ?166677/,,|͛7oLElR)d" rA5ϺQ9hw3BMIIȶe˖$Θ1[nJ=C.?+W͑VzZdIœ&PN  ~76}tʲٳgX>ȈL$CP(ɓ۷^xqܹBIJJϸb1}  ]vVTTIdǏщ'Ǐ1ÇH(kAOOϮL6`ؑˤJI&|!"IXK'O>zݻw?|0h kkkNHTήW Ϗ$6lȜϟ'D9"M@IQ uuuB xsxn eXˑK%PSS:vBٳgO>1!GGGW{x9)//G /WCx,Ď TUU˱i]]OTJ}) UERbb"MKKkhh066x|㱛 }$-6P__;Y@J - |˒]? {{Z.IWDIJy_&DWTT˅ !7 Bɯ1#"($%&& ꤻ) SZZK_aW\I4^ޑx~SoO[!'xW CiiiH9ӧ޽FO<1F SLAݺu ?:m ݈8P(---Пp 'ñ7>ׯl12Ǐy`X !dllQȬ+E,^ 9_z%0SL$Qw}gcccccPqlDPUU#U i9^)Qimm%>kbbB_666Y8))iڴi=LNK^.]rMMM>nJ??rb///B Z('<>>$&JR---ۃ7]`9fУG-ZQ\\Ltaaa!kkkYfӦMCR(ă=@= K‚I._ttᥒLLL z/?j) ۰0B)K+wt7n &MD^իW{^B$Q^>44yul=v޾}͉/Jinn&DEE ;rȣ"QRR"cǎ 6lĉ8a>ҥK}p<==UTTԶmF? M x+++gv FVo!i0d'@j 0jԨ!:GGG???ssoB]9!TUUw^A"^#GO(((999)**TUUijjhm۶M>`;J-//:t@yK ?luuu߇x8t萳K^C"QZZZG655*//744ĂٕJ!/h4gD3&beeѿ*wއvĭ==K.}& IDATw EQQQII.\ uݻwF+))3̙3+"4Ȫ矉{2NthhhZYdtyh/rҥ'O7n׮]` Kf׀|78?yihh钾C]V 6 s>e8s ސu n޼YQQoggRb ȼyD~=***8f"4˗/Us'= ˖-hP0|VZZڇȑ#4-""~rFG~N477Ϙ1F%$$Hqk׮;wݻw}}}i4ɓ'wEEEh4B#vQҒtz@@2?yD455VܶmX5k{7mڄ d:ޞ|#""\Gwի F;zvΖ' \]]BϞ=?xass#Nwvvy}_IDDӧedd֭[7o rZZZ...)))N]]g2d<~xzzi]]]nnnnnnffW1(JJJ{챴ں{TIeeeBBÇƍ-ikk7|3ܽ{!4uTǏ9sFIIĤl5557nd08.XVV4!!!44TOOOjC G1u1LyyaÆdddt Ni%5 "EKr v)a=J&EΟ?OHG#ߛ7o Y矛sss?|z2 3rH#)3fx"qGȑ#лpuuILL\r_QQ!##3eqrJMMM>РpeD8;;/\pȑD_TT0ydNҲm۶ UUՠ yT a,x<^ttSBBBN>>}zVV֝;w:7oިaE&""mC޾}ٙ`0wahh];v(.. <|0aI %\k{2L*}vW`0[nAo݈ȰJL,,,,,,$m#F5J8O('6=zhЀd"!Gr333_|b|>^ gnnnCG{|9&M{왷7BH^^5::Ν;knnƖtss>>͚5eeeL&s!<G7.%%%==<K"C t[[[CCCiZ79-J @ڈp8aLP݆ 6l /&K… /^xMrbXXok_xyQ 襸ܽ{733b Gq8?ԴJ$rݩNDGqww/))kܷo.|H2 +',VPtՌ.>ppb*'K+a%Uc0m'''bF'9n8YYYr{: ###ڹrDnnn!_x 轌5J__G=U2N@GeW~76}tʲٳg A,mϞ=[lBBBV3GzRbV|[4K/^~:;|~jj*0RWWmll|y]'o;\n77md2ߍ266.((iȦN8'Cc{WvQVV޻w7|p6o+^<#r?~|G9|%L}}=w!pHN'2tل QHZZq +$jX`>_fJ≉.\ ]x1^@r:wVxƍ#JBd8{,oşӧ"uÆ ݢ/N X[[cBc^z%=AMM 9]zn_YY9$$ܼqӦM<}TS)((`ޭ[%;C LXK '"UUUxyC˥\O> !IK+aŷD-zzzk׮%s΄ ^ZPP0m4bDR[[[{&dD\Hȥ|7E!ά?l#Gc!tM`K ^'ٳg»pAzjϞ=o8p;>>O8G566u DEEe޽fffl6_-))!|N zyp2**X*`ڴiZ "2۰0KMM ũT* "l@gnnBwJZZZIJ]`."Ei?jXm%Q %wDPPG:o< {{ݻw>%%hÇNgˆBw>#<<] df޽ɀq0~8Eh4ZJJJdddbb"֌3ioo55jT^^t:]~}7F"TUUCCCJJJ6nx3Y1))ixj&#p*8BIIIFFF, {Vݼy_YYNxMw_]~}AA… MMM\.N722rqqaFbrڵ۷o mڴIҊcX1m%Q %wp}tÇ?^Bƍ#/\ٯ_?IYYٱc#bΝW\w:th֭|(**N0owWlyMM Ļ444:쬦{EEEoo{ D{ $$d:::UUUUUUaaa=]^55PzB@@@PPbIIIUU&F۶m\rrrؓ;J-//:t/^ ֑#GMMM -Zt1DPGuwwWWW/))p8s9t.&---DgKWڏVL[I;oɝpm۶M0AWW~HJJH6]!4zhod/?_~Tɐ8 dٷ>tK.|: ;wܣGyu4H@9͛7+**`Xa~ggvΝ~IxY):" l6/|ro`X\_/͹FFFѻPN`_0,= 8@9xXzuu$Q<ŋM\\Ccзc2 '22RcLWAPN}^9O,@9@:PN@9r  擭{n0xWXv' PN@Dll,K5OY_@L&]OY__' ('FR@9P5f eh4Z~~>zeO_6UPPPn:PXXJ[YY|'D__\А!CÅں`Ќ3zxx,[L2WTTܺu+;;۷ FFFnnnzzzP}ni'&..o޼illĿ1c,ZL>'ીJΙ3߿ '8:: N/..NOMMŲx'N|W444Z[[ "##3g@J<bgϞ'%%s>GDDh4///`Np;r駟߼ysYr_*O ‰8C?/_Mv[nEGGߺuܹs˖-SQQy1TD,[l˖-` 艻SNAr/EEE???+W|'VWW)_ꍏ>`饥.\8p`vv;9'+8F|[ximm-jmmݽ{wjj*BH]]Ĥ2!!ÇƍDzUVUUU+))־x"?? qt 9tuu ǫ׬Y]/YTjAAAbb̙3΀;? !;;;.._חtw @9h|}}7mtEЊ+:9VKK+--f"tn 4hB`allctU]]cǎÇ 8E;6{~AQQ-44Gxk׮UUU/_>uꔫk~gpss[z5NOKK }pGGǕ+Wjjj|ST aKKKNj>uTHHӧB7oެRvRWW'E)))Ŀ>|xԩK.UVVF]zѣ7nܘ={vwOiVPP/^~$9سgϕ+W\wL&ndda 9_SNmooonn=z0ط֖Splc8ǁO A*VE(ވU,VR[QiUP)An\~!|,1ٙY۷oBcƌ0}^^^VEI IDATVBÃN<(""RXXµĉ7o,!!۶mJ}Mww޽{qhHP6n8rȖ<=h;vᔩ#B3rPTTĻŏ=rU[[[xx8^Y^^%@VVVD}/H)7www6!9oJ^,s̡R/_"7|!yyyD$!!k׮ϟ O9AG !W_ I8`bX?1bٳ߿֭[G,((ppp~ʕ+d r6!\]]_|u̙sMaaaTTTYY:`鵍 8|7 Hq1ݼ{]F=G\u6{z/\z5999>>h[YY fC#!djj='MD?͛7OTTT} !::z4QHJJ㏒w!9A&ihhhgg7gΜ۷o;88y.^wލ5NF3uuu qIcc#Jz8 p8K544X,Vaa/}}}%%%O9 J3gNxxxttIxOA~v6 70 #?NLL}b[ZZ455uuuYPb okbZZc? l Zss ^ÂW~7杝gΜo522222:Up7MKK ޺ӧ#Buuubb"B%X\o{.BHSSSfϞMP3228:nOORn[,cƌinnNKKod?z8׸W\1008s̋/lvuuK!6AܹszzzA}v=ਖ਼O>=?K,177p8ǎ矋͛ׯ'[odd:qDEE^Y[[f'LCU[[{Yn;)))$$!$---[[[DrZUUu'OQQQ7,, $ ߰@ 7;P(ɴ'Ի/_޽{ʔ)bbbcƌپ};yܞ={ȣ l>`ccc6rȭ[OӧOOPј ׋(ׯ)!!!##ڊR~-~w~捳hII k0zbcc544c666={!YYYX, ===!D~uOW#޽{w aDN ML&ܹsu2'O={uN $|ݿ?33IJJJGG믿!]߿Oy߿6PLMM'O[7~ŋ yyyܿ???גSN9s&⒔S[[[SS#&&5c {{{I/^ AMMMOOc0-~#G>}ŋuuuT*UQQq„ |ڵkǏ?EAASkI%=$511r_"ݷX211)))\ )))ǎjq~dK z_7Ĝ;wn\+_ᅵ{8'~b y9. .@nK r 9 "'|v4 pLLL\q/k؂KII81q\/C8߻wINNk8O9#/s "' r "'?|B۷o!r|<==y @Rl("܆/9sQRRMá r) x"' r "' ???KKˠ ( hjj0Ϫ'q@Qem۶ŋϟ?~I[[ >} 5 A[[[NNN\\\EEeΜ9G-,,+޳t"QTTn_555uww'o>(L%//988KQQbEFF?~<33h#o~Е+W444nz풒&]WW{С'EN'rssMHH ?W333(L0$L8rvuu jjΝgϞ!illꁨitt4 M2/XTrĕ+We& IZZ:44 j!55ATTgȑz (" r$--u=dܽ{ѣGPP277'GN۶m˙ D䔔{hǏO4X3s̭[{o߾}ƍϟՉΘ1eΜ9MMMDXӧOW[nݺu+yoߞ;wÇEEEL&SJJJIIIKKbgl6޽{ CDDD]]￟0a96"0cctx MD~Ï=jjj\j޽{{8aԨQxD^^^^g``ϝ;G||e˖8DN|Td0L&SVV]]]ǎKJJBkiiUUUyyy͜9+}^^ͦheee555zg`ǎ Jvww߹s'55U__Ob8y~o&))XTTt̙~~Ϟ=eeexHiiiiiiLLӧUUU{ΛuBBB[[娩>999!kP_544۟aj{{gϞW_vm՗/_{ē'Ozxx]]]+**;TTTVVVi޽{ݻ'O<{9''\#cΝ GxRT*///++ F͛;::rrr޽{'''7ȩDX[[oaaÇ>t,tȑxMNNܘ3bܱF$MOOoookF=~>}1z-+WTTT_W;;;";w.rEN555^%HDNp€[[[6]RRSN\2$$wxeN%x0m~p\ߘh4rJccc\m!h"p} kSNt:]GGr̘17r[F ݧ<ݼy͛Dۃ&b&17o[n]bāqÇf18z-[455/_N Q^UU?ʮXZZZv­JL&300kڵ_Rq)=~1]rnU"n<פ5=Z#Dys"/////\VVBk9l044455`ɺ$B< HAAXnnndr/ Oxo22܁#A888iҤIӧO_lgN >,774"0-D63ga))),SKrbbbsyq䌍qdψi޽+W|}||3^DDd( r궃 "'PSSSSS7oޖ-[:s {{{IbwvvrZ~rSx؇6夹z34TTT~嗫W&'' F_J+DI4<,y8wY <"ϼmnnƷDG3v"AzmRzzz+V8<#""@MY[l5=<1ub>BÇd*Ʉ`ddu? xN6uݻwFNfΜI\\"իWӧO 2~1oz!ܜ{XkI]gdd= Dù{.BHSS&qQXuu5:1551 χT__/>*|555ӦM۳gOLLLnngLB "Dy&joo&=XB,={ʕ+AlbbbG&>]QUV#ݻwO:U#'RWB-W\lB"'N *Zooo6=a/>(aaaJ})ϙW^z[ZZ~'KKɓ'Ϝ9s͑xŅWprr#7 mذx\\\F=nܸ9s̟?ʔ)nnn@ٙ(@1m4===kkkssseeeCC3gpMރw90RSS/\7nۧNgggq%\6#QQQO6?Sރ/shCCCpp0NAA}طo9{kkkllCdeeR5 {ܹ3//oժU,DCCښTFh}ͳsPPPllFSS@ƆkhwgggMMMQQђ<[YZZ&$$?}Oggg7o޼[nQ(555rE6l >N<$E)Ο??y}}h05B!:###-[F -j$[z?/=pʕ+ہ͉XDDʕ+|@͜9Ķ\9DDDf̘1 ˀ&L={6~i Qs%O4n8|܂b,ϢE&M) +ļlll߿kIIIeeSΜ9S^4ŋu_VVV^lٺuc8'}G;۷ohǒ`  !񂧧'p|hbPB c^ 9@DNKKK((9PCå . .DNoӦMPP8|&`&LȬږ))) :>|UUa^8L&vԨQᚚBCC***䔔&L@MLL>Z2 ÇSSSSRRzK.?{r ;tҭ[D ---yyyyyy7otrrڰa0M">.//ӓd"TbgggQQQQQQdd#G̈Ħ::: 6ǝ;w\]]6..ŋ_ r`X;~xll,BY`~MPBUUUqqq׳gφy98rvuu555M6}nu^6mp8_@TXX~y4f̘+Wݺu 곕 **3rHbg^~N6l0}ӧ߻wѣnYTTjkk "' rM;wUUUlUUU33˗Ȑ-_?TUUmmmB޽{\SSfi4Nwpp VCpbcc>>W\QVV满Annn[[ۚ5k&M$ܞ81m4BHDDʪ-<<\Ӟ544XgΜy'O>|(!!A ;.**ZPPx~zQkkk_{oo)Sl߾} pMNBijj1!r`T%%%L:::cƌ5ŋ#5<4!>>tMMM?͝;j`_lgggnnݻ#G.nnnD ( *((쒒:ujʕ!!!}zŋ4СCD<78 kYqF dXOC0ঠv!#p2K2pTGGGcccɓ'{߄84!`0M?YKK BNbϻv*((G͚5kr)vڅ,((HLLd2]]]]r|EFFIJJ;v7=jٓ'OM6YYY s;p_XUUq"Jާyp|H;զMV\I>ź~/nݺ`E!>|(**J>޽zj<Yv1 ׮]KOOonnVSSspp?>׉ XOOw܉b٪fff˗/[ r {2 uuu ~„ |>| cǎupp8pq}_5%%ŋ:::squu曥WTWWwuu|W۷o:vNIv́xҥK... DN#\0 &)++k eeemmƜ4OOO\y=}t\{FYZZk;Ҫ9s&`ر`PT]];w(l6F.++ !W~L&ͭJjjjJJJ644?f͒QSSNHHhkk3117|@$%%psvvv@@BQQQ8~={p|VZZO?uwwଯ.`x©߳gOYYB)-----9}*WJ?&Pˁ[GG'OW;wn֭\bii؈?~7|Zϟ?… K.%i͚5k׮h[laX+W8p7߿>SSNR_fш#zHoaaj*==='ĉfff+---򢣣"7oKHH̚5Xy…$55]vM2L\|ʕ+8/?tn$+++xQ… ...Y۷o_x޽{K.;v,NQ]]QFlooOHH rss֬Y3i$ 477߶m"iii.K.]~Dwwӧ?~|E6mll}vYYY^|Ɔ-x X>pNBy%R+++ !&F;x𠈈Haa!oz(a M` "NO>MNN"zܺ)..o1̆GyUEEEZZWWW⿶'z*9l着LfFF܈d/_&oݺE,oذ~ 66O`…o~YSSSIIIIIɃ$%%׬Yu7b =.BիWDYYYSSӄhby1-B||<á隚\;wnTTTff3BW4X]]4۱5 󸸸9s8kC .WQQOTmm톆J##>{Gh|g% TN!'3f̙3RRRLMM,a M` &XXX̝;W$o޼INN677Gݽ{H&qq_5::Dl˖-v#Q,==X?e;;_/S(##+WCI&#ܹԤfCCC{s2kķ *֮]pSDAAAFFFbb" Zv-ŋ'N pK>2!!!&&^x`0h\!`0N:ŵCB FDtpV{{; MMMutt466600z_\pI&$$^JXBPegg ,P\9c͛G{ȍ@y}}=[Ȭo۶ vssKLLď ֭[GD'x "DMMMMMm޼y[l9tPNN΍7qMccϟp±cJKK0̥K+SSSYY|<͛G~v x/,uvvⅶ62[$/W^MNNGh[YY ~7ϸ\/> Ѕ֧jnn$YCC^arѣGnXwuuѝ!֭7nnn䮺:LDorhhhxyyX/^$$$JJJ{VȀ4)A OA%//Ԅ>4ƎBc̸NuuuMNNnii%ҊlYYob ??;wDDDc$$$( illz_.%x  |61  cccԩSnkk#J===Yhbwgg':ܻKc6#7779!mF|al8 g_uuuD`ą$ !6}m{3fLsssZZ6vi͞=Bdgggddӧ#*% s'r*,,iWB{óՉ!ფO~˗/#ZHo߾ϟٽ{ԩS5K,!? IDAT/]ֺOO<C;\C!###7oތ!qF_f\iːzꠠW^={!DӉgĀ'NRRR( \lmmB'NHLL$UUUU]~ן2eO}YSf0ӦMӳ677WVV644>'fٸaOYYȑ#|Fݻ58yX:K[hs2,ZPVVJIIiڴi;w_ɱѣϞ=h555===rjĉf͒xuuuɳh/.ZH^^mmm˖-;wSQeŊ'Nlkkjjj֮]Oknn{ &spV𥠠p9 99oJHH8;;Rr xp+%%%???gggmmꊊ uuիWze~nr 5*:::<<|ʕRRRT*uȑ_mù}6l0zh {xx<{܀JL0;iҤ4''QF;vӦM'Nѣk׎?^ZZZ\\|رEm޼8P8^CR)%%s@n===bfpϟ?'/PKKKIII_FE xܹs۷oZ\9@nݺNOjjjii)1|af@w IIɟLMMMII]\\.]矀Ǐ)++͘1~ٟ_^XXZ'PRRիsOJJЌ::: HIIIII!srrrrrbbb|||FGNUUUӦM::f[[[݊kKgg'9YQQ󭬬9ӧOooo?+VĜ>}ZUUTSSNHHhkk311Ǎ֭[^9eqqqqqkV^}e ȑ# 333BJJJbx(7|\iii^!ݽaÆT111F\~}` +,,$mf̘w߽|hkk/^ADDo:::>y򄼲 00ܹs[nж'O >fggVTT;vl伢ԴXݻwޕ00|۶m׻m^iii!eee\!,,,VZGIEEE'N5337o.\`kkǞ߾}ŋ[tرc>",\犜_{wőPDDPB$APGnFyW WwD IF1Q }9 00ۿ~fg0vuuMQ.;ۿ/vmjjJ[vޝwޓ'OJƗ=4iҤI|+ >}Dmmm4444Ba{{;rŅ.,>|h"vĞOKKSL1Vw/_O?BRRRvڵ~j?mCU2iiio6166688x顡FFF=# ,XG?jkkO:U NjD 6yzzJ618a}}}WWWǴ1Gd(^VԖ߿ F1ydSZZT÷ O@my$AwKF=zΝ;7nPSSc,))~?-!JJJ˖-3g קJc;)555>}^ٳ'NȾ;ח6I3f̘?M%KL8Q$1Z(Rfgzzz/^̔lprssc<}4%%G&jsN%%lv_;-|rxxx@@ӧI]]ҥKg(FN|9o;;;%՝'O2pc:5lݺU f^rXOOW69s666111=fٲeP(|Maa˗I9|yy9;룏>f/+j˓ƍQQQ555.]$= ܹsCBBn޼pBPxmuuuY_B^`ABBƒC7nd̥E$ښ%:::99ۛ=C~2tʕ+2?~ٳvzgIW;1EmĉO>-++MHp\wwHG Ј|vz3f {-NNN<{7_ t +[~wBۣ($$6̜9SYYSQQ4%;&r vvvC=Od"mW^]n >|HŅϟ?ь3$Bnܸqi:?//OQ{N~rl9UYY6}tcccB9ĭ[lyBP *33~Μ9g={6i8;;ϟ?_lz@5zYfyxx$Eihh~$GBZZZz5E>; ]cbbZZZƍ.g:d<"`=}91N:---LuV//{{{3󕔔z6};wڵ=711`իWGFF^|Ώ9rbwi<]FN'ݻnҥ4f~7<==0xB؄ =;;;::7ciiI/&52!32)r/_n߾ϛ7cȑZZZJJJ;b 6_ȑ5);&&&666O<{.$B3/O-\\\hO#$%%s&&&޿%!!.oookݻyI3UTTد9_ ~LY|͏?fBKE`'M@fϞ`hhhkk+G"G$?~<((H,!Ȳeĺў@=6Io&kv<<<v!$St fL %%%|=srr`"ݜ=ѸqzNƆ>âUW\ڊnyX>mnoo?O?>#lzuB/^LrB}]\\455o߾^l̙ɓ')AVSSÞ)!kfGEEeΜ9=#ιeee v{8á}c>}^2;;[ >vL.E"𿘗~////f:((ҥKBe޽hAB?~L6K0L(.KWJMMe7x<^dd$"h ,4]]e˖1߿={uzɒ%=tmۘǔL|}}M֛nd( uˏ;?{x|a9:>}:''Ԕ7b: 3:C… b#Q/Bf4 Y#;իWkkkMLLB&NHo{vvvZYY1E9sY2;;{߾}]]M{ؤWP/v~O;{c͚5L@ Xl.KV^-6d3ZheٲeLd4w;v0ςe-4 e#G:u ޣۛ&L;w3 fccs^>aO<=|ÇY<%%e͚5<ooyLŒV4=O_%&&^r1#̙Ν_b?wڵKGGv hY]oɓ|}}MMM B͛9қ(k%;::n۶M옛Qlp>s__ϟ{{{)++Qw~lٲ;wx{{x*[[[ePnnn<cB.X@r#:Gag9|=z4sٳb.2Y?ŋB"""C[``##ӿǩb7,Zp///933S񕝥zbŊ6"m/ɷ"7B9tOرc_}</==̜v쬦_VVs.Sᡤt{㕕M:رc]v\YkmmmJss١rwOfz)ooo bSSS=މ'\]]uuuԼ<Ϙ1ʪEXw4bĈ\ti&&&jjj+V}O?$>!ɉ=]bDNN#Gw>Ih/dee۷AOOx_544TIn 򲰰r>>>aaabOue߿tRnjQ2m?Ç{zz?А媫W\p #C+ wzXpҥɉ:}~9 YFqp?q????HHHT,.BT5 GOO;=,4 +W\r33y///~ܼb =ȑ#F[yĉ~/^LOOomm555]`… ?,((xeSSSkk#lmm.\8b’'''_|9++ !Νoll4449sCBB^^^k׮%Kvi=TݵkzyyQHYYYuuuSZ}}PRRtuuneeegg w50(~2$-LLL ill#,[YObɚ4ޟy|AV'Nشi̖P:rOhs|`ii/ !gnnnݻwُ>Sɰbnn] Ǐm]ǏWWW{{{3˜={˗_566666fgg_v/1cFw_x.ٺu+K.=x`ʔ)r@){XTTTTTt7UUUquu5;)))L)wרp 24""";:!kafffn۶%(l{sYSH @S.@J?ãG8áUk׮;vlMNNf O.Ӫ[[[Wque…Æ c6l^KKK^^= cǶgeeD"Pxq}}}$xEk```aaA)**8C֔{;b,LYK?e"]OD"[G!'7dDe+Il0dM/G%󢡡c 9޽[$ج_׷ɓ|MbbbRRҗ_~9k֬~^^^L[YYzD>>>YYYVZeooollP(;w0 b^~TT .e˖ٳg SNݼyS~bm[l9sfo ƍ̙w̘1'm۶uvvBONЅMLLN>r g||<ȚrwhRݟC2Fgggggz~~/22ɯ̙3[[[_())f(cdD!eۛ؀gMCC{TO&fr^0gɒ%b=|~VVVhh)wا{A!C2䨃&XIϕmmmrv3IlgMQy(hsz:tHcbbtUUUll,4v|7.\`VZ񔔔<(S]>dR;_^vZeiTUUwޝѣܒRw޽ҳ)wا{A!C2Z/+&ӄVWW'S VTTW H˶7'A5˼"?Yf}w̱cLMMMMM+,,&Lcϟ?g׭[G&.d̬N'%%1_{{{bbbn`aaA !VVV˴,-----P( >Z+ S!M[033 ̨BPyLWWWwtt^UUUzj@'k=ckEV^|o 322_}u}L3$'')$ a_#G0{r(vNėaf/nr'JȚrwt,LŖeouƍcǎ1ܱx졶n޼pxh1qu똔E"Qzzznnʕ+;wdo<=[XXЗl,(^777vƉ/_vttȷo>;;;f΋/әWcƗ&$$ϼ...Lۃ|)wTli+zHS&ߌX;w:vƌhѢvAM) >P'Z5/?ixxx̞=֭[mmmڦ666]+4Fu111Y__aժU `eeD h֬Ycǘeaǎ{!`Ȑ!t@/WBPSSso{gdd<IYYUL)wOTxi+zT&S1hChؽƌsgϦϙ3gɒ%-۾u뇬\"v?Bo5k֔ЏjjoΜ9#Zu޽Wikk dOC c,A^@u SN}G6001֯_Í zP([%55 6̙3Ϸ^@@pttlhhHII)++khh5jyyOZ/ZHBq@qA "'DN9"'DN9 r@9 r@ /9šOlӦM=/>'N@<$"'  O9 r@ "'@ Of#Wfg(!**cbeeUW-#FM``h8 !矯߸q[rs ss #"n{xzz9 ~ Ù5-SRYY񓨨O9!rrC6}7ߴced4c{((DNuB0,! lpZ?~ZYYid4~Ҽy455؋55_Q]])6Lzy3KD'<.,,::Z֖G] `dd7B͛%w"uu Vp8ccVll֭2˛[9^UUllPk((()6mQۅ瓒BttG^QQqJ{k\@&w"AAJK+y6>ܐRUU?>^r]>܉4o-[5))H MJz yo8 BHgg1W\ o%з^l ?@nnaff.!dÆiD144ظ%%'O2JBȬYo$uu5'L0TQQ}n OiDQRRZ`TX5DNE@Sx$bmmijj̞od4n"!$5510#<~]j "ؘ'톕<[4fZN$twtDbbZYY%8k֛RS>dϤIƎ57̄>ˣ^(%}%BHmm="'a`0RYY#w 42D[!CtaСz;v|z3%%#!!5!!2lGBHIIyIIykkk^C00FBjk**$N[$o||V yyϿԩ !ꪄ f/]:{GVзBnܐsÍ!]6BF0*[Z͟cs:BbbѯS5…;wbt rRO-**eϯIJJ'Xcǎ&}ŏ2m)z#r|ޚ:uH$ +EE"~UYYq{۶O%!$00άyyNsS3/] {0G566ݺ2zH:g3gA NJJgnLXqq)eA?'>p||Vݺ0&QL#UUMM>@YYթ>pߔV|!TRR9lƍ+W r8oVKKkYYeGGǰaV|EĉZZFFD"Qmm]CC!degv{7.##eccĉc 3zzv}rǏS+*!ÇN6Y.IIO=˫UQ9v:.r {4iD 9 \l>_əj-Z----ͥܘ)S#H9 r@ "'DN "'Bk6mzݳ_ 'N޽=xB@ȟ9 r@ "'DN5J@\B˗يJN_J JuGύ61o`PTdRR^KhS~-$$zh}\{IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/images/switches.png000066400000000000000000001611261475757676000251120ustar00rootroot00000000000000PNG  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 GIMPW IDATxw\G9Q<Dh# BP!&*E5&ƟcƂy|T%b7FcD1"*EQPCs+?&rwױ7[fv3,CCCJ 8wgkB/D" ms"A D" 94;rj(I zE3}~_ǰӥ{3yń~4]U|ݩ;ϳ⚨P ^Si(eku7Է68N%<,!õ?l{vzkm9tID%,ع!E"F oj܍]6öwkKbH\Q]k|HI]X_WzUUY9%CQr!i7bh[e$@@gתDܯo~E%GNB4Ֆ#D"՗/BGnBsT.ZBҰiDOׁ}a~QYL-MuɔH$魲ENrڜ|?Bv8XE/Ѕ|0,’;2b^A@DĦGY鼏GZx# g_}pcXޞIW|b|ܪZ=g{q{BZEMе퇮B, 8~!Nt7g[-}~ɿ'eI!zlʉ ů*-zu4Jt焐|ӄx_@K?-$%:OFzqFBGIYpA դAF+ss!,r*bѫkŰ!D,sow/)o=E5V2P(̿a/*&79~3%=' UjFmZ?KKKCv r$&qSGI̜ꚺ%ObϺuO|ƃ5;/B1`WފKbӲ)}M55]2Ry_\c"HǦ~()Ya7ݿj3@(P/FN"&r!~S2fo/d}N4PqGVS6XdތQ,Bw!X,էC-+"GNߡ dP>Q ~o sZP\x_@'nsbz7!~zy%mnH{7+j^ ]2Na߯@ x2} !ޱMI+?,kh WdJf\cO׾jb"qC" O,Qnj܍I@{I3HFNl͏?tPm\BHaI@\ESzw?55VSGɖL9䗕յFa/-e1mE;7%=^SC](ݒKm9o6Qke{r6-~Cy%ҿOϑn!cs[XF0[N9 _9|~EeT!\ztWo uH~(03{UGyBu]9o!DW`nfH-ں@$n@ h="DM g_ܱXLS{>u??_\(-Ěچ'z3EQV/K(+HInISe.+z4SV5 #}}O#'PF uӗ·2$gWZn2`- ?o{鱵蔒jx)~gw%}@ >s^I~qEfNIJkMHc8@ _ 9̭7fKLrX,uu5y/zU؀ |=o}J)-[A}|2Rn}n 51IJeLr_TvktIݺ~8K̋6'6v-?*JHw`Y^ڋBǀmafX_p%扛U?{:X?ήo,[' NWA,ٙIW*dZ!)rDtm]㐁V},Lؚ% I+Sc}@1UOy{rsBHyUmWU89-Q+. f=qu*2ҝs>/`v_@hsjnOѯ~Z7m͊c$Ur.&\Cd_cDq>p"xX&CbQ@_$jhjWf`^J|)2$_DD('ljr$6uԋ/K;5F9aǢBwou45ժj !.i 3P(4SBȏS4(& ' :t&^,&t_X,NEUcCc}] r5[wGwd.|yHFD9ϣáٿx]I{+mѲ4>@ ģeNSCkv2҄rHNkX MI,5uOu~,_Y]2n`=?3شʚ:5mMnOP'K^~GY5}@ TWc55]qQf}H$QyJ#'mM đ244,kQ"-Wͯ/~UǼ;}V'yONjbknG|? ެõ@+(~Um u5}=ںFwm-@'Դ]54C1/^Ay^?+n9i9hL$;,95 @a$b"(X(ehBnAaL@H}` Z(%Q!$>>d``p ///oQUYQXJ ?hʎ;.k~Af7QK:h^^^(? @y9( m(DNB@,y9( m(DNBS'2g//7ut v6/////O?՗_U6yd//l]pxhB/^Dӧe444L22nܸ v)//?{sssufllܯ_?ggg777]]]y٪*??=z(UW{Ӛrb麺K.>|x[lH$8qܹsWp,O:uΜ9oU͸e˖WBV\w鼴B`Hiiiٹzzzjhho)//ҥK=***յtvv3fL^ZTWWO0AĿ˛w"@lYYYϟ?۷wң%mmm [qSSSW\YUUE022ȸtի=<}iD裏.\pƍӧO<ۮAn$1~}7$ۺB633߻w/m޻wozzj:w ,^֖{=u#G*h6lsyfBBƍ"ǧHv.26ݧO___9sdggo߾9'O\VVvBѣG=z{7iҤ׶[#{JQ,GEE]z5##8;;1W׮]ۼy3<|ɍ722jꫩSJKKK9WYYill|̙3ӧO5kɓqqq"ᘙ9;;O4I__<MRXB~Kˆ |AmmD:ÇLf$=q%O2FrCCCee˖Ο?D |w6m$9~z}Xۻcۜ?H1}gϞUWWwOqкy)S劊=zDp8ϟ?v=$_KYrsiii-[ӧ%%%Ǐ_jUsxqBQgL=ӐC())) +!رc>>7o޼~begٻwo||MYYYRRRRRW\L͒?D"33FwB褩R\\\UUe``544|w%p8kk萐zfr>>>|>͍y飧WEjjjW :u*!!aR 7o^AA.--}iJJUJ?m/7NY׏~a%#77Wvzn臤ŋ& KBzz_|!7J8q3gW^ݹsHҥKJFNmRAZ__f͚xvkkk[^^doo/Sdܾ}{Æ ˗9bq-,, ۗ{{{3*yk Yƍ;t#RzomTݵ:%yeNC?~w^ejjZTT|u-]h|>?;;{˖-|B"WWWcc㸸8&4hYF=m4{{{ hBҮ]fϞMhO>{+q˖-1cݽ{.Yɉ"NƌR _<6l(--urroh7󼼼+V0 */888Y jkkccc۴iر+:bŊwyĚaMիWKD>̴B۷O*6q8[6nhee%{LYf >|}}i,j*n&lݻ?L/'M$*++m6lܹsBBš5k^{n6'۷s8K5557n`"TYΝ۵kΪUp{hxjhh8xk׮M2j( /;;;ڨd^[[37b1UtϞ= ?~g}e˖ׯK[Q˗֬YCC$((ۛ_pJU &%%Pft]bT/B'Yqloo ʟϟI?WTT|!InݒJƴg0;4Mtݻ`Jbdaaqiȑ#^b e]F?ܻwIvZaȐ!4lM\L,믿 &l" :ŋ46'%l5kݙzzz~aSÇݺu۲eKMIIILCn߾Рx^%WqY!gϞCYYYs?EoCyNC? MSS/xecc_Miݻw;EN1IO@pM#F(E ܻw۷o߼yMΝ;Gy2k?~BHAAk= E"QVVիW7m4uԓ'OJv:βmdwww(;;;[[[FYϰrl;S}}u|}} !!!͆|rB.]Ą&*l\4NNNZ";vXϞ=HkC2ΰakjjbccϫq*+dl-Z=}UwRϫpbR\B444lllh᧼NHW`eeկ_ ooo䰰ٯsbiIczɒ%ٳ;wTUU߿?^xA[8d4QfU(AڃG6H"Ѝ<Ξ=0eWWWGGǁٵEs<\n]\\Pd|dwyVMurR,D0ʐe:oI-Sf%֭͝[ewH)}lْnmmqFcc ꢢv#._|5ŷҔФ_~%003%IzNA]n([t^LL m*0339sjP xiFZZZ d>rӦM'N`ZRW2Bӧ:::/^lWL6(^ݚuTwZ}}}쾾/_NLL,))QgeVڭBV̜}2omTuH=iHv]]iԨQwzjeee=J]\\$GKϥsΝ;wnCCCFFHgAAAgn0z>bii"ӓccc6nf===ۧIָq]Fٷo9yxxO!gʔ)իW^ںu+M|PMsm%1e[Z*''S&L@tT5Ν;V^1Y-G{UWW1DDDL6M^{u*N Ye=X[[#eч)黹ۨz}NCYGu<$@'Otl1;!T %7LAۨJݕh#8ZC>ڹsĉiOKv IDATZF)[3f g7oͺ%{ֺ mv)Q?'RzT555ݶm[޽ݻj*@Оxaa!} r&{˸Qg┯US__O{:TŅT:u-ҷQu!uBB?Eq0+ɉ"}!]RR"H #X,ǏKGumTUK 2WQQ!9=##Cn8ԕԾh6]veee>;"wUFFLsZwr;,߁B?w/4ۯ:Iӓb%''+_c۶m\.7...44-8*Ϟ={X,Vnn.3ԨY-(Lqul Y6m*))aXӧOWa ZZZaŋۙjfhn6:DNC]h]wؼy͛ұ7n`F6ԄmΝ;ӧO?tϙμ|>ܹs3kkkڤvɆǏK;@W-4`իW3sss׭['{gϞ衢j&<.\gy{{Wm___ҥKe#NJ'?%7y>-[n[i,))8qd~zf4q$BN :I[,7CkjjΟ?όّbbbm6ssUVO$r`H$7!KcV\zuܹ4|;w 4aOOOX~w/^`*'N̜9SyJF]G9)B4:xxx 8099988BOO/++K ,Zh˖-mvuupMMMCCzDniiIo1ϟ_SSj``ЫW/z.//9,666<>>44tՒBRRԬoRR۷͛'.2QVqd) kjj## 0UbBBBwK.]tI[[>UKF]GQ4Եօȩ9-`jj6l8rHTTTAAkPPE;T+|srrX,TkfHH+W233l 6tP&gppy<fUU q={>|8..ŋ&&&'N9s={G͞=ݻIIIEEEn```KEخ+W|WiiiLSd!߿_vҥKI eӭL's΍;V!LtҥI&IuWWWW^>}nܸ1eIzzzkKH+{D2piAnݺ[n]v)p8ÇW+<-Y$!!'[rtt'FsN>;zhG[ŵ.>Ohjjq\;;{xxwܹsǍwʕھ;R=W>}UwEPZW'244M3ʿdÆ "H__yMf?cǎ)NӧOɑJvnĤv/ag~Hi h\YYY_~%s[ZZұo걌 ;***^'>z=uԇhiiyzzkRc$+)<*9D"ɦ'O} s,Ž@"MpZ)mo>,lmmߪv2͂~NVP_9( cP6?"'ei3Q^<=<<Eӧ>\!(Φc2,[VI{TosPB$:4DN50"'DN9 rDN9 r@ 9 r@ "'DN "'DN9"'DN9 r@ 9 r@ AE+>>KX`A +W|MIͩ+>>>MxRSS?V__oii9~1c(sQQQW^Ȩp8AAA*gVWWĤQ|5JLL 7oބ ZqWΙ3';;{JKK9WYYill|̙3ӧO5krUZڵk7oϟ/S"lDNNRSSGHdff[XX(yr"ݻ7>>^[[Ʀ,)))))+W=ܻwl6ں,##c֭iii/V= ~ݻw !:???222:::$$dذaebiiْ|)Y\n߾aBGֻ5//oѢE}NJHH0`@  v.8ާOŁK4ۮ]fϞMT>}zϟ077g=zڴi&###,,,**cԨQR=tИ1cKW=..nڵ/_4hѣoݻw\%K!"ɓ?ӆ >^|)CWߚ-\PMϮoSL9zDNyyyt5kD55 q7z^[l6{ڴiAAARKtcǎq8p'*#)))--f2m3\.wŊsmj. ׮d&@-;]GGGv㥦888HMYyyyccX,}?.> &=z˗Ŧr<&&F,;;;3acȑ>T&r֭\WWWVVV[[eooޒ|)_\ᄏtRϞ=7nج( kjj{}2 ھxB\Z]2&@@qy !JJJdPYY);Q;!p8 TDOś6m"wd7N/^wސu :T|)Y\Ԗ-[ӭ7nhll*;yG+bfeӮ]*$ h 9Al٫s3JYYي+|1cԪBbNPp.QvvvS⨯W!ځEEEgΜٿ?9/eG133j}ike7(|ji a r6]\\_*%MM{N<}͞=s1hР3gdeefYbΝ;V^N͝km :< DȾɓ'MTTTTTTy7M 3(%*YLMMmֻw{ZJ wkW9A&@mHSS+ɉ"Mro++:9BFb?~깠OfѣǶm۸\n\\\hhs8Ȑ!C!qqqLHedd4ͨ>B&@m>ƍ=SjjjdEEE۷ogpw=y$!D㞭!aaawܑ<?~֭[*lmmBFI&m۶ǯZ'''֮^mnݺvcئkrLBD:g^|YWǎSK)LNN-ڲeYf͚uС(KKr:[ϟ_SSj``ЫW/BHqqqyy9!D$?Ə~}-ɗjnzj&zk#˖-[hQRRRPP@ ̴r#ڽbcco߾MǍ'-mNB}}}e)_6l0eʔ={n߾ӳYݷmի}.^X#\!!!aaaÇ,((022o`>_*W_ر%jadaa\={Ǝۭ[/^L8qǎ s'Ygppp~^zEߓC_E nAa(z[||< =-\0%%eժUmvǻ)~ɏرcRk3} w:T555{{7xnnnſKKb/Z} r,ARrrQWdgg]V,oZO -RUUuW^&&&<O,[YY}o"'h޽{O:ÇEEEZZZvvv f4Qo<"'DN9 rDN9 r@ 94:V||| `/t +WTyp ܭ{3͙3+%%)G//Cк.{ST'9u/NJJ:u9sdMIIYp!!ZZZg !&L/}%Kttt.^ر'ĉ]ٳgzсOݻ?C4anŋ'OܳgNXD :{l~~!C!rR]]]9Amjgjjjѣ;C)ХѣGXׯ4̀67Ӝ9soL8rݻwMLL<<<>䓦 ^QSSp܆>}9͛ ym3gDGGD^zyxxL}||||}}\vm%ԩJ.0e%?\^^+00PW* مTVVpQ ccc]]]X مTUU͛7@CCʊf>}4%%eomD>}:"  r.`ƍݻw!˗/~l]vݽ{.Yɉ"N}zϟ077o=ziUgddEEEyxx5蘒g̘1`_j_5w_.ŋk֬aX_3Bnnno".ĉ* >^Iny8p)WJ= ӧO5˗/200P Bv!gdfq "'h'ڲӅBaMMyMewww333鮮R=cbbb361FC#=z?ܶm4 ggg[[[{6lXllzR qppHMM-((PrWSۘ @pgϞ766FBϕq% :::-( Bv! M@m. @0WRӋ/!ś6mJL攔4k˧MveڹgȐ!Mmܾ666dh[Zmm[ځaaar3[YYZZe!䲱Q+BϞ=0eWWWGGǁٵO.DNR|>bdd$DNrV__߬s8':th*lM fKMge-QVVb >?fsss===55Pn i9ǔJ}!SS~ȑ#qqq111111333g r.%AAAgn 2ecccukGcGFF|x6U~*J KKː@qF6C.< @x<ٯd';5OhΝ'N$t 9A3 :BK(9=11Qʈ#X,Ǐ[qwnܸ!w=zDX1 ܹC455 !^(N>-4٬tJ[ AJ"'BKKKė/_n۶M]]]*!$,,Ν;=?~-A[[>#""Bv\\\i; !hڵ"_~tޞSnܸABjjjq\BÇ[SiسgODDϊsB4sz[|׋-JMM6m@ ʲrTDEEFBΝ6R^Բe˂_|9k,+++uu,𐐐1p` ==,@hѢ-[H%򊍍 }1!dܸqFjBٳ/_ձcZ-"==ԩS,33O?# r.lu&&&'NO9"XSS3$$ʕ+iiil6- IDATdÆ SHCCO>}!JMJkjjj6l8rHTTTAAkPPl|yGլ4K}}}S#e5Wٳ޽TTTTXXimmͯ^7Iܺ[wss=zjGFFvډwo_Y8 v!臏>6'ʴ_~iIb :>rjB<"'x+ .O%@ "'DN"'DN9tsJIIAQ"'x,^rMIIjhhhΞ=?A. mmm 92G(C@o9sn,>>KX`Ao9sdggo߾ёNMII>|>񉍍nnnاOիWK.x,JMM-;;;;;;22rͽzZcbb1ydW^%aO!r΂'D/@/^,((pppXf SRR|3  x<++UVYXXB WZkڵbI߿_|add${_rE*rJMM֭۰að9A*//?{sssufllܯ_?ggg777]]]yxc8qĉ͛Cc&BVfGB/_N&B7|駟ǻKbmm|rNX,w}А㥥IFfKSS{C-55u֬Y FFF ##ҥK֭{!rIɣySTXuBB!Vrz޽iClg;V( ___Bȕ+Wuuuo&3CSVWWzꪪ*s:;;CRG,rtur5pB={6!!aʔ)SMVroRe;ɓo/ttt!o߮߿ ZMBBBii wL744=zѣ#?Ñ#Gbbbbbb!fff3gT'~E'ar zqTTmBpDNN !{<*#;;ѣ=z4iU2oLRZZz!殿X,8qbUUӶmۘ7o 2d[+GL욚Ǐ[ZZ?~̘1x111<((((++c}WHfՊ{S,GGG_~ٳgݺu377ckC%DEE]z5##8;;^U+Y!DBhk!!! ===999666--mƍl6S*++NT'Ǐ\뛛=j( DNж9@ɹRSSGHdff[XX(AݺuѣGL*BHZZZCCN{V:;;zݻwa6mmm]VVuִŋ+q޽&&&666eeeIIIIII_r%sHfy_f Wahhhkk[^^doo/5&HjhX,&444|w%p8kk萐>ʧla!әOC>Ϝ9sE&rj*ħ\vvWYYYLe > %%%77681C@9A|@@9LLHFH&&&Gjj cstС1c|4J[v˗ &ѣMfooTaaaQQQkG2P-9ҥKhjjjnܸѭ[7IJC޽{.Yɉ"N@j&L8z˗/MMMN ܿٳg卍bs& 3m2ӞNNNJN-&&F,;;;[YYI%9rdDDÇg͚լRm'==ԩS,33O?I~mcccBȸqh#e˂_|9k,+++uu,zc:$$Y=q'DNެ,YB={xΝ744|Reo.ɵR,J4h͛7=zdmmGkggӺ:enթ#KKK)TTTx<SrrrXXXIIWa#)ޖWG";ŋM6I}E1Ţ|*62{w&%%jjjZ[[===ϟ?!Lc1M,,,<==e[ ??TuuuDN\.5j/J:dR3F9ٙFN&Lٳ+=\5 Neee+Vcƌ777SSS  LfdVx[wZԲ=OiC{˝|V/Icue9::޸qCj"pppPv̘1M=fO>vHP_}Z !nnn ̝;wܹ JȞh|KcX,! NQurŶ\ (V"R^uj*oU\ZV "TQA-* Byo0BddoΜ9#'&&*SET%x...4ʹih4ڭ[U^zʕ˗/!˗/}3 T&++?..޽{A(>}:&& VLf7R233 ! k׮冇HGdgg>>>>^SSS__M:Lb͚5=^K|K'I$&;+ ÉH$zzzrťYXX|w//D~zccF.+wޭ8`@G rQAAA= ݳV̜9s999UUU<FZYYxyyih}oLoY__oee%;50a2z&LO=n̘1fzK55#G:88ENJ֭[^zҥ3 [[۩Sv:"MMp// .>xNM4iʔ)݊xn[L[&#E|Y%crrrTN7RSS?$$8 YڵK-NS/>w\.7!!7"'ȩ+A`H@F Y+W=hA b< @ @pjvߚXlbb$==winn>|N7_ںbŊٳgB={vׯՉbd29μyT8. rPO^FYZZUTTTTTn߾z-22S__ښ،?? !֭>}:!iŊt:...:u*"'DNԷ~[YYiiii&sssBH]]ݦMݻe˖={H`0V^H +W>]JӧolڴJ'xQS x<ŏD\ԋf%׼~zׯo޼Y$)f?s̮]/_>~.33 "'N]S^^.@=z4!J5jԵk6miDа裏vBΝ;@oB ߿/^[[EqrrR\\\h4ZQQȑ#{SSׯGDDtttt֖S/"6mooOzX__eX 'd{&$$+AM1]chhw^uTs봵nzK.ݿ`N:y 䂧UVRӲe˲ 455Y,;3w\{l*OLL~~Sގ +f?CDcJlkksqqy-//wbzvvs"'ǨQ9"~̙B==ť._( >h4گz*.bŊ#F(.jkkϟ?Mohh믿FEP[B[SS#MLLo)Ϟ=3446mŋ>ofΜy۷߿_]]}ǎNNN.;+WbOOP$--ŋeee`p8???;+++322jkky<N=z4#Gdgg|###gg%KxDǏ/**ܹs={vׯՉbd29μyp36 r O^FYZZUTTTTTn߾D:44ASSs̘1"ԩSǏo\|yNNNEEűcFQPP0lذn?._,9h4wwp{{{7|Ma0,&555===<<|ʔ)Ҝ999FFFVVV<ƍ6l \_~r544Ǝovz8p@$H$+VjhhXZZ􆆆xԩ!|6m mڴ޽{[lٳgX`ggqF}}}*Z~}#AW\f͚MMMBnhh"ׯ_ojj#O8djܳgOvvU!bɓ矍nnn-VlYYYTTTZZT4}euuuZrܹsl6;22`PZZZ233o)s()))(( [N:ΚdnܸQMMݻ) KKKtzDD6BLMMׯ_/7H>>>ϟ?omm4iwT*ĉ/rVWW'''kiiEFFRQ !DMMC(̮l6[oiرaaai۷oݺ_KYXX*NRXuPիWUUE񑍓t\ \BñM5ju}G9ݸq$0vXe@P TDL"?x7M*G[[{xgtuurfddH$cii) !7oޔMD׮];|pLL۷mF=LTv杜:%|B|}}U9ڊ\ՠ:}Uff&B=1 /)))999ZZZ'O>}z"XZZ7ÃNʙ3gN``bzqq\\m2SM=~XRTT%"3B1Ab,`[[ &;Vq:"'B!!d#J2BZZZ!F*:::/ {%ݾ};%%eΝvzݻ)))_{)TtB4<oBLWWWMMiΜ9=_k?#udFFFFF!d.]9'SJ_: ?455M8qƌލ7JKK͛xgFpH5Rlٲs B{{{j`loM = pHtݢNqNԈN;*ˉfff?W8!ӦMhn>'5 ӧOebqbbb 5)lz~~ *ˢ< r!fBBH}}-[bq7!n---7o^-z֭[54|k׮F'C*$$dذanJNN~ ۷o߾}FCUcVVlWSSsWJrj2B@ RFbvvvϟ?o!>|WWWq@ R7)y#qNNGG5kB֮]ÀKKKuurXd2e]644Z$=x… jj/322ҴV^-wmĈ;bcc~m,"""׹\.'Qٜ'LPTTfnn[^^.BCCw!ί*44dѢEVVV"… =+@7޽{)fjj/D"OД mmmUQ] CCý{Rϭ]\\[gjjÇ_~FFF~ҥKO^t]SSӮ]!K,Q}ռ[WMMp// .>xNM4iʔ)Ү;55#G:88+FNL&s߾}s[ N xDNjjjڹs?`bbbddPYY)H,-- P9tgԨQ .yf}}}mmرc]\\̙J p8̄ "'DN9"'DN9 r@^WNNN/ 6l(T@:g޽qqqYI``{qq`j*  !+Wtww?x IIIǏilCyGGZ0555'O9rGNNN!FI$'Q @P u@Ys~KOO&&&6l\Ά#G\~ٳgӦM[xÇ7>.ReeeFFF^^^mm-ǣGR<5669r$;;9;;/YD\ti`iz``… 111Gx|/R\\nmm;88Bjkk;hjj:oh5J ; rӧWhjjj۷o711欮 mhh3fH$:uTnnH999FFFVVV<ƍ6l=

    h5O> 9@<%-(( [Q!L&sƍjjjwޕN\XXXZZJ#""7_R$B+͖=z;6,,"M}[տk*l"XXXҩwO?&hjjxaGGW_}Gz1DڽI!jjj~~~B!>>>qN;HJBA6B2w\6-Hd6!n:f{`@_rss !Z6}ԨQT϶tr B\Oرc"QD"ѵk>}m۶>}r=ij'''&)48{|}}eB<==555VVVԮJȐH$RnӧO'ܼyzK&ڊ/6Bf͚%B]jUɅ>h5/U?пptSn$*33@yui}!EEEQQQP3uZXX(f]jʥԌ5J.:SoiiRrm&"ɾIII ,ppp0aرcqH$I.eM%9)UpAj^~ P{%*tWBsJH<oBLWWWMMiΜ9_WD:MR0w涶6ꅱ?H𘑑Aa2K.A6)pR~ZK rdg?{Cj驘4" B{{{j`lo@]T!ݝih|Gw !Ν ܄zkkkSK)P[l ~RPP feeBɓ'B_(L^HpѧOfʼnO6=??_ANԝϊ´ih4ڭ[{8M 6xz/(nB=i458Izݻ `c(Y`}}-[bq㨘bgg7~͛7K =zuV *!ʕ+,@؍f?644P>65pUWbP%{9~իWOII ݅oW8'IIIɊ鎎k֬!]6,,ÇԤk׮ -,,󳶶D$=:uF *Hd2?lBJnB=^Z]]o>'Np8ϟV"'gmmmv2KO1 K=$:/477wqqQ|H>|}K.ݿ?y;kTU$55#G:88+FNL&s߾}s2jԨ ޼yVKKkر...s,`b0 "'DN9 rDN9 r@ 9 T^!$$+AE"' ޿yu6lexX, V+W,,,USSյ:u̙3z椤&#GZ544;vF[Xܳԟ;(*J]6bM>WWW-'%%ݸqѣGÇ7447nqtt @_ѡ8ŗ/_޹saz|tGqQEEEo]]!dԨQ#FP~g%!jjj|Mvv6!`Xp333S(:::2 jѣGS/bccsrrx<5ƍ6lPxSRRw^Xd2;::*++cccd}]3nܸ!ŕ)X-aS Hj}}}kkk>_\\\XXhcc3~x4^j%mjj{OS 9( =Z6={dggZΎ"OC"tttBݻf͒Ka%%%}Gө---*/X4¦gRY *`hΎff]/^H/^`ipg:C̈́Ç+N}}Bݶm-!|]QQQTTT={{Ar+ޓSvJ 6~ݐ ZoP( TFN bccdzx !,kժUTҝ;w󳲲8. UDN]Jw]XXf͚XّW*jkk{wx Booo___333]]]559s<l_xRɷu!@ 'Hd$*x.\M*`L)s{x嘚~g sΥFTDNJ177o-[V]]/|rCp8L&S;+0 .77cǎUWW8qbŊTbpp@ HKK311!p\>OE333OCCCBȌ3\]]'LPTTfnn[^^.BCCwT_~ٳg! b=+[OJ:Bȿ/>~zccF.+wޭ8SϨ744kjj뷵IdYXXYF6wVض[u9 TfxxxTTԩSvPX_____ب=fe 60cVG޺uu?~[[+VH{3gܿ@@ĉx<^KKɓCCC駑#G &m7tduttTf~da受0śwrtt AEVvڥX–u }Nz`mM(T@8'P.5 ~T"'  rT`qN9 r@  r@ "'DN "'*5~%(@0͟?tƍG>ڨ8vY `PRL"{vX?ϟ?'hhh >*55uȑ_}=6P^IIɆ 7ovvvF-"'& -Z"b,X•̝;֭[h4̙3ǎFmAAsss`D$ Z͛7755YYYq8Fyyy[DNDEES)ϟ?x Dt/)) çM&uvFlE644GGG1B9O?tqqq"觟~]bjҡ܄GBy}WeeeFFF^^^mm-ǣGT%%%Ǐ/--mkk5k2?A"]xL 0 !Ǐ'|ra,[[ہ6a:BȨQdæn/_sNss̜}||{ЬTR9?xWkkkhhd޽bdvttTVVI{(999FFFVVV<ƍ6lP_vt:bx;w\7|Ma0,&555===<<|ʔ),{MG;w.M*4l0Bmjj{aHj}}}kkk>_\\\XXhcc3~5+UDNZikkKLL쳷zK_ge˖Q}dgϞ3g4ۢElll{󲲲4gggWWWy{{Xׯoٲ%99yĉ_سgOvvU!bɓ矍Zo }7r6 4iF[[ڵk/^looot?&&&''`^ё*@ r{ܬTR`qĞzutuԗKxE߹s'<<|֬Y˗/߱c˗\把 QDFF:99I Y ^FFFK,qss֖&>|ժUruE[[[vqNϒg͚%fKJJPD7nܹswttH$BȽ{W;sL6ٳg=zÇ\.ظӒgddH$cii)SRRn޼ :.s///]]3go ¦UQl6;11ڵk|>ŋt:} ,3##bggf_ڗjVj)ռ)sQ~VKrj lKKlbQQQTTǏ3D `0+++߿Or۶mi3S7|z1¦XQ,kժUTϝ;w󳲲8S***!666/\6+UDNrwwW#+++""Cu?Bu)I"/B4+>(,,LHH;w.S}ԠnY r255U(S#09-q4Q1V -[փrN0ĉuuu/5iذaMMM]@|L鵩(=='}RjZ %@=zDQ]-RYY)H]&S'ECjp !K-hnnN)++S*҇r4*JzD=z2qZ "'WNݹ&%Z{+5"ҲANiӦh[n~~~Lttt$\z"o6&@4*HN^^B:dŅFuY rx۞\B@ر$U__#l}IB… ?!DEEeee2kjj?~H$͛7wޕD$;wNq3f0 _K{$͛7׭[skkO-(s6 w@(>}:&&pY,D"ٸqٳ=nV*l)0 N?:vt&9;;O0(,,\WW\$رE,,,|>5ǁG,"""9-\.'u8ĺ&&&&'''''kjjR>766Rn >S٥ FddƍKJJ 3j0͛U2#AZQ 񚚚mmmIk֬_ظݻwSS:Y rںF Ԣ9V[[gnn.i„ sƌ3k,,{^^^.\(--}N7224iҔ)Sdg͜9… 555&&&ƍsrr:uXl6СCgΜɩ~䉎΄ \\\|}}0^{3g?~|NNN~~~UUǣhVVV...^^^u޺uիW/]TVVv}akk;uTCzЬTR9m7tdutt(rrr6lг80śwrtt AEVvڥX–u uu35d+ :P.5 ~T"'7A/  rT`qN9 r@  r@ "'DN *5~%(@Æ zl||<* gp``?{EE2݋_.up%KJ_reaaaW5_~"UW]]}f mbb"Wc . |až0N|~RRҍ7=z>|pCCqq8GGGiΤ&#GTDN=.4h_ڵk9QEuMMMVVVAAA|~^^^jj*>@0p8({{`*d2>} kWWWُFp3f:u at#77A]]=::zĈt}}}777777T r(ttt>ٳgD~IWWwŊnnn=Ο?|NX,WVVsҕ+Wv_o&;;`0X,VMMMjjjzzzxx)SY6?? 10f¦Aaذa.ԤMNSSSOOLP`0ѣG+p^4 DNkkkKLL쳷zK_ge˖Qw9s昙I-ZFz/++JKKsvvV/ׯ_߲eKrrĉرgϞlSSUVBbɓ':?u,5ȑ#MMM?I.lkҤImmmk׮]xoiN[[[[[bPxePp%i0V|U555YR7Ϛ5K.fʥD7nܹswttH$BȽ{W;sL5:={ѣG>|r;-yFFD"p8rM>=%%͛]pPHᯔyB4k׮/ŋ/X@ /pT(9믫y/lk3g^Pb[ZZd?~gϞ)&ZXXȥ0 XYYUt}BݶmG̈́N Eɕ/I$*6 .? dQ/dR*^5{Jz(9^+WP) **JcI>&&Fz>y$!D:'rW>>>,ـW^gvqqH$|ͿKWRSSsĉK^voM؄,{IOBӧcbb!dJSo޼ٛJz(`N?:v *rvv0aBQQQXXnyyH$ ݱcGťYXX|j///+88X EDD陘B\.'u8F 駟Ο?ymmaÆ VB|d9::Y[P&daa!Ugff矆3fTj%o^m䮠)IMM-::ȑ#iii~~~]ENNNN&L[7f̘YfQ pBiitѤILo+s 1cƅ n޼YWWuttK{i0sWUUx<fhhhee奡_gVVVVWWB NW+QI3L}}SoV(7-2@8::vTnHH* ޷>k.<8Mcsߙr܄ބ(T@@~%C!&@E r0`VDN9 r@ 9 r@ "'@ @@@BBBzT raÆ =^6>>3Zݙ?{EE2݋QoBE+WvQ~嗡S;vx"u{~IIIMMM>>>#G|… _]ƶm._۶m*OkkyZ[[k7774\4ijjvFGGgTB[[[zz:Tc_~<魭:::...h 0i;w+ӅBaÚ={vm>㢺H E 5$h4Q9)x$K4J$h Q@ACS0 w20l_fU^{5=zTVVڪedd~Ӆm.LLLllldk+C9^" Ϝ9>s///2"' Ҏ;jdd\PPTVV&|BTTT---\.MHHؾ}ÇOIKK.1bի_\AA!??????22Æ ]~}iiZUUճgRSSO>xNϿ˲???:ȑ#y<^jj*;v,)B7ӧOo߾n$ľtZ~'''8qB(驫D"1"'8=:gΜ5k/^zuѢEÇgVsss[tرc/Ѭ,hgggWW6 ={_|1h BȣG:n8=z466d˖-o WYhC9qĸ[n9ڦ˗K?CAA]LMM !eeev޳gѣGt\@ׯ_/--cNϿ˲iii_rrr;2d| tO>Zn2<55+Zji=~ uD:[sι'88Xr#Gnذynecc#jcc#:5ח S$ +6BLxbBș3gyqqqhhAhSHQPP5kϿvZr%%%JJJ.]BPDEE555P}8uVڪ23333*,,$̙3 !jjjfbst|ٜU~~>oʔ)544}9: 3fPSS}r:i6,|/p [B8&k***Cڣ* ,# JKK, \@@o IDAT8peBHvvnϟ… !/^߿/A?4uԣG߿OoV\fhHd(_6gES髅/t0쌍@o23迫Նe=VM; |>ё||wPK5kd;[nVuΜ9DK.o}OI $VRJ{533۱cP(LIIؿZs.P쳥ӱ/t00SNݾ}˗IIIiW_8NQQ!ֶ6)((h AåV2}:M yWk߈j.!_cQ^^Aϟ'HN>>eC3gܽ{mE"mg= FFFvvvQ f:233+> ,#=mf?{imm=z4my{/^__,oƍ3|ٰ5kH$_>zjqqq j!tI=dh+X|qNݥKBCCӟ)#yggg;;___SSS |888811˗FFFW%7wqqzjAAUeGOOرcg]Kw~5kr2eee Szyy|YRQQٻwݻwoݺekk;}twe.tTTTfΜyM"'~W^0pOXNfPʪNNNݙ]qqqNNNG7urrrZlƍQU >,y O}NiEEٳgR Q}@ 12 ˑQoJ "'DN9"'DN9 r@9 rKJ[qqqƍd r7e6$$5xZl}GlV^v{jjjjooS: 525u1ww`\Л7,YbŊ{7or?.]PTT4d==ѣG;88899d2e=bĈ'NHԴx⺺:Bȼy:K.Ι3gСf pɒ%k׮Ey"KYYyРAL EZZkkk !JJJ::: +++++ƍwvvvfV2eȑ#$egg[YYYKozڥKJJJ&M zw? r}}}.]"&((bŝ=jllܽ{wmm!xH_%SS۷oK~ܾ}YW j}H0Ω888o۶.qƪUF">>JQQq߾}L?mڴ3gܹsE|yUUUbb-*>9uu . ^vP(<~ttG}T]]믿BN>>?lذ9s|mUPPpj55#FxxxxzzvtViiigΜfff ,={6$D谰z---ooo XXWWMg~~~@@.w)Oh~ԩG~ZOOoƌ˗/?ylٲիWPJ+;wN,hmm(//܊}i~=*++kmm222rpp|֭57l K,R gΜIIIxݓK^SNx<}}}gg+VeUgI(R"?NLLlllܴi̙3{Xiiiǎkmm522jnn.(( *++"$ũ[ZZVWWs\.}v Ç'OTSS3226o,|B,,,JJJ"##ݻcF&TTTjjjtoڴJYYJ(^p!>>ښQRqwܹ}WNxx8qwwo sY[[~R%%%sss55gϞN>}&&&111|>IKKn8bҘ| P.%dƒ***꫊ %%QF577666=}zWR)˖ 9 |ŋΝsppԴ=|+W>1cpG3gΚ5k/^zuѢEÇgVsss[tرc ;++?::յngϞ_б=ڳgOhhqܤOllɖ-[ !ϟwĉ~|rGGGUU՞˓}UUUtiqqm 6G9&L#&^7nQ,ׯ1QQCCCLL mjj*_|d48qeݺu:::"wFC C5 ;wҎ炂[$ِ]mK\,[*+K^|rOEEeԩ&&&_|ũSܹsi3 5r 60yyy؈D63؈5חJ諯b^2e ~)g^\\:h ???Bg͚]&nÆ ϟ?߱cǂ >Cݾ}}).sNm۶)Goʛ=&,Kɝ3g6Bf͚&![nѡN!Ydm?}TQQcכmڴ'RUj[*`z8}}+V0 e˖ٳg+++ىv;`,XfMZZZiiiB0!!<Y$577B%w;|p/\/^000h߿/w CsεxÇy<^^^^^^^XX/^fIQQҲI.)e=:##f֬Yjjjϲ4Ν{ҥŋO0nԨQ,hiij$[G#.UR. 7 rzKȗdD!VWWo۶Ϟ={ܹÇPPP]hQh߲š)W5me;@>i&&&&&&}Ν;\ٳg:MT۬qT)%xzzfff8ؗ?L_ !FFF+W5kVOmR%|)-O6.C[*`R"N?-22;::҇Rn"韼׬Y#ijj7n"v@ڂ\)uuu {СCRfff;v )))111WSSk3Yk& `qG?TuRxsa[>$==M-Aw:E'>[1x>tsTSSsʔ)UUUBC5JSIIiر#G>Bfi@žK255mh2\} HtdW^xM]}+WB;D1cyirr YYYQ`$tߤI!= #++ANOi}GGGGGG8d(MqߜA)'j,id~}JNN b_ջy"'xcl#"">>RUTT QVV33oFnڴz{{9R(暛Ϛ5͛m&eoJ}ifff^pᘘhkk B##UV1ĄDEEB͛G'4믿޴iSZZҥK---Ba^^͛7{Qurr ˪.C[ 7̒mF8}:u*::TCCc„ ަ]SL [gee`z[&;<==o޼?qiӦ̟?:..WWWs8===KKKOOO6A왘/'O|QNN|r_~xM;)f͚X.[^^^VVlaa1uT///C7իW >74(00n]nn.$WXraUGeU-7G[[?j LmW_ڵӷϠK✜zoDlٲ7">|X r/|'X)**JKKSPP;v,rCiEEٳgR Q@;ARJJ+[7{DY ǀ;ybd"'駟 _UUUPP Ϳ  flldɒǏ4hԨQ...-bc[ ୠO~̄ "'DN9"'DN9 r@9 r@ @ T( zƍ_Çoz _9 r@ "'DN "'DN6/naƍ "'x3l߾]mCBBk`ڵlV裏s*++ŋϚ5_'7  &9cɒ%+Vxo.]PTT4d==ѣG;888993k^tvΜ9C퉓gJoooB---ﷴw /^hbbrԩ 6or4HCCCOOoԨQ&LpqqQRV [l)))ҲSTT411(Cr j i KKK۾}{mm-!DIIIGGG deeeeeݸqc_9%%%&Mȉ:lذR.&rJMMmii!ddd455 4H))){{{fɔ)SFk$Ӏ:;;͛6l9s{NHH())1119~Jר^^(_DN]t򚚚 ŋwmccݻkkk---}||8HJJƍWZZӅ /=:47n'H$9]O~-++KJJpBaa={*++?C\PP@듰8m۶2ƍV=z 㫪|KikkO6ߦF?4,YBy^xQSSC~##sM>)ۮ!A!\pappڵkB544֯_&FZƺҏr֭6l`](OJJ*--VSS1bgs裏WPx̙;ܽ{W%хMMMϞ=355>}z@@"&222200?D~~~@@md>}ɓ'|>ذasA2hРoٳggΜٵk_E"QtttXXXVVV}}]ܹs`+W\rpm0|Z⊊'pȑ+W^zٲeU>lΰ|@4|Չ6mb3VfZMMM)kxxx|'''---|ĈCPPP\\euu5r ۷o )O8! յ_ayyӧO)==]( 2,##C(2ciNI;vȨ ((LX6*** NHH?󦦦߱--- {رv@!'''''ښFN X^Nw&9ŋϝ;ࠩikk{+W|gcƌĉ~|rGGGUUv״MMM˗/ܖ.]:vX;8++?::յ'NpqqYnH$ԔvۇnW>ȳ{ųglmm_%9u5ѣG̙f:ʛwE tIDAT>I;@|ǎ ,O:t.xŨQ|}} ![XXlݺUGGp7H23GN_EEEUUUDFamy///H$ j844tРA~~~Lا=k,>5P(I. >N__Ŋnnn⃂ e˖ٳg+++K|ܹ666/^|! SSS[|ŋ? ϟ?x"q@^*))166 0&;;;Kq94200022q,XfMZZZiii TMM~hhh߿/۬?~x-^W5PSѼ666l6زe ~yrrjkkO8'IJJee^~-$L6lСC+++\ !C544LKKkiiQTT\ު|$G83Nw0;arrr!hr]]!lf>0w,~g;wrgϞĹ]۶mgϞ;w544jkk-ZDl}dooٳgsØ"""233ɫ[AED"QwL-Ae2_ @'zJ~> rze^GMMMNi"##|#VқƍC%c#{{.SQQALNh¼E5oo5kȶO<ң֟k`xDGZm¼HOOAeDSuuuD*}}}cc8 y7n L<$̔TTThmvks5t?9 p_K⒒1=7$Yq^_z.OGDOOr> rLMMSRR>>ф+++9sB aSw)**VUU(++kkk fh7|#{LLLHHHTT7o]JJF^^P(ܴiӡC؟OG4,sNSSS]LLLGitիWpKKK}}=3HGGgƍmذ>::zΝÆ #TTTx<iI?\ ݻūW644lii7n}(( [[[%''VWWs8===KKKOOOf {ՂbBɓ ! ;uTtttiiƄ MMM9u6}NMMMc겜[> !&&&F8qs|888811˗FFFW{}Ra7hkk>GrU238'''7776Dr7Yؐ{~?}ɩٳ݉;9@GN '@o=9 r@  r@ "'DN "'DN9 rDNz[p!zu?NH~SS͛7eض1""")))++MMM掎Ñ=Ν;EEE̙3͑'=m;5"YYYj#,,,((V|aMM rǶmyvO-,,оhf"F|\k)駟Ο?>RSSc  .\|9((HWWWN/^(eH&zs޽~VTTDTd5"HnnP(?_rJHD ~ꕆFNNڵka'MssscccNRRrvvFTd5>}`9B):991]o!>… .|f… ,Y)e˗3I233kZ~~~}} io\gzzٳgSSSyϟ/7222򪫫aϟ?l0%ٳgRQQ:tƌK.=|HH]aɒ%k׮%Kk۶mRڵk,Y"CBD"Qlllddgx<100ptt$\t)11竨 2hю&My#v)))2vU.$3LJJ:|VVVmmƏ/C񕖖uuuғn:488ɑ#G\B?xyyuJ~B]mz$M;Z<-7nl!2ω-uu+VXYY BBٴi{FGG?ꫯ$&BEG{~O?D!999?˗/W^ͬsjjkkkkk333\w߹tgoVV_$ܹs1112j_Sl2fϞ=O<߰044t񕕕6lxx,ʞs̎6/++c>=H$4hкu&Mٳ666BZ[[{=ʕ+Ǐolll( bcc ! we:~taaaL*6oxر۷o˜soM_͛g̘ѝ u9{7|J :u*EW611ߔ/x=w23voVyFkkkkkiTUUsssZ|7oެd;c @*3\"N#IcyiȜFɴL4J. r'{yyM6YhiiyKﭭc>khhpV7o!011JYPRRRPPP[[+D",afϞAo6oޜ,ޏ-tqbk֬a !F=|pرzzzuu6Ptu#~)tz\\\vE?;99B;֥|!{J/211mw~4Q2-ȩRQQS5xzN͍;v xO?i\`nn+999z.x\ͺ ,--i>!dў6-, CBBN>MN_ܑ:b)ܖo`'V1ͫDfJPy˖:9\\ Fw&D{ZȂ^j*UUU֭;~ǏCCCm駟||f^ykiCCCAuuCv'RRR9'Nirss|||%/^ QRRĜOWܑ=b)ܖW`'V1Ļnݺ%jjjw2T666\.w֭2L'5Iik ˗g҆믿tvmcc(s&?}i(3UOq,,ԕ+W !ǎ}n޼3B[nСCAAA)>VNN۷9A^zǬ`gg'۞;ңG43;ԥ믿h|C3WPPBPQQqttd~ڵkr,zU#;I^{"s_|i&68_qO?e,RSS 'UUU{񓧍%}ɖI|3Muww^9Q]]"['޽{%III̫1ɗqDwedsGz舝f|s[ՃM~3TWWWxF`.vIŻRpWc5Iik gΝ]SS4x`SSqƹ,l=zԩSIII:::&MZr>=:((@X]]̙3-[#s 8uTJJJMMMhii O_UUU Buuu###kkɓ'7͋/HOOׯuuuڌҞ;ңG43r]ʓީ4IHLL544IM,nȑ?ɓ'SRRg͚(߼WX/$Mz4ڵ~C(Yw޽3?[_P-{Mpp0ߴ9غw->OSSS`` %\j O뀭cǎ?~|Ĉs}=1H_P-9Aw BɟURQQ5k;.Z rY899~ɓ'_niiiP="' '֭{ee%M|~Cvv~vvwuOd"' ! O9̙NnnΦ8!UBӰǏ9!rM}tG?͝S!9Bkwޙ&lbu(xj`7~3W㇆}$˪Vٳg)$Vsn"Cgӳjjj !gϔy'<JJ9(䯿]^_߰{O TxyyYY'ڙO, @vv~FF6!g !C_BAA!? 2sd8IUUeڴ L0T^2::NYY/WӰ0oiw#X[[/70st!p]]mBHBW hho\HdmmellOtVFFJ#xZгh(y'ĤۦÒRJK+gΜ>ݶcF3܄>ˣ J!^~\ "'Ex%hԥ5XOZZa._Izb"71Ki&oxH)..+..kpMMM(5DN}c*^yK^:?ѷؒ_**&L#"̛t z!C4 !n8ץ!.2BȰam+))ZY޻;vlNzDDeg@ rww#ܽ0>i }=BHFFvaaWɩq㬥Q#G8ў<{ww D"Q`'O^(,,DOnܸ7?Nhs++ kk+BH``HYY%]Uѣ[[[-,..""2bpdp3&BBS3'sZd\YG0 q8u>9ZDăGQQ RVWWkhh(**M>[/%%}wĐQ(..kmm]չhch (-hii>dQCCc|ÇOjhD*uKG!rK K:-::.==:UUUSScQӧOו;}~Bbd4tD6[sӞ?yWYY4|XOuJJJ}2޽%***::Zcm,@З~NWۻWrʂ KʂARWa"'DN9 r@9 r=qqqȄq7= B9|02{Ӄ'DN xZ "'DN9@86!ՙڝh9 D&~ :xvs"*BnuRL0  ^c-IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/config/images/theme.png000066400000000000000000001330341475757676000243600ustar00rootroot00000000000000PNG  IHDR <iCCPICC profile(}=H@_SKE*vqPRĩVJЪɥ_Ф!Iqq\ ~,V\uupg'E)IExwqU=q@,#L|E~ "Y\:wQ}ѯLD8 x8iì,)]oK <3ld3abrOGU|!yZ= Cme4G"uTP()&284drUȱTH~wk&ݤPZ > f>Iot0 \\w4ytɐOS(3<0t qd pp({ݽݽ{rۙp pHYs~tIME: , tEXtCommentCreated with GIMPW IDATxwTgmTPbG4 bGcA4K3Qc4j1Ѩ%jDň` bAAJG: ,;l]sg̽3ܹ3!DDqS~JDD$L `D ID|@` BIo!jEEsڟMDf6vh}9Dx1]ķOݺMD67ѯG!9O$hѲ0ruqpe#^$f=zAD{ufmZsxo$? %[٨kD' P fn#z5eD5CËGTܫ%U{9WTR^TRط IH?tp5:5Q8$Z&>uaEeՎCW7,[s:)D/_ jOSGlKD5wh`6H5ѥ@ .x(25%$)QZGTMmDtZR|YMW"@sУܢ^QQ}͌ lKaQ/^Up5lL҈=3ɀWej*zZf~ED̿qRq p8Ϳ1:r/,0S>(~fڹOD$ji}<LjnEWPjmf=s?3RKE݊yVBfN!iiypŎg{sbسJJ˹j3=M:їƾdڎ?ц%/VZj7~aE&)**H]:q!,uqgOr,$7BC_vqT/ E]>7_T~1ᨏzQA1d{XІDBf˾UA++B@ G*7%:>SAD(~О#\ }_Xyj/{s"%TwO0LMG%qqDzDg\_z:Z?A]jF-'y}n\&}6-2r=̪MRk.hnn8Pxb[W! ?ַ/ _fՏ>ۂI{$?u0#iћ}uU #(fOtN)*)'"ׁ], ABJN~au6Ի39`u-$*."1DOIIA 815HDϥWg%%=cuHDݭ;>y0Lv^^;qv,x<ӔQ-Mu58I]MyJJ XGƾ"BDFC?3"RPt[o[5ƓGRKˉ_% |2%o(++&["F-y+*"QkRSԚ?z:(bgsGϒٺ* yDղÐ~]hԇ^eQ6W' ';^q@T £SG7/,eh}]MRNz&>WPzs6]QFD"KPSfVy_ 3@ ~W ()p؏D"@oUVVj'8(}6uPFNӘW9lUQP+(I0Lq O.o$פtml6e%q]ZmIB@Qjo hqRϻy-?$Lr^3HK]E ݹ_܌Ĵ܀żמx{}Hϻ4N@ y3CQA]|M.(p8 n{z\qb]x38 *;_Oş 4"q&J=VCz U!1uO[HE񿥋Z#>?~"QNyџ@o~m N vżIY9u7x2Ꝍt*+Wa A/NaUEeR݄BA)REo~ ð$}3EHIz]ȥ)'+8[vTW-~N2&u5 xR=KvnJD%a9KfKDveW)`dN[K">9ރ]M$f3-%'x줃]}NQr%'U#1}vD~ qNq}FT%}%+JJ Z%elХ7$ߟTMG$'N𚰦"=`M;0))R=c5chjJ %eDݔH[QQA(ݸ{~,nRMWԦ1"=<0ĶTȯ-I"~5ϻ[?޼%ҸW'oy %^h [VPS6wTO 2"fh.I^V(+)j;;Y~F榘omx5忏wMTDMq#t4&ERv~BAc؞ˮsW,ݭ:jPL|rnqYImsþ=~Aԕzv혚YX«$u5g^['XIm=eqvhqR$$8N&fF$qtttP u h?f~uLP-I' N@8 q$YY^^^/~Fb{[_%zznUq m;\.ݼy8|pɏ).Ga.S|xrr2MU Ͷ{A>|gϢ&[ݒe˖EFF!O2ƌdɒSgϞ}W|~vtد_? z,ٳ%%%OjS.ӦM7o^m۶]z֬YGFߩ@@M^\\\e_JOOtӧOKKK544GٱcdžG#|RR̼iӦ6;u'I. ;wJf̆߿N#ptt5kJJJHIIIWW2>>>>>ҥKׯ8p`322SmTӤYKCTYY}=NjS{" KKK \hѢ?!*8p)HĆb:::'N={v7C/BTY?I:uJKK~yuqz//s+**֯__RRbee`GGGvu<~֭[fF㛭ZC@@*--}q^^Q~*7nєSN}qvӦMp8F?~{CBB$㞺o^sssaaaW&"ooo|IM5>?TUU}P(L葱}+**nٲI3lذ͛7;;;77s ôTldd4z} 4WEAϪU-[fmm->!O6gzAZ 'ACCco~zMH4bĈlٹRSS?~YPPnii9b777~y%''رC|O<DtѧOx;ob˹ ܻwիeeeڎlk׮Oߋ-\y]]ݚ&M6Q60??'44XOOo3f8|3g>Sqb??Ь,Hmddkii5Wj2eJ~~٩S'qL8G8۷7oܧO~Av]gp/^kt㥒i09j'Y nݺ oo &4egg?}\]]]&j'OթTTTǏwu]BUUljhC6srd5[/QYYIDlRلBڵk>g*2ooo>HAAmyrǎ<-nǎ+u'5#Fܾ}78}}}egٷo_XXUAAAdddddÇ׬Y#$::DFFFUUUʒ:".ւ|ƍH[["##֭[k׮e{ALLLF맭kiiYӤFK+++wY :uݻwZ`IIwffz~~~lllTTԠAN޳g;w<}T'%$$bbb| ~9::VZڅrÆ aaalϖuaaaTTTddT"09j'Y t-[7|3dȐfLbk׮:urOKK{m3d ?5穸TUUnj>|P uMxxx~~>{Ard5W۷cbbؐaaRRR&O| 3fA8syyoٳoVvǎDW\Dfff~qqQQQ_|^ПTgz '%%ȨY 6}t[[[Y#>>~8p`M ~7wws׬O޳g=<**͘1C롖I -[oe/^ ŋvvv6lG AAAMN.Ǝ+EGG;99ljS{ю;´W\ٯ_?vo,++yfv"09j'Y Ծ^z5ݸqLbc޽{]vqM[s=*++tRy,4EY Ӯ];w'%%_zuȑlsg„ 5E&McE_xvq͟?۶mׯ_/++ʜ~e 6yl+ǻpBժ<n:^&&&W@DNwwwɓk3 bSCO>eF2NMDu=SٝmÆ Ǐ=)"09j'Y d>|xڵ۶m[IJJJN,4u]tMlܚT\?:t`(((yyyDdllDrd5W™3gWӧ%;G.\.D㣮ND۷oZɓ'؞lv(ہkcc9tǧe}${Ǥ@ }kE >|xǎ?֭[(!!AǍ'bggGDo#^uiӦ(00aGGGsss'O4Qʳ>$K]'X[[K>PQQNvAԔ$JIIac={fbb2l0I0988]%=z(-"Λvu@H}cǎu_ڵko{۷qvv*++ }^'f>u^vx !GVEZ|%^~ZRRR?~Tf. ;t *}ej!5 ]tIKKKKK+**ruue~͛ssse'S5 Q‚ŋ|>̙l6vOٺuMhlW~٭ć8L9{LҫW/{{{|ND={}ӧO-,,x<ސ!C444lllbcc+**j&OnKZD%4GϺVm,,,~GUTTܻwO$_wò`5C=dڵk/@-E gl6=RdÌd┕JQVkOj\ݸq#55j-((Xz59rѣMMM555JJJ<<@vG$({244ܽ{7d\`` `dd4k,vFsډё&L 9XŋQQQ{}ש򏘖EaZTsk`kiiI=CvZ^F*O5ɭN>JDuDrd5ϨJa(bHWOn:t={^Z\\l``P˷׭[x<{Ͼ9/jr,X`>R_smʮ^WZfffk׮qqqϞ= R^a$!'''??OfeeijjA2nsiQóz]v_~ݺuk׮+.;a7nL>!MNnUUU}s ] 9ZW@ ?qX'׿pĈtrwd_zw[GUUU o\Z6nwk lmmNk׮'ŋ[TN%%%qqqQQQՒRDD%Z&k '7OSYYy%"۷o=]'''X>uTSoȑrFհ\a-t|B31~x'''''{zIfhH$trss%%=~X2 s8.}Owj}!Т"j1LI^8qB|Mֵk/^/(Zwqqp8Ϟ=k:09G/&&&֭ih 3Ǿ IDATk޽{9ΫWdVSq=TUUmݺ577ϟ֕ iwEvÇ/C 2i$" }BRmO?O?;˿yﲲ͛7wӛτ4ϾQ ~ߗq;wHvP O2!zѽ{׋^zi&뼽{޸qC!"1fxNboO!_D!!!$ *ՕaoVϳiџ$nQU/bjjw5O0 jW{sՒɭ:˻z `e?$' &0 q۷|R|ddd8qb֬Y^ 9ZN/&]|y#nݺ5k֬UV[C 8ٳg+VԩfRR@ XtmۚtEE|______eeeJ33̿hѢ{[vؑrrr ٓ{]q1cưO2KFFFzzzZ[[ DsssWW+WH>0w)cbbSVV&^"a8# pj=bk/W544,**Dvw;̻m:55OeRݻá/_ן8qYKo>6w쬬,eee L4~%^w!;;JvvvUUUԮWUUݴiӝ;w]ެֶ4hoO6{* StxֻPiz̙z"cǎ=~?9rd*.. DFFFZq@DGG"Ȩ*55u߾}YYY-7nLDn Xvb#""p M6\ x<^rrm۪Ǝ[ײJJJ333ccc 8 q@Cos ӧOٳقMLL/_ޣG"D~~~ܲeˡC%w^YfVUUOo޳gH$իŋ\.0ɓ'<榢R.^iggammmv GhE &Mdgg0LXX8Ozz˗UTT6l.D.\ nݺ}gD_())TUU}W\.8Μ9sڷo_ZZ]ײ҈]2*RWWwuu q@}7N*Ύ233) 8::Ke2d=yD*}ђutt hĈt%%%+++6*qRsy晚/K@'|rȑرc }?[8.GѫW2 S,I .p87nJgoȑ***&&&3f̈Ӫ>|| ז-[ '((H<É2e?,ͷ.u}j\poҲ7o^hhшTTTL6ܹsDd```oo{)??˹Ν;Ϛ5̙3%%%F200` .]T(ZXXTVVĬX"))i \2@kҴXZ6'Nk׮3gΝ;ԈŋSL9pG}X|Ν9pH(nݺo9sfLL}jXXXٳ h̘1+W$͛77VPSSg$"RTT\j̙3KJJԛ{n6H"%K8;;3 seк=:s$7lGUS$ uI*AR5,X(hѢ 6<<55̬E>}Z$ 2VjѣGo߾ԛ_H 8088K/L)mܵw'QݻwJˋm8)""RSSgϞ-5^zԛicc#bddDD'UC&啔4Jl0]mԛ%@Do}@xH(Xڳh!ohm2kE03ɏyEE&}'OV<^2bb*+:9ݍ8N,H`D"6NiBHv[w G.ghSZS|FDTt;tgD̶ z=+.LC[ܩgϩRU dIo]Sx4,/h=KQVZՈcޡ{p8\CWQ'^3y ]+t:)S.􋰪i%$yDE]]Ң +>ʶ1˗qF}_NI%GLAA!79%7)ӶmQj)O?(T44Ը\7A|^u:l6KF~+:USRo_5bd6CHCGҢ =={]m3p@#Vr]I55jyyyyyDԭ[PPPDٝ:u'ԩS!!!\%@krk}ҏ??}D"Eܾ\2 sw0a%%6|lzBHMa7|8ۅM?NI77a]NDTuogY] ?M]]bR5.7YW>ptcMQ7w1jGhgo7܅Ƿ 55biDĈD'N;~W_*e ϻUcϞ=BP2}m-8K?z(44T*I8ݻwo޼(묮ND^MdhMuJD<|RRUUco˞'?;[nEi(QFܖ.wЯԏ(/~D4n*6H""Fp_>Z_kgjo 4"#{AabgK 28OKWTT&}GAai'/6V%ף,@T #oݺg3f YF܁ӧ'͝;%|r'N:)[2&cigh@Dn}()Z[Qaz>7ƷRoDZ2;4̩cܱ R++bjo'/1so.}n;l?mJGY}jlܸq͚5'O޽{NNNbb"͞={̙ϸj*??nݺ ´>hȐ!ʼ{'OzxxZ[[3 CD۷o:{yy9sfƍ~~~;vp8}^MdhMtMR4ut 32ueӵ_^!gI*E][[][ujZ;CC"O{ED+``e"~~jtUh/[u_VgL$✜K?n\QZJD%yyU( 'hу ڸqcXXsrrZ`y:app5k_aaaW˖-ͬ7{FFFjii1buZ'J^y9۷'JA*2+k$TQ^rJ^rJ lJGY8YYYZjرcRwhwwD53gΜ9sYO͔dɒ%KȿdFTVPP]b!jט3?TETT?l7`}ښje0> Z)ҷʋʋH[rdsY'yj O[XQ筬,I/=?ODf$"חRFLYLD,*>no.>L~5[<˗/G]@+Psm AL|pH艿i<&vN)Oױ"*_X#OYMsRŸ;|Wk`isȈKWo2rٗ]y0#3]+ q4\󸹹!Na 37ff$櫿_^JY ,9 IɌHmaºrP>Eccjߞ8>!ߜF,,+pj\-ccb\^a! {Z$hO@aݿoψTVv4n(lf{"N][-8j_J'"'|:q䈈W3LTVW[e|XPPocc3a„yqܚ抉9sד555f͚駟JD[nxbRRH$׷:tetttcooI8x<ޔ)S.]DD9990`@kqʕ.]066ѣGVVV@@@@@իWġRAAA߾}mmm\nffÇ߿?qDGGG94@[//G% N \tI__?=z4;vL__Cp//ӓMܻwobbs ,--={ywM)K C=@cyqRDEE9r(N}^q$$8pȑ#/^ sJ.ZZZ3g'O< 'ř3ghq|k>|SYY0Lee%=yDSNDtԩSjjjVy4DGGр1o``WZZׯ_?Ν;\ұc#F 8p|Xoy4@%)..&"]]ݺΘ=f̘O?4$$$??_ 0 FH@,44tʔ)˖-ݻѣG딧Wjk׎ :oqqСC:$.ٓ$ֽ{w???>gφ~''N?Oc<I'GD1b4ʀ꫐/_< _y@v'Np8!!!uQUU233%B噝 222+O>af„ /_ 58x`":z;wijxyyH\|#G)v"޽{˟WjIosrr\2z:榥 Ν;W;ׄ  8tЮ]jkk?{j߾}sΕ_~EAAsűUUUyq&Ozŋ}}}]]]ӧO|˯իWW\inn4bĈ@1כ7oꫯSRR${{oɓ'&&&iĕ?I&rTP>}k+6 IDAT%lݺu֭R H~tvvvvv}S:ȹ oT*@8 q$I' N@v,YYU8 q N@8z{{ZZZ.[ 9@EEdƌQQQRٌ8NTTӧO=<< \ˍ7 ~Cd*--ݴitppXvmaa! ( $4(55UEEɉW\qvv\QQ1mڴs}BBSƏ/޽{+VPPPԩSJJGu: >ʪ8::zܹ ,ϛ1|ckk{M+++@Cf͚윒UYY#/}H$2d$OOO"}Tg}&̌f͚*NWVVٳ'%$$Hؐ!Ct1kkk$I%ݻN֭;U,""RSSgϞ-[+Ν;K|t"*--e?xeW̙3RYII uAvl" EGGGGGW4'%PK:0o]1 Qvv$D6YjSfX,q@TAH111dolwBBBaر۲e'Iݝ.^,~M8iҤIݻ7ol5jݹs%ODGF NjB΃^^^l?3%%\s%"///X""z͛O8ш+6tP">}z\\2ePثW/6ƅqo4hPppyϞ=|gϺw>k֬Je޽{wqqɓ'=<裏8 } П:qv {.~7>:}VlJ_ i[7[M5iZYA܃<^2bb*+:9ݍ8N,H`D"6N%MX@rDZdЏߺf8pڈ5s,5"cܱ>'rd&n@YqeeN={No[G=V.fXyGἢ"]㾓'pw_Y I_|իW^䔔lڴ"""֮]f0䳹Vy)7'N8B I,!$wɊzf\+۶_Wl_|8엉:祤;~sL5I rdA *j\:Y3lO~`Q|p:%7v.Mv7'=|ᐁ}-"شȣ $=|ގ+ _EEzMG /},y[Y]MQY)/9O<9!e --o&66ѣ'Oܵk5o LDwꕑM͑%OOwዾ`'oqYvÇ]T}sֵdJDYg>;>Y{vIˠýK SQZ=Μnl۽)6==Fh6 {x{蚚ZS"bD'??|0[{?OTUUU~;~',zB5.a}#GG׵,@RrssMMMUUU----[VTTTSfaFi``bbb2cƌ(lFFF'**ӧ\.ƍlO?TMMСCenڴɉjjj:88]Pk!C(''[pTTT^~- 6 ;@-Cd:,MlѕmKbn}v5J6t{~~LD!IӤ< qkVAt4X2b ,ǭZSWQr ;[XIDg-1˰<#.]QRQwlBDӧٻʥ:ٻӸO}#[ "BuR-j.Z۷n-jU-*uucDAvd!ansӄ%`P3g1%ϙ3ck3ur2Io+edekJܮ.M_Q(ϰ%Z98l6{p8cǎܷokSSxv__߅ ^~B0_pA<bb}ٳg_~ѣG'NUQQ ;x'Nܶm[VVڹsKQQ$M*J( a+,,,LfWWW\\x'N 􎐥SP<{s켶7>*A|#9|+ 5jR~L,-sj&:aVs;G$Ř+)ϒS|Hf@GmUICCMOgL]VVRroP6d2 by{{;vL<ڵk/\`mm\.7<<|˖-!!!,N ߰aի[EEŎK:uj\.wڴi?ꫯ~-[,]T?:,>!!333߿/#O{e`0}!!!'NOOG;b\g*{Vo9MG(+54d@mY9蘛ka,n-L4E7IQN_@cu! M55"jhWTj@g[?ITZZڝ;wdeecccIvvvQQQ\.W$s~~~ttIxAzk6o$!'NFEDD=}ѣZZZ ##k.wSSSo߾ 'O$A9sJfdd\rnܕ+W^xn:V|Giii%yT_KW6B譣oeރ$Иht_;Zzͩmm"򊊯rboW/Hhn'#X!a?k!OE 3>M:^[nXBW===P0999''2TlԩNNN%XZZΝ;7!!ʕ+>>>‡^8tΝ ,\+455ϝ;wĉ$=b>(#zBSR5gm-DT48$s[sґt-F, xl6{ɒ%"rt?C3`0sttLHHijj@CC߯"$$D$NJJJbӦMBH\myí_=?W}ߏ>12IS@CrdnSMO̒gLFIR?cI$&?t] L?$HˆKkmmIQh@&{AiV'|4}Le ooo--{Ÿ3eemǞv'Yv^Y*?7-&M*o'ʝq715!rJeU O宯KI+I}h{GK22ƍ1ap~6/^?$H͛7{Q#9q}TJ7/^5jT~~7|3V£g!z}*@k[ ?h/DԴ{E ycෝ{jnxQ}vy<&HR72;kn4{&뻼TKiXX,!-qٴױ)-, Լjjjw ׮]k*gmEHH?wK.ۻw ._ʓhJJP691X\}P?DVxIґ;Iڦ&udqmǙ<ۜ-_ڰ}(t)EFS\ }j,nꉓ;*ZZ g6yCu泎;I _՜zxo鵰?id5k\tD8ƍq?Bs΍7bg۷oDEEEϟoo~ YhMGG`}b YYn蠠s b ,,,.\(yyyݺukѢEΝ=z4pqƑXFf֭/޲eZ?cbb"B OBE{$ΜMYyթN;|ζ:>5bխ냸 =8b%8_={o{^;v855t„ NNN CQQ144T<}}}'L0~x}}}++[CckkS[[[GGGgggKKˌ 33ӧOȤKںCxɀ"88tvv{F B! fff+W}qccuRSS_Iw%%Ǐ9sfRуv1f̘<m۶effZXH,J%L:t] +++777 !(1SGI&o۶!4N:5gΜagSv<ְҏ [G際'ҕ/fyK+fĶ䇐/O`B!Pp7B7 A؟B!qB!@Bs]]x8 !IaBHbmmx8 !ܼtHZœ0NB!}!$Eۈn: m6l``@P&#8 !{y⋺:lǏ_zBqvvƻBq7^r%055-..?yw5J87oތw !Iu{ɪUx<ގ;={VRRVVVpBӧO߲e˹slقw!Iu۱c˝3g`љ3gRSS_>c AUVZ\RRw!I*++?:`aaqƦD 3gff.XJFDDڵk Fp8>ؘF_ǜTƍ222?cUmkkt tܹs ..?!0N ƍwС/_;VSSs޽L&Sn޼斐 ++`ƍ۶m?h4ژ1c>#ADbff6mڴb l6{p8suumjj,Im8oo'O^>zBL2E{iii9D!qp\YYf222X,Vggcz;eӦMuuuK,w677?x𠬬,##̙3˗ÇELMM&],} eL&޽{>V։ؿE/_,>HD^^뫨"*ŏ"B!t3gDkkSNuwwvCll>P(--- d2 E%::?.HX,ֽ{O!}b YYWXtzbbѣ/_,a]U IDAT}v*zŝ;wIQooowuu%*B!qҰc``hbb2qDggg;;;99ŋf͛7eʔv///[[I&Od2I rŽ;flljjj:a'''۷mll\o~ }v===[[[334ccc.uDٳ?!0NzM>||rmmkצE J^vmƍEEEӧOONN,2&+++,##cʕ?nll\n]jj[c؀BWJ*\211qΜ9T*dԨQׯ255r_Bhn :$H 'VUUVRxxxxxHz{d7ٳgzzzJn۾O㤷Umme>S ##*###~e˖>y{\b!4}UUUgϞ-++۱cÙ?JfF$)++EL8Y822GF uꫯrrrMNN.++sqqٵkWzzP677'&&=z Booo﨨(20**g;a$w'k~')#v_}Unn.9y7|#|'&&^v-??E]]900P믿FGG/\@zkddd~w`uuuӧO1c W[[ۜ9s"? .]c_?W^-H_l… xJJJbbb=zjhh8k֬ Irp.{NKKːq@ee'222tZ'!BG|||~tww twvvܹ355***n޼}vr { GeggB3{i4E]]Ǐ?~m۶@ӧO:i$uuu.+9p300bQQQUUU‘wLXVVVTTB{Evv-[vڥqF"அqB!4HNNNQTTD~)55Noذa̘1>w9rDGGgҤI&M:~xaaH/Z^޽;11q^^^^s`0[[[I&u?ӬYDocϾ4~uy<޸q֬Y>}3fl[>kp~B!)'?Ց?~yyo| L``iZ[[/^o^^^F_|?yի/S;88tAA1[[+Vy]rrr~liiiWWח_~  ?jnnɑI!Dmmmd>,ԩS 33SҎ=?? ޢ888_&UCCCOOO.3 3INNvwwǻ <t@uup-ɓ'w1gcc[t---6;&FEEHq"##zQےBÖ`G#},-)))))~ۺukkk̙3edd|}}\[tmd0QA1b~/:''Μ9S<3g3鼕n*++ h451UH7o;LHIL`_lE歈^ kp~={N8!xc!qe8q`QӧO]lyy9oU+^&F#`H!I!]]]]BAP>|8L/_ 'xx(EX,IEޖM~dž0NQ*++?:`aaqƦuQ(m۶ 400P(ٙ ,000R(Ϗ9s\nKK`ꏦ5k.oV^Ғ]UUI\&Oɓ/bԨQݟ?́o~ҥK\.qrrrvv&c}RRRbccܹ >>>RYr@^ ka4BWVVzzz>}b9vXolڴ7""B__瓡k^p:::ÃM ߲eKHH)yNA={""">YFD)))MMM۷o'a.!Vhmmmmm999eee:nmm=~ɓ' % ۾}3^buttƏd2'Ndddcǎ%&&VVV*++7.00pԨQqFdd/,]>:x~fEPx;6lhhhĄ_-uҤIˆӷm&}s-uS>|A<B.22o*I :$ ‰v̚5K@G]nݺu][?w{+!4=%////55J2L!л$ѐ«;x B!q]l٧~jaaaddTUUb|[1_XXcǎ8::V!8iꫛ7o*((YF|ˎa;v<3f8 !8itttZC!'!BaB!qBwP()))xI!B'a/U֭P(۶mz E|Eoz̙3'((HOOo[ wC!~{ `B!I!~|>̙3>>>FFF{mjj,k.OOOy5^|i&%%%cccww~@yz1ʣ7B5Z[[._ zzzwMJJrsssuuč7^|YIIh̘1UUUIIIIII׮]P($[]]ĉUUU+++EPTjNNNvvvll7,,,$6=e6-//O.o߾W2!jŋ'O.\?T>~8?~ɂtuu>sER\\\ݏ?.83 \TTTBBBJGG؟4|I"i&__ߊ򺺺%K@pppee'NKK`X=YbY,VvvvVVV~~رc4l6d޻wÇ=^Z*E_|$ЫHHH8Cr/^W\t%K߿233yFgϞmiiIHa*00d wG O"bccBhii%%%9sFSENOMM}6HYYǚ|||̄ӧMfkk+ xO>СCѣzE9_xظt+VبQZmmmGV{}7/^33oV0&I)Va4%''~3fHJ^^=xDz xfGGDŽAp|H@3}ɓ'{xxvvv'zcqu### !^үF//#G...3###99ܹs[xyUyf[ eeeK.MKK-Q3PUUIinn1DAkl׏?"&&FX|/q fϞ o9TTTtyf֬Y%%%nܸ!'IŒ.]G#Ы8pY &NhnngvּyLekk;i$CC~I$gFFFhh1ctzRRَ;$##/A.յyѮ@999L& -ZD:x4 7>>0L A+VEcEѣG_|C%ЫSRRtRlliӺ=zo߾߀!Tk6nhjjZTTT\\<}d9׻w/'Ltb_gff \$+,|߭/$99F]]ɓ']]]QQQaaa3eʔD'''O-^dpӧT*5;;嚙>}Z~FFƿ/+++]]ܮ.cǎM2%55TҡƊ022}ו+W|}}ϝ;G:Bh22-ZhQyg/()){d2{ܮ`yTa[CGYYY=|pYYY k׮MMM%Eرc̘1EEEyyy666۶mlZ"YFFʕ+uuu?~ظnݺT2|([dccsU___UB!hhhĄ_-uҤI#۶mmKcʔ)))) SN͙3gٌp!iinn~{Ã5kֈ$'?|yޘT**I-B!^?^SHtVAJNN/[``5B +8u]l٧~jaaaddTUUb|}dd$BwW_}uB??5kֈϧF!I={}@!.8? !B$B!BF|^HZ[QOBwˤI> )~Fpqnݺ}mݺuΝ*`$''F?B's"## LoK!I5I3gf̙쬧'B!q eB!B!q (Jvvvff&١JFDD|>?..n̙t:=888;;[gh4ss744 >GP(Fw}G20 "ބ==={{<OB!n=yM UUUIx޾p ..(((={l\\ܹs)Slyycvvv۷իL&s5 MHHhjj={.Iwtt?嚙uttX/xX2B!q;mӦM|>֮]{kkhr[l aXt:fLf||X,oocǎ &)))MMM۷owuuĵk׆ٳGUU""">YfѯR2B!q888BϏVPP8< Jn޼9$$$1--Ν;$H;;(.ښ~$uL&Ͽr "B' ފ+ddrgy<ԩSE2[ȯ$1336m4[[քO?T$e@&$!BH8փ1cƈdee^dȡz(/w+W IDAT/'xk`mm-B:pBW" rrrrrrz<dNDCDEEE$|E!$n;6oEMMp BzLD!Io7iii$X,AQ(!jЕBaP(wܹqF9g͚.]*))NqƠ$EEEhkkzdBw  ),,ܽ{J~e2AAA$ӧ+Vl02)[J ]!ITWWjkkO0aVVV[n<~D6-F ]!@Ј &(Z#IGLӷm&5,BIѩS̙3l"4DFFYF$~8?G񨫫gVVV}d2Ktt42gϞ@XXpࢢB%##B҅I=XbHM||<Ǜ:ux`s֭W)ASNurrN;wnBB•+W|||$,?!!<<<&O233yFgϞ裏{,G}ɓ=<<\\\;$##𔖖9~xI×jPNN*׸HA 566@ ƥKXFMMJjkkwww rܻwoxb|||||<}!!!bBCJ*))ijj(((>aC}] tuu4qH7o޽{Ef/^?TUUch555Al7 ^^^GNIHNN>wܽ{/^'yiU!4t|~qqqyy9Y"DFFFNNf8MKKFVVVp\R"]}#Fqٴ4I2 2w[x)&hkk;ڞ>}:55uwww{vۗ_~nݺ}:tH$$ϫW!4tX,CCC###mmm˗# NSVVdeGG;9vXYa}7S(;wܸq̊χϞ=n߾M&B ?%/ϏB$''K GJD.w^IN'VEEūtBC$H=z H"LLL&N7 ̰o$ FXXXtttPPPTTܹsFqqq .$)ObܰaܹsI `bBCl044mjYYYAg%{xxtWTT |>nhh촴466OJUUUSSSwwHwG*(( oU^UUEާknnnbb"G5 u|>㩨Yuuu]]]d qO>뫩iiiʪ@%(((!!aΝqqq eŊ-ӧT*5;;嚙>}z@L^obbpʸ\nZZZoƼyLeccɓ0׿dddtuusssv!y)V!4;;;ϕ>*EEE<FLcX555 ''V]]]SScgg' mcccAA(((x¶6kkkAǘ~MM Ғ#ҍZ@RPPhooohhx qwwbwwwKK˳gx<ѠqF[dÇݻc:>}s >|,+??fΜoFFF<8{l~~>Ϸ۰a@ktҥ_ѣ>|葮_T*ڵk|ӧ444OW_ڊIwpBbb"...h cΜ9bBC$3 HQQ<]㡂EEED877w„ " ,,,T*VTTv߿ԔP"uVCm@+,,fff222<ٳg$rԴ&eQQ)@=ka#/a֬Y }@WQQٶm۶mۤEݏ%>s\II)<<<<<\$]d\&d2$yT!ef4H"y$ԥ$~,O ##`0H:B111imm}EEE_W>cccކ$DTUU{.|ڪ`cc#_x@FqwF!+Czᑠ~Iv2J|aBHI{{뼙Tc344UNN,g/ѡ!}YYYuwws8YYYߴwuu%KrVWWS(>vk:CԺ7~-BL а|RT555MMM`!''7v⺺333eTVUU566677ST5buttlll***Z[[IgY5ֽkaBh$SRR7E kkkͭB8DhiiE[!=m``N}hR+ٹt[[[[[]띅B!0NB!8 !B$B!B!0NB!8 !B$B!B!0NB!8 !B$B!D>!)..ƛkd0NBwѤI& /wC!8 !B$B!B!0NB!8 !B$B!B!6$B덍SNy^'!B B!322Рhx+0NB!_8::Mp !Bg؟B-S^^^RRR[[%//jdddaa!+Zcc_x.++njjjnn.377h4eee==ѣGIy܃<8 !MKK^SSp{;ǕT*UQQQ]]p8*777 ƍ---222jjj555t:]CCC<ҭ<8 !_FFFee%F0a!I*--{ƴp,RWW^^^fMLLHbQQQKKɓvww?\$y[y$BoR`28䬬TTTD:l455ǏL ͅYYYSSSEEEH $BoϟVnxUUUuuu<\. @|ԨQM$+0NB!SSS*~C𳅅EAAAUUŋ uuu555KGG'!B ekooOII233PUUP(.\JJJ^^^O>(/////eeeSSSH$B$ ǀ쮮.== &wvvgVSSsuuxuuu555ϟ?eeetyUyf?//OI*y]yqB!?555333{.Y*,,lnn;)--Neee utt`$yXyf$Bo %%V>*Dt:]GG&11Lnhhxƍ?sQ(񔕕 yXyqB!$*^VVVRRRWWW__OttttzogQ(999}}}[[[5558U3mbI!(`͘1Ch%,FB !{&d}iLB ~9sΜ͛sΜ$: N$: N$: pE=z4AQVVvuo [t}N%: 8gw$: N$: N$: t@'It@'It@'I!Hcz3tꌤxO%λsJ$azmxD^A$@ϬV+jww$: `p7VutK(ȟg7$8OzB6.!k(iO8cg߀zE? Vݢ"bKM̹b0foMJHW4AhXmvPoK1FDIݭQq]z$]) Fb4}5@([;/MĜQ ^Lq7|犌K$1[cގĨkV.h8w0!{Jl~]D1o$tfjѴCaD_Ș,Q1ɹGZ*K.gIW>n)*>\iO Ow5U$e} x-6G|m4/+58Jhj0q51\isvjaMK7 !iuծZw&y ]f}ugU'e2E)㠩E$vQ5WkwgNKhh*LԞqi؁$ЊNv5Wu4UvJNn=)-%z`4Pmo7yZ^\Me"4fztb%6?v։d1Eڂ>\4N/_d%:OyZJ#"cc~OjXN8cv;kP02.hЧG\Wdq֩h5iڒLʞ>w6?nq5WE'f]l]펲w56U*u&k=jhZk]dSaKcĀN_42.52.Ysn&':(w%=] 2&|jO m4\X!"=!:1sHDT=@G &sڄٝ#)uu4\P 3Qql5lo(q// J76O {v[YWc-yj`Nz[>S 4MM4UDfip2F5.gf#mB$TH,A1PppWzI: p1G"}#}lpѿ2.'6w9͑o4A [E$w-u)ӊ.I8 _ӠRtcr*{ɵP8O cF$皭1IE +tAKDLQ//C%O{s娡n]WWڏq"E'fThP~SD?/\V[~!?"xћw')l8ik8w0y]ED?p>.>s1M?l_饌DS+о<ЅuAbO F۳; z;D-|>"2ml%k(=_2D "Nx" \{t `KcM&{]bP$cDdڄ9&K@TJHo{a#ISˊC~^K $22^J'V[RYgѽfΟSCƲM5m5Z9̑1I9"xY)A{;+jOrԈHb;^8wtV Yl(;lȫ'[T|%h|c06MS9߰qT2[S'̮|Jy7'sj\Pz`4ѢI }"=//\-"j0/WjI5UK>)IDATqUsb%{$-k7-:1RZ{Rm2[EA%R7:kNk>hMMo|m'],Őcb|J "&KT.GM]("?c5$: N$: N|q$V+、z'XVk$IhxnfUI0RSI&RW}$I0SIRz$: N$: N$: N@'It@'It@'It$: N\&Fp WB: p9~ nwN9\s… sF'͏cǎѣ7o}oCDnG .gO ?=: 0egg֭[?Og$3w\RTT :Oonn>tPFFƔ)S%\> 0ȢfϞ]TTto1<}.Z'zZQQ(JNN`(/////߱cǺuӻ_RR/***6mTWWjժ-=3ǎt:O8qرɓ'O4ko޼9 (MGݴi()))'Nxǟ{G}To5]^^&vm_|رcϞ=k׮5k{,>v}߾}6MDΞ=[VVvצ"''駟/`{KKK} 6t9TaÆK>~{ƍwޙՏݿ\\ܣ>:c }ھ}{lllWǵ6o>&##tU;wND /eN `CC+n/>s̶m***'DvW_ɥѯ?tea?+7(k0J/q[|>*n߸q-[ڒMv9hii>{jE0l %|}Rq}`l3g677EuQ~-s<ʤbG-"'O~vo6N㎂^N 7 "G/ ݻw̜9kb̙(LJ'h{{t7+rbvH: p)((Xnݺu_Y~~~AA򗿬'?쳪?^Kr-=䓝?kr}gmorss.]k޽y7vɎz1\,?}G.\pƲ2k׮`-v͚5NO}YG:cƌo3zr8Fr*߿ƌ ,wqi~իWw9w6r'͘10eBo^ $A#;_}$: N$: N$: N@'It@'It@'It$: N$: N$: N@'It@'It@'It$: N$: N$: N@'It@'It@'ItW߿WիW>Z~= FN*kAWO$: N$˗!X3f`w+t`D{M .nt@'It@'IR=oGΜ)c(.+܏!T_߸k׾ӧ566՚2yrM7]lg|$F"UU>p"b6lSZZ^ZZE˖- qUe NWEDnٲJ$: gz$=}3gt~(%žlynܲeE'0."/3DRXTTLz}۶}t1IUՔuMYdnTTd::|ȑͪlII &[sjvя?>X^^v{mI-[F'0LN<."KBζ^TSS(JFFTWWUm{(| _CChH8meegϖO~ͨQ_tR ܸb?c+W|5: ?11>55 ٴ鍚ի," ?… ^}5N;w~Дf6[\W\|"ߋKRSx&UU?`K/%$ud--m":U*"?=D$99?P^^u)}b]CDνsYY S_߸{~ٴfz$`fzOy$cK8zLyzJ _D;OIL|-СcM!Sn 2^_% Ç:_Νmǎ^SL7.w„199Y9]EE459_~]v{DwN`8$&Ɖ%8[׮]o=rC:&"IIwݵx֬/c+"uu=I GHsrGZ[;?Iԕ+W3g>|ܹ /QXxX"r/%$٤Ibcm"dZZxNDSL7yy9ּkW-ZtڵOH?WZzNf6nmG{·[µNSJ++k:Oohh*.>!"^;0nhcw"2}TEQN>WRtߴ g^iƍ4Mhz_YŞ;iRlz]]>eÆWUU͚:u>~oC't۷,"GgSnٴW۱޲q}OQ+W{۷ݵk߮]""QQWh\`V/Kx~(:UUᏳWmٲ[Q$-:BPRR]w- /mŊ;=GׯcttdJJiζ;x$h;ϟ{'66wXq7t}RRb/O}5[~tIKK>.|??lhh6MYYiӦM^+_f2V\1g{8wBeebIH2eBAA~$OZZۭ_;s=}j߾'L:$$\@'It@'It@'peۿ?0V^}E~0r_Ab{T#ו~Cnt@'ItpRL"rf0~t6ϟn]Ew%'kx~׷I1I=?#JIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/dev_notes.txt000066400000000000000000000031461475757676000225650ustar00rootroot00000000000000Yoshimi 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.3.3/doc/yoshimi_user_guide/effects/000077500000000000000000000000001475757676000214515ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/effects.html000066400000000000000000000345321475757676000237650ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/effects/images/000077500000000000000000000000001475757676000227165ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/images/alienwah.png000066400000000000000000000537061475757676000252270ustar00rootroot00000000000000PNG  IHDR{iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJh@F$H &%ۦGEEEEEI!A 7$+))RuH AM(X-:$H &N@aaaPPT$HpP BPH!A 7 g AJѳ{zy)%.A 7P^ҥEX]qoXX{K?M:#|-< Xh$؅6bJ+W_7(ڴ ^ǫO?ǚ5/mD |/;?4ԩY/Tݹs/ݺ[M@[f^+*sw+KJر37b1tQge;&p-9]KN9>h#4 @Lb=Cgj(+kQszc|؇Vl>_<$#rG'M3n\M晏ϟCbHBc@}PPW%`q:=ܗiiR=|0wSֹi4RUZ1# l2:ׯ*A˛7KpTZQYP`(.Vj+r# @)R̙Bxe˖6ۋcܺɧY7 >}[o+W7lw{_HPBWFI;(%%}˗ G7OC5.P[f8--}~F& 7v„Ng;^wD+g=f;'u8cG<󍻗W+=`d_ ͹x ^LQK#fB(z/55!xb?WzEMV]ܷfRf;_<ݻ2}zڱc~ l?#G"=gwZ%kɔ< wCyyy^B(_?(=f \9tW_u,zEDl1ܽ{ {3;vٱǠArHinn`_yJ]K=z޽3g'ܻti1c0Ƈ6nOK\D_}s|PϞ~Aa9yrAzYWU4gAw!Wp!Ӟz*/-έɼ}YC'>OĖ-[!s]f͕+Wz@g̙x{Yjջ;k֬.׮]K)/^fey>}L <3/E ޽{ۏׁO?5kApc-}ؤqa:||}=<ԉO2 u۳jWnvz?jf9aEWX=;;[x޽{۩,V+͂ .V>ߵ#OK60mw ݻl>7]U/&8rwDL׆y_~qJi>}쎾A.O>0aPJ#"" d2`juBBٿ⋻~`fԨQ_|?bŊ" rxnt{u֬1kw,zUA~}fΚ-sg1&,dh! Ì?q۶okجXv%7Զӫd.B(gp+WtM~/8x;w)l_uOV~RZ\OVTZar<0 gf26/JA{yy^~@h4&,2 0C&Ys~j Ҏ0e?i_ݱC'Zw^l]F`4Ytĉe˖_~ƌ7l׻V\̿ ^g?` -x]I~gJ(PBe2GD˗?Zc7:z%i^bɵ3 RF?Xg+ȄgVlz?%t_T\flMD?jYyA!Fq6+`gPJƤDkrwEbzͺgϛ7HשּׁԀ.9ijozR4F ΢_~ΜkxYIIP8 ޹.T{P[T a0e aX10F`*d007q_ZAώfb@e:IK.pwww9ĉ7,l.t66=𷿉SMJ+ 6/M1L.@T C)(R0!fRw''sfJ"zGxf9v'yv >ycS'CDylͲOq0X euJl=ǷM3 R-_t=ɳK +3$ܮ]cΝcYb-@^eXpWmVYcuϖdH=Ao煄-}}Fzg ABWl,N@Šɗ.q `PBi<8[\5RĘB fc|Nfz[DώSko5'yv $tE32&PKtQ1&B%>(]u"5@Ř huZ1i/r6[אZMgk2rGGғ< "\T}%ԩljd}3gaL L)vu(cN F^W1ٸGO MHhQ-b{0^Sw0=ɳK "vxؿnFڷ{V0򞜀m`RTP™FC'1𶔞eeu >*TnB;hl-?Sn w?KK戾('DemXDD81lD„Y\2z.sм{w8ZGϢُd]M:n2XVɳKp3$$Q e#ﶄİ뻷P(1&*XRB&Tƛ,b3,%E/`Bt="4fbU69VRS.wzg ABW˪W^r(%LL>308T$l6l /`oqeZmqQqaA`SJ Z+K =Gz{:(Vw@I]fڵqV+,lOnz7g1$܄+#FfeK0a…m;1$ܴ`X6_޽+  }4 =,ZseoAzݳK n~'%''Ahd!NБW8nN'z G@||@|=~@}&'VQ8#ԇYMOJ9qq!VbzqWa&H٥V/[NR@7n1c]/4IPr98f{.erL6yѢ']lۆw޹WFϝ޿SSV.3]G5Tͤ1CT*3UV-eh^yfiO4dn{ʂA;>yVk1 b1Gpjw -Q"c퀉xkpOA1¬-EYfʮ]{=:a Ww6gm6s~Цr 1..\Ѹz{+U!!Zzu`ǭ~ {:xŋ/^ nO&&ի96xk@de߱FCJ}诟9L/bcA^Q߽N9Zchha +{4E&X{uZq:88ކ͢1nْq PZ{d%Bu]*Knt YyNΞߏ7nнjʁ>nXє =ڙ%ʂ` :uzFD\Uŷ=Z6nӿV*Y"{zm #))!E VLyy+WLׯSZL&sA%IJnaa^}BB:F!wNWZ `APuG&$ѳ9ev{,>.FsfigzSM hmkzvCJ畎Tk5|B޻xߣ[6u?n*/?v.?{^#źS>{YܙHXFRRիyչcr3{Ymq0i@`|zӦbJ_x\ 4Iˇkm>ACLƮD[W6d;ϟo'V5 '8wbGx_n:0 6o!f OH=qEW1LjSb(s4WQ]Ou u nsh!fpƿpұ: iS[ZWSqv{>esN\U?i 2t၁A>jA_^VVTTxӧNlu>&&_XZ 8Iv$8Ⱥu/ ^S?3ZzˮOu% IDAT;qޞ^^>>PQ^V8qLHFQ \\Zb\rʕQ{n,钣km;Ez-?嗁=z6۷;l㬋 +{yMY}-[߾ߏׯ_1hˉ \u~tU ;g V16s)g:8O1괓{QlFMz[.,Cq=YݳjY-D U+x1Ƴ=?|MqQQ:yɒ=kL]T8ux&ذ4("?y.XBb3[?>kh_\|F))W~ܸ? -јk[O)ֆ#BƙxT³џ~h͚:=;o]0fذ}w믷gXy^LNLpcw>gmyMnhث?5~ʒ+=дo~KW/3ʂ3.ٛy?6H'-Gmx=z2A)< à*#:]P^JoEdN;;N{·Y3i6l9y-'9'!,s<_?&&Z!|}ƍз_BVfNWK닋9)_?p:yGJw>cO5f܄O}}%D)J^[,l0婞>P@'cswϽs?Ѓ?6cƎ?`\^VVq\]79ܧ.3sڪU#' =S^wCgpƂoCBĀwٳ]TӦyx{'ާO^OGm: -."$O;DCL~q&-5#{~0 GhM\9jze|S6d8P8=灷!Q߼uz?'Pe9h&jrbRP*\U7BH094jbǏ2ow4!wd?6Pk';I#9GO7ҡ_2v֛,ǘ0e\z*WQżf=\ ;7#L׶nL{m4J!/߻G+ennfZ2Y. HG2\PB"]TDmB{;<0\4(ፈ#hzځg=. W: 5ˇ{|ڱ'.X?EWCr}֍1e{> tvUq̹?ӐPkSRa(4@M>#J)vWhRJiA~[_38jI&Jc"wpʒ XS[`B)|LtLݣmԇdmfsƓ+?~d]y|(xT+ f !VĨ3MV2QB0!~m[kD<<|fplFYtGr˜,#J(xı#Y'1krZYRW =c3g͖d09n_ =+,l%5ŻkAnAW^D\UWLaTM7ʒ E4Zw-:&^lmD44Œr.}޻AC?2^k9ٸ9ch;s/,:]["eo+1\o21 0h YmʹYJ-"2Î=G7MTd*k@=QV7$#oZͽ h[&qvҫWKG.?Ofc ~֦7Yr l6!$C11 :o羝09^0,(%z˻^_1a ۷i2%Grsk)\j$ (JuJcqTW3j Jcih gf;gł9=<ܙj9ɵ/j79~⤖0Aqqz9}18cyٙ_]2 }vOĎϛnֹSG'LA k`5d׶)4do)^}{'8P7#K| (9oӫ3(YM3qqqB*CS ,+c|14[6([XѬu 4ӓpC5nw}Js*0! Le"0 *[]3MWfL}w U+e $-Ollp˹u'~U%2HlX,X[f/o_oo_ cp1fYy BJsVa~Y(~Fu0vbJL `F3e:qcǚ?8Q&to?'[eOccBz+ʻbϧ3JU~ ={YyCbX@Fz5a<<3>V@Ud'*jms3ES0quUh< mD44cAvyC5 M0Ekкg7 n7k1+K0ƂV!D8> QQBľk*+E!c|(w/ g"2y2Cq1@YOV@k^YiѩAH/$4±P}CSS,ƊqX |VY҈'%Ln-`,-TjAf&m ^dXQf:ɤj fU~^wTyivwbXWFùy3F)`(Q T=7!A PJ(O@ bRZ [3ig"x(L6dҀREp Wh4x\CW1Ajz f90R`(E!JʽJzKC,M%iT^UYMP(E"H0&fg֔HF:aD׶Lbz?s}nӳ8U*pVKۚ 9? jջu:RcP*3j74 X&Jb5cVq6ZjL:aWqQZI=ZIJ c BU$!Z0*T*@&,C)PJRD(bXӈ`1vU(,>0 $V͍i;&!pkxb A"78e@|^v;DPMLSBTZnN1ƄZ<2 ʫ꣨ڝRD%QȆaB0 &/D׶LZnzF ޣ:N{P<@0mD8E;o^Mot˲P.W8Z诟`e {vBaxTVVzy{3w9'L4ET3N PJChՂ_ cA_Ħ3;~\.1zl2iH@܋ cL(bss7E@00R"DDKnFLyeY]P4+Z Nq##N =xƸ_[@PX(ݳeR֦'>ke.3m41􈋪E&kQT B rL.2J񂣡56wEcY+joݶMk#ZS-JD]CJ} ~NV=Zcڝgu^@@)ұE+.Rrڣ͙4Pw..ӕPQQI)aQM ;1㍷ CL"xQT&bMOVvkff2`+V&oYҘrFLgAu`ۯ=<\-3mozrC|CZdzSh[&2Q<} 7Y(!"DŽ-24Gdgg9}v6Uo7Q\ <9=5Jy煅GJeL \aSJSՕdlb=))&#VjNdR*OOE!cB B@h=fPMdjP@Ty1 T%Щ b0PYK(qh2{4!nǷW~+B= mVzHhب6zݻ+ ^f4]d&k:hhՄnW'Z6%@+qFgsֳ{㇙;wvHB)OhUڟп0PBuxCPj5zԔP&.{D&+(P^1d웑>jxBEV:P ػ !ԞPZ-X Z+& xvGnT(T+ռ+||UPjF^Y̵lc]tM =QʷE+MP:슬NWbMQ nz CPC̐Nd"8Ӊ֍GXPI.q `P"oUV`\+D fc|Nfzev*MD& 9gO 1f5jZ]U4*8# Bb Nû]jg*//Cjq?0Hb}WX ur ]y11 R-_8ɤE},;&Q;MOsu"*C<np-*adK=A'c!PR}w*qtB1&Zyq勜3#42"Q$PKD&5}3qv"FW5[JPBD'`\[G,7HmVV8Ee84| ==VzeP\Z c\QZkʼk=s6hy!aK__hg>V! ^Y+:MOdx@g1w)EϮ,CDҲ.*Up߾kcDR:0&@L)[7c"` h*06wHi .6$8qU4 %T^^S.60CН&zGDN84]\CBLl_-ǘ`O '">e`ܜ,+ռsfmEsOr^^PQVK)udWB`ԯW^{SQwL#Q@وYnz'lb"G)ye/YjW[QQ1{3fW/0`@@@x?Oh iLFڷGLCx @`PBjWN6^rd)*(yc| V4f&(V1ٿn@D6ȟ̥ i)D [(Q)j|P+.P^9^(.*8c}='DhhGUHμ6jZJyu>]EόѝW%ױCIJyvQߚLB[X=zT*U||={B?SW{*8^][q^@Nc""V(HgZAysss'2޽;/////'h8;N9r2L%~ߚzcf1XmVN8^0 6f*kgØ\uǂ|6*&5WkW;IMDF&;Ef4M1xf v# MFj_kv#N խVGgNyQ^FD1sB"ys|^v͍B/W> {5{<>O?-v9f̘N9 ~˝lzi'ԩNd"Z@YoM%LCkulwraI&1w y%Y&{w_a^0* J,lh&՛]ϻ~-qڊ95Bh}5ҁU;`b'2+=={-3Ul rXq]o7 l8ꗍ/o &l3-rrtrwmycY=njQVi^}859ʫGO&sqm*lyݬЫ-+# g*cFHOOX,>ĉ/^8uC}فO&Kދ/k/hց_|ď+R1hr^ĦwZA;ܹvّ:v{~dQQQϫip{ivA3vKEAĦwROfa1,&CYiaYYN7YlUo )$+;'#-BHkjԱL'ƠӹL3gu].•˻~*U+ VNx7[9U,zVoMyW z1䑤Z# 3g6CBg\<{ +]EYaZ1HUIDATUs<X'O3gΖ-[O/vu=tPyyg}~G~={?uֵw}+ޏD44?zd> >x) ƾ.^lŝ}g^~e/<6첦?4gNYVy`W۵KJ?c'1xH1PViJĴ y2%@`|©'י6]nnC?n]^J}ῦȾf>SEyٝw'5*erWB)wr z<%RxuZ ?ٰQ[:4͝qͦrs'D 0ep`ڊurk|-=2 xw_/|o>cR>L&ۼysii={,X'̚5+&&ϯ``Yӭ6{ڥz}3]W`'2Z1z@yv5xstׯ_駟>FGGBx#""(ȉ3 ~zϪUVRv玳'716 &de\9{PwkOruGĐ!iiW˕}F'\PVZ2iаHB(j3u}5=x>@a~C*릸0!|Рfi(={v䚳Y1phoB o2BTq CޠyA1^{-=Yj"zV8Czj$dr'{("GK]k6ۍ믿NV7dz]к8Z@d!Evv˖ۣ9s|ntaR2Nm`X[WwܺxzF̜{w@C:eݽLAA,iPl֌;~ׯ߾}>^s>adz]n^uo'/YRLx`d~b'Lh"nĤmÇeUd1cft~1kV+W o0T=x3 uf4!8hL{ڟ׿Ŕ)l4F+PX<6' XRSK+ ż[,rRP4rͩ0qEKOJ9qȮp6,vgVICIIc~Q?breeuгޭ2.ǘt?iòb#κKnjYu㑗 T/sVg_FwqDZOm>jΜd~v׮}/qD bYozˉ< gwUX5pd!@V^ǔۺY2r;II ~&!ի{ ܶŋ렘4v|~xf3}f>M>$gmLŋ{gԵ}o!L LeV@:=xD>T :`XX^T*S UjUZT"B*)BH}.%`Oɹwsڵ?GZi} ::q  }|@QWtv$]ۏs&FPtʕ5 ӷ;}֭SSq ;v2==JkmـBq'S%iifvv=&_}-&f7Q))?zhhӛ4?>.]JEF6\)*Z*Ns{oƖ9r<]'S_==iLfD119QR l22"\ "Q[SkWM('͋9GE5VUV.HHp겲o㘘8^əary_U/, pUC@z<8 uykkV6s֧|Ŀ.FP%&?^\wvd:x{#11 s{|_ώu0,lvUiiYAV[8:Fmۦ&Ji K/^^p6;ð}gMc0411q:dFϬA3$?y]"ioig!|WXXq|o'/nޔwu[]izQM^Hÿ>ӗ,zvh@e'sw~ntEP`غݫp1CPdfεkj"ϽnfP8gJ, `폏PiY՘wwKM]gO |({dciiVVC桿AQxpA8AA}0a B@gI s4uW n/ڰuscr8]mm:T(CR*?]q99]\4)mfkQo-/!MBq paCa!RIY_|angWVPpawh|^N'Ct>wWVAodsmÇ7糌n_#~ۘ rq "NVH G%H$"/<yzkR"WP-fiihS{;;kQV!,NcRxe#"OIC 4G8:c[[Lcvvvv;/Oc;I4ma?|ItD7 LuRsm-qhG! m'()'MM͵īZ>Gn:RXӱI@{|F5?, GGg:5Ylf|Qزe#,OM-޹h6-$$Rt砠]QQAA۸B9xG11l5AHdED۳gZHȳzك+**.7ףL|WUEeLJ @Q_lnF(nHH߭[RΜ %%&Zk:q_~3Xt鿎32E{T:jQPhD|ʴ43;;I9 I(1"ws{+tGtVI&G ERIBw[5kxffYYMLJEjHHHH^`:::b2O $$$$$BXL&,$$$$/L L&E*; bgg2[FP>BAB#Em?/IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/images/chorus.png000066400000000000000000000521311475757676000247310ustar00rootroot00000000000000PNG  IHDR{iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJlk]¥~' ?O[?**ʕ?ߦW/7Q F@ugټm+Wt%%>!!ĉxT1]E}-l"ĥ`^">T"1"Z(i'Otn?Š'%M| EDg!BD Cŋ2gj k?5["D3g2 [4hPk=푗^lI}}Eњ!Д_~ P{xZ! $v.ͥ)+~6p*H=dItqcƈKR[>m5qq駑qqmk0bg1,77S'7 {95k+[x{w/;Ybݯ`߲ef<#-Rկ7RRR!5jN{8C}رc5',, V\٣G~سE[\9f&S-_X;ɏz1F)cL$F*ʇ~g˟yA~楼^9J;Ws9rjٿ]O fgt-+(,/^p>gD*5ϔd~_~cv~MDN*ww]q1ZZtŠն"nf_$B|_j'N;mŊ7ׯۢk׮.\PʬV𒟟d2I5\!h#GLJJڽ{}{D2f̘[bƍC@of⎝: 'h&jSPȝ\*9B3##bƤM݀{nu[wR1aĈ_۫Dz.@I&vkʕz$+ѣ:W5=N}2/\L] wd'n7FϸqF~#s碌$Fŋ Z,&@b 8|Ϟ=.\8iҤgy3 0|jժ˗T5*C2 k׮ 6]v]p!11G;|w-[Pߦm1[}37;iߺ݃Qq!z|aݵkbݘhqF=נ?~|k֬9rd3«W>cbhhԴ'Ǎ;^ c>&Ch%vqF(!;mmK  /gk~BUɵTM3;we GM\|kNv>BnFw!߂d(N|){|4J 1! I0a $BBFr3-#a*ZǘǸ~rP4i68Py.}?޲góWV-GqtСgSfsK6}Lc3_煙0%cbĠ lq0t ;`cа=ay/ 3' ee2ggw??`&S' d蹽z+N]2vd/ jtf{k׽?zܣ7 ?晥&^x3g? >81̙jЄ-i!Vpqq裏y !֭kUNc2ocR3"nv(00کKjڎtZҥ!څuȑ":u:Tqˢ ,7w;\b_kxCX4Ys|yhwe%h,=yRᮞj0]`AԼ8- >;k0oU7Q !^i #+3""JI> 1(Ķm&Iquw}gggKK3Μoޟ~~=ԽRۣWppH۶Y.ׯ &p~޳;wRJmfH3K+\]Os C>dH@jTQ;Ɲlm ڼ<0Ev״S]gͤJ&3UcaQD( JC`LnĎ]`k&}ԨOF~TL7q z+Z+WYO?).1cr\11)ɿۢET*ur+?wpp@VK0bdN7:WBό֭^yE#FTyx‹xל9}7ݽ󑑏M|!Jz` ō h RI\||&Ԩ7?/cc"eM tHW6mok~׏9H)Jm cyRZRĪRjH,FQvEqt0Dǟ={c10@`*WţJ&A N۴m|kAHhxyY?~{yBl1g\O5Fve5hDg!BDˀoL _> Ο,c)P"J~A م>g&..~ǟNrB"y7 c2S5]+] Tq u{DOı#cL0!گ|ʐ`,ڊ"@aBVle-V\8}0qι<;2c7V"D~KƹҞCHe96n^.W`LX`RB&DŽƙ,b3,yŅĬT;`Ll@@T Ix:!iW?l4k> ;WV 7-4Z"D/(طlYMsggyhDTXdU&sX&dfgT[@"Dh_jrr!!gRȞ=9<+!g4ƫ(.!D&:aBxg6n,h{GEŏ!* :vxGF;ڵ伋 |F* !&1Q #:"5bcbc9ڵT]~Z9EPr7??@ߘXB!*&:"Zd EH.!]RhD!Btv"D!:"D"uuW_yoSRDD~Ҳ7RRʳ EEf@p k+"!tO?XaR+Xڵ4]~A`r\*@u7,Xk֬5<LYIMN<~ܱqcJb06J:{{QĹ0Wߟr}f o`{}ĺkׂ )nݺ#Gcw `0fA'b-al3n\hȹy^ RCWͧd»zrT"CMjMD**uhtM4Zm#6_9BxoMߦ)9$8) 9U3+;w^۳'O#G:4|͇I(MO?aCYff='<{\s^{GF Vf3Y l #,8912_$qvhi˗GE,7l VΘӭTiNt;MZ}4Zw7Qs-DžHӚU5 tyU5MqM=>>0yj*wP_o{:{ɓ֭LXZ4nj"%f}]횖}T ºv}`wfƴk\ef&-Yݿܘ1B(0j\1P ²eyɜt I$uvʠ[:# ~JӒK_Kw_QRTT|䈵ؘi̔k,M]UkIevݻګ׎,,ڦWkXMuĈ;[kh !:^']=vJjRs6ӷUu`gip6t$4{!!?WdIX"nװ#cgԤۿ7y8\o|xc3nXur&oZ4>2{⤐{V$5=˗1rW IDAT~"o,*ubXK>G? }Zm>/*bMZZl?CqqC@ooj3O1g^dT+A)s àJzC="+.]@җZٳ'Ӑjsn4(ʶػoāzxHB;tj%Jz_cX 7nHsTIJMz?5ӇI/fxoee¯9aHOOW 2{Vkc';ܵQ׻׫ϖW~9MadRL*qU]J)y;vpK6-Ø͇I]wg>rԼtԹ_0Mbe;(UrztP1-f&7ge2e'o2U;:1u?B.^8OFS=ؗTaFI=VФ[hZK11auw8f믿lqD2=zv|6DHT"w?p 5>9wAǹMUokP^GrxCbwx1X +^8[ߔ&i]<]媠-_>-PJ.?tqm\& ƜٰJZߔ ]_z5A-ɒ_j!A ?w!o0Z% D)iӶCnnN~^',ؾ}`R+~ExcoŃE1[NfAd % bB!b"d&+,PB*UXx#tQ}ܖL#*9;r3uEyLtƢ2}ALkLe:cIhqQLKƜrv h5ef4% #0I*ՙ&+1!d!UC.lԊ«W˳tbI?:w8#f$ ڲo-LOaa$L ˜kL,Ĵn3jtҌknMRTTm&J¬(!(*ӧf,T(4l,W1f䖖h <9R˗-UuixVMO_ýҤ_cIt!7;USC0uaa?ltԄa-?hZ&xCL7ЍKn˄Y p <\Q7sB\\;]8Y-fM$$T kcD:n3UrI){|4J 1! FDRJwn HnZǘǸ^>5u뀽ZfOyy{WtRQ *U^ zyh|ѣqDHgʫMZ(5PxxDcP &EƤg pw m?}3)X즸-!a^:;4 @LI1n۶k/Dn!$<8F k$~b18V1mwtbl͇ISPKVq{hӓJPRnٸ b8Cu ơi%L&Vc61]Țu>U[4!B~7M@`pB>՞ H]8T&-/=n4~RAni(0he8՘eXɻb^wO[]3FuJ||̯vϜLn!!+_=5A|ћ(a솩)/A4Sy[A 1Pm[eD |f6p:!)NܘMXqkMBo\MZ.*U]=zg9qt_xNT 94:5\\g1?*&V~/;}ZQ} ՄYbiT%}lptLoGB2{xcL0g@QJu3+?"df$ C ah#΂x0Ƙ6/h\aR+yy98\vփR ћ,!d( W$$mbY*v+D H*;EcU*jH EBپCFC£d(u%dU&N15i44Ѡ[ljۡtK3 n.jerқ=z8U+oA55Qe^l&6Fzϫ=K`+pM?WO&kgg{솢"UXB`"RtVHq!18(8f\4&XR«< "ӗ`y[M/ڮCmڙͦmUNJGH*\!MS튵ϊ@9:&FȨ4VL  r/Ucx[MrhLjra,)]Xb8P O=;s/?T9ic'"&7nkKJ8WO,W!j6/_Q֍ oZwLx5L;Tv/zx}ݬb VԨqwFgBI89!ŵ7Vf0"4sIy,3=)=I2{T+"<c)RՖ&En葲uU,_ 0iV5i,U BkղOnd9?շ]jY,Y N24d /!+N%XFlMwM^SM&K8g{>>>ɤ0Lgcy t!|1&eY٩W RY=g5g&JdN@<U,ٽgoΝ=Y5]yYv뫖Q{z6zz(MMd2,xokV;r5inb@c>2 :qsg*^}-/OאZ+$c}t7w^SO[ZԩAaЉcss.x˻ј0 BD*T̍=JwcJ:ޜ!1aRRPB(ƘJnYLjB&#:N),(#44 L|frd}3("g`(@ jWILBcql6+c9 PJ(GPe*q#2ܱ#V w@#jr!-Vտ_;0ݺP{62J0pd?9~p>5er9%פO ӳw?WWFdbxW37`L&k\MR' (pJ^Af$C&T C*nI@ T?ښXv<`~PVVP{TTQq'G BnnCɂ"ByPqD_[]rmͲuRs\pC dEVB1He8jhop{#j҂]5@Wnޯd !29 TO&C7>a' a貉5іI4& vv/5y./+JⰈR~~E  @ Ba1yN3ܗ#n>Lj95Ub1`+束N(2 WpH Q"bowjcm]kOdn4]\\oGm˻M#,*%:*qq,} MLFK> yEu׮௼J*+87&W.>>fML_ʹy>M$5Ub5a5IMXXҴL~~|l>)MZZj2 rR U\="ʔB! {Bj`Jr,rmLjGPPqj2!&3]$JQ8C$6PJhD j6 wUzVg\YGg7tr8f5oR/o1VVD#,*8:]k] }T2o"wwFd׬Ys~}`h߄J`"/yb)C3Qe]06i4x+<\NU3x3V \nEqXT 3B,Ƙ*ъgm7&7&R@y.?gcYRD)&CJdx0rbz +$9l4`YLOyŚpsYY0$Q3Y-7mɧU.*AB G+ǥk׷əh:?LRN@y&d`gw4#z}Zj Ƙ B%xkJIɈw$Jzeysŀ~n>Ljl,#z1ı#cL0n4T"0A mVcjԞ^#xRP4((.uD;SgYii5M촗J=դfϞT*cccB6mjYxAC}@,\+;m+h3Mojg5 _?߄4 f@F*9Ib֛b4m^jlf1WKoc9+Yl\A~h[m[`ҘϤG6mݯqM=9?S]cY V19Y16f5,kØde:ZeQ[~ןx1Y٨dzl,oe9gf0Yfhjʄ,J5ejշb"sfRǏ}] 1<Ǜ :^gleh:`MY99Y1֔߹΄?49j4/_<GjgpsC㈂LVfG۶MM5FHMMX,?/\0lذC O<z)Bțo9c Zz~q1c3k:*;4mYΰV]G7- ֢!ƨ.9%<%cf20\ 9Xlcl-,*˱X,J#ɩW.Tsu7cD&kLjV^w@1Cq~;=k36"$d,gMQaQA~`SJ rvmdVqҘVQf|JY1mN! 5[YXr.7'XBNS^e>wBB}4qtqs&|z}}]׈k׮mڴi͚5˖-kӦBXzqJի;w/|FQӽ[_k6c ooݻק',jM&L4v|uҤIyyy=zt֭o']CʦWUh =]=Ih;0hZ&k m{+.3ZJuVaٿۗvqe#/I ,1tR\9d2PyjeFh`9B)wp2&N@aRƎ-ȀS;Y?qRrZ(]7 ދA ! :-D(rXaPƗΟ>W./-)4ldpH8!PfN2O*IDATZa TSOW(>~hoyYZ1qq-IOC2YY>Oƚ{G{T2*Z+g65CfIBѶ&׬zh.xzJ8l689)rB&`4tz^qʨd^*u۶k$k"`ro l 4t 6oܻwWJ;ߙ;jPdlK@@ã}rsϟRxTt^}5RZ\wܬܩS3ô8&uA_Po2smEQa.*Wb5 ^V`RV|UgWV#Z!@B+ddT+l($4Mv-X]|y̙ϟ8K.}aaabbƍƌ޾}-[̝;_jQQQ}ِ!CͿqm5?~|k֬9r9+IejgVʻp|R$W(*JdLE9ԱciӤuϯhLY9嗎);:$Yzɔ|r2U +GPJzPJ6j巚Dj~p+Idr.˧֯O;pQ1Y|qg7mJ;p֘SXg+ 2z V$aڜyG$993YjemԠ+s~\\Bwjxi*M0go&Jd ܕ >}ڵpvqI814>.B͇I](8qciFFC;**~X$vz M]\\{ 0LC+Iscta˖"[J[Gk-xar ]wmI2RiP1Xb\|8Rkӽ{rA&qv6.֭goJdҬ4 həǏ *Oc`P br pKkũ|}QgrLn~~112^\R\\rS^J]!C^gdQ֭ٛC4&!!k33f@T|}""Z mP%ͤœ|٘MmDKhGvUnHMm nWU&pv-e|Fte 2NNZ T24S 19&f!Bpv¿KxKiSĿ{-J B!fg \.Jy m~sυT;}{~ZT&3t+}k7l{>OL">Dw b$ak؞=-\(v>B 3gfwwsi}?9r+LJg\fhXЦO^ɡ|kܺرMޙ;Dz#&.ZIV=)HBȍs=q?@&…3ftj6C3V􏊪bƛAxkTJ"V5%ES䆞_ʹreϷvH:~T|}D ټxKs&Zl$^y~;4up|UM\϶9y :tw&P bx/4Oh^ّHz=sgã \==;?ibL:!d{9+ݷz5?*j܂w9d~~0LDNm Bʙ3/4,㷲V6Y [XDq93 qk`,}\=hV,QA[\zVP\8j$!I͇aTLDr_w޽t&?zř}6D )4|4g6CXPP}gab⛻ u+p?92,v$ՊlEeeog_# A(:'"BNV{7{ZXw+* :dIIx~sׯnjJgZ{ \N 6%eҌ >>zOM] ;Z[YO>-mS^@"TX0j)u '< F#aB@GI :q&a}}-u^k|8t޼;&ͥ1e\-.p$/X5e{PPpL n\~o,)aMM܎NO"c̺u=KJGrQ޽l)7'`֭Lo#!\&K_x\dX\G˕檔=@(߲o_LBCTWәLɓ)iCCg[I@+…_Ν0L79e312IOGAҬ}8v[ 1l4F*n̙7Μ zĺma Ϭ e|a*Yr򀲇Ƞ3\_UXpuuWޔDzsʏG_#9f4JЏE)*ᄅ*UsVEG#C 際JzIBZ^gٱcKq1o0`:[L0|Nf4aWTssmTTR > &`xVKP*vu*/ZTz衒-NqM֙B9z2L_жm\w⡝#,ZPZTT3-{|d"' zx%1'ޮ.;e~)+{7}ֆ{?lbTT6wy)1J{x<\xOϪS.ptK&h˖FB&' ǚo.:tlN Fc0o 3/߷f x`If朄Ya՞իo:8 '0ҭ^Ee3YY_E0 {{;;u+w; 슋KضևyӠVP(LT uʍꫭt:@Pɍ{7?}:b5 0qDV7lH:r7k+mm-z{ ?N;zp8ZQQRC'!hmhOމ,IX',} k , !!!!y1{{; X(ZU|BQ,$$$$(EEY|hbvE)1FCF#ABBB! mɊ www$$$$א>2IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/images/distortion.png000066400000000000000000000323431475757676000256270ustar00rootroot00000000000000PNG  IHDR}߉DiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ3,!!`_Y SS]=;0@ ےg@ }BC}Zߋ @to @ 555?_\\@ ]g,|h hdVd%\Q,,@ #Y<@ #Y<@ #Y<@+` tA`|,X-3,ap/_`LPƃ(!J۴P(DACtP_AQcDFF>rssu\311 aJ_5fLmY\ kk^Oļ٣I,o xP-n[W73]ֶ3qq}>v,vۍzUEE0>PxYWnɺ@e\DTvnnKkk֬KBʼrP/.nʗ_sW;>snm{~ :t(rРAl6;==NJ_ ӧύ7Ng.;~xO81tO?ҥK+Vpuu1cƱcǞ8jXG{P:u Y8ɺ6ή fn8;Ν.\HML5w. qv|0/kggvgiu;Wk1 l ki{CfɽuKRY{/֔fe ֿsiѣmll8f(:tСC(i֭[NNN0jԨ/+bbbJJJV^٦fepCL:7#Gt8Oڶ-yΊBb-ktK֕+ٻW/sjnm VO;/٩Q&FEٺV{B;ۧN_N}KVyofDnxirm[+W޼yў=ͭ*=z+V06A˝8q⯿m6 |Mͧ6n8dYTTn _޳gi^:l jdffر1Ո wDů|v]X۷7]=8}cqq¦Z:lg#gjne5cƣ}$IL-I;iX;9@ 6Ϝ[sZhQbb'uuV<==N, [zuLLutt4fVZiӦ 'ʕ+ݻ.\pɓ']\\:#KHH8";;;[[Yp C|r4GMJ:ի˗/7nikjn}G . xH0רuaٲe(\&F sg.\zx7xؐemg˗/GG G ȑYYYY(=pچ@0!0;jhx68=b>#F0 q g (22f d)N:gN@Dٺ}sá(QM'|D@ > ⹓#G NFx G . A ªӧu\zoY<@ G x@ G a5ڢ"IiZP+>[::\\nH sRQ` Gbgggk+VɃYgݻG䛫v\|܁v 2)(ߪ܊l.4״J=2.yM&"@XIK.(ᙛ m] "%GZÖTuU$% ̆Ꚛii+=o_w5T*M 8 A~+ld;}53Jl]CGJ}yv'E (z +%PrgM"O[ƹ(F{5A>N7p Nv(kzwKXrYaU[ɼ']fII˗/[qqqƍ3œjuMG ~KVSʸK:q"yi+T2rķF <Tޓ+(!P#ߕaj{-4eLyJ$ţfIB(^EZhC ,)7)6"ru}y"N32tT,#TŦ|'̈́ L[>tWaƕTSsj0>>Bcugl),Tڻ?X-La8ַB))?ZJD/Z=g([]jd%/PJl],D/<KQg4yZMd'~rE[z0Le̒KnO>h2Nsk(ԿE.XjjKokJB-{Ư5/..N;Yuuu♱ǔx?XXx߾/srrJ$ʊԫWJϩU3k~(tvnwx$tD|s\xz=".$JeiiiL%-˫x%'$ H[2Q ϛi2S/o_`8>h\=uv b1Ob>xf8s{[MZ*8h{4{\ ԬzxYukeEc+.`?p 큃XfωH3YZR4:#,i1ѳG<\eB%;9;YIG*Hr?Mhgܗn"Q%KP_4G.bmJB,@I;\k@Ϛ2eJRiii)uJ[IYYo fwO8pI$ 8V΍yxy=߽Ck ~LH>WIwǼz%`B% l35yxl-3_SdWuމ?W l =3 P8b~pC;% ( h~S,Qrrm8`(%ő{޽[16|~[qn7x0&(IUJK+55jI]eJ")a4MӀv q=UR=U&e2=tWR>*'@S>;z=0gB(i1P__{wiO1޵~U?hr !xً$@ơYO2{c7:ovx(5>^eM4Fgo?h.V*p ˤY:8,$I\U#eEهG\tA|z|e^spp96lkf{-(߾a)q|*yxݣGD8caWIKs{8;\IX,@{h-ỖL(L,BݪDbfmm̴Rf}C8f}Juh!}SC,јk#]\uR 3ş'yMͣ^7OzݼU&ŕ:c88vS{;8@cBI)T<h3ssO/+.hki'|߲{;R(d=zWɩ ($s0a~J/Ƕ6'-.Iziey J*}n'{N@>ܲa EIiVVѣv@4 tI=Oz\JOck眕<,++϶1o5%TI%}<~݇KNARf,g!jP),f)pH*S 16'4#C%aT{_תR W$B:tc TBā/1r߿yJCC48ДXy6M4:*!'v4>@W)ڨJ_͖A"uLE%fgkف {,>+%Gף?_}mP4(pc 1S$I䠡#l% *1H_%O@jٹU%,g@ .ou /{OθgyJOc?Yt GYN!Kh'i||%_(ڟ%15tݖ-^%+m]؟7u;l6ʫ$J0l@T{A H0lWwWxJ&kAEEJ@G%Ҋ ymC- WE k})i$~p@w.^IRȋ lJ55umD&^RPxz0m߀aUz _E5=M1+.k` sU5q0f7 y p֣&i5I$٫O_x@Di3.FIUˀa6׏tS/%Yg@Mf\bJd2c봕w @U Z  /(.*W^}4暌cy9i+gvQ jz:l*|VSQRJ^fMieP2D/e~P-i`.Fz:XCƶ 0\MA@CPp3{jA wQ90&aG%% 7O4RV)K \8a䤣$I4YI b \j5P\?(2կ2z#%v,^C.O<ŧ7_aDOJZ-,t TH>pmc4 DZGԭJꪪvR1ڕ"מ>Œb^Hz1ݩ}J Wz ӐI s+҆%rj˜I$)ZPXwa1)48@4Fa"T$Eֶج ktWasP*)7U Ggw_# ~Lg/%JmiC01P!=z@f=i&k9Pm2Bb,MJ 2֎!ErjuLP߾y0ﷶ ?"j']k]j֔6nd Z$V,q?0р4MaNMga@P4MfgkN a*0УT"{֔?wy~}_zs;R\H* t GaAݺT"VըreS`&mRBS2֎fuLW/]7r$Id;RQJW/_?5kRo 03#IRE @6b4 4Mc4 @4FN1΋Q$M$/Х#V(htWfFJf[Vx!9ukW.5VJ( (@@ZX ?{H=6eS@Ppv4cYBAq@8'KO/oGDE TSQ.J$|EYSZ<ϗP[[kmc̠_?/LLJ )8ihI$IJ$F{lY ai8Nh=*9iJ%IS q5Ƥ@J9*ʫzo6Q20z(?pp; :TH ` LPHEmmU]ۗmYZ@e3 Kh<(?b8 EQc^iƢ)c}- hZVS4%jﱹGrnM90X -qB J;7ݕ]Isbp4m8A;e)5J0[ Z~TfW4 ,Y-(m]۔G難m-+JƮf}يUB5kJeedbLr(*,phc|`}hhD}J$I+K%%r))P mMuli5aaq1f4Zdo&3ft:5̮D\\\GQ21a&4mZkO߂:dEnVDFYSZkYV⠗|z߼I4 5E3S0V8 4MP?Ƅ(VdIH7S%y~R0*1)(0r6G7*iāo2#FQT*qMPf[>yS&0oSQ9%Ro/]J$f 6XC@@֙3Œ⠗{KJ p6F(pMC}cahqiy3MEjB&$I$3[RyMԯ*tDzRԭ[MAyU4e}]$ "m2cʹ{.7muĶnӚ?и?}_65/ojD"o[\Tɲ/"qjoOp6[~jSص+H$)() #&IDATbōNh V$If޻=2f;63ZgŁ&T0x0^?4%4e}$TFih.`hfj}j<5/MkqQOWZ -Yz,kf/>Lq&M8R*I I(AIS E7M$I$"T*"IRT][Ϟ\3Vd\xfe&J@$V 3Q\~鐷L@* ,@Im2ֶ0vX x ͐_|q@̾AJaT^TI@=,X5w60iuL+URɧOI$Vj ("5T}NTT !Io\J ?xpJ@PIaxO(F6 [*WɌ_nG1TUUN!o=4TVT4R/zf&YSZSn^^E/8dҒGgf'I$\P*TRk*5A$MIIe:R&WVU>-+ɸ"LTJGdxDH>7y2b盼 (64|x;jzԩ2,!!K.0<na믿qu&tXg@te5\T0aiSQ{IYSZ<M /Wɫ{+|]$I V"U(UJZR˕*B%+REXVU[W#U *$*?4, &OnEuT~pREEO6WʪBGDM0m4P@ٳ,+>>^srҥ;w,,,\r-[Ο?|?~0~T?OŽ_3X |xܹ3fhkl7SS!5ǿܪS\MT88,iS:?_D.3m"XBBJɪO]#1:jЀE17T AiW/HL*bfm=b3kkE;%Kt7)/_~edd8q#F9sfҤI \.ɓ'O(***jwvss2d'NrQ#T*mȫW._<..nܸq:jƹWQ!557> m8Fx<’:D"IN[5qBg)Ap|ܹ.={ꮡw" d[0ljnP:zxxv3vc>WEJ́bq8-j'xӂj֠h,5eʔLR/9OdZ&kP 2`, dž;Vnnc?ܲ3=%''U*{sL>/0aB``ʎ-PBQR\Bx 99iWva&z{!%@qYk֬ee˖w^1dKT/a#f3bI"rذy۶96_YUJ 5fp^#hnBZ3~<(e20<$Yj̴ _1o6S̬BhapyGPdd̊j̘6GLURQUpbgvv6P3|})v9s>gHOI~MJuxzfG7nx<~LJ[^[XĈy|9s"";eFX߿N(џ\31P$XopPm,jko| ̴>,V^{~?sB*ٓP+ UU66F̚zhŒ !īgO_UTdnebE$Aغr@(c?8;ɓ3gQp|srsҎJ0lEШ7 3/,L̖YJI9kL,~c\ V7W x|ߛ7d2 _}"fOaL֭VVLc?hic7Ϛзo]m-EQSgfvH7fr#3矟~9l0sn<<3Q7mZqjpb$O8{oLQֹs1Y?Ll !!W ] p?JK T)A'|-ӣ 7Pcd\DTvnn0~BINۙݻǼ>ӫ~=hu?H_dƍ!!E)ꌖfka3fh+M>q!sX|`͚l)-(|8;۳gO+GG7m2 mlЁ3hbpgÆ'Or$'޹s=1KOwi:;5uE׆ . }{|bF}s@(w={4o=t0egϟ+V,=|Ƅ4?y3Ez\*hrm5lh Kǧ&&J*+# di:(2re&za(;0# 3w@1/v„ׯxo$ ʡCO~ͼw]5G^zUMI { ,-pˁL,1ÛII&ϕѣN+x]$=(Hpz {wq%޽{d^\h"4Y 0= ɸtɽ{̒[;wIeAIt;ճg5p5!A{Ѡ(52Jk[X%vG[ogX$Iz1o6g?]ktzh1zi,XZϛ4w.0Ny!Ӧ^2b' |3z޼DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJٽwއ3s;s48pDGu֭[78pp_kݺuuv!-i68sp=Z 8ppbX,s{%sý Sv8p'Pg8p);8ks&ރ`(v<'GTlflX+p┝]ه)^4]F,++!3jHns+27-UN4]^^ 9eCWcmݚs(҂WO8{r΁NV]Ç+_>oT);: ڒ_}eTn?%{zydn:SΞu~**ǣ^}ߔqdWPa[eQ[] -NMUsOȿ}8#^y5YYm~YJou?ǟ5tw2 sȡ?-+-wJP,X/O h ]̚6kJ+/R/q}v5Xx1g 㲌vdժzCo=ڄ0 ymN9Ƙ3B*NLҶnUwW*Ag0VV HBWH"F&<<),r$,9 i)/PPtgēObv_B{bO1lXkxx؈$mdh\OffV߼x䉧ӷ+yE yBvd"DA0\eP؉e㭑A^^ٵk3f<عhҤ7 78}u4\-rsϽKvLJbhHHgf̆%KHH8iZy#!Ȇ N}瞛Wp'O\ ? ׮uYwc.5W_,,sHHg˖&LX#wQcZ:z/8)S.Q?:<{ +WBgnW׮]C͝;.šOrW?'MLHAi51E!B< Q(G!ExT P,4 3|Tw#wnuv"u} 7Skgp'&h++ 32'NsvEMI?aC̠A;kW޽ڷfWf}5k9scƒzx@aÆΘG[߾…}K?>ɯb4 jLW\}Knz=Zx qŊ SNӧGW^XF+Gi6Zg(( QFYYGz 40vxV,Xv5nwޙ/Xo«>\x-lYGK{c`Wz PQQP0jQ2{)  0̱|~Ba#ӗWW4_>t/"k'N\LMMz!'|s]awDXZtqw#!a܋/eeu|s0v9VT#F#믿ӧ۲ӧOO:~hKuڹ<ڮT_2l@3ZG]v"`&P6A&}%i}{LeYY|ɒWwܹo&% w^~tիWJ³쭷_f+6mVqnWԺ>\ PCwc6FDՕz8zlٲqZ@@URKwovczլS~0j-_2OOuY٪g}{۶Sh͍ߩy |CyKll\.?}tNNNuu+2y䌌ӧO Yf`0~A/[6T8ߟa8m哩v" P@!a(me0& OFX?\O-Yyի1. Eu#(oIW{!`йii׮])Z8Z]\\TyyKIyeZǐGvG͚^yljR(c䥧Ǐwיn]n}e<~y2qD= {׬&An]]M:]`eׯۏfH$YYYv.+#` ZmESEQ&P^P'C!WSO!@hLJtȬO| iKL[DWUwXM;ٳ;g̟/?!K}Mϙ3uE}w7^ v`ICŧg??0g0wO?߲ű4~{ .|__}_0 yy; !6Ma3gzYHO?[ƴĒg޵kײeFnmx..fWT0 RPj( ,.DRƌ' A Ľc0 #Kc#ȿt)(6;$&NQ$jvXӧ?=}瘘^|R_7 e?&r8pϝsֻw\Djh#gg9fǯ'kv̛7o޼ym~)Qj5ÃJۂXye=0(xi* &l `aN[Β#91vݹޘ;3hPJa8phKt*i'z.닖,sk\1~ 9 f jo.a}fdu>ma=Ug_8rѫW nǢE<7c^eqQpH&O,#^'(-]&Y'!BP559 jacRYQV8| Tm[ڏ<=g/16sO}7oc&W׬R}veGso˝,|iƍm9XmzBZB@L&uڕ//). ^d\.Ƕ jeFa&y׳1 B\!CY܋@Ӝswٳv/n[DEe:dzbjE#bŀ)B|DY4{nr7Jؕ%1mz04f׻]&=>Svޘ͙qd5mG/&  S'b)h/W,z27A<5u *j^Z,d|ot=\U8O!8ePs~;mP* ٳ(=~?ݧ?c BQ=YGS:4XiZk m6-=lB)gpo@Ԉ^UYyR004)&(L(YV+XlJ Rf !ϟD&);~aaUK? ({$Ƅu ^G|GQ &fdjFY\DlNqWx/7;Aq&C:fcן,+-eFF՘-VfLl՛,ZY5Vk jQ5,,*oXiQUWڻqB(G9Sߥ {IXR¬:gY/ rcجQohl4cfhVTee%bN`RRts,:iF~["\ZRyc8p+ʼ?gϨ#bbwœȅPvf6#+FFx*;DvB0Na[`T*UW %8Xѣ40 eQ}/n 8f{>.Bnsz@W-q]vϩ)0XadE!g1,fVad:M+ssokVJ2dDu^e<ޥ C}tϰG oCux?gA@bz#0+ Uцn}zѮu 4|+t+SYY '>I|}PΠm.B,6nu'`LLp!O p'8N.}Y]D[{,.(s6$0çk5!*JmrGT8u ~0Lɓꌌ.** =.g@㵹Zv1{Jj]9kc:Ͽt雹s\=ܹ$8_AAtОgO!CKG?oPߠanVwF⪋JE%OxIszc1߯HX4!!mtrn}bU4яq).lC2솪#W>!bgR\.VGy#ݯ֐[扐>9|& ;`[dw|57M*sBHMss"M!@,nN+_U;GOkp]d.2^}6dGmʦknu໺ZjkUD MK[ W+'>ٝ;* 0>aaUZ"]d< xyRsW]ڸA j>>sµ X'c 9c.2%qn)Y9ܙ&d:S;rU%+6Iϑ>~u_%tڪҒOçz\;(![>s{qw䲓QO9F3|{d% 9{Vջ5dngU8` w: jM+LP>8Oh +Z]km0~J"FFEE*nnrTj2ZJU}-3';d2 [ W#d_}_ %%= a{lѣ_\/"f??*9ycyB!wU(3'vkr|VC׿nݶO> իSk4':z̙dj5߭j5qϗ iC6\)fugM5V7yXג)IyF,ୟR@ZFfzdw7=j-"8Y<4a0G<_EQ԰c~ZP!)}ϸTc&nDž5Gא }/ ܹՃ BNdNjoQud2y&j=+SYY?8qqqyZJ&u-n94**\NYC9e(~WCC?o?7۸^D \=2YYU*ӣxPNN4Ԝuv3F<>sf.Sd=X{ԨuCUՁ/P^l%Z=)ao<t'Y:?_yR`BeظN=ꑶ?m# ~ kZ &yd\f _9m!wǖ]l ׬$Pv~#޺71()tO}F=65hV> 3Ȧ q2UՕA3j4*\1 |lzɧٹjb(T3l:c(#mޖZ`{ E4Όi~ӈQPff6c?<9z~l0;Ii E#̴R@_RRTH˳3yfSd,!$b9I2^5^Ղ8NVLLӚ_BaٹjQvC_tGQT![UlEbcaKt_5 tٝ,Bʝ#cTr8zԽFdY,ػO='+cq1qPH={nÊ 1*VP]Yт8NV n'ٷJk i"HK!_TqbhtvwȒ Na!pL;ޙL=VwLd-]12.*: YꮡbmUq:5ԭ iK5ݎܜG-@ayg?r%G)f,֙6Fţ,V[JWTY4M3LLlHV7wB#yy-z[# igN~;%R1&7^덓F%:z@uu% ҂NVv6)0 d/$$ 0k &B'jS}RrLj G!L04DFǺ^?HPY jtYndlV D"'ԹcSjU !}xpKoؼ,$ۃOi[Vb#cۼ|$m2#M0Ԗk6oBnx(0JP5ku{׺PH7++VMӌ ^!$m֖ѓ1$\onuWFC\o-O+]RV8CxeuH$+i5-h04QTpZyx0UƄaE@YZe'ʺd{cPH)2dYaRYu) nsV3%gXYh[ :xM͠fs- RMv]3TΤl)o4ҿӵ?|c4z:JL{E[' ʊFtrf6c/!$R)0VF 5!BgNۺi">~~^~>~" aF$6`6v'yEHM'0A8qcn63 γ:w^է})cPuBa,7UWU"}'6i+_ȻACy8a(AG+ 1ۣ^4*ku"=k9B=PL yX۱FBna%\JO<ĬBӕγ!c(몝'NVvXL, 4Ã\15rPԠ!fSqQaiDY]]U]]yr<? tZlV@Mpu,@<'3lh@0p0WBA! #;6i8Xl }g5dE :uh9+J pwA*k]=۴\dc*fY;t :QIͭtF$n 's_8ːFtK$0UU279L[ @_Q(ۊ0f*** KJ%JlȀ͆ j5@Ke׫&*H Bddn1mľo[-#sD:Da@ uVP:F,މlܹmsuUG\ V&cM*DJ~V-Y&غ-q;DzvP1Z,!#F3Dz1<;.U-yfǶ`jx6qڜL'+1'g1SY\ SnAU>PǷW6hj-VZg00 1(ދXFkgi\< !,bZ8ޱIùz{Um*"nn{*=|de1vmR#wqqqUm 5d[ 1AEA.mn;mluC>z-B1T `B!@"Q DF:*{ b,^\@K:晵xx6NoP.yT! 'ˎkew ,vIE'_4£ ul$}@0T!LhdâgŒ~m}#sNBaYKoܼtQ]XRb=vVfiJOɏ><:]c5h(;JӮ|yIqQ`P%ry; 7znM&Ճ_+-E%:55NFRJE&t.&;M[sJr1b4G` !5!jlufA!cLh^0f;q:S:L2W.JR7 HA~fd6ٱIfJ]γtueInP:vg_ܭ ՑV\պfXOX8Ȳϲx:ta'#8ژ%Sq;ڪ5~11HU4>s0 f(1\k 5A `L VUVaS|ot(d䗏!$-FH+@}]409g1gecuuus#%IX2פ5j/W,z27YQTCE!T+lFH)SYѵ>_8cPC'04B4gOQUk:?Z,  C33/Zz!0 J:^fb>~رXPލUd7ݮ"iG;L=VBu,tV<%$l6#+1MbeڊnIdl k(#**g^ysյc uB CP1a {쉧GEIXphX#F"DŊ d9at)27egr#HF?yeFvs@4i f`\VhLJF3 siTrd?]fH]@٨'+Eݭ:Yv2j_(j.| 8 uk^ {jbKG z-oooTÇ#~kE&PBhq2(].ⰁQHaZu;*_le&[=Ƀ!:(z23Ӊd:wy/63, N˲袒 .ػ~@PxH M,% &Lb5j0&Ņ7Νt܏ Û>אvJqB7`{-,2Y^ptX{Dw~Ng% {{;nq)ׯ5ꪒ:y$la7?'mtC=z>[dȑ#\{gϞ~}f]k54˯uFT袽GCuݺ;C-۵SژS˒"}vQ@(tX@)cYi)064:lZ6fXfd*ZcP*faQ|J3K!},-+(YwTIH+)Y7dʧSR-fe2of_vd \C 3LZ6LO?Q.]4vcǎGy/$$ܹs7|cܹ.o r b 0 ã&"=xcڬ2u#=iAPV(? ޺U}G {y2Scut{G&Rn^=FW_^bahAWYQRYYVk &hMjZk(.+ϻuF›\7'}aae>B ̯Ydly#YI||IekTׯ:Z4PG}*%%eԩ[n?~mDǎnݺ?>ۿ5k}z6l0ašrGU R\9HIE"ϫd?8z޼S,hɜ3gzC :bIK`+@gr_Ki=tCfΜ9|RJF9JY jP_#E`A+5K'`)z 8e uwk5Ygy"yp+a!Ys^iv)2fxxAŒai[`[S=uk]Lgx<"#+N45__ sЫW4YlѢEΧdcr 'N/-Z)3  :Q'JbD*aך&D4ZVcѬ};,j/xpRU{vl'$hCEd:Yhe׮e>\|2n+jѥtqV6*Wa|!mi8]jkF1㦹@IDAT%D kks^]9}\tkb n@]L'+; ߘߘTzZyvFԖf$Hb< '*/&Fy.J VQ4*ʪ`[PH B\PŚ s곳g;(‹/va sle_:z@,ҳYkS߽[  ر_-[^5rdm4@S闒ҹthc8pڒ%ޖEEl1`,qTQ_-߬C5ꩧoo%%}z veFZ-<>? ky=X@ЫLDbX/X9 LtOg\̝̎?GFÇ=jlCz=w/<c|#=}[o7sF%%toh`S0Th4]$>rqBZlR;Bfo~fd|AZ0aC~|㑷!s'4TR'7.^!ChVΝN5:7#ٹpRX%|-p-!H[, OρP\3aϠj^6u[-P<ހI \9}Zzmb}uGnZZgki׮]\<۩vzJ%K t HH%99=l;06-ҥ]VYFDQrD|oqqwJN޿fMvHł( !32【ˀtF)i~H ccEL&OqqbME w{t5 xd;D?|9+4s|b֮,fPVfé0PU BxyPd>, {_<(cnH:JK`k0`07^{ <NCq8y? ̙xDQ(8..7--z@3x_|߻'$_\;qZ`o=?t_ƽ[',lSOU+_ϙ~ݼy<>&Va@0g|W<=ee}mL:o+VvG@_~icrwyxh[!@g~upjBxǏ{EWgyv!>t 2߿jDF1{"ҁ׭ 1mb~;D $~gVzл/TW= (iT з?U֙|X$$[h}mpd?jBBi0Rœy퍩?T+GM=!!7-M uۗ(Ҽ5Uxr {~ {B,FadA`PeUyc얹eP.++ # 'N%\^OWUٔJKNlHTw̪Tڊ4Mcݼya jO?uWS/LgD[L/YSm7\$zە=egϾf T+kzk}^gLUEE_ٰ!a6o|pwߝھ}ȴi{1  ߬J `P\W.?Ga˯(M< cGoF+? гwg*+Ww'=;7k=>>@DϞG7lxuZգGmd?uK;"%*`GINN;o5KWW04T{]Y(ٌZm͕ [ia [wi{dery{M_>v,޹ӡB!ܩ<\,]UU`t\  !Cs_uIɚyf l68rBؿ!u<:A9Ot<@xpqm/ k7}cnpBgs`hԶmSS=˗"#"Q˻Oˇwm, N3fP/_ (eo߼DX&dǎY_ {ר@JeϏl^``Ͻ{8`mT(YUu*\cL?(*$:ZP'$ ÷SprbEw$14L{3zdH4bAp"|jE~ףּ߸!V(|Zʰaik /<ɉ 4T)=ApTWQZlwZٳ.ڰ2p]z493VwR_C;4X ]+ 諯7ܾde768/+n9\o22۷-w BCS$@\ΏbL`yʏ_Wy?lj[ՁAK]^A9>W$/"鮨wڼ4CO ׏DHIi6ls{~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]gxGS%+n`z/: $I iBB H {fl ƽ*qY6Fec>$''? 4hРZ@*dJE(4hРAFkX,&yqqРA Ť"x<QhРAG+r4hРA*ihPHK^y?[ܩ< 4,WA%+KK(Ν ޹s99q^ jQLLWPPT߾&M:8"AF}A+r4Νy? yVzL,NM{ûw "A:3~d2L,mG8Ϛ ZӠ0`ƥn{{bu< 3QPUQ}K*ž=S?4hENFOHHz^Nm.[Fql^8l9sc E_{lVBD$B 'Ȟ= xv;r-["{2wHxDY_J!E9&K/woԷmbС 9sqŒ Pq;ǯx=nʒogΤ:)r\^VPaƓ'"A+r4׮ lͭ9;+RFc8ckpc^˲eO66Z&+!0Ns;GnCԬ_Vn"lٶ&W]\UJe^JR.U_|ֵkuJB,)f⚆#7/ -Ӯ (+KbOV4hXn?~qCPۂテ9Ww7ڊ w ZӠA{,q0jlBscyΝC%KE";gg !;+@7#PdWUW```^}5GZiЊ +[+V6mZsQ)SLf2B5˗\WuZ.l[c*dX91DzmW_>=ٳGWWTryfBBfB•x:fhhٳG}Kl@mA+r4:BB*ŏL Nǹ|>m}Gϝo`26qѣ'}?_|Qw1 5k-O?$'߼\W5z \{Z/`Ճf7^vn ZӠaNPoh(nc֬ARq,IuMddו '1a7xxx8~N??y0ENРaŰ Ը8#GLJ~-JKK;_˙dP&F>B*4y85>b~p44l zFN7, J8p @_1`ܸǏg&$D$z4@GwwJU{~5,+C:vԨT))@]~ܔۧN!reeiiDЮ]iAL̘aɒ%)f|W@?Y;jmo5JQ`XU; 7mN>iaȔ)'nm  ׈5|xA曑Ofe8x`0g+<z `35.NVYo*lWnͻgf>{VU^jBWpTT~"Knqx~g?H_!9;G;aѢR9kOHH'*Dd2]\{UGRX4DC#0h:(}Q 4eƨ.<(<._ֶV;XPВANҩkp}kNakMugNU*|Z9z{ӯ)-Hh0giN4hР9V5ѤAF Ü}XcW_[!bbTRE:>:+uIŊIn˵39 4hШs{{dScU00᫑ox Yq`۟E'q4,Aw-LêĐmohq*m^tE> ǁK?,zFnX,v4n$d呦A û"7lk[nOH5\VGo(=.~Xv}bȬge~0c 9 z:^]ӂB!hѢP0hРh3 KD?u$7WV:8ػFFѱ>%Ҿ}򪪁&8RvԠA`gy=X,ѼqR ~'j˭;^3ib&H E+A.ݺaC#+oLtkcBpiENFHOO4UI|||||/\[UZ*'))'))ȑ?u`{K97:R-Hjqfm~`<̑UȱD nƦҊFYhQl7U+WWUk7uŊ= +%"ѳ{=ۀm(ih: #mbɄpwXԵ3s˝ݻ;zU{?4y>x  c;vܴiSzzVɡ&X0of?}[\^`2?Ȟ=m휜M]FAa]LE|3*pP;Ҝ~/[bG~?o^\t^s(*:k)SD'uhtU׼yzoggfzrLb1B(իWG;we˖_7z'LAHHȌ3D;w\///j*TVZE/_dIpp0۴iӰaÈ2O軾_'(F~vYŋz7=ұ1qkc٣Gڻ~}̕+ hgcMW.))ټy={&L~~)1>>~ѢE}EꧢhҤIwޥؽ{iӶm!C4_iB{aLr|ҤI9VMMMMm! u+T=[ ?~leX%KƾNDϞ\>֒tiץKZ\J.`ApTTh4?rDE~6=/k%6\{RB5ju07ܺ …/ vu?eX_óg޸qlܸqUL}mٲ%;;zܹsm-/JR)ucǎ/رC*DYfܪUu>\d2-[֜wwjzśonۧN)t4Z../I_ʍX b̓vw'gJjZrSR4j5 a]\ 2ͬ*.:`tj2($HT*1 #Go mۆȰHwߝ2e >ߺu t|w 9spp˗/|]^뼼t|SH{ѣ ʆ :udq u>&Mjש={߸!n8;#g"- K-ܟZG Jjmr8ֲ˪V6(2 {DOzRwz"6ʁ&?2k]ó{4juA:6Q(""Ço+?~|||xxEg===oݺqy{{s\>4}W޽[}Y[n?={; O޽+hYǛoվ}/]`k+P)Q}0ٮې!s2 2R\VQE=XAK  O7Z|Z&8**Eibq46<$$d޽&'N:uԚeUj݃Rɜ2e [} VK53Eйsg'R.Ə0~|S>pʇO|kڣqan['|NhݺkF)-bFn8|oFMR>t&KKOӠA%`ɫQ^X1|ƌopAOH++aYt&[+/_rʨ(OOO\GM,O?m ͉){bv.ڵkh׮W77V593fп=AKaCii `7J1jԨ̊ N1dȐsJ ͌͵noBhhK=?~~Z׎5822ʕ+?cYӠqv7Ffk@mh!Eȭ666ׯ,/,TH|3 gcǺ4KɫN`3sbFsi4}uEݻQ6#WH LsNXMߘ1EkV*im;G/U^ +& 274,Vҥ;w]ENK3YYYEEEEEE%%%jZ&jrB庻{yyyzz2 սu:۷ r9(b0 !\]]۷o߯_?eQ-))Dr\VkZ p  fqptttwwo݄RUTT :urVU*Ν;>}ZUUhɛtAX,P(tssرq8u((ֶLԨJJJQu@ppp@@@{O>uX,n}6dɒ"&=zo߾BN{X,"i4+F4y>3YY\yvnYa3qD['On˚ߝl9sc ^xDLfѣ9sCBLYز*GWnC[\ڻw,V+|$/CQW1ÆTT|wN;m[j\r̼ymc0?_`dҌ;v}|Tk4{]~=!!13bҾ}Aݛf̾Mpd{L&HBo߾oM JKKZEjf!!!,ž x_[nB?N$Y/T%%%[nM(' IDATJJ~[~Y~8qϜ{lYֶ͛z h:\]?vի*cy[a: Z/.:lKTr9Yn]Aە}?wtϠn?nee.,B+(`dd(r^ou:B1n{ܙ#f0! Eً֭kN+ʋ/>}~رC-o+++lZ^,6DAp{Op!px}z׮],X@'ZwFXQQQ:9s2,^uTR IJZahMΑE ɵDz;wv2[ԣOIIYfJ=~vvw}'HZ#z+7پs̼==;v$9II[?(;￧0wG˰]Es;v޸'=z /̙OuYrIn˖z"qG@l^"'99 "bAU,o\iaB"IټbW`G N_3{YVz'NLĉGd2_zƹk4~Aek?7lX^/[nݖ/_E'O\Av>B'\oT$eEY FEE1B{TMAb7JG_UUtZTU=A_&-_zM\Z n.1/ΙsԩZWMP{16_s 339s!\=f>}ʵY~=1w{zmj>wøxOƍNJzrVW^~;8xڵvGD`oe@;'¬O㏛Ǐ@ѣ[OLLܶm[^^^3Q&ܹڵkϏs?{={9<2 σ^PE=Ͱ̙3gƌ#Fxsssө~L!tlH,(ɲss#,.If`\YVVMBN~cn^/^_ 6lxЯ"W5̈́NMs'3IeN0L@NJ9_rCш=-NFsL҃d <}:`Kq‡y7zrD[}W.7.?r%"4q"1Gd{vǎǎ\T޿xZTVݵkׅ ,4B}WÇ1canԌ}BXzunn.y/[٬]n߾|bbb=÷C٫4iiVݻ7?w~ii'OfW\ׯzEEE~a6 ˗Wly66V(Jjl>2'zק@Eq?W\RH *-5sr7,f%~5yQv6>ɮY'$ѕ+٦kۈ ŷWEBؾo /]oðϧ-_ݽ8'Odf0`lXs;VwCVJ!'4T]pUڷoE"Ǐɉ8{u9jTYUӪ*1L6m\8|?7wxOd|6#n޼ٹsgGG期߿/Jfaح[BCC޽ɓK{'cMkfTTlR.?nܠI>6"~!66Ovr@T\\kݳgryDϞZߨ/4n=wK_`0 mkhe\K**j*/@`f Nscqx^#G|-~ΝM67VAаȠ`_??PhgkD&f'''PP(֮]t޽{7iƹرٳ%xs 5px&aWQQ1sfJ]Jp ы`.|RD(0A\]=]\\.ZVŕe%%%e*(-(-+wpX &'-N$Zn׮]SqW\>N={lGdɒ&?4=Z)=휝%v/,_ ;N>U?ZOHH՗j?M񦦌vu '5 %C>dn{✜'N@C,-~ʕ y\>8AQN]$ocFէo?ޥΜpla-5-XZ; 2:6}ׯ_'txui~yӧR%Kgϊ 6E&+ GOSؒ'zlvDdȀ @»岬̌gR{EiA=u2~ |أG&}'ݳی.]ZRRbÇûw5B WiAQ"՞iM ݇ 9ukrLL$oޔVVRrj(矤RSne׮n֏=޽׏w 0k۷o߆7xa\Mh'ٙ#q'?Q";rM[(666}xƹo߾⎮1Rkv!43w~P(5kVqOII!8os}7TeQf޳Zx%cgW :uR?}ze0%<'ɷC?r|̵Mp^Q@QQ mzM-WUU=~sM/^Lj6#+WZ3gϞ 2P(4G^:tOO/|tɉȵ}O> ~ PT/^,2ٶ/Lǿ.QsEYYN=zPh$*)INNs# I/ϿvPeYOHxz&ܹSVPб_?&_y \hX׮={zGj\\yAAJll޽PQTyʲ7/'nt~NRoFvgϔr?lZ>aHoXڴi՞vΜ jӽn?>nw`AQv6 ^  =EQ/nCjf%fxYj񢢢O>D{;ܞ,e5  -\䃏V ,F!~Zn?0 ͺu5k osz|(a T(zYzu-]$>>,/8(b( oX"]VG_] CyBnCX%>OL[nx,Ljp:tߺu+W ڌC>H_,{Fշo\VQ+*.>`ܸ_}u`etbZ޽Ƚ=<* J*۷LfaÂtjD$*/(PT`AY{ޣFʒBk$ܽyN;crx2&iG_XX_ymHG[7[#Νކ ݆ i[ÿeeb۶mpцQb=%#@ݧ3d+bBPktzbCC.b l>WQ^pGu7{ȑsib 67Us@iQׯ_o#^"A݆Rݻٙ1:msƠ.ˎWX0!=GڹxTfd&Bwލ/_L.l6{ySL1ڒMfHh8#ou(9 yk&+c(ɔ>0ݽxbb σi%]_f;v>KyŢ \֢ @ PZ+)%2%L 5=v|JRRvVf-Ȉrqqitp RB\Z *;;Fr%܂PҊG0TY5b#;TVTTf<6oר2h4ή1+DV"dGQT;;;7ѯ\RLj=b. gzJŰ>}q{AF?Pǰa0A#yyn>>uofm۶aZE1|:m;v|RV7H.! @Ax@^_"VȕE1P0ø\?2m۶5rWAFC.F_ FqJt\*8wصkW'hzzQU8$.4Q.,"r3e31'b(NKV<.J0r"MB뢟H% y>&eT2(/0 .r\ T E1/W:Q,2x}&y9P / ')ĈەVS3_5ij~4hOnD&>L\NQRkÝA̡&w%WLfq3' t:H$;zz]A}@[{xDu 9On[|6n`X*-%㭚~VʳՊ}ú<9}Z[?ݻgͲ90 ܇$烏Ve8ߤ']9w¸hEjFxO{bZoe]밐߿o,&/ _Ƚƻ۔VK4.DQݿ} 2OiVZ.wp8xhc[wF (eIDc;zS~iioBيža]֭[ӊܚeȰٸJ76dTT&VktL=h0a)JV1cLEI`uO/:XsOOO'-үSXW&78ΝhBR~ H$C _rO QANrrrթ-܃Cvz|>_ZȮj&([;}Hd6$?rohr/6CVV>wA]=D -`VX*BybZ濿6dRA+f*(F=ޚ6 3nkz/@:{BǾIkTk< jg)otL(\;'| `0݂":@IF<*['O_H,95![ }ºnɓV#wy̾} }Z[9+cC~?q2XƱ)9D 8*qο6z=զTMpO /; `ht O6Z> FsR tj/lM=99|D썽qR!P˫lvTNnd2rJNnKlIbNfq9 =B嫉J[O+rkx '`Q& DR4WA@7ppdvfQ$ Jq&@z@ 0l>QbbN:Z&prgPVC@y_WUU鿍(6w <=kw9xZm6Bl-b1F1ցj V!wyPTdDV֌,R `B]91jtןRN\%=(;7o\X}[ 7/$r mR۷ GLDQBMowN&*k IDATjdkR{uaIò(#[şoTm:y[w^+o LM"fCRIE_T%Q)Ƣ@u#`23/qu uԤj rLʨbTHEv& ð]NNP $ xt@PYvG&Ʌ:A8휈^VH w?w7P:zbx&1X}3 $fvykЧuw(,,4|N^Kа0gg\q+@l>T&|%6 w֍e&([ydKA0pN~ϣoLJYKo0wbGT4=w;;;s9Gm]Kx0WW7đzQkrBtě̩ +yV*nUVͶ ~-0$"ϝdM5EnM۞طeܚAJByr ml EQAdAY7bً}DT|`NeʊTwX20 PʀxtR'>KQq:p'+^9lN N*r6P֠, \!_8s<#5"x-F GY}d9}[_y٥KjlXdA" ( !`@J5H9P559::-^h4j`2  >2E )yS y+kEqQkLGGqe%88:@zN3]:wAva䎡(`߸O}[_?L˖j;%k#\&elA KʁQ-Xlώm0{B173q!Bt%Ä >l455A1L1k/ wضdwZw&Y3Zm) ?w#cv 2k(w|uQ=E:Hkd2G}[_5rK+5Qdz&Q%+)~[eaTc_'aɈֽ֠g.)%020!PEz Lx7`U<ֲP*q9so](+ Ϻy@^n.)F1!q-B\ET{!}`(] TKYPE#eccc23*r2|!&깳l=ɸ{iy҂"32; #]O@j2W#yk_Eľ-ӧyA/adPFI)о'ޙIbLa3+HeZKÖն D!u 0 0 tZ-UJ|i*2w"UV`ALf">*)RȵQEB&8^72KwJK+#NUvDWu.Ş6ӊܚOOF3 Ebv\q!`V(qPk#nY#1?d&"iqww7Swnlgٶp_bmM`֬Ym~c_E?7ߌcX;wRNҪ`0 n&/:_*Jx0(Iɿ$RG2P51FQ3 %rdb(IU@(&I>xH3Y,'s䅉 ; 48r2U*Uq0vD2pDZj k4p $j*#, SQ1Ľ=xVϝPl5'tnTfSus//GQo!Qx{{z=qwDIB_mO쫉J[FMfѢEnݲbsD޽ rUQ =mEX5,&!Ҕ4&k.Uaz=ףĭ1 tϜx^UL&w`^`ĉŹf|dQHeUvGzGD.g&EѢ, JT"WAAAp'8;;zz맏 `}0aB{ }+W;vܴiSzzVYd eV?dqrrر gо 3]z1P@xԘ Eko\X_̘WP=^QJT*'bwn\(+cpJz re  VϝӸdrds&Q=(ٵej{5l^:wLvNNN$ L4 @N Vz&Lx $$dƌb"dK#"gψ%7.]J?z(8p >>~ɒ%,oӦMÆ #8W^1||JA|!,nM{⍠<}q% 3^ňWav`s0#Wf[\3YFnR#'1-2KAÂ"]dWh7&ӐEVzGFZkѓ㞶$DIFYyQQрLr|ZP(222v=xӧjbکS'8))A5߼y1 ;oY e1ɪѫW/ðNπm[$Cqթz԰a0A&0lb@uzTkzRUZ\h9;8OR%cѷW^>uTZ 6R 3ۺu%O.l@?~{zyՠup/Ij/zI]y\~3YI¾& J]wŽnTVkoz~֥zVV.u*TiP("mI? @6Ϗ&ٞ3=i>rJI(iFryff&Kǚq;N4Vߘà oGꛟVFlzAQ|5zWqq 10B *0f*e?Hg϶"IP(Zpcx|ش{sGJ$P]J<0Y Qfce#&#L.ή]V///Sޥ#_=88zٓM+=|;vLP(-[P}zoF ?m9"f|cmmMsIU8F P>"3N x}S'Z בbÕJUYiN5· e1˝lov}VžStod]@X).} 4Tn si,jqa)r^(6lޓ̞O? FOȏ;F}^rEL&ݰaøq㨟~7jxZҒ4XyjjjLL cǎƾZr+45Ʋ^9T5BIuh40=GUuZT74i8zF@1\ZjuOZ aZtAz-~K'[ Ȇ`qZo~}1w&D~)Q9wh\O0 /|c:)8brcE,fm:=;= qZ?|VѷGM>iӦ5)**|}FC ڵkI7rA8ĉ[M5 'tfݻw}0Wo5/ a tz͛0@jNHS_t8^-bjT~ڲJUIqQuUA)6 z8|3HLk!~J/W@܍PW^OP; dskkD {r7 yYje;ruKz=^WK 9mw0~Iu-0Տ~׮]y{SG}]>!ŖӷrsT YgLִ{aݻwIFdڴiFs޽zIdd#v9oz sBmQqe 9wj#jRoܴ}Tj2ZINAFuP-j1 6]PUVV>ˉhMҠN.۾a_|֬Yd6ԁ3fh\{NH<޸ǰbl7R*̪-b7|R(x<3 ?s|B  Fn2 E/^HڿVСC ⨕9Ε+WJKK~Ԛ5kc<ڵkR(ӦMr سgs?##GQAv'{{{WvZeee/hx_@ggt\ =A}OS_bzkWsdˏw0a?|[D\=zzx;9gr1B^['K% |||ȅl:-'}ggg2C}lll]]]O3{U vr]Q)˾}?aXko?94jFTVVZ{Z6jժvy&C]pm^x_򊋋8܁/<>c2Yi0  ӢFjTZʊ3ۮ/v-}'''[.f)֭|݆>-=Wh| ?Ц}2Ow( 믿NķwGXX99ܡ<-qjǘ=4;^-dn9 3 Mg۷o ؛ ٶm}TCIDATٳ⋶dlp?nyh#șfvSq*'On6yT4b%lٲp'ng/_ѧrڼy3sGطYyf2}^i0JgϞ\1vGpp={7PBэkWѮN]kI;C6n8{6b -\f\=ڽ{w.cY@rA^njo>ˣێض'rj#;v\rСCV X tRxjGFDt5#mm7uԤ$IٌGp͛7geekƏ_'-w]y'Z &0 +M@ qӧOSy~l''O>t+m]ݻwF`0zjOgXOOA;;E_Rݾ}>;v,OgxuuuVCL2{RRiץOu:l߾݊>'NQ)E¾]]]gϞSJsd?sZZ-zDFF\ɩrt9\1}X#UqӧNlb#9foLd˖-Kvu!rcPZnmd/o`Tʸ1 }7233ۮj 2dܸqF_TӼM#Gܺu<NNNFzW|~'x~~~eee{ 4^zR u6%IFFF9͎:ś7o1鹛ɣ駟k>['ƄitB" TzΝGT&+ 0hР#FaM}n{aaa|||NNL&km`0\\\?o޼.]Pr*#Sr]\\Ȅ G(: !!!dٮ\/ɬkl~ ÇYі[:!9,N6jlz\,WUUi4J(x<@===}|||}}LU/8ߺu+++K$I$JE^'+z 9r$z}eeT*%uBOʋ`lܼs7hPDqtt-4lhMi4NNr4hРA NJ 4htmJ7.X,""/=]?oSGE-8tРA|Ohu洰t7WX~ģGUry\{jGJj-˗%%ɧOgJ P>bD91lۊU"kСLWǥ(pdf==iu =<::&f4ei)ӳט1-c @QQOj*\4r9<^2:פ+KJc0]&6BuYٍwTuul.3"&N0q;P[VpM CǏI~?rJ$4vlJ)p0Y`ШTL02O%+98ynެzl>~+u p ;ukʙ3 ]\ee7/^_;A@H>rA ,̩Uwu:@\Ar\,*1AD !~ebԏ?^>tHObΘN'.*ݺtɵW͛1Š[RۤW,U$Y)/^zզp woVV16<3gu cyS-FiDˇ''B*n0~ɜtW^q\r̙ݻ3RRXA]:4<JȹYUI -ve TNqrr8IGjHdzGl=i ex=LlWD Iqjj#7-:!ԍA~#p1}k֑3fl٤ OiГU~5#%`m[Ԕ)v̥KCʕ'o~hNyUIIըDB JE=X8\_avTw TVreisgt2i_$=@wm6uS bĈӫ蚳  ʞ{x\.<>`q~`_FeݼyKٳ&q]<>/48;_@B!}WnT, ߸T a;:2X,Eu2qvn*P҇1R[[mkw*ݪmFJ sW^Sy۶Y2ʐqt^t充}󍤬uw\MLZ:F^^z:Ry͐ALv8'% Xg"#@?ƍ[Ovz&Mz 0~͛)&:!.*:;G6Q;wF?&A3nصvÆ5j6Bnz:y{[d>$:zHtݻKss9G`y ۴"tȐogwwݪU;yQci_ٹwXXÇe!A@*D"ׁ7ښ\Cػ3b [\yzr۔-ldzCgz<=ק&&FMܒϤV?oނUx$>|tǎkǏO߼֕5:zY-gV4.8,",?] $9>[LIGncbbP&u+d04i#&Lprs+/,|i Kt6PLCƏt)>+Y*^G`y ?x=|kVwopҍm(ըgv1/c.<|p>}LiLȾ{dhaXvNBB~uӗ@yAAMCa zmXFh,/M:~nF2?ІI Q*vc &SKT} eeU3(wDa` SԤZH4l-h[R/0d$9ˋ72|ʤmXn6ma%'g>cPcɥ'/ZdC:Dvf*u 94'j**== jÿmK7w^#&$hz7h]]\2:6Zmӫ4}|*Q\TITg$Yv+KJ4VKgb19tcl''CIJhuBI=2VM&Jc}) 4˗y^^\77;ɲPSz1FXYRbExW/ {Üx*RslP{!Yr馮,S^Uk*+3N?#ˮɓ'OAјlqh[wW@@a߻X;?{7fݕ2`Vȴm M%@ssjo F=fQYRbM;K U*H c|??+U,%]uTT":$2CZrrp?^P}kҿHUGlo栗b]kؤ6&Sq9֬1ի5*ոs'w`P J.oDe~^G>KVyQ5rt,_`*]tݻq̸9s*9<Wi 2dd8tfqĞIU-/͕jEQH+++[ QՕ@!v=a޲ǏUN!!jM:Vp\'%zL$lGGa3hkjbV*1~u=4;j0(KK[Seb;,ok޺tIR?/.CG7:4Ai 3X'^M"pvKO(.N9{ORM2Ǚs/Q^a,G [W~՞׵B7)Ֆ6v91ppK\;~05yȏ DU`0Bn3e:R0Է}IMgrMi`g9BYذ6ps#G,?š̰2 wMe)t(TS {ݹcaq8cbb ԩ@y-|qߏ>}¢?I'OMHhvBߐFc7$O4=s %97 ԩ7Py~^kB y>e|>;T^0FӒ&i헶xûOfsc3f48 =LlUr1˗Uk,|6dF^`߾zqZ*䤛7;5d_h(+g׍GPD ߱j6#GdIjBSHC_}jɯ;xtt8f1WL1 ??[RS%]U&|"qEA!9P(gM9`qd pp){={?rÛ pHYs~tIME +Z3bVtEXtCommentCreated with GIMPW IDATxy\Tǟ{ga}q%Q14s-bjjVkZVmqI-M%-Q PAVٷf_Džq@AP:x9w~C>|C` #2 3 : ~~~998;0 Z` R nnn8;0 PYY@ pv`0LA p@;-l|`0}[;;Ip|`01 ;`p|`0  `p|`0L_ ќ83GXt7p>`p|t#Wƙ`bvލ3_{׮th$Inx -Z񢝛?YOhƙ ('808c0$W808bo8zyj ñsu4~<^5mrDMM  g;ޱ$3SV57쳲O)˖ n(;vPzgIc%9dWx|($#ƍN7׍ ca+LZ]]sgy;:sO:8 ?P|/TJ34Ҏ߳f 0yIee]ظe|BU?Gll>pmuao)?7Mvg__p ,:sfo[WRe''.;av:@cMg2|Jز=vnnm߻vmNJ $o <ڵkgSSS;C8iӦW*J0s^C~hqȑ/~N9q#0|S#JJ2JR ;v܋/߿?AZ{\ĤI:ȦM È [=k߬CcbL5ӱǩ|'Wz8}{ZB+\rsC֪T?Ƅ_2a^-bJvB*xc@@{ܿdBFFJ8{l-ƍG4L+ڟװgO6Ş-^lh˗=?lk _uO2b͛JKwffe2>cƐ ξc3NCVy>{FZ]ͶJ}ԩ^2FWT[8##HСSr,,zΝ3W 9}رfN=t^ uqq4ťe„ M'\244T(:99=ƗMڿ߸a,Az}O_߽{yg7߰m]\:UbBsu5k;vWH$쁳O[WY۳1<=V ]=..쁍3{`)HO#*`h:lȩjZ34_ ⾜;7x𠨨A?lNrĉcsYd^=ztFFYt:]NNNQΝ[^^rGuu??~:!!aÆ Ν#>>?Ӫ>K0t:ᅭ H*+[}j .ƫ=u*dDdgKJJqug>>28~˵uqYha4ixߌ~Sӄ ۰s.=zol5}gcGF 8}tDD0wܟ~͛AAAR4??%>>>iiiϟgqpt92lmۨw@Ԕ)aÇMRS\ܵ@ :{X ^9yRPԕޱ#3`@$ Ol~d<Ů>>7uT0ƻ_Gm+'Oka ۛ3gƍB!366\DrD"6lXӅ^VL[11FNNT}g/ }ѲRy}}{*>>XVWi\ؐ#̪97o??ȷ 1Bgd *(8u*lH'ꢢ[Nm'=ۥSxJCER(wj:==}Сl8x};rs)#rҤ1>ḱ w/VVqs粏߯mFGONza,FHw[[ۿk„ Ȉ6mMEEE))) aaa999qqqcǎMHHzǎ۷ojs~ 6F=lqRcMզ6| ]4Y ];~{ڵz$ ""[˗[ 92zYzɇ|I{w_r`wޘu:t<MwΞ=?~|׮]˗/_z]ʕ+q|`BGv ZX(GK|ǘWu֭[|UUX$yfrʕ+W|0`Sw vbFÎjT+ᱱ {2 M鳈DO>#)/\@tWW0A6^~Vgneg XY9[Ȑ"Ҳ/fg 9qB0awtVoti~H㿌[^=T{/3L[.; JqY] ӵ;6}wg oB,`01 ;`p|`0  `Pd'oJJ ̝݃7ku|Z w 5V).lR")zհV`08cJKMǎe/0LҮ]hq3QKo[[T޼t颧M{lb$ 31ΝՅ.wРi+VػrթTɮ{׮II={||ں w ,ml.^#|~OOnߞ0} ?P`e5OS_>uk…V;\uj??ӊE4/z̷~r*vǯ]JgN|];7f}qq^C |aP6ٹ٭qݫnL=tR}4 Kg68k׮5ȰСvlL f01քļwxIffIf_~tg).i4/6Ni8v 2{7hJUUao)TJ#*CnOl7h{ۻ^PQ ;v_۶5g爉ǿEvv;++ูs FO˿3pϘ1j ]wD_zv~ı񷲳7̚hڿ`0]϶E[gSHR`0}1 o1]ς-[p&`0`0PiҴ4iEN@D~11$ٛ-ڼ3grsU z},]CCnj99"Q}X U߸PR"VIV \>%$Ϗ ^d>/ x|̯E?S_\oņޯod|[+ĉN g(+[$b>d`lciNHKnqAE,8R yBߛ{x]c$IojȐ<$Z4L08pbNgp/2y.?sS;cF̚e>ҩToXQ /9J o+V,-GWOKsիO{>⻡zczLgz;U{Q&/?qoҥfHh]=fv:y.6>P|t|rDC7WܞS[PiN^O! R>gyVTΓTw8VpqQ=k,66Z~/*o`#8~]MVMο׹Ǝϰab+%ee]m\.wַߚ2$fSU<PauEQR]cwBq52]?><44%99.+55F ?f _$AUdd$mдd#%钴׆lj6,zX.UUU^z%B~^ ؃zXߏ,_P(@/v(<(\E}H4+*'hj^7pԋ}"Q5c[zi0x\J}7aâ='$4 d˗.P,=X/.>~=CWNg}~S,|fsp8EM:kUUwGzj`.7ly 7\ev'P;zX u5]{o@Gp¯bGgχgzo1>5kdwEpa&3m-.*lǤ3t*ա7Dz}/VLZֻ{瞟2m((9͢htG8{ϭ` }#}`.￾2lDvفۗ;v(xLoqK<z/@Gp-eivжW{u1P"rΘamm-:x{+Z5ݵ{SH*WjzYD.J B4$DӎNF(U"zڭ_?O>Q766D>z7~7{k?3av*FEuVZ/UHFEm\)d!a O|I6'MWdembQfb, 11q͚5 I= ^x(k{[*Qu؀ɓMl?uXU?#;?63)h1ё:\h:55?'ftFP(! hSHJZ= Ð9,zVͿ۪7*oee2<{yG_2\ǟ^Oܰ렠`a[ /nPuM d_KJTy\iGGȨϧZcY{{L %KB@/mP }E#j9NE''M2.\jM;HI$A$AǏ7s@$ v ,ں}cE1Ptom#cG?KlOL/n $I$CpHC$IR֖UI* h|jNdVd6٫.oÓVay]TA$)޷4hTh*d:=EQeZgJQ}Xlft<8BVeqlLL~߱Vjժ2hyr@Ny ݁nkG>)U6}Z;W r{WD|/.nlś:Ve;Gp&M$@u*RC!DzzJ$1XN'GHﳹo!MEVsHN$ANrH!k$J6mf Fߦ ^B7+[VNxv(^*N2 `{rHx^S8]cIt:퍜 s^;ȉpX>>j 4=XG䐤\Sk(Ý5n;5#8u *' {SaJM$A$EamlATRQcir4Xc̐U6a,vnIٔ͘tQʪZZ]M>k85)+Q{j*3/V4MחAO^kaQUj Aleq>H%uBo1IIE]Qg.I{yع rVߤh  Mբ 4B O59T7KJ:n6xR\~_ ڑO_?tP1质?ڝX h%C6tI#M@uç4'TVmheβ,LIahZ3+i3﷮^log>*R߸{'B0@0 @$0 M!@:f|Eb+m֕d@:lFDc$2%@Sk.ZÙ $dqHUF0 b&H=ݮQ*AÅ?[$7Mkف!am!!ґ;og;۱ ["I =PҒCe 'd(+[Q(֯ Y]j@.EeJ5{,\9``  B DLPHqVT`Q νXALу{*J}~3]\X*]; o)l15X Kr8dgEZ?.EwYR_g% 9dЦo@ӌC>%ʿ#Ǧ6C}O @2 $4APfhRdݢ0TWW)[wTؖB^O! XG$ 9$BiKjhi4 IAl/-BHGQ$48p?'fQ AҬI 1!@[Q֎Qm [[9Ͻ4f܄{wfԔ3ScuX4ִ/4nu;͑ǷQ@-2cVEYIڥԴu'uppx:&R*HaH|孃 /[p-z}Ӌ*e ö%<0@̸kii9aҔN7cr40 M@0lfh-5Cemv~lÞ`q%E1[XX94 +I D!rY_4.\q4{$ow5ҡ}{\A,m:"L  Vmu\==?gJ owh*=4p4.($$H7VE)?@p|'Bo ^޾ Cs c쳋}I\./G?\."h4mYm1X߅Bh6 4͏妺COcQ0zfhYKQ_(Qld:h,$" adlSH\eJ@ ?4\lݞZz vOQJeSpZ*\;S*!:JF[ ! !)Mgre?E)B ]w;ɉs ķԋ*ا2$Z?ߌ J M3VE!n-֖kIS>c,VUhٙF2$God4VɌj+E)䷃;}`kk#:y"@B4 m^2zh45h m=<$ Whi%h6i2$`M\fJfzlݻ[ Xfҷ1kJ@fQ&CXHx `=PXYJ~}[nݎ(\i}spEv*/<0jeB$4jM]QMN S'Mj!DQTa~ݿsp0o\d]( q  -5h00 C4T 9BH W8 bo&[a*lk .e}d&@b=a( l[[r}\Q^rb[=ttՍ*n$A4C|Ѹ67C&5E4BL&tBejU.{Ap %\$`YH&.G!@t iM*4C!Z"zЍkp\ D@:o PiD zd%@}d ꁆ <63 $UB!ǕeoZ#{VTG_L Aiⶸ8ӌ9sSm'Wu!DQZ\(Q:=E!0 hJTkUjmDZZRio^7M9;rq}X쪹N)9*#X2vk&`mlד87ot~˔Q+Aҁq}YQgZ"Kӌ?vhn&7T^H>Pzุx TUw,&=68t, i0?;B⎵>,y-\ܽٳ}X2t(x+~啻n]Շ=ꤹHi:m,3ͣi;T1 SSU~--= ] I!d_}ۚ|/?Hdmc%5*\.IoқW_"m+v/֭W^ۢE}@p8Omق=&>;hcQV>A.nJдRP+5 ZM~8^xУ$oܺ_e5Wzn}}yFF_2֑ E*% D"є?Y{Um4QZ|7vnsqqf`_ٿ??)龷g#"h̘!3gr{}iIno6o.z%(wԩ٦/ {i03 +,셎O>gnJ.joo4֞ |T L<#]$IS/{يڳ[ʪN6*I.706v)&xe;s<3H.c8tʌ#Gn%cXT_m&8WoJK?1c֭ÆxKsu4~{ūNodڵ ooGSQ& 3[4eʌ;x? M+қ/ۼ_P0g>HhJ_gX%jKKnqy˞Mi~l|yrptt}YYAZڠq3>O6f933OY]Xr} bi@iO5uEo: $uƚO1<5eʝ_ҖGۼNv;~!\vt$fe%$>t}vI.7| xWJ0{ۿ_RYiek1qKY _(F^`ݺÉ6ŋGp0ǎ#6ȦMi |Kˉ {qCJ'ooRy%J{Lʼs8up&̙#K`d˗7/_0)HK 4B t:kc{nٮ] nx?X^C9qbm~=iR:'o?+ڿ ldl8mI<~l'~;mۉom]]{ !z}YW{={n[ÅÇVV|cÆ/;9-ᇘ'ǒ*CCBGx/!՟rădk_4Z7#+)iq`d@YԻ:;PS\, 2V4]vx0hÇkWU]T f_0pXc^=ss7ݫnL=th-)_tڃdwFSS\\]XXx2HJ23GjK23K }+'N(vpՀ^(礤J&jdS q)V[ZZw~{;+9bƚ2ȪV.3՗ߙ&d;7S? |3O|pNڵKƾgtVO 5gN·^8|Vv}GNuee2JH;e CCEѯ/+HL>8703`0};Y dP tF@ 0zE`0@P;P?#`;`0>Vg5Fف`0}pGΟف`0}D.L`0? 7IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/images/eq.png000066400000000000000000000336641475757676000240450ustar00rootroot00000000000000PNG  IHDRiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJԧo_jtΜ {J$+v  g' <'S(BۗX}Û7'<$߿c-F1cϠVWx|pt?z֬&Ɲ޽{#ؾ}C&$K@D,ԤD $N zbY O>YtM^Bq#?`;f*EaImG?ko G'l! Ӛ+'MTVaauPFZZi^qʠ؇5J7s\^fO0j OO!~vϞQ_ѣŋ} . rrsd28|!Jd\ԿE.}WEH ~l]6,Y"svvQ*}W^wY6m5c6sϙ<>'^y {wO_Odhjw9晇,si˗&X4M?7ѩSw6uO3`Sf̠o H$Ξ8{-%ыϹq=ׯ3g9kgZfC rށӫf'~A<ZvtqTJKZ-B@Tm[/%=Xٟ\># _VVkgr5ݟy-)Bow,Y6 P|xd7ػ{wYdܻ :TZ,`J \ؿ_UZ =C  ܿk.a#55 NcӦM<5{֯?u=eɒa&-\e:$Ɋ._Y|#7 SuLscBwl]`^oG榥;dz?Bڼ4/b4s'ΟOQT'6a$bl]}^xxAAAJovO2E[8Fc^ܛGM6M2#јZ=>{ 9%% JJ \ݣ}~zq^-CV@VhfO׬q׹GN ބ:;5;48:zg2ڹs"zy!CL7ohr2ieޔW_}5$$1厊{VVEQ-^t)&&^w۟d#wiӦKǏ ӧO0a͚5~iRRԩS;d&@ )xر+c2EM6;$$ȑ#˗/1bă>6ʮᮩgGTfee999͟?_SYYbŊӧ~(;@kegJ2&&&77c\RR@Q޽{;ؼw#w ۷o߾Baϝ;wȑ𲲲wy#VQ[!]pJ6m0a„ {aT*;A٫^=ukMa!5Q XC ^z1Wdn8ܹs<ϜJ~!eY̏?> k#GWJqs7m12fȨCJ~q=#вo@n9fwc1Xιng:_9-ִW[HF~BsnY'n;({kіXX[[3bҍo B߯kǶ`ẍ)/zxz:;+t:mMuuyyNu J-.N、^RYN eoZA'u73EEg)'sJt{<m+oT_˯$>?^JF @E\ #ub I$cKKb>?E%Z C!=kb4I#G)n{+oxvBWBW8E$RrrP4EQS.m,6nÏ># `z(d{?z72eZsݷ Yy7giF1Dcn<;[u6rfXƤ >7xPA֯WTjvX*E6njfJ0Bbm$F1Ν^^II}ǎ5qڬ,V;] 0ā5˯C,tS$..QQH*|̀!C]qh~s^U^~-FSyX^c8wXNyz#>[4vg]q}4{4yd Υ.Z^~ztZc :]X//o!Ca?0FY0"D;}sʼxO @J4r2ǝܲѣC/W֥.>.!QѬ3b@c`>$Z] 6[/>>f,~4c499~}bG8~]u٠1/z}IzKDw\ulǶ;,xVeǢImcsrcg'6[ӷmۻa?!xn(Cp8^!b5ߜ?\\ݤR)`@SS a0hLq<<i^5'15][VXt}*հdVzH >38:2r[XBjkkUgN}s(rlĹVwkϽ>(;ʄTZyZK͕U!Cլ/9e- 7(9H.FNWtƕ\l_&'jiYU;,jJ}2 x̐"4S[Q_~2sNG[nM;_,+7_=W^Z`g7)%87q3fl+ ybL:eWUqrNחyae mS4EugGicL!#< jN[WR\FvS3FӦsw6,7Ū^}%׭xqkYPIz:|'ٲ34i„QL#tyjn&4LE%K#hW>3{[06EBG?Wհd2]zcm|h#0+8xE߽`E}`:w Ӗ.utu_}0-m…];+(\9,'GNijPzyub(Dc0u0y얅CFeu!N:]NnRvz+_ښ0_la<0#u3 ;j̶~yW\y?OCO߶ҊG-Uaxr%]cFϢq4MyCcm^yw||+--,_!Q뼉㦿jc2/sc`ҟk6^ј&K.ڸQqQwhtaBVvW: rGEM NӔQo__1!0hT7yA=U4]|2Eg^=zLabM^xsQʈؑ#Ti&空Y, OX@`Ї_,;;bM M}[6Z: "ŵkZJSY):9tZ[?gOg]VvL jj90Կ>Q@ u;ESIS C }s>0`̲,ZgZ^{Qd$Gi/@W0]\"(FcR rԑS Ν0wѩS7k~ˠ>?8];CϞ=< c׫{ o>6o06<J-5 <{.׮*+G= ^~f03g_,+n3vÏ o؞Bk+, հ,V+" cP6!d1Fq,gxlռ5WЕ1./ C(><:n,TtpETd}ܟnlfy "PvrJbBF䀨*(["f)J5Ei3NXUuWk>ng?mc{ DD"۹%-Ԇj1F4BBBѸyBh!ys6޺|q]DV}uiTH`˕ bDDRB)FӦVYcGf]8uUE?yzok,ضw%lv۴iS )es]9nfő'&%#17#¤Ti^V+[XlSyi)r3[oEEW_23O6eznLƢ׳.J`L:WV1 ~rc 2*z 8x!睜o\)o6S˕ /E1 6P4iD*8HoX[GIDATTeCncɰ雍Of@@`'y.8?#뽭MF :mٲDFzc.YG4QO|BGsGr R BD4C1cV^jժڳt-饗nn k5ǜKKnh5j٢ѨK^Hߵ>;o^me]$N;`XSXxJ&3x !n85YV8>/;j9'2qlPWQw5?VvYwڱIJwʟ.]JLL|뭷6nk֬隘L;דU&/[vh͚F,s~ΥK/-0Px B#$Ky|!$<_8``%ih\rUYV"AaH$Ch2a3g֭s<^5,96}̩ @j6$RQ q1 PB`4רjjU5a_Hec1ƌ)IOW^qw3=lo+ժ_ɲk%Io>s]a ?>22СC?O> )) :8]YדwDwDk2TiJK̚LbL,*]|""2]m{ />m^iqs?kj|1!ibxbUk*fhFDQqVb 0ˆ/G핮_BB-WyaBWSf1N1\)ƨzyQJ]##i[e2cmʛْK۷oOIIyw/^|.T',pЎ,!H\uBn>C5f,]U|"Z3'$$ER[?dj[͂Ӻi^qqV&_5 ?b>"<>ƕb5Lmy5ƶM.\Ҽ1="|H`k+VSD/sttpFPY^R|m;<gxo#Gyu^j5eeqUU bCb_&cYÊ'@S.u;䌴?oDGDܵ+{+&$ly뭙+V(<=KkjBl=]c /%uVaDb߷1n6a8uJꪘ0hlII-&97U}w{=v✜۷rJZ|{+Wo'W(|\{r׮ KȜ]J}mm:t ˴f/1ܹ~xާo"lmW(=( hܡ:qlBI0NRwXGcc;S*-})W^Y9iã-&k2dȃ))_.\hPyM=[Zcжob׍ bTb]SvD2)%eR474M?گ?.l|tm;\@\uBPG9)S7ezq㹏>GUZz]qH"'~%,6Eg""Q#1..TroǘJ"^CǏx,`B&2hx7(|PDAЩc6Kҥ'7Xqs 0c[?NDꊊ˗#$R)CH_&$z^$C=LTjӸѣ>//qv6@Q(iDv^*+y).hZ M/BOhލ1Bn1k_CCol'N^嗌X~bbiF.ر_W8ngi=!+z e_L̥ÇkJJ rd5/.urj&uhI$.{Qvalc=)HKk|Xl8jǁ8tQgwg{sr}YY}Z\[q[gvٻ^7cg/RRFn}v""Νw~Ò\b~-z/*;C=Q{i'ΞM~eFq+oVA7Z&MC  @@ ݃q+V4_D@艬=$&4%@1oV&>;nfg'@ N @h?"JR@ fdR~@ hdR2Qv@%>LVe'^g'qv@5>g7f4@ l۷,$$4@ 8iCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ3KHBI IETD'" 'XxPE " H" I)R7u;;3$&M_x%ޝܽ{`{55,X`q {5^zՋ5 ,Xzʽ~5 ,X'~uȚ ,Y `  BPȚ ,Y΂ {"VY`⾑u,Knj 厛3qVJʚK\!KZ, cf ݻMg8̞x71c^Y?2Ҷ)n6㣟}vwpǁ9˜M|aL `:XYgq?,Z7wndHSԅ{͝wDG;#~;{Pr22?~st%iiww@(-t0С-jmYg:{II<^`dO?]9xЬ?&,).H+(hҥ"ww .[V]\5k8+kڵY q'GJsrNl2cٲ/VJ/PPWT|晄#]K_^oKADE~~xRmaHBd #U*͛O&OÕ+V DAL$ii6 VYܫ;s"`P*}k˖,`o[o1o4i޼sHXu+t:0h4Xҗ_yyΞ]\>y&$V.>a\}CÚ' OJ<~O?nޤPoKQxBdrC׸y7/9:GMrsqGNM PۨQ,mqC:dae=opR+Wݙ8JE$˽z"+ v\?d*{9 WWW{t&]ZP@"ŕ0omֺsDȑ֦)JVZuwe#dNi4Ƭ,7Ϗm OڵS|`bc8h,7ͯɓ~ mqRs׮]/}_YؖDEr!$TӋoU^8uk_-K{gw5RqnFuudM17m(=Yq4woo/CLaCM ;~7QVׯ(F DI۵V.t~+-- KLd.FGVL7x>*4M[ #6/JHD8dXu3o߷&rsT***BL.?w'P+;MPQQ_3j4/0Ξ^n/79vyQ:Ϟ 8rtP:]c\$Ad)Ñv޻؞={j4r׋+l6TT++*@[,4A|>e2_q~ƕ“>thk@`hg|$&PryXb""Xv-r[[ AǏ+]2"eP ǹQz!)YB⫫ 5//WE9v? &R7(Ño¾}?pɤ1c·RR&jeaamiٳlՅ .* bbܼ+<mu\ WuC״Sm#늋>>\fRy^ILI՝߳*>g̹rhZre~Oh]6/^ƍݫVi-[\`̙ɓ&*+?2FQP`ݛ…K5j%n|,Z-JCzMP8n݅}t*P"xvJ?ylOL`cÇǦe=q7? ¨]mG-bcGɓ G1ǺhlP?j3wQ1Z%)Q"7J䦉XeBûEpe E_DUEppjΝstX<ə""gK4>RYsߐ!e9yg"{x<up'OXx'~i"a4ח]طϬK==N>G9<ܯ:7\p߿K[\ˢu“'mKd2ǟ7((k :@8nUBfb2[*T( Bq}g"Fc=a;zah )B uO? CrGSRqv0tM^$9xy{UPpOڶe`P}{t~O|啉ҝWdj/^ݱt:gJ8o޼yʔ)ͻW/)!ۯ?XHd`14D#.rar|W;"b;6ĥydeng1̟!a,Lׯkڭl93f3v*-)޻kmv}ZhTbŊ;}u[mg}ΪMEfc8spQ]NU7׶ CM|&. 'a[D[͆ރ5qimbv3TT89=vU* 085}ØPu]Vq0 ۷?(VS4co47 D#@7ERԈ㼼}Z`U5v!]܉ \c?@5bLo3}Na;{XikNbӦM0lܹ@0^G ےxߨךpñvnY?F`0Ea6q8";q:Nt:CO7:5FzbĽtB7y&VXY*ZjСoѥ"7oqGVu^TnnnÆtnUkppoTi,o(?U(YOdu  |N3uwP'wkPQaU$'$&u"HZqDQ.߂ 6mΝc Ǎ'ɘ~J۷T*2dիW@T?^*JdR [nݻD"INN>y$0I& 6,**6lx{-.ޛB۷)LN#8aLpCi88a[H ) Nbf6vCC C״~MStL H,VFAvnޕ(..޶m5m%ҥKg֬Y;wܴiS^^?|G}m۶'˗gΜ/S>|xk?k0IhZ72a85㍽mիrkɓ/_.޺u+..ʕ+~J2 ֭KKK{<==׭[G]vE4B(33&LǕZ{wtGMPEdp8xnp8@0!a!0CM#O+Wt͓5hR*'%0tM6 tV"%,Wdzg"22rr_~2,//y3f̘`r|VwB_tkӧO>rH˺ zY+:u rOO& _EBX x|Dy|T* ÆbfB!ia`PIQVqb[30ge8aca2+˪*ze}l8y%> q iq!O(ٻjzPpȐa#n8g:N*ukU=$:h{:BH 4e:$IKd]}3f4/iשXYo{qqq3pY#Ǎw٪3f8T c|o'qu ^}1 W*eq7[rk?f2XaL]b4u!۸+O$ [7F1e{BTmmmEEyEYYeR0bCR\Y鋖,woηʺA(߉dطk['fVF/s?ƱBʼn5XYg[_G -jq4AUZd<$4F;mܲT aa7έ5mj&E4vbNc(,8KLg!i ILZޖa f A# s Vzӏ?PT,Z\&u+u޾-2woo3%I]Bh%%25Ǐ? x@כrsIz{za|<dbeEw^3f M[nu( )(V[d蔿20FFF)XvMY h@M* &ҹ]G=T CII&n6vP1hJXS$CX鴚׬( yorL֥vxy*+onFD6ge2ݡ~yVvOog)%m6?<\swo5󃃭R0.6# fzU2x0.F)cb]َXYo't9nfI|cb >gha8C 4P a`u2Jp@cƪ!I ii)"Ift CKAԜk\!#jfsVZfݧ++Ao/̽YU6."blYM?R+=X"vEuvc L#Im}x<LNH=dJ< 48NDZҩ=l޼#n<)\3M:ifۊ Τ L4FM#FLw4( R!:Za6~q~&iFWWL4E*W`Ȱ뚳ڶJEE@`[.uswV ǭM{Eڲ:w^)2mH$jrfjt "p2.nnm: !T*m)%HbeI:Fi`aLkk>I}`40pi1 p1c"(&) INQ3 IDATSmXa{XpR_,na+CͿukC++kIsV1 0s֋bnTt)+@ [K._<feF mbEd--aaNr1>ߘxح JJQQ^OT dM HD״i-_hE3rdyffuol~`ǎ9zhQdSm5PFDARf i"HXPX,$B:]8GȑfppC/> Vַʺ:V)iӇ8Ew+y>je׻UXT器DnYUfEX{f9N-q~@AL׮DioU[ehZ$VYt á(1uϼ#i5#.8E#b4FQnPT M[-k0ay ژes=ΐaЃqV m&+e>~aQ++Ko^H ĉoǏ&ቂ(V}\OOa|OS;9Yh XKl|P((0Hp4MшhBZBQYSUIZH*}c;l\q{52 7Ke8C"g%jɦTp2g4exƂƎq B6'NM1S~0.'3Zou]\nhrEhc ;~?0]AӔ0 :B40 IDX fNTT:B%j6 cF: TQtQV=ːaeb!2/,+DBv"+JnyȅBq[Y4[3m4GﲿgDDCC18kzeST"P>RU%1 1p HX )*+O;${9 EEzmaB$Yg>E%sBtmeiUYjWԩ(r߃u]Ju ͜2cfBIh0:yv;۾ҽ5Yz}d}"qXT_t'V!u]UUyav*p%S]: TV -M^aR7D &^je7Klmi믻wd蚬Rk˓yxxB_\ I&a6jTu%eٱ[RiȤI|V|XYgqO|W}7S5Y:]CޘA<~?'6{΂ NGB4IF w:򭔔5LN/^ ((hǞᬬ`QP\͟~ i$;sbBT8ޫo_0jKnjiez&ޡ׾Ǐ?T: ,X!}%&~8eJTjj}L jw"DR ?|xRSou,XpB+qիm{3M+|! ݻ&=['BDԚL<'1qqݪePfXYl4!x|L)qm4PAS~7.]IKn2LZ,.R#Uׯ?vͺxP/$C-dP ǹQ~{/GXY//Wʚ/d֘zAP`$$Dާ8(u:7DE6v^PGbVWVQ*偁ijk}|rO=޽ßzJY^^;c2(8?"e۷3^ua}H DWΰ,, O~ +g 3gl3DQb]qw`Q:%Da1<{1,.wܜ9Ǎc "ѿer~o>m4eq.?kqq…߿wpp}FSxyCCIrسfW^Ih)9[heLL;)e\ٱI@H;jlmd[-Ӓ;_1bcu0ͽŪV]s:7#'7=+L-^eYߺuʔ);a$A|>kg0qmyqVֺs8 X:f< `k kg϶D)u2KhW*O|RBM`Y_'7UNPaFFݍ#]U B8x\_ss՝}[=BFI6OJ Rz}1֕4~7 bۊC7ukՀq%3E %&ԗfxy{ke]]UU.]iΦ*/?GM5Y5-9%5uPZPo D"qtLLL\\.FAiP Fʒ{;1ٍ[7<^}ee q4 ܼ٤_y6 b#6;aYTN'ö,v|fְ#9wSu蚬zwJM)=v\Bb_[q7gg]=aʱY)]z]ᄱ~;fРO=Ŕs|+ϙ?t(SƦMrظq%& 6A-;emMM*';> |""BePq 0qP(β>n1#;g]qYd_I>># koH|S[hŠPbc1"\z͛ǎ[lYrrrbcc/;O?N"p&>ԩI׭4o^#ZN6- 2r˒%K4)q?>}R' seUyy}Ť޼އ+klzD0@$KDa` dJ`JUVC\~оQ׎@k˫ FiPn2PHQH5\ioo䔁gϜ͒,) ݻMc(Wfe["Zaa8a8u0VWW>m["H^xi^`Pp;蹹"brmcjk%!!vb\zܨܖ4ʡCm;ug@Col{M&rs [g,+w_mTfd%r/[ *Tj&pq06 0d&&B %sgN*+#u\U*Qr[gňa8] ő#`{yr泌@ +˵GTvag{)͉#$룞}v̙ßzjO;״@wԳ6-dԳϊlKFnmmt6f FYBw|̳ןZ198μ &ƏaJqcFQtJOXHcb>j7 TWTTwEWLwʊcM]lUEÚc3  NM0&0(mX϶>?WnlmG mGҪzqqcxSK1pJb*gCz3IQ$E=ۧuVIs~~weqkXv>^fV>dh.[m-g@KY^`Y' EN'~\.kf a85ZA@(qvB#0H0 8aUdg6.{;X"+HQ+܆FW=_g6KKL0Y+FsB7yu4A8Om3umֻW6r;M֫_I~aaG0 : VI[1Me ,EQTBD4IV;1ueV <ܖE',z-.g (lHtW9O/$NufGc`LhZ7ba17,3>PTy8F#(c4g;q|blTz#o'Eut5pUwhmoOovq:6+`}\HZR*'r5PEdp8enp cx\ aFB1 EHp{%0UY8>4߀{v;}=/}Y}WtM|.rOOgIz"]d 2ͭ0_:b{lmGiu|AT>wZ(第[F#UE s )b!880Bh!(c F"u+DKO+,[VXI'>t,/+򳏓S=܋+Xv8O`Dgf6nw&i2ej>:5uϞN2wm[n5/r K:Ca41_")j5WwY"Xq&>8(m EnϥxʮRVY5;O3F2wO(mwUӃC Yֻkoz&Uiy"_] 4_Je j0G.cۄI69=0bbm%LYe!L` rwY[Y64;3 vmWyy}G'el+1d?.re'!M@ ]8w(p iiD7U `*4(DRJ",ens~m>+ϋ #44"dl2ȿ@ɣzkʴ"Mj*(&Ygg}[oۦ+oݭ{pBXwጌ ~Wt M?V裏$N>8%|80!AXSwkF+<=, >wRE٨5MI$E!Hz`4׫ԥ%LQtYIѥ'l/YydePBI#ȺrQQQAzv~|??qٖƍرc~~~vrN:T*⋍7YfՇ^~u:Unn*ڐ>'B G]uUEQ4h0a1 I17ZJ/)+/+)&IQڦ0,'t*Op¤+=dal7p 6 矷jJmu_>{֧/?QOQEFNfZCF_Q]St0?OY[k!I+J~߹d2:zj4+RŀPCF8h__a6@ut 9H [>zlK z]Z㯽e2P(mv_۷o߾sΪ'Ol/J7|s…IۦfB84" 5h&q0IR 3Mr^r >ڎ{viVYAI lW`uÞfݧ NK  =Ҫ"d?%IK=z2kѠ)fffnܸbʕUb֬Yׯ_judd5kzP\S߻NYx#;GG~g9p#F%4QJ7j .*̽rNYX.1okm 0dnf;PaQ>~AН!uUUELaD}^><8BDUAi~RiȤIuq+` ={hmYePN|ݐ7S*e:]CYW\L-^`NJw]G:f7o}ݸ bY/Wvl2iYg`1j  Mud<'}cbx"Qw!˪  P JE44A|>_&@q``{7^vt٦: ,XeM wŕ~ h0>0{6.Eu,ZMQ љ3%  5M]7,LRǷ^C?MIX1u* DBoJXzbʕowh(M%Lo}[_:f O(p0f֬F.8(,xG{rO7nx#qԨA?7Hp?n\z18䈈KOdrsAiix0 cbljm=#ugupU.tf8`[cXZ`pW_JM% be8؞[##iwﺹs_hSݴˡ 7/]򏈠iVf#bYY΍8Pӓs׭l?wAQ6b.BdӪFviYn=?x{rw"ʯ_W(^Z0y7ߟ ӳ}ŘT}CMO8c79}bn;yfK%&Tc))Q0a}?uL[6M7OSW{ժ76m;e s*F/}zڕI ntN#زeƲe$AT'%BW_/yʸ_COJ$^)II<^xxl^ɯZYXX[Z:v#VJʤW^)ϏJN2}z8d;ǺuA_߹]FY71q==  0Lf̤t:i\"x޳GO54ph{7ߜ۽{] p5]C^`hh4o^BRdtHpիkKK\:v?.F@z"+ KJ=VfV{̷8|:0:`ʕQ))f3MH8oPxBdr2< wWĦ&Sܐ!{>GtC}9CwppS>[P|5gN7s\xd>Ç<0pnj] شpOO͑#<'?8{nܐ8UDBsaφ]ݼ%5U*wXƍ^AA6n| B30P"UkʠXLU*|BCС{֬WV?,fsTS:i hnou+3s%A]?,kXDR ?|xRR+̮OhOh蠩S?z.%m,7ͯɓ~gh7<=]۶ݸt)ܹk.L˺uyΉ'jTJ+WxA~p **qrQ!r%\m8e?x0j5En$vøj቉ڠSE $:TZ saۨQ:lB"I v4EYV.wWÓ`#]?"ȷ"f:fAY^Mzq>R9i{!آEߴ LcCһwINN <*5ð2R) Tjj%ۛMÓv\;gSث_￟llz:dg%&6>ÇǦe=W"%99QQ‹.X(ɿ^# n\x+3sow/iZP7b} ,,/R)_*凅i%lR7o x* oۧ8=} xaM64%%w͙㖒߿;fOtk+D/\P408uiㅥGaڵ7=pXdeS O^]tdvsDEgq~yOD$dFf&d[@ ĉ+޽'2?0A tj9i={r{x*|NA_Ǘf``P22ZK^XAV k::={&$%urY۷_200ϟL\\ fdcS~z:畃Λo:}}}?z #M^^mD$ue668RnpOPV>eN!IIv.%%aba ,)X'ބnI()R7Nmdɓ׮EvaiI0]]iV=#m[[23[[9s"+S$99͚5KREeˤIH#,ll:: .Y-O^x:@h X+p^aٹ\4 ޹y&&F&&N--f~~veχ3230qp|=~Q(mmЊ鍊rv_QBaii!ʦ噘1!/c($ى((1ևWwt _ df{{=tTk;9)ǏUU*vQ0uNb}Q0 Q9ZQ0 Fp*9F`aS1 F(áXt"o@`Q@ֺ}FcQ0 I?`Q0&*Cf IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/effects/images/reverb.png000066400000000000000000000367441475757676000247270ustar00rootroot00000000000000PNG  IHDRzgFiCCPICC profile(};H@ƿ>DD:dXP Vh4iHR\ׂŪ quqRtZxp܏7*L5q@,#Lܪ "&$fsw1}ѧM8 xxf9YIRω #e8̰IbJJ֠둭#k"f@yR(3sLRyݏX_ټSWfbT^=7WTw݋>KHXҍ ,M[PtxBpdo,{? x4$RT*9V7jK'|<7Տ{ՎzԷ~;tRwSҍ:v[ OeFJ)+*~Ӽgi#*9y/ozӿ>G<ۧv#~wLCa;w֖NZځonjx1){`,3F$"A;nkwΙ-/^p8cǎM>=11122MӦ -^GWrFq q3xۋ^۾o}z?gg߶~"'ݛKee P3 -t ם{yX X"ʬ)uZ{UDܤֺP׮@PlO=unޘ}S&OIK'VkoP8oĖ֯]ޣGT^KX6wo$Oر/=J~k۷߿lOoe4 :_/t̵o|aÆ̙3/_>wǏch"Xr%a{ZX&M5jZ~']MM E9rؖגbݻ=o[=BBB/_|~9Æ m)}w}$IVUUE0 ;wul (//3fNW=맯p^hVj4b >>Y"{2?=%q89;VTǝZBv!&?p w= d}qqe>}{lJʽ YSUXԭیW^sΜ MI ,t4qwj?֯_~Z~7xg&ww^DRiMi),LI9-^e \pay͞#\9uJ8)~dv(0WMHȘO]WT3խ[sg(Mn6 m_p'O裏tÇ$''7_q֭[nqAkrޤ&OӦ H[0A\V [ x W/$.ǠG} &L 4ޗ/_<}Gmpĉ>>>k {K㏖_l2eK/4q={44tʕM:[|=zBX|~֭0lBlIƭ/B$ZelW~ݸsHDRRDRR`L̑lnee9L1 r9AT$"X,Q 0,OVСqNL??}߾̜A+ Nnk>vL0 OL,ԩSne f;&*<)\&[& f<DE=n]m|_~ji޽{SSS7lޏO87JKK׭[wa]­.0l֬^]4W7(Էr:{u֭_~ذa`{۳k׮իW =z/R9}Ѣbґ# ֔R6[X<fd'T*2+UhZ xA] 0xh;Eu:a􆆆H&y}aa}ƍ_-Jy 'O&)u? Οgh:uO>yHt>9ii¯.^QÇO}f]M(>ލ녅ވƗm7n3g|$~gn^^?`̙O¢Rar:tHg=;vΝǎ7o=Gӵ 0e6㸝}|ʔM+re҂O\]%%4|׷ىc q$dpʆy3,uI_աLT_.f٘1O[פ0%C.'VeGV9~|'g;̹jW_ݽHǾwҥKml68qҥK7n8eʔLU~s^x?v]Νx- SR<mFg:뮛ztߴ|u7_~sIUC3/8hD$!" 1ID H Ilqxe)SA-"vռ—C҃r=\iG૯$ 0p`O5_ 3G0}Cf?v0G> SLip~d2I$R89xk#4q97alV[:4m_C熼k.ܨjUEEMz`v8hp;xeWk, k2[LFðO]x)mߛZ-Je3f q6mrvnz+9*DmN\5dޕ?1Jq4 XCI,c,pfmXJi6u!*5 ہ oЅ]ҍ:=5&]Wޞ̋Ic Her-fPSt56XVz9MG A@ .Ƭ嗺|V>l|_gzb#+A Dg1,[}懁q1nT`ѐ)@B$3cFa{^=yim&t A w8%/V芊,Z-eX&SvDt> yh(=\ *'Q9aʳr%anpu@!IIFu 6WՌLœb $uZ(xR <'2TL57G-RF,LKQϲ78BSz{+A9J\0ߺ6/?W_FE~WY/Lg%9:QjW*W3֜; 2T[=0Jw1[H+S6ʥê(RМKZQ%PʺVIUTT;fjo?%[?ysŋځSg3-^2ɲ9z ajXV֛u&K\Uc2[4Êy =Ϝ>EQTZCۮ:/aai]D;pjɴ 滥љ:$k̈́%ktIVwmxHcF'էo{CHhXhxD\F7fc)Jqk)X2hB+QG<=AIGl]wj&{@du]d/btRV9/@ua[EEѣK O>*WLl|Nv&C _U"<\tQ"$ve'_Y={Ԙꋫh%p qqÄa & 0 0 8i1};)XTQRty T,R<_Dcei*yMGwof5'r%l:g@_CwO8/,a9xn確x?[ 2,;b8_?j]I o+q 1Ǯyd^sVbҺ! r?|wٓtFI+; υ)i.5dА. ]bRoJX%B` BvB'&qc[s 4MNYhsl?8GE$T՘ǰs8׆ #ǝt8d78veY &Nys%/RVk+Ja8?pѕ{w];JZIJ+)aauXI+t@ S {&㓣ǎ.;:S\X9 yܭ/r7`qr%,ataG#53c8w쯾XMSTé ZKqieYwR+iE>y$`*g+=IJ س Y>!+:DZᰧ1d VҊy\2O(WL&OJЅGu ,k--p%Bk 'v^wNd#IDATlj3'B 9D+頭W^ :?ed-<BQ`pS/)~퇔&h $ M 0, ~[{PL*頭 X"zԁ<ϳg؄.a? pK]vk%Fg[xeYez4b /) 3e~zKJ8mĸmƪʊ5J*Uk~l2LODdg"vs}X,5i>ץCFcQJNlt x\U(XwXE``!mɃ [(0*04}~~[/]ϜYPҜ60 R{3,G 'ҫ>«o(U*09 yyae0`8gYѣ3p2ooa&?*%mI+*+.xaX"xJZ3e4Pe)ialV+ACT(.LOi2l()S;p,sPr,KQ{$&K FC- Ts8Wr2tfcCXw}Oi3\XNvK1Z'Ҏ2̵ͪ@-jD"YWr2fTkӎJ;zðɽO˅J:jv;'N@&,K1 `8Vߝ.zmه+-.*f6{;n*%튉e%//^*]%yI^ooy>h$\2)ں Wݿ@O7LV-JZ1ökO5Z *vahblc2葿.?{I., %%--)0pqa'JjcXYIQň+s ^+rkaER)N;x Gxv!XÅgO{8&|XaYd26bKJ w@8>tHLJ !iJI{c"(qlȰ UJZg [At6ki%[mYI9][7Tk}6Q"Dz[oGp9zJfOw^^UBX@y1&Xԫw}]m2UZaqQjJKYeXlv?:L78?,˲ hŖ]dr"1ߵJ<$&-vU~g>$WݡD:rJLf_YIqHh+RsOUmqԜ )L w1eYŁ8xnOa/M.ExuM,s8I&$;X#uOIk{48 Tb8+གྷBeEAd_v{s%ǏTk||̘%ܤ;xޘ8W\.+-  [2Z>'TQ&[!IIktac p,ò q,W su{:YcXblװ,pP'9ZX^b%b}*TkxBLZ'2T r(PmHj.0< *̩4MD0MWFFtyIs%A!a1'Jݧ.tV">kyIs%=z˯ɕJw+hyRaub# h(X>x`˰,rcX e99>P ;Ř-RfX=h7n* pZ%QڌgO(9 }}9.+J9=P㝘xC% 8MD&=KܭDHbl ;۵06Q2ps7GIޯt +!h(K32~h/Lhoc980zQ0vjlvFo(.*i‚#w;o-ȶB1>B%*$V~G(Pm=TZ+jW}_&WtFAW]٨<0o*afd,/%Iack~ ɦ7 &_¾ak|ݾwz;(P=p-4)GT*cYryXgXY(aJJ*a9N޷W{͟/nyqvA1YW.T 1iM^Qvu]lſa V7<^p }9t`H8I:&nds|[رnF8_w!ʼAw[{Vc:sL.ue9=SyQm]؍FcJk)y{B^Ҕj5;4p< KьJUWMfcy/+wׯ{Qbm }Q<@IǤy Ҋ|};MKGڍuBlbI Wd_TykRy{tcU`ѣJN<,Sr+-R}Ѧe:ʩZKh~2$2}QeeӅm۱k|`izߪUIOxc&c0'aXx^e3Ο:{(Є[کd>`ЃJ8&++U% T[ڎn $4D"Ty)*Hb[-&ɨ/W\|'?nQ@6P͡ݻHR/KEb 4CQv;uZO)&?9JP9yںpv:vm+ 3nj!%(Ph7j){6HlRy+AJtz};L d1VE{0,~ԨsJ:1RnXk ŚcN9JP9yv6G__n7:URnlUii~P0h4 SӔt ٹ\] Qs$CGH TWa--_d.,Y-/PFDx)ܤ(q 6[yvvenXQA&DR:0+$$ >>{wL)Ar7EYKK28( qX%h!!򐐖fY-r%.u@t-:GQ@  dq[AvƌII244<{wˤHd5Y2_\A11^H5WLHHDywPԊie^GWZ.?\0p`›#ᇥ[?4>^h^]ɓVa3$0bL"aZiBUT$f $q?3嬊5/&1&z[4V}`aJʝO@;M?b0|jz2?Ħ=+Hq/< +{TZFFpl,O˵޿>n]9u =}+5PydVV_:r~j,0n+5R"jqe縀׭SZ7MLn`AnxחbjjdzLUVܕ/>U\l=sF=v,VWx7w;NJlij;Leo\',ߺ|ŋ!qq:Q{k.:ۿ?2ǝ+zpr>w'{Dt>9iiQ7&rO0VU )̴Lp Ƶ>s'TefqTcI lʄ^בDx_O!\@gرj`A,F&'?n]plo~ө# UUjOL4VV;&D9.5Ԯ]{NRy7~~W,ʕ܎?I#G|}W/S7V14Dz=`הn׹gCv^xqLJلMHoonb>vGtyeC$qqn˧.^5Con111O/8sT[&̙O_Bgofb:xP9t(I :”<2NQn ! n9AtidZ@@ d@@ l@ l@ X,( q{0b!/jd2  r墯/)J7p2d@*RTl@ n[JIT*E}qC n6 @v 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.3.3/doc/yoshimi_user_guide/envelope/images/000077500000000000000000000000001475757676000231145ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/envelope/images/ampenv.png000066400000000000000000000750571475757676000251260ustar00rootroot00000000000000PNG  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'jrTc߸1?.]tQR|z<^#g~ }<0Uu۷DHAܠ {r]l۷E˔ۦo_\{WBCȑfo;׮Ž+WqBUrm[1G-Z? #?#hѣO:sVrݘ5ӧZlw>KgAX=ey^K|"7٭ad$fMz`z$_ G݀%VB_ѣH} oo5kLjp(yzy~/^7ȽOOce1_|Y~`0zGD`֖-ƍI,o8D@Pݠhp~8_CZ~dݽ+|#?3DAŷϝCҤIb"E_ g\\ŔիMrYmߎ?,qgw.^ĝk9~ʵkX(S!y$?[bҥ&Ua!~;)ׯ z8gb֖- t6 {W0<+@ϓ?JhEZD@P-q$z 4M8/DC.$ *,v-(Dz FA,.{HuW.ߺ%|_]X ~[¥ٚm >wRcIb(=JG2I?7i;wpxF/)Shѳ'FF"\5ţd$%avIvt?1Rÿa'V}rL ɓ(˃O:w-NC?J͛7h&jy\ǧ7&yH3ϼXC2 (›|0;N<%vocT[(d''˃'Ǎgω"cDRKwd&0>[7{{zB`;i.IBϜGދ2q@ǧ« 'mÖ c11B M,ܾ}¸ 23xpn't;eǃhEZ<t(gu5B6m$I. '50xPWWݻmzФ];q(ɱ{mߺu1pxɳ܌rJiy3ӧ鉧Ow+&b4Mv` =*%_=z /~ ݟ{s'<@T^(gx۳Gc]Y7" &j3#1<e^bڵwI^/(<\0f%FH˖VFT (>E&M#"$괴IDQ4k&9 "mߙd,>px5Y[̞Afo//hm)Fað@ȼ{aa8wE7дC]IxHkBNj3ߺU]g4 I֠oGC~ORo*kPDA1/QW>$Le).nnr\R⑄k9>|8]N g$/SVZ4y>4Tܽt ɒN/ҐxaWN5 wǍ'1` Cݻ8[8oEElǏ#cG(||P7r8E#,F/~>R}·n](ssy&4U֜ k, SVk ݕtsB`$dk2D@PV\ k&auѬS'$9 g:\ dŋ+Fݟ{vcav6 =Li<=m~3G82WvԴ)=~@TBm<  ˖3zR$i]}j@m]T׍lnE~Sp5/Q7q=T9iy5ͯDPKBT`H\f*A5[ltx~;wV3+0mz 87|jFCAtt'ֶ-^x{;<СxoиMyx ;bܒ%xwޫcUpW(Wū;~6m0{65 ]§NBz#K L[+xJVݟ{R:ҭ׹{a2{{v\3k.cLF5-AJVIBE -obbb Bm@P`o7Ayvd{OHHIkb R?`i}ݑOd|TcG\o#drWYF/Qcǻ_N92G9&LVAs Ucƌy֭Ib!M5 ~n9j.4:`ً҂yZג_&!MDx\L~4<0,qR2QG ,Dmfϑ pBB[M, ;U\Sq"HE9.Ҋs vi" \${.'f?ly5]=c%$sD@@@@P&Ė 9?_Dd}K E_ZQ-hZh4/c%!OA1.&"yI=39tzw+ 1cjTOA1~˰jE^ZKFPcApBP:/"9b >?3 BO <ɴq"XS5T,W=eʔ*;EH!M54'B|HLLcG}??2y'$8/سgO֓gyGEQDN6uxb/k +|7 {B_@q!ѩS֤i֬Yv-[`С4PUlܲpB:AAAٻZlfn>pqq0(V*v>oڵ8{Obb">S̙3CpBBM 0Xb;V4F]ެ5V,* HJLęq(}vڅ|LFOF/:bȺ{o|5 PkTTI~!4ĸedd`-6Ĉ_ /-Z8=m7_Ƕ[u讀1w\̟?/lXٸ}W/[l_ODfnRmׯ_+w;b̚5dSf+3>/X9ujڌѩok^n5 VLtTE3GPAT hѢRͱlj:O>DZDEO?Ù 㲕hV+77 .DQQQLaʕ2nEaАس ;r 'N.q0qT:z xXr%8%ҩWM&Gd蔟>]MVܯϿ2>~Zo^ e WFF/^yUڊe"Μ:믿⭷ު,'N`޽%>)ޞ0 4aq F,%47WU\Vm۵=vJ|"ڱc5knݺU$:5x$Ym`t~o?z-o3ѩjS!Kڵk8rΝ;ThJBff&^*|N:o߾(Biz ɓ'K\V`zER J Ng.#mRG$7q ¦[ NohݺuLXz5FYOmÆiFkEa*zcPޞVOBN]0e8dcrJ!00rueࣕR¤U.>xN7p\3>:UR3 8|0veXBáN@O-88uJ%bbb@<۷/H;!M*J%֭[<0wL)ټ96 ڼFGvJN$+Gb0205(* =;{U"'Ю}u;z}4o;ZƊ+*|IS>gO z`ˠaUd$Ս7z)xuY8GEtt4E%)j IKtL]۶mèQлwou" 8ᔴ5'~fӸB$BR-iQ4%y/h19J<0,XVz㭷ka͒qWNTe20x@k?6 9=PQ̲ˋˈI^z>Ҳ 70Vrj 7oAx3q DNICKKgK$$x竪)xuʙ 1o<,_B lOOCvYTҥK1|!V 11rz1e uz#e!'gE6MI&pe) (*5h5yy-|AܹsBT\\M6YHҌ'&WNAp06' FR{(ViE㵐J&J&7JLL?zf@ġV:XW]8ƍV+^< }Mz–߫Nm[?OR:DX̞=ׯEvz 潅bdV+?KL?Rgv>CfЫR/Sq!7<Ī* -pW~cݲkoITh[OlIn(R*,S,e+񦤤9YSCFKȺ_t*pdtCFUNف3qڦ{tJL>?;LnE-!XxqP{7a{4~f|TZZ#Ά5{p0&cƾyoߎ'ND@A4UħTnaGH>-P tq2vE t5v,i~f9fk:#K'5+";;xN:^znYNNX5tiZ9r3lyGoM7(P0^S8QGq9q"YjO7qg൱oxlcǎI&SuOJO^R3uj@-> WNف3$FqȪ&Xf &0~>mjJ5Tt*4((]}zz d9 OO[9:w?xshڴ)Jeh ,]Cj_ZUXFU* 6 =Q@< "3WԌ|hI[j/Pxz:\?~\2g￱bi*ܺu x+Հ53K+7tπ1]2XXpԩSJ~œбq>])02,jlS>pJRa_#VYOUgYm]mke,ktڵTd;ؚS2WP);(NYo>SK.:: 1rAݺe+Vc'iͶb S"$.zJRp$߹IFi9JktȰh۶=>kϿi&*ۗ\Pa"aj6HLS@蓔𼞽ͼTi%dr9b,̱(k!gj >X (_PXŲҮ;"[gqf9IjDJrqIY93fřc" 7̌t<«|P0s8V*(RM*`d(P#kɱ+5)W Tv9詚S'Nƴ)= )(Nɷ5dKLSM)bbb,Q}j 3]`q3Y]:os8 G8AXC^~tw>SxQزve\`އ'?+(<Zb6 i"*!*%X`YRѤmDeFG官l@ƍ( NdXCٸVZf"_/7`^ ܺCRkkd1P?Vc?|`/r21v( p]p&9_t`]k6 /8Vڽ>ek;|թf]LjNi~`ԫ_߿,N$'kN]v͢WtRncO))鍦 Ҳ<(\MZքjSY>1RB,voDR@Fgƶ@3Ha{g:"_ Aod8 /ķ_}ns=t`0`/^mdYb5,=(RYy(*+|W@( ׯ^ڕKq)buSF0|k;թ6k;tןT{(/*.6xxxgϗdEQX"d˹P({g1T~nV&pSk4xk`oȍݹ'yZ&(ѪM;#d9d&')-1OUVu:r˖$&Ny;ފ;V ZVQm9 `bgebe*E>"uqjݦ-s[,b͊AQvY:U_U>2ȊfwS4McK11PFnN&rLdggB넜p\)<+F87z?#Fh2V/>qѨy=muI&%n,B`d;v:i^PbiiP(ISR) )IȀYV"cwa8e4m*,<`]DA BIB@qq1`5fm˩ءѐz(NaB1ѰQ(xQ,ˉ eFr ]:%[㰦0eV/ABV/ЭG)0cqQtJ/*NϿ6WR* dge"+3YL|{R) !̈́8 rгWoss $C,,Hh> R@/4G(02mwKEMI\!M549BFz:Z&`RT'G6.lӤ[^'\~GɼfU9)?[VJ%PkHq5޳zm ZFo0 Xbǁcd$YP3{~,~ )[r+d8UN<qY2ѦtѼEÚSB]xkˇI|K~GjN9տP>R6Q2.-&`m|LUTt[X i*9;Na4t[*zJ 8f~y OFZwܑğp I<==%:quyx8i0E.c" fA߼q*hוxM;|0zmԫ-mk oma6b`Q1tV]Q-JNBI IIV 3@zV`jْd4`Ur{3RxK,YuAG,z)3Jq*Ny )ө$ˆN xuJ͓ eJDt ?w&?Yn$046 .BGIj8NL K%"M%'hؐZBQ>urꄋ +eE1=McGيݱOL"/1ɔhkB;M^p !V:e)'uSfP$0-QNfo8;^v[(82딦XgF':ee%2iP(#SƚȈDyDe"(y9yLEȰ@iYtRj?;+7oސ4t-M23qذ֚0M2{Ʀ2o<=XAd/ðhTdͲ$\FDS'EuBfFo`9n ND82[I-'ʺ&+Tp"2,ZDV)ɒb`{IɀDgүL:%' lT>}0ml3NM G4rsғ$:eEESX4cx'$&nPKc_ygMLNx&p0!,, ٽkdq\hK_δ™SuJ+4~ t*}o敵ekZcdeqX:7**Hv,'ADNfSǙQ2'] fhi̽4DV,ܙ8vJASdR딅7d0mT^&TZzat<VN>$=u)qQ V7#ĽDZ<=`i?y:z# V[k,#,  z1TH\(nN{;1atд1Ap|oϫӸIе{Fڲ(qĩɈʢBJ?f4w1nݺx{Jv;07$YDn.FqUJTԺB(""cٙ 0lYNXd%~G;whh(|}}ˮS^sF@%)s/3{HPNug>VUnRL{M#ZLZu^ؠVNY{P+///>0C& &Hnd#%MquBm/$β]i2{H$'+N*SL!=izt!iľݻ0h3ɑ@q(S'ӛK _!PӁ} K꿨 z^:av5Э[o hӦ ocYBEe$l]K/U붖D@s"9q((KMOY+;Da*.^4UMym+]v)M1pr?iILE֧cJSEbED IG:e8ŝE%өJ/z_@Jܽ2 Ky !g2LIoZI+oY i^ Kepq[ʤgY2Xq[$ `XSCdc*meY0k֬ ֖-[ s]:]Z lPXl !L]ībD 2, #BQ _ L%Bo4 /Ga8^l1 Hte҃CJSf^tg>2=V]`Ppt*0n%Y^:s>hG^  9pEIB+ _A[7( BS6,itex;JZVca6/Igv ѲL^pii]UƵ+TQ=B)sEU IDATQTX0ce7aЪ0+d6x7Xֺɑ^:OIWt"τ`CI׮]^Y,aXFm^7cKF-Ψl͕dce/~qfc^FF#//۪俻w ]ŀE$:7i`RtS |Ls@n*\~Bm &-xuJ8~Fedz߻DV,WB-Kp+y?q-@b ) ,˰8y<Fx 0TýM??+ⅦAZu iujN =GzdFzzhzhuˈ"%R@H&+eu$ݾt1bD]➞g) _'L5Ǻ5+pekAN)FLL$A2Y+2`dXhFhFFᕝ acYo~w:!C+-J :iM[7ToHq⩀P9:~{えNQe!GvZśDa-qF@iJ2m-$$wJHdXjUł08wKuܹZBi"(!6m;=oۖؼWɓ1V@Rek1VzޠiuhtQSitPktPkSkHHGjJ2tzl{ÿȡN'D&M*\<~~|3V&p.nld8Ӌ`iU)a0 ?`damMexYiu&"FgVoZCjj rsk~n֯Xa.7ҩǁ]'}rԩ'JwOSKuX GN>c)"d$߽xgl$X1W ʒl#?vcKug"&RNNjjnjeYZ 9P+3_ja7+#3 I# X~w|W_}&*5S0SzB(g@~~vA(ZF Ȁh%3A^Z PiPiuEGNN.IRYdECA~=^^^S+?^tzzT5RCN:*Щ\)s<:ղeKK?WY<(+~bQ<Ψ<@,cns:kx^$HONoi#Vv-Z!M |}}o;=8f֮Q6nčF )t VoyTiN KpȰ,?7`hEaN͛}Ž付w@EQ) Pb zA0hf/Vo<'ɨR됕D߇A91+/7}9YNU+aN) ٯZԓ2Se= z`hjt*oNQgyspKUhQo[cl}ډbYB:M[:iШUqX'nذa8";v+g)u7/5BQQ~֍k|ڶU}~FJ%T*(JPXX|d#'; JeZ-Xs82:e֡P>|ov{X>a 77 Ú"$4̲hqMdiQaL F{3u#ރXTٓDZckq`ҤIiҷ昤$8p1o޼2k׮!22ss̖iZddde/HEJ1c߹~2ޙ&^9<+i!̍ YPu!6DͲ ؋NWx*Ը &=' V7~ X@|3g`Ԙs/6+V EYPFAZǁۅ]m2%ZN8R*ԩce0^=uE&/NŪR:lа)NaXt)_YKgQNG,1: xxz03`9 X C'Mf,,,Bffj:u*(tY":U^ddd?F À]-ˁf3ޟ}Z\\“'P4-4*0, V *Ɗ,S'vxyya 91iQ*&Bi*… ^B QN]x(cԫWVu 0ꫯ_7 C>}Ѯc7,aKOKs8s2iSJ}:`̙puu2Y":U^9q,Yq$ۗ0a8ĕŞJv ,x9K%N~߈cG:}{Oh)H3DH!Mx8=(DDD`Bz{UA1+VرceNuдYs6F`P0jPULGfzܾ2äIR":Et۷+ǡ{>`Zo#K&YrfTŶwII=T"!M4TI`0`ƍطo_Ak SD8ofG@QFU)S)la7 Ϣk^)YRq >iSp3qL<#MrT-WBi"...k׮R|Ä ХKflɓXf T*UoooL<ɋѩȅeYZ 111%GBm8,{8@xxAPIKYmZYYVkve,sCu#M@DDE0Ppg0+63y=O#pΜ9{탢qf}]%7nPx5K\LI&b uuZ# +Wv-:B&&Kt'OfԨQ-ST <EM1cȐ!'55U/~<)/)ɩeժU֒| gkQӠnm,X%Kt[/-m͞ۯ|\¾}NP0qD-Zk>iZرc|Wܼy[>-K.eڴiy}TGO?e˖YuҒ+VSs3gر:gΰCzhIW ]vv6$..rB4z^ԔMqqz.0#CB޽ȑ=Ç߳OK#I?}Bn Ǎߟttv]z3 ei)Ҳ[ W/u(>&N4|2<е5>>ӧuh"v /=jaB&z%߸Art4|K?kSPSYƸ8zU}0lvvVWS~* eIIF?/_\JH`_qKp>:TF>#FccsTHdrRSɽx3++}klm)rb">>ZoZd[oQWSÂW^!`RkiN^^8{yqtN꘵|^lNÇs)!KX̚E͔]_/{tCbܫW9q<2ϝԁ9'h(o5ygpi1?!,|=#L1*|<ՈuW>u$ڻ_JE̞=3FVQ(U*>_,/fK/inTV;$FnЮپf ײ<~=66+n$+9ݬڼ^:v&u+>Hi/%W0yvǨǡ:jo$Dp3157fPJz6a~>cc4\YRrOښmۛ*N͆ |:?υvms25%رqyŸf9ՙも=}:\p]*/'q>PYvmvW>ݍDDPp66>ӭZJS0 /Zߢu8tBz Z]M aa W7?cws}5ױIol|iu߇=2NTBΝdKd%'s5R'q=8 $s:4iKh^K 1Nrb"/SYV7(ԪaJ;^} Ԕk[ݙO΃4]ݮ 3c fz{|)) ̤ fիmc>[gmNIr1iin٣G9{7'OfhMmݚ8s; J./׻5ʋ)t~=kZoKIyp_;nCΞ|w_~Oadf޻7bsTHdКf,/V|]&ST*r/^+X9 37ҥ䤤uc9|d HNJ ii8 FaFaӯ#?;%/׭äW/[p??l  ~Jߕ!u8El)bo]J>u&neddfGqL` Lh w.9nE7#}Q!E))('zHx~23hjt'/G3)"j###NX)p3vMKV;w.N܁,xeN~sbt :A*/g~b{EYYv&6.YBvJ luCʧ恶 P Bʕ:vx'bhtyQYBJĉ|cgz1dxNz߷]=7βQT,K18鱪b߅1it C@'禆7n<ŋۺU8wg>u&tǞ=¨n/ifɃ;#]GGsTHdjf|ȄG{:u>buݻΎ9K ھRnVTlZB읜X|[Xs';^}ԟ~ Ħm4̞ULnoʮ_'ok3i)jj}G* ;:g18/O˦ԙ3g2ݝL[6R*Ikgw8s],q:S FϘq+iir,25\q@ãEܰkְ qPJHksOKcxLy̒kj]¶m4R55(KJ-^>}ZnO""057gА! QIDATXؠ,)03 oZXj+&8oW46n/^L޽<ɟycQד oݭ3~>L7OBSg@yldl>b՜=zqR)ĺ_K1_#!< `niɍrRSoM=w8B%`̌ もqnBB4EӝxNš/<ʡ0#,z .l=k2Hhx@em-sV)?-ZX`amq5qAA v 9VO='Ǐy<^ } mh.l13SٳVW6S{{s =>sQQX˘@V}=t)|Cq~>q~˔E2:㾎 $JO'vfxrڞ=Ds62a% {{=I܍HSHgРAصҋ!B%%9s^6dLB!MB!R4 !BH$B!EB!MB!R4 !BH$B!hB!I!B&!B)B!hB!I!B&!B!EB!D{H~9!׆UUIh:昙I Bd&h*BN!A;%R4u%333̤hBamܞ+Yc.EBmÄM]J*u!ۆUI AۢVVVlOOM"262ai;IzlP!BaP6Jt)`IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/envelope/images/bandenv.png000066400000000000000000000534231475757676000252460ustar00rootroot00000000000000PNG  IHDRV pHYs~tIME0 j&`tEXtCommentCreated with GIMPW IDATx]w\?3 KG(UEQbŒK$&hԘbKy14cKD$+ "JK[`13|3=;{Xbb∈Ub~-gTU `}VUDDD ͛aXK@@R>+V}1+VU,X,ϒJV\bXj!$]e͚54mgXe~ްaCG/׫T[)*VJ 4;%/c UU0v?[u쏯B~|BBUeqqqޡK7T^$)֩m\FNZ7ŋG0 : 7lX}>7379yڵ秾bYWΞ'8NϻtU+7o9cFכҘ1y??x;_pߜnF:Iyd"D q؃&IZUzpeo,ponbӧ<5kz""p( \a)m@R1EFX}Pd;.r'.bŊouF&]wd>aX+ߞj-ANueEiB!cŃ{72nKs/\]!F̚.^t)EQu#@)ر2/Rdj11}ΎY`8qϞ<͐^yח=4ޝv萬cs}yBhʫ*(P)4Ѽf#BV,LO`KkUl= Ҹqx|۷ӟ?~3vU D*.f|[wߝܱϜ0Ļg yg65{w5#""z\>=y#o|gNy3d<ݢ~4]o?zMn%c+Ʌ?YXUuї~YG&9A8s,7}hD㫯8>AZYy ޜƎMgEWұt5Jhk{«WEa8^^<S;w^=qC5Sg;O܉*9IIsЧLI&=ۗ~\~cVkYMY[>fJo#=Rsv'ohJהd'9&ve>e߾}F-\1xȘNWqa^bD?ܹ /LOWѴrĉ >Yq5cJ.v3 EFἂ3f4kj 8*Jdk{yRY7pذBيl6y򡯾:aЉvf׼zD+*)gΔ^90r o+74::%r(Kyǎ1@+[4M7^Pa|tƱ峞ߵ4w$?ٷNl%:hF3+>M55TnY1" K\"#{}CC>xLQ :U^S7-Rޠu;wlmuu?fg?HbFG]G, Z Wu!cNJlmυ O@-I;@SKyGA*)JL)ɡŋiMNC::xTWW{{{w;Oy,뵓e ,Gw_G7_E])h~<3}T_iRYt֧Zc`8qtefc55/|9Gj#hiӧ}q~H`GEєWijM9p\(K$Z =}b~ҪWSZQ{9S⢒I~<{VsdDŽlmm`)ό:wn>"k*yn/hRksw?.eO e#>xG|RKؽ_?߷_qHԪTurwgO6бc^t*mI_60""79ՒLCym@;#zH E-\oo;Yv64ցwTW`!fZik'ț&q;3ç59Ks]sov!CD ̮][y#+<  E*KѐH#GP]HTTnrZ8w/gJym@;Wڼ%Kh+(KMe\%KD{EOO3uBP.](TvlB]0/ܷINiH/m}@f}'.bgif8'$$tbhngp qJ2?K2^;sj+΢|$A@TJD0z,π\ k4ƨY'D 26uvR,>LLygΰޮA~5ãDZwPPȑ=oM ʦdw<] ?v3}6vτpz\{74z/5ԍ?1;xohݸwZNoebyNqRd$8llh1흝qۊԶ_}1h/{lԌ*-m>CB{٘.FDLI1*{1gNaaNygl@,_|3VF-Xн iyIq[G6'I&l'\1޻Niޛ)[7D27uW/mZ)`@,q 5?|C$..Acܿ~Օ>`͚eG$Σgze.!+j~~;cK1c^Sk=# X Vp=+"cc9֞=bxWdt?џ"lөR@!N,xq`*.)\; սD]t*V!WOPOfsReά@Kklۓ+-Zy'oJclύhMMv5MB= OOO3x#LvrαU6Bw#>Kz#b".a%U:w9\==`8jkwĜr$480] ЙBP3b(ܽ3KVSjUPWv^bWk{M!.:GD*CziiXpѢE8}!K!+Y垒ӷdCqnʏ9-YVʲUb^([*KOھ6˿AeؒXn /Ndw\Qg}V YUwV_- >{ 9KlK":;wyM~sEgmْXޤ#WFn9L>z]3C+Y*}^~Xu0~D9C]}$n!BP.ץ7z-Y)*VWҠ2|vӥw7k؋~ٖG 2$X{RUb^*vvv["ԮMNgX安X,֝t:bRbX-oulb^h4ki4W&7jI*P/wj/#-мCwV&LHMM %&&,[ ѓ ָFR)+LwH?Z^nZRR]widryQY+//yfEEEEEEmm-mj4ڱ8pСC;_)N[\\\YYYYYبT*#[[['''_____ߠaÆީ^ U:-=Ayl#I233… >eʔѣG;*%RRRRSS v6-BCCǏ?ydv^ Uz5;ܱcM2ܼ`HUub(@r9;;,\.?VÇ_~bW0b1v @5PYAy!->|]2LB!d;/aw/'pp'[Zo*>' Kރ`b "9kI4JH$pJN,fΜdd~u>veeeݻ7 :8a<7~2 :tٲe#F"L~0a" :ޡ»&-L]3Èqom/ڼ݂*>G4x"\ aQu|_ #g^ K.;w.|,5޽ŋa 0AHKeO<'h&[]ѓlBe{LC`prmޅ=_.= Uz;}j˖-6bX<«R_>?oPP}||h磕JNNj>YaX?ЪZnժU'NL`aaZ=2S:w`xCwz &vʳb[>!.i- e>¸-ީzROGkd0vui'WX1,X' ˀɠCi> z-8 BG@ x6OD; LúMbJܼn]M{&gx}l,@ P4@F2I7BeqG{GaJo<_̾W0Q n p($Æ眜$6"AR*3CaC0v:DL1Bphl}y䑇z{{Frrrg[Ԋ"H;G~@QB3(Fv `Ĉ6lWtRLvcXǛTTQajL"a 0?NӐ7dNyEڵĉ Um CMNҪ.8J]\]N>yQG89;OlT( 332R/;/&;5 `C4u>S8wKϣRcc~XRR_37}!MYSN8yrHpܸ0))%&9׷U``o]0Wfn? } } "5L5e5pLl#0uHʿwGsΓ'O2=˗1EÌbٳmlڵNם>y=?'M@n^tF2`ܹs7tGgNQ0xoi?!Xlْ%Ko~>Aqvv6lݝ0_&gvwŸ^[B?ʊVN 뭷Ba52i d\=uLJÄa-3&ݰ5?S;ɮ.''^H/===}|| `%<6_ ?g/y/̍\+d'y7+`SdWSSs…sUU7[gڴiӦM_P^UUoh`P(8N&Ў-XՖo\\-DRiu ) Q1 Ŷ";[@T*}ugNª)a,(aoo駟zyyu]svX }P/.pQ|s6@(ZF $I'8[X$ԙ'a]!`G8q_o{|yajA^5RS+dW\\BG( O/a؄ /^,gK盟O[oU\\ b L0Kpp k_ϻcBFQco`g+rvs(h KOydЪ?N}R/h`trp$k:d9PJBFD#n=UW[~K$͛7vB#LC"%8ԂtL"a. 4} N.ٳ… !0=,<([ aӦM[|9=C}oL.D=] x?o|gFWo oHT,nP($EBI:R؈L޺``A .)d2GGPGݽCJm߾]`1;Nˣ|0'jRkoW˚Ԧ҆.\@PRkRiPQQ!\]?qJ`j r|Ј!ϟo In8noa.]l9 L!T퇉'_KKvptruuuIZ6m*(( ?0d4XSJ<_ ^^^]laVIsJe2ٗ_~I>;nK7'J*Mf;gc@UHa@!;_Ը*2oahn6cX$ܸyyy111b:JYYY rg߽̭h_ TQ+ih#nغcOq`@RФV$d q)G7tឞ҈)rğvDĎRN_NIr0LׯZlaWaze3E^ĭ"C0>vBʜqڊiVg`8-s?`0(7XMLp`'%dvF`HMMGv5$ѯ͛ q`hTn~_|o84*5n\8`t磚4z p|&M,;y\9;A3 cƌiیV_CC ׶r_cih|$UEpz_ulT  R3E%tus 9Q1cF4b`8(X50JNtrq<\ Ғ}-0I9߽ܪf͞HTqy`0q9p gDYZUrrvf2e : IZ#NNs|$suk; FvoLX :Vw?'Wlo_A-͂CGekf5ֿ𱓷 K\1Dҽ222>CNוz}QNǎ Gr mK_JSY+ 8Nñ'=q;g+Tz''g|_Z Gv$p'>|`8~^x(T 88֫8{xFRH֤%H4*jzСC׈I G_E~W:O;%$LAaCwo=90)Uñ?偃|u&3DϟlXʵ-|;ut(Ӧo+ײ^}///O?%b%gL8|{752z YsU8 19֨1(B$̜4ee{Ã%r<33`sWa2$|]Uurހ 7UðnaԊe BJ%Xv+yv+`d]: $Nըɒt8Ku8ws0tnXvvvF9lO?egglE2;"/s+BN/Z9sd2ڵ 7H ==V_ŏ#A8kG}gX&V&c &-AR|<Hkϭ\{S4t&wwsCs0@dId1(!x= O> ;ч󻷏5FWU(*Y\SXSXy^TX$)/Om;w骅frԩ{:Fy,6>͌ rVOeylW3wE(Z^2,,z$8#Ww$R;{^ZZ\O竀Bu2QMQIR$IM1 o4oùsn߾m,"xL>>U|$z5n쬟 .1hc] \ =ܸ YPi[TTm(WVgP '#t7M(,e> 8! "-6np+d#Lʃ)0=/6gXyiUCBɍ.$HJ^(H"}i13u 6qdƼwq(Hήo0yxz2ڰᴕGq:g4(X&ɖW$AlD6`,301[g&dj o,Sꄁ8n 50eT( aA82jX3ӧ[)~i;4BF-inr_(!|Ϫ% nBO+2`uw5N ]\L0Ía~yoÝՂʲ.SQ)Dg$0 yieZ B]U.+cg`y!WŶ'L@ZGR1iRY1#`k.`N$slCa(DD#cӧOἾJyvvv? :tGCLY82%e߷n!CC $ BH-^!DFfv|JD)g7uU #̴(0f2Lt|މzU&E#(V.Eso$q`Ql6@2=HWV\m`O<,`b7 rvQ"fR4I,s0E@3c!zs/8iThVg6*XqwVްa\f]JBNg`FK/~v8' KBE$: m kS)@YJpN!¹NoT8b` I'D!JH"BM D"6a(HNY` .LL2oOJ8֬e-L6] +il9" kWR]Rinlmc"),[^B37藾 g, RQB` 4*$PW/_X1چүV ǎr/RQzBcqDq!fpc?O{I( t:JEajy~,+6,t LyU }QOR}&///1$#8DT͊!0uƂdE9QFOط_ RQL:d$s]7S/&a{$BPzb',S0($IQF٤"y9Y)tk[J P5x(]r?YCnZF>""H )$rFf5T[c@ 4iR;5)tM`R6=|'DHObFtW/_ 0+i ^!6/Az$L^MK/:o9˞(yzSzc'd~Zc!@l 5o]\\c-ΌZT*%{/ғ$I4"Q^IBAARZjIgg-wtٽ?慌E3f>Cl8<-Tfq`Bë&EQب B/^Hjޤ#FX< oĿXR_8Ȗ( t@AZvۑ$A빬"111.0mZ-ˀ3wd;}Ƞ! 4z:o*R$EZ` Rk*I\&Ty s0%Ce1fo|`*/ʺO}E1ռ`çNtKSLqBMͣ8sBFWRP-׮u'wD=]gR'Ozhac!d飳cll( pB1.~[ѹ|@z:Q]UR6ïQ!tJVؼKb=Q*lhh\X4يNkKHP躑0[ $ą5{ ӟ IMMʪ2 ӵ{miNQL(&2@zRC}\G(J, #~'*"r,h7ۖ+E%nt~ .͛7:(RiRwV0PdBτq{$f9\"HDž*e8$I NO ^O V($~;w ډIIIP ~04~̋i7a so"z !bq61 I17TW$it ",|ڵ|T00aے[}&i-I`D HۻD?@mz{n;oޞ  f0SB hF9hif0 [jD"v!W>P>}롢<Œw_cF3v8 :Fֶ1TA4H:=e;hlRVi5j~=?73iH$/r;mQYYYVVדac`o܋kc#{R4e8IAp!`1D?5bMJUeEB.cBiCןlԩS.\7 L:-gL"+~Ô} < ƥN=z(J$rЪ`!ɽcfa A!ƺ6& bFԤ0 HL^__CRkʊ3H3gv64tʣbP^܆g`0bhip!"ktㅽ8NoPUu5լ[A1wZOЁGsСCϞ=kP5Aa] O4e/3v3$ը = p:2V#Xj0z EcMuu]MAgGTV}-ņ$Ɇ :D 0Ք5ms|۷aҨ0=$ G\8vODsi(f@aز7J$aa#*( &9 ZA3jd?3Ǜ֭sqqs]<k׮d2zf>ȹccuIDAT#)ʈ(FEV2 0=MtS(jkk+ !ԱC-5/88g0ΠWjj*TI@T ]A8{@l:7p@~a0h*J  HZ)*Z.mQW/o xCBB:6)#f.'7dͫ`#ѓ`&|=d q0z^qˠ@_߁gMV&t ARAGZA3(՚ʪ NkF Wv5 Æ lmmUʣ_PVדa#͛`h<)ᔗ@LPzVQʦƦFESBԨQt:--6K~iZVð_|qС~_]pԨQnݪԓP Vw3)ᔓAzO5QDQoVnv+ _v-&058M0'B aCF!%yf[;!hQAS)4j^o0tN TWT)Ƭp?`qDž5kt‡裔=ޮz̎ D -9zL#=B G9Bb+=؃>|Z~0^(BQR)/9ym y{{c7DcǎSN9΍ QWZ>͑dWQ\?@P->ؕ+WB^qL.*hܹɓm<*bsƌwhs l$Y3<-J566~Gm/G 1jȰ>~v("CueErs3 5z-''n S7? O>$++ l_F,ZAv*eS©c 'pGB^n<-vuĉoo/6b԰}%QR)kJK oҶLWXщXxI|g{=%{{ *JP_ۡGލYa0t7tX,7aCD"dgoHOxJNƒC yw^Sߊb;PDV`)j Ö.]J޽J ={?~ǀ7oO|K{L+L&ZB믿;wCƖ:&&f厎poqǶ9`2gΜ;}f֬YK,0r숺qơC222,&:SADDĢEz0X-n߾90lҤI/4h]fS(GIJJ]i>Bڅ ._gq"BCCǏ?iҤ^^E}}}RRRrrryyy;?yiӦ 0nxϒ]OP`Eedddffd ѣGO4iԨQl!ހt[nUUUUTT( JEo,%Opp!Clmm*]0NZ444dggUVV655*8::zzz}ds0yfeeeEEEMMZjN,{yym|ې3SCutV '`kvF+LY +Pϳ' U CO&'*Vkj^3Ǘ_+ ~;& YgJצTܺҘ1nw]Q~xƏi̘t$؞ڹ[x}/+pѢ1On3Əgp744zѢq|ީThu! "e߾ǏWZWѣf ;=T-Ʌ#|0rdO mlGw'!R0 !t1>W^g|Dx 7n<V-EU]Cƍs0@%޾}?Yߒs<YbSt/zߐ!S-3먂l PY:z/?]Gnk'N\3\Q Jsrss[:Yhc}u||Vn}lY}_~ZJ._#GZ$KjB=gK)vMPH|BC',^uF53 9B!u욒ѳf$$;{ÆׯbEA'寏?Nٿgҥe$$ݸAQ{Bi͛Ft)}00"n9 }Z6豾FsG+d55_-_.qu 4IՊllh.#iܤO:{vGlP>}TZvFr\Vd55_._1wR*:{vvl?c:7(huӶNK1~" Vpr}Y*(oe؃i_G;vۛS~rm&.Yb3s \ߐ!wﶱyWo})MS}wp͛]}}{޲K~ZZ͛hpxxUZLߋ7޽'vP)Ӧ st4;g6uٲů.^).'C'LXyȸ2?+nܸ!.kV;Gvyr6]MM>ի9+GQaawjkZsٶ!ޝJp|}1iѢ܋⋭0j£~v0Hnna<s!Je3n(v-|:`ڡC0ownAMa9Z.2"iUPap"2hKj҇2ZjgP+ eE@KUOks\p$MC&/99w7 zdU ޘlSᘺ82O>9[T$4 FGKrwOٷ pJ$de(#cK[y{scb:Dl]t[sr=}}z,Xun誤wvڱ&2m=-VK˰\nA{HR]w/|kח+߿`RtIA/ef iaI-Tm%98蠆==l*iE;:ɓ4mW~>5f&6{Q[HHoo]KkZR]׷5w v6]\v:|5 [0:y{;I@_8M&8 9&v VZFicy>GNөS-/rFŒ? ɛWq~\Q:!DywQ"pu (H ňR 39x_~yf=l~;Y+jJ*fhU۶ݖJO3l ^^aaSMe0D6p&ю>}׮y˝̕PXZWj=Xa|a,/m&ŏ 4:tv}ڀhG7[fQVٺGC cSͫEfq?bs&t_ f}g@}֥z'Q]$<6Umm3Ѧiz@Xl8Z_K"qX1<@/$,)1ĘGTq\xhq*cHvrvPV ɹ+{WNqt;ݭllcyAg0.WVKZ03w;wtaI}QQ`s&-iޖJe2vPPdñ|~Ñ#Ν۶g a|iT5_bʕ^?74h5x n׮fn^2!iӎV^|taZڊM)ln%("ⷎyy>K_f:ιKKkTk.Fc]]&(,̓j4wnQl+v``'>8''xڅ:LvK"p z%/dag䝮.&3ky6mVޓvWOf_ÝMMO $h50E4 jsl_8AG]\d!4tl <A'[JT0;yQT4HT90xbAoD"ѿ qxIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/envelope/images/filtenv.png000066400000000000000000000622341475757676000253000ustar00rootroot00000000000000PNG  IHDRMnq pHYs~tIME"+x!tEXtCommentCreated with GIMPW IDATx]w|Krw$BIH"Mz JGD@@4) HQ**!k \m?voғD7"""̯xD!BktɆxdtroo!BE^~>k6MOlR|@"D!ڱ,"ba.ڹqq OG"DX;ZlZ2炂>}*>"Da z-=}ħ#B";-&!BGFF;'ɤ2tD!B7g&vN&D;'B"2vU.9"Dapuu`D\|ަ M%0_6/vk=z|nȱ?R"*aX3jTrL ykR{{!Bs"DQqHH՝|„ FeK*Zyyy휈څz4h`8٠kϸM(BDqpHK l߾JX*sdnjT.nnЧ`8sɍu~ytj={=|LdKV~hԕ+ZJjoکS#/;{g22NN;7__W.H##4hPWqlALhDY$GG|\Q&ܻp#G&oP!`' U齩 ~0_$ ݹ3a֜2?O@܃sX#}"dѣ]_|QYyE_7~|zl,U{ĉ+Wo݊&TFTQEIhD [{w9NհE DwVd4 q3aPetOhN~!!Q.@FB¶3H T5DŽť ;3yy\~]GD7T {؝'9Q*m3`@EȢ駚BO&IIeҩ{޽f?L||}S?'z7o#E+EX)={j+E,0}e_' *bѺoߑ|ckgw˖N:99Ř7-{;9U۽7r;N\N&)Ŭe% S7O^o~qi 7%eGde@˗U߾u"UTQ2 \:'x=/˗?{˗ðkքu$sppWI۶Uq{R{ @C13vֹÝ8~{cqذ Ed 9M%!}ƺM>dݽgwކJCV iAD.=|,7}=w͞mԢ7+ou94iºb-T*g,.2mWPНӧٽ^AAZ Ygfi5cNnnfgj7;a?hDT$R{`4fPst2q?4&;c9qe>|UlJݡ\.ӊvND]G+.^^lTݥKO[UC;t~:{{[7~d'z] Mg$$N*/OPu0mfBMQ\8NCܡO{wkҸ I1Or>֓t/A]VZN/G&~16rIٳy;vhDq|NZ(w~ o7[{nΤ'O*VјQ$Ys~"=o[tf+l3I 8CׯPo_a-g&.<(4:Ԡ8 $;G5}ށx9Ip{;I֞ƅY]]n7rjuӖ[ц*ωVx6hr4yr@x&;zMx6Ν1׮5nZR(>Mfh?,roi5y~AټG'wwen.9 fAJ!և9u&zu٠A>II))3&Uř-[n?k؍^J&KZwD7IG)Cl+cגNR!>olvͅdΉQ0tcر>]pXpq9s􊔧OST).<_doT zޓׯ=gkS Oo d۵k4IO$r' +WA:#ǎQMQ#;2ct5m7qѧ*\ǵfj\k/&wiIضm[JI`kEP{>{S=z￟DDi me2'wwWOûtiT5yž=|СES?*lVw, ])ʽtĺ_"DQKq;IyPn[? $|:@ViX<џ!BڎI{%Q&wWm $*a}WN6bb֬YTx]џ!B ݑh-;I={>KCG9"DV ăOWO޻{&rW E3)cs<hD!º,K񄪵Tͤ.\P W"D!BD!BrA&U:EO+9"DQR*N+9"DQ+XXN/xΉ!B*T* "DB"D!V@V?juRWcv76҂WdW ىKϟW;UM]CȠJ\DDH,""t(=ۻkufW ىKᆱ:Bŋʽ+\^~>kժ: $&&Ʀeeet:L5Õd!!!AAAR{3{޽gff$i00a0 qDٸq=z6%H={ݻWXXHØaD"ڵ2dD""]ryyymmmƏߦM,>3v111ۧVj5dbEY' ZoݺVKGG۷oߞ_#m۶ʕ+sakk?hР]ֶ'vTA044tnnnV|K..ΰ Tڽ{I&*^ѣs0߿E]vmԨQUκJP9^ _|yԩ7nJ!5 woإd2YǎXȳKHH *~N??={ՋO" w K@Q|`oo?|v7o\neA \N$(P9s|||j N՞?… E$ U+gI] zX AV`x-?zݻw3tCXn6&P.X۶m ָqRG`TT?Tz8pC [^xTX|{7tÇ׬Ο?}vZt]YR X<%Kxxx ̈3gΘNS?mM[A@3 "YrU*ɓ' 6 U7m ^&?ۿ, "αZT*\e,XФIg'NH B@2uwq٣G)S8^mYv4Mϗ/_L'G@x[ꔓa .{^{=zfVm aX K97o3nWL^ {,kj3AV`X-$bϞ=!m{ b''u9;;Wc B.0y xKSGI@BIAU~@:x|6nK8pn޽'O؍ LbP ?ΩʉvlYqGVlCa< ypi+sX">> oZ8:5b©_ (+Lƍ˪k+}ccI0a`icƌ0[V^m^avZ??N7n|8YRguqcMFY)87n|rǫM&'u_nl[|\:w" 4_9Y ݻԩSܦ`n~(Ip<@SVAP9^lYzz:@p v/0w.]Û5nI"PR*RS㢣]\10 VollNNΌ3ʔR۶mM4i&qi4eaa\\lB|[?a.]MfccSٱc&gcchѢЪ_RRٳ]tGz 7?NۿsAa^Uc͚52٩Tyeggaw%rҭH9.͛^ `+OwUߣPk]EXc[ɌK _34; [@f߰w79ӘG9ki}ҥVFnڴi<><#GݧQWg4$s_D-[;wn%l8p1nS͉ŋULOXq479H뾀T|7nDSɓ's>ohnrPK(Һ7rVzO,ML_U,ZD[vp…\C6|ZHЪaZox0iә>02W$IϣG6U}-[\)%b̘1yaXfU6Н۷7_3P׮]g̘QY!ثW_^H$W,v&F tskar$G|ׯol,EQ~!7-շ!t|# 6v lܸʕ+ai39hJfY# 6Uc%KbYy 4i%n _9jh"Y0 g׎5?Tpppp%Klmm+(oVFIQlzkZ޲b ޿w˹?zXC =zt766==}֬Y!>Le{{J߈#&#:07xV ^|yDz裏a Id<{` w>}4m> H8z,>R4o $%%EEET*6J*:::֯_' <<<00HA;'0aJ(/*A0vumAaVpX=pKYm IjtޠIXdaXV{iEQ(BVnIPWDզORJ8Nk~\m,a#CAR$E (A//Fvppqz cϞ= 8?$y޽>}TݨQNxry/>B[hQn/_r~>gbރoeYr^~_~MgLf\;SX+;)mGGG9rd֭'NxABBBvvZ&i P <8wٳgSSSׯaBQ7i]t}|i֭m [[;50={i ^\(:_Qu(̨y㘽^(11I/fΒ~۷/w76Vm"HM09oמlUEj^7swV"9ȥN27g0pS'e?eoorJ//r3fdeeN 34ǧćaآE5kVnv.]ڴilv +?Rd fdd̛7OՂ_2t<VL^%A\x)C5x=zTl:9)J3 `z>濏ݍXsL)HWjtE`8afaHR+ 4`aút.~JqwճgO;;rtgxw7AI춐My<8$Z!=;?-@ Rr Zp׻oKyy wHċ/z\Bq@ϻuX>im۶ql7v>> A۷윗WVܗ_~96Bsa`UNvXnժUܐmж~X1fWAŹq \|yʕׯ_/SP݋pqq t;v?Wf;;SMwao -6c&+a2)z=Bc[׏Q\lp0=A4Hm%heֶvvׯYI^hڴiSVNM(>L@&#MH{~^^& J-4$[~ pH@H DQ x<-''+((|gϞ5R|}رc9v}?_+TQ4)%xEGD^^^۶mDex✜>#`baՓذаRytVxO/[;ڣ/^<{,GpawnXhhsn::,(^ԩS\4jn݊ utto:q|| ~#M"Bm6cOgX`01p S}اO=uUPq@M.0$࣏n]rn7JؑOnwwwIJMlRJ33pGLc xv8it|Zc\]ݶ]l5իZ,nTp\`JDk`trORnXdXU*( .pSqʂD-v|N*3篻Oqh߶G9U*WWϵ>|Vؑ S*]<{_#^ܵyNqEܕ+Wϟw1 IDATS }ttynܸ[ځC0Gal0Y61lZءcKUk )Yzd 7vx+~leA U4Zx =zLe`7&E%]{JOc6A_ɶ 8n 9E2\&6^lRjئ~W%&z-iF^EN֓w*(>6iÄ5ʏX8֠+1.ERba(S$ҏs=cWK _-2>صfg AoذA(IZ Qɱ[nϚ2s/_wc2@׏Vk/riAGq1p\bbPcVox] [rcq ebUc[ ^ܲ4ՔLEn%!@4"B-4kYwO.kcƍ\L֋///3ɥƿ N7W m\^qEGGI|iii\ݓ`.ؽYprkrjZn"APOb#Yf㬛6m:~xGJ7{⥿qè,EbrzbrzZèGZhɛ=߲|ii2Ɇp1  or7I B1@FJҢd*ARMS\Ӌ2ŧksН3jfyت٥'A|JNH? >i*酐pۨIH0L)g}P?ܐ"'6(1_no%ž$Xԓۼy˗K8,i֬{oG͘٥k7__~^a>]u鬃y5栈شiӫ+?### ߆ػ*8$d2B3LrF.Ј'f'@fؑޓ0Ӈ?:AqPtgu"WZ+55aA8 I>1:q5PZI3\S22p1F+_ZZZǹ^sX)Ň*A|/xZϽg[5/le FC8^SɎY{CoemEć$Fe)Q*.rΝROF ހ"Zs | wȁ;6p/̖=4iZ"SެSn9996VjD|PzMn jTpb \pHxQ 7Fz3ľs/9"ƕ3>>3F JSTD|$k o]]&T5a>rAo)Za ) ۅ}{WMXB5SIB7op{ ;m |5<2fC-q&;h4'}xxxZsK*w0۶hzi>-;JKy]ڥ?i58ژ-r/ L,, A']GǍ]@&#sŋ E% vqphuť;LY>v AM!%+ _ YpHhB dcͮ`rskV9# ı$ Kڵ^ߎ tcR23!%[Q6`2@) /rR5tMtv=d1ʵu@]܋/Q}Mz X @E:X&ium*-xCOE1baӷX"py~@ވ#0nPGvfƆ&>0qˢa=nƙ1-Mt,yRR6o߾}ܧN<ćƾ0$&a8RB\=}Y|O>=Z(-7znn1CYX@ 5)))o_?PWA"k kQ._lq\.?pp7mzg Iٜ&8cUd jfν2K^]TTԵk;2عύfH=׼C8 Oa[?'8L\\6Ehs 6vs5 ZV؍4VHk{'#(9Y5Ay0>W]B#`GTNPx!#a(*5zhg#F.z\6_ҕKOO@ԪB0^9EZ h{`C"Y`8:۰qpIwPf ۶mpM^+;[M8t8ǻx? z$6&a3{WUMtXxs7uAJ3XG!, ѥnbB[L|4ʡ>{dWMEɭAqg|Re$R*) E/XK/JKԙ 4 1 5 ~TTch« hƘlY\PAPDTjBb}F_0fifh-fͫYeE6j-3zg^M2N*&x+rMET4CMPG!0m%$nAZJVU2trr~ة{^IM8;427'KC GUll%5E0::R;KYgE dZvwE ʼnH3 cbcJ-AMEKeث9n$Ҕye,Ndht" wR҈U\` ܼР%4 |"HY3nܯ] -RJoCz:M7Kb|%.m->Ъ!H24LK_|\'+uTr]9h=R[V7A>讐M " aة$Ȱ"?B-M"u1xIxwe-RHL&<$R4&tb2-1[00n$ L^ц0b4 .<;^Ś -ACs,,\'ncI 3aO0XhJ->GǰgBihxM099Y51vHyJZR* X,wOJVOy$VaI$0( {ވQEeܠC5*u- CR""6L'Hm"r(xJdޞgG`11p6{oGQ>I`Lcd4%U`P IQIܲ<77;h琷$+E|hJ]8@*<,RqH0hH ð'߳a"5,>ST݄ݹ&LZ)T*S7 $S܂6nO|Nq| spKx ` 0 =f003lѲ͝[7,9HB  #==,qL#yM7 L$.4%kĠ-`"IMΪh;rPVG' Cy:uع şG,23Hϋ.úu[| J_6m[}VO}kyyyCfY+.y7{s7HHO2|{K7`$$Ib9Yy{xt( nyP/TdVNPBc1 3| ڟMKLťram0 cDv...999*g`!(TGаQ# ǐDdcRP L&<+aFWcph`01x')ũo|;wn~(9vNT4]Iw D>d"H~b^"1rK& #2MHG/+`=0E$Ʈ@2c„`zjJI)ܲ;uT|Ʈ)H#Hl8( @*3bL>8vuDOv،0XY1n߼v @Ϣj4HJ M ѡEK'4 "r͍A/rЪ˭7MJ0`w,(ZD2 0 i5t̓G%4%Gda]g}uv3;~;{ k¾=W9I)D=Lf:vEc'L3LW|4G1.CѴkk988p9'Co nl$c{hAP)H1ZIphJv#F>ݽ$l""cQz\h3[dUP\&Fi{;8] %iӦqkA| 2tt[g3,,J[u`DNGqƪFfIP#׵GN]!QRs-v iA LZ#W6;aX]ݽY'& [ad`$ڀL2EӱJORyn޼yih׮J [C'2`̌|Tl "v8vGZUX^Qhq5ŢYRuQ|ƍ`ŃB^_hh(w'ly tqq|Vεnu}эy1`/1zun=zN}ak%1h!)  PZ2u| ϢSS^|8x q[;6C+>^#ӖXַT5!>2Kpӑ4ٿ{2M"ÅrF 1IP4EM)I,.C>uso݇W 9 \iN()`p,.Ui5ZMA~- Nş7UzK6mڴᾟ/웺p|m4R(G^< Z$ι:4CF3@W)]t)%?>J69$GhkO>ȳ? ll]9ٽ~A" rY6x!ϰᣗ}3 LX8fqw`@ˢY\X6resRC@d_n~"C\04Mcf(/ШBc K$GRz!;#(8wDf婎:u*jbQ̞=t[.@=޹vRԓ'^24#Hy_a#)Ife$c4== *% pucD|ߦMO'_׿1Y7|qiÿK1x@uC97ne+jY6nEޠ`,0#4s`Wq{~4yɂs8R`ϴ@'i5~" ({Mj+!];>rztZ6gff 1m6h)b;c[΢W( )I R ="dgpqte!7$g [HlV:fziLqESE4IR$I)rsUj%e$y`oI|ݺuzѣ$>N3s3<?%.>-(ȅ 3:N8^U'|,&ܾYPϮB9o uoN xFWC 5:^Ǿ‚OJy{7rEM]M2sk۶mNOP jE_:RI4E=z4FQIVi0 Jӧ&i5Ah׮]:3`5œ\#i CIɦţ?."TaWT)NKIza񞝜zU&K0m4NjJD'p<`7ðR=`Μ9Cv|kWN^zqݿ,}v0k&h1W`0=}_(ovG^\noN4O^68EcHMtaA>9q z !C5hlXaU3qF`GnՋf(i (cH$Za IDATE$w 7HΠ:NONO*S^&jZYȁ= qϋ{Æ +?޴iS.P 5ݱms& 5$MIҨ% )Zg uRo ʠqϟve fQcǎ-z}J2߸޶Yfe7 vvdG ñ]ŽCP0 Lqp$Xc \dHKi4rd9VLrd=E5ZEso.uk۶mY;iԨ[o#=z8zСPuHRרE",@P\@ NOhΠ5ZFk`KΐRo0 染]pݻwÆ a?3Ő#^v.z~3v+ VV$SA҄1jH V:No ))ɹ9ksiG(]-_@@@Ν!>[(0.`'j0 >}z& !oY$=7Hܪ=\feP'oI+} |x3|-"!x+[c#M> pn @(Ak2S33c5nc'2rHkKvC{wl91F]V)!(A @hD229|C3?}خȑ#'mre aG0XGNnWsf)aЩ suZ- ,A49:NzCNNnbbRYUaO?|[}3⼜Z)> roذaˆ_;š?srkz-wwkذahh(F?4~kWNpttde!?|&p`xx8WׯST!EJ? !?9Ui> (ֺizWLu_y{{sT(Θ &TRxN T*quu~(کwoT^o :: 4ea04 F1 kNA4No/(HW )gh:rhJ~駬3,cStwwR(GOna5z NzƵv;BZ3MC43 T.D} "/==5??("7ee^FXX1 +%pR(/_Vk`Ȑ!lZo7p !@:\gootҲe׭[?aHο+'K0((ǹ и1!9lu lll3TU*]Ni$66NHK +j!p6iF]c,y5jԨ/EP Ν[d uɒ%K.- [Meddt)c߿0>>2!?:ؿc{4-Zh  ^Q+ TJZV** ??//7';';K,t4mwop{4hPqk~>EQ111/@fJWO+^4,ͽ>ZHNQ zA4 ElP (]~A~NnnfF$3~[blW_9::B1`Gr&5h/ ={ pba .,AK^͛7n7lrPcP4kҥKAsy _9o\``ŋM~ Q@`I$+ Y¿%yH=AjԔ$JePܹqؑE~| 4sfdOn:]յ%bɒ%cgv./2l?bԸ>8^`mi>|xɿ~KtR]xƌYYY~"xU>wCbc3zGVb8C4I4]P3ǏqZ?UB,qʚ1c1VO&m۶M&U\|G&^%3c٭Xs\ ۖd ޸qcݺu>AkXRW\ٰaCѽRlŚ M‘CT`'HpHp\"`%ͰaU-((L7 lاћ\a0^t֬Yxe9ùss-_d8p`Z*?=oƭ[T*<=$ܸvI& ^DRu[߹yn{ѢEr=?aP+HK=+Mp~x[A 빹3z?MIlw o۰֍%+СC˗~R^y@|dժUnnn"w}P񅄄Xv]t9wN":,NsPÝ ª .]LLLuM)zbX{xES `J\hBUzzZvvI =u*=͛#\Q{9xRbznٮS׀ _D2 vۑW ^yrwwo-%W)c1cƼaX6o ~P7c Ξ+W^k׮3f(߰\q9{Pqoa,v:N\ ~JRr0UNa6nxʕ:C766##c޼y6b~Ǯ=bf40T&$8-CE:NVJN=ݛ̅4 \˫r, =er> :Bvo+-[^_96 o[]*8FNUde$|,,( +vvQ% 766''GXU ܵ{;7&Z3gNC?رt,ZM\vIIIB.~yƍ ɚST'O.:('IVzA Ⱦnׯ_;ߠ!OJсq  EQ"XE z__tK|lW9`P7SvVXXr ,7ϟs ̘16Q2\5jW&KRNѨ23ݺuO$I{VX5׭[ ve2uU$>//5kU.A͛7h(('I7ozj ȾnR-{?C C;a;7V`CFwC. j? 9s:[~;-bR=ez} ~ѣGWVD8)3g,XprrZn;5ؕ2YEhҤɲe*1͌M ,0/rA!Y_>NVݻuәOݻHX l222rJ98;;O2-Xbc͛7/11:0mڴ8a׾}L!(+cVsOð!CTQٌ޽{O:UpM9 m۶:@lٲo~mӰf5j8tj~^^Vfzҋg1QqbH(T=z:ujCvHJuСW[5j[zR;s̮]GHaaaӧOgWANQQQ˗//O[KV3kFFFV͛Vm<&&fŊs]97>}d;vL?dcWLJСCG2xȑ;wT0]v^ -)6IgNKK 3[nlՃw>{lF%K;;#F <ħ?* b[oM4@V۷_pRN 0/_޿aa-[T]~ʔ);v׭9299ĉ7oh4Vȯ"QS2c={lŊEqrr0`@~U-A|:~xv>;Ʃ]|y͕nkѢE[&vٗ.]:uJcTէOY:[nkSLΘΙ57oތ*НS۷o߶m[;;m"zw}_sѣW^bfffիa5k6e77Ν;k֬)&}Y0w\//`@/^LNNKY~իW<[Isׯ?zh~я>;g8_|t:Fd27$$$00XZڹsK^9iע 4hPNj?M$۷oQ48aD"qpp`o _!Zlٓ'Od={uj M]bbk>|Tx&a 4hѢE.]jA~L$""رc\urgȐ!ݺuZsUL͢2#~-## a\= qۻQF={3kJK $!,"Ȣ [*VQG秵Zu[\:NgԎQV)PE#"&"K $@ ?n̈́E$$?M|=s $F:DEExA]\v}$۷odԵ?yq\@  Jƶ&Mwwwl . ieiiimm.`ff`777YM61׺hj]4m- INopf@@6F閖vvv;nYCu(P΍WA}b4l:*C{^m}A[!a  s >  s >  *@5-{//74o068.Z$lk[FhjJ%}| OegNYXUE|3ѨV==g.Y2U"8b*do5__-6JF#9eei?X&66N3gzO1C[ H%iiW֗B8|ㆭ&j ohAkkIZŋuiwv&\zuq117nHZWroo-u[,d_  ;3ELIwL(FF9>GrYLi\ݻ=bN ܹ;wmzUU]f[\R#7oL E)) ]uc9228lvŋ=b |_Y _M|>'~<9B=Y[9xÅ +7ҥLvEPv9tpx: R[r0K1lKzL R$F EB袔iw݌-[(t ?TXU%M'Lj Ү_//#5""ǏG?yg_+"MR)*X N UXٱ^{-Z$;#ÃBSuNN== WU&%=JM}~6#KP=bi&c\7ct!{yE(tH(|;{r]j] ĝ` !MQjK'@Ynn cag)XuqgϦ\j8ãW*^}ݻjjff5O$DD|69{4RO L!Q/\H{+Gǩ 4+ _g)4pLV٠/2u:>9l…s֬QDR& ~?ǕL[lH>綡xawdi#qr:Yb32?))ydef.ظqÊ%fG'9xyܿ_bΙ3ab]~_ ;;2%;:dG@iU |ѯvMohxoЦг[=g+WVq|9IywJ!;wmQɦXb::ӨKQrH($HγgԊ*/V"8aS'7merJ{-Qcz$7RpgcS.%z&0Rn2PoJ),oFp08BݻwuxdI55:}f-[f6anDPyZAYzH Y-($ehAչ@~BBH4|'&%ܹ#ӄTa^7 FsH+Rn\T*%\;r$ƍ<ۻ%?.\?S656Z٭ V{#Z~,ٵB뉮nHSPzȫ< f{IDATxTcebT]EKW͵ ͌`'2APX3VqTT-ss[8Cmz`^O7Es3+=sxQab"Аay|W|VTDc~:gܸQՊN3fH%<}UЯ<*K/Z_~2̙{33'NfnkrM,,yI|={ dd81T#ֆ={L^@HSTsٷow`&O(+%K {2,*w }}b&;((,:Fm*>o^k &'w>_7 dǎ3Yneݺ% iܲ99OsrJKEγf-޶`L̮g_k~ j`%`fSKKKL i RCr.ڲe׹s 6muqy\33++ߕ+_o}ˑUâ:dXU(%[^N{o áe{XLTWdhnZhkJJ4c2ħ(.ƼoAAV>Ç |8 ˠ! s >  s >  s > !  !  !  ! s Ky8JhX) C}:>>GR)  Шs4 A^D/'B! UT9AD|ܲKf tvuuuuΗvAmd >Η˫A&<(` QW V n%"x'IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/envelope/images/freemode_edit.png000066400000000000000000000431771475757676000264310ustar00rootroot00000000000000PNG  IHDR *iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|NfO3͙Dťm}6,21#+Aiݺ>zN>5zz7pw2|iy{߈JJV]o}:8`5^Zl]Z~?+{k`O;] k4qUQ{L=|jh£ju+)5[:z7fȩSF~eԝ /ت.OϹŹ1& yNa:CDJV-\/HA=\\ff ׫sْ gkY;X47lU=mOj¢ju[?w Ôˏl|3*F<lgm1eT m?pQ%Me쐛Ѧ&nc 󔖐e9_^dҷ+ODZܥ}~AqBJ֙A q>՝s `;[{#";+*{$LMD~X8|9#i=*zX|~83B=\A~8?*{?qx"ڵ-{qDgͻ֖fDtey4u|mBo YQqi;ߎH/(2ܮŴ]LM\]yh>%PZY:-M ?X^do[Y_n]U6~ 6 Vwy_jExtrRjumbP/Dt?ڵ ú<]P\~/6mt|zAaG?ۧk떮 Ft((TPP{ !䬘t"ӗaA({[_X?u9yFJ>O*K2 -` ?T-N(˴V9%=WD!ws*@8q|T~>_Rtx9Ӈyåqgwoea:}_}0jPa}[ Y9Zh.^GIDsFZ˯wPZ|ò\Jyo_أʇpR7`YQi']l㒲>b~8^gHɋa'/Iÿxgt-5WV޻KôW1LƜ..m Yo]:pv5hVM`UOݳgubʘUHtӸ%rYvLե둽[hVs<˲NKOvB(+!9cGki*WG[1pܣ&;(;҈ 4Ѥ|٦6ax g{/ܙL"E֥kOMt_GǶ0dhX@9:tW~)a?|fXBVN9Cgħ r6ҡnxvI9'.QVN4>u>.)kދDdnfңcKax^(K_+9WHۡքZkm"rLD;\yw@c8ג0gHL,;”e9iԌ/ո:]jz]Z{p؊V:ڕz~[/M+lckmWPr/*9:>ݣ}DLjlb4gwW;{;ܢw^۹m3"/?mla}( 0p6p})4T}]"jߺH5޺t6~ɫ&v%߽4 8MHzth%OkQzE]9}Fk?Lz*4uw6h@VNKzJ_ZC2_?~!|=TQ~ =f1'Id Sq>Ͻ:mgy^mG#˘ic ϲ4~N~%q*:x'b^)-(NnВ;ѡ=M,ݰ%-Xi;أc!h]))U(TjX5etܴ?WvTZe(*5'5jYdan KKf5ceWsg 7d$6-xzw^E֥kOMx+tJ]!K?π1R%Ck2+(&!3158?T&cMJ[Kf}=9J0ĈԬܢqqo|h6ZFnqG,)\!母{5,eL\}=?J)d9ɶk`:ӾܙC K/,VYz{8VjiLyjD:42 {_GC&eGg4ڳ=.ymrD:t8|gewsWv?v><3Ii5_sע£Seyzuy"yiTn'Jsn:͡Gχ=M+,ڵnңGeoٹw´c*v5@M ODRLpP4tIi߯=)”uF4 _@D_dACj Bv#<{Y9E ZtkMaѸVGCCGAVXTU`tw8̏!tX"{4aJC.?y੸~ujFG5QT)hxRV# -^zV_|0ӭ24D@4@4DC)?=dԢ'NyU0"BeJ; Рj&(xг7|@4"AX@4oRM I3VʤhR tBL IAY8ء8hШ; #<- ٺn}lqBŔK8:ҲeC*efҹsԩSMѲbYJKÇK̩wO?KgK//>u*mN CdiIFQ~OsIp0y{Si)ݹC\硋&O&"JHcǨܡ_ݯnYYJEM)5mJDVS\\uׯvx +Xt`fO14|ENh߼yكԲ))DDdeݱLDDÇGᅮLFiˋ&M""Zf"ww{W;:>Aߦ4&TPVݛniNڸQwrȣDyy">ڴv"9st,ˈ&&ɓ:F8{é.EN+G@RA.c LJh*( G'=q.jz:TDDwPi) loI4h5iۖڶ%'[[=QDy򤂲 0 77'++*+(deE2ݹCeaE.'WW8ر g͢Ç*.j5=KDKr9QDDX""33KQ쁩i&*mJDѶm0BGs D))MO|S6=< R_JEt]B ׍={졫WηբTҝ;FLFDtIcI*(۶ /իdcCGM}.Qp0 HAAԢyy4p`abLORh:so1\Nۓ/,kѡC>)-^)XgCEA+TH4@=9q֐inmx#@4@@@4؛ 1& !\6 (&PE3# D@@FM0h"MPPD.0hP〢%Dڄ@@#&(h(h Ѥj8-|h&(&5@@)  &џVx *( &X =^AR j*Ơn&0f@cL':u==PO!@/k7ê zs!&U@4xڴ~%0]0tҘu{T<:{R<0c.hƕN[@hˆ<4 &FP[:A4h01ڏ&lI)%űN'hY (& ,A ( 4 <ډ&l8I+jwa@i@:+y@A4h,AOj!aP÷qTM]:1 @# (ƙN47H'PP5h'&(FNM:w(Dg)CUx,":Gt m)ُy!~A"$Eth @_බI:F# $"&"o+~%DM'ZY  $ "jAEth с/p&_DT\LAA,-e|Re+^㴞2d::lvoث'Kb~8qinEjٓ0M ~Cm`\P5D] 8P]5jRc -Шeş/喖}m֬YmVppghڿpp0E G5U8e$x7nܸq^/t?~xZZ@4iA#葝hϧ՞P_{nL6q%.S6׵F.))Yvm6mƌ3gΜ:u#P[| WX{!4\ҥk~x4E{VUΆCבNǞ={BBBr:ST%L4O1I9UDD'MԱcGa>khs5ӳM_.] 9= beh{B=XfMl||ďM!Lh܀}('(ʜ۷o\tFx T۷- &PkJJJp(E{+Gs4ػwol||o3<~po9RT*^cƎ׮^a߾}樝 &_NvڳgD= .knkk{zXg4Aݟ Xx\f[[[4;r 8#"wݴiZ9AzΙB-Dj] _Nvʕϝ:uP?bbt|!Ae׏ضm yzk׮M!"?Z2}RWnDWXVs C-;HXZ) {eɏ 3XKKK<o4泫՟H>gP51_rg.X@k45kJJ/g 4H ={kA T+~9lٲwfff*֭[O:?V(*j^u/ݷoZ&<%տ@[(1ra(:dMxuAx^H.4WZka˯m8ÈںGpS.=|VFheeiӞ?/ 7uNۿ5SQɓC /_ljjXK^N)5pxu-͋A64ul M]+?jԨ'N$''T7oΟ?߯l{] =Qmb98vD[(1rLRBPe L.R6;e{tɿ[%{5eYU9ek[׭/4^ r-[6!3p*gRRRbnn p\;;;|=.^ب6ܣ{7޹n;_{,/6iEg>1pȧ\(f0;ztd/'s=cj2dΪΝ;KKKwnggwٳg }AjRյpL"GMu"+(.F&c r/2Ac0fŵ˳־4--M%D~ɒ%K,6O?Ez;W;;iӦMj%}>}zر'NXYYi-@bb _^ZZ1ydnUV[YY 6}ZW$O [Z^8~iE.֧}IeՙOZ3>XةG?_֭{nqqSǎ?dcǎ>|\RݯF'OϚ5~S=ef톄!~H\ޢE3fL:u>>>*)q0/JʓKd2FL'2#2@ 0 OD@,gpnM[.jYȚ7H_oCd^z ќܐ%yndgӤ˺s3[ֶIW6\Noӡ[bldIq /LզfٴtI&M8ӥRܴp adT/ӉDdbb"A`""A.pvȑxȚ5VZQv54m={vwTfٲ?ƎP+"yU'~A,CjyΝ;7mT:O>Dtƍ*}tD6((N8ѯ_?J˗;t =~bqV.]bȑ# _Χ.7;NŞGQρχ;VQFjbT͉kjfncg?+^QρmD۱3Iݘ4} +k+ n̊2FC>YFSwt%‚̴!gA05Ǯ/5dGk(MT*[ljժ3ghG+'$[~8p֭[  xzz?ټys\Rϲ詚d2;;;|r=uc¸:99-ZիbX C .ܶm}ʕ+7lPb\47֎eR50$c\"b2#;t4زaڊXKKiΚ xoegg EIqlT|26. %}!GaJҽ{Gr@ecc㭭-۶|94/ѶQPP7=ڷo0d:o~kͲljjjjjV \> EO<ٳg؊7Q={(~KIIm͛it֯k/"wmk]<8`dvf]YursT6";㣯#Jǜ4\nZ6xwԚڦdS3"*).^8egmfz20/=ejf辜ch _ٳsΘR9uT4/{"B888XYYVq!1S5!88x)))?ZUSS˗ܹsʕ)))|ΑǏ_˒&ԌEyVj8!F$L&rYZX岲 /PX3=ou1%"'LkeZٗ۠y\.6'1?7wgÆjuӦMh޼IAA!mڴg<>+nMAЙѪO#*ޢW^/hEСCK _faH$OA >{N 0ѹ’sW8{Gr2Ӕ.DDDcÎm2ݩ]9٥i9}kRNNnzFkMmcc3}ӧT'O.]I&n_|Kzzz+~uV]0C ٺu+q111:sM *~ \x??ʽêζfA\3NO! |Ӽ7,l|ZZ{21=oٴb/1m;uj5~6b蘗^~6vgNo׶hUV}/o~n]붝; КqѐY5? ԬY3ARSS+}||.]q_%ڡCSSSR0x֗p焏vDw޽{ٳg7iҤTKRRR߁>|XꫲOLLٹ{ yrz޻{ۭISԜ 'CT޳##L:,DIs'W4%+a˾/ h O-j4kla95Qս{v8ݹs;sssBڴ`V,w8١ȑSZ01Qԩ.}32_1F:J$iӦ]zo2dZ~ٳg/^يClpܹsǍgggwԩ$W^yܹs~ĉŋmll \Χɾ2G<{ix>rq*^Mő?7E&&v{mQ糟hѢj.*;?Ҷm\v%ji&x]ܱx޽_k439tU;;qㆍ=mm{]vi>[|C&lh__NegU7O?ܼys۶m?|y[5kܼy޽{Kc iֻwckG4^4&`f+ZRIDAT[gn{aF$OP"}kھ}K{0[Ǝȷ%ywv^Bʆ33c9^r*5#cx^P؜|;YѺe *%z.,;wnaaa``t2x[966_~e6m6olbbs.\hڴ)>z& ^v/Gs/!crM<=ў入rMdanEڥ~Ʉ vv|c9m{nݰrȱ=z*UQa\abjjnbj"Y---)(((,,ywzȅ lѵU/1L\dddbb?52?m59hP "^ivD{V(7Fw5[Suvm˄<ѱ3pJ*,y9CIfzgd)Sp ?G\ZZλΛ7o ,rpXbL '}~f& ؈nM q2)((h^hZHׯ7=WfB夘QylӤis K+Ss‚80& 5v(ڳW;lܸ1,,L3%?S/BşT1x7oooww3fP(ߺukhhh.]kZbECX̳5N'&qО>}wU֥cƌyŸyc2 `UV˂ ݻb41773f̖-[Mj 0JrˢW?,-h@}zt\Vyy&.(/>VTM1cƌ3&<<ƍEEERE.[ZZjժo߾HPM<___:Mt`J}jqn`jп{['y7uzox:'dX59}gjkyo@Q~kFݯcIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/envelope/images/freqenv.png000066400000000000000000000676111475757676000253030ustar00rootroot00000000000000PNG  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ɺ fbKGD pHYs~tIME 4ftEXtCommentCreated with GIMPW IDATx]w`f6n*%F !'>QOTgYN袔@{v7[glK u̷sˀ{NY /&$` QwUtݛ B={Mss): @ 4;Mh$''@h>@p!9 BCyY@񐗗"@ ҇H45  A f$ zL}DSe˖𧇎@ ԇH4 n+]N6 ̞d{6Մ H4MPT_~Fޛ8QzxxBZ'nEINw^Ǩ#i:ٷ0h"kWV 4 j;]˗#<"tCwa5xg.g<͙#͘ٿ]\fks8p|fggCDshӡ{L8iٽ/B_^_??hn&L@l XD:nEawUcޘ1RnR\b"T˖aKz=;#a=QxuOଣm"LFדp"D \{qI۳Νò_FSʊ \:yNġ5kguTbCk g7vT6ˠЗiӐuvDxuji8&'%_~EYY9F B ~;I@tj6E2ɓY Ǐ/qc6v j uR":uB'ņB޽ 'MBS<" G޽1c %>5FQzYeKt4␗ޥK1s*|Ħ￯P ?- G֯ 25Muvg\ <??hBi~=ƿ㳒|K,nldgKۂZFqobtQdd L.-[;xVjCH69dbaJJԺ6ovDj|ԐWch_D>&ڂ m_o Vyii]˗+Dę31!4۸lyʕV`8/Z Ʉe/Ç}JU˵CnÔ߆]K.U\\!ڴoG-BTlYQV 23#Nő!A_ę3/#9i{x 0p$I4<۶IAY~>dޣG?8d… 0 zr"AF0xEA DPVڷ/#%qv>ТpG({9)wWƸ瞫uuvgp9E˄ `XG\?T m:t@ΝClst'dQ&a0pҤԔ܂6Iزlj<7֔HФngDUs3y X+^X6Tp11}#cb0ǡ^3"vUDAX u:rܝa|s{ԩ8?-t=8uOھUyVj0,c7ΟG~F£q\vO蒐@ĮZ  yN&B+EjVv f/CLЕ+ޮ=X#] _?WlWFQx#"Sҵ}VjÀcR)t|&3)){(SjQJkʑh"M!7eYfxw^2<\ܔtS.wn uUGRrC\{]` ,͕=It8ZǏ:?jd_u| m EaÚ*" CrѮ'.,Ю-|`dq"KgB|0X=Gn IXz89[l FiM4WLZBrTce|9j(>9f>C/=*Ll mk{y.)>+rt96aE2[ n1`t'䑤\ӺqH6 Saݐ<'FwĠ-??b>aX;Uio,ま\o|N5FÇW땚JƱ "MUƭ>۶8 JJs [BWZ* ,|p}CHh(J?zrRa`âEadqkaׯ>ҌBym VwFl3YyX8Aj0Ʒe+8^`r[Rhwg1"P@hh'?\1Jr2\|k3RSѥ 5K//G_A_VSK^ òiq(˃ U:\{])8wrSS*Ef4Ϻg6*ۯ_\ӊG[k^llko@M@hvXtD 5\DS`)5>_lb"bk}7Q\T>jsh'i4edR @0h5g:<b]iHL9E,؞UkiEnI4z8D@ T7oFyArRS-G<`+D V1]Ox^oׅt! $A?X ;1zBx}ZI^EA^e#.6~롇ry^m!&@PeDzӧCK v9އȤ@@ 9Ow+zF^C1mG/xoe,9K?"D@ 31s~ mچ&T`ȫ0#)+w]ײeΞc&@ \Xu/p8ض52վWLr}C>>&Ǜ/j>!ꁊ[N8vYէ -3?qaj~*N(D :㱕6@QAQxbPff>R?.^F g,M D kZ!gc1bY@?F'mƌ8q"=X$p-Bod,uG`Xז-}M8uE a_DD@ o\(/]=^$@hؽ{7@@ I D B?ju@@ fF"d2$@h^PՍijH4Pg7z ϑh"`04z`0h4$R}sbc8vVg,xٳa0IIInkڳg"￟c#! >Ϲ@-ތ{}CGď{|ݫvngҔ$ddd4TW0#ߓh6EHIIANNrrrPPP(-hOh4 CTTh0 sMvgz=Ν;˗/KiZzF0 Z It qD@ DMr#n2pQ$%%ܹsޠ ǣ߿?QwvrطoN: |eY;wFBB f#jg&M״hLlٲvbo;6{OZ4 qơcǎƨ98qr0vX 8*8jsĪNq@E)PwpD@@&OKKڵkq  뾆u[k3 I&!&&uسg֯_F9wxx8&LÇ7iaP%G 0> D&M\4 Vʕ+{ngU@H)u5jqИˍQ0e7)n… Xt)233utӧOG\\\sx^9\i1k#jg&M\4 ÇtRhZgE@Dǚ}i-x0pnX,|رc1 4VCa;> |}}6GQGg/>S{SyH4h/P[ܹӱpwT@[ d%A_kjXx1Ο?SJF~\,^1}7(xME/7o'n݊d DTJUqz9 i<0n*Kj9vF MxF}FƱ> #|p% `ˏ〶A;&&:BBBՠ9:w>CLaw/-DI.\"003gD|||;<< k@ؿ 'I0 4hjVn 1|boA=q?A@A >'bb"];CR8Zdg#--Νj4sm۶b=z| ,sⰜ{7pmp8qq銐-t(/Gjj RSRpH<‚_/f̘Fsxn9#pSf+)X t4GM$h<[(..7biGvg!];L^L_ֽ{ϟ|<֮Y5W!/f1x뭷֠GZ.qY)#4>3^0Х`UGc_ۺ5,W^A߾}H, 0ty\Q;#H4hFDSEEΝ0>@=!gFO#[7>uO=Zm|"`Ɉ̟?!!! b̙3xIPf{ _S'B֭Z/]PVc֬Yٳg9<-=I pO߽8vp23$H4h"Tkły!nt&<!_lhxxڣbĥh-b`X ֱ7o|}}(_u1,ܹ p8{ޞ.""# @dg_su˦j JUOz;yl 8#jgWG$"DP/nt,Y☽sb2!u?` z)"t^&σ,B_v#>cGT~n6L>^ ͝;bӢ @N<4W⃏c{~/ 4aX`pmSY j__hB8~e٨FDsX`|||D88bWܮ_h8vְb)''gϞEFFrssQXXN'UQh4 B۶mh Nb&M$4<ŋC9X :8O=7=z9GZ&K1^.,4 ҀejocŲU~ѿz1v-[۷>K:<ڴUk׭{~xe(Vh@dADEHW.^Hƣ=ܪg~xGIC{ЮeuKػw/>Z}_hh( ÇSN$H4h"iZ bA `Ax>0vyog+ J( g˸:;8;=A|j rex7_(p| W~7xo2:P LI@lvXzڵs+ J(Ё%v#e"PV!ڙlLHKMޘGzh]?+9*)؎kőSD9qD~Ē 8y$֭['{ABB4  QӦMwFCPP5o⇳9_0yx?ϻ|//2La X0`l:zkW.G35{ۿ&:x^W~~H:t뽙L&TVVoFpI 5?DYYhA o6eJ\-B,'o/Gɂ ,W(00#Fƶ[zz:Faj͏[!rCGYXصe|||ЩsfLiiiqZG_hnݺA ш}1QwDA#-- w ;EÚ/_>3y>7htE:pC!XHI>?l3 X;0(SX ?^ڵK̭?+w -ZAp%WK"?iɣ0L`b\y1Jae:p g{ ,F_ ػw^녣GfmrperP^V ՂC^l8vV7dϕ[lfϞ(ڀHMMٳb X,:M)`͚5bW ]'0pf};.])j(#(,àX# ]-32pᇏGG]j𼀌"k+%nߍoZ+c>s"OP`e/%7.QAт2=tÜ7o8Nϒ={v#戕EYkQA~YmTvv6fϞ۷W9\X/3g( '8y殇1>z)T*!)/Ȣ& U)+^PTa h0X#ycǎ!++СC gّ ,{w2LdچD^gNI\у{NPebp0 ,Vi֔;F{ϼ<>|V-G爕׌#g2 ZQ[Z\,8vV7s"33FǫT*tbQ1rN]8 3g.^H‰@z2mٲE칩|)N91[x+Sb6+CV+zȌ0`P3b6SV[ܼys4,30|rw烷Yr\vAL 8^;tVgfFOr8 eřP{%F r|6 q8,֡msDnԩS?~ 7oåH:~ 7n_`/k~$?K! IDATaVjWTtxwp)NM#L&7E|b0)dx!v;zʆuxJdC)>|&JKL~Jtzv\'zٕiũ;njY^Þ][<5IȇXXET~hV榄=>/^X(#ط9;uaU45N0]p-I8ŝw`xW/?S#<5[w; ,V[.ZHG‰@:ѣGa07w>xhPp3^x%]PRِ3+p[v l`0Y+ `4ɪǏ޷o2NV3'T|q=0̎-3^zzczz:~G6H4]p$WMq2IʙNǣ\g|Rɜ+SGy8 s{j5s99uw",, (>.ۜ~ c$Ȩ UzX/3_`X98oB+<9Rpi K̑RSeqDfHMMpUhkX9\/EjVʴ%wXie udd#fۚ}1r4A, ۷ooT&)qzSn<}ޣ"]% d~biL;4Gb!$UF46#9eYrk|/S?01qL[)iFksH* wݣ$)g't6`@л^~U]8jSgY0h9rDfQ&Al2Q*J/Y"+t\G?+{>3ˠ4xpps_|J>`YG È xBea#(gد3M-˩ G-bM>(rF`Sm펻 sn}8@F^X{)G΋+#a\؞E "R'}(: bFơ?AIx5x:j聡Gb}aԩJIANllmΝ>,xMgcT5"R5̘V+(WNL(XaG[a=txÃa{1WWb}DS`0? @qnC#`CUƾM0 5oߵ} n7މED'~89:QH5jG*+wApe3t8vV=s w5 393ͤj g>A&ɽksPP0xyl -[#O={!Kkۦ;Uh,EMxSZ4 t: "(++F/0,la~Ɲ$PD 6A>%wiEW)uDb()GV$lu>7#3ϰ3I`𐡊JvbB`b5ZccB`m + ,bH ?Xz D hJ wY6 */7={JƊg nH;\1]cə#!N'oL=g*NQaAVZv6,\:;giflA[0]<$Y- ~r^_˖-kI]'U R-+'T*xMy F3x :<Πbϡ>&m‰s.& ebԉvݺaXN @ZzB=6A؆ RS/*qlI '챚ac]r䫭;:wa+hQ d_ªQDm٬T冎b2%5EqnJQw0No$$U(bV% ;\cMkr=GG:w'U n?o߾|||P&9P2rn ]2KxšW%<RxZ H45H?hq!Kw~1' k8/Ve!KuY`1r-xdy﨨js${6D-Bq1$g>*ó C4Nk³z:Vs$R+:uɶs.ڵkWH(']h 9vV5<-XHl$Es4u^w8v / sTkn"VASΞuZΧ{!H45S%f6F # W%i 9:ÎuDfQMX]6\n%gT&rg1o`ֱcGGN)w7ǒ|iVj'E < ƥgٓv&GމѠWD1Ïpሳʝ n9vU\*88DQ8s*AQ]sKϱ/p4T\*]$QȂsFMk\DSG\\. .$;V8yC.MY I`/#^q7eɛ<  9PVrq HqK h&@{MNnyE/\XA*gHPaΕ CXXa{1!Rga q숌Tܹ{o4zLyGC؄99>w뱹4tyJଜڷԸ䀂CNi@x]sDjxhYqbu UW4dH '6{΅ك@ Ԍa3HLL?0ە;c.Q4r oC gc.j7fYe%^GC[~P0l;b_y9A{iAPԹQr%8EE>QQ p+ǣP"nm߲e!Wg':xj#Avi L#jg{Zbf'<XyX89};+ "Lf s&Wy'Nt 25N瀾ï[yFTTBCCnKKMߧOD Abl mp_p>[OIŎB1K9\6/^8ܜ+nm۶ k7t=b>x^p%5'0-gjEprVNWޣ5[86mhFLˊ -d`08m5?}KN4!s1#FB-Yb &s^}Na2Ul8 *EHLfJzrpd0p%+ ~JKW9CiH=GoJƐGΪƠAt Gx_}en{8q[7K00wY,94'/3woW;3#jٲEh"n|;nX.E8O j~ 4 XJSkXz=:-t:82W_ٵa/K5rłs"==]rzg`8q5_Βj5f͵RU, xV F<ǹp-G=U7٣χO]9bV98Zȑmq#jg޹9q.\qC>PO * >*|T^[=zid //ee%Y\glk={6z(Q&sT_hҲ25b{MMS4e˰}-?1`'?|$9=o 3uhOR*yb1b6,*7PR\_}opBi[}&YmxgFZZ}X,ĀA(O0*R%K*X\Ų`qjaچ2-Vfdg_A^'%^泏 < ,Sg#qޏף ?#$$]?~}G4B\x ބ HpGc-W^7'Ybn<4V@[{cYQ4f P^V ɨKpQSX,2n8<Íe"D DE7t ZƠ!#8h:t\##.2q,%t xwЦMFG'|հzBpHnBXx$CTVaԣ /9Wp).? N[s^hDQ;kNʉNy 8,񅏏/T*XVe[jhdT s6;68$;wƂ $MDf"Gnnn'EKtVCepVq˒"JV&.? mEyծ];̞=m۶mtQp9|M k֠Cr$77gϮy5ӟz]bbGx{o7b 2.bK,XA $H453$7^Xp# "66fBppUyyyO<&^-_V_Ɲ8vVNRRRo9qޜ~p⩆b)="vn:59oobmOD&M eX?`۶mMǎSJ^MQ`X?b۶mUo( cGɩShѢ*Qo-&t__bb6##=ΝIͮjKHHH DD&,)) K,V'|k2KC^tלD.]#&&vYMx"}t6mѢe+5рXc֬Ya"DDS N?]v]H0[ 00Ɋglذֹ*5Edd$&NaÆI6ENQ;)Xx1222I4H45#$7`5kbAbb"&ON:I7U%qzatcƌ5ҚQ'Մł~ [nm4!R0vX<MbDDS3MzVV6mڄ#G՟0`ƍ:4y'q)ըv!ҥ K3x7򑞞K6x|\\O.-DLbD&Mff3;#GٳuF^п~~~RxΝ˗hZzbEfF@]vBǎf+#jgũSn:\p^ѭ[7L4IJ&DDuv 33)))Avv6 `4a4QYYhl#** QQQCǎ|kh]mG˗/c޽8|0j}m۶1tPtؑ&M$û VM8qD<ٳDNN `iQQQFϞ=qݷ3M&| gcS~=*2`HDFFҳF h"G է$D D Q,Q@ @@ D@ &@ M@ $@ H4@ \:Mָq(CPVxk|O0gp˱AYxK}9䟥w'NDAF3/[F^0xpt5hv+W" CC*"]A-s׼ }!!,bщgŮ+ ^x_ٵ+=MWII(JKqv^8j9{u |x|e+7D"U+AE~FNN~|늣G}e|u@;wHt%%H?}i'O#xoҔۍ9))X+܂m-ZгJ  CyA6l D cx7zޠyg=f Za08;}L+Wtf3¢1x.\.X ٿbۻv!$4I 6:!7%ڒ랣Tڙz[ PD#t|f^^V3طjN /_o }{=#N:0τIǁիqzndd3Ҷ-:ǣAnԎIMò3*9WUoUo ;0v56Pm@ @r<ǏqdÆ htd8w'Ah!>^2G!w邎={B ڱލi~;gv\HJ’3`5..Q(+(/#*1's21cPT^S)l0[&jGSig)ǎo_1M6~)Xa˗!<$'_>4 /_F`Գ'|p9lk0ip!*+q;?n˖g4PAetctb0G@,D"SL\٧Geyiih볭7~ gۼ~?0?8s}}T["-Nէe^,Z5k 65!?#lr<@Rcprhq ڊ+] ~ ļ~xqر]N@ =PD)?gڝ;1h蘹))(*8GG} z[ʄ Lo ˵Zg8ͲJi2>sEַ%x;5۶ z$ѣlW4"B-G,Fg{;UN͜Tܼ{uuܑJU -f§R}O#->ב[Wj lK>F2i3R읝vl,J%䧧CzJP] IF$Xv-ּ_OBI6 NnnKKCDY^^>f~zzw zN shoi3jg8ͲJLƵDK}=OoɳgYo!Y,^z EX>?@s'imMMFJ#jf왡YEEEloǷ;wb7`Ӡe 1f<9Ι^cu ׸v1 -[6h^$~Հhְ0q4c&NTM4j:˕ F&гн&|brcM ɓ%M`;q"nK$(/( Cz:lƎl>/Hp4:fx6:1f Hڷ)k[[b[XܿKTonߎwSC`1v<9௻wcOd$nK$z&$rE?z vW# сou4 (ZJ$r%FÉ!3 q[") ~5g1$:f1%7n -.϶ld|")A 5jʔ=#s}g?֭g`<\9#(H#0..JCxoեH=vL21/ ΨJʗhmnFY_9 TVs#P% Z񁵭mlҥ[׮!G,q?PܺzUy[;'<Ǐ 3y<ȺPS33, x!LdmڅC7O?/'ObҌBaV|9316a)f嬎R]ߌK/!y~;tU %Pd]]))`?}:ll\W;R)ZZ+^~5m\SSlػ16څ 3azԖJ*c-S㛘o7"[,Ưp w+*p;?驿#pUbOEBp{xS33Z/&.AA0vQfLqϐzj*Jx).s,YGⱥKQ[Vܔ۱ZsU_ySSq \:qz]}##a3nj˕ %v=[n^ݷK#"₆j\[0fxG|#&!*.kmdWW).ƵQ^X5^|;9a[BVn܈>¬,\OMECu5ܖ/NJ!.IFSVid RSSq尷-BDDn]>^ DDDDĤI&""""&MDDDDL41i"""""&MDDDDL41i""""bDDDDĤI1i""""҄C`""KK  0iKB ""&e閖,tDDdI. B4!xI.YD1i"""&L FLt"q.aԩ TIb3DDdP{{C00iu!?ƤM5IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/files/000077500000000000000000000000001475757676000211345ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/files/style.css000066400000000000000000000023741475757676000230140ustar00rootroot00000000000000body { 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.3.3/doc/yoshimi_user_guide/files/yoshimi_user_guide_version000066400000000000000000000000071475757676000265150ustar00rootroot000000000000002.3.3.3yoshimi-2.3.3.3/doc/yoshimi_user_guide/filter/000077500000000000000000000000001475757676000213175ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/filter/filter.html000066400000000000000000000145771475757676000235100ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/filter/images/000077500000000000000000000000001475757676000225645ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/filter/images/filter.png000066400000000000000000000771321475757676000245710ustar00rootroot00000000000000PNG  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]w\ћ 6Tl{oA1ͨ1clbآc]c`ł(MUػݽ7ޖ̛7"<<q|׮֭[FU@xx3𳙙>>>Xc`````TbVغ>Z[10**ޕ+o=100-\_ul^f&s$ֈ^F1C>|fd?2^OnߎsUBBNZ\"Ko@@a7}JQ_=x#G?mִ]2$UϞ2I'ٵٳyNw>y2TvxzL"i׷?E3 ;;ȑ'љ)) ϯy}ƌqfn4{˗efNhӆ9qnÇ6Y˳ QTŋϿ|LjΎ..ի$$ivJc`-QCa/6)Q87wxmr8/Os{L]*KRt ~ar*ҟƍK5욘u׮-ܹ3?.TT/_ޱqTԂ]l|n"~Ӫ̙B4%>>%>}c,*fQdfEQ:MIڕ!#99&"Ap={p5ƨ(yq tO}{l|''P*4g(7d/_T?s{8?+kܹ\΀֠3{j oPTۗ.-@95]7IttqȘx,( ;ʡCOnfe/0>mРq۶mz] jw\,UaaCaӦM_6m?UZ9i~~'LLE\4jݺђc7 ҭgOtY_ϤqgrK$׮y$}UZ;:~pY.wKn vdRpru-CfhC&N ⼼G"#_5kq  ":o!}$\0nݿ_‹N_,g$7gVڵ/l3{H NtmzR($ VKU~"I,'I =Ftrssrs{o碴Z]g6n xxѣu2c`-G1fq<}|'yYY*QT J z7eKI6kWFp/u6VcSiM*3)p11ũۢ(fNÆoݦ9s5ݠZzy?d[/X`߀8FGiͻwJ Ա'[>s,0¯Q"zE99ɂׯ .-'k6z~8/B^%$0Wm;ohQΏ:6kq z8;9`ZWOm:8;@)yT[<}},nn1aNK.34E*%k6=<-[]M&ܿzҤ```-Q]/^ϟg};3R{jFݖ/dK%j\O[Bɚ.plلŋӞ?LIMOO~8&"kǎ}`l(3J3 jD4$ѵZQd%k91REEQTתϵuL-7(<^&M:0Ͽn 4\]1*{,s"άj3fY }[B?l%4-S(Eƨ;/x}o??Qn+W~ڒ=F7 СG>֖lig̘v}^;v,>::ŋBj׮ԡCp.vئ]^ZdKFQjի/˓ ;{{w_nÇ7jU 1>,ƨ j9vvMR4IԩaS}dݥKo# f{֮]A}KHpþ֍o&O.R%rt\XXc````hWԖ^%~-it#B]V0Ŗ k@}w)\\|󅤠P$i+ص>i 뫆5﵅X**rId`-^ym`ʕDzQ6,Л#zx ܆$Fĵr>iˍ Vm_|p~;"fG8SnaR?Q8Xc`**<<ݻݻ{WK[j;*н+Wn=$/ IW/ࠎ Zh٭.PJFC/QOj݀?&R`LBR{i.^2|˵8;7jN8p`}%FuLa֬xNMIOIOO|޽/6|8ϝ 3f mEU;GSZmaŴ 0`@wpvDEF[ `X9r~g=FPnZ:}Q:QZŒ1c^%$ٺYXcQ^vڅkn̘1"~OvZZLx8 0a_3jժղ[N!ð[łlgqFX`O-[T^pVeΈD"Hyɓ'_ΎP(~|ƍ7n8y򤋡Ǩ@fIͭIHH2˫Vz%[[b`25͋@Dgdƪ/Zݛ/y/iiq.@ HZ$=:!!׷8UVߺuرcvZQ/2O?hѢn?R?Ü//|!a1^]4hт$I[o9{xpsocCzoĨt}]ud%g*岨-[,&&@P9d&j.jի?rH%-HLL\t)kΝ'Nhڴ)s~N?~֭[wRTYwJ.Wߏ? Z;m͛DDp؝mR@OwU[nd︕yALy5V{:oo_ X|Æ &gFy>sڵR8sLǎ`̘1!!!̜tlllžmt:֓ԩw) ٮ{Cz#Gz۷oѢE|X6EnV-xߺ{{ھ]&?u[y.C#T {V(fݴ)ȑY6ng`.L@Oy!LjxA>>]kE<phH aZ\ь3رc%&+~NV?e\򿈋L800jN[,ɤR#56-nߪ /n_`aBC[BӧqD^Vo]q(10,Djr8n($A r3Uaa@^^Vwf uss:|&}PyFb򿈋2>Bl@QV`IW< +s4q2' Gn|n,KiUw6i|Ŋ-Zq3Qj7n`~r_|(]//͛W~R*5lի͑7iŠPr@'N}vI&1wV,Y<dD߿Jg:cflܺu҂hѐװ!߹gk6͙mkZ#Cb`Tc(;w3gٴf߿HHʕ+++E-]hdnB})))E7$ɝ;w?*F'"ɓo_%H6RǁOl*˛7|+u5QUFrk֭+e& ]lٲM|gg:lܸٳumh޼y}mll[h1mڴ{&7nl۶Khhww3Ǩhڮ/g~`Aj7h  U^Zd>$^^oo׷\"pQpUhݽ;IrE}_t)7)e˖-[#%?vڵkV‹hXr<oƌ3f|+;wշꮮf_[ZF5zkdƚ5f/wg1a``Tm-n(V4Qx#=OjaaaC@ 裏jr.m5҂ZTpg%jǏס | VZUn]WÁP~Sx<@լS'5k̬YXW6DEvtt\fԩSq```mLK/X`mկ01P3 OWX[;vdgg|>};F%̊+E*w 4n ga6mSY!۰/eM(0a„ 5kݫ̙3gܹd10J"Wo4@Y\1 5ŸCh!C1 Rhq<:a2E1wiZP ^YIaY,f ff)BcX 쮙s5ߌaDֆ2L5MhR)[I މNp,aUcq kq 1000000Z:Eݿz5&"")6VV*j4m߾С^~~eK Zh٭.넅ҮAU>掹cE_i(J?-x|$=,mlmK56&<Ϙ1Οe*塏cXqѿ%. GfRT6|~!}n^(/=ʭs"1}թ*℄̬,zuRP(www]vڵ7nMj6>B(%%%999333###++KRrR @(}}} 1w,h,죏Ϸ7 ,zO^fŋ^]-Vu:]ll?~VE~~~͚5k۶m˖-y<^l$Dx\^tf͚wܙnڬ>^3cEOKZS<{oڴ(H2Y͛""^%&UJ{Ö-{Ӥm[摻.m3ljKo֌%de]طqTTnf&պ4iرE&B7N?z4=)$ z}Ĉ?.:sQ.4yÇ҂; ;{:X3eʓ&˫}r9~;}W;f:999<<<22R,?Y.]3 jj_KQT9%Ie˖;wN{EJ}\"woJx66N2Xt22ݻc''ea!@Vf_/tv6ƍKOJq9D:uLp.6m2t }8kրcBƞ8q"..Mv>O_  { @#j&lUpW(.]:uTAAA}С}C"60x/88_'1Rwp͡A3 Z $0 佶-UX䭾K_a,߹d\=t(+5ÀNN+ݳ~F}5JGG6 5ztO>xzdƻ/`;_O{SS;RyC RzО+{X؈3\==*gZZ*4t&ZťP& 2˰a.0'=}ń I9uח.5t> IDAT_8{ ۅ {TgϞڵ+))L-:B!Ъ 4mv%VBb,܋ ņ N0B[ts9rD&9::5jѪևAǾ %slWQŊ>s焥K@T޾V*obF>itߟNvvF/[w6m׎L,xq#/W//F;6btG@HVb}"""B5@)j:]w9 mf{Ez'8;; ߕTZoHPZVE_/2dcE~֪[7Hx Ȅ>`[4AG(L\dB.'Irиq&7S[>䣨(݈iL.u>q}%QǷn@߷6=spV` [n0v6zKwBA@W^oܹbrab01Qܹs啣.[lncgX2K1*Ľ$oV߼Y +UmJUe{GnFƕ㣣r96QN(|sg"!&H^U Φ($ԧO7 N{~Ӧcc'S?Z xnYNه'?ybrq۶AC\ ;;ƍVݻ'#Co2[ݻR.|s2!?bCf*HE -ppO_h]Y;.FåCi!d\._vƎKRweff[E16BO~̙3kժUiI)%5DxφԧV$1݌/W@aE!K̈́@i>ȥP(/gXW/g2§b7ϛGԯoA( SBjrr@T>w<(v҂p2{k{1|- ; qhѣ(Ɖ߭AD+W&''l`4MP)iNB^EUtСysE6v@A;w.11q...Ш֮]P(mY$%%͛7oΜ9͛7g`V 1uO@Z^չ$p?n ZW/gV[ebŋ5ju!C>ZMgY>ħӁ)٠Dqb6^ѣ#~ ;k6݆ ~)+ˠ}=f*tc8m zzy;  07;ŋII)+8G3 FO朞#L]C`g]/^p·=:GEEmذAՖF5oX^='''g'gH%RejjJfaa+N:U6wf޽78d`ՃkKT?zRkߥW/oBxNwE }coPd_,_n tF zLt&I;3|/nXυ6p"?;,M6hţG7N6iRV./_'g;%;x VLtm={v |rss"o^8u򄨠NS!t(Lm׼쌄)Zxŋ֭m۶Y*T ?pa]uzs5''Ow9Je+4>iҤ>}Tw,8jdb̽p7`_V$X;\,#݈|+Rx ; %YYYNQf5<mo13j2Y͛(QLN.jWE?>ys(x:+5hjOnfso ?ɷ樑 i0,"B{ܳ/ӟ:d73xzz >߹g_\; U3{g_w*D˗/ B'i _Ū5?sΰ#-g1rێ]OVZSn= M۶m$n^ӶU\21^m`~Sa+ZW[Xۙ4l4{GGVa֬vCZ3eT${GGJIQ+{2^ydgBK$E/o].obV ^-:w )b08CvLع3=J.Sٯ^݃ :;fdl[(ڷtDb _,wq8ݧ 9>pࢎϷ8h'Nثw(8 3ܹ v-LV88/ LߣGH=u.7uݪu$ϝ f?;NR=|S!EQwܹ#??pw?.B=#b#1jݼ>CaR]ACWWǢW*YYYeٙ4meݓdѣ?;Z7ZΝuqQ+ڭVgϦoyAo]Y0bB.'Օ/u s^kb\NIP0c!&k}tϿ{Pd"V2dEQΞGn?o r>k˖3ׯrB0qG^g)) F{]':}O} Xata=mѫXrMUjE!$Hp H%w@ꀑeoL8>8pEj.\ـN[-:wZBjNҨ(a#;[[^,ț7f}eVVf?T!{?cFhXӓ"H}~>>>~ٲezV0g@eXH.?N" B"iaNT@`N?߆$9*T(f~9K%|9A˖- * VwD_@ܫw3"_1lƊL3w&%|[X3gD996kv!:w^<" BFPmNi4¹TSA+ԔO=P nã 6!8{kٰ2 ,vvDe䈲r%FJ q`tZ߆32Wn~UBGٹQFe00r'yԪwQN?zp6&=zx7S7[[[ڙppyD=u:~<(ś+R{<x'wM> ѣ_~ѨA:|0s[z)EQo?LP7k{v k.}Nb1{9:VLZ0Dzf'IUhUeJe*}QQBZxep,K-Zw.s\T>|Xchٙlxg߿&]rVUvPOʸKNr6-&e uVT1)DoӳV,#AӶ̔pPY"*HOMܭqިhE^w?&ժWΕKV׌ZsCӨT<'W]|7o$r{P^f$/ӳ{Xجi"..LHHS9xޮ(>&A-mrZZ~y7߽6m:lXW<Θ11]8aRm}Ǐ6^X6-z^xf x<666% **,p9s({Сf͞k4PJFVKHhډ!ۚ)}N+@$S8.?E}1eZ F۷o=^8dF@`VH?^Hz g$DWkRc-^=Aa}zoܧTjmzNTQ&3#\n4IEf$B@!={u( ,ql|n 3h.ۮ_+$pRP}*3GRk鏌©R_p23>CMAQ!BK@©3J Qv}onRfs%0wΊ|}8{y˒ y @d|(פZBEFF ])ΣfϝϽGtj Ǝ]@E%✧?D"ڙ( M%@y.h͛7KC$ Ǒ կ6hGYObݵm9H1d$:^Ri)F0hof:ņ=JϝcrEZsܹ$n܍D~8*D乛PЃ bP>AExÇ `ǜڽG6m8"R1`0k.'7vȁOAQ ZhbBf;aj6`:KesNtldsjH#ÚY@B!zeˇ-u-lo웛޲ }oonv\RFko["OD yh9KkRc-^m.V•#0q! eK\WU 9=t*QfF&&cw?a =k4r%YآukHiIvvv/-Titмe[ ;U(4ux17`coрhiB Q0Mhy0=5FmHϨ)-wSo < [Q"obR"_=O<u, 2W7ƫE2 lDi4$ 3DF^;wur*vOǏ[!ԟpx 0ɉ{n`@6l SϞl姼lb' }Sluu ;uVwF2Ͻ ,W5 7@׋;n$]8(G_D^Tp%|?VXWOt셓`0̓r}ELU0sLID $Aޏ^~]?G'k&gHzJ*ZB?%%EfԖm8r} ƽYPѽrmhҬŴ =iYԒ .}(oZg0GIҗ/_;;"YȽȄȌTn$8)@zx犈<'CP "_kꉄ}?N m"{&uZe4lcq2߿&$YaVuޱ%#ϙjmסvBB%SDIMnIls'Ss[|fanЮ$ш: ZDB ?rEg\x$ι!@ yIysO&{"_k9)a-zj 7 .]1(޺\.Fw51@Np֡vd9 nӎ@0>[!윤GZZZdLfF-k7N@F<=EJCDb!kNNS׾;t~~i~/3dž(7w:~FJq+ΠyiF,L&H1wΝƭ 2 r*P*^YmEz3J|M*z6XUK"ST8F IDAT^PL.ⷩt-{䜝 $bՋ]PnAHdpv[B 50+=zMj?@gy`w4Z4HȚmmm>?i+Κ0yޞ+وn Κ2@@~^ 4LO{Y1ٳnQ0;5[pv~bEh೎m:A!CZoYk^c-^ݵx݆n hHQ(FKbZb:p2zܰnnNs"k4zfcӾS^{zps I! حxQ霜''ʣ(s+j^hlm#7xO{oa8_V.1s.w`tQCP-ՌHA ^@oB|ܹgenq'φnjS0wŝq`FUț̋#@@L@R@U׼ZzB"|gJ#Z:=(ZIviRϟ>y-H@Эg}:9О6ђM(ϷFBG-lJ<ԯoL_4d`Ƅ&Uyo _O{EӾ.Qcf0 $ Ŵ.9H#"(B`غѧ2tݼسRQy{0ώ[{qb+V5jv0ʷ3Ži`N*5`sl"OO/htEVg8uAWԔ'~'g}v_`ohm\isPZ/BQ:.͋`@!V:A69HLzԫ?[6dh:ſqW^*!à! ]L~9wx3) ;gs3ɝ[!J|ҘpwqdS*Vہؐև5#0p'(ށ׼Zkq-*{{A:ʸg\ x%E$zxz 4K|+>:bj+E:(dzXtk LR 홫ǽ;Fٷm6'I2DAs'Qz"X^Pa%%5-r\'1wDX7{bPH?gN @$-Jk^c-^=d0jcc闃1j`Ѐ4 Ww<̄1]2L!0Tk M9u }C@q'מA9nʗwu:!t]r ~J q PU¹3W77QAaݼhT+ܘ|>Uǽ݉|+zҬzž;5t;:Z8qe6L6G0_ hּ%ӯiiԸ\Kny66]4MqlXEQjΎ *{R27Yb"ۜQFĈQc&O})%EH`\//AƝ;Vw`)4qOܭ,-ZmllZnc*D=WO}VϞyc˂ik4gEQh5lҤQ㦌?@&_AWA њCDyY2#IƮe*j#USnL0sWU|[ rٛ) s^`_[ }6ݪE“gS"p? j?5|+zKxŋX5Z3f̘q-~ N;@nN[9q&Lۋ4?*AWk}ܨ-GDrVkP , ;WRSSy$Nhp+haBzWUw.`Z-*v]c鸋s ܫ1wV49A٤QKH{2/7͍1ؐB"QL0Ef=  .^4*%D9YeF,qnC-';Óqٵ!Ab)`v5pBp' QQkHfR)JYi!^]K:Ɖ|+zn])%ihA͚v3^= E\J%ƈlIdBFCX' wv)D!$vB2჻1 *abGe/WcF"/q_D=l~={$$b7E<`5Vn0 l#s EFc MKV9EQcʋcԼysna?NPR:qfi3FH%21fTw?` jP.8"] A˖-Ia b՘;+782?q"_Êkjzm۶y3E`Üm=b{_Rn"bԔB: itxь8CFЩS'W.<Ɋڸyo.V dCh)ܕ9F8WJ*3~4Œt:QyyQZܩ%:vXY/!6>;̽sgEq4qzY"_kꌖ-[Z"ޟ wo?5Ti( }3nd`5X`JB:f( L*aP'+׶F^> \33ϝ>E-Jg422/ۀ,Zu !)D(Jt:JGQbH(ryJ~^ ^9]0ʝ>jפ/:thQD+D"9}ٳCCCԩcoo󽼼ulٲjy<^.]?NlgVam&k( HZs"봾]t!(VO9PBR]t!IK+݁ | h%tOf?R#+pE,orG@A8-ZU(,r/ˏ:ݻwWn,wGgsMEn3}n5HkR׈xڵ/ܸq###CTj4ܛ7o._I&;v쨖F={gC @n^zQ:SqgXaUl6HVGi)JiuVGhg\,os*_^xds ;OH Vh#7tOgU*<׳4:B0= Kà Fl`/ `Տȧ%Mf|)ŹEaaĉϜ9S&c[O`okd2:_@!cL7o-^u-ƔVjuZN4Z],\Fq)/ٿdSi :T_ 2g8|{wE ;&/OM8U U<@Q^TmJjZŃë*VUZ[⍊( rHNn6?%@L85 e̼y3oH12&Қ~LJC*'bŤ(E&ĬbEHfF{=^-=<Tn-OAٻT}0m^RnSh^~nݺ~ppnPPP{{{805+gw\̋ CPkBuUYJ8B^i(JTe A(&E0 Er!㄂)"raOOϚDsmO8 bH1D0"=cgLKR tkJR$(bH#!.GCCCOOϖ^-'GфIs({W?Rw;0ٍT};X񂂂͛7;;;KKKtȑVJI_,鑓u{w>}}vznn.u>eʔ3gzxx_>..zbӧOѦ;/vvvCpu67_s2ǥX"MDUh J TE A1 hiI1SEUfcKNW J N% ;]nu"Kq'Ze&p qd$(&APk$XT`{WYYRTPQHqU 뫣 :3%eǶDLQHGѫۊ۷o˓'Ol6a'---$$~, T+NgkkkrK۷oS_E0x`"f:G&]r8xÊbp&`O|W7m#2J\A3[RJVhi&#A1 T$F:-BP1?< OQYRS]8{Z4mŪʩO:D5u 2b(B'yUDB1*%bQG0Ij1R]_yaaA~eK*Ie2\* ;~8?/WAN:8ر^00wIT,,໪|(zZ]vmܸQ,uhhxbb"B~`lii&Aj`BT}ې!Cu׺vS05=eU1_%P ͵}p"(FUf1ĈHRWbT$AҒ| P@^8r4hPK2SCCoiޤC灖vb|܎7D5NPDbE*EQ %Uf1$uW͙EEyB!U đMoDe~~~~Xzs m]Rz*AkHAѫϊl۶,,,,55ڵkÆ #7olh [ZZW asrr>|HJ=;QQQ;ꫯj6ƥ [ R:XDu'/~r IBƇ&R5KKJp9eu'H$pSŷ1cFͥuO8(B|+\H$3ѐ%(!8/dW+|nqQ'8=oƦex ܣE8x/wIT^-zt7R^;ɓԱםYgglqNNNRSSnjCj&bqJJJ޾}KvjY+**|||ȉCt(gxTTT"4Zj2 ]tgASXse+L9[`G'ZP-kjjij;vL&B/ȋ5q 7%ſp\gb ##c99 ,~ ^ ,۱5~fEJVfw~p-) X"8AФ5ht@*q)"`(J0CNYa'+XdB0hР/%mYP#ǡ]Ovy/ۿ{/j`/wWX<:n#G&ܼ.2Ԭ[_H'߫WR⒞^gP޽q vL8Q-Ǝ;mڴKqu5 ZV3ŀa!GgP 3#Dr*+JKK Yeeeee%Ņod++D"Q8@,S0cƌcǶJFԥko lvЖ<"29ocM j>˩b|˩ (R/ENΟ9ߌUF ? (M({Bv*u^}V;p@@ MM6[CCc&&&8L;޽{...O666 o[f'b…uWN?vc[@i}DR)HjZ>_(H$bT*B햾H~ϟ&(3`g%ׯQ^XNj07^^/څ2)L͐eO,Jcn07q\~yΩKܠAz*`Yn n]iQQQʘL&aݽ{6lKЬYnݪ;1]0h?@F9PnCFio^߼r1+#Md2widd*Lp!5$f3fwO;D'|~TNW(;|w.z ͋ݛ5sk{=zx=<,,+vWWWŠgee_Р.!#;GGɷlٲcǎN̖m޼y֭<$$ :󓑣54TUf C_L;';C|n2'O**Ϝ>ϙӣ8:om3TJOy$=5Ô݄N/]-r({|w(z077HNWTT\ZwFu.N]Rсϐä'QBxs޹s|}֭[Df2۶m۱cQ[ii CFYی042V|uVzVzZJQӇ7$00dQF䀇8r䈒`(`ӧo?sef ]=djQu=UVZ\X*U5aZZZW&4-wO١woMzSvqʕ ɱ!̂HgxCѣGW^-rsssEMLLvM6޽緳#cu(|WУLKKKIHHFwU+Ni.w_sIDAT܎'ܹs=R[h4ww/X\.Ridd˗ɽ ڮ544Wp({|)Vt+Ni@NN_QkkE Ύ<7#7ML&+,,++++++cXbX H$.ɴ8p`~qEj({|g,zh;ק̦ nnn4խx: %%%,bX,tuuuuuMMM---Lf>}N\ySTd({|*zuQ~ppJJJd.]j$Ցӆݭ5_BٻP;cѫ`RRm; ںhT]5rA١P;\z[d@ VD5CCaud.Ot(B@ Ѡ,@ Zq@ ЊC V@ hU&t1c‚>x)bXDX_|o1ca@ ·/v;g6uHT)xrn۷G9qb[H(pVO+7mZW*c?(%:Mj*Fb}C ;v¬Yf}*3w\c0zZZkn`wlZZffMqrjTms HMmmOn=x#%?|xv~Fͦ={ 7nn;DEnvgdi *+=|IFj)Ɏ@[!v`513cZY}X;wR}z,yEPϏ?~ٮ]@-s劐}4ujSe''W&y{+~H 8㏙OR/+)yWRŝg 8gN;E<?s%?3T``ɛ7ԋBO]nhjjՔ?of9Valƍi:k~vmG5uE[:zz]Ƽ?㏈D:gG [;w}V2S{J߼8G~߰Aa zP똫WoN[Œg[0ήyyq׮)0iDǫgQ_x20RNӦM3K++}##!S*>{^-YvfNCR⎮["YƸ:ah+*r_L{7ŋsm췤ͱ4\ӑh SK =e,-=i"d23hyKջ)>V @;(.>(Ű^{o8q:ad4-t˖[ iz{?pUbbUyEBf͢kh(6%* 0w򺶅ȉ['ڽPZ"r۱Β9ri>"Y߾k=p 50s޼W?9Ne:W-[""&y{m3?O.,Ű7f/YHHOv^^>@`7}k\od?rodq7n~-t MM{8ygihjYd,#BMmp9lN@袜NED,6cȑsZ+*{+ҡZ'e]LX{LjhjjP+rM,듟ܽ{Q!t:0{qsWR+8+*c㱞  8.]rʬgϴ yUUIIII,[rê *B/m0O:Lͭ<^qN.-PK* v ihbRDoo/M66M=6޿.ߊqs{A덚4·x< Rn`l,0bDE6M؂VY%^Ȝր}re>ݻ} Ⳏ>=b%EF~z\[EVNJڻfNOrpw_̤7/~y߾F+/(g~5;WV Z5~l=+KJt 67!"Ub"&IٚDc80pٚZZ >qZhh[[jhPKi{|N8uǚs$<$,x.!{ՐZ~T0 xϥ֌1S qyAEQQrC%V~~˗O>{AqtК揽vM"-ظyL}Vaݻ3> w3HmJOO`HUbDJZ"+O'g3w{WNӦYZYd,Ëo9ѣCnjRkۂ:)cgš3pĊaVCbM,4ie*8 #&͛g/]ړbZY39dCpS¬8dN0a\iA02ju+WnxPNEԙ-vxPUEEZ\9} ǙVVu4 4bD$;dHRݏ!Sh4U4?=`ieeҫܓߤu%M0i~ӧ%"ѓHrtZ\Eӧ-\1wn'o |V~~cc U=,,2F;zر[7O䖴c(sZNeiË3*EB2{'qew)){[N:jšL=#<λws2;9ik%Cbj_۸51ӧGGVqb^ĭA\[ܼQm7ի}KRic k]s$UUJhW+NbO~UUzvVIiիI#|˖VVGRmڣ\]20+ q׮Yo5H1wȐ6AX[''3GMj/y"CD\G~Zm=[)QQ!7_=LfZڀFWWdfd2D"Qf %eo 3Z'UMX{F}›=n3J!ES|}Scc**L_TUThjiMlP?0yB C+h7CRry~qU +p1[آḷwӧ/_VVEL 3M4ͷaJL$"?>spwv~ӧ9))ʤȤ..G(^ή6Fެ3:\@A\wߤ뎠]uRՄuyqKRmkDaAɸ&:U/n=Re@(g;n#F KU'֎'"X_\'{: M)54Z߬*ޢewUCS);x/W\FJHT鋩qq"G%AArUNȊcݜ!GDA풶)W,?oͫWg&6ad<}: ]btF $>PVP@tzT[K 8HmDLhag߸8aFOZjԎ4nL++~ 2Yn r1JBDې,W> G-m_ګuR`:c0lƎ5#PX~8M02,-=e mƎmaMשm{J=)&l+xr~m45 \6fc($pgg o6X~+,":]hb9y߾js61=̩Jh,F 075?t_emݼ55JA)ŭ|T^d2r!ȡkK߾Uq60Ii^0DuT(wͫŠ<`khV+?_DG5]V{n?ji茟5gg߾˗B٧9c~Yg6lgvxSY) ee/ 3'6"&fZOOb{YT[Ggҥ.w(WbZh?lVǢ_%۷54X?ݳg+KKe8!H~F_;wG Eulogm ~$W/&vn+w-ZWwΞKKxR {xߟj{ʑkW-/cb Hb\y|&iuRydy߾D|W\m޼?wH{bI={ljFj>MDJ>ܷlYg?5[Fk^m!mN101!]{1xur.8T``۷׮l'}iaV_v & #d^Dn$ 5r„MqrֲG.L{̝hhj$/ oݺytğ2<.xy,!"몣ǺcNmVU^~t›Lw >#S޻HބٳUZMFLahQ$DDeohHrnW]>sFN?Is/2X(",,%**%*alD(ZX, w老K5&ffO8u* ^UP12e/]J+/(,2j)6NNm$'ܺU^Tgek;mFVPDEIKad{'sއ*IJӗi\All&}ih"~/bb _WU4GO%AA:Y,̙$$U/bbsrޗKD"m3Æ9;~qKl|,?[YY0/qӧ7{3`ecҥ11/rSSlH 7n975} zpBQN*{3/~WR:?o>h-**vY4QNGUE3ppDSƕzẖ8+}4k ]ˋ}044B!:**pC Bvvfϖ4;ΎV\H;>K|?*6#BL#aC%%J,%oO?yaE6ByT?jJ~QF%}2L~oRY9%݈ to;09=[`ΌN(nF%o@(fVV%gUkҒ[W>]l=mjS#PQGB\/44<Ù xoy.E%UQqQpBVn!d2NiIJsKJ/)>̍jjR崴VD%4| weL :$)WoSDbRBamCLQ.TW#BHЈr}3*aBV?zYpLyNW}vbZn5_j:ښ. Hw-v}?KgBv|eߥ[Q)˗3.~f-㣯rCpJFW?~w?GEۺA0 6Nݤ舁N˦H0~|މH|Q |z$>lU_G}D*z-=H_£.\-Je2c~ajWeZw.Hzkž~65dd85Vj7F?u.vE'dߴ_l*#3{.i{oB)E0npQ)Ǫ^Q2KŔV GIOz}ۙJ02 eeS&xCQpz̊[PSc9EQϫ!_DJ@Je7R%~M&#$?WR^C?fl@(Kɡ}gTVb=1%K$)%gmuPY]ɽo?ݯ?yiͨy$eY,=-@T\V}NBL⳿6hXchnaYT\:3VÊ*f,Z gx'KPL?ZG[_'x\ ȝnXIiE-WWat{'꺇HRjf7>[Q qK JRً*M[6)xeu]xHy͌]G'ǎ/X ~\5U&6(IlV-,-z<ӾaEOb1PIJM ury/7weY?|6GqY5B/č_L/-=ZD'Zxq< BitړdnOőG 2J—_җR6Oa3K- MFE&~T(\Hzkidonmn@/ekYEVKeL+Dzߛ4ĭ%8Z$e3 __&@$},wDGdWA`^WX'UTץfq0g9a>Lӟ@lRء}]-&<RQ]Gʚ:z'O:Z}}OaD{NV\VQK5bB͔0q%8ؘ^!$#}Mmu. XubEHC`>/~^=EkS $)Ĵ6t&G~zkcH9Vfv2ZdIyf$)}cPooO̜TTs%٣ETxv~w1Ӿ2EO{嘲LނWre^'{|X\J92rtZ'jqR/*67’3hkeaW+31ԍI@*$_v&ίhўoflj]mMÊyc{3Y,ܙ#ˣ _s~py_6,"Y M8d};3m%UVcsa"ҝ$oO>}M{*I*5|arF!x{sD#dS^z6x^`zǿ_JfTF݋ͪdjW['$@5r04׮K*u?M\j^rFi0?}jqCzE@D?iid#I2at(kNˍyM0_yUԜMmmn`d]QU,~.6PY#{Z\V3wʐlyPϣ8^oQ:_K1!(B%*.SBJ`Y#əE3 䛈3Kx }IӗajkE},50fH7#b^b$Ii1)=- lT* H H?vk`mB:3XѰJ&7e2d˙YܷS$e5c17%R}]^uJ~U^j|m˛yՊOmR*vOfEFGu<*7r}c (]~cy ~d}{06.-+]b<.P_6&Ϗ˨qCd喕Vkc8ɗ,!!a޼yͣ~ԩS-]Ǐ8q"))I$1b…l6nN<B)} )[nU޽{7lJmllxz$O)֭ɱݻwYYYdd[G}}}_ׯ!CZF~Wp\\\|9shiiWE0"B*r׮] ++kϞ=)))$IO>}„ tlٲ'6Y8m۶EGGGGG /G?#`ѣ\vff@ HLLIMMDA+nUN.^ucǎџΣ@Q;pCzzَG`$PHM}^s'<| BHmm-XKK _'LxC Eѳ%%%I$@###xΝ+ݻ}L)S8q~8rŢ \Ǐ_~et租~p87o޴i`…EEE~-@``ڵk555@ZvmׯE w̙cǎYE:TWW$&&Ν;LgX߿qFyymvU>Doy $I.~N200ٳg 6 6SGkj`/ɣgPWO@h(|iT(?35uy{Ù3pjL{<0t(BP8uT/2x`8tСC?sO@@oO6ܹs'x⋷z ͗.]ާOneee.]b(EQ_̟?/,//766`: WWW߿{n7.<433ő#FppppppnXR _5jŋwQ[[kffAyӧOs8__>}˗奭]WWwޯ*11o߾R|}}oܸ!YnGYX=<~K۶ܹ VVK o3gqE;CT:;=Bj/^zH$zi@@3}رNJKK8p ջW^L- 2DiII G?YRR"HRi޽庍0 PZZjllܰOwvÇ'''_Σ6lֶHJJj*+/TȻxb^^0'zyy@NNݻwJ^lٖ-[_kkk[RRwzyQ`СzzzaaahnnnZZԩSB&޽ȫ/±c@/?~=?)a<bb^N/ؾbC~˗ؽwz!br ~,oJOdOb1t?^`ӧF>sY 6o޼],/_͙3ÇyyyBgڴi(ܼ^O>}y ss'O&'''&&͜9SW A3fϔ tT*sΪU)ե'I=PodVܹS>-X`]V~wpppl6ӀWsFÒK9-jbϟv3f*\~U%%%+VH$SN544q?\]]=uT;;;8:>~D"QZZ}>F||= [reiiI322N8n:x'NA 62@PǏ?~(OƎO_y'0mDsC!ihjjߺur- {[$I$sٍX,/Boޯ>3>>ܜBQTbb"slpppaaaPP44f͂8Ç~`ok).״o_8x /?!: ܻwo֭QQQG9u??TVVOvvviiieeek֬tRlllxxɓ'ܔ{o^^^%;ipqqjhh; 66Σthzz:g͛7gee%~aȑ@::^߳╕ϧZw߅h|H~no^o@ xTm-PTdE0nܼ $ ;v49ی!!ϟ>zoUBȑ#꫐W͟?WJk׮ݺuٳutt'O|޽,o&%%ճgϦ 0ޭTM,'''gdd痗 BxVVV...퐏դsȑ0$o޼Ό H***dggb|!Cdff~eeewdt*O%IXUUUG>n ?}TM`Ӧ_bUZzCϞ8 '7ƍCC!-Z )ڐ?s띵`ʨQ˜l6[-[5rLMMo}޺u+&&F,WZӵ;$I999QQQ\._~cǎmt|. ͛7.]USS#ݻN\\EQuuu?/`^r;8"BIW^ p,ME?{ӛz(X|~~~J[Mѐߎ;!T\QNN`nnNR77xGGGcc㸸Ǐ37r=z(--ẹ!`eeeGͩ|[= PfY[܊neVa#FJRR9s(OMѨ1c+ IDATΝ6lXE 6ŋ)))$I={VKKٕ-J_\yŪ*Q;vӧo߾-wB!EQaE!PBYh'K"6h{븷! ޫy~\#:… [z#{lFS#""aGis΍XfԩS nܸl2m睻)7od^bʉްaD"y۷l! 0"B*1ߨAy+BeeeϷo[C;7غMڪjW&N֞9}e`mm?VwOI3󋈈gn055 ڿ?Phkk O۷X,9* s]hkkرwܹqㆶ̙3mllT<B)AVVVsfc[W-Ōi Dr"Pl }n (@\'IH)hpoˆ (>e˖$N5ik9R*zׯ_dp?)x&Lhx=QBHh~rf5 iМ̥?Qn]wGQTYV*VWk,a#=m=mM#c61ҥ[KE[C;!BLBb`hSk]$4#&,X(`YPV-%l6l2ܹSVVyY !7,iY @Q@Q w,B!7oٕ֚}n^RS,l6bY,UW[#ɤf,%QE|d9KW| JO_yYn33ރ-[7ZV66GfG!-4Z).\0n8sss---''N 3D"QlllѸ@LwSSQbX,"l y | $o`4f˛ 6Fj ԬG] 5LOO=@,nmCUԲ"X,, /.WbQ($@991]xFFF345+o<ZUzz8LL`JUvW}~&O͎BkDkeeEWEiAAX0H3h7EQuBLa^dA΂fl)"XD,ddg7&vfhږ={vvHmͣzz@̦r_W5w.;0i\nn;+B|H$ 555;Q,2NR~ E,H.Hir,E!([FI BBs5ChmլҦ4zOzyAbbySsF@ hP!P'>&&&&&&Ç \k$ eZ(404"IRLD@EY,$d.$y($Im;W3PD!!~=С0s&>\A i`Wa::[!jׯϗ/_^pakLy$IT& AȝI8y d="%$$_[D{U!7`s R)p+> X hG!5ۙÇ?ի=CY/%E41(--55 OrL\O ($IY.I3C^>zz?Sgsm6*Dʷɩ.cq\^k9*:,@@kIHa{'BE_?`TiU%MƚPg떗׻ zIf% d2EQX,$R{ѣs57{ZzH$2 ( :#$R($naaѹZf|uw5Wݶ\ww'yU"USu5:LX1gk!R.Uw9Ņ cǎM] _M? y#޽H$(TJJe2L<!(T&!5*FGݡ/~.ܹFkYjJEMt4j{Cuԅ@QpAQB[vGbbbVZչZM*yc$ebDB$eTFJRL*{yDR( s%IEyYBˡ4r;W3ul.UT#RGO<BJXXJ{Im-TTѣ M_?N@_-EbR$$DVPW> BHRBpF@R!uQbMʛ}xU\\y!BF7ްwFMy]ON"TWT BQm/VԔWVgd= E"s//i9rIgl 0`w@kMK}QxL^τB痚*y݄LMK>;hڬyzbp8\~bD('tT]?heey'zjZ,axTFY|y!B )Ù;w=͒(,۷:R2_EQX$t/1C3gy@QxoV~i_3m,^L,SũGBΪXn tj~33֭H|}1E"ܿ{vl xZڔVW<}&-\-դ ԉB7fGb_GBN#*****3I8$$Dւ+v֟~ѣGR|4#[YY͝;ظk4{<BUKVoʊƟ~իW}J6o)4(B!Z}j"L$΄ o޼+r7vXG3*ڪ+VPJ1"B011>}ɓ322 hiiY9:::;;+koFPP*[aTy!BhEob'T!BaE!B]N3O!BgŊk! nC?55(((88 "j/\;aH)a_}:j 2@ SiI֥Kku [+}A h'n+Z E!BGB!QB!^_BU\Z͞=;88=e(B!j{Kz|G!B(B!<B!QB!y!B__ߒ.^x}=B!Pٳ'11Q kŊ=zPuᮮRv!B-nݺwjkk{xxxȪv(|;w400bGB!Z"''GCCPZZMZRRo߾8XtRkkkHIIٶm[nnA.\0eʔ˗pLw/rɓ'7U;QBu nCqFի>ttt|~``<<< X_3]zo<<<kE򬬬Mׯ_j<B."++֭[;*]m۶hݰasssߺuKWWt֭A|:zÇgΜV%,Yr#F|64?mnP(TJ3TzP|yTaaa]]֥Kku [+}A h'n+wDDč7bccttt*V^nbbrիW޽ ӳշx ??|۶mcǎ%I… NNNڙ 11&55U$%''.#ٳg4֭[mg}xb???HOOМT-̣! :TWW$&&Ν;L~*,,:vvvP\\be2ٍ7g̘!H^{++ӧ߿w+HSGG64gd L] ^τB)ƨQ.^cǎZ333 hpH333ӧ9N> /$[}+H6 t)h+Mlu6GB!U%:liiYXXoذgҤI@B䤩斟Ldrr;wnZUUՊ)hÇ7mڔ`Vǚs͍~iӦ޽{Ϙ1E[RA\ĉo߾n<But|ܲeѣsss6oLRӧ}q ;Vx+HmPi̤eddt0Dᩩ666/^_<^BA̰;,,,Ngԭ {H*>o?&&x<ސ!C`5GBHMQ@<@@{\S_TTtٙ3gZ!IzPSBSNd+W,..~Լ٘GB&Q z9ېͅTOEAXXX{Nḷ!"W 2+Reps΢.((~zIy!>)whlQ՗zmۛ~WQ(W\ihhhgggaaٳճJ3!ԭc(KTP{"^닗:v >޸Z-*****ї$Z\\zc#RҚ7oݻwbaþ+%^_aEhlwЛ N`ja' S*sYT)455>=?ZG&vge Αu|)}M_CS DG aR;@ oR7B91cE{EV0c)+!̣nѵ2JOKHY!`j4Bы*p9JаEBEa?ͧLϿT\5yTcVuQd;㺴scTWrKn{i.u h)fDkaauMEEUU;⫸ ^b)Jn2zAJяt%+垐VQ~uW5Suiƨ:Z]BlR/xT3P'p(E;%ζapUە~TV]F>pQv> l*~/(PUf͚ 5K.w^a+jYl-ի֭[[Iqu$JtDMh*R [I"CCC1kR$Ir8PzjԩSv%<xT΁xyWDGDbΜ9\qq޽{E"… _&-[A;v^pʕ!!!`Μ9NNN[n-//3f̪U111JGGeɒ%666LK,|rqq#  -Z4k,UoA?pttKOOoEE]G :0=>{ WGZuȑ#˗/_|"h7o޴4hǏW^Sf={Օr!;;ݻww666Rŋ C;wn^ݻa9sfl6;44tNl>mڴ}*h7fff,kƌ+w1?P@qn7B]w\ c&PE{@CCQB7KSZliiYXXoذgҤI.%B 5Ip?Iq&(((++9zQXnݻw=<>>jFGaTѾ]nr6sY6{I555lٲo߾L77 ҇[7&&ݻ4i ]NKKKII(B[}M__KdPE'N4:‚\zUA۹s'xŋ/~|A͛7o}߯-C2jvTOOOGG0ٹ) (ɓ'C%绻ܾ}{ջwﮨy򤢢bܹc̘1׮]NOO4hP=rrr<<<|G}rͧNz-n"YRQC cWu,tt۾Ot*F.UݠAΜ9}ر5k45 hj92"" ͛7(޽{955eee&&&Yqqqyyy^^^qqqIIItjQQD"E$ =Q0vN&PSK) "5-*****ї$Z\\zbqdd#|W+++====/l_WWuʕ>b/444''gFFF`bbRVV&JHZXXHYPP^v-))iԩtuuu8ړ0"aӎ풧<" ~~~ ^eқ*+xT,oذA[[NCC#)) Oz+P ۷>|xa777}}}z(fۊ)88833O>899nݢG~믿LMMutt6m$J~PGGG }͝;WSS3''G 8;;cE[&|w`jnO!USlێ͙3ÇyyyBgڴi-*DP ʕ+eLSN>o`ccږHA㏻w7oD"ٳUf̣q6 xjUBY`H2I&J߶mkU[֛bcce˖s:uyʿddd$?P-88X R0z-,E^M5_3k0B (BC.zh۳ic%\S!Z#Fa^BMELjC7+R+V(xU__E'v}:\r$I\ eGj0*(Bu,un{ZаvJ BIPPnvxz<==*w> Gj$œT$((_.YS`/]`-hx(B 8(BV)$BT*JBu)+u?cʌG}ޗe^>>PִsfnH1oӊ(CE_|YԷtΚcYkӭmƌ\,i9yOYf[%9990`)S[YbLxmj 3E,Y?xݚ(Z`PW ☘`A eo4}G[xV=ô0_YH:jUn V;.N9- IA(S)**.uz !pC#{)rgmcH nqh/UyRGoϞ=/vss37kw_¬0%>ڟDnjamm]]]-߻wS:tHV9*}|\YQsX, 5|Dd[ǀ%_!?bbbJ]d/sye,|eFHVJd%%ՕRe0Ν'_o| syYK(sCQ1 ~ʟNհ ްqs#RSRQW".+TTj{\as8abcc+++sIjn`iLUׯ-?ZQ5"$;FVsssw(xJch:s59|9&sm;1ƕҜrZ)%ʌJ\llmodzikqc|Ƙ\EAWq[kL_QjuR_q㔀~߿*avyT4Fjj:mڴ~ݻ9sddd_Gy%b"H!"GaREBeoepXn况\=M}#Gl}VVVjvN/A<Ə~npPieMU$ $ObiiuՌaWHf{P~&dJ_"lwoNW ?M't(r&.i"Aģ7+,Gӛh2T:c "]YUUzjW^y%888<<<,,,11Q߿_"ڵ+%%E ̘1#,,&bxϞ=7MӾ>?aX{Am ] tQ&%%i/Ǝwp畈1$I$! pH.$é}!$ID\CQfg#(RJJVmhMMM^^^_8Bw!$$)9$Nmr8G;>PRCQ=ez677W*6Uъ_q괙gGU0Frrr/n޼)~m[[O>{}u9::>|xǎNJNN x͚5VVV??|(7!du=C-Wu}T(AP!c0`t883#m9==]ʻn#BDQMTlg=uG24Pxz+)""!$nݺ}>5㖕t%Kt:OO:+;88oG)SS&/< :e2(+))Qx#WaJ50lߤaV3j#a sy/Dc0Czd3xiiiE%j'B2yhʕA$B}Q0!1&\;؈i1}*{ ,lUbhydhţ6fgg7iҤݻw~u?dK-,,ccEEEQ-+d. =a TUUi{ xb''gJMVQ!҅sGᄒmSM{p/+#aƈhcS*ꄎ!^Mh&DlEu$A K9kXI$IESff /SQcW6]QV&%V)ȕKB:+*,((jEEEOb)**jp+ggNR1 Vg77{T*Nw=mRD3 0{Pմ5BDZ)(JKQGģS셤$Inݲ^f!d}{s&:(3ss,P(!QJf:iH`{+I.235pJY!DQ47"BFtW.=t?recMj*BEcdffVZZGb++aÆkSsݽ{wddeBBByD7nܻw… u:]Ϟ=_~lܸq׮]^B A(#GaBR@뙁<;h6v4(Z4: 3XGƦ뙘!D[I$ ؉ؓ叮 x&^rH 1# (J.{<] 4]6k? nѪ f V,lBVXE#YYY} >رc|Moboo~:3o<< :i$ xzJY;UVV:89oYQ$]~3IbL3 XU(7\W8WVTZ -'104Yt)VGђjVغ4]Qhmj-|yG7ׯX{CUIcA7׏vML S5|ųHG$0~%<np䣫*ڤ1jMW(ҏIPR;y=8$,qit!GU$GU*EQ9YXR~ي6µ6^TX'rY*>!AYNcA7b(j(Sռ !tN9;f,jqV#Hʎ>'`=g0(J0Lv L,:`[o 1c`LbqFD Xk AjJ`&3#հF+&'#hoڼaͪ/lxI.O_4ɤ5!k~?VU\\\UU^*lmm]]]=<<;ȣePz8U+ܟSR)|1 C2LmTcc)jݳo$ =TK(R)Uy9O6;y_QqycF0Idh0 Ƶ'KIP `L1EnVVu6_ D_bcW䛕x{?ʤ;wt:O) BQPP`kk m׃fP+Yt<5mC("0M0SۃbL2B&(f%x<~:Ba/wwǤ#iz"(LSNC4E4Ͱ_li4h)J+2EW/&WݻUVZiCWrς"6Q(:s̎;_^?֡j_m۶]QgP*|||/EWݴ J((y.k IDAT<~e0(V'W(K u:J|M >>>MJ0a8^UƾGЋ(ҪTJ;Z_fFKUjRST\RYQo_7?~|Lc#Ȋk"X-+0Vcƫ*tŻvJJJihNLLܽ{X,_6끱1lLHHE moQ5|bfQmyw8\.Ic_M1`F*T _j)?7Qo߾}e>|)+~ShksUhSsKϧhFG Z-U-2a r/7շo_*.QV*&Ir?3}{5]IEGGrÅ|>s#FzX %‚7}FѯY\\gϞŋo5QgPOn̘1_KB.hT*%(.CˆiR]VZZS-iF^#z???3eʔHJ_~诃C<* ׄL8$(F- 90wo_Ou>+p4Ur>cЈ6)⨨(B_"052uzYkOP*-)n63Z-(0Xܽ}ퟻh472 m;bb˗ ^Zu1VsuhZ>VK$_eK5 )}cŻ_ˮpҥ#GY{ȣ2(t1nnn˗/)../)*7+#7+]]],XЂ0vt2eJ"WWlBbb¡xDB浟mbhVA9Ƙ! 4JY`L2fpDam'97#o!qf>$''7BDDD@A[[˗_|)8Θ1c[|͢ŋsss Ϗ ޽{O0O>y_A&%%lA8^<:8D\sı/:9$Av!01C`4T5Jh3vٖSRRBCC{ի{.]~b^p±cӚt9s8sٸqc!z4(n  D))) j_IKKKOO/++jZ XXX899 0ۻ u1rˌw 5 xp/w/ys@BHc&hF36h…2d;0L>\_ GYlY7[C!@bgg?JR!LMMOj BH$:v|EL@ƄoZ9FH,<䟻v6g>b1f)E!h+{lYYYOG~L?63g=zt̙u"Hvڕ"f̘^0uւA ¥K6Q7<<<,,ҥKr|aO:599YT4H?9ɞ={LMM-ZYUUzjW^yŘ  >ECG=*%  f^y5ag{{СzG?֭8pÇ%ɇ~أG#F[naaa[rӛzwƍ.W_}ZvѣG͛X oիW;|}BBBwc^K`Atmrmr[kq -۰;/Jmllbq{t|}'jtYK.gϞ֜l?ѣ澾K.l}}1pB$MQM3 Fl % H?{{rSj#$A Q4E1eى]g-rrrgM húbXZ^^*--ׯBD?@ `p!Ri_>7ΖA_ fP.?gOm;w3gNll;?CZlii{rJg8!DZTVVRE} I7mٺv.< B:(Fߜ,FB'NepvvT*0yyyiii733eu~3gܸqvJ;v,͛WW)**jOG;Em N许\n`DFPmݺ5??jQQQz@@B| ,hm0ϝ;3xyy_ ?.ّ7~iFFСCW^-P・[֖_YR**.Mǟ^RIdmE3F1$&aMkj+?ё18>w]7nܻw… u:]Ϟ=_~enݺ۷ 4_-}1 Jcƌ3g7ܺu3g 'I;wݻ###-[y;PȠԺw_r@2s;w^5&##C& %|>矿yf̙3VX!H#^tiΝJ7x;G9sfƌ:6iQBHk`|nj%fB 6&`^A`Qja4}FH$*//?Ϩ͙{,>kcǎ9=ǡo߾ת>!)22lBM>jpL& 'bذaÇon333Åvvv4-X1ۛ!&GM)oq/NA`LI4 aH64h\!4}3[en7lؠW\y2(O '?:-- Pgaaqʼn'K4իWϟ65Mbb"0lYYYFVx>>>?bհlQ4Jh0:"Hv|=$MM!  eIqNܿsS߲O:eBBBZvf;o~6txI56ܜ@}vs+ŋݻ711QP_̬53_'::z߾}틎4h~1zyvɧ0pU)UEiRJRN((\%S+ss5jZ?}j=rZŠ >FIܰa֭[ԁmRkʔ)(zgnZ'?aáӦM۵k׫jd n=;;1chNzVz&ku/-rjF[X!![uδ_mmة~S*Gބ; @˴뛸A<2Ayx0 tt t0̓Eէ|'Σ@J' DͮsN 2Q#0 errrCiqM P#111...++KѸ͚5ls)D2}7|ݓbgb?eʔ;w&$$D"KQȠ@ܹ3..7033V\Yg͇8p߿mm޿!lٲYf5_uС.;xKݛ}ĉW\˓J\`.'((0tlۄN#YςG!-kΞ=W.,,$"44f333_޳gO66… [l BZ}ڵw~7nnnl-..LJJqFTTCWd㠠&7nܩS0 b}||;ceeT*8o߾'NsE)ʮ;л= OF&s+Vx7H駟~駾}6@ 0frrr***Bcǎ%IvС7n+,ZÃ},--yyy˗/OIItuu59|~)3 G󽼼-[֑NvP(coo_YY8iҤЈ#ؕ]eR{x<#D"cz:m!Bˌ36mk8ߓV~z!ƻr޽{gޏ9riOOϵk"rssB$I꫟~;wjF133[p!mddRD]xŋYf-ZE(Hd O {߾}5jY~~ٳgw;vDEEٳM|8''D$-^GP4E8< """ Nj]\\Əv2 0Lc6,;GicXbŊKƌ3f̘W>rHw:Fȣ% 򐐐Rfg1 fDD& ?a4))yc۶< ЎPe2嚄3*ϞM*3c,K< ./99 Y3UFVVW_EA >!Ν|ҍZ ym3d錼R˕;wifժ垞e2?BېG7-E]^^4ͨՏ<GZvDCsr nܸkؚF5ܤŠ]p 0{Ç7+Wd2ل ! -;:Qml۶->>~„ stΝ裏ziӦ5իẈ3gx \/xĉ+WIRkk.XwJرceee"hɒ%666'R-~-!O .o3%޽{}||zjYrH4rq`-..LJJqFTTxʕ;{+ ]/4uTÅ/pɓ'hnݺC~EDD?~Gn ;o޼E5[.44tŊͮ /xxx :T*'Oy}Њ+&NX]]^XXo@F>y:qppׯݻS6&''^zȑ~!˽{neeŋryYY٪UBT6d6lHIIqqqO|>B~QQQw8p`yyy~~>kT6CC@lllH,++TYYBH*"ǭ=zL&+//ol5k{{{oذV>i^Bv""" ҵd#'< $''4mx iEEÇCBBBVVV!XZ rssC&.E:uڵkB.vږ-[Je``{WgN,777@1BH$bvQ]k (f̘y'O{BEGG#ABO>'Nat:# lٲUVZjĉ&&&1bСC{_988ٝ={vǎQQQϞ˗.]ϯvvv8p;ɮDow!//{b=<<&MTg*uA?pӧO'%% :bĈ-[8p`˖-l_ |x;ڛ\pIfEDDlBq+_ y D !\ BhuBgci(EgRɝ6?b>ii;wez/}Te.YO? @^D!% + tHʭH$:x ,\|mv amm GW!$߆Φ ^쾭~{>3؟mǾ@7Vy qDR[wЍmރG"\l5IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/000077500000000000000000000000001475757676000212775ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/boundry.png000066400000000000000000000006561475757676000234760ustar00rootroot00000000000000PNG  IHDRMFzTXtRaw profile type exifx}Q[ )v< qhǤ`ǟ)cpy1)R3ZjڑT^ OPo:ńB2D[et{ }_Q:|iF\lƀQ 2Y8SF19nk-Vu}ugIoȫr*nitˋ“cpmh`14<")N_lIi&FbKGD pHYs~tIME5 utEXtCommentCreated with GIMPW+IDATx1 Om /P1IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/insertion.png000066400000000000000000000274311475757676000240260ustar00rootroot00000000000000PNG  IHDRV.siCCPICC profile(}=H@_JE* qP.*XP Vh| 4$).kŪ "%/)=\hV(hm ![¯<1()1'){zcYjR@W & ٴ ļRTs .Ht7E9ɛ<1O,;X`djQU)z2bUjJ셑t#HbK!@F eT`#FN4'|î_$L2r, ZI/)^cͺ|;N>Wz_mZ.ۚ\COdJ }SzּZ8}2U88Ɗ=r/ pHYs~tIME+>BtEXtCommentCreated with GIMPW IDATxw\O! D@QR[ETDNZjjUkuA uԁ d " (Al3qr=1\.'w>G4i ֬Y`!Z7eʔ>V-*Bh˖-Yߝ$&&O?>rpppII B/_P(ncբ LCÆeeeds:ʩ޷0Xj9:B95y۷oCt@d/QQ@ CBB| @zjj>CaHI p8P2@88:!_pHbzp8OBpR>r:=tRSS1=<}χb2  Dn@! gffW-5XRRfX .ŋW^MJJJJJzP(䘙lmm{nttt|||AAAYYYCCݜ9s-[FѺ͛7τr5lذs\RNNN sFO655AE2tFt: !PcשSv%ʒ)))'N4,22222ȑ#7n +W?~SYY޸qCGGgP>@_Lѻp@aHAXvm;v3f ''ngg7o<##nSL9s&L&.wZy浵1(h;wxԴyڴiQQQ>}oGH@^`A_|C33?#&&f.3o޼e˖]zOYYO|?ܫwrʕ+W$.PZZ|/,,,;cĉ7o.Z%::ã֋RZZtR޽{͋RPP$}%&&wq=zʔ)C1{zz" /^y}\vڵkĀyN0f̘7n,\0>>8hʚ6mZnn.6:5!DE$ :@ƍ;lWWW1c/_믿& ܦNJ"h4Vo~ cc챱UUU!2|СUVPQQE566vjGKNAt - ttt򯧧'XAAAiiiW<{_KK B`{{{wZo illeh4 ߽z/_/JA$̙34>5ܵk׷~tҺ|sƍwIJJ7o6}}|ggg_^!FO~A m۟>}>~3mڴŋ,k >W[[`eeunsBhѢE]*ݻw,[l huVW>|pKfeeX(**"H~xWSSsŽ}Uxxi}||cmm})PLLɓ'\]wߖ,YۼyΝ;BնXFcm!:B$b9::vn/YLKKNJ477777wz>$Bh'N@|vvvйD0DmtvZ[̙Mێwu֟=ga?|qT`ˌA{;B3bĪ'Dyֶ/*++ތ=˼sG&?sر EEEۃ8;o=\\XXd2Y,+&3}7611>{,,,,++㵷# o>QE >Ŧw3G+mŊv¡BQЪU:]WSÃ(N*m2$L?=+..~qa/?M7f^= ك+Wd`dJPEy!0M~GbnR4@'Ç;::R(|=M#ݱ4*]g$ivI#4=UV^NdY =H&7 `tx 6P9BrݺuحK[ZZ=z+1;eH@@@B3;WXi=K`я?DDT3fFM 7^elppnjjuii[K ]AAAEEDu,dSCCŋObcK_+(MMO-Gt:D>~DRAEݻ0߾D2Re}uu/\Ȍ{˯g25 FvQ"K1B4:mmo6ѪU5ee=<;"29 r4ڵ,^U$xn@yzztleh4p̙Plk/^ߵkB=##d*))~***۷oq}tlBĮ7nHLL|eCC022Fb'v{yM_>((\]OOoƌǏfgg B331E'//6Gv([tiEEE#cZZZݻry<FSSS𰱱}IᏰyGoHI*$?yrtʖ&U<^#Wm9 237ny]8p'u ?"75>T^z_6:n %̸̂i8Ģ4U!nTQPiommjh(ˣ+*rEW$0aq cccssN ӧ?e0W\!FX v͛7P%$$ڊ+ٵkvXL}}'Ox?>_ 䥥w@|6ΟMG744t<=====wލFrJ###=<۫6uVDqq1vQYK 3lh!g/~ ZBk?KCJ~D"際kꘘ(ki8:eYJE[;3.{PV/u$i};*((ٗOw!XD22}ڇXFNRR[K VŠU!gDG3g5Bѡf͚ell\;-Z100prrN߾}{t:or HmBjjjhptuummmE_=%d2YSS38^zRRR蠨h"DRO憭ÇǪ}ԫω-uuuu;7߭$mf(2"d6c2, [__nw9s¢Ed E t6u* gp&&u@ ;d:KMMQM xWQѩ(E! !!,uNB HE[n ϋߩ\{_H{t@9:::::ddddee=z(77?}{s"f͚EhOO莃l+==](677_~ =uYf2@ eW]pFFFxwBEEE|9؅Ihl6+v~U,JI"KUU]Iq?brŋ+WmxVQ~ .LΑ[PSCC{[J7.>, !|ĉiWb*+.]2wq1lOזky mBo-ݷJ  *yD}^ qYvvǰVnn84@Um۶9997䯵522;ByIvرٳgLe>dl6L&c'={olllkkÖ'+++|U#44Ro޼`!뚛]ZV}#=ҥKSGo ;,)))**rrr\΢_2 QQVVJ$2s !ۘ H4g& Eg > ZY5~5J5>|…=%KR""n Owyy*+&>5޴}>s yҥׯWW#* ϟknRW.--rѡ- }zzz~H__øesss*jee5k,ܹscbbcs%''2ϟ`:I+!^ϦOwG񉎎EZXMM`xt蹜EdTqvvqvv#i¦VnT[V**mpƌ.s?!UOk&D^y9By&s2-Y+~-plA{{aǁE DQuK"~Yw8!!!ݎr\nCO?]Ԯ޽! t׫?Xng9}ɜ js8 55 rt6C[Maa._~[9ǓYjjZZ66cpz39⬬5D?O}654 }̜9ݶeT Yb'_qNqNN#GcZ D?~<99933dp&O&ɜ:uꅎ+$ KKKkkk| d[YYm۶-<<<77VѣGo߾W__///naa1j(O?ˊ^}dGFFF&$$pܺ:999UUUKKKwߗ$n8#-c.}ddpEt捝7zX"kwwkww1ށ4oثmQf޽b?+z!chtng]ԽOH&MڲeKl6[͋$D:uFNMMeHI VaxkI}p] !DzrDKu)ę sMc!:pW 889~(.__{dO*Z{;aHly^d2B]޿{ˤ9r$66P hkk;99^zܸq]tҞ={=zD&M~cccw=rȽ{JKKTɓ׮])!|_WشŲ1cƚ5kx"~ѣGǎɱQQQėܱcǎ;邂}}} 1:uqq)~߿gii5:ڵ+44nllRRR222֭[wލ/ܜyĉӧC. tȑȓ's^Mti]6%K͜9%%%DqqJ\ wr׷Zv;w^7a$Bz'11111Q޺uߛΟ?i9<<|˖-شeQQ~111X ]|9B(88 ׷ԩS (@AaDtu=|}-ӧ Һ Bf?!|ܹ_ܺukΜ9B0??p}||Çgu*ۛ>裂 . """Æ  aZ2Z9c~|IxWxYTWW7EP(#B9ܺu BHWWWWW7??!T]]}kb^^^Xn>D@nhjh(mǏgv,\\jBG}m4gٲe4L?qDJJJ6"+hNx_+xRÀK+Wd0xE_GGWUU7 d" 񝥮F@C+999 #G.YdΜ9~۶mo{Uss7B6lԙrBt="a@숐#c-M3ЀWWYI|WQM0CŒ={i77'OR%K8-EEE0k\ai) yp Q,;gqҥd'''!PwSRR{1nUUUXPuް>>~;wD9 @>;gJ ؼysJJ'|baad2ĻDvϞ=300h jժU^^^Pڲ5k>?vCE["'''/el>wP%?G`0gϞ(^/ȝ;wnڴb0BCCq7=٢[VVVD?|۳3gݞ={Ǐ/ u MMrH˗c~+VKq{]6@t 7)j3nu4]P^ߚ_Xz!Bb+',!=@nw4 YOY~Ol.F&Atr^ɭV~QyJA>sHelzn=sO|m|4!: "[I@%| )5^d)\a H(BBBTηb̆DBt'C>?,CܺukpW@KK W{F5l3=!q8(&`qs>:N\.˅BSn@]f#6J ݂{X{),IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/instrument.png000066400000000000000000000105401475757676000242150ustar00rootroot00000000000000PNG  IHDRu% pHYs~tIME"*J& tEXtCommentCreated with GIMPWIDATx]yTSH5$@KAȢ7 *B*a{QOEeT B# 6(*SNYݧxYŅE  B  ǵiY, _s|2˽NT2@KK `0-eee4rQ EQY! P"@)[,V%FJ]S5rv6589_Wn1%fHsw>2r"J(9O:+FG'֬fwvss]Zkg$$ccǫ55W<پݡ38st4vw,/9hccnQS19)ߜ Na|щvnff}P&fJJ/qmjsLLty?oCnuu "q33,s@8g0 UUd2yU ! m,,p'OKuuÇ,.'ƙol 5x|QvSS]$oiTU1|}/X;y\\237' YHQ[,όNNFFZK"Q[ :.X;vAȕuCG"Ӗ-.=FֺuX9PSӱa@73L&e[o%FVGT L<?m}| ٳ|찢50]& /_vs=|DDICC7=44VSӎBluvv655]v[[^^>00`jj FXt)@ӓlVWWꊈשּׂŽ?^QQߟF¼9ӧ>|ARAAA<\ti\\BϷykrr211޾(66omiiXXX9s, رc<orr/tuu-))ټy7/IDDĉ'FGGi4ƍSGGpJHffO^^k###mm킂aBc`bbZ__ŋo޼`0fff;wtww/^Q]]pRmb||ȰsvvNMME"q8\g[L&HgώLNN2gϞYUEYYY}}"-Fѐ xg}fmmL{166& ,@'RRR 4â&.\PWWW__ ޽{͛7?ЌH 2>>nnn&gU ,J'''*S~%;ݿ-CC+WFQcd قl?HӧgΜiiiAP{unΝ9;;'''KKLR/^ XSKHHغu7|>}:G9Tg-500@RYxK\&tRSS_$(O5 [%.{zz޽{93orrK/Poճtuu{zz[29H\hQmm-EYeO?GRRRRRR޷nB!b(?;l a``CӁt#;;&;;EY ::::;;mmmt9::&''H$ Y`KKKbÍ2׃$6Gц hH:t܌l ɡP(r>\"dTAeeǏeZ@_9~%;J2~%[B@ [-d D?.=G? (߾}̙3ϟ?L>?ގPUBH$WWך$RחC>f͚xi)%iiiS|i&x<<x) `W^L,{n;vzj__uiٲeG`03הr"찅HK,),,p8}ё#Glll~555D߁d[$_~ph4ZMh;vß Ebomme2Dxq]~gGP<ŋ$I)azzz&&&˗/bnnn3f:r䈗Ͽ+6%J===S$ybD]~g ?w\zutt48e4 #GFFfX/99PEEv˖-t:=##C;>>.JJ9wӦM6mr/^hIXPrҎ %^mooohh(d33쑑GEhllX,d?L&#}WWם;w5zI,46- /QbFo޼@n_Q!}IOOR|>?44ܿ?yYmͤ^9PW@_ߎүLlA_B@ [--%}[0'|booK*))ɉrqq`0<(//![/c={6**qwwwssM#Q.?Ee=l577 _^4RTё&x#zzz׮];v˗544*;tV FKKKZi4wy9Uv-]]aiI˩CL-kkkmm튊 ": ;D[@hfuMD\dW+zэeIRuO}TwQg9>8 JA⛣A8{`pR"9LӘJ$]K:u@ m.Xph9e7;ᓩyf}t4Aʄ㸲R?sla~`b۰B㯀@ ZPM,aԢpiZW~h,' ~w czۘ8'%eR}]q]ӳr{2!LqM͗lfK(o?(,0ώ+ 3+t6ٴrPxl[7݈zi{NN˳W:[?ނr+T}F|{(%(,CKw ʖ!/"o6[`؆m}$2YWEq\'?M|~ո`3sPW*ffLȀ$:?/p%1JW{Tt@tBZPx"Č TB5B` nz %^`NCqiG̍:z%j;qajP @&W:vW/io) cwuY\(*\ E%ORuT9"ԝ0 ~d$.)e2͢+؃3^&f7 :s" "bR}<;2BuA$*D+%н^sU{3@= uBCM{H,],p& 8 um2J㓳:ښr8,'o>MNͳ2dkǙaQ制p.N1$I[P}~ 3:ؙR^ϝ?y8nz/v19`0TV%(lg~|a"/밝͟Lo7[Rߚ rafKmJ;.;1~cUc쬌Tw}2סA"8N8KS}9,hn@82BTBwat,@y@~/1s?;\ڶDKS1O2Xa(&h0B'.z+:*5/3WĢr[d1+ɊJՏY,t Ttj:, cY(%Ʊ_~v%(@ԗFw{VF2F`Lo];xtx"E*S*8(x{*}$*~>I鴗$~ qzF?D%p9W~tzlZE&K@ ĞO="rA,6BO$a ue2ʊ{Z%TGQ%K 45D Bh^!fþgBh=M uh^0Rlղ7c_IB>]Lq\I> JJ\Я^.UbWDDL %YO%J7ъ0##ߊ@ M}*#PiqjO@ @ >^8 `x %㒳"@ `FFFH@ U_Q)@ D{_0x5R@ E/!77)@ -Ȇ@ y @ @ y @ @ y @ @ y @ @ y @ e8Uw]6<<| .w}4}˗7U" g̘gϞZS*F9~xiV''N,++;y򤕕zZ?T~BݠALr[,Z K.ƊD"@`llܭ[ B$xl>t6o|;>e˖9sfРA:ub~dmmh"]k@"?CGAxzzR&*'''!!!!!!((h֭:::-'N8vq܌{{{OOO$xk@ljd#ڀ`iidɒ?s۶mv0_ZZ~ZBTXիW«!I֮]K~"""X9s洪t&&&?~b}ÇlFF۷P γ ~~ &Mrww=|x+❧{ӦM֖ $ 6b /vttDlBhXeA?˗9r_~VVV7n011*p̙RcccsZ[[3IJJcbb |Y,--)ʳg޾};''xȐ!/[%62 ' g͚5b:rD zrJ##֒)?jڥ߻w/N7v:s̽{_~G ظq#3IN:r<~FjKQPPpٰ\773fѣ^"r-k]tlzOXXX``˗/JugΜ)LaasܼyRtuu~͛7lBpOqwssJW^ݻ7K bƍϞ=srr233;w\nn j hcc㸸_~\͛mmmwburҹϞ=̙3&MNagAlذ!""Ņjl@ mBB_-|}}bϟ>}f R:%JhJKJJ:vؽ{wDxɰ;wx:~zHdjjT*N:գG]jP(00p֬YGn̗w[Ƽg6T{yڗʷuڗ:hp@h%Y=zgedd 4_~ܽ[nݺCIG9}O?tQx8W_QuP,fW^8~!NMM]z,X`oo_K:_z|K}M:$ɾKʡqBBBXXX>}ZuruҥSNgΜ144\`A'%%=z>I Had7nD}ф "U8Ϟ={2z.Bؒ@ǎ=|A^h׹_ x3jϣrJϛ7fSccc 6iii .4hkUӮMÂ7=xɦߘۯW|[}Sjy"EjUs8?b^nݒH$~~~@5U,^6;;;44h֭\kk몡?~hG ug}F_mРAvvv}cngZoY{骅$+VgjO}v^^ȑ#'NH puVS{@dnn#Gn߾ СC5P۷ zpBUH[4g[[ۢ/nڴifڿH$bb?oZfS-4y{SMhmX%_=z4ydccJFEE@1ѣQQQ m۶͟?ݽ&[ehhVՃjC=...=={[u޲oda>}_j$̛7ҞS>1]yyffD"5\.7==΋S*1M`8rHDDӧOϝ;w޽۷ST|yo ϛ6T;|nkjS. E/mK, o%rU"PAf̙3'...<<<<<\(vܹO>GխiVvP(tQ+:T jy[Rhj-oTP1 vvvܹ3K.8pj>g"Hxnn.59QY,*_رc֭͗wOVՙMИo%_kY.&E/mK*~==m۶EEE=~ϟ?8sۙ TXӉb}SNt{xZBDSiKǏSSӶMU ?LMM ###Ȅ 4@"C]ŋeeeʗwUVUMt0uM"E/`jj])(SIq ü@$8p͛駟P5tTqqS.|`ffԭ[AYs="\$IIIf8mB<<<7cIIn[ϗF jMt6+ݾ6RWSfsaLgݻU144րx5ʀzQU:H(zvP("""*@u=k< ǖrU)-O]DIIIjTZ˻*[Gl)-wڔ -hWfԨQ 88ÇΓ'OYYYۗsҥ<4E;Oq8CCü}zPԎ6ҭXf?yAгСC1 ;{7oeܹӄ)wvv>pCCCcbbH411ׯdҞc `gggϞڮ\rĉ!!!ZK.BBBy;=<<3=`m7S%$9k>wRG z%hCLL ҮpppY%r| @^VJR]Q\\܀r9| AWPP/$\.'tttLMM;t`iii4KʲFEB" փT*ONN.--0D"H*:w驣i[4K|>ɋ@ Z$I&&&(]ŋ/^pႻ aH6!HC@X"-BDddÇ333+}00+u&vZ9MfOknK-T(u0~q_$As/"BEqqիW=JA~ yk?%+oc2Ưu =^/N^~S(ʖ>D"9q℟رc9N=>sJY b^G 2i\ liȍ,eRg_u @?km1{rHU DptGp>Ih H$cǎ~(3{=2ǑA|YE5`ﭲ 6)7:vzQw _%d%77>ȣvn$͜o zw8-0$z49+L*tu-,ۏĄ:P,w5k<:vlTݍIj;h6f(71vȁJޟ@3蛛uo\}s3-Mc?yS^U}v:x↯'?l~ kB,:t_kla;!.4cRU<[[;]ml,-|HRqiNNvFzzr/22ҵOLrr}.]J)6 JApKmG=Z^0 0075W.us?Wln:蛙%Jť|}=WRqibc*jRÇU.xs .㑯\ z3m,wz^3s)fL6#eg$Y)EEE^bE OSQΛ9<@^Qv bsu铫ofЇe_(7t{Lx[R/٫WԆݾ5kl*#بV<)>k IDAT]=;ھ'O32J%]>zL^#{ uu]Э[?/.+ha1wȐhul ]ܻ?lrMl.AL/OOLuKݨd凗}(-/9j/$R⸱=NMza֮C G'r^%t[n I!Y W_<Z. |{ XBSQ# ~}PGX!N[{'yzl'c~p_PxN ]fzt`^䍛GQ6JeŨ[229d:is$;yǟJWN^wR_}0O$RO'05\*Twů^-c_W&}(;gĚU (+.v>/`K?\j_km@KgSNl($-O_^ӦXwvs˫"g_qF雙F޸ubLv{|TFț+폺yG:nNds~~~~A%:?$;_&D+3{OnRRFLl[̅WRH+yfK:,"pxH$AAvmK-rtʕ0,eL-;ţs+cOqK ÊX?HNys77W;;w{{G++f c_w'#U/i[@'KK8];;|&,>߽xd24.=}.sQYzu'uY=8V I35u~8kԈڣ#?^}e/vͺ_޹y`ϑU8*:iߩ\/3WK a!J6+ WsZȘ$Y/ǿR˄?@58~'=+LO7W!&vv/c RL;P;~-vvg}ӈgY:;+_*R%d'NY89zFz܃GztG=M9~wa,Sy[l=HR.i{ FEEc'lhvݽ+ʵj2rRyiL*W \I$IU8lzB!GF=f.ݒYK:CCC[` V$7ej^af } }.jIAZu,aD !!;p)6w mكtHϜsO?}v 9uD"QF'1c[K 5]7w} },42=c9E BRRRVXdީEӈJqӛp$e'$750zH4wkq* [!#XwMcf:z)|Xlv t* sLYąw{xlݹZ()2rR^gKˤr\IQ ri~uF~묌ܢr H io.n-kFAzHEWْ 36K"g|ړkAZ{,a[-v-,,.-:O$wzVaӧ~\#{0FAeؙU>GeϜ]lm >]3J%-PF<>{.&ILҮ mVGG?8p0l/yͲb ;gAճJ miNq~+(ofmys)O#BNxqtJMff +-o'] {;-[aI/put TώO`sziӹI\JqzG\DEjz WR&heJ%YG{ήѷ= ̵nmRX`hXy] ҩGY[_.i_3h-OnM=JUL Ա.> ]y^g>)O#1h(++31גra,56yYyO߼9|}WCN 9y1r絝% H+eOg%v޹W֥E$I2;_TXR$``\cd?dINT+)ҳuu  $]7oژ*4GFFի@z&N>m C mۢOl.I-y-H4qqqq޽ڽ}F?sʷPjrL*ӎ}c aǎ-J=AN#ɣFgiag }n0=s}fԸBaI^[/X= ɹ;1NK{z$?*/܋y'V-5--($IR{GAGWX^T9`[VT<]aOa>&LPZP&ŋ7_F/>mqeUoJc7++vviK%(29aaA%<{==5ݻƞUճ2T05e1>bݦgG˟~)eFAgήhn0-T'ARc.HQ}כn>AK8u/&W+5'm9sLh ,ԍ=,n;ژVݛ&ɤČ j}@z~>6Mx(l@@Byq߶ cWog -4ޤ$7W̔"׿ԽEBpHIn^bpEn]뫡ugWB"z (+iprTd ̝iQ`QCǴ虚z :{/IڊQQQJ~~Gxmխ$+ʓ3rraa,EoKD ca>ѧ+DNQL mp5Nrss###Qaؕ}iA/&ţs|t | /\*'0pɎ6n\wÇl߾y;X];qޙRrr`ƀIIk9|֧ӓ5M0Uq¦ӧ?f^[>fN/zׄ`?Oa]mGyq{|] .Q8:Z<++.0-oheY_@_P*Wn`Lvif\&5R]  %eD 2Q`|#G)A ޤF޸%04t[{SEB*Sd^Л$Pz ~T"dI՘YRמUvf;6bOfFdH*+I$iסkI꜎X0PUYrÑ@D D?1e N+|wP3,2lz%9ĤƤ~'KťS!''?O :sak|O;k nʵW}ů/;t{{hG+ X CK>pR*.M~&$=;'Æp:!1SzВnx|t0*'m4ӽOgz%9yaMڸOwc[[ wXl)͛6x`¹OoXsR:"7f UHD$`nP;11133|ݼ>6W]\]M<^SITvPmU*r9}"ԑwTIF@dQHKHAC=JKM6M.#eby88Ai3^¢#9:ļ|@,.1sCCoGUx~6u*}[\VXݼy==ŧJ$B[1={ږf.[vͻ2{ 9CУDQzƽ?{N8}z9~ ڸ_L _֣K'ɱWI7>Mйo/^%F1J}iedm0 ,_f嘀77s>ܡ݆oUH]l=<_:iڋȲbCW8&W7Md0lŪ5#Io JR]>tXfx*2$Fb$F.\u{<`3.ضeSMU&4AzgvZwiQzhXs722:""">DS\/$} njGX[̔]v:uɓ'Z^V* ^GjYls/{?2+.*ZDM?綟RU՟袮C, \?I]coqr|NS>e y=!k{/H%?hT,I/R<D wh":x.F(M_i3fU2EaI/F730c8_ [Y;-qW$`h15݅BnZAiiA;]* ";y߾t R T~BJj2[B['>>(:i+utrav*9j3G fzP0*>G3]fFzM7m Eރ50nI~Ri<$=R- dXkIvᬣy N#[~}nrᝄ$dunGz{0xHT"c-]{`A=O@žz- 0jfxJ% Ck2ɌM"m2{|*M@;y$>B@R^°"jd$bwc[Ym[!»Knnnii)ȍ,FQ` kUJ1 Swī1tKLyL T̾w, 0F(`HEjE,ZXX4 SII ?\m]<:8oI% :tG:\h *$ή9 RI2PQtud1Q3jG` y #$ p:nhdljf^_u4 e5yɖ5 -Eg0 ?f$$VA^@_JkF=/o|5*-) Rm4vc`.ac#!I T@@] #0T*HuHGgךb~i';KnZAI_TR!}Ƽ&fIiz/  $/h*ԓ;h:D2(0iSmPvL *ݣ*rd %/@G0À#cDڶNxAV:}&9 /+&Nw  ^@ @fY%DQXZ@fN6A2 2 Իr~0^ v~ LE0j"0HXIm"ibjV4^qA !I2aSBxYԜ# b (@ /q}*w\Q>l"I@*8cdUި{?yTSk&F?"b,I̖:ok7I0((?qx/2cNAC [ %n"eLQ@ A^dhq!zATuBTn1hS(48x<j2,$cI`0c]$h SsMIhh [XV܄D>zݕ2{.X !@AP,&=`mڊ<͋%OGw$I2TlԽň8E25 HQPUIRmrIP7[n.bW &ԱLL=oaT[BkT*KTlB/qMA5K UʧǬ63;qqQ3'Z"}9KGu 6-iV?p^CS3sF)A%8Ξr挃*`G@@u{w隥*)a)dr.^\i asQEK?A!G!:3EKx<e9er#;1([,BzA TY11`գuc*^1f]d̑@bQ5fFGP2 JegiARZ:D)4OAKGT@X[G(G\H{ r^Qvnn9m, 0R]XgEċ=GՑTKJ%mH(*(vJ^qZ%N~zv.cj陸Y1Hfjzb , PaUhIM>ޯY(ͧZ2: FHp RfraA^McbbTpsV% DL5!?')vɔ9,#z$zèA-TYD"!=$ITe$ʬv@7̮ R;hh^0#)1/am IRUI}$MUB@/`@vUg~RI IRTe2$nio[KMwulX@_UF Qt&t9YaaY@z4sbfL:ԜL[b$eTg=*^\T(*.v@hOA@  ===s4cD~$4#eST6 Bjc* I$JA 15݋~WIUs@y ѮqtT J3w OBTH$ ,մBԬ>ɊiI2'^ cvԄy$"\.1 s|Ld7TO,: htYe#;KFi +I$cNGjV/VwSw㫴A k)藧2t#nnnM+{CfS% DˋHz w_mA@IM=[KGUkЪԯJP 2sX.r=<},#L5.wrpGZE2Zb1  W*8T*LI$2m2A7Ua` W'i.[7AKVnVztqʳ/h>Po_{,,,rss͵3UkϖtS._P ~y q9\ӝjRB`mX,jǔIM <;;C.#2/)/w"T֔rKKK//fDZf{ew܍nyko4Y,!66YijU"!X X &_d$IE$",",M`JAMFSRMR$p\)W$sEdqŝkbQq-)8qbsԛ];$udH oW4+JPn>pX.G!T[g...ޑAt:]W ?^Ǧ>vhEW5$IʥR@W'X$X,R"X, #Xy5Q]pP* ,))UdLs8y)/'4{{{;995 @ǿRa)p&Hx YYY֨H7YYYHD+|,Q رc%N^Zdz?^ K\gc3{2>_PR.V8|9l-dCg; QX.V2 J\77; qƵ ̎g7'//7H\mǒ&Hx |"||(F2 Zc ;PMv 0 Y=g+lI)ڳsV6\)d%E.ry.`,UeVB.JRD*T ~pJb6}tCC8⎕]tSX&HSx |>_^@bD|,Q7 g߾}CCCNEQ7\> ?ӧh-L&J% W.Tc">T;o߾-0`eA)7,}= X/f5VX&%%apG&]tݺ&j9"` 7;#Zqrrj:-dS?ƆsA% Mf,XwlLjir3Oܳ@l3">NO Z`F-A@ >dɒ{u,:)uRegw/g7O=}-͡D*UBLQA1c%K| @h044\jաC^0']C#cMͭ tC WeX,*fgeK!zҥH uptGp~{NErX뇭ɭ*n޾I7 ZmwȮW|߰v.ˏ?Y"QqQ'i zi]kBG?]6ї)7oؖKo_:x T%G¥M 8o_>2tԥQ[ 9yNQF斡~^{N|􉬬 6DXe}Qÿlo|SR".]ӀaX~,Yv-"{ U!RUswn5IH7# ֝j}>ľü߷y7m I7 ?cn~YGWe:Q gĉo*ϟ?aim'7o#ҒԢ /E? 释t#of*_Iť!:@`ٶP*kl羽'mP#iggwڵȖx{7g B ^  ϟ<ܽ3jgfjr%/oOy[^Z":z 7˳ZtRHՌ7IRI_g`hlع[: >Z /S}Mm]aᡧ}B1   AGOJ2`c1jzqƍm;+5S;ѵ(qwOOr4ůo!-ůnAjZ{ß-9GhdTߛRd6<=??ͣBN6h>|(WG'-2*`ظI߮^&vv/ Y-"oX,O ar6ĩO/_I|5go]`>'JO复]]Wz/lܔ$ֽKױW;w{'?G= trIqov/=[z=`ĤC;["*+mңϐv('|&͐!CZlaC$;%Ew.qyN4 ""WZˊK^\;%;#5JKr|5MQUCY31U<|0e 7tC㘡A?F֫>$6qΦFnoPoˉvcn{ rO.Rl`N .-E?~JGٷFQ56KS+*7O.JWkW{P៺3(4N5џJmc%YPmMUs3RV]IUS0JL%FyAnd}*G\\!TXX[RRR\\\ZZp8N}}=L&dYYYyyy999 yyy05U d^Gfxkg7qs`Gk?Y-\_ֳKyyBxtrhVr*UqW̱YWU%%n.$j3$dQ"vUUI2BGWÁܤl?"q(t̝:y֖Ϧg`>3nlѶC &ÚkjҌF5;FRVG8!>Pm鈈!Bu5tvmy .iN8h"1U q66ܾ2#5!ti SdBTVw_adn>A%Ee%6 7 !膃,|Lv{؏92P X..T^-v-TN[Go">CRxCm]GFMm^~8~JDTr J,.V12 u;9Βq@"j+;Xe[ֲaB$ j%$j+:_1}NTw=&!Y])^eyi+VVuLg'pD#-Xnlhqf+aۉr *zNq{huU(qi_}aoo79> %>a5ƜZYTFWT47K5y%.)*iɈ$d y2j ;z<|>Sk>>*Y6]܄ĶP\QXQ)h7 ɉO@)LpVѮ,m{Ko>\IUS!}CBSSf"QLIUKԵ* ޿6MjLzN6o6M,BH]`tյTЕd*~Hf6c ?osxoLxГۗ^Ӻ/2S,ڱF?v0/;$Eg>慿|o{rR~n~$7n}_r'>áФBU%%;F!]bb= CWR.)<^SSLP'}i1sBms~rJ}2@xxPCm)KLtnE>O0vsE{҈R.; c5ß!|jYe.;6# -7ڢ;|SUvz3!t$UJ+A ![[o-?73$a1q vmaʔ)sݸq˗ʄ$99ŋ#?ɓ+**:u떫kXXȠ1zqeXsӻ.YrMbsy<^JBO$\|Y  bf5!SPfڛ̴7!sD&SB.n$tJ"-+*;ا9rYeaQfKq|@r֌K68B jwlTrZl?EDDL'k:,gs+)rsgx`@ANςR^]񭮍5*YPSc?b ? &8X[%?HҢM3mqQS}}gD1RzJ\An7*X!eF&vB0ƻa!tOƯOtqqxϟ~֭[mmzwww*:B-gϞ͚5!:>n8P #C%3F'=1u2@X' [~w3STWS 95QfZgF͘2uĻ vimu>i̅ج'!A-v*-^aj:NԄ& w;#g[7Sqt@P%h[0}SN+*>Z\ٸ ""&\bdy'#U_[+`ȨVua$׌H} @0YZΚ¥/%$,gϜ2AN3wy;Ө$v<|/~SjO߾%5Sk5 !h7 /^LJJD?@pqi]&<<;={bccvQvؙ3g aXCbP ,|]H~BAYm]ѥDM]]BJr©S ^!'|VB Eŋ\.7((djlld}hjj">G?BHRR!$QBBTe90ЈFfV`gff*((Djgg.lW1t\n.ZjQPPի#""ݘ+DDDz36'$$ZE IDAT!D"JJJvaHIIF/:@,_LL ~K999ᳳ&2L5pp(00܀q'#G{xx`{_,Xjr8>OP UUU!1116666=޽ckk+v0orr26޺uBw2&60@&dHyaY—1%b>_YYORwލ{Xx1_]]] ߽{奧;s挓H477g0EEE${9)CBBBo)$$5kNYjjڵk;&6 @!S, jl,!\ ? H$JHHhjj.YdԩލTŋgϞQT555֪Unݺ<(---..믿?~[ZZz̙vBѬڏ?z3gݻp444m&8 B F_|/ځ ]~M ( $K{'uO656送L0E%p8u:fu`?KH0R c2Lz^]z5A maז>V+3337@!JN}@/~P$a`8,@c|#:HtP JTT`hcfĹ^~}Nh~~~ܹsܪ7[$|xqW\~`\Ƕ/K.gjh )=0 A\]]J"sxU2 WU~zCn4% ^G|& K 4c,ޏU*8 T|a[Җd2 (L&3:&WT6ԃ݀&!T|a0B_TBRRRـR.)U `7`? S=JA }Q ʰzF7 Rqڵ͛t:˗=WJJJmm/boo/x<ޅ .^_]]qFSS$G(E%)d2 Iz@!S0&!L>88xϞ=;vpvv?s]jU^.''ҥKRRRjjj#H}p޽իVP(ɑsΥRݟX[[;sL5;;… /_>u_=$ >2Lb ȎMBS=?|ʕ+7򤤤M6999)++ϻÔ)S\]]İ555o߾oNyŋ{T k֬T--h.ԴrJb0'=JfHC6H33M7 cM|>СC??@T/_tiuuu|gAA1:lDo$>>ض]@@Lr|>aaa5ZL)Ǐ/\D:~)S-Zt9. quu  Uw^^D@)))muuuG?]v|}}]]] BZt)B?puu7oӧ;tuuuuuJ[lq&O OKKF"]!o{Âl4`)HI=K_0>a<`F!|~7h*!9N>ZQAP͢$I9ߥ7+>MZHQw)zZDDEyMM E)*yNF"Ҳ N{A_SP 6lسg޽{nji^Ћ!<==۝"++mL<ɓ b}>5***3g;v%K>}*+TxbP}}}SShsS[[+h!/}d@>ζr1\"yZ5d^Y @#N K%S /M'%?T EEoZHq")HDIMk7[BC;^>b3wuA###D+))144D_BBW䪪d2BT/((F3/{ݴm O0R+YBr f-7^Wzx] !d`Zï̓Mi/2R$*H< ZEclZ;b#{ eqR,L !riD8OEc7qRpIgoe7-c?3t :264p_`]e"q )/B^ݺS˕VU12iܜلLswٵT:9aBبHֵ;\֬Rf<mSJz=WFeofxO._[DD&L<ӬW xp5;#mTPVw:SVpGUJZ[1~^S+!sĵM>|'b^eee// 6l߾СC:::!ggׯ;::V8>OPz5 Mt$44Jpbdd$t 2t ɮކE;cgl%%;ϿӯFfM*)}KüzGVSuxN\|ɿg+Onj2F\B4;'/ Զ ٱO:ɑ P8弎:ɹqq԰ FB>e5wI<51Ù lrBt LfK٭o<]ܧEk|6"oVmoaXWCC6mڲeˑ#G/^b~WWWWw{yyɓ'޽!~n"?{&VK~9BY`A?vKgΜqrr"-Zضה)SY,֓'O666aaXQւWҿm244ҭeTMc4 N)R! IԹء|>:_M !qV$EEB7.ٻH<$0\VʱLF1-UU^cѱ:qRu.1eJHYEZ0`!ZJ& +:mow6cV틓Ԑyۣccq!=<,7WO</MYc\;:6 W=3GAB_wf>,Tm<G 44DیnZt-H$OȺ{7o|%%?ŋϞ=R*** _ S֯_󸸸zgggOOO ~pVZu֭(wNUҥK1!!!L&dX,[@6T„)%q,:G@ef"dhV9uw‚檿~مx !X/#װdlqͰfwQ5*Bmv EEW1a@@f`ZcmSs$IP %ƭ *OBZ92#Y ~!K[̔92-}"qܜun[w#0 J$bqy&y--B֫m%̴D@Xc!$B$LvKL*HM $YNEqj3R rU4'Zx{]T:ói2=W!Jz[\F[c&&?%,!4gZL" T4]f=*vGi^GGǎ~G/6_"""D"Ʀ{_˦/Ѯm@N*8B]]ϝ;wܹ=>srrBQQѓ'OEp= 5!ˊ-{S}o*%jlci^;/Na;2^CMIy{Y iκ |Tq | {̬1tLK&b<-g]'GXΞ)"*)EMFM9f<UB~R =ˎKK[^ń^y&mwAWQkn)%'CHإEϟ*1*Idijn]1aq9YRt%U6LP%fZ[=~!,,dҤI#螩TӧOϟ?qhG_aowR⼪AeTr Q*bvF#8voc fjZw)+i]DA29M %}'~&.xrCkj$eۯ'!8UU:}mzߏ .VU%Q=ֱ*mF` `զ='B=~?vuo1V4FWTWSMpTVo]m .iNILLVWW>DDDd˗/w۽PE#E_ǠZǠZVLl'Eyw.9whK()h5n[eQ%EUM1dfrc&𑌢|=*>4Mv;z1DmyE5~vFR+U HJWa"D|#[˘ںڙi`K^8$~h}{2U]Ro,NRS$$+vV C(4 "[nkkkHC$a]_诺~*ZJS*"U[r3t8OV/JlT)4?Ywo%Hei!Q/zBU.h(X]Z*LCBHAG,'Wpgn›+C}<Mʢ"I9YAPS; \~|xt4۬љF|VH@7gkUWU'mRjLzNDobBL9;w|Stuu#_" }[BCHB4-EvV]ENV#KaB\5)h:C.hTVWB>hKIjZѬ4jLtm豫1؉]m2U:DSm(B趷JY I.8oi.|kr4q5g6,<|Cvl\J@Y̜3LʭNaS%$Qt%Ō\/)xCڢ 6+ᵗ~w"&~*4Ɩr3PX'QwOsR^ J@:Mzqw:s3CJƖ`y`( DzE; >ޥmfDY{ !+22Q9Qm͋mܼVc:]*VYެ34NC2QQ_KG "[=+ԯV΅#v`0A*yŵEZ%%oi[ˈuK޽{xv;h:,gs+)rsgx& ,gHnY<-4z`p4mƻ$-g.<,lekk&LJk_V\`dn.-~lbi*vx7l2{_[] >i &^%0Gl;HM,/,# F^xR#J)BUbؔ{&+2Ywғ%*CQYآҤeE5Ā {5d OMn={[ P?|yr_@e5ԧoXJ.-ޥ B˅*Fw2"Y oUG7Ojն7망a>W_>RumV,J2e&N ~z=)sBӿXgJBth]m !Ӗփz%e57 ЪULc`6c(1`s` A͒ ƥ)ڳz<+_YI!̀W5ˣcO2$ <|:]U?zwDDM"""v9R]re^yh=u-e6o,q3|b.зe${__**:*J#w kjr"D+->\2Rnh (:ruWGGg=̭'~ JBvb P @!2kWGХ =':`"oU"$ EƄ8jdfva^sҖ@)d n@P8``X R=*ÂL&`͑&᳄TJ B>7<<<,,9s;w pBCCjjjׯ7559ǻpŋ㫫72 IDATniࡕ#zd2Ld}uIII ![#={۩wĉޞ+))2u>@ t C tҥKn߾}ĉٳ'88!}wС .ӧ_/-----… Ǐ_rڙ3g ^=;;… /_>u_=$ ^ `(M rڵoP&L\PUUUXXؑ#G ꫎a222?}i(D T 555$Aېf„$H|>?11"\իG[f ^*((hiiEGGsܦ+W?~_`NzPJ4pmZq|Ǐwvv۹666-Zd; >\l:44N-<*44O6mҤIVVVJJJRRRںu… %%%B)))...߿G555y{{ݻ yl. L&GEEq\>yOpxhFZ*#..Nneeuq6Ƞ3gfkkk 8w\lIII9֭[׭[]|޲e vָq&OCPxxxZZڨQ@%0nZ`0 #fcUj 999qqq!ϭ(((ϟwgR666J(..۽{wV;g Ǎ'PXXؠ.`mm *N8!8\{"9vرcǰmpw$233O>jש{< Ah\;qڴivZZ!""WQQSSSDDDa~_6T'ʜ9s dycm ,[TT/JIPu֙ h-wtt觾qŋm'')S+""" 4nnn};߅OGGǾgoomO<@ \|Uڍ) l&n "8a„[[۬#,]cp5| X**Ǝ DW޿ɓ &&&z޴iV@ӋBMMMZ<̠ I m @P{FFFJJJZ_lݺضÇڅT/((PUU N4f >##CFFFQQQ|>sYa͚5iii&M8b ;oiooOs`XJ4P nݺ?|] Ǫ555^JNN;v,6\[WWŋϞ=K$v^-Zضה)SY,֓'O666P @ @D%%ŋ{zzO8Sx`lq=\" nݺu-mKb!!!, O!^^^i:::\att˖-[l>쎾l6onzBMMMG&"? ||Dɓ'$jOeM$'ŕ+i,;?˥JIQ %mmu##z3Uc|wi&!((ʕTNu58`!GTӧOϟ?qh33!%aˆW /^\GJ_UeeUee$?=SV!ffkϜ_pBPй~OИx¹sFzrJSM޽Q[[im۶aUn0߿„?~G#""|˗^( 8>?$((RRM=@D޻o~@P5CH/,--Eа~[0JJH ֮hj6;넠 ,BHZIikۑ5!Ű )Yٹ۷  2~]ݕ  I% ,;6a"J˲`NNNNG>x!D~玌xB@ l{;WYR%tB["vHכƎŶ<=gmڄmWᅯƆ)KK s_:7̍u,-}ό%O[&/_]V{ě`Nu"lY"{ RAg͊sCBCy@Л7CBkkt~}}ƍ yyNQ9[QQ,|׮]+C/G" Jl*?s}jF:=<_<^ĝ;u_XDw8L"FD~= SYRRYRX+|ziv:充|}?aCg}_?F7Բ{EGG744HKKϞ=[Lǫ_p!66RGG۷x>YΜrĮ%߻w/&&F뻹 ao'5K u!g;#/dvn߾E(?J___[WW'%%2f9::c0 &I% ,z𡬚~TZI).0!yosK[$[G3gIN7su%KIU{Gej*F"%a%:F3;*z–- BHL\͍J .xwCAKKǏ]AEpac}=YBBHi0=9uJxk8}|TT'LHn$A]uu ""ݸ,BPј¼Cjj7>3ݻwWccӱ=111?S)+++++KKK,KX,'Y?{,((hŊ4着>)"""=㖕?~Cfۿ?,i6͛Yfx!, O0 |Oinninnӧ AWP9̟ʒ/ؖLssn:uZٳȫ ӱI+V aLCTDTt?!Zeyy|>SUocxez˩S3kdLTJ~ ̱3ϥKB {xtuH_\"98,oˍ}THј¼CPPBNs8l;VXA"%% !!QZZ/BwzDrpphyyy|>QWWhwVWWnhh/髥#{n - FZZv3/_L"v_ikkkkk$$$TWWcC"""›1//oϞ=0RZZZ</''SFFF$c f@6r֦Mee;r|'&.ҶP{ u S xwŔ)xϽ2;?!JrrLE&SIWWRFFWFFKj-ZUZW^C,/kƨ)/h BHȈBax0m:S pg@~‡S s~y#w}7i$m۶TPeeevv6浭hҥիX&**zÁEV^]XX/]Q%|++e˖)))^RRR^^k׮%EBtƍX+Ç͛'?0uԩSnܸ1%%+dڴi]ތW^%զM$%%B\.788H$b361oV :soqf4nڴqӦ{RUZ7-6 ;~A *-T+VGOhPEQ6+FYYM]VU855䋒36t T>M"C*.t UEj[B*hjJiu# L?~>>yyyZZZ CpX|%EEE6bQZZZee%Eu54y;v`u>gX؆_|m_v !ֳV>$oFDڰa&BD"qĉ\K7 4H`N$;-54545gjroCMMUD7 7=r߾ JrrHd2^ƫ&'*AEI$ٳϞEmYw6qcSccqNNqVV˗X겲ɒ)*麳g?WHѰ愢 A#<F ñݽ{ݻw߼y-r,۷'N|tДo}8$̃ fҍ }¼Y(ab JxL'N44I +~A-!y S{vb[R"Ha^Tӣ+()ik+ikZNTʒvf`g B]BBrh~㥆}2>q;Fl !Bڞ=BĂE?zd憵stcLX[[s߿>22KXP%zU ^://q䴶޵qgzeF)))9!''JJaOxcf`S !nCCя#ĩT$N VBM'NycѮU~|FFFFFBh̙][ZZZ[l9tVdfflkkbŊbjͨk׮c555P^S7 %%^ux<|n̙eر<vY];eM)vDP3A 3q҉K sc Fvwᐐ!)#3iŊIݖ.]Wod_褤UVV666JHHhjj:88L D,&:=$N]BB&l6 ?пw v*`=2 ࣤ"@)T ii aHKn=E:&~g… ' *#RYCx 8*P |80.U*ΣZdX&& /i"";sd )Cse82\'x *KwsKL*}[\G&J(JDb'іsΑrFfΰ:r}xY5`' ҹ][& EU '>Kk^@@GI;bJ(x<ވ+WEEEf)/ hGuuuNh`~Tˆfck+‚ ID@(wXG;zZh) Ů5gFI nE0* "RTi"zcq="Iv疝wgg!%@#}}}Q 'a_F:P3 (B!_v 2J$ %tӶ vdJPi&"ZĽ%:ۢ&8WvEMqJ5BHuIY1{]Fܯ~o+Jصp%t$EIF'M))Jʳuz7c)Q/2wÄO#!ut; + m_nDDD ػwo5?8p,#"% 9UVNh=sM3KAA ǏR:u9-N"`COEfiZ_b6H wp…y晙 Q!CӈB@@#OZj;y$/s΄Ϻ7E+N7f'FH5LJye_=lZn)#Ǝ*o^^':|<DMTi<5M.Ru+[lIHHh yǎ;|M.]DM8;;/]THH[n ̇tu,a0ɐ^,a^r oy.z{LxPb˞\^ٿD)Js!9~9sәL^ :"wbHLKOOaؗܫҟnt)!""B\\2k,vdǎkx+W:u222ffff͚6mZӏԻw7n\ӦM6ydj۵|gϞǏ?}4//OFF˖-9rd>~xHHHffwekkzAQϟǎAS]Yq|ڥ _=[Z($WNI0(KEU:O$;d^"!$25ѵ='?}=VSӨ|pûwoy[\\$..ihh2fw}~CpC~'HK˞9s%w?yy9jj&6s/--6e&u 釫Wϣ&lmV 홐WRR,..٥KaF WЎt@E70`@ӏ;j*:rӦM9?????k׮]zUHy7gΜӧOҝ;wܹ~;w.\xQaeee^^^DDĮ]ݗpSJ_M{)vzF@YBBHyquL:>>bAהK t ?"BxXgHJJ:{S.**xӧO&M9s7lX`߻mzѣG[qjĉ~a5o-_⒛{!BR=A~w}NS(c ߢ[. IBcL3?QI)*mRD(Jl֧b 5Ŝ?(fD ڎaNWTTvr8~4Y9;G4ȶ*!J@0aK!gr,!21kQ&pVulmeeC#omVS=0nݺ{6MN0Ν;mll8ΦM.]Z{i`ڴiTJIHH޽{pjj+VXᄐwQs-[qR__~_·eEO<_>|j3PԪB>wSR lQ& DFBܺ8ꌟȗԥKBrs33ӫ+nǏxoJMtjHMU墢bE0K[ۑ_(ŲєЀvv#4`g7J EEii)ڭYmk۱"@P@JDd ##ӱ!ݻr劕Ug>*UU:i7BHnn.=GOO#}eA M(\YbE9)qRѠA˨T{0w4(jXp#B_Hh(Q\JKK^yݻ7!yT\\𛔖ט#&&.'WqEjl{IɧnU)jmJLT;sQʝΝ;y<^'wȨsVqǏ}-N>趇??[*K CMw]4,)5_07%r ioIu$WPPtg{o4 'JJ~a[tjAA_L[Fva~hKȾtC'ѧO &\z5==SE .̝;jҤ *))uڵ5VCCCGG?lLLLFFugϖC.!DXX~aYYY ť8߿2ފԤżX״-/%hJ A׮6̑(@%&BZVV:!$<xɓ'BȲe˚uz_΄ ֯_ߌ]rʕ+ !W\?~㥤޼ys]??;wBVZEx 5!66˫juƍ',,hlle q} YV8 U]+˫z!ބu.L…MiKh8(`+Biiɭ[oݺ,++U\\";;d --ۥKuߝq?qb/!$0KK[qqgς##ΘW_Ç;?f|c^QQM %%-""Jӧ db YX ;SBׯ_ܫWؗBd~ ))NsRRRCQUUEJhf̘^gÇ?;vlӫڷׯ_v`7nܸq/^u1BHjjtos&L:44444dG]UԊftzr،wя># .IKAJ-ZYgC[^5BlѢ5}KL|M |$ɓ]< I\\[ ff""6m͙X=zK!+jkױPAKZO4GN;/>lݺUa0/^B{QZZw޳f͚>}z߆`?ԩSRRRzrrrAR=zYYYzzzrsa11;wdee u61rajC꺍eSWOoºٟG$JT~G?Gǯ^E0 EEeΓ/C0+6YZy{ߊ),WPPfa10Fy٣hkO4`41%B-Z#""YPAA> 35kd}+!UIID.vvpE l/t`kk[VGGWMf%,iQjsʑAIG䚏aun舘"}Wޡ$IbajA0BGZEZ%'zh裑&H EZz|f:!QP'݌&HBW.Ia$/!* %@A mk!iAVrS)d(I '!%@A͡vV !².GMs쒪V^vP LMM߿E/ٰaƍQt әOULOGZU_qy|)ZΝ;U!!!\.ŋ(WUUBԘZP_NC̭%/?kف5׵mܸ{`:JΛ27䜒6~;~J0`@fff;:S a(Y_iЅ xzeeCr2:EJhw,##9O[8S5f''(NqӶ@ H %0g, B[ %R@jA[67_@{ms@ =os1111qq|XyWq11111#@#XX[8R@Ư8#%tD_ۖ~ K(////+C9t}ܞ?/(4JH R#!PLR~~~b %R %R %R %R %R % %R %R %R %R %R %RR %R %R %R %R %R % %R %R %R %R %R % %R %R %R %R %R %RR %R %&"@\'줤G16_~iYF6[[s\jzc=z4~Y.]uR@ 8e'Ȫ,pAD\v OԘm Cv\VT_ %c׮ ;)6t955c+U?E2zZIGFhَᅷw##mmG-Y?+@J ;|yOxQŮQxȐ>¢_ʺ |݃Nӧ {glΎx6#1< 3BBFFֶs񼴴0ϟ禤TII(+{Mc >zĿ|}ABVvۄNUHL,+( zFF=edRD%%6`Р'Oݫ3%?(ɓ yy#KˡsȅxI}EEUy_޿..#ӵ_?ٳ>H !a7oZM"\]Y&4Mh ܩah(Pr j(''.00.0K߾So篭y<ރgN9BHI~~I~~|.ҥgffff=Tگ_S*ߟ]YIMk=N QN+WxyFB¹5k 7oF=p+_-҂S˖e$$Kw/C ]6%@'b>z0!]Ut{[#"p_27%!;)5?uÏ.\%Ig֯/B|O=q?"4OAHDDBVb5^ܻGO>\DACzXVTcb[> %֯h|ڎtDU]ڲoNVEbܸ'WBմitS[Jll(ߨHMccy^?N }XBBIIL&2n͚˖?C-i6|TxNԝ; NJJ kbw&:b:l؃s abm;pG q#.0sĉ-F}wŋWAA5 f zlOYU^ahNedOwp| ,˓o}WWL}φ޼I1djZxWm>jЛ7y[Ll77uꡲUyq1!DR^^ D$$j>c002TSԆzt̨BT^\,&%U;hLݹZnG~YEOU~3^x~tJHBz,+{~6x)RP8a£ !L^ߒ##iӡCۊ:9)VY8!$͛skˋԸ8z=-h T5 !ܽSh+*)$"ޞPUEO/;B*ϏYɉn`0}*?5>R $_.Rbc=D2Y_''@Jh%VS޸QQZr:U_zyXUy9oFu0`=h$#!En --(VT,Φgv5=`g^^T}d$D%$,Ǝ?_^tufX=? >ĉoRB/K=.rOZT(?FK'=+8wlD"į G8xRQZxbEi؟nM^ܽpv::w!Z_)|)3._E)}keEE</ I+)QgƄϚrsK pvulɍ._;ݦSӛcGUyyII9!!iԳ|yx\no+o~e奥,aa1^_. j@ #!3{8EO3//Sp]SS.=us|cqnnrLL{k#>TkG 阚qt`“'vUU×fކd"FKm_00A3^߅1wQQZZ0h˗K.`1f[¿/6wb|H j02;5Ÿqa99&֭+jiQ}˗/ߏru21!;6cW|.|ݬY,a(??&~=&&,|1IIq#GrRRz隙ɪ0 :8>=5_cʲ2/77j:ݻ- !)׭FU޼1uwkpveEE,1C\F&: Ziwꪰs..-cbάZUcqi/K )A>e# IDATOXTbԺuruoPw/FTeF){ٲ5i'#F,aaQ Rv=Ȯ~~ghѦ޸At 3%JH EASߘ1u~z3^߅~SS/nX݊#,̩ [/N+V>ɩrsSxi]**jTKw>`9sҨ¢Z6NUUiADRPvm/}Ō#ek̔sXoی|bƍ*zz5䄅xl%/"b;sg,֘~." #SU%&-ֵU_GǯB9vVyii%%B""JJzzzffʺg0Ι!-_{UQ5349{'O 23k2E[ׯKrsKǍk IP]02 t{F³g,,j6hh,vw?}:.0('GRNpРs6Ixɷ.$~4((̙/sr$%%{03f}/޽mkf{)ה@QVV$|ۏ?>r&Z~}FFrZZxTfjjj[l^PPhe5pҹ::/Ǎ5j԰G'ȎMȿ7o9rի)) c8^PDD<9pdTTH}~yO"23|gPMٳOoVWt)fSgK.5k\zu޼y/ ڰaСC9;|׮]]fRs?@ss~:N0aѢEnnn{! ??)&&vС9s~qAV*O-?E\ܹ+>HYY1""0 aaݧit+I7oacű d2= C/^D8:9sinn:bwK5 !w-Z4ᎊo.[e2`@ח/{ܹsܹC=Q\.wU!&&jj*/^D;v655e_M}UU2rP좂 BbB\z^XLL_\,%*FKk^ 9*zPzp}J޽{ !rrr&M" Ql]]]UUϟx^zGvW@͛Gl988xzzQ -(;;k׮QFjjjwϟojjjaa!Mb3 )I9065fėGG*!guw,++߳фDF<646K݀ʊɓ}pWjjĉN3f|vnjjrMv_Or={pꭉIO{55gg g)(T7v^|j۷}||5[Dҭ Ng\ yN+W5!*)i:z'762o/[6)!33SII?"|!??_F;SN/߰]S7˗S-򶶶Ϩzzz_\F&ury'%~=Dǎ)//7}gEER [La3J_c Bj:o؂n;ƶI >|֦JT7:>|xppSvI ))ݻ-ۗbnnnaaq}waeeM!'Nѱ5AxyE rkP`0 NUbcbG۷WHKK*RJ ՌA%%%5-%%YIݻ|7W߫)ᣱcdž,_|СbbbAAA C[[AMMMX,%%%BH}?p B5nϞ=/!dɒ%``  @/j)%v ++ѣG3FMM?..~!cp8|'#L%Yo>>l9?*--36N`m=/5f6#$Tזƿ%XLEEyBHoܸ޸qzDIHx膇ǏCQԇ޾ߟ1vQP yi*9!/I"2%ϝ;w$$$8o޼7%%0͛7;vǧ >/oԆ)7-hOlڴڵkׯ_111quu55mΝRbfffaaa6m+,,ۺuu1M 矿s :8u7kN1/!&>}}RRR u?~ɓ;{+|Lljff==\]'w$OXf!ƒ·pcywZZÇ)A__'11SBƍ&/5qnܸ3~#رHe.YL&SHTkn!$e7bګWxWqRflkkkkkk9haaQߛ5ϟ?UM^Xɓ'OЯxx4Xb/_nasؗ߹|LW-]Q쬷x<+GHIIںXY d0ȣG!ECo$!DRR)3>|%cc99Ԍw{no %TU/_|C^^[7}QQѴox}zikkƾO^re[~Wbc aLr/- UUm/S.PQQ =~뷱 ̿k*]9qoK@ãg|IJf$6aMAS3/9>a0Rm \5<WZ>F=L򡰤HR\CMXg믣odejhΟ?g6ׯGCo#\R~f p=~2}1fIwcttR?|tXXxddKlPر# Ƒ#g^Nnk׼W&QVVؿӧ/DDD,,z=_ vBgK)ARX&Vo2$B,&Yk>y(%).1rȁV?㟣XcoA.1,.vIk/A.1Tm#!n 8D %8D %4Y߀!)ſyrBc:!"% 9a %R %R % hՑG| .-[o]h+_uH+% 0_-@{ BoE` %R %R %R %@{#"hpVl2rYYY啕qqq999%%%}}} &C숈JQQγ:@ %t7nD!|k.\@!4yUxxW***\,77۷111sssCCC~7ٳgo>vTH 'U\\ܼȠAAA4E%ʴ d9b1Iė^xmyyydddddDW&&&xN*qRUr*l YqeIB%YH -EѠ %( ZS !\a|3B%=USSڕC :tpΜ9ݻOٽ3m>v:K#&YhlӪ[Jy^+!*D&>T6:UV,8%b ڭ&33bbb<<}jA섛F JRA~V1S%q%Я_% yT8anAO+EAc "y@GN W^=z(!D[[յO>222yyyϟںuu&`0S}ѣG.\HQTTFܰ3gBttt^vȑ#~޼yw3srr9RRRBɲe%}U6&H^bbbV#ޣiã\[,//ȑ#-RTTl捻; 7;@ȴ<~݈"_4CJ@r[{B*_/>syғ_6%?~ү_m۶Tʎ666k֬wss344l-՘)--ݭ[7''+Wˣ.X,VRRҫW {{{X,Ӯ1mTouYΕ ON3vlSސd67m>gn޸yZ P\\|ĉ ʶ''':up( FP]\-K@mN^aog" %~ %-Mσ\7UPPظq#hRRR[l+++;x<0pP'OfmG.4tPR,#Hn)Ͻ[_7(񡺧gYgf t̶/^B&L %U8UUՑ#G޼yҥ5\QZZlٲFyѣGQD4hFyyyXX5099y*oJBBb~~~ .%{{{ ݡ)KMM166vuuٳ'2gϞ-,,֞:ujx7oްl #G?eIʴ2fIucU|X?e+Gvr*)(PU,fKJ (**~On^^^ƍkoTwιK k᳨с]׉^K-Z t̶jbȐ! ,feeE˜M%%%;vs玗צM$$$rssϞ=hH+š5k^啘أG(tʕ#G()) 6ܹs Xb/j~FQTTDs}KKuǎxƍZjU`` /|w>[n6lѣGwтMmQIJjL\pceDvfſO!3= ]^.)/*M.x:)#3r.raIɺ'Obcc[;{.զ97; uaj]O% -2lL&*j%1SBRRu2p]/ϯx׮] 6m!ѣGn33"ZE [[[:!rܩSN<޽{YYYUUU999~~~3fpqqi9kѢElڵk}O7E>o߾E#FXǎ?U8bۿ?|0$$f߾}3f駟v>/_pO:|СC...}$#P'yBȼy zzztv֬YԫWou-!!|@ m-~BY*+23K۶c~GGF`2ez>'!$4%+M'\OkyڼjT 4ڸ;`lb0Гg1HZ^-`]nV.\І[fzL"5,Ds˗‹/>|66v$Oc ;;;PEM|18ՑHZZOGGG QLY1Y^R3fm'pH+뫎6y2 F{ K^yxaxb[GG7 h|vL۷o_n>jT SieZS?+,Ⱥnw-%CEܹs6ƍh\QP`fff:wXX@200 G111uMzrhkko߾}&Lh1øq"gׯ_rd%hN믿&"s!$$uJJJrEx3k\e#3<5 BW&YoSd5 麅QgQNnjlGQ>G U1^clv:&;'4ZNeKFh^d\YYoڴI?o, nqr[P>> p=rڵkgժUgϞʪyphij:b //;wuֱX,+**lС#Fn^2d… =5Ĥ>---''g۶mrl@R&@VCrR/o1iK(E4>08 `8aHBa849!C=Jx"H$pV59 Q[)H״;$ǟtlfggbŊȪ*DR^^~e˖edd`+ZG:}.yfRE YnO]?~ğlذaGEE <0lƍNYYٙ3g1cg?{bbӧⴴV^5"VXIo@@,naK٠5 "󎦦m'QyK*F;y3:ѣ---wwE)>ޯ\r͚5 Аonn\55ٳgϞ=X,ֲeHQ @ӳyHNBjp8nCv^Sk/1: m2n 4UWWhWB`A4BMqh# i.)[{K](?6077WI??Uo4 - ԁ*̄Ԥ,5}>>HK{@V0y0MGK R gQbp4LfgA`Np@aF H @a[feGU///WRmQ % ektd4 2(zBjjߋ]Z" a^=(ztuuϟx(?F0ԽIjͤQ }ϛoj wɫ>Ǥ[;62IRM0Taw7 `dA```&f9HXlG10x% JRދJ*zGJz.˫v1zQÆ kBDoŠd)I&Ma)l6y$A8Û4 1 >' Z+\}ț daaK {1d9#Ϫ,Ψ>K#k}GLp NJ%n:h^Hj |SNJ`Tz=]kOj"]ˢBςqv; ?q5~Ca25Fp&sNH$b)\%$OVlRTWW# 0+e K5$n* ZZZY%"0rȨ(H$`q/V_$v@_'*<< HD__&//SitD[5=|#cS6MKRDT LYjOj8.hR T%RD"KD"I}Cc"HH.sRYѩQigёH, 4^a \%nnne-F#ʲ`GmvOf,]:_QDX_X_'KDbX,i*"@( D
    } ʫҥKa.[l߾} H}[=%deeZj ,h-ύ7vرqF???/V.T:CbڵjۿCE"?NN`2M, \]A x 5UU奥EbhK,:g϶˫tR}}}Uh+W T4ZPPG}j*DSSsƍ02]xqHH &h"]]]$'.~$uʕ+ܼy`Ǔ9;DcǎEDDYZZΝ;W%7J g‚gcӀEExܹY,i'q8Ҭ,ٳ jNsGuرv##p8*^sN2e޽555]uO5zh wDH}Ftetn݊5j@*FFF9RSSؼysBB'MTQQ}vLTOv̙SB[}D Ѫ&&2-=722kjLtɓ_bl7.`!55ɘ6*/Wze8qb;v<`:5 'G@iZZbY=<^mtӧ..|nl,HN IOf01c> Nm&1Q5tnu5g,-'3P?WXܸaRR as}۸((^ U\]06_هA+ ss/_pӧof<<<(d)AAAYYYIIIYYY|>IJ ÂΝ;W[[ro޼陘UзѢE1nnnn\(2ҤTpip$oX]ll[j` >{ ZZ9sdU5FpuK'N g͵j&cKutnz:ή¢1:ڈ 0@J.lʪqƌBэ??%SQUhGrdBJs-AS SRt[u0`DǏ׋D"ǡހaFc2ZZZ*.l6\3DwMMM 8lhfXl6ؘ*ɷQSSsrrrrrq8//! " (|[nO>:QNN%5ٹh i萖wpZ4pa. S8aض-Uj}.ȹ :WT$;ɩn|j1VxD4PXȹrP_hn05[lM``W_=0b:D}@n0*`ϞDG ps9=9hkĄ/M61fXUN{xxxxx~ fnnnnn$[ʸ H9!Jf:gjuQ(T{& 'N.֯48VTdIUE}u-Ҹ zzcJKkke…\-dժ,jDssIEZ^>mK2м&&|mTGAY!D9aϞ=UUUvvvo̯Q[[+F@EU TEuu)Ъ3 0YW /J2gY٫̌(z(V"i4 ͤOpp-mlFehz {pbjRoj[̌'WQdީ/^hH(.+ի;w<~ R!ݻwgffx͛76OArCueZرc_YY9{lEݻw萖g}GUZ{&B{s^d gwN'ܪ7i~+7WC"5|piM^ 8D29[Y5jjJeO<:u..~UKNtoHʪQKK$%s9 T&ڨR6mwޙ3gDŽ?}lɧO>Ҳ6lo#@yy'+**lAOM744 -t-~- ]J h"EMGY^۷o߼y1 丫uNP&@ tUI&-g-Œ>cce\\G8q†) ͕ :i3LL¬,m2DGPp[RAAARͿrr:@zz+ p€ QA2Ǐ׮]sqqYhĉ֯_C={2iҤ)JB``˗,Yqݵkvlg„ W^566mvUVV6t#Fܿ]=p 7ϧN|=%eqM{=TYK0h5 8A?rĮ\N'""Ljj==n<aU.@OOTRS#s5c9cmd$u$.NEZ[7­@23-aPɑֶ4jk{UTxLÆzxxT5ҠAoRZZZӧOfeeM>;?.J4Ddjkk7mD;;:ŋnz9{{{= .jhZj s6gvK yV"mJVe?^TTDγԃL;S]]m``8|Ezɗ/_Yh۸3g8p'Nܿ_,:?&y<f[YY͙3tpA2/^/H`0>ԣGܹڵk;wܹSWW[.ٳm K1b޽{iO~QiiڠA-Z s1Z={o߾ MM`gg 6ϝ ͧx(**:|GBٳǎ= $>>~ YcǎիE"cbbb߇~HU:UK077o{fpppb-[l2j۸ʼnUphhUEE?H?܆:#i+8%9ק5_/MOFG0\gJJغ"_/n \[jl,8w*-[[dzzBkFOJǐZ~yyb1 [jxxxdd$5[,,,ɑ?2eyNNΩSm711IJJ8p`ƍǎm۶]vرc۶m_~%66vƌϞ=dg SWWo>hjj=իgvss۾}ٳt\JB*~ yѣkjj\g P)A6򗔔|L&s޼yl6m_Gyyڵkbuttn߾Y ֭[utt{lp6`0{7nFN^cK(tލmeaTnUmE9Ě5kd6jҤ&vBkG*k~/L˴WZ,s+Fuqvv633iiiTrXXXIIɾ}a_~={C3gΣGV^&Sg9|̘1-899p:>>>$$Dnvbwd^xaoof u i15 !trMD*Qd'.Yhm23Fٳ&MwۯرcwvrrL:?TӠ/_&&&:uj׮]\.w̘1 ޜGz٪͊+v1w\{{{OOϱctI*&I[`3քI~mޞTRS"""p\4&k+S0 555r -,,!CZ[[JJJ:P0AT :׳X.iHKPiEAhG ss߹sgժU G00r9s]BBB<==.\x1ct退!C&%%]tԩS|AHHH[zD"i3rQքɆb_xq̙ZZZ4oxW{'?:v6$WRil͏rh݅?O%Pƍo=x ""`QgMݮzEEEW\OOoԩSN~ѣGCBBʓOXX۷xw511Q$jmBPRku֘1cBCCɔIX,Naa!5~ra@,49(قʂGOxhNUpBazzzi,v\\DZl &ܮ7Q[YYx<8̝A23fr9G"ر~-NF+eau=ň#>|HBPٿǏgddol6p4WȢ^|vm *{"q]˺vZZZ^^^?x`˖-AAAbŋ;vhUXXf͚zkժUÇر򢢢ȃ{s9ϟgcc ڙ;wdttt6nܸaÆUV;ںΝ;EEE3gT3f7n@ll_~9}t.{>E___۷[jjjr:GvޗwE}iD/bܸq#Fo'N{۷9ٳ[vmTTTjjj\\P( 3gUof'Mt]DblldɒYfu !CSN%&&FDDCBCCu:@BP+W鱱7o޴ݴiӕ+W{隙O￵; CC]v:tҥKjݺublٲwް0]]ݐkk 6tl][5}<0-܋2C{-Ax@ JE,PxUKKK"t h@ z7K.0`@MM׋;iG -@ }OOϘ`kky=D -@ }5k !( /@ @ -@ D__># /@5-AѡpjgwSE >%@@ >DB$~zQ/!лF % DODz kv旅B_ *:y% q$cjkkwHK@ Bk%]h% ꔕsQf@ -ӓXrzv콲\~]=ҳ0>lȤ\%G\*q$3'e[F[nt+mIV_]:.ğ<}֮6}ZDڮ֗Z#@z-Y jK:&NbE~qfV©9hl?T<]bCw-iE6 GZ#@ -e O|dzL҂eދ:Wy=5=@g Z!p;zbLh֮VhS] Fh푧^'!7k&S1~K>^sXXuQcufp 6}v?F z5Q6mڪUN>-=’NӪ(lcccwwsߢNxb@@.FOT.wuu566f2vvvoŋÞ={ȪEDD fff?S}}=%SIt:95Úg`[QSJ2<]DРc9l9:dƪݳ5q`o'y"sP`3̭%>=~4+[ɴtsb(Ю֨<0 @iiiVVVVVVLLO?b @ eee)))'O/>D@c?t֮JW_}E,III6lHOO?wܹsrodʔ)\xq.?ryŊvvv<~8** zj%=D" eg͙3gɝ,/ѣGArrrlٲw^%Uը_h e99SAdnNǧj8~F>z/䥭ۖ=DBi3\"Yz+_[aQ [[ v2p)6W{͟U,GlCrU _[vАpZ}Eg9:XK%)_}D).V3z%ߺ4wYwc U7MSSC=_eWʕkn`m5kcbb@bee)Hoݺ}vj+Wzyy <ݭiТ֬Y Ym߾} 2eʔDݻw;?vǏϟ/o߾=\E2^!|}d#4,Ե0).Ɏ?OH󀾵 R+T2\-@[ue >4n8 pT"y| ïX{S3ꘚjxK>}ҴjtBӝ7E|s`T6vrV=ڕ;'d%KL6mK.믿|>UVIҰ N0aΜ9*/7C$M8qΜ9ԫltR9IPP|4\8p+IP(ܲe 5˗/׭[7tP.bϟ#2Chh(aM\f|>Æ ӦMspp000`0K.MNN>T[rP0aapK^Gw}Lp޶Yb9)… ?l\SN1{DHpp0!-#>8u.P\ܤP P_Yȳ>^)@%>4[yJ2X;v=jIjjNc*(}PYQu--߲Sj"ñRuN usH\YYyO?|MXXs]]ݙ3go%{c1LSyy99?~ xT,JҸ\uJrK.evᇤ:HTPPpÇoܼvٕ֭133СCÇ?uTkzLRk,yƍ~iӦ9s$&&'Nxxx*~7oR-gF&xb8p>ů *+蘘**FrX@,Jv Ni)M-SX}aރLmBp]/EDj!ZA}E@X7ҵ ]SPG˗1Bi)cbb.^8{lϞ=H$255wY`U' H1SSSSRRa 1c233|;3ÒzzzfffΚ5)ٳ/]3?cGGǻDGGWWWǏ95G1p@ccc /_ HV\9ydfJp2rHuu7n@POOo+WWn YF,WWWB!|#G$}:::)))g7/--\'U͛7)NDDr?(l5.Tm8+V!p1mNo5XuM~ّ8^‹I% ;/;դg1srԵ0yVln Q֮  ˯\&Tc_Sp>裘X9-g6-WYYY_x155Z"pww?vXrrI)))oݺ5%%j 0qȐ!, @-[@ӣ===~k^^A7n?~|hhhhhwBB@__G\WW˗/O: n mݸq#qprrR|^Rt:}ǎ|5ϯJ6nGĄ??w H9q޽ٹcxrLJ2L&{kIEtZsuuot,/ɭ-.1h|^iva rr݇8*Zߚb5jWS{Cn۶9!plѿ*+LHnQPueuen`ʬTϛ7O.e̙rC2KNN~%χ3$*\.7P9TlM޹b8991L 5BUZu^J*%%%/_8z;&&&VTTMB+++曨ϟ744 HYYY:ze?J!Y#G,Z[I$?F֭[d3g//3g|Un~ lvVl\FT4-\#ۧ%l.BԬcmU]MehΟ%C.dFgyj ǟs+ڕYꫯv?n޼yٲeݻwkhhlذԩSׯ_p8(;`VŋP-SRRS!C:JKnp8 z%6裏ރaؗ_~yw:tEƫ6C9WFa4Yl>lذVeԩSϞ=KU ۨCCCc„ Ш~]N߫rT9zsq~{qtLM AeAX Pc0leӝ'pqwsMLrs+`q8!)dHk7/]iDg2F=u`ٳn>n}ө׮٪ki՗WtCw зE/_>MWc0/M}൫y/kg4VV |ҡo`܃˟~!몶1-CbB ð###jeڴipYZGGׁ;%9y?O]'r#Y BFskgϞK. z{+ Yquuu}}}8 ӧ練\QQ!HEJ_%gϞ=Un()-`<~CndĖ>/J`XV#<8㚘ğ8UIqVۄu$@r45Oo!p|P-@H ?wî]455g̘Azk}dWP@ Q[[}v}x9şXYY֢ 'O@z;|694dАoi:amuy@, |&w)[oɢ0o Q*Հ>?<^W؎n;s mm`$Ƕ/|S0s pյkyg/-N1l0MMMLܾ}А`Q|\nn-a[nBUO>?-[}gffRe/_N~裏Ν;MD|uttBx?&/5eT#% 3}ׯ?~ή:999888..|7rFzwU!C$%%D"@bqd#GPЌqy8NDf͂#ǿ W\˫_|&F==' .$f$''2bxfffff>sn__[nB̜9`SjjjwﶴD5BZ8;x`zzzLLUBBB:6r vvv-PWr@Dǜ0 c2ڦ8q\2eJzz}_MMMO[/_޲e _56lr{nnĉlrQŵٳgݻ7##WNVZellWQQ! mmmGxg_mٲiΝiiio֭on{LD kkѣG\zDBz ȅG5`:::(ۨͶ}dzk׮j9:\JED%m0lU8 I|Imٕ{yxT֯_|!OY0`'O4T#lА]36u6z~,/[BEVi#߂#z/ 8p*Bț z5@ z̿x,7 Ե4njFܾ} Aՠ! h]+@@ zWW.믿^~=HK@ ޫpoﱖ]%: BeAmH߶~:%gd=^^ѻVxT:?A "KYYYkK@..3Ќ@ B_@  @ i @ @ i @ @ i @ T@ dڵ gXv-+L;B$HK@ [d׮]]"@ -l h5*mmmtR@ -q֯_#Oyyy0<<\@Z8e[VVօwp7O*[]SdP ;ɐ= @Z7qnP,[HQTHa=FPPPDDD.F3cGHQTH<{R'OLOOȨXZZ9rDZVVVSSfOjE-((8ydfffUUUcc#ñ6m*_~ʕ+mۆDP:(ؤ`lll%=Boxcǎ^p͛IIIIIIK.}wUyyyԢ644*+W"[W(|TMu z%Wh4jhii <9s_M2ESSSuf\]]|kמ;vVBZիWw{g! " %@bAWl6gw'3̳3;bbb8CU-`0%R Ο<^uU0ܧVQgܻ}}” UbjkJ2NI8P#\zp|၁4)믿$W_b@Bq%{'<%g󣣣e'33sҤIZZZ...‰6/$GG[!% ~7F;mb{a$x¤IgH>`+Ǻ$//o!UUիWUTTsҚÇxbq+ ]% &ݸqC$CEEEc$yf>N///%K)))^^^ ϏN{zz?~|ƌ r㻸x|??wߒ%K{/^9r^0663f̌3p8%K0aÆgggI"3337oޜE'M>11<<$I -[(TҢ>>SNNڸq6%QB˗/2eJ?~W\\̵iii!1;iҤnW f~Po-m-G[f5FYҹW,M B|MI 333vB)e˖ 0Z__.99!jߍ~"n2eA% 7mTRRbdd JpqqY`Bhb>wԩ-[3޳g:u80i$###,--'HlllYYپ}Yfff;wo8" "!ѣYYYR#29CGخx:",Oy7Ao^K34MU/$?/gp$믿?sυj;Zo颗KhСC鍍"K}#vرc,40䅈+jB%sA>}[ pvڵkD{yy)I߾}}}}ܸqR ƍԼtҼyRRR%TO" miixÖI77nܰwӧo۶Ν;µ0W\122Z?~ΝwiU% 4557R/~K=\'P`f(p B쿻I'Flұ^,}J%Bhhhrrr@@?l--򖜜d2ZۅTob͞=ٳmn۶mg:::Zhlu(ׯ_IMM 'Ntvv#UKjjرc$_UWWW75hJ-"__߄<jر^"r |$)N",LHMA$BsSϟ x=11P.}SSSzzjˣ̞=;77wҥ#Gichh(`ŵ < ccQFQj)I]~, 6(!)SL20Rxxx$&&zzzVVVt݇b:tHd!"1mQutt>Rֳj]t*MMMWz& !:]ޛוYqwk Ì;?M<9!!!--zx:33-z޽999yyyT^p'|"ŵu1ɺ:KKK;w̚5 ӧO?ydTTO:::/^ޓӖt]]Jɓ+{{{nAd֩vILLwGڎNW߭FnAˏ&]<s+3u`FnB*`!j*{qѢEgϞݺu+6̒)'oDQ>AII͛7õ\\\g*P-$M2hw Ö.]ZXX5OWX,ylcǎMJJϷ*&IC֫[|||zz%IՇ\]\\nݚ2gMA::+; GڽF&fgr2RT,ԙ߾Gh#y<^'9?8rK9MRVVQ[[;44tʕ!!!9%&Oᅲ2̜3gJM6n/^V -gu b)رcEr:xӀkhii]|`ٲeTxWWWeee~‚={,===,,Eww;vlŊT=""BWW,gsRx/NVzS#WGN>74Ddz ġn^Mf0Y 'O722ʔc$bU>Km{E8~XbƍO)))jjj8wE߿?Y&Ya*`0fΜ)R8pٳ\.4((ݽ8p%Kn޼IDhhڽ{ѣG^zeedd4BHEE%22{ܸq'N}ϔ3 &Ylص3 0y_>c l\&kaXXʕ+׭[}vjv'---6M ̴NWrm?)hBSp0)p8YYY A$Dg``0hР>455=}P)5m7ggg1ɽk֬Yfॷ8CmP]M6=~~~uPbϙ3qĴ~!>>vÆ 5mH2kB*]m׬Yk.Iɓ'SP#? sppyiZZneU L2!ʕ+YYY"Ý8744444TTTܿWXZZٙwqI999x-wP?h?\/{qttTqД,d0%\9art^!C]vջv200hbGD|iiiyyy}qss={iBM2IJJlah ᅥ#GP޽RZZ ~тJ >az W#F8wFSVVvpp?ײ5qov]7ĤeZh-Q(L^~xQll,Η9r|m=h-^zu)*B`H/$[%Kz,/Aj_^YYPP8&0piIӧy8Vn߾}i. ~тJj;6p rv/**511ʧ~>ەFAEEEbhzښ/˨f[)\c***2I/^t*2гTvb3<=sРA xR.]fb^w9w/ ]&f0;;?zTUq5UnCC 2ɦ,-YbbbFF*P{\Z)*V/;9O;z!SBZm|NQWo3b;wh׉gNRQV0AOR1kۄy;ȧ._lhh(XK:ܹsUhA% .=وa؜y͚3O0Dd Є`xF1,:KC m7l>qhc"_`ll,uW T㢕T.Bgk^'I7m>tPcƶlty IN⊪FJ4 ih,|W> ~3?\Y.{iC=uTcc#*P{\%t3l6˗ǎS QpI Uoj $"lO祕&>aT@5oF#IUu]M 0$'yrjkN򂂂S t-߇Pe E *A!TBZSXNɩOGێV3=x B/3#vg5ϙmzV F0D0aF5$Fͭ'^st44 >ܻ'r#ޡbHLMMPjTu?|NAIHѶsA(2q LXI<>A4ajG! CD$jvI$Ak:,!$-r())),,luڶ(,,yB=-;4hЃ3۹pzI&w?L.߾TjhQb 5w'!I$ IDu=OA#IRSK}WR)ݺuC-DNN*P{\ \E{M;$##dtu&>maMĻai !!  !Dq W!$\&^LΏTQQ$Ԧ&jAUhA%Liibw;"[ƏwVSWGYQUKÚBޏD$!" D"$M 'HR9jSQQ$@t3 d pyC-㝨?98A((jho k ZI#"hF#HIi^ z-DQ!TCqтJ1f0LiTBۻ?-4%%&K]i**tȝ -6ʚ$I$k"gp57o#1$H!!DIb4 I Ih4$7DPjThH"'f Sn _ޟf__߀`Ad]C I+)d8wG"Du+1  $AUu^իW U.he^3 1))Q[ ͽWP4D74qqO$Oj'Ps#s} ÔʘnNz IqޤGP T*cJ4һ ;7ZހF;"d 6<b5f\@ IR%C8AMT:0ػN$:rό! ;$A"D HAkG" CIPﺉL ,=!T*K4 pjئv.TЫ0.%GMC .'p q4yvBH )hԤ{$"ID5B  BD@0O%/2SB]-éN>s[NP40 p CoG"[ ABB]G' I`6|L=B|>AIORUU0TUUU& T*]q8Dol4Ybtro|'RM]?j• eYY 6!;3l4*4% m;| |T5uuu CUSSn T*E8[%ºZZAu~r(K돜R ~YYQQ)fJϷ dEK*) rքS0>$"TB\}]]M{~WP=ԎFaf`D֢]? l.>74"⯃;ϟ( "4Aq'eZ=?Gg^~6kNnոP]҆zqxVDdPZN TڡhBښ[JolGM--ݓ]-70n9_aW#-g"^WÕaÆluG0$I \F2ዯy8 <BXsAx:(,a-kPeUhIRZQ56khiahA%eP󚚒Nk("[rsnrj98N ̸,,\,$I q M'pIat$ u"kA*y8}׶Ғ mhk*[Z4/Uzk&B-rq'0O8A55Իcǻ|BXP5wRd||1@:nii 7Tɣmjj~cdlujO;vyrP(>'.-\@`K۳ihi$I8O!>$H h4 HD{A|&>^喗q ښsnz̘1 P*(FWUN]тt' &`J*]UX i5$/KHg(>Lyu4/'7'|Oe28klqyuu %556Rߒ7FFFCP"nJ-4%D|>޽тtJ`Hrh{i[}k[)w蔮6vt&'NL$I|~5TC*ټIJIW"h4!'x|n#{S][RIĭ׊wĉ 0wwUhA%݉ڙ\&srrA%'%(H$WSUat\P %MIOhC$Iq/_Vq*5˽)rġCKСC T9dee)~~+frr|.09XܹsOIgOr8n $se*d(+c4 CDqjkkk8|>N $I޾qff<}tC rCqтJ~6lؠR<}CLLL3L"ڹL.I2dcfhm~gE|E9M<^ HHM I>|7m@qjk2._(~QX~i>}o߾ӧO?v*P{\ K5 F"zI~L6{ Î=Ahnj>Ajyw'Kھ}?fݻwԩϻQXZZΟ?_'Op8;r@4H1Km{01W ;vt7(DP=R l6;33ZKKK'޾圦rdȐ!?633zȑÇ/[~kСCcbbgg)~IDATw-]ԖI&Lɓ#F+H4hЃd4(v|֯_/Pr$I޽ܹs~~~K,cuZh`7o"v1-0A%899egg_reڴi+VSSޭ㹹JJJÆ [`SWYY~MMVwި(jԣULdK```xxtttZԡCH/=x𠁫34zه IrΝIII_}U," &Fҽ N<~3{X,Cjj****6mtu?~|-'''}}7o}Nr-]tϞ=k׮:?s[!駟R{,ZQQx<mm˗/L::ujƍ#/_^YY9eʔ?~8..X3jhh`F[} (YIlwKKK qJVz+o~…Yf-\+OFUH:$1x<ޢE^jccZf7|奮unr͠۷wϟٳÇ?qZn %6m*))122JMMUSSsppQ G>x aK///"!!aժU!338pQWWѣF !wԩ-[|7::zϞ=ÇGM:u4iQB|$66l߾}ܹ_Oܾ}޽{..."v/^QXG29 dNsH_矹s~oe;edd年[j/y.@$௿\]].]P;;;/_\ A&ZTT`J"P?ŋ9sfܹZŋ#GܿիWcƌ1c:O:䒝Ig$!ȵoY=$$,Yd6-=K%kjj^ti޼y)))-=RAꅨ[XXO\5s7nܹSCC@_555__ߨ7nܰ$BHEEe۶msp-̕+WlllyǏ߹s;wjkk?3eeж9tBHoK(0 S"P^CO UWUk }l+gܻ}}” *Ӵ I"bl'6"\̒LQmٲE[[{ܹ=***s-,,tuuE E[tXZZZb6iҤ4yaǃUTT\]] >-˞yg$q)pqq)TG-^ۻ-=E%(++;%_qKII)..(#wM֬Y޽[B QQQ!!!y<^UUرc70!TVVWeZ.O?{}JK:},ǒ::O/lbeeGNռy]wchhgI'yIh}FCCF߿_u% !ߪV麺A 9BI-[^Z|!j_ttDZQD@w+85gE޾qN_=W)))uh1_49YgA-Zt٭[2 a_],99R zzz{n{(*TקV^*-min-7ۅmM#IfM&L//?UVh9s0gggL[CKb;zFܹ3##c -,,|͖%s\6a{IWWUUz۶ml6[YYYSSSdKAr8oܼ͛Ϟ=q Ö.]ZXX8.l`>zHPuV:Zpmv%Ib{9lcǎMJJϷj&IUԈFmm,rIpDDؼy왗;vX*f谮oZ?nCֵ_ye¤K^,^▬٪2؝ikk\2888$$dђN'OKKKLfNN̙3ՠhv_^.5?m@ Sd0)={vnnҥKGieeeeeecc#lJ`+**"""˩Jȑ#?>_L[CKb[?#eeej7nܘ6mڢE$M#X}۷OE5j2166yfDx 9ŋ~IУ3gII=׫T*{…ݻw6)55Bرc<شi尭X"88f͒Ѓ Xv˗ -[FwWWWeee~‚={,===,,LEDظq? ~gHPi:߂fg6斣-G._+_oHa 4iF!3 kzp: [bƍCCC---%###SRRppj^^ A`h5YaR`mmwAhV[ZZJׯ3F8X,oo﨨١vHݻw+**$l%>.A[XX4j< zHŋ޼yM%۵l6,,,DwV-4 0[̙3Gd@D?L:ͩ~mII͛7õ\\\$̌H;bB-QR$t9#ްL9s bgg7a1Kx}dkpUTTPu~E*Y̜hk֬^b-_|-vȐ!.\xPP\"iӦ"He'IOO6eļ~rZ +V7X;3E[BeL:q86b8>e髗_T)t۶mk֬ٵk$ɓS?"\vMdz1Μ5 M:}ǎ[b5muhڴivvvϿx񢋋ԙq{R$t9#A okXmԨQo>{l\\ܲe˄Hx}rM A%Ĉa|}};th&9LHMA$BOtPB 2$$$dڵW޵kAp8,АF@jR^jMLEE%22{ܸq'N. D2gFynnBwH gԩSNrQQQJqynkk;Jp/:{|=CU Wì9)kկ1bĹs$h4xsH''lo4|}}}}}w彽E V-4$4&N?S=mذV{޵233\@5ʘp…gϞQc IIIbouhI|BwG=xSS ǏT/tvv>yׅ]@1 *BAucw+`#IOL.اۀ`2Xj^ׯWVVvFHn9::vIVӧiiiL&S!cfy^j*___IH o+;[LBwGψa5___/8XzAjhhGGGSIZZZVVVƒpkK/ b2 6&V@;6uTJT-+VZ)540nd}UQ;l2Nʽ~RxYLBؔco^$BYTɽTl˖-XS*abʰP$gϞmaayf݂%=nvJĀIb0LF6vlY_`jZr̅fv`f.hYK]sՀJdX E]9Z!@(DF`X TՁqpw>@{IHH P /Bt@G'?m>x B  JlJ_|y1EO"3K0/QP JqjjjJhPDrA(1:TBu?L1t#.]ŪWLt^vsvt%.$T$w? P @ dgסW&4Е*z?l8#+++<<BThfcccRCJPz @l6@o9Qq;nH Es7t~Htqaau\Ϸ;o Gv)z T;"n#W{A#BdPPPPP̙ٙ3Gz @%*P JT@%*P @%*P JT@%,m Â֭['BrBɏ+/ 3r?_[N$CK|H߸r"ԽAS F ^*6N\F>h7)H_R@vq{Gu\Ϸ;o Gv+z T;"n#Јȶۺu:uVmmmhP JT@%*P JT@%*P JT@%*P J>:z#^VVֆ 2@cȑSN4Gvd+l˗/G z/_1: @FPPcz@%*P JT@Oֆ@KBUU:r6>?]$G}nA^pqkDy 4yI-ȷZx,q98IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/notes.txt000066400000000000000000000005001475757676000231630ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/images/patch.png000066400000000000000000000333131475757676000231070ustar00rootroot00000000000000PNG  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'5bKGD pHYs.#.#x?vtIME%R:tEXtCommentCreated with GIMPW IDATx{XT?pQɐ#-/ei$ ) 5K% KD v10WT@R-;t4M}2=G6F+<<^YglZ-"k^(IІnݺj @PcV+TTT%f%+Ko" #)+ࡇ+'vpb9-:C5- >/eڷjߦb[!w:5}MҥhàA{+oΝE8:@LL-|f}2b&a bbO^^9[Ͻ'+.YsZ5UU Yg1™DLvy77kyH0e@ӥz 铥g:^gl--Z[(*b۶< i|h_n GJcrx-ȘB*??=c۶`Ο@ZLJJcWueRS1`T++[QdHGQQ޾ܑg;e˼(-} ((XᎷV8 JJHM ו=,:7mCF>xx8I011"#c:?xl4';O^`1#G:=4hii*+>#bIN>Bzdt;(+ĉⲆ͛؈oJՀ[={㏏46CzA7خ0|##Gnbuoa_c/2m|) s` +X>ܹ[+˗9r*U=II(/_ΝܽM]_}#8#[|y6rrΰmx>]M]C5ʅݻOQRRG~6Ջ30;)ieeTV.`ɒ|Y_BG444.ﰍ!CGNx.Q[c4dlزeZ-a,YO*,hjj{O_ĉ}IM d„ҪB׮ b ~oЊ5,XSZ?8'T t '.R69Bq[b\ps&;[ 5O,GCQ(.pXyyR9]Yx}K`HHxUO^\iiبԩj_K9 "cƤ5Rn8\]QRص7 ^P(ė8W<|0/V!wUpr΁!=dzK(TF̤ε@|#pB8!Y~=~]9SNٳٳg- vxyyyEEEtmpp]ooG"##j56MFP_-)((ښ9s0zhRRRؽ{78::Ɛ!vMBA\\gΜaРAr~d]sܹsj*ݩ$$$˗IUUd2BBBkr1 fVIEEEՋ 6cYlj|M<==پ};AAA|7GϞ= w30tPñfŊl۶ ___Z-ovvv@FF<~8ɤIN}BAhh(fff1i$:AAA1Y!ɐd 6Lzت:@Racc&`|TUUallJz(7o<<==]*&""SSS픕ȬYs͸]54zw677ꗸ*r6 dYY(JIHH`hZr9mڪK^[[HJJb񤦦SOII<%7oiۼ;[Uss3ҫwwwz-[hnn&//L'''~JK[]}ܜKDYhKeVVV\|@CC---( oh"=;v+N\\qqqұQQQİzj_]Ν=nnn[Z}]V\Izz:r//ՕM6qA>LJJ ,^`Ϟ=<̜9D?>Đ̌3hjjٙHwwwcmOVVcߎ赎 :*[UEE .,))Ig*Džckk˶mL B8@G #\wuN8 (**͛wSJgϾxxxзo_%F6m'N;A)++`ɶѦ.֭[)((wޑ&&&jyW7; XXGbcc9ruu>RmۛCq%jAMCP8fff[ݻfꓤt&ӧ 77  `}=:z%vvvTVVʕ+Yr%6þ}e޽Rb}=:z 0~xm^^^$''SQQANNɀaUʙ3ghll tnbС@^A֭eee,Z @[ŋ˻6?OwtLL *3f0qDxX;v?>d}׀Vhaag3gdP0důj툰 " #N!@G #pπ/_[$QҿxYd cÆ qF1(e066<==ɑ0+++YnǎC0rH"##;NUsAۓJFFjkkk߿~u!렢 0z!ө&""gggq.]J~O155 ib l1=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^ bKGD pHYs.#.#x?vtIME%4tEXtCommentCreated with GIMPW xIDATxTTe?3 X8 0$(,)&*RȯBZ ۥEt'$eI6ks6<hGphA0@fae#0}}+ p+n2vXz8 BvAR_"\ߤЕNׯonT\b-f9>ZSԼ3,-g*IJ:Luzu45uP\\KRê~=!!w?m[6 ryTUNw'ܶ8WFV䴓/} '٣'WWkomW6;wfyyQ:%Gituu_rs1mW֖Bee"=7gyҥ5ۉsȨ[ /L6ʕ[|3 677ZZ6#'iԖ"RP%6vѶZ),K6ٳzλ"_Q*7p֛\蝞z#N3UA\ #pq@GƼypd8P}WJT9uΨ''KBB<|EE3GƑ#\t~moq`wS_TT(maI[os~Dgg7<ʕOWW+=燢׿M[[ 11ޤ3 jhlN'')S0w>VۍVMqq-3g:Uwp;!00=:!ذ̜逽tv(-=mS֏it)Fʭ8tHZeI< K g]dP_ߊH4W!˖" IRRx^ϙ3 yݻde2˻%+*')-֏λd&O͸qcغot;X,B"3v)QQڎE.Wai9-.݉-j5oܸM@~^}u6t{2m-TT(ill筷`j*f'5["zB^Xz^XiӦ_4Bx$89Yrd\=)C4d=+8LэN# 84<DEEqE#~ϔ+W5n8f͚Err2IOOݨFH9'N'44DŽ O_#MJJ ǎ#++k׮s1:v@JJ |'DFFRXXHZZxb:ݣr؅ )-- 44?F!//2339wcƌ!<<rss)**B`ccÖ-[:ujevEss3[lA"ŋhgg2^{ .ATTiii?m ZMYYΆ}UUUdgg#Hlݺ/// iiiaƍ8;;cccѣGٷoVVV(Je֭[ǩSNO}1e{o?CڄidddJpp0 [XXD"jkkQ($&&bffƄ  4 ?#Zlmm,3\ƏO[[[޺&LO >>R)wٞxׯ_+VuuuɓIHH`޽KRRҀeKSSS{oi+fHR^iggT*%//%?ϒ%K,ӓ ˗/T*6?mk֬777QtwwP(( jjjt#H,`eeECCѶt455q RSST,ԟ692ñƶ""tn޼ ޣZMFFAAA鈉 @LL {ᥗ^o;v@ll,:/m%%%TW?-c#t@X)0aJի}DJ*8B ٓE``G:> 'H$|Gxk'r?F|IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/scale.png000066400000000000000000000260451475757676000231030ustar00rootroot00000000000000PNG  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'+QKbKGD pHYs.#.#x?vtIME&E>tEXtCommentCreated with GIMPWIDATx}PU?; zD5q5.zEj֤4zC!ICD3$ӛ2=9j:hp"-S#P8Vr CXg{oef[f2 @ׯ&I֙:]Fp.GU%FԥE p=_8%%ь:TY3 (7u+?g GNWΝWbcaC0df^aժÔ7kHMcv4ȶE>Bh " ) E`'مƍ*nݺˈ[I'!C>YQKqq G.îExO:4 ;;+~T b ||VVkwvW̯fݺ);ח={~fI"LQЗ~(PLzBD1rAoQ/UQ(dy :1aJznny~qLʶ///*%t5,[ٮF{yOְcG(I^^(\rr ]"FSbjj21{^իoP^PT$!1cXt\ڋDX>"#G=7`ccɖ-ӨA;J矒jk@ F#rvO{9sssYfMmY?s?d2Sy|csr˭tdZq/be@a}b؅VIL7@jjyOd]*6 /"pB8!n֭[پ}Ş$ŋsQB8}Eu:}۳d&M@ZZGAO߳ejHHHѣG0455vZ|}}ٿ?|ɶm8x gf;C@@7߈-¹r ,Z ƌË/ȱcfrf̘%Z|D.'F,U8::P(}\~#GW_QYY\.*jkkqqqA.u7771E8c4%񔔔Ve$%%1dϟd^ߢ.^O>}(`0 3 x{{3`vލ`… 8q`jkkofñfV̙3-wArss۽-3NBB )S%..7=o&R+Zf yILL$==Z\/++ Ə߮mAR먠#TbŊGKNNI899o>ѳJ pB8!ݎŋl۶ ^^^,]T2e pX"##ٰaF/Rpjñ߿E,{!??{O*yfL&oz?saeeExx8b${Bꊣ#={ߖٚE4883gpjz BBB0L۸NRR+Op,--ٲe lڴٳgCiiT5 Æ ԩSammȑ#vW_}KKK\\\3gYYYb${Jrʕ+(//'!!D-!!!?~ɓ's1%EI1 j1=E8IJJ0k "%%2rrrHIIvڅL&ӖbvIQQ t:2221bY(Jbر憧g:j5nnn|'ԄFҥK>ׯ%%%^ӧ#x{{K5kp"z{BB@&GEE ,`֬Y$$$pmO?Itae먠g%:*!uT$@G #y摟/nbh4cʕa '..ÇZFX^[oqqmFqq1ݺ3Y^/ٳg .9@;m nnn#3g-//g˖-;wĉi9sɓ'aѬ^Bƍdڵ(J^~e&O"X^fb ;w$##zYv*5¹GYYNbР޳5tz=xxxsϱn:|||/lλ7/_&99(vj*N>mvz:uT|||߿td2ܷq!֯_޽{jQGkm믿&-- JEqq1J[8RGPPL&^uЫWjYb}Ly CTT*^ڲ Z>6( _hllͭ>]n:BBB|2.ۛ䄅C:`meeEuoT9˫=m:t(˖-chZ&LQTod1s璔͛Z@ (++uWݶ:;;[[vaڴiL6*ٽ{7QQQ83gΤ<PZ;)))ȏ?mm JNkx[Wse6h4.\ho߾Gq- ښP>s͛70>,^欣mpBnʌ38pC۲=vضPWWǦM9s&F.\t?[2uTгca:;蒥J7O]9N8gϞ; +^*LfCٻN G;? 'IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/state.png000066400000000000000000000237161475757676000231360ustar00rootroot00000000000000PNG  IHDRQzTXtRaw 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 fVFPᤥm;|x:Yd*[IM  P*49BxxҥKlݺum`d-'O#?mi?Fee}!TV0mZa!ϯpB8!@~/P^^L&cڴixyyN}BCCٳg:Rd2y! ,,,XhQ^%AAA55 NNNreZ[[{:u*)))dggrJvAGG>>>p]ET*$11, Ĉp,,,8pvvv$$$rJmF]]!ǏG*VR̙3+++<==y&p,,,P*'F\Jw};wG||<؈T*f|}}9{,K.̙3N^{5C9MF8qrrߟD*++IJJ"11'xW^y!JErr2?d&Lرc@"Q4#GPQQAgg'UUUdeey=}zw% 111444fVXA\\mmmQ\\loX0xuT0rQXgqvv/ggg;&zX,!@G #9tIykkk GVsĉUի)++3oᔖi&PDDD?Kcyj5Z7ɓ' AAA"G*Eqq=JXXذXGkkk)..F"p…^~]]&90jxzzANN*ʐv(h4⨨`Μ98::2n8Czuڳg\r ӧl7K/qpp\i7QO?F]K uϏٳgckk#Cqرc_5>>>s]lll ]vO=455yfLK݅'7n?s)ҰwtuuGhh(DEE:PoN[[nKKK… 0k,Fu۷o/ĉ9s 2nܸVյheee477T*e̟?ߐ>:n1U`aiח1cׯСCTVVo} (J_?k=iv ᰎvttN3fZ-mmmܸq3fl2-[Fss3|DFFHSS'655amm=:ku_ss^Stxu;HRIMM%55 ΝKnn.t:cƌں5άYܹsuX j.^oSUUe^gFlmmygظq#:ₛ[ݻwakɬYV˔)SXvmӔJ끁$&&dFP0o&M[>DGG3{lK `u߿HKM[?;h_jIvVbbbPTy뭷햿 DDD0f s5Z \\.g\_S,}1;@m0jgh|}}~:} 888 hB+)6M;;;^`T;먘$ HRRҀvrj{::Xo-}0fm~cm0:,_[nQTT4͍ɓ'L{{;Z~ M/-Y^a {`uT ʊ|zhիWj*rrr g:j0 P $0Х$r ţC<,YvVfM oذN]3nKBV ~oIDOjx\Τ^4 WmlVצ"!=YLD59x'ߴxG`ei |fME$O žV}ykK_x^t{Ob9ho⍙NVq_H}T,4!^v'zZic%~=:¨VO "}$Nj?*AɌ}D''5bٺoOs s#GtB[F>>e$q`ok))**^5\#l7 1 4ɩiُvlX5 !EܴRIb H*9>ARޛzޏ0wwhiRױIbOu0̍WV=]{GS5ܸ̼WX~qB,}-h=>3#ZڃeYRF 3͡{U~AppbCgn64/%ޡ:^#76$ MP$@J8;XMtThl+G+]mh#_~~Vˮju^;f쮹Nh"TT5^yP(fԀ'nU:s`nƛI:m`χe5MOj.jJNq3;khw&̘ }%eaΧ? E2EmٜBF8K L̶tT5R{V#L)io2CF{! UBF{r9A$I]3?$yai%2I;=W[{[&IF^iFnF4-NIm2A66VfYgOj?x\UR^"<:<Mtp?]"{[b7SJBXZQ_ZQVm|F&um+Q (`( pd";B?a8j $}$}$}$}$}$}$}$}$}$}$}$}k&;.&@?~媪*Bzh2'… %%%riԨQӦM mT^^tҙ3g~}(FMg +O>$//l̘1O>={lEEE~Ejj*`˖-5+/m߾ښ}sUq0ҿw ::{!C V9??ĉD666cǎ]hѰa_=zr{.&&f2sҥ!!!j>3g.\PYYigg7}e˖xAEEE<_|Œ%K,iHW^?~W^zaÆ(oq>:uD(ظ.XpժUSL.Dzejkk?N@:%B.\l$WZ5tK$??UVQ555LHHmllLbggٳk׮ܹߟVSSj*''3f466|v bx񢫫ktt4aZO?8q.22R ҍc.WW'Op8W@BEEŇ~/'%%_ ӽa;=JEDD'DGG/ZhΝyyyjϟ'ߖdM-ptt;vlqqqUUSeɒ%4@dd `ɒ%fff111Xx1r8{ðVVV .d><""֭[FrR K q.aٙ3gZ[['$$0},3{yyM]!}˗/gdC>zȸ͙3gN>=///77ѣG`w}q{wuuen5 Ü>}ʔ<|;%TTT`www.uZ0|p@. |ÇgΜi Zxx{/_>sѣG:880=NJMM : Ν4K VM-IG?[ҧ`Z;v8q"$$dP;&SWb1Q"4A,_GGǺ:Xl(wXB1`@jt">>88 `ʕ$ܹsO>}PaBB9{tBw찐N'h\鳁aXDDDVVVBB;whg0bĈnҲJ$/Je2}l_Stl444tX\tGdddddD"OIItg}vAzh;dȐqƥWUU=}bA (Dof 0a5=BONN6;a}ղavv6ɓ' "};UWW<|PMQSzT*U2'`tZWaaa1a„5k̛7O"ܽ_~j\]b"߸qC-paaaRR2 9wikwus=dt\.?tP G}+mwCgϞMxyy7o3Ŀo]ش.fR&%%N2ŀG*5q;'2eŋoݺfA)*DSZ<|ň# DDEEE~~>pƌTڵk׏?~E=yݻ o̘1sIHHXbŴi踾c-88x޼yNZ|JKKx f@+W2eRs玟Znaa_PPuaÆq80OOO&PoݿԨQt\k21QJMGlݺ8~,OOɓ'v/"mnڛ|{Dʀ 1/_>jԨ۷o>x@PN4)222<<\2:u*+++++K 8::Κ5KVk׮Ξ=kgg7cƌe˖^{?A 2$&&f+WZZZ/_vtt={ŋ_u]mذ!666##իBWWWFnnnk׮=p@||R]tرcٛw(zP111\.5&&W^Q} 42B١ti_~}fϝ;w͚5}J750"hBQQ۷ gΜBGow?lee3vHʕ+`ttt?~HHHHB믿̙3'**ܹs he+-G=+9}͢E~w ݻw3|00AM#Ix׺hOa777MiatIo޽円566Ϙ1kо~9|o꒕HGWKR>lr.OєB]VVV?ie.QmVmY(::zժUtjIx>P{(Zt)[-E͝;ĉYYY)))666sa*螾=4m_]r t~<<]BLPFMIx4'AGЈ,=0?~UUU bBW |v!|ҥ3g/P#0P!PCOt~lO-ShؤCW^eֵ3m4AWI_CZ᠋eC3 _k[Iȇ>F/CAG}(~p:FJ:G>#ttHKF$.x}%.uã+P!]2 w}%鐎u@yxP4E@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@@G@ 0oܸUTT#L6s/HǒJiii)))>p8=ٳ1 (:vX~~~iiiSSwqq {W-S2Uí[K… cbbZXX899=}Ԩmr}}}ݻi&cߔ8|СCG)J .^{nWWWݔLhjjڵk@ J}\---v`Ĉ8?f͚KKKtݺu7oLNNx<ޱc'bΝǎ㏍*AS2ec׮]Gc=znٲETGFFuZڴij%;p@NN1oJvv./&&&)=%%e֭gz0wO^jULLѣG+**x>>>y(ʽ{ !!!}rDGGGGG%&&&%%:tСCᶶBxe)S {* X\XXX^^p,}=BwaiiOSPPxڵ={Ǝ?>222,,\ӶG)((:uq LF8qu}ɓ'srro !{a̛7okZ*33311ʕ+QQQ6lpΝ]~}bwaCCCNNW\uV__ߞU>~_~;w}=)}%6۷ogffB\a:v}m߾¢0a̙+VعsO?Գ7Sm}]vOJ\rjeeeIII.^xƌ|1Mώ OOObHd-0(ѣGsm{رcǎ͞={ݺuׯJNNNNN6r...6=}ѣl"z;5H$FZy)gV+,)))(( ܍7޺u B`(ooo0a„M6f5t]AAg1Bw}GQTppp:ueaX{~邂ɓ' 7nܸy&p;vlmmW\٩={vdddpp.N5;wNG uĐ!C{\})s_GLyy֭[U DrʕI .={V$ȐJ>>>=uD}BLHH0JKK+++3MVVV/LM*[gs}v$%EqqL<^{?o\_ƍr\vAG 6\ HfQsEEyYii~~^nNvlF0yyy+A=Ž[&`aj঎73313""j֨ ]¼ܜ]#Gt2*;%2 IDAT/^`T'-[: ѯ>W˨xN394ڰR=z/h0 ;cDT#<x:aӦ-CC͂FQ[SI €ӓ=Ύ{cw[^^~%Fõ,EG( D&l e"L,˕EA.a@  쒛 ~tZF{gGDii  L+[jyێƌUO0DRTP\YQ$KRBPJL,7$"DFAigI!w2ҥCΚ5.\%SD"\.1b/Q;wh0wm;v vXu§U" I `a8c-#HR,7$$Iv6&N +++,,;3gNvO<3Tʔ-}Cv"VprNm8"IQie]c3oi&m{at9XFQ EQE;|8gϞմHA㻳l15-~߷|&P^𴪁 m˜jat8)X ml&I(H_3-yx6mڤ MssӧO322SIQKw==Z %uB 6Vk{XK#Ke-Zm 8&)I1p2%bXBQիW{?n8L &_SEDbۉҊZTvZ{Iۘ 1$-m$:(Ӝ6m̸ g]eiunbWWW۝8pLf=w[.iHX{4GK qfZI o-]:U-HII+4*bjiخaH 0#~eՁj.ƕ1a %%SLό G}}}YYY_aWVVC cxKnÙr>W_cǿ6bXw=P0ƃ`>pLX"5#9u }yd!:>^bg% kGDش_kE$ ¼>eliǖc S pnv^R?pFoVuf1(VAmֶ-p'ꖣڄ07!DӅL&Ӵײ+//cb05/\@26o; l}@P)aL8/]X7qHݯQbmZkMc7?AxuaWRRaM; VO{EQ%%%]O/xfbԶT!M" 0X323CgHvm `6 qj\ `LAj2r4!;uLN'SInkWT?*0n, RAJJ lZz`^#>|j 𶣥S!mFj1鎻_]]ayT5+c_% ˝Z3:"T8kvX7ϫ7fdə;hm`iCXk Z'JKӒq=aHuǗc>l"s5 @S-1U끶$&۱)] #B@QޡʎRC{i]];|Rv۪M4aj`oVPQq8!{&(`Bpp븊^C %Tw]e8ꏦvSK߼;x<)cΛ]N:t4w *rе5UqLK2n:oO5aS15i_Wޕ/_@jR\j n8fНڄ [nEHBBN^>)rڝ¹ tgw'=}RCK'SIv0TN4 :si:D5IrL}B(-ck: T~$q-wss\GvSo>X39446bjH+{5N cѴTm4Af& V2440bjxCE*|P&]~̌(HQ8 (Jœ`PZo5z )HARu5$Ds4MK}ر*JB;IMð1cwSIyokJ!]7qNrZTZ5o ސ )$ lll755euG?iaK,,mz!gsya|+r ,,[TȥfRIANBHQI|5=So5rqoeeUVVF˻.t{CU=+wθLwGQPT2T"%bT"ˤJ 2k5]O{7MN}v8dffj+,;z!bjRƍP(0pȸDQC}]M֝tBrU7 TU_j,DuĄZcggzjCi#''GE2;|rW/4F>`'IWo5U4NZcC=Ƿѥ ˲n߼Ge 7nhXM4(77W˳&`E|}}Ϙٱ.6lmܸQ\ K܆98<BriScCc}]ճ'Odcuyf#"//_jxof`` 0> Si9G+}֭[Ώe˖齘[GI~ɮ1eKXaF&СCWXa$X ,--㭌]cj __mf0lڴioV㘺ǏP(f֬Y\QĒ%K&Nh.q#FUTT(td6m~)""bܸq_@ܹdXLM:"hz}rssSRRʺ)wL{^ j8:̘1yNب{>}{GWEH Ϟ=+ط[YY9;;;99yyy~@.?~Y&3]bʖ>4ѣuaff6rȑ#G>HHHHHHHHHHHHHHHHHHHHHHHHHH\z@*<|x{{?sg6Fl;_ZZ]\\^}UkkT n/ .Ay$$$r\___oo{奦nڴ C9rT*-,,xݻ]]] S6v%:$}}f͚ݥ֭yfrrrDD Frx<ޱc'bΝǎ S6vڅa믿~QL6mܹ7{xx̛7[ly7ccc u9ajĔn:ytHi۟>}zժU111G_L+++ /ano)StZ9:::::,111))СC մ޽{ X,.,,,//^pa?c !ܱcᅬ"<}G)((:uqt=&&&&& 11ڵk{쉍?~|dddXXyAL&?O8qZ>ɓ999۷og{YHΝ]~=zٳ]m޼ynU233\a.\644߿ʕ[n7L?~/̝;w悤]>>~~~AAAx0a„M6u7nuyQQQZ|vS(~wE}>ðF'OF za?kٳgGFF ;;4hu}}}QQ\.wppXvmbjJ PH[Ĥ$&LЩ bcc4Ԕ]\\,פIL|LM 4E@`sB $}$}$}~1vYWW!^ 0''o}鯿ZPPP(057@hllܹs'Ao!O\.O>Lb:iL|`uH޽͝ƍ׳Q RRR~N{3ۼy3a/rhh(~đ#G O:;7=L]vҥn^+?ܹs we@)ݻYYYیm۶)JcBxK.mذ Igό}w}3gΤ(J믿:uܹsw.6l`3(++ki_@ nܸ_#^XXX899M$}ca⤐EKc||wEEq~μs4$r8oƀ瘛6+γd}; /upp+ v3fFxyӞo5)))**L7o,{ SaZZӻÈhO8$aK2yʦ)E&q}Q(2\Icm'eϞUhDaaI ܹsŽBd#F00 ֞eŻjBX*W0gk%4aii/Lp^q ৹֭[7idaEK-Y gMRp p AbYqF1hX `WIټy3EQ͛7;MnCѣUUU~}}ނKdː+gB /~pQ`B,U((!#d2âΡ) L]^˔(CvShJKWji)˖.6K=+p\eZ>8V o Ɋ:QTA0ͅc4&y}A^t3={li"j5OؽPBLs-%@P,35SN:})~{$6VibiEu#2~-q ֚$VHJFox_ULou hi⤐I!^ӪZ mVoc8lPT$EQ$I 7*0X)щ8h2)PuH݂Z½6րBd3Fgꚷ--[ D2 c_|5MsNݻ1rHkǍol)x^ 6{h )IFCեLkkk{/y5aM%x@a^ ޑg:")NCLMIkJH*Fx8:0<>V P@T?`믿9M>رչm 걯.f{xL@Rp}0'޻wIX @QPTJJ hciuWpvԦ{XFgG 1V3 ۥsMOf B+ _Zv,cVJ Q`7at- `BxF]SkQ IDAT27yofڝHzbradrW8{`@e @(; 0R01E7)@`\23[ `/zR~=@wO BQP !hYܜ7S(=dLJɤRDhP" (n %@ ¦LNHҒ*Be}/ݳdc Hp7-{o2miYm! Jc ğWu =}j@iVBHBHNX7ŦQ8V)߼x<˩{S$}} ){[{{jy,sP)Uc`ˀ|X_r̰Ԥn cUO{Y?Hiϔ;}ĕ? IVVp[ p ppKK8 VQ^I_/}H"Q‚* t-2RkWҽ}8!d?J#Dҝvǂhnh9xxLq/98Lmh+["__O<}98n{`؝vGCbo;B@O3VY}kPʮL[mI_O<.~\.Gh^Oi;ooNN`Xkq5J9neS2(xȔCT}Y]RMc0ؑuD{c. '[dS_mM2criٶ5PB\F\V؀ZUVB4TGj<02N"N$Nay~^B!o Zƃ@N=/[+?X3yJcm !zFP*i@RPP<)8EԠA`(Ҫ8 v2&1c  | nf&T(feUtf + Zi))HAH( XLR~}MS<}Lz-&VO_)S ՗ԘkZ{QHP?b~{89mWQJe)$I565dKyٙFes,sT8ia&{j>"0Xp/1sp@BHu2AAc`Blu 4@ ($EIfasgOKt{weVsZN_0&`䄤3>Bi9)xwp%7q22!xI$EBb(Fg)t93#,41(m5UVuˢ!ewhN㚟u'0h B!%x|3nza(a A`K$I$E$AA* R3VOq0Cƥ9)mœq)A @f"8w3,:a8IΜU$jn͟A* $)?h3IQ$E$E痡$$ I PI P(?RAϞE)W/k:n2}R1(S0y iwH]756?3JBLdUS66o$Ivl'R&W\Ol.HDhh(mRN M8LQe]QWWWYYO52lHHBjG f5m#Pr!Sr%!W( B(jxD&Ǐi7=t'N4He@"kOO愭3t70}׺iI_W&&&jIc\J$s!F+@5c;%!WR X"|VSUI+hnԘcð? Lݯ]FQY?\2tN(,Sd!`-y\P&x1y!R! %qOniJ BIȕDSB&H>3sssC14i6G"V%W{_|B!=^VVBjښi.#݄Y"a9\>8E$+rL*aV)Ȥ b4f͚e Nz \.y~&VE=tԩzU0]6Z@}]L[{{' L&EBI$ljB.'IRM + gj-utt\x1"55UP,Տ{nAZ[[;!Ŷ轹@z͌rqL_c)ώ:WWI\snyoyo.m^Gs8H$GOJ:L~sc3EoKEś7oֱ2lPgv|3s2iSSCmճgeϞr͛730BqF)a7o|$9>s8\$ RNy<ޖ-[Lɔ|L ~NG¶mx$JPH"aDܬM{7|ceeeJڀG#**45k19`ƌ2LKl׀pww_b?oݢTWWڵ;;5?ѣ-,,zܹs÷mۦ)#q]d KK˨ ㅆ.Z|~DDǴ;̛7o޼y33 Lĉ 8i@ܼyz)o;w}666~~~cƌ1vM{eo,mݺwthmll]\\i8{S'O͝4iRmmm]]L&S(2ܜ*Huϟ?O*# P # # # # # # # # # # # # # # # # # # # # # # # # # # @QԱcKKK|KXXثjmmmߺu/,\0&&Y}Ӂ Ç?zhРA!!!#G[bEUUQԴk.@>B;vՕ}3ܹ311رc F_]va=zal\/(//t-[曱]:n:UH]>>>֜?ӧWZsQ]5VYYw^x!$$ sz{U(b{…n]VVtСCGFFڶBcKKߨtBBBL&?O8q C$&&^vmϞ=Ǐ 377g*Np!''g+Wܺu/mîp dmm]___TT$֮]ɟ={vdddpp0a>6655eggӞ@ 4ibcc[`Qݑ/ht1E (=PHKKpRja{饗,IؿG˝ B8s̙3g0 >|+ BmHN EEE~)ٰa >B7|$InݺðxO##菭[ B#B;({3MKل$$ ŢWKz\J r^}T^Z+HQD" $Cd;/?l `6yٜNΜ|w~7gfVohnn^r^b\\766~[ܲeKFF0] \֭uhll\n>pyXf(166wIrƥ''DGGGt!w9榦3gNW^LNs͚5ׯ#Qo3yrrN:>a̘)Sokݔ{R3x(\ }`0֮]{AGtws] ۓ 0ƹN[s;d ]駟Xv^~e5:7Ϻ[%{J!&ſz鯯0477755 nnŜ~Ju(LEqj5Z>20"0zt+W+ٻmk ֖-[ i|BºϦgY.bv"o~P(2BaLU.3>3g5Ц7o޼i&xagqiiϿeBL]֚V#`919sssW#vtZ̝=6I2O7~fc l^hLic>zbL6Je򏍍{Eqqjby 65i8uvʄb3cE/1q1juvYL!2!2!Fc죿_1H 6ٰ3޳V>}w+22Dz6w[l.E=p|QOH9&p-vZ'9eܿ.^:pjq*Hg;OmX?-?=B晳JiS{`1F80w ψmeBYSjƍA@`םxYrf) kafp|_;uuWdbs Q/Yi*H+tZƊ ^vW3T6}p+{eHacA$nARo4:g D}}=Bri?Q,-!,#m:>F}9A@QE;cwΞc6|(Xp\?Oce1V?w[=<sB tPP}T i0H3siv`I({{lN1jm؃Bl }T==",x^,9rHwfGV0Dllܤ3,6%cFxtxԺRS xpq`VTa,Hyg^;jTTfڵ  69D]YhPNw=Pjc{%.1Ymူ)-"~o'a DOot|ֵ4 5w'f(ǥq&2J$Ici f>ڭ[jɲ7;>|S?0cSpNP5GBi5 tKx,ngܪ>cԷJJ+{ƄbV|˜~S>?Dq!*Dw2{c^M8]nO.%jJQU)ʟ֌hDG OcY87q1w[KK\<[j)teB""u }`#wG(җ Oj1Hlߨ;}Kl6W30$xT~ (j%p5#@<2vVKLMdex]u@ yd]eʜc_٬VE&U?MIU?PR!̂B)!D&"fQ,PS@D;񹲰(+. pH"īWB)!4@xЮFޓV2L$teeG$I }`(ms=%IHR]]],C)ޞ&zH2dYe+ZzN[W?xU}Wdw^e+/H2%"ʲ(ɢ( $D(ɼG݂[#]]]VYʻeJ. }/Wf7km򆥛z[Xz{3= (KDIbDGt'q'/xp-,G9w}(I^r^TT4į b0F#B(eK{Y%Q#čmXB/߭Q[v JLHF.=Np1{NySzݮR|!Z>BHpd6:Bh֬Y%%%ȎFYͦp"ĘxUV&+[" DP'SR7,%odDf6wvڝN2-mۼ{ǻvu}Kլ}o9bŊ͛7#R?~O֞=!ĒB6e[{rN LSiw9l0mFi4,K$Md"l%9a! } 8)))X3=YˆCɻS4k{5g*ο+T\48AD[>\ A`phYĜ ONTs=|[sCMٺjY.V;D>H4֯_$Lŷ:ԴqƸ1XmxVN)<Zz-=[Lm-n>Qծ_> \׭[t:/felj ֣B EQQQFFݬ=>pi-[|o[|G҆rp}HKK۴i;;M6 ªUx_vPe5s\QQ)aAm= IDATfmܸqϯUh4O= z>0T Æ BZ}}w;`.]=7Bo?Eqn1j ,S#˨KTN@H@> }H@> }H@> } }H@pE0Rn2~7θxVX1Z\8o2E{jGjjjtt oޯhsRo5+l[F ]wݗWx>et}VA%O2`FAAW0#m >>>_%KX;A#+ ԩSVGFdfN8޿a#FjR/t:yom5$!!ϟ !_pvY&ؘ)S&%GEr=]]=5fs_ƫnj@W+WGR-c޼Yaa oiiO˫AW+{w(zp̸qɏ=cAW+WpB2c +̟?k&>|ȑSMMmNKLNN6- hdKJUTttt r\G,!h4LpmLOO < wQjV/nkllUΚ55g=˒56Wmm+Be}}7w5wfLfPrrb-I{nkkyue$$Y,}mܽqc3<=ʷ\\kas{qZZ2B섲u cE_ MQ랡h/c|S~ߑ+ 5J$dBU'K" A\)kj4G-o؋-L+(ț9s:zE \\?8ɬBK:5vu+/>qtm9,rms}ǖ%&Ƴ5 f3׬]VV\W0L&s{{dI~3*J98C}8nN!d;++k?RUU+oyo`$mL&>dxFt`֬駥!0%%Ξm B}wyj؁*uM7\ۼIlcgjG"hW3G/ ܳ$Ƀ26eeJRhRzQPXX؄ \y&M` II ,sx;<˗eߋڽˠnm5¶w٩80@)@X}}>ݵsZBy ;hmgԱXhXeBL6o~$I.-- eʔ/d{o:(-tuTV644_P ^xhykL&saaA||b;tرc!p}?U{=&\î0$I6{:Ƣ'7tCeeG;V~`ĬhA:;;p./dx.@aaARRJZZZbSjÞ|7lӵOת?MHL1VW7TW7mĬ%K~gҥO>)yi`_y'ϔW՝cFDD33ӦM͝pcbV>|ȑMMNKHNNϟǏOolvJQLLTFƸn!??v1{Y3JK˪wkcccƍ;iRv~~PFΣ%~$W0?W sf+{ >>>\w|z'5ueܺzHyf圴fH;x > }l4\!z{kCU]llvkև<_~/TM򃭰 Tj3x]7};% ҂XJתT߶IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/system.png000066400000000000000000001230071475757676000233340ustar00rootroot00000000000000PNG  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 IDATxwXg88:H4b(5DcIQh?K5( "J7pnºy?wyg7nz9֭[`#K !e(^ (.h] (ڄ{uֵ\EEŇz;?C .Qzp'wzE*\XX]F+m7Pn>}?߿;錌ᶶP@ 'F@W=\344444 ((++rznovh`hhUt1Qt0L@r=@/] ZR_pTTnлCg C^^6T 7 Xn0** ʡW{Аroݺ%fϞMx<^133͛7]LOO? Y&ME< Sr?yv=B!---{;++gϞQA__zHII\t$Ar t'}TMM QaޞTP@F{uu6PSSSTTo޼FA"'MtMMMн{_©d`>(ҕՎOdu`zI߻w:t۔;wܹCm4bUUU!.kSSSz;vc>Ӻ'`(]v92Cƍ7nܠ'c2lmmdRj W0lϞ=Uz:7UPP>|ܹs2YYYM2r\j'(6]J,G$Bُ=BQL&ѣ#] r rZFFz..ZFFUUVcTu3gַRq/榤yY<==W^Mmդݲe 6!pvM ^^^^^^mJ`,[lٲe=~[F=y<~KY\$mlZTxYjb=xpˇ¢EJJJBz4$$dΝm= - :Y!18a!f}嗲!U\@ >BHEKksc' Z^foJ!bKyxxhkkcfhh!:U@tt,PJΊ… +[ɫXmEbʝ;nҖ:=tٳ! öy(;!!;3& @ss !nnk&Ӿզ#Ȱy36m"EE._N ))ٹ͟?ܜ:˗G> O߸RΞk*+-{H|` 44t6Y0Ljȵ]Bh¢3njod IUYYIAArJJzz-;~}jڵkdXZZ{33`Ǐddnyyy VQ/Z8@ DsTYnZ5k55`lY___YZ fF\1#^ܾ=H}vBBIñ?dGQR6~<[A͛D*ACYST4%i ߼9u|>BHZFf9%lۿ_za1!44x"!TAm-aJIU5`=8vLrˣ)6z{뚚ꘙY"ǀX,\隚`H~٧6nQ Ah0%CJJʅ IYo޼9t@ :u*'**꧟~Piiiiiijjj^^󻊊s⦉AAWeiẦoSRB!7n>y2C8Qihiheb"j*a*Wխ,)Ix0hPin.i*+4TBHRVQ|0sZ`,I@ʠWFIx”2EkuHt%_}ĉ|-[RRRBYYYs PK,޼yCm^tLNMp5k6UA888,]TKK۷:z4==m۶˗/Sa޼yҹ7n$|jo?)SL2eƍdLOO/]DIM6#Ba``9”f~,|&#**3&&1(2ED?|hInxy]ޱ!ϯ(*6:Ь潎DdW7aʗ_Jq3~U58+ !/t̨yrH(,oxsb{x$>cj22222FyQѻ)by35*Л`QC8楥iWm&ɔnlz!Am;mΖ'E޻g3aii0%^rtt o߾}/ȟYYYYdd1c8!mKkЦ~\PH`ɴHCvvvee>raZFtȅ.B2rridkF! :vl]zomcj*"MxC>@O8+ !TUXF`O?~199QQR+w.+}n~&"蘚nnwc?A=}sTSS +KKnj!C )y ÍԤ FDKvFSPrr˗/,***33? }ii$B<ڵkߧL 666r QZbȯ8p`ƍ777r ”ffl%z͔m|pyIAddĈ`IM=xBNp?!id.l  {5* t߾[UTV~ SܺuիWfffƊC lX+$$ ~A__2''' Ճnnn.B(??ڵZZZ-Zh mM:s !gϞ)++'''S]Z')**={NCCÿiJ^^^^AAA(FhhҥK0 *++5jZ(L knV6'j'eDGdfV,6[UGy evBBHYSA,eU d4cݑf„ڪ+W 23΀tuڵWBB|`1HoD4upדWVTT8=i0%AIIII oߵ(9hР-[ݻ 01éƍ#Ooݷoٕf6=rȕ+Wuttm۶{nrtlSaJRtz@ikɁqjXd&+33߿ի'Ӿ/c;} l}cb%c,$cefmΜi! oD^Uuʕ[uWmܹs +**wuu4i] 988;v˗ zzzÆ dZ]]}Ν:&5Ą\\z&L=ɋرc݋666ԀE )y !ظqlżxA/x5 Z+)`{H|||"##ɝ!!!NNN]#))Bi+++koogA)ʹ`?T0[C(ʀ2Owwt9xvjjby9WJJZQQIUu-&Lړkӳy>WV} V&!*'=\ D=^zx!CDDDŋp&Mk׮AAv7׫|&g}4)M:ңpNf4٫(%L13F~ӅA\JPTTXt9~IO {=!Uii1):c<wt3oݺ*-Ͳl:MMmCpGOZ*Iο~WH}$>s涺NHx{=11-a244llOԁ_ !Cwюzu!CHaʻqΝZmmmlllllӧ!#?x!j4DX~'OpSW;v\z \pѣGAAAFFF}Z@tلgԦ OL:* *KM>Icwk3RWmYGfCOp2&--b5ZNȔ/-23_gf~/o4gxj%>f"Ad+WE sǮ\9Cm  ??ozaaaaaa8ÇxÇ)S(uxҥ_~ /\pڴi<o߾}񹹹3gΌgXƍ#{SZٙtՔ0A>yDOO>)-zcXXB_5Y$*#vzv!5c{ 1Yۼ C~S!D ,!dnnMx+V|<|憆̆p8 /]:Enjܸ᝕^ZZswG^KŋںCbc#KKIpiQ偁%YAcөSM[[[0yyP@J:hj긹5w%k!둻#Ȅ }p(@:M3vӧOSw&f4?4-޽{%%%jjj<bcii]̚5ڵkd2c >LOO l`*F]YGv:,?]/#;aG My+l2$'K;vwBUϟ?zB` f` J^\z 5zӦɰ#rž;;Kr,LiiҥE"B(%%T$q8QVVA jwVs2!D f-Gv_JL8pFAA!m:seŊ1:vbmm}ȑ^knܸ:""gΜ^\\,\z7oy̙lڴ}!l22) Ö-[FI+D,/]?@VFNl4Yaݻ ճwK [R: T?A+) zt ٰa˃kko񨨰W·oֱ:##<@͓T=̘1QUUWUPT*BB ##BJиq>3MuuUff}NNnt ՒFqq!B(11@=tm=ʭ)Æ 7n\jj/㱱#G|򥡡!BAS]Y,… 8:իaC!mJP)ZZZ͆\nDEP Xέ^ ϔf#U~vtaѻ61)BHǴF @yXH:11GqqQx[[߈x<^ӝ::zTXZZp'jNE32TTTrK>H4qrTh$'''rĩS/_N_|ݻwBƤ?i oW\I'-ښ | wlsE~ݜ2rc)#'SNTqfn,=\Ѭ,huVE_Ydzz^~IZZB(77!D#<u޾`'-*ĝ*W[͐w{Xu"zгȡly^m3ý{7ǎzʊz;)++g``BDG-_4AOo:lJW$%mhhzyyy2B#_P(!Ԙ %M 33_#BC+++H4< ,,vK+lzoEQ.\B[СC׮]C=GMǏ#  ^~=r?\OO4<<ƍtk+HN$Wikp wwwjBhܸq}+Ūuن Cg~E"!w\w+N\G..61м%zE]];l ONh]ftޟByyo7mZ1sʊԄ.YVm'Oq*W_-\HFAAB4KN6fdЬY ߎ*ׯ_6ϯyy"Ś:zh˗/]$wwѣG iw[:,ꀬx2NJ}R (\[:K8!29м,1ТZ4=y*_'vt yѣ'd^| 7o^;ï1#,,PPqqꥑiII+]~K[[~8ҥK.] bnngѣ= aǏ?~x+$8cƌVVV˖- RGS U;(e|NuA״>Emz[plV@c0,-IԲ8NNw6;[NY8HN%a~.b/~#tlhfD˗JT2Yl"56N.OhV=Yf Hm`-3կRrߋԉ"eV噰1Š00^Nx!}F/,>|}_(3@t b)(5e@yX[[[BN*ȟltvjYaaa8_x P} *ז 04H=bлnFzP>|ؽ DcU|:C :C_HMHMVlըSy]> %,,$:k!P=o))0BDDqeVע}Y=(*ïց>!~8׊s2^ypfl@v?"#)!n{044LHLb."#MqkM@)a˃͆/t &ZRh"ZR**h,X$mz+RPDy^^ArrIffea!XTW'l&%f`if0 _JJ^e="9PEIe |~EEqzzFh(BH~cgg_TfxAHV;r:ض`(_cA]&ܿoooG #MÅBѰ"e2DY/_ZLh5e CK;tPХT8ήU͙l蘦qde[U!qocb\VJ#:򓒞=* G{;KA.;Q!%\%\NhpPG(HJ 4;#U, c_Y1,`4G^~{>zxwfFX\( 99η@jQT;&dH}vWwL4#nt0 svu_+Vi* ,,?xXndh@?l]Pt℀XgdBso87hл8QYͯ "B$™LfI)ȱ92CN &Ob_rү%y~͛;uG?@!m.\跭+ח]2ڍܣw}屮()){D8^TZYZ^E C@ 3 aJ ly9! tuu=#5r츻wN8x;QQQ+o[Weaa_cPΌw=AJ:jr p0.<:x/!! J~9('+#E#wqkAA>~~FFɫzh)>>>Pn@n]wBa8{bzcIҊJ1 CoBo  J^ +G _uuEu /ꡪůb)*j?a4;qt_+V7͟m@vCPUZ&yrOaqvfδ8]zNܹs۶ms^t1b˗/BO^dIp1cZAsZO˞lyySGxzb}Z$ܸu~~zϗSRR4:zXVe"/D2rVmSs/ s Hk10 #c9xAAD[`A@N Fu"ؤ)SϜ>!>wiǎǏɡ:ԩd[/I O NHqc/# ܹsB5h ''EHHnnB,k֭%ٳ',,,<<<++ًZ}ܾzfiv`\ti޼yrtt SO{B}:22;1qַ߶~]TutzOɓ'^IkjbcccccO8r%T۷oGq8~mV[[{b~'˺_ !Oȴ"  y3#:zg&wggHY*:T~>4<8QZ^E F&hD!a q!A 4<V@ZƐ֭|\wF޿?}yBO ?&ZEE#t$M1JrrX!KK;qILL5kzO|Ԩ ::oSRϟo9aŊGW=uJ!p|fttuEGY~tr9EEYB Ϝ/P_tC}߱=<<"##M{{)S())<|066/=Ԫ8N&hccceeeooe.W;?>t۲LV?{d?f"߿J g&#FUk&1|m44 IDAT.^J{{]s섄CW!s USk*%fHsVZ&0^A; #<' G@'``8 D" ^]56i#oޜ[t_ۿ?9$!cdkKM[033/5iXC4z.(G oVW@{<:}:{뙐wAo܂?/MN69j)R\bEFTFӬ8_~=m֣Gc Fح[tyB nnSׯG[[߱3i!Î;^x?oذa߾}111~~~QQQ^^^jjjVVV|MI'd\\\@tt===fϞ'fࠨ(##3xM67IISN%S5kVzzzڹs'//@777,ɽHNhhɓ'?3yk|tAhagiyYA}눈, do99-vI^&. @-$/iixh%l`-o?F} Ç^R|r򪪪 ,UU%^YXKԩ Dahfn+ FDY(11$k&G;DV7f{(.sǹyy )Sɓu|>Bd~q℞%Bh;47 ǎIב8xkjjPL))=P4:ZKWWϵkUuu޼UT,SJjzt#GS^`%_3kIo1 #K2ֹ̙3)oނft^jP9/5W~B!ׯ3+@%E@ρ*={:^Zt&L@u/_ [n|R5dFY`[~zqqq@CrǍgϞ#^~\ZZJFyfppp 7aݡ.߿kTB 8ɥn q!4k=fFtŋ?Z9s\ΝNN,6[Bд%i`Yb޽{BW^=x BCC_~7nj!nnnդ. PɁ]к&%1 Ғ%oĠ+WU\VA 6:5]@a"H^+ba4QҁQ!T@ D x!ENedejyDۃH ȊNH `شiQĆ$%% Ϟ%<{Ag'$T!G9"P nik`b}}.nXYӧ^"ׯ'xٲeKRjR:9rҥKzzz}r9rڵk+V^z mL(vշJKcML m\/_Nmꚙ <,!0c,FV$ 8fffyYd`ҥ^kUWWk׮ݻرcGOn]'>;f A֯Wlq5FC)}tƌuڴK۷g4_6V(WNPVQՃ 8V(!;sc0fm( ! EE"|#}#{A:c0ï_ٰY;7?̒:n\B(ks ߼Cmcڔ&}ww2elL }}^i)yڪ*v㯰w"| Yyyc;;Ӈ{x蚚oZFbcBinb$mmɓ3cb~3fD;;C$)FhnєÇp!!nn>>"`536 smrĉь߇XK444Zchh| Ѕ M&\B|RHr-CCZ)y-6D}ihzN뢞oD6g6 a3q33&'GFYsݺV$K[J)A8N81mF`2E"ɤl8A`88"8gcCT4dJnOMEW=yo۶ƍz'[;uSꁛCY*ZPcrmLBYSbZ+em<&quy9BhҍU!Be9W] r_}Ec$IM'S_=&oA'''R=ׯ_5ofmm:ҺKJW --+:88=;^W@tt 5{vwCy%+tLECVwT3^~=kή媗UVVpΜ9_}UeeOeeepppAABh$עbĈ솂\"rssӺ'dmuuFt;& Q-Y AD=xpi'Y8;7F&lonޙ0`00lGݙ4e*i:"#3 00Dq \(Wd',_^˻wj{p'[u)@Nd0:tmkYC[[KrrBQ7{xPFIlq&"QQ4z6#ӡ?Φ(DQ][p~U՛;vW*kjJ 2i@(Qo˗/p8͛Q?bN3]J5cRԢt1zǻDK`n^^QVVIN&*\RPÎj->u&a3wܓ'Oܸqq$yAɯ3fzwx뒑35jxO?mqՖð'~2䰰Ճt;2. Ɂ'קׂ9b q ñs"HA<^e# +X}|V2{L?'lGЛ7HCmJSB2FΟ5<c{hVVڊxpFx kS%L}\$0WʌMjjj233q&_aaaM_oGSΏe)**5ktð۷o333%qKuiO>!p<֭BM-Boki~d(Y;~%i` 'Oy&BHMMm_ /_,A fr6k̙充 !m|$Z{qdJHxfEBD"!E!d`d0 kTf jU2@ "*55{sRֶ4^" ϓ ˗KX݁M]gޫ-˶ly/l!l0`*d@eK3H_M$M4a6`eɲ=8ǕdY<$K4AK/Wv~ՎscQpfu04}?sώu}ҥ 1q8V>~nROٰSa (6Ϗvnfyw~?W^>|xQQnwͩ2 W_UWW[uhX֯ȑ#Rŋٟ{644TVVn۶+((Ω_| -ZYЃ?-~bϞ=[lٲe+ĉ!SD߼ɹ>'FUܝswKLGi`bܸqCeXv?-hM6}駮`I3/ Wv߮z۶ֹ^mpAPwݻT_d!hRS .^0 p]n'r :8Bf0 Cu#xQ3}ܮ]lIؼyK22Ok~f2!>Zp+^Ƞ|=+&#gϾzHk $~o}6{1J%P7q4f\p̙Č!'TW[Z7bشi"Ѯ]~vٳg#:4`^x^x0j(hsus=;~K.]t{qqqNj\T*UO,_|k׮9qI_w߽owt|{v!}ȒMj\I1 ՞۽A\S4=-9r&zN?99y˖-c#+[RqFF755y6mz饗N8arK??bccO<[zbMJJ:uBgvVVֱc^{bɓ?GyDN??p D2H7w| hLܹql/|챓7<`^s{ne'N++kKKi&a$dg"NރfS.Yt! N/]@oX" `b =M3Aan\C+,,|7_֫TJR8l{\2c9L.o 恷<#3;.>! Bĝnv vfvI֪eOhm֜)9Łh&=p|qЄ )ʕ+QœoҭV+?=sk\G͛W{lƏdCĚ}cϿ"HB24% lD$M`!Nv2[m f" ZwnH1Iy &9\!P&kBu]ںt%w9ӦnU'>D,qX"#BHNf]k 0 ղwFmg6a#j{X)8Ũxr+s6\ nͿ`xlӿ.K@B(d4P,x|AaHFj1@[ם zϣpbRSv<"y>ρ\987'|ɑe'Тm7O-32<0!B(tƉ!sgNfrO>;s8ppD&$Ly[ߞ):EQwo;2su7 *.)ѵtS<,>>r88prs',_^jwf͎-$҈!Ii$@7m6MSCC]uUEblc Ay8pC:z@"97TǓ0YX̦N]y2L@Ǎ˛7/B>{qq-6͒'M|K? c%8p!!` *CS(/D"illdBBlZZ|NNR98p D)QJeV8P&9p8p8p=p88py8p8p8p=p88py8p{8pyJe5WT4߼iTj``H=OđDEFF\f&_$ wUU8r5sKd4b?0  E&MGEX׮(jaAB!?2R˓HB?(JeUI4$I\ yb|ڳgO]k7%2ÚmK!c/B1n63"RW+$f=}zH0aĿbub֫|n 醜Xw )ZIbŃM>Wi,AL{[Z䢢C@Ԟ9zZ]!`C~_&Gg|~1EƬ|Fyb}paǿsά[g3TB]voq;9b=5|c+@N%YZΣe1>oWAUS׎_40|Ajևs7^߿cuL ̜9{CuМ8v2kÆŏhJcLwV2qI# IDAT TAW_5\AL}yҽ|i%Yǎ=0uvÆÇP V=;88izoh7 j"oU"c?zU8edM:zb"0G󅚩4zԣzIAZpƶk%zUr(xH6F^;7ї: Ti*UG 07T I ?!S#є] !C#=j0I5kMS> B 6ygj '剌$Ҙ9ڮHxI[5 Yǎ=f/VVYK] ZU1Ş*RWW"#$RT"5[fh08ںrPkmfB[͋"M @1Riw7*ο).Ńګ]%Ci%oR%4(o*%4jL;͟']2"..\`ٴ +H"H$lvbEOAdd}anZh℄9sϫvGSAt7Kܿ:!q㍮%%W?tz5aKCں?n Yǎ=Xt}W5޹irN1?G]=0dh^؂yJ;.XM˗Ξ9}J)@7lZ㼧Aq,cQJ^ݬ;VQSrϪs0I>Ai/z Ꮇ^Q8 i H ֚32ή<^IK_\u+bU I ;Uoԅ Ǝcl(NvԉS'N.+dV}{{C_2>G{>!^͒wZlBں'K%e5KŜ9p0,iw-UU|cIuٍ߿)2/\dnF#L&VڱxoMO꫽\iH/g|{L'6O{HZaۨKy3,$R1 B\ilyun>P_b ~sݺ,p7~´™oZw I:Z1koi4/O]1V~#|#i\q.D7<4я%s?ɓ'L2L;W?_0wu# ًqG6~;%6?5{3S4cQival#G=&yǖBNGZ,IÆ wG_.TO_x1p%fk< B_>t2LCiiԩj6o XÏ.5&@5AY2j*m6; 暚C{_SRb_x!I,0G7VJLT4 n ICyڏभrvpf5Tw(jϝ5ӖoH1G [ldsQiZzh6ɦ7Z:Sl'iAD +oT VWG'%E).|D]׾;TAr?n$\$R7F}i6nlĂhv!t4'Njj|~'^J#lRt6=ol>yۚ11BUPWl6UrʹñS7|Է6}ߏ|.igՍS<^[RT-# @̙O$N8s8PlNB4E~yR>? &A&-=>m25Ϗ n{!--f_Mtnn/ I3dP75ElBpn1stwY(8vl7oorva1sv]s31,{8iu(U<7Z8ƌ!B:VO3 c889VVcflF'B!Qc(I I! Ue.9O^=nAA./xK6XUϗ0?>p֟"di[J鼇E6_.+ Em̬|p}AY/Z?|򤥱CB4-MIA|as_Hƙ^f9|;kXxoaSc#N6s{--75 {ĔLR*_W SY-8c_ٟ1u1TI 8܋ OQ\lf|ؤ՘[_z BHjШ]Bm ͜Q5U ҋg_H^2 \Q3uoyo`mj:6Vq߃K]Co0"|}[ZXu6uWիmY6ufye21rvaq֣hK ]ϼk{"X앁k 2^{-3̛f;Ec`gfp?l8Vog<]Rc8 B 2Bh3za8B=!JzMSA3$4Sg$m[pAHҽ &ki } y_/Sk{P=/ ERgqM}H^?ڵJ2ki¥{w Qq(ۿ @Z,7 a3 kcOmpQfVkfQK q#?a47Ck+;$I ~䯻~['ؓ35ӖfYЦVև gJbjô +K@];sP{,CQ/Ў[^IWTG\uvn/ gi9fingpɰiswAs" E՝?-5Ov*4`?#$ǜ7;괽7@=Kݖt ]K(e }=|nDizq|_13goy;X#6vg?Ob°wI0wG(ܾJpYgC y+/_k=McǍ9  po jkaSX@ї9wۦld8,I8roܼ~5:~xͦF`/s}{ب.U;~@ٕK x I ldD<kwƍΒ:Vp`MSNOY(vP5%9S%\{(K4w`4iV{0 ,^1 /4ՙ9>vX0v?',kSSǣ{? d@ۨNC2{7u*,8&t?3\]Y0}ma{h@"g^=khްxǹ)iQp Uc wֺLie>}֝ٹC:L`a`؉(yZ f?\u?pWV}=ZcX0UaxKK-j#zٺ)03X=iAS-KQ տ#Kw`PYc+ї۹e/ه }WIrvM68lŃ>k!thί^v51 IrLBm3pۯ?mPA êoH HN{}I ۿ1@2 @&;g*5蓿]/$ue=JVODoƦ`sz ڿפY`%t-i](ڵCȬ NT&y0w~LQXsߩ`Ubm_,n㗍mf38_E3qâ2zH]ԁ/ݜ!d5U7?υxl `MrF^+ s%6Y0 `UӠ} s!`پ纚*B 8@10 aaؿ1=_{sFH,80P. tר+GB= ;tI1, ]Kzyr{ 4SssXH_gy d1q>vSFcX'}hX8̚P[yú{v7|3/<>(pf9|;cXIqGd˟yndjϧ̘u% 4;~_x 8EHIM"HiYm 8ε^a7۽}Ԣ{LNIE!8!@|Rf`IrTscEMc8%z&mpzAе4a3(RD"11hAfu:T{G?B?)k4nd7!~Z=ӆ,oq qKc،wfflUV? }=؍Fp:Y7##b !Bf!c*GɺRqlkv?wH^9`ĮN0 9A BH,X;Fx`N<ppFa`$؜C 3Bp@$t-恷tç -'7\꫏ Z-DG111ب(wHqqrAa3xT Y5cAŸZ6sCKoڏ?|w~Q,@,oaʟolzFkoUϞ|[Ky|){`8ٽl܃D*a D!(Ā*bYZsI˟zm)D8`!$=ɟj?#td4=osvlTh. 9. tI;ӟlVǂ)ᖵCKhi#!4F@FҨ}|1g?4i+gUذ#f͙wBt3ymުZ3 !Cv0 CaIfh0#8|;_ˮ\>z S{.7;snu(?aSc8Y}DZ٬?[}dɬ%rlJO 1z|v/e :hZ z][[Uf6f9uj]!R5]!EE'Db&EQ^ڒi8>bt~T4c 5:|D_9n&*wΩ |Q"hfM]{~3g fq.GJw?QrtfP}=Bf/͐| YNya_zK]Q.!8`]Uby(&?_gD^VӁVD4BdilęnU :L6cq H-C5Sf-lj<>狄B/ "  5=mnZa؈3fּnmr tDLm½/]n@0r:Nw0lVp#h<Ӄŏ=O>:6/LfyFǡ; -FQ, puv=&9()pq| )!DjؼD2erRh4ˆFv{2$ܢu$)X9$斣JHZ|s%Б{ˮ:\!C/j'AT?U U`O Gga ׶O?z- Ǐ2i/s5f U<[B8;I6atEkvB]9V}bfg77h+z FYRrÈ*6z*0: 3%)k-qSg,_E#t 6cMe15UAVCd?{kc\3|Vͺlǡ"c-Iag8kV}M M=w"ua5 a1HC\f&{ϖwV_onְphwt,3z1m#ޞwQ@!bmhkmQ5yj# IDATL?"NWv ES l]WyA&y_?ի-f4ecO>axVMWob"!juA5dԷzsq ow:|;{Yk>c87o (+?^fٟs {CzF~8}fm? tqoܗ_$D_tl n5 ~q@ G gYyaw% [. uV,iG];fy! ClIu*=X>-Z8*Jվ4Pg=tġti,m=4Ewvө/֚j|={37J+;!æΜZ_ Y|ڇ}33mMPLvb B]X# %-[=;W7iZg#3p v3JtæY.ܫ+a0ڰ.ɺanܗCSJ]/Y֝۶0bdVd%/e1 CѐҪ: O;^SGX|M.;Nn!&ǷW43 #i,hX|?iڼE-^= 7#de/*$Ϟ BW3Ίnc'4)}Rk>c# 8} S B_5]Y :' F)Rr_+mVZk&}ޛ06km=? kȈ!}RkV$vp|z&ag8?lOKyMv"'Of)5d2Gq ŦAiэϏ;'vmI #XwO?UEINvhjh 6lh{fyOFfٽ ,CsX fkRP*{H$RUQ}5#a#ưBHv+)B""ֱNNHYܤj 0ehzߎ[}U3cFSեm#grN_[[u3w7 yք[NUu!0eXKS`𞆭 D `l6FcibB$ZTYҬIJIw|jVEqqnv^h|ذ,[^1$))m3Y `I^#/)b$KJn"#qb40@E'⟵u<( Hv#a8p!h;IHFR6;զ74:8ւ QW}ӇC6`0:"ڮH6 - Q%ᖭKZsuaTT!G~ iU r[ 1)Y@xd+QߩFV\5>x`XڢEx7_]ܴMϓHf'ǶφwchIYC7Yv" c<1̆YX:v.[a?HG(g [UAvܒ#iat&+wl0 mYlV+Ea` i $E)h2k[ZT-Zv?,#=&OI A',aK)9 *ӹⰐpki:5p&7U/4DBlJ4ꦰ._&3VVV#@@D)j]6>1 XU34]U~ЦI#fHYzzo{d4_9}06gU l3Ղ6qRrŪ Ű2:5vX"lmt a?H;Qf3[kjdq)Y'ʥRҤ2Aдf5 Fd2LFZ[5ꖖ^@fjdM6x֬󏨺Db,CppPX C¯K­[ֵi!Cjϝ>g ºjP.gV[sU%F#cn^h¾76FcBQoT[Lkfcgf=?zȐ{Sic^?x(nf9̇0=ss]EwKOͦN2dS.Ivn#v"Bvcg|IO>靡'uk%bUe¡u@X%a}Iuis3:W ,P8`YCrAzMeG4E6V6Y=[Vh3Llο=l%)@(>~@aa;Tw\W, Ka? y8A*-u3Z\@/=iڢ|,ױs'nW75NhD'%rh7\G;C_ytVI#1cn=`?E?,#C_V |d6j+)8A[555fx1+gl@s]uq@ cbRýr|p@^^c2mó{ x *Rwlװt?LRu}ۀԔ*B[-dZk4M K`~{=$ܮZkjϐfZi[ss֭׼;d1Qr,J.D]5CS6dl3Zt]C…Ou;wmm/SI}X Yw6s/;M{f/&B_ HnΔDܠAS{NЧ6{H]w>dcDw\whj`ٴ{ CS5<>80 P̭vI HnA_ϵ0v{V:ʼnIEEDZkk|ϩ/,s=E{GZ,~L&6Lm̭^P\Ȟ>}pJHYS6 +s~[ !jM(jas M0t7{YȬ,nDWC*g ~ITT)%%>g9Ӈ{"iذ onpc 5 ]HmpJ#S)Mӷ0lHQ䧟&3AD ); SȎ92i,,`xDjP.65?'xrt။;!EEF'Q8"J4q"Zt%7?K?pSOgz=$ܮҔCdqGsy+eZ)>7&'GXT*bgEzסѹaZ-VdjxQ:;xQûuGSkM<$g ,5iZkϝ>uJS^Z NYYiGpJ]ں;/4yĈ JrM&3;P1pb^?.@4VV**MM~: Jedf,=)z?TWCپ^CQQ{h7v{sEEseɨVیFfl6HD2,!!211.##.33Y{H] G]3iv2˦`8xˆB9xɓE2-@[,2sCe00v;bu  Ҥ!Cx ˍ(kSU&u:RgVHӐ$qD)'$~uKKwPیFHQ|H&K[ "X,ܰ C{8<+8pCy8p{8pރ߽ͫ*W\u`A(X_1DwMj~ _w^^"Akz={y?}ԩ>$oڴP+ $7aW %22;{o~3zΜi5WN~۞ effZRD:1 6nWiÆÇN ۶u|qPqgr~F3rl{zٳYpԈa;wb5w.dF 6pݮ߳G.6xDT %E"q;Qg k4//!$|T*W*ssf4m=q9yOӑ g,X`hZ[__qtuWWBݯ\Wj9kmWOT||\J:Z79X׿JC"KDQL[Y[K56FLJDD(gt:DӘFZu,p;;imqq 8IIޗ1 J'EpiZ,VKkN'%'GxQs!? !ꪪ7ؼ9mذpރ'pz}YYrnǧ~!4v~9+O{|kYIɷ/td<D =qFYj]ʼd = 8KCx6F#Б9t S((jCs3O` Zuf?Xb!/8Raϭ'zhZSIJ|= SB<(@SS㏯83ϼfπ '7oNv`!-?zŊ~GwMyϻ|V_'swO-;vLdW/X͵cΝt_~gzI> !4?Ғ?eɒ3fhWի=զV55#f2iRCY٪_<>55}cv9yye%%_XGˇϘUPPu7=gu;T_>D'MtiƨQז/>F]). /@,(!@ G͙1_{K{o[o>veţ^dzϖF Vxn%<5>S(xqqfc4a|>brZ 9W=^QSsw?u =DæMo}ƺœؼpwT?p^0WrYIɡի <Z^YII ^Y}{!={ݦ*N|yOΝy?d*Μ)zO>OnٲeWX»}V˖UU?O=' Ս[|v~s?< ;Vrr(r;%arnnrnǨՎ;Ӫ f,[zx}/[Ǐ73bc[c2 nd2.11@kǓ1>B<kH@ ov@ yy #^||ZF8NJP6.i=pf[9dE:ڠF*>o僗h}]w]ط-.^;vL3tTmn~y?8A,|ǏزntSukW8 !\јX&:]>xCرU/n 3v- $.S(ZF?b(?dAcƌoFy놆g;hMq0,:>.,ERNf[6:˗_XڼxQB1Lv\YO5 ׯ{(ih]j9sZ,v#GSZ-?)1&4X @`XC&=w: l!Y]~A2jTvl^!5AC;6C\1ߍᣛ&:]>x/OnٲB'n0l\xI&Pm&Sx]7// w@v8"NZvo8s$n x1҉:^d]WE<}0%?6 'fD"xm?J/Wخ_`#c챗 \9pL0(bcF%`E"O|U=<DtKŋD *+&IN`׻1|tDر 3;v{w1M]qOJNE3m"ɐe/.dQQ‹ 1.'&겢cdl-B mw-~r==iy&&TTh7n\fBQy䖒ގH(MsR0޸ˑJLM^Á1#~wйd*<33ż8*iyf&3?Q.r!Xr&ҫ ,j%M6ȫ|5fLµ9bHn^w,J]^k4{>|ZW'D'EݚL<כIBȦĥR#i SuuIظjMI-)VSm2. ǯ8ɓ/mX.՚aBȞÇIzEv}vHoGE={ton 6l\nŋJkj~{ ;CMMϝkml4VWL,̼|920D^w31a(+h![˫~u|CCɾ}D&{ݝn`JSo6zn2L}SJo!hB;RŅ1=`~yV\SGUXh!iF#-j[NT!3hӢVˋe?]DJzl=yR_\wƢQ^UcG*0>޾ۖKk+~۶/ι\ivAMjo)_:`qά\n'sIL)z}?^wZ4o[**Rpu2\W)MjEvv땩Tu0!Ä*R_O4,C>e4NH$\L_a.z,%+/СҚO*+T0|RSG05r%] BٳȈ-bT"x3;kZO.Ѿ+.25XҕM֘hHc{sih~pp8` ߱IQEhxMQEKM#= ,(Fz{`u`0jo 4uww޽;_̾ƳYKIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/images/vu.png000066400000000000000000000207371475757676000224500ustar00rootroot00000000000000PNG  IHDR0 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 4RbKGD pHYs  tIMEOs5IDATxhUesι$&i?0j8c&?*!ILC n!LBɐjHFf%$?fH1mұ 9Olm6y={iOYI*c]UZZD"h4*@J$$MIG~~JKKYb%%%]6BCbY*LGl\=ҔoɗsL>zQ|3]S:ugg5d/e }FJTHт}3mlx 7;ߺKR΄[!mx\vKhTirF1@pu~U^c"-s{'2S&Ev.wEfE9%p1eVm35-j,nR+pl2XJv{RsV*nL,8YDfm;_U&7tDZ$*V^yTfL>]V m'T_̒-r,$*ʼ_ș*{, :*S~Jg}87_얭<ೝrrW/#[l"Ԭ"r\7t*ȟ~n<[e:g;F 2//dSA9^L$|=~CT%*G F{E"XV_jmޜ6[#ʖ/Y7&V#2~m0Iy}jkCBph)(|GɟMן)x-?=28&]jt=1Rx޴&I5o:ྡf7l}k{:M759P͉4{i8^)+LG=v'8:}jQ|'}rk8 RV;*F^}+RA"QrH{}/U 8_F\46*rB;z Gsn+Ul  GyErrl٨i} QTnr&I2o()y{?3e, k[0$qұm\&E d ɶ,ZqioSPM@Na%ΓalqٙTW@&(\8Ìh$?z6wA. "}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>؈ϩ%bKGD pHYs.#.#x?vtIMEPltEXtCommentCreated with GIMPWyIDATx{P?\eAPFX45* /+V:FMIUL@C;j tJh7Fki P.˾p9Ϟ<=Zm+HXXXj prѫ@VVְ%VWWC3>^hv@~jk2}KB<45Ecjj4luVVŬYNB#Y۷oK%Y fgq|պ~Nөl=#7-L$Z_f8B<!@g`ҥܻsi6l0rv#V qQo<= O?%88^MMMjLMM $(('O_gBCCqww'66V*wϞ= ~\Rė_~Ikk+l۶ #;CIGG666p)A&n:HOO';;&NHTT Bzٿ?jFܹsFx&M7| oNVwa?~&n݊ TZ-h4WWWիE^^ .R$##KfgΜH*k@LL sATc6GDQQMMMhZp%~_y̏ ;wՅ%VL[1m ٖ@G xBa_< ܒahhx{{sY)o* JŅ hkkӓ(FfUU\v ~_3|AAA3 c.W_1qD@%%%c222Xf ===/ϕ+WYVXXȁd !((V믿gC/FFF_HHxxUtoq1t<;v`…\z;wЀ^6Tkkko;R;;;xr9|󍔶tL[L6`III+hmm-vvv0h4jkkuFٗUNGu˗sM.]WЌ {ZZZO;|twwS\\L^^C @Sc`3f +V̜988@hh(]]]nݽ"/X͛7K/Dhh4űo>VX oQ/HII!11M6JRR%N?zT?J"11QPikk:"0'ζB<!@G #y F{$?2l۶^ϝ;JB y$ӈϟw}=22k1>^`tjj*ԫl!~055G4i:޵:88pq… ( j444h(..F^ɓ133999+IKK#+++WKGG7Çy&yyyz`e 0u9sFj/^k,NNNSVVFAA/vvvTTTPPP砯#''"pqqCCCJ%&&&TVVJEXՇ~y~ƏϹs:u*W^w`T///j5UUU( ƎZBW[>#ggg؈! 477KEXՇ>;; f͚K`TB!<,, KKKrss)))AR z VVVsiɀJRRRHNN駟`ժU233KJ777cffPyx"'Nsʂ#* ._LGGxxxOKK`lٲ_ghkkc̘18;;H"777)juu5ϟheG.sq Ν>w#gIuqq OOONUGGG,ˑ彶帹(bdd$ dee/~ԈrO†*V0lq%B<!P0-T.l={6~~j``o56m@Tr ѫÄ>a@m <0†*?z =?ϟԤ`d#l@+tx* IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/index.html000066400000000000000000000066531475757676000220410ustar00rootroot00000000000000 Yoshimi User Manual This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

    The Yoshimi User Guide V2.3.3.3

    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.3.3/doc/yoshimi_user_guide/install/000077500000000000000000000000001475757676000215005ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/install/install.html000066400000000000000000000035541475757676000240430ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/introduction/000077500000000000000000000000001475757676000225535ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/introduction/introduction.html000066400000000000000000000057561475757676000261770ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/lfo/000077500000000000000000000000001475757676000206125ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/lfo/images/000077500000000000000000000000001475757676000220575ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/lfo/images/lfo.png000066400000000000000000000643031475757676000233530ustar00rootroot00000000000000PNG  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 GIMPW IDATx]w\ a# A{hZuTU[Zvu"uUEq콳K%Khxyܛ<}Enݺeaaˋڵ,X`[GJJ3/f^^a )ڵkǥ'‚ ,SxyyUZRbL.g ,XxO!(/W|ggg`jfxa )xYX^}XƟ9v[5yrRkQ}\ƾ Vh40gϾ/TZ^J֏?ֽzM\o= ='N 9RۗI-[͚L_Dol7#"VV-BC͝dfdTKۻ`wݾ֍>r8 7j:v츕+c%- 8#x$IW?^&ׯ Is'/%E&,,}}:zY _EGk=oJ[;8^OZnw?Ԕ`UL4*j}gxߔMX̳4x|)c֕9;_d+ťΝ;_5B"S%'SoE%%1.{wޞ= E;wbz$iO=}ڻr&ի|SOHǏS?ݻ>n׎g4fͺ .+K{ğa`4FQQ$J0E T(DFvxBzH{VV(J}a  qi 4"M\]s^K~iλ۴p8)qq2j у403TS7ƦwaZͿ2_X\yrm]^޾ {,Xr8~[*wv é̗/vΝ+neo5ݟUi,X3ױCXRiԧ43eʰEe,*}qAflަo_AQQ D"Uŋ}/>LPXEϢڇ+;g݌)[TNR#GpRBBfic2~d`zƟlԒ%='N#ML )+m65ɉViR7‚Ui,RZ-5+lw[[7ABgtҦo_qtn6} IRX\\QY5&ĉv&EG@+ї!}L 4bn%99sGll>/iFP>3 "#ksyi V`\DOzu`Dۧs⠹s+C'[[1=$ۛsQ)1A\|}v??AtA4AxkGKOxDͪ4FgϨ"&Co?ر>h(HM%peSlT2BiVZUӠaD9U$IyѲ%ZEm(lhӻ '&DQ5Nqa)~ Nttw ܞܞ?Ӟ{sORp󳲳ĸW844:KE´˗]iS QWG~5Ą٨İuK?[Eh`Uj|WKJ;=5ϻteM++׬i=UQF͂<}GyynL.L.r=*UjqP\o,GOJՄR&SHz/mNA^Z*|⸫WIy]n3鍵(ʌswQ]tBEZgR\*(En_6gbϞ/왿os=jak[=Ֆݺ8~r=#0P*}[gQQrnuKcQPaXBd͕+^d̀Lۓ1˖F~=E&Mr1;m56kF/(e,@ն-SyA6aX^PPYt租>p4Wazp<ߌ] ½{>:,-ťYY^q횴I&|m LٲeǤI Xqe" PKݵ "ã2O|nO_ۙ.Bw,Ǯ[{jU9VVӶnͲ.#G"ho?JTQt_ҝ /'I2ܼei?Iyyړ'aø['?lDNL}h޽N|q jӆnU*PH3E{L0Fj\{'ݕG)}F9R|汤!HL;`mx-lm==$;[ j&=aIgOu3륱{0c 0ا11iȐ:'gn>kWKss-v4geՇW6u@NR\"1 4 1}p[=eJ@h ^1g|I⸓w?9if[/;sх /nMI &m~O* ,j'k$kxL9h˟?cze⢅/YӡÈ:C&ǟ{ *_,,wJ˗AAge^ * ! 7՘pAM3XSǒ+:i&Mު윝gap:d+W]EUi,X`nb\ ~C} 9d~'~={ɉzҸV>۷0e`;g׮ '>:*P k#Z;|{MMK8A$UDNG?2G/]Z^Jʋ7fΚU~:1oߑSH$}N>Jc ~em6s5.W֥_@QD OMmS<|?xyZ+΂b2E'5_6 3߿:I”3eg (8N [vfacԣGұ^ ,XPy4ќ. 2묮 T-Kâ^ R酝;}T VgX`)wLXr,ZJp{OS_"ge)RA-ZgU ,s`[odN qkȷsq(~R|2yt%U^ݶ{A?X`ERtn/Ocٳu޹:ZvZYlz ,X2el!X`⽄iɧkp+>V` #_+{Ui,X`)ڃKc Jc ,XƂ ,X9a.m9uv) c@3u[Ţj n:lgkۈ",w,w, 6oi*PV^^*)/HLJJ+,,dr\&|6mM%XO4Zd`W^ٝU```hhhNLMMJ|ܱ9w$A2,oFK.EGGd2VЬ84HP^2t2l0wwFoqgb~cw'Uw:v 7:}{-Zl`incQvYJEFjj3gbccIRM]@`Gp*&IK' xT3 :u;vwǪ5;Kk6Z@ˎ&:gvx3;tHMݻHM"Ň(!;\:O~r*%KKˆkw(@'s8Um5T1rgdc'0W*ܿ3`͵k6JcTFtt}D") gͯ5CPI#;aREFFFGGϚ5+$$59$$Iw( j쌖;+WT׹sBC݋tzo莸=q0-<𣏆/\h٤ Ts`e66 N>de:ziP*~r _mfUC09Rm ZTz7ޅM2ĤL~5N`f|AF2KA&}'u쾟0!') :$2ҥ͚~c* DKP(ܲe˛7ol۟0%"8;< \ZE B`Dw~8?|rkk0 p׀h,`/g9WëXe'&$%YXPZu^66E۷LDٳ_߼5u* Ȳ3g 79yɏ#"Ϝ<=^mP-X3{,A{Ĝ_mJE>xW_d֭'mHHZ°|k$19&fedҥ5;ɓRjmܸ1//m7Xw]u)SZuquAQ @g+. %u h~ii pSkyfիVrtt[hjɩk]AAu֠ ~S}K{ϝx118hН?_Qyv [&RR9r^{׮Kcb* O3?sfիiiׯVgd^K^>۹Sɔ>jm[<[l.ѣW^rGDJJ<i}~;}VSXf@j|w%%%#f7;{'P:fmi/_8{'WLGWXzs3֯__wUuq5m: N'5?5o^-XcLY j9ORVO^V\RRaÆ7Z[[sr-Xum&Ssp$Exoo~ݼ)==۵ IJzrzȑ:Em6Ց`we v{77&P^= ~eu2\\QN\駋,ZԁT ";,j))9dIj|<[[;y{sMMϢEE]ׅXKkWL&3T&'+ʭ[Lf ClmexӖ3frkZkbOFߎDV3??֭k׮]%YtY]r'6w#g3:F}L,Q7QTR4MNz^N TZ.("qc,2Ӧdg;yy\Eh(*ɹsؿ'OJI5Fv:L٧a`:r)l_Wt m./BT ' Qᠨ)ׄ˥$3f 8x*MjJNN>tg}Vɨ]%@:g'?c`ܕ~ĥҊ=yRA κ,/e3 3ꞔoJyuzڨNpj˖l8sG-^i`󺋦JWDDD +Ey9_^ @,JdR V'%)Es9ʒ"ɀ㧷lZ_eEDDn:88fQJpע>KaX͎]Cr سYT=-XPW0Iv |;ujxԲ[˗];}z>;]wjω/ڨ(x \hM֖D'>x (*2BG֛.#_~ܔEZ^[S}>}j&xIH}7jsB$۷ ȥy/56۰IOj`JUNaYbz~nQD IEAP"( "XQWT$A._>ݻ6+jU@3`arX>y|$G/@J2:1/ 9~󭬒93;!30pT3g=zQcԿoڏ7͆W1W|mA\$ ,` $@P"J6|[K0=f0l 'N9s} }K'_5(]{nGُ7Ǝw.%&$;۔oӧSZtfak+,.Nߠ=Dr(yM!dSɛ6QKg#"LLM}qJR|׮=?]\\Ai^^QF=ϳt?-{۶ϻv7bc +lժ:1ҥr-BQ~;7evKw&s?$pʕׯ_۳g]ϡCJ5kn^ZZZZTT@ׁSs w?1 1+0՛21 |9EZdE"ٓL7nYh3Ca'N'~~WDBӇ _D]9ώ] {xӧb>a@xx| 1~;zRqi7{Z_~%L.>vlҥϢRRx}L:Qʮ]<ԣGin7c/x1jqYX5iRصÃg޲eϡCz͝믉(rܡ_~ )uZ=\kV e111`b G&Z;u%G[X"Sd$NYT IM]y9٩)޾-:$bo3$I$$RfL$> !!!| TwҥX ;38쀔yޕ?ݑf}g-(ƮnAOl|HlG,2rҥ5^j=d ֯s~租ʕqW ;7l,KQ*[7XA,j^jdI.Jbe<$X!S W7#ϔR9[BĥM]ePEwnz] sPPp )sdI}QN̨rWVVVuȝ44wæjlܑ̤$eqqXhXفf[!(,C+ͭj Emz,-@T}(ŋI LZ l̬h-!D)/xBW)O qT7 T;HXT8AADS'癳$$K.crguȝԴ7w.|ȝ;^Ԍ;%iffF7v,X4l/՛$5Hî&P(ՖW`_?i?H2+  b%E"/+.RW1@_he@ڙ r'yy$jZ*nC5s1zfiP>u281TC;,Aݻ#Rvl@LF-+pӐJUj?Sm뽫P`SVx0 ^E$#5[|˳YsT+; APQA i%2,sZ*cba:!YAavӵCwkrr/߈io%"iA񠩗UԦMr`W"QzK]5Pi\ TzWiԀ=x~vp1|ML*H.y4ƯZd3jb8d8vPa0p檿p:U@r3Ì\5wv¨wpkG7v5uҭ4qW}5VnFWlꚟsʔI*9}iӤB!t4޾(3?򒓯}L)/[AUk]I Բڵ2Hy>f"!\T& 5"F0Ru@pBmq< I@%H@ PSR8NǏH/=];SkBEP@@@4w]kǮ^?ء"}cWMsJׯ_z[^^.ںzyyPg5ؖFK^5/^~:77@Pd2>offD66 _8ٳ=[[;xzrMLT2GOO ;;0m۶g7nxJX\H Kr#5݇8viiibC"D"HrrrWkUxTz;w\+)d2YyyyRR?=zӧO^޹ڵSRjҤm߾oӷ/Gc&6a7ÓıZfdd9rɓ'?Q,GFF޸q]v'Nl֬Ym)nUx\~k׮iMLU -;7-----ɓ5jkwCUϞz|ǯ^]36ܸ11*z 7A\z"  ZDmus@ʾX:U@ЮuV0Ru I.GU~!kǝ6UlL>T*9x ~$I?{l'NCɫ&>?(Cį ǃNW"ٳgoݺgո w5aڿkrMԻ7҆bA. j՚)S(ah#<  oRnEi߿E 3Ch/H]D@PR#8l_wP'HE4~sǬ(&%w: :vn^^ގ;222jq/_ꫯ\\\d:c&8<<@KY]I>: qeE ,eee۷oׯO+]=俥*:2KbJAT[]H/ȃV0 ;w:i|TvH@@"DA *Dnn)/d,b wP{1eDmC#p̈q<=w+L=X}cWQ榤lٲ-ZťוDhW^|roVgUxDuD@Q-SK)8 ypZ;27J%E)ɯ+GoܸtR SH 'MEM+-8R+h yPm5\3qgy<h4WCD9 {ʂee%z27ekS;sF}sG0 bq\Etdnrr  ܲe'N0pPf^膴ȈkGX!AT([n~~~٬hɫRڵk322 }.в}[M} m)nތ:u*nvu֙WRE}fnCGKP̨c;hma-bEfz?K֢eB1{c^@kx:.QϜ8y K ϝ csEܡ:G@ǎ0nZ_7wᇢn칕) |ܨ[ͽcܺu+*#':cuV>%By1|5>bu%:[،9ܾ7 l`۷oW*l4cQi~~R011%y0R _!ǦNNc'|(N[pO/KabbRcQYp(z ^>ӊFΔҤڏi#sQ*P>vF:!ˊDyEyEe"XIRZ8h#F ܹf&$$=tZ@^L K~(a?dA29&˄D.cIE~ލ^xq`k{I@&ztBL BYā\Jr3gQ;RIeN*ӜNK՚jK\&p:5.уC(n˘mj *٣cԪ3'kӮ}#s-=Z1bيU ~+K" Ej:Lf&IwԼ1/vѩSV?gUH@QXw| |9W<= $ T $sqҜgenFIdAZL<1##y6mڄ4Vd20f}q$1-8  a:z4vZAīʵ_h2W=NfS8=c!Jj,8U@͸ [ݼy#sW3B!nrĄWAt4L׮]k\j )TI!I)Ry9ϔڂA5w=]֧OK#'^><_A ,%c]訮R( JRPEsA -%ӌ1LQ"Yr tq8rc2uZxxx۶myY4NQ+)`xiEXPZj=:ӌ͛ 6:dz an(\\XPK`{ SǬ2qE]}gjnpO iBq81t(wjϔ3fj@Lώ1T(ܡc'j~N$lϭd2033UZR5Ӣe^mqFɿ- P*q Cu׫h§j?LT&䨦_M&F JϷ0+V}Xԥ;vT|HTjQIj.ASD H_bPB5h#:@8 '2Rv|~ǎߙ N.L:;w'~ֶNؕAJnA/FWP(C)!HcMurGwz6 +ϟR?2 SoS%L&(zD89Hk5$qqM7ÅKk|fff6]J2N8$I+ב$I0?:LㄊzpL8N7".w>U]T]^C_.i)=..PrWvy 󭕕 'pWpDo6TCE$іo^̿P4HJ3j^ J#'j+,[6i'p'*!i' /Mn2=ރDZcg9;;3>L,\J@eVDbю1V[pt.kJ^A q$l']YIi&դdj("nmȑϨԔXeNvh\FǏW/nݶ@mPXڄ3'MȥAiD,R(P(U L)ǔ2FK 櫠0MJiI1=N$y…3+#O>\>wpj káU;vƝ7훔4qH;mvuXj [XF%5#ɔ*%N9ٹ9U}$jÿi -Rp "k+2]HPU* Dž"an =8ӦM{![ZZ򫱋UiA!8:5\ muM;$ rT0A 8IR*TJ)UrV.BWg@c]2Y`YpW >rxaQLp ;vFުnYԪ5N@8I?J_vlqus_r ]}Nd /-)VbAwnF|SPi_#':V(ƂJ æ5yw}Wr4aW'$3aFdl؇:_Ayyy9r9NsMN g_ʽ px3)Iwp$u!U$b!Ip8\ʛ'qSbɠPZR?y]yaaaT@;+UgaX#_aZv쌍KKKfgO?!ID %WRo 7NEŮ '$bL*!RR޼_54rFV^łX^<$I6&sk*7)J8!+$b1IA޻_-((ΥL$Zޣ[嗖]^ӺuϟBsP*ػ٭0**m:@}q0B! %8nPd+ .\pjcsW >g`zv쌍;RE RSSƲR/oO/o:x@Ub .ٜ6Ó[؀$=Y(+ r}nEEDlիSNU;FN[ElllyY)zA5:[>mll 5񔟩Vbzp 1 rѲ2N=ۼy#FԆ~ IRPX@ptcP:yiȭ[9;;۽KkrP(\j^Qpqs6{q8\ >*U*ULWWj9SqFkk:YX;䴴e˖i+899y'I Qp9&\9rL(*$LDdeHR$eɚe ٶm[fJW5pW 8 #|?jUpLr8\.9pP.NRPJ+,,*+- fa'qSN2dHK߸a0=ƜԩÇ^6( boG]/++y I2;3=*ґ{bܕEUcoo~z*N ;;cΪ.%%%qA~^׏zI*\BP.sRtLJKeYYJl9iǎ)V:nnn7nPAw{5lF$I@TaOz2*\P0\,-++*̧>w żyLLL`"#2)f5Y k JL8pV3x#aqqZyyg6NJ!X|HfTEO0¢!,w,wBrr ԻŵwA:;6u6- ?{3<obef3yo%ð͛7z 3?عI\=IJN2YnNSG_<{\.ZZbmH}VEcqV֦#Zv6kn$7 .,)Yɳ:PaaS?/ٷpac?^R]&|AAwu3k "k H"VG޺K[zQ-n(S [Dق&` ,BFkI=/oޜ33g̼gTVzu(lWK>޾}ɓw"{朕+1n]Xp  4 BeO/_*ZJ>*H|{\F׮WˆǦp ,]]gfe!no4W___QQHzzzX,TSSA__hڴi$I4eA"|}}իW_x!"* rrrI$J+ސ]tijfWWW!rʨɐ.F1 Fĥ^}^ǔLڰAt6&9?]t:@М81 `̙֥IՉ3vP; *++KJJjkkl6kkkZZZ堋7L&3##o޼^^^ȖD76 tiH2B{Gu|Y`c*F(J.ސbիfEiccckkk[[[$jK//OV ȸă2*xC:6Hb1=0j(++ͭ).w @@@,sOEe%-=Wƙ(]@ 2G1 3#o}An. @ݻa!H N. @(%VfN]R4( HY ғҎ,ZDǡC班UBa $[[kkKQEEdADڵN @64DwBpͽ\ϗEv]ٳ<V-}}$)OnʹyVS:;m`$Hsf܄*%%W6VUTT/s;;4jkh5NR¢ׅͬn m)VC{>vL}3 ,P#P߾on.OgfDv}| (I `E IHAAA```kkJ[[[[[JP(ݞ\ӧcb'-uu}|>ƍ-uuZZfXl]iiE]]ӧnpL--;hq5 plsLbn;0uL?/32rrIdrߦwڵ5p"cF@ٳ)/ꛛ[8:6UWW<}p$#ϟtIO6H=~mE)lmѪjj())/32VGE͙3x Y[KRՠ(CG"xzfeQ=r v+77y3 H-P+-A; raaa p4>!:z;B""Z<-[};20~Stl~l2; ggS2xT4#zې"}fGGј?i8:R0t/ʾqC̥e߸-<Uiî![2">%$++-&&9bNj>ںC? c }؟ٵk۷gJH}gf6M>}޽k,~vaRROgzN7%tqq_Xe0::?%_˅ 0wZɓ;i4JJbmh%X@ۼP/@$~w႙*HJyuJ%Όsb}|^lп șנ[O43+)/hRM04 .ͽs'[!"U=`]E `x޽{)H7RQQA..f9rL&x=='OL8x{{>}d~.A8]A/J#SS3{q}YY`'̜7q\ʨ**P(砠UbA[%08$K`8eڒW޷z/޳Gj ]ZmЪ?kPZQ(ǎeu)Z|<sQˊٵ#;b y-PI VZde#lj"ϝ;7}t1(鞞 NHH,**2/^^x=+++++<0:\A߻߾E>=G1rwt]UB-w{' (-x .WT0 lRΝ{8.z,I/RSo=q ș0tw }믅 oWb11YAed_Zmmͯ_r8w˗' %iJbc1_`0. x/V%lmllD.8q )((H/ yQ(+2aN 1si-k>gdaAH&翭 ~VĪF,-DEX(=}H/+w*t^kww-}} BϜItIl!t60vkPrqnݻre&)0(ݗR[{a˖qpn*U=Jk 4u9""Bt?߿֭oxxxLL p·~\LOOpQ?;uV#G۷ի+W]V圙9WS:6  F6 ~'rEi 7@QZPQQ"~{75&NTFLqph(+h.F~bbna-uuJ=ɤ9_hfQ_}U_V<1QR/zTUEȊ;wN>=222k<:}v:O?I@ gx7|qF>hw"hSS+I"jÛl$'spv$%w+ge!--wN8 ݏ S 90u̿ ;>|Z]HtWJMP>ʪD33kw_m6RT@#KKe ۀLQ VQ!C"""DeǏp;; &|^UH$"- F0<oɒ%6n(|Λ7oFIDATOkL1.Ҳ~xO>UNu%%_^|]X{Vf_ٻ7'!A&B'oNMDZ( B Li~ZSOo#\0|+66f׮'O@ڏ?2!GY_uGj;`zz[cc޽{2GQhK.*((x0rbK}`YKF۫ğ)fQ^wM^fd[Yitv55uuxu##߶]S;ZZgz%# F%q9FGp$V]0ґJ̛S]\*+T a,/ǧJ=i^]0"/M($y4,ohaֲ{z_^-)<-IH:e >WVUu[`cHdՠ(ngjZ_ (O4}WJNwѪ2GQiJeq\~w]]]^x!Od>&HH#@x Pyi:ׯ?}EZZsUU}i ZG=Ƕ+W:}3hc&X@$Nuv4}S`HGXgɹny͙qؓ׮gf\@M2wisV$֖ؔtho+*Ъ -[Hzzׯ?L_ 7oJ."(ͭm|: !>+VܸKeR.\^T!IJKKCBB/_>{l$nf xTUUH}&!&yX ҥK~~~2yP[d(KBd~dlru9#Dᤦ޽[44999Hd[dZ|y`pP^^.܎`;w ~GZZZ ȟZZZ40??'%%D񞞞i۽{7BBB.VV~FEt[oo #}lp/DJJJZtiCCBP( cK@dϻ7oli) A/>|[ZZZ__ՅFuuu/^z pss{˗ݻW\\ޮf```bb]I=sG5ٴH ͛7ol4mڴ~:@4Ϳ[lٲeX/1TSX"[`C  ]@ ХA ]@.d2YڏAjjjQQQ~*///A<ХA @ ag>4`@ dB4@ M |pi8]@,8хG 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

    yoshimi-2.3.3.3/doc/yoshimi_user_guide/main.html000066400000000000000000000322531475757676000216510ustar00rootroot00000000000000 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.

    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.3.3/doc/yoshimi_user_guide/miscellany.html000066400000000000000000000115011475757676000230560ustar00rootroot00000000000000 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

    yoshimi-2.3.3.3/doc/yoshimi_user_guide/mlearn/000077500000000000000000000000001475757676000213105ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/mlearn/images/000077500000000000000000000000001475757676000225555ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/mlearn/images/cantlearn.png000066400000000000000000000132551475757676000252400ustar00rootroot00000000000000PNG  IHDR)iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N^s O$QMM>[DD(H²Ja+ !A"6Q `"{XFDK_򟟾Co "Bȴ ~U_U"J2IbӍ!Ȣz7?β-{NMĠD+.9QJջq<T J49 ׁcZmnfW6aSXe*aAD֖|@BJvgqw{] 铖_^Ywׂ#.[" 8Ěa"ޣWn7*yyvE}ߪoj1 heh(9+3"R exOtZ2̘%Z`g Ӳ(&夓2/035˔q3'=vuϑU5:z' A`:6mzZE _s>|YFDbis7$3j_ ^"|.DفZ"4mii-).) YRپDZ+4pOeo7P(F?xZm~3-{jAϿׂ{ dU!vrc$iҠ["hK9|&.y6DTSEF e]hf mNiem|UF2BU9m;FDiYL8bӿ޺St!䩑N/ *AՍo|ꋏzuQ"rNᒶn͟sjq]C3<7o8mc@731lhs!5\UsȪ/,W * јv\ӳ1!HjEV&~ߥ\+ljn51h3w@Q(Y[U5M-Bdsv*:]x]W+aA/q:D||+97:#7$t_A} A| aW7qD@'7@ ܂ kq{0/>3 A B!@ A B!@ A B!;4Znk׮ 0AQRRn؈ A BoرiksЏtsdС8!J[jH{ュ[Acۯ zy' n%$$WVVZZZJӧtÏ?X",XVX!H,YҧvYQyzzA!QJUUUDD͝;ٙ.^_x{{aF ڙ3g΂.CueÆ mmm۶m333 ><00QZZ޽{#bj ښLpBytt4$m۶988t: R#GTUUO2{18::677={9&&{""elْ"ԷZjҥKܹs%%%B)**j{qÇd2KKK_ˬ'O׻k]Ǝ\nv-2LL]T:ܜJ@%@.ϙ3ɩ%!!a՛6mReʑ#G/_QRRKDDYWW͜nΝ?CxxSAAALLɤI:G.[wikkzT**%%eڴi111EEEjnn^fMhh\.'m߾=1173fL]]]~~>>>>˗/wppHJJڶm*;pٮ׻tuE%{oV(NNNj#H\]]### Uώ;ߟKqƝ?[dɒٳgk? \o߾oooX;k֬m0jԨS ccG5E?Vr駟؋,\000P"xxx̘1Z[[|||% W=wBeT:T*nPTT]__5dR{QR$UWWwo7oޔ|Ӆ!ڌ{>lccsbxĉoIcv|ikk5jFX}g-D%svvv'N4"bccmll N0,vo܆[nUEc0`[ <V<o͚5'N>|(%pǝ[actd„ _L\UUU!!!bX BCc_~T{԰aBCCcccRO?q/:NfB+WTYyʕ..Ah9nw }1Q[o% /^gϞ0e͹{ _}U7 XS^^^WW CBBvuС[n]~=99911zd U+;wϯpBiiFΞ=;>>رceeeyyyʷYfť߼y366TOt=nw }q: :dkkqƄݻwsvss[b!>(66v޽}gΜ&˻LhhH$JJJڴiKHH CG&FFFyyy 6663gΜ:uF %$$|"WgY?ohhpqqOAv[O$}=[0viuuo(dbB--DD}DkvCK#őw<ta: }Pj0ch B/47>7ڵt]F 6`: ?!XZJE'z`QM@2YɓE8`T +1NV>cAVC5טҟc~HAA% b[zt#efHDAAH@Ч3t!@@7huwۻQFnBz=@ A B!/ pA.XXX8q!TXX0<ѣG?}6{D_G]f|tP4JK+W8nq{0/TmWlwngnjk۷uֶ'Ҳ~}eYQxI֢>;fTXUU}}5ٿha͖9˲eeOgg alltbvSS3m~`n֢ ++Q +2R$#OyyeZZM+A-+WTWID>IeW)+;sh,TJLIDFc 'D`gaa,[^lPPXxٍ?݅ #wqq)*Aq%8d`T*\ɟ1cx+V~qLvr˹J؈kff&"eƌJz4I"vhǎokjJemmɓg._h,sQss˥K9D$:QK\d/\&%K7n $ "UNJ?u*,KDhm'NJKKr65f@D55u~mo/fb"J%OMܳ'9+벩LVU^^2 $" 5kJ퍌 Lɭ _zUU( =<cZ[۲ bٳ?9튊nƣF=# ~w; ^Uv4Sߜax8V)i,/\ߗ=*~90\eEK+{؂`kc1 ՜fH+Bc-2yXx乙.N%kwKkL Mt':XT\eRNB#D!dpB?r`ib)3GS]Z=g!*k D<^̌u~;9BJL >r| G޵T~ %P{y!&&|VWK*ih4]`bZnSG8\[C%dP!$XajJxZZA \4U'NC}u!@<^[Q(lzC~W>l$3߯'iMr9-R 1 ~(NUYp*T׵OԔ ByQyͳꆒBg]&I6@CѿLiT*I 씂zNJhT[|.r%"񡜐n'я l4T_|RZQ0f$3 qsǏ\\4=mh4!>$$BaWYtU+VLټ~Om;-1_+U%D$j#gRBщMƤR)K?tm|tRc3cQP?)!B'gSUR{ }_Oȗy|N?ɐ?P>Q׫ݯz\T^Wa(Z ՛H .ADBq6ZnV:d$F!"O}Ǣ?O,H(|R x=Z+C{χ-wO~oY~_~I%e(A+_e˹"Ы,tv@)ӧԼ#7?ԷnWhѢ͛7 EEI WԴ]zYYfMAAAXXظqRSZZ*-Zzj-\\\sNhƍ<̙3Ǐ嵴XZZ[NO"ֳ ʮ ȯ!NUxVVVEEEQQQJJJ=RZPaa!066xe7n,..vttܹsBw;f֖<RQQadddmm]WW|7_'jjj"""rrr|5kLLLBvkhhPUU9r Py riwڵ &lذwt|ܹs2;::jkk̙3' @[%,X^UUdɒ";;;9KuZzE ¿_SSӦMvڥ ^M6Έԃ\nEEBdd$NVEEg=w\l Ə?xN:++ܹs &M PTT`hhhrr?Nv݉k׮裏k+W쪂gϞp8~R7nLJJ=zGfffpppKK B|ܸqK.LKK 666dHttFOJJ*Gh<o۶m"ʕ+,H$*,l㏪>}:vtuu7o_""" njk.ѵ-_? |ASꪪmmm۷o?~BBP*^ddN=ygΜG Œ *:ydwMF9d2|eddX,sssljX,VFFFrrѣG={ fO*00pܸqŋEEEӧOd,N6oޜ%{ٳg9xs?K{֭z//7x<ܹs}/^,;#%%c?|p˖-'NJo߾YYYA*G6l0nܸx___ :88>yb566:88% N:~|CUUU? dXA;v͛ dx}}=١NIOHFë)L&ςdJ___CCcȑ 5J昘.,,l̘1ݽ<44 e˖UWWgffK !x̙ҜӧOם^4tP4)gTTTBB)ӦM{K!m|ewZ~&:::7nܸtܴirppp{,9{U4}}}(' TjYYO<[R]un㓛{ՐݻwwtQ[[[]]d|yAjj ,,,,,,/^  BDMMM:::Y陎F BhƌNJLLP('N|rwQ~NtdbbR^^knn^[[qF5 rΝ72pppѩY~rtgϞٳMMMݿѣG4&B ׯ_߶m۞={˗K.=zaAAAuuK')(("a3K߯#Y!##!d$K䔞4iRIk;B^={F%%{N:577G666vww6mZmmmDD ())Y[[(**^nvfff/^xGűX,<&#x*088ݽe˖-?3#ee9spd.~<!a0>>>fffl6;??`ٲe#WhMMM^|9uTɲX"// OO˗2Ar!$5;EKKk?j+Çxٳg+++?[?Z mmmO| |vr8sΎ;TUUɿBsssGkii)S$=xHp@~<;o:A\z5'''33_~O a~sε 6,<qăx<ժUFE&Js\CC͛7逸xWEEʕ+9ӧOmll:+!!!dmm]TTj*\<9k{u`ɁhW~F2 +**x]9xwԩEEE566;vlǎL&S \z!|McccGG`͜T\\z]]ݿL{,ڰ ;RRRB~~~UUUdׂڵkڤ aWn8{ [[[nZTTdiiI G0`ˏtU=z4((h…۷oha;-S:X[[#paÆ!P d2q/XhS.[lϥm6~x 2a„䀀rWZ`?I׻[)N޽{TW` ݋$]ilH$P(!l$/_^VVڊOK?x-x~lllll,lnnNMM4i< )--522ƒg#k4o7A!+ _999=IIIovrr255󳷷gXwuu%#xM6ZbOrr2A***~)NHH ''nb~s$prrppd[@#t=J)))۷͍beeeݻ8AQQq߾}</>>v$&&"wua<"}LdժUyyytޑ=ӕs JII)++vW`"_w`|gK/@WA#`@~ ?@~ ?@~ ?@~ ?@~Чe0UGCCCt@~@B˗/x߻7?Uexx&~!H$w]WMMu zkגoHrugt^~ ?Y=wsè/|~۬YSML |_%:kW7RWdҏ? ;bnttGۋ1ªg\j%K<}ʊ<`0_ ?`[@ 466ǒ}}mcvv68 kג?!d`gmm{sݺF uX4y! 755D"%gd4D`7 ?lm;%?!8d X맯KQJQR)4j;ikkRի7O!‚Iܵ+`GOj8{ _lojz)uu^^Sth4U)^£GERóz ?`[?\:}{xrrzIIyq+Wn'45TUsr#_={\tŒ.\MIɨ+-HL{yM|9!!veeMEųo'~HGGobbcbz55U33/\BQBk,;sϫWo(ϙQRR.Ovy(_x 5Ws%& SS3'|}~1X?_Xt ~@ߓ>8fK/@c6 : ~(ZZZ 'B\nAO%mӃ@w}#E7'To? TfWrڭߕ_#q.n0X s?3=(9D^IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/mlearn/images/mlearn.png000066400000000000000000001054111475757676000245430ustar00rootroot00000000000000PNG  IHDR<<izTXtRaw 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 GIMPW IDATxwxg'KdHBP-AHk$JXKPT1e*EUbTRDUĎ=*$!"$9]׹~zjAAA!f11E   6|?ᓖ&<ڡD+    Tl) AAAJ*H2I"  B0xTʴOJYAARj҆y@l|} :5c֙%m\ B 7xM#޾1w! Ν{qɝ ZBs0~V`( կʻ[SƦ4~ #4K漍Ke$W>r %=;6]#v8[ &.=5]*h*u3жy} 렻OcUt,OuqZ]ǵRä=mxZ*jx7 x[8?l-zҖYeHr-9uqϰa }*4>rm{NpN OPTa]vem5~~US6ضGOGQΆsrd|/=SQdCyIv͎ >S?{6Έ8v Au| ~[>]/ M5'ǔ2051ζ4Ϟ ;>W&p3oq3m}֢-xDH>%I7;2s3SLMLO`ߡ\q/̴A0ҦL<Ȍ_ T7e./<_9!#: /֮G; 草"RT,^$ WqUa'Jw6י5Ǝ_O|^ S_P?_*~; _pe_`jj(,k+ &KaD h׼˃qs5R5SGwC5?JР3']g?MiW쬴H7mxCR,c ;T*ѕTj$%쭙3'pC> DYVυ_Ky J7d˟ǹ0/:Ԅw#wĢT*ܫV.T;k<ժCeK7;2VǙI#;&O@,WyҮEBW!gOnX.|Y^}4ՠrqUA0~xcgjf6Gj5h>nʴh2o4οpMb<•;TR3S*6q+TўUѢqdxӞץ)^~)%8~jS\-J8 {wl#69y`fjjqFpqHwVT\u_`b_.7[Ĺ ۾e}YR7me<4]U\{V/_AaRY ~N_ɳDL[GO_%41TSdZ6}|yfe\ʑrm9r 9U2#Eg.zf]\+6xnvd|E:|Ĺkx{ε o"gJ4V>*Əe)SkVVۍy9{+-r{GurׂUr?&]jX1mNR8UkY꿃 ϓʴ~$ߴOEG[I*4ϒσWLz'<#u6Lt$ ^qFR=ukTdi(3͟JzC'#~ fT*5K~[Dn*^$) !R?}VnK3HK̞gos&jZ<;O5<--̱/SWrr_d3/jT*W"SFgs\I|&̩RўZ(JL'ۏsC\ϫ*ӾyLN/'u7 eNJڕEʍ% R(w4Ղ  }Ç'''<<<رcNNN?ŋs9^{5f̘ARRVجZfÆ $$$s/_NTTxxx0blmm`\|JE֭0aBhPP̚5hWh`{NWׯflBnݨ\25"44#FPbEmP RlȸƐCVm4+?գ e /bϞ=>}=zdA̳8vX2e ӧOL4MFnؼy3|ٳg[V'`aa׽(ɒӿ>ܹs [͙:u*}kf͚5۷O~,--8p`\c~~~TTPJzСC)WQ˝UYm/,XMм7n >>777Ο??kצnݺ>|ݠ~+/2do67tFڵkL<7o֭[5py{G 2LPP̙3G!ꮾ~UWu111 :+++1nݺ兗;v0h\O]mԐ%zLmiԩ+Wdܹ)Sm۲`{xx`aaA||<^^^XXXBbb"|GRF-ӦMCPen޼ /x!-ǚ/=( {MآV yi_QTjՊSreVĉ 'bر9s͛7ɓQ(EF~;;;`T^w}ݻwsĉL4~+/133cڵ U',,/^гgOv튏vATrAٳ'4۷o7ЪU+>c7A ]}jfX[[3c 6(CٳfK[ճ6+9tQ]2(Sho+[[[ڶmKbb":ut MmO<GZcǎ,_˗?h pܹ %Yv&&&( LMM5e}v6oL͚5o4zڭ{r711K뱮pٕ#&&+V0~x6nHTTk֬!::uٳgi_(S sssq_ʪL33rKFhٲ%(JBCC/~43,--ɓ\vMޠB;]]jVa˖-iyFz-VZk y?dF wn(ELT\Y4-ʕTRDEEif 2p<|-[믿βeؿ?*֜:u!%'˼o N8A׮]С^"믿3|`Zi#q^h"|||^:'&&&i"T̙3ϊ+9s&AAAk׮p...4m4 V^\_abbFWr ~^u.]ʶmۨX"ϟŋxzzbjj˖-c֭Htt4o&ƍG@@| ,EޤB;tݜufC5Fɘ 1S*WL3ܜ+++pvvg8883o<\\\Xhs#ceĉ=rʱe~W,--YAEI]дiS<Ȍ3ZjhDq^qaΝ;իуRJѷo_[WY>|^zѿʅ XdQիYz5ws `JZ8;;3w\Tw}Çܹ3Ǐ׸ԩS`/^3ӰaCf̘'Oe}u7]^ C5Fɘ 1W쿽zVAAA(^ܠ5ȉSAAA-b  PlpBXpAA(1zh>l ZAA {  `DGGt3<   [AAA AAA 0tVQ\d,H %]MUvh +W1j2xfmwn(2Dn]3C`^ϮJJ~FP# >- !/B|BI7$$FammmngawKtAA0& ϯiӦ ^^^,Y_aB`077gȑy@Q **J0ҷo_qrrS\>YUw ?[-=xxN[9c;tx}6t(P0ذL۬ML[`i:ӿv< _fҗZ5kҮT)WȤNBQ7x.]DR\rRϞ=}I~~~&quuEPg޻w/_aMTT֭c„ ߿?s뫯d/f`)yE o4LJ`̙:  ^{ZMMg6nLv{ލ2S33ONvM ^3n8/^[Sm6*T@˖-5={K.IzRFbp^xu1c˗e˖ӇUVc/w]U`9K"%3~taL{$J$ƶlɀ_ojܷooǏϐ΄e6jμxP(طa8s'.uPWؽnCգ53ۑ(xeKOĨ/dũSK+t*SF2&&mlhcg .;Ɔ"6&Or%ͪ@x{Lg٫Wݧg$t&Wm~JEMnڄZBVs Vi|V|[ ۶p쯿ѩoLlL 'vd$V`˷RÃ&a[T&#+<̪UhժRх=i- lllݏ?QF;A5j0kf޻u45k4|8Kr$&$h+/BWsq}֫gW_ GD<"Ze_B|w.5(>[L͒UJ%ot;KhY#AG3~Wni),Ug'O~y(>YSwri liKOO4Mҥ~נxn^̮k3&\Fp-[ƃ[2+W2hI+MԬcGLLLc*nGFr $aؕSS*_jLvUr_?GDD?Pb ;v0o<?7o! *|Ν;d<))J%JRn vtd0aBܜ~HLL aaak˖-cǎ uW}A(t>z֥KR0}'L'|2p G38|>|8QgfWټ<7fڵ$&$0ϏU3gT&Je..4￳f>y°O>uP(ؾb{`_ӪgO (G(gj9DFFRlLm4mڔh>wBoժU+3f'h &Nȼyr^|||=vX6mĝ;wڵ+VVVDEE8>+++ϟOxx8j@?W_1l0O?պyoÆ 4i҄:?(rW_j3.dG;GGd= :x0S7:u2 7`Lez?>mp|GwLZK} WʕYeh|nj{Vʅ/B Daoo^G.!CpwwϖӴiS<== E7=_e.( EڛEX/.."~-mdv~%+k B6hiUԩ&؋4nm@$)–1r35>c ˽˟ICUQϏڈ`AP>G6Q^+<"cv΍>Yނ("~ycklqwwOA(w<%d`$2" BA(ȵԂ   #      <   \ZOzF1FKncWצiӦFUC~Aʕ+営x?3 M7!”1'rMނ..vuPR#AEΠȯ.ėZ.tCBBO l~q{I?;:(AchT*ϟ[oEڵ+u .ЦMlllQF#l̘1`iiI/s@Q **J0ҷo_qrrS\ , sssFmYUw<oBZ,{;9o13С/BatiD&ܽ5ioi={v< _k}inZ~+U~l^8K/ Yx+/۬ML[`i:^^ǵmg]]Ή CvFn ]T'Kضmfff΄ xyVrRRݺuݝhVX;éS4~Chh(o槟~>cΝ9Nϯ?~<( ,{e+ >CbݺuL0c.w'''ӧOd/f(yE o/[II9SLabW۷vd$7ooʔ+Giڡ4oGFhX,j&,|=ܺ$; o??j56i۸1-~*24os>w.0>TG!?.9)A <̌ b O_ ÇzjV t1VVVxzzҡCVid-[Zj888PF lmm|r &>>P%445jۆ ֭[nj3(_<-[O>Z*O{ٓ.]`oomYSwrD0B*VLYaaNƆ1͛ɓ3ғ||۲%^~ժpr> ?>C:-ۨQgLܙSl-|}x>;±re^m 2CznxQrekgϦ#s%d>TP(۰gqqٹ:u'׭Kkkq?3 q#o.MU|DruRoܘ,[Q#IIhݷoLvGx+Lٓ==dgY6e mlhzHt*SFRhr]uPR>cGoՊ|9r$*R+-}lX MOPhUS?l𘘘РA߉CB EZ**yMz)SP*UĄ٘3&Zhs+,aÆg 6̙3y(OVѝPHJLNT{֯O6TԔCq#SV,3F+;qkݚ&P^=fճg9}CfΤÐ!їKի3/9k~Μ;t ˖a[lRݛV=zy4WϞ?⣏pRC9}&.Tpvw9u+ ՝ G0g JE?~4__ݸϥǙ٧ybVx(sWϘ[X0חG2ϦE@OYţG5[yvG*oIvXXZϏsے%dh( fFl_ GAW0TT:߸qу߾) ٭&몋٭B 6xٳt(QN\]]={68p۷g8?yd=ڵkܹ3RCw{E>Ύ<_'N(i\9u~|1b 3 ca}-=0cܴCޞ9#GҬcG˗dzW/ͪE_)ۇWKѽ{|%hvQqcCݻڳ~=fԩCf͒߳AS;z']nJEMngKc*SqPϟ>}*s; :q5qԽ;"6&&ӕ{pyC0F9xɝ;10C۷cmgK:٪39`tƑr}u#mF_͸q4j:[m &&& A ?θqx vvvl߾??ӧOjk g¸}6of֬Y;wNsoll, .$22qFV^M6mr^q;]O,݄9#00fp=˖-cGAGCUIII$$$T*Q*$$$2#Oԝ\Z :N=~ dҥTYSo&>8Ps<-+O燏?D; 501aڵ4nۖ,LwFD_u5cgΝ3qq[ڵ FPhK __ڧɯcX8v,5,iodNcjܘ)W,.ᅬ=6mʰJR͍ׯ ?-[7fڵ$&$0ϏU3gTfY~ʕQ&%c` ?})/7lȜ_Y? P="+DFviܮgOզ*VdԩܽvsjꢡC(<՟W!=r! gП={Fǔ={6-Z-:c3z |h,ZZh… [.Ջp>}+.9]BBBԩ.0S;v,6mΝ;-[+++r0a^h|J/oll,Æ c֭1}totЁ&MhΣgڴi|'Z'Nd޼yɚ_ ׶NӦM4p6t߾}[;41J MA k3n]"AӧO]5A6(`<9=[sہH^Q={+,zuvC'Y j# bb`;k bUe̮d}-r/gwzU6b#XA0>y^y=zt/U^_MUvh _A+W[e߃(4Ї SƜȭkpfH36y KAIɏ|xTA9"c>_jP )62>5QX[[Y<]R%]蠤GA :ó`Kvҥ cǎرcuE67779r[bb"cƌFXYYѠA~W-?.\M6PF 8C @TT_alܹ3 B󳷷?66}bmm}]䫠=** +++:t+y J?Px|> ׵lY;wr3ءc糡C-_oÆӈ&M{5kҒ{py LyEl^X.do_P/u۵v-k֤]RtXI:˜^'0Tμ_eUV(hc-_vJ1aCmؠW*ˍK ]ς<ʕ+WVɓIHH(vrr"00>}dp{9 ŨQ$%%ѭ[7݉fŊ;:u* MB ,,,w^bɒ%<{gϞq]~?CbݺuL0i~ {=7nkyB?Y0(yE o/[II9S01wo{s;2?7eʕĉ4M4cb<ٓ:ݸ!C053c0kr> ZΜR8uG=zcJ}ƍ[ݛ3ᅬKY1o7 Uς<ʂ 7oSL?>,ٳ']tt֖EѤI*T#pqqѬn]pK.cee':t`L|||Khh(5j( KKK,--)UT^xu1c˗e˖ӇUVi~  |fW޼O%J+gx^ ٰ0bcbxA|lmhcØI࿙I>>mْ/Lj8o ߎ! ˖m(3&wLSLX@O?%|ǎp/??Utٳ\I7QHIIֲ%'Mbԗ_"^hgaɶEcPpy-~M2e4Sd{ .,]rF>B=yӓNvvl_eSƆQ ׈O?˿1<_1^=:X[߸1Z839rgA ?'0qx{{SrU(w!**W_}J<ۥPh0hgg|KWL>ڶm˞={E||< 6>'_ZA(Şc*a7nd\;ch;s'n[$>[֫nj<8Wyz,`̙t2$S?yސT*^{ӪG"OٳV|U3t(oׄrÆ{%.]Jeܹ3a۶%OEҋf j:ԩ 24CPQ#/_΅#Gtm<>4֍S$Bǖ([&NĉY9!ܵB ̄RݴwܡCp rVς<¼yعs'sӧ|\ʃlE/^GY`湹9[lKЯ_?JdM5z QFԩSI&ѦM6mڔ_ǏEg/0q/ߟ GQ$%&[Zׯs6,DԯϜA4AZ,,ߧl=-!>;GGΚŷ ; GuH.l. IDAT:i037׬Lbiʁ~}[*VL΋y LrZ2ٗ/i8_</vñJ<i{LJW wuq课bى,`yD5ʱ,_ZꄄLLL‚&MPtiy&5k,D߾}Qլ]Ӕ*{nmڴ'RoӊH~=Ƅ,:jժaeeEDD-ZH~5wc**Uƃ[mۧWY( իWٳ'SNe޼y;aee+:f TP( J%JRnQ* 8V^qO;x ܾ}Yfqܹ [ޮWN &h~駟u<`ٲel߾Ν;k,[;v$ӯ_?!,,`r|a9q'Nߧy:t`yC?ri @él]*L0OcZVL ÉJw~Dkpab´kiܶ-{Y Q^'8BA>/-|}ifov` cرtso"Q[ExzrY3gOKg}ƥKL2ԭ[AQ'ABA=hN6O>Dĉ7oQQQf㫯)WN>E@-XpOfЩS'>\`22vX6mĝ;w([,VVVDEE*3are :V޸8|||ŋԮ]>ݻkwЁ&M0{l yְaغu+vvvL>]њܳ*oHފw^c|m4mOOO۷ww|kƐ F)0"BCYGܸxWj;Οgpݺt1Ί%O(::Zk{? Xc<[*TPݳ??h={f`jժ@j``:c223.\… *7pC}фqHƆД1"L\vQA7Ifۃ!~[MMHw-?PRxti1v$c4+<CWd̮d}Ac ˽˟I62%?jWA@,V^O Oq#&?gsEȝ}QEEƶ:b qwwxE G)!#Q BIDT   <   b   #  ȥyDPPPʕ+}8<<(e=zt}x(PoڴiŝWyK~z' qg5x7%mH鯍Zـ#XO䶌Mʟ[JAIOA"3,/7o^h܉bFܼ|f}̘\񘚙?o^[Vs0QX[[/$~qțBBB=.vtPR# ƄQˋo֠qܜ/Giۻ**![[.8:&b˨6m:9SX_m7Ÿ椹"fP&" ArTpC@R}~~}3_|PkƫYY NNo?,eTi5YYY i9o[1o<F͙3Gw]=5.4TG3 jܪ5)HMxON;8_z%`0(**=ٳgSLT+<<\SN2qߌ;2voooj5ZQS'U/lV~n6/Yrӧ+ᇯ>UXXի-Xh5'3g988o߾w]1Bio=k iD)5=?/O[5vlyz]=j6-Zdd\E]]!Q)6l"##լYvSxxfϞ-OOOCFҢo֊+]1bveVdVϒ1vPy5mDe~XFL2T⢁z[7$e+wwFї޽5vm?,+WJr.\P>5mV5U+= :(f˖+'.*J }:u$VoA{7nԉ_UoA={j/\35YvԢ ֭&v, T֭STTfΜ)GGՈ-R5<>^-[/Sv[nk%I2|z iĤIڲti{jԨQV5`u6L|5JfYW+lŧݸQfYϚO>/K/*vǎCW^Qnd6ܹz|,ڳau:|~۳GYF~߷?d2СC1cv-Iڹs>(gSb#/y9o>>> 5lSǹ%7ϟ?_jV+ 7t^rٷ~-Kj ZjجY3pqw$Y]\Ppk$$h[o]GN4k2Lz=8X^]-Z\Zh``RSS+~5{4zb_sƏHoo9wQ=7 Z{R#+e&MիCQ7x3gNݻWw}?^ruu;C+WszҦdggW>{lYbY v\XjǍ];[*kݺ~%ZQs}?|_ >4:ϣϣ|BC5.4k˗_|5=BBX b77%>n M6|8,74lƇJ^!j>#=[.^x{U``zZHo (s,zE\㾽xoŎ;ͪ.h8uCFe۝-@tC13^ e <@xx <<@x <@x <<@x <@x <<@x <@x  <@xx <<@x <@xx <<@x <@xx <<@x <@x <<@x <@x x""" *^zeN JMMr<T ]zln$@ubC OHl*6ҥKc=I&ݖq=a#<@%Y3P\q%])!A?G$}D1è':@<׳1IWJX~^D?bv:t@#$}v@lЏ`CL|}}e2(:ꋵ?zEso~Nk' t`rrT]5U˥n] u@ Ը<ݫxJ9rTW+ոUsLfx$)+-Mvʪg&*pIwՁ%eUĂE=ͽ{ZV矑= ktGP~}gJms;^b=(fYii\NlQn^ 4ie}@z虉ڿaRϪE4eeccҹS@,I&mdL?]#ڡ_CAAM|)].]f0Jn65oޗܹ^|qO{~*,,Νz㍿YgϞ 5Wj޼{effiΜjS۷"Te.)Ӕq:Y~mC;cmXi'.]S {zVO~L&xU]P֭TuYENNVNԨXVկow(put׏2XYM/йSԪwO9թ2U CAA^%\x.fVZ '$﫴񺐖|wVC=&{5௶~^.fdի[.m֊/WaY裿Ș.XG)/|[鑱٠h_t!Ԥyk//WV/"7r܋ں.\ .Nʝ$??Բkխ[')!!YTu$ItF3g>'+++yxon%Tu(t\c`07Vew³G9?_#BzLYYJ=rmN~aͻ + {m67O'ct":FG@Y5o_y*ae$(dLYYut]:w<}$IOhڱS_cww%IkEl||ot5D9igYB9?_GzxqEbV}3St!:.fd3\ Iϗ 8[_>yyQm:ܸJB'ɾR{уן1=U/Uf P9;;ҥ\ =Fc]emmen:JJJQF ^gs>%Em9Pq^32k' 9}/fׅ{4_K)o@g=DgPB~E\ ڵx<ܚrqQ}:'%Im-I783uאRȳuoK%>"Ij7plzY4Tn(&M144A҃;|NDǔ[H rsiV鉧8rm\ĪC`yԜ/Fk_d֚ggڦqVW\LK&9oQ̮iy5R-G$,<֎޽6lвekdooM}Է|VVVeY_ȶ ;c]rF]KzTqi׹̚)okGؗJkrq}QJ?#G|谚tQF~/^G~Qe<ɧ4wі+Ol୔xm6U1Mq33-; rM9(ZWQ4hz<͚(4tU_~j][wR3߱r_K}s7[UsA?mCLoE[LG*7{x? 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.

    MIDI Learning window MIDI Can't Learn window divider If the control is learnable, moving any of the recognised MIDI controls will pop up the MIDI learned window, 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.3.3/doc/yoshimi_user_guide/navigation/000077500000000000000000000000001475757676000221715ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/000077500000000000000000000000001475757676000234365ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/bank_export.png000066400000000000000000000261051475757676000264640ustar00rootroot00000000000000PNG  IHDRLs$;iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|N|>m^>;g[yoooo@^C#@3Qsȓ} ooo:\B@@]xh˗/ӱv|rfffyyӧ-PkK.}zljHYYy„ Uß944AEEEKKK.#G433{2N׮]嗷H <:>}ĉ:߉HUUΫ.]Ķ[sss%&4######,,lٲe gB^*/999'O&]v988꾩*啖m 55zP*^fO>ήڿƍ'z[nM@h NNN***DdccFD7n:thBB޽{rrr͛7/&&vwttd۶m322};vDGGx^zlٲYFvɉzO?W9|pXXÇʴƍg``^6rH??wo~۶mC^X?;-=}{]Qx>_{{͛K.-))xs裏jiXUeݹsgܹB_'"???֖nݺmڴVrС{wJ޽?smmmٸz]!)IRdVEEEJJJJJŋnڢE Ϝ^TTV'yyy'##^bE߾}e ߻wo…,*QQQl[6ԩ+ϝ;WUUH{-[VRR1dȐ{t}{yyݽ{700be|*YRRuVuuj|C}}Yfq_rI...۴iSUUl2Tdɒ+fU/dpvv~kwuyϟߦMqeiiik׮}IzzݻYfff|*\b N:yyy~aaaEEEaa!+7fCCò2ѣƗPUUݸqD"a.===zTcg֭&O*?twwgyO>)(((** mƍrU+dH$-RQQ166>tPJJJMIIYtiqq@ Xre>}VxE͜93''m?쨫駟x-[N4 4;wn֬YjE>yMr…~={X@svڕ%<"jժ yϞ=SRSSل qAMM͛D$;HD&&&uJxVRVV.**:ydTTԽ{-Zg8;w殙lz{YcAN o̘1 /:wmkii}K.e۷o/;)Аqlӧ%%%yMa̙|>O^۶m®"ٳg6LUUu޽lVN^q t]]C+++lmmGYQQٳ{{vHd-URRbٳRGGG~^TώDSBinMn  ghԨQcƌ5jGD,5rsAuMuնm[e0]Ķu+VwE]Z[[W5t]___"b,֮]*/Ν;%%%l֭[le˖B]d HKqw_yxFjH$ZtiT/??ܳ7oތ?~|} ]hȋwM۶m†ULJ%}z\\W/`Urssvǎc{֬Y?N$ڲgʶlbggײeKm><,,;T*444BGVV+x=bs^ߌi 8.t˷y9Yͮ9?'/mmmÇ_tIEEEXkcccccc"##544jQ68rȀx<)))uڕ;*++.>>s}?sȑagxHGGDz2"$_r+fggQNNCTTW !!᧟~ڿXXB@I " g,Z[ F3jk%''߼ygϞFFFlW_}^V|||ݫCusׯ^vޞ___"ںuΝ;Ya559esvvfΝH$|ŋ!ݝ%<۷=ztРADTRR2yd.>;%z/!!]v>>>ψh, Ǐ۷?WSSc̛7%޽{_|911Օ>|8}Z =裉o;`VVm铴W+^s$Onlk„ Dԯ_;haaW^^Ǟ 7oiII Wk988x{{/]={v… .JD`7oΜ9f"uzq\S#\zUv>К׊/›7om"b=z6.׫12:u l ?###n˗s-335f,vK/p+c_xQnHvb nFxzӵg Ԇ~";wn^^ .f-+**l s+a}||LMMUTT}$ +ЫW ڵf6m;,ݰkGu0R*buISfp]ߤm;[KKZ ﶊ%ͫ<~EDD,_? 8mA߷zh&j DtZfkשCAD}\~37'7.>Bn\tm>}fC3i9-\mn[^=4ݣ. =iFAyyo^@344l7Cn.r5s29s [:H yO< D~ӌY 644D/5Y}2O@ќw-999IxuysY @<@<@@fLy{{6 yD~x+,ļk5y et4aquhҐ[,wwړds stT+5r^F/_~yZ̓ R)AX[u9ӵzWJyoFNh9qV9hk֬Yb "?~޽{:S䥳~^j|cn_V6/'٣DWV~ʍ7+Ϟ={V|UVZ%<OMMcǎ!!! N=qÿ7˽km&^+55o%"Ht}<<(//hiwn4A}GV@Tv?kwtt UՒN2g|?`vٲe/|\󔡧'{Hll#%رcdJ?P(466ʪSb1+**ڱc/TVV ʦhSUUվ}{lKQQʕ+MMME"ͬYӉ_~{YyW6j͚5ىD"[[[dߺu,--ՅBaǎO/QnnnNرclORܠAʅT٨(nݺikk XܣGӧ5sE"Q9")))mٲ+oYd/ݸ\UYe\302JKvoYSYYy?!Ln"RRe'E*έiQkˢ|lK>;AҝiqEyYvfߺvA&e7KKUUUMߟo`6&&O>rrr ? |6mژ?~|˖-~~~D4a„{q%gϞyf"ڽ{'.]z1uښLrAWWW]W שQ/A,;;K}?sȑy<^-uOKOOfl߷o<666666(((22RCCC$ϟ߿?vOϏ1ܹsڴi+ |8}:ܹsAAAyyyD.WĄMfff9rƦ}G4JJJ&OX+ۥ8555ND]t矹gusׯ^vޞ5WTiiicǎܾ};KY.\ Y0ŮfwxIrp9+jY.iIDH}@D#mV/f:>ɓ'DԿ={V/9gΜ~cѡCO\um;̀3xrJK+*#qB^\?/{V)lJo ذGDm۶e! >%&&rQ@C/¸5srrӧ>|"2dPIIiҤI۷o` |٤Ik*{FYYY>+M7siR,9Mi\u>s!@?\~}Ȑ!IIIV\zɑӫW/UafO\-[ 4Sj-zuyDsꐿi~}oWT#'|QK@L}mffk֫^\悮=Wdko`KxD;NR.-)hʔ)\J000裏j, "dR7oݿMMM"?~+Шm~/]yy9333SX 6bĈ &=z'N uֱb^^^UUUlOY.ޚ{j>JHE:}u<{Iޥ%ҫNo[hL=[QYQQWytۉ-y}S'.->U"iU[i?-dO`l7qf:}7W ###˹9z:EbYf2q9c PHD~~~l!B˖-eW077М'Olܸ.ƽRK]U: vBnŋFaa!w՚ Ɍ=zmW{e-MIIaAϙ3G$[\F>|8ݿˁ!TU:g٦5[FOq^‚ˡ'|y,|4ENrlߎ#lcE?fZ^ѹG/"JI;')*߶aq吳G866؞?}7~ieEψHUMdfտ^,(+-9p) q׫o͐E"s@@?~Æ ݻw/))=uԥKd*hܹ,U̘1b:::{IIIa{&L3"4hc>}ڷo/ f>>>*** (X_ͨI&\ngȉ?͐+5͐GNkК<J`r}BvDDH\\\QQvv_=F4,^zEFFi^/ yiqq?sL9xy._\PPШѹzܹSZZ7p{L-?>+W >Q.).)))I$ݻ;;;1;w;p'OLLL/^^GDmRRRTT԰aΜ9#^ZױW_Z XfNK[GKۗ.n+~~ٳ*B!O:z*w-i';PR՟X|LYfŊDq -j4-M-Mf3"[ds}۪dQ{<{O*UVV=zhD:et 4_/~uuug諯Wٟ@mءԾ}{WW˗ؽ B:&l!+CCf-_&+9s_ӺuWB_5Tt!ɓ'w?_fw28 g9mҐN@{iλHx yyx #K=Û.@{-a6"" !IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/bank_import.png000066400000000000000000000166771475757676000264720ustar00rootroot00000000000000PNG  IHDRK|7iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|N}ڴi= NNNf:::>iҤGfffrܑ#G.YD___5>T2:t޽{jHxвDV R4**y(JRilllppA˘\wߵׯW*zZj|1+W>x),,tRddƍGuꫯ!JADDRܼys0sW*iii4 kWnhh g..]ޡ{ۗy^e[la555.\HLL9z('>|ѣ-XUU3p@#6MՄĝV]?~L1 !L277OJJ".y<!D$14] BOJ"X,MJC}'O>}ի6mIII[z޽{Ba3ϔJ3g$ ~w"## !ﯩ/SmmmGGYʍ7~ ܽPW$<hƍzFILGGgܸqW\d WP}vooT2+kjjCBH@@;'O$xxxdee=x𠼼jJq85k4_ZTfffnR~Jۯ8VaX,Czxxl۶Y\j 8'L!HZ522"dee]-7olcc/ -Zdiif3q{ޫH$~~~֚|>Lt{>/  WA?DaԂ4HxHxе^Zr͛7o<sn'AOHxnBurY"WLx ڭ;kklKuxa.K$BRtk^#) $7 :H,B:\֖<<   d³eX,(4@7Hx>>>,+((c-[lٲoy O.oܸq|>ZYY-\__'} =@e?uLi'z_yx,?_B|u:dx̻IIIg_'} 6&Lcc.8+x',X Hrss#""^稪|~MzUړ'OBܘ WWWP斓|Dww!Cs8@0tЯn8rH&}v[vhc֭޾}{hhh~~CBΝ;mmmuttx<ހ.\liLiA{oN{ݯ^njC߭ trrrSLaP([;;;]]]giijժ~ r..݆oNOneɇ}-//vysxj";;{̘1eeeexx׹\^׽544:u*!!AWWmjקӧO;;;[YYX,BH^yf''t ߦN:zJHHpqq'|Pm!C>8p`ĉnnng!!ͫvvvLm1egg={ذa7HMMEh KeI坦6xƸ?M,hC^^RTpye^-((y󦅅?Vd;wm&___C֫|x 3fIRKzjg|媧']Œ(l L(M-m]U!kn BT׽;:uɓ'8m_v6RR" e˖ũmj7!ĉj)I5sssfQ]]Dۃ&bѣGq KZLǣmzN-3wܼySwtj-NT0[ן$5Ƴ |9uJmg?B~7:G^b⠖֔)SN>MYb\.߳gExbeccc``O:v|ڠaÆq\{{6eDDā,,,Y,V\\@0cƌ0B+**~K9p@&JnذA(ݻ֞3g5k8;;WWWGEEYXXxyy3gBfϞgϞw}WT^x& ,w_ó3 !'?{MIxsn`Aj*YQiQ#a|{L&211S߳gOttL&+))Yt)!D,obwwwz'!Z 44ݻJJJڲGeee]H9r$5B՛*xgߜ쥡!>37qs-ryZ1.[:5q]ͯl#mذɓ'ӦM;uTddq]z0M\]][ bX$uy]<H_wqeii\mՂ\ViGemm5ŇiѾz<.>ʽ+7eEOٗ~f̅^|œ?tQS.~4 vP[5E]8~;.񃆆X6.s h~(a]~;-%TUgGAپf˟{mfz9wmjll  @KC>[ W/^yRg̥{)˧C:ix=pB(YiHx8&x@2|I΁t՘E[qX,61 yyIRQ\G\ !L>ij3{z]AxJOo`uD^zvktg 1s2'd'=j\f&OZQ+6~m5c=;yux𶨩8gGE=a{KەD4 Ebu( E$<x&]H$(E\:s4HxB^|nnn.J P#F@{i  -oF:"""@7G{uxHxHx,gIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/bank_root.png000066400000000000000000000173441475757676000261330ustar00rootroot00000000000000PNG  IHDRKx iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|NsLnnX,p8FFFvvv:::OOχ2i;88LSD"ё#GX,ֈ#{tMTzҥz===++y 0@1>y!BBBB?N7nܴiN:!ׯd,kʕӧOWDGGBJKK[$K:AFAAApppjj*ŲY|yuKqE;~xVVV~e2Yhhh|||QQQcc#322277O)&BOIRhE"H$JHH8|[D555e\\\ee_c'+++W^fIII͛76m4fSQQBQSCNKKinnVd\iii6ld***k֬5á޽{w*ٳg/_/Ncoo!/..YA,)S H$Ge^ߟ2`5kXXXx<SVVvȑˆٳgZѣG#qgjj'deeO4ym:t>C '''xG:uT&&&+V`^v81>ruu}_5nذA*u}Gx[nBTUUgΜɼH):\G#/Y;w.++K ϟ[VVO144ܲe^EEH$s= :Z$B9¢ҥKՍtٳg zb1 }|튋 !O>m3ᵳMTK4'YYY-X&..pڧ J!>>>jjj/^DmK$_l޼y ۮ]{(^+R.E %ɘ/otss?~}ժ!Ch#ӄ)ٳgtv rfffWٺu+ͮHIIyӧ:;2癴ih1KxB~~~nn.)R% xGckb/!DEE|„ fbX$<_2۷/hBCCimʔ)gΜ *1 5ŽFh,;vi_|4~ǥB>}@]~L&;~+W 4tPKr)^%B066677)+++++?\N 1cٳg̘;BHII zSQQ1c}ţGZtgβ(1Oj}e.ꗿ477僯ŋƎkooO_G(\R(jBr)~{zeeelgfg̘ .|tyBB~<@p6._>>{e.됃À !NVө#|򴴴JZ^zud k|1,-Yfٳ 8ن ڼq˖-666\.Wme˖YXXhhh޽{O4ÝzxnnnԡC~ ~~~}fݺu-=rommi& ұ"##!!!cr8  }Z nAOHx7^:PA,/sQf#x:|u;zK]0;-@" B@lm]~C%JHx(@ExK$bIi)=  tՄgkkbX,։'Pkn|||X,VPPrٳg[nݺu]{6m>|ҥKϞ=ۭ[: =@rb:fy̍ tߝzyx.]bX3fPz۶m!DKKkJٽ/^5ѣG̻%%%%%%ヌ-+&>~xԨQ}k{AAA4ikk/YD(VTTEFF{U]] @dŋYf1K=z|Yrss[JIIquu:tֶ?Y^^NWppp9r$X"_{ɴ}zyyر#$$-B7|ckkMMM.]_]rwwg<.;v%ZZZcǎ:tѱW^jjj}:uj\\ATw^;;;uuu 5k֔uxܸxNߒW^9{/rJqYk-rrrƎ[QQA_^t)11QMMEtÓuttPŻ====ڸ|q㬬X,!DEEeȐ!L2GGLfI~~'BCCϝ;7m4[Prrs}}=!RYY9iҤ_~Y?$ &0+dgg߿qqq @x{3RRnG577Bdһ?e=5u^^^^^jj蒯;}}3gΘ8tУG޻wO$={ݻǏ رcÇ=zr`aaHWܹsi#&&Ɔk׮4W\8q"!D&}L~v* U/;;8(((,,?'^;f͚k׮={v\.vnȑwYl!`ҥ  Iv_=,7$]p 58uT[[{5_p!!ԴA222*++*++[o6lL&c"C{ &_ov=!:,,8oK,yfBBBbbݻwippIf͚zVVVф[,jNNa g999uu=lذ+#(Œpkn{з{oyQ).I5_gΝ;LhD"oh߿Ϗ.yͻ=Ǜ3g΁D"%*> ˟|oqtmadU/$\6qBHSIxMMM ph;>>6 E"|GHDSʕ+sCZ׷| vo{_U~ I5333f Q]]Jۃ&ӧq赙)sssuuuڦ'Z?333;wH&OȴKnSz?VxuGu2)mdr,mA.;u˗/BVZUYYgϞ1rqq9|xxx3 6LMM^m]FFF;::Xׯw !s %x000m87nSz ,_vqUWWGGG{zzjii͝;7$$2={2,==ƍ& LtHoh6xxΣ4BH '&?`q^5U/up^^Zt)zn4N'>-=zt&&&|Ahhg}S.\쬭ڽ۷8qbl60Ν;mll8N/^< OSSڵk`ѢE sQcǎp8FFF'O3f ]AOO/))i߾}Gt#Fxyy xf?Iз \\5ytɐ)@_(gM9`Ys:^nC`Hۿ5r4d pHYs~tIME9(tEXtCommentCreated with GIMPW IDATxw@6-`Ab%$jh {Mn4U{Ԙk>$暠D,(,ҶM\e+o3)XJJ VlDT8Y^-9en)((螤cƌyzHhm@@tcғ'OLI[]S?pZh4 5$$D(zxx|~||QQQ||ZƤRȃAP 8Ml>9ُdddd^pgڵk&>}H+WsVV~`_HНe8BHo/* )ٳ0i^_]]-HN<O>l60AR\V[62 sӦqAAA!=z\ټWICBBz'|:|Hdƣ^_pattGPPФIN:-J60i~'A1uwwg!JeIY,g}?zzz!p…7n̘1cʔ),{+W]]]}ҥAԤR&L˥(/^yfAAA>Vr%P b92(0T*9rF L^vءP(޽k}[L^~e|~PPÇ_y^`,ۊP[r=߷2i```k{rrruk2 d9l''':k liTZ[FEE!vbzHY,(bcccbbTcۡg'V2idd믿^QQ'BXAP 2 \^SSCdxxxXX"Z422ۻwotttpppRRs7#j=T*UT%%%L5'$$X_վ6!]p]HB 22yUVVYךEEE̟?QQQ f577ߧO1$A"[ھBawwz1lrr ԚEkQPooyOSLIKKt bېG,zzz"\.۽{B26u?ryf EQndb!>Yhrʟ~Ņ馦#G9ryo߾{'Nx{{Ջf}zyyY&g5DfffQ<c T*չsBJVϞ=)*77777ڊ {6bK9x͹s|'8\?%'?[Yz#G20Y6R411bCr{3sSL''̮46A(|':!P(̎7ΚІm@vV8xрh~{5ʄO9bw%5E^|HaȱA ;̃/_`YYYF[nutR#nIQM.##VUԕ]!Uxv姺Jʺq#o\m9"qE  8 8 8DMxV%2qћoy]Nj xV^m@[t#Gٳwk׮m=̋ ܑ0 cXiiib6Κ5kƌOj;wd6mr劓g̘=P(z?33S*\kcǎE]-d u|vڵ˷>̱ Y:"8t'Ncpƍl6>(666;;[&-]4000!!!88믿vww?|ի-Z.8cO1ّf\$I=paΕPEkצN2oai8awܹ{y\ԩSϜ93fP(q|ĉ<O$=3}wB޾1"r\t E1D-[,55U+Vؾ}7B0J]]^7[3<;vl߾}2 qD">~B٩F¼}_|T*#""ƌo/_ƍ̙e˖SfŤiN!ïvO}z|?~sxE`6fm۶Gn) /_n~66ERRRRRacyݙm?ÇMh"dZ~yfq!N΂;Bh:wN^ɗ} J^Z d u chG68ڵZV(.[YGöӧs\Pۉ333oݺ% _{u]xիYYY7QleQIgfe=ztOYqɜ?vzUWf#?ٖao+..^bEϞ=.]R'Nv=f֗Y;r篾yi=={6MN{XlF]~zy3ۧϝ0:N P풇Y,F)++#N>tss۸q̙3WX,vmL/~5ĉaMy w˖-KII)))YzT*ezGD UJN}V =B>-s8%5CCC͛m6H4t c%H$kJ$///ÍߟZMлsptt̙37mE''NǼV4 {L}omVںq_48ܹsΝ??7o߫T~΃ׄ ܹüH$n0cv8x֬YF5iҤ˗/#.EՊ*UUWk׮*NW]]}~ᑕEč7Μ9JLSCfܹ?s8nӿ.X`ݗsЈ47o燵 wP7}lPիW?a zWiްaCMM 0`9sYP[[l2D30 J8Y&33sƌ/o9s|יoSs &';vse^{vƝl[q~kog@dɒG7S2+!ի 5:Lqرq=z7n̝;7==}m?n;d3_2Yk-ԩS׿vU\\V{xsl@t꒓#""zqI[/o߾LwJf>zA1cƴM$ -|>픚lWil@6iӧOS5k,^W*eee.\`X۶m3eYرc`cdGMKKc{f4u'N@ 1bÃ&/_l:g]\1@` @` A`<1EF.l7oC}w%}SE8.jo'Ly3i޼y{HӧOs=55j H˗#kjbMccû.0cL|q!K\\޼1dɒGn  yĨǑ5?)ڭ[Λ7o֭q^+i^ޘ1cRvgg.-0ee=G+],QF(݀6{=ع  A`ȶ^MN%KQ5dFb;99 ~~}EG 9dbI"x5̻555&$$݀ $\>G"4]UUUUU3a„>}8")"%͔ CX{wzn DޯU{ZR&uk%f-(XįVo)jk/l{ذӧ8;/Q^K.}jf-nDJI'Z644ڵg0avRZ3uq} Rr^'^C:BuB?E E ~՟B9kZ2oe+g.!.!3t/qyxQoF^}]D"~K6DC~bRݻ'YEEŋRXjEط6oquuevhrF$p"ql)Z#qEE}q=gWzaHTGrH*92yd{$acQ,msÄH ?4f'5gG}I\ ̍&|©aOU֖DbBѬij*5 ;{bJCy/\huˮ.]$Muo?HRy]I$믿T!\ t$Po:"esX=M{ CR;Oz6$D4'iwq4OM=eQR8X%K+*dirjG?&e,BH٬U *r2!p\G=I䠄a~H˛RT*Dt(<%@B5d; jll !).Εeڊum9A%5KJMK"|6idq 1 qp jB|g> \i4A4MN&צ늋m^iIف!#iHQƗ*QmYFEY<ܹCqx! $"ZFp `^rǡ)!aY,}?2iaA$ۯ݁l[YջF=ELOZ#ېrx8niLX ljW.A41c-Mjkk5}h+uwHTBrb;N ن%Da8FP H{m˵AB:?7I9ABb=i6# xƔ)T-{oz[ \bR8X-i}Bl˛ I$5:Z38C1^rZSCVF$Im755!窛Ɛr{!Qe}hRMMMB/*1L7_ gyr됚Ւ\'OrO($ )0 E4ipF8Mca1 )rquk{ ۖN#\_IDAT!Eڋq;ElO*@UMFi͂yDm$ϿB,i+2"(.i$)jiv0GD"pI1Fi ш&Hh;io!Ҩ"12' e[wNr(k6#^=<597~m9Fz7/q I6(naІ o #(Zi&HVlgrqQGDIybFZgqW>N-[HM}G\)$I0b ߿`8\$EjFCEdr Ƶ͂Bˑۜmv)jM[R8/:a!ϞA0h+F4M2I#DQ4IQI6J%$I+0hۖkXXa Gβ)aaaavAZx!ԐdqgyzmcrL{,I4HIRIT ЃQ'HH$* _iIZpH`P^tX4((y0C*|k!q$5[ߴБ#٪F#;tצF$)V$'($ $Z VFq}A*ܳ"9ژ8 W/|` D{!}0\>Iqq~~=~jjvwnt$IJY'tzB':B#4:Fg.PJ#Wi{55Hkuڬjzc +&&'v\_wyI}}}m,=@z;V\=NP;$51?c[) - t}?juIRB٬]Fl6)&Q)mRKnޮ%^O?}ghMl*ǏϑK}MyI'L`Wf9Sw_^m2|8 iH8` 2ds/;(=Q77.pl!^QU*VajڡIJ U +WlC/l4 CBB47ehdȤؤcWfoڴF޻%cwJm)"(^LEEQ4}?Ғ7T)z;u*3֚4000--NIwvqI`3ffb6*Mb޹qC݅^8ʻK72r[v8Ù={Ν;E={l;{Ix..#-bfj]*ip؅3ǜ.nN|BYT]mз޲Yܹsw]]]EٳgSLj+2"#p߾ ~Y|^ܷԩv>S믿L&?`Lutɓ'҅EƉ'FEE]x1̽2zׂRiZL#5ƍ LacVVĉYBL iqqqRRҳ>~M61D7#w7|cɌMRSeff5kּ[{d!CYf͜9sӦMru555!.\PZZf'Md׭i3g9swqqqC6mG}4uT/\ZfMNN?޽!tȑ?!w%&&VTTy~uÊ+~L#H$J֭[W{С)))IIIf1bDNN([Ç?pۗ,YdßmMKK3mg}>EegghM#5y\#5gXB,pn+WOq.Aj>6]]LSҿBaf!RBaZDj c'eZQF9\u4wR29RA p0=}h{kIj6'@ؤ0HFcR۶m[hh(\cq8 |}}a…=z0WAVOj|UV9;;#onwx$K# g.=x7 7۷3ѣ>|ر'~|K,i;W_}5~xЍ7SSS;o1@j]r/n߾S^^>l6; 99yL ZVà &p8XvK% iӦ!^ٳg{/Je *Y߆O~:BHR͙3[yyyY]ñD˹o@j]}dɒ޽{?\33 ˗ Ho۶'I,[nMԩS>>uo44l۶M*nƞ:u𧧧a$!Cŀ~8qb >R'RRR/_ʮVk4.>̙+W:B#)S" rsߏ/**Q^vHj%3f@ F;)@0HaG  e*@ p0O?U涙&jlltʺ]4ҡC9͍wAK.HO؜v-i!˳RTTdsڐKR;'5 {fdHD555V83vrrb־{X{쩩q<44('ǑccǎǏO?4""b~)?'HDi̘1Ο~)ljժDfeou3,]@j֘oׯgNAAA͛kjjFa ?fgg+J ҾHڴi@ ظq#rI-s6˥755}Zoh4?k?ϟʕ C;3sNzek4??0T*E/ !5z̛7 6CLѝ'F+d2'BH1HJ+Oc\Nŋ:tС . 6,**֭[999bX.Tk׮555;wNӕz{{ ׯ_|a֬Y;F儇w ) |~MMjh@@CCvE4E*< &7~iiذaÆ {x;O#'* R?l H1ؚmdR{ 5V Oj@j85Zv!Y,͵1U'O1rb?cƌR`y||yA,j_CіۜԢuhRӟ*;Y>R0gȱA puvKj7QZF욚M7-悂;uoI&=%EȮy{MJj@@   V;[mIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/favourites.png000066400000000000000000000542151475757676000263420ustar00rootroot00000000000000PNG  IHDRY9giCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N3oq;"b%/Hd0Lhl6#  d2E0-ԬB"z{tӳhM7ٻx_!_ϣ |jzٱ/bpݼܝh,vtoLK>+qit_͂7M&sy{?PA-GH(bi-f2 z#Eּɖod:{3"ڷ.n{|cgS +s]/ &"2dYqwF$6n@X7[=H#WRrTT,rwz>=u׳jwNx1=;8c܁~yp\}_8v6=m_O_LˤGtoǮlu\5^l5 m8 M߽JD?ͷ{#/JDKVD:u\?t&>cW;MA?WOO{gָ}۟m+RL3dfNpZ¯wU郧Lf˼.`6LfUJD)׎~tj[)XX{ 8ж˂:پ ϭMl[}˶؄Vb`#7|`Xh֌X`\_&ǣWտw?l>OUhX|c&rU?2dRb~1G͙h1[C7;{U7 |nb2~Dr5Lj٫b#MGrʔ 1=;mGVq{G|CVپl,M+ֹ.|p+YZ"uWDXdJ**Sj(%J/;M&}C]WT~ș媪-Ϛ>l#>gl,&rK˛;lu+-B#,o&~\8rk߳vE ͡DD RUQptJTĴ|"rqrV=G3gL:BScl69K/lgZ\4[,-eA;ƈ[(w;4)ٮkZ\E[  G,6y=jMm9/wTj, >k|:zi}y# RuXX,vP}ī?J7֞ӺʂX@e1#ͧG=]@1wLf;0,#\RDBਠaCk S75 nE ),dZ CiiiiiiPPz}VV  bΝUZT&<h4 "Jh[l6  @LΟ?ODVUTz{{lFc0f3ϗJnnn".\PQQEÇ阘\nFT*َBBBbqitf977bH$Bؤ^뛕Rx<^Y,쒒VkZE"T*;w v~~~111)))D:sLUUݝr'ǶVbVMKKS*<=$$D(gXrssYCIRww@vl+pȂwێ@\qqLFhJJJbbbܪ:<&fh4^p&FEDDTլQ$۟ R;jŋVEfR[,VT^o2Gd2]xQVs[j999}p 4UYg4322M&uM. B>ӕJV LNN&">߻woC#|||*++ HT}LLMMeAP$rŒ8p@ێ1; OOʔYVuRiDDD"1 uZV*T6TUUU...^^^*]&vؽz^"bAɉueee9h6 ѣ5rB& CnnF1VbqD&*"x...uB DFFɊ NQYmf*44ӓ ũSL&OS[@$uޝrVYx<[,ŢL&:ujx<^ddd`x<>Ȅ޽{|PRR"VH$f-ӭ[7LFDaaaEEEETt:4 W@󸺺vޝbڸPhggg5D²`t:n %@.+mǎcq݊\:uIHH`yH.{yy7Zx/WH%Y˂FFC={4mynJ v r&);;Mx{{ k׮7Mh3nu5㲹]i( k/44T&jdZ++++++-X}\1׆ОƯ%nJ 꼺[x~~~l&n4ӴP}tppxlfEE5M0iiiDTZZNZh\ST+T****FXV;=č6 CZ%%%eŒ'xnϘiS󽽽[^^^jxX,-פFohq<% 4<<[D#""\]][4ۦH$ I$N:EGG7ႍ pwwJlw"5""׷%-{Y쎎n,*88Y(x>>999:::887jӉ燇VFcrrr^^ZZbX** oo;ޢhrKϲ<~ieQFYv<xȂ͔KDYN@DB%YжxF{tJRRY@lHEEZvwwwpphUQ4Ba.]d2`h4T&I(@GmdQ~~~ܜʋ/xT*juJJJNNn]e,M[ɬ)k|‡bdjFTr6'>>ADңGXq*|V/**RՙeeegϞ%"@p=َ]μ?S(* .х XH$={Jcǎ}xZdݺuH$ZA>e2W ܢ$IbbbFFFUUՙ3gZ_5FwS`^S~dКUd^ȂXwulO>D{nquuW^UTFjFPօ7fju.]d2d2$%%u5&&aGEEJve4FcnnnPPPS 6lיg6t^k}ŅfsQQFduVZ!0ID$I\|f] AAAB0))ҥKtZ@B?H:|0~~~9S}.[;|YJ}:P?fA(v쪻N"LsssVmw#gkZFcFaㅄ$d{ E 5™.8::ٖɉeAVr\բEFTQQVqrrg?=^rrrlojfd2#Nm #j->mE'˪(G_R6S 靂w^^]ph4{Gj9nj䰭b6\\\|Hkëy]aaazz\.d<ƑeDk.;hd'6p{eHb L"tNcPb}o"t^fߟD2jecRT"40L\C>}***-Krrrrr2߫WQQQ9rvnqҧ0٤Z-~ʂ"'L*ɔ nȂDDyyyФ\.gYxxxDFF>}6 Q߾}rrrt:su:݅ jlm.\(--eڿz}ٳ{aa!{N` NNN~~~s%Ɉ#^[߳!C.^XVV:D{}aH$MKKɩ0Y\h1b[@R<==3&+*LUĎ.r:;H]WU?kڿG;x`dnbdA@dA@dAhLwӧϞ=EYphG;T\\\`6hŊvzA YYYYYYYYmG3MU,9>퀳g. rFhʤ? @8p/`̭TZ|}ox 4KtT; Ӽ }u:o84Gn Z_?bhb,KSbP'!ڽ6˵w돻6!#f!Z :ԩjԻ%EfHm h#N?Q}YV5챒\(srVEDD8kVh((r#}M6g msho<3e/p V˥3G3緳7"&(ȱ >m,ؐ#~gAP"u8lFSYZ|,|Z\#?bZEIVUD[U¼x<Z }QDD%yϝlnwZUa4VyڭW}եASVNVMq-#MӱO0/vIpds'.2nzrN.Dғ/% zwY%?w 9V7HNu|F.ĝ?7Tmh1hD` z݉;F>0lZDbl6M d߾>/+MUQjBODN!(_M8 f . IDATjMyj==|vt'FQhDWʞjnX_ۉh臦<5\0Q\oD b"RX+K˸^M=aSQzPU%\;7ѩb®?.4hu.^O ճΝf_Fx{_~1zm}2ythNfje/y<_n*M무Dl2kÒ7*+.ۯ}r/W{iɹ3V6prq5jX:CQ!š_8w@AnfZe1 z];ls:&^`AO-[liwAYiʳ]`^]%Yfe*+-fQ+̊۴Y諪2zݿk.*I]Z~L+u(_wz=Ͽ Ų?&\XL_琮z i_dQ)3ȝ~EV}<Ӟ~=+5qD$K^z'o/x;G$=؟ۈ(;=sM lN/ 3%gTjl?t s9 m/?9'>˧%ų (xA-9E[]pkxsX(kj5y&dA|9Gz{ޥxHBo_(͋߳C'%_(Q}Z] K{]N xim۞`1Szuǯ:-UiIiIn_?diϼADъ/Е= +J}M&>E^pxOq"8TV\r򩱑bPCf7B#^2 (L*?gs~NJm6uUj5BRU_B?s֝-xt tps[ ]/ؤjˉG,57zCCJ߷df5٬Tw^I$^?ÞCoúB^qF榷ZH4!lϔ:zc/ƥ'_JOdZ_ۻGhqaǯqgY~NF3~B$ʊr6 QΥFmҒ.VdRb7}g:TyЯe3_-:[Z]мjby*~Ͼs n (Ɉ?y}+*D3Onw7rLIfH}v#o'nޝù9^^, F"'/\ɯf@ $"&zawP*KˁC.3y;-Kb+s:WZo1Y:!v2d^oc4诜?YV\b9­ϖV|4;D,-f)m펏H$BvIltDk0~3F: 2ؤ7ŝ(,7g|L,xGJt_=C#=:x̫ WW?KH 8̱DM|lhHp*=%?-F "hZk5d'ş~D5(svhؼ޶{ 3E"q #KӛMX,#Ƀן\_ x W.|5=Rq~ʅWr'V9[nŻI?sd56es_c/K~D9\:uu˹m;B L:|$ EIĈ'CNSVاA˾n.}M`7ʹ|<'ߜRڶ bӓ|%/;-7;-7;Eӻo {~զeɷ#Va75gkϹT[ C5vp9 ω/ȿK]N"7~k_-{+d-]`5b#˝\ԕ w_cN}I>DD?Wu )j+N(Hj6Nmtj&63u?׋3J26}eKr9 x1./;]UQVH|:ldPTǢ9oC9Np sҧ_[y헙W x<@(Syu>pؠOjTeg`vz{Z Z繸?uRUɷge dA"rg/)LO^{i-?[nѻj%}Y "GԠ >rᫍfA|<O"yt}QvǾ>G|䨦\0葩YP*?wJ:t$3ˠ98;u QwT.'?{ Y? wY:.rY:.rY:.r>2AAAy eBbڡygӹMg>vpU*\ͣ>NTuL|# " 1}}wPP F;Y hk Z<YIg3222Mu8pvmPeRJ8CKܺM,>:<]2>bdA@dA@dA@dA@dA@dA@ٳ]Fqqq+V@k8(lt_M p'k~d'pg9{$ep @Dž,,x[ (>䀦hWYboql" /pZiby+OU[hO;,Ӑ/>۝SoQvI؊ڵMѸ -b~99ʬSJ*UC8E{[tY!Wi~>6X 2uUYCKng4s.+.aypɉ]n\(gwᜈM~_fa嚟م_ז/%ӊz,V:s3d3K?93+NuQx;ԝh5ĺwSӽs)<&6V.w{G{3׹Qh@ &%teFྡeaevSbfXb< LJ.9WH(M)2+ԭ[?6=9F+]Öҵ*njmQΉ&v7,*xƺsF-S/ȗ b4@Dr_@z/6K* 4WMN`VrG/cP\23 e++_7nZKEIYN3κD+Rރ_pɞ+ć#{{xx;Ng=<-_{z"y>nu-ӄ>e++~X*"zugE"zif~)*,;5g:Vr!hƓUD#xiEhX X:-o)^\5eee2ݴbdWDg2Tӧ/D4s|xIY<"_w4j+yOT3U]ADU՝K4YGDwGtP+Uۤ,1]m%[wљmPfZ]f;V5&"tZCLA.: p[6)=p}h5eM;n:}'(ڹz1LS'ħO#X~X;J?~.#]hS)+t찘lǎ1~FQ݌tvH @au h18q`SDN?}V(˗T'UyJC*uV]<:A'/ZƝQ"mgII sSŬViZk0 !Xn 4_wwxͰy쬛:Ҳ,? tE5x5ҡ.m*=w%u=Z:Q=U]EX7)\wjӧ5.%9;ޔ1$9l&&+X\_J lA: аV#w25uh;D4Ϊ e2yR֬۶Y{{~uZ޷8i}\vkmji=@D2uƒh.*y*ODNV͐P:l&|?:|TXrw찤kGuCM:S*, a))A>II3%Uf %a9v%Ǐ+k/c)ȿapDND>wKi}|J,pNd0Lg_XeK+DV;O7\MtxnH'j\bwz*[G=TZ0VxY"mnu<'MFerkSWxo_;&OPH.֘~Uqߝ-0z؄pؽt=7P5|usF?ҥS3*/sGOwvVkxh6sͮ,;AD'e/33@yܵ}SgE"Q{i2wos8nS;kIcb'iDT6~?NuuSʋSF#Y,֦VO"ڸ~f-wl~^uڷ,t4̾УWxP.l l'߯77'ƊV^vK:C(=-s D+W/c K{ncCYDRb!~ڸfmVfEk,l'?m\G/mu ac%ťǖپux񩷨4_pgduGNۿ^|ih]{7L+FF*).ST*ɬR؏ND )xW&^gZ}R ͖^HD6\#b[ZVř>FD?qS?T߱YpDAkr&l;zZE׹MR~\FZ(*&A"0(/ViŢE&VVpnN^~^Aε\"q0{DZ4yLܹ]"z9V՞+KV䕧* y,zͱX,z>>-lՉH |qoObjf;Z,;DN?& rlWκƆ/>Ů@|~k.Ow d)HD<5<qD3[WYhn$`@GoqQɌ)3hv5k,m<<'>4~/[9SMEW5`RuI_~Q,yѓJUiIk/ED WoNS<-ћs9g>3)*4,jJ>mسz}ųr*ۗf]:׾%n(;+ۨ_xr/[wSY5mxFq15Cqؑ2L&_r_yW"ݺU̘R{/?ov؈erYSWx-'? :yԉ:/`geo@Ll:g87}*  OP ¡:{O>y{wawʴ5ҏXDg\,GꜯM&icݧ 5bViss7LDRd݊oiZ|rexKW3}íV,7~ȂETLҐv[&@dA@laG+ľ /?ml㭰/XQgN9`Od>wd| ߬m.^lehvlev+Y!(ʮbFj3`0r L{~4P!;"uӨ5Gsvi=t:ʭڶ㍛0u Wx2"r96o)^}_<N<7ǚLKV{5߰B_D"kͫe\֭zpwQnw 6G╤Ԍ~bjp[ 24vHkJS(smVۧӜ/- "Zd㻇f,Y-<͇v,l;')!e?ku+B p{ VWƳ`c;~OE:m~nfLOfFV/\9yGx8 3y JMlJS ]xŞ(^¹ u )gֹ≣NQ;;K[s_}gV5K4*s"z`|fϽFúss wŧ$%p htPT"S9, rqVaAQVJJH:qv<>Zyy,z7룛`IDAT\Jd?՚ωF#';G\ g}g<9as ?KS>`Uf7rSOi;5_p?heFz}C(/S9}H$ٷK6{q{kIcb'iDT6~?NuuSʋSF#Y,֦VO"ڸ~f-w,,ݺըX,Z#d2g'"">KXiIIIW\姍[6w/=(*,.*,>{܌'u${R}=.--{Z`0Θ2ZvV&58m.bg <Ʀ{EhYڤ8z቏k`}|܊4@K2/'Ե 3G,{-[ͩV^vK:C(=-s D+WWfJ{ncCYDRb!~ڸfmVfEk,l'?m\G/mu a%ťǖپu`FFzY\Gsp˼9g> _ZzóO\^4!@'$e?VL|hv`@>l#'/'¯FɳD(s\ ;UKy<^evR}9}" dG㧧LxJS%kV~;uOi iu`Ӌ/2m &vȨ^%ť|]rbBe2U*S0-|>]zk!O{fo/$mw.I7n-M-m}?#uƒz Xp?vO\=sVioZI STU*wncƓ$RJ33drYxQM\ez2(jZ 7KMDV%v6wV}T*jI vQ横P5ٹӄ+ɓQk$֌/i=ZAD\v- n&||;eڮK?]yT*kb"qqA*Xt($^}X+ȹKD#f{@}E}}սt~Ղ2ҳl6!zEdIW|GZ}^=>s/ϿG߀hǷ˂5ٳkG~¦fcg#0}{suT:˰Baez_}KS.M=pveD"l'\dȭ{JjqaAљs]jڳbR|J6xT!E9W-\vnT,|qnOLmXsCEK>_x=\Dd6/j,vB={IXS<ȃu>?ȞF8\'(bG?jʴI( Yzۿf8;wE׸vFNi@{-5쁁m"'fyY9+fg]cCb{k.Ow d)HD<5dUWtX"D͚-YEI}>)w^L{t1+%mnnꁳw"Sln[1mQcٯy}WUrsw]lU1Pټf1Fmۼs5&tZݷ߬3\$m굋Wâ>6~42cg>yedCn%;K0O˖klΔibL.7n#ίT=<֬AY^ADNNlL{O1>"H*Ւsa" GKk,3uЁ#B~ᡭux ?mX3qS'ΤfL=u_[بz YB:vwL( w 쵗""O'g)\]zx–Mۉ9ߜ3zɾ6E_MI#gaz{VxV._e,5Cwжso ege OnJlo X|Wk|D+Y"pЁם䴖sɉ)aίypn6鉚ojWAqcGLr)1)!yi;ovQ87-<jFcx7j;㾱#erL.5:v_zً<+{nݪGfL7};lݵy+^K-Cvptpvq=\}cG2@64v|îmh|e]/_˖\3ʁy_YƍpyF4-BC׉u.dL}Wkߕmj#{(@;{gjӷkq}{9mmxMbXU7T*vsT{lG]M˂b[L/^\?:Q&it,u2#nfVum-kkujwVKJ!4C/ ?x|s97u_/<|ߚ9ӏ?o=qo"Z+,99yF+͟!L!X-8=n lZ-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA @ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ hA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂZ Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ ЂhA Z-@ hA Z-@ ЂhA Z-`INugRZ-@ ЂhA Z-@ {RHCH̪*-E͆86mZ7zA-@ 0w@6nܲ~!?@ 0~?~Ϟ;w>|L$͙={-TXX`>Zϼ}::oxqʔ4S҂848{7?,(`ܴSݻ`[[iA`ڲz8wUzW\2{<Ų2ΝsKg̸&G}Z_uܹS\uw]1[Tڵ+/+[1U $Vuu]|`B00~RE{Ϝ8q+ˋ֭{{{nx _c4p>x]{{nennHX,vƷ_kygC<32ꦦXlݺ֮}65uݍ!ܜ']NNַD jR x\̩7n]'O~Vzl̎g32G/?W^~,\8'ˤﻺIRBO}?}E+WO!~~`Yyy=x)'~.Avu8w\|{3g͚qBGGWRRŋm !$''Ϛ5cEKNbdh3/oHLФOa ^T^~uMklii?{ohhȑ#Gʖ]gZZˇsS $Ē%7}G!֍~{,,,oX^^n$ڡC BB$Y|KB==gvBMeeˮ:7%%?5fK. H$h%55 8֯oHKK=}P[[GEŋ`jkjB33ӷnBHKK]!W^y}޼9s6-+ ė &Oxׇ***xWbhXcCZ &MJyG***;>xwKK{{")%G>%phkorO[[GkkGkkڵ.g,?PF GffU}徝;'L?K]FF?yg?%''f/\8o,-);;~v?#`t477o6FW^]UU5(۞/0qiA-@ Ђz4X8h.+A-Fp @ ЂhA Z-@ ЂhAƞlSRBNHPkW)!᧣#np AF'C*?yG{-^$r _`s*IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/filer.png000066400000000000000000001414541475757676000252560ustar00rootroot00000000000000PNG  IHDRY9giCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N_4 ;.Ǹ 4Z[~"hˏ KN] 0V|7B( ^PwP~Nm39!Da__ɂ rHU]͜/26%4*.5Ox|B7vUY]~"$oa2P=MɱwUpee4Ԕ:iΛ:2!DO,{Wû_0QUV r?<9!os;oBٻd(+Og0gWqʍ:w1ĨS{Z5 kǗBF|iDh!gٸ"!dkUBHmcmWK*Ro9.3!OSr"cSڸ2ր7ZVYPXϽ#,AHml4Ǹ^:D|Qu &VڲzfSA n Bx5nB,=oøNOuNqif?jpB2.1KEIVs1A8^(8r˫Mj|J Ny|$!$26uca,ϧo PL)Bx5րZl>oW|mJT1ݛ89Ro1LYlURo}ٟ,/hml e79wcR9en>v֞GLψ |𿫢 >+¿Y²`sij֜NI~DP'tfUK*_d?LɋWyBGm6W}#"ɦfoONiE9b_ZN$QYP -) 6aKǷOnÙf%3}@@}CP»x E+.)%Ř1H$ xt#&SJYQ]jMu`=[ W͂,(E(-1 빏/Sgn, &V;jafSPDrŠjEyYNFjA"G[ܷEr SZ=&u&pnAO-՞#w΋vc@ۑ$O?mȿsM{ Wk0G Ʋ΂3#m f&&!]ԊB[UF 0cB@dA@=<}iҤ &>|8!!dظ'X]]S]]egg7m4h|Y5rT 7 Ç+**6欬,wwJj5""t߾}˗7oO:E"Q۱cGDD]p8#G6=^SQjժjBH~~C޽{G}6ۼy3ݻUV5zV{dA/رcjN!+V011QQQ)**:zǏ_zuƍI&-]{%ܹ]OOV4003fLJJʭ[𑞞^kp jjjv+>0D...Dt|~dd$!DKKkYYY<S^֞:u*.**IJI:xe! ,Ͽ|2 555 !^^^TҥŋloPPPaaݻhdAV`ԨQՋbbbRZZ]QQ!***2III&M2440nݺ{yy{RS z`urܻwR^zM62""4bYFVVŋYYYt󤥥eeey<^uuu^^СCm̽{kVTVVޱc5kloo/"""8:555\nhh(UfժUe˖x|azD w @cmmzj*`^ٱcZAd~є@hڷoO-K.޽{7**V1zh]|Аdvc: BEJ*B)**0@zj+++sssMMM&IaMFF?:t@-DEEy{{+));wNRms!d֭ ,000ʊyّ#G>hJ V***-cccǔB:vH=Ã/^C7P[ZZ˗/9us+EFFfڵuL?^ZZڣGn1b?^\\, }}} !,T"vssXvmhRbŊI&ijjmذ[D7olee CN5w\yyy&پ}aÆ>|.(---)))eiiO?9;;Lm߾G***C 9t… ͕Lɓې?hJ|q 6.WjEZ/{xxFGGZ@jaj ]ȂȂ,mLJ?S7٠meABƍу@= aOS™le 'VOĕnҿgeiuʣȂq\d Y>pJ>x_ٳgϞ= SUUmM߽V444K. z˖-޽;ǣր{# 2c儐wEFFFFFܹ?!ϟ{zzN2бcǒ/Ra"--ݔ *++Ϝ9C-رc2u8'uF?BCC333 > Mg *[}Y~Ey|?tȂg/_RsT wܴi֭[뭓4z&^oHZdٳo޼u޽Xjȑ#Æ 8qbzzzݳPVVիWXX!D|4yo߾⳺tح7ƥWW}{x @S0bx"+z CSg_y=}cjSTɷq~~"OWIIoF-8p\$رB%߽nh***'O޿tttVV5L{nς!>YXX?JiU*)6p@WPJ.+(|?cCS ɂBP|8J___FFZ^z%cVV/^L=]%::v+V:luG9|LL;Y322"**Zx lffFQSSVsss׺H166Z1Ȉ%UXXHZ t:O\)й^ϫy\j9=Rh탂DRsu&Fu%BҥKKKK544v]bAzT :tܹs޽MwwG1664h~: !DYYy~~~%KiiiyzzRϪTtܸq#ڻwo{OQQqڴiԏ]6??aaa˖-SRRo|}} !SNݽ{{YPPн{J0A (vZFf=ҟ'BΟ<29K݋q/3^P^w#pM^PijW!Ȃ%%%aaazzz}߾{𒒒EBttt}?\\\# !O"c.]^xAqssaQQQSv_(iii_$Ӈمr䂂DO*N2eݺu`v}߿?111..z׮]vπ'&&&$$$$$ >nn46#^֡uw`Eb,E]S{_AoH`ʕ+555&L5ibb5zheeeee#GFFF1cǎ;vٳ̙3… NNN}۲eɓ'M֭[7MMM&bcǎpzNVSS3&&fVVVJJJ222:u5kV\\pAEEk׮ 4H^^^MMo}!=l6޽{߿?͖1bD~{cXT޽{/_ԩS &ԢiSC}HVN^JZZYe֣L.R¦|K7kY9yEeN˷VRa}`rV:[__ߺWB7n( 'L˹7 _???ggz!Fl[nutտB NIRr\g&/Gsvvv j›/HYp- [xpI ,&^#&1q}hY;ak|tkQ.IJNY088۷o[VCG}:\.sgA7o}?@Gis#$􉄄,ȂzhjD/} ?* 6~ԍZ>bdA@dA@dA@LJ?_Ҹ,HEw(A<|:m]G@D&:qJ8sZb|1@pȴDGIĉ+!ܸq#knr\DXYZH"qPsB@h.,zALjltDpJ$U#h.|r}2!Gqm۶1 - w{ԟjtȂ"ʕ+SN500PTTd=zX`Add$so޼qqq TUU%&&&&&=zٸ$])'^}_> rܑ#G>zZӧϨQX,Vnnnpppbb">^50@`ڭdj7ƹ谂/|>KMyv@nVʭKJULF{^ƹ*z ^eJMz`Hu{6~F-OΑbjaqфrnUE~ M8a7fq++3è)5ռgS[&^f=`(!YM' KJ]MMO8ѭ[7BWUUihh***Ο?O-{zzN2бcǒ/Λ7!V L1Sۏ,##+ ^ |jȬ 'A$51!$U6!c7.ʊw⢂554u s[`~gʈ \XXb?ݧ{#eeebkjjP ʽzWPIVN_SnS$E 5]$jHUE?ɳ;}q(d\PNN‚JrW\{`],F:)6މY3[0<&fӸ[1{de7ĬUNKOZI eHu T󸯲ӨZQRRR#&1R ]kj?OK 浡,H={U!111[noݺ5p@###YYY*=xLLMMLSedd$##C FEE}7'OPj ͠6FFFzAaוTX;h%W:*%쨔KQ !gOVVÃ.P3 J3E(޽y[&D,#+gaiA9r%gZł0 .^Ϗz̦M.]4rHUUռ۷o'&&RϚo|}} !SNݽ{uIPPн{/nɓ!K,)++p8UUՉ'Qe;8zj쇑b#o}G=_QwJII9,<{YnVZwžGvddf-z|`~NqnBy~wBHܬ&&?(/WE%F)mʂ7nܘ:ujXX!$.....n$&&&$$$$$ >\?P'>>>99@699?SCCSgHd?}eUߎ^?K=kZRϚ;]7~p-KMwe-]a]JkeAM+Etbdsŧmm[YҾ}+W<|@FFCf͢/Ј:|RRRee} sϚ-ܥ{ԻS50s 8sęK7R`][Vvevڧ}6;vléN^^~˗/_7nܸ-%%ׯ_&B  W.АF?HD $)9%f`=mM-VcWr[\y ЦDGG7Hk!!( YM 7ffff>`iCu- #@Vݽ|qttAr4g;4^Y` u ݾ};lkkm6EB.]쌾h{ӧOȂF=z0G ۳gݻׯ_?Ӟp*++edd⢪J9}ӧ !0a‘#G'M4a„Ç'$$0L777𜜜j---;;iӦX,5, ijjB O8agg`0 WAVVVVVVTTÇ gddZСo^vݻwT۷ox͛7S޽[jUZZ]ëWΟ?kii=sZ̚5 |_b{Y///KKK*ݸqV/_veҥ`cR[""" e///*v#x{nA*`\ZaÆ;w.;;ɓu dggWTT ꥤI&VVVޱc5kK.Dʑ\.744*j*BȲeBCCy<^|||~~6#@TM6yu ,V[nuoߞZ .]?{lTTD*//oooO-oݺ566(//nnnx_U[k0o޼Z***ccc| 77̌k׊ c``T2+VPWW{nIIIN\\\%UUU===/_|lڮ]=z- f˕ZQ<)}A*#Z ]ȂȂ,Ȃк7ZgDGG{xx78lt___t%@k?^^YY= j7jpp0:MgAqHA%U|~M)v4fA/͛7dfihhXJMVV B\.WYZM$lj!99Y2ahsrr}6YIqӭ[7yyXt| 8Փ333 %pFFF2 pZ/yFVV` 0Y璓dsss%%%555 9s洺;D"pP^^ FHd6*++'L*RSS]VSS3tDK.7`o9|L`tYqQRRĒ&L >}:{ԨQwiAo^ZZ0~xz#nEkLL̫WO 6Ҟ677۷7ccc>}uV,x֭Ç߿ٲe7777''GZZ:==`=?dѫEEE7o|rAAA흝l٢Icǎu֥ӻB|||f̘qڵSNoذa֬Yt+VܼyS(o߾}ٵkovv6С,>߸q***n=}t+1@0|Vz ςp4gΜEeggBN8Y+ :sǏςO>Yn4!~~~3gά@KKK;wn޽=ztȑf .^rrrv={q !%%%|բE###Lʕ+<8w˗ F-##o4hLMMeeeŷkk:*gg;z{{,L6mNڴi={v0`0 6<|o߾ǏS۩Κ5kΝ ݻtBWk׮C-Zbii}ݻw7gϞ{쩧Ie]veeeB,Xq۷Y0 رctm;w_xm6|@˴i&mmt/^*ռ ,k„ 'ODgܹu͝;d?~Z񱷷v횐d.̟?l)))t\`] 3f***fffj``ԩSV?'O$$$[s``܈#]ҔbJJJ+q c:KN̙3̙3ݺu[F[[ٙXQQҥKEEE/chhQ\\M+((dffZ[[ߞd2"##E"QСjzz: ^եWҳgOCCCѣG7СC[NK9~xEEEtttS ߿ӵÇϞ=+**::: :u*E>|־AAA{1bʕ+~~~jjj{o6BHrr%Kyf|}}.]L)..2eߝ;wW^]z .P ɡ%=[yFNNlʔ)VVVGOOO믿޾}+//ޣG---d2dmBCCoeΝ5klI-ޒ7hV%><33롡!!!'NӧOXXbnnnllѣG?6{}---RSS}||>|SWv)555''cǎR2Z _i=233"""vѵkhP(ܸqǏMLL4|ڴi~~~3=nݺRmmmkkwŹS|r>offfaar^jcc,1k֬-[O6}ņ qGG~A^^---sss !;w~ϧ/ N޽˗M*s⣌yyyVӧSMܹsڵs d0cǎŗ4'k ۗબܵkWddd``)S oo۷oϙ3۷ڵիo={Boo3gl߾ɓ}1!$==]WWɓT7vj``bj݊6o\ZZdɒcRSСC}p_f>ϟ?͇VSS{9KI}w֭ &\;-UUU[K?~|aa}G-((0ajjjJw߾}555M?qeee;w޲w^PH-DZO^!p8BH@@@NE_OqttIQQzHTTɉ`zphhH$rtt2͛7GAjhΜ9zzzD~ko:ܺupذaajj:sL>MjKYY!J4O;+աCb}/ۻwZsNÇKYY.\ʚ8qb~!W>wۣG,--;fdd~zAc֭o޼166~LL~Zz3g\]]}3 jc DR cС'OLLL8p`s[.//okk'GTǏ;c ssO+bȂl6;33=z˗G{…b 5kÇ,+**zִwϟez$`\xqɒ%L&)<?vvv^<ҥKK(nUQQ a0TJOO711߱@nׯ,--ɓUVVwիWI Ç+((DEE}||rrr-zzz]0L&bn1bfttcǪ|>?""ŋK w!}bMmk<=====IhƏtʕD###?lذ{՝ƕ4hoݺE-r_u֭.\RTTܰaf͚믿߿ʕ+/1QFպY삂,X`nn.++?yd[_ƍFFF***999޽[vm.]!.\444ԩ|Urr[bn(`%%%IIT:t:vXrrrddޢEƍw޽z;99QƦkkkSAfG1}ZzI`mm=o޼a~AZZ::::44T(ZZZN<bll|ы/޿?))I$[XXߟ?[kjj455G7`?w}OBf<~xedo(p8Ǐ^|0>4|niTUF 0c? !!!$爩8(;\ZM$bBYLtH:%pwwYIùj;EEGG,zlO` m!dyxx47l#SJ4,> r\D ,Hz.99Y2ahudA:OիǏo@" fffRJu`Ǎd0 СC۹\.3fGyyΝ;Ϛ5+))mrssDdnݺuJJJ_7ƎKuӧO.\###?jԨ*YYYI5XRD"ѥKƍ`0h+Y]8(%%%M,immo߾*E IDAT~ ղeUKK˕+W={vݺu_JJJ^^^ xW^ao-i/?:qlmmSTT2<_gcƌy1Rvv6Æ c0;ܼY200 5JVVɓY,ѣ_xѭ[7kkkիW2@jLJ`\~}rrrNkk@s+l@ 'ߠ;$Ν;o߾Ԍ1"""uťG߿ݻw ܹCꨨ());wP|eeeqqq .l 幹TKJJZ~ڔ)SB۷o77733{ d2cm8rȑ#Gծ]FFFvرmعsgnn &NHY`Mnp4008{,ܳgO===OOOhWؔ&''xb۶m_+C?H_Y9Y?~7KK͛7>>Gn3f̉'x<###Ҿ}KمJII <L0aܹԃ>Ν;MiÕ+W:wL,ʕ+oo:3fæbffڬM)- 1b>@Cl,أGӧ+W466)99JAA^:::Ԙ_HHBBBBBBz쩮p:w,qu=(()m̬5A;tPkfhzMia@@СCZY5,9lݺٳׯg9)"G4 Bv׮]CBB*++<(%%eooΝ &$$,_133300 ҍ^>s[jhVGG ĽF' ~?Áķdgg[YY5,=GGÇ_rzȐ!!C\ƍ"ыjjjxZ;%MM͕+Wn޼Y|ҥKw=j(}mLqppJNN={6\[[;))NEECٳRSS'%%s&a͚5gΜqqqr~r8wڵ +{>g8E`?hpʂl6;33˽ -222׮]:}/Bյ5k]FMMW^=vtt~nWQ{K^ **JjZ&ƝXwuomN 7jye$~͵ !LݷZSdjjj_0`@;k*@mqqq~X3`hhxEz*77w1cďZ۷o7@s+l={44445VVv[eépޤg~b`tͻ24F!˷,xu<O/)\.W+ *Zhgg7|t/]BCY:wJ24lM Y"uֻwo@_Y[[O6UpxYS9sfoDbBqEY١;$`X[ ]⦬k؋/F jj5;YM;Nħ>KWBL9D){e!cnK):BSv^u+%2u@ PPQaiki骤<3v8KبgAA 9r3g\n~͛7m-VD^UZHߩg-c#`B ~ 3N/^Z]YEYUZ6}njgʷ/on% yI?;ݮf25\t^E'T_jjedrޢoKgz]/FҫT=GWRWo [ 6lذ-6~`kOwUThodԡyWeek3*?%5f0F !gL_P4H_F%!RJ$TJli+Ŷ:n鴕Z:n͈Z$9Tb+IFPl~ܻovi0z>}u_u_}溮{A*f}5_E]-B?2ꢷ->uBIUUw)?-](61\oPWܾM߹O,8Tf`c}BޓUQţT`2 !W,}g;B̙A[utXP,rtVC-.zRJp/Kp/橳C\]V϶TTRrbB ++R Ϡ$*۸eFc>%3<+*j޼ML6w\œNy|#6<޹wik 2u++[QYY5gTMNC]? mv d Ƅj<'ذnǏOK/ʺ/wj̨KammD31D *~RJw r3BI*Fx{Yo_ LiS.*R |YJ饯CvQ 0q,3rei)oBCNL?2.$,X5&_vέ[we#;[#;[BȫgOTPD){O,Tf?SYM!PRU~]Qg.?B joT6$[ML~0B5֎53Ăt8(Etn^Kbi}=АN[SO*l(5(Ⱥod)!|*%0fRn4: !5Y.nd+łr & FySV!AʍbA9cZa[^ m Rzq;3Zft $χouI_T7eeOmBb|CMftŐ=$53% .1/3)t8C^dyyoc2HUBݿ TdDFip"hҢ'EO;mR9>|XR𸲴KWTΏDtB {JpM=&CNӼ\@ىz_ݗB{p9bA>? ~JJ}uڎ&д@;ypynnbrI^E]]jljjmL&!e1!dǙw^Uz]WSI?!Δ)xIԬ`? ZeIgџ=BwʪBekhc{mR~SSuO*jd}˫]byԇ9~29Boܛ @hi,H##U-E8bABHuuu5V蚱 !~\NlF51bA:l̙ѯsvuur&Mz{L3Ă|>VTTJ.׭pAAAW\)((֭Έ#ݓlkkKo2L[[ۯظ=LJ GhC#tXA&i&z?x&M6lh8tNN7o&OАwҥ :;;WUUu֭doo?qD:uܹӯ_B022 bAhX 2 ***Л<e…j[l)//&"''СCWXAoZXX^ٳk׮}߉t޽ *VTT)"prd !dL{ k% ?ϛ7f׮]>TRR=zM,?Ç ?M@Qٸ\kΞ=ŋL>ˠ8>_YY?gΜZ֩"##Ξ=[TTtAeeel߾oYxqppWb/]zѣGW w:uRzzMO#y"-zw}wŧOuƍt9 )!\.b9^hz{ 6s2POOBꜜ<<<|}}CBBlll---YZo޼yԩsJ8˗ ݻg̘Q[[A?qĴi<==0|}}MLLl=˗/޴ihdaaaL&3((HJJJlmm={cddt1cikkK.B P!uvvu'R^^>jԨkÆ 8|plllzz:յ \.EQQ^tdTٳL@ ԩS_~_||;K[nǛ7o?aÆ8P,?L V;vWX1m4%%%SSǏӽ˖-[hѣGKI& ̞=;22ѣϗϞ=K}677ӧ۷oϟ2e !{6m`,xÇӛ JNN=O?//\d baae˖;vB$g)rrrrss7oތ@.ryyyfxx8qqq҄ 7DoРAw]tiuuC-Zddddkklϧ1$BVWW566+Zlܸq111M  !s̡?e``@ի[%>TUU=q8}۷˗)))ǎrtQb6͐{N.--;ۇ^`ׯ<4SWWWtgϞt;cNJ}#MN0tss355]lYLLN[ZZ0!DAA(99Y(2f`Sp\GGG<t~AѨ" fff7ECC%^paҤI}jhhxYfQ_ɅoƄ "##'M￷zꕜjժPhcc矿sVk׮]v`0$ JII>vX޽-ZqF555)3Hh c 4l6 jC٠ >?3BcǪ?^MMMΎ^5+X{sTUUΜ93<<U{|>?337@ݻIMMMRW|4R^ oxP ~' !d׮] ƍXgammuV\Mi7P߅hNtذa gΜ(p)U#C4lA{vӧOHN)-( I+Ƃj ɫg 22 !rFcjX0J*TCGOt\%UԳ@4)uXBz.''G6k~lP($pfugn˹`1q!毛?'698kncC]ٺt,H]y`xx9sbccޙ!::ՕN4͖?Ɵ&~梨̆X2QVV։oS999%%vUf О\F}>Gy>?#2; Lf?y)7!k*+{y(@)!rs;5֊rwҥǏϛ7O4˽vٳg_x1pӧSm۶vڼ7o>00رcX b EDD(((;vt~PgϞP򄐚]vEDD<|PIIiћ6m)VZo5665joWX,{{{;׃䔚JB{O<鯪+*2/X__QRO0a9 ܫ*/%U eJ c8 c2AAA3_|`޽{ƌo^t)\,Af IDAT8z%^z ,ꫯ>|#!00dܹL&344TuuuNNNIII!!!6662[[ۢ%K'''+((hkkł..." @Cgm%?jJ**zCBK5>\=Rx!DwyRfC,={lnnާO`XPCCF;v+V6m?x"++|ѢEC .Jl߾]4Cii۷ !gׯ]_~eԩT//>>ѣSN͜9eX0'''77wG:%-B2#hXJ/b&Co(ekoΜ9gUUU##< ϧM0痔$%%I/4ٳgŋKYźsݻwߗח  !t9K<SSCx3f̠K[fL::y,(6VWWWtgϞ%%%)ooKAnKYΝ; .\buР+ȑ#/_*`dd$,KGGG@.訢S]eb [+Qh|2+W=zt ݻwR)(Bo!͹ <;CX:"֗AbdggӅBn6J]]Ǐ{%˔)S?SjlwwwwwwBۿӧO/X;0`С[ ''G(ayyyqq ĉHt)7b[[[ B:իWrrr&LhRi!!!tt! [[[B!!DtnݻJ8rȫWK@(-heeE+#ܹs˿[bꃛۣGΝ;Gk׮Fz=ZSS@~#={9Nqq/RXX~zѵ5rE1ǏOO?lӦMϞ=߿7ĆBխ.\H)O AMM@ 8x𠊊h˗/ JMMuvvfXqqq,+66wI7o4(999&&D\ZZZI['ybAf|:3gڵ/_TQQؽ{iӚZ֭[oܸo߾O+ۻwo򛚚۷/"""55U,]haFjgW)/|a_xKC=|K}퓵EJ^hz;lFL$:D2'yġhJ. vB LkPeX 5w Ăl6[MMMEh`kL(.\$ F  e˖}X`B1@זo>C d (*""M#rĂޣhd zUJK X#tP i ֑*C" !+BtXBz.''G6kcĂt Qϙ3'66]]]\IQ~ whr*Se5pPAcbb Ʒ~+x d2߼y#>~x99/^ȶ}B!nehY ѣG+((\zU41!!AAAt_}}MMM{%MUUUݺu&ܰaa_|0&&奨uVkkkBۻ999%%%yxx$&&ZZZ|}}MLLl* (**> 1nݺ] =zdXuuu)))ƍ: D---}2!d ~g,r]]]CCC۷B8 !dcƌy_%~嗩SR)_~_||W=zt Kkffv᷿Р?3L)*CBBp@W^ڳgOeeÇӱ`}}}BBBJJСCY,VKf !۷ooN>`i0`@AAСCYPx<1qD7b&immDGG[[[񖩩Ǝ;*++[P([ʊRZZJQUU%s疗R\\ܼrѣGkjjPaooׯoذNd0<kjjj,,,UTTLBPTTܱcGMM*á6Q˗/ JMMuvvfXqqq,+66---MLL ?p8l6X SPP=zt WTT\|yBBB\\ׯƌn:j7o[[[;o޼cAEEK.8pĉTceeE/mݤ8qc쟃< e&}!daxرcΟ?&wdgGق$j|>?33M2w&755EuPU< z. [ ZEr2 єm2!yġhJ. 7o:88Hȳp%KʴO\SP,#+V|ľrpp055ڸ2gѣGuuuCCC;;#GJ󾉮 l555֯Oˊ}!CX[[BAZZZ\\鷚Yeo,| :`43`SқuuuGr{쑦2uuuL&3ǂt8(Eܼy3 `Æ 666T:. /^,K]]ݹs\ɓnݺΟ?M:oZZ߮L\\ܶm6nܘŋ+V7̙3W\yG+waB1\EEEQQQSwYr/&Nj*yyy *C}}7|s=I&UVV^ti{144lj ]]]333SSSX߯tRUUÇx<''iӦ 'O}Vͯ믿6i3gԛi]\\;Aǂwlmm &xyy9rdΝMa~!@B6uVzIrrU ݱvttKܸq]RRRƌCL>ɓf\\Umm-ҭ[#G5uG !?^tq=>|o``~Z6GNYU/ tuu?&R\\b2=Bwa&G8MBPʕ+ޱgϞM=_EŬ5ZZZߺu+33111ܽ{ǝ_XZGFZ pD[[B+++KJJ>}<}t -BaTT!dȑMQEEeرcǎ%>}:44իNNN8$TWWWcEhFuD;;;*ܹsG9v،/_6Ç߽{R𱲲REEN4h!d3^~\NNl TSC Hoƌ}vv޽{D)Sddd9s&''ʪGO>ѣGPPsssϞ=K.**JOO///733 zuuuӧO5jT544?LOjر vѮ\.wҤIooB055URRJOOoyQ+WLHHxko'+ *axUU~СCP(411ٵkצMУe˖/ƞ8qҫW/##qI.ݻwe0ÇoLrΝ7oިkiiuXc |1117nӧO >{{3motRmAHYίG)һw׋nO444<~%Hm6AZD322g !555۶m333SVVf#F8|0/|||ۭ[7]]ŋ?\e.^f===&A3f`={trrnRϗ_~I-ya`0Zx B+U4۲eq=X,ҥKy}njbbf'Lpm"Jr5$P(`0~#F444Hs %}76l/MB\.Ţ^Aε?WVV.Zv޽Ǐϟ9eʔ_~eCO81m4OO~- ???,,L4eXX ߿%D+1))i޼yL&ݻ<!|ԨQׂ qtў9___`6^VVfkk[TTdccd{{{z5fWrsssvvvuuꫯ!C 믿ZrnjmmMF~W޿ ƇĴ2>prrJJJ-// ILL|߹\ z_ ]daaa+V֮]+///M<-׆xZ.^(}Xť/ ~iiipSL:ujRRҨQ!/MMM?~L/DlٲE=z400o߾t6}}}j9u>}Sј%D+}Ϟ=III?ԇqɒ%Tϖ-[vAԼ|2=hݺu=:u̙3 ![lcfWPGGCᘘB,Rr]]]E)o߾%74~嗩S}&&&~~~;?P!@a `xyyߺukĈTbXXޤyZrw ~}!9997o_PAsƒ%KX -BU^^)))XVWW566-2g})KhV:ɓ'sD.M'p\Qg̘AYFm_bܹs]YPť_JJJ&LHJJiJh",X@AA ׯ_niɥkh&q_ѻ@VMKJJ/0$$dĈL&SYYՕRZZ*G={=4%D+=//}/F}uѣGDvk|###ѿ7,kjkF;w,//777700pfP999|>_9R__6{d^V:/Bӧ߼yC|*RKߤOۇ2EߝZ' U۶m[vW^խ[ŋ?R$[k4=.G)PR[Rָ|+v|>W^?zޞ) fff{hm@ɼt^t=wܼyl6K47OhKnwk*}AzzzHH| ̎;6x3gΈRY T7hG]]Ǐ{G744?kjj5h``[__OG "H({HS,vwwwww'l߾o9} d^Cڀ  fVݒ?hܸqzzzaaacǎ]x?[ҿ{g6i`x<1qD4@={Y jSPw]WW6GwwwξI&=\tzHHӧO%/ѣs)viy򩪪`BPl9L+++dxs-//oҋ%}Mm似֮](o<;owa=z&R@ǒtS_L߻;v#cZR§~jffiӦgϞƍiiibZ+Vx nݺd2 ._L;wOFFEfffhhh~֭['L??'OzxxܼysРA111$b4l/;jjjTUU9bkjj,,,UTTL5-_<666(((55ٙbűXVݒaÆaÆ 2Dv| m| JnĠ HlZd⸈pl64(''ozzzڶM … K.=v옂õkL&ʕ+;v8uԺu딕 w]xرc{^hƍ$jժPPhccsӧ˰e{455?yf__yYYYI.VQQq qqq_3f̺u|/]t'Nlذcee5o< "Lj IDATGhjk@i踸\xQt)o<;owaVU__׍@%SNufa쟃Y$L٠ Og}FY}ztttqq1BkH>'Ohj޽MojjQN-555 IkjjjgU k_xK zgdd͜9`z֭hNFz. FSJI(JX,dϏ{Pv~mߞm|YYY k֬i?'Nn :#ESJwN|Pv~mߞm|ѣO>=~Aɶ[U'#nkqㆄo;ѻB}{?xvxɭު?&˰@jH'kqee#Gvͣw ml#v竫9cA6-jMRU]cAj;WSk+Eh pi&$P Сȡ , zUJK9 zja!:Mpd(66V̽{F,(-jlW~: ȊճgN:%.U]]]U:8///3ٳI=m=l^]$xAu#999)PM ]mLʅᢢ:yuN ҁ`;8>gΜXwfvuur&MM@{Kٚ2|>8(>>>} ࣓eG8aKKKCCCrvv֭[V(FFF1 |ЩbA"2pP&Z䔔ھҊ4tXN&sylBquuR͛O?QB={~B===yQ_^t)55b !=ZzullP(ݽ{ԩSٳgŊ1b@ (,,R\.Ųǝ3&///EE[Z[[BoKJJΝd2CCC===occ|}}---˜LfPPh[[gϞ]~}̘1rrrڄGGG0X0+++--mڵt Hł...sƂmᘘBӇο}v@p)SBׯ_i&*d0^^^n1bUBXXNyfvNusABq^^s̡? @zj9z ,PPP 6kkkGxL&  lu%%%nٓ(z7oB"##_xpB]\ n;@,H/WΝ;G cSNA emMyUqqhʸq cccgϞ-l c0'N=eFUUV=k~~>ǣSJJJZvmcc?=ZSS ,,,wQSSpd~ɓ3gΤהڰaCDDİaÆ B&&&vE|<~xccY<GիWrrsHHW_}U\\HS踸PAhzTTT}}= @{#~A6a֬YfMG0ȁB .ЛUUU`b{1LeeewwwD.knn#fwji`o|||FFFoj]v5447N4͜9b[[[oݺw72 ][tذa gΜ#3228  ׬Y#n5hd38÷ӷjժe˖ݺukʕqqq=Ǐ47tX+wޫWjkkw-Cppppcc#)-''d y.\dɒNNNEEE͛7RRRsrMfeX`YYYNv6.ȑ#666*ڵkcǎ}Q >qF feeX`0z衮nhhhgg7rȶy F;[cBqgl@W󓓓df8qP4$L:a~$0dkkkBHuu@ HKK/tqB011Lϟ??tPzzP(466^x؎ǏqFii)Ͷz;A 27Zd%&&.[Iݐ>>>|>?333--mᄐ7olذu;..n۶m7nJHHxŊ+ƍw̙+W<}T^^^SS׷ft]aB1r###Ċ+WxbĉzzzYYYVР2TVV.[qbhh8p@EE??q℗1!D]].855@__uuuLMMbwڿҥKUTTTUU>񜜜M& BI(&2D,ի)} I(Ghkkn~嗛7oz+ 2rQFɵ]o bAНC-,dX ;!QQQQV1ׯ_Bd_E[F3n̼}vLLwf[ Rv@C!ZN] ڏ?᫬,))hkk644]ZZZ.}Qﯡ(eeYX[ Ѯ\.wҤIx:4WWW4n8*EUU~8tЯ* MLLvڵi&z=z۷履~qof]\\<==,/""b߾}ƍb䪪 &|Vw޽{.PVV>|x3G0eʔ;wdddyF]]]KK͚f6 9}gjjjl6kkk+))ɰrշ32$gϞuww744lUTTgϞ}0gjjj@@@lllmÆ O<9tPky]dI^6nعuU>0/\e`vv ,--EcAgg窪* ol%B022 y{{ϟ??%%eѭwׯw{G7}#!DNNN=RJKK+**G5jTǂv2)gkeB=Kh޼y?os̹tRjjNj͛GѣիW B[[ݻwO:UII)==?~={VX!z#FBz:eXpb,(M '+^^^[n&Hkkiid2<==occC)))}왏nj#''G h``& fee]VtMs."$@111! =~Ap@砀&` |/feX`YYYNv6.@[cBqt@{$]W%>>ʷp{,H|>_V"0  6KYla[tX,9g9|>s>4mm?hǏǵ={{rĉ ékkkEEEM 033suuzjnn9o޼E $d2QĂ}SJJJjjŋ,X@y? h*** C]]-kggb,--322 }^}}ݻL&Ͷ{nwKyyƍ deeLƮ]Z΅ aÆ1'NPaaak׮URRb0:::Vcc]F%..bV^M}N=QGGGLLf羾~2w$ @\\|ӧO?v옇GUV0 OOO#FBLLL^x쬡q SSS!!!n eaaooojժJccׯƋUQQӎdgg?~ʕ+GKKۛfPᗳYDDF;xܹs !ׯ_.]߶deeEFF 'OXx1~XX_ݶza,3N>]>F2L&644ش$''[d 7l7F-Y,>>bݻwdHH.wPP=EG ''̽jnn~ܹ2YYYn1eeeZRRRYYYI&TQQLOOkr{ٽ긙^-ڶZdvv6!d=zpF233uuu ?G$~ w;OWS%T999׮]p8> ^f 7vt2GGG@㏛6m3gEEESSSW\.mZ8ԩSsrr"""]sѱc4큷zzd,Y9|p~q,{ [NJMɠt@fyݏ= v@EE%##7TrȑyyycƌE?PnNzz:]ƛ|,d ,X`!d޽7n,++kbbp***xK6) ,(//߳gO{g@zb\PkܦKw%מ8-_Ϟ=[lYۏfϞ}~V6ٰaCHHȼykDFF***rwx͚5QQQIIIӧOgXyyy,+**Jekkg@ >ˏ7ёF;vd)(()((oe\]]/\cǎ۷o3EDD-ܓ=}2%ꉧy$HeyO+-S hOm4B>i}-MSnvo7j?X[T]~hN |PNtЇvq?tBYYy„ z8ӧOoQUŮ+~jRWWwܸqFFFBBǂTkɤw"{8!{+VT*DN>B߉8 Yiه~ڶkݫL~Ϯ@znj]ks[TuqLNl/RWo\:ތQ]]nRUU8_''55k׾k< 88۩wލO<`0z !~8L24C@QUU%zB~~>_MMMYYw ³gϚC---Ϟ=t04XTTDǂTRR2rH:їĤI&MD9uԑ#G]faaѭ;577vPfСҏ?422z׹9OI+++#""9.]z$B 5ʣGX,pM<&00U~yy9V|~ @P]]zjMM_~b'N|rmm-wsٳѣGÆ {ͻ.ܹs⼼233GӈEESF111yyy*ꪫq6%%%444==P\\$%%E\\ӳqΜ9FFF#F---x񢘘X v,r,?MN3exxgΜ6 =:,,,>>~ʔ)TO?t˗/s8--ܹ[E\\رc7o޼r ͶtppGfXnnn'Njjj2e  &$$ZYYuWEڵ… QQQǏ' {{`ș3g!|M-,,WZUYYoll|u?ӧK.OIIJNN)zu,K>|8h jPcccϜ93{l*gŊZZZnnn111݊gff毿 :wڅ#@{ݴ·zuV+88XUUҲL&*>>ϟ?/''{O>9?XJJ%yWU^^qއt >OIJJCc=|~>q陞GKm(r\wEAar jjjw駟6m8dȐ?ʈ\tޱcǷ~{iuuun1_GDD;::޸qCZZ.>o[zb\e!!@[0{`cРA?B]\\\\\ʊZ% !rrr>>>>>>.@N`}C!dh"gՉ p>F,vqCc7gѳ9l;.XUӀ`qAAx֋81:N[I7Wx+^O?!0R+^W bAl"Y0 pbT,XLҒNkL%S ! PTT XSNuWqxɓWIJJB,ᚫ !~8LuSR v >8|5eO1i8=Ϗ &$$!,,,--=jԨ ^x';.c~fff3f TWWgffFFF={VNN#Ă=f̘1d}}ٳ_ Ю9w`fff񑑑/_:;;:TTTTYYyʕ^sGVXqڵK.YXXB*++>}tR}}__ߨd6-{ ]]]Bȓ'Ogff毿7P9zzzλvڷo@ -y}A)))Bׯ䜜> @OBrrr Nkhh$$$p8oqyU=wB>p8z epr +jdbtPjOcroÄKKK*GMM-##[9##CEEzĂe;ܔ$rF!BJ-խ^:..nĉSN2gΜYZZzn1Yf @Fm:PN;x&)d)Drr !555W\y Ξ=-vigg甔==#G >|͂*X_n{x*THeyOO PTT3g[q…!C8::~҂*зlv=S/?dRN;ui~gE^ĹI?FQaԛnBK!mG9T/ 諱`Cc7gѳ+i@ XmC -a@_5G X !gU$ N @+I}@Zii(}*$Cj,TEw"gcjBߩ;N;S]Ɣ#@,[[O1iݴϟ9s&N6GahhNnRRRQQQ. &&&m{3OOϫW削***~ ,]-//߸q,صkWSSS= [v?pGcsG***>}M)))U  È# !eee&&&/^pvvиqㆩU">>~ժUׯ_WZfeddÈ#nݺuEup\jvvZZZ\ۂYDDF;xܹsq7xc'ƾ3 UQQ=ZIIۛ [PPpY[[[BӶmvɍcccϜ93{l*gŊZZZnnn111MQ׻aaaa/޻w MLL>SwU[[;??N{]\\=}Cr[ $000--:^#>cǎ^p!Fff&x񢚚R֯_/$o/ZZZdZYYs-Y@yիW>|QCCɓ'|* uuu666---ɼ- F[dIYYY||<.}.\vpX߂#VWW㳰2oRJJ*++z3iҤV***r鵵bbbm-//w7TUUϟ?ommm]%?x𠮮+*jjjmٸ_p8߸q'++ZXXXVVzz:l+vaT ())ag7ŒJHK{wrL&ΝYYUIK*+ ߽HTTj$$O*TUjo?KJJ…+ ݰaŀ]B  !!gw0ʊS{{,GGG&UUUϝ;M?.]\\\\\bhаUQQ~~-ж+t;:^d{^RR voY>1ox󦶶.9 JK˙LaJFFF>lٲIIwӟ Xo &8xrYkj444 hj:wLmۚW444JH fih ՛; uphzzZ1|ƌG`Z[imjMf:miǛ[XLطzLW< ߛbAxO8@=d6 ᠹ9AĂ|Eio5pXoP 6UQDm&|Xw;b(JƝnm Z\75`ID 'nϞbiM)2$Oi2 ha% uzjd`6\O.x$I*oZ`1/.I 9wm@@XUJ:ՈKƗ h۽t}ҔRE: ٔtCol@NOR9nyM}$`zWnFvއ~ӧ~PP,qcNkY+ 4 bG2N"!BĪt ٶ7޼=}!2 sn{thk*syeݼyqVXkM lJ")P7L} )#߅>~>6{ozUŒ Ӵ8w8Dž~t2;z|8j*`̈ 뵠ڊ' ag}--  so;{Ӄx wQR-;s X ! txy tdwws~ (Y155žEY23j1aH=VҚͥ@qz=jAcu'K~~n߳.8^i/h ?m<^yU_('IRxQ'SsY6puNϸu kNZ*ǣT*f?>*Pb+ /e;:VMzg^Wr4 0F V[ULJ8vz-yyQFYpFqy qsz6IjFƘ/?3|E8IB4 pDlZq(b_[f0NsCF8n,X>|ܭSBP"3Dt6o)<ؿ}SwH38Z`Z3Ufzk ,0f'CA-lɘ0][{̫;THjK XNSE-lr1>:>~G12!$a)JA\h5 "lLJ(5m3T SFHn66{(Y:JE8 fYt289= /SڦԴ, lqYE"yD0=)%Vi;AF֝[I8|:p}~89WRC.[Vk|Ef= xuZ^fiKRv=Xw/Spt 54ӈˌ8ᴘ<,l}Zmh6L5fbt&ɅgFXkI)gLtc0=rAyΖ͍fiHp@A}=[zRq5bk;?B]OPTkөLc|t6Ir߾;ł !c Bc !DZkRJJ)B)TBZk,W*) s-@)'Oѯ ѓw_R{n^V^P Bh Z#W!*_D)-Cpz'oooY{ϟR9|@yoB5PZi:F*}YPUlW'ǧ(Z_).F0?&Jgomo-iV>bB766מϗPu~_f/N!Oimoo2.?Bx;O/-lϒ8c#{[="[&D:*u * BY!F|4\6M$d@RyVr f(ǰ"2D9>obztq>vo=2E<,۫$q\qhخwz>x|n kB(cBBaZy J+R(RJ +j@+iAPJ(ƛ;gn!x!QR}{WR"3jR'X+j>yܸyseY6͵S/ |q"/jZYE^^4~h)zR*B q]Ϗ|wn )}hcsFv~r4 C`:?uxB t@@G mM(YM.4M`{ύ|xpz჻os}Lpt9zʚ.fn@}*ξ-OQE\lxqǓd:WJY<>:JB<}@H)ݕJ8 ^oMtRZ `*JLD-Q\ 0 4G5H miBT67;xy2ŋDD-޹sklhLea ɔy1Ae1:T$2(![)XefZw̲:?hh,)tʷͰ~J*lR)(^Vb{<,(.❵ *^d"uuS?).c4,\GD1QRy\9nw TMnD}S:˼SsprhrmVj"Tϳ$I$ae!!1ERb)Vs=9XbkgKB%BHezyq ZY DN`J%p(屴Lpw?fbT1Ѱ%auk[D ln9vZ>=938ހPV7 !|aŮi &Z kg\GNo;NB^ ov'/hh69+yQ/s. \MeY_E6_DB0a7+&0kkł1^?kBp!|̃z! ,UX5 5/zb7[n^l,◳B -I1ZYUeY,=R gzKj6絔R\H%GLU6M΀4LGh,3Z"KSϠ7 R"r} RZ&3s (kv룏?r:A%  LKB%قey!Fڵ4"ydI8?]&ކjpǗa6{ufisW&>1|5┕I`fVw}|79?z2\jmV2ѸҰPX2!!!&|iC]-2Wmzm?;w7|Mgֽ~?/[a{k]ԑYTX)l`c2-dyaIYeDz3BU# EqjartjY]mV$bjci-PmomIAN}bN׫ǽp֕B&vˣ<ɲeVZxN\lnp:|r8dh1d/Eq̚g3 J/l7pi%l[*4R/L|Z Hx^^ w\޾vpGW{w_ C"b:i{u ũĭNhzYJIܾd±5io?omӳW+QR EŸBk Zy!TċZ鋋9Bh TR=vJLxW "1R)&8Kkw"&RbBJU1 R+ +*ƥKM+hX{CV5ZgyܸM>`m5G"yE^A-ǫ* RdWK4eQCEYBVqIy~zv^dYeHW5Bʒ}Y_ϕ{Dp~!Z!ċl%2|ZTEؔr.q!J8\<_R 'O7iJ&սJ&$ TXYŗH,㯴F!PJ'\\\Et(ʋ(Kg85__@R +8W !)vpْʼnB` p@$1ĭ:^ʲj]c1҅iX./N! } 0.brZ :fiboƵtL(*/?|hrdytE#V8ӦjZ3)F"4Ղ,! ^۽aS `=ñ8J*+05:OkͮoZd|p4/`֢sګm34ex^xfQ9̵ty|߸ַń$UI1~mTDfgel66]C2z| d064ҤjZcBX̓(=vtkfnl4 ضf@4Ŀ 啲C` b֍k(qSMݲ9./ Q~U}SFTg'UDXLgEec"atT *VͪEbΖQ csW&bAAHG8&=_j.7 <@X*\1bQ-!doR$ ߾y淿q1_K毃o~~ XŹR)7֚R&@[wDn}s WϢ!/&[-?ZO/9QF1!{r!6yQ8:1b\zsך\jLsqך ^D(32 vB jX~XgLp!$kYp%~aom3Z.mr%H oKJIV}0)"FUPobb,(kZk Pb6˲TkMuР[+ʪ/KJi3`_[y$^`싂/YVX  ~̯8W_Ƌ1oEEAFEM{2A`XNDxxŸ^1n00 诀,K[d<1-˯7 BH>Wb1ša;į515g ? A%lXƛor.Bo,|oh |aj8u6(5_ﳾx/t X 7|b!7jĥkC]JCg@SJmxEk ܽ$UxY> +HXkZ-CDk (y H _.׷o2Ǜ6ކŲ, bZw7Dx2G3`'{eÔ;;9>=k O ]Sdj}Bü*E7oئLi[m8SRZ L:A SH0E_0i8Ȋ%9- &.U%ŒIY7 *@cAYq!Ǥ3_oE\ HE ۡ2$T+uj>޵C1g"U̱x50^^۽- * ͪL_JAncՂ(Z"w[&(S<<7le PI=h -rsNlX~jev[Gr6~Oomn&1HW@{z>:=D}E\fXZʟ\Fﯵq7oQ192FaY:D'OJjN*ovwAYV.q[7 (J Z1=γO,omnx'{rsBugz6ZB<˒On]"=71 >ѧm/&Gݽq1!Ksd1Yjޤp{?xHsf ӴQP b.ȺQB(Fj=T9'?M~2 G~ti_]?lt%=ױc,4 o0XF!C:Ѓ0eвsP 1q|(0vpYMtd6fenS4qi5|'PH Vd%mi f5bq|bjqHIZJˢe:m~5iٓFǓ2vzc{{oAmLd&r3+/7n}FZ~)G>xj^cL}hheL V"!%RqV? oܽSlZڽ75'Oπ ^HB9gȩu{=K'^sO{}lRWo Ml7]MD˧WcogT U\^βBtEoC\!Zs#?ݿ(AQFVMHq{=Gaot XjqZAM/:z#GRBlcytvVZs`+H"6|m-'h`28ŽFqt#% {߇MDd1q9>AI RESEdfIUG'ٙ8E)1d?łjՂP&N;A핵yApuf7۶n ={Y` 6,*՛lR]U?Bnmtw^9+z)UG>8U}E_W{ow/>+Yg~o3jk6 (gQ\N鬌n0\/A8;͞78(F#_Tomڿv۠j8X)!*+`zVJ+u?Z=VO>o_+?fF芾JeYB50(4ef<۶8%gJNٻD_Ou_>/|/y y Ao@)5MӔ?k];Ƙ1nWXo:L,k4iWU4BE# & cs\˕dLqHdnݯ.EP囈/rئe#۳]K6s* 2^Z_L0h yOB1Mi#̙\RL&Nͳ|QC5_ E %iV URfdrY  Սk[mUJ?賧u3L"VeL0 6xfaa7aaeL` `+I,ɢj ڃ~z\k+7;lQE.N|rӆy榥l$a6$…AqevOND{~? a7q|9;[$d2<+`xg+ ('\rl<.DŸqz2n;Rm( ugsE Ŵ;S Jz} v@"c{ ˎ^03Oszouwimm^d[p1!f"{Dc?0,ݒl[nZյW[w~r?nwҲlc"sϽ7̛/>$@88Bx-!GT-&y)hD=jV Ͳ[7.5 ߽NmabvxbJC!^ÍkőanMa0썸pPJ%Iz7tBY[[ɱ˫ k[VznBB)2]%uUg_k@U}M_L|7ໃjZ_39?9jF$I?~39RB'>ւcR&΢Fh[n͑1e9X3v0ŀu9$$Ew݊p,a8HBFzϲ@w^b˩h i] T+v%;LFϔ'7)1eeE!}#闾r (&N$~Pb\ Ta/NANn9pkavO}A}^_u۸x4`;q׉`9xuK.wVe8$щJk]kn.^HY~ebzM3a=P"u; )d͍b]\ߪ"ܶu앳8\MM(nxED7;K!<Ƽ@"v mllV%etڜ }m4\S(` ##Kkt6U9 9Y?oÐ+,B.tj}o\Ό/~wygR!;IAAo8EkrX,64440> .t:=X0 0fpsne(_y\pZ;# `: j+++,߿?J eP*㋋lw{ !O>d.9r矿{=+Atpew9?? 78<<|eޔrSn s>*1Pbv5ٵ|ك=НK!H`:ڹp+1oᾊ,ˢ/ݜ7g`6eqB uQ4lto".kqIn%H]iԫ!e[a Rxyud4=; QTZszA$ Yo9wt2$)gN UYAXSDļ>{n{+]@{N@CI#.H1H/lΐr3Đc@鴻Q/4QӛCwziȨ:%{t$+z廤7/L_6 &hM .yL|zb"*//_ZSK-{DWR vQҞ393څSF3lunFг]T.P\Le3!+li]ֶuJwvrUNņ/rqTiXrm85r+WŅjbR@ Yվu2xuu5;44!4 CU~?<wwF&" IDATㄙ}[m;x]KxfY<B*x5*s='ܯ?/Ꮋ G~Q݆?/>~_("3_0@U?G^D~t /n#~_͊ΝWrYˑjoW9~yAI$X!6¾҂(P62L,{5"dwt8P  } Sh>MUK]Ғo)22I$zUg; :94fWi۴ CHȈz(E4''j~ؽpiCG o*(f&ZZV%{D(ES}U)"\DT5p{ËD sm}AP((銪hR[a͐M`x̔p3r}SÊ LUS P"a ڶIf !0Pt B@nHHXbIj' T2x{٫BQ3zAZ1WG$'bH}g0@ʽ3B$:|eqmy()AHCF|,!>iƓ9X4^X41 CtR!t]7yBڮzB@u%eR!˫+D- ᐩ7 FB/pAP<s7|@X.5|T Jqs`.,vԬ өtZ?t`xӗԸMÈ' y(XPy#fcZúMiJ2_"#zZnjjR^`iIK>B С(`qt@zV€xTUU$]FߏD"ccc(~߿(0Ae(? "|ddDzNfhifP]*JSSSC%܈!cccNRmnnB=ϋFz} `^oll, NpssW0 Bsss.]+rjJ}1x.SӴA'0v !L7^M)7`9R3)}[;7kKdϞ=D=SO/Ι6U׋מxsd' m?onn WlTQ}qWcV!<|ֵī [a/j(m0oZܶ`nsɭo|Ca+ Jy2N_^Q9\4=8.0LR#@!2F-'X,Vc )E13>H8rgf|d"jqZ?MFG=\zNQcg˿˲,ukEhPH9 *4mYC'LD8gỮIAֶ5*%d# c0MҕШ*+Ml't<$") Ujq ٪(j^JV(jD!fwsWo!Q 0Rzݞ 2bH[$ԓI0-X['55J& eAŭ?r7~ꡟ{Ɀ~z*#[.6qԣ>#a%x.f SF8S"QGY^_!r z$a$PnF1M!Mn{C1<Z=cA PSUAB#r3ͳeĢCC땆gjen$QG&Qd4xqqymiqEdܫv|T͡B~׵z6jxUUeYe!AZEc1](nI%UI۝ .V 0BE12P}t;Ӎ43l]X֭ͮCXM0dLʋ ڬ5JJִgMlⰻw" w7.4uf@DFíV/DV]NW{{={t:~XQ7 b,.O?X,JvE啊 I@T|Jc<ל7v\眄gn\=kH_ E.LQc:2~/~ثV!ᇽs畝 &A.+Irx欶o dl5a.L3䜵Z< P-k_`Lfx/ȷ0\FGG꯶~?kFOXZ裏a'N"T*iyyٳǏ缯*+KU]71N)1JOXw۽U^P13 Nϧ'4eP+~/;6Ȩ/|C5R=fwj%+EH) ;ߋMEZs7b\67ɭ Qݡ"u\rƜcJ(#f4gDݶ.Deǁ'} !`S8@%k'CH a\"TjdObIcc1t**ԈGV(a#hRqkY{$ħ_/ %ɜI-n7b]w;TjɅW[T`^6݀ b .fQy|Sl.EgfvWow[Vwj󶜙)E@CJ~ RA$t::J"h{V@b_d,d2nxETN!.䪦N$ ~lV)܌yr iuzZ76SUsЫ0dEwd"tw羸Q{hquDPױC`X*I4UI8w&X)nݞP_zB\K]| dIo#f[\dC_kDґ w ]xETJN}evƣ_(^|҂?9 ;Uvq/$kV7rKpeIv_3UYbfffdddddvݑ7"?Z6(T*ԫiځ.^5o dfff޽F^_u.{aܠK0D]Wi\nv;J݈Um4;1C ; ߩbG=rj}wi7^M)7t.s~w+'Ǐz׻mo{ɓ'WWW$(, wt62*/(DpŋϿ߿|rzZ]˪p8H / ? C N&پ}3pp[ߥUt zg1ct.^{f*}in77# !&Z8[^+UtˑA.2J]WRV I"a7mJ]9Os vm{^6l6E)@6xǽs=]&Jb\eܱ[|T3@_~g$z]cτдtekTC _v0"CI 9 H IJ0ajmL-Dn:bhNUoLѴB/Tƀ3M < ]IB QBsU% NBFm >gTv]JB vmnit\[[u8L^k^|TH*m&e\K]x`OPv{K Tz0`шnVMUh$?b)qݩ b_mYhWF+<r.j[%TaӁ"AhZ߻xHXtAC\ pзmɭU[. :Za4Yڥ]n!+H< zE(0 ,w]˱IQhky 1TQ0EM=x~C_%R߱þmsgPȽ]0Thb, ^o9NW뗻2u ʠR^ז&6+ʢ*FyݪcQ:vŒPLq13#5"eP\i4ep\=K:t bKL1{6%Y*4|0@ >preA1F{u.@x/28X:\:tt##7cߑ&;fq9nЋ~GM)7;#fЌ]_u볳aVUI|ߗ$T*9(S?p/2΋y/_Q1?eR*PJɎ?o+3q9\p*Y v.]իKKPֱp^'O.#2\Zƀɓ[[طNb8 p3g!!`}]9au-[h;+"lzϤ^7>csssNgrrRUє u"&MdhmUJu]az"?/lMWV!WsO-1nBG)"GܸDn t AMO*J:fjCeis=a(GǥTb/4D:LdTbT)N E TPI@HEA10nhSA: əۿ+Q+W7oϩS/q:OM #x|F UT$Di(AAd<{/F˹Bp 6mBf /R%r};8jЃS+N7U@XJ˭DL6"{9|: 兺[e䆁eo.9]4$7:}cn[X(>3JƘrP2 tE^sv{ 8gPB CuSajmaS-uyxB;rx6nm;UU,hF$bai˪:<N֬UPFln-lԕ4826r3}5lW;v,@jHs`'Qݤ$2B H؇ے"bCEd!SCEa͘!1IA!ds"@SR1I!찌sR.ynC0|H7}Ngf{k… >|P(Ǐ?w/={2̛ЀZ>tƎRʯ% j练qvŻ]r\z{~5Eˮɫ/wѥݻ~-.|!]빖 "]I~~{;o}¯ al}/_~g~-={V&ރ>xGl  NvC Eurbba5T$.l,1n}{*>Rv G#NBpc n]7˂9:yXu|♙'~PUq"mH1h~QpJ fv1F㇘qMDIQ$s"ƙT4:}~d77=^+/B_ıx:L*LZ+Zۊ*E,fbj! M\Z˷y s5E?ٳojuʵMkjjm9u&ĀS`2e) [^[SCC"=]([c7>>1)Tk-R|[v/$'HXk^iEs1;s[3uz?22unj1M!T*?D*KYLM3ʎ=,͜RkvfX59AKX$=#I-mFDfHcĥ}^ PKF}U(5 r((>6-XeMuY\2 hZ63 D\θmOI S@ ȇZWEQ@$`|Ah 9MOM 76%M#/tdߜg=3ү:RJU36`I0(csx`z@n&)?0|f?ܔr\8B_u#ٹ9P.AlooW*QEQPJu]['F~`һ\8x |R(n4$ 5AwłI\ XyUWk]nl ^ AwįϜ 9VO|"J!e. IDAT3D" D)[ouws>?\ٰXT@1+⒂ɩ3+* Ӎتެx-oWu՗)}{3W (b2Yu67+r'$P$v{CfrNDR, Ԛճ-:"*FE1 j 2#*Ө*2*īVڙ*PJ)PAz("+!᷿^1Fn#W.|KcCMGe?lZAi\p@G3GҨo]*vC5.ff3zo~ۂ y^%Z$PT`mYgo6w|KgVFq!L$,Iء E@ΜvbL"v023PƊdRY*̦(s^,9Xu84Mgkcf²C"?TLmOՏ׷-IB_,@(czzI'C:+96+/Tʺj$3Z DYmŅF-А .SZ"֚uH%rrx@J#&c+I]V>a$BH@!NcԔg[pB:2R,+{>Ww}XoB QF)l F}x$t:x7}?z!ws~{$)MQ58#oމiH|~}>,T?֜ײ dpZgή&$sȭiL|J$p ÇrWKP59v@_E ' !k /F!\z ('7^7! >+/#@8(Aʏ2 [ AZoT&SA(<vl6L6j&XP9U\-+ʪd[=^( aKK箬:ؓ5mSn>޷*7˫E(3NqYfaIT# Z"}p(Jj656;;7^iX={o\TB e`9&@DH`&dM~VZR=N! AHG8>BugZ_yo}WN?/P 3"U۝ΥE VfñH5baH~n%>w~jbg|TJ.dplDuigAO+$g>-7gO^ٔ8"D)wܾ9VbEP<{ `|c4tU9=/vo[W5R*,rsRmQ5d[cmY^XQ;tکՃ>G2ѡǿ[܆Bk Y3OP+*ɞcˢ~D>3LwA!7I366/2]#&I@DE`06Z5*@]Ƕʽ;O#kpBO6hCt7TO# gwO3!^;!4M3s_//>|&,[YYy'?яbh~>Ѓ$Ûmkq*kہ0vcm`;[ʜsB,?%_G(bv/&`S lN.`?7!E[[u<{ls`wpV_ wmB~o +ʫ 3,O> @(o2$B!VFOrɐv!ˮ;xMndˤq p /UTJ`PXwp\ Eмyg-MB4P_i,v_xť+-;:t UX]X٦Hè[qVx%z+~ujf\*:^CI}F)6h7׶Q@#: $:6YhV-CP?MGaTh6R*mg:wp"DC<8ЩoF׫[Ooz2#G&1;r=qkm7d؅X$ QվS1w0|щCwlԋH,&"E!h()Ys.w9~y+ ~ E٤^><2JHq=BW\ڢ)Zti}Rm0)-՗WNh™ې5 4#$33l4ʸbdqS_}!yp꧒#ѺTZl3:UrխvэF&Eԩ=HN TԺE \Thr2K}IɌL#ФRGԅV8¸.GiHQACP5 өG*@$ --y,p0ؖx77aRJGF-M'nx멱 (T2iwF *X!OB $$Ex-z)_ t?RztQ':I%O*>du//&"Y*?JBjFXk( ҾI ~뭷*^y/O?].]EiL&=w3H+WbVى諸r4h4䜷 >Fdrpxnt~ ס㘹m|JrIȟ6c9i$= 7-Y}q"]c_5` Z?*/j{<G}^H?Yh)/,Δj O;{E9|(@P* . 17>*,, "%з >RveBy.?^_y<J$ry FQrq('q)3Ü/=Y.9<<#НGj~",/~k_X,}ux" dZuJFgxTJ[y`3WN/j Xf_TQd[:ҥ/LgdlzyqinVu5)CW"1Ej[.X:wAZ"PN%I.xȱ~FB3rI=y3_'s{$Y5}3xor*I.1$(jVz-ʩ-mOxQxASN wwz JodIMCŸ)T~vas-{+ =Mޫ __ڸɛтe4 -@焈、 < %t5DY,d&XFVrpi=cJ-JﶬDz⺩V%,ܾcĐr$f>=x/S.YRhaH$mP:!c(U)I^=0ksd\s< (7 (\BR H;17;m^**Ō5 DBЧh4R٬h& _zy0K_[r?c,pl1Vi*^YX{ޙ {W.o7;Y=W ƙ8(U7<ʮm? q]w}y9s-n4R:e?%cTw4Zt'w^fsuumaeuSB;NNN&7DA4csS߻$;.}S>8559___?s3a 'I9 A؂4O&CEQ"T 8KRA`y3L:p󽝧` Y(1)Ӗ-Ye[Zi%}l^9HV)-%1 $H`<3Ht7pH`s頻Uo4{OaL)l `@F LR!Np) QHU@'(\tuEW }R -BP6SV@oPp 0oW-〣4$3[[P9:4=2ۣ5Z==ݖ NhW%=: İ9XPnhapuY JrіjHGLvM$!EBebvALYy7G< >ѡFccQ1bѵ4C,dlQK"yQ}?'RMdx?׵ʗ{=y(O?T~iJtj|$ 6# vEbξlV:_opt;rÓH2/(..*-#GFA7(M:,x6jsZq~E87bY%-(3~`aKf6G4}qsfJ.@ ^/W,DYB⸐Gc9jŔưjUS vL@eYa%ˍŢ)iГȪ5_jLN2pl[s%%,S V*DCʰ,CA10&,vXEZ{e =oin. 3(j֪Ѩ!qXe,6-M 7@-O8s4%,!p1 ,8ɓ/VJ(A;0!ܳga_<1fYByqlBD(˽.0T!ueLS'vEf >ɉ >sZ0 75̗rytUW~ ;}unuBW?f.;r(7o޲e9T/[[u8tl{~i/Np[6o>w6>> y47tMף s[>߸mıC 1f֙!Ɖh1uڗZdٛ"D9ADm84e=RGA:C;zwK{^* [Bhi߄RHW$+mOoi 1X5>1vLLO&H12C^%tYĐKŰ](LTDhbU͛,rJPVLPQiY*@#rAYnʕU&Yө̍ Eo%N)[byih[[o_[ 34?2^+oXDXqi~a 2dDU׌|uޖ_)ƖM/=x{Z۶n^Ng͟idvϷ,t6_tH(8TF|SY .+W-Y=+B!hcӣӈۨD;mo'S-7e2مmuۅ#FfyiWݥY~YnG ج9r~)bZ*!-`5wgKfQ4Ot$2-Y+V*eY8*DĄ$F/ll \ ~B:zeY.xe6Uj09ȥ"q,K9,ㆅMZ|,a )e 檚Z-j8\]Hc-)R&gSXcW$%iihk4O?XP=H%vyGMwu9p~WŒ0a`3zk!d2%䄶˺y뺞비s)!"g+|֯GH}}y7޷qotЛ,Kh`<\bz &V')!uf`ed2=M.^>s¡C\'o#S?zk<?k.xڎ- A\.XFn~Kkh&NW믿>-5rilpp,@aX,&IY?eYP<[rRq٬i,GӨͺ̤몴r.L$<ϯ˻͑⺮iuIݺKJi\~KBy((j=3?5_ sVm"SJ( 72rR 49N3H|%~PH):,HvQ ^H1>"(4A1@J{ 蠀(`xT f˵?1m;.s$3f,ǞDcX4JV\`uGpG(%z,=NXÂ*XkS S!EULWM:V-A!D9% `NV[h~X2i[]tլWz$}Hc2شLG=Rs\AK4 3;<⭩Pe&C@C mX{ȳvVeS0^-\09+#vw,re9{sa ""0)Ȗx~jQlgŪFVḆv%{Mq\Og{"Ը0?;Q#k#l_{Ǣ=j^-PTnۣ I"DǂDr+Ǐc;3d& XJ4D*n6YOH M#U)Edé9DjUY# (X @T F/ *+9WIY.,\[,?|#KXq(WrᶏNᶠ5qphgkJ5(QaX3 B:!YO&8y89K<!q2I "(H19sҩN8]OrV 1+՞O3L# !' u=:~_EP(׻yp2g΍n];nֵ8_2e_Gh{q^;py$.mSn9_˶~!T!dzjjv?{]w-3_%/o|kK]Xzٟt+?ڇyNZ /<|u]YoT*U@)}駷o}NUqqo[vLguo̯Xz2ΧlgMP4/!6}u l~0 [p_L?+ _!ys @)h`/R0 V@o@qR:;;K)=F0!uzle 5{ " łGJv:<8,¦OqN݄\r!eUCǎgEW}\%_|A`x @eQ%xPd|s"s X ##E_Ғ0د0{麋wk -?8W)WPgHHgje3OA<*ӾXHdsLsvfŶxc%?+j9NL95"Ȥq8ETxLA i*L%uV()JzJ $x< .0muiɥEs/ʗã Wt2MKxIg>M??~swvkO:p٩~S߫Sg>۷rA_0Ólx~o/z퇟վ|{oߩZdxhZuITWNg I`nj{˅5ggg(F wu. 1‘ck?r fK=#;١vqztmg4Ɂ/>Q|$|xDi,r^~eRy=::::00pVk5n"r׭Anխ]v%~сZ+rΝ77lbʀJ /s/}KW\qE\vmOO__=C_wg~~FSSSCǿo=쳽UV}_D"z%|;o9{7L~_Ƶkvuu_=ΙEk׮-JAYXX"//޾>;zsL$Xl޽(^7v:+s]@ՠ?Hx>(> #x {wB٣p (|rq'c )>F?G(]Dw( RZ^p;0';N8N9XR@lUR8.ZP`f6sZbKSwCA!ѫj)2(٩hCr$q9#g \ii!1$ǵS嗊3G\>/PO!ƞ[, Æ1*MlzqfjC#űM ,o;^ Ywy0p`&/ԳuCR6xnkwڹmhöz%aR{l^ك]B>u O<(6U4y sbIѨZ,B D7rc[6s@<!B/K"-ki`b7 r,/`E^;xW+@) 383w  phC[ԾF׬f8ڶQp\O<{yߡy'5k;Za̱j ^rk0+ZpU^7t7/;㣿s5trWQ Y`.=/~{ɱjCdYg?ӳsν{޽aX,~o>y4wرjժK.dٟܼyJoeTjlll;66N?soذ{slllqq_jY.k{֭[D^{!lnnOMMOb?@T"t=ao qMECb+2_WyhÇ^Sd>Y{pӉ*+JVD&YY,}^T$Bl_Cyl!}*=TKpt:]4_v':)2uv/+$67mct搪g2#M1%<-=w5y1NMHǕϛJ .sQ|$&qyL t6JeS }~ˢEPq+ "Hw,E#sj uLWA?pT 1ȁFy*(VHk2v˱ 5q᠀1Nr}օ,+ ZpHa-!BͿcceمx8iV)ryl@$A,dz]e-SfiT/@NG&gU*EATT#q [ a(tx,T 攼rDX'^S=ި(֪E^gN*9\&Q S2*rlv[A9ҙLF|BR6zlYR+jU ]{a)CW5O .njc3}f=at"@Z-KlOSknL+Uu9#TvB XDQ`ΌX9n+W>wA_ :8X.ozzsG%"rog5O`:(@E\(ˑ㾋֗ Χ6GWAZ+[ּL?XC:_/-@'oL>L/B 0Bϱ, D  BT;O M[CʚZ{g øڇ}cW\q|\޻wc=622|N.--uwwZ€BJq\<~ 0(j!Á@0ƛ6mzs]WQ{!sssk׮}/q__)#!tzpp>9~ t=RǾg8ZݎV _q|75<<|AEQ6mڔL&9Az!_G۔zVb+CGrVCNR]i]OggpZ3uf9ᒮT=^ f_=y7U翽 \?^}!c]uUAB[NW\~!OpmV-=^,,Z6܀M)vs1 j م 63?kuZSsЎp?J1E.H`W$| OU'XM,W$ίd:Y ~2ϵ/hDbE3Ԍ_lDF~P U\1by`\,ɹql0Դia|)mY9QyFy_/#0$\T)P[#·ʴ6g.On?`XQDYzT.xt.0a/yU*z ]dc0ֲDCuQxcNN;鉹r=F| O k-h+cjg#SbdF{gZ1LO-1,ls$Ah-9S1:tKQ)dJlh\niIs6kbV5CDVcɖ:"#0|Ae1 `dҔZڱm hDmnP}]#ny'FQJ*Xǜy $K.IziăLQ+>yIb-9/L! gvwZ* ־nX f0f0@yXzb$K,gvX< J%sc"кtkBӓ۷=waMM}BHQz٦Mn喇~?կ~a0t]?~w}ܼVI+-_V.EQOy,Qz,˲lX|EX=`qq\Px>9~>h(߿?]~g |ٵ tWTI\) I k.M^k׮d2~۷^G;xY+\s͛ Q!p:/lӊ߾a"u Nu2ߐY*#je N>ROxS288DJҶmdY B#ڵkϪ&Ϻ>?&sKS&(h储h~oA̩cKm--E7k \-K}AboݻwOLLT*zu]w]wv,ˮTs[n9d0pw{g!}Bg^~tkR^hii4- q:J$ ز,DQ4MsttoÆ ?lR(fff<BI펊2JdDHG!eB()ń&(RZz1lE PQ] =rcZ]UUbeӠrT^z+Z ;ehxX[\| ^^S4 O\7L2=Avzvz@!B!xǝ- |BَҳZkoʫEIv=ιZ0`0(˲ŠP( })+r9JDoyokk /PTNC9rq將:ih,Nis]RFVU۶dtk>OQvAnm۶uvvVWRZ<:\.[WnmmjooEuݢ(x8|04d2y> C(9ЄKgk]@Az]2DH`LtvBM^e.Uڍ]O̯Wy;οwA@ P b` .!F{G%͹WCG aPJ7lkmܸ1]oX*~BLFQbL&iӎЊ^kHXX`lA![-b֎sdS0iGŬC_3kbH5Ic<}l|,, ck}9D-|z0秧s\2 uh͚5/NJzZ!!+S0K/S~_ ,y]ןzp8L& >obbu.jݻOJTO8+xڵkƍ3"L|g#H"?tak0 nݺudd$ uIt= @Go놼j:UJ90LOOx*JRG| 9Z*z[^٦?U1BqwQL`>:Q/4翘Ġ0 d~j@\(==pOCO$S >eO #пm#k\3c/Ɋ8N&YXX[ZZmmm###L&˵yUUMŢeY{[//h1T 캤Jq(е t9_8/6 Elvent$x"Z)ZiXװ*Ur?ox <H1bǫ7 uEbW!k\PxJ%P,Zj惒r%z3Ӽjs'C?vW n)soN,*$~q8M6⎗^YfC:zL*%F4 @[_' ˰ĻgOFMq XdΎn?pia(6"?B!߁89L" Bc ԲmM-.̻#™PH9gϽ'>,R:22_yMMMxeZ655ӟV]{h7|ȑgEQV١;mItwwoڴ顇J$[nWrE]}.LJOٳo_VyٱcO?}e>P`@i4ᮞ/ٲB Աfzx&e\0F{}⑱Nf4<)rl>};qs:ٛw+. -yqJj(ؘ8u1&g&#kQ1Բ)$RG(U'D0sӫi3nxhge^bGu*=VB-_)722 (I-Egy{>cznvٞ_xq~Rg [yycs7 2g*\ K. b=ֶmhzѻ 8tͯߊ ?fv{h ơ Ͽ4qD\,O3&{T0T 6F3WdIY<[q}HWmXGK|mtuv^:*(z8i"l $`^BrC7 PMΔB BB^40>ez" I J΅ /%2)2+MBj~Irhz#%1\E;;McigR$ue(A lU*S.ODz 7^ۯ/}a,d2>ӟɟIKK(z^TvZU{W<$IRi``஻WeeYm7#(RVs;=k8a;sjj_?q\V۳g]w/ {zznG} | Pŏ~z'}>_s°;j ^=^C5ly[d2L&_ `T@". E?y Q0Y%Gyvǜg3`BvLJW(:(3: oNHSPX>.#CK]J#ɖ{?@4]Tb&DvM vͨe E˰\GW5OLZNah0>c[@D䋉Hthj4iSAYonltz./qHPZڷ3=D@nꩆk@$(]XKRE*# ©RA ))W#ʇ]R]7ή3gN"aχ#?/< Ǿw?uNjbgx`eu7ٿgCC#[[~yu]i튵t܁9Q?*raL(˪1zGgե^WFxAM窌pPĨް *<$#Bkb%dǧ*5pne#U"Ȇ }Z,W2IΣ80n8' ǎzVFr"FV4,˩e]AIӳxD$̧ /rp_Yai-7l:*;5kfLh]w˯\VR$`#C/QB@ *"ZvE@gGT$kkza>plh?<2ر5#,'$ g9TeZǢE+\^6 [C~󟟝. tuu%+/ k!?L?gΜEq```hhH??nmg?Wh4:00߿nw][[>3gLOOK4:::<<\V/]ڄ$Is 71C/߿|||rr!twoVC!_Ν;ȚUml:/,˾ok 7SZSJ(Q)-Q `0`X醽j9J: AnB|[nX&a{Zۃ>T-KϖP-H'_2e}!j*I_\\C*k !\fJx~,?3wrr>9rɥSR6! !EGU FK lٞe'Jv2wo a^bG,hk 3Ndy=!éS2\X>wvfrv/ }V2+' " 'i"o#'N8 ~)XW[6ɮV֞ͣ;zy8IG9%xB1 l6{H!D;Z<+DeiClC`3dͩ*'s|СiBX1VqֶDܹ r9F7\8da<i<=u0oGުh4J "xpm /LbbȰ, L/0˘RՃy [ ؽo G !]CtkB a4,R f4) 8IV,JDleUaۡcJ['aK֍ U%Քmc$Dž¹ 9ԛfx˂f C*xQVvyua2dgsDS>|SS\Z*`(X2[:w{Z~H׆H]ε%sfuMjbݳmuI?%V!<8a+vÉ"?K~ɣ=w^]Is;oܧ< C58gN%YZ&{-mթeR "v[n`Nl]o C!&K\mԘ=KDuvYV ZkEr@œNJ^IzI](/kf%[͉˥1=H ƑhTb8%$5L΅"W\L5d)(`kgO-M;=x@HW+0MWAH7X>Ԓ/PsdG_hݞMplũ>nwgo\S/%"%CM[eTCI1kz]0$̸mڞ,G}6wތjb`-^oPߣ$" L  z Ycطֳ^R$E~5c z|K]h<_9\@\ IDATk(sB>;~!$H~Mn+vS_I@jbei荾zFקɺ,hooJCoioW2Wyג$5y&@Ӵ[ BH$~!NjMb8ֱ %Q)CQpTMZ,[HjMI94GdwD aD!`L)FXFѭKyrݪՀG ҒLWc1-Fؔ#btJ5/G`t%\+'k]r+D&ƄBC-dQ>x(oZY.=rH k]SJ9@˙ўROD{ SS3_վﱯuhz?C1+rM-N-s?={jЧ;c*L7ڜ\Y r*䘞hnM,:@``@3Sĕ%SB)ebP۶}BRq֥o#BM/U+5F`IqU,.jw<$zX2,Dz|>]0qHIv!KFmEф-[w\i\̋sF3wCLns!sI5)/0=W/ Cd9;s/Vip.^Wb67eM&ZҾf^%{B3߅+6vUYɵj{%}!%B/CMWhg2!㧏O? GcAL]eV+ŽW}P-*9f\WBy}M~ͽy ੄ /lj8RhyFUve>r(J>RG!R(^(y#Ó8m/J|!-x6-M 6?"!spZ+fN=8هzQ?f*s1Q{/4M#YicxM hiʳ=FF67F#X$[wdg/NayDm&Z6q9Ut!:#CQWz::M1NjfT[FG3HWKBE$U(j(nt,X8 xq~l:h˼)u53;F+jqԠឭ`ۧUfJt $qTf<+dGA\F $w߻yO9]OKEFRcA-(qE3IE]P#X,g]O3vS<qؖjȚI4{u|T9,ð"!4OM<x+垀2&7Lt}xX/Rqvfe`cӋ.pyxMshtx&%joJbC~K6D46X'8=5>2|E%ɲW4 lbv-(@ D&1D!Ֆꌟ1c;tK/dF.eR>JEQvڵ{uf-²lww/ϲRL G3ŷ$h47~Q+3k8UGJ)q<ϿR!u5Mr9AUdxJq}Kx>&M D5Ia C=kVƪ!lVc3IņjTS fͱͣc/,MV^y,zZ( =1r]ıUyU LːdmE -NAHŀOm Y+erX*p1OQ`_0.2q!_]r R̹-g[McɮT/透f HI.D+w ܘaKi"7 $MzB^KRr,c Z5%nW媽-gzuw51-t5^ ED@۰xݍ2p Xj[/  m`ɖnhAV E/;t}~y5q&BᇞzwQuGZO=nL{,.__7ȃDk 0޷cÓϏOO<я޷o@_j!WZ[nz=Z;>/9B#޶K7m,Y`}lCr}A+ݸb~h~|p} ڱՀ0e<,RjfzHUھ-LFZ8 'W=i4$ g2/uu&blBQkGH]q#惀a)'ى0ABԹc؎}'?jZQ+W"|[nf<7n -!oƷ%1]]]WC%__sҥ5)&Ě 5׍rpTyIqX R[W(hK/' ~/, kJrso_9TU"G;= ˨3uQhdgE:`-kRB]UuMW"VԃPKWW[2ڭ>d<˩Y:6Ri=#;v_702 ۲|Q;2;;uJi KSG)ZWwGfN_xH8ږ0uJļFFǂ>Рgy6d>$ۺÊwv&IDq%Rdc'ȇ|#%du:G겮Kk5}ƍKijg@BFAB)Xt}Ԭ\:_qWB$$xb1IhU\';ce[B4%`&*,7y{$s ի!ҵŞm6n ju\hX 73?0dz^jyX_wdf亜.\Zp5{-/,>}vR޿m{:51ľť|JҞ=a $Ǿs﷯a`׎Ʌ.ՍQUN-p[K+/)tVd\؜:=UE(NO#h(U %7߰VjƱr6(%oK7}#Ƶm;Ac*g nN?1=TX_p{  YB`/vs_S8eWQ0y2e"}B @Ƥ>!x;?xϓרU7 *BHhV)FC[z㸖|(hm}-Nn9y׿"ij? ײEB pI_,ʋ"H&N]0;3揝0xOP*5L R/+}&{B;X0, 2hѳɗ ˽r&W5Ʈ8p :gϞ8r3" !Uͽoc|[neffF%qBJE~yW5}c-okk?>R @UF:_ T IEi2Lkkk \|4.wi)hM%/4Mui]..u(5seP/ oYןHH`'bBy2'R +95MkA]u< ZM-JmH{SP vɊGaj>~2yo*Xdi`=tWwí":N8 ew)S_h֭ZVK(  KD:;۵w`CIb0m䶽û4ݷLa؅j^ԕr.3W~94i?wg9J(xmm%]wέk:NMΧ523Q[J%?[̻O 0j<Μ__ 1o|]n15!D#c;AiFe\b[~緛ct\8rMB<. :<ymxBؿw4P !3~UƁ:!Ba6! LC0tESJ DcvCbw_.WEnmtt_V'OA E#x@vɲFp9h qDu`xW-^v+iQ;B*'ZZKJo8 B"iJDzv9ċ٣+I,Hy}0j@@Otx0~ѕl Pf50D1ǠE_ _.v_$>ϊWU\/J彻w$ߪ Mj+:^^>V//`VtPO1-ghqz6Z33bJtF}4 c<۰pnkK}Qdxӱ$)Q=Br߬zxEE. ~TNp@[B%@$vi3H&DҚk/(e~#I[ջRfwtt~P8^^^c4M;z(˲k/siV.[ZZx_]]][;زeKPغuL(oâ5XФʡ̩~lV4>OG"۶GE7޽@333{yuסo'M{ͧw w6|*w쓉R{5SZZZ }}}ͤM0Vure־ٶ=>>/JKs(^3cfhͽ4-zZJ8B|<x,}\FPgJ CNOxGr^#vck:b>c^A\5m(gbl.Ϯo$1WKz1?s\OreMs=eB bh0 2^Ko@ϙ7jF\BfWVJQ6[B1B)!R= !ÄLZȷ'z y^t,\!m?̯wCs |+9o2YYYmD̒$MMMb|>n,k\.*@ pM7C5=ЅB!OLLɲ,P!qʹy<Ͽ C /p}}\oJy{GH$B*?뮻NjT/}K~3o/Kr̙D"*>uZBPhn3ukx"!c<22RVΞ=kf___8w\{{Ç5MK$e=rCc=V*~"Ball,ɸuWQf!w$KB9 jDϗz%Ni:j~;# 2U\rRǺ }y>?_/&֧ 6,:u>߿amqPwƩgώ>};r䈦iavmw(CCCFchhhnn^;vl׮]iɄ`uNȖ"5DB%-XE qW< |8Ա"RL!Sp\gV jk.tZ"$Z]B*VrL6m! ZU (!DbQTLP >P. b굕5Xq\Q8CF!PSn橗9;WWmgjYL~cm.-:Dv禪usﰼ $222㱓?*4 ZxBRu]P#ĵXN4~շ}d+=NY_YޠxgKc]\^./׀H&.B!ENҫH Q9 P*Q G&"pL(gULO) nH 4LlXlSLV$=Y>j,jWy b1{c) &S*kЍ61JjŬEa%&@'ou x;œ/l>Sdܾ}w_rquL՚Ia/ S*8* KUWT) cl^NM iVu4ӓ CO&dYF"uA^B)I2%/؆l`y> F8tǏ=74Zۼ@)TH% ?_ymzC0,iY!qfdb|<I^0 /+FD?h C/U j :488866633SՎ?sh41馛nرc+++p[o}kM"7pӧuWpLy~\ 0zœzRЋ9efK&ԡ's֖Wp\_SsČbZY^(v 5-O"QBJ܌Fxyދ/|={o{ܹs۶m=<<ܜ ֶ}v𳶍c-ZY"'!VxNKH(k9!]Ƴ7!Hl>$>fqHg1ҳ>|L*;Ea b1[_J%H$S|!J\x;>Gd$6z)o;ס\D `n0YxۆYON}p=3->iL86ri ׾6 Bр}>Qu_>7Qkۻ~g?wdwߩ2A`Zp<Om#خ* +[4Jš`l'@NMϝ:.U GCˋ j8y "<8YcD%F:[)2A1J) I1!Sw$}&|U{?=~vz%8$DQO FQOEJtO|T"<(! @,Dn֌=3Webzc2+/;\}n5[E@HH Jp6S [<ױ}GNYu rG>{HHXRt4$h/#[/-*F  !.2vsBmT5HX S鸳ssg=}sD\7;FdX,EW6cv`VHIHv7N=*C+_x]qhҊ#Ww!vn#eaLآڵ,qH$rٿ*((euʖkViA! c`նȋ~I۷vJ233cǎsy^ۣM c ! hB߿Z%=éTJːUsBS2nvfff.u% 5H|ϞhU;|U5_a|Iس{r cLI*uuFdR,N}dC\v]ȑ#,ONN fh4bhXLJRT" cKh@H(r!@"ٴicF U8ţ*ai. /EXDEw2X`5Y;Gcnj۟--O Et|ʲH'+$L.MDZ_gʋS\eEca:@DX䘀DͷZ?sg0LG6pnkb̮a- s9 DŘLwQ} >hr.8l B"VT C i1zϾ|l]o'g-R2He LjŖdSgtv(e5,Snq1e3ߛx#˲-zk貹S7 Vacccj5k(RfggeYAk688ئ'&&}ߏb}}}]]]3gLOOB|obx5Jobbb||45k\<0??_Vc7mڴiӦvgV*[f2ׅnrم˲N8іBP(l>w\ZcO_ZVjf3 RR4>>n'Nh\EQW-[4ͱ/6T*522244t/ȲF- Fs =S̭ C?>*I< |~iii޽===jT*}X~=K}Cv(J*g+GB$z+++n36>u'?I ^˜䒃4Jw>vOl޽Hk̫E!aa8.˪^*js!ºS_n޵󾫏D>s.~6ijr;vhZwyŋvM7sBPwww6=sLOO!m+u[ q9G8g$(r(BzSĈVT5E8 0I…bC/r By3da딺z2BX[*ut?򲦅zn*JP'HVTo-{E-9HdU\Q>*!8g+" \Cs,E^"{seeFGyNGpWG*}c/=3ᆮ8M!{O?2 W SN-ۮm+Ò98' tpK>ͦQ+M2~~4?00=q}݊6۱_H"]I,N*R=g=fzovQjM'pBE##;#/%dPiEzD0PL(x^ s\*"IJ^@lҳ}Ud@k#:>O!)/uj}Jެ5Qz&"735]xH:>]éq`Y o!E.81zc0` 9=dVsj$ |0꠬IHg ޜ\Ab9ziQJ&]=A@TNYvFs!@p UgGaY'*%AhcҀ) ayݨM$!Bhb I[!z+Cl۾BsOOOmۥR)H zꩾw,]Vo=z4χaBȉ't]Wn:I~uկ^[1vogFχwK|xyyYfC}Ї>O<#p8|``%?X^^mĉ]vw}B4͇~X$?D"qB)=~|>/c=}sRi4_-[\evr+++wڷ[UǏw}'?^̼ 7$X;֟nc)>0ъ"!dzzRΝ;/ږVYZZۿm[^ͳ Bwu$IWJ8Vk>Fnd2|ŪQUuͿg=hRAڵ;پO}SX,v})ri6ח5x%x &v׼L?g ߸sxh+cluAbX;Rz1BH1}]v+9.Q9QIDVWO lbqJ+ptCבȵ)$C#I#Rr Ddz(=tƮH̱# 'Fx>%?"RiIM5UD:v9ޮqH1qk"0roi7F7>iћ N,)H(|d~ɳyI@! jI(7 (+Z}Y=@oS @ ~9TҩbM%]7 tU/Ut30aZሐMfAMتsBB x]2]^ca"Hv}"( I49 vS: B\<iUsV;Î%5ÂP&f 8HB V5DB!` !2J)aB!@ aRB PH !A[-uv`*"w%.XqmJ8O.muƪ$X>ڼ0״#;-C۶zj۶-wttaÇv0\[0??߆S,~W5>>~ 7\*lxڶSz?|>ߞMbTj/:tk_7^7/|!h4z/L8p`uwG?zM7iV*ojz+_Jww=__?~ }+ŸNMM}_>Om۶{g?Þ7z-74MkR`}qq\.C7nկ~~ϼ_\eYw=7|(f'4M?6/^qti탗Վ;^ TN|'ϗ7ɬArl6JӾ%h}!Zꭷn:u; ۛWPl1!\}ZZl}+EW/һneUD APԘ#֡ X!f0 E|Q6Ѩ-. ZT ە%!/9(Ud1A f2!|NL@;b!)%ETjIhRr0IQ{p2rHd(tl.LONA,S˴ +Sss 9f&/~?,Q߱>+]{5}OhVf#$5ȠFBu]I- ;7Q4[ziUZQ_^[Ш[O?BYsF:8F`xD*y" Ȝ#4CIu418{B#C.>}[n^1uMr]tFӴDXt-j,YAW-g %= DSbp$rFޞ6P!BBJX1<\[:GQ %% IDATcJLc1`Xݸm*PTjՈeI5(R-@ҭ嚎aHMZPA'hpc CgaAar )L4NV;w:Bv7nܘN}͛7"&&&&''?ϵHnƸs./]B}Qood>{c=wUuؾ}v6/<8p駟>q'>2kv1m(g-im˹sBy4/nڴiuV߶qqoԶUOLL }{&ŋO>M7v/+c=ǽl|o~ W+;U;k׺++^<+/uuiK6o-lyNj 2bӀ0΢w\9\[TX qP`~z%) !vl98,<"UF++vh>XJsh* 5%3pZJca_*iVkD'^ O$#u+YtXօp!f" ϵAek>sz#w@}'>q>~ 64{:6u(+Ņ_KE=jCFfpCT2cU螝}ڥ$YĐ籬(axċ)i[vs{nK'<}d,{$Uqy3$*p~ڭ<ǧWKQ-;+^Ӝ;YOdR4+-0N?Y- 29=e9-EWʋK\&A(ÃCC9BJ cJh|Im?%"yNA)YNڱp$Z1݇+S#]2NLLs=jٳ,A`Y!dmnСCLR/&|>f͚.#Wm]@AO Kw,FxGַhÆ 6m|Rˑo'8sL`^^^>v֭[Wak6>K_mz{{{{{5MWFK/-,,\UTDZmR$z6Zih{zhx㍿dclnn.U.EhŶ۷C\Rp,˗Qǯ[]o0;Q.j7_ 5/q{ySVUE!G8HƸR D.E=/h5=eV2=H 8(гEnXKjߚ啫חPؼ ]̤H~ЍctXӴ< x5 iyܨ/$~lR8dC[2urkaޙU,X #΁vlg>죄lw_)W 9N=V-'OWgNg{,<!Q֝zP5ة.:y1X*XF`WWKh<@ɱ٣&zZjJ(3C_:^P< E!q&fj$C7mرDWRBA:rvZKZn>lenըJPZxE{#OӺXkܨ !r3a# ( |jB]QK7G9B<%d %F:41iUDN jIvĘknbYvDeA7VHP$ج d՗&'v$B$T9l?zezq8qhT9_b,KLFyُ~ܙÛk Z^CH4q|KGZ_eyM6~v̭}rfa xY@T_WD GdEܹ ">}:Z:kQު JU>(d B.7?sjCZQ/}itt_>yO>(ʻ~Hk```ڵO?-ܢhZ=p*Yz722rĉ'O>fs͚5ԧlr/!$zW~ BNk}۽r\5k.Ь>P;۾ul;P߅; _ĪBdRjXH81jBlƌ? r7wsyzeFNTܦH!4,D)#zY˕b.΋J6^@(?nơƋ,p~VWlruD3i3-4T8c떆>ϼpG}Ûݷ{J-?wv[+}P@+ Z+u ob){{p')8)k5l*tLiY1-D{Ih꾋+;A2+>}q:P$_1ru8sZMC"\0/d6-(jU/,V58)6[3?mSΏ]wUu9QPPi7BJa@C F(#!q>pI@xHdF/6q㞵XXK;ojDxǎ ՠR3$-#(&piؽsZb-2>jі rEFrFRzTJpz>ES] KfնUzqI}dNsf܁,?=ME`-w.>2 ɻ70g7@%n\r ch$A$49ժ\cVҵicce%p̚5<WG^Yx^0רU,iGDE L3w|kakQ>(L&gffz{{x"hce0ۖù8fmhAd.wwxxx5f~̪Ygs=Hn~Qo˿<00044tm}#)6XQ.[ne2oEyNIdY.J|f.ٶmYe}}x[p~cGrC0Fg^
    xFH:ul9{)bԄ< P$Nd<&o9g:he0Ifݜ7})f7\Mv3!**j4[٬Z0 t[N}9/;\ZhJּհHΝffhF7tj,3]uKO8:BrA3Ϥs}³zkO <#1A8!_ u9)m_b ̥R1b,`aBXFX0~kX%QZ6"( 9Med-*ZOw1Ipu`ִ}OJpqyy "9$CuR8aE]M%T>PQԙ%N=7Fra︽]aʯz݂}=N$3?c1Y 'RXi:R  Hrrj7AƑP*s@?[( ݱ,ګq0_!̜?8:Υ;lڮYUݲC9rL<&vT=T߹<۷}TtW.6ta\Oej+#Xl݂vm\pv-,Ji cn5TKLGg}~ ⛁8T m)8(ͪ FV2׮]J`?گڕ6Wwu{֭[N/M֭[J;vȑm?NLL|] :\j}[*m^lŋZ=4u066h4.uL[ts-Wڸqc=V(V2!dtt!6kѷ:?ny0T_`:S)-M]}IV"2QZbjmHNжX^T oGRp a -pގY !"[bYMHǏag:L4^DؙZYn,, MW7=$DΡH %u9rpVm^x-0z{&Y֢A`C5l:ȕ'/o}ǹGui} 0nt"uׇ?mMY |T:OˋURtB+un xjyY2u\\X?{vLQ Xr{zV+L("E KBX+;|afzq[-RqkJZp 10Ī8V֚+NjBom9} :y( 1hq[oA`أ@ jSv6FH8"cժ2/P,Zw%T {NV8쨪/ƬPf0q`yj_ۇ(f/QTġJE\^Rrs3six"o~ö\τhNE S^Xɂk8r9"*UW KQhH¡Z aj‘vڶtzz? /yfSў鉋[6.O7+cp,& \h!qrHvnV}Yff fn@xn֚:9Hbn]wq^_\QnЬY̧0 9pڐ$Ë_ܺ~O8GL(O.4p|wZn??pvRG.l7-S1/?xj9%ʙ-ĺr2?SPDx$6!UK YghL5mpaCxs~âi\HW c3b}἞O&+ pd$RF$ڲ#p b\|:Xe 7m+lyNx4IۺA.i8z?G*cq4Q9@ģD`*aq|JP2RxZк奪9>aSSg9W9p|DBe~ >mH"C<<"Dûwý.LIP=hY.Ϩ7 C!5AZ.7ΡP,Z U}ѶΝڳƕBdaGqTjEդ=;,LgW85(2m@D**vHVgwenӺ /M8@ _>>mݸcvؼ~a;^uሿqx}_jvem-%D_"BlÖJ[N ۸̫G [~0Dcaйn-D#t dvm\0޸ evday;p<͝BVkmM^KeuW}>tWQ2oҦWzKk N^о}u?vۥ#ڵk'Nvm3XXXwcǎ׷}NFGGz={l{lٵkW:馛fggyrrb/BO䭐v@^9?==}EQ|?uc쳟l?޻w=DbϞ=שǾo_>F|AJ?˖Lo6oݽy~҅Yx]TX #JY[.-D\"uH3 j*jA{ݿۿп#OC t׋`@WյhX .-ڴnlߟFj19IgYpܑ$-ߟUܩQ>b R}5pd[}{]O7Z>vju~MgIע !pӊwF0U%":Վ耬/xWu!,3 aP,oaad}*XE9C@tkMB$I&@RZ-X⨨65[~S$^3(P.KݑM[OţHuiATx7-ݮIH _ j3i1"Yg$rP*][9+zQo$+MIZ E$w]m5&a$I]R\VbL <}+eTx$((,v'4"+,) g^%HdBjtj -)?3vtqp^mb|"_U]~V a"4c1 T"p zZ$B9^KC"/飤8ˇi]y8d8L#GتB@rKsºx>kCw1ݮv3jS龑RlAL_C Dx(d$,^l BW;SͰ&+rDґA,+Bui /)BY$C(,pZ sDS5u 4[|VAǤ*0NN+̞.MV5fOl_d\:s,@)utDNϝ:tc」-3}>9ݜ_ί^RDB"43 kXxM= 0l8BcrR@B%RT^U95&X9{})Ck44ƀ1GL1cpay(O֣f؈b5;>Zjgu xE|Uvo>ɓu'R+/\`PWG#45;h@AY]^,%LBS$KZg^d`AeSL.jɝ䥈^4cʕ(j~ ϋ\ꊖ<pPE/SDL&$Y'[?6z![=4B2_XRA_U%NIR$YbY9vcm$*08Wgnя>{6c󊢼}|?A4mppoX~QOaQK+[^e{܆X._t>򘚦w}{lOq m wy'O=w]JÇW%{Bv_>DQ$=3==>ͣ6ZfS3g?Xݶ51,&P $K r_Ph3PJ*J^+V642~4p"uWv[|!qJLP{d7nN&3'RcnF#F© oî\ܺ_LGnrAKҵzzb pTy?oP4"2jfkAH>BwX0~ s+KT֢2`qo" p0 ^>"<$Z=ѹv;Q*rz@7rXd*ڑ #Z^yyKxnVV$)CQpw8C fYtEq!1f ,VQy6x&nO$U5B/䨌:F\}jݶ Vcđ#a9HcM+rvZMl˲N\}KͳSG}&.zy+|Jn >][YYf`ZmtAy,ڬ{Rz[Zف9ϊ;T20ȔXrBfI,[=e,3m|Ks-ut(7,gg= |YE9d*1L'쳀C}4tj2Nw-ô{Ma Jfˊ(YTtN #3Yr!^L3%]r/Al]vmF# CYD_Fw}K^MB'OX)zA>sc˛yUf~ev&O)ŞɈ404l,/UlҦ:r1mO!u;3b ÕΙm3'_04:v;3󒢥wMO©TL_:jm!hQoaffdYL~eX7 +s|XtL([ A/eƔ ZVc32Zɇg.>=~~qIUYbb F)>B::9/)T˕$(ݝ/_7D aԝfWnZfguE8Y04 (Ie€+kS)Yu\;x݌Œgfz-cho9.՜vcRE 8n"ɥÀshuv0[ 0RD&;ȢڰW^W $d(ӊ(t Dl6흵=qRа!%Z~W˨;w[ep6ؿkWW8(ǻUKs[6q9NeX@r,,REƮ7#`Ȋ)ebMfi2 b8j徢cp JMJkBu'Q loxt) ͞3y23u !BfO?ϭ~2 GfիWWVVラU@GI/]e{_=PXMc$I{4?oNE$$8[l91-WB2*Ҙ,CdP0}3l}?0481e:Õ21u<=-c37Q8:vkTځ׌~;Bb&AF5};9yX ?t;hOMu"<ܳy<DB8@aǡ,0NSꦑjj산}c%/L L`28*t⥨׍`0Y ѓoٷaj &fPmW.Ԝޭ.U;;' YXrXFB5FOv3WI8d%#qte<KdՄ^(aDv. #N%rB CQ5Y1 !n~5>ҟ!DWܭĜ@PqT;bVHۻO0 DDݚK#nFÉ`aZA豤ttN 9C|DC9IXqvjd^54ng#rZҒ"-ؔey1e'zq[IA#?YIe5)=FNꮩY~h|0K]S]p{>He&#EBA`Y+ Pe nӵ{1[x1bӶ9edMe_\DQs#^u%!21 YDfP)_X4l񥌰U./לe߹{Wlw،8׵/_>əё~!M*hAYQzM(垟U41[WɴY(F}Վu%2d"&!Hv A7Łx|^;ogRtR8RH+> Yv%3Zwݍ -0;~5ɩ&'Y.O:'C[,u-+wϳrpzVRe/$oQ"(,𣘐P'<ԱaM DAfDL,0DBD!C}%a*@!?H0 # SbH ' 8 @a]=|lXtDy z̙3/\.oeYq|>vO:533:5˟'$5WuE"~”mvVڽAv W(BtI>}ѹ 'tx=5F@5$O?A?=\g._[[) Or" pksZ{moo>7F_}K>K#c>d>://l=W>\c赛 Jj4'J>OXXUtI}_B%Y IDATOu^?INrBJ(gb^)D!D!nFd]gX! ϝyVn_T8"/n]09X*banu瑳OLeSR$v.|1wync)JŔP4Ⱦ2Np,a_T $݊C0en{t-DLƖgC0HG,Hl`8&Ƨ*V}%EU8DDKdY=M&Q^;2i1E" EFlqPT& CIBxQmxZ]6 fןl$rUwӳ dv= 3VX 8+I)^Ͳ"dyBQ `*UL}Qd-dNggknQ%* &sl[[˶آR0pWq=~hR~ :xm#cNSY8++;xۤkuq غr0H=Cai"DH4EB<=<!-=9RJ* J &RJ0J^)!euhL 08u7D8އqN٘9&-o[GX[[cfnn?uQJ_SB0 HiՖ^$ӗ/ͷTgY{<؇sO]?qmYz+e[[o^/Qh|2we6<#s=d6]:q-V|hUKƢ-'ʒ踻}sl?+'ȵo|S>wٳVlb*)˲U]ȰA"kmڄVgv]Am9C"be  10(X8EJ-F6,'b d%w +q9  Wɬ_ʤcqJ1cGfͥzwэ gtԽK< "6i`8(#8"Pe( T)[c0*J,c;I Dzb:p׳:U8RVyf}ӥqrR`|bo{gD>95xyl.{"EɄuK v3*Cy?fO NgCmmMfT " 1⳧{ )1ܿu'=%H*QDŁc~|ք,!,Q܍|nj.I_#pEDd*Qiw7Z ݶ|-|:QXťK`Օt.!l6^ذ\Z] -LCc789u'}[;ϟz[ns_/f'>?~C=711Cx\.|/?) C9rԑr)J|ܡ#)]|⡧GVJ) ywhN{rlZ۞=?˿O?{=p_±#ނ%?|=?wd߾]rq[8W4Uy'JbºifsL^͠n_bP=s!Hb;fa]M?@Ʋ)d-&`}GesˈF١ @"Yʲ, !,X"va0aB tv)$cc1L1B! Mc*(s⹮eYQRJyKsɍF#N=թzW@zK.xEѣGy?{lGyIw?OWmiE.yZ" J/=qEB794)wdtf:_$0@ p|l[N;35Ud}fu*gpuMw8v 76+OiBXgZJt` Wv瓏$}]ێH ܬJRMU"4 ,<%m%kJgBVI^v; Đ2N)Njj7C_k4ۀۓUYDC[Oi <Է"ñD\&Cg^+vP׿bQCbݧPkNc9~~ݓ_>~w$Mp^r ҋ("C(,b'r=ͩ%WsdԱT8ZoR\fP2TRT%1q 1i3EVPs, ivR,\h*P7NRRWV@ C bJh~ȠT*aPtz+R)=kO pK銠,Br< a CǽEIe+ctd qH|k_78Յzۛvd̵Gn<^Z?oƦe d5'YY$x-Te+>`-H1t7moaH XI(9VuYIs !l:ubz@.nz,B8CqXvo9<0gRu&$1$#qE( &qBb&R*JRP80!+,z9fQvT*mzl_V_HZNLLH$^|!RA콵,kL"~W=7y<0͖Z]Avt0TxR,/ayu[=7*WښP@ΜY 44\Ŭ1qJTz`]V$R0q|nOgK˼q kvB{yAEuuX!PԬ@ ږc' "b,%mΆk7F;ڎi5/ TlxvOx2 c7ͺy$y{FnC)s٫KWF&&liKq4H('I;]qi; #^g6%RYˆe dy}ZFbPnӺqh9?Ɔn3pe70eXE]lؗJ|XP)S'x(y-atUEUya@t=cŵP\>8Rku;6*4`%aZJ䓢͏vHj:|葀R(EJgy E6*]Y~L q;nZMȱPGr0 %dʪX{b׉c v:`x2Aӡ|p[MÉA|8(jV1 ʠB Ķ7`ٝ[۸ k_yHQS7|Ɗu939A̤2^ |8DVE3)ot:P a*Ә@o>t7>ğ,]?DFJ_j\3q g|=>T5]uA8WRj"*!-ͷ^ 3;;{ȱ|/g7~ yV3|U7ؿ2g2zl8+0#} LaeiMD7uoQIԫۗ"Aqi@S*` YkX)43𐴴pcA3}o4}ҷ2 9r䵟+ zv{_/R ;~𺃟Fg;?8cY"z؍N煝c9q(=c@..[R8X aj.C\GYзxBL0qybתјnma8!>J0(H jIU+:v8tB"bZk8 ɧTo_'ynl*G,#X[Cp jqC5.&%X^&|$f,B^_\zj={]o\^Z@?>2YXyH"%Qv7 C6vĊ2R촆\h=?#2;juQQs yً|żZJĈORXV:[5*I^X[YḿIYcf.xdFr!bPR8(u9YԨXaCXfgmO  Y`K{1qwanb9J⺯ by~)PCh[12|1l21 Mb 3i3;;.^/0ɧd:"H6.t&qbV㠐E8QZWL.Si]}MS:n; 'h: 2 ZhYUG (t- *,'8zoFLH7{Q(cڬ]X;u J^sgiXTq .=pCZ`1^7n?O9ms<}U'W|. _{TEunXY$rQdz0 &|VXMp盻[+\8͆glP)%}MeЉIaԩG533su-//;òl&y>0'xT*f~c+ۿ ͮ|X[[#}#A9? >NOOPǰKYi:8;QɉJΎLIo $]6|8o?uj}L= ޷A+GRT]$lRSdp& ˈٝ XN o7o Ӊ2(IB;0< "iv &DĐD$ BU`6ؗofͩݷԬ#17[6āpQ'7hXJ3"bs@cus9QD1>uET61W'g&p[[s0Oˣ$X-&'B\_Xk8)%OmƚqEծWSI!#&d3" QV׈klBg$&(bDYVHiBt,!H2iZfN)]:#N勫Znoom[Uì5w#Ў?PS#NU "ʲө  {URBL vP1]ȹ~#ISjgS\ЉH^l^(a'!zS hӬWi(6BIX"0% x:tj /nٴ8cmldK{T]չg{FHBBYH $+qa}[6/3eYl_( y&if4=SutNN{?J;K`_ݫWsNvzѻ-}?a@tۉĕdV5݆ht3.V/w}{cv״+̱v7tMR2X(}B])9~J.zģA4COChAM3,)<RiBC$ Cax=hMb1]8:@0&A@0Ӎ;U> @{]bqK_]s͞+*oX ~CsB\mhEQ8jP‘d2WBEQ.w ^꫷οBO?G>_(L&WSou',//onn~_>pv\F4x8KCYZZ???еμ͒Fpv۫!41xrh$LV.)id~\UzWOsIrgzgBFbH\^Z1cڒ8. )jj¡lڬԪ.G2;m%0PXZ16k ﴌ@CqJknmG,/D( Scݪif}cWbx*%)fy<&@ÄvJ#L!l<4rQW,9EdXV4' C GARiF-9 H>@. ճukfm= 鈒*Jg}^k 'sCɕ#yh>|$ pZ3&K'{h7 06N"6R~9yW^os&vlLvlFFJFXivӣ^Xd=4$a0|BYg{FoYWby[bhښm>h4e%Sh*(Lh-SZ= p,9=5&*$\*o8kf3el!2,(2!():dY2@(,) @}@bA=O^l*yaX6!!!15fSGW<}zdnK׵Zh MO:jJ2//-]t㍹@iFH"kRCCL:>k|V;# U(4ZMMRBTjWr4tpyyoӍMDQûvojW}C4o_/L mߐ ϾlNz]wb/XUGyo2 ӿa~߸|oێF7mޞʛ(F\rI&zvSwauEQcjio߾g+|!Wh|K_ѵ\)|N R$B}i":p4zaí+CX۬,ksjA߫]P۪nP-iw99UT%mÔbQN(l;1 -FCMt< ib,$D"!qx٪D6UPAFC #ȇ iFYM0+ⳅKFQ cv{ɁPIȮ&2b pn4'sI|bza׶AY$ O1iZ[1"y sER<sIpޖUUvZlF;oiq oE& -Ql4.T=##tTG4$SiA.t܈Fx6ދfq6991>ɒ?}j(#xLHe˜ 3ױPk>i]_FdQbUXPCJZtcW$!x"?pӹ1mzOP%;^T X,n{@G㣣{&f77ZFLM70h~ Yc^W:99Y6k5jyXz ]#> ҘcVUXTklJbCWm)MQK df0((+E8 hKyI,U xJ^q@,eiՆRǠ" ,QVÎ ôRɬ$ XRЀZ-,ʄ؞n۳۱Ȥc9^7&@_I5= @ ՝L0! ` I_`B^olSxsJ<^ZXf;A77|sO}_|׻XyeY?rf'CɧrW~;EQ$AYw o~nx'aȼnky督s<2L'>Kt뭷>R)^_WBԩSEtM>hPx'Rԍ7o瓟d,CX,vWo}}Gy>=}G(رok}GY=x9'4M9sa,//a\|߯HJIJyQ?#m{6l6u]e9JhB8Fa0 CUп4zNQT.;Xx`Uzꘇ:Xhڦ72LXFDB題5,OU* wu8(zU \n=.jaɉrKc2.cA,+,3;M&"iX! -cyH)^1ᄍvl沉;ղ$sEvAx rI!Vv\ rHs*$kVjhzjb 7!aZEfJM5U \4]_=l0Čn腸 l!74ۋ]q>g4ݹ|&[][YڨR!Cr`7J5k;'&qb2kτSk72JNx4GI<#H JaoWbzUL. ' t2 @3,ljfviմ^Q3H6!K2+0 Q ťUI\QUCzmާJGU9!t904at6#ҖV(92AS! hS]F ^1IC@NjSqW+ .)zNJUs}k.foׅ~l| d;vcM[_^\u%!DʀE05;'.8c>K 8QvBL$S52+R{f,r@M0@<,~TqSDמ(N6:<rct$k.]Ίa6"aUضz>{rwX!͍NlŇ)I2߬7Fj EP/XX^oxٙ+=­VdXxNa_ E6.0Qi ҼH֛ -Av[Q4^Pin+I$^]Qݨln!9./ȥtc*€* <50ݎC]>y빈D f^vQBgXbˡ a 1`?P`? 8 kctkۙ1I 'xj%!Bxw̋ݷmfE 䤡iZ&(j+{ѽ{i Ҵ(ǎt9y{ZzDztZ}g=m"T*rK6uX,8qwwom۩j}Wh~.⭷ZTd{/a>sr,ˎq1 ð,wc>0 #G{b}o~N˿ˍRwoi4 /` ??p @={|̓@On{jUU/Sx^|^Ga&^ve7|3{?O̼}ov"{oT<!g/ oRʽ{̙T*K/gy뭷s=G,+\wu}{i~ꩧFAQ>ᷜkyǎW*LW"EQ~w]T:???~B855O벝?77gP__I$y׿uY |39`dr6WϬؗr%{֗DOCI+Nf^uc:̖O?#Lhm MB2bltM"DXkCSyTm7'fÚ y)d<\>h46uEN >2 5 iպf%$a[F ÙZy4"b5!qEEra \DUTk%RiBڶ p.$%q=xf"q}Qt+ժ*gw17hZ*hy=LL&9N2c@ iCHSfKJݞڞ(9>!l\ ]ڄc}=$^"3o)`6!b9a@O47;:kǎutVꁩ4{OfTZǓ9[ܪaݪzaѨHbTR@H9a6Bd$ TOz"HdӦxf 8^πD9ZH<1o64|D= ;#RFbTcO˥\hJͤMSB:vM'6ut!hDXSHDݭ(\NĮN`6m1P+kJcNphus - `Ym4E5w6;6[=#q=3o\(=,44K@ٖ,X]dS{ q[v|T,+nwte!'s.^RE)-FcevEIę`^M_zۓD0ݵ2Bۉ'1o& IJ|B\yX "w=!.(kL'gijC)ar2{]k85WjȡX_0;$ p(ߑ_Q^8lW`*{=iWcYށ$f]Œ QQ-Q`weCBDAg'F (cy^ DBIc;wx8gSfNY)H0!a-}qNv?\w5P4=~?-c;vDӧ_}=W^UɁE߹s5\s'x迷 &$01~㎡}cXRs=_W>\Cw>я'VL&!tС|0|3۞c4'xꫯ?LtTO~/|a[Y<ᄏV]s5###fm:tLߥP.ݻw?xvquuuȑ#_}>}k_'?IEQ!n?I !'N?H$r뭷iy景v@?>K0o }3}w#roh4;H$&#-ӟ+7tS6>bo]w>=z&~$^?n7L?z~=ccc6ygT4>ԪǏ<_7N1Ia{ГaxU)]u?yVtY6X8cUvn^z;ouSO?W(dX.j">!UfZ:.hzdl"Ɲ7H\#$z>7Z= :6fYc6l݀h" "5Bl1R$$>DiM<#y6hַ\Ϗe r,خYv8/H'y{];/<ŗ~WFmomL"c[Us^|,9ezh&QN,$p{k-*?S?*s'.CɐUѣ}[ƀ5,5hG'Y*v{6i6xrmç.6 ;1*`cp2χb ܖ$Mm9˭jzzŋ/uC{fgLh hhPl3{ՁSo';J|,o%9=8('c֏~ 51i\~ivs{y2Ӭ-9UcUeY-2tӀ!o 4GcnR꾃Ma,SZ|E 812Ka@``BCVV)Q!%Sz'0ta Fv~c@ЏM!(DQhsEш((!@؝kV! |-`zk}@39}FFHafFG)s{<?yoҗؾ}¡>_?z uQԭ{!#w#Wҗ@~5z.B}|9u@ox<~-<UW%I۶eY_թ>RU[n鿭?i1?O6|#CCCvW]uUr>vx6Max<!0}}/מ={2 T*<Bpr|]w |_ì{NLLNLLNAe98pgKKKԧ>\uСC_DAzgy~W^yeݻwjj_O~oR/}P(ݿeǎ馛nm}022wCp c|\ץy饗X?](\rI &uoZwr?T*ݻw'ɻ{SSS7///o{~MLL|_w;::/|!L[;smmm޽R̷h9rDّ<,~.α.f.M_ƶ)(_~yi޽N;vٳgkkkoY?b&ńbٔenVY%xmF6? %S 4rNXM]uxyh{ft::45;>r啊㟾߲mSAQh|zvbdkEjnsꝭv,kt>J B;;ě6}ʧ]ؕ])-چ&Øok+D.*b@F-U_\(9)VJ%^պ+gVSo*Fb5^g^<veCY5!!dZ!D;>\fl>a-o֗ 3fUnmģ$ΤîT\d4q 7kujCWU15|ܨ׻VEd@a^!zRqn׳-B)6 D\Vc%Yz! r[H.$tA/J:9O횙2L2szhIqħF%^0nJl 0KK֙L.E8'NebO:J)汶Vy%94<8JkZa۶bˆ2嵭: ^8ɲT>̈4m.n6V{Jt`a2y~3=\pcuC ݃oʑ`i+F>'y+i =`3Ȏr{v\\2ڭhZ65hHS⣎ݢxf(?<| 7F:.H'ɀ(-!pqLӬhpDi$ @^ 嘦 J7KGwFǧ09 (Dc*ul |G!H4F(>VLP?7>b! cA8 8 01!O$9h[`dumlh  7`u,Bp;k nΝ;|~;߮]EgN<ǒ$#ycll,˽yx_}̈́r;;}wwuھ}W^lE.{{6硇KS? /رcvκaA= \s5K/o<333}hBB=>A|v.&J$333= 7GŇwT*ٳ短6sb[[\op-;!~H^6KәT눠7W䈰uy׶渘Bis5*EZIk١gE4S3Α3O>?~,U ѣ ג遍3ZA#a8ilO_~ݵ=wc0]Jmف4jEhҹV!AtLC?z"$SٜiX( L(`Un[/@q#ekqly! isfj:1{y&%E;vczK׫ ;80Ji'-wƤʮ]|CcVÞ,q ŇVy]dԘ2P/;3{\RIje>v^hZ}(*@]Y?fv⫧ZT*!X6G3DO=^ٿ33ӑu\Dè8/o/̕Jxt} `HTqj4Rd!>< ηٸ5ÞbI= B6Cb$0Nh/ #ifn5o%ydT@ D05-d1"}Wl@a Bt]X*qY >롽 A聻EEj"4K|E"V]$  o˿ _c|)YYۄ]va޽{7 _sW*SNAFcitL LMMs=}gv.Fo2sΑG}.bY2??_,?!;;e2wɓ'BJѣg_4 B1X TJD"qv9ui~|qM'$I:=c:5j yѻn,U#t^[&8J}wOp̺Ɣzz'Jb5il4xV-*;Sh^P\k(@tl8t~eoA<36pp1^5Z*{AanH!FT$zZ%p˺sY> jE%%BW6 xxQY]XV,յx"Szn[̎TNZmWuY=bkx%F~`{ iRS2 FdžJ5I$5S  ;n-tˊAR/6ՈU{vV[֮4*JH)T\+::;S]j<}i y;H#]srNje>kWa*ӋkKcyzLw{ykwbV R^.WкKFմu-.t3?\QGPʸ;=z VVsCY7z}jwg&FkRz06] DSt pD8D91꼰pd^>ee˩׭!E@l֠dҦ~pivlmEu"3XdXpyq8>$&), 'ť34  d6OS$dPP`1<}\ϴ (L9]ͷ@jXq^HVn:[MoDf"F]712E|ަiBA"L2W7꥕BA{}1`}L^ c_g1c!c $}+qm?em܇gد2@eBbi^ n' Q(&0KVt"Y>Y_dw:Aij[aNq[X`۶eY wyZ:0 }!$}ӟ?C"+8߾Pk }|>?33|}s׾5e/ҷzu 8;|9y>(l *3EE]@Pqa s .\a[Bs9{~l $Yd)W{Oկ~/Jkž Rm&M9 EymYxF#XyU#@`ڣl*UVCʌQ8r L.L=/K"!|:G2\]{۫iJ)7oQKy(""Ϝk;+ Sd-VKÈ7/ QXfmZ$D q@+rEMi > yQM]J2;->?Z(Łrb$@>wuxaٺ8D19&\;/lZá$T)"g9#kHBqA5KgUS*Fh۔w`? tqep7?}[;}]bNGn( íL:~M‰,D(M˿ڳ3$SrzrR_p(=/%~F ͗km6oS:4̭fK;;|o._XQ]4'[h$Y 2#' Hak) Zɗˈ!:@RI:Y\&p2b9eQbQ0Wt_Kn uG/nRz:MRZ㺣86pr$w:.ת\#4I@`P@!]ե/\91ÓSY5[n7r#?Hb p cj:x!"^AO B"y^a èBM ’"1iq\2Ͽp3*aa޲tлRMd__k0ɹVn4?~ϥfuqgB-hֻk물DŽ^@3cf_JK˵zzw޽Z؉xN`dM\(J٢KbVV^-.6"u}5{-'6-/]l M{dk+ CHc̥bҊ㵱^5AbQgnu:qto5Z0QFTρDTgHp8N8h\ IDAT3wu㔜ӅBG=l-#Rc ”N@(O -.$ QkS' RS}{R$IB%Iyc3=>W36^.t%)ݘKuFwsa1{m"[X~A# qQBaB@8BxJ(. qI6}O@`!jY|_qco!6)+^D7 x~J_MzV]~^g?Ç?#'O_[[tC=^?~|kkK=SO=O||w~w^W42-LIa^.h (Jx}k9H>-:u$h`ؖG"3ij%UKt:2á;y2]839N}s5''}ol;b*yq%]Gȡ'h[cCk~&N9HrĂ d! N$WDtxaohQB t,WkvѥZbrhkWv6&&NLF%^k<`GzI̋( q|"!vetI V+9i ()Kũkϼh?_)U"qnkC|f{nZJgK7[AYUX$J\NzhȪ(zZVd LQ!tkk[۽^{ggS2Db/_[z3ZFes"ϥrzJڸJNQ$L@=⚉$kю/\v"Q,F!CDKפ4FÁ %E BSz۶e1ȱ}`ߞw73O' -?_.NU^h~0Pbyr]^]ćF ǩ1 ,E99MΕwNXiP+[ݍQh RDQ IZR\BE( eB gHd˰zqsb&T Ʌkۃk1N0si%iy*Bu|_ݎoUgZCWm$r蒰oFJeJ[g/cƋi+Tk?'A&3;_GmS N\m Y>ͩ\eTk;gO7`0O6!k o\;cڭMwDcpc`#F&Jⴢc86(gr U&Gy:h~?z͝%$VI1ʹkHЧ| =I{3~=z˱#Nkk$Q<NTxe.ONL58 #yN$AV.J:̥+j5_aJ4#s1<``3%aB F:SBɁF;ѴWVVW1B]p 2O$&NLH N=okB811ϚÒaqߤvVyl6dʌUh4z衇>8q->O&;vU]wu|3>.c<3ah<7'pvvv[;|iBBLBB,ˁpR$+x},HommQ$TPKQBɪ3@b>77^|qݡZZSQNS_]pa#VȔL,"jnc04fR1i|'r6oA|Y,wqox$k"0皲ȱi8cIX%3Yu6Ftj4ٔ(*""",]>UN=su=@`@ - ᴨ)$׵ 836hOfG2O}Z 5ށ՟|-P4>|驍;;k_}1 qwĝBمK/ zJIM ={vԘxma Q~%Q{mFa"ϋE@8)+"Lf\/8pbv o#!=.Us8,uDЋܭjHr"B&$%FODBJh1ܞ6;Av'c(Ÿ6UfG \#C<~//Kъs\>UsBbn{ȳ!KPࠆEQā+  )U/Jnco`b"/n,tLԍĭx-F4X=[EKzCEMB ^^,;\^qlQsk5Ȣ8SЈHR>u`SI6ՄsfS:i8՘ 9߰w|K<:G XP7UWi<-yU$+)spcB76]UU @B@szZhqTD~O Ļ?E_%z N+~wk&Gʾ}wqo7WaWzMr7O;YYx≅UU%{>B{E񩧞Z\\eUvOAlLU33Β~3 ܹ$QĐ "zEc7p  2Tt2p\SeYңbj=2ȝV/~1!r/ M햛D!q3Φ\zZ=WWnGe5Uļe9A>HSp ENh&/X.,h<{5 N'1Ns(*uΏ31$iǑjM۬ǫu66}-x2NTt v1RD, 82|6 0d'OZvҥӧOOLL`w a8OO\rOO>o%\~}{{{nnZ~'jPxe={LOO _fw򗿼811*0{l8qb}؏#:[ٜJkAʥao b`$B buveMẺJmy듩X5H@noSee |IKqauZ=bO6*E_XKgo4%Jׯzߖ(E+;Z΍ݴw|6egL&#Iʎ@@c^81rv B6)6T : y" $QKeUH\^]$ȦU 0!F t3JQמxBILQ8`3ɞRc K7V]["b? j6uGo`qΪL -@YBiA{?2ْsE5>DQadn!yۧd$?|끣?跾}rr.S0p$Nxfs"pG)J"P`CIp <Ǥ*乣ju1VtۛkkҜᏌ|GO O!u;==Կu"Ub c$  bӞKe'lߺY֡Oϥ:]sRAV~lck=/_9ڸbvm. ʗ>Fޖ [OSXN7];2sY/6=-}o@YVbz!Fz)UQĴhwr/--a-LΠ05WtFs;kZafe0Y1gmN&;7{x25 Z }ӄ$.ejoN`(rƕr1YRR$Sͫ;x?y9 8Nkeu !V'Kn ыpqoum4M*OōƖͫZ)@}m˺C?wߏ][k{:yϏ%J~" JJ_:žYs)`!B h+q˜8 D0@3NPB MR:m$+8C_ag @ИVކdkkgW)pOM4w<׍s2VTɟ|!4xiCRXk eRo֌Nv8+a&<:߷E>>裪v~|7A-B>T*:v?7hjj77/|sjBl6 o oٟa(qw:~4UU^rellfMvڗb[DzVu==ٍL<}㸯}kO=TPy` I'?wN}} ?ӌ'v%D,ˊwwwLOO?_ן~iQEQ'>-s/gDɎ}in*+JENKbD 'hZ:|x̵(BZsFǏst0Sqvjnn{i8sA{sr04%1l~jP09BLNdE,dC=;zmCe7$YmȾ._9v`;T(㣑o}תApԫGX'Szy14N%KDx? @1Hpjcr /H SnAe< ?' JHz QD"D;ݲټ|\r< xn)WLɢpgv;~ϬL'g߉#\npl$.!a`)hC1,0 "ClZC^(\vY/dbpS0 q=+gELuVk#1A&.%.~S*\Sb.۽ a竁"o&nJH<*q$בMJ 4pd(< Bʀ0Y);7; Kiaf|j{/\CBQm/b;;k5̅9Ig~7QF\, vZZ)i)ō is;UU! xZEEm)&9?X6&T05jsJf$nb 8x`~yS+/к³\k|BZ} t↭VKSْG׵;E6nw#x*BWVUaITR>1F$V()V&NuAg(8{[v勍ċ#t;'pK(bjPcmDEQXT$f4!Wchs~GĻP'!x{5 w_w]{._8BwȢ(zBGBJ!a] ^M3\={6|B%7гe0ߞn^s+'?ׯ_z4bgϞWfBOlw+(kk<Ͽ j??x%6 `0EqrrZNMMDԧ>_e{a,ymaᮻ ʯJ&幹ZkT*|;\___[[X,NMMjc)~ f47Bx~_w>wxloo#oje~wy󪪾zGcݷ)- 6{&dy |77Rfυ Fp'd$7TZK)$ZHFR$idQ"1sLOQR$‘@c8--'^o9vIϾ|SaAʦ%-mzC4=&88?$ rQZFAbxq0^ۡ%+:2Lr658p =ױf˵BYd٦:jR;ohǧKO`f0 4Tgz97Y! mgA,zAЮO,ÿlֹhīFoaE ,,x⑩1ڑ5#Cqkm`BYΦ|)cx^1 Ncg|y\Sխ+㳳GhBc̦^q ^m/Eαũ]PsXEN5mlDFjmmeiióSObدMJ*Ï:7Bۉ&*yp3qPoN\\ȏ7&] Z;9w<M#=Ff!K`:22-iǵl-%?{K^h31[ kp@%jKqA` `!BD@0BSJ R19! ` !!2(@vㅉ{{vC!5T]hBo~5v$y]8oRHwwj7v]_vvv^+ ŗZ_&} aHCqkfiZ8Y~f^xSOm!Da;o@~_`1Z~|y0rÇw.UEmvґד-/b!d2G=rM`";Aسg_WN˗y?~ku:tw^g;?ٙם݄f_w~!,Ht2-޻wwfEQ|7XoصiLYe 7jsMfo@^Bhx2‚DDhhd B63Ik+7nfD=*4!=k3W,k󽾸nFg7{Gov;NB0>ì&+;//X??6b Fh61BXBl= ]gS :&ʇHSIy<۝pmfg b!Gag{iYm]3vM49IP":hf<)norr.?ҩ痗F%ʋ葹{yo"c1&RK 0m={\" G&tưܕzX* cϜвc?LFu؃v-"߾~ޙI' O]\c2JcQ]k$r!(8&q`Ep8\ B'm7ֶ{XATB4[~62Zcchc l*hrڦ(1Mm]rCT A@2/jgͮ3MdM* YTTH_sMS`' q|!QPƍfbq~fJbi&RF911ww#'c!CA#z훙AL@.NMqi SJnB$$I00?o /Їvn]$ɓo#ַ>O~\-ְqh|ԧ>Uo_Յ$I ~'^*wq9E)OՄo#RwFgX/bCV5==noGQ?7G&JfRrYG׮]Jx߾û.W+2_-0 娀n !;zc [O߂^;8K 0/ԡy݇JJ>+At.!MgH'1Xżar PCX(a,KH $ XΈO$=j?l " GP76laKgU ޵JZ|inf}UntR!xʱ5*몖$juCdY0S<C? ';FK9. l$TX@Gf,;&'0Fɒ",?ni$!$fsyKaJe3WrBZ7D`3g.l֎+"V;f#˒ыB!d*$R`]7/t ͮ\'y0#i/"i5I$:7 ,`,=r"8Kq}Yu!)R0@v= v"L8Z*=]_rJ!f;mm5{] әkGh66[fA\ >| KB(/g2|5 \J#K _:5NE^c! $9,r0}FCYD+v/VR_ڴ|-Phd bi:-rQȣ3hYŨ,J3WWPf$Gp-<؃ƼBӪ%kot+(!>%Ս7l|vižq((\;ҍHz}ʅs[/omٻi#iO}*㙙{o6Jڃwo~?,///h+^{IuMIj:BA6.)LOo|U _½[[H_fdGk'N<4>>_T ]O=m~ж{2'/isNq\xoCB?=Qp *T|4pͿQJ|n/Z~풵OAɫ 3Zzg<*@{駿9NߏI8C_=sf9!,JAb1đs JYqds$TVjG PӲ'u0I =erYh#$D^N8hqL]'4E ,߳K!# s"ږXGLڧA9(ƦA/5v[Ɗ~ &B?ɐ$b!&& )Q/AHG2^I5r/}p}aHamj_ٮ1:VVLi sY^$)' ,`G<+N;TˠJJ y,10!F̒$TZԡ9Ln$>XԨzF}#i,{g5̧'"$ "Z-&эmO6 LM"4X\T7n両 ˈHJyqqO](Eͫwa aluÔ{SzVOYcE^<C=(H stPv~Θ;)+X={uIuw6À*Aӵ^XyƟ[KMds:W/{o,uyf[ꭵWIUZlmdl0 6 b?` ?& qipŋ,۲,ɲ*UWo/_sQF@<7Ͻ| ^ڏ\u򭭂]S4F39!ـ+)H:SPQ{XonT#_RA+nn99xh^!@M|D#bg  ]/U-G"9g"-V38InOdӊl )0) ㉌FutؖH \?x5% (ʥ10t2S*^ABdxVeCUJEn<}|VɔM7Q/; 8b /P5 ĉ^ (@"C3Ϝ;wu/?̻CiLI]WZZRZ 8s~9s&ÍMUUqdDr6m~qSO% |駟vׯ_zo0B0 0~~ŋHg~gcg>cjگk{bh#Бtӏ,igצ[R%>??\\\U?Oի@<{;@ǣW_N?I]7?ǿ@~*ssx0CH.\3MW~WN>}7(L}/D/T k=jHB \ UD3Caf^8 !Pe(%(Ypꥨ;ET1h8z^>^*z*O--:8&qO6J$2 td+I5{X*>u.7):<쨊Z(Ԓ8F9@DM'HS `ƜQbV HPo<0J`$d1˱T_(g0|- %N?|T׮"ǽlt#gϝՂ _S9+Gߣןw]8z$g#%IsM0s'IH(,ZÜL~4)װm d + LUb#F*Щ3<Д%<O-lv X**t4;n\lUj;nOpEY.FQ/*_ohYMwy;wѲ  sO,%\-޸HlU (R9Dմ죜w )>b2'B545SJRDA"B bxSfjx:-eo{/q`2fuc~;Xipsί}}_ߍwK.*TRKfRiA y&94[Ē(̍ݮ*/DӃQЁgH빳3 v5| 6'W=6 ɯg>rgk|Yjhhs5Ҙ.Fu(A.+kK;+9`ؗ3v/E!&/=*)'5hXf Gnpsһseu8A3MMOM^2N-b$AFRYBm]`HekqxyE/Az.XH5^mڨ  M.cOr D˘8 . H@7=r.M fF2qUNrz:$džqw45tZk\ \[BsiY 8Q ,]قKpis7zY:P(6X98;o;T˵\!BL7wΟBtOT3nn<˒$5MSSnSsFs34p.ϼm}'|2I7o }s=]g۶s?s'Nx}M0;;я~ԶiY|pH)O~򓯾//.+}2t<=3$Rc}ݮez);%/A$naB//=- clu‰g]!I)m {_~( zݷ_e?c?R,>O??; o#85Cwiֻ3wB/꯾op0V1!R<0 v{a;;ږUNī3 s8!%"M3srE3B@SdMyXd"&c#8cZP<uB"vوfY.X6( ďA@ T2,lap$+lXM;d7Dc Y(YeA p%1p~ A Ӳ$!Uis\֋ 8 " :Ms]EלѰz#*>pWP q"0b E]Y-}G}]4g76_{.{ipSұlamX"斖׫G8#gz ϯ̃ʪ3ymoLiDɴd5-LAi")'D M.4fTT7%C .V+M;q+J\Y>OxL/l"jڲ~]StCo͵ θ,"|zM˖Ѹ;L;M`1R vY1dܙ:뇲]w$IT2EAϪq9A;fRgkUޏff{;  aG~tyJ4c8ٹfk^ziLOZ>j'!əiZF9痯߰ 0-V/wifzWom0}k'%D &qm{__~رcp '+<I|O8qkgm\y>B~7hJ'?I7IG1~衇߸l1~no.vA7`vv-+-o >[&?}rv㺣=XUB BC73!O M!`e7!t۝ٗqrm/m_co'>;Of;_ʽVHAӣ8SMS JdsCA5Q.00ПZ#ϩq* 6p<.I'P#U,cQl}/>XhYhf)qV(mcA#6 ' >ԓieT#䡋 H@*f*S-IO)8T ܴLp2-U+ djX?(AN~BFE麽tȩsɓ/tlVwtA{5S_ĀG {gfzdo~/$Tu=ե#kKCu$^FJ I|nIgkMHcX&t\^*D7Mύ|4ObTx.AT0tM2^0ZCnLq kxaͧO$eYq2_e_vu;S3J6Wغх[ՙjTA(USj}ܑ4/mIiAכ{^d pN#BJu>3 G< -3=r ^kA#bI+LM$1P &c*,sIB[78YjuӾ<Ys/fT/ygy6'_(j }֕0O_3(d}=o-CH@ύdgħ>?jL&cĴHOXlvDK6UvGԔL ALS,,cb^/uz0?%~V+ z:HHiUC 9۾u0LcڵB4*Wo\9URѸs1$4ZUUMTXӔ!!x4 &p2U5#(ѥ'xNH= t? <߯DW87nSjAw0k\owP$$탩@\y.Ni]+@Yv6K e~~ً͉ qV.`hJ a'HLuG:s)Y^2yXm8ݙlӢ.dJs2[~Q`TZ2p(Q`?r75yQ;Q.|UhJ e!0c55uFAfңJ9jG@D%`03n|psu^oE Mpר%Hy&q:" gF gϞO!p~U\; GJ)Š}m mg7c0 ܺCRkU,ަ;&tNns1{47*,j $#AeTp?xSMC6f楪WiI P옵d5NZN%\d( !-[{8LE+4f}Mb'zǯ9jKvAq^)Gۑgb9c"Ds >ol}\QD`< ۖųU.kr.,]qF^Eܶ@3v=0 8m`s?pBڍ;HtGw4Q(p )<3 À5hZ Xf1 ,kfz8Ñ.,M]*JJBRB[33tJ)m5 KYj2Q ȍ{ <}fkOǷl9U9*2xΒ4-ג$ZiB}v:Y $ eϬ!A2YyfIbWn贎0nnha(؟$OdIH!(j3s=ܳ/o;Y(OrxVjӀ%aPO9'fZn ԝ(5~7o}ӗC7⇫',&NS_7ŕrl0Kx$KY岚O~S jM※)1#f9U3]&&7^0/?7@l@iiQlË_䱅j d(JrA3l^}ζ̼`"IDjm]/#g/ >r} ɂ$`uS)7 7nTSG.Y yw:4Uxxq$am:`$yg@@4ISw[Ll%<"2M@Y4F_9 Mdf2tkss02z28 0\=JAke&=u!(IYLBIL$I0AaȢ,%W E3:s/,ZZN.fJdn RDb1)my"򈛆^%d1i`g|~>dQ땽7vvvٕ1S\tG(woхaJXݧs]ҿܻ*W"Aq7r%FA>jomP.0`XO%,i Bϡ2)K PYfҍ륅&( U4, ?l_zJϖv$Jl ,ݘ.Y rI)%Q0LR<8c?RkrseaPp,FcO\cɮVm._yƍ tXäb d8d4 %`Q0wG48r&m,ۖW"vS,SC(SzD<H@( ^G%`8%o%B0TUgZA %oh.v'ķc7~zĔMfL˂ƄY/  @ˆ#=TwaL Ms(KU9r5z' =ukw;N0]@s!Lˎ?NRiXvZ$/\Q(zQp4" -Iɑik/n\*V CI|6CH.W}+70@$Tʥ,f;OV޸,Y*:RX^#ۃ;x^X)T HQVDq8%ZWQhE&R{yҦE6 tSL0ؙv3_wgf]o\v]KJi2.voݬԛpt7^}SJן=vn& PO[ 7 ΧtѷFj!Y;}Gwݛ33 VA0 ""g{OvN3q<9X֌ԟ@ $I/A^4%.s7 rIRi[;7Ҕ2_zmPJKR UE~wam^ֈ7N:__+O}yC7!I*:`,m]\DTVΘ5+^!1. \+aPQS]5h} ;A߲ooU,8 Si~7ry>ceIpza<#1>%jEeBrQ%iBNI1qFz1x`:}k*Rhbf"y2sA'FRSi<]NF/}SV^(̩'_s:M YFE+ QR6{šY@ToXhR3M#Qʥ!-21r e1R4$T) ZY 2,Y` 'cjPrS1Y D`f+יѨoakw39L͋",vسϿX>d,qiQ}ni/<~\{9 AO ſ}_OXQLE5yi%B)T6nt$PtEMzӾUe36ҭ[TGгpgWWv8Ig9H Ufs ;~zeiIxe"?#X#ߋXu[T*WN~s/.TDqB31ϳz/|UY4zJ pa sPRbL,,mpHjv74(຦a`->1Kkݮpsgs+EL Ad8^N$ZiQ._Y"YxB+-6K{8 V>up9аBcaBˍW^/~u5ϝ^±3g_{Moni<2dFenxiMZىҜNɤ$RŃ>IJd3TSV[V.L+fT oont?HF \.InPR! Qgo 5̒޺n ՘] ϴjGe^^zi!i0elV[5p}gx9܇`5[3Ԕ W0 U* BJbu,S'Gz(\/ n) C)fs)DGY*R\,o\ 죴Vw}Ps ED$KJ1;tAwJIlbS*%P̢㸷Lw}?Is <6Q[BN}W}>g]ϰu{c;[]{g?ʠ3kpRY卛;[;Dt#ؾF?IpGwR )0TMY 9HWEAI`(Y#5U @es'Q0ZX^)G$1=o$$Z"B*9SwYJ1yks KćܬgWݛްBf?P8qr:_X{YAY >~XmP<\1_*$1g  p3b$väjөoNZ-V.](s> YR7;U (ȓqΥK'~ YpRzewdnrVQW9C[mGx ǯTw.MA$@L t&4q/W,5·{FUuDIeUU ř4UI3C7a5_;3u7p(b4 =8]i1PYdavw_B`uda޾|}shw""uw4eUVgj<fl=Jh\zyO. 9N-qxS5Yx,婀;]Bxtlwνs{s/jKV/ F2gΞ>:z, uCI ^;\il|va%M9YjSϡNrXLil1'Zx~qWUo{[ݒZZ,ɲl-`8,!$$,90_7o2ɜ3'a30!9C B°8-Y"HB dnm֭{Cʲ|G>iշ\cW{^p.8`vtICŌ{sϯ<f $1E:#Y^JHj9+AgǩAZEB9FɌCD ВC:˘d9ϤESe,Ht<8RaJfɴ72ORL嗵njT`陰1E( FDA]. Ql46LjJZSۦD %19wu\0s4Bc:9RCr(,R,b䤜LFnz*ɧ`BGHn\aN3*HkI& 1hLj4vsĜME]PW697]04Ŭf+U2]&ƐLqTB[q8Mz sl:, V.0<;4 HAfU<2HdBͨ(0^t:-]??znAτ(N#JQIV{*bJQLT*]*@c8Bt?u[\ /iü.NH'ReF-y##\8D3jK0 JI"a813%ΪM$ 3t*~sW}ޓյפ=M[.j#i#}a6f,(.9U\{d/vS'j^  BXa@$A @H!a^1X-9Ga^S@( /lP 1@N@-@ b_{忙h"rlJJH)Ȋ!00R sO!he@ ؋t*ODvƜylxTH%!ZCtjZ c!ZNGfZʠpFVE9ՐfiΪemSlLdQВ$!  `)9JNdD65Ӝ74O{ǧ>v- FpDۛoza۔oy![sDZ%r!E <䴘#Sy5fDN[[\!P2dJY 9QcIZTdO%DW4|fiIp]yM#cC68mѱuIc"8V)gd@c@4@X(PS#L3 u"Y#MgqFB*uNbQ"7ObhEcsM |p6MIF]FVs[7|INjyo}g~rg53eD,oOϟy|2d@EY+L@:pcH-:# ET*|lXP`!pO"cg\QX*P1gc%Yiuc$* ܱJԱ !gaDA*Nh0B U#sQ#$P"2Hd(0< b{Ѯݥ;fS94"Bŏ?(YŇH(QHQcLA~Eaf3M+^m|"* IcD$Ap8<:6^c|\Sk^tM6ήjj1/+OOϰ, !5E3皚d`Q$I)HSF#Z6W“~*tcIYԘo)[ (Pkd2%Ibqq`8{hei ~zzu:$yQB|2-("Y{'Bw2e㱱qTQViZf'A0LQ#2l$D C;r d2ih8lE?5bD"iⱘ NMFId(gK\(4 7S%J0A)0?˲Tʖc8.S+WLJfQE y?1v8Yō% F9Hss9ajz&/{6CF #3 ++Z VވNFG(:yޚc!e2B RI'"HRZ,!}SS3#9F!!'YF3>lDayoonC].W^$I=Ur!^yQ #u]詭z'&ROR|wdyn@`bJ$Ewfeꩮv ݽ5ՙ2… Y)=2Bi^;Mwvu*`1 M8_\TAQ]CP͛bի!!!h (X]2)-`鉉 a(2JB*jz^dt > $p YTTUm;~.AQFxzjz+vRYh60 Rqfkòi^E`4a^//*fbblh8-jCAH,#^V H3db՚ޯ7,D8ce𞝺$JٙyBh4)R0 (CVoD#4/P1Ō+ r1\p*n x(k@ϡƐ %IQF(-J(cZ$^exQd峧P$Q$Y0=& }S ,ViE)(R$c@!QB(x#$9],I(c 2ż(!xA&7 KYdQy~a1~N͐$cLyQ"!2/HD 1, EUD YY_ܲ34 33Yf]ȅɇUZ^w1EeAa{o(I JPLI$rl3槼EK)a7 -(!3U(#e TN\`rfg*rvFdzzbfUR" DIڝޱaYWf5 ݯ$WK?3 OOU#1~BiP :Ziߧ 275UBg,UO0@EI%9.ʈ\E`[\0d7Yu3YK I!TYX*YX"7JIq r0^B`ћ,!0;SA3̔A^$e #` !/ }Q##ds:Uo+#@[{4փH\!aD V@U)Ai+X˗ DDIR޽OOb*v+2j-t8!bRVVfrݗ7kVktb@ ou*g%T4 bωZe-; \#csV0jUC#Bv(o (Phf-*  ,C5G>y|MeNV`)lTl r;іwSZ&TVfԄHsjlB(P` (Z)ah,eC[-_Qy(R)5]vYq Xiy38:RU\es#Edo\͏466 \+G! (P# ET*I$iŶ1Bb<ϯ`S#먿 ,ycYvΝ,*Q;@ @ܕ`R M\t Ӣ%z|sShs@ke1ƉDaE3]VD"jcbYAXRZU뫿Z-!,XYB4MX,/GQ"1 1>{,B9 \E"˒웒$aie6iaȝYoK;'N,MDav8g@ M i\H}'Cj~[=tFS^qߣh (X]@8h4VɇvE$ H$:X!)i߿-bWao-Kiiimm-Mӄ&AӴ(O?ޫh2K~'4MB;~ñqFQGGGwލ:ydSSSNNNqk'# ,$IjnnH$BdbEr~ZEʤ$jytr'G=300 _>)'ظq#!o IDATd !(S{NM6궶X,|s#!6mڔ?六i!VI: T &N{AilD*U |XhGL1'aEK:ꯅY={X,Cm߾rxdo#į (X칭- //o_JeX>(0L$IR+%6z|'NT ݻwo*hfFbdj,+B6Y*J٥& ^>o հZd2FW FQ0̷_W ,X|pxx^bvZB|Cg ; c˒dщʭ[:;'z{=n{iDOӃzkc >Oio2v{/\裇zJ$scgMMd$e٘S!CgΌ;'3g^o2+@OĜ}RMT_|kkif_diifM414M_Db~k_|رLcټ{ʎpXXV_T"~mmW_mZWJ,q?z}ss3p/822288{ne+**jkkccc naD"qWTTTg3g&IJKK:z=y<577c{{{1$LǑ"yk&z .L{^uUk_$ڵkttd5rlW\qM7ݴskjj/,aÆIǣR7m044T^^^XX(\_}d[Qfㆆ2^㱱gyFŧzj;j%.{B---P/˛oy۶mDb cjXY=DfcjDl,^ye7HW:CldG\}##SZ|IU*1fU*ZJ8UJc/--)D@w|hjFcc\ k~w+@MEQ͛F#LvcN5/Ok2 ɔv_ IY3$Q;q0͛-N$KyHQ_:;΅^+c,Tsbb"LMMMNNJ[^^^^^צs7p8,2EQuuuk4 z^b&FI rGDz$=e2M$X%:N b<:wC.V췿mR,-)aSSXRo} [TTD.O5c<<<<999z8{TWWX;::Jtcc#˲O=T}}mN:COP"d>۞[eq0jNpdN`sss;;;7lؐq'O>CK/h}}}"TT[lQ#da2NB&e9T5WUga%U ҍSlƬC&Ae!'%wMMvͰ% `X ɲd]NsnZyy[M dc //oT?ؘF!jM7t-hKQE"x<*w`;;; $I*//G׌@ꫯ>[A1f>KUh$ؚyƠ!cDh4l6ku$v ~{zz*++}>˃O<|e۶m>x^򬾾>c(?22BlEQ|7EQtGٺu+q>Fן9sxۇ1޽{w64uttرI&GEQ{qRh4Ii2:::Fc=Ϟ={͛7^_"eRAa۳TSSS333E<_UUE~i̙3_Ԕy>CIo]%QvFFF PhigX 0J'\ڰi _0VV6+:|V8g2fffg?;}t8^[@٬}Psss#ȼ>뷚~5Mnn. ,z=0W^y{k644D-YI^uaZE+R,˯3g*q{{;0`CCɞ ʼ^dbp8,Iǧ;;;Ǿ}3eYxM&ɓ'8z?1Ȓ` 'Ssrdp0 8+h/l'O/)((ؾ}{SSSiiZ(% UT39ε9QI@QTKKK00LMM͕W^YYYi>MGGǟ~S$RD*FU?& V{Q}b1Hh6h54AiTŮZHIo&%;$W_1fBկ~!0̝wމ(iaD9HMC/yo~$w}=d{18䞭ضm?!Q}"WHEy<Rϝ(:.((Fe"6''(oid{1aVr Q`JErK2ŴT!::?ʺ^EƩ1@+o|roy^zꫯ&pq1kV$gI+:t(w}}uu˖-###mmm?Ol6[ssskkkYYN[T=77^y啍k,c Zm,&RI,ˑHiNlamp8Lr^ULQ̵FXLU(0j:JAɤ`XF]_dcg7o&6ٳMӄZe.>l=2'HH_ g"3[Χ^ 7z/evFfn.l%bplk`/eZ ʪ()堹˂JjPhlZMOO>|U*Ն vUQQaXe~;պgϞ:U!K/D"C-lrhJUUUUQQ{aСC;w/..,CRԞ={X]{?BQt:mZ#$I6mnnh8! \%Z&ŧGg&]9J BNNEQ(ʲL@ h"mu-v}UUU) ]kaUiWf)X~`[”Z5&%Q )ZyV>avر8rȿ˿ڵX(97ۿKE]s5۷oO===~;e?y4TΣ (^____[[wށ7|^_]]o~3q.\طo߷OF%ͧ!9Y$IR2;b5Ċ$#hr,2jd2ɲ,90@"tNŮZ̲7'c@< `YY٢|5/kIK 22NX"W߮`}geBĉ,655}dejp,AiܙQDq{:-Չ )` H'd)Z%Y}عĵТ&']TF߽[<W\F53[nk~t(5Co)Z;>̆iպi&٬RvLAA-ܲqƅ8?x7ݻwVQlYXXw}}}%t*k4?۝,>o``}}}4Mܹ+̨GFFΟ?w_p!0PQQڵ}ݞEdRʒjuKOy@ سgb9tۻ\.W[[.+-Y IDAT+O޲e˳>kZvcLj}mݖq1&DQܜny~DRJd~ vR .L(W^y~[[[EE ƘeYVэ7f2ʔ$Scǎ{loooKKKmm3gʈ4R$YJdbGGGkkk/\q{|>ѸE")^]Ο?_RRRXXl+νie7l044xT*U{{Mz{{ Z-ng,^{Z>w\II 9 `Q)? TT J^+x;NS@+X"W^9~8d2w}5c۶m----`__s=1/~1O|뭷]՜z+++=bI$gΜI7SRR׷o>B^/'Ϟ=K?hz衪*˵Θ24DT*($ xSqmThl$!Hg\bQ۽!>0ƽ`tRܜISVVVVV}( #1Bf~dJFh]iACHJ"jEʤܾ}*N0.#qDgLdrLy7F `)>><1Bۦ8`*Hi 9!%DŠ;>k#I8xzuiTTT_ r"f80 sQr5Ni6 w&֠gA'۲t槥i{ ʵ|@$@n㩋VClƵDCV>";"sqI]GanBL_f ,5Qh%IՕ:ʠҩ$ls2*Zz{i{ޢ>rQOKcީ4o[`0N1dt:]TyF/omm]c/ŜB|U*%-XA9 /.I뫿`"!fK2?;E HAM[%IԪ *[*7$F}I,YmyA SIqJiwCevKZIr8vZ=i5g Hl{ B===9^(MӍ,>S۶m;u#>BABΝK&&)s_e.”;馞Ñ9331"HՇzhEvz}{{([lQ&[Ⱥnb4zE>oϴbљ̼?ڥh (XuQ6}hDeZeYnkk馛;l6 Ԩjs⩃$v&ԩS$;3ԈhĵZ/x7g -]EfOیD%Dc]2 IdFB|^b~ &B1SKOt?p`0dObVO00!U^V.ki}uMNN߿Ϟ=$h4~k_;|psssYYEQ ÄBT*5<<\YY93١= '??xda1M ÄaxEEE2,//'Yh lXZ[[*++3Q!32eY8.//orrtZVϧ׾H`pp8OMMP|UU隚3g\SSS~D"HtLF ktyagώXZATЦ0t|zj8Ir:( LBXZ, ,5j%b0 dc+ !2t:Œp8ffcYv}L[a||\qqJj7VTn{_eP__ ѱDↆM4 }vjaB K/)/?Xli*JRw뫿5*EQEEEz!TUU1noogy\.ѣGf3&I:=p(D&s)zp8p _l024J6rfwcjx5d29>>;00DQ\ZIQ{ vZgI#fggO8RBEVl---n;''g,BTjppqgxUw}隑4Ӳ$e-6̽9 lM>n6n,o>da@ 10mlaْ%Fs_]F4u`'$1~ꩮo=taWVgdd,{BC.ɥV]h(j<3 p8H|qqq066v||<%%ey522rhh8C-ae2Ix%Ƙ(vU*\}qT*䞛fBw[KPA@.Oqxsg~D"8Ey7cLҔG/ !SN#C֫YI4GH\x6!:X.&EqGLMKU;J%HIփ\BN/ "0믖^xa;!Z9M=p+oc^T CN@dT;0x`tOHa ˌ/'*\!x'++W8Ja Z0???..Vr][[zo\.קP(KJJo!!dX._vont:NgGGJZn݆ zxjBJ<^OfX>44rMCsss!sP+ɴZ-xrrytfDr\./**^jo )ٰa4MN0"\@SD|DȺRb켕KX;)W$V2] PԚLAN&#v"2J?fr&~j\ HT2? \6i7/,T*}^khhŋ n\[[[RRr+?Yb #[S-{E,˲&נ6/eKXn3 \Q*+MNJ^W(-CL3(n߹sMx"NSјFVgX ./_reÆ 7n"FGGO:յ$Y,$^Zz]H[ᡲZ|B+hҹ8,"DA !7H˗BBWYՐ!AǢ0 ̝i k' >,BF",NfJyvX}v y'8CAC8RE s*===bޟz9>^u…fz}~ŋΝ[HL---===[nݸq#AgǏ/0ի'7_ ^zȴ\/ 4M,{{L. r]Ld~El0Xۻw/BvݺuB8i!$|bTNN& %I奪Lj?lMggdqq~LEt>EEEX 2 :j/#GM ˬׄ{sϽ@jƌvд,< s͖CЖ@-EI"2XɖU0Ɓ RJ"83g-G6l7xoΝbJ;ttt9N:{^88?p,nw۴iӞ={n; ²@mX8yԩM6577ǟ;w.)))==r566^t_~\.0$˲rI0 FEEǿ;eee¸8!oMw_WWjzNV{ܒjB&9NdKK aPM.,UrPR&55:###--mttڵk=91>};jkkF#K%%% 茏߿g:W(Z'Rc9K-׫* wj}C8{MjTRdEHc9N&&& ԩS!'ūDROCx<=#ëqo1J +ld:vXg4PEQ!ynytСr. gppW^E6cn2xgO )h x7ϟwqB:T*Y ha_yGΜ9f͚b^OLL$l6;Klŀ!TUU{BQPP1ٸqb!_xdgfFR롡gϊw/JWTT<3 bMjh~Ẻ¥rutt)Q*ͩjZg+)L"񄊊  fXlL7-Wɨ&o#Wv~o.Z;61>ض(:p֭[/ !z{wqqqB %WXeKB3,8n&ABVkpXfrxTzk #HXyccm6-qm~/}K .BmmmoIZ{CYfl7_W,`d2,P(Jo4OKKhRlL,GOOwsёuC Ƹy KXn !ON<0̆ z{{\RVV****jݺuǎJRByĐ#F!utt ~a8\o߾jqflDnt:dZz_yHIzlX, K^KHHvfR [?ϝ;Յ1&_ydHHD3''8.R wտ[_$ΡSSdt\-IXq+  mņr4=;bv{nxx_2~uT t?˜#h<<5[ yfc_-UYVv+ٹRScqGӋ; fN IDATJ$ᖝ[1cf^XL !`x}>$ >e7' h}J2pW^0RWW0X,nNJ}?.܊)z Iշhۨ)33u֫zOqZvMN|҉hgi_}Շ~h4.<}ر4;vE/+Chw޽mΔU 9I^̄cƊM}}U>Sqc\vMR8pda "Em||yDBJrr> prR)@.8h.H6n8[\.':Tf!ٌ0I(iӦeط-(H`0N7o !FDJKPج 2FH P>@766䌍EGGƶK$DQV*nI!cLr꒥MMMQ@V&99:݌) `OS.6G*|~?pCqaumFZm:'&} @"a EInǬ󓽩)ҘCK$c]'UTBѯZ%_)PuuuKK ( -gӚ ~{?"}x&<5RR!U)dr)s+K`0~oJ/ϕڵk[lYٳg* |ϥgϞ;k7JIY5b 8wy|_ ,/j2JZ)*RBFSh"4CWlLLJ~Ϸ'O4qqq`Q+IfG@^odd_۫f {zzWZ%7k֬P600GtaaD":Df_eXBY!tǓ/^A6iv娝tSkk`4ئkגBڿ,茌lhh`Y$Ke.7nI%JyZH1['vy4lB]PP022R\\0 MHHZ,GGGSRRꏑ~l6~eIɴzj˥T*Q\VV޾cǎR,h#e$Y~XW734cf/K*n(JJLhzmbšX2<2_*).252""1qZJnnnLJ\98ZZO_+J/p?ɔ B k4E%ɮyX4nᆃcUUWx!wǟV喭3GvjwY4OanO:%&BP+eD*ݻNFۣ/xB0UUUZ[[kjjUV?'?fjjjӗf;vl.9aiǿza=Yt{JXP2Z!0Lo~ۿ._ ].ɓ'ze Lv`C1y1ﭩt>gĬ%Fjo |׾4ښe2&)##c||矿{zzL&Svv!v{{{X={,˲*LPtvvLZM6O81޻wMjZBXYYIx<.\`YVV 4p8&&&>PR566jZ1nX~_|D"ݾ}KFc{{Z.(((++#UVrL*Vty&/E}6_8y.W:-:^.KZ/dwrkN-t`I~TTcbccoHSOG|ߒ?W_q۝^ 4/?yiu#5JB 0&aAiy O:#,&nsAIR䷾6xdo/splc7Td$~X (Jcz1Clp}N_Fh M A,QQu.]]] 3ǖleafj?[V^רx/GrUk̞_SSSYYiۻ*++~|PFFF&&&sq'N0yyy.K. Yd*---,,dJKKKMMYFǜ5EQJԩSt0Ǐ:tam۶;vj]v%Mh4d\\ܻ[\\|%V+8Mvϝ;ww;.""+''G&eggWUUV R%))GՑ9B& A'BET\a/O~fsKi"džؤw`K+#vM|sY {oeeell,Bh D25iP\f@_zy[<"}WHdHQPtI4Pӡٲ1njj3kv}R_uS_~g9~bsz|d*BC0`KDjb|xw y򬯯y70uuu!H_B3Vk]]ۗMZ,ڹ~]ǿ!F36nBQɟE0r@ 0. Dj d*hznuuD}Qnnr>aY7?/~~K'6R{{u߾}΁}ZC=D"$)bfrrdee\.B!ԄfggcKaBE406\x222"##IYYYS2t{,B(apBuE{*BAL"hGY#^Š7I(Iv¦0:11>0"6::TXXxAIE!u qa9G(+J.WY(EL1&NaZz.:PRƯZs!YRF,O>cH/6g"pOo\;dr<?}wɫoҢ3 Ei,˯SI( R5w=l`[O>N:O |R"\*+6HiEql@x@% (Z_p:AggDZ'Cx'oﯹ&M0EDZa2R7Κ%*\"\?t5 M)y kU"W$Vr򪰄бI^'H4A P+\6{O{9`^Ӎ#EM/ Znf3ۦ{9|j.g599аr|pNO~$$͊/@(wa5rFpUeWTϳ 6!ϼ#===.+O{uI$!B.{]r%O73nsMGSg[C ) MA,)BA;l䝕 k׆sO嶇 pv٭w^QBj2>zf4ם25d2MNN Lui'Jmk-VCO@O A3 1q d\J˫??t0aBXnGAKiii$)hfYѣ=\.'`~ɿxl&y:Yۻw/BvݺuBr醆PSsW\\,cv;щ1&IBI!BfRN+;;W999Y\\_S?|QQIv"JBEŸg%%%YYY_GYZ:0F[[Tج$V*#(~pMC8rȈƌԑN;my'7o"X6'xz<W~x$)[w9! l@@ Quk/>pvGGG,BhH& Tf^`r6y~`` Oyy))g.4<;#1S*0bhC15ziy#@[,DFF:ujӦMΝKJJJOOw\.]*))yIO?T.Ç ƘdcYvtt[.755i4a}ݨwy'55B'$iZEЩj=[RRRUUS]]P(V$)lii!,©⥪@HoRSS322FGG]688cI$8};jkkF#Kb rrT*=\;] r&<]R^d2ON y>XrdZLNNy~vY5Lvx:.66&!i2[|"N&j48&RIAs&܃1<<11;p8RSSϟ?/JiJPUUU||ݻKJJ EAA8''gƍ\~ł$%%Azhhٳ%JR|\\GFF+**yB&iZRh4~?p]]TRr::: > aJesssjjZjYȄB buZ-SZڇ=D*6hdޡhY0c/C,.k0—㚚,Urf|MMM999Ns ǵwpu^T IDAT[#m.-[ C DV' .MEn*GnU*EEEeeeQQQ 2^b[.WŭsEj#IyaNTdrb#"!8位ewM\cpj*A|q[W'v/#Cf$C!~JDYvuum޼y!4Ƙ4smXh33,g3;;;onEq\ U*uzFt{gBf@dәtpa `KL>LbAgX:,%0c\YYyɓYYY lذʕ+eee!߯R֭[}1T*͛7'&&\?k4ry^^^GGI10fYVpp'W]]r5N^!Ng2V^+o)q^7%!!ak| ׮]lDEQiiioseffvuuaYyyLfXA)6urWáhsg02T@&xF~K>Vnu!bUd}>߇~H씔 d:8q>9hĨZ*nݺu~[[[gy^L(zC=uһ{[-=%\oLPÕ}v5#?yX4],0Fݹj|ڵCY_bqcW=Y(?I>\Ie}X5@zD';א"C B:>Aۿ4p쯼'):en&@ 0 SS @TffnwH*7?S33̂@ x>+B7OFc!vjNaL`{gϤ `4 h#A#"cFfOv=<DŽ6нݻW"dff\t@DE>|8_t:8k6  4VFmmmD1]v]cח{ڵCL&V&۶mzjjjjrre[\{NNMdڵRammmJT~o޼ncnYԪIϕNx) Rdqh}*3>O%͢tKKKrrr~~>˲oFѣG'&&m1\[PPuVFGGB&IA?!Vׯ_/_WWqƅ~.d2pH7=zt׮]5 %IZ4^ꩋ^_``WCo. | `߾};}_D]ң8` 9pΉ?};꣏>:ciyM2+6lĥgFG8pC[,o׾PūU+ILLXgf~)>QDjǤBB)X3cPW[#zB߾Z^| xZz Bx1DࠟDDEK٧|>f[H" gm vdQ<\f~V1vZȟ@Bno`ʹL:(vC@GV!x|q?"p*JK I- pX²BQI1nkk($#.RLOBR\.E$!$љ%Y$V $ܴi2NDV$\DQ0L%mt3:aE*jwa~cpxGE<@R(1""ށ0${LL"n233pѣwAbZDq_E7M;v< <%^eA&R#Py},I " D` B!CkW|k_6@(:EڒaH!V'B>sqv|o9Ai&xiJ`B;wJ2 i)H^x!Ct<(4JKJJ^|E?$rt{ygˑpwΕ2))**))l6WWWťrr>rƵc&Sgzy ge )(R+207fdE]ĦL8L CK% MQ \&edc]y ڵksKiRWx8$!Jx?2>===&);;{``޴Ĥ$eϞ=˲J쬪*++S(&)''GVO81޻wxj |x.\Zi:%%pLLL|.&9Nklljb%b-K$۷_th4ꂂ:qOOϪUl&EEE (ȑ#Jʕ+^wFꖰ@*,JBt3J]lRZ TB?8bif8 N48f@VMII!3s'8MNyy9ɓO$@4<wwq ٜrrpc|TZZZXX0 JKK#qk֬tJh4MR*N#?~СC 466n۶رcVuڵ+iF!%}K.iUV-m<ϟ;ww\DDDoooWWWNNL&ή"L@KKKRRROON#9raFF[oUTTҢT*|̓ k̘~>7-a~<1)zL.C7bgܲ'Rq83xg;n~CN4^t:[[[o>rl4Iqcn 4EɥSOaG<^jÐ P]RuҦEf֯/ 8<50)`dI.F0)??RT\?q74i ր= vd9C94%ߏ}>w_$HaCgΜ)..NOO(aIӓr EDD8^ B@"!4Mf[ryffȈ$٧iᜊhnnt<+ 8<<e2jʛ$7 zf-y###cccEիW >􌌌f/hoHv"}vw a'(.KU<>`Z%]06c|D811bu-^NvX멨}aEQr)!!9ND2Wa_n (I8:2̲hMBQ}Ý& 6i0  񹧜F$, K"Sb89A+pP1~KQ`!c`)# N.0g\7t~f(.S?9΍74}q1wԴ|Ԫg~3$d-Bp{ff#- PT"=:['IIIsSvUCP{$2 rVdjT !-Iq[s)iE*Rsg*i%||e g9h)u3% "b C*`{;93hgm~WyS|DQ)y5sc @mP[KۧP\l  &rcr^%,4}w(vI;wb )9B׭[7{ CCp9M_WHIII>xJP)(//fffG?"kGysVTTIBIgv;:11>0"6::TXXxAIENTzA֓>B8a` RR1r@AK; OKy2.xwd2,d4>f;vئMO:zJ$&qzC[Ƅ=7;-DX~uBTf <-`jg_nll(:ȶul v^y1z>#Vh|#9fh*4_@k ēG0 7D'&9s,x!jFCINܞ5<===6l 1b,%s7F/ܳ L)$|?{]A#XBIqEk/C%q0t_8.(x(Ї]JGkGЁnzÒ===O>dMMMVVf!^pͭy׬κ%)/ۺ}wrj#BH~Uwظqcvv'nM! yjRǑ.TH X{>{`ۺ h`(8t]o!{1>iM*L5<{.MKh4"(`NlFYbwQiy9oKYyF9˲,QgBRmXWD" D&B  Of+W,eXpM BH`e=S$qoY3 pL,3 B(Q+,ˎ.Rol^K`_dždMd +$R2("1ЪbehʙC?)r\Ks199yСNB.Ybٳgjj*KǑ$zJOiz*FdINKdor|!v׮]ԳZ-/E߹:x}`lM CNX,tO?žl;Cʤ 'JnhϜʼnU}=Eť (cy)]{94v(jhC9ZBH 'FQ"UT* 4pYD( 6^ yΕfmF #Z@vww/~5x=u{.pe][_NBgHgwBb)k&p lRGxF]v BXYYt:{{{r dƔ% eWI`qzl1!lhhβ< YXH, ㏰QD I" e$HQ IDATݻyH466666cWJ>.)*))zBI$7/{<ӣ?'K&c23?ރ| $"8i!I8@A xgO￟U]=m! ȖH${ȸptӎIArr#:7ߍ/T*P]SSje&eIw#$Ifgg{@DĤpN{ij|$ %,_-u"Wo.+LB̽3[&DrsP2 Nh4:З&;;{&jjjZ2 ᭦K7m}\xpuPxhhP7h"7Y0 !YzV?R\RJ]YYӟK_(//7***08yU<:u BXQQx>&z'䑈e$I0~qB" @$%>8IP$Ih$z}}}}YYBvWUU'?RT.JprrpۗI4CG~W iZZ,MMZG/ *U…$de## /E Q4BMMZ_po;9NeɓXLomU{<#Gzf2A@III~~f2K'N{G7ol٢(@$L&\~[4.VDrr2EQ(8Ϋ@ l}<40_}B1= COzy&8y-$2\P, CXfqדphZ I2777!lKw3 xw yq#>L.'U&IQ ˗+.M"]_G_W0zܲ1~Fal6lɽcӛ7onoo7uuu)))YYY@իտZ^rX,z< OZn]rr20SSSbMP4}IVk6f￟QSSLdPuСxoST;vܹsZ6))Kg&~HىY8d2ʶhiišQ__955166vQ@=gΜٹsgccbWl6WWWq0 uwwWWWD"Vo߾2K'$2R~wd!+Se`(#ŰKNNqMŋ S.]Η8˕>'7nH$ '% $##hT䓃'OƣgB+Ls~z=78xr Hdp:鉱[5yY={j az}~~>vNT .`x@ !F*:SSSM& zΟ?MR*Hpo=xXEӴT*mooȐJS>;1'}m0NZ,^nݺ~u8E*K,ˏ~zoozzzaA 6n8<<<00000v@_p:O>ٷsg ?0`P⅐Fd È 8-_^!}>N%$ңZ^gfLBP8z6 F]z5--M|>Dww7_:;;Wbiׯ_jƍ xEqeSSS!futtx<ub]]]X9 2 OQT___OOO48nxxx||cpp-KR%m>- &M S@D\8[{j'nFKF89|>cA@og Rj#TX79 蹺vӇ>/Y7SSS︐&]J轎D\bY0R`.+=b X]ƪ8 91 *8RaD5 5yH?[nZ7nHIIiJ^~ѱcɺu^|EHDP( زe˶m' >^œGdeb޽{pJl8 {^IHeznw8)+z$Z===|$Ifff9s&33Wd!a88N$9aF7[C.10vz⫺F,EL!4f^D#GdNI*t&qǗb3Fq?~{&iFd^^~rf<|! I*Eq&@ ym"AH " >17LqILNNrJRRŋ :^ ]pd2]xo|6D"H0 BSSSvјq\ffK222D"144d% OiZ\\-ڵk6l(**jnn"f!v?lbᢢҾzf){l>rttt7nȈF[֓y\;BPRR200/ [ZZ֯_]VVӓ*JqCj555===[`0 'kcg!Ae +29 ;CK%#M&L(9ZH$zb###֭S@e=99$p=\bܘ;[r)X,ADs'NzByyyxS~Æ ===`l6%ar1 8mWW$IgVUU555) Xb1}ń8y1onݺyH$,5L&Sr!$rss1*=ǩajjJu革V tfⲊ P 8ʕ$D4/S ' (YpaH$p 3H_W[BFb KHfff˜`@勋t**]g4ZbHZzD,0˫MZrmH$xŸ¡G>x8}E@EG^OM蒒 #BH$ g4D1*,1,dXv> 47\%Z3$Y]]&$ | N'gyX?,62t;?%t(@,oڴ)^@ XX4u/ I7o^ֱ,$H$E=OOgSRͻq8U=;;e˖waioì2B H.LUI^ m2 EBvy"GFFtI(++K4]]]=::P(RRRH{:ccc7occc "55"ۭP(JKKٯS ***1]!Id2133P(ZVU =qݞ'pBBH#V1puu> *|>q>鑑2\5@FF|ҪD"QmmDž͆ɂ D^;we\~39PhƕV! Hj>8Ȱ 0l$OOE#P(te/^mm555Ÿbbݤ)`P$IQ$,wP[[{[a* 򪪪Ƅ+E%0`!"XKaͮ8;K䭝w,0vqaOP_Bu:]uMk 5YBBk$ZyЏ=0:1"˝hy0[y/)7T*_Z0%%_?̓Th2xg_jpu@9μ<~:o?Xh4aiiiMCDaaa]]ԝyӑQˆ*ɱUܙӻ#bH7bN#$oV!@!,a(.ưP6= g=q,{Öx$))ATTT|' #CT7z}uuuB'4DZ'l2[E D@(F08J$eM8&=h%Z$H:8QD2hsvADt,A<>=4 ] ;%Q9O0 WۘV|W *Lm۶Ǐ ZZ4a" G.FPgqBh{B`! D I!}11wئ&!ut]Oh'I۶m2V[[[ |M\ ~E`'tSSS$Y=o}JЀ8IdQL!Q"Dא#IC8Y2xHa}^t3}ދg V4110 g|*(\ (--ݸqcSSfÄn r8xGP4~TbeB6iᑫ:M]]]OBƵXPa}}}cc׾O]lL0Luu" pxBe\OeJF Glr71@$֨}4~|zr\E÷#_`r]i׮]|3oFǘ$5 \N'K ; H,IB$IQs&,d8ap8r:>/A8h>##n0ALp,{B7 W Jb' :62tL.C9.21X& B2I|!Bs)x\N\e rL/wy!+K .G*xؒ0˻V&EQďx|m3r[<}a~߽+Euuul6^fv:os=qA͖?:: u_L|*oO p8~@ hllܱc 555MMMx]>99P(v;nH{'h4ׯ_)^}^RA铂(i1D#c]mNi@Fh,:YA@fe-O0䪥!$H|[YAl wPx/dcǸݻw;v,꙲Yb2#>?}~X,Z\$ޓEChX R@@R"jyY9 G<^e96V@{:.],&X$}MH|Q*ow9n4o߾&IrӦM7nܘGKOgۻ;RdpBH$)2[V 2~vGaq@|Ō)++[ `όH$ɉF#(Vb䡫$ɔ8ae W0b1ٌԒ$Xå!_]҆[zށ[{?Rh4ɕ`G=qn/..bO7t6mÆ 4Mp 6b1|~# T*kXMJOϥ s4M!ȭ۷owfffJJJI i2N3%%eppPR555>QinnJr^ƺb,ZQӔ@&&"Jf1"C =9W '[o}p( IUJ]j‰A83>KI^>֮4': ?xcv;&${X( Lҋ q8TWwrI1AjC -gVp۶m{bᘇgffN>}ֲ۷o?}ƙ4k!EH8|~o}FZ I ~ EbHH I͆4`> Ep8 D"a>(vZ6`Xk-Mpxǎw@P 6l'$vi&>J~DV?ӿ/``FR2h,!HR  "PH h B!ap( ,΃N?\wUZGX,p%,=-jB>hy:n.,>Dk1wމNbYVT gϞŒOn;DVP\j$)hƜ9E4x999P(;;[b 5ͦMsssy:8DbX&&&L&Vlrޛjz}Zƫ8 477۷oppprrn/: WW7Cmݺ_tvj&̤鞁NƶlDQ!MuPPq´t--.+|'vX8l>q* ɶl"nBcѠۓ!AeQ[%2*=5%S"y➘Ұ/ 64HhZ5z+asv}jj%I! q'B&J[ktt4dee{vK[644L s!v}q/rhL466ѡjXǞ#`O891unF !h8 Y`!DzBsx܂)B>j%bTjjjVdAQԶmۆnQ IDATnoݺu53337o\WWXc#nߵ7h/Ę !H "qKMe^9X3[=#!oH$0./ƒ_ c{$&!yyy(IfҥK֭ShTRb }$;;;N'v?B. |{nGaWls8>uT,["#ǯ]V^^?ifff۶m===$ 6?~^֭V뗿円F?ri*!xXjkk3 'NhoopCS411qԩJph43Ϭ!^t@J,$Yf `$ib#c-xٺڸo`hӦM6M1._?a] {ސaXL=T=D?V<|]gvRWߐYUs.5Ec6hd.U*\O"\TܲܜcycFZoٙa  )IR>8l}H Evxk-Gu鼵 ooU.̈bP_P(rByyyMhmmUiiiX,p8RSS{zz򦧧VԔjݱcG]]w]FSRRꫯjZ 4)to}[x8Q :w*GҘ3b,iiiw(b_ѣGcCV[QQ}!shKK'| )|ß&&&7md\p-޷z7X1*7w*U7o/* E(I )hFP0I&ȑ#|ي/~񋄴*_^=(ɲ{եQ[Xy[0koon͸-MWG&bgf@h]]RP$999T*9[lmq$AXDb4 Fvj@ bY" J%[axanO$#ZnDBnnj@O_@0nbʪH$f7l(OH ` ~T?<I4W-Ƿ ۏ11*փ]0}z{uEAt_KKK:on;/HyϜ:zjczfH,g”h426v| @(>3YYY/R0đUxxwB6_8tƷzW^ XR(_BpYֿX%l6?soDڧ'?:y\Tgj 0޷q"͸C}]SyET*s=ZAz?K5ߛnJCaUF /;vlB,hٚWXj0  ! v@o}z]FݻwlQ{Xd*7(F&.Ud_mp͛`TԢj].Wmmm b95  vtfee%,,LK@y˜kI`ql0spu/y76˲k2a/Y&Fb"@q EJ5GĀj:_+:$;;cd q 7$0|ҏ̛7kZ=89Y-ڵ|!BV A|W)W2o9rAWTTβljj*NF~@Q}Fr}D)))FBD4M|F-I!IX7B?q~~~#|'--eQտxRQ98&B"~_J'''OOO{ rȑǏ/c`CA@@Mf7 zZZSO= IGo~Sv5 =bDF/|ͲX,rLc gS@l۽[lٹs;&*ȕ?@z%`RnC햺4]ZؤRjqE9(qxBh4"+@5]]]V\iCK/JW®Z~~75MfffQQ F ;vѣbmL˗v``fxxxϞ=ut:t 0z(B055˲|][u$Il2?G \^1|8sݕ?O/P7ިxZ[[cXWWׁ~>|x?298q Ci"jfTJ%Xm3;b%V[`4v[p_58'ZqjZ'kkk0ƍo0:'M@IB@7%Ke񌌌廎 ~Z#R3P4E"@,aɬ܂+nm?Dj!()D9+{VCm~ñ~Fs͛7溺@ z_ZV_rE,{gyw pu=abq[[BiɓZl6?##  QuСRpשT*;VTTT]]}9VT__9$v;;;1 =RZZZ&Ȩ̜;z(E9sfΝ_%\]]1JںukggRLNN޷o\?A 4D,\iIE560%@NNN"@R(3pҖ Gz#.𭬬dgg4mIPTwwh8 y` c=viDn%%%8 C|k"HvU]]0Q Mӻw/T8pDh& RBRq췭Vj#1FJ`8JSP@)E X,&I =zrhת_#G={6;;S1 듓1>/##… B0??x@ ! 77骪ׯ@ѨL&j֭w lْP(ŽĴZi: 2 /Y{*fh4zMG,viWH$bZ;::<OQQFdffo.''!0 qljD"1<<\QQ7oqH LdR s!Rf0 OPՠkUR.c0⛲Sx$-4͸=dRK ~<nwjjj07+#6~ Vi'$INNNNN˲333+/E"QYYO<~zTzG  EqqqJJ _xsJJmۦRU$eee|J~[*2Gy1XeؤZD"A~_$4cSXaHZ"FMCPoJH$_WV10A4D2IQ"@V)U 19p;m1s0 |BC&_wV a)"2;'/]۾sANFPx44). .7$r(;}s -[|>a>r!JeNNN^^^JJL&{07hqݣ # -s@T*6lHMMW3 w޽cǎޮ`0@ 222pƒss HOvTXdP7B DF'lc#cݒ9Hq[jR,]1UbjUJ:QpX(t{ccCP`zԚΑ)r/]```&k QWF-N˄R&xN!9ڝ`4f0YV-dz544Dč7> .|!>o 4OG{v dWijD544߿q!VRӧ׭[g4?ݻw0u͛9կ~-Е+Wnܸ!> qo'|rDHSSS/xf5) ؒyyy,:p8nw(¡cE TjM&SRRFIJJD{NNtHdll,Fy  bqjjjNNH$JII<& 1vZ,KxL&Pjb<h iJMARH3t;&)ܰaDiU4]r$PD,VSGwO_wPɚ.K8 }.x4ξ;ZP457{&kJ]URװO/_kKL߁ǤDk̪Z>O8C rFnDnH F4CZ ;??fab𤤤'_J5oÇKZmbb?cxXBLd|i+U QnÆ9!DZڄf`P%p:LLL|_mii7IQԁ~_.Llذ??ib˖-dYŋf!eT٘Rp .0 EQ2 ,k_q$2omۖ>)RartprtsxhpnН5k׮MO $j$I%V{T~;1xj;::&'FV®Z0W{bb"===> ~*(-¤ IDATa/~ҍ7655l6L,! ^~= ƃX,\Yme0f!VRRƯ}kK/^o{{;P$UTTܸqaZ*9bm1ϫRRSP-TkU$٘rKysw)?T&)A rrrhs:B !T(׮]uh477Ĭ.K5ַx"ߏ4(I$`WkSY AĨZ~JZV~zv!&D GH*Z\i!$J}>_yy9Mӣf󅅅p8or%,WqġCyZ&]tO?2Gi4x%ddd8΁}{!maB9&))iϞ=[*ƻAt;w|>#GӴZw$t:33%VŹwwv: :x<yW(Ŏ0kٲNosmܸqppfzR7mhh(99:<02ܹs555ff@~~'B{G{ .]0\.(*--\bTTJ2b[w8?oZ 466رիG.455uQzz:&!~ɭP(fffhSEgZ!BT$$E.M[jJg`,苆2Ky+++^*Ht~_VOLL4m0Y5 `ff&%%%I$DŜNgjjjmmP>k⚺jdNaKg4ze%]iӛiٟ:bO>d‹/bq ^t}n6Ngss3˲D,bP(k0 0ohhرc¦ILJJّBSWΜ9r]S/^q\ZZX,'pCC5P)QyqQayYBmI.QI* wf@|!F0 ~WP`f F9;v;\Q&Wnо?*Uڒڲk}0 RT:N&VҥK!v8pf555k0FFF(`W8F!Ji [\ݻwo۶m,j4>hnnFی$It:=88XUUH$rN%0g$IPO HD"T*t: ISz5k^*P>7q\..`0|>Ju$ l6x/n8fџp?88v~6 hTUW^0֭JŋCG83RJLK Mx| KJ*s6lV6`0F䛔WTt:% EQ&ihhHp]v-Ydv#~x~;v#!,fbX,:2m>&J![j5fbX-B(ڸq+WRT*Euѥ%~OOO8h4hS(d x^,&2c|>4˲.ڵksuAxk׺].ל,˺9U.uvv^7 dۍk׮E"yx<<ϣ]]]hǻ8RAٌnw8q @<ϏYA|_WkzꩧrXr9$ZINֆr~ gO>֬Ys$qui޵T"j~$I5q")t:Q 1$I8qђc9$1"XR"qg,ñ`G!1WyN]jb1UR0F cXei9EV2쮻I8sOD,?۷b 6.o2T OO"ɵ-[[W1lvdxhxW/ߢm/Bs?<24 V܁,˦R@ p80 cYh.((=W{^qrDzl2d2 àe1 G,NxFSI(5/B 7n:utRq)'OmLkC^fۯq48N8h2l֞Ǐ744Q4Dٲm/q$ @2`ⁿyߏ:;;M.!bL0LLe2x9 ӊAXBO. Lf~b!S  ǡGq&KX^x@ [QQq]YSݫ,Ny^gm9~/4˽;<ϟ9s5"sF[OU[e2p``x&(e*u גv2V^dR`"HH$PideOx#;UBE$&IM,$$p8l6.Et"Ngmm-"eknnF1fp bcǎI$ r J>l>ϬZ Uխ^zbb644l۶ðe˖$9#Gr( A&q=XfO~\~hPK>Νkll_D1$P(^ZVVP 58nllLP܌|I^4hw~O~QeJ$k+j2)լ+aOOx\/Ybp||Ya"\hX2}S_2t,A\i8JßTgh`Ue0ި"nz@>N:4W^9燆JKKQ |>mk2+Ο?o2%a.K"`ޡt:=u]\k:_>޽{H\rХKZ[[yfJ`0455ܹ0D;,[pLLQ%K:$d2NO&mݺӹs7ЊB|P(6K%˲fEϗL&SXXD.oѣBaPFT*^|HI*RTwu׾}YE*2$RLEDsD,D`?,J <1i()..!V<`@ kBQ,,:N1:CEe-Z^V*2h ~2;VԩRVXTQTLDf00` T*-,,DtBd ccc>h4J$TE TV555'F׋Xq2[[[BBQIii)I֭X,Krdɒ*)G n;N!>VnW*###Vb$Ig2*++M&R`P8s\---,~aL&ӤOŽ1ߟ@qqA\2rǥ&¾P"D$@Fyñ@<t:Bn?xe`0hXcs HJRXJ34`菆fB*5>oRՊVڇM|.++[jջ{d5pNDcS,}&V$y+oݟ71Aӌz¥3[ZZUh{"D"t:],d.FQOo @~\oXU Y8.HH$DBRLRzqJ~̹k.urQawww (((qYhSQQQQQ{0-  ÄSrOGJ2,7.vSHfUU@"TAunk׮] S2r.'X,tj'8Ǘ-[&wݺujo۶M!%v`v.-Mb>KY( QIzNCb͠t: /co;vw]C橐|gΜٶm,3,P){j8p`S hT ps?SIpۧr۷ܹW~]`wL:ɤ---sϤݨ"w׎f477gْR2n($ɢ"~Z+&aJBNgX|>I2$(y's %vݯ90aE|ڀrq;;;WpZ~[6{X9R2;zM'3|hOO*d=m!A>lUBCV#Po||?ݭRAhlO5__D"ٰaBD8q\>,*~w,i\u+W0 ޷~` CZ^^3tvvvtt PUS]PVV6x*n"f$?7@yc((6"c E.`q^ IDATAN[a5"ל_}IDtȳL߄;Kw[O\a@ɦDܝIzy( 2#>p=}ll,J!vl6Zt:L666y<ϫ/^:g٪*p{E"/˗.]b_/_SQQ!l(lr82o 0׮]TRF83 [__0-,,8f%4}yacc#W\1LP(GG}j8N6Rc..!b)ɠxSv,wjZifiM;"L-].WiiinAڵk3yr1:::<D6 Vk.LBiZ]kbe˖ * !ZK.}O>{Ϲ^vb˗/3 j*Mkw*sԤBY11@C`YTC4r-l6!M&76e||(* 4!ryII 2_ð&e/_LQTkk뭫M*|rp}!h8s4Z M:HH дTΞ=zd2N9kkk;<@B,FQd:IX,ktR*9ydQQ0qd2%Iٕ?<,[VV ]ND"r7˹BccSvvvbfh & rb1,BO [^ !6asbg-"wD3WWWR.\yw [lIGGG;Tĉ èTѱ1 JJJbX0DńZʕ+&bC%ft҆ ЏE={>nQT ΝCRD"!Y/s=7<fI^oy|$t:ў`رCo4=~f @_ra:ɸ53^:URQSC>i tʮ*RIQԑ#GrB˗/MMM9X,C da0<<<66VZZhN8QYYi6nfC&/:74~L&쬮Z.d2,Dry:.))QT4dɒH$ѱlٲM6>TVV4.\vZNbʿ=qr|NiP%O"W.P2ٙ3g֯_Fׯ_k׮/F;d2ywK,I$2LH7^t󵴴466$JZZZhF۷jښDۥ+W9s&(a$z[o$yʕ7ܹ3 -]vvIV{inn><2 ];MtCCCuuuNS$***B-ΝCo.D=zyKP=qD@&J Qs,(Bi4kI\,)$Oo@vp8s Y455L& !"L&˗/\3x2~/}i҄axe]fk87Ou %瑚R^SSN%IIIɡCP`||qш8 ږJKD"|`9۵kvnz'7d :F),zG(.N;}VEtL'N?~|˖-¹+V8p+VX,ÇLcǎ,Yd7oFoJ6tRl6~ViH@1qvдT -eYJuCH$2'T[nu\w޶mYh4?|\QQp8NVUU% \rK{`VSSSXXxI$IBHIH^YYJN'i#I2h` h`].WAA`|*wIh,lF}hhի= Auuu.\nf*"tzqORA/^iovB2F &(N2Tapo`;fj`2}Z $B+V455a.0ir8>޽{=OL";J~AQT]]r %nUPEQ7oFO!Fq|ӦMh-qFJも`0zڮ\А[  /$}{sZ8nҥnSH$lVpB3LF"L&Ix:::,;sէzjhh)z^XXcǎ3gzzl6DLԔ(II\0$Z.ؤ e&ސL"~ok8ZfN<=kddDuvv&@ `ZcҥK)JP~O2Uu22sJLEmEu]m,FS7x?x /0' Zڷoߊ+l6۞={n݊i4I$0 r!"Ф :.B!$p:ΞѨjGFFj\.(Z]VSeZ QZ!17 1ЃL4]UU[PPrtcУA1PħafZh4Ș}|{{{UU M$pXTJR_UUXiy+1 .9GE!?Ӆ4jRi4 !rՊbbFA3-JH ,rίX\\.G?WĔ#NY4(PPm 1Nt:AY5 v2w~DrCat Db̙3/^ BlV*Zo͚5 vy7޸pB(J&<+ʕ!q;\tرccccX 0Zаm۶`.@O><կ~q>rE jRQW?W,V&`]f_)Bu<| LRLj:DED8bd0RY&4@V4EkWYYn:r9//.kАʴ.H6l؀z{{O<xǎ[lYK/dQ߿;Tnyk666L&&"ZwLj͗d PlfK4EQϺX.%>DǽSpyGO)5&VnY4e Ps46␕s8AJEZ;+W|ꩧJJJ@^ 6;wlnnP 86 %`Æ w}??۫V .d2?tRƍ,Y_7x\u$e#J?Ͽ8b9Obbӂ ;vIߎ} DɜRJ)ͱX$*" d*fye@"jD4Em۶M/,,|衇~ HpBCCCYYYY,Ip:gϞXh2dƍC3g+(--2 7dB/]t>, ]zX@mÄ+~XT{w\̄B*k%%\@;OF.N"D܉<0Lբjlg&oTUUmڴn߄ՕJ7t L&Klv)((XjU[[[yyB  _{-[,Yѣ~iB# cĝo+.>v1 # "fE6;A*S@`&:mʨS.T/i\v݄о1O/7ߵyB;[{ ڴR jౙ$!/mZ̭b&u6I´f@H8mhmjQ!dcn1HI²ӃxiiF~uTT˖-۰aCeeVts]zj -P~&OYNڳgOYY )--K,{}Q $ܙ3AWCa8NG];;_JGGMM-B0 ǎt:O^nRT:YFݐL NBC(3 ̆"=SzJYIi)ȃrtBB(L&2ÎsIݴ f0%`ð"|Tǹ#䪛sLnơ8'R4ccc^MM JӚ,///++۴iŋ?ǏlիW\\&M_<޽{lli344t=<#=,9r$$IXf](!J0Ibt xjtxܗNǙx,{׫Oud\';rD]mfCl\} z36IBAźwqsIݴ f0%h ʾ7wB8:us-8Jܹ3HDlܸQ|3P_N&ַt:]ga&kkk?8qȑ#vشiS}}}qqqwww,DjuEE'R'NOڸqի_QPP`ZW^=::zڵC?h4MMM֭V*q8~vf)>l &JнyMx]V[<qbc>"»> !ȅ FX-(0Yy?N@@E511gJEY:=qˠ34GU3 @RS܀LLh&M`& ӫUR??u#\n1D"!1F/]o|cB822K uq\W^y套^jmm~%gAd^?~iF<yꩧ{D`O 0$I䆿^XlDчzq/@;/GC^T6>o0\z? \#0eK7ݍp }ػ8NXlE5K<8G7>@O[7jtW{=Mwf&HY&| j +ަ\h `j΄FJJ8T% $3OtVI-"Dш㯿{ケ"?Ƅ_ou]ӺP=sp8lۧ] $I9X,?mznooZܿ⋂jG?R3J&N:w\.r~'|bI|ʲ,abT@*-`8α쇇HrsKv^| IDATaZE577ܹs``68 W^~ho.(,,|sg=T:UMCCCW\A Vg>-D(z7'?5͚5k}Qѽw#NiuFBp^\^zx!:9J,ʺhhZydqMh(jj/>oպc}>hiek6cHe%yCIQCt&( I3AGA={5 E9~K'54f3& l ڼyH *aWW׿+{pLmcZ'sO8n||>˖-{'*++u:$SX&w}~nXz. h '?$qDQl" =:kjm,EzE7Gi%I|Ad,s*>ƣaܹʫ2sGYe878p1>fF}aaѣgZ`nE9vU"}mP*d^Ra[ߏRf\~I"D,vZdV,s.G::*Ba2zvxxaq=+GZ^^lYBAJ"wBr~_?l.B_ B8::zرx%?}29J DVp%Je R 1 ]_i `}ݦ걱^zittJݹu83: v۽m۶˗YqjP񠋏E U-P^G'<8nIergmCntPYL^9JU6*uU&nJEmsҏ_v` 7J~O1_| I' *eJ *(&(D*<8!WXh0@0@ ☜pq 'fj0\^*fT7]%Ln. 8)ُ;T@usɭ8dC_E+++H#vz8(fX}纺ּaÆo}[wP(}g_xu:T*eY6 |^q|ַD2'l?_y~ӆpX-2St}B%I)bH:Ie)M,+ru*[\wx<.­|+ف׹9 D0gI811188DRiqqᨨd LeİJfv ;`VUU/N~-{S04qiaTP}|x<0_J >8N16IħE}{߳l L"e*Cz'FeRBBģ #!q-˫ *_ X,6C!Àwi^gV|f(**ꖋ hTS) NT jjγZ h3X 1 [d y$EA]WW'l#9k&Y(T4R:(&ÅbX*++ҒD IYe9118`Yx$b1 K!/(X,;i^doL&3|E;6 ޘaV 9Vj-Ȓ4 Q0 D:gp>Lh>AY"*Y驯oήj-pݣ=aK!|T!b!{[v]M1Yq4Cg\I,3 )F)HcfQRⰋxj@Y'nCJ_ N"DZm#ZG 105˲=uL_jdD,:̩>8i@&xu]0U3d KCw<K|:D܁B8B:aIRi ai⳩ֺ}t2(K j1I@xck |Ρ:VGr)>c$><0e]H$8^_j5~R*p1%RDac@JQ&#%Aesር/K)"X3 C" Y9,Qd:x23 ON,CBy @VIRt*8p8G/H2 TJG ʉX hik]s;GTپk!$ (jXif}Z0 H d BT$DQs]Q4D"tFEhvOljaI*$uW 90RP {.YL`*Kť.[gzdp0h2KL}4L;gyjr'Rn Od0'p"VD~-Þ@H+ͣiaI2 e*T_1j3q16pch|ޱd,kWvvuEZo'9klLdz= bV'!I!%^faYHxQ3800Q %Q\\TIM0D\g^| A`KK2"VY_OQr9nԩ5(ڋnψmVuy*86a_{Gd2a1e2C"&:+%a1vV8 :;Ss4.),y{ߛ6U} G'5i];4p\X߬DbiÒL%drp*Վs]=m ?@?z6 \:殝J ! 42jo۝XXX t҃'IR\=(Bb z ­3kffuϴ]]&f\X+fdDu;yO~'P}{nX?UܻE"=o xol K̈́n{N1ތpCKj\>~xTEsHj:[ot0qBM$I~E?>vp 'fV\ r`n"BbUDBȃ,ɷ{8'eIꨙ(Izdi9uy7+:O#͖_?(ճ\wMz-;|q6hӍ?ON=iٕ\12N82"bb[l&>=3溡 Tݜ0ʝ:EAF.nq1" (`b*E?^P?}S.Aj5Ǟfj{lGot⑯ݟZF"Pj@QQFG uz t|!ݽv N9HR$0bAb(%LC,J p!Bi8I45Mm:fQ-N' aiFran4_T l#dIRA*-xVH8 A6 )rVUna*ra>A( $"b2@°o5P q m.`8($IH8VL0  ap"0~#Gf_ e%8e, ,1RBҔ%r 3(}㟹gzvՍ##`6^",Fwĉ{p7{NwqlrjV~͏vVK`F 𒤏hu„vŔ' aahpqyA\,bZuQV`f #*&$1@M)  I$I*q2d0f EDf$‰9rf\e]%YYpJ 6w'Ɵ~}ꩧO<ᔨ&H s蹷|嗿73s?> /_?No7gnP5IH>|囯(󂡘eۏ}/nSL CwKg(et' G>+VmqJEQTICfO<>8CAE2wqW:O $IqQ3̙3g~}΍"z7vx}oxǞ{+`qfö-a`^> hF5(eZnW2%cTPc12\3\otVg>}o\~sNԩC-.;;ׯdn^ci$K38dvk_|.ZHI=.2C NN? I@4O|d(f$Pڗ`TR3;[3k[wdgfr ݠ% 7@10VHR%H" A)B@1ı, nr/OxP(̜Np-1Trʙ8 803Z@Il]HS OByK`! J=OlP&,]!EE(PQDյe"iN7}E4@*A4iwǺ В''WWV$RKѰL@HDLЋ޸B,'?~߽Ŭ~%k9xDs,d1N9.]iii1CJ,  f5_;< Ng_n12 rqف1v#m˘д HV)`W M?^$bou ؙb1kLTܔqk2y %Ud֜&)& "Q7tY^J.s٩^M0uÙ\/Gֶߘ;dva'cc#t q[ o9zK:r8V7{͗Os@G'[-F#DlV3U,>wϭfY2G0?SǞxV/Wș17JdS@p$=OSN2 ]Q oժjG00, ?,r/pB[v'㣒$+(NvK-35[?u,^Q+咢/ 1$i}/^\__Bz޳>K/MOO?q^t:/_|?d}3h|k_3M?}t>a4c&M}y~+^i-̏Tge]FªJ,R]0NP' Mp /K栗&AFHv&u{ p9[,C99sdX ciwB~j.qk[|guK/:v B0D;_x՗xɹCQnT,FDH[.VN<+ݺrEWJ$b7ZiO=t:wd2l{8TЁ箿- QLAcL"](BOM?[o׍5.^z'lS HjǏ}*ΝǟZ_}߆)ZX٬ iy^=q_&c?v$z>;K mlĩɣnso>ݼ\~MIg7~^qrJdTMRqbѽuرÏx{UI u{nol˒06;zv3ϸ*7VIK#Z[`X @*¿>;w$д c3@D$RV7;nor{hCkk=2lƮΎ-by\;ࡴbb[nD NOMo-h9!8 a5#$AǘPB7LD7mC8#@P'Q$CA0\##5D#u!&Jp#KPCe#'$ꢂl"6 sK dd y›)A3\A'$E J}Y3=vc[1MAs [txQᵫkJf-7F6[WŘr 081v8:u2:?X5z.][_ R6P(.YnbsCSGu^߻ tUk 39 0W캎zdfNn0Lf :^kkl4vD4(JZ!2*iES~A@3FP!Qغ3K~N;}=z擏|X> mbrD/?v #(0'VVjֺdf\>pO|iv/W/'_}kőӗE(vfXBa1F%J1B4%PFO]$ICgcs\)CbB|j6UT%cU<*E(Ø p\.S{W+R!ݝ$!.wk^ń4[0 9?7?IzeU8 Ñ/\t~Q쭔һ ;;;\ζx:8N祗^ Jt}}ڵkb(1ANv';xx~~yq;ASgcW_=v*j ]wKiI|oGm\8nVfwov!VgYfiʚ>g0z_zqvO)r'gb|֋r)ɕq Oj2uV'n2k'*Д:n1^&؉0BƠ$bnEYMSg(v>BT)| )LWG${PԵd \ugD,I(#O ǞP4H~sageq=tHk-ILEgh&ef@SA3% =UUJzw2v^mӖoA am =8INA\>xB$p%&btQаR(e4=IISqL8N;lFMho "i$TIQzTpfm`d :ulf6GY׮}qz"{ՋW_ZۻEI75CE . =p8IgW.`ׯ\ݭg/1vGvz,}YVyBR/L \_QB\ ͷo g䜾7!LRU˓@\Tk+I/aq0"A 2 nHX^pME&gjA26ݍcىFs 39rV)Tl]ZsQkV^~ӕD˥=8s;s({͕gDyd"~fygE"1-h~э$qJ RaHhv&?99x=t|Z^t/'{[Of~ڔyɼ1~G=ܺ}guS3ʼnꑹC5I'-8!d]H0kV#X˪Z^e/|Çԯ5n|#8\pP #SUf*z^ 3>/z܋ώ*kVb`.9=޻=s\XvW썔'ɂYJ$p~qi芤%D@ZR(K#\V("(#$28gl6  0 b1s; ?Lې0M$&{ծDH-&49⺊*0Gڼ\jF~BɬZNzZ!9yjԋ^ Bs 4HpL"/f 5D$,S9g\|.o[&Nl6X٢h[FA ( U39W{S7$ETD!!B@c#)8} EBu]g 04T:y-xzjD5ۛk{;vww~a7l:WU 2!C$.\vIfrP]aXȊ, X  Cأ&(lG]x냝+w65y8nl"Nt1uSnD0Ib$N8 eݡ8J 5F׃*G=+N tUʦpydvKgzd@ aZFEQm\69hgX&+ #/,8~[A B!36YXDgd2Hdr%Z?Vj \( |$($1xjCK `(:vKϝÄޭ9!d=ᒌ`oapT]ikkS7ut\ofvN58eZ˲4fT˜$)I1+gΝ])$%IJRL e &JuDą[7⻲ BaA1&ڈvP$M q(6e|fvniq_h)HxwŦfV0T?TV|PdEq~I|6kݳ|W\%qfv\Zm?~JsbRĄ&b/񼾾o}}ei+lmm}n6 ~ϟ?ce2CDR$(Ã@kV;}巊3QFC|>?iX:R)KF%z`%gH='HZb͐|n-GCl_ynqJ gQ[혮y3b34QXJRWYA4fқo|#vUka' ET Y2fFG{{,jb3DTr N47 ڞ=c(Zuxdo0CόUNÅ;xgNf_;|==ebqC%^tۯOj%[ōlXw >$a*(H$b}nC't(V/OLcLzA|kq߽8:=2@w~}ڭvW:x֐.2bjp(H*Qٕ ofuckH2^?|;{{; X4TMvs#3&\q7{~#vZ}US,gdmȲC5[t$ du;]'0 "3XjQ6Mb(l.S۫+/tٱ)Ezi:ĜkH`dlK۹͍cglLe%ٵ+w~[!cg?$Wol@YEMrQ%D h3QZjiHRIfǞP@"#EAiBEIbF q8%5FCM {_F#(cqJ[ eU8I!D)apXJd|wjf J e')%)oAS8L4I1?&%ϧ x7%I1q⻑?&2# 9@ &Ri PdL(!1%"F @O82`Џ؂8P5czvzM,(q&P$%?Z\u;$m"AD b UN8rJV:(R[Ӻ*$%<kf(jHcij\{9xi8/IV75]ںŞT/d8 n]'ƼZwI& 68{'>|NӒV_y /^֫{g%cx'_;rb<"\7{m70C$,قpB# OM:F=}ć8׺u !%{B)3v>vtwN[( F*@ehGxo DQ$JabzCĴwZV+RB[[-**;\] Z>J4*1Fb݂*@db&9!Y49(2 )Xd$P6ʈ*hg=Rw;3Az)Iz(ɌGo$41̼np2_Li*:^cesI sj¦^恎%(<0z NOl޾ӣXicw}zuF滛k^{ 5A ƃTZByPMC,ٶzyi>_;~sYdZ |1U($vVUp3H 𘀁Dv{qk+Z|WGjJN ;{w7sfs6;1vzM5`& ؓsruhyt3ZJׯ͗J% QQ\ĕbHhlf|6G)ܑJfK,AByRYLBUK)&&SBcwo8zpg։|$]"n8оf ED#&)cw:F(+qFQle3aAH10cL(cI(w!,N e,F3yPJw0N+ @8:m(viL.'r S HHwy{C'Gau}8[vF0$qW7MQ{g) !FE]tR4]UBH]}ϥH8,+5MAծŸ ʊ(wlhQڈi{w!]gML&/膮ZGa]q(L8'Ao}k0<裿pJŋ_xᅟ Q(-2t纽^/ 8~xf''_gggCYӖ׏UUGKӴ3u‘O>06gh@\qˋw8|O]?$1׵lnZg#S3/a ^}i'J>PVt[nP IDATnur#/f$MJ57I =/ƱT5Uj4664A ~-P! |+bk)ũi) 4tV4#E5fȐ B֑XqW̑ff?I(IT%8Tb!Hʚ$RAЋRjn I`G `S<(ȲVd j{A"\'fZfw^}]7̯;;:Z'Ǭebԑ>x򉽖R,o/,omC]3ݐD Ml:B .!floVnOΖK:njPC1Yчʵ ߍڃɖ(L8I1QT}pH V-jYlBhڴfeQR9.HeMSnwlAbe) gy'c m?~FJd Tl5o !.\H'|CϿK?φA呑Y~׾^?wX?NEI! AZ6t;bD҄m(Zs\Fy+vXA:*ZVubYA̦gFO? KK[{M+_ۻT3LV -䒮d%3h:LO;s!C BHTK{n⛕7O8rؽEU޾7?e $bgXѣ׈3f/]}IL*1bT6kjמĵ[5j.X||"/,7vCǡi _} ub"k+!h rg +@J䴕kJ6C@#PƤkۻj䬨+T ' 4R&N=s({䱉o@C2)w{ U.BYK&g-m TS" !IX(DP0 ce?ts.yB\KQ^+YPtLa8n'~AMs68WԬDon\{`I<03+˛yfxb1 $ @ :B4P(OqP)#Ab `gݘ?ϻ~ɬ?f=O^|]ˎ~_}˦^X(x55^7lHI R1y!@x4cALC\GxWKHc U5+*R:(?8́ng㿮9@㽽sϜĬ01PE\YU&#0#cIf6'|2Lp JNk~ 8 F\H4tPՑ%I f2R噅vbB̥ԚI,HCk/^o r d@>d63tƃ 3Ņ G{0xhv(f,87W΅R8S_~Aji?Yt_h.O,68(038q[;nn[^;( J%MF8S^/=dIRBҷ쯬/e}o]"dd]PY3dxsdΔDEMw߂ل )n#kFJ;J)ļQ,dA|EEwYqByJY =Zdd ^x3ߐUAV>A(Ȋh4N)@5 o;z{gJwV9G=Є !?7(gfѣǫ*MRT:t#~_zG?Y={}o[>3>k =-,,>4c<==3==so|qmm g=}奥_⬛R7ϗ5s4UAL@%P^Y #C͞urMbTyCD/ 8?;=%k+kY:X;8Fg/l4Gi{|Onn\YbwZ7ffmlU*Lx绽eF)LG7GBU.U XtC:rxiN@J>ZQ+f}Z FK?=Mk;FEi4 ss3 Za*閽qx1%O;xsO O<^n뮇&E`gdz/>?}Ct@dč-@$3Ow0M"8^:b{6Y %岜2Zj rohIJ0rS& (NJ{/tU'&I:ra@,EZǮZ mՕ1<="c=WѰy괢}!0n4F{ 'zs1^|EIy䑿=?4cڵk=gY?O}cu!$+'=OOɟ<E$0wMLLrĩ3(8#Uިh$p1N4vf焙rP=}C>~XTz=3a A9}z-`kdM3Wi/6/&ԼMA*K moZGF׉q$H2Czqth r&\4x2Qnb"A40842-⌢AhaZdNElkuow}h ,$dF#YR>_n3QOK{YVY#˷?qj|P_9]vs#HyϽʍ'RzG(f޸n]BCZ&+7]:JY4^90!+W*SdA7 TN׻lvr>G7*Mj-X41RY]91gb(lAHYBA.OeŌ1a |8|).$R-]M2ࡊQ2@.I\Ǘ4# Hye③*)AB 1nD Rθdk9P䄣Yx .:E,p~1D~tY7\:ʺ(d),¤{LҸu&^bNOɆ>DO"bUD^ ~Պ3zim#L;k!5uB竺R9P;&`Bc:v(UrHHĢPEc (qq J8:RhT;p< &R1s#-OόV\+L G1`Q0rнuCpIE A%r<Nj4 ) #/#r;IhvE*"%&s@C9))xYP,hyom "EYST`Kz}ˏ;~Yz䝡yd?/TT _G?+|}3YGPQ{}С#O=Oow.=|Ku9~U! j;z_He/8`,S D @2uhvRʥRYF)!$V P`1q\z+k1<1qW-gm_Xxx!՞xpABt1O4Ra=ۙ80_)!3EFIR6Vzxjd)?;+W67\\X6=+w~~ӟ&}⧯rnN( }"99s'K"n2ײ{IJ(!9dyjVk[~9$|_=vw׺g9{\o=%֏:~:K} i aK¬Ri2} @ 3 f;uFQ"T5'-!LE++۞鴇#C)ǧDWʥ&IBęP'jrtz3J40P&,DAr2YwhGLSBPI%12a  )Ds"h:6]74M )aF$D, O#.JNC \ `AYgyŧK)q(VF,?|1)y>4`i2;;t2pm婅7ڛӥJcd5 :&N$a<9[vw_yЏZ} 'h&V7&Q+d KPjp<7[DVFl 0MeAf.ra !ϑ4R' oY->*p~xnqwǾ͵a4fy"Ҷx"*\*cNż!BR2 Y(yeZ6\."ϩEM.ÐRNU_ }$~uPX]]}!vfvGCG2Ʋq'֤<cBC<ƢeQx{Oc1fmOJyj/=d۶jg>||8IIIJ1 8Dz <~X6B#=?H 0/~<1PNЌD#~V?5\7倆J0q<xf  4^2eָϥ1QFc?H\A1 |4Vw: VP+6rg_=OxtyD^[@wRQ3)a}Sd8U?\/_x`Z:'EW1 $x+ACSQ d,9@:4l={$XK%JC[kBhQ A҅XÉGfJ5\e~Nmu?=Y퍺!.B/9C^]OqlPZd~`>\.So47oth9 Ǟzs\/Z,KhWON!8v|Bxm´)RreF҃OOsr??3T_~m?Utmo~I7R܁on{aejeo^K_;gT,0I/x=:U1(doC?2|76[]S/lѣ !~NVϠUW J{g8v91^$+i[٧.86$$cIhhd)u5?rxvwm/qaiIF9ϱA?rqhO9bNť銑Gy-09sH`gIDM ISA5<{Ò\f"2@N"j"z^ KD)!US%G(bYcqJ,F)( C#1Ń8c@R aID,#!ˇ&KSG} Ƒ`j̠YYhZn_IGകp{̢ۻ X0_f<дLHrJir`r@FYZFIHhgw7 jF"YTQ 45% UAȂȊ, nhБc?+/}+_Đ)gϞmL4㌱8!c/p(%Gc]tExe14~Zo0ʕ+333w/(K@Jirڽ .tv!ƞ5O&\zyT/;NiZKHٺbX.h1o^!'W$*Z.7vv:"e)DqJ%mӼӴ$ZN6큢Wݨ֪[,`AJ#\4not#e7VByfzx9Y>rt "(+綯\؞mǖ^|2)$ pmolF~я7SksQAܵ|ǜQ쨽js\+4, :,L.ʰT9{;. I^gܳ-u/ӢYW1?|z`(k4uȉ{~W>%ƠIwTS}]A_t?ֿ(((ׯodDŽqdrNVt#7,Cϙ7;]F1 zvz}vne,( @+Uąˌg} 1C*s 44!f8;nxcQy. (Xdqi#e,Ri% PBdY" 01̹(plJ\A~Мuv,BW%TjX_r! ",-,è€\(,l\i! 3Z s( ÐQ/}Bte r,*/*Vw 2;;@Kk7V_ `R5b/=]G|q6,J9xZXnY揽ũ|`rwf?釋7Ic]7itq0{]l<_(1>ӟbS[R+7!td%?þ.(<2r2Sܡٍèu/t͡oq .Os-{eszٜ-,N<]р)GAsÇ:o|jYґUrjIYF+Qfm]{вFI x [m7V.]p&#"sHxissrP|^qAJ-(j2-Jlj=~=3adDn` aN`X憎LN H(63>|I۱J88U,ISqՏBEڔ^kYGa,r=7TQd0X1iZ7odeV+s"|9u˜~u6'&JvVgQjӔIv%8i=kZ_Ԅɹ3ȟlex5+Javnv㣇S[ kJ|#KI2|߶| }nL "Ngd{ .3'Rx5zeD՛?{%U.TuIR&jO? &ɉ]U%C Z#MpcryKEHqRJ)̺h,g ^k C3>FW.=Aۻ6m٧_rI$ _C9W„a 20ol1jP/,c΅`ׇ>0J37QCA^f,-W *UT5Evwpa$4#*Ȳ%q&jIUU1Y 2 9$jۺ'by_Fgo] $0eQ,"Ǭ\wlf I uRnuc b!WMB'wf;'|wgƘi{{Ke[x[~4con0оa#Y{u/o )9_nmqwzݴ5Nɛ-fV^N@`Zco.EqZe̽9>s=}n\~n"o9apLpƻj1=zO,-ZY_ߚXZH Ν( _sZ DtsWnT'? eY(ե4c^|c?F]W Յ)'6vR C{hob0͚u;7  :C/]޲@Q($j'76c 2 }AG媕|@9ɽ|sg{qmqb]%VBD-Tt0S'<ϻr<_W7VC5x7uY=5gЛE~o ,bpKTD!Ϗ(FcPc.B}c8硦+A܉Sg\}{ g|;3L3q\k(I5WP'TSf\E';qC],7,㜔cT5t0[:GEm%s,뱼H(l^aC5F#/eXm{!cZ[4$Y&$RE$ݝVW mN *v%e<")aJb41Ib)\bFRIPYeqܼ}R78;*w{~w^c`7[zk햛-+û n51 @؏RB E`o9@R;W\9s/.??uC?+Իiz%z7÷~3BvEC>ȇ6Ͻ_L$/7m2*.@O쇞MN0uqwE)(QF|7(+ûO}2;/7p}nus ެ i"Gݍ 촶ZyG~Z>ts{>ءtx.K(LŠQ_O09am{^tpq:X90rGη< Q'i!1 69RzfFAv|UdWsF{ΏG>|ߩtmT6Jzgf+.5Z.\eMGEݽ4bDo$C/owyFID7y^f OM6)!^Rɲ*!~g[rŒ1:/P@xG[ `zW힡XyJZ;wGrkz3k_o|c'·5?|g4d9 D[OZC, bXq[W83e vme 9Kj:hzȯO5 <]g'fя~}˘ߥ' ǎ( c~, g.MN-=0w;VTyqBK;6(KT--,ݛ=+dJBUS!a+{;ݽ؀B~,I22}ृh/HeE⪥jG"v{^DQ*5gekhmoM+#H> 2TD0q#_ [imɐΩQDdG+/^w\ݵ=gbP2 4Ny#o{1ĔW5FNDU *!BW.iJ0/ɒd(j4L$Z0aeŒ\.#YBgv7<ԄRQ2HxqfjR+{&(ĩDIȔ0&K\Dz*q1\_\q6`\?>Qb!lmʒ!Ձ J2.jeR"dQ DQ1eEӔ(94,`d,- zcz9)훻pdf=oXo[#/_<*(ٮGX`(HH( ZPls+N7&5VtDEJ㱻sfܧ?y9}^Ew{(`,QU`@F5h(r%ʰidi36`<|٫g F 8)>ޱp QJ)YeY֏ 莅琟FZ_yG[B,{=C[w 3 6xG RBixP,1Vo^W ~E\vܹs=TտqPxGIhimƛۄ.Nq)}+QB0!xMNMڅۦ a<VUYľ;F\2LRv{=k!B |=N |ލ[=,r՛[/Wyot1f'\M[-k 3X[[okDevy/P$ &^[ʥխFÂmA`NMW;Y27=Ʃ A$ar0 6ɜ\hڨ4v7A[cG/J0x%gg9| Y |&˸^lmm;&\;C*[0޲-N Aqai!I(2Q7wGo8w\}^pk[ͩ$\Jõ˗VJGJ0r BKzPf4Ȳ8D+˲ Sag*"d:l"](WP9-T;OXYl63ǖ9P+N>$ MՋC? (%k;0&J$|$AB{ouysa_ (P{;ER"MKlInִF<31=1㇙=ݡe%-[dIDqĥHֆBDow_9bUrrO?"ȋ{KkZ2,fșT%ײ陱s)yIfv_ų'#St͍Zս᠐[(f#/q0=NjBxW"vc9ckk;x!oϊ#  IDATY=ū"m !^!Qc9abYVe[=J$QYʸo:;]mtM3H˄8ta*2+C]oM DPt)B ϫH1= 1g&n $,7^ܱ8x v]x q1w mG5-2 (Ȫp(r.<~0r =D80#?\P5<*ds)R[Dx I?gFgfX;"JZ.%X S p{A4Nmkٞ'XN߫I?a.U=YDR4ABYK)9TWA(r<""&f3`nzb2ZRE46a^~ε?{YVb9?#鱱K, @ClwFJ|6U혽\+iY+h5Q;z#MNeҹr0+D0qBXDw08"(Ʈgb  ,  UC6lURC C.&4NHD־o_uV+ˊ@$PJoN&` #>|U՟5zjzw%ْ:w0@3)L~# H)=(+Wضuϟ?&#Ig4Bo?q8~[ >3,X}\.)Q9[~(󂰲|n]c(̇wս֫~Ġ#A`>5#tx0`DA f\"PdͭVweI?l}659})ӋONol^G+B7vݽJ}~i!V5=ug?K޺455o])MbSӆ[?k=eEWئ #E%6}eJ._C`Bg2t*BܥKWjM &q&C:v6[8z0FZVAx!&QMƛ^h5RZW buJM|'\ Ra,NgfBH|eFHؙËQ dyNvLXuz;Va3 &"Qb*8L$HBJ#svF01UdJ3=J S5Ns_ϓN%S+a=TesBh!=XSBX2 Ui|tT`S%I+RwcݝZ\Ab9u\pxD@bgw_7_抪$(O/<裿wN}vqc9%,g6_K7h;/-P)!Q-@Z)"Ɯ,e #nm7m B lW;X=; UFFR#kXnp2@NIEC)t`JRf$<44U3jnNkvER Yx1 (L|'!LLJ&^"'$I8>kYdyb3 i=EBA} cw=VQ|; U!{{U {2S) B} k F 4-+x9ۊ,1ıYȦt Z,ptZ-20 t8Dc٭ޠI,zmW֠j`(2ktM͔ RI#>ĝ]:1QȋypqĂ+9"r)1[4F&3t@Rot}ۋ)P܎F',+Lb H '$I!lF#,uQbF ABAT4*8ժY8EW/}j}__|C]reG} (c|ԽY?9RvO30߼3~?=Cߣއztߴ3$=>7nr_n4eCss=3SJa'wHe\,P0+sSy~˻/ŋ?!EHnƠ%($df6l-YTr.ipז!bcAF[xl>yOז/1 +Sr JQȐb޸C?6?˒ӥ#0o5I_lo$oG vvMݼ0Ɏ/N$FAIlkBFA6۪<SSbbj فٌIKbq;n ˦p;5,U3r xRnȴ,B*r $(WW\>wl٧ WW{?_g 6x1m9q< QhX߫꒦ &S[NR2ٴgFE#gsyHD C?m6t$"`b"fT[21z .ҐC'0-~|R82{vZY>;xha~řl֮q +FVl'|uw8r©3KOr"e-?%JzN-[WoH{ɬL2%r'A0=(bҭznH,aD.(\D$cl B"ثefT$LKEQe CɊ e)_n*$0ֵؐYbTG @l"ۓyR.zBE*ۏl7Φ nh VdZ8T8Vy4vhZ^0qr@yVdIK!V@$ǩE Uٶ;N_02zm:^bSGΎvezrX8) M\ɥUU FeRTMIN(r.7rYv065>5Z4—#%" >W_9QHXx!e%硫DRlD˩SӇa$ͤ"sC˄sBe#Ht@=JXU*NL^ {{{*! ?auk_/F&FxG«qv/`goLQUAV?I$1laHF mY2 ST(z饗N>m}Ká b1/}K(~@G_pMNMc&5)};t[ xO}~(v4In14^eBËGJ^np}l柿gގ{#yW>#ߡo{{_~ת)`m4vۀ &4XA{_6XU>!dJqmgW/nm87Z>ZX8.#)t|ltɦGJvp޾v(ȼ, ϨriYŀTb׫])Fxjo}+ANT._@riX!aF)Ky <=oxhaB7Ο Bn+ك6EMEhl.+8NgbT8$I([NJL!X}'8d\; Hdsޱ&&J[LEtRr#S/[Qn|̤3á)0f##Jgxc^!]'-MMLsܷAC!@d\jnuBA`E @|llyN  b8}YŌ{,p@%("/0aX4rbFFG_y38q?|%mvHʼnLy\.sUQ=3 vgDӏGAŸXQw`1o<4^_=vX6mH'ApꥍRܹvы=v?A,01d I8N0A@&ۿ 0]:X&I͹zᵷ.|/KX?#+Nxs<H9}Ā`&IհyLRC"%P AILCN^(e2N" %aljmܬxy=_))ص,r:&`MӌT**Hrj)>DqFVHQsTD$ 1K!Xd POIiU4-$EA"GrX B@FQy/DŽ"Uȣ lܲiOeY0r Y'aR(p2(꒪0uNh #<3p`f 'Xca) YG`(jvvvML>0\ٲl;M 3JR*S$d(>bNnYBYD xrʙz;kiMNU33 rzM֊3j\6T.EYi9 V2TIB\o 7pDIF^:kJa@۳6@%(L0KAm۽DPJu[xt$E`!3m$nLd$5=mw#iE600VpyP0<kv…_~Y~ck( _G GQcj{{۶{?ܧe=(ۺ,$ 7؛dh4Lw yA|'7vju:r ,򳲟KSw M'AkOxrkMm 7Eӆ Epqt&v쵵_ ώTJL,=tHqeOszq(h?F]rGǧũE M_~@VzȉJZAıݽuG|{1ݭ7W Ȳ^veHws履ASg_J8PGo~{=É؊2&t z.,K,8G)\ E7>ˏC4Eظ wYtX,2nH$aK燃c,+ua !dtBls'wh 0~T\-f s!]X>;+W߸^pmUNkzɳ3 ',/V $sǧUw^5'Oegz^W˝~H$2e/6=6q1-zX>0yjozCx?~啍v%n/xΩ6EXHĄ"++BD(L(ɀus%A ;1+LlU7oqq^$혻Hֲ0RT h"FLbDC &QPF"7+S˙wF,29vk^FHTWx9N,#VRr!vb((dKEM^Ppi)^ s  x8Ḭ8U(NbyVGyģ 0F!L鴱N2t"gKEsE ʼh G̈́սDܩ\z5]Rabv̳Jz8i.&e]۟(ȪU:󢓖&)y~qg ;Ǝ  4”7}(<}/ݗ$ vɦg6 bOTyI-ZWbJ%Fo Mc5q>)y?l;s0J|G a?YPMO_rJd~K7xwnϢـ}0>?}w(C$׵"..#DYY98҉RUH$"H:<:(f6V3+&_K`K?vkCO #ۍ%Az~x4$# 4~G''7SD a5sc~hZhdhX\SIPC!8t]Gh!Sb̏^n~_|ɡͽڡFLmvD1Π9NǶ 0A 0(&4Qxcgu{7'?pV[DoOiff&A|k[/uwC'>nWG=*"(Z1Sxk˫M$J cj+NvD{jRV|;=TaT>7k^}Lvqfd?W|ng;0>RkcHxdDH %K$ *d%N?pPdEMR}aUԷ[|'g 'ז/\_x_>Ѽ\3;!L<;]T09dV0e!p! G+-Ë@̱y=Sn6[=J IȇAptrʹcgݞ/=qbv 5->~7~SqHg_Ctʖ }FFu iA@Şf*Z;K/,N<7pa ǡ c\#G L X@@c:khspMf\Xy'iETXܬ;/*b)vBR Ciui:|:[ds)P}e%ij|vu2%6kmc5+08m>Q? "i"# T&9P`7P((ga8DDlK!/FHfiVȦtwֵ7>MBZ\#1op#OPԌ(yrWS2{IVW#fv:'1¾VH16-bDh\gXvlDFIp(FkNgϞ57w,celctگ>:kT߿zP9u"qDpev6#8L1NٜX1ƞE U~Wߨy+?RJ8u~3-b bɼb!H m lDI(*a'RJRaqt 'g&6`ٲR puǏ@m۾ȱja/O?g쥃gޏn5$P3&}{`_{4$BzQ1ۃYjkD~>h&&nQߒoԡ?8G$@)X8@ bUb9``C4rِT6}Ktz]5`xz)(FBzo᳟^&u^@ $&j:Ib1+/CsWMgF ,<qHad[adSLǘi^,dUULHѠ9z,U8X?tx1mW+ SO޸‰q~q=$ X][#L\ ,Sk45-˜@ k;3K(]_[ a:0[5)*_.W뎔4Mf.Xq_m\R k^LW{zU{~cڽ;ZWHBV>#v<;å&'֎.zy!Nc!RzltWW; -%WJ#?ogEWap7/|֕a'U<2iNڌ.&b_T5 `;'#Z+x\.qt $,!.!"S'e"WDaDAD˸qaؗkw7{c9uDb8E(\zO.\6a%. S Lc & re( |*"!Qz$T`y ʼnH! 1L؆ (A|1nxI%~|F\@( tfGr/:,Ȱk;A FEIi)XgXYtc'^LJ@LJv j~B !ö| `ׯC%!Nb<; |TX.md`X= TU G hn8rx:- zAIġxz˵6iZr9nQ>ҋ\Z}ͨh}r|z"?ٞ뛐!vȁ lA͐ЉQ 0é8PuXdamF$]qzA ǟxhXt:̉- ;b;Ž0 tEENG@ h43_=yB)M-i:4x9E @)@B(4/c1 C-c/ $[rRp="LyG㶑7/@B!$`ϏM ДNs;gOY]`ȑGxzsGdA(Z߆Yvt_~!-8rLڼpeB1Tjk N@#A5Qj?;䞾*ܠky ,4dZEa"+R̩C4zs%U/H442 p쩣*( (9770m,(~oM͍98ulVT*$r3Ōi~$8դj|I{YR;7f<[Aps:KSS;zԜN S3rA@TU'8 <'hԚ÷Z)+ȸojb&DUMᇞivpl @XQC3 CM("INGX>uTw,\Gv֫}׉jm':91_Y|OwI]l0gʙS%eă楾fŜ:Bvub&[2h&ܳ/\#\U,-yvd.#Lk"S^{͗&KN=Q Wnwx46Q<:^<$B1|]zKo>|bl{cG8&a_|~b\ѫՆC@@2L$6 @dX ,7kiޣ`Ur@Qd=*r aj8Uam t.)'P191 D4tH wn/"a I !d `]$j q{on,25mB, \*ux˖&Jc^[WwL~rtb}l 9eSz'f[Da\ -]RR}e'}'Žfwhb'AIOlY !z#^ݐ錐J 4UM3_d+ŋ]-J(nv=eӔR˲n+gI_wF :$WyL)2Asn( )?Ӌ1W裏Ń'O$ȍz=ϯ>cXGu> $X,dS 0$"xۙq ?CѷjMo@"`N!P@ 9Y#9nز p|MA^ppgW&17AO @Hn Kw_d %&he\:$,H@( ZOwהG?ݻ+?aӊ뫛$STV\6QA_Z8W͝]E :q(jJ~X8QŒk䔽]U>x"s?o8+RGZJU)T&+lit,4qslu;瞙=4궏>KJRݷn80;ZmYCP!JRY!M* ډ,7}ڶogO}uڋ?xuRH] /][EM,@gۦzQI:Ϳt{3cW.v́ı;$DT^`{jt:aLc~}ߴ |$LN,/;!e#3`o}OUw;/_~v#nTN//N=`OЩo8ڽ)HrSҩϖ8O~sNhs(L#imSBԗ1Z;+o~gO } *?nuᵷw M,#" n h F(0„[!$}$tLoz"$aGaҩTރ>ىHEbF 9%4֯ל]N`9Q{Vf'% I|rDEX@Dxw=PL gO:sQiQ<50<l@2vi6ӆ5O9Jp,|ы"+LTI61h />B~AI% 34E0ۢ!v Q]&)LKVȂAJxU  STXV !l%t~Ur!5f߉{NRqR ܡ ΠH>I EmtgYAQ$3 4| e$=Fo?&i#?HAzDIaLB5MeeFױxNLV-H2NbIx,SǍFc|8]:77iڕ+W8r|fnn.Naxx1'O\YY}ozvx0@//--ޏ??򗿜Nx`@kc* _aq%>*;KK&R}#<jvbBIt{^K$ꙁ$QZZC"Q0Q9ㄔ sˆI' GfhAU2  hÅ M&CiT4C{ezw/?'vUSy`!Z(8L}=ԛkoH(O@hȄe:KxX RP0K!|Y-י>?K'@,~CMHN7,mԧۭq]46v֠JID]ʷ.}v_ q9u`b*ʳ |nyѪ,lb``D0O|ʽx1~'&(]?&8eb՟xCϋ@~戮.|lf:݋x)-o}c<XJ*k+yEbe)[Lѭ6,oaly  C@R`%a k^-CTPI4ó ]ِщ u#p 8m5J Qc5D,eYd%mQb dlHDI#.#vtahlbd6'|N;՝ݶB q@(C8<ӭ{aXnU\tHNI<1 ^)B@h؞ dEs}@JD"ߚA׬5@B]) qW_s/ q[9="ŲI=5M#gᓵGɛfNXJB`%HDTF~ӅLk#AVUHm* }l AI Lgm+98 ;q%X@Q~7%8M ^^]ժ0Nci1*3w6\s~,Bփqun<ϗ0 }j{>#0j,?&;j޽O+<ㄐ|>ڵh4s?sKKK(B>B%Ivׯ_nۮ ,Z^^. UAN?s|=Lox `sXMH)wj._( >P>oP۠vCP&)Uv@0 P }d@ u{:K}DIzm{ Է#} Gߏ-f@=rz^zZN,J(if+8n@Uhoc )K>8jkw3R$f$#Z"2pbeNđX[N0\tyS0 ,oݭݱ BV41z˰EF#R yPv˻ʢ_婑^"./R) <\>U],S'pujx:,k_?}rXI& @ pk[h&1(E8MڨlM]XI -K]{nmOxб IDATuBG]YhD8U4 ,"Pe]0 8gYR eiy0vV[W c=~O/ =vw۳3 w_]]Η2:$?NvJ!Z@Y/.ϲF#b KחX,6oYX}B[GY`VlոrhKh!#72& avsMem8z9x0D@lca~U1b:&Ƙqzmnյfc r*Q_ X.#ȳ'FG Cj>*/<"hF(BCL 90,"$!t) 1J}/DHy#'}m3H.tI=P7 FJ]\w[cr"R6ۖ:()!&?.&rA@)N%aD@,Q6u Aj ̋ݺw{Zy硏 $-٨Q٩7~t@)=>~dtCBqgwc#df[]^lDz /NoPdY=aǴ!:t2޹s^Znmm=kkk[[[}z@M0nwhhСC/R({dt:BСC_W?;; !jkkk+++/BwޭV]S:uGZBm۫tL&ӷ,--iVզBzD"Ð㸏 $Y&pBLl)./'~_Rio@ہ@!a~ K^+˲r[g?~s= }4 hHQɓ[G0~>1#7MB4빤RQը1=x#S@>>˵X/~Z]رR1tDIeǧiMY-]CêPmEϧʺm\`Hvu:%wn1( cInj+ekckQ1MoWo18X,(OڭP<6e3GYɔkHBUL|k4k͵5IPwGS3A -꙾(HNΤNMGQ\4:7o_<>1:׋J\ҩ/FR`&+ߞ8tr8to{wوi>a*0 @VRI9ՌʧNd$z. G񲼶aft*Wfv%э#I ʗ}\[(-* j$~eP ~Ujk-B2ŲPb%1T>D bCT{" ]F24#ӼLucӅT2&8 q<"hɊL hyv\[׍nvz|8 v! (BeY> !f$1ᐄ.͖J$Y2`6*1,L$c,Q\oV4qL}/躸JKcqNrX]e?P*3Ӈ^ 1>Xdgګ$66r4*Ѹ G?dYEVڂ yWHQ5_=זT%d`8r̓g#bır9?zfѺ%iG*Ykc̰G~vb|oҷ[zyd`P׏Dm Pm'L+cSCjz#dSct.g@`w:yT)^VMA VnQIaC6&X,)|rBj[߳=칝%&D])Rn6;;daworƺnDOL*H(޾NKײRScĉznj"e[^C]a b DsBT9yH"!^z(=08~wYq=/ L2Xp!jnݸQ*69I,HIJ"G᱙.r܆ٳjV6} o_TVo@}F tu㝷./cO&>MGwtlBDɑtt@Tꅚ:iK  ,<B![2IODAi>~wqiM$Z57;7s$*b . <=mT9x8Azww-}x'jn,Ms [m d[fGQM3yn|)uscFwJg儔:nVK T0&#RnrپulM&d4g"pI*lWԋ"ENY=a FC0L$K\,3; NhbH W5wSg}k7Ww6G*g^j g@(Zh%D\&bHL$eElaEw7='з(LrD`%Bh }_a_@d2O?dܹs6aRy BO~oB{d2933O'aL9dz݀" wv`=89#{Rt4???~S,sF Lip@5%2%JT^l24^xvyq٧.Hl|mc]Sήfʥ=JI7`%pr")R%V+cb*766S^#KR-7*"`olMۨV WUXȏM[t}|(pQ"w$ٸ$D1/Au_6֫ W$-RѨr !Jzn!bY4 (BpmBpr,1U"B)y)7-Nfm0\ 9A/~p^kr ڥ[Z6ߝs0@K3 ^/k5n}-MsOOgN'l tƎ 9=:,J՛w_/Ĩ0Lga.T^Qcy`EbL.NlTlA16(O?ye_w:\AFjez{?f+q &sϜ9q2)Dl1X,6VIs0 4{ڕwϞ #"jb2)rd}bIE3+w6WDY9͎fdgFeټz;gG~1?u@-IYfNh6 #@Bڽzge>⡙(W۵-jڳ]?;z27:Li:$nhT%Y]#˧"y.*ab'T0WKAw%0Lmqq1z`P`85E{rjplpPoؾait!ĆBx<.IY/s/G:/(2`aeTzt'{8x$dbF"~ ˲}DV&IPLt,:|0˲ẹ߇RFTXmπRBC|$ak|)H?h2nk2/(?> 1@eHi,Ͳp潋rI0]x,!PAH??84>c\y^Fo'> ̪[eUR޾ٜpw7!}Cq16?h ǘc1?{Uk$#j<̯~O՞|g"jߟ.^PI[~@ aZi˲_ BkZU,d9v{UNcquyN(s8^ulw{Ov'$J .n:Цl    /-߄v@Zt#)`;yXQrĩkȴ;"Vgdt9!+F{%' -&''nZU&Qe t:Rt=#YYNJ"78N ӄv5Ř;=j+/Yre[~r P*NN=ݽdaiνׯ.[o ?>KssjKȐ$ p lW^<6c^x4:U+7_w7X p@)!. IDATQR)P턀m^1,P s>&'f(J ݭA!Œ,c ۨfsb!+Q6je R)(j\291p,%>`xES<`T$صU6_p"4kl=v~IdÝݕ;ǀq&!<ƈR! B]Ja-ow`4O^8}smfPPFt}MLqGZ>|[CFixmZķA ص; A(EGQlܳZPtn^Y2&/}?y̱v0Ay18{r ]Zܽ* 4.XXKCg8`4z2Q7/MM>~Dmev})^,O=802`ӷVB-$ƔB<3>t٢q,ahӏ_ċlӬ5kk(s eu+㳽RC`x:xlp.Uu@TMch 6َe0bXeY4FQz)r~1$Db3p4'38] ge;oQ֣X7!L&d>TSJi蚮>G~3|7 taz/uo>C?߀O >JMtOC^a?>A0$Q`C!2_ʟ^s"ё~}_!EN t2ƕ_fOB竈)cF1ìģjs(r\<˜)|RUK_>rppo~u/Wqx 77tzmv<f'>C dMQ<^\ڛ{+tFBul͠մGFyli~}׷6tjUTsV˫>{U;dru= r|K>6yb2sիTE>~ŋWy|6.lUD&,a2 CA *wu{D$,xrD cĽƔk+W/^cmV53`ؙ:ԹG3P^^Zz7Y3*=Y$6g3|z.g1B^٨O9~bSE^*֖xpsc/m|eM/,/ PrKyO9k^ݭƲ AHaSl4F۵nmrh\\V\FX@N`9D! aH< xahanXkŔdl<Vy[ $)#@B Q )7ZyE-dʬmvnmсgwVs^YY8Uʗ2 YB %p@q<If?ϝ?XV6/.lvƥtTH z`w h,aٻ3;uvccZ5@Óޠ a, ّBH3E m{zuٙ'{6m-Vߙ>'?&0ylV{? x٧'ù9wK^}k҅M?^mALN=T6^}u30MRɤk|88<8D[j|HQ3b47BvS4{TDco?*:8"m-heϜ{.+նڍVN bZͮ[sLS9|8mB}'>ws'&[}} ڌDd0i\fD)hjB -Y]ڮ<ШO?/{FsSbH`a]mGQ}bǽ:ZMFόԏ྄@(Y/L~}}j?BmfCG>q? P)m~YUa܋ BoKI)DwqewO2 ̝]1-$ED2vBz7<\m[dH*M$<:OMpP\~_*Wxr&;+ĺf<##Nu׷vsK))Y/Caf6;[sz[vk+K{pc9B2\rw^1c#D)"Bzq"F]3mAL wXvPc\/mJO}iIۺz힣3RKuYL;@>T@ 6ǹ ``R,u5rLHdEn,c#l&e^z~Ёb,ۋDQ|?@_'| R$ K 1h/n⾟Ao)i@P 8 h5UUկOk++m˲wA ~R۶?[?b=d4N c۶q6DZ.bM0PZx(N%*D9\0P O&DNt}Y؁o|[U:Y'h{'tC@o6mʕC'p'>}g[{,B"".tFAk6zEj95b~M`?8"%#&<cs;ͽt1H 4l]s~?|̱ƎN~sMɦ$HtkޥWFODKߕ!^8v0; dZlWC`H04YVIA. N˫ET@p|8U80<ٹ~SEWڵp.-X:y2&~fmgtd?J޴n 뛫3g8⶷Zm )4ED"V㱾--ԑgKjyoawmy1W$CYTYB袴#\^X&I" "]kZ;O,݈DyGgN;\i! @Ńf{CyXB_<;| (|ƵΜ% $; M!BhmyÇY;ʍ|Hp_ewar;,vsm假/υ@3>1yj! g^l/.Wz&>rCKv0A{clVhbpu h0<jX>5IͭNڞ])̔*^ˏ~{${i~i~umyl kP Tnõ ?lkm ,,x?~*ȦxQ%u=/j靝J]]I8Cbt!E1e;+Gkv`G +-ߏ8IB&#"ڬn;V>׍:"ύNF;ZVd|ՅVkc2%ew=;:nkK+b"WLv]ZAhDj|hqJaLQT--#g'02=~۷Vr2|CBm8B@RHMR0t mtࣨѭf- H 2hB6(912.'PDyT( u$QiGBwV?yrsfӨT q2e7^xs?|k潀RkN}乄?ϓޏ_{z䘿o4w# !O ֝,NaH#?rdx^,?4L`(C#2Ez406H6ث^_^t@6 L奍-x|JdT&}ܩ, v7EVHxH6L& eg&yաdH.,4cNBaz~qClgGJ .EТEN'"h'K+hk5mIWroc7w\GI7*۝ӏ;Ay ()Fmw &P):, <^P d*T}_)IoVn]}0[?~O<ә SЁ5gT*W6A;Q4-7KQZs0Ob vPa*2INE1"JES-U%vj62g??|^ͮ M66lyIVhQVr[zGr~/- ,%K!=!1uxXt1{VhS Hf֯;abLe2wfN]7Z[Y7n:3{ ~)b#Th8ODwu~[y,vttr9}IAb ,sw#-B?3&A?9Fۖygֈ1"E+(E1~\|VxGsҵzL>]лzp|-ެ;|WiT;X>uҍhg2nxN/;C_AL>Fݍ&r(ǹ" NIfַDH2܋o'TSO=65QV}GT[MRBHLpiȥI~`E~5u)HYCm-_d [o};`XL3t=>U`?7V:7!:Rhf"M/(|d8wՂY#nx+L:!Gɋ]nY:.Ե0y¥ >)GT C`Fi;s}⵷PLAm^I5fu{ެk C3!F[ "B24d2IfN4mi4{ FZul!@?,a2$֊e-//I#Ax"#w67ew^/<2o IDAT ˯7޽8B20EA& |lsd2GpwiQ W @޹7xGWK|t.~FN~ؖq_8ҭ|bbcP'L wI)^ Aa(jxPno~fIA']43}sM~֥aͲx2ַADafU¨c^pf<V!'ko$K2 Sa46wɴzd):Y]6vT"]Y^tr6h[ՓCI d0 ;LY Od#`n)qOtX,ai@'x~Qg㈢(^DEii4NXM324 SXhZ?؅wM !t\>'IOV#@ P&oԫ(,qoW~߾Wkdb^::t1{RSRQ gXtZާ_{o zN$'gU1 '>;;yk}|(6( S#uS7_tm -b E@Qf$I S! Iјpk5$Xv9C@jf]J0CgD;[^oiȰ U2Y̔l ۱!&0ဂ ? RAY+}o^y]L &R p7{5VHzᙢD,YTxT !$)?t[qe0H'cWQQB$2MBG#&~*)d dX%1O:jw[ O|3IB߮:<~b\bYZ)݋3sph,۫k7As( ^;\Ċ`H w;O_iNO ^?$o9! ɹR/~Bu/~7DQ]xW@(Bz+Z_5 Ǟ8Cw 43:6PNHOS_j7wF@!K[F\1w.C_̭坝 p46e^rnM>p諄0Hq8z45)JVo-=,uLMtkK__H%7~-jǏ(O{-׫k]FE+FaMЮiz٤̨ 4>C|zc ժ;=ON KDRa̍.8!:6Wi)7n6wqB|Z]ZȈ$lg?U[_Q Eǥ-Mb׷(-iۉ,O\b1l%1X;!c~qdګEe͟?{̅wkk #8AQ|G7|7m$") rFZ]F)An խe^ '=ǧ0KQ˜H4a D@]$QM+@Y:vݝo]]T~Qr:VmIeZT(c8BM&$@ ,J1ATEȏ" L̕2 Tlwҫ{{}ySz9vS/Rߪ,8ʑ6nvݞ*l6m홡bBM%nZ}APDg ?Y@:ꝍ3ӍHȚ%7վ&%(##*rU #wn" "dD80>4c'²KsC,G5&lf%9FH // rb&Jרi^0'tK"DR<3D(BQӴ ١RNNZ À9 l׷-?G$ o9!IQH@J;xn|CqHYzZW޿12lf|m$x3\bvkK(V{o[m~D4*ώ>̳ɣ^9uLo`\,"Bh=uwPn\>oV+ڦ0_V,9t{#xuXI%S~ []Gf&]q ހ)JEL 4s7B^NKjϠGfQ-w^zFCNL1&wB+^L6sc/H(;LΰV=5)dʆM.JcWn˒@Jl`JeF H懋!}g  yÓ+{ 9Ζ@<7ߜ<'NNHR:L2 X"LR;ߢ9;&Œ `H mm6BN$86qg:]}/~<|L唂BvrD2jZg iݴ^!TeQimAPdrU($UJTcc[+Ѻъ g4'ɼ23>h]Zᱱ֯^199o4pdl\d|O "CĹ'z DIߍ(G"|gz( è:u-Ӽz&qNw>WUj}O?rܓ@#.];Ӝ ;,DCᝮm9e:Bݱ4B vgEKN[m˭:Vgy3v{7T֖6K=IAvĎo٨,V+,G[W;zWi{lyB&VX6(Tt-m\x8 1^[oJv"p* ҉xz{g_(;; jf4y֍Ņ @$Ew{UyImG'0"s(H&$w[Z HҋD9)wy}9矶;ңI8-90ne+ ?_YM "@QFm-TbdiH?+e3۬ߴzR, :|/^)M\ΜGCRwp0yÊȪkLĘ$z,9<"1#LG B*HL'4 B*I+d>枡5 >#L20v]G2@QDY_[gF,zoBV@" aB* [HTc<!E%&&3tظ}a 23)N8DȊv7PPe敍Jg}r-O<^{[/;s4S5wH$&Hw}I0dN&9>ӵ;|f`pvߪf%o4cIXZm#1C>{f4=5ms[뢔-PJ1QL!UxScg+7[@ha Tk"BW|<:8 @a߁dȢٳ%)' ?vx΢2Ip!7ILt>WJFD`{糤ˏ5@̦jBH ]VmW?§ ?`WMHf}m59@"0Ya#ofq)R\HKa胥XN9ILawoxxBAt%)عgӃ?]]kn%Va`xV&;htNŕŕzaC@Xzz᝷'!b54M߳iCG)!F( 0DAaQwߞ3?:EM&R)p_\8H3>JQ$EQ`@޽?<;0B]o6jAWkK>p̲ǻ3@EhG-.޾Zm-׆Gw/YKPFCn-?0y(uIU)Y6۝ ܈#y">%(_F/OO6 @% ,kF0I7_:A,F}x\nD;=bgaF }vbflLKK8,4#д:  C %@Wcy^m#R"iWDKTdB) t#MV%NM U$'|#`DRYUbjz"' I'f5G7}?$eY5V*ȏݚm843LRHeםh A @R@Pn'GFyޥw7oo/Ji?83p~ocWh7A׿~`:#riBLRpl,Ɍcu33 ١aNReCGЩͅ,+toO €P<f޸>|'ˢ1F.!  XKcORjui&x.;ȷ՝fhKZ"$Îp)RA`7$dB5eӟ z4|͋Tхhq#C$,IuZWKeE DoWۑۭ7_T<0@dʧ>tq1IFQSSL| Yx"0MT>):jeoi}NjfGj Fx᝷/0xO=g-7غѹq} z$` Y**ÖRcWo"ȂGZH+˭5T2Nt) JӑTQ)tFa i,mԗ+ڶ O⚶ݮn8.$Խϫ4/Mr<sd&Hܓ?O{]GrCNt`a7w6Iڭ ЉPJ*DžA^}}m-z#ñZcҭVs#Gf+ M>kFoűTQ_ȘܕkF}fjvv@\<}38C2`(Vvblra׺};{_'=h\ihQ,5AG!5uꞏ];)_PÒRHFF$N;|Z7b"D'|>/^crxE^f]_V76-cW_<_*fjGDKaE]qn;3^~R 5>E$IDRy(Ow@Q1I@HJKKu!?0C?}?zVhw_CJa^nnTD͛|:aLLMCD; !$ A»M~epoQ?g!? ·zuw.VY>y?TM@W* TjkW.Q:y]Qb]s5W, G\|d gDAܨdSѩCISoT,Ӭώ^n3=JpuI|ENSj6޽ )J\'9|pl?x4 F8$Zn>8s GAnS:Fhaffڏ[,+5V$p|OkG?iw֏:dvDYͫ 6SCIJȡ0/eK$(1$)Ed, B7JJ,6o-P$ALGа{^:.=#)Ơ"cFiIC,DS C U1m 9!՛L\reEN 'rvwM y[ox[Nc97z݉e$Y -T ܩO O*2Irqڹq륍[BǒZGPR.(:N:+eLII(Mϲ DB]noGT(P|?Գ͍~?~,\]l/{'Q u~ Ӽ$s|1~Z]XY9|8T n,./.Fװ{ys#P3Jř#T5Pnսf[4CKl\|!@Qx|ccI4QlOxs@a$!/^7+$pdwQvwc1BZW~ߥd8u3!$I |lY,ߍ! {wup)O:쇡D 4-^xEѭW?0 üpw+ j&Au̞* g(AvF>yuw616],Tz# (NrtִQ~7?qx)S,ݓ'NR8/Zs";,Q8Z9$R_kW*~94`x-o+Uv/lF;Ƞ|%EPb$EQNolΛ1XD 'N'Nuqd!~ϡsQ_MۻhPEң; -+r|wn!,+" #".}V$C;,cialsf9r~0p>4WK߷v;"%)C "c e./$-[ZYA#w}3GjaRG oݰ]QxG kwZv J~nrX# 5`y;;)QJ$SKk߻|ؤ̈95o^Xnw.ħ$>hr$-ܩcb)bZMTS֭t2pˢɩĩC)>uoQv+z#5OzܱSI.~^eRJl||TNv MݼqseummBh~uyӫhVӰ׃!3SYyʞ3Wϝc)IJ\l۱0x? zn*r1_%Eۭf%3d!ȵֺt)mw+k;s<ŋozu%Q]fhk8iw]|l |ccV8>__ί~ A"!s ˑo0rm\d1&RQ!hUkݽ$AUy1m_36ww[;FukcqnNqZ̔TNԻjtp]XIJd%aQE=7e}_oIr90Y^icHaHD" ;;yG|OZj6mۺ r_?ӵ)£>8L&G!^K(;~'JnזN1<$H11ˆDݮ!qH( B^iG7._x;Bsܯl!f?f`n߾( RLtj1?6jlNejj8:&" <\޽j˲V"dAKB?,[ժn٭0еHr\V~훢 +7r8*$oܸUOML:v`ٱBъ%b;Ѵ^!ulv" BIYHzr>[X^굌CG90u4-]ַ֐k{Z{ocg1m;Ȗ'2B&$KsA精bك"6+mV<ç GlcӚ PȪѺM1a=xteueMmm n?wCŝ:靥Fm`Ξ=Zz{4/DQ! FAx^A]ߛW7]]ݍFH!1vB1ؘ}}طݗ}؍XiّDH Iс0}WUYz$EI4!R|c<~?Gٞ`Bێ%"_aG ۋT0$i`6t['l|eb-^6_>y*|vk?^AOQ;Fl(Z<0e*fhBi'cF CrߌL( bY!B^8& x!H!MӉt>a0JU7!1[~SSvir'AGP'XCV`\lB龧6:ȋ?΢.XsуǏh"{i9MnSR5f|n:-nwuݻr^Dt`ZQ7uP8X0Hg͢ #Fֽ$ONgN?ێȒ(/|ܺ4j|3@tҥq ao__}{C 8 ϱ I#C0B0 qs$#tC6>(,˚)+\SF>EƖǎM%\b.d$ ӣ4;fW۟;1f{rˊ?Pu9OSP AkJrttB>:;k9mE/.A!! ] #br!R<b"fS Z QXPIt27R5D$5+*H n0Et9?}r :# B!pXB( ϰpŀx9S̷rVH ei GkL'ltlH,eFyl8D`^`2,ۑJC{6 |8Eh>u'p9*$vF|/u6#K"8I0"8R0vcץS;>v" wpP )+{ZWOsԩ3\{?9jh(yhn߾soSxa,{{!88 g4ήlXa!AMҾ7 !PYG'\CqZk8:rd-:28E, ؒvG o"6)plYXxdIm !,OH-*dv W:2~)QP J477wMYH2 74;u\!!ϸ.H ;]ꙦEѹ:fi 6Mgi1, TI-Uk!~w7vmMq-88rx'nYf.Wq1M^Y 65E TX\u>PI!CT쉢-$#GS󆦲$_VX?,sхuQEe!y\Ȥ8DՄ!E?sfl&_l`PpۺmjVN'd_c FAQ3B1`^*JFs]vE™Txp0;Å:O҅4C2z_ TݕA3m׷ .MZ;T78\y Ygfsq䀁(wυMٳ^7X"zfH=,/g/?:]:l \]sP"(`Q5 ŒǡXDϵ0"]T-,B&|^=Xݐd׈HI0P 0M՛q 80w{WwRόϓ1D4`-dz>}fR%7$ ><EA>\.7-jZӶI{]F~rvs(]O׮xtF݁$r-_[h޹-+ ^[v5uh:8{:TZZ~gg{Ѷ,8qYj^|D:d2),TtԺn~p~95{;!K[aq{FC>2r$+͆~Ko)!ۖGrf艓Gɔu;{kpYMɄK3Vpt]%Tb~Rĭƣ \OL8R ™9|PTU6b |^3ue&lK)$;,T@k?~xwo6`ZxN J<7zvRzK⪏k=[!/`(Fib_ Ŷ7fEP23Lbؠ#0Q*DQ_Ժ,GFWR(LC 캻ks#GzhUE6ЋH A6hs׮W,EN~}_wQih0$sƞ[D*z7ݭo埿TG~a #2-Ӏ 0Eqﻮ:vѯ6~V~>-q!g6\xqiiI?yks4\0t=TF P`@Az8y.KuؖGQ~=z̙3N>@D4 $"WVXb[/s>L:7^jYR SLdt"nh^; K00/n% ;8D(?qls|6Z QLV?`)r|t EUC :hx&ش?4)P W(fsP&NYUvf*?$N ?#v[]od[q@yxټ`;?pD'K.?ZQrgN4-pJc Rd `(E=Y3=D2rXoԥXQt:](w{]?`4&p$1oCQ3Q?<}j|'JA"xZt0˱L! WFZZd⾽=;R$P:i4\UD> vϟx{WvQ'>hm[奞{aB,h)PcZ 0'p*d auB lPctҼA߈eYN[VT+4d7 ȍ;*&huǵPuep:U3DfLsD&_q[7o~4}tj{eۖ|~ԓdgCZ^LJ 10[p\Yɯ٫[}dmWr|_y*e&iØUMFejcVk*!/~1;n S/͟KDC͸J㚲1]7o]ԥΝD|87y܂ቩ. šzMiln&49 BAng qGFF^)< I ֝;CNGpŋP n8U9xKO\N>~(G7K8T &'D"k8i^ZD>;߭5۾^p_2;>[w^Dn3x>(A4FT }@2$O͚|=V%aCJetW锰Zi|H ݾ}Mb6{##哇6Ⱦa$y AVK"Ϟtxd|4>UDX2FLVm'O Objj?>-+zo/\m~. IDATxia_)El ǿ1G Lc}SkV.5,׾??7 apF}^. j#A 0 _mi5߾6?";gDbPJ v/QP3] 9~ wY659; ~'_Ye-3+d|^Ei KL长2펡90D)$Q^#s(zSzNK3zAW,OXQ[N$2D#Heܙ,W(v&éV/+#Se7x2YQ &w>zE2D/3~l.Kk=eXI04999AkV1PѽLO ؗ14wx\2 ݲNyS`! pYU8eET;і gKZŏDq&Zk?]&lt{E!v+$gڰ*F8?7=I?ud剘 ֽMLtb7Eu%#4izqiV𡙭Gמzj3vwKyzggCDL t!tc;+'֋@Sǖ1ysoz$1DzI6ky(E:~B41f7" '駞Ppjr ٹᣋo_qc K1DU-KtfMF|4cl/%'G׫^xv˝r>w"_}kk_<ą%6^yuzjƇ+^ޢ:s|1,1(XzvjQkgbܡS4T䦢H}7͆dtȅYbwmoJcX=Z-;zhr4Q$).{&FwN#G˩Q8\v{A.>}]; p6dI!A^!ZSsɴ]|p |0<S_W~7۷lZ ZM Pdrj.mI~LeW>51P28 dzܲzʠB8\yqzy#_O }l: D|ͭwW/{ɰ-M =< Zx.e+=2|4pA`l=uL~eUJuPNOL){?5,UDjJhΎh.4"]e&'$gO"Oxo0 ?3߾}x{֖]<<>į$:>M:DZ빍o 3g5 APx7zOCZڷ_f<6*~< O,KSկR?,˥Rҵ(c7$ӯ>Hq Y >P,ADu6`;^*I4eHy!Y>\`qwce{kö#cd"nlGK& ?:vi|H:67xqf 'o6v~EㅁnjS@(s",p`yqjx" z0DG~Π=BF[6zG}onƿ}=Xt BLΝ>=YB&wz3|8P`HxLUz4_y$H0Ngw{`l;?vqL`{9n^LHYSNvNB04pd&UIFٙt*b:#C3/x?([qM܉n.9/>?uj;bwcje]ۅ[].>׾Ož]_2wuVs !ҳ,JJdΝwQV#L+Αz~3ܖRo-$I3\jެ-lj=o" A h׊,Iύ-/H$t@RQ8"!FQpq 00t7u}˪x' 0^oN};p;Pr6"qGHj$SeXI$e*>Hzkd*S)e<ڭO>u;Upk ٙ>dn+Gfۃ |-g e`XYтF]o'SU LM"T%5&z[+MP!yl$JpmD!A$!K ͝^;sdInRQAyzBIgb40H%[ Tc" z$k"@Ҩak@*0: hֵ3|vW(WJ)ܿk?=9×" QSM gvvqN;+jz_G*׷aXTnu5Y55Cu])IbqdQt~nA_5n j cH!n|]oQD:0 {M\ZZ5q;;?yRxGy:GQkj렶PO5K p¥K~S7>m#G\|ʕ+| n./L:4/YDZn{wkmg'#$I~K_:oC |u#_wSǪs[ 0V(?{빴 |/I] 0At=N!dC 9|s7ORdwdً|{wtuĢtݽ?{~|x±Xp[[NL KK~-}Hd۵ $8`mykouӳLxlDŵB.F U`Rz$C}Nk 0}tͦ|l5鉣& 9aw{>|40wu(A@8P4ڻ% #Jl./ ɪٲ/YF<pϿ{D33Hۑ7׍up vfNLo'E2 I2I>ʫ}s/(`t6n|2}{tld˶Z"qYn3 ʕݽCGEX@q6VWxBcX޴nGraNj ׋1"0lU=PZ{K#2'bQӸu9ܾu Jf''6BoAg,Hw?q(VcTI78>Dؖ)$6wz탏' .8kA{.?0>=Yy`}y#SRE 0ja*rݬoq_BQ`=A 'ڠWCJT_DD#GNWep{VՐ"Q>&B|wY^X2myosQ~A;RT\>3z+b8`凊:"ÐzWVmq߬!y 4`` g @(9^,{e8o/ʐ2aE"x52B=XfaѬ8vzQΞ@B%[{KgG1@>Cr̨$)V!Q)/QH7`D!< }8 q˅U#PHsu AHb(thM:#1B@nGkZ.pI}?H"`8I Eu;%AǾ T OcI,[Y߻zĀGn+Wnڮb+e!"߾vCo&kn-0xp}smPȑ\aΧz[]0^84]V5/;m"IȨg&msxz\YZumbh p(=۔]ψ!P4&('@^Fi0\UQJQ&k˥ SS0?B{APY0hvv6;=4BIYmxQkdQ;^<>tlee-Rd2<-8I}ᩙrzY753b,ݩկ :99nO`f":U8~(VճgNMsZ7oy] 0>O34䇒o;uv[0ۢ>sɜXr%4,w"\~k8 (}`0Tyl]UD·;wƚ=*KlueLOdz }smx@4ˤR%FS{㳱 [l9. U҃RVM< hxZ2yq#WVKG9?$iIk+l%y+ӂROJh69 #&p$`#0݆i`SGN-~hG6ze!ņ.ð4 ND)CTCpD/rdOVo&'oX_p؏dzN_}_굸)^uqS.mKڻ |$J,v P^WQno86R)T,a(~,r&W4 o(8FAq U*)K6%I4%$p(cc#{{EpUfgBpc _&1D?R.9It2q̧EEtk8xv~,6W<^!KG;L)1=zVg^=18~<:w5SyafЙPϧܫm2L8MB6)ۛe߱f_0&0ee[`(C=Q7 ? EmwbrGwF]tv[1q˶y8̐{lw`!VH>@//Uʦ4=D'$7|z/y MUHUd3~DF,!ᬮn.-"H:Hf;cSKFun][XxQ=:#cTZ][pa9ayA ,RU#G yc Aq cHJQzrKSc0=ZԒ)(^>qd(u#:!e *"@b* CKEbĜ^1)WsbR,J1 Q c \pR$ò M3@[]~9O2ulM~yU/^׿iƱyٖk^, tB81{ iSNOOM] _^[P%ގBtmNp qiqC) |Qه<11=n*Ypx;q#1SFbBsaiS3;EP)FewB6[&FWޭ iZ:cBD\M,E:Pqi/XGh6$@l)zRwVALpȷۇ,n=Z-K u]=0\Udِd#x\ ,%p2`u  `=t0@ylltI$ &F9!8 TP<[B 9 UdKUBhBH"5'40#{*³ъlLTP |HSA= v(x̩4Ez=6 Pd Tqf$Z%mYof{;a,;wٗ5 ԃz]8aHfٯ|B-Gq{dLj,.\*NwDm#c5IǛ|[A 0[D! e9"6cyn)i6CXvnm867ލÄ8  #Tjll|뭮jFlɲA§`'` i͔lk 69\("L&zqHoz<׈ae$R 8},$q-s''Vas=WT~Z8###zR׻5ٹjGG{g^|YC^(fM5pbv8_]I\8h4 \XWBeFhTȈLr4gB0HqH1Ӫh6/"8]- ]M-'g']Xm.֗]β3\[ٸC,C|65=t$+^.)$ȡB! FVD*dG`;0`{y ty'`yo5H:KfH"m(.I q|%3p(M^M, d)ͱ4A!C`|sQ09̒sEBfQRB! @xޡP/iR'GR!KY8Fa,H U7>š (F tvЏA*trmϏ1DH8 D&42E#nׯһBpm3jWIgx ERpi^:>!?}/lP-{gc_qMˆbiK%i:ŀ0i)tR[^cz-̵{gsTfVUVb(H# M?b`] 8D&%5Lf7Ǜ}wb.xE"-"g򹌋XX//p|O2hEWt_6#ϟ-w.I;61,ЄLxBq2dq2td,w6S!El\+CHdl{Xj>~vf^u=;8;4~^ ̵QD^4\$Q0Nt:3dJF(NC b\*s"o2zEjC+VihxY7~~u{MK3mZ39եMS.Yת$"us@z5z˯z-1YG O?b"J^7g}tR?󻻻@Ӌof(DZ[ Qw<+y6f[2/DPn5]>1I#+2U]?41~'4DR೽ sUK;[=z$z^k؁_oe{K~K*lv'J|2]:՚Rmnܾᣔ83ԷTYјbkCIzvtT3>۹o<}Fh1Xn4n{a;뫯~w1+י* )0L؜ %.E3 ^"&IJ_EQTorQWj89y竻/~Y1?:: e69n4fs Be/<{Q`RTp#q,(0 %8 rgxe]EԳ7c@˜P$1ji }[W)8~23 YSYN|,ϋ*@&O~go`|р}n5 Q<ޟEi\$fEc[+-QEaR|z%cQbw|Sϯ\Y]gwgCR, AԕhI屋ְ?;y]S9a8n^I'HXey 99>!8EV"0FC?MıƾAdv 5:ʊY1%-bnԖuEth2VO"[kÁibQiV7wbi~>( "3T*}_z~xqq7u߯~ȱz;wܽ{oMEȲ[oݺuKӴ4ڳ MCҊót:UD,= KR==}es9w,mũ ,Ǒ ,HA 8SrKQ7WvxY5JW:TʽkZ\·㉵)6v_b8!Q=\(t[h(/1K)PjafХ}?6n,|iTWg'G'Ϗ(X\z=N4R2Mzzgp:"  a (4E,(8::d ~֫[o^^%bR#r7w[cj]LǞ5Eu'q9q,<ᄲY VVV'زh#'x`oj;,Uq(iLٝ:(lARַ c4\4,ݨo/z\Jg䛟+YDbgނ xKbœ Ba{Q\0LQXQ9<們>#NFN?Ww|­̼ 9n?Rv2,%9wA 刄(YlȊsg)S 8B I(CR)+e1aOܹMf3/tNNWַ׷ON,8= rjK;-zҥJ[)=8D200&,ED$tXvahs`NZ7 Mq*Ҥ@,²a6Cp^tϣh"\e&#i֟T5Yaa[$͆0F!*bH`DAҹ;wtXWXLǚ.;ፗo\nLʲ"8}1T$P)//Mtt F)Nnmm1&@k|p֭w=j(o7J?BRqARn/- 9 YެZ3ucű?z🛵awAAgq8~4y^j> Űc:4zf8 ?>qwKKv.׷/]x9Ml8(>ݭ,`&E;pl,k,\t܏WnRnrb:}gX&_=}:>}ݟs*a̝|ʭu]4rO~)ۯ"Jͣc晹U]fu#.Q@w{y5+eV ^a"W*I焐<˿uUfu"ޡ(!+WѢ\n xâ8כeo0uz]kؖ&^=DG@DL>b$\UE`R!&3 Β<Yq4'PTN@6G HARi+vkB3O.ؔ.jS$uea:&ԃ^K33P24"=><)t^i^VVlv2:Xkj%ѹ5Hpnyo6*ewf_vIg28J띵jzYI$hgE?\gXF@j24 )W; 6S'{ggnK vjM9Ff!r[?eD>̡s7/z#kTVVR"8Vn ޼ty2s>F۵_{N3eQ U _L8h.ei''GDby ]o Ί7s|[_^\^oU׮ uT9X4Sji͵K4T[NfYho|)E%g,%Q 9eY.zc0Ηol'-YW.t(^,YKZ.LǾo+Fe5I˲,i/,fs7}gEd陓\!FfqϬ|h٦繟 D(A%QB_f0 ݻ>zUU}W;?:^?_?p]7f9PTy睵5MBzQLܒ*_x`6Z>H(04ϧcdfw2YVV[3jQ`*P Nyp-=_AܸVn~ x4ˑIRNIܱ_&?-Vtr2Y&i JRcUD8 ,J^-6MZxs+-J3IccET Nig!CaNsY]L]܅y=MC4$2!aԬ}$)+ azSݨʭFatN0b(`![ι%)&ggݕ0\QJk[TTE#k\]^K5^$ʰKۥٝ#&ԊearR BLFN8,/JKoq+=<:zA>C&s@ 6۝ݗqLA9 aBkTg؞*%MS+Zzq ctɀƄA;^а Jqʸ? x2ELbdϜwy2,nV"Q[z}{l)vOglwo]u謈㧧st2˰v$(/EA:F`cV 8cdpay2OM靷NDŽ%@ $T0S$lyrSmtIAgHWKv|*WXېVy<{r5FcH-uC cwE[V̵jlךE$buWuFKmnѸzi&/W0!?aF{޽{%I_? BȲ +ryuue.?FW*Jrƍd2Nݻ7BIz )㸵fY.)+E m{UCT?;?۱ tR ^[[,"Yc?FZ(B0F!Ucrj*3۵K[;WYԗG5=ov{OY oҫ7~]5K{1N̺ҕM;+IE,KGw\^}4GoA"ɯzqC/N q#g>* ޽\RVr&h<ά!ËEY(XW uttHAwD'<.UW)Jsxi_Y)cONǯ~eHO>L 4]QBJNCUQ Y8RsuR*7 [>Kْ8S ) `U4)hE,ʲ"3!cyQ4(L1:2/FUE⹣ٌ .RN 0/oITS|jg)^| ϙݺ26' `)ˊFeHQ>XoȄ,<>;Pu;qخKvgi$TC+J,(U˕x9ͳ[:\DVhk.rPyϣ Z]ks* ~|S7~VȚv^1:8tBg~ g{C?TsYKUeEZx˴&Iln8KA?O ߉l6 8 QߙO'yjO(d&c;C=CbBѪbdϼt< $,1])NePeb^̧A̖fAd// zF &viOX$t 䃻5J[̏?X[rVp<CHI";6ˊIDRumvYVԊnu{ETArMQß.D yQl:% 4\ Ql1G(9,-շ_{m;|@iZͤPh4LJgD7_Y|4xk42)(]ja3 S dV^_ؔ EQIbr:;9H/Re(N Bs<yX8K7!Ƽ@04 (h;( A9 !Mv.i QD\ʭƒ|Y!TM$RJ7h^.Y2 LI-CM0L6#Ez-H?rwmʫo<t>;vmywߣlh&irU7Z"b>nmsAqzy vVWJׯEڠV bpJ Zk^oTc \\Uez9qGnT.½ϩhvvfG((RƘtsG^VO`|0$jb煉qW0MNhY'#D,OiN(3͜9O 5D._- 7^s DYl9 +#E9 F0b9,\rE:۶O-ccϋ)&$hS]U&^ &$}К,jc! :ÒT0:2ILb:z2NI;}p"|.j&I {1:?k-[ipB3o|?>$ɪh"Y9NA]Li1$!VUfK$kj(ys$sw>ϰHB7ޓhtlXU6@AE )yO?ıUvnزii/Ht>aQ CӌWEA7o%ٱsP4!&e-ۅQ- S? ȹ' 5+Wܺsrp"J%Jr& 3[K+ܿwCHvT2P|+U6`\5I&6 qu4QGA`(&S,\ԅRY[Sf1f9qĵzYVLm#B+?>tMD )y*V5P#xQ姻o^ZO]^ɖ"Mת%Q. ЂVZZcc;CO| ^͠J=)'Ӓ=n/רBI20H:ãO)nN`#UmvZ+x2SaIFO "4CIxhčީTŌvn_]29NTN_cs*GjCŀTT88uc$I/LWZ;xW8tQDO( 5yptigؑ%E,+WW.@r",޼sh0<$+dBFI@r KlHӽkK /*VёقHi,`ڿ ic*%(1tFw{Zbx2u Ařq'JndV*YpЕ*RI7˭NqeuխltϞmҔ2<GZӠT”i9< r֖߳6& z9N1SLمh%c&Ւ 8i?RT%AS;پ-a*!QiN1! yaYk%9*Hx奕FV3 ()\qC S4 -`^%ɑ.Ȟ34"Hb ]QY KI(2۩ij$G9=j[xQp0Q~g҄|"܉ޠeh 8BF[+?ѤNϳ) xѬcRdJo8zKWE}i: ĩPYDH!Exk/]Sia=;8rz4>td xݟ>/2nt 瞗zșyU"trx;?v}`؋5#*l۳JI#IpBfeFD4J$B,dTJ SuR( gIR>Q_Jk |O-BKKv}-+K.+[+FIzZ}ۛ9)ŗkToVwgC_QB7`9& Y_ ~F@Vfg5p~z>K2QȜP@ASIGwx1Q8"",9g48XK Ns+p$JIEB u-ũNS+J2Y\ C "Kc#ge0L qrEBYR ٱS<ǖNw>R/#,76;>7w[+%{,\׵4D*ӬeX`Uu8Cpb(DQJ| B$Q,[P$XTl'jPcas,x2gIQY7͆)J(oYv̝m繝NLJgpVU#q8+(T0 P@o(I |x:%NnA4Fr\?Uhk3HfuīԿƻ_haMoO-~dYz΁F8,unՕf2gkǝIf劖r{}yet1Tpz!_t )XTxLRA19bv_T܍Tѩ9 C(#Qeسa a d!D(Yi.{X9,=|DCK7^Z굲ٺyN\N]"K(˻7-exNg3C /q<$pfӥvi9],t,' si}ʕKin^6JǧaSuM+qF"5VSCI KS9E/&Ϛ"Wթ4T$JE7uT߀%8˖5FjY4U cƵ#a5SY0!!NJgI2١"'(F !#^w-QyF3P򥯾kt2߹Yc@DRaC,N2@POPBp E ĩGC ")AspPU0 C*20y E$??{XMIJ,q4,;;;e#a~-I;GFGIZ[kOUho;^tM p74f*< H yn^jDyqa,NHrU3ApL #[ W4%5-ˤ40,EeAbLҼ^9r 0esP$Q4#4e`ozM{e$vM&QUJEY. ]EiC@ kV.W0] 2uBGK;{H=(s P.WdQt1t $ /noj,IjeI2 (r͡HS jXV K7jfSZڻ*VQΫ<#+2T!Gru^˳JC8!(" 0EB aS$"Yˊ.!*+kf4#W&A %I tX|o|kcm380T8a@r@rvX Pnt5CRcVdu6[DY0>\\`g!SFZUC7) 1IrG*/^}-!An6 mSJ!Aj5˲0lRJu]!rTE$4(!tͣj|?TԹsX8Zzo{Pe<<==\﹑I&~ 1tQif/dEiJqn6$BΜ E~4(;:%|6%noG>|b3I\#I5_D T=us):NjLZ?<[:p̦yF%Q#l(ꞓkJ!Ri9Ͼwa41Qw~C{wr %Rb&C, TXe?uDItQi} uQsge;n'ur>q<  ʍ2@`ZVDAbb1p2QH{{;߾2\,<o U\g+ H !)f(hEz`PˊQ;՚!t}xdI1J ջiYQaW磩^],vl#&G_=xFʕoF`x}ۿzsɗUne9;:\rVu/<{-[%@XVh8-[dVžh".А*(")HpeTܹ_3,y|0䲠 "X1 ENXWZ+t%duftY@T0#qވgefzP 766Susmmbx'Q嗟$)cyHjP7n^=wˆ<<^hV- qȲ}?"@(\d B$ i\Th,$U 3BZx8l+⣏>44 Y*jg5[.K 7b.jK3x5/'<eŚ8IBPQ (˧~=K @પX٪ݩ뵓Ϗcjhn=MNkE*b"al<{͗TL@QU(M:q YU.%]ɲ|8MJ=٤W UZZSE(,f1JQZ8|ɲ\,VxQ+CbjIWkqNf0E֥kO=\("n]<rE--Fx\cQTE2$*:VDZRݝVѰR'lt]xZ- P : =#_}ǵ=60KdKO+ eQ- ϜL">DN2H25p+*2aY9ry0< $4vv0UT-Zk /&Le^) 2-0Z^߻w/sRrgn2Y}厓bKr!T{߸~~ѭ׾uj~᧳tbpxʷ}!&JPS Z:fqkF>9>u^{ƚ qNQPUQYߊY&I\G'q^;R.D s8~xzv$`S\b#BH$ d օ6X&@%AS4]'XE e{{fAlZ_$!$a/Hꯗ EQg"m+;+^{-υ?pgiuS7 M'ab1I5MQ9erIb\%qj.ar@*A !YsQf8EqR5iK'xN|u㔊ϖI4"eYA&i(hTPBa]Z_]\o_o e s12$D@Z2(0p.44Ђ ܽ{Yµ59s.BXYoBn~?B?~1!<ϝ;@Z*zX8R%Q`b4Dp>0w/LlQNӜ`N%EqXl2M(^?o7ؙF^2q2$ Gbyw곗EOV'nj3)<eYJaJˬ:Q&0I5Mޤ+ju^<<||8Whz_/q|rV "B2 YfAH* &E˗F$bDCT^.ҍ~(-0B()ZvPo1AUz4MXlpawݮ$i2/ǪDUӂY4J!j穢ȘrMR M_L `Qb" ^/<^W/ܞ*ۛfB.pUn_vp1n$xUFEV6~ơj(fFt>_ v2{q-4 rHD{ۣ%`~jGB PUOLc{('ON_/ )۹iq #/>0CsL8 \@B4 钺s?y>hr>L7n^l6[Zҵ^t6w; Mw2r5AVxy7$rAxrq6\ik{R1..ڇa24.kʣdeh ͬt,'g,Nf 7/m6 /6_UK<dx8ѳŮػX{cq0X+i)U""u'H6߸[Tg~j3"|TWрYLs/W\׮)OϮ\_O&Nxp,$`& I"&Q,|39HPj*,RXMKIm Ά.`g炩[ H^ RNVR,- ̪k`Kr⩢hUV(sRTPL(*α*ʥy:a(F'z CZ44ehj,Y@^.Bf!x5   |xMER>:,u0-au]kg\̈́4p#[kWODE@׾CXg~Q/i~w*MK3WUAkZYtqkӳY"LuՓba2YzVpE߸䆦)Č4ѣvNSwL([Gӣ/e%j 왿 ,,Hd b2Tʂ̉py&"ab.ȷTjZUrPbWo/Є$   e9?x)`(@0 rRC/KQ2V,ӳ㳊ZM]l7g TRq!h!OV^5xn@94H#/Qf0!@(ӌ)pN!/w^'F!,ʗnJ00ν8U)#AT#t`F QfՔ28P%gTIy֦-@h0u@^ lAʕ5+ܮYy!T+3g8|}TB" 󌚈5 1p>_,Falo_ݺz:8d#i}Ύ^r^{.s'*'bajDR27$֮ FzMr)8ODЙUEj E$u#K, L25W_>OϾz727/E"^}i !$UxDQt1M4OȲ ZY$)YSV[^⻪Tk?~`4[EkKT!eV a-=$ EQ(dq9"D$' !g}w/l uNs! bY+(ggcAUbM`(,EWL^- ]GT\EB9ުڶ$˗)Op'D s$zK XQaf \ԡ̓("Y"RiqJ0xr4+fT*ng 2MQz֒5'N6ptj/_޻Zqƥ,Km紻,WOQ=b] *#Qk;d޽zm[V'.2Aw߿|{oQuT%?Ő RO@Kl~?ߵOFY(u"ՄH<"9udE(s.ɲEgO{zWvek8:HwWfg/ZKJ=><>2w^ffA#裿ƚFkJ C;Nͺh*^ykcەb/Z7/ZZ_)Wa??. g/v;PjV ()h2+ E^o6;jooՌBY.Ģ*M GG^,|*W65]+eF~(A~;wQfl@R䥪1b1DVZP )BJ &3_F̖tDqȺ$)ɜɔeӒ>9MU.](ڍ"O4UReF2Nc bYH]gYNIisNOil[:>j6nݽbPHUE9b˂ 1TVeEʺxAD'9b U zo{k6?=UM+J8ƒx=' F̐%Eч4ZPtCWNQq+4 0Om׋d] Z RM}ӂeJIhPT~W{w+FpuΝwl.Xi׈ð[j0*E%lC Zp2( )8Lu-I:A=~MAZΦk徙P*k;լt4r{_=b׺;o (|)(' ZP'C"Ua(J7vPX$HD ce4f<4 H91YVdIc R>8>1xZ\ (I—R%%_#Y7ZJAg(Kr*A0Ld@ tF!X.tLRzx N!!*˥(,+˥YF@pQYTKp^WMP't\7բ^DlOL4 ,䓓A6U r1SptO'YlZ$2C8pg BReIytg'Sf'/>㚟0gk$Y!yw jś2E6zhrf+?F(S+_iIi~rEgVӺ;~`{krLIcw1gՒa#c,)l ˸r="M#O/_>y"*_Wnţ'_>:x:bgsptϓtKsT8gS&f@Ft;;{a/~D1 ʨnYQzpgj9mvFkGG~q{{;k{/>l|*/:k-)e~r:oܸLS, T8!PD'k& IDAT}[Q?,Eq;M>ɗn^ӑsx_쿇9 081)׹ϋre,ƌQ^-h˙=:; *qכEMhT,+p@INE= K( (F'7-mJfS բR/8q8t\P V׊ Rt$d;y&C-7/{nz2ٟ.Zוr4\oEI6R.W/qrdbǧ;;'h1U+ NhD- JIJTTJZoc<xcAt]+ڪ$'i_xz2YgS6DH}yeo˿4Z~@\|Q&L$i8ӡR*ԟ{ƪk* <hiۄ$Ϟ' z*IX:!Bu9"BETi nW+ߎsh*p, q0il'HN z(`UBv6G/nݭ7VxHB$w71ket֗&R*oW\b& Ϣwn_|STL x %)ub4"ON0hA ɐW-z_2`5 YUmz!I1d/TKS;2g )4dMI2!b˕-2937Ʊ~@FIɃh94M~! `l4zXv.A'ώ  ժZ k'B4o*jVrx˓'?u{o*^('$ջz'[j&j~F<؜ i+sU&_=}*V_@de拥^At:8bnuwܹB$e|1_~o=Z"( H&8#4fi^SJIh.ʢ,S79o-է>:zg(? vu_}8O}T^_UeFQl2fRNֈR٣'_ٳ+Gc͖8E Dm1afo\ɂADibEYV)T%Z]>W(J$ \Kh :!!vS N ]=:;-cjzZ27{?oBS"aoMoˀhFQVV^ڼY_h8ZvʻĮvYMBG}f6QVm FYBg<?XџI tvVlN#77LdnFkg^q&YXIj%8wPHUs 9h>U$e RE^zѰQ*%`|@XP9NRtT-p&MC0HVN3@.a:焺I[-* p$Q 4KF%<ÀCF@f"!$8X) OC EQJ8JՊ tikn!S?T*M ЩuZM:OFwY ?𣗣Ogv_q2^z$p岀1R(74= awF/?Z*ak?gt}8%"ppLU:2VEFn@eiHd45 niqU3'Ā@څ %1a<7\|wkM'jV+9G22S+!L]j$Y_`cD1ϟ W.n6dP}PuM8h(?_>|vg[}28ATXcc419(Y7y}BTj-?+;'Ƀ3A LEQlZJ~.7v\ ,Y&%A$ f03[|;=*ӷ^Ip7kK@31)5 yaVBI*3"HTw׷]WN(X=P7bMi؞:Ir>))Xa6V:[$kGþgFFΊt!bw..چFhOj]̫ +{fcnYRgb^NLDt͕Rpk!&g6OrY[\[~d!Cұ'gI{|tp١c#%4tiVyjFmAdŽhq#xw<|Qn!1wͰfy. hv(0 vjwZqͱa Qa#NWֺgG}d2qnu:4}FS (5< l %LHjA*J+Nrc奥(jA zK+dɼV<}zhCkΣ&HʴTC#w?hV lϬuz<=>8̊Mbn6L3jזǓ_y!Լl6H*>H=wmW>ص>^_=;>ڼLru˳t$5DJ!@c1똔pF Ȫ4. -`dLI70YUmxLG>=?n.xSh{i}i@fSb2 ȵS^WR.nˉ&gyPJQB7JMR >{p|B4u3hX ɁYUTDDd3dYjjZ$ < @ |njtRGt:$lUYKk9R'}p8 7;_}hE͡03@A5,Ҝi̘Lx݃34ɧA+h/ S!̕?$Y;VԄgh5Ei-B"{ɠ?Q ~pt`ʔԵur" =D0kKq B fn_.m\WQQclTyz|0lkqqcyF7޹djHw>6w=O0:aDp4h%L*`TO1m\ j /{{?o_ر4INZ )0tce+s2yl=;zI.5I@;I6ňj Z߽wt?4 =?0|3xBeP8替ͥK_w0KA$Pb +n^z3TZ??=lhz\Mj$yv4J5$=4(Wdz+rTͫe? pYJ'D_n2]JfSy5;_g;,=r4=YuZ ?zՅ好~_z;s LHr+9cyYY ][1^[L4^9-rtWol.}B א@aĠO84ŧV жA'ٲЄI1)fRҭI  dǰP +4!85Q/&v<Ej^жhXjP1Vk^4 r:#y?=;LЎ1eRζhk5k܌UNgj+j 2ҼgfERWUf l"[j1Tr3OOOUiޚSHuWonWUY R7t+!g8lbȎώGΕN2Rߟ\1a]hj6\*E ͺՅRvE@_p¯&lZ0XQJ"ôܬq^+j1噶"z2&RumPӳ 0R# 91T,(!q^p>›<:A9|p6ٵkV֖OS8cϿƬ潥xe (mw=dBH)΋ 2BA&ai} rwTu]ӒLX"&&w}lZԱ^wn8MJºz\: B!T^eơQìxj4"Un.AL( u ]j..Hӿi5ܤE,Ϧ RB8Wsjs O {7;Wƚ]qpя.|&lfgVw_[i2ޓg}g6>16!E#ˆ):]ъo][QS[',(J[Odg5lj *  )l )׉XL}emt5<v}΃p{s۷<}֙EǏ&G$A߸{p<{ă7F+H&^#z1l  M4ͥΪg3oN9fíiF3̯җ_'k7#`qƵ< YV0KPYxf&DXڶ҆hRV&x%e}Z3b:V(.EpQ&I\VEd` ڲ?vm^Y"oC |t󙗽ih"gzX[͠t+UJƥL,MS өk54R4ǏL;Ĥp|xV`tp k9Zg +|$n6/쫚mW?}iLA u!K+OTYI!Dl_'EYI R( ^Ώ|?gRa3 Q1OVE^Z+1 )]4R;kBw2ܽ rcq5QUj5g]0i-6q}N{Ra?DlDU7n~d$y< pxZQc!xhYFxE j\H)@WEbZ#+k7L}#(6)Yl.hN^^0ĔQ=H%-i޼|&Xn{5Cg @DVEo f:娽-;c̓Yt`xڲMJilbAvn61})t\*( pN'j{8Xo+"kUZ*f)A뺉Qceҏ޷kYaLN)}QJJ 2'@3<~2+k_wW:? tJsw^o:{=l^{|?zޏ&zK^+ZTH=w-jEV؈Dӌ` ҪljK¹YT ^'bf `9(E&;}Y>\jo#ɐV]zҵضIv|ԺzmvP2LI1(: ySI ~:E-jس`#SZAJ5۝B/~v6=Joxt]DnoÄ9ɍ_PfN:_g /=H;b/??Ph]/l޽.ylsL k%EkE*vh-1`%$+PCb\Hqeۿ[$,} N$36B3g s& Bi q3[yDLcٓzKK_|K7n߼˗7KZ4՟>/g φS3o(*uJltztW8emw,^>|hJh>՟4`kV#hZAA{Ij䗊+, {rF3NdJAôӴR-=ANfgUU y!rt7={(\&2ςҒe>cH˰ g,.DV48:%,2Dz> $àUQdNl[QW혾R1v`ZL` C]!?u-VV6N 9b1I!H@qʴ"ab )"H@E jd`)13@\f?ٽc4 i5J'Z66x,D0Y8SKZJx6c+|h6lZ*3U6$.y(1 iw cT}… vx U`PB@dMU Ucj^M7Oi,ۿebHpi]]]]2V%a^MbsKVr?'WmV5 Am2(q{Uˢ\qgP=5u}lj^?=y@8=)-Jjsr*~.ynOgÝ~4NX۸ϳ[ OWG:?~oѺ <%4K=@2iB\ ط,Kq?-DYL;fiT a *F~ ~緿+?>PC ,Ri|TZkaQ!gDkgm1VL함U%\] @ONn Ƴ8B:v\Fֆo[wǓf}⇏>z?K֣|& Dreo>x0&_^^zz?Fōe Qӽџ/V^{㕨qt/ls{}trӳO>, J)7,,+`Z &RA ]Y!^Yl~{o}͗~/qhVI6V8WMHW >&2)51UK*y^ ^Yu[K Dԅxr7"[k$NX+]ea,Ohy1O zc6lAIY&7 ~ a=7jP?ci5JFTj[}~2#!Ay'v6dmb\=|i%j"ݳѱ̲a\ ~tvFycj5:l`2kbԂtN3`r6ݻ{Vp]V2Md'%˲))qY\@B$ ۋ,A@Me-*a"QR[Cʲ,r "Z6JVp]xHZu qYPB[tBejN`vn-zkVi)Q BSmB'iU54@ :w6]^X\**euƄfCk mQh˺6.… ~ __N&#@A@BLLdX87#\^V "g "%ZZ{kM|˛^~^EVU~iJ&ᇸ^}izp|HR{Ɣa0w>ؾ~gF [7 oP=:"k juz,ZIyH$\tw{7;^. XZ_}elA @ZpJLNϪkrҳxwpzV>Zۊm{owg}+x>AM2͗WC r?H9W t|fS!.2 'xv0CMӊ<&ZxwVzv3qPldQqM\)ÓݥkoKW۸}k-|WfO%YQp Q\J9У&2ݔWY. `[ _~Ϳ;J%%¢P/n{4*qs ,. 5L;LJw}w竻&&,`&c nhQkyCr@zz8ZzO>UqӶmxt$KEo]w=dԟݧݏ\O>6x|M\ i 0@ʀ{q? Ͱ%j6ۋK|a!(˺D;6 yoo6ϯ6 mœ{wQ{x0rm" UÞӲ)d@K˒%IjZ5PN]o^⃿v)7-x:hF`.%&x2mKao2Ip'I:Lґ鸑t{Wg|K5ۭw~6*Kw}?ͻ>>Z^;z܍ߺRSކ̔;5LȫJ hXPS 2)26,51(j%2Rk덯ΥW)j&BKQ^CB~Nk\߼aVYhڎǒ$b@TV{oݺzX;{ZHL{4Jt AΪRE^y M\( [HI!$ <=<< y2ڤ%tShtV̓ᔄ5ѮizoғxMo.y&xrX lϦgRc|eGfWK/B (_j"c 8M86m'jl^nG+Dь& un5YXp^VLJ̒Lʢб6y_mo/5d>[J̰)W[G*3bh:p}y,P# K8И%,+`Kkb*9cƤ,XiMlX X"xn"@u,@]v":UGǽ%zumpf&J¢J)%4u ɼuU1,M\^g>VTI UK|dy^U+)&iYTDL֔<۽y>//\pL*gTE*DYzBg1/Y>mA#!t?~*t-|";p35}Ѝ5(~c`.mj;wE,geb+X+JH Hu{7o–, UDV5[BhQA !EȤDkYurHJ:#6>g0ڜ݃~d.VY݅$9_yx<:拷6;^ërń̒Q]ʴDb번2WWl;9JLJKV% #F hUذMLвM;:8lLy"GAhy$guZQ4zݵx¸JA@j"6B/mP ռS^,BǣӓZʕΖű]a>M[! " 2ѩSGJI)뼂IqN*J `:Sӵ%`V)y Fv[]5\\/\p׏8{ؠvUxeQHDhNSD_^y;M i$rlܾ<}hoxu:u-㡣4qQ,.߼uPp}Wz-7~߶zc/z IDAT'J'R@fhvT4ju3r-7779'Z$T+MZBp6C6V_Eq]"xזy<&FrɁC)6$ȬvBO &%$ izf̪kW/El/ :|:>K77VDMϤ$9;U+L-LNYViRSP)0PkȄ9eYcE͆pe t<\@B(/$0 hhN3lHsټk gԶV;d56Mq=Eiq?[G^w|S1.3o|拏5Yd䳏t*Ě?{p,U!&^jC^NjjT 908J+1ZA H5{u¥Mr:zHR@QlZ&H{^)5;sHkUB&3edtB\kNv{|Hl{sIz é:99vP9$E%-%,@ɗ/ta[XSJAH)fq83=9=9 JXaA=w_Tʣ1^×P-òac C" (kAʊSn`2x3/}6.^}tphGI:.l6tyj^5ot3N VWDc%&yh6G M(-KAN(+*麝JhDIPZFS-ò+ZR@RFs뾯4d$-“Ѵ g) ]APT/s}4mJ FzUҬƭWKgN'iN$bxO’S~Sj*E2K1V[uHM:]9ޫUNt*3PY^v|tg1J]k<)Y4r 82CC7ԴLgi:=+rJ2QiZJPRӼ$43 v(xJUmV3PPɳ~g@̪K>aEmWvvLn]fu\0ͮs ?wޏoݙ%ӄв+[;OW$Fli]l*w; '-i&菞l^eT/T_lw lw{5#S{F![8[dיdjnJ!຤%FJ0-:F;zk7u gN( ne!YTlgVES>l>NC1-M]u(L.ơM.pqUkwœh ]&| 7fH'ܨH-P^yͺo`=_\ J!9 )2+jw}AɰATF4E5$2Ug+5fRR[ P[~JiH<(%Y]wkU5B?zJ~$OI=MZsD:H^d_ҧݪw:4d-ך/ɞE9l6 n5qiRa⏴9%)# W}(rZЮՏq䐓vjH^Bмl:}0F I M5itl 똉Fy2ZH:]כCT8IVj;mb.R:sl5]T0:KZ@KVϟ݉ΒsvmYC]V8( Gj0.K)u׫궁8)h06 M4eaɼZ쵛, $$#Rg"OBvra@jũ 6W|$QX% dnk*fw<:*=ރ}r(ףkA__{pO^ݝ`tcM?) =d,NsW.?(uf*s]-V^_Xē8HզAU K44f^\_ٜҧ97;,ozeB(|8eR.z>,/MKs{ T\ڬ=Sxuh ``'YăjNY}gw$ƾ/k4~RQ{K=yoWv8vvDi0K)+U߭"  I ajM_̳tF A\-xP2hL"6,g^ʔw?xs9Ft#2.9,ҰyY0=5}QiVު1N A&td<N/>d4 e|{U'go|po)bl_KIvG4   Ww\%#PY&%,f,宫᭛/Z+-є`HUz$b* ]YnVz<Ր$j6z, bΔ$'\` XJGSQܱ UmfwKj.RFxYR `i*hT&,̳wv*KWw{_ 2%Mtԟ.ỆkQjm;"C8xӎZӥ۪7)% i C3i8,JbY}U;.%c Z =n]a)4cGæBd\]!U4CeHHc7S&e l[I:֭^{F'Xa gNEZgZ?+U%4UJz\,ıwjvNNG-os{'Hf^x9Tڕ+!*jn4d3ldKI"ٹ5s2yj 1(Kc(xV$u Fq_$Wvv6P/}gwwbw gHXhnY D~ uT8UEl}1튗E ȭ@)1@0R(N5ʣd&wضa(#]7+uID Ng1hՖw֮E~xt8f'E\T,wi}+ٓ@c67ǧg{OR F}J@J\3s8l?rϮR~k_(He*㴜9l5fɘ?8ᔵvm%\Uj3)Em `t6WAm^h?nӣ4aI׶պVͯ}koOA9fB~J=#E6<% 9U4#d*6b f%54dP tʕW\|>ƌ*R((ac(iY8 Xj9e)5Mp!u@_eǶ.n|HS5h6_XNkGFw͛U߻ܰ]߬Y+ szm ӛH*LCA^{L3jv< $,S1՚|0ŭAOW_d)"m#ɩ!0'ruel'NnÁY[ʊRW,b404USl&R/ qCD(]h7Ku۳48NGONJ&|I+~zp n]]|'Q(UJ8uZ ǣP֓ǏG,cGE)'Ga]W)`M!$qgiZ RQfPJH.XTlBWХMISY*ZJ>DX*hŴ]5볽 HEJ>.`ԇ2!(hYf}S|2E)i)Ph D E$N}4='UHAKި\{7fc"7|G0?ɗ,үOO]yc_w՚^jr`" tzKwN%B2!nDi%BBRz++]pm,,ٸln^5?nٸҥ@g<1%HT**GO./u*jk1IZ`Y yc]ј)v.-o.o_Xm{Y '%j"u127`HIܫwtN R!ŒѲ$RM`PHJ*7^|S`7+Sjӱk&$'_[uV{=GU=KC@ʅK[R$뺱ڪǔh᫺*X[msɃ.\F7[~wk;}Noѩj}bY:3 U4UlA eiZwwi۬kfC0^~˗'~x$tA)^ޯߜ +\dW5BxϯMOFšnhlEDt .XhH,`tͷP) SnY\|xZKkqUU5s2-˳M3ϊ4.ǃ`cm $Zu*DhNP@cy5 u!*yg^rY\i6w E6qUi[ < pr%|icom^h-qYϷu #愥w-R2->yƍըΛJyQ$D]|QĪb4ɥĪƅ$%5\ UۈY9Jy=_l|%i,y晟~Z?яLӴu'z>+ܸq_|4E& p$% ʹe9)Lp1PQ">˿꛽ͥvZ1I8.ln<$eY DF=?Φݫ?ij箳8_t_eE΂'O E5('$|!ppoe@o(iolݗ^|cgmumtZۻ('߼Z V r,YݜG%nű+po:4X!sO?Hnsʝ#jka;ړǏozfl^T[~w Pꍆ*l< 8[m?QjD krEcZsƌZ+-J&A db01V\LLSy^.A EcUSV ׯtR]NjBs&LA@")t:F!Z :R8.kK#rgge^ՋWW6[5wc{Fi%s)ĐrZ֝Y3n?LWYQ xpr[˛>_Qt(Zue@S~ݿ`<yxpd8&˂\JH8+fjYQA4Y`Qtt t{0)M1L|թcM$"RAVU4@@jBW#Lۗvv?xİT(Kҕȋ$tjNIh2G(dP䚭!]U0ʕ(),6گɇ7ژ^..0@0;vb[һrWǀ( v -G(=Lu* J m<)HQcPš;;OJӶJ{tNy$f] ch!vV卵Y|68KhV~V*d:Eey3Xg3_4 neON|_>==ԧ>uUEQ%׾(ݾ}'8aR$!d@%/cYSVv;-PT&~A)%z78e&4h൫kw$:ɲ]?2B|n X\4 m\عuH(OOy^$ټ\9֊re2GhjzMS1ӸI9SbN!›1Uƺ9 CU\7/1iXfg"LWQ0XU1%6 4lnt<ϺN1̊EY+BUժ0HEVm˥I商ݟPzax>LXx;xozKIiz9fue(2)ba*io)PE^Tmw2(Q uAV[5{20Ul93";~yiQ5[Yҫ/6^xuTKT}Dzl^2ǰ% DHQ:/MQP4G]y|{5ʒlwKȢ2+QeԬȃI8K!E04կzdh6Ϯ_(ѕ2Fj:9 ʜi,l[`CXH $h/u*}ąnb$)YP!XHHi(h9" isNHzYի<'[KhZ<,ɢݮ~]+n^}q][) sFeArj˲(HO>|k&t1 oaNjltiV1zŖET )sG6 *'fkE\ԂnXE0F1t},4-!DQ@۶q CW-ZNNu(es41V(eEH\ffkN\2*MÕRDR";GIcO䣯|k?@`|z**팸LJAEIX ԡċP$.}Gr %?뚵4> K(ʣgg{<) Ie* &LaTH*5լaL( ,JA^Cd6Vjc`Vz1ez?O}fݳNzppPޤ S4w4.+KVU ]<*zbo ߾wㇳ4;^Y}Rz;44p~~?z#⺍3gD ;PU$+JF2T7 UCeqwk"zӇLtdtjNd ՅN",mTF/E>`IjƧ5<lP f ʒUX]nta b8Q噮JdEYq+$tWTB<~sfj8X۔H9_VTj锄%б.<=9@4kVsP)1MIZwHo Ώx7ogSQX Z:6Ur鮭U0E(A|>̓oza(Tr"! Swu=0mZw;؄MݔU5$ C4vww g@ b;[mK]V<ɣb/H HHI $~g~H)<B$I[o-'Bo꫇wF_~7lO~//| o /_0ϤHJ H cRr!IJN'ةyO4[QT5PpR[k[Y<>mr}0lfli~3 øT8^yӈ+0'4*BSAgCP(4 7 :|UkNUS ge>K!I9+s!@XNp,b&i>R=ˡ"UX Td40l!J_YZ~QErjX1/x^bc؟kOG'9Ȱ2Y%mdRMؠ|v% x ,J @KA[zђ$_,r+DB״힝NX&3F( \ y04'6T>~ЇRB fdI-).̜V6Ϙ̠"yc 2"ujBG\fap|~T_ت:|'A&yg|>:|2_ QnݵLR5CfM,ی$$)aDqRfZjNj#*͈lQP4ulx<)m Q[f{GRRy:1\(J{KͶؿ\tmNկUo>:)no/;MFzEۨ9ɗ.ڭ[wJsڋy@,Ѯq>44֣kuC +b*,iIXi1> GwR\Q3t-Oˈ SӀ3V2CkXx<IYwr4Tq2YiQΦ /&+KêLgCi+U2 ƑP1jÓ4sRr?8XS,gAT  a ,F󂤆mG/Q^jKۦcDBon4"ТypR=pp4_j{?; (d|*R7 AD$PMo~cyӣVӼĺ2ZV[u@iUe +u”-nlV=w0ϓ栳^hr`{zQUQƉe$+g)g>}(kz+SEǹz+W>}{.]<_Ww~_u/i 40 ȋbi54-n Ƀ=`dZdȨ@V:_z ߾s[<5$ϧl~>*3ajyUvkK/y />/9U^qE@JzliE8 buǁq`Nz%ϟlݟ1dDI&CUEW Ć _]Jԋ^ ԩVA-YdGϟ{&;{z*4-\oesѱc ì(I5FRFPQp9|i6M<"\y֟E*T2/+!Ykfy!X5 JJ|Q\j:FR@*bꮬ\Y̦a3ˀ)ji$AͺC@s]==kfqe O].7_}^{Ogؠ#M!!Xj0h 0" ]Y bӀJ۵Nya7|߾RWOzwzk[ a[~$A yf8Izrww_a=|66: |vtOԆA!aI e=9}L(,+B, RyLZsCCI+lZSkL&\U WLWiy2t:MZn $Xɝu5Qܚݳ އ{㋟vnXͤ,!o߾dYm.yE;52ѐ""eXѣD?y{/~a{t.˷.ujF0yns:KcM`>Ww.W&*OݣBS&f瘲\-?xe U\*IJ` ݼi8>c i[7 8Xp]9"6sfKJkxwn9(x{o?; H!#~b;=ROnN' ]`HWg)$D( B֕e5MTee R)*TrGA ^s8͒|TP ^Qi:͖KɅTEի.=~YXFfdc3Aqb0tk"lv J=k9i0 " RZ{ 򸘍Juiu'I`}r/~/n?yt0q>s5^mv6pVUѱ.+N݅nҩ51VN"͓B"4 I\8 KU7~7߿>ty/_WikB (kA2U  di )3Q e줒ۯrݷ/^ï]E^ +noVc`AbJaYʎLzzxm=*ɥKAQ)p؞uxkY9|{g/ȊH\c%*U)B)$4h4,f` /P@I 1|~{Rs"cPF?xZV[on{|G<[(5|1$*0 ($ݨ{9_I^  8W cT)wim6J.$i)@Pq.4#D&n~r𐙸F|pzɇ^0Yq"V[oob1AY[ܬpC+ea4r{Ӥv&Iee^vjfI=K7ooߺvz>]^LBk "nZo`A$ILJ;ޞg/fuukF>yin-t\Wd& -/N 5:p>;[1I4y&*lj(E+p"LS1>SUބHYͨ)mF#)i:Ri0`:̷RE2&qDi]u["t:,O &@p($9^w!Ua:a&\ӢDc\ Yr1 8N^t|vq8IW3~Й: .h:G4Z&H'eEEDmb|{zC^CGBx֭??/#J0 $/d0:OnRkx{J)0#%cS %do׾ 0?1muj?X-dV >s;?ѷgl ;AױB\A A "(*2LݦXmX'㲨 aئŅAQoԼ%/٪5RMd< <p76a8LF÷maWB7 *gӬv%N˲D|kEYL>-ֶzVmͳqџP&E՛2JN &(/mQҟ̎5. TLWgOIH?zƧR>!JFk;Fbd٦ܧO"x*+<PW%aM)B!j\Aw%YViJ%*z $,s߬SbRuJUB0!U(m hFҰ#Td&q Ƴc7M߬`{E[R+/m]n\&bt,w>yj(K15I[jnH 5YnҚ QQzM[Y_|EGG,9KZZhrҜF[$?{v}JS\D)Ѩ\,/Nao^-cLJm{a\Q4u]Hd>_.$#h2c<4x6Tg箕vVN通aR nZy"+\ E6Z^7\egYׂ$2Rhb>8Rz.U*/ 4ު@ 9jZ4Ny䇝:Nÿh-li g k@$:]@e`yuQ1zg"ֹYl^++t^Ӳ,&PA ,PET%D91L3M."$ʈQYs+E4lO 2*^={tt:짧Y=}ݻov_[[׾+o|޽''ۿ}5uuvh!C)eAd^%xt#R:T D0RU|ONO?WWgB޽pK?xBgGG'gڪx<.6y%Ţ}O'k9n I%*p􅯍,'NB4cOvMf|ˮ$4% *u1pG.u{6&Ph!N'Ji&@!bbH~eɢ2-cL) XmۈJA1fK !BjӳPU++t!]m$)`Q\Z}gyh6-jdV6L=`tZ,FG` !ggOf #m(æJVqXeҀ-W n7V/[TKݽ=<<],r2|? *\!+)98nwm(Z.D (FƬ6K^ \2=)( dAUj˰,Pe5gF!TH1Jrs=Sa<k[lR>yZ?߲R??w۷ҥKA6h>D5e$W%5b ?pM1$fõҏ?[VjۯWptøxӺZ+hXLoW2j5 'M21peS^:2;{y;_T q~v Z^Y82נ,:<bkV'p^DEP#L4bye]DLLbB leSaCc$`&[a2(BUa0 c{ԂmyM`BP4]TI&b1KȀJ0^Oޫ"ڨ׫$h%A s}la⥗g~FgbH9%E~(k~RTCрU5;]9e,VYnƶ{eveliٜ_5.gn+gyc 2^.N.のJhͩͳ3@Y% +ȝMT9=V_{' d˸2*Ź&:s1AsBTr OGR; ц 1Ag0ǐJSBB $Ip]LTRp^O^D­u>[W|w:@Ș3c44 >f2'+z3hYMGZ֕ XKeI8Mvm]*y<\^.+Z2O,J#հ!\ HU:h2SZqmgaKI2CTXcmElI8VKu7*MEDYUp(;k|rʸ4vBpͱaF;úָR^dI(\nyjڝJ n{}g7~~EL3+{k[%Z-ZߛS*RYzV7FlDʼYФQqb ڋyvjlK^ŲFZ[gyYxpu*/&u+-.mV[vHqʧY,ۧ @m]Y4]I`>1iRD&Y+I%$Z1X4dgj*j}>]` E"46 #N,;C*i,>>=O{rԶ4zZ]'IdEZ;X$)r:ae)AÃRJ &RFhżB,"eX^38 bع~JURǀb*w׃Y&kYEQ4*T EeŁ@*m[,RV>"PbzѪ|-/q\.,FYn4V:[l (VK0VBۤbXZxoMWЧOx~кD2{{m'`gD#)U)^wL"DVe 5PH )+]پeR8KAP` %lX&HI6 ^ݮ;IE 1I<ܿsiueQ5t_!lICkQ TYn9>֠LyEnG0UHB^!9LUggfw9)E[TSU"fse7WwO>f84 erD,I$Vu{;1U(`<_k/VE9(Vnͻr2 U g籈$с__LJ82D3f`Hm1+!pX-,-ljDZNsk [ kFkd&ETU^NNLSDIJXj{ V|ÿz{q<<{?CَR  ̫4P6q4ӵQ5(+iiO3Ypik0R1]JyRnl<<Ҽ9OW׾y"Nӏe>Lڝ_#@fE8㦽H]o(:Y85 Zgn, u(͹ּ ȉ#bA6oU!s=SܹsѣGqYcnݺ?7og6?1Mп!իNy5QBN\JD@LV+s \RBVEdihնZ'VQk(*J64̕Ɩ(~g]*WSh i >Z0Fs^$D Ř]X7 y`/ 8v{9!۴,GJFHy fy^pX?&,Muºe0dɴYNK (EG19_rАQf\2,H4r% /}zw t완RlbXu"+`x@Yedt (,JUI 02\s{mLsp z]rVSƘ51"I鲹zHj6 Mp~})XY2Nkw?ьf۩cT) 2(ζ[9F8QH1f.kK_9\2VC$,Enn-^D2ϫ4Y̆kO.-׬Q n՜eTRK$1>IV|ȪP4^7w~f]s:gNh:8>|FiN^rknRȼ7ee5$"-8~Y.͕ ה"b Z 2uL2g*|6M"+,;;tZ!Ve !}W֔b{9vGii۶!gAk+a D@Kn$/G珇x3&ƭy[/7vTP Z,[ۗ.^j2xqdp6\#e&Y?@RJ'E`K61._<>~["` P`bVټ[YU|> J4hL|z'|VmכLcId1tICTzM%_'ѳ(sere\ԍFPg'GIRJ!X,sB`µkR%j^_i kw'BsJiY&@Sw- $r-+W[p2M& ǹ+?,bݏZPѶ堬Ҽ]yvt9LfvO1+A$YP[÷1&T;O>9w0ΞPH!^< Ru 3˱f[)h,1t]_ۺY~oU` h8F,XXp#p }xx>3k;Q%#dF^dQt˲ UhMh^zwÃ6Vz7n\ 繬z 70yҰ4QD`5@˱<,qFp ݊TOjAʪ?yҫw j$@I 5_o; F4~/ y\ȸjwVN ]ARXƆSso˗7?s՝>3.%4L !±$]Zz-`ZMf0t*lDNYsY0U L"OeTJ ϵ+N 5Bc8F|9tuPkq lZ6M(*|9-˔o@rbtxvŪ;䌛0!"Xp٭ 燇a._bZądʮ218לK^ӮOڵzOoHҝM(EhSf+k/eHom_s|x^e8 Ǯ4ij:4HSݟݏ]PԜMLr,p>YBT'Y˔nכfbZzϛjwSsr9/;A{~o !R `v8P+8h>ZyP 2l:ojY<\lX{7>GTrIQ/huq'xﺎs{Aǣ .6ީvPow `0rhx~6^U\7Z :|U%FĘ42h׮^Fq, QȢc4h;?yͭK/u/]y:hstY%Y4c\dٸdU&׿՟>ݕaAqFm&2VփvX-|}ZF!E 9qe\VBe5b^kx%?J$ș,S|.au9yg`z+vCUZ :E~~8cp[3ЏFK\ia]FM x\IW76͡Az8CYi?g\8Q$,1rP,%fɨQy-r$ ,*cͶI#X™Ij2A)]"eNuXC߱ھr[^1l3=?؂r"U;v?jvDWP@{ T@ր<(sݕOgu˲h6V۝ 'tR7t=mKVAZݩx b r+w6ֶ/0ݨ)!6X9(6  _Oݚep5-+?ٻK>쿭=3==3=99%EbE2( 0rI/8@"0bD&)ru}99Ծ\pN-N.SO㦱 c=K$/s"5MyL@54y@dDU݄HulӴ%3d*juqw-!2Yc1(jZxpt0OUŹ^KDhr3bXVe'Byws$ҌS~|y1l'5,GHs,q/pCy:РYYho4;_]4f1 ^ήƦ 0s(DiD( r^PF Kʄ $AQ4 =Jz58>eX(sKN* &YQ,7 ӻ'̣b:Neiee͛vrigsO?x,[4g"ܸC$dv@=c-M`r@p@8c۔R@F1D1l6)Y]/P*Jm +Ң( wP d,_ۘ X\=>8','@k}? "ǵb,,>敪1ԜRi)B̲+˻e,~вDsvVM>~BR֧B7TM$A8~kGnR̳4+DõdgmuZN -RuhCE&,LTJd`&3P1Q)c>+BP(+aSWdE8@UUVj<ʲ`drSU+vQ D\Y^v/W|:0W, Pa΋`dbL-0$DH囿;`?攭UUSNPLɲ"*F7[7oͧ+598_XjE h&ICK3<ZKsN'{}/1jAmn%Y(%ITʼRiL+a(HT͆B*J)P .rHUbʼns^dL(8/KYbk1GѴD$H55 E{/>.i,E< /H9xi sLBCy&(* 1&a¶Ӣ<-sӰV ?{G?Z__Nx7nlta˧^i4ٜ{, 1 G}M5m: &2Xv,PeEђ331̌bߒfQi8W?P4lֈDӱj]\CmjGQoMPJJΊj.d{yŷl\~{qGnnmy8 ơnMIrƃi{R]X.Nf9Ѣ.Uj>Q˜e !(Adm/?~_Xٮ}H$UVϋy~Bp0L&O&0 ,cUU-j4 u˲4!uYҲ Bu. pl,Ody &J H\M‚^(IϯV'K| t,+Y\jki| SRY&sE 5 EekkJ9iSaEZN}^FȮ"Ŋii։, ʳl2hx!-]OY޿VNل*Mq%%iZ)ga%-MR]*\%?:j%Qn~ׂCR3aƲ, Py2fxJn.1[N?!W*52z n:f.R:?~|uu%?ӊ,,,ܼysuuj'u2#,ǗzQ)Lӭ0ƺa ?Sj:ZB8H)L+͖9Xw$9>=FӒ3ek;yoJ<RQnxsz%Zj8L-bRe8?~?~ò C'WoZVzL! $q0AQ...O&Z RaZ" uI/u:`iӛ/Z^7? ܠݟ yK$1D +Xi?ؐ8N; Oslgi~I6Uav~2ȧ;9OQMcجgIB9vmWhqjYX|l!ArKL9UNGVWfE"E4H s.5*tMaĒBb^F|! }^GdVM"/J," n2\0띅Ӌt8[%*$nLK?Աz~x\J\ + F`q:{3hI暝uIq:O7Օݍ=_\$FŅǯLG/fpf)l9aYЌXZ%iB4͋iL{՛N#`%B;kKNG9J%Ew?}n]mn`Io^4]U "& IDAT-4)h0ꝗ *`DWTU 8 8g^ZQj7{ӳ?qUfl{sr>>>>eyeeΝ;ۺ;hH#|+'ݱ|q4M˲ jeRJl6\tQE9+iFi9esB4H$$wGlhniYF`_xobl9`E.eZ~0I qmD?OgI!|vyt4pIO h4ib I2+RJM7ޥa K7 cD9%f,8v勻ϊ,ڛkQetqzs^8{w޹և?t?Cfu+.}:ؖFG[?{;#A-{A8hQ6O Hrc疭lx|8RBJSp6 n:mWGQA<.Ib'4=< ,^ @1jqF@I2%8$M"_^n\d{OraTQ P9 URa(Ui%lnԏ=ȘJ<@\E RVU]3sVR9X@8lm]3 o,Zn=ڿ ~w* JTTyu0Tw:o{'|tlFkϮFeB%UŊ +5UpH:My}wkn z$,Y{E? (y9J^ .t,'*kvA~yz %Ɋ BVfV-DD0B%@Xn J20mX5é3'l12O †!XgFTE&P<ն8f1@%'xeef7NG1F2g$K![˭ ŕEMgYF$,I<ʳ(6p} Ǖ[]Oih E3@)ŔfcO$i)TVTQ1DH&H!#BYKsń~ø7,VvVީ?? }m>C IZZ'KH (*W4(c?Q1N\Qc9޽i4㬐2&B6MKH0RUlɹ 4-BpZ]\ z2׶^KPhv.%K|[fngJa0qZ׶nܼn.?σ_ЈdP]ǀ,ODŽ[7q-KDI.=zf39PhNr3{ᝨ6 ! #] œ" NNNo /z \?rӀ&*yV,,,cPZiV뫗݌4m궪 #5L Jʥ"bh5K7+G5^xe7ݧ^}謋U=.˴ 2@*T$$M 4VRUMnvd5t,~8THBkoӶ+w}Rk 8t?W$j-_nԃj}MښfhUe:c锂qHթ绿Y?|C5}ozEQNە+Ͻ)<Z+:7v9S_[[]8Q,ؖ!EQ~~z)`inb]]M !"k8QA#V nWkM3DlbȤ(]S0P# &hcsݰ8ƃY4Qxi67 Gi*&"pHCICTo4 ZRdtE򚀔PdlPzAzq ]o PVA姗݊m+25R:D8@[$4Dq A(XJ"(fWWXp, A^7h0rr\IplsgQ1d~0Fub4 NҤ{zX7phDTv,x4}f|q'ën/w^׾RYfe=,y4lvore'[wOO< 9]Nǒ޸RYώpFL`>wmC[h0a88sc\T9ksO1ǖ'?/G?p8B,+7¯ qc! -c @n3qW[j~_O&??{k׮ uAYAbIWUhBŭfl<*fSBXU]Q$`ˆhԖ+Ym/CrUT4uGyۡ1}W~A~8/mPA4e^S2J,O,EYm(4skz>]D\Q̧yҜSQg_ FMsTr,(N=ҎeK,("o:YY<+ J@$PP"blcEi6햣aQ1zO)^yk8aPl&͓<lo_y]6 }zrYY^O͍՛KSznhW9,|UQ/.\5H$󺉯ow{~LpϡZ,%Ytxq0!X9y|wՑt1\ 7UX!*UQ0<e^g ltjPBg2 TRB0Ӄg_x`}yT4V@Y¸ M2Ͳ$TfYFWQ_"PIX؊㨰AoHs~}o M*5, .ɊU%S5@*̆m{Tt<ɽ | HŭPK2-Cin5SWe¡,qaQZy4L$Eix u]6jktHRehN!hto8|z;o4˕eUU<-7~ս͑f^E!Q$jzުA$s k$PdCR(SAB@Ay,yX(iGlYVsg9U)Btq:Lwc{'  Ij41.m:ge^Td%L))M&5.kjЏ4^؈l7g`v^O^ .eZk&LP\/S#^k6n;^$ISj/NX ۟렾mi֐ pK;aϊ1^ iA݋mw*گ&C?OO?Us3,>}p9୅۹~\FAgbӌ"U8M%CP%!" ;{;gi?cGeFr Ǔ!H RSH홟krm35s&dR j1 sN4T4%hfSR5]ӳ8VmI|4fyۦeXj4La~f[Qek-QTdI˩ 1kI4#TM ,+]D@5ռ_XQyTi4 u!C5I'޸njZbK˝zGӔ\\[s/?:Pm98Ce08ܟNy ?9a`}s4uIY3yV.p ߿kƷ~QԿAALh2qRw/KTCΒ" D8Jj (/`T\BjÏb7ĥ R"`ըUu10|^s]RPf( h&i`7V$9}k2p ]=ȹ.L'ZpcEVxt>>i$w;݃5ii Jd6սǟ(R_UfrU(dk\sS .%Tcۑs\K*Xm~q aK ;țkYM =:=;8>'޸ XAJ2誆Yl钢 A禩{4&H"I:?!$ U9f)d6e]V&I!1B=sߪT*ii/s??AQB֣;YL̜ޑs{r/dBY8<+< $EcY. y 2mgŅHo쮟|~c{kB)T8k8V0h Fժ]%@.I N a1ȣ,%GawԻҋ_ yуӏzy=~ܝy.9ywx%+ )`!?W_W_zx0JJ"VgBI 4 E Lz6-9`9=@aRp0<ɒxb#4PrE2vwݹZptuɃcTCS&zȹ5׏?'ܔBslllZ-˲$I,W.עks;vğ!L/ǝkE}/{O忲?7\זiǬ,˼MPuOyyG 0b}B)TV"cc-?3oY=wn\vya &+yo IDAT Mt L+5ègFѴDH23ٔd&M&`l ۔]g_~G%QwKHlYt}~Faaڞ~j>GXұhqNøfضYeGAghf1@,tvI ]ݶ\ޟ۞e:Fj` vҎ]o 2U"OiQH7)=*BBԚm[ћ&eY3tͳ$žh֬&; ūD5Lh.I$Dcqj2LYZ$9Xn/,JZf^|ֈ+yٚmyR`얆ous}sj8uI> n;ƳnEmjG7wF"݅J@d8D^^H%,u"]sL/QSȋg}k_ZfAJ F` VIJݘVύn%6P]8۰w=sadԱnTQɪ7ٺ<4)jsָ\kBZy+ڕ#V`2Ӹ3gW֖7XyMfQռ1s^h_A&(K!4Ij N<~H(LBBi~&e"5EAEG SIu! vmaS]8OksUInܠ= AdRSotVENoX>]Ìq?qC)2HC%r׫y\LF3]@UAmӉ6f^]UXkĆ:: C z"xn2]a#]z 0ʲͰk.Nش"ȼA3 0EiEinhBh6,lV?N3r嚸iט\=sd{Gn_c$K9杇_wıIw"{vv_ЉѨ-DhNݗһs{}-i^tbZF^1oMԗBߞƏ^Kk[yIFCt @׭P3lv])-k@ 69֊Vp4 ѢD6C)}$P:~@裏>3Jz?: PIw[xqɿpT}M7??yt~~a._z g7deYkIAPj{_26 }L_,54D<˱^ n~!ѭ*MBd2b f]K!^Fd Swbec~-*Jy橕7bq<8طuSRK0ˋo 4NO@{^y>qEJ8JҘK8L*=n>4v Hӡ@)QRUab6s&hj ʸp:I6 d\H9Qkc2uRLh\1;n:.ں XUR$`fe I fͶ8&5!$@*入$aKQ )9Gv f1B(*oO:-04)|g X鮅L RÆ753*USӴ;wU^Ъ=U |n4C ZƇq.59>{׼嵽Kb5b3=v(iT-f0LU^ky;2:Hqե+_U=ݯJV2f(IJV +ܷfY9S"HHsK̷v7şo._\fY.#.|྇m#ZjOtc%6IU)%i1hktC K봉fIMlk>G ĐWX3B2CJTHIP]Ir8c{۶! K+A-%+Mۄ 6M+4,HFBR ] @_AefUTJ!e2Eo`zz$F\bYU*b:cӚ C",IŸz(5GonM4G0b-\H gEU)U j7 xgFRH+KBaOXsmHP3\>3] `v&wz[F3ޚ}aE}io$uds(c.-Wn>~K/x`"V`s.w2ךˇז--TReݝͷIKDr{DS7~^r%,.SZ=3Z/Gӫ[N|a4zhzZ Y=v^Ah:H'ǵ.eQeT\5&o aQEV7h5zMb74vn<suꡭw}_U?~ @yh}}{1Z B+K{x }goep>5=g4-oy?hcyeɾJ'݃|!T\q:aW`8 V`+%BTHJBpYR1ABŃkhe\ XAS 2M;Fjz[uξFuN`XctN(9t򢎍4J^J }qy2V[ &d%+T2&fbE5?($NVErRR=(]ϰ˳Ƥ}8 < Kg~a0t1٨JҢ,LZfjL4&QaŜI4i8f4Mu@gg_X--om ʼn@Rizhe3K5lߏG,|aI'%֔CDlJ@k^u,eP0RS4'X!8KX:l⯵4 +79?{/WVv K~44Bp!!!: ^Zu_FgѿS %Y.Z$ro++ki,igԥ`uMe,`?O_e9*Ҍx?hQzvź!+5U&mx'o8 *xda6p)eUEB0-=McBLl=z#RZ8v:׏ݴn&rtC?i*$R`lb LӤaϵKy`+Gx2pW--fs8Ov:nT&Bh4Yk6IDaqQɁmcNf1Bd.;qvI<ثl6TLI^(n5M,m.YII6:V6Y61$#p4boyCGoڨgU<9UքG71ƻGWGQI.84 9@Ufչ+"XB"x*~z-e4\'KVO&#*lXЌi^exg hV3NGLWzu3O=R>w2hh ݋Ow}`f"GolGԿ˯~םsN*(ꩧr)R8:!H8s!r$кk:}2VU\:~RgeoY\h\ݓ\kc'iGlc`'Ӭcǎ!gI@Du]BPٖҐEK)Xj9FYU;[Ъ( 4HM \$@ B+ *ZO}BQlUkf8Aڶwuau׾duZژvUkQ+e"34sZԈ#hIw[MdgtܟNqx\qFX9 `eEth0B!Zjd.gn;~l p=W.Ū|7Εe^H-<:3=!Uwfm踪g5UoYeq-ptc4|""E]C) &, >8c>0[f=VO Fce-9kw+g~Ό]Zo#}*7\ݽ0wteqO52]:K]U%mIoVO<nYk4So82BkwZsPn y.jJ0xe^B2pmFib.JQQN20IBklۜDe^4e#-6PadÖ2KHj^Őݚ҈ZI2ʱW$N qTsϜ ǎh.7W^~ /`6nν9fӼj9?)$> ,k3 't1tX5W&,%eY8jGHnްj{=B .,Eؼt媞H3J+ vF4ynrb(DP" g{cu$A2Uq<+z*^^qQY_߉lfc)aR݃)b:-T4Wrn@)O?9wӡR UQѢ r@lme`k{WV>ooZ?TGBa1ÐQ$.Lu !4lJMVĆĢK:DB)Ȑ@PJJF(/f]Tu͸ Y\hhjy]:x dm"-٧.no_'L3mlXT#^/M L5̌QbFy?g pjAgUȒ76Iz31\T(TmM?2?۽⒂f)$B su8ȑ(]\e]nx⥗NkYMWeVToF>.8,4́:li0h;u.m]%R -[y$+vSd&j˷3XPՂZPC3-|0i]ʲ$RSkg8VLkK-x8yΛ7p=7~{`!1\VmJ sMyB3ZeF,N'qfahH) 9Ok:CXW IE0l iHl H]Wq*AX pn-'/kX8 gnx@$60^bxuhsempDv&q!#u!ز Ig5b:>_-ouc \ 0 :eYOƕk=M9rei]*nFUuXM)*Z 8MiY1m(LTq2jE 0P&l|0R$h]Ne2Mv%T偫nP>_8{\w6:Ȣšvn%3fb|+TѽIa}))! '&(t8L@ cqMF\ʺ0l҂dE5K Ig.X,۲t=ӦTԲ$(\fBJ80MgqW$J8հY.7<|wYZS~]K)_yvT״k/wڅkOڭ߻bsuk/-<5ɓ'g؎#%Jʹ뻨\?>NnCӅoijG7v?f8OqxB6244R`umW~ů?S!zm3ɟakDג,X2ʓYB:,wc7zѡn󂹗Ξ0T A&B)9m@0Y t˶|R r @b2@o=W£1l-5Y{xzv@9@+8P@m A@5"٬,Law,7]t^ IDATm}l7{p"ݯ>iB'mhѸX=mvGrl4dM$FY+5C#a6^ I4Ʌ̄PR4bTW!lˑf"]n<͋Ͻ?Y )`8,.Co}:N:.:I> {P:Jq̅:?bXL !(Q%ǰFeN0 !2J` &Z@(t'u*X݇}ٝgW۽3[nu4gQP ҢRLd!c-{pjY<uUfXqleKzc6"ZjnzPDų[='tEUU04.h Fa sQ? j°Me 2]Rװ\o8@R2N4\)!%@teIx|SHg2Τj rİ.kY+۲Li]h<Ҝ`@MBT1sK,,X+47M/pv{;˭è2i^9szV9"S^>7;kg_|r7Ca[ dPP}p߽w+>LSM677w6nRJ0Ν}C??ٟFY _—%Bȝw|Ϳ{}l2~~ss/!G>liڡCضGG/__Օgym믱jBZ Qׂ !~w~cǎaqǧ fKD)Mo:~;w7HJu./ʿn44IJ4F_+/(R ɫ4K=`f~ _{;Fx'OtM?LiňQ;0 wg璡h&6\m.-7Fr ,\H!J!RR@ 8LR Xw8! "(PgiI ^]i4 f//@]-4ulRZqR@&k[R9+:u v{Q(;/=.\!_9ǒ넅tYM+x|楞@rRֺQ K]IFE!JBRft+5On Ӳ$>4y♵ŕ2+Fq{yΕYK G[l'Mc]'~.uE!ıtjݑJV#6KԼ[mP+K;Cj&b4t U)piIH4יI4R. B\,+0L䚆gcvq !\cR ,gz[Xsmv;ZuZ:tW{I^0t E 4x91]1F a{Q[ @s+feQ)&~o{.eu4ZˎĴc$ʦY4B(6sb5ELȅuRaՆY%Hfl̊ZU 얶МPD1SQ4lU6uBR@͢Yo6x))gi屛99" ۱) f+bƾK|nC,H͵@^ӲdW ar$eTHJ˲,]ӧ?>Þiwkcc?O?X4ͷ-~ܹsS>O4M}3y~~Rgymo{?F[R>;n-2aT޲,B)?^YY?`iOD?|=43gΜH%RhC];"PӴ+WJ˜Vřsڤ?β\xPʹj+tbJPH 0ƄZYT+ny5 5.Y12 Da1-EcC5 Ǟ2 eHGW0 :Vlum@ڀ¢m,uW8Vh閛ē u}$M^. Pa (R FNȐ²-`KN JKϳ\͹t6 7G+OSe|j97^ Bfx ,&dioMk5T ƢNE6ۓBAڝ4,Pxo4r u mZktu!f*[he)0L PM!P.ee`QDjsvs0J>6"v\UO}ݫYL WyϪZw|uȰƴH9R@&eZJ ZUY ۶\SWib3,HXٶgUMk(+9Ej8n4e?ҪeyeEyYh?8Wښȇ)b0' SRkd¬,:iba=A˙ Ö' 2@I&@7|Ge"NP**TBUТ'@"y^\H$QTPYZײD}e Zۻ( uA'O,- p,k-];yr2g|sвInǭEJU>04 4 rcy֣nh7aj P ; vysouMo4l\e;*5Oah&Mb>|VOGqM7\=Mϟ?OMoR2} oۇ?k=c__>X<==?|vn}-o溮A{+++/­z]w=#59ٶSNEQ+++NZYY'?ruu5kg/7vm/i n%гn?KoxϻL>v=v_|/=_ v\}ߋ0@ ΝJ峙;|p?#m.pu_mQW^ kӷR(ku?~M)5&(\;};y6%[ MEJIRTl5Ot?.fP3g^`|ԓϟ )3Tf 10LM(Ȅb\Jci !VU(PAc*I5@L'Z)LF q_ڮ( ˼UntRu0us`h:V%-5h 5Nb[+4D]Q4¦o x(,V# $30o,+5eF~h0¢q_y0D_ӧO?S>h9zx<}B}g>ww)s ??{= RO?te.]ظ|UU?fyVu̙CBqJ)0 ÃA!T˃mZQA`0Ɵ_a kGBBode@]O6Ow}CA"o%?RU3kxZBLf2q#!ˌZKr)ؠWl:~#;`gogs"jQR^X\4 \+yU\ MG5oOW VV،`Dwl(gEĭiqmbW_|SKNDb> %PZh PLYf!`k! W)9F$1D%@DHZLY0Et!yʑ{hއE̞~b:Ѽ|4Zy:+$FJ{pM"lrɢ2Ӻ7o$?r yP5eD*1 )e=]|:Mx>ƎpVJ[|;? o{&qSOB;ObpEggNe٣>BA1Io?Fqfh4.|'(O>+_9tѣGB'?? cJog^y啛o/$|CZ[[{>3{1qw`o\c?*u+C "?| T ]l_z}x귌&pw]Enb4 ,kWˊЬ~ɇ6_>} ck,0xBk !1qg6JCCk!D[o{!to`4q uLMv|b-B.wη?}?p8/O%Q'4@s%z~lH`ytx.jIԨE9 t]/hf[q`n+sKǗ~+Ͽa 46J ;  ;DVy&3 IDAT7G?LYKq 40 W[K B@7onn줻óϾ괲0+/|AV )"NZuE FFY CԜ Lcy(+<4p*UYee!0][,]c ,^`$ VKj^ը3զV.-wf4=m$"|6>(N('v&׍t|*8#g(lùJZ-n;ueY\YUq S,A@%TWB5viʂ[Q9ϙ@Ds*/]1c*QfxZlW,t $|b 4&⦏]q;= PxrUěa)ǃK;kK  |ZeBf4 ?iyacb;HJ9ʹ ҉c셗T4n X;SFڒC͵iVϋҥSu9NO4˲U3V+'Io15wE^OA4BVKnB$hvZI;*=~3Lg$˜5^thgķnE13R+Sg΅o}?\,,xNG!]^O~{+^plĭcGo6vwP8 }!OmdȪ^3hZYn,r\6M{ݞV*c d0x5ADZɋZih q&V~Ͽ?!` #dxkA=܅q{N8qKB~ }187Bǎ_8I7$G?z=\a}'Nq|#wW%++6w}c׭#G~OkyN4[!)w'y`ŜqdEBJe"mA9K7VCK X!lŶ,gBtVԊ(L:z#?ç}?O-9t{hK]*QQ !Zj% +1a6ւzENcQe遲Hrf@ tѣO.}́E^>j1r}90S5;ڥmw[KT'N'fҊm -_BgGnirG2Ә]#0^>7p 7(T!ŕcq5c`CG:^U"IkkHC`2,ؒxO>:Aޘk.yB@$j).(5JT]Og#Hl|t[fԙ3VJ.%NSqًmX;Snm6F%S|Z;M1nwic Q@E%hvQKPB KH%eDwQQ(Ŏcmt{n7(&š 06a]:c[1ŴV#!!СJcd@܌ Z9^:mFWEjaqGnjfo;ޝg;H߹bp ?0<ls \|mϽz]UxnyM^\>IgG8ql(Wl @؟;tyxZC?Ž(1?~{o/lvKX.kkb9Q8YZMKql6[ۺRj S& px 5 r`,PEQ+E #\T,/'S4r]#&yҚ,-Ù ܠWRsg-] eՔ+׉n:r^mwes';-g#tʼnD/_/>N/P#wsqhnZe4[BUwNV (<OTWB(8#4w+b!REQ!Rn߳TZR }w8yVkIcn8Ù|X#jO_A[-i_o[^X΃(ӼRX^^:A1]ƛxC~衇nTNnzד}gZ\x}GhsJG~if/3 y=w;x#\\ObBN؏NwZ-&0~?y]]]ޒK7J__C!@h,{k߁_{BkLœ 7뼹^@Z`%\' )2B Lc BHQhX3SOq&&jP:`JhC m$MmTVBqZ!$H+^'@~b6^h6W0r2.Rɪ6VgvVyV4mBqDbfb  j>e9R^i= (8OQ'H6cB +gϝ^YI? u1jf*F0EPꐦW j]kZ!^hv1h;mQ 72tPpQƋK+Enf46@ oןo{Jg/ڸ`.vBҪwkq@5FEeGQH%si$PցhҪ*PR rGvWTyDa'LsId`HH=0@u 0.0Ir~0;?-'"LN7f預q\m~eee8n9oj lVi1 bfFxІa-2ȫMau% zm RcEyj-i4!.\I"`LHj[3Fq?B+EXɍP1Jk#hX ]:po3l;rJBQŰ!t'n_9|맖Ze˯D 6m'Sɫ,-G%|ȋ|:\?zhd>4˓eZI6e 4TXqI Ҷ-wV[\]ԢDM?&hɴg3yg4M ɤ5F#&9qL7TI$ljɐFA*P]8j5766ϟZ.뷿 @_tСCS@v@zm+oM^rȑ#\%wˇ{ vTirj$^^7uW<-[^748ȼј7o!.ګW !z꺹 MػskN2mu:Z )Yn]~`4/I:Ԣ$}-񀕹e[B1 HFR1u!b , ōz&=?" l?T)8ixVFkLYv儔@W3`ղT !q{VF]?"BXEim]8vVN DCj)ZIC M;; syk}7)r&2 "?pUUIxy)Ŵl#4>uO a4bRԑrEem~`R qE]1ЍJ*n@ Ijj4f5FXeD]` )XH@3J 6fԞFoH*e1"(nZꂸu18)?ďOD:ǯ>)1))S '%C@a15)pPW?C}I~uի*S.o_NӝcG4k}e<"^ƥ '<4à~O "ZWwrFK / 2 !Mً`8moq}.,j 3טk2Ưs! H2.Ř"UQ2CV$P;@_|MBtr9V#+{ssFJit| yv趛oP3뗨I$Q7Atyu 48?"L0֞ǸWOTr{vq[{peie!YrzsOk˹QYM P?ZM'۠؈-^t)Lm^s 0R#iY](8D 6P:^sIb4v2oxe_㶪جbq(rVF0\+HqI )%b,~-vlQ6Zbn5֠t/R!uQq R:ZH\F Ƿ^&Bh+4`:Sm%A@Mlj:/-2BAD?ju'=zUs J[ ʖ(2Sݝb Z i>"uRfbi8 +k׋$M77VvRq"۹t)(Ldz흭4t6ɧ,En=',d;٫Wv6^[[iZB, Z/nӟG/_>A_{z~8n]|yjǪծJ2C1I R'M.]S!Xl6cQaH5CN%H>ڪt=PMxšF>I;1ZG2-w6a:.`ۗok5ѕKW_37Qt_"]zIFi6/moQX*PISt˧'#غ|Kg77\m%mr=?צf[$nVRX+6i]A5+86d6Yscu? WWK%d@evD Z]1CbSls|I}3{]!kOJy`Ɍ19 B~?jr hm?*~[ o?%`}l0t'kY&iiECdtz u >[)?ԧB+{@R[sɳݢ( o!ꅳc*[q*l`VC+--\Wz͍mmn@*ZzMIrWǃ쮻n}f+?[wbw(.ws" |_=:*'pZ81O;rZ[]|<sKv=MkSVbjECq0P!dH]Mx.!0v\Hj`gXdCCI3 AkR~Anq]Jݙl: `WE Udl' ~;:;h:Knh6=Lrץh\%9Ȗ4t8uT",+!2MR-+ ml7Ԓ3U^B@%F)4Ő M^Zâ0Is3^&c kE> |o5CRTz65] 7]Z1` MǙЦ*Q`kǃh;uqk;+EYfN-*;JvK k˫xT|s7 (}f\El̡U^ n:4N*ZHBC22<|a#>JVbTSQjv@^y6S!q)FK5XQq .ʪ՘D[WnX=̴iUBLR}#sV4wi0 3<8M9:?o7pu~x9-׌{l PQRf;֚C,+Cg=q!8f뇻sOqSI#/lo=Q %w'rzYY+mJi7f؂Нfn {{ nY𷪥}49{[o$sn^x9cכ)f$ros8)4K GZcXs-ޠ9cl8~Z iJj͠qG-F5@lZJAҘ @@ 2Z 54jB` 4Z ;5b(5j>lNwky+e%.ؑ IDATt\X,M2έ()㠙tZ!B!Z&.B@uHjܠ@<@҈qEpW ;ݹCn+WJV5Crrii_5c2NQ8˫Jwnun7LWkT Ks4H|h8i!ڙg<<|E?LBomm~yQZUkVG:O~g>hM?l˷C?W{[BƦ@FPRհrLv10` -R#Z Pxb[FlMΡglFZQV`ܹ @AmomأnlKM8h{q v afaAҝ (g08V )jBˑmAL.*ML [{Y$(t,fe\5] U)8DɆW|:NJ %Wϝxw4@5Մ{[g7Gn=ẎT*m7L#oLvv9af34@e%J{_,ʋ9CJnZ(d+j40ʷ7w0J PF hA&X#\ǣeS|f73򽬗a||31oƬ;:v<{iY]_>t<9r2=4Ϳo`$MS5eoib^g#emE#5Ȍ qvL+PL~G !30v~VlmAsuXfSɹ4Vj̓ \2!t] R1J!JX 1hAb UZ(i-#h Q=T˧>7}R '/}ڱRW]!=z}H$x6.5 )i%j(XS!&aԬeY%ā! g|  8iI#и%Bo`$,܅ +ٛko\^y~5W/^8c5;X <oybx+[ $ir(K]59WGx4ͷNbJUu:x8#$IYEV3VzQĴNu^ 6W@Tyى¥兽G]e E4P!X\b/`hULq!`IƧ%A]gLK&uvZϞ54lxMM"lyn!NjZ[([+^H<5dj s5Z$pX@l ^E 7K^ 9SSJȒF?\+[㶻G^]-=k,HҒMY4ɤwٌ6[ TߊcqZI˔eĝc\v78hp-`0FNŔPL32wwJ^Ϫ"^߉,cq dƕ ƔF!V,`u6ȷOx6Цε U_r?yidz'ŸWya#jX5YY7Fo_:&I|?B7]l\#HYnlO}s z4gR \:y)nڍzI^9cĥ 7Ƭ_ VF:#T >7+>`q%o_bvvv*(\@iefRXD=TkAFiFA#aDJ*Vk F[cF2Kq仁Gb8J:̕-jreq\8* a]2mpQVYAdus|{UU,` @$LHiFXaM g,ҔLD"m\@$A63={wug?{r( xx|1SŚPC hmy]{rty[]$>|o209wvWצ#K M ^n7t4l%/n=!|C]vNQ [oDJC&%}CNӕ+~ak Y q~}5LOK60wqjCasmCfQFTk@(kE*)'jj()%4HRv%+smǓDRiRղt'2z4uAR@zZ[Z]K͗/.!9^_ xs*0#4 GЇvVfi%Њ1=ڨT.!@"U)NO yeIA dH! FSJ=ײ|I`:MݘgPܠk/(-FXL;-CQlʨφ<`lے%\L1J)0 P0r')Mh- .YɥUMcڽf DrFAۤݺ=<d2aXnWҙL:+L#ӏ/}|<}gG(= ZݙY6L ot[׳4KG{,Qx싷ͥ g׶VIKV1n FLCFPNLmm~e4pBQ6|V:.LaZZBM4L鲨dZeӺ?;" eF&I&y)Qh49n#1Jcu#jLk)46m^O+&)QخE]ۆÃNz[v u;KwxYyk{nеm[j3 Y61C K c^ϋZvh)^*J圛YzףI Me[٢uPPZnZUZ ]־C @kLfP||5}{fd@{xWU8bg6'Iab6|\lzw?xe`-6BZ/3f3״BpBeSqZeQF  ڔeQuf"(y<Ic TH ]Zk"dCm:QJjn$3BZYNk׮R.I\@68aH|w=ʦfKkN`E⒋J\V@K` U]N=8"eEvK>;-tue:߻t~4q1F3qrLY}a]]3ڎ'Sbw [6`d ;~1Ǔ!af{꫖jHXEeC\& +@4Eɕ䜧:DAsl1d[EH{+hXp/K$I^w e]eU&KU)8րP;^]K^Kc;@dRUFDY8ͲʒqءcY<a=/=uXe3ZK0,[qWpn}`(FCknwfoCBK1%w!k!xYZh&Jr%RYZYDqUAal\ZbJt'YA2q]Ѣ!qM}ߺ__-~jq~b  Fu_ûN_<َh݉ވ>lP9}6(1~g9'nݾy sktFk6 !5@l>&΍V BZk_Y-W="`=yww>9ȱNJK8Vl~'H [hgDz}<@Wկ*o.N<4014DZsCBBdA"t@UUh.-D\!#Q֘ZK6ƀOFFBA!RnRJ1X)%>NBcRc 0U rjmoDV+_y,)4k^q7B $ jvi2BKZnz;菧JͺͮMzY;]ܞ殮|s[<dzvk@K'BiRp|wz9?;:2e>ǻtaٚ)fu ll7Mct7ؼV,"iN`0'jcnNbn!@ʆimhA*LOQ8=\\wh?M"Lnv{Yqm rðJIGn;3PPDkYZf(hE~RQj.F<_ѣá}%<&f/ niay/t}m^ܣBc^*^bwfN<$M'Jk 2WzPz2X" eYUZ c02H,}d \mH e !VԳڵkgVWn҂{'uhKq) XZU_k횬HfLc(uoZRGT5Et;[1OibTLEFȼkv<rSs  /.ZoYL F*%]QBzp8olP}B5zdyϒ#MTV^,<{\#J=qztيBӞ1dn%bo!4 U$ic$ljay%((䮇m˲-zA9FzVfB'g)xp{{o_ Y+=4}/P`- RRZk #c!v|ݛ|L;;wzͥSs,,C$vW^->仾/bdcO^j0wDxTCBHQ%X R4ab! E`ڲRG{$S5Lj ^]BcXf^>쳗/_~'WVVO!י/W_g?x$yqkGv/as~h;KwTU|=ɇ>i#05~>yNIt|L3/D+ǿ8g/R;֭3p6vΕ"#|—{թpA$r2ל1RNhQ@bTU0a6FX``k" |]sj AZAخEnY6q2u߲ᑮEIhLˍ瘃 e (!5xY'"H *QB%* ˳1$Q, xT(kIhxi3hU R,u:GjAJI5584[^!VB\~cN_ͫnrW )4I<=أ -FK p] ac-*)c֙XsF5c:TUd4 (+FA zaumt6\xP IYcgxv]RPj6N$<̵\,!5PWn\{)Fq:9>a6@RZ* m 262ntVgK1gPNRA,qBXZ g"*a4tLXBΦնl'K% B†muQfqcu@ ` !/ɖ7;w~]p떽nNu~w^~]ƫ f#p[Z>}ǿ[5^>3K3vwB@رC IDATl^P\u}/~vh?,PZ[鏎& O7}(kw'pAx,VⲤ{H!䘷%f12Z^!J!ϝe5}~8ؽzܷ V A1Quߴz}Mh9on}S? _@q71CzQV1(Mo;Q#Õ@kĘidUR~جJ^ Ҳ,یk#L6\K ԉߵ ) B!E-QhsBPٖ08-Á ՜Mv\ǟ붓4?5 K2yK4+W*=|q]k"xsd}]o~/aYvum{Oog?g_ Oy ];kfW~˗ zFtR@@ؔ@ERWF1Qi3gJ^s8WBqQCq\=ՙ|uAMdYí96G!;^kR`u?970Di" VS3"'ZCɍ] T}!!H!hYcQo[.rTXA ݸuvc󉳏vv_:gSD3@pf%lZ ΋Q*Hqyr\$C#d a^H\sѰc#Kqs'RD Hs(p%u[/o S.Xd4]mu)SUa ]t7+un(e5+&j2V\ {; c72S*p(Z2/x]`5+Ҟmx]Z?nVjt8Mԧs2ff6Lwt<`17dPFN1fk A6'MӪ- uͦkQNDzb::$Űق1M$/4A)%1Ķ8*R(gO-pt"x$lT*h;N;TM43FHa͵xNqɳ:fh4@I vPpCUU )\^+WOW/|3۝^}3s*mL9Z㗟o?q]\ vņfo8'1T\x,wsW*loohv/;aH(J!|LJ;~O8DH+ @pxso9̘Ix'މ]tan7W}R ?<{~Sh>A=36[}3!:1蓫goo`PC@R㼂%ZkURvce]k>%z8ȄZkR A Z1J)!@Rφր4T"ePc @# R̶n;V7"HB)ӢN+PZf3B-%m~̸i:fҙ>|W_[lv&p+$ &luu».GN-oOgY n|s/^<|1B*w79LGMxU@f`;]* Yn_ YNsjvlh[:d42#gk{0J5 0A#B3)a#'>̥G_2Vq]eqY1;^X\-( UBB-6#=7n6ݾvHw_au,/|'>QW^q544rPɳ ~#+h̅ iF{G.& i74/ә2:$M'FCA+cZq26#RCL W'vӛdSJ,*,4EmdK uҭh׏u]qe*rEAd0bKPIQVV9'͹77 ~=kq/{\^Ay%0kŖV0 R !bLVVLΥޛTӀfyL…r9ʋʲ™f%%vd;ŧ.m<غg~'Tsg6o<};kN5ld?l l 0<;xI?@ &e?P恸J9B|+nsnsB1F5?jnU$ V+ޙUbZJdGII -ZaF*fI̘k&e2-1ߚ1XTEW>OxFZJC,qERt}zZ XJGs!Q ':%Йr& \1b2*gV1hzQ;ȔۦΤ!Zư2$]8ݭ}g/ݯCU%RZ  m0R!ziZJB  b#%icDH)aiB0o/D0,f}'x)!9<[1_h3Ξ)Pfx,+vomNR@m'jcY\&cQ0o>uhk7NKS7\@B,b=,q:POe:AtYܔ{vuaڻ?7noݼ-MgQi)P7o8f:(ln_ܤwo.yX9}j>7#4{ vwfoqꕗvc?׺7_ӅGWJ#0NιsW,pFIsugiYu18}v6K)ڲX]@h1 fTiޝ,-wl?mmʋxn :ͳU~ڿC+n+ð?ća|PKۿèe#Nnc2޻zC͊q b/KMe!؉,ֆVFCi8|U/e ;^'? kTf8)\s><)82hIN4 7M,b` DYv4HE7{N۷|P, fq fwGx6+ʼ 6W" ̍t= , [f߅7ng;vÞ5?A2)g`z~*Y@yiHe*'U ryPc,*e4$ U*ny\rzEq%j R1 n#lk_;6B-P¬me߹pV~'+B/nO75?a?c? r"tO }3O{GߗO\xߓn Ooʲnމ/3n͛lw%R0߷\W(C5Wa/t6\V# u.882ɪ:ym:XEܼ}//Wϖ 1&uXqؘd\p 0?NxE-Ph"]\{>{nLImϬA]ޭ߲(G=YBdΜ_y9ά8`cm{݆KW{s7=MJa$mcM`+h5 AF++V@H(djb9̉4K(ڧNfiw-9N2ng{6pfsii&/|7[X 8 ,`:fL49w,(A\Bl!jm4 a cj^7"mɔP)/\4,ZUuPۋVhcƝ$+G:\Xj`*.L:鳽< !,+YUl,-c#ȋfUu\IY4'C5Έ(HlT5XZY^ ޽Y1t҇*_=z14/^㯍ƇzcMc-=yxv IDATEMكԒZjIN˲ɉdrH  H䏑v#vҶK5[=lXӫzU [(ip޽w9묽uHza(*JRպiҐ`sM%{r0I^b]b% ='Qv6gQ6ws%%&D)Õ6J EgLZ(ֳ=n\B)vlj!(,nvLc*9 3}2N@Fq44k* NY~S|=hoogZr4u}ŗv{GVq r# W"фH<@ͭ \mlq FN1,/Dw֍*(EY!@H)|{2~}ܲp/ScveHoxՋ'A!"~o"_4~PVb0oj1M|s 2oIx4z[p\X=t\D^I Az΃'a$J}?xִ<8;|_ ֖,c1ؔrcs۫zrZK(mK/]ã>8;|tvv?k4b<ӪV:P_*K)׮C/y{zc^)7 :XGGV3!HJ' kMǽ^^p+=Y (ϧ(#4av66Ddb}4֜N; ϲev.qse^ٻA{{z<{TX2/g~/t޽{o;\ KiZAhJ i0BhҦC]n}~7 GJHe`[vlNTq C imP8EnE6޿bKr Ц6gC9ezp³QtX7„Qՠ*e)Txc<>xo}$oHr5h|v}<1\֚JӦ A9yO>ASIw6L;pַND<]LE~2 2P(NLVȸnbh.$%C(„,gYy%m'twb5-n6x݌[<"apyvgB4[W c G] 4S9mO lEa4Jz~ci O_$`rQvFr.5p8žTk[c\|1zu~e2:Xa@ AM=#!?jgлB4eR(.. IE1 8KedGG!tJ*%_4UGAgv|tTbK[|ދ/v&{A1tc@ÊHiXS`Dmd. B)K ܽuwnƵYdGˇsOyÔ(`*3h$P>N1#v c+nģ;r]k@Z EQHTr:;?\ew^A{Wk*?ߺROf /=;}xRw;ݎ#}?ZϨDz^nlo9sj9DYyɦ 1:bk 54땩G08(cJA~cd}/˓ӎB4/ Q??i L]'W?||7:< h#`s>Y ݅;O8+!"9 w}A??vsi.N aL1RVsóGz0HZ:%\)CrۉJiw-OΖ+aJ;>8ʗ{i i5 * - *bg)DB o1?R>jyp,O0JӘ2u+*'&a!G_s)8vTiJ42e- L~owz4 [˵agԏZѽ[>xW{MYF7Y4uտlm!-V#,=cg\z֕׿<ҕ'V>IU2k7.mNֳ8&BjQT%&DkcZw P`E^UyUokK !` aĘ: Q{c(_ϛ<'Kv`6}/%bK>#4]4Zyr=%;3.k?ԟ$ظяdw|:G<_4:xm]'̓"8scmYo~w؈S^{ J !;U_'F$"sAkaZ4!T 1-1*C)AMG3JBgZkE ` 2C8M <*$Y(FϏ$@J"]1\]]S76/_r}qDeYONg/o ,kU*'C}cE8=!=m\iۯh<I)s,9jk@eyeҧ'|Fo`#O!A֙YnIb,ht1ENJ}M;/ooXҢS/e9[/IDy|a@En[j& K{mA7'~l:Ϊ`S6MےoN~rwOGÁ|z~:+V՛gE AMyơ^GAn$W^Y'-vFmmDբFi3jb#WKDQȴʝ,+^H4*kSײ`AP՛CJqKq' bq- `N{R-ΗqwԿzirD! U4@cJкݴ@htXS qb-)ǫYeQR?:<;O_ c9NZ,k."h=?Eȗ ¨ݍ6|<6V3+J}.2&/eDb4avcƻq'zy>m%ͷMEE8;/j At6vg# U.`UDn ]m'Ac2 !2Ly!\6Pa(CCGi]r` fVKӘ83F!,AeV&/<W P*ZΠ,CڍG'sѨ^7nΥn%NY/?u5fFUeuRt-9 FVGǓi.yx6_d3I0FQQhth=xβz!tmQ{>ץ̱(0bZ.BZ8A:z{t5O jemyX#EzY5[u>hhA-=sn|P̯~g:>:ݠLC{'PYRǒ߅ /gZkuY Νlr~~r#ޣDcTAКnj8FBr(1%"-P{_]A#EEi*5Duj(()!L0d VRYmAǕ Ijc߻z*JYNa`?_:}LO|LN97GU.iãU)VaxQHsSijNOrxZ.@+=;?/u]+ellYQK-p< E599W!tz)Hf pZ.'g(j%Ip٘"baZ~ΫiE^{X-[]a4 Ⱞ,x ufci^ֵÔ ӿ?NJqjk&PXfw8uq' Ͽ4 /XdJF؎vZae5_*=ӖYS+f%OV+!2Sy)J؀8(h38h ' R/v I"x4,2j4Ѡub4j"ڙ̣9iUC40J.plt|2 C›&TKnzix8S}o,[^i'sMuX!8-߸u+l WHֺBՒz!8=JI#<@kf)*nnxQ9̪\sv_0㦌{ $/ׯ^NW#u<9C[+pW`3؋ҕȷ ~Z5aMZjQJ[tQ(]gJ0iyX("wۭ/˺i,N=s-iʩ"KPO~??{o~}krBXz/BQH!N[:~&ژy#0Kaz\/lSšBBV+酊L`y) sN/_zd,H {{{1dʇC?[ PBx$}AG'dw |uXcR*[/5oG|Uf󼽽f2A0!10j@dXL Phy߿{{@\.ݽ_g!%R+kG}65@պe1 b)@N!vs̕K:; a'_!wo||vnww!txxx||֝;uq[笢'uX:eZUFB 8,hz/g:'%!Rw\,w_V{.Tnr|p>m96VrckztQʏB92փA=cA7MhBPDE嬟v8T̅S ܠ.UԋeIZ%n+Q.`BaCmB>e3[&'yկ}Vyy7޾sޝ(!(uQ1#ۻ Og' =1yk,5 L5*+EA)٨j݆X+o66A Ԇ\HipǏռQ(J|!]̼(!uV K_FR5GաFeFy9aTb80IΨ!l֣VhL5YF-F;bhQ\8 >Go|;[LӼQ[#$y8 6kYLQȝ^0f-e\8]eNJG^+TGgVGF+5ďpaן~o~ۯn{ׯVٛA=NϫAhgm)+FmmL@ cTA^B6qq>HybtvivahH&yj8q^R ,ŨoRa4^z{}RFzhQ QrֹTz19Q{ lLtgi !0ن ъ,`l@b~>;xrVe쵍gJd]: DQ{ׯ޸Mi!;o݇B讌wq:˵aBfKMcv"}C XbL4CV8aUfjmu ">Wg3;!ǧok߼|2ݾq?Nl;vpeY4l;ޏ!0\>(ȪJE>Pgj IDATAEA}PZhww޽{+F?/)/q{˿'Y tZc:"nw a4ޫ:gcb.{ޭ7;;;=^eZB {1Ej v$R  pL4MRJ)0\VaZk=ϳ&I16>9-;B`HG!@hQ5V($Q:V5oZ!p1ENiVBqqWrr<7o={Qމ/(wwwWo#[}Ո|?` XKNYÌZю+;{ CJ0b11:EfbgӅЋWu:k:v:/8Tvx($8~Y͝( ATer50#)K|G`=/cl+UOTQRb%ԣb¤Z>iOVc]PJ'A'JE3p0 ~7fMNkyy: =ƕY:2e͝I%}hH4U5׺N:"O4ڣ` _+i㇝$+J~`@Xa;:IJbHB4Sq7jӾ򥯔u޽8m"d am 0yR9d(|kA *E-=޽k"nԋBt5nollz٤P N[;Fj;⻇iP1ϋY Ď@x-'yƳ!Z%hdu4玖p-έ7WsO3ZlXN%4 d襽|mv"uVz9i7^;1FJ#N+E\Η dTe1ʼn &q(erHmuX馉(!;(w>b)"+ưτ߼; ҔP/vw1֘o_}5+΍ֿs5AslP덮^`ʪ^59W.W/1s B)@ D[7quέOOȏ"k͛pQ]}Zhn}O_"|c{=9͓~>}7_  dsZ`=A= XhmJjUhO)W"߭}!xx!`K 6VzEGE" Xo#B r ɝS:\eafY b֚"4E"BclXSsYb (ģ(5t v&!Y)`/tcA8'g׿_4<9.Ȗ'x]q1F1Rkto(S#vj*Y%APbOiQU{!a;.XkDQ7iCzzx4PibUU(vH^޿bDQ.3m\Bǝ3 tk|Cpag1%A1hk=lhKDq2OtXL>2M]XEn ՠBwf77*" f-قz;"ԣre ٬jv{OOtZPutɏf1"'L2+pHkVZ$wn!1!@2i%؉4L˧NOhJ!YiU=F0BwF0NEA?ӬU] 'wG1Wy, ?Lçow[IlL%|,W"سV(%K5aXwgl&i;BJó[Q+-\U źF 39׉rQZ򼐐Mc8Zgu]렕42Gi+C?|zaЉ4W7y+޾ԕyLJnPu^Ͳpfe[Ng~߻LV$ۻI2hՙTML;<%Ü:T'dt766)c7[uMҨl.jU[C|>V2[1p(0Q5Y~ޥFVybB57v9W.RF9I3 s֫ll#'Ep6B9|KY7tMW4v{d}l2ݜ.w?O;m2ω ( c_77vޫWzqoB1JƬGT}xi:_eDJu%* # cRsk,䈤.?c?O1, Wgn&3@>—c^^ϕt[хHqv\,szD=~i=c)h^|")euv6aL u]f&e]ރ 73cכXkA멧v?yz3Z~o~ŏ| ksP 3> 1ic~CzZnڳ{wm{.X[RD04[ふr29sP;ZYc-hT1`Y)>>Ykʲ&kFe!|kkKk-+|9g@Z.4DZ'릊1 ˆ[kCJ@VH O#=`}tڿ9/¿>:۠l&PxdGvUMiE8Źg|>?Nv7Nb֝zL>;iLΎ7gLj٣8IsABRIh͜pVutfifoFI2ꏻn񡒮y&ӳ L+o<['W-Q5E8K t$<+.k,;nlAR :?ì֡uIRF˥$I!{\7CD@k]%EH4ALZU4uHv;ˣ_Egtov_7g? XNO;[`oݸ.jy| p@;2AR*x鄅W_{lmzq99Mڭ 0 Gsw_=~Wxc;}[Ώ))#5eU(eRTjX,߉[&_k|7d`)І PB:kXŔ !cCAOnʲ,+b^مpb{g'7sc|+@TXEuCuUi$8(վalZ[U'G>1~\p /;QB #KBRj^ԇ2>teo5,\ptd \tOP٭^IuZ1Bt48e~rL?:.ץ>2|H(紒U6;Z;JR>u (lu0JT,4Dݝ6/-XQz{ˇ i]v B[w];p|5o>97кrkVysOvo )ʗ?TAq?TQ"wQwONτ#JśU*[/:r0f&4AB512_kʊl1Ī\6 qa X pE@jøjxAI|>[orNQ3w 0+h+Xfgw}<1)Lu>XM>0iр!thr]l~R6Kn\Z*mqb#Hh.Bc`Y4ۮ52#?XŪ*Z -a5;:OR;˛k-Nf2SEW,]7wux4$ PZxѤ (qW5 h(,K0A. h{l]tkJAW$-tT8a* cDزtlmoF$^Hxn *=˚& ?yq6ri{`[:l=wsFH %J(e\qI9%;TrXUvJTNIYcD%Q$EIo~wC{̏ <!džH1.眾wӽ{ou׫ִmho61.E ʁe+X6(^Rjffa\oUι&aoee_D0u3Ev9re9cϤJHM} Jm`4T^|e>ٱu@`q=dǏxjKG^EW@Jlsb$)Q]_]y+D01 5M19,D4?ƍj!̺֎ z;L;@!>0CE!WDJWǨmգVjKE|měw5@xo~^ߙ> t/?J*̤j5>jZiVH+$BGM)-Bq!L`0ƒ(ڗ>WNNs7҉)) hmmO ! GX$ȓ@JEmCiD3s 8)#bVkkR>lmnommmooooo__t- jHiSrDP*0!$"iYB*kQrku^Ga}BH$ۻ~}'K^\\\FYv1IP@emUr*\H7MҤ4/Eo6 -)m{^$tMoPIHfP U+@h>[DgۍFj<òianx)Y)ҤHB0\J:-K@¢pFeSj UijN\^̦p<.u\WԇN?}@K V'XnY *JR0$\0  S[s|v{7_۞L懗1CR{og4TlJ]Uy/3<@nmo{'ZP)0mY< Be& DĚD)*S<̴*WZҲH DO%VE;d1QJXlynoaJs^7Z~Y{b1y NNoy_Bxuia((jFcIEaMVo:Iλo|{pc7‘nh )TfYb%b4'BiԨxUc>ܲ5\LmJ`W֟/"t]g.D[xO?htgwT*NT: 15{Bñ/9N1BsA'o ڽzWWuֺJ/ο]_~.??k >\֟~;ea)!0X>ȡnY!&?G?QпO|U?џ9nMKY 5,K#VH)$)W>k ԫK(&ѫ_sY~/NF=v]qlPh!"CDISnN%˝źݼvյpZquRł65Μ9٭w`iiӟ7ȲE\Þ{kĢSΔJIƘ@A!BiX汒9\h B@Tҕfk6Laxcӂk`kwo΋=4B@S\8+جՊkyPu^@K (&\ ityY@el_9/.0*/=j~gE+ǀe"4|^oLVj2ÄeQ8΁ZhiTn]l&J|?u]w:+m`Ii:|yŪpبMո?&Ƙ%"bwp).ħ^Ww3dXD Qd c'vZkk{i:z,d 47 CTZN̢`Nkh,HhnѨoWo!WmUI0/B 0b#- : Y0 nPݿ>d@,Vf> 0귯>\]!W.xN&Z*Ḍ1n=Xf2uΓg0ē,8dz9Fl>iLbQ*X7ŀܖ$tVL4c*MӔL"ۭ%jfY:xWLܛl #n͎!ܬ}㘋v! ɋѬc9WlNۋqOgHʆdRYhiH24(u93=ƳZ^\JXYLJ9N;X^^ ?GՕ%a_b3Ӿr IDATv-VskR]jӀX"hpG䔺L{ *E3"lY:N+ԃB ՜֣O.dd/}No„:|zTSoX;G1ATszBoG3=x]~_3Dh:|ZCp c; |_hkw\EA,ח޸`43{Tg> ` oo]voB,;?%w_r!z+~gO_^c>_Z?to?c~ ?ﮞ;av|W}*h9<ωe9eBWnT\8Y <@Gx {W .Ġ 򵮿~ё债.l?CfUD#Kbs,5MYՈ OBkqmnXN.Sah,pbFDY]ojq6f {EVKqn+k[a9¢, eïJZҹϐK5P۶I 'I5V04m8J$m C[Avt Yi:DVTJPqN)nF])Oi2Qgi39%28AV $Pg[TηL E_zrΞ6]pC W^|KOw٤.(ooQv3K `YG+ǚGMvd{QڋN.}q_Wgs.žR eA`@5kךRw9oPyp(梴mYZ"ofA_C+E`¥9TZAٳzյs7|؏w~Wa2t>-?, WA>O?ooWOS?_r2>??9ɣ('yhUI48~߽<|{av? <ÛV r41_yOBJֲ,YQ@aI Pr@k5,,4\ꬵGxauUaC=FEB00msgC:ʹ3^|5nw{*6Hjɠ(Y͊>׎5t)+v0"s6pԘšVE|܆@B3M 4 Sr+K@P2c**eM)ER$5ض}@V۟>g:W1Feis0V|#tGh'*zi{ai{ a-!`ј:td@6L p"I'QǥD(N(/'LV*$HrHsX]Dݶִ$ jNo8a|T!.4/+,R/1؝gV.  "nHֵoo>iʡyt`{ӀR $QY@1N r)!rQ-`RD6K9D0=\NTO|Ka8Fn?s@82 |(FQR\jw2L싏}eﯭؘ+^J\qI. F%2Q۽cf )r< '!AV[)Yp-"9ˢ)ϰIh R)QF Ԁe $ ag},Yn5hE ݽd?=tYlv01~3+а2`ultN0Ѱ7R5zAgR ^XG-:Fʍ#,]K0idI8<ʑKa4S2 'iDVLj(u+@H;*H(fzq^է|i )1 Pl48m;E.Y&ƠߗX`DaGyot"v0`؃AtQ9yxoп~}^L4<"uEtjͪn,ԫ[7;D;'Db[BY Bcr*l8>|?c'_퓟{{.g'YOLӭ4KJдl`1H)gTCH0r~+fxul8 kNs_~E & mC&e/}׮r6֬)O VG5h(*p0QMy]h-58OIOn0i.NݶfSmxLj,fI:̵iZrvu7^j9tf? ULQ 1J'-DnnM&Q  x6U"AY0  8ZʰSAXC>J6Μ%0d SP|5TȆW1FųY8 br_^ LaTf8>ڳ6˴y"Eٶ`g8&$гZlv/囆ݭ(,jUj=Xj,jYض }K?M/-KU&~!Tet.pZmx9N6ZPcA|K?]\iT@/$guW4GWvnm"˼LJK *YnBi8 ɝgh 9d*Fw=Bo?%F_sv᥅lܴ /~g~ j+ڕA[ewOW0!#m߷+Aj3_yo:BT7x5'NxG>Ϭoe~C*&g>kW.w6[mVŎ/U5RuC~#DXe4yN( M(pƘFX)UdٖeS,<[)dў]?γxUɘy(+׮/{>-vX$j%9cHb.Ak4` fp=SO t;rױwog l۶@<8I\2@ V28/t)`5"Ws:,Eͪ/ *t_sD~'Ez",06@ce:N{M1Kt>F9q3&T{yϲ ߲е~32Ƶ-]\\G}1N3K>Y-q=ȊBKb2\i/y9OdN=4V^´(JMdЯ4 ˬUH*z, ,/ VZ։fN˯&JC(kJ]1#l3I^&hI\@GBiD2 SJ1N,~ꩧ|HUTE (U/d$Rͯ™A<ķ?~ow{stbqjPˏx3u .X$2Zbyƥ\īTc^xEՍ =mv.e1Y!L0Jtm 욣qiVE:γh-%/|$uE (ci+6? #?@?sG}uh7~ |O?ND"Sk˜}3";c~=a|wzQnuzӆM-B_W͗b^*RR^|qkɳ~Ze^ZWRg9]x%R^[xC/KN};6n\Ew_q,2vnƷݶߛbVWr) L 0Vj j9muYEQԑRd($XR@C*A G((4 - 0T@qk5 - 4`7s-8h:J[heY2.oc/ >i-;[HuϵVyV1OlZD璉D$y.IdNh Z,rSv;j|6qvp:!/+[t׽#e0IUf5hT[~/#Yx^m4T8a>0Y4,mݗEr tܘ6 ˚e,e#W]/޼\j\v.5֖II-4f%+{Auϩ F\q@{vrlh*QR$PLNRB P@eB(Jusfqn ,tH -L&T b > 5OJՅS퍍mTW 1 l<)&%DDA躞,I)beثQikpٶ2L$`E)OR%1mRFy|t2%өЅiE#bUjg*ĤiqF%IIuxy^P,d dب8՚ ,M߶b0!h_9pviVp~? Gn hkgor OEYwu[6`6=g0$;{L.,`Zfӹ,v`i<$Y:a)%F'|oOɡUE\QBDR\.4Y.ۅ&m,8 &` ^Z>[?25gGKɒL!U#eqL^Og o%}[[n !5"u>C ud][GM7Bȃ>9'~XY/<䥋vVo;}{ʭG/SbDpлyҰ+^w{ߨ5rv0znwcgyQjf|kjULӠ阈Hsà+k74~Cz#($Zaӂ%q $H  4%ĔR%k _ lZF-bc{uv+@gh4Wꋟ4 6#+˭K?Iï3ِx:gneix@pJwA$R I ߵf'\Ç"y:OK RS 1ltܫ{;}\5 PUıY zېIY] ʜ٦h960T2ӊL|~m{q6 w_~O(y *|g.vh葵4y5fYqj*+ӛO 6UZK~ß⿾}٬G T&XAAaFQe9 c"&0%,HD6eZYbL%K,DiY0ʓ#DE;YѤVaiO%Qrb$Oj,'Zc5qiE 9BisθxKSMq4C dB qFÅF2rK1 IDATkqZQܢ@R(!Քj eյ*CLB7gR2 \(y_--9 v&I:gôdf¤ <zdE>: uƾ]W^vyolm A8ޜ)g9TH&+),O}L^H횱ش 1oY.F9PeI,58VBBtdQ ~jՠ3 ZSl &QffSO ,B *S @IIK}s_.xRԩJ3E)PO?'kΝ GNڛ7Ri~?uW궎_+냭=uG"zzP!T{߅~'ں AzeB~ÎhID)5Md(c%*v5ZiD^_ʱ?7(}O(ղ,>EbMQi=~k_moټIWjݥFe Bgt2Q(8R/sM͢9ISmjҒS)+զi8/cSQǛ6vw# 62%e1z kU6igyG( /,J5+t `($!d\0Bc , @C#b8Y.ðcJ޴g=}G%{7l׼ ~OSz0]%| ,6V|v]ǽҌR877{kgnEx_% B%M,C6ŔjDxD N)y2 i&BFI:u7*'7Ϣsgi$i&v3 k2c^ )VscrU05D4M9 ,AqSA(;?B0olO4J麆]g"J;{cG-@zkwZUdi?:}c7^{ҕkWafn^+D:˹y:5{W= a~0y_926&ȁQaC!5JV)Zh&juwwoqnZɀ(KCP+ԛMq#x/|1o1+'A }Pdww}]WS0*exI 0B, Z!140WR#@b̵+i8$J)3jEY1FQz;H%dy97Mc<+-x2D!Sǜ9Z @"ӀLI(BZHacTvMBYY%S 8p(%B{w_O|[u~[cmm[Fcѵ$߈&#pb#W/'!5BgBC8ҜABٗPqN2Y \.4zRҔ gI #(!)c(u`Cga<5t.3n1"LrƪTPD X9],kW6wwRJ2 /L`:bo޼|qZΟcr˥nRj$FAU\1I|7n>3O;g3Ż}~e=.M8>i|pJCT D$H ìRs&~XI(^,Y 1"iJ)lj[mi?+ۮcE>Oe,#&nt4)tZ@X3CbVt][o1M$Ib,K V}i20= eiFS. YPSaHj[& P9EHJ5| ,R8O\QK JFql I2 t;zvpp+"UՅVbeեzg^f8(dwPqR777v7i k8sMmJ&hdW؞s<7zW*͔i:J`C;hljpw8Fi:c02$$$DITJ5{Uo~wyqK mh_ȓ3soAQX3NԈ`hmZT,m<ۛEw^zŕNwre% !3NBAC9 mq'~r8 C ^Y=8< Px2(ow'0C׵0UUER14@ĘTV+ߝnOg'#3|i~/nݽCNt{g=o5'O'?lēW+sN)b5ɓg\{77Y{ݟ\=q2-8ieSΞdl/ S'?/y[;Qpq恶cMǡ|6PTfxh4,{;,z=sVo_joΙk/HT+N1[*kOۇ{77N|+PKɈ鏻i \-'8@PB RRY؏fE!jzQI.;E0B`QFrQfhAmTQeI!jh"0S/h8g|Wd3B`+\$h4!p4evb;؛izʶ++RV]XTȫ-DvYD,h'lk{eL9-+cW8S"U9s fm VLdRB IdUd`BVV_ zIwzne1(q8,ym3GnO1Owr'z͇7nߚc 2 Q4U4BmaqlZ ŒL!Y (ŋ ,wR4_ <ˢc1nїo޹s72PtEذi5)DbR~XȫiHPhh-4 9֘ L͗7WP"#jPJr_Skܓ9қm}wukC:<˃ur.ˎ7oͯ{'Q1qQ(\yF`d7[?NIіFO }@4Zy1mfլ0tq5-RUwE*%TfYǨ &e ci hJ5pVu$vm"idRFG޵1"$s 9zg~L+?FRceidZ~}ϲY% ۲P)i?iD[;Ypv07E5KxKqV֓4ܼ{ym0&x%BrEaxn\XY1fr4}Bfb4n~i lwmlYtjIaqj@< xQ5J~e\Jiq9C2k{m^$IJVbq~.;w,1۪M2r#$Z:!0ډV}?ܳ8"_ q;/ݽ/3ІmT ,ʲDsYcKjntDMzl?_  !l6??zgy~/~gΜmve#Lec 1eBB Bk`Jd. T %a; 0G󪪔RbtDPa6}+,"g̖BiGJqB*B QJBe&XJ3^,\TH# m 1w^|~YCï!"۶0#Գl8ʦSД havvwm{ ak'c+@6 K5 D^BcAd(k֎1!>r?CZ(jZfL/S#C`&JXu<*Ui% aBJ(M73ضRky z}0X4e /) Mpl!o=$(M ?|bOf Ui4\UYRD5w|h/R{ٻG1YXZus9 +M$AXU<J)kSk4- Pv cSa`n! l `e; '^yCIB8. `0܅3'T( 4;0g͋8Wر uQq< I<<{s'\~<XV|uu1/]_]=jQhO;+PivU!ztiC9V^'kt8)bb{حf+ҬHxBmص(%ˬ4|+0JsHdܼuƛ\A˛r\X(SNa20` ŖJK aou0ja^ ]U/3Fa͚ l6 `D1X6(sOmNzI/Oi$15g.E=Fp y{7,^j0Hl Nt:˯] K;_6|8ݻq{2X_k/=ܟw(:m)(6W]DZԫo7{kx{… wy饗vww|4˲VVV{'N7`B: mOA9b 8R JԶx+B]Ǯ* $@Xi 8{Ժ75We`BOg?[=iqO|EZ`1Pi @ WW. IDATb6R 5&@ a &ВF1c6*w~·__ hEyg/Nz)q]˶ۮD.t>.53k'Ν7d2=5[߼nVe 0WeU$.tEژzL6ǶWPQr2([iq1C"ZZ`ڶ+!@C:}ILAXoEa' $GcU"5S\>‰+Wٜ[x;oӃ"iߛ7K1yT1tmyk(3Jdv&8P2+ Y[ͤB0N.T KZ6R h#u٬WnQ̊lJmal$1JfsZNlPHb94u׸`<-oM^*jֵPԲ&U }jZn1 1w{4e=Q í݃P`A<3 `PveQTR d'XbUi$Oz y22˲S@&K\TBc(). 'V bʳ¥SPߞG0bO Ew{/[>8Z7"B[N1;M'qILi[M @jI7wU`Zu챳Fdbkb+;b-u44F;KKNia0h_7-۲+k)R΀NƱZda!r(m^s,˫*qBN'hpSn=gwܾ'~׮ewA7O¤Ep=C30_[;w|֙Ӷ{]˝|0ݸ9QX?}ʝNump_~#ʼng*gn̵pwwo\8䱙l+-E|ީakx@tw 4u"BifBP\׋lWpW2 i׽ tEWIO=:'[y]ÎcyeJ))>Gc]m0h'KvmyQ66E?c=`0`8fGж BEvs7nef22Bh&S)$צ(ʄ (qf;ǟ'kWi~:?ُ*:p0ϋo.t¨&HcbUQVGw#Fk"M(}?'ٸ_1b4 mdq6aBJ!Q4,3\-u9 4ŽxrtiaX{o\ߺ^Ռn0M*m^}НLrl #T2BUF<ϥm׎g3)Bp&x(XjtZA ;DIkp鬍ܹ_ݜjɹ62Y-U%t6I'9O-JkA7ۑ9e>LDn@iaD6&tX[޻qbԥ3f!x|wg~A:sq;lK- kqqP(d, 8o޺,t~֬qO|Sw%ίϝ^k7]B.2W< =b|:ĕY!tߺ9kGDKwwv{Zؖ 7hݝMƦEѮ7/_8M}8}C]Xq-l7^ƫJQ/ m M&!y%Q$oR)5LHxڵ?3???`'?yTرcʏ_p~pǟ'[V$??}s}m#y嗟y؏>}<n}6BXƘoGQEࡇ|/^XDHCp01 )m Zk^)?ڀ8Y^Yl " $Ul6%̲۝'9?WVbmҚ:0MSR )RJRh!ed6EGHm \s-bJg?}[Z* Q0j)e'>׿7?o$UR~չwݠ䋿k6/7\u8o|؟``5VUl0:Ye)WP-(1IDJTZ#!ZYʪ Jc*oY "޷}RDk~wD!/O2H +Lʱj{ 'K3r Bz:l޺=" D<߽{^$MWۙH" UBS!2h d0Up2*4]_6&KKs;[g/ya2(o޺GѰZagn*Z43AϏ (P6eZ-YV&0 aX%xcF}HX ccRqY-2(, -dA.7o]0]os $XbJ,/ J>þEUUI1$ % S[Vj8jD>3ܱ7 LθȸZ} ,ƹO\x &KIyLsJl;TEӓb  Vw[^𣹦5W7Zi5ZN0_[wW/D1)2/b0$rai֎m@A,v;Gέm|Νb\Wp8+װf<)gqv5l:vy h$or{{REHlUU?S?}}{_~Ν;裏×^z饗^B|_僃@eY޻w~臢(JSO?g>{GQ3 2^)u&NA&7 6@od0%AbL6B跺%I#RE%],' S\T"S=1!/> 71>Es!DY__%_'ɟ~OR`Y~'9ri5'- h u cʚm9Ϟs<,?gկ_~칵3屈?pA- ܾB< 򻧏_YċRF=~:p:_ht0vaYEū|ymIiџLljK*pT9Dymg2yQ՛5 M,?W_ JN-t_kԵcO*VƆiS47i\'t<_~ooB Y"xCCϳqQo܉E] AQ f|o`d"( ׃f6Kw hCBI.DF[6%R2O=h%وZ^[ l=,ݵppٮt2*]#{Uda{mw{޽q># !NZrAVh˶9~1Jy>آ|4V/+śuѓ|*xFsu4EsQҚCVIxgъA̰"?lZ ]$Rd8oEAH9?`*ͧĢDyJiL(b%0p.JJk$E^)%!EXsz(sZR o^y{T?|Wh;[fP'As$l&mD+tt< ;u8j]ZA(ifGZؘ utKFFVa Y.vR*˲$IvjAXQe`''в <p8?Oc/^\YYypV'?l=FHi}dB_{O=?``.<<.U> 0 BJ)oIʲ8'Rڶ1U) !@CNn(Jgcu rVUBnYƘt1Hvt8SBQh[7 ! @Gㆪ*8B/?e OG޻wܹ/~pv{_3~C t)BP|TU NmyůCht$(EQvJ#%SJYzC*RJ^Rq˱Ķdk\v*B2 @C7;3߼<\̢LI(տ瞱u--MƓ!ٿvrz[j[} IDATZ'GLJFH:WPá{֛^`?IF{~l?afaip73IĢ2DmfK#ptt1vʇww] ]QPN&d)/e](U6|:n3"X) %r'? W[8ZTnwy}?$g)Þ<}=M[#^6z1ԢȌ(y;h=LF$-Og'nOˍFVR*^iA YJ+*VvVu kʊѠ*" )rc.&`ʢfӢR­GV;Rmk~TQ3^r`yUf^e(˗OFQ%\:uLĀLjmܹD.z0/Lq6?\ʻݕ0{U\'*q7cWVf$,n˯|k.6jDCBH {&0\ v=it2dl]V'7_|k_]mwd + 3V;2g)/|H !nϡUq~g+ '5!NRf<ף &,ž`FDIts__7__9k_,pv1?s?u7n7A/ɘ{SfEK?1?.c_|Ղq|K7ϟ΍W}/\я~t0_{?\@qQ,(-(h;Fq%hkP, B&fX%e.s=SVe![-2jjbq'QJϊ!DBHV%]b1Y.6Z '~'_%w?uh}>0/C_3Z[ѿcO>?,4<:?x043~__rBLCh$Զ#]%!d㒹॒"JZ( 9Ы![$%y6t 9w⫷߻zjQ2w4`sniQ]u ) E^֣(hƍlT) <x"҂IC1VVHgԍ*U2,BD mqe6\bFĩEAKΫd2E-/ڽ`(LС#)t:/fydvp띉=~[ol!/h>"QqE2JBVX,)2 @(6 mǼT@CK 0M`4#+Ol.Ρ [ b €,q-UsL(ಐ[gПU^,u1g=߻?DE7G7/nlLOe:pyTU: 'A}kfŬ$Ճ? 9zW߻O}x4&t#nE^pwzw3d .-b:tZ͍v2g 델lrp0V7i1)o4k[/^26WIL-J!Ì!hRDK l4<-}szwٔU'Jy Ǡ aaebF:wiKT;>>|0q͠Ӹ*sǵo҇ĵx{{b!06QyA :|Nb4ils 3nk+WxFk \0JP՜ %mCb'Br}ϗ~Orx|mCg_![ZM6_m`>m|+ݼyգhi{{/j0spyȟټZZiC(JJH5L[ 1O)Ņ Ue!, P :QP͕RgvQ=;!K`gV%"k-A"<>_{햅]J(v/~\ D!ʪ7ͧr-Dk8w;=ٻc7 [i, ~=#|2`4+nݹy*nOGۛtdw`:i htWF|۽V:]$ 7^xo` jUVO~Zɏ}.Ũ?ypѭf~5DoG_}CZy󥼸u6/䨘C0G4_cn4`V zyZU&T !lԖȅh}tx(sϦi2/3 Ehl4!Y*{ kxyՈ`oSO>tC|q`:˄1/j8tqUgl-|:*`&V\Q\N.On=xRd:&zܐ F؍1t&DEH# @ Ae(X [d!E|\ G])R¡~sSnK^a ܼy,Б]Ʈnn~7_d=wx⹛7ϖ~ӟ5 ~w>7!v.YX $TB(e!`ӴL[ q%94"ʈVk%t!9"C G6JYٷ:~~77Tx33-dAh(k =:5Jv7֦v:IRHs{1ZkUUJ(Q}_\nvDݠՈڼ<{qSKbwW׬%WcDEP`SZh20S`b6^@cqm{}uKdJyׂIr2R&s#}- d6;3qC."׊$MJA8:ei >C i$Eԭ5jSb8`ƸXi])2m2D2"örb-{Q(=cGnɽъV&G$tyq8gܽ=ah BB!yE`ӕfÇv1IܖC, \_  VlYgEQ.80j СZOYX\UYl *@B|Oc!lZ˽eB,d>s VZdEeY$"NSץFvm<?zڣ㣓C/"(z<_x|kye7DPwĵ,7޹xwy-y墔z1[r]uzXqkk,J#.*u@k6ޭwo\V7+vGytVI:<=ͅtATdnDBX yUUq^=_Ž{DA{fϝ;8h4_^ŋc^eiyw^ .6&~O_O_+B ~ǿO~p;f9h XI(!\ $A[X!4yR*( |g(Rk╖2@m)3q @ F!1@H!q(Zz {h<2Ai@R Bbj x>nrFqKZى"U"/xk@^QU]Q[_ܨO3Jj+5R.$2 ʹ5L& 4YXH RUDV1".I6c Ht*.9s׷8hhXk[/ej6L(z3n6س fi8 !6v77֊0^Nوw߀}ߡmn4`=UƐf֧=t1 Poҵf xV ٗO`ZP c^ XCƂRTi4ZEB{\KSFb"`\ ;REnҔ_yvWh#4DHBX%1$ Zj(fY\my#2 vޣI[7]#KӅAh[R ONG=*]B L3N%.\Һ21X BaBD ;9 Bd>1,i2FL!xuaw~J#Xm|Yuqe)0$"Fvѵ<,N0s@ i+=qo1$_s[[] ;!LbTDּi>NN40B'glkȊd P.!D)]cBRd2?zڃ'iY39id??|6m͛;;;F'(iBRZ{e΋/מNi~C h1Xm|΅!d%`UQP (Rj.*!( 6i.e zӕ}VuWC1eQxz2.?_Շ |&Vehdg(bT$4X1E(1@V$ĔZKq}͘$W gǽ\oջz~t0Խa޲BQBh/rӵfVk]]boƍxiy/}#Z17+DqiËjl1Z/9DPl,Qow#Eu泑2pWOFc.qjԍb{P@p\y.fRH{SVIU ceρzEvnv齽Qc%ʄ{98TFA?g<r8L 6?mtVGv8g{'u]"ʇ@}8Ɨ.m!cE5OK.6ݓcs|RJ3h (Pa5aNYSHPDkU s]!9ء%PWJ) eNDU"G=F@v2)cLUeY(,dسǾpcq;௿>A%4 bt F'eԄ)$'}d~>9[?`:JQF^3}#瞸v܊ 3__#^ gyܹsVqKuE#XJ%'( /h>XU;ju\FQY͒WUXxM1=ih ZQrPE!qCX2ss]p{C@3 cFkUJi^A ,_mqƅ;cUV"B @Jae3h+i&,\` E(NNN!bej*,,ZDI ie @ bav ;8h*duY DtRԩ/5[k!G \krK-F]^TZE!'pn`-,J B"#G&s Zo)c N{ ݰvfp>% yy]YZh a]ɘ h$VUBFW?}O7_-CuEv14wo#F,+k>/UtjA_Z4jM./NNYnʆSl;Q"~7.RDC 58Z!p)l-ohDiE^9^8Æhb(H^D=Ef0bXlR5ueјLG7/cvv\B;xs{:xBIh}Jc/4JZq?)-bQ qj! '' \zxtnGvjD{*W#8 ;D5uuS:2)++0A>%. *e1Hr>4Ŕ@Sz0 L% ֈ몪JLp.J@ں#`2 *C͏a5o^tZ t;uA0}G?sa.eb<ɳ_bcr:GGݘAЩ +W^Ǯ(lx$:?&tTѼ,RHe!l."VZbB c@kD pjpI)BHc`l0 `Qb*CixXTptJw}mՑUv=:8BEVU9x.%os{;c~gj2&|ko~9~|$P]ayRyj բN'KVxi/G}7$uzd.neqëj{z>7͕B7,1Fa 94j O'KQM:D]O3e?Eb~;OVT +Y]@C !4fcy윜BSs@Y `Af1nSV\h̥ ("E@kQ)ejc!Jb -DH`=s0@!`bi BR#+c#*u CWT#4[k!FsҲ8%`Tl8SufCUfx88cI0nxw:A39A^X^_]RyP;Itz9؊AG0<櫯ͷx|.0/Fa?bY²#Ɂ.7}t<YWWW;l2mV&s?<<99>9Yڿṫ/:÷nO҅P+(vðFE"ܻ1RhNGW/ %^w B݃}A,8 (͆2$5yuK&S fJgs:II(!yX֔[%Yt'o>"N]7f&*MYa/p#)Y©-]  eߎ<:.ZIQe4r EpidAhllU)CL1skD!Wnwz]Bm7yHF,ŝV\(h芧pM׃Fh6H0*5BU(̡^OiV[̓S "}Fi -Jas@:|FhcV;]@r0篮.I$w|p48:|]lVu@ jKxj=jIrVϻi9VX^IUYsa(VBlhk~dEq( hNUUȍƊJHe&k!+͚ԛjcF$Z7NPRSJl^Sn?;XNWׯ_")s%4A܌3E9Y G"߻[e-t.|kͷ^<Mbc_Pg}+B#@!Hk#3٬?J $ز,5cq!GV++&Udy]Y2նUNYidVyW`خ+h(D _w0Ϊ|!bzZ/z+[]H /W7^zQGʄ뭍 1>Feӣ(5pmS颯y.˼Jl`"Q_@g Rg5t8,f˫Nfh~k j/R+fqK'akFVE$ʩIdzֳʵ ('Ӑ5yn-P(MY&z%Zbbu2gCa}G,pݺ&̅X*+)f.îRq"D hFO߸y{/Q*hNSYb@pՕ%HAs-RJ +ia췍1+Y>3B_aSkx%Ue%bwWW6swkU1+7WV NU9xZce2h^H ^L[QTsJ&1i{ƅ ףebRXHV iK{gI>o~rάQU  mjQ5IeRJfVZhE" A# $ Tӛsw" DRL,J4Y6S{9߇Z][w)eLG %?iu_6@l9PY6PSS7ZoEUyo%#{u={j2Q>Z/gwm_g)%H ,7 U@1v" ]0JRj %ChƘKe "Q10/hЉ1kP@K^]Ւ3ZBHe\w%ʔ^=e~̂k4N9U1ZfK-P:NYT5 b4aykeYpɃR,nb+8=J/jnM4/$TB*a[֨ۛ  4wtjގ;^^{:RpM 4<>{4X|ںcP' /gzbﯽ{ /Q(R h ~t7y{1Zk1c ai#tYJH#,R !Ji8P<^+kQDZje,Fk !ZeLA(ju~0` P,ABĖX"Ĕּ8 ȡL]Z#l{8JtFy!Pgպ' F5yc9Cc* nng}p`wW!~ҭy5=ָuiWó{t~V6uڋ|.xX etL5iiZQĤ/)6۵eaq( YcYeܹv՛e~x2-HU׿1ad:#EIf ؟r8!À)[2a3Yz8l5)GȺ=;  ȥ4LQ؉ %jfƉXZW0숲lGםV)@4ZT|^TCb9ۊ|<||{&Bϭo- uY`A\,9,*@ sZVtZs8ڭ˧<3uAيDPl(3qVO8VU Ϋr6ϧIsJ%VNNq3ȥ(xž[cm*pf-յv>W|xDž/rsCW0׭9/PLT6SP{}{f?lf~fOOfe Ae}R/7^E$|6z*lIc9XmpZ#`:|@ XʠUJ8o*+UX=ui[h8"A^g[[$MWo'Cbbrxﯽ3JE "LC!tθ0X$ԵjFHK-V !h@1TpmlQ!LEn1vxtG(@ZZRKJK#`V4B)5"0 0X 1 ue! c>IkU @B@0DQhkB1@Ngz``F 8y-H'}F:^4&V!Kx z]ҵs޼;NQYe>Wvw?w7Y̵@PZ"LzuF4)T߹7;^erYà/D ,Efo~jtAZ)#DŽ 3I@k}q,y5 G͒Jb*E * ׌r Q)/!L"K D1δUJbny4%KLh6Πz Z=s8LNwmM77dDgs/X?D٠<]. YB j4u;k! C7z-|xJ8[.E:9ؾBAI3?/mz~:Z)eGI ulh0GX`l yGH@Ta1bQk|%7riM%$DZ$"B8p~rX^Z]1Bt ˲yTVD}<-A;h4ż8<<b!42tMVꅝ58pSٝ]ߺ|ś:<< L=.A #SMf"] }|tz˸ɠ^xy}C.=?WUE+;Wp`E2o=;C5-OUsmݱ+h1u=6XK:/>yf$G۟y,*i6/~Df+?o鷿[dSb.鄡:Gu-,)2P#h&\\JSAǿ[oJor5l$r|F_88=F9 }v ܹe xKSHN/JeRNGgR9`SLΟ? 'yϚnO3`mtq"RK~-A^ W~b2%h ֱtb`Y]bMAǑʒ/sL/sa}RtPJm-$x A~d,F3 .y9EejYIhwtCkn4̒سHl4|ƭ1_'L4@Uŝ8>%E>[ug afWt}=ǢEܹ~yz< +}ke.֘9{}>yfv0ZWVkT ̲x>U=W x%;{z$%t&T4䜎S^:[zǻtl+i@ЪorQUӄh1{r@+V7=cnu1&V[Y{?^_mQʓ啍6bAa$@9EQ4߽ڕe!=k|2z6֥Aݼ+kKT"/q[ O"9Cʛzahg_WrVdRT@J[srXq@H],3XE4_z*Z }W RsUsY[%q= p;n‰t:E4M?.rt]A?}!7^j4o}wv!K01Z '7BE|(  c4*uRb9c*c5.j-HE1;yEcZPf#Ks^s`l]sɥ2E:wա<3@J)!!ͼ0ceR!" q2\ԎPuL[#X0#  Jk%ڱC!1J$1uq¶9k+kOr#Qf'Ri+2_Ekv7!bj<͉(:˿o/aLm_h~`ZpgC7j&y ܈a?v[aeyRiNݼ|j^Y9;*Q#E2y@1V~[jaUw r9%?O&sUˢA5BUU@ʢxn6zTMƺ&8b wjotAd:ۏ{4|q_) e (6DZ:D0# A  LQvSqlx$_ͭ˫7כ-]"//qUa|_쎾b\^ޣZگ+_ܸ~nuFsdi"TdX@1@ ./`bӬt.nRZY!@:AՉ"9c&V"RFkwᖭr1f8НzgK[7:qf9^()vSrY,ғi,In^Mmx:)_m5[^/٨1ddso.K_ZMl zusiV|YU$ISy:f,i?xtpx?3op"'f9L~[o}[βӧo7n{Fa}FEk6wvv~ lϗ_w?'Io[QE}g~y^~7W1~|bPBͨ(ScVڡ 0RH ""!vZ )1I%$F(xQkiEy6bM\4;Q{9=V.hh!`$ kfh)D:P35\Zbq% Ky^|nm  YaBBM2C ^-5NaB[Z1r_wX~{mo}9BGß?ytӿKz[s['Ý+Wc%SAבQ㄁@E-jUӓQakn!uE!O ""I&㓓[O>}zp0fTLScBvmSivxFDc* (f t=auU'ΊR$Iݍq_$eљ)cБY:oF׊0YNy?f'`U7t]LMĩ@麴1h7%uw,J (Nwe^7=}vt:w:AZ?~ãkW^z%kw +fZdE<ñ d8EBLսxEA6.>}az8=OJۀ D% rҤΗgF.+Mspu(m]?Rk7IK9mpzN@!Bի7wvv꺮j8h,vF#IЧ>)JtsB0ݻt> !\]}{f3NEB~z~aHͿW쬮^p,e&3aRH3PRR8~Z\%!&#Di\T`DB $#-@ViyQԍ봻 jx).` ^Ub X1 ZP ac6`FH 3"@" 0cuGAASDbp)F1 ]  51Nd>J3Í,6e =gTB*t=ۣFDt k?8=C 4kǧg~ ej"Fcx6)d|+]HQA]J2 'CTD002YdYpε6BȎOOKK]h& ZPVC[a4 *dVH$-KŁf 8(v2 $q&Y:J h%Ofs4t2Ub ]cC!E!`!jľrz:eV!Ug [Ng6xcu3om;;̲PĵкGB0[^l6! IPJ,I <υZҢHe]&:XiP3Yr\ZB)̼0j!Nyqk7qnHWҺ_3OBT .t1ᩩy=lkUe-RtǍzӏ5ccx׽c'(n lAn&{xr{o)?<<̞= u}1oҎCDݵu?=zn@Hp=\%^[7^4AQčȋ̋A5XBPW<=MJYFLPkoGȭ(c&uygBrUUH\rrBDyR<;>;I[c:{x7iK+??MKXcI@X7Jh|x Oj9RU㻎JŢ& uUI'15XF# C!x0?(֭[vFݾu!$ {ϟ?Oӟ.]{oo7޸j5|m__>B~g' !WWW`?.cʕ _O~ƍ&0Zcb+ !1B7'J-8^*uF(VZhJ2ӌFe{[k^j(mVVk).!iZ,$0b0X k! @B-BB |aF a/ϸaơd^35eF]e\lmC"9k^otlJxӳE)OFIqͷ<l B9~yd¬`QA~9LJWQ^6g^RJ%p"+dp w+vGg?7^yZkd^RdzQ|fݍ~ԈB:9x^tsB3l*e u2cg 8 }pY؍G_y=?>YKdx&$EI%WJI+m72x23 "\rmIoЍk'y/#jfi-"eF2`]ߏk{3 ZF.Vb'n(s:yF 95%?[s̏&yYb K׮OBFԆ0-$QfTFA0,r:REW":Ď$vW*cK b2,eIuxﺵww1RLwi&*@"@kc`dUH s < e-JcYyq #d8 F`VVLZq::[[:6ZQ4iQsz'Vn;*T0/V^U`JNg-;W^aO2 :.en] 8~x; ~3Zهp[˛k@hnx  d29xŭA)2B(!"-vVŤ\W:kG IDAT'ƍJBpR%b;WV z>"oZMVi*2;M\dP&NNʼovڭv;~.sM`(@BX6V ^+GGl ͦysW^MwzU>n_Ͼo^wd e[f̽W߸+sP8Yv}c7/+ˑ=ʂK#șe)D92\hDh/^L 'O#SI 32ϧ4M]1ß.t+˿/F@khko%wg\yԮӳPrM( [B&㹙c,A;X]>&et4u5tY5 i*tvP\]d4ra$qhMq7;~o]U9p.caBtq<|&eܵ+7vo߾KOV4;ov Bý$I߼m/Y@[h\3GE49f6Zw:z~`Kj}ۇOFqke2ΆMjc,\Xͥô4-љrGS%Xl 9`Fw"!X(DURZ iAP}W_һ(8Y.99|r!vo^y*+:4^s:VF~s@6WK^6˺*]=>w> ;Ih{vmzJYn4TECw&nt\1[c=~2E©,˲,{1I\zci6ϫ*LN/J$I fY}~cX]]WʹD"ﷃRi-N"Th=V9&20q]@SFI,J7'ؾ|彍ˣMߘOJoK-ZkUW@ib[!d)|1AzJiX`ABKЇb*r\,q=cw,֒<5#<{[kwW"%)B%ak`~^00 ocX f0ay$ͥ {ګn{'ER 4I@ wdd|B[I35Em" [ӟO+txfoK p+ڲ-eK?0H|N].\ @{euz՟/ӏ#׾pn޹ W#B`Vl.ʲEr(jOh$DǕ֊JDY^v"g2h  Y,A"E,+Q8Q78 kq^UQWuI0h:J \[qJEYiH.fȢرSH4RնC 39ϋ),T3])ր`.8T6B#FJEVV]x3LFZq9̶i*A#zuDvx]\);p9EM#ύ|-Wh*PZVkv[qhIW*y1Or*jHmsۈPt2Y8%*@1X*)Z 9eYq+\:R8Nk=ڳ@EΊD֩'R#`s ZYv)/ʍdDƹVy5zYҥ/>>=Nj'\]-wMF9xbV5LTGҥgy8N:ݞt.[_:auy; ךlMi˴__~c 7/K <28>*M"3H @cռVFQJBpm44ʸbUX&^#kV3T+mR`H,8B+)"E( PV5?x"V+:+Fq]nlWg]Y֊V.A\.`IaDalvaI`[oOm<ЏV,??^__(MoF2Fߺu7(^y b ,e\ QWV8bS2h|,j%QtWQ c4_Uc.JyWb443@WR1ڄU%U H!JB!MD̲@&+6 IdePae"$W4P']۸/_{ztׇ{xжڇw8Eʙm݉v޿4V/͗>N߾o qKW?wpol_Z;fi,uYp("rE.7ף>.}p"Lp 4 ó(Fǣ,.^ bjauwY4k5lzvh֊qj{$d4nN,$f|-4,d|:F \A)xYI (C6Qׂri0¨.Sw39mj{NeI*F`R@pUWY8$YWXkm(*75bs.xlZ,(6Ȕy,99WuͫBԡG\ #kS"YHEDZem,V<7{t$j/FZuS])Yd 1H)9r!b l'Nl? BUV,O()s7gˢ$*ɤ]BXs~vv&h4fSk0mk7jW]rHyv+JƳQrp NxlOggίl_{W.\?{p|\jܰu!^uF}28[j ``@cLUh1Zi`S7F"-۲BCvd˵(`<ݷYg_x$-Zifɝ;o?֌ݕ~\UU\XsNsqt &(-UH~c8N@;}h5F/iUP{tgjmxWHsLCRaTTjt/c#7 EQǞ;f#<_WU$~!c B;99yy؉LyzF^?+t%uY7=q)%ou5OrA܅1uy)-㴍HCҹ/oW>:#;G\̵:%R5NP.sE a- cK$;6*!ԩJN0Ν/j3+B򴸶Xq ha㻧mgIU^~^Eo\yg֢$o8?\gg"+ke9/kǓa&eAy,TC^˒C z^x6cܱv_e/I6ARRJ:ПgQ!JbacAl,%_ZF.'JíՕ;qsNn!mCm>KVׇw3.oWVzVt ^T@hH4MW-OL@ 0 xl>|RLHdzxIUR,Ӊ%0@Hq,1k:<>CEY_ C_;`lW4N` M| XAMQ-%@ز,cÅ\ 3N괎FMDLccJP6^eھ+ }kko=̖dը,ewHQ~ڞf&YjMB_h]֎Mc/0'*cjܤm3rHf"]2Zt<+{}u,BGN$jsslwf ~!s[/|&ohhA>i5_Stpo8YJZxy y2M,#u{J4[bYQ+-KC j%4w$vQoԇڪ2M^/k[2K|Q CjQjDc )ie PJHqD1yadl駐q])y]ScSYB-|:Q+.,;l|<'Aȡ$R,6ab,$WТ?151w3AB] S@ 4=-aa> B K3@aʂB)&%kvv}f_> *"eC+m xMNb5k/]xݷʲצ6ͦ䅫O';II|Xdã|_\gpwFU=+Ca5]%I÷Z7:1moo%7\E <Gv—~xlO}a Z ^fUm:Ta"|vvƘl4V@vtU!VQD Wh!QJBϭ1GGowzj!څ=E;i6;tСǕNyU"J"Y9/ ij4+Qj^j(4BCM(d%0f,Km q'4RkhE9 R>Y8QBC)AH@d,yJ!> KM$ ,Tڔ)j- lئ͘"гb2B##n[ Z-[ݐ2% ky-2 F$T-<(zuͽs D66~tkA.kwn!Ύ^yFukmbԌZ"]V%6~0hxxx6#`4:II.Ȋܿ?>a[k!\4Ny>.]ۼܠB2 H,k p,OBج)zvL \ⅾ]`X#)(D۶r(Ea2!b-vcl,4 VB_*k> N66E@c!dfSH%,OJ6pߪS4?;:Y$[YݰMXN2UQWR"6IMlѼh6dZ@bR L.KR@U\Z lBӶAXaQ ZBikh=ֽ^e1,rE^6y5mYd9\쮮&?aۻ;/Jʥ"FVsEr^j`JQF!nN ! c\YBDi Rl6_u\p S%?o; _—q;{;ݻwoza U[ؽ;{m>!Y.8@(I`T`s+U8+H' "1M[IgP?9/!VCz5o_(WZhoFe G⣣YF"燍K+= v$ Y!x1GEmE/=$z2>i6stH"5qyrv| qDYyNEb7o^W&́R.1(ea<۫L)P⯀VɇG,:jiJBVĘE}qc˹;3_}\kd_Գ;/BTJNXk!0ܸg> P-e" ,-G "=7hI~.Lh]hc!ٌ!q~򕧗_ϟx\F~>dq DCL7oߜ4o+%+Eɿ?8h6>FfU*0{ y//d޻t@Z $ ֌z:Q,j^yJے>>L~/Jw~sxvեsV#*KW^ywf>ܓA3_+r%kCBs Ms.JcʈE2"ukrsu:_|)p7~ĢJ$I-J-,OGد4 tEafºfN!D4_/nN!%D Ju6""* }GTuFA1@Iō HCwo@`C@ZU`!Y"(YȂ+SA׈ Y`@H* F7ƻ߻R!G+|2WhQu`6>ig2̒Z%M|e}hX%jQG^_z ?볏ۨx\/ ]$僓rr~4$Nh85cB_M_qTJZZ~(4l6ht0軑!{,ɝF@3IR`m4<_ZnИyȱX&tn.M(@45obQ{܄+q1˂hPcem4ba0NLqF5bq-1 $h\͑4t)wZ= &kɫBFG67mFy%RVe}  \wQ_?MdWyu?N~<ʿ|7$-B}Wχ#k-l~ԡ,as3hgc :k~P*?d8ﯷuKZ[{{ߗbX:Lj)`SM5U]'I,:^\^[ 3]Ex&ip]df9챧E2 |F7Y.v6Drq "NK/⏎Gs;Wփ4+9 qRi*%25+m1*O m4E@F1@,&@+Dz<سuB afTC" ]G+ܹu.TY?,K).s~7cYݿW}yxÞ/{aqe0)>:-OhAZZk߹rIheWRH* , ۖUUj-|/?O-)UY fzzxgEat|kp44^ 7BZ'yl@+)/0 ,/[ ~QdGzVn+ʿSeyNmͧql1 )6RK!,)%ˢpzGQ ~5I7͇О0t"Vصy$25t*=/JUڱlZ4gXJmO3޿xˋ")QB,1DFk$ BXXC@ )9cR:̦U+@ (h %DRi1T< !m5/=_) B`6B*! UT_Fuxzt_kOKذոqã;B(ZiD  -ƧirS aofq1~t KeߝͲYY.y~[o*6W ' Fȟ?* O,HZN^ll fcKX!]ɤrع֎'z)`n/LAjUH4q1I#@4GF5p&;g)ƺ,NVZf5a-DJ븶B$(V$p#<;Z+.$-C ɺOiȳ"'8جR"Sdqk Ӧ+k"+y\lFD x ( 6E=&iCdUQ]aX,kUdĘxXo4mן lpV5Wy%yr=(r'$ }Ur>6i.xZhB{gVowګu&A6Y"77,#el:[2TѨamvԕJ& x<^߻Zqv2S/_?i:#yY޸!듟yfd=ʓWݯAQFg@{9*WZk,C` }Ϭ[oød8]ǧ7n}aJ8ndSYn8ו!V7R.l9/d8_:\(YLGo/f$e2?ڿ4Z oaU"=h! Eܨ\Bȋd eNIk-l1|]N}?j#JT7L긵Q%ubx>g_*!1WDJ+i4XON(!̦ըN"xVmҴFJCa(A@%-__HgL-D6mcBu{OnNOǓ,M'D g3FK\L. B֕`diˊXwk9G'g[hPsq|:qW~?-ue7~5ժnÙ|p(lL(q,D˼ؿw?X6 @hI3k ;Jk xAUTI !R\RxM \sh~tDZ"m@]rF@+CF(HʦEZ*_*fX ƌ h(0F?>!s!!D(%x-(+>~"RNƧon lƈU`l@)XaI;;px]Cv&aL& s΃fkkkŢh<܃,*5GDNa*bP Z%NSDm,?%J8K-(T^Գ{o@!ȻwDQRI86%QD)uu[s9WV7};geE]z͐F ca 0@Bc)„L (kR ,t!i+R@p"k}v8_WNt[ڬ2{tXʥ؝͍KOy?9:gpZEL䵮Ngm}z:Hou:Wajnbz.y-=KS"FW_IÉy1 }ߖyi˪X4Bd1'B>n#l 'hVoߺw?kl1c.F,|1=;rcm<bˆgh,w/tlG}g?-lͮd궚k$] :X1PW"aE!P[@"+xX@ܐ`$`eMs,k>-E3y*!A%,ӴRZ5+cBŨZ@F!0&D+^UqbLA6"Re$^pPW*uA1 /Ӆdncslq%Yj,[ _j‚+d`dp\#N)l6A6'ӕKm'\̇1S'ݭv.YńlA҅sdD li8 KzO'Qv \5mQ]Nwzz|s^=t 7AY.>?:FК_uso^{キ⼬dZנRP *%VB4UX;x g#7V͖_-dli<Γi .cg{op@U) H٨(r-^|mٜ .Z7:jLD 7Hc`d>Ղ|tXX0W)QWV}xswJ)`bʛo?/as> 3P .]pՃA|r08 >^4* 2.G2,[m`lyoo߽{YY_ۺtz%,ǭ R""ws)ς(2$IjBhjX |Ǎ@ !j^jŕ͝(Fw"ngɢIrNY6Rd]uMN%'Yx9Zlb&gi1%k~GϲWEB(,+Tu ŴbʴlϦ3 (bhMAix6WfƢFy2@i몪iDвtY͓D J'YZטZj |Y{# 8sm& RR1Haw!RE Z O1ߢNrd/dokWg^ƳZ~ӥ*b:\n_剮4IlnmvpXi\kֿ6'_ ,^.o=+ٝ;O46RWPhYq+8p&Xr`_H19=ڽ= ! U "-0gMbmK밿ާ?իdED v;AlI @ H,HY$ D'fRk'߷V6pt/U>> gnxk/7|Ue=syoȶANl,Vzpk!뤑'EPwQ|͗_xA9?;9RWe# YQP 2YqG)m7u)J-jǵ v:t=ZZdҍ'G&',Nj8q"_Q^Y7f BFvv`o c;PNNeY\,8by~K^!Vj+;^x{ݛ5k +Ag3`PZ+]7>Zzs ZnIqyE86!"2J/_~g%k"s{{KYd&w J+"U-#xIrS8D*@OGA9N*eCV[)hr )G7d۶(Bj{g B!P Rf]xgR479oe N{ {`MFc+OKIfI#tos7(T4JЈ+MT>(%t:ƀV;<+JE 3S@f^K$8 56,E@y&x~UӶ6H. 0uUIh2-o H|s%J6^ x}O0Fij9ņ D]/ 0@i$ hcVT2It: ,WBMPVkjA´C,*'[}sL01٧;tk /Iл}w,[u}e"RX> _}|c.u{_|9}eA@)Ќ`CFHm\R)ݶ\ 4*+Bg>VN܌~CӋ6b |xCŽ g޳t\֥ ms;=qzGvX6Fګ"e! EtşUj00ni`CvTxmckc { e+rA zFRbUf6;UVVŨD9-T9mu;Czt6;G qHҲR-㗵 IDAT ^ ArmPUjȹ+PW%6D ̤Qʵxd`Bka2^7#e`iلLD u @hk9F aٰPL!`$ e1(S4JAc:YQXMOWY&Z'Յlll99ly8%uZ+J~k7@Auǧzй3.\(ewUNXQ9*d;Zŋф4n4RmYcٜ'yBZvo6&GOr>^ ]/씋xI%,^m=>)8J/xnE{]^;/w A8QxE&d7  OӲ,mqU((PkDf6083Iw' ' Q,?<_xּ5ZMo~YI߼bص{P&G%|[ct,ֵ*?Cw/VJÏ3i*bH+j)ʺleK5ʺ2uJͳ($FA9 XgDn|C Z[_)Rc%6m"a\ y+E|ֽ}DRbvVBԶnqtݿZ 6Z@HyE~W/zwa[ ]PҡsIQ( -{s+,|۲l2 N<r6H$YVw.!EҶ`3K 677㬊3Zbk|4w6߸"j Fi4P jJ*.7&(jt|0֯y䏛sׯXFZYn~0ΫL&y9[rk{AlT!J^3 9;kRH(t7G0Nz9O4q KZ}](Fݑa)=>?bhQpW]'[(ZNr`7`&IFhX[;::ʶm/~dO6z2Avy^"L*lǶ@HȜ-iyZ5)oKBfYC}rX_zI&&[ ,Sk1ȦD[eMaYPK9:n^Ţl bqvRe+ߡS{A J:lsc +p;z0G4"e\r` l*\!Q Ut:2xSkw|?o8V8>9sf yU:}<EYGwau~jgNI B5T3?{*PqDQΦn'v\-fsäU,Рh0с8;afWy]Mg$ E`S˧8s.ag'>Ģv`MɎ(Ka4aijh3_:%y|{^eءӵ0{O(j%mZF Y^c bM : XE]'^C Bը6g*OΝO*MVX Q<ᣧvA ;?{;ڵ˰nC-n k uۺmtK \yƅ gyvsm$uQOYwQCR+j,wllY-,H̨7<:\s]ٯ|w?z?'m4 ֹX6:vF"+Fky]66'v.%hRZcTPFճ^hn_ݾ%.Y{OvF/j!Nznw×__]^r퇏~/mǢƢml3paf[s1w\[Ǐd/Y[m]gg?><ec] @lY4OV$Il&ꣿUq#왃Xx\!( +&w@ԺW3j(]!fA]W1m[šsr?~7>PZ9WꕍW\r%c6XjŘҒAuuU311v?' W߾t:LVeBdYVM{_p0JV@!m9P|Wʳ~΃/Y<٘ ZRv_y]U%E_=^ci P mN~wlI$yGeo/P{{6q-##Tˢgos%7%BcNjFk i5ڒZWH<`($aU^nz85,OA,* OScor)8ơ~[NZJ%edw.di]bPgc b?mSeUuoo䄹^0PAő 16Pa mY&gUAg.B!e93 B+u;&oh~'w8h"/g䈅Þۦ1̅Rma^l;VQӧ((ׇ}߶A9D"62t>h_}(l(aRmȪJ ;:\x`E6xk??HЅ6ek6JkJ=DZzγ|[z$Bѵ(eQKKIX, M<ۇ9pmn~퇻{; OҬWw.^K mIRelfr"K~$>89Li!dNN37\ eeTZ.¾CՃ')&gzrpҎ3Z8=| ϰAt-5 tȖۗe|LfʼPҼRPrfKdт(:Ɛ0_Ȳyî)\էMRT@|Xۿ7((͖1o(-?` K` F[>l'p=vgi,T!KJTaFϲb?Np ^cF+7>ݓ~mo^IxD sAJ4\4cpObigGWed%VUh썯>_p&/y8eqߺ[w[y׮?:w:622_UqmT"`znԉJi$H( ̴ ,eS 2ǖr<|o͛7/@(noAдrl`e9/pmoZ 3(`ZmU 8 j8R|=HV;8ĢGND;'i./l&crh LgX%,qrr"hme2葁qQ cl0ÁOQgq V²Y.0\kt= %'H`*Q~<0w/E9zGi[+!\EZ4pB΅11g13jdY!hooo}}(~{hcLy^`[[[~NP.׻kp_ko77o/\Xx{<&ۓ_{ٛ7Sl廇Ͽy@jm48Qը3ƈݟ?wkj;@d:MQbWUsx:s#6O/\еJuȁ To٠(8U? Z)Z+%TDhJ͓0Hsð{HҢYYkP"xB4^XEiAl29Gj:=H#-c@ԫ><<lnn.X-}af>Jtl_Gj)G;>/sٳYU%\z :ݺh4aj((Ťm?Kn/"'X*J *9Ox+sՏ{o{>֓x͋Kzx)-.ɀ]ZmdKM.NOMGlkt, aneV[w4jz!|"Ȧƅ>9&3ieg\ʘ#+M[&qj対qmb~TKX˭._T*^fzg8ZyxKcx%!$6u5=Nr; e[/dY0P B4=zjd:=VeX9]ܶश8d!Xq(y-!Q; + WT)8k}ZC^^qyoP`JYܿ o|[?weY>|x0On2(xUeN]V7RAOΖnPˢH4USǁ@:. cʝD޸jd/kƘ"Wʴ AXKer{|_|?['_|{bb@1chH!PArgt~.-n*O[fG.^|~ l f-cb $kEưc=wà0fu zQ)) P)-t8] d7mlDi8I4{~*@j$RE(1gM:&8mx@D4t0NBTh7^._:8Hp A@m 'CcTlۮEsWI4х ֶB'[.r㤤P\ql;g0V'N軌eE^ u7;&˕lbMffFhM\;UQڸ,kc nj&uu:_u5U `ba{aýq~AV*YLE "GhxZIoy(:]z; k(#ZZaG \LASL!ݔ='N(pVy , *^kLhrP4m2{ kUBD #T(ÍP@نA]9#"RˠUsRq[0FmP ,$4x=G󃏐(:nؠ$:8€skW61@jEphP2Z-c] 6.3L=>qV3 ⑒KA`Ry1%/i $ K@<6+aXVl("#46ȳdaGd&y<~C^+[N9<߽e[J3G[Y<8l _L>CQWҹ A ~OMfo*SvhڒYu^!r2VRepsSūbԙ,O<>,by%׶]sΨɪlk^Ko_|/6->=۱=WdriҘim_̖Œ@ q Wiq'J%퍷'61YJ} f´fo E#kUbȫ=X^tK^x-X⃛Ngv%̲!R(;qV' c& ]Xڲ'(\ѻp4~m0ZnGcEdQɟ~Ν_7O~f]W\ܻwK䧇wӰSmRlm\\>;n}s7>jNڠI  Cq`8<-4eԻuK}%esx4]^s! {nGܽuG{Eںo=}.jߺ4U%fZ/ʒfDQ7{oqc*sn=1EdMs,s%AMʞR7no"plWpqp.ZtEqovwPi"Y,aaq`9d0*l˚"L "EBBV(dka`~?xEba~ v'aaI FJymd)Jϼ>g>nVrQJ#?NPdYƘ[_yymz9ooٻa?r@'{9w< Fo5ɪvIju.=ww.U 8q'.[@\D1"eQHNBCVFF4Ye6Zͯ|1Z.TIbR@!*e2ղnMir?y:Xv=*u9Ļg1N&t^\N֢f$f 4;m.xg._zi `קy0y|O>Ts(+O" ּ)o3`ZId3yFlvĎ#gYܶ܋^4>5$_J EIYz{|sp<ܤx<vG#w# -tny>lqJHcb|Rٜk*1g[L)Xs01bβ0+p}Zs{qb{jzrsk>{DBI4ag:FoI I /nPFK{p8Z}ʪUm@iچjĀaqӟ_zA:VAO IDATUr O|V\txtfn3k_zf7n{:]?L⦿r1`B:{zDPzm}8˳"M 7:]%*i:hj/U^-Kj߂ӣ( 'AdM-Y٨бé2hh6F2 slhPp@cb_{|JmBk\b9x8|s‡gO޾J B# !$@{U(b1&xJi7p[}Ze| D֛er/=;񝟾/7{߻/.]| x}m9׾ᚸ$.MĎU^dYN9x#=<:ЊZF[ۆ?Z-v?W^^Lnݾ˷?| .FG޸1^_A+(PGjMgYEAt/o즿1t@)(!fQOiyۚR-}ehc̍矃bcPYJ BaAyR aG7H+$*$'6A_0bSXIxGs*lFqU6տ+EJ׷>GE}gُfOO~ ~>D.}!ࢮkJ)ctu]3B !3|71:Mn;NO~c< >(2[,עw/I`ț4xVD, G'Ɯ=y'G'{ǽI?-s]ؠ5ue<:" |e;Dk>/c=40I%e HiyVJa}i%Z`P9}VMD%>>?6hJDg(Te\ C 9Hb^`;Jb6pܥ*wA#FMFJ:VKa5Wr{ _[k?X^t!~Su\;|Ԝ߸~fXC`4B(.r l1A('P3t:a ֍TiS1l mu "J iavFUM Xy?N>7N9Mlו,Z]vCl>;.|󃰛$ɲ)>FIʛnwkxɚy#8u|l$+&xKXdAmUv6zQa"E^f) Y.H0"eCԠ7FiLo;Y 31pzԷVDٜsivN@m Jp*X;,Bؓ- A6QEa7ͭ pH= ݡy˓JmU̍M]Rjy#YZx:=T6JKsL_A˲áeYLw"%$)Ղ pFQ4l[B+-w=&i):$?񇚗Kھ65YY 8w&ѕgͫyy۸`XQgcsc85=c?N|aed HU-yZy%ԸLD\t8n< 6+JSnכo!xy{bSH:p]5J`k9MS뺲 ׳cےLJW_ts?=F6MC|`-DHzIOٴGw>:=A60q#p=ؖ@00„`sڝpm0!I ݸ_KOCfې2ݾwFx疋Ol_y\zq;׾;c VHB=Y3U_t'Ƿ -Ok`-4s&DE7onLy P\b ^ìh*ĀɯV QU!JqD h*/ )CXTc[\ p\㽽]4R,2PB(!ﻶnG޽鍆3@+mDkc[6QJP%&8׶c&XjZ rJ(ˊKi Rl>MC4[E]`iesSVS1sMD*Y&c#\-*3L^"F~F>p4!g^ٍO(iZo䦔΃ {Yb,_+hĀ;q[,_]x]-ϊ8[-g7;hZi b^!,3 Jmå1#"@Ӷ A-kuJTipZIúg\JM15Fj F=(cj͋r/ID@GJl2[>[ƃskeڤyƞX; u(ti|)Jgv #t5ϛZ&jNWP矽ϲۏKvQ*B諿}λϲ`X*HmQ C1gE9n' pv<߱XRFؗ8 9o9 FoM=_fMQJ (:;9^/E+ # lPmJ -(d0Y}|x%v )TUW̢UZ`T 9IQJakȅ$ej0[hc-'OMX&2j4)bDtZdmI9GخS$kˉk,OEmpTiҶcېNj( %˳~Nj~ (-Цi`"F|JDŽt :Bl C߷BvBPxO`Km ɜ;K^ A;xk0kqx[ua@uz4] SjJ`{Ӽ{J|<<ǘ~;ݙlB8¨;XǘuRՅk~1aaZWiQӶEYRy.a$X-f`j4$Xڋj& t|0;nVacწiM͋VKz4a^n?lkhm`_#E,y^z{x$Bq*luN~zd:t53( "9m:ӊGAhǩ4Tm8ɺ!Abp^V~بRkn[EP\U̳$odG&୩+{  0B#bۃN4nnw}eY )(yneAey~Tu"jbV@:>Jl 7l{T%w>bܜ7EKdB:~xg:k m1I7.~n.]:}xP&Z|6=;9g'y|uxᕗ!oj$dBKГu#J\&)2C?R`d/|*Oi<82u@c. -=>OӭA4J`$%@ 53) 0c ! YRuPs:q֗梅kkUsCU?Wߺ}zz>rP-F=o;(\v w߲1זLd\VT.-Ra8h( "G|?F,Ɋ9c(-$=j6.Np˝,nvWiXD@'P$5KoV2G_I|<= y61 Wsj;* As+!dQ t^# cOv+樬ue A 7YiC]ͰPn^|8-JEmuTTz#%l|kURTi/Xifi ʴhsYb8+fPɒb0jbL!O˩ -b Ƴ]Q ` TC׵\׶{}ѵ^ݳTzV \Xbud4l}|zfA\vf3]7m䭧0<87l2/dk l+@TYWRvp8\ȧIVE=ܻħQ2Q %bV[^w.ϓ|:̊&qndBѮѕ봨ArpJ]k=pX \&^]ŷS]a+N+KZ~ cO)Ȧ.@I8~dTocUΐbc1Buݽ] 1Hpu({C~o?F_ (ϋ+~cdd=_$X]H7/U3 Dž؛QD4i1S "ODv}jQUFt <6O+[NwAU.,2Ofb_x ך0h, m]i]kB+v\W~[OʝlxYVz}ȉ{nxol[yj;u+@G4sŗ^}lq߻_Hy3&phyA#l( RbSjs¶C3UvNܼ~ݍsXNB}ux8$a]KCLgNuNPe%k8, 0cQm}dr=hi̇ش;QNjy$כй6o4ĔEEUMquefBzrj[ñ2HF*kNjv[($uh0FEg1,-;Nd!I- uɄ,"t!:;av˴Tq<˃kN-?|d;Oڃx *^6bf! ?hƐ4#k=[utD-<_ڶ3XcexD0WWV ,ml@bQHHUsATJcBhVZo糬.Gީ/_8X{Lb,:KwѨF@e[)De\ND9}d6<}Kk'\h+^`Yb&a{%j6ZݾQ nyueٱpD,¥TXۡ5"vϧei߄jDlBeI Rk0f;JUtJ\l,0I&I,9(UU-w{*BjaI` DWʊb8;*(J=mKdy;mI\±ѼӴaS)#eyk$-H @m PB)QkO(Cs,Ag/GkgAz`w2 |Q]{2Vy? ;sgg?ˏ??sa[,2QmW%^ݻ( 0[a3yS8O,"IRaulyhz'N=r qa %yq+-QTbU)i1E:ruv ;=Y y"P KKc+d{!avSwk{^~r-87Cha3Ƕ^+.ꗮ}17W}d;yXӱJOvyqzW LZ4 /Z J+O?#r`6xVZik'*.*aP'4KsTVB 256MRca%BB3>ګzK={#x;E=wߝsϝU18S}q[||Ne~}롷>rw m1T c-Wc^ A̅X" :MϽvȱwx_ֶm,+.@Z|2Xy׏щSK/{y;g5&NGµW,L+^To7w75,b|p$K KZ4!NG3@3XH*q0DH O3B5rGVK &ت7m4CsC` j{!`ka+q Xp&m3L:."V|V0g1"c804U|I(Tv,c!6ƚ!0I6rco_HXpe.~Wk#_IW`sek2=N;O% q+m3KZ7B8<fInbak;*_|Z.1b!,_HW a4;RJFN 택dR8(5j蕣Zɓ^:YWzlqb_9;N}76߽#t\ Q`h]"E\R_|Em IDATy8@v0, ]w-//muèe (jn 4gZT׊:OU1β`#ƳTV#; !өpE7խë޲fOvyHVnx,) @!gvFӢRJp+YT5Fٶ4 b FvHy+KQ% !E 0J(` Pb*A±0Wbێ |)oM"XƦN&g_Oŗ^^_A[-oLUeʋI}UOҽKOp3 6vB, ۘ6lzh4H5"\>Zo|t}۶Z. c7J;Cn4aB8v%aHbnyUU! gi m @96!B7g7()?W1?O)-`_e+5,ږnSs=L)Њ @RQˢ*$H/\ HڰWZg~M`c ijzQp1 mA&RL1 `.xmF05FAJJ%ma(Wot۷9{я} ^9?5?T]Wwsl1{.\Coot>~G~ _G>',a!2ʧx<<Wzh$@ 5X[* +MLj؈2aEĉJ3l4 2~텧v. kmeO<sO{7)l){w~bѓ.<{o|?pc{ZÔ6kBMGٝu)#.40E݃.ut.a>j~pŦ<'k#% VC#OGڑr2F1k6{J:XESZZRb uH7XJcaOj2m9A 40tQ28a%,EhF=`Yi:'6u #^B,t<~&0 0e-O s0dx)Y0[4HK.0'ָN%X m葛6m;4vm^w[| <7x2dPChuUxdyii Z~.sYqbqY WM//^`y=OP ~+\e]d{G @T,e#eٔZIQAؕ0B(8 Y^!bq TFxOEl`1dYDDue8vE*`qn,߷Ξǚ"G|`{qϝnl5Eq3@U0[ۑn6no c)('/]˱0G,aΫզv{Y,ޙvdYs*!lYR*jYҥjC"ܲzx罃Y̅N >zHo}}鑯=}G>_Ǟt`jΗ×|~~iSsͨC|+_ h{߶x˧~~=w]_<&lo ?7_tr|[ò¢輨A u<7MLZ.$Q_^{4Bĵɠ~%w,K!q~K)\)Rp9~u.1B ^WRJ $BE\6/+h6o.d|cGoڀeԙ'&Z.rssxt8D`֕,NfRU[?&1n-Q)ZNIm0cv]sJ)0ji5-  oѣ]EV%0"An-)'c ԺPeYDQvk^hC4\Bcjf$Tk]sED&B2G=ʇ~^zl7xvv*!@U^ ,cz}^nB4O=fя} !l4]%J 95n=GOϦb"alZ>h >:oUKV6X+]}XT۳= nm:Mύ=["ϸf]!œ}ǝ-<,`G}t:<̓ŝ~K_rC|2^l\~AXoT 9tݕrfǣ2qn2§҇q;赖6˽(9+弬q)2NcknS"#Z'Nl?r2]_M4ӔW|W]۩;K\֗*%k#F<"bi1M%}L"ITʶC-lLduՉN,x{Q-PqY! ͡K ]ݴn$DU>dnB-y!q2 AR&ߢ}Ɣ5& g^;ɎM`}e6 TwӷL^~D.^uFf)3P-AγrMwE {ǻajY.%DfkͣBa̼n_I-Ng\^=s5dT4եl:CE z Њ,a~5U#q%KNE*sB銋WԳ1VngeeŔBP\á4-s+Q 9kcD_Y凍vY+%cv3" e}<שּׁ!O 0R)0Y^ W8@0DZz !|_MuF]d 6IqU"",-Qu0b5NjXLJ1*5ҎD^Jl:[Ww^Mwe,>ίEO걍wk"  4\TӢ LL8i;m/hG<'\/  k7ݨu`Lkf1Ibv{N]sspwcFh?-/A( X]UBxMװ$CDarn ZKi^^EQ]pPZֵDU*XJ)<(WPR ,j!"C)1F(OOa@-&Z  u-iYVJi!cV<^o(wߨڨ/}; ƹ%'Ěgi^s̈2o):]$HB@P!R%WUAjydDHJ[m4Zq^SJBHc^@d,+'y?!4سky{>e4/D!5&~= LE1Z@UvW,ݯj a6R[€` ̝uԱ]~`ST7a}BgIn1 aTd1F >䓭fʼn|:SJ-fnګ;K=vwir[^o:.[:OߤƥRyL9lUh t/_fu \2Zr+(l)) Jɺ?Ƭr0X s|B|jZ>1K=Y!(#Jta {hQDk')#+Y1\u)%:/2Aq~y{Vqɋ*EH'#uNrm V(h"əc58з-M`eAhMבY,[kҒW Cc #*`as8I+Zc*BJ,kRJY)h9M!F*.jpx^q|,Xi'jDBi1O3dȎkc;vexVط}eL`•6Lb/Q:]tKEV6v+L)Ԡo{OSk;dkX\hi RB)EةQ5B6ڝU+]K$%F?ml`B4-1Pc1hRQYy9;Or㨚׷|+yz68ݘ$ׄs36pr-QUc#y Hl΍ΑnozHdtƥ+ˮ9}U y6(ʤ,o?=l&j՗yerDD5FJi)5/wCRhCov[vx+]fŘNUX,Ɗ!ԝ/?wuQ7[턑_T ?l l7f1AΥVb4OϞ}Ad;vWu]K)!aՠڲ %AuzeQ#Gߩ /EQp_'дY;t@4-zR.-ŪaN %ebDEeb~W>\ۏ_{2rYv?W~h|9x|cl@21t>#ǦYUBIh|05Fw5r[R|!%'}4 =i8luN^6Y04+jFY|2j$pjWOx! aZee=I)rEBS;֎o%qc78+kN߳*!jk(L= *dRf窪*yYy,$TN u-(n6[*-+S)`ImaQvjΑ)鴃j5o\ݓJs %#RFVx4^_.vo _P2>Y8frQ4pwS* ) \BwFHY a4` a };RLԂRbeYa6 SAPf3ƈ]bwZ x[R_~c;~ۺx'z^WzAXxR=ݿ1k!/ ⢪ «+G iXe7vwq\|u}i`XbZvʔä{d@}3/]M\06h5.,f"2hX#rzkxVn~[FíWw<3Y/հO$obqj+UA[`> T J3ABky-{:UcJ3A!TȜ" !$5L4m2ZQYT4L6R#ǏM« g#w=rok<]h5.Xzkl. Nt@8E{dg>fY5qsCۜhk67‘fcsJn]@:5.G?rw˯=s}?My[˒cmb!Ȳ̕ks BۥYLknfPL5|V kE9o j=Kvg&-"b;W1t=Z{滻gVhOs_,/|? MbYuF{ߵy+v~<N_>!3O?]ܫzo}OFvƑ#oO&O<ԹWgL?r%yyeY">w^r?|KJ7 ȲG 8n0fi{{>sO|~p`_? :uϱiY_T8/J8{ſ SWG'GЏgMEλZͦkkka|ҵo}ӭJ'x mZB.^|;4g'ou:-q6 mBj5O|m<Ï}CM3ȱ 6]|~B dF@0sk.4@kJ lxy)bajGz:rwul(Q5 |vM~M1v:leaxly=Si2cNc̮(y#{.Ti;q[P5"aPy kwPia\^&),ƦM?܊gkP`؀8\I Z,XiUei,+.mz^rC=HP LߕY5ֱ͖G#M,lALҸ~Qg'YP0eZC:9ᯬ.J;(v"^  IDATWw!/)r kQ@0ЂJY$qWF֌ 7nkٵ-m ci1:M1jjZT )mT%""UZ/Y̳ݎXRtqjfnKsT[u890 ӧζC׏)1K?w!@LSJ>OK<_ʯO>CqR@_)vC`"Ab*q^!B3\p?a׽ӚS Q(p]j;0D80ƱMeib>&GcuW@ijkyV2D BdFn?TiY:JuvI su+‹s?_ʋy5~i?~h}CUE݊A'?:+~'|oϟzpx|tv;_4%~PUUQFkc8oҦ4?~+_vyw?vZC~}?S?q{X `_x'xB\\Eև=?/L…<Э[[kOo}ÿ?y<'u^SpΚ`0PJq!J6Z" 1F+HXM\-;کdT RZ+<"KNBJǁge!8.W:͵u}owYB`8!m{N.*NsJIE(U"@R gX{uw*:e7͓YJBPPR[J[Mlt;ءiYTF"G GEk5%(t8dg`2 Dl1loz}Ě^OK۷nWJ '%#|< Ҙk^TF1 h 1v4-0 =IYj.4F]ZpxA7fF@GSE2QTuD^9 pR[ufu2֐Vx^\^?{gZGjp42F85z"Uq$$ܙݰ \a,^u>^Dh<w91tvȸ,Vˍl tItڍEyOoJd" i(thwtXZ1BLYH1u18NO5 @:e1vZuz#p~嗟|m>Bw|^WR!첆-6]L4<9z>+0q:l_a<]ue+o,.ωXQRįwvQ66xv<l^eͨ}8eikԳ Y~+ݍ7,㩔Oyde c"ۈ^Ɯҩd6pL5P`@ji jn8L&*s`lnqΊXi=0abDH0.H6u$/!]:{iU\jcFʓiVLSo`>RSAۃP+ NOqd:0Kg-ԢF;{{{YQDIǩ!-\5v@Z,9C4jOJTkx~'/ϳ0ZHq}%DBRRkh+`9pyFW?:L~}j%GSSc` Hj2>@CT(DV˺F(u@-®N-L.@ðfR;2,Gdd";|w |=7$\85{]ʋ;B<+$N؂K/Gyw荏ŋKKW_eOO7oc ~SPJ}s||*ػ._Xq{˧?7??eY NhZ捛[]] CsBEN1;6mabc#z2m;Mx/wx ̋JTR,IYƢtzw{ j $mמɟ/|ybBlD:kBhiqᮻ\\Xx景ܼ啵qZ!~vN+W0#ވBB h hB(c2`j] 8O, &'5u:1uYN !{4`[M! 2R8!f~u0  yr#:=ޤҞ83eR:/YQXsY@(TZTUZ]":' vDG4Te3+10B *-!bY(jFQku:UUgcaVxMm/v!Rg,!X,]cp xhn3yI8ΧkXEꣲR-.`䲊|m%c* 4̒{ .gemNXbt<ߟqW6ytQH@;RGFqϕqVn5ndzbY\ u%,4N@k%ë78Ls>$أ 낽i\W, l&NtAn" vq7h2M_)ťxk7^R7Z8Ķ 5?Il2ۆ= ϾJ NQR蹋y^xfkֶw16O~ƨx>ۺu+=|_uuu\7peuyg{g^‹Wz,/ÃÃk׮RA-u.}_yϥiws$46Y5>LӢ --qS SiJ$<"dחp tdjzlasmT[{+u\_|8> "R:QiUVQ.Pid$Zn+j4fF8/Q'OQpuza]fG{;޾~k,Fe9U"te'҂tpGsiOs<.'Ǔd>CL/ʺ@RI6O<Ϸ u Dp)(40tB`dIgE0wuR랈<ȩѨߘNk$!;jgic!NGP@1lON6_<^=9fƥ?qdC {XGRi?gr&^/a.`UZV>r/RPJw[[_ FX uM)+!(T[c4SXd W(HO`j> K}IS5H6;EDCB8Ε'Eq^%-ۈ E)2s_(j76 )lQscwh{~Cʼ.sќ:W:~7mj·<8 ڤ@BaP%>T@C(Zq^w{O"+dr0< JCJgqzqUPVU]j;H,`uBy;T I#T8b;.y{p0r9MvZ~'@%_l:W:{*[b=Kjs'wӃxݸ8B>)hvOތz&t${sy)4 P@|xy@Ci;/pV˫xF .͸H{.VVUi)C$(fi14sЎ\7@Gy6]K:b%b_[\H^ի<"vp0ۣ)$}ý΍[`H# L4iJƓ ԲI,3]J׵5ʃ=p)d^.VY4R^\t¶̕ϳb4-Ni ,O,sd | 8vWlueyPiR< p?(Ua탃had Wo4dt$)*URF%F*Y%;Pd n|429cR:b)Uf-qxNeY !J" S[!- IDATB) #GZIup]-\~|.8]=<ؽ~KQ )6h!6We餬*4FXP%Bd}m OJ)äF27_ӧ7N|g^?x<2F u-_{z}'f?gyQJ1r!Rݸs//AK_z _Zoҥk~mo{ M|[ .x:EZꫦumgRq(PW@|陯~KǃTE q1 6R:b =UR(J  Pw8(%PZSB8!"MUWEC8d%ĮFG)]13u :.}c0HJ͹ !BQF.%Y!CF` Y8mNgNu]CNggu9l(nc;tsk3Zw}ei>p:e)AȢPIP:LDcIDMjlE9'fg. 0KY͖"֩}}4%⬘bZ[[BCjZa]E,7ڍԘ0KXq4KPQJf'OiQײz!s[F@@Rq tHyi$Vtsg S|4ߞ0f@ӸhFs/wd@'!Υ16텵ֆ1%0?2jt;vc$ , mkF,CW~G5s")5L&{X1<c Ņ3w\4) r 8Q4z/F0‘e/^ttiuGviH&qTJpza9,'ZFUeLr8HU d%⪒(gilZ -ۍhH G"i Ɛ"/ BBYl͒x!X+WA+8Z_k?]9s_zCAH`TgY2k5n6w[]Y$rFV CNgxj BK'y)eťq,Y1ĉƉs\ںYӅVS9C"ҝ(jzMQk!ya+`B UbN-jwsJRGCrUVsYj }+/>|1}λ>8PJYo>]'>/=G~z\ׅ$IϽڍsz7;0hhԳɌAkm@( [PZYʼ##8rQ`"fFX8=qb8%RfqU*8+5V.F,AL1ԙɼ@5VdU=)J!VV8 F RJ)uXS?Td !` 1V"iUdTcXVbR \NJh(kBCP$NL!xG "C[{sw,RA\TdK|\Sp u>/`Ng -(ZPwme-a2 }69Z7*Ӫ1慌i Ih!GBdah`+#[u,l%1|."JYіB-ׯcFt`Sk[Yqrp$KQh-}xiqiN87R]:Pqyx4yt~¢@BEH(w=E-pFUth/-bGLQzb= AVgIM/L^~ԩ3/'ģ()a]<7^#|}& =j=l.xiyyuwRG7 aY-\R_Cm"ID8{ۛ"[F7F;wT@cNAFRY^yfE)Z֥Z5R,*Jh1AqDV1A\@,B5RfSBVnȜA8}~RW,Oڋmu^4˯8dwp-ڍj2ټJs;G+DŽ$R\^YR3t &xh?i*zT:cFf!N1R ڬFH0(Q)E9 , > wN\U: bN2UӲqYV uEi;##? RhVlk kkxnkX(-hF :݀;hem5ȥ%FeRc UUb_-BHkmf_N45֕JԵUVH sEZUxjBDTS 9Z%V ƩJiY sJy߶ "!$e)Bpn- [ o!4wg兿AyxxO}^Juٟ|ӧ7>?~kg_}dQK= H#PZyZ֔;p7 ݸfQLz k,vFpqak-`%VݾuZef+U9o͖%y{Hݱ`X_\m8d\]f@T])qOUNg~;` B2?lz7F^4NUȐknXU],VƇaÃj[)k QNR3Ep\IOI&׶ҢypXc!K塣Zp.tPwN};y} edIj@2PJAek9^<6:-fy.hND%UR-DDQl6;T % "py*䔠O!(5QX%L30BK9d,RKIk8{w?IԽ⽃ã[-5%X 2pheeVYj=Zfu)BRy]U RLߤKsw뵿ENx^g?͍7D8N4nluBn~l ayz$ v`xfЛ"pR4aN XWj`,!J!ii7;(ýCus4 -[q*4J@4$ģqXbjbНg ,j@R׿q4pW:-E-EcT*2Vz|y/*J  КsA%w>=1D,KJPJ [c@cuUDj RjFq RB nyc(MG./jvSHAfy]JPXu1Ɠ΅Q  ޛXewgosDfdPYYddQ*d[Z EoF}}@S@jAT1UY,1oν "]FpqafT_旗<ݑo{kWO*;'l7Ne4ayϊJ߾&3)2Ȳt4`TRim4'\ZbxxUj}VȠ'R,歛FrSE?\/Ҙipo*[VaMT*ɽ)7 UW!8$cz3`p0L^w>0|oOwFVoe{wã:3V P;:eڶnNu|նiȐw|~eV̓D!Tivm"8sADTk4_l3<onv y6>{d#~n?ԩ%GG ,@5Z.6tlcc3ݙfCČSOa7(nA_8R_sГ%$ nA:*,pNӉGz}ZKTuiFnMmhnzG|o fl0R0!WB0g/;Vk mϐKE+fpn %kk+BBXι3л:_+md ;`oL86ם"SsBTkRQZ N=p9BuNiYGRѶi<BI(Q+ŃѦi'YF2qRQLl@1X-.r{/7ִvQ,g;cܼ苕!Sz&x[WxGLj Q;omc}Y/Y8Lؚy M^696^3z*/&4MSR*I@! Zǻiڀ:t ?~~BdMe{eC`2"uͺwɬel6 BK5P6M+a 2h׌15rv dVI4p]ҸvFAIڟA˯Cz{xjPO"2( F=:-70AXTZiY:Qw: H8rۖ0[@_ʐ&?|0/¾PsB yItdX Y# _oseguj[St:bv}lB7 #qm2* +ƄqJN3?=~&i-n@<iB[G q>oW]᭘i)_U Tz1iҷJk!_` 4j'Hw;uQlbZ-v]@y/5-ܚTm4M>zXWөTbBW\ u]˶e]FNւOwk(1ϯ^ m;%\1ѧ_,6`S)븠wn^O|CZUruޭ$bˮG?9>QFqpYBh(iח}fSF+u  eY=1A@5M^xRމ4FmQ=!BBƉ"HU!7͜O޹?ۛ퍒Tg_~nrA/ɣI:\U c$ vzYe`!(I~R{MCoJ˓^GNluNvŪ 1?$\$&.hs{`R B´i01bmYe]ƾ)0JW'`w2iloBTu-eЩ{UjXW2r/09ˋj0KBM]z[- ( H|۽npo|{pcS =c2jw8<&< "{M[G?$|\14>|ߺ{|⧗/c )}vRVAg4-(`Qb]Ì(Aj*UXU&i8ٹHK;nEFWMc(Ivvd-P݃{7`x̦, HD ̍i2?f8$ԹBKQ']Y<Ҳi"@Kј50J`Ua,8ʾPm(d2 Λ xTfc^Cu.J+k5`Zwi8%3/4KɈD{#e e%Ql{UAQ>HaM:pt1rs+m:[Y[eZ4Eq&D#"bâJבq63zݮ@?o ^oS/Fv<}g{tѣ`7j$NAӷj8$]RHu{8r]וO'qTgܙ>'r[4?*]3Pq^]]^*տ7~ Gzqďwv ǧأׯF;{{@4 1!\m^VH-ƌ vne^W%,8fξ#[y9ˮDQQ]]S,k+_׹ Bv.֚!1p:8h6f@!Q7%%h FwnA>aq6[=E2znL7#~ᄆx)u׍|yd) 0޹ TwӮYtl͟K z֕F3}u""97곔V5$N"֎I=溳M 2?<6Y5fr6۝8Q/_t0ZnG]qpXc q9: 8-T 0Int/BM/`TU5 КFöWtڡc"Q[{ÀSūKiI#gŦpABJMkYJ<4N Ɯړa<&wyECa,e9)XZAI1FY4G_=*ϲ :ڮ5ɦb h,#bziwD wB8*w[E H+exk8h=x2=;!bL<k:}c4P%ݯ祑64˛b2gg1ȅ*^iY 8 Mbw0q9e˟7/Né; fi0"oVi,W0q,8A@z-!v}@qo +fvU:7Y&y2/D66WV8pv}j\tb@^w>PVZ`6[GW}^9_[GÄ"{yqhc iqN'cupl{c4!Bfb_bPo;@ Tr$eW$۟MϺi.ww !OYpq|uy\flo4URSxiN,%^׫9&x)bq G(Ǧ5M7 dh8٦uMhK*:wAcz,*H yQ|e)hZAENAg R7eSzpaӗϗNje;4Wjݹ__/l36_ DDEuxuD8eO8 xJ7E'S4dtO+.lϏ^yF:ӝq@ 4F  &O9%+N6IxlWpoZRl6"Cam1;YVΏ4nJb#3S,1'LC6kC(2`/o@!ch)GhKyjAøubҐ8o}(AgI֏>ĩ\Zg3RJ;PYQ_Fdu<{hoM%wJc, M f !T0pdK<DsqȈt٬j4"FDMSDU2}.!5@(h]@!!]AXV!C4hd! Mc,BYdrJ HR@5xlʫ7u!ײ hٳWW2!c277?(b}u|guGG?7!!p?g9/kbi6Ygs1#h& (m, 2/G}Uu; T)C!k+MB",_ڿǹ :( (U$I(M8 a50I)1oq#yޑӃ4arQqjR &TkƄZ)bmw! <"1B"ʘ{Cg/]q a< z&{ݟ-*ǟ$j(5X]im0")@ux<nxXՋuwaaԽP6Y;xblmh@ @",#JăTG8Yb`6\3 #P{-Do##Behqxqe0e`h$6kk,W~o|wD?[]J6ffrMd5Yb?Ϟ-u)< (kg1 0{a^yo`ww(x8f^C">9M_QKW/>ۜwYi'F7 >X}xuKsjٓ|2eu;UYX\4Naj-(VXNv&vnft +PK0 IzqRmggyɳ' ]>/]F W\Mip0Qz]ow<`(K1Zw6FQrMv;|N/ƅa8# ^9Af-(ayn ۛe #7@no2[UzUl&odu4 "ę e߮[c=j.0ടo8)p"=Y0i@T87gDS MǁQ2h63Zo?zf8Z۵K;d_曲.t<{ l,˗Ldrق4$iݔ۲9Z%kIFA,)rI½F!3B1 B 6";`z[5"ᵛWm:ض^JD|f>j}qUk04L`|y|$ u޽zkWզ>_͢dd"=|a A^)o, #̦;t:l@BQ6-[:L׮}e|StN~7un^}wbľqxJ*d'jcC4+EѴoܿw[JBw-mgav=2\$*unVb qWW AWI@4Hl8;Lvf+-/V#1uma]61MM4&(N~!D(vC.tqEQ w(/\5`} r6z92+u9{\;R5@]>Z6rۿRm=8vAY&e'm cM V^ug}Q IDAT_ΘcQi~Ko|bgѝdp 1ˮt=~o'ܒ)  _v;lt2QZ*/MF TsiԲ^&Y,` L44DXPۦ]׫VC)7b!(Tuk[khdCE(8 ,\8;!OeJm^r,Cs[4x|MG;v G;gWϫxӶt,ܞ/򫫵5Y]Jm y3Nrev<^.Lo n(R:G'@93遶0 ٨dni d4 :ujuUAD [ h'"+[u Fj4%f΂Ek1x x#gʞ!,mD\[@0$Ӫ0yaN]UWׯ{~i&RZ!Y $fxb-B)5K"_ob?ӄvLpP_>!w(_ncww/^?~woj{vvwN :~y;I"ljv߹?l1oy yccZJg8ҡR c.lu6L8}7?U#m A<:P^7 k!7@ZE稜QFtZGF, M!ÞF8RB󦭗( <^c"2w90h-" G9ot$ =9݀@[-&w X-E\ybD)Pf%aBZ 04 b65Fb>_==V&ox=?[/ϥ0r7޸ӔSWY`4-5~S^AA=`V#mPӝ \Wi`AvBc8NIQgZV}g$-$ L3uyN'4ۺl{09zݜ1 cDum(s"nl}ُ%C6+c-[׈)fA^_^6d/{'Ow^Oղ~mValnYVģdmOc)2 8㐕ˣbAە$Sv+0IJܸ޻0Ei;/+vڟ}l2V.QZ @C߶O<;ISa 0sE 1 B7r3Avz+j^$ILۊr7u/M;[|C7k%wfVfusv@SZH$!4 R Ö4tM~ G2Ea1h8` }nT眚+ܳ.vDs*bܵw/Z,pZZ8-De+^pkk땛_+@'?#}BV|q =1: NZq_8^[OKZJ:[y:48g ̱'-i 6tޔ5$B  )o ҂Ӏ%԰qu#vQ鸮WB(D C"ZJ!(nJSȂK#d:AQX#0@ />|eGJY "@*kG@9,ƐSzOk?kgg/l^~坲"cʻ}w><:''ouSף([{E y+W{C|.-Q6:XyO mNp(tӤ37xJ;SJ+oQ#L1.. -WÌ 8YU@ \(h9|#dbxmkg|螠:=ƯG+c/<= 6n|dQo $`0|9Jևbh%Ƥq2yiB)C 6l}YnTUf'؁d bBDQ7"i+6ڥynckRޖUSe ij4z>|hJ~72_,{'ä lFv~N#HDQ/h7NF~w;!Jqxt1>8E 7RUkzg~ߪ}|~rogw7'~z{|}VQj1`ŬF@È <Z'@k*|j h;Z Ĩv{6O2a'n{p{g"nIZgIتF*78. G_CQc/=y+n$ĆC6j!DPtYOBA0U58Ak# "D,9XCZk3P*(4jE(GLChGH:bL(iUqzu!:KBwTu0J 2 REyË+UfAz7{cGcu@ Ǣ"F_O۫U =pέV7g˿ORR<|s>_ӟgw:.OYVۭ}qfMߡzx|rw??[|[o~s/}Պk11AiYkwΫ<+JX@8 oj^YGB<ShE+Cj!TԺ^rGX6RR=m TU]p[UmUki9oEsumZ(#!kF\~+k]H:[<ȳ7pZAxà=j'5@^" +)1& C<#I9y}mwŃEU6 ! 1Ս5iu @)tPK Ya ~&ÈUaS:W9􇗂 _\xHT|9e`(?郓јqWn5! BZyYۛ B$,zgZ$"[U.Q4E鳰(89ת ȉ>?=ZY4x$@)Dę=TJO+w~o6[Ƀ?X՛oy{/nnoo;_O.`\s/ݻw1ĥK;_߸tiq0ZlϾ4.76su?dW­[> =JsN)}~>yO?o;?poo.&V jJ CRyZX1@[1F"jk ޞ,WśaAi+[û|k<fʀ(V . &(tɃ\#c(!^ic)DHFͤp|S9"gvEb}8oJTQyK8&Q7dZ5yLut|2[߸dCFǞۻwuޤt|^hk[e~KnU" gl겨t&,$bH% 7 f8(r\ɛd ?od'\zo r|ޟzrsIڪtϤN "-XԚdkkQmAc 85j:> 0b}DJ:d1 :/.Di&+ j7yFY+cA 0筩 )GTu@%ӣan-sZUA(28gC핧v^eq=htjTQQƋsNCNuw֠[?P%Ѡ~p*f+??yi~t}4Lˍh4iu`so|'>$]Ϟ{;Í}iԏWZAeyN.ߺu֭{#)X)#^Kӏ Oz+w޽{H)X6ڣQϋ`KU3#LuÁK6"Akt`צUe-^\@ AJՍtkPBE i{{e2c*jiY0\MaժMXAļu_*(:_} D 5eN#ЕO(&sES_ݿDS @h v!&SYD(XFCȴg{ZZhDh"nd1VU^L)Z6+3G'疢Cl prZfXF:{LtyX,v'Cv^ IDAT;9 +x7tJyx$Nͬ, =nB¦ii9P;;# H]`Y ll!,JJ`PV`Ri^Ioz9loa%Ѷr , 7^L[̖GoѣGC~Ф(m[vy{|~fJq8\ 7/?-ЏN|_ jY-W`"WSjyyCcnARƳɢvPäے#jէ7EMYV5Ge//09~뮭$//竪>:<}tx6@HDDe*3#ȡiY!F6J.uWziRn׶8LUlRSJ1ƌZ[kT;`=4hg(h`]-#+DGDι29C{_ 8 g7;eQq9\.5b?-hs =&ڪf\%8?]ݾQrTh^uí΍k_ jzvcW/o#ޚݹ{o`rqo9>Rڎ T\=sӷ^}%p7~GMʩ]<{rki`MFA`(;;[ ێYK]+iEq"hߊO:Pnd&[^@#Τlm ƢoLxULzu H@;υ@81ABjX4"?/n\I}.׵p֬EJnj)kr C]n=Z:jmKfJʢȤZi.wlZGޥ;MEIyнvK^WRiLmApB`GH*`:8rtnܩ5*]JJ R  SRltD,Xmʅ j벒SN`˯"J立XJ<;BCtq#XIY@™'NkK @"ROFEJbU1y䝳x X;] qo\uVups{).W%# :)u^i%jc0 0JWr 0Uj~+aHm Ƣ,b]d@Gz@RXdTW`g3Y|:_d騿"u ;}:[A.J`@QoVTAҫjށeb}i; ϠNZ ΦJ&LY.`6}g-gz67_;?o$dbW8w^(^ھD>?:n[..?^X~mq)[5 c`8h1Q3<ظKىqG0tZGuSH}VgKո3VgA'ӱBu۽6]g¹^lvO>v<zmS8qU÷(S6 hmUH-qc}}ùj1[#6ꬽqLrd* |j]BylxK7ˍßhq ̪rR,"{ /K*U6P(ό ZϽhc٫Ƿ.ɐj@uy+)zmvB0@XBDX$j qV2  b4R2fBe-"RU5 1mrJ)JI *ޕW&eY:PVЊmZgxҥd|uqt]=ƕEeXZuˇ'ك*ã&aqq7N7>) AYַ_9曧gX?Ǟo{_zXl"J8A(j1ƨwRU  ۨ%qT/ wx2cݷ|݈F2{͇'z՘a{0iq!LQ(VYVA#@е{EN9ux@ѐbeQ)09H!`]A$ F0BH]QBH&"al푮)u)kHp'&H9,blyP%p5_< P!26 77yB7U,k .5k,xW:+QRzqc/:YWY ;\PI8l-;3 ըzoY4TPݨc[rH;`{2g11A *,!9gE9d#2ASU:^+k.]=ʍV+|kBwv679*)H)98=8}Y@gU7F/)LiE!sP j1 VV5.3GE2=?+ ͗-ڱ,W6t8j<ΥZוz:jj!Zb"d͗u Xˤ"W.nkwõFB5D z#3ٽ.nmIOtqΜ CqơΌT5NBxkb([}ײ$"I92k]!0Y 3c='H521r=lŃEZFio7ij)faf2KYFyUq;bAC6vTo-?9>,en 4I}:?v7MB`stuQU7O -Pv eiH jcNKi9*CCd=OC ^ă2[dbTC][~}z2:޹Z~N[{{ # 1'nia#z~6U+_{-Ӌ1t0pDXIa̬W׎0dcEr}q|*Z} <|s]ivhV?veZJSn2L{6_moVj܃[,ϴ?Z2h K6αi!At97b]UJ:{EB*8U`,yZUiY厺#Z jMh HK- rxc>9Ņ"B'z)ug8_( $RbYJqiYY[`,:XB `W&!sqPci˱[@Pl['+`xkzUy;D* @,Sr#,3@ÈP MB","yjN! 8F dC &;)%9AQF#<΁roU4okծ$ xhx 1"cQ;HzCȺB=*1&oFT[`Q8JcA˰ CO\"FBnpT0-2 ^4j= ǓR0 ˜` ;0 a@r=7CZ]OP!nM84aϼ s@D 4Ƭ R#uxm "(&caUmR)@n) z*L'FVi]bh3aPBZ4NSΐ*rUHIP]3b_hm 7Nټ$LB0F!cBu-{@x7gׁ<ާ6ҏ~?2ߦyg_N0tpo&1mHZW9'_BMhHA.dI-o7M} BD90?$vέXmn轜=x֭/iO>g%cgY#^}C{CB_NWtQJӼ^+oy~g{_J֋r Eew~_m,/.So|ø]п1n1"A,K_9߽*n9J64+W;?[? zw_]/}{~w?E0c,8RnX[J_4L:^{NгnRk3#0``l8)s:;OC'vm1@ !$4zk:uƽ@Vk_'~n~]gwkwWxE3HNOb0nF/e$@07\1y>RURq}W,9pFJBq |_(2I"nwyZt]'{f~v`jʋv6Z&$pAyGb13' cRu,r3Y23%N7=mZ"uugv?Z[E!j8N9xQ>yj]ךOto_ߠ5zG[O?{p劮z~jcz=l򎍎?|bu[n;qo#Jg07;gƦFy75xm͚.TX꺁Kx!$*M^1`c?g% =2|WIw{|2TU tP  Z|D?rzM7~L3ѣk%*85e ƨuu~p__/~bME hm^.e&N8`쁖 bs^XItWVlѻt|87WD?_+&!:>8cKhB/.,IiɌ6^zO-\J LZZw3$pHώx1Vd掼ɯY-zhX*<3qGCC٭L&Yo5 $ <'cGuM5 WF0cB/Onlllmmz= XG{5 }ͮ;rYx={Dmx]b+9[lc/я'07rݪY.ttш @P IDATy+ϜwFO+7޸rZ3yvկ;ŞB8I$ Y@@(FLfCݳ,C9R)" cPFق ߥ;#tޓ/zp <6MnX Cpu0 hiwpzX}~cLX`1-?O8{vGRC9Y80B"c,S U/^; ؐ:\U^޴--0k%Kb*^ U"n§FNontum"B@kdR ZRJ)@ 5 YVN*LY(׮m!fX8s~Ѵ~`pbbs#Si^]rv`H>:L.i#ԾYCнzRz@E{Ѐv|ws#]|KRVZNueYpE翹Vp=+6p~la8Y'Ќ1BVRZ`T`$33o]nE0512C3#pxÍ#Fs8 Ԯ> a 6)k'G~&dAyA8ޢ2fbs=[U(1 4,2 2e5 2-]nB_q(284n0(dS#gɦ+Cɩ"h2JR\5]]I)%%;doGw='inZ!%ƆCǷ+?Z-x*V*#b$U^Zku_1EI:g{ԕ+nw9Q֏80 GaBt& >6ZV.*o'yO{m[4B8IR7X,s.kٲ Id2mQ؟''J6Xܗ:]0Fiqm0Tƕ\5c[0pPr'~;v. "D9=JgRzӸ}h$2d%T]}]|,g~}!v6oh0Ʋji4?+`= 2K),Fdef*f;͎BmeRl8?(/ğ>svph,/.[^__vqB?7jH$O=K%6m\Tߛ/Œ:zع^l۾}ۢ73ʹsɯ BӟuwXRoO>sH1΁H Jsb7( d?/>U-$+%<dAD$I)%1PUDN`XT٬Ηoi> VDTh3YtEˑ)iP,\@#g ,2RRUM0ZUTMMӶm]_Qvs Eա76#h63 ;cЌ''Μ:{n({nО>Tk 8]uv# :TjTLYȸ/~H'>-7TQ 2gH46:^z;bSbٽT".1BUKUn\;,^Zׅ};>;XulOC۷o {?|~dѢEN:L&ch-nа(k֬pX$>}l&J}`6xQF%|3jha|m-?9xxUcIegW ɒ*TB s2%Qȁ!Z4&sŭXrG#`0@)KwٽjJ1JDz岭V49VQr8&,Rpc`0܂[KGGMuh_#׮4]_O(U!u߰}k'ικU ۸ eVTEIӺK400;ۗB^eYt&fb QaX1 W 6lfkƸ 2,ŽB\.WF#z5gv?[ҵ14LA `"pa0?xRhc:|y67.:B:e`hltTr˸ rh`W̮PqnFg̙- cb5IGAP_/AdBu0| ,2zUʁɁםP8z%w`l6fz}緃l.?zs(Jp5,o%-+g @oO/Ad$zH~O>֋"D6½ s0t, H߆px>8z|0&*}) tIgmxLeFU2y4NFg4%€e!L$ir:;w- t/jNPV{lq.JHy7eˢ~XU,޿a1Mw+]!h;l6[X?k\:9tRy?^OhQ}ɟ[ =1V`M Kh|=/Jzgrgܝ hn, OLOy]u+w+vWxw'_pIN撯A\~WeB|H7k׸@S5MQXp%wc,B%IMl6&DAxa:};w d߁|˥*].Werr-[rwv`bhhH5ٰhTͣOt㶞speY1 Fif)>/H 'X(A=6IR(B(CC3XlZwTxkͲe.\MwĉS=>Wk ]K,vl֕+ÔREQJ%eQF #[Z/,[ڸvmɓm[X.˹e/p ( b)\Eƨ+r2$F's6-hC#? ;?{ΤF-أ-F/G~q~, _2걣>|[Bu(#T(E2Zk~??ݧF}ռy~Wfxd[w.j:o aЅ1f> ¢M/ z sthc7 jaj@5GNgܙ=tpo}e/$G /<׷2eJ.~E?M=gޱM@ł;۶z̢R4toeTlD^Z>;!2`RCV 2+=>Z68X2hBeYLJa߷xIBy wl6Jty/6˛.KbkħK_=9FNq=籨M(@\|}~%];$#3{ c`#};\3_xy?yF [ _4J!{@ F`xK%vL|>d~](Z1Ʀ` ʍ3&6莧F$A$&ʢ(EQ$7P:thbjjt,ذ}vS?PCCRy࠮k#`&P lA)U|&i\a\jĄ4%IR%JUUUUA644"AE10l"T7:t&X#s F+/|!l.3Lbԅ|vE#ji p~eUW5*\$r%2 Cu|147eg>W% >5s>򕟯]nJTv$Be;"'A-HZ0nen˷PƎ%z]]Q?u#M&M]=.UV?+b?yEM]WIZF:߿ɵjV9S*Pslx+ru Z<鋱hM&^؂p=-GԿu7\F{M%<3gZ"<ԗ}ߖy4c:x>#g2N0cċ0pm}^X&@aX.ȅ p0PD/VJN˔2B[e%3%cx+8 j![pɼfs:SУQ &_"^S[eB6wY鉷VeYĪujjin@%"7- j^L˲ <=r1 QD =c)j%Ā!f9꩖w{{6Su[sS逅6OŌkURM3sxoӎ[S3#eww_Xx1ckx8w_>8Coفj%vg犦ӧ{*[(K0µ4ʛ,c0 b/G)$K !ؾ;?EJ[U-@ {!ѥK{W9wN״M7WiLchcCC$ cttvm7$I##`ӦWD̴gTݑXB~s V? @,NONٳg.nʮԨ)X}`!/Um/`QR!jKb'O/tչ@ q\M)f `;./O:Sd;hlj]tcaypU=*̥[Wx (sX%AAxIEuu;E#yc22{50t{ԩ3GtM{(C&)Tڲl:cw8NmmmdT*nEQv;B! l6[2nQ,/\o牓c72kc*?]\JJ^fvлIJH8R:<4B_k5%%QQ}z4hGgk">gg/`#HLӐl6I;@&|w r۞'ZZi^~\He+aQ*(P̪IEM̗0F1:W3ݲuS.c(j~r0$3e<[3FKG<.g̷M3upդm51.J&p7Z%po}ȿ}G絣ɤSO>ߛ%,w( sjrQ ^SBKn}0VOVZF x1}Ƌ7fU0PljL#bIf:1LRV-E#E5ȡg$=V'HBhزH!1H5Ț$}庚ubPTRQJqdKREUj&.q:6>v݆7XRFibgwU'wOGRXy]+JZCvL'g\$RpLV\2Jg⹩B8T?tWfg.bcYW=`s.A~lOu_$KiDlΪ Tʷ4M >5|;gcLmnᥗ^q/NSbfĩ=ϿdszZZ<^_,<ϛY#p=hQk\}/X>htCi'2N,( ,6xNRe0ϋVnxɽp4MB?>;tƩS㓹|ÈÈ!Kf#/U4MkuXL ycXT*) m6?VJq|.|͒L [7@  81b2f <$$^+}fhki SJ ~&K€H`b'h⢦eMTuхcbTx:2R@9;#pJWV Ŋ\AƂ bK_~x[}-zݑԇ~[=6Ǹ?U G= IDATZp.I_]GnDP_9n̢f@Sb=1MΏC0Њd8L5_fkow~퟾ žo T*꺡 Fv %d61u]3 SeA(!Kmȣ:{U(?dy Uo+|A$= hbXޟ;(h 8`0` Sd)T,vuHl*];R(IRaXV-Ӣ~ &v+T,JM*9 dRc c\f`Txd6`p4h j7߈wlޱ*sUJX4-\E躮:5aj"iXJ:>1zͺR23;x%nHj9Y.㩜ardyI8C#42;=|&UU2-"%1}%оQy tmWk)L;:n7%fOekx*8{=`-wVRU-Wt覠DM}韘j%+Z?0 gWU`ce!! M-,vJ( ,2 IB~+#'gW.o%FgOGzmV+uXWx5G]ZkS)1ƻ2e;]<\ڒo8ty_81~-[LrnRU[[755Tkx[˲,˪54+jKNtHT˲.В( tt91ȸPCa$ ʃ#{4<<}o4ᑡh8j֊\m ʤ'WtmOLL $Rx<  _ײQ0A83M29PBzҲM(|:KxUvxd[ۚ+/r@񖆆'[i7fnaˎM33cdRהeM岢& AE,u%iQ~qBqX1̋RYULhU7۶0ye<Wox,]>,%X!ղ5=7C#&(EQەbeEⱏ|p|&eK~'}S'B/o滣噸,5i&s;r4])!1v,EZ8 DMOMg2ik:um+[J8qgI>wjZ߻xmh*UTH{^M[S4,kddDӍ榖VY킚gy)S{=۶ؼI|'PM7co]8(J672,oE~}.`0BN{nT*T5Å@'<ĺM[ NbltOMMeY]kb<{^Q-J&^W״4+W^ޡBPt8+W4uØG?Zh[ѩe( F ]sK 7 ?Y'5(vo& 1a rlgg ڽ.BEss6uL01 OKZA₅ %  ^4)mݳݛDm S=1#vCuH C-m 7cz!=1&~,LTbeEy~·7}?t!Ϝn]],bժ*㩯w]ѱBi*clrjZ\κX,#'DQD#MMMvf'n׆ivߏx-TBy^[Y`,(1tox;0>_*4.R(@#ci-1(rU5܄bBW3,BŜK;MC==o3LS׵rY1L2-˰I M]35˴ èцia]vO2=|SC[eiV|z.kM %&;v<ѰtT5es%cj"KilY1n;1fpX0MtVMY9TUE]hvfuj$\k[fS.HjՐN;*VrXkyᨕj.cCe|>\>jnk[/Fbqe蜘^j,YЪ9;rutb pX'>/ijjR*K%@>v*AWÀ@ }`}I4ӟxS}6. l6^Ե![)UVe@v xU=p7J$ nZk}?߽[\ vz88C¡Cu@|SN!et]w¦ m G>?8 VU'ί #5\ZIaQ!X A" oi` ] A+Bں͌.c b1J,bY&O,BnM9NHŒqp(1Ry"L1LI|NBqkM+P``&=¶ ]G3b׫Z_쩹y-*iiWy90TTn [ȑCK;/PclvOY{]^jlFr2,eQJ t.i,h=[VUkѴW)1ǶdqUD8pC^]r'Wudl umi?yI o(lx$I" ߿bb4-.oݲ~llr._4MZrbXssS  r x0JMJeKN0揜{^p ;o/}z۲}$v:Ѩ|*5C#+@0$=k)NNNwt,xlr|>eQ].WZVUfI5˲<==FeY͹wLG?^/w SBK;Ɔ:PiϜ>MŨň% |*r~|(8cYSg z`cPF1w麒HBc `xf()3 f2&& ]kWp^$إ !|5S}g9U\fdtu$"L@S}ɦ\T<== /q%˗fwvƊ$j;$n/>'uqe=:T`t $ KUo?U`KkiPK}8,i(J)aC*e& |SLmE1 /2vxP8>sCǁ!P n~nFkʶ|ƋմFnoSk jPMTQ&0ơPȴqc$ϵ,;DOf5~:Uˢ0$B[Khx|]md,^Ls҈~׭낁ŃU0Ƶla-aͽ3o(oF^gޘ<a8C^:/yg_| __ &3o =͵y6Gu_~|YUϯ]Il61:d)U?sci(2 c5e],d حKaY2VJĉĉd!_2$q<[SE;&%Z.fa0H6RΞ@Xs}}M]ӛJ 2Ɔ}x|X, j8& frYe4;;;%IEqdddhhhzz-[u;ݪ)G^=PҴyzhBOM__\N;P33Kgd88xt]+XCCp``< Ya$yں+N&̆7m63c)S)i /μ^wƾ$"E$Jjkv/QN쉷q2c9h3dh|%/-)(Dq .wޗzhHIYv=8uU_U] d d5Uvrs\M~̺cG0`gc}C{S @H`33 wV>97 sUWbb@6_˜gsL$R+b4464OKbU(ۆmt޼iIx.MH0_fEU}wꪪЬt9 fRB)epF̜ Y+F1N X0+l{ f Yѥb!_ȗImvfQRemD 孥22.Жh99/nZ@sN gth ?: eNպGo3gQJ_|UQG?z؛onW%ݷ-[g{3^|B;vNgǪo=RJyOes#4;9ʏU/Ad"v0W:rGnz)_챿7q97>OBs/ϋgIuN1 %ibcLŚښZixB/׷m3~vly7vYז!G2B H1*uvy(~-5kz[lYrdY.gaЋ}^uurһo.X{p^q2 4ߠ5:A/_t8/YUY!4fLv \.W]7M?ǂz;]][{%gwozO](z.? X0 C">=4TL XhEQUwviQ[.X91 Yu;UmXZ."ezٖ|WnSn @ѣ[_?VVl8Odwu{>+t+2SgFTD6ƒ7`D8 m2Zĝrb4xYgL|E9lֲRJL4 #JiT !T*$I\n]/r+7J5@ueJ܂b鵞uB,+~vڍ%: ihP:@YdcU >eI;-9p)'") FAf 0Eπq2O`l֯ ˳Y UDEȊ"K"F(a( \p$bui^ 8~M:ѭ:!Qty(bѲ$JHmOgrƹkU{}&)jf)ih `iZTn|lӢ(~󲰢(BƴbԆ=@t:=j{ú{=`*h B8S4K2g4#2M)ar%OGO<_:bx%#QVw9*-"dfO&O;yDW I fdcǏ?Ss}aOS)EДHUhhK96RWW78KO'utKSUB( Jmk7 q>zkk clph6rt5۷9K$A6K)KF0wEMa%Ց;o yE2r7=x73 ENEB $B(7ӵ###WŅTUm-##DqJcnAM]ym62er,JAޫ^q;'RY]UP  (2>xsǮC{wN q3W,iS&ˍ='鬪(k֮WI%J,KaBN*tttر#R]*):|)Ba6ļN-Fd"I1!Z`. b8pFѲ-yؼO9 gֲ$g\5{ Ntu%'h9 ER$ 8mj`o$ ed"-3l?88j^[{tQ?E@ٻw7M8tPycΝs]ׇ>ظt]7<:{ֻGҲ@nȔ1e 6Ν_yһ= {ϝ.SKЂXlxd0F] _Z(GJ=>G%hTQw?007p= ΛcprFo{Ҷ-`|U]of$ITYFa4v:(riN m1&#C^aa2>_BSʐղHGC*YVAfPB[!⼈N{۲v7X?8\"Y*8\ X,埗0h ..Ej#M1Ns^8Tt58l.t:/*"@@XǪn+XfFFF*#G "X!τd6ke./R0~R14(qZN@0d%N-F-F-*I/p,۲-y]/~c=idzo}ŹuM>eCaݥ"KHPHtP-n4j0 `#>ߑ=𠦝Cr *=4Mc|x<#=~۶mӣK T3>wf nsT7m+Z>oxuCHD"<őѺښ%ZWWG,f2pʂ(J_ǘͅU>d^:;AsEʮӳ3%r> 2օM=B'[?~dZ|Qө#Ag9%0l&7Ԫ;&Ax+JGF*io߼\.EQ"u*Jb1:5Uя~/÷"š &Zp>:|pɺs2S3K}jv|^k5{NFl{:c2jQJf^9$ѱMVA5M#-xu:V-7cvvgtÕ4A@wwP#7@47$lx.s pv֮Q>0eXijm༔'O jK6]?3c>1vիV9999uu׎6aVUeuaF^gWt>%򞷸̏DTuu#zpp0Lnݺ3c$@B'`OFF\!Lf0~ے 7׶ms'0Ɗ"{v'/L]!mb6|(T U^H$I,"YEe)16D!:! ڛt¾3@ IJWߑLQqG'?}qO024Dբ2M02B2J-әD"2`]<7͒2 CGҎ~vwhnUdӕfEQ.R3( `s`qXRAu$Rlpż.QohJxɮk_=\ zǻ{FwIT^"a(% xaLc9YΎ8ط{Wv6 gRlx+7V'榦×UmI2BEC[N(-!EeEvm6"D Ͷvֻa 07([~]yUF.ɸFo ;j.@1-7m~y˫il>w1P:;7i]LhE}*vꪰ *&%n\M(A M/ ISclN)GGee0`umP#I"˲,qUUY B(]w;%Lrϝ>;4[S魯[( ,vnee.t!PYd2LX4J)e!JY.LgRQNvZ:ָ7jfvͦk$2%Lyh4h9t2ѡ('r0ә?0=sbp ډ)>r)?Zae[< U^ذXXةѺ֖PUC  yF NnŊ&ǽw{Ph!yG3\ԣrU@8GPɮZK]wy._UhCeؓױ ~Yq3 Ej/sw~sxцbCM `!G6/T[?5B מSGgD99K:{߃?LOVd[o*E' ڰXEYAB)RFLdөT߼mc@s~,WgũI2<46IM+W<\Qwe8SN%fdž^ iwtl|^Yxo__MMFFF'~6y>u5T'HI,JehVpVw7wքB|>uּ^GMdXSKvi_F}AR.uul"K,-_-7]̳/X*_g/=\))fJtіJMS&r$pQ.#!(Jv;]- m55PwMys!iUJEgk WU5dBT6YREQ%^EA.[Y  NO'Tw\STA,ڌ麮9岑$.rf 8qf` XotAS-7=xm/b\Ҳų/e29gl}nWT̉;%fѼBGX׽ Ŗ?=:c-\N/_ՙ( l6MӖb.Ieuwww968 JqeRh=( Qhj7qCaqve ]B@\f瑓(\s: ]OD"gղA@`Æ+sIIw_[ 7^zYd2`4 +V%rWWU|~_b:!.%D7uKrJa4s")fmF;2!28^?weܱ"vL rQmVޞP,Z{DlHXEUU1NCQ7|kUg|%\:|z=Wlذ @r:62۳UmkvXS]}Ax͚3ѳ`E{#pru1U}SS}aa D dzZ"c,[2F(Q"*NGS5UQvxQRD.+Ft:t]@WV7,^XϸeYiXeY2 #%Q$QEQyb6^ Ln{oWE$z\J(PjQַU>e~*j +6H=K(.y/ST~U˫~_q{,;vX:v\.=/]gf!B3_/l/cl>Klj+ lt}q9 ϏBHefЅM4s& ul4^>Oc~v(!d[eD4`"s~0.Qee@y'}?@dcD.y>n3L&ciMU~Tq^(St4GKT#S'/='}_=F)KCx(RTUuNQX;WiK/-˚ 7_ kMS0IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/gui_normal.png000066400000000000000000027676041475757676000263260ustar00rootroot00000000000000PNG  IHDR?P,iCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N3&"i`3Q@݈?NdF<狓H[[׮^?)?)?"ۗ>-!l*0 uU%9#H2Jl4V(I&o.]{ᄆ{LcݶLD % #:jW>Ȁ:x>y__…o|7kpZjyƭ/~Q75ܹaxt0W ӌ틣ir689,IU6I^Jkkf[<ʣ9pQy͑fn\E~6__ȦW"4l=p43!s&B.VZրĎnZ1UD~y_Bo4;A~D _gn~;}Xm5M2MSR͈GKjswkJOzoϲ[׹ӿwc+ cIˍ3iR^~"VZT={3b E0]l(Cy< .]>#As$P5/+`(H] OTO!Dfe@2=x:UYINOox-%LVtsx_=wn{xpRB0Oǧyj͕֩tpܘ4 C2 űR+[\ sg.8lLFJ`niŅGcjstХ &ra"j*f=p5h!˭fUUU s䝫#"ova"Y9]Gvw+ܯ hjPp  ȒxrfңoK5a\ÄϪ_m_F9U];__~3/UDc>\J00MӲ$cx<@VՌ1J,Nx2MUge;+{V,AX̐Qƭ~g@Uo7b4 6 I.?<*hѹ3WLMW;9/OW_uV[ήyX>uxIfs@Khs"$u:VtN=bŀӹ2!ʳ1tXXKŹ*>TR,ȣYD mɒaVBTi `R@hb`@1i9 U ^`4\*W7PYknG P4e. b2cse0(Mg XD.mtqy%&j[@*bQ@ $,ݏJS:HeɏaRƎmɤޠ٨#^بזͿM8.$+Z\HJ(Ss͔FH)RTaEt6BՖCl4Ot^m? 0ҩ)DGH,1ђ[s&,Mʛ.z 3 `hkhr#4?Ͼ[RYVomw'B\)o{#:QZ8JjayZi$[ʧ<7o ږIxfol7"i4 sB3ff|ϲ|~>WZ_wo~}K?`s/!qGq`4 t |6^"L4xmzFAb,jIM }N:4 /zxLBYQD3#%+ ! ѫiEevڥ/ v)͸<ǜgY|HRIǕrYyr- mljEJ$?W|bE^lG$`89U)TДe94(sJr#I{ATXH ,\ױ{~2/yg,_nޥ< !\JQtdGQRC>w,at sjRfxy@$/g]1]I"] ұVvHBAũ IAiӈյ+.r Zqچ[mV6߸qJK!J0DWupI-EJՕr/8B hY[ E A._k54IzI8"~BE)+儇ีu=:4Z:bV Tt0%:k)K3\q0 [ F4|gJlJ-aFًgh?L tfG/S%nR*WG"eYX+z(cNS-m:<[4m!A.(rѭG> imPrd&Ѩ#q@,BNx8|fښQKs+T8Yxrs9|.Aӑaahmu+!JBߺukJ],4sePNpino^2u#wwZ/>p"ޟw1 PPY+(NkGXlu{^ooWN$v(1e9]?TTޅMol?w@ptx<_,+-Ig`0RUk RĥeE!rggX,,1BT%򷯿jZt:'D1- Op @tBD | p4hcc-,lPH1M\^kcc]70 ˼yγ^/d@)x<xcc !DfBJ )@K hW|?xW]^%ͩB o `gwX*.aR4{!B>x٫ݽB! !9剄t~ $Y$A8baJA2R xRx8M/LbÓ^پpՠA3\jW/6wUE'q Hȍ8~Bzq{JӗoJQ1& %jHRH!LpA3J91cT8KZH)%&HեX3!o7W]ܸ^n!xj\|o 㗾Jqp8BWەJBH3)eKӴ\*۞{󝛦e&qR(,Mdk纇n~\+-!dN)J)Fi*IK6(̳E|cxwNέ|vAͳnPE.H1j咱"'r!LIf0TIzu8%BӢV_/wkdY&qM&~~όɰ8-8\tת,%|;g] NUO85PZrNSܾyT)~'J)_ݿ>wnccIW8<<6D{/Q2L80~ƦzeO}W.^7UM,SVKm:JJZ#?8zBV}u]΅e+핧p0zZhևaSTѨǓ|(Nt{rd"2iY3_ރj۶mǑۭ. ޹J$JJ!/q5G"b RUیloos!,tr-j Qće@3&4( (4Ğe#?eecJ X#F\UyR[n xώXjr%bw: $1 x 3Zw:BdIud] )V1ճ!0c]tbOf P^"^~ΛAO+z*ؖ!ݰ׼dXG .FM^,ZB7IBTtjţ{S1i$abY""g$R3ۭmޫiNUkZWG<"m\X@,XӨ3AyKHG42VHhL9C\[d >[Zg'P2F]|!(T,P yJ!G6. Yzu1eě}ū{ƛwިk#! w:3S]a9 zIH+[ibINjhP zG'4U!KX҇Z%Ax!S6/*ZJJ_36bZ{0.Q!ǿ4Lp<^}p(》V.\< 2k[+srtŰ, n+GW^BܾyӴ>m hrrJ)rSZ!Ͻ|$NO JG?:jNcc 4wwϜ|ms]7ۺ<88ISk 6@6Jkݜ ,?0=9\P݀ՂGdM +h_PsX|擟<{mk-hr{_wjhrf?O~S[ -RE.m;nf} IheV1B4IFd2%^tm7pr^w'OC!QR Us vBeARfsqՈ3#˶%\2ᡖ2.8&đTQ&$ ɑ.[UGSIP,kVsd4!2&&Rd]x晳7n0cnJ!jtL2D<apw,>)Y:XW 'R?u9s-g0guUfG B`4n#ݞS%EXϮdݻ]d2PH:r I#ddYbfhU{eL~ǚYα-ǬEM+Pb NE`A %R R ~J YPQ x2w 0xz IDAT`? 0:L$ 93Vb)"DsZt 8KPf#?!prx P),ӘyE?R~KUZW/<\K?Ǯ֦eCIULTְb&w}4gy6ouRs৞]w-sMp h YS1DDØRnuB[Oc,BxvB9{#QTU' IB3BL7aq!d3E3 j*RHyS?|FGW)S&WkL "TԲ:VytӐ+o߿qѽ[{~_gO4=K3ihHHݢF\gK/1a\827LV/ OT8̓.u1BNg1t{FDzn>8wY9o<-5/Md>+|+;TRwv,|&kϜʾڥI۹W'I8Mx0ɕw27[UB F3"SԪz|(oBV0,n6^{Z-W^9UuDL`PhS ly*Oi=XnN'7*GY8kZ+Pg%lTwsb2l<>,8ec?ݛ3Lqt(ȴxf]3Vm4{{+wr!gy 8sC, pƎG!Rdi$B|y7,OtBvQ K\><,M{,@7ӌ{nڮDžr!xpi4g@ PF^i΢$ )W,Q8v8& eK#L'?0qJ @~\KOR-8I4m'gIBQJ)] P7!$ @`4UbGBײh@ ND ]`sd̈́6IUdD+nKݚC1I)8Hkf!* r||3eڋ>apA9wnyt1ꬖ\bQ@Zu+ Ren&; DсG UHo1V)mZf4'3ۧ Ŷ=xj֊!TEYȰb.eVjkulGýig_4,,:ŕUSq?lr8MlF^u\)ǒ?J3~o|&$RS۩ <:KdwhriR*îRG}2*YRQjYq}"Vm)B\(>I?T!s"%_C #FtM?>4x11*i7vhPdY{XiBfI&Ej%uh xt[0SnV4?F7n-TŏL5$"s ]P9@cRxНe\倾/>?9^ϽxSϝwi}43J9B{oxpϿ'T)=<͗VNrXe\HRF#Q4˓$u ^Das!R BȔqy#iN""#LJW|DkB1QGP+e~0IF"MumؙqWRKhQsʧdkK׊?1lJajW~P`4 ݩ.i/ʦ&i !2h8߅&4t B( 1GɤPTU/,R[B(W~v{4ϭ_lkXW鯿b9nӳgNjm>- ߾dsgx)Z<]Ⱦ̅_(-V`%Uv~~:MJB,F$Ń[C]ҹ3"Ed,.8p2U]80AZ3,s~17Yrz-PhGILe;﬜P㺭[X}傦9 z=.䵏}rѣN|Z]on:i~'+e"Nf`P_iێk9^jmog\r.h*l՚-!rQ`>c,2ʄr)Ye9B|2!qwB5MܧrʞҧKq4u1Ƅ M1&\0|?)GIR)c iq=LqK[H 1 B4.h6/-dG{AhVEWB >MQQT$ CPXɷrܿH"}/V{j5,}2.@rϊnX^O(0m[u|xhm.ע!(/AD3R#E.-[p"lQ*4Iu" QVpPpU-a<;Ü2$9U1Rdz\u_nos?/_P/]g-8GNi-B[i2'?ŪjU ndH%!hp&JNҥNpT}h 'AtHxfBP5DyNGXQCY,--C)42֪ łwy,wN8g/[.98.U<[AFT% j:Ji.1$^\u]WJ-M!J_ȣ0' ;8v,Ҽ l7m2!Ƌ*K/^h1, on0NQg*vp0s]F9y>HWSjWu+^L;J: WzkyhOi[v/_ IQ#8 ~ٕ< |Q-)cA[^ >heJS(@2l7`&rfZ9}Ԁ z}()?:3bjҙԚS.&`4 /|wnk9 b!l2:oW߾M鎳Kr]~ ]HIJsa動©ϩݹfjl}v|fb:UI?:jTM|ۖ2ӽ, ,LR8 ^ 2]E[Yn>hTqŻRm ,iy{=c[{ct,K8gr QT%K2'-gB<0\5,հ\-UX'S}K'K)L[{"@sP-OTӊ 9ɪD3\M<'k1TL ("[F rnB%ڜM%s#$c DB(sC2R0m1 墪(, H%HpK[VݣZSa$9j ѵ"&Kv\wb}}y~KAAr9H8FFvL14)"5DRطn4ZnM$$x˭{3j DTa؅߫ {ӯ~ M *I RX֒ ;̩Ӧ5?"oƗggO]\~c۴B < IBʸٿ`)П} s}~f `0Ns VʕP3Ue(C|d:F1$J^Qmϙ(x;Ec8QE9)燞V4S Y3 s39Wۭm/A՗TƵCC1yހ&B#[n.Vںz-TVR\HZs\/ HS$!N9 &)av/]+ ֯oka !LTӱ} pH~ Ga'R|d1'wh1$lvr#ׯRgKr<O=JՈhq:\ױݠ'N>]y,]2m Nf[ǟ}JNyq+^8ą(& @RY^[N_n)]X[|!8s,Q) ʘ, *-ʾ7yK$!rqRهߺ& Cֹ/d2n[#kڻ4)9=A= ;{N|Y {Aqbd&1kfiւU~d*L1uF5@ ֶbqja<>_;+gl;#9ZɜbDHbWJ>]1=qB8!]gC,Z*b cIBB/qp ^ Dm@ cwbE*J^DF42a`sOg#?10b_Qs 13B`YoI"?B@c. T@#Ye";{ɨ "[z%)nQe-TkWׯ\L=gK;7uF&D!M]!K@x> ѡV>0!|v\Ylڃ^H:D ۦlٱzI]Tw{w뾕#CRhԪlfWwOr-2mG8E)h vD:*srJg;7} V+yn5nݞeMU$EQO_8sQ" GcpTDPЃEI$Z!deA vcr"sQإDᰬ(j^J jplFd ("I|>)T݀ NRL0d`Ǯ"b~pN؏~9 KȲ[Yn;*\ѳjesMݠx&׷{+ѳQ{h[~& wvgS|$]z/GB$ Q>'+vқ-g_jۏ>rǮ\ZĄ1~v__+p> J2kUʖfQ +߻)QdɑHh޸]}C3=8q)S Τ_mcɳ}o_?phJ{ZRTVdG9Oh4dd$Sx67kȆz f0=r B!:, 9Is3)/Zôo'CE[Q+}gE ~cDX8Ɗ9V=Y<hsף^^,~h?.p; $k"1X DhNH_!6H" ,D6e3M/˲*{AdX)wa P$1LGQhOzӰNcy9wǽ(QD p]. <@$B"q~-yYJEE3Ѥ8R)-^$΅0L& Ɛf"ΔL`֬X.,*3Z40!B)FAMǵX !bo9݌-ϨíRwnGFn9NzFN#om^; A c껽aRo(aŊT.84,rl;B IDATn5(")JHR|ҵ%ml^QUC+Qd .gyQ:üJr&$<2Vx"/on^4(Hpp83T33,#()Fs-'6hZЩq K$%4Q/ 4'\^LBsB5_AcBr$މެ5P*XE'nܯ eXDBnկVuxfPf9.."0$YSG70t fW8Cgp6ɑx@J|Z_ WuBAhKo\+5/u[çDC5:<>/4 U$?n/׾Z[8^(fT$"y:!CG RJg57/yJ 7UfcI+H >wkowafuUjtCn cYNN=Ob'>'1b8ٴֳ;yQF?~u,TJ s@!67Ο}/%!9|_Z7>[ = Gӳ!Q4FUfBi00r"! D 9O Oр~HEͨ~ Ov5gaK1\Øb<;pzv<%?~`FˇK/>Amx? . ؋nĿ_TY/;;|N`4d^ O7=cbn{szV5J`@9`tEWy5a"+(mʡ?1%%~Bai6'iwT /d,t, 9A0>˜7$I$БE\eUBB'.C~N` WELհm'gңaZ$)grc @^cB=1`{=ty04dXM'aum8MyB.@zKuR'7Tˎ5< !^P.-E8CJȫXLs 1llᰞ/$U;{mM7 Q`Oj49دoo\5t|)8@:vD3 +;pBq͙SK2,#{ʒB]WIۙ:ihe ?ϷzoWt u5Hسڻnl!$ %Co2:*Cр#<Ϯwd&OH8v0 c|#PIcK'٢rԱCsy Qr)09. ?>9ƨGG@!̠i-8/TJs qF$<b)_km^l weVKs{!dB:=/eɬ.+ĈU7vZB4M5)5?3&P ?5]N3oS`kmKl OLG tzJm]5KHx{g3]ZZ]^mW~R%c@,PFWVv WfOD6hp55<;ڍ^õ'Ŵ)!pn&+GQ BQg!f08qழ?cY;9Yy(ʟyo0q$9MiCqaǡX=`*X"|%.aN.=2٢7h<3T@\n "ZymiwriSÈ If}wRTJHj2q8 d0$4 a@8bb` 7Bhu &.(\fhLb!r q,tcǒZ^>[dg )6^D,5~.Z{(./ˇfRZkb^da0۬d$ a[R"(a= LSti@ nHK7=Ur/˷WfW">.8ė_GLdԫ# 5Ss^Kb0v^|7 ~ ݦĥ|p4GGƞ^Ƈ=MaHt335ϧm-啅c Q8}흞IM‰ ЦA!_T%0yRo$i`Nd|"Gltҳ*J8H q w5ǑQXdM d0BvA?rw8nc;ޝ-r^)=z.ioqe$c4=hc)cN_@J)1H)@y0 l~fUpT ?.e#i04 0fggp:cZ[qLӼptVWWiS<: b<+1ezJe|'o󝷮02x3UȈ9qۭayŲrb*\&Fnjti))₴0Db 9u1ƣ+-YRl1IJh E(X>l_ =KտƟtnXH3;mSoɘ)nrx-7 ܉w~?zgF;QC#[xꛯJwX95rWnuVu4t4MɤT:981B(wyZ+-j8'L4&I$ j <4SB^wt}Mya"G|>\t="v5vw C'i:$b?zE*`>vx/xnAS LjarR3;ZTTL(DYAct /r0c0C8B)  qQ`_0%q'@N sL5cCTz;Rh4fff~$D)ro{ '-⻳wK;G(ce!ji.p\]4軵Z"ݟ1\tDٶ]ղl$$J<_oݺUT ۔Y0ƍFcww~!433/Z5jZX|3%bJrf9ٻ~S'b9>Q$K٥r%^ݯ]G$أ^9KM")IBI4/ic'1E?pK`BDQ~}2|)Ϯ>Ofg5@HBQ*'uKgNiF* V!% /rIPBWboBiQij6+~m +|od'>[usRrxcz{z=Ò՜he?Hil38U͡Ϙ# 9 $sɄ?O%K_>1*sKrZ>ɖyZFNӰ x!dm70zzibOIfvβt|N3fw߾It^%͗4N%U2ߎ.rTTqoF~'sw^˵ wo1C$o]|LSEtU<=7ovD8#Ň1ݱݍ@rb=  &LBUխm7w;!WHҀ0n%e(:AQűnNsEp@v|=rIt$_zmt ;;, "1eiܽv6R!✅J!Rz3AgV֗s'0c:OaB=0:MD%4I$ $!tZe莖yO;Sƾ>CV+I;0zN { S{&7nܰ,kfff>}ׯ_/J\n`b8^L[NuSf/>2\~nO&|0OakצaMnnnV*{# ]'Nxr\/bXqϼWo?s$׾{R#_*-T&҅q^)F70t$p!BFsyrAPB<S^юe`r坡jk=QnKӵεKR=؟CD9%ĄL&wIw/K:a?[vo%I!I?'Q VI!c@0,N{9H}?L.)ʦ=E~ >p OZ 1ݹW >dic3fwۼ!I[#a̸7iD4I0Ҋ6zv6`ȆEH~<`wfr=fm}Ȫ$+agS Fbw9L2 NlbYIFݬQ5LC`#'r}@^Db& > HRHWWijSycnqFUǷ)FñĆV[.F2 9sz;T'{P^ I}K(bnZ.7f>x,*4[7ۃӗSMǝ#cVB*Shh ^K7i.Owv&ā{> N?r֍|!qd;[‰O7[v%k͔J7n02NsaJ%W;۷jF5\> H$ 8 Tq;;;?33spp!u]dRT0./6(n e'jqL(OiDvU+s! 7FkhJ*B҈3@T#L7w1V7Rlכ?8vJz8ȏ'n9@xg0&11Fes)AR;3 R{Bv;"~1; n3?~ 2V{4{!ϟ?C?|u0$IcB|$Iyz~鵵n[(0|G]c݋RzڵnK9.TUZ8_W|AءC:F~&L&<@I\pk_ٳg=[[[_ZZL۶tvvv(S^\.W,){xb۝[XXEVMX^^H=z$Iҋ/HRaVVV FS8t:fA666$y øw|;wn?i@VܼG?R ,?O=뫫kkk7oޜO/߿zN &NI>Ta 8b$]͟=ʪ:Γ$߼\w۱m]L݃ÐFA,]!gPϋO6\7ߨJ:ث=S(MSBjXe 0q_N c ?o!|%s 5N&XrpK o_ !Id |h^~p!yo sIdG^XL-`R:M棽}GD"%@lV].!@y4xǦHq<]#7 [}SY#+RR0aV, DQQId(\[c4v?^~dNT!B <l,BRs>H8 B;EC>ĉ%Kzk kM!%X"( G:qihqu {hSu*.M{nCUp6A}#=9= Yx8$w{ttEL~ŬϿvՏUϝ;AAF9*V SRUbՓJIΡ 51JEHDMތ8Ӎ&za's2ws+ PU-?:bEIS|ܹ{._*<[]]4q8UUo lے$A"Id2[.9[\\4M=N'Jca$(ZXf=oɓ'GٳgeiZoNRI`jTZZZ:$Ϝ9c4pV4u>|MUU^:e@EOߨiGy79#gqu]߿rʱcdžٳgc/Oa.we1ƦBC6ͶZiP (~ -l@~h-//PJth4r&Qq8rA$z]UգG{8EQÇu]WUGєj}ulΒwv7nP D$WokFJ)/ Hq%IBc8(5JoR)EQc~p(I`0Eq8 @)v,OYb873w8lJ Nu 㙅 $<{?176|{Z[}p]y~uPŬrnplcu EEE^h4w6]m4S^B1 wY^-<[o\7On˂xWl5vlLC˦r/剠tk:l 'ߏËPVMQI<+d_<}JYƛ뺾3ضi$IJaw;d2R)HiG4җ?[[ٳ(:;JN]sy9/W7?y[&olcG&ˍ~O8{}Api{af{QzsK%+rݍ<#,n7)..KA O߹nFOcXD?0 eZFWW<-aeyR33.l2\H](J j*YZ [mtxr0-}܉Siѿٳ̲=wN這vЇ^ q0E |v)ʹ|H'HEQK7B?D3-̩`2""θ1v0if$u9ɖ"&K[j,Jo,3H!xS$ {e'8ECR 8NE, I6Y"!, q肐8G=lʼCBQ:]ED\%IpL$yXp @ dJ qb'eB Fdf Z*8AWuHAf`|CgAE!=jVw{[A8d8JH V}(pjG*IE 98գpٸ͜:}zD0g"V*[7o7'8 B&36i]8ڭu@@Z3%ƉHdfYY~|8a$ pL(LCw0J0@Pi"];'~H;nRKL̈(@1@ *̔fgܱW?h VE<)p\Ǯz8Lb̴RJԧ愱 JF~QP*lFKyk^@Y23b:W%3j4&;N4 c{s =C~B4$q FAQNmg  /ދ4Z^B;{ ޏۇr1!w']eATUzDӴyzcǎ<!4udiZũ cSO?~<4Bh&4Aq7m.rCM6$IW)YQ?|z_&DDak΍wVsOxQr ]N~럲 )2'w^,&1~`cfL\h $ vtD'@1y߇~岢(9rV=cض'|c,r6`Ȳ:{,̙3ǭ݋ (˂ (2%8=0aڊMqҡCvvvt]rY >㹹)3Ν8n I>`F. 'Nd2jUǏommr|8y~ee16e`~~#itz9B8 ?iA>|pppرVU.-˚ruԩxc4 ?>%י`fV[׻ th4@X"!:$3 ͬcو iw'F!;cvWH$HJH$K{ޗ?.I )nʪ|'L8pX,1^ a<X?λ7;GF*])2B>'iZRBDK,;OV5JZvbO{HgG+&]V1KT6(4|Yd!70\Ƶb(XD3-7rk-儒uG$EP!,ZV{kpDpdv3ht"PJjlvVGHiF 8hplu{{cBР"42hPkCst6+fW8B;ɅYêF۵Cgbr|$3e ˗/oll[4MUU8nwIƐqy$IdXú...;e9eA-RthP{a~~~|||Wpz Mӆwsb#ðj L&g;#GWQÇ:42177n{2??tCT*}oĻ Z~rfVt:>0bWzU\޿L~6h6~Џ^Tl=իam[|r1vʕM^zX0*%1 ! 4 ##'3rzm, BB H5I쨧e9!DQjE^ߡxda&z"q N>|7F|6~.ͤR ޻'RSEXshmiz׳LFY㮙[L7 qoP6WTh0ZRjY%mST|6@b"xkj.\u\:3}oWr\Zl^?V`L B)XגF7g&gҩe L{ bDřLwgccرcy0*J&!c=σfYx"韔cC?{gllĉ/҇>!˲c_{0*H;p-=vGGL&pA|˨77*w//A/ǁ_>QEleE ?N0h<?MPΞE>>$+B~ann ]xEll/.|n>"yJfB $qЋ庫3`@6;Y,!aPt$#bqbboQD }iG!i^)ʔKǧsKݰ!\(z˃0o~gʶLuuO6֚%3% 8:52uKҴł22 %DRHE_m+!3=bGN<ڽj<_ڑIcuq,NfۿKOyBu5ϖ7=&ɬZ6QRF+wޢis+JWIs"y5-mPX͞* F~kuZo1Tn4(M4oBMb`EaDyY>Irв=8\jmljAA52mjéwgB19E0H.a}k !EKrb[02*A]jZ` Gu"+Ny gQd1[ ԉ(Hѣ4 cvWγ/$ b!o6 DU"hnԷ3G:FqU#scK)ubֶۘ 7l&^!Hքb9V/UkUJ~Ͽx %dr|aMt!a Y!woW֓ ~yd:yҀ{6Zvu(+Ge;CR;z8އMO5gvdš.ǻt#^w̙j:-Cߌi7xCQ]]}q-˚____YYГ05sssc<~fmnnr7LY? >tm=dB$tT1 vf(K +Vg'y.a嘘)Nl`!oH P\.;>>h4sl!iZKsH0Var [,nh(?0+t]ז3} iR>ʀͰz|ad? 4nekqGuEGv ܬ_^[8S9=f9.S]>-p Ha*p0bvJ\)"(q6|9~.]LE>DBkZ!_А08DKa0uEY:Mӆ!cH.gM'Д(vn(j6 A BZu]w(D3"H4ZYR6 |B?$%B5%;?+s){ I90 '+)! 9a IDAT TՄj0" %YTIHo_wyQΖ~j&cXK_#Mӣ#񤖐yI`RiP ^$" RYɦW^[~{wڕ7K#:^S V]Obr*3;ZgKˡ  #vH\#e@4ĩI{8}ŏ^8˯"I)Jk"vv:KgD,.ca+@E/47v}BA"j1&$t]tx==׾Iz!׭JzO>9=EsYEZsNBZQU.*`5{}U.,(jJj4n `qp1#C/B0|Lûɤnw|K3¡{t69ױ0D9"oSe /̢fovAp:ıjm{=E֮n\ٵDZ ILgO|˝A;v__ӓDC*J5>~HA%F%("]^.iqQ%,YwM'T>v:v?nj4Z\b"رѥ`qrap$ǥR0 {^"* 0Mq\}/4v`ciiztq7tș3gN8q#G^zͅ ^;CY2#kEA]W^_kֻo]aZƍ~k-ow^wvTszgq Lӳ)si6{x`=t1c=Oof:>wqü]z衋/r-}#!AuCIQXܩG"Nqk6tkNM+;k[ynR%׮ͦǛov3#5ݰt,ȓJ}ߚyducUVUŴsqf}ʼnq*.#p;}aA)S8$I}sAc\%s?οt+ϟy噅',spK~g_>>ΧY [&ɂ&2GZitnW_[a-}):9>~nz>0[+65tD%8H( %)pqE RtxL} c3h;^ԭw" sۋag(8[:GZ=Vڼt.3Nh]F)U%\.aFz&We0r,Ks-G77Z]#ލs"%B(QZV_(*%(2QOXH͆od~hʼsR@ѴG:66/P"J"F*l&`hV0xWb (׉B_ccPSY B XězVDEMb9@a|#4#Rsӣ]AQiM}W,kkkC^,ϟ/J?ait>I~ۯwEۋLO^|cC sK_F1l5;h6QBVU11 av}_דN'-ˆA@H<9QJMBuCˡJl>#$C{mLe+o>6cZO{͏eٝtbr֪FS@ ŔtiTJNؽ R]EOJsb0" NX)Dw+rOϔ!.]\)䋚&\]asZsLҢk3 | =9y|v򔢫E?ZiIX$ ƍ-~0]8^(qp))O @[g?vf-Br1z[P[oSUnm BbJkuy&uR.}puxۨ^IckN ߿ruߵkGo OL|s\!2ܐ#IC=oCW}ncYUXSU2:Z HN4YTD P&l|ċrێ Rb1X@a̸et/.haX鶝~g2d"˔:u#!oF')g (ի#3[L {8q>8_c8lF.]]"J7*~q?;whrcńk1a9F=6^f4} 9r0xx7 !{R!VvmO7}UU W_xuoD?B-#$5Ii Zޣ}578?ym|pѶ Kcеtg^}AgEi2uٿpJcZNg!^[,V+xJeLZVgZ6yIĩ:\(4cABtv-FQ"&Ӫj%3bv\q*zB+B3ʓL\ɲ|}})}O=B(Zr\._B|f ՏNd( xXpݯGEo< `  ;#X~mz 7x-b4?X< ywј CO Wcr7{s w (!@_ in*Anӄe_k:T\oy'{`q" łbNfD"/ʂc/Ѥ# la̕ a9X2vtu^;K.zn}sE8hDQlEAL~;Z[M..:ntlϙ,LEft2V3l11(SX!f1p xax YJIzL*Xk֪|>'K q(heqKqLW>4Fg?Ϳ|Cҡ[r{},GGoWb갘Ki#-*PL0U-v+קw?~gfrҕsL{iaZNrb9qP)M=kC$\J$y#mٔx箜El6k ŧHX0 UMwڽJm79(J41$0Ε؁Ƕ^Tj?z<asHl6|k//'F˿̗o>v;-!vW}׎m!3e-;30Hiz ^*믮vq~tDqSϦC򭆁?56c vîqhi"zq2bTF;=;tbe8oP#^cb2%IQQ+O`AHI9^&'0O<zHSNҬy~2\v+΀eSkCAwl`!9ynll 1?Ї~7A1:::,ӽOY~g,aaHIFy3țArq=xly lLy"ug&fgow)BW^%"*~*"ƸX,Bq?ϵ۝ٙ0  펌 B~ -Qf \lй%Kyco:N%ht(e8 V"Y/HnȹGgӷ[/.8c©CsG-]i˶#1<'K.f2⤋[ >'zm" (\lCqm!7 ?]eHU a#0<-. >b*dss888'qR\NN 9?%dðvONBŪE{nG@r9\5 |ڪ눮4U\Ӯ4Wl*)a D$1Lz w3D4OPfZzfn$5;R<:Ab& V DS!!,˓3#aN`CBAZ2]֓EZYb'yȭ!Нw|>s 'gz[øwj=[hHJ+.enr-g/>s. ^ =74殞32@E s٤&|:ι4p.KVH?[.aQtnЌ%0~Sc>Q8?j,_hrfn8MdmoovmF 7aPz~rNgJxC;)FNm` [Li;)=Ɏ)9\e2 YF=Rs #E 9ۨuK_ן_lVUt`,1l6gtɦirG!?WN`+sN\n}:&_jzqA:xk qp,M4AX76ͨ?6;|Ӏ%[59-ґ@jf\Jia4LAn0{ J\u 0 HCO ;tZhult,,ҹ4dJP%;;$c!vX׈yhL)&˩4S &|ȱBY[Q~s2 sd^'̾=(B=JnCapbbx(^̡QI*&yxY;Xt>C;X|ڣ)lAfqOzI >mK5̏WU r/o( tC%1h/ѯ.~b"+迄gbbtq { {2?_+ % }0 Xĥwݛ lA-' 2'd\On~n=s5U[v.zrbFl$BFᐂ0}e|b5EyRԯx3գu.L&b(4ftgH\N*{R:{k;qBwOK(:<Ջ'@mEiVQDH"!p8B0\|Op}udrl1b啅r;(wfp\ĨﺃaF 7hkwt|Oy^drM) R" B8`tYt¬nwsskeceAKS(gff쏄Pa|It_dJR,O>=77t:N>eRr8-MLL y_]]=u԰`O?fΝ{&'' EqoooImt͵3ݰTH\Ai$z}|l|bTin$@ljR夑EBjO%3"$T:1~%ƘȔ8W Bf! J %kZ.E岌MLӚᡖ戓UGO.+Gl:0l?9iR4-CGoT[;n5crd$ 9O'@Ĝɓ+ګ\[-V IDAT*Ⱥ=Wbk`v8,l.SO"Q;-7)kRbMI߃NH(s,#>M55 ٴ*Vkqj6.891/Zm RtlߞAd2[pxK<0(Hɓ{gRɻUʥK+ zNk:tasc ]^g>T.po dM(jsgHE#fHv1CH\GAd*ɢΕ?BhE|`C[] /W'npLܑLviȭxۻ]Q#XkoK.-2L۵ѪUfK1/x48sEAB{{Z@̤(.eiQ\2D._pFq9e,iۭc4#06#h{ NWGm}mtwp띉df`$!A$ 4 ( 7 Ay,o_@=cm;=0 -Ql`%"{/iJHU?rAbKs2 {}Uo=z'&cB44>+/,/Y /,,,|d2%=|&R4jZ3Uw&ggsܷw#<jcccmF/7_/]zmܹseY|^Y=k<Ϗ///oH1탣'O.]n5o]pu8/ՍlS'^X0AV/ 5sT+/^\S SA 5y늢RJ |>JD"QUD4޶D[*MsK qil3|C9K/VL&6MrɣϾ0 BW隥BI&:5v{GGRJJjjPǟ]Ɯ" imװZ]iMad!0˭:FTTNBH]c"e&'^ |P>ח=2F @p~9 ,&+‡EHc`$RY4_è K:-HӔ 2iHÔ<u* J:X&d)ʆO+> &`{d@Y|4(dp$ 42H3+J-ۆ1><B×3FH;wlzr,i7|}CpM")BOo>Nw3FpaJo/[-55MvYְ鉖1<_⪩n%ZG%cFgPGv\;>vQo1W4g?Yϯ=MyZ&*'If]yΎ^9ѡXznh$2}|G_\Mʘ2R)I"Ct^,)lD& x<;rHȪޞDu'='RGk$ӓMt(ھSSanMo XF@!TG\B',IXpJ&:P<\~G~K}^jBlцy>+e\Ό@Pv%z3Xͭtwd_ǹC1+9z89-ՆWIPW2-4 %|BH?(ASJ:7I3Ic%ro4Ñfÿ OD>sM;s& Bj>c4`5[o<_`K\Tkص!uajLtXv|lqz"[8ӷ{+;FG_ywNAQP~R RH :cRygO[2t[zBR\.}خ$vў;}o+os޾me _Vב-]S-7pcleeck׮H$ )dyFchtll, xO&lm%r. u!IW"%pD޽^ۙN$Rͭ'rk-Rj4ʚ2cZ/.@QTJ c,|Jr:. e~DVVVN0$!4XPH͵JjNFa$p}+D 2QbCk~v#gjެetߤ~n{$` a 9nH ƾN k3B $9;^ˈHmlԪ`Di00#*R8y^e' eQW K7ԧ{\p b" a|8fa*4dEɎ Jul pr=%z`yy`pU2**wQn/},ݨ{uCQ\s?ؤ90f)Wm;8oCpȳ{C6`hoB=U@=\`(?GY|F~!|Dl?@ vgo1)^`` *?@m[R{ \.ZFC"(UnWðjU 1B^",>-Ό`ɑΎfy>VKBLݑl1cJQt'P e21D$qc89i1oFfz6B(x3J4=HA&jJ>9ް(.-_>y [+ jn)Lnj wA4wf){0u|">`MY |T:MI^j>w07F;WnTrGȡ IpFKdz@Pc|tM=yB>?4ɶ6 e )RT.ƙ܋{9|ZQ_lv$\hHTJ,Hh<̉=}&4.ssމ=|nmfui[ Ťi\j8JсTDIqkXVT&MW I0GԐmf_6cDG:ʀQQc2V8ե{Xļ*a\+붋lb#t'Ø G@ ;ݟ<(1YаMb hV*5*DY `0œ«ݱǟ?cO m=ohnd'_+;M_y/VKnc\>v"/]@m- 8o۳G Ѩe[Ӥȍ/'T1qr$ %KR}snn:|2CJ$k50F8޳^c҉(!fJ&KKm#ײFsm|4 QQ]t'yG-}rôlq\IId/ۮ?wB'>~h;_緢0(d:}q_y{~mFsטke~w"ڿmc:%\\jol}ʫwZkzn!$ۮWc.p Q ,9ݯɃ'.R"$ +699 !X T!'Ba/b3!EQuL IB< ^XVHrZ!qD iZq=snS/ @NNdQœi<$fJ^{>ٝ7ְV71 %lbiSUݪ皁煢 yY4$I6 Itxΰk/xUဈ#eXZ'XQX'];!}] :)/: #ۇ/a0FUPGRЌRCw"G9$`[} {COc3%Hn sU,<,B0pD~6Ca8dE3=Bѳ}Y:@RG99 w]fg d3 2x\ue=x @E_t*تBD a X7h|l@JY) 'xB}]^õH*jz69H&ݙSŴoGªWӛQtXƧJ6L@z: FsY lb7T (DEr<#2hsӼ(-0 ` !V. Ybp=ªpx|6G>[Y2{ Y~X.~'dݲ+B<]XZ?ׄajp`cߵg7Ff6C(ۻ{5 f߮]%`yyeЍ##=;'WMrР 9NǗO m qƥskY#yn]w/ " s =\r:F~OMөu }PU7UnG}幹r{:R5k~7Arn=r'.]zhRӏü̠cWeĶ#Gn)1F:d>ܝM{Wjկ=PLv:UWC'gjۊ t*!u^VmW(%9"Z-A#̙hZkTTzT(V`1')0xj>lь4ruY^`g㖢(&;A 4mx,{l0Yh%+w9RץmjsKsrZACeFR}ka.v`8-]3} IDATPeаDDsfu Nm,N+Vb-+Pe'mԊXT-غ{-ooLcs[#e31E?ΔC > PJ#/cBUgE*x1"W]hܺz(`Xo؋=I)p\>=Zvf;RFV\׍wv9}Z7 - s {׵V$y;?BXQO|8P;_?4Dj#OnnG2MdrK\iPrtL$qroY;'9g%F~'>rn5m(0ZM aI<<|^}9/رdBOO[?_xS4b 4lUnƓ'mMgZx65Z+ " ʙQEoP] Hz_w9ooVϋTUm,\t)ɸTmfrgggO$#L;zotbϥًop"KT10"1U3>`|ox$W8'͞^^Tlor BGh8B-+4աp@r,Vw X4pasyfa5U֡HbLNz\)g/ &!l8 cMۓ'ҕ5U!#}K>45J-~)[29CS gX Ν;il1n.0S pm$Xo QpnIȶi>QOo9xm \ ߂5o[ͻ?K] 1 Ep'_&&.G !;o8B.}?7hˢ -uIr"?2gnum i.|Rs&-Yo Qɋ ԨL9r))֝u.yryiGue`Fa)Ziz"*[ @g2KsIx|(f5_ӝ !+BNx0:xgF$Q ެnf)D] ߱-שkƍw_]_xЍ2N|l,D4%nV*{E~}xL$ H=b4FXSVX&ÄqUxr4m{,UQ4x?Iy+}Ho㷞|zn ƻ-%00b DQx zM;x^*90/g(A=}GcRZܲr Bw:uWpGC"s Q^CA٧IYhynslLht~԰EijM1xUkȎf*!s{dRA#UKPWOF J@PT$㛮۴吂 ti~v (` Pd*'+ɘIP+W֛-ЮU:G|\.~1Ç?5==:;;1ƹ\nyyx 'O<aΜ9NokP8Lÿ{{zFĄ$Iǎ3Mhr-ǎf{}'z{{'''=zVUubb-wr:s5ɌZnA- ݾoip7pvV1;cfV l5WVe鑿ݯzݭ\Y\tuSJwڕH$c=\4811q)Qϝ;H$v-qW ʕa%^f*kfX |vʆ^whҝQK'e"0ۈߥ.Q0љ|o4a8[4`^>uw$Z|U~}U!%, s<bbik618dńy U3TOsdL*j$Kh$ݴ5("EIis/Z Eh 3& pinYu u%3݈JiM! '3ssht# \h* 2Ԛ <@|LYVD[n[\W zdfléf&BݙKnsG홊*n2ľpS]>sD$_JI]bO~Sں˪d^Nl^8~QR>n2TDRސK=tW^O}NU|eu閝?Diq?7sX=<(s?|scvR,"jzp0kL])-{ ɍz ☪!' Ux189Nȵ !Q*3t;"IJ x{+6}2z,F8?擾A-}/Lx-kg206qYqXC(J|߻Bhn(lE\ !69v`xx`yDp빧Nt/|spНW^}oW_4=Y,捂kvq|j xᥥP($*p81v}RA++mnnibd;^ YjN'5iқo>#Gz{P(J%۶Cuݶ£8sssCUv{@3Jkz1T|Ftw;#ʄ(QJ)mPd1V` SXc$00ۡ?$~@3F|+-?664ezwLOOtgff\ץAq'''zwϙ׾mꕂbzwGX 1ͬLR+coЅC_jK^2r0MC  Z+U9Na I}tp62EC"h4d`cQNJ! Ji x*˼ȄD&y^H JdssW 1%0Ձo$wY$ M|waqNjU8fU"Ȳz[vq_[]l̫B$AsKHU7VLTPhĻkz+ݩQ,o; r*z2bɆ V-"L& xȑV1o0c!ns_w3Xy̡3H0fS>_8 HpځM7u}nW@vT}|x"W_=qűҾ}W_ַ&;8sk_ܻ _>c> Gn>l;#u2 Q >ıgFSݰZ=?_ӹ E8|…3aܹKw'~S &RxLiյVP^,Agඝ=}WsŖͪP8ٞ&%(A?3bVy:F Q nR JBaۅCQJճ6l+FTskoz{/\077?d2oe5WVdϛv\Yq>A0Bw/ȒSJ!5Y6G~YQBh3چ^/ʱ0{&{Fzb=HJ5:Zhg``PD-. K;Ґ6)u=WTbd"j0t16uն5"$؞趽yX s2#k KkSq%& 0R~>6/6 D#V"E-_Z4%SJ'N.YdrS"-͘RՄw*ʇ51R9-߶ ڒ  %,n oo4U*^Z̦S0:><^/t=}ޢv?08)ӗz?ﵞN5Kpy⢢(B,:uԁGM&rSJ5M${}dž%0ƪXAw#s8Q.|/J}}},?~\O}SgϞaE"/t:m:+!2hHghy%H&:Mi'OsA t205`E`Q*O q $ 4@K7T⩄\@Ndbm3k8p N޽{||̙3iʲ\uJf( bQӴZ6 fL\P8`MKOv V$ABy'.u}vE1ld8Q\Z¦% L7T@\VWfwO0:s!1OQjLZQ `˒FvMw)?\F0dQdQ ^(N]I)U)T7Eccra1!vܹ)+evO:ԫ={NʋM`FPW=buw%` XS5I i xFbҬsj"1UȦY8B뚏C Uۤ)=QdEeo IDATZ(P\[j93đCtIaS7+/>iT2Sryۈ}j4OwU7\<{ʱ|HGΉd2͇au sE uKw=ܕξh2]}] g(%~< _ J^]~j)Jp}HުLrPl"}. ݵgOƑ?#̶4CՕSKK+CܭE8ٜ꘵i̝~\Itg:QU>ݩXy&0!/MXBPDM!hn< Bca7#1#0lۂ@ Pyxz(`cr<B”PB(ӫ ԌQgMZ۵K=Oۛ܌b 0yߊ兔җ^z)Hܹ-QƔ+G>r\K zmQnOZ%wG4b~XBԔn9 #_HHP!`b...B(BoWB# ut JB ET9d]XX`0F2;ad˂; |asy MD#b:.0J}QԛDX9T$FHOϞH R0xއF ?r"Ivuha  f/^>p}{RǏmg F󛡐!d&"F-I%InPkd?m,bWWW$6xJ8[,72{}޽NU^9?pOc|۾~/G~]QaO?ƿi xVFb~CmK`@蛈N0ص-[?D'vUK'|4/" :?{lq ffysw۶mƒHjHQ$55UH؝YB#VfÑWfȡ $?uWex@h4 A26&}uNWUԗ'sO@*[e˿yw7r.{/Ub|pm۶]pa||ZFzVۻwor4Mi?<ö'=_aϣB *H˝֫-@Xp] KJ0\X~daR 5ˤh|40 h0ҟ*!qnBc̀QUԗFC }TVnsq͑XarOI@]س7OZs+u@jPRy¶ދyn_])M"{{iyMMŸz.Cnw$;v‰مy '=lht(*Ѱ0ǡp,(9!E@Qyr# LjJ@N3fxt][cUZJ|"j&ܧ5G w$I9YT*o!?3,䓏EAd(#B_s}lĺ j@M $D#}3XK (V >Vsm՗ԳV!x.Mo_<3sgct{:dMDf]<6{n QY+խ7 Vmq1}rSE !n%Nz!=qXzfCm#ZS+ o<Ǧ<eOv:0, m@P@7F !dD)PBcJ0}L]c9Rچ>V`~~ ۍD"'uqt6O بX@ $bL(FT\}Oh4Nm E͌\.wuv}̙|>?000>>nSn^jpp0LVUtvyT gsNՕًX3voߧdPԵMn53p0=3 NMD(5;ו%#TcxySBWf3'Hu=u8צ^e,8F+UjJ e6zT3֮ql7  d&߭8j<NgC{?6?\|mxD/<~ρ ʼ 2utP6їUt5te-> BX.TCBF$ ٰ]ņSB6ojZ P֚Rs59$`"k[ dQ*dZתXEvkX^J%!5g&D]gyF,d`K[7R>B 3/GmF4{EzӼZb6B;w| puYt:qnv4ݠ>oT=S8zKnd@TZYY8ah4۷qQnJa FˍL1Rb&=`XY!RW }S=9|c 'Ei£0Ih|δ1[< .<r) M^+o0#cG),ٳ#x|تLѵ%EQRۏ=jƶmێ?sw7ڹsK/t~&iZ\he˖wևһTzkGߨ+McsKv>P,+Nh:!K-5(MǷ;F{r|PTVRŢMeBVqAײHx)'v-]Z0ut>O%ux$ZnJh/q9T'^v;ӥҰp:K6azmg_? QE&dXU߳݊w)%)YZ-G7C QV*R=kZm H`9Uyɨt jiZ`rɣVS;e8/"쉀L'cFS1!0<)`hԮYQȎdMLHfy(s$d9>rfL(˪dT0l9?3DQ㼠k]F8(bmjN,ɈP9FTd 9V©N΁+)d>"I⣣#ȁd"fd2OqatAP'OyN&`MD&n5E"I D$̗7|;wrcDXzLK%cՅON}px Ŷy^.Zо{>n9)v$=GJTH& AEUP%DyNO3K3%͛2߀\ N '*ˉ0*]t8dF cɄ^aVB={s Ϩ5MQo]{g~["WX0D, BC0Mąs G9bN+QgFQxQL0^9~_{?=u'wҫq- Cn!,\wzzh9qn2 sw9{/zWsǭ(nfZR<88*u]$;v̲fA07Z\\v7?,Zv]AS9r~0J$@ԛur!<zn9 a5YeX^Hh6mDߵ}L ~SwL}_?Zpa)dymp!>.[ mgoΎX9ޒ htoXt޽sFOB`tN>qt5= Dp:#E u4lUXVTxk=g@eYHޱz]\²Q_ ">kLM;%U e `vi6ӳ ô9̽wdA( AQ R!M#tdzh'S6)tvA1L Ҁg e°}jÕnUKYȘѠ"?{L?;8665UfVZh"CCT+%_l al;dZzl)! XKf҅\8_[wD\rle\çd>+a(Kgn ]#9q>sGHP(ĶχyurCkٺ UUHL jنc JU)…T ŵ͋JQw DBJh#&RQ2% [) !kǞ;B*Hz.erI'R NnߺgבW_c+*AyS")1F[bD\`!˥9NyuI8 ]]F9ߔ==Ӏ4bjBoRq:8F/֮ ;da|ey<Cz>0ąᮩz3a!RXo= oX~H @닉lZ.ފ_"Iتc3Z b}@B4.[(|D k9O61c^4DIe8jֽxԹS6v ]cmN`3ʋ;vQ 塇W޽{7V7A I&V@(qx3 r}rigllLHRv|qmx4*eF PXA p,:Y|{+.6fV'ზ_h3wkp;/C+#R? EIIzbXVU<'pھX;5|z1e4eӛ>z)G]xR w#l+|v9 G'o)19C`bnq~Văa㠄YB$Ql0uʛbNIfRq0ՀUǍƥţ25!`"F*xKv;j:,'FZn+nݼi'^(%V uB(ϙ{wK CH:x-Ƅ,,2ˁ=?^UЦe?YO1ilz̯D׮x]Os4<{_$B|}kԫϜ\^&xwvW?-zpqz}uGv19Jarٶm(LFw[X6?twRF#Oz60d}Y'Xmiy~գ/\=׏>H䩹;#"#UK'A>ּ IDAT_pGm,Vמ:~_N,7ٗfYIr[ŮIJ*loie>)|Э]6{x7ZX@@ӽɝwmm {L$Lp;nǞ) dv)0"BiF $0 ] RShN7 B9NX<'!p rXK[B| q,\P,8HFEXhV4Yn=QXlLZ[϶U׆b'n<k|PM0ƽ$i~066 ;w}c[.y1:˨v˒(XjT56mTT-u{oZΑˋh"CňBX۲n[z24zr2Mzݳ5 |<"mɴ4L朿X>P$ ͖v[+Yr['5M/=9o P]mMPthK u]mTܖٚ{Hݲm8q,wvOݩ9fȞoy5cCG;y#G6ʮmvuMaQ} BeLvSØ0 b"ɵP [BqcgN# S1< #umUQ 5paum.UUNE6#}l>)|3>9wu1tlp(":LgZzi7*鵅d_՞97Wrg^~|~z۴ZwU@ D=WmzXZ___ DvݟpHV Zw{pXq=0H`!__oF"aD,V43eSQLHբfRt6gFlٶuOS<ڪB&3mp. stCWG P87rljbx ]ٲ)n!y[Sguk5cJe2e@6"Rl 5BxLcQ9 s^YZPN!8zo1 z=C!ha. W-;b/Եr ݈>{WBCT4!0b4axdI#ןr/7'-Vg# . ;7Mcy&D)5yh `G[pB:!: O|7?Ć` {Mr}pgOGyL8+gK5wdc-gO olSߧyB|Wv7N. M mcXdv}hcoV⎩w5%ϕ9pͯMl. ڽS'WVV߻s'javo}bwY v|G D_Xa(1YLMwtׇ`He 4@P4$#jsizA Fd%J#bEDUaOT0CKb6V"hR."UWO,,Kx+Wn^;zx[Ƀk7@/eYoT2 XUUI~&]m뺞$pr{By(ZM|޷o:a\ }ݼԏq\1r+|( k[\/e C}b5pck; @iŸ[ki15}։7OlfF<OH#YEHb<`)lv]UmJd"IFWH(* y5k T %K#F A4#CnԻI5v$[ݳm*3!z΅}S@ʸpEu712>VˎE6HZF=.' 8}:ÅMfg*1Dz=W׺r] Ųw ^)0m :D#q5Mq1mC2L٩55o/n󙯽9) ҹd0f$|۞_873'~Km>12RjԺey?o}O}[=~T_*{,Hp;a?*|Zqo2Ͼ-~rXo:RO˲XRs8?wx4U:+f "B=o-u>[T]Z2]߶X<;'(ӳc`<*-M þg?p μ+X]*;ƑNl[TUiVC.¶Jŷʹs/ [%; ^:㹎kS{n;}ed54wQ׺Dw߽sřj.Tj|||hh(x[0[o=Rġ[Yu=u{ӓ?#|szG}tuu>ɛQ1YT\.19/rYSRc(nGbkuŢ[] (lpjL&/NCs,x.2H"{O. #@DLz|l" q..b1[h юLHl4V8UU! (#jSBVNt*=Ko蕵@Xۤe5J`[ mpx(Ibs}5 |Rbȇف|&1Aesk4(R [sdbeDYpd5Y9.`ۧw]CeaarVBCVSaIb``?t"TA)#WS ʅ5>]T?YGDQ&҂$"_Q0t:+ōYݲ8?ޖ,FK'NF7(dS1S)mYWN^^{G9QL .yBTUIJM;> %d`uz2HV!;zF8N U'ka|ߣ !ض{qBVKkً}I7߈|l|x,۵k |{알+ڮ%8Ο-s_|FҨkP7-<|SO]?r0 0<-c,tZVյ9aaёٞ#۴}{qlúI* >>? )@L%M;j%# ݱ}m:f6_B&1<P%Vth"q99_ 5aEI֟6hrPJ7{%!xaJ) ~Bu~ Mi[oÆm<"`Z_%\7pB9\HDfA`YQ*l!߰Av,že-NUK^zִ]݋an[U{g3b7]xq 9U9X*O<;?[Ɠi[F9v.Ookyp8Ұ:dz[閠b/hVRբ=DQJ-Ӯ`W/tjB fN]7 :HT}[dH $㐯ڮcXǥh‘ԃ,TB$6ֻ,K<|{o̰vZ$bc蚣1I4sˎFu}+/O<==%}7 u۸X>J ];sZs7I_<7QE/?ZO4Kזy/7{zeuq~YVZeM;xs;w6Ks\Yg.7ts"37n9}r`O~f4994Ukd!xI)ZLjE2))dbkl%bXkIƓh$[s%պc|a}eV\  [4%Y W)_K/y:{P~ lM]][!ÛA{`B R*eo> ۺ2z] t^4ئFq\0'ӹ\{ rБo@f@TCdQwO[(x#(2 pͰ̦Cw. ^&p&} Pjd@tr~mRܼx,WGߕOȜ?x0,%+eQ|^r|=3??/Fޒ뺋 %m~Fz6Mnp䎁fy.~ː(>ƞOn?tcG9gEQ6xT*O|Yr,  ԏ"1"MۡOVb١lJYc<;;;668xg<k  zF iͽPu[]0rpPRܜSkØ7 31r%`Dܸ{ޛ{|$R  0`6f13>n1cٮU0T(tgjt@҉<0b h?N>ڵkO'?ٳ6}>efid^7MM{챳g.--=zW.[ؐ/JՒ,}k&V=R*}#{K$q1tiiiǎw_ώ "|&,jw L8MPi=B k) d#̉ I -H @\Lus,\u\]h[ qx3:pϞ*t{g<7wPO>=r bm6.7x;)R͑(o(PD^%Xl`/<~m3hma)}Ю;WF应s]x&\@РR,',r s[[^-cU5!㘓R-A#ւrm{.)]aԵY݀8 q8J29e{Cw'TAx "Vǂ$ރв(<87Dك(1 #d 11>_X][@O)2wِq@B !DJI( 0$c!0ˊ(T.W1wh_$ }BDo(n{k,'7ܪժmCCCx!N766!MΝ;1zfgg5MkbQm:Ɓ'''ok_OsʥGB^USx?5-O@Dò}J뺯J)s|ݩ8vOhmc2 sdhbyq0:$6 vlm?:JJ•3JelFG31~dJ844;8i]|c#/>wܐDǢCG=E Ęˌ s)cJI"`ؖMMV &aaCՆmf8bb1>"Ǵ@^L$) bkՒlw)$2R3:m}BDg>`,?!˓ܹyP QHI-3P.hNX{ Xve_`_O RO//yll̶==1z~ms!w:ׯ?~8Tyf\;?ᙑWcG^zN󶷽mppkZǎۦf/]T,{ 駟yqx ݙmE׮];sL\C3B{ .d^xayywh͕o;, nz٬T*wbZYYp͗c ^~~DG~ƆпtNxٕ~_nnOoY֧>OtٳCCCcwc;f}c*03\]ˎBAq;t@pvQQ\ JBzc}"lH2Rm]K|[|)v \5޲$  8E!AɪmaNUսVI6 sW*ז"t"Cm\ `RJr 1KLz!'h(&Pl\qvѷ]r=ӿ#ۯn+J8׌ᘒ \+ׇu#wg-OM0bytlLbUQx✒*=מuqU뚰p@M3_(SۋX2(C" yE@9cXe-ٸ+Ñ 0x43<'!f_:7ƈl[(52dx@(dmoԚb5(V>@)-(~wY5-B!8ql2!q/m(Xw ޘ/f3!KJكZ--eRXD(!!RJiDm ĭA (o. OCKUQz y,"|#5o.mmss}`1˲88Hxg)?On?SVO?3i4T*a8p.l+4 7NhE)d2iZ=lZ P6__߽3_0l:ny.,u[g7?Qad֒1c{[n80j|^Z99r={\|<{i<_WTU,kzzzyy4=zg:@Qv!u%0`XT$8Hɮ+x(%"0MQ@i%S: רD"Zzeev`Hq*i] aҚaʈI:vZ*P@]:r\O{g]zm4/om300+F6KrBil*|tm,dB '?uF&TQ,-7|۶X/0\7vRdul70 Xh EHangtTE[ho@bL6+h* +뗍V!)$$QM8F:U͏(4E@xnFx,WsZ2E.\F.wb׮JQVe}mnkߑbZW/<{)<7maOAz"S* ︅!, ) pyꩉvc%Fea?EQ从mـÉ[t!%-޸Xoh$]3E鮮B0^|G,-Gy0C=?CxǢ1uk8CPo7Ml6 !'ODڵ7sʢZ92z.c<(RƘe[km2F$=Օ'~7FGFxM_}(=3l}[ݺu` s׮PC{/="& *|^UxY6m/!YXౘ(HHY^Yo bDzܭF0h(2ҋ`/soU.K0.sTla͑;sc}ŵzē56`tc+GW+/t &+SYAD (dBD"E "# EQFxd&A N#*( QsK<0CjG0/NRTKhrLMKvU7lDl<,d~a#s$Otrq/tqAwf\:j|x(9u[pIˋ^zCoHv׳|t1ͷZt:h{14 'O|-4<;;8 /{G}jYիyx[Tj,JwjÂNڵk׾} øp‘#Gfff,!ɓ= ǣ>zt:#<󽳦C=tjwגp\I1Q;u{͚즻ҩ]x}wp܎uJsjs8ݻe f&l6#Hq(^zWuɷ-_ggg<}nffEq``СC?5l PR[,t)¢(<̰" e5J#VۏqEKB:0+-sljcmۭ?) <xE<$ efAv-HGa|FYA$2"lsʭsmc|dԯׂ9zGBVO{"t&.' {}3O3hL ōV 91ZXRٝy0nlZTmXQsbs .HT1+q ̺^i;u9s D^+6T߷khH(d &^VX~Y.BXvO"!Md!wht\W5=۞vqy53< 9IbPoX&9N*EwW{`m 4;BR97'gBb%꽽ZOU>Cml}B>7pcfCՓ{lBgvjN\۴7nt+06rVxÈ"@AP*.<70DYyUD<"wK$Q#>łsh][Ju\9 2 ;ii16Hͯ4mz/֊z2Ѩ* N~fw±SlcOrkp -UZdsuyWwuϜ9#bTvN'L^zZr9Fш ߋ-i]$MAb Pfow%b熁# G|` TB%Z4(r(N%YN""ót*ږ٪j,XLT(Pt.@Rt<ըV^o.FG0Cp"cN$Գ"Bs$' Bn5Ԯ H`}z17}¹{v!/i<7זגq)B@!3:{C_n^rzv 7TKib_͎A ZH#P"*$`j4S9%1${.dvU9V/Yͮ֟__̗#Jq>1P :EĬ?oֺ, Za4>#9n%si87ˍ'2$4ZZԵ뫘Z*<0!0-o@~`Q B>oީ3Ν]$ }Brٍ.1Sf.Ⱥxm%]wXQ䳀F\n+Ʉ!.6<}"ŎE>G UDCvZ,@BL H:Un4p*]B]+r-yHE hdy^OA* c 0}g=(ciۋ|vin>E(9v?: CQq:No[EC_*mѿPgZD@Q?׏~g~IH~mlVWVΞzG}T_Qcǎ}}o|oy]Ʉxe.Va9`qCjL l( * *"$LDH .-wa ̒VԍgjMC8EMPֺFX%5ۼi qA LQ"O;r8M!%8SU^sB'3Fit=ֱ][k<{vZܸu],xaKnulf<2F髧]U # =@C׍sCgȔ Fb," m$`E#!~,b붣%,؎:69ݴzw_\jDAPP̑cAA"ŭ]VcB8};teAB ʙcG )gT,w 4)/?=6oTi?~_|vܹL&K.aۋeMozt}%@ԙ=Ꮮ?W>v1V,%I @Ǐ7Zwիbqff'=y[,kZτ㸙G{'6'OT*O^^^1w0ŋ~ׯVÛiX>{w!oBt]^UU}8Λ$tR?8?on}oR<~q_0wu\XL5MCPP8|io{^ƒ>k4M|0!=&׃ďHWĞ,`g$.$Q 8D^U1Ev"Y|nT;FcA,^̤3sW zlV5|r6XLk5*A%$)"1mڌ|Ш[[w܊ڊ|{}cȪ}W |B50x?pID>㵈yNh.B~xPwK|8(hjhYǂ=tS?8w&M3{ũG!/8g\ò^U)G4r}׵*$$%9^:ATک)LitA@%d~j)6nBU\K`c#~qUt7 ܐT.`vV;ۅa5 *iϼQU6YJ9BCBJ嵄oX-ͦ#\Ųb(!v2 C UdA[FSS!O#:-׆ƲB2g_|lw[DB #ݭt<+KOi׷ CUXP|K8PNqYQ1 ,"!./mY #7, 1)> 5e +`ڵ5QdrA@VOgYzi}9q"!BYV[B^U^8{d,ǁ(}% )(,..PB0F)X/z҈FY๝5LD o% .}୒S m@7>KF{us!aukZ:F=S|WYLo}Б1=!"cZ_}edd7g>x܋?|6Cv~/bxZ I8M)=w!C{3 >U,$H #O]u xJi"`"< xH9bjVfb.%#qDlGԳD)Z%҂sDdo|pࡾx3<箬]*o V.i4Rdgaj\:-TpDeVYMUk#f%I҉+Kn'Q-q pz.^1ڕlzDAvǞ_\}.3:it"JqDBJC@=Mi(כ8$rN'=pM,ڸ;> %B@ AxՕo|7H_'/?kNa3m#;o3fn`Y݆ۍJ&Q"[`1I7XKi׭6\9UI8.o&_yl07XRI`'<+H22@Q<{B׳lˑ\)4559s4<9Z=Mŝ // sX,c4~ݴfgˉ:!ۨZBO`%&EHĘC( Ñ#B,HB#J8t8+f͌6lk3b6DT""'K11&1E#p 28K *B"}x1!!p8AmϲqGJ۰}TUVeQj(J j7-k-/}lO&X583VtPZPji~|U:ҵVѼH#R )e_|޲DzL&766Ţ(!eJ4W!ԣɤ xwC :v;2Єo|7{gz#?[d2Ο?ԩl8j裏 5^-;"~?{`g688J .]_ AcIDbLȆAR7*wwzw`WB}" 9QĮl(˲5bR@;s1XL}nqe=GLʝK$#QWVETwŨdDdQ(i{̅)ZH> 7=e L$ʼn+lT S{CH'w>N;z싻w׏C߿ccl".dcEQ/hgt] @5 | SѱfAיؿݛwu־uF76 H(f$ٲ#E8~P^#,[1cǶ" H$]]z%_P@FyXL(0y%KBy{n?@\9!jbnoW &O9+EM^h{c+>%ߺrj2٥=ܜlHVR %Y)a(ېf,[3%Mtݸ6.ᔗ({nj~JQ3m${ۑ㏫o_d 3x落v$K@"!:LUˆv\kكW^;]y]|/ è K g_VOVle͉rD:*MHFƻ&DG}3d0z~sMgc $I\EDղ7x޸q 7ozRگEc?Osk}4˗/Z(z]Ӵc7ȲwHQSč;W]J=xN$"HP5;K#6tR%h<ɹ"",JI&@#ghLҌDH D4Wo4443W~h 0V;N:z"?΀m=߼pvini9(`wЕ%mX=h$ubzoF4+O?< .nShJ8c  6;(/-6φ(Ȣ҄c]g}sHd*yL$I(EAu 8`0x&. FiLLs3hSM/[ c,3K"" eyf1hn@F,>'jsrVsBGI0FtT8j>| =@`4;U}<h6$,pNTE @h3Q S9(]55D^ӂnL,)T'H8 cI4]s}j0)3M 3>N\^BYi*3JXjQ1፯|I7$vQPD5J&+h譓؉Sgnܼ? 7Q^=_/%IY{q{o{.ɢϮ޸[+j_o_},IjY_ xBȁfwd\Rt>~݉RW2I͢Xd zLuSBf( 2d1ˊ*c(X49 NT|Kxkϼ~. iE10ea5. BqD IDATv^N`kpQ-l=)p^ZG϶*mnojwxxߨW yLմE$ !8a,,j1699/JFl6,*c?<po5ΤJ5Miv{퇕qXK21 Zɻf ǵ?N$P(|;yAkG%Ǐ ]KH,pS8fA&%[(\)eB)Ckvuz3"@Yi$ ZB>L{v)Y8wyKeҘ]ߋvw3VIM B"bUȡ!Ako$opkHn~ss鱄s&xO֮,,5>BB #[TkzebrQja߽ʂ ei4t}~k'΢JmZŠHTԧnI$Bݘa3o5 +3ԌQ4 uj뻯lh<44Sե^埼 cP4|ŔRģ!`3yXQ4#dsޘU)A~8z'l7+*m7i<'3I]6JG8+1 (ҞL0C3 Ҍ$I3,t yR&DdTQ1_,ܾay \G'*z4iv ÈyU vcjzRUێwvTi IQ\DwUCpte+J9S/jE!d4%+odAlj؊*X*~Oݸ|Kh.rs ;5يXF2Z{aV EU8c!P  nNӉ0gTM)P_!ޏX-5_(o5Y'K8C8B3 C8o w?ĢĂP޾34>nf ݶOR#F)8;Nǀ9ߺ3?%IfBƔRJ݅sR B2  kzٳW_}B(I\UO}SO?t^uxO(z7' c}-w|{0݉j\LM5]V0c񾓎4U GܐD"QcXL !%%Bϲ h`YI#$WXn%b(  v)͸H`Ȳژ)f Y߸pۯ8ǽ>z_:啙n$,\èxzqǾ͊ `&I JN BR6̂e}~mK׎:,KjdAXVDyAs4lCrYZ$@e:חhq`nKx0ER+,Ҋ*#)Y9U,I.̋kmuQ1(ɒO9oq/7_zQ8.۝p; LAwF<_xkwţA$,i=I*@$8p8eR(h(@B iTR9 Q ˻~h把nH(`LAA99W. }Fzpݍ׍mUu]sS RR-}_^=vqerpɶnz'CJ(,#*;8 |R0'eLol<]tsyRѺ|bT%-BOtV{_a3/+^"Q/'*!y/~Bdgky}\ޯz /]=S̨s?dp“o33=h:>ʁ_:|=xgFa7oחjJ[pcz湳vqua~XG]{diho<쇁w'cQ5ٸz!j4BAe]KLP('XGyiuuUeAj$I$t^җ;;gϞԷ47~7vvvat'B20 3Ia7tEےY2bNEQD԰rNeI" bQ|.) < f}P\U:ۃ'4L|'pg4ﮯƵME}'l\i7~xq ME{dOԵ~\LpwkjŪvn99 b2B! D.4E߳sa.iV_-M5$IJtss4MYRB/HPLLCYĀ/Kٻ"dٞ,$%r՘*VH>V,LOֶv4@dXh yG7?'yTK TBcN\{ſz`''qqN&Y2b$HJF c?u݃m!͒$dF)ٶœQP-9qAG cH)Ovv%9 zM>.gWA?!0&\aM_c(Pf$T<쥾%T4b ,Mk8 LЄr 4 ;;y˸s g!D/=Qٗ9Jk#|EQn(sBW' uVv,FJ0 vFNҏ_>Ɖ& PNgƎ[ɅZc@'QU/_x9}9/Lo#4L5P*8$N8XT#0ELbɎ  J]C5'm(p쏾K>3=g6F\ (EJ]7$r@ MӌaxK|EJOfL&bN y~ ace N ` #eӊgNa)/Hy)„1=UJێ Q#w[灙CT)!xwZ֮]\\dUw_X,Q8xؿsz'39I00GQ6XkGqζ37"wjV ;h7156?-űÁ EϿs9۽~N2{~tGGqd >S!Y^\xs3=s\XZKteB5悰<7{^`vv}橷ޣmYIUcz}@/GgOܼsH;1ڵəEV:19v}{,C7/'0pBeX*E8qsُEM* Td}AE L5 ׮Z3 o޼1F 7h ZF*ldk;\y~uWi<۸^6U8'Y0hvb(bV^^,aqAMֱ33;wv6N?.?rs%f\%Ď{g5&0 '!V$Kćs͢U?>q{Ri;tm'ih*s" 9q?NF$S(ybN!c318y@VE U8O0zqҮtwi<!b]d;4a$-cbb-d`v:37XV{w-a"*Z}ogk۩Ԃ,~6$ DYpZwUJ "wh#qUa'*U4lRmFIR.V DstУ?HByi};=8<)2 %z|Vl+xp{oCbP)(‡}o_QQC`ց9ERG΅O,\~nu'U.!DBen̅!w5˪--(+o 8cOCS5V΍]IVʵ[W^B_V;^ J;SeyyI T5N~N\K[?A ]}r &W;a G>,54MjN)HԴ'EӱFcsBӔp?~|J31R܉^rӳ/7o^O $QYv&kl8/Uoސʶ2=* FHR,2(ULwp8ɑpnmh``Acd2Ȩ"N';46&綏3!y 9t\T*`|ߜꢠGD){ӒWq x7V)oYA84sA p'(CaqS.a'&WWRz/Etx|ݺv6:6w:\+*?w?"#9z-"bo~sfvi]QBi(z^͗;+幩U^Qf蒪iJ"v\E\XtF$iX+r+'J9"ѐ!EA[n[$9J2Fss1u0DaV 5L~ERVU"7`nB.*Ќd ͨ#ɦzFsn⇃W{7/S1F2ez^%*@$1fiq1J&J4#Qi7rB (# 0dEJx$"TӪbQc#K3+ ȮGT&1MZy,S?tI29kܞ\0dX-4ue ]H&T^s{/j^W AOa[d܎P0fIPIn羪ʇ/_1~"o:a`QmŶEź5Tq>s_Nή9ÀdI_&*W'oa|!IB_I@ n^tg)mޘo`Bxhulu<-YAvm m8:Y0ccEF)B$<"a \Z~<1w΋Z# n$GMKVw7'L;?pa$Mwn_zғ++gQSV9AJ>NY1g,"CCA  ! B B1fQz\Uڌaf.>G`4HE ( &U:v b k/l<X0qkƃ0$"1IF'6:4 DiNI&ȧBZ4b;ëppnOt!+.׼G/NT8OT8;:QgU':BXi3'5ϜN* OOzO@);^dY6 ocY\[NObx/?=#'X__0 o~'D{||< &''m~Ϫ^nzTHN!T*wȈ3 p@ @B1^(r\LR?PsrLl*Ҩ5>,vTIDA!RBH,L6a 5U8Iÿ˗WW'd&-G,t+A,StR.hzX K#hsS\ IDATwo omME1tY*Avs`ѸjOO--$ #1!\j[L;0,3M8Lf \u13ԏ)((2)^(q4J;w%%+oF㉥[/t3RP-+ ʋO%~7l ;/7w=,(.ѢjXXQ(B|Wa?ڿ%fox`nК7_#tu0p$.̮,._2Z(%!s(!@c0W-ZN'ӛkwRn$%"Uu cƜ@gcђVNI{ w}:rn(r\2<t$$8&E,2O(p(@$L(E=&rщr!_ȕdM tAORtB2YApL(*T+n$$[אr, q.\_=2œexӉw^2{ot0FNF3)I$Vg×k9 ŋs<]|T3搬ooޫb4ļHN{x頌# a>q$JvX.f踋$5l<)pQYZB#pDQĿ b>E|Nm&R;>wZ ƥiA?TJUUyĎo>,!#mҥw|ٚ\W^y'!N' f1r⋟g~:pL'?hP% $4M2`0EJOis#=OUYVH2T$/;xf!p<iĥ,HPFiB S"*\ 0f2B xEMm9g_4t\j]El^@CI$<u|Wj$Nd`( 2 ,) ,1->^K`/<0 RN d O O=pfmbD!(P\MHؐH9QU%pf)!|HS;VU1?SܒERF?[GW_wQaptp>0Z݄;8ٳ^bhEqX|0 WzVhpb iC GaR- v=Ogw+B屇!)| 3,5?G=4!Ln4ITɲKݬV!~KW~aVFoÀR$zeq K*k룉tf@ub. w$ DO]&c8t/U󅲨[[/ ={oL5g"q],vO[7 Ssέyts0pĢ=qFrRH좑x_srLJ#/8Mg2e ell\.R+WrkAU `i,Q}ghIN#&.xI( c/ 9Il ImEnԽ=|| /1y(V4(5Xb?)'J@t11F,)VKBۜCJP!oN6dI׮X8390peIa9?Hu^Ɓ"kn X 9)|2P~ =%g!@S)'Oڽ=,aAFq'F4 )DQ)ׯq}?\3-UMÂ)vMV'lRI _ P2,hܸqcm"fE\,AX6^:!cQzK&pQ`K|/FH$K ,$>VW:cТ(H B}N(krv<[*}ٙ|>qzzuݕ$IޗB##t9!@)D A0 1$zh'ݑEM(a6 ɴ?1 % \Qs@B(T$qo+ˊڔq8r\2Q MjHGQ[(+. J(ʢ"t lF$ |sܥ^оҾU, ,c<"6$XbT0ZN^ !$ (d zgjbEHCHSg;)TBDF\ @Tˮ$c'G2Y2$FX 0˲qζB,xFQ!K~}QdJ0holnVݫdP-+BOǛG7]%˷|U҃j~rz7lOƇ^0^oU/ܸ]%Vr+?B:;o{1der_Ul6/~"Sa׏+wàwګSUw KN~~^NlF #oL6]K[8N/`KD).q?l/d 繄J,~6hpfg~'Szʽ C24K#,[ʰJ5gg..y1ŀLas:>zA4z#Ef;7RTQi$2SEbIED^8.6LА5=O1Jy!4Fa,ap(>qFѰ*H9$v4J͉KS38N3Ju  (~haŐ0r0MҠmF$ ֳTch6LM*VJչe]u/޸uCmz:R7swfQ2 f;lٮY0~0TX.Xdti6r\kJ&rlhw(Td B bFT䅱I!CXƯ{7 $;49~|w}q{sYVVjRJTHB̠a2 cnViJJURTkVVfV׸Ge~$it7 2?-̾f~k#J2@83kI#N(yHv1f Ss:$w8x\Oxn]O(Zͣ9i3YFؘ;vq!N_Y[ !&a#Թ!3 L6%c#ّũ嫗/dw<޺1wO;eJ&XKx'~= ;QfA@xi}_&Ƀlev:XoU5eXI}/XLm?$53; E:}([(mJ(u}?R&x;0FK(V3"*ADu%}`e_:2 ㈅ dVn s"k,[_F,+`HY^G5!t n`sڶ [c(A 1Tst3#S޸Ƀ'SڤZՒLa8]V %KMSdP~*Q81Y7]8 ],䕓'.awq`men};[$40t&<%,b+/iۢVuܹM]%IjZBRq|g}U}!{w\A Q9Ep,$Q8ePS1$᨟וd.:D\&NWJRRX$ lȩ"YBVnɾ-=\ɺusy٭'mēt-!6lPS5QM/Z;^XeRLӌL׾x9㡀`ȔD!]G6CeNqsX (0yN?dq 8 E]DD%/1! 4-^<{Q1%!9tpΏ 2s6?Ze e=fʹЙbEs3?bs-;9Kj͍]S/<ҝ͛)%2`VY*Rp)UIR%PNd)!;s[Q(\/lPk6MנX4cfϟ8=T+OϜf:" s\{Ի5ל`n@#\:ʵ?DM>0҅ic$02d'QlZRQ)S)T0*E#s +AУ'ȋq$;(2JPwzã]~ /tG% ؒp=huQ4o/_ؿ.UQoH. ܹA+_+(\&r"QEX"gi +WUQd!HQ&j Ldq*bjj 8 茅YǝjsR0L~/֛Un2,Yı9֗ Eג8 )NxHzCVaOW!ʂ b$0^y%fD}'^ln\Y1滣ᕝ[[n(?ҥcXW*UTBV]Z,<(SڳԡNnouv5U4S6|/ (F X,6EKIF>̀(KGďSE,U,gV8QȌE5(XV55{{Ta~}[˘֯_8959]*r"F)Z`92rK W(hfAE ɪ17;s׽_pguUh;xq_Q&7<`pk䩔MȪg7UM5 4 <ٳzhs9(z.8N|"Tb#*#IE|w%v^6Uɒ=&*3*PPR;r NF[;w:-9i@=YN0VM(J\)'FxDJbi!`\˗.$,Oז3*h;tRquy dfJ~$ǃk_{F;BY{Ji<48X,M>n Mr{& Y˒ |UwsOeYҀ|i5 El"ŋ(_PwIVX\qqP`8=hԥER3^vCsa@^a}6CsN88qrV!}ỿ?y&Cnt߻/)MpNlLD`F8bQ9vuN4 (RѬ>mɊ,"g uu#_-wŶ:2Kjەl /_pAJ*''YuTMIfRϰr}B#/*h߅Ɠxٕ/}B k#En6 T,@4й^yk@Jqw$s9"Us%X$+׷G^#8S(,E!R#yQԲ8.,e8tŌz2M`D0e$AQuR[\x/9alvA'q:]?|_7?>0y#`RLRf*hշۧ+:+Z:vwd۝y\HZ=~hDQIF2FX #pQlopzʒUF6(XEU%=3OyV-Vt!]7!e7O+T$ۑ[q0Q8pdnbF,DJSզۿӹ;{@cȴ #}S!VHH\G"aYH &nussm{,eE( Rv:eDeRuRAד0Ȥ8R~BƳt{d?ߦXK*&M(3%+vb B1]RHƝ/fHTTzI{ra6 F9Q* RS7k2B6=No'_5ɠdgXR ^YLe,eءfycFpm04쁙R8@cjw&#'{[ݸU-:u@а uZ(NדxIJ℈6 F tI0}_1\Ά(9S7vIFb ,jma݉NIwp^qNwy1%n&ػv뒩$A0 +9 IDATI8PːyY1Q):׮RI|QXcrsvmK/, @KVVl;M1$tH$QZvɅy$EIj ՝u*2qvvdmQR Edz "BQKhByKȓvg^>4 d.^xҫq(>?|Ry4rݍ}z+^w(jJQxHHeDiFzd/2G[8̍=dƩ%8#9&ϟ3USG! H0! R", T,BGML6A:U)(4ʄ3Nd2Iv1(sF !͌}{(!a2v.\$o?3?y!d8Vx/.--}=1wRzo7HټZ!4Mk, "B]g4SoXܷ%b$B9 x(bBV'^.gB0V+B>A^(Ԙ_ 7:R(Y9^%H@(j-x?ghbrhn2Ԍ4/]lH 8Y50 aB & ō7Xkt[i"QWe(Yh"*GRG'`fcuncgct="Q1HHHHB"D4$Z"iLVͩÇv?dɝVD@Ƣ, NuBWwś7*ƨZ^8D23;oBԏ!aw٩37Voi~c~t/_ 88Ȱs{Rma,R6ܻ$I|ʅg|1 [-5O`v?;e-p!?v._ ֵ|򅛟<|xZ̯vO->? wzs ՉWwwqp6cS*vz |,qKW8E-g5JTpTBT!9U%qJmbZ$PUiMr.-I$DS$HR'z2r 0& D@ d+}󯽺F{.2Y8Ex#Z7ZߺZP Ӻ$EYp M5e2Ŋ!qAAjQ5MC⌇nH iJG"$Q@%!'`l?hL"B_qm0r=*R@NEJ4dVKxNE+Vṓ|Z-"]]޺(+tbVǝ S'7G΃irm 3El;"鈴:VBI'Q2*ʆYJiȪ&ZZ[]X,͝fYcvlv:AlL@2E5eZPiJQ)H6|. )Fv28 =IUbIm,FȉP.g>14gլ4FцKe5j^1&%g(N'ͺxAnpy/|˫{;z9kowgГ>ȗ>z✧ ˺מxH-Yӯ} hHف9?moS}sg?|ҷnџɹ̡|ǎ8pm썑Nv.$Ɖ†¥n/_">dpΞ/8w]9Qл$n$.\jbE^{{!eS*\Ψ LC.DH0LbA!$ Bp/#!c{rٽJ9gsF3(sgϜ1[D¿ ДI"a[V4 0S}7'}[~M׿⋿K9ϲsn[FX,.--:t@] #`"<r7 cH9xfNQ3˫wZs'._zXT+\qb  2ZR"Ja_RLB%hQ@#,XYuGJÊ?v, —/*@Y3<+gϔˌM32P0'/> udlCru?fs&y8`HRѪMQLbd .^B^Mwx*Jډ=w^{>/t{oܾ{O?Y://~aBN877ƻ#3q*jSd)͉} 9g^͒Z\_8 o MkFŜı3vgڕ??,>{}ޟ vN_'vSOwck4_"Q\lHL9P,[LZ&.ꎭ=܊$ U$>@QƉM YeQ̼.p)Y7Ⱦ^Nlg/u9ywl$X. BύqvRBB%0 1F9e38RnrxLMV_(MEhί( =ag9clbboEt^W,'&&߽W Ø}6Bhaaaccnc|/?E۶o޼(ʹsWVVA8}$I/^$:u^B_9AO~j~w~'e9ҫW>3in&`^[[3M]zɓ'ǿu!"4O7O?y$JӜȒ8 ]0\c]'?ԡ4j NBn'&\% Q{m3CH) AIQƢ$HHe"e*pnEQ8~ /.\76GK$Mh5U%\`iDcl-+aQHLcg10-!w^ʝ jdA:e\p )a,NIƢ|NŢEѰz'0&X~'&LK5 =%jR6x ΄)+.-ViRʃx8n뚂enXigeô&`(f;+!Ë{lh'vҴ%S1BDs$je=p7)EF 7[#RW>ֹ(}wD䆶fh ;|bck79' }JQw7 F"fr4UJ% 9Az? 9 |m=7S蓇zyapBd4h5tKHC dŔ4eUԉtQ}<IPj (K"e3Csyu6:C \^]0 N+XaLlYǵ Y;qtQE2pmC~ .V* <%۶Pa1p]6ks7erA,=;o^>}ք, .}>++Ȓ5©'$!QE`H+B?_{?;gGoΈMeu cSOi+*yFmY`wo,7oJ4XZ(rTܴJALB-(-CUmm>c٨Re7uΙpgV>+XGYz鮯Ar5A`G?QB R 8OFfĦfoY\aW/Ν}R5MĢ A4!Gv/UUW4ƍ;h7LpؓzߛII79gzA]M}O߽kz ItuǷw?y:F8twyyaVF{>xxRGvw0{iXu#02QJIQJ3Bed1B)ڌsUs=~b8pȚM~H;qNݩJi^\\|co~V}>q=dYvk׮={O?u]-˺{>//׶{0^?9+ɓ^y~O=TE^ ƎMA[hg4>9}~Uݎ@Qȏ_}own JDQ8 GaՊGR%K{q7UY%0XTei?s ("` DX@Fwg9Yu=*(%Sԛ#w͜5 -ɂoYryʲʈ ]oԦC4{ZX@ bu‰Q( "9w=G g4i%_HiQ )1Aѣc>N*,@\0RT;vuv1tm3_ /Nܸ8.sF>l.Ue Az%< =,AY})yb% qobq35IQxAeKTT Ȑ ) S5E$H <0;j6|kXH  *fxƃC17ܽ5\ٻ7'ˍAwE %YXwKlcG5nomM2Ģ-$.,3RO jPDD\gG0B&JG_RXI)BA@ȣ8Cd{`(ʆ`e&&n2M$0L9Ѷnm qX@TzEv+mCL3Hn7̢ JSHCpԋZ4S5ݍ;ko\fɕ7>T}_UEQi EYCPUi4v')nR7pvGX"i!BX8r8pJ-*Vsްe);'ev-ɺ8';01uc}b֬f 3JHISUJt솆n,L/ELQ£ ԡfJbZ {/b'X&c+fAVZnDbõGaRjzcr ;|'yQk ^u Ν A I# prh3ϔt ,"R5iN0lួwY%՜ha "ISPIdEs;N|\x@~{oto/DܡGx$>A ^{r} '_?0u ?uB0ΜZ9T4{fa>==ŋFC? Z lP|B섃daz(f"4;]ç400 {L鬊;}U3JN闾ny/m{.^rS;HR$R! q:yA_\,!$;'e E<9|0|GV>S?~x9RXM>uius^d8y̙ZNeQa ,c2fZ'X^.ڵkgNŏk|c'fkU-o?ެ/RKw4NH|wmsണO4:2 HbQ,Tjw?nu'W\ofҐ1k@$,폼(ힳ5zYYVזL'42*-hYtalߺ`4AC ЄM^\]]m6 a7ʲt_tI(Q8}Ǐ/#lTͱnE~c3 NLLB35'S2x{{/bIv}a^i0-U'o\z4 '_^Q&R IDATn6nnURhBq{LD\CUI6ʊ1ҫ,*W,EQ$YLb6}D*5ѨEQ* D3uy)i{*gxL*(B9SdF "&(,2$R9H*Kgp.WJ`oJ $0MbBo XTi<rVN/ gqj 2LFɣ,%_|] 7..[)[$tJ0L IS#_eFC(PUC˸'E"􊪋NdaQne,*.,ꂈ +*z|VM`T(FG%q~\IVdY~kMҤCVl4ƪ5Iz0ƲciFBe(-FP'8}q^o9591˷]Q,QqN bQf0㣀A tI0kFg8KhBTwhIk+/}[^IBXXdsE.Bv:~"T-,i ^ (p]DiHjUCW[k=U </7V΋*(i6DEd(pa B82/+?"'RHx l@IeD%$kgqRh 0bD LRv7zt!̈́זFY+ZVdQ'($@!LWZu#TewnxY΢mw6M#yɍ=\iw:{PeJ;򁃕w|>qbđ;Wnu. +W([9>lF"ZI 5z,D #BtY&b \/m[U&NR.3l6VZ٥F>w$M?q|NdN{rU Y ?ЉL88Yo>J@ʓ槟M0 "R(wF7~E"KO閰t,ҍ~1YF]=vO_ TcYcʝ>⩅fU~lmc{9#S?avw-ϡJY nf=tJވ#?'O!fNDHQҷooڳܮsǧUY)6ֹC7 I8L cQF=c*e4f(bt\ % A*e&@~ FL__%>|84M>XߧB"|;K(oқ 0ƥRoşOcvK/5E? /bTIF4+jOo};4o]x03cA:Q6ceL;r&q$ez~ 3UVl#vL+B%qe!3 ;}s4㋐KfY\`I3 XEBZQ9jo[Ar X12CSۏRFw6[,"LC,PS(X{/IiGQǞ,)IW*$V?(b/J1ƝU?tEQb)c Eaũfc3#  &e)BZ2igOTeIX(qQR]ҙ\ CIF$qkU%` (c{$4IA)~J7{ͮÛcRWuWun6HJHIe[ɦEfd3fg1^ ꋭ^ɳ4FCIslCu֛P4blZ{ Oܙq8]9E@N=n2YMVӐ5y *3# Y 41s:^gwvA(MunB u{o{v7_y>%bhfn LQ̷wD-h.^soYel{r@*3}Xz6^f×߹dՅb17uptM(e)/\?X62)pu# zn)gfc>+k f2ZN.N_|1[0vo0i+IB0 JTME8B(И0A.ˊb)KBؐ]HTݘ9 Roh{0--,kegWnMڜEAJ/fhQ*W8 @(EÈБ}w5D j$r7ހ+ácٷT͘dKF>'J $ ,#Q5]ieR:&]!*S)2.yS}#}&)X4;Bm٭m ]߽1 :{Zr\.?}`ppppœ[}#$#!dJ/.Xٻ=kOx""oaAB`%{=}.SDSnfLā <PBIv#J\lá4U\`0S9 /CX63,Cx$_$45("j#bBJ TT]Uܾ*sSKQTA՜ګf0M@aD1Fwv1SQr89a:X,bƼ'>r'[*i*fϮJz~AcJ!O}47?XAJ"JLT8nzߡeBdyo3Ou}5fj7=RBfvJ5' {3&kכit/9'xNgf <5JbZveOr.-|.](":Sjݫ/yÅZ<_ÃѦaϞxfݾz3sI`&Aa'&Ln,8(\0̺^2(F @,䲙lC3facx|Ҩ7DRRS-7 ŁTVDQ]<&jf^c? V(^Qr8!10SB~,N°y%PIʏCW!+ް<o^G}Ccٱl9___?Vq>Mӭ-MdYFi2 ߕpTjޫiӧ]crz{ _?΢b2iz s.$`#pr歛]kLvmm$qƒFʅh1-h$Wԫxg|Y<䩘(X@$a&N 㗞vf<Z&j#a)YsjluHfBq7,H0R2 c4u^yi[7^-{L@Sčۣų'/Nh !$ C0Ue2pq0B74Bڙ;{?LPӥRa{O\&.!.+e M{⍏6wnqrv%M*2#sk/\}Cf֪3kۃ`X0D.d:" /ㄦ4bORd;:--3'Laowxݾ\~3^WsUNQ"T3 |=Z:^Z]5o A<}`{`7^[[כzGmc/W.=xr/oQL|3S-Οvm 4_,ՋlAŅRcqq֎6/v%$B9yp fT@PݣU׳By?TF(( Sl/r_%l "_s[CyU0޸~c7$@T[$\A#`P%F&ffXu b牙jP3YɆ/kbPCYN$HKʩ a(r()L*(PS%ŒBS&% io8WrBDJy Y臐b`\3ˋxUdg)!ZٌR׊䱖 d*&z hQSJJ.GIe]+p]?/jg}8# (!IT A,k$p g]mOdITdd9Er {BHlI'f4AJV`Q\B:45jT[ї~J݃7 CM1L&A(*[̭,NϜٽlE?L\r^j ]EEp.0GpZmL+bdkr`ˆ "B)'E X"4!8u$I^;H* E^ip8 @ 02ff~o43WVo߾}s/]_F@Mw?*Zc)]˘ѶrEl4Lܺrc[3I)Ѩ<;Vw68_q1|;ސ."7n׿l6s=(cJ?c8Pr>qB8_rԧj8α+Os.+JA#3kŔ1A_Ox'0~5/Sgk s{KFVcWQ4^Z_劦)hH\w`GaoX/PqX&R=ݝ>%x܂D# ܹ}i)CwC'A$Ǥ^65=)a;ThJyi{kPΫy}Kd8b^Ah!\J 8E E݃(w: T4/O)tw;Ć{Kw-K*=I;cv I7AwƤl2 n)OI98,֖ϸ'K Lfƿ~/GCEQ8خDqHd3j5ڇÀ:N qITJ}j>?R&(Nhfԯ;ә TX-)NeD8EB'B7prG7Ui T@Fq]MfV=Rj4*4&qu,Hx ~ʼϿr7,bkOVT= c9D!1 #OEQA(م$`G ̓4`EH#G=GLMĥ4m;a ",DaJTQ3 Z!qsдjQh,R=䩅=BB^-׌Sja2 )_-̍:ohp`KFTXjQ*#vsdxP8BqzingQ'IN? ;jSrqdWR\aaĹF+e|8Z4&;~/un^ʣaS SeUgG4#cIAJRz) LQkxb(^4rDrjTA*)Q\+34n,ʹ[YP|(KvB@: Y6ZXn xx%ITSmLfoi̇qՙ*UM5}1JſSOYwfώ$I;;ju<_~u]g?OZZs?s_"B|3Oo?z BO~!o|CӴ'Oᇟx I._|埶ĉ ܺu'QMw}?C'1!) M'$gΜE0c۲!<>53& 9rr~說޺ Z."V5[';UqL lNodT ?l5W_]\ۛۇ97]dYyQ4;uŒld!\rIjJ"sVwڝ h9D1~!)Lߵ{ND&L8 H\I1 F MTFy;௾RO뮕="EE12rƐF" O$J./˲v%eUm$=0+^;4) S!vnz P*k KK~eo0 B V"`.hr<%:JUUxhxB"洢f^~[7(MOiY Jf`1;?" TbQ,e b$X$$U# CQBgje%ǞfvotkBfu{Y gozWR4t0 901y'۷Ec7hNU@tn( vT 2%3^{m]\HC';abBYfi&rI]UHzJR&F4lBF)B֨/L&N9a?]-L۳;]>mHBynuKu2 "Qߣ)DH2DsEpP.P*sk'pے"ʚ**RU%Y4}6SMhԳvńZ IEn*yD]]c粔[#gx. J.kUL~czL'!tG4'X䪈$Uy4k)Q-*H-/]~vz+,*$zuj2ov>vDօ3Tn2J(e=(M˜ I":W>K/=go.^ѩ{)~ _ؾr%?kO?FřfqcmoJU]X@gYV;;I =/‚(;owS_Z*p??o|&I"Ij}?O>S.\STXt:>hVs]lۿ{{{zB{WӴ~Ng~g^yR$“O>)jp*ƴ^*APGR,3}W2&aҥ? gW"ϛ9y2S,ܼy=_햦 0!$g??QMkyze4;{# MGqF|̩S7o䓌ߧX4A8G~31 ;3`Xc:*r-u3̻y[>^1LCAؘo4ao;ԩ|#7o|]>nd[D?%.Jo޸|jIc ?F6vYԟ\)AvF^ L8dDY?w92V ~s?\];9sY/|b~Z3ٷ6$q$)N,C$v`U SFޤɎU R!rvMxiHPh=SV=)Ӆr٨eH[$C9T2%D1@)P(4QO<ྟy0 WyFBl@;dCWYH29nɩR8r(;\ٸsp{C7%r#HF)϶շO!Ɇmr"(b_hY]T1g1`P@q*Ha'32غ FqJ;G\@BRE8J:)A 8$'b,2 BNeX*䥬̘U^~?\wfN7]!qkyݔ }]JuZ=T2Y28ܼwTnxwܱ{^h4&4 M^!f}[fIƣݷۘel [bI=eisXNߛ@OY1[@ڔg?g})ao)>[sWJ2FTK]ȨM8K c eq2 7PY @ALYMt=7NܐzDL~h/ O w\g0ikϞO$JRh< s9J9-6-q,D4+Wx#SPҌT5tudMn=عp>5;3@ASL0-US0R@`l cn3 o_4i2x-+\7uy@9dQ|_MR"@f$G!$1!<%bX.P%xqF \!TK'GOA ݉M 'VO?~إ`yeq*o>o5&3JHC 1`0iZ*7~Y5k{kIt-Cwz;U$řP8dQPRBDAХbza(NL` lj=.T &u6TY ˠ3yȿrk(_{_Z饕 3=*z;z)ryiAtj%c^kuw8Q¨Ol'g.ٶ~m0{{ꞑ!H]C$/HcO4 Qvc>bbn6wʇQDH'J E#<GV.AGu팺Wo^S8b3'DA8wKkl"x,F0V]|/?3! 3|`ʩՙ^ F2ɜW}|{X m~1pI)M35a( s}R%T(RŌVrq Sp#Ppmz׷n<{K+\(9R "d:%đ5gG^)xn #~ Baa, 1؂p}lcwQw7:.<i!| £>(C=T*./p8!>Ǧ-bס/ /| yzc<Ǿr BVT*JR()(看xܹ jwn!i8p~:53q|8qVwGO@xoOp:AGX֕׶;μ*"13"A(e1bsg{ % b}}/4kW_ߊ C#y;, Y+t>K)GYPUnvmuVUYCWń&48d @ĒMrł(J4e+˺(2XҲ':!ALA6ܘzm_P$ j e !~:l#i8sy}Rʨ"t}$gXa VOv:Εj7^L,]Qͫ7O\[>0˹aWcٕEwLimqijn1u.^([x8xu9Wx>iƙR.||dr0G9mkRXt#M*f@'S˓8c!qB"&q GGG"w`j*S}9HK7Jųaxvmb: ga0쒮9cK`wwӇv\D`7L+K۷ϛroÝ7Zi =ta ]Q+~* HHTWl$H2.j4x PSq^_֚ݣIg+w+>sZ;"U%"G w:WJVqi.)A"ꚴn_z IRHQ,7K #$ْ LNe#MXWWݖTjDYZҩ% |s+JͳHL""^@I^4*m uTX1i2uZl*M9w,' L(9Z6Mn-Z>]؋]Ҕ-ͫ"Oͷζzw{=o<@R'X>9F`AD<0-%I Ҙn=mj H YjSfdlp\aR$5EN4E(մXFItc,cx ƼTlRYpƟ@c 0gc,r3D+C8艍'L3dBD)aтPJP()(cP9\0=4DHqHQ|_' O#??r!=ɾt/\(J?9q•]|Igmmmmm#?=yFhONq'?7677<ߑK*aƿ7O[ .G{w?|@,П <|׍8<rP-Rm..7 測Qc2JaʎSJJasʠ`g)+z%o=H|3ћY|6p&rsS?Hi2v% ,&iJV: aEi&RjK KDrhj Vӥ#@bIbBH\PΘnzˎ٤ Wj'ZR5#[kuUbu>,4 IA4sy`SDzUڔ4߻W˂Lj0bq6Vt`)([xD:% F/x?p7rëh6JR0ė_Ǜ2 }Uke88 kbƩĔjmyd7ǧ30K}wvvnj>:ݣ[0&IGh8}/_KYS+}_{UcEJӥ$z Sđӓ}ROd>ZiDNJ5sEB0KCwϯ|jr#7׻׿ለ_d'm-zg^g?|#3kTDpҿ/~N_jJ^qt[n&}blttQU4 7jjGalh*.R|k2޲t;48qcW%"Ttuz Qb,wVV( XsXEZk5lb<<\J^}z7ok?0hJ4N?pFP7F|:\ ?LJD l)[fƂl6YEk\iUMuFnqT5-Őd OYR %$-j͒yq/`xn?ԥs|1v :ͬ_6ʽw:ƭ^ NNH)PJ\KNrfi 7STU!1 (xV2"U{8TI 9,I6fubԵVcVԒfɆI*Uə6ӯN;hrH==cHYQi={舚n6JӣA`"ĐcI^H{%"<@tS:Tכ`ՏOc<1T4˖!'%uj+wsw^ʼnoiQnlYN+ڝl\˟D|_מ%5g>ч~K6kz$h:ۮa^{7/m_.Y7sgn|IYgyyYV'G9z/n_5To~e,ޓ/|fucs8T9Z94XFX@V !Pҭ0{(ifxbOK/&ğL*,yni ܻ&Ws'du ]Է 7OFO_Οxl4;`I6!V )-G #NF)iS U?,LCy*#xx_.V,1b9f{y?P\IJ$HU@ &6xΊȟx1 02g?"qcB1,3h!R7g(dgO}|O_~[+~A?.6/ Ŀ!K/o}+QDIYJHa~ׯ^Ӊ_8@å.g.]ftӬgzԟ2*2to?^'$?G0%/qUfeӴѬ"w\G)d H^='^o~OD3;vyS'YCyCG%۰ꆽ\ \3ULYE\,eEa EA0b+&Kđ ^B"Q>OzOӏ^~|!g{ KW0U-`>L*rIY!R(ER(8ٝF7n75<<~Vre)ÓJ*t6*k0Hz[?LNySC-g>O\ѫk[\dYA)Tj+QY0={?XYrqd1htkp%Kt8.2T}>=tZ'wl(0iU@E9QK׌8Y'&vHo+qK N.jn{?fm"Os[<_{FH48=z0M,^ؖ(OBh„E#@$CE@!uABR<%AӊH;h;̗I"i$Oj&+s+KVI~=jK d_MfAY1t?.ݰ^i:KLfJ窎* m*Eʲx'T!WWmS歴ĝ=sNwR$He,0tIjJ#ӵKM" QJ UP4NF} g4dX8T( QB{E>ʩnvlřcb*W̖HRrjtNUٱ v/I[ܿ"Q8K2nBǝpzSV1:i.uo0KMSJ W\(#Y)}~gr1bRXƌ,68y#ư"UZr7;()I< S'txnk$u(tnbx8AqzHǥ,?WQuVg`?"Z5kz£oǞ9}abRIsE,Tk\[pf[H$SrcliH,e\/Fn>eapNXD#a4_kV5$!Y;ij2caZf 0EDQ&xNO6{gkgW7K{uʥr#H|V$LdG8!GL@H(3ʐ@)e(c?7JOUX@$ٞcLqPe -I/+ a\~{1ǥ_,F/VW6>߶^zPN%5B@3XH'y S*TeT($s2YVg=}_=>vpq2߻}YS%r%1Ѵz@*e&[QŜd&8v( QFpNlU*Y\ oTJRɢL5MEMcHtY?8a  y[Q}! *qAQRP2;%5NVdKc1 nV6^=֭'G) 2j޶jf:IY*&Sn Nj'}WnaF+׮\{mu_tyr:{ˏ/GXp+4u d1'E4*QE]4S=@anǓ8gEADxpJ|>Z0PפA8|?|?T-G qC hLnU6ۭ+tqB9|B}:/ch+/ \Ȳ;&e;fBFjoޯINnssF$Ba@xQ-Y".<YE+P n~pp^|ւn`difImi˝Gxۿy|-|9:"uŪ8& x0dULEVޙխW0XuJF<} IDAT5Kw}n/^yx. ?Z"Jq<iL̓c`)D 3/_{z99QE,r ҡ&j+ƙg(h"Ȧ]Ť%3Vf;E{u@?@s $ACſw 9gA g8x:3ՋB(DIIa#!t$iwok4RPJΟ|U5xy7kq3DR],eW/^99E?"'4ϯ=}apꪺrN/NIµ̻뗷/M t( |WFiFd@{S4hErņ$K\̝4$26򂐜 XY$]i"ǢlKHF`j6rHFɤ"EF,0Š,`0TQ9R;Qwv Qc$[B  EX0UуG;q EQ.*,(X P@!ʊL b?ĔYD /`(e؜up{:N9wFe{ޑ:Yؽ>-ÊkQPBLJhRVURP z 2σYA[֩u`q$*ky#tW͂8m*5G " 0.h8 aWeiQU5CAU쭬9͒~?d2 BZmbIPu:$zrȓ Fݨ2Y{tb,Q4p#8Jͳ )~X(=oCu_JiՉ:nO؏.\L_􍛷2pEy< X +jɽH,Je}s&ho0u%f,)<Z{R.p A۲iŎ'\( \/(r^[_R~?{8m^FfŸ[ʗ^<~7b+H$Izw߽XꭆnIi޼ynH<v]Y I>>t8_${vhrrhW>l(8AFIђDdEe"@L(#9p#ypR($H4d>Ϊ%<' U7F" m>W7\wD 3QVi^߉( h`٘ϗH&9Rdfӈ0!~M|<[D7x;g{Z*y/@E8lTlKX/OKAFPAHEIJ+󘗝94kIW7-8x4 sT0d9U Yy4Ʒolr dC"fvt2T`*&9((RmKlV %*~k4<}3@S&=>7+x(^յ^4X_:9:>شiQI!@RBvux,AJd."Yr" J_tw8mk;jv /hM<$Ik6ںi.J9iYUyjYVh4rXiWbrƅ5wo1lQ`j F.YG}S`y;żx~e* "Lr=Yq &/t>g%h@R$E ]L{ ዗_UZWH\ [G3q?~i33(`@9deĞ7쉝YR-Kn}y@ p߻mW a<s>(<YC*:`ϿGW/J.dpAʊ&6 NawմuM'ݽa߻EIOlF~s?W?8SWNǃɐGjit2:FU҉4ˡ (}yz8Fn]Ehs!0vWYU+9ZxIO>ŵdNQyr,CE(  E2yJiDCwo 4I!Q%Aճֹzh|Kȗ4ɸXoX^nlR;NIҁQ\$N˗vpp(j>g{r1cR"Van{㜳39< AB`kQJ%-2Ckp' O|Hmvϧ4*]0E?r@=u7q1ը&z@/hI©tRT\yu*IGS\oBհJlVW'3EISr+'u|K^::)5K >O|pI ,3QZ<ը,8"Dˉ`hsWǡ uD43CjKuvN~^kW6(<=Ifk7TZ/+D ۲mԻ#,C^~F,z8; WV*Q( ʲB(K߳)(2 ,g}9 w<ihHղd,f7W;/Pҵg\׾{VJ5<%^I(+$cQ8a c&CQJ5I#^﮶&I+^qMw$4m'SJtNSsk5^Fh j4# " E^)c<KY$`QdM:̱LAB&&׮tҽ;&͵|rB(bAQN}h5t|<<1"_(.!M tIfaPmgȪV26W2sT 2Z[Lg]S1dτ eD&S{rc<:fMZR^mwyi\hۣ̫\KΘ]_|%]ۺ%Qw SA|y9w9 r/&vnƅ{rK :3<$&(r^,202VKm%l'^;jհ]ldVS,f pqjuQN\4˝}crZQs?Ruk-^4&i(u$:-T7欻,|{Ç/|C/*EޟG kz]/\= U㨔b%7{w6ςNBy?}ͫqh_:KMZW~ej$DGL4PÝxm$c'xG􏼟]BĥKxaf1 !1FG^m$QScLxKqD)t75o@x'?OWBI~w׺$Ir?/LԿD`o9LWT.K/IA3ƾ1:D%?3ْ`4G'gJzp8/cBPH(OKd n2~3~MP&pas-k Z;_vo}Ct> ĕeL/ fE kHsPaSjfYݘK K۽m{D[K{Kvw7ͽ7nx!:ц(d )7#Rz Ep7B.WؘQĮzX;(D#H LhmwN3s. Qtإb5*#/s$\sS{AC? s%yΘzTQRT ;(JYDb{UOX+5̲LC)?sqX"!<9s,^RA"*D A7t(DRyED8M9H1i9)a*ADT XI "ΉY2%!{$6e{rɐTK[wg^~_+e;[\E k=ٹJ'>37Xj4'6Bfk,(<ycY!:c@{[wזQuY+d0W[ݹ]ѫ*d/$$S$LSI BD]/dq$& ),$⁗CQ*V R#4IuQz贝rV=? }ǎ9X Jna=DZ̳ 3Re8sx0Jdo4Z/IX,ճ(^ɐ8 C[ %}K7nz^\isId#MO51Q/d83",Z#1.̋UL1OV(9 ykBMc(r" ElwsN- bZj;:DkRr_4S E%)1 m{2==73s7ҠT1Q9S-M+ npw k%́}^N޵"1 ,seq|}hwo,H?l8ؐ* ^Pˆ[=q$x\-iw6K kSڒg0;HGNwx:c߾֝ a):ƈyhhV,7X8 uwn!tan6g0v1z뻐'K'"D}ă1Ts*32c>ˆ}wi! O9y;}ׁRo>O=cz׻nٳC ]ih˲x Cd ߳O8e}@^}c/(FzPounD">2oq)G?lcG)s5;?{lj{+.Hi'jX+&i~5M..N^_|[Nnwn'<4ػcTܩ5V/+WHfQX|9. ]Fb6xy~jJɝ;T֎M1R QM0pS D-4h;/޻|=SPo/W Q(zEI4J05(fa렷 \-,5 DrwxϽՄn8""Xb&(#b084gш(HQ0NT8150bH M0F8DT%DPNCJ3SA17u ı}]@B, Q,a,qhՇNˍR*kD/eh|gu,?`;[^ŌxvTBFUH'C,vA6yKE`w44-7$gq7v^yoL=i>tV ((dPEL-U!^ГTA3tM'v/ , 2뀺k,ηp< )`0ocJj.ӹ"e]DA8ӯ={.OP0Ϗ`m<ܲ=#]V5N$`T0f| \$ؒTШ!fiJ"4K^PJ3I*ўMy4M4YvIf13Ԫ"0 ̢P"" LB{*+g*kr+. I$+*B9WUx(/=<Ƶ٩V}zsýxxr$ SZE/]__< IDAT=C'NSN0%i~sYBX鶭C',i%ȁH֫A;OBh)֦@oݹPY^\Wϼscg(T]g<xz[5U!($8KQ,=t}<%*MUˬR(RE$QQ1HĉX,** ,q~qwgOڊ.`|߹ma GiTJU2g4(sHJ!aEoVsX7nέ$!e9H(( sd Leۈhk?IN,Fi{v#o-sggkc…VWtfp44fQp2_zpׯgxp70v2Z\z^{txݏ' hsXHb`1w;֜^;2]ԃ:.zk77n]5W|igu0ģZ1ڽR0|Dȑ#1Fs!# @rP !!Qc1ʘ DDa 1@9i 1sJ9czBczΏd8j`|A6a FTg*ci;vwL\i!bBhR;1tݫ,`PZ*+)±S R{9 R@3+NiKLO=>_RK;UcAft])wZk> IčωN[+ljZ([8SvJMii$ 7`#H(&A77/Tq!hyN躶? *˰ 0]gWlJSc].i# 4 e%D|s2ŝ[;Su}X2ϭVqUVpz^s8d*I Ee1A+S8wv&vwv8K#Z9Q2K^i< eVlzpOϽ+_v6 +&j}ѥ%JiNjĜ(e_+n?~0{Gkcڵ+aјܾ}kj#4笗bO6'jnB7'[LГ۞}v\vݺNapjqCUpEp<?i>Ǒeh~)3? [*CˮY, @$&.V)ha@J~omt(q3sddERyWVkǧ^tyrWz A}zU2Zqy)WTe,Ψx)+hDb7,hR8r帳ۮUI*;} ZI2ެ5/]tS1LD9*w.l>P/֨#zrXX)Ʉ2cJ 8 *b0 !"p,KrJ1@ A@DJSdczySZcH|YŲ4S0Ns rtRK2j4&E(vmk(bӭcۃHLCri,Ǎ7v r0\soMSioADcYrL' FETk 3 W}?JYÝ4[YdƠ1G)yg&uMㄥLJۻ#JYr u1B9RQ%,$ =J#B*HTV 4H,L u&|kmn'J[hjReuiɷQ_k&V"!PX&HQF !Uu<%$^.4 X,aD(P $OpR"%Ss50LLq*>X! 3s-}oS'?a65Iqtv{瞹'Q(OFFu7jC)NzA/ITPzy Ah'Z4L$**=шlnjHDI%7FфQ8*mM4\"Ji)U طp YͨAȱ[YJe5MYFqL'l20ICŲQ"D (bHMM^=REXzfD~<ܽǎ.Z<CWm\\wڕbiz$XŢtHd;Z8yDQ ]gwo}>ܴm|(Vt4Z۹ujqQi3Nig9ϳR& …S'B0B玭aG1҅كn)v,O4M4K<Ͳd2 {]v-+LMYU&?-L9{W9~v47zFO>h4mOO4]ZZ_X8+j׿/kql?,˖;+++O>#d\fd;?ssqsNi>52«x;y>L?᜿KYMMͼ {'^{4~64h~q~I\BSOh4Ν; /v ӧhՕ%,+=_fw%x>i (դ`|Mեҙ颠xC+svG6*c'NWJ ׋Q{%|a2߾te$y&5`rZ\h7/OW[w^OIGh]U{摷co=̗|"`)8g/^YZܞZ.Ζo>|F.K(Rp]ҌUgbwX(ʕþ;yD*0IJ !cT%F2$X@{{ a~ rR;M:ӋobA@mlaC@MDTAR2L8'+,+{8?#({=voϭ _M BDĉ4SCB$[D@nL7 a&fB۹ns}bܾ|rY*O͐Qj=xj6n_.q^LtD!]u]_^^^[[?ꫯcMӞ}__~s{w!ׇ?l<33}W^y;#14`舁-zz0MpknoTKhBHGOdqqqkk'OV}#;7Moyv-k|k>V۞a+qIhnֿ? Mnp9[[[JePv]WU16<ӭc_{Y ;jk=7dZ@ FȽo1$ٗbAloc׽zK{o]ۼL@,AXMRB')=vY *8w‡+ AlT{Rsh_k*Inz'WA@Y%X xy!D)tm[Q;ֆv \:ujE#wَ_h4V \h> {},@A9L5銒"e4ͼ !#f(%i^6a$.4QFky^>C/Tdh&?,-ϊIܗt`' LsBo+MYJDTKwg.?k;5iʳQUdP, &qr:D!q MiS93;*UZ+VaFza$FH"Jac17_8 %O?|\1I7o ǽ5#>-)..V9Jӥ7npQmsj?6'Hkߴ#JDYU4K4f6JEqg,IB"BQ7IK.z!bY%yVd#EL ecK2DlYiVJR@zw?ThzJqZu,r4+FQ~NZपjTmo[w\o IDAT9S\rgۺ:UШIsYrϛ1x-%wnonTi5i3DA@ʜSsgY#MD)Ks/>ɡ'(MՍn4I6չIȪ6]:mJMbnFVq;WTn{(Z\lv:5ȫZ!҅RQ\*A~Zx<4ET=M"L0Q)`q6rQ)L$!"Ѿ}7OĩM$[*Sբ;KJתq Ifp<:{e[ׄzsznj̄)HbƉ\J&\K㾳yzl\FjJ{8ލ8ڿ==9R` D8q !U w{VWjSӢ,mmSy%Ij*˝^S̚js1SF4Wo֭[_$YYYyC/| Gh?ŋZcK>'OַAa|+_iZGJґrZ|p4 3/[[KKK'?я =552=7?=E;ۣTϴrِ/F&~V'_q~˟hO<!D AjIuץ˗EC=~t>{{X.\'C8i7l |Y5IV \ZDl\io'=Q(>kS(F݉gb3uy$l LQLtڇ;V {Wn/~vjvLa:o/xTmXÝݢnn0@Nm0b̆NڙXnۓpff (GP|iwwfN.-fܱŃѠ3rVNxAPܳ/7(xnsۉ3"׷PqܨW8 0KٓKig_{y{kA$- $ 2u8d 2Vf #" !QF8 jMM﹅tlq 9źQJL@*(%u.Vk$pimʙ;}[Oag'4:=).B߾3n2e=Q8!OUKSu,Oԑ'=unVVBq(Ev3qL8&"FnVΆg{GR;2MSx✅iAC˪a k HRe(y~Ә*b1փZqcYσnE U Jw6<űQ fI( ďa@ FE7(`rY I7qqI9a1 $MdRIA?cyci,i\$$}qVi(^Є4ϓ,&30|Cu;vr~ϥ g;>OyAo'Xsx¹Jv~i쵷R'o-&iM7/<ٹ/|h$,<⹇1kJxbi ߥ9aء(7u0^d^>zRdٗP5?L)bbddQ88رc+k|0u5Ysƣnwwө9CT9d/~Jg_ur+v]ډh7G(vK(yńZA,WK *8M1"E)'9P"b4bcA VQb$`ʬWg@:݉M[I8FU"QPSlUfaR!L@PnZdƕV!ҁt+Bsv*OӍxVAW4E]3u1R3E"fiJipxk};~E鷾?Ϝ륩S/^9e/M݁|֪^}26~{pH@$\ru(9У^ ozveuER4I;`3M$lNɨbx DtHٷTCqbgu-&XBl[miwkeVRdc FIRׯ,e}Jvz!>0ggFU*f[Puc=iqd&vv3gTp@1fvޑdcQdQ,j ~V3N(h=ؗWHAhjl{8]0Œ̗ᲔzkvjfNZD(KZ1nk]'GخfG\cn.nzP,>|%UUǦjΜU7/|sk'⻏!Lq]|K~j}??> ~$'>7ɓ?ENzG>|'cAA>ϼDggzs1}QbpW@O Bʱ;ЉgՠS/͌W.h>_n=;Jh AEuUUOgyzY gcROA@(EyS^0_u '[^uӘ6kza}$I(Js1q*Z  ]΢0!} KT9q(_7,۩rdY&Զ9&qoD4QBȑȆ(SiN3/H"%PS!?/wO:_jc*%G'iNeA-gj,Rk,]?5D[*n>ަ.VlLV-pg!'TSԡ'k8\fEC(4i{t2zx zOۥ/xxcߙJ tUhӛg#DA,q>l' OIxm>r%M4U$Y'?,`VW %,qF\8SUnQAx=ߛjFvjYK= bES[fDSFyBU,+9R!15^ )E5[9xC&)$d9J`!ij1s㧉z\o7'Gx3W GT(\{!x!>[p!4=>mه(!իWW~Z"j_C}RB&|?\/} ><8gX'''(/O%CB!)Jmx.Mӿd=''+̓N_h}Γգa0g_W$Äܹ3'Yzᑩ˭EDbߍLJeS7, y|t3VE 'QYzŗbv(Y,'j^M.CCN]RUW( fi28sY׍,Kư?e(;M(/XՕ3]vQ[tj|~: CS4,#Dѝpִsse]V(†RgaV*啽þYT(‚1a(H4qm<߷JeonZľ9ek;4svXDqMg~pt3w$PG7yD0@cFYFV( 89PdY2) dM%,89OÉR /]WWZr~ͨGm^LnsX 2D2c 6 Ygȹ( F}JqdeB7rH JpwJ49Wy$ pXg7%0N8HL1ewѾfj{|󓥖<۪mUA<8Tys s,\/21A"`8<>;^/98|?x4cS) 1 ֤R8#wQ{G W^L >񩛹<~z<?3;)L[&&DDĖӸ ;ްQb۝ndx%4fT.`Y9P3TY< /Zjio ^j^eI&@@~oՖn ԏ:[vu*"`E"P4aǛDmX h rTM>`g5XvJj@P.ve0~Xx9x+B+W?_{??Y!Bi$ ӸEZ2<(zL0xg 9j%rsg/5U f_O::꿻ziMvq _@_(::-O{d0 ?gonB޼?ģӪLWO|ٗ_g?9aܐY#2eEP?7dYwE jb;9&YMgMVL 9JSd(VZk g^ލS"w_ݞNZC3]#4 dTOnwTպ97mD)xEyHLQ2an &=*s3JUw@.aʪZkLgc/K/h}LN/3D{/_J8zy_n9M '{mYIrr9p%sHjv,{ b׷7#?-IM0գ)܌$IFżvt2e'J0%@l<ġJcc>uA,Qp0V8Iwifh짮 5릣ZU{~Xp9 RN QTFuA9$WyR&zIgP 5bSNTֈ8, ġkh\sYaD@m)hfgq %M Fc<1ud*/[ TAD k麟ٌR:*Q,EũP/rc/YWZsA6:<TȤjZf$O3aGiZph%da Y$fә!XժS5{Qǝ;51AQ`ϋo(2"cO0*M)OT rz{͏{{n_o]>_[,iQwgnhsՋL"/_,䍣 n%@7kZete)7+RQY&C>Pm1 PR, ,$HEPGDb 8/2Ʋ,/0LIU LSG䌹,iooٯ:ծ7N+/ꤐ:8/$E2TAP"4@`TūYXGвQלa􌉒i5&OBL4[nmS]sJiڤ;-Y VrAӸs0JZ'>57猵8LMaB9ų~'Űi $Bmj13 ?Zxw+ /N]8,b4~po?zǒ_X?T=oUwo^O?/ۛSRd A9jΨ41[Ә>s/r'FP@i)Do=,駗g^R[H\Ҍ%foϼ7dI"\u^`I.8MC=4bh_QVNdSgBlsܽwU IDATTk+̟'S( n90RAU VVIw9Td6ڶP$*XT۪8ժ.-$A>O}/*cF c%C/@*&xSs%a_;Ȣqg]?W.]|>QP*LLO㽭g@ٶkBK+" SZ<>Xݻw;/$CUR !?ZՌx2UUӱƗkӗ.di;Tu\t D4MUS6wr&RZðL4[c{Յ+;q}?~`1{Q=/ 4CQ,ߞe?25o [`/j=*?|uC>c2P}P ~;' dq>o wӂ>ޚqVn,[-!xX6Ky說UNDj ={/\zin^lܺugsq~nF~hطm(*Ye5HRZ, X!|*k\m*{h4>8Dc6%UFu<,Y#0P H< $K* 2CUL$FiD0U &XL\_7嵱; #Ǯaĺeai4M!i&3RibaHN"ϲXbN8+awΓ,#m{i#F:Z?0dAG2\˟I *K%sS js :Mz7*N>{;Vî 0 ZR¸@`啒aͱB9lK7b/wQfJ4qF k%@X0@IJ"<Kyn_o-jŮc9QrELB8,irXbYW;j> A.)Jւx遟vm%X%)׮/T*㣣q@(z3gtEH$0t@@#I"V!9#o2w?[ӟb,<rR*eh rzyt3NB 8E|#\:{|ee3 Lpmގ$cl{ <2RNpvj_HIh u4XhiYBsũU?Z}ٳmtٶ(sn/Rٙ[28 zi %yLIX2G0DIeUņԉaepd2ՍI*a`(ђV4)&ɎP:iYvEL׌*۾z|YNN&ᱢFV9dacoQ0usÔq|<rmNJ΢7=yvy71eZ~nZr!D(_O|f2%_b ߟM.\3/DQh$WKݹ{/pG]n/}hfW$Ueo{ڲ\ll_?Df0 UUPF\0'X+W~ڭ+ϵM˂Ϳlq _{h0pEKPg_a7^ݻw?O9jNCE)(DV*l<ğ1l jH (p\9o 7 S֢$P.pt4{sNd$x\[M7YY׫^ja Si*01 a( л)RtKJ!ɊKcgk5GrzVV0B9;M2ZFdY\JT_~b>q1')O%zm7xhݭNh<$y9"_)i7͜HP"QH U'{ή*i {PJd~GP5.t4Z&X,cV(D&CU@0UMv|E+(Q{lsT6p|wo}_Va69Y1PlJҠ?°$*pqַJt7QTƠ,9b,KyL( ܩi9ix1G_UYV8bIAd'Vi&?Ha3H`/"VO4M}2$H ޕ R]{\." D ws/<,&e43L96 X2!8ODY!^Yʉ4w]C՚N_"(iFӜ:QgМZkkj%Gl5Wn~䅇ܽSdriO?_}[..Nu`ZeRưAPAjC (>.--֗+KE,Yd+tiu9x"a]D.4M%Wfo泃΋?5zOC8A\J0 yPðd) P,AKsK|8 {~hpslЮ[Ԧg.e=j^6J>  TD|:Nwc UȖeq"aٖYǝ[aZWimΗυ)dZ@BzYlOv &N/ ZK^4dB QYl#Qqw4_g7%'/9K?xµk7jN, }?/_?( 9Rʴ %pz/ag+֒J$!j/MgӍYOKxm>,ADQU^3[u\/-͟|Etﮗjd浵u޽'w!=3u퍍>;r)8D1~VRι$%zʼnsB " ɻcϛ E@JYfM*(MxgrRkSֳ(8:U 1)Oxd}sk60OUE@b7v g;o^ຓf7BUDlYьw2ꔌRӰ9 ̓֓;c4 0Ϝ@%wrR/]VVW!WhMg.^5%ۡEmJ%4(:G[F !0^8g/]BV[}KY@QX4H9K%Mc}B?h?ÜMTǶ!B$:K]_{qd``c+k{?[nzt]&0` EXfig8(‘r6?ȋv0'UW^JLŲ]1dcK2-뷧Isնp|s,@o:d*)F_뺊Iv֭wߕۙifH 'D I9IJfڎikxg T-)0pFռ`01T6bYO|FvYz<EtSTiB=~lv{g,yCw #sMU W]S{SY"䔰afJPdhVp4Ø^&PH x( %"c"<&$NtM q3ahFTs H{m[Qc>{FwYd)CJ x]xsGG>qĶcp?nՂПL9 6bO1|3QIiRjSwj3$HKX~uNӓZ6USl¼˗/wp 8,70&ixW/9d񰟦پtw^et"4P䘂9ZU(qpbԘQUP=ڍxprUфLHԟ {"I0osTPE*˂Nv\={fVM>]OXUU8SʦAM94 Dk> 5.兽s!BnI * 䆄WHTf?m8kg$aYRJlpk%Y2Oaf)JRLBSi?޻|QZ f01ZY\7.,,λ^[Nfs"T ʎs .HU1"_[яLņQW2SaƐ" dHԜO;' YG$p8rgH#wdeV)Phˊ~ {J{P&^4 F# ta@xd#Qn|j^zNC-i6xn L0 =.1&~),KG=E ԋ`<Pt$YFBeI rb(BVsg77nuqw)&\-sIJp,EqQʎU;I{@yT. ?Zk5Bo?p'鿸 Vn !4,5h5s]:9<7x|CL0.I2SޠYo!EQQ`7w+C9@#$IdcA`oqR\J0%C|;(ADeoZ][[_mU=لJ4?… K5I>K`9T%c+ /^=suukٟ0~׏;DŽ«]^am>y14rT AקjGW*_z [}fei 4H%i[HFIF\A&D`Z+e9 2Hā?װW[gͨ?).|eAH0մJϾ3A峉6Q&c)C- ,WʺfW#>aVIp IL$cT{QZ^]^͒ge8NH$IRQ%e$`"2  IEfF!hKu:A:O%PZn]fU~3,pTR$)﹖i9^"a Fd9<,34*Yu9zBLwҩų (Y͂i KVI7B/ FN%eJ,%JYDg"e۠@0|I &XI唛34 HZxbKڂ>xjΣFc60vqci,eGQ?xI$)8g?~xxZ7M#LBqs ʙ  l\V%ͦD aR8,i%4N @R`!ˎ6Xz,fͥ݃e7_NݽE[}`zźY|`Yi]|i~s?=N|FcB>8 lQzOG_ڗ剢jDCӴ%B)T4(W)|ڟ oCvI; oW^];Lb4XHA+ Qoh=_^[YQ3yL q8kX93 D;G@^X\i,(ed "$jaƌ?\'x*Yn݃Yh8u gUQ +s> <0kϜJ[߽s3n,,oo|oZ]NSi~dT7lMk9M䯞W8cDvC/LMM X ˒inR]pTҤs ⺵`PeEdp{0O=?$ɪ7E]tzNd{ݕ3g*ͺjۻ[O~IQaw!ԫfDt(8>84,KQ50 (>ŏRUgh,wYzlz],j((7 U+CEQPyBhE % ߛIʋJr(j<"l$"qA%IբRe\,d=dsgkg8ϴ4ܪVyz*$iV% B%̄HRYrvj IDAT:8>3xBHT#e$ 2sR(\I_U)3L9Fg'$f;8_tڮ+ OEY`ݾr黎AFdͣ$;;ш}Ϭ}Vj P~?sϼ9o|=<3~ !ZKo꽻}Ϭ̬VWW/b9uƍ_|J~}z?93K;X;:U[JK W.>3%ˎb+^*,VU Y:8Sœ1`n8u2鹜O(e Utlknmuvzb9<}(hA5Xbh|n[F}q֪LYe_}0v]!9"hW󫍎vU"vv/R겤AEHdW2LL-\ϪY pSE"#`ńx(ZL:Umru! }HsXk.e_U}+ɉŸ++jjKn2 Xjd ൣb,J]Dՙxy`(s`Fineem0?7 8Ej>8n8Y^X. Z+clf|"" Z ;~T,UTXaU|~IZW+Phbt|-DŽpXE)6A( p1C BGr[!&ugt j.ΕW}H=LGWy|2[l-Y193ˍzp,Q׸ S`(: i/ _>[{v5\"/NϬ$~/NBͨ,ʒE-B5Jiz$ϗ_xB}Ӛ)EW*!eMˊiK!!Y ;5A$18]xإ˭Ps[vĆXPe!vir|.7S%"LL\ #>5(סbK$XQMBjᚠ; k56MVE ɩE ZͨLKD% :r\.f)5#!1+ޒ_9;?/HBAbZ3iFx4ժWxI" (2h+Jx,Hdt~Դ qmc]S(E(%B˶f,S q \*CJXXa5EkH~Q!%xl1GaW%P$,Rђ `X,QpApڰ]]\sMD\4 e()05AVWH5DU%,TmWkr rJZX2ԫRhA%`[(S8FD~Kogkթ n@,![4ՀfB㍊z#CO=ĉ#L!ƠQP(C,̈Pۮٵ"54ظ^-ǂPkTC bҖ_!v0&*٧H5^'L4aƂ$VsRkGl5DґUZ+!)`r40Զ5*=k ɭk/ RBX 6לŋFZ )6jP\(qƖ(r#(!Eb"5BA-b:X4[emQHT|, N\*-.5R\Fwj;.+QXFE8>,#"D- tV`,؍FC; fJSwܹ][xn%nВ ta1HjE)Sb MSG?~eDCӠshEƗx`rr+ݕ`Qf8[ϕ#-s^q|5հ &;b.ZQVDNZ5PC $&q`pc2][Bg?T8öxޏ͌Yx f@P쥊TOv 0BZFM(:*}ڴ]_X197l|uj8H[ߎm{gRf%%RqvUTDi P(I~ۦمDm[ ӲTnWOZ͟g[newї4 zg-<LFV* x@uhWIK#%VI49U >-(Ƭta*BilXTEDO7mӶm@},zw\:7>9u1Ѓ NT1rӖV67;?;<ȸZ5M*W¶w`kL~vM^!%H\qRH.61AR-U5 @G[$h/`&F  šp8 &"a,BԨV.Tg2 H051H׀J p8(5,k%vC]:0jRw0n#|/q ˪2Uˤ(> vLA"j i.LK`O=ss6@<Z!0lt%ѽ0+.`f2D!q?beb1p,DN lR+Gm\_9#*H0e 0Pq PѐJM\ ] B>ަSP@4R+MOcHZw@$jT OUJsXWOWdU,JlY]-j>8?Qas ( (Bm[vqQf&D:*!wӇsQeL 4_=8ح֫W4Mhji!\?T}bkE_0BkDAcjm52n7th&j4; wuUݚ|?zM 1Iܜol/_~:fQ ): v>Mj}7_!Y-O B-OML)peqJ~nvգ/ڡC?mǖ_Zr6N8Z)IUba`B#wiq$ass]%)sa2ϭөA|0Mk% Z*@o=<5ĵ1RA`Ni3l7:=u,9Y9`!66|7B )*X*Mx3̰fԥX0E[݇z_V\)U 6[ʏoֲ~G"r ˊ9UkS.ڳgϵ68.fW7{Dx|bkl|"bPm޶ӴU@\L\Llpν7 zwPdar͜/¡P(1q0C1g 7!RιEô[[3s=!A!OOτaA@1" 8ǎ9#yT*s7m✟9sn``Q'OٳKoF_8:<4FB lN$жEU*џ;7u4]]]_q1Cs%`pll4FhkonUsp$N~K J GZqZN O2Ooko˯,0JI¸ bMMb(/,.;ޠs>?8 :;ފ6UA\\Zq]7 1Χg TBjVDQH拦i1USᐃI~%+KaDQ.N !PHou/˹M;nBaBNQ=($E5M!Ia7r b`l'/pΓDӬ'5AZ5D*+\^lO ")P2PM9N:uOlCsCคmgOڻoJ.өť*!Q˥=}ln5_eu(./P{/_7 ŎK!B(y*x8[YBXPp\1w"$ -/eu?NUYT!Jv1-&'˥RO_( 0۲LRQG.333w@F.^ Ì1ŨFjgӥa 6&x6@56Bz6ߢVpPT~oٳ(o>wbrցc}}1&JUӴ#cCC KPxjj&Ȓ|؉޾>˲gZBt^޾!9(Jh0b/l":0ujzç#7xlwȦ1qG$ G 5~Nv !sPqB(ʮDXv@;曳٬eYBUU3믥J;.M $YX\B XH&׊ʼnK_UUQ1qPS/@ 2-ńa¡1NDh AH 9Plp]LPfX٨ E".$K YQCh"wvI]Z]dP,ǵL{vvB r~ML!3`n}۽:g<E.IDfᖶVp٪ 퍋8Gc$!‚bYUÑh"!t]v0[F8PE($)Ғ߽toV T Ծ"L6 ! ul 9]Ji9rYjv\4If ;6Vk5{vdP ӨXھXXsR7&!B|c X.跆"1D\.8(S-Z]P4Vȣ ] BL1! DB}*5uI=C%4iEbB=YS8喗㩌Q EMcHl$ez4&!(qF(eCT^+z;eǔ끀骪BL)c&6_{MLPv]B)O"q薁AY1A(ē%vk]A(a0&z{S.]9 ԛ&1ǥ^q] ń:wrq9yTM/r`"H *&W@.'Äޭ!LO쳳Z(r˹aؗ^ϷneO^"򫎋!tgo%nrDŽ--._2oI(bqy,lgea!Pwq`|9plcLwblWo)؈ L{f. ]x$Lh4^EITKks%f㺧5VʋK_}gϏt ٥+T.5%O~6ф'd9V ʫ DͳM4ĿUQ'>ᏽG]^8~=o?μCB ykn|k.5E]5s^PO:k=Tt/xO?3(lKժ{rn/6[&7*bBƎ i.e?3~!ohN2k:2 9_7[-1;%LL,'4mh↟cW.%QF HQ)TBeAQT\3F"W{{Cc!!G*9r]zPċcwp9n$I:6Fp"(+HV%Q-(u@8".qΚBVQ(^k c16FM^_E&hs,i : azQW"(_˽ѣ>WZcSuoL9t6|:kzB*W)8g`Wj1ļXu|S\BWTfu^g@sNUQpY_~9D6 1 09[o{s}KnL) .G eYU%&.%ez.e7 꾮ƒfx+goWtCWG/2:>[TdQ/GtBE, 8| PR¦[-an7iι34D_xh0a-RZZڧfzSD7Nh"ުԄ"˔51!I]^)=d93_}wݩO}ػK# ֫61HؒTUXPWϖ%Qd!=Jjwf#"V1ݺa&$.l&58uK/rnFplumӰls\ \",C完p%{ėߵpp` IDATxavPZe@0x'TYÖ׌\P+ؼWk/x-ƗrmW;ݝitR`x@OjkB}ǮR(JR)r Jc> ]nK-;e]^_~-=|Z`dlT BQpRV[mŃL`JNQgdkxjz,AMUH$8<T¶6LX.AVR8XŚ.8$ʢA!gbi1,GBb~Q"O⢤B\1kDjА4}~zNH,{zIMfA9ot奙 S#\ 33]tnjKw,9nS D={vw׏n' !ǃj,Nֱ)I%v)@7/Ș7"?=;WDXd‡.7`pKp tE^ W?;ڶB[yld)gA] )av7ۖgFM#Bg tj!5DDa«kә HG*$K Iu2N%Y˜B0v9g,!Q␺CThiӵϚ|rTm$3ݽ+nO>Ϗ>|5dN@Ԋ#M O,LZQRbz,OblcBJEB4-CQR9'BZm4R((%>_ض,Z̅HRj +ىd\)΅QP+5Ab0 p" bp%X _Xc pk,խ;XQZ#[LO>m-oRfX.q:DISuB$L$EcbFk[(ʌH8PoT-pܪ*~Ӵ\4I]+Ȓ(&_qFS.Ɩ;AY&:" mcIuvl±DlmɄPcl: -8b? Gʫe.r5! ԵTY-K|PZva1@ bđ k RI(lpͰxb&yf5]bfeybXOKT@!r'u:PC9++d*+Yu`$4dE(ʍc'$q4Uز෰ b1vrHbEWC=jKՑ /<yAfUY\Yw%X p0  BIHìÒ"n9q"@ !X┑Q! 6Q1j*.`HaU l*SB+b4]**6u}XmWLZG kU%S'Z2D؟:XvwS󡤢ZܯW,U;|l`PGM,˺> 8\-f꫺fnelg,>HsP@ebCM<>~C tv˅7KdkKCG^ X798 H3Nό[뛊^߿ dD{߀ lM; ^&8EADH "ʼW7mo7wBȯ5aiĺǀ^ep!D=Nlн|4x9^m6f+nFu]ojΆ% a9"@% ylk ܰ|0EzG@I!Ư""d_1rnpnb zpe~y(7Dlojlt֙z_1s}urgo*뫔?|L8] CisݷyϾrߟ$j)o~xK/9O}&T[[U1LminFյ]vt @7D\pțLtiL3}(66M4[Tbk""QAV2!Q zT]W RƘ ؗ3(cV(ӧO3[,'&&z{{3 \C9EqF95{!HȶwcǏ$i?~Eqwvhpc^1\׽rLu҉_GJ>^ʏ5&- z4<2}C`LƦ:|gFA_W{SתK"ɐ/V 7 v*FXMË+סs05YS*9୩XK*1\ Ӿ4 DqKO_W6t.&cSK3h[:ٷUT_Z)&㡥%QZŕFwĵߴm]bs(@3qaԉZuBzUQ-S`0bef-iID1 If$!+_'?IUU7D 7A6J{W|2ܵkxnnСC'N޽;m<!$x={1Yࣔ>#{o,j+s=EBx ? x)ry޽7|{s/}Kvk1AhF_){Qzw~w;'|rϞ=ܚ̺"NLPh$]USvVjzSn--1bjmMgyA@==o m`;H2 01XnOH0.1# }D!V:?ݞlh@6ms8|j.A۰HTtxBOsy`yMA6JW!DG?\nb6'-ɈjȬOSݱ>tۺ想Ǟ>҉:p{K|C'A]@BŹUvO>{?.{sx?ڣ/}#Rr7Ɔt  4j~9L7XfT*I e cBD"O?mvL&sFqܹ'O۷韢h"8zjXwֆ1>qD6VU… @@'x"f2L&www߿ԩSt:ֶ!?CSSSRiO˲6 _WGx<~1MLFr<::h4>|/uٳgAl}رl6;22O~R$o?{'ZZZVd2dhA>ŋ/мo?徾??HR5Qg"^f*_2=!I#q9 4V(JPwh6 O5t?׹jܹ;qMJ"!=b4H$G]$,?vDKٓ,B,b{&_q\o=~fSzǟ=3:$GRvalI꽥Jw>okrʎ玌 }n]+׎ۻZGL=W{ړ}~쇧.MȒnҝ_7o,Ӵ~S!BOGB9<mXSQq<߶ϝ~} [ jucD27951}{DA8d7822|Ǿ{wܷwߺ-7_66ۆrKҧ?vwW{Rva|ؙ)ſ[c_7WyHO{ M&@sB,UR>I綎B a}ЏhHG}[gѦ s=788xɽ{&Iq"hkk|>_պ_|EYA,P2ƞL&g߾}رsm۶ W^yeǎ{{;nEqXZZziT*O\oB|V\Jqmt|tz~uhGkx)@sΟD}۶R6kVm7|aa ޓ<)k}o|Cִw}SHTjbqq{Gf29R]]upF#'=twC)yilG;A/,l۶%NO*`jj4d2vȩNrN/ݲt:q7h6:m;ZN-Mwuĩs7ԍ ?g_x秏Ͼ~Gxb=oH|1v|/~cS!0lv s{~O߻9|`O8 6LZ3z}G΍˵ss?'3 kȂaX קݱP3|̃G_>t>n3Ͼ2M<_>kjwifyVB0\^<1~pg&mg=/\Z|c{q\oIX4Lck+Yֺl=\p1 Tq`ƹb&Pu et<OW؎Sm"\W?޽&=_<1cO|ෞ<9}{Y9 Oxm(@s a( pxpfC=OnٲEśoyvv̙3g9ݻoCeY;n቉@ EQ4 ca<@QU}{߱cdžoh mBRH$yYrBD>/ ^mnmmT*CCC^i|;x)9ƘRJ)UP(ڵk5F)۷oFeJ jD"ouc>\8Ra~Η+prz\kR$ oy>ϭ̞=ۺuk\.C2}}Z`]CYZ^_{뷐(2J/=4>~~k…o>cD"[ ϝ?ۿ_/jEYX_U?#$ ]7D͗dҬV9X[ b1??jٺUJ)fzoq~}ϖ˕~KʲN_~m}\ӪZϾi9p@9"xpVU*b|&䜦bLgN-ݭcg>էJ0˶?~-SLJJhP jPeqn;#YlMB~phr{ŲW\Z''"~yhN$+|A h* WkѪ׍ܣO=uU,WJaZN4uٯ+**mgts>Fo߷ŶZ~S߷sjYP*-|=m1A, a]kX v8cum]s&XWΖJ ιeev]캢mm!R3l˦bMRJOǎi=ŕoݭv1!Զ׳M0JHik Ԩ;%3@OjiBU_Z2/s󌞝%:tH!뺞U>xܹ;v}z||[n:u|ooƎ,~f+s>77744422k׮nirr#j0|Yr.,,}ϟSwyg__o۶MIo>===00 ٳg3>>cǎK.uttJ$uO㴷j/߿ٳݱX읺Μ9ST6y4]S:.5V-#[TDX@kTl‘hk;c{cO_ą*!$+ E$˓zG?}7qY =GZ}_<H(!M)=s?X~n.Wҿo/~[zu%k.w'oQ,5k]!h={vTDι.F"D" !t5'zkF*0M€m;M \*Dj$%֨;߯bw[#cO>7P֛R$4oτ+ٖC#؎Cs1v]38.bgu㸌su zVΜtW/]]5i/×Gf |cϜ ԭ=ꏥUdI,Uhاʨ3×/,.竔Ҟ +uSrgrsʕz~eӴݣ^\|/__obѧcSm}i˶|}pwϟ^suO9|-.fyu]ι뺮9cvd"LjcqcΙ8BKu`9& p'56-WѠV,Z!q=Exo- 4FߟҝYYժU.QHud j\6o6dGz뭞0>>^,4Bh޽yz{{{{{7!:::6p͏{DnHtWU+s˖-[l_E7vۿuk4{VהH&ޏP(tM~]wm\^;M>raפ ДGj` GQNlB(@Ĺe_d,@#GJ٬ j0xm|/}*"QD"C]I=ܾůΜ:IJei||-%EB=;w2osP۶m ˗.|Ϟ?vG[[_}59 +K,j}mQ.or.7{;HzK.( @7;XV3k([:~Vi -=Mg?xMpb!=PӮ$[KcM]qh*3ޖz?TU~}*! |NM$A~0LK%zg」8rMN `0H$))J,KZudǖ GJWMP IDAT룂-b&! `iͼS`B$BbNO[uֽR_gCAt׍]31EA_f[EQ Z3>Q`TENBo96ӛV՞6([{$Ywڛa{V8Vp; {o 8eYjs"˲emed?nKuf{o.KEAR#wP\hnXӷ\6ȒE˒QRI-=5\Q Gw$I^sB+ &79̙s@)ф%dX$f~zWYu7BHɠa]]c" -K&j≳RR#Tc}xICk҆ &R2Sy?XEj}s3R R2 Jr@Q!NۣKE]^L1 C!_yZ#6 \11f9VԒ f ek0B>, &fo8MrBhxn?(Jhް` mq:~j- #EYV4Y_0 ^"vO.!E~kUUۖ-Ph2v!ӟƻ, 7KK`{;tVw?TK%Zo $ݹB(KW:gs)Z,K1Fnm|,R:+v$ gXB&n+PCR#(ԨᮮUjOMM-..UT,5k>4˲O͛7 a(Be1H- VU/I&.)DFGG=vmyyc\UUuɮ.-o\|91>qD&SMadJQݴC.bk!E՟;aڰ3RqXYr:loLP} PC.]_e׭CjZݵ5VVUu~i~&P2V.W26:tVbxNf3|aPns#De$p2_dxPk)'#IWGGG[ZZ00t:755bs͛p[[qyݭM,ݻWe8>>gϞM68>>M&ӑ#Gmmm/ndEm۶;Ba,Lykkk3L<XdVuxxbTzGַ4Ͳ7xa?66f2zzz6m444DEuuuĹG$!9@s;ƲhllEB@ Q5M(!mVc\2?VBhrrNU W9_|{O1:t\1_yEKq""u=NPi*Ad:<,+Rf9pm"}(СC۶mKӓgΜٶms=b꾾|>?00p H3 7;v,oܸaeƍ$_yz5kVk[[q\Y$k׮ʳt0g}gfxxxǎlX.o s=o٦'&&yokk۳gA>}: NMMY֡!C=y#nF뭷/#^ EӪ"V##j\&kZ l(.t~pU9EB|~P6 :u 0@Bp.^XL^#֒d5V(;X\\|W_}UQ#޽(&I&bqjj%ˉh*C{@EQ,2 0Kb&JǛ BSSn'ѧϷ[niii! &SUUQ~u8pd2]"i)cqݩT )*˭'ۏ9rwNMMBH$R.5M"x*ZF5g?KQTmm-0Lz޿CR@F xAL׮1oX굵GOYhW 'B`ËUE`YXN]Pך8_,8آ"(sj7ڣ>sBL&Pkk+ Ôe|>׭[gjJC[N>ňXLx\ʲJ.s"Ɯ 4Q3ڄH|.+jnjjjÆ DeVIi&JXEU;hjT>_A:Wr>"i\WP)+3|Vy~+6hP&ghL9щJ:y|X':wR iN0PxϤLAF%J` VK3!ռzkw=JT`h%)_ ?`yY3l,!q-[8p( B8==MtSSS,eY':t(td0؂fSe:ڍr@Z}~UoJ:V{;@r%W+ly| `0+pԢ"+ɤNu\)p<[R eNV<2fOJ%U $4(T=MS,îX#FlbHļ;/@--/>|dbbP(FQq;:ֈp8*7Ȧ>aYf)?"9-2mMD8X,E:.#22o塙 @.X.I)~[ąԐQi1>z(B/={Q 7)ptU{ &5WH˘;YwBbYvݺuDZ4zʋPRI9vw!N-rb9J.@R,FbM˨6i63|(eR HQBU`G'ePfXu\}//UY|͑s<[,/ӡ[VY,eʀ39v@ =h4!SaڬMd# [QT5#ss:~HHD*],.,9F*I 4CN1)d@d_vk?v{CCCGG%aղ,?= 14@~H$x֮]+m݆\n\?$|5(}}})O:&25]H9?"i)yrNᄏO&}}}?կs?ڵk &DS+kq@6׿o^s%H!:2G) ׬[iX1P, *:q N#^_=Va6cL6[[.*x"`8Ii9<ߋ/X__iӦ#G@^7|pbb"Hh,LOtttٳp\x5fd vr8~89(ݩ?x`SSSCCҩS{1e!7xcΝ~IbX8޾}??6:Vg_r'O&mSUDžB--#qt*}ۭ7:58N@ {С?L*OQi HCB"eED*"x_a/޽Dx<,jB"H&߷oqmmm4MWJО={|>-/bOOƸ}˖-hMGNjy扉xrԱ*h, .d 8ՒRH0Bf+t\Id yY[6oU-/yxj.q;#c4Rr)%URi\yb` UU0R__Z[ \(^z ?7,HV y]V!丗ZN,N_?vuy}YNϸfiRnATz⁢ 8)`R!dY;;{K:tXD΁R*#J1K\,STVsyP$mv@ pĉ`00̆ DZc,Fp[GyBq\NBxo߾֙l&?# BT*E\IQAQbOSBjD"v*TvG"h4j.{R)={V˝7xD6cYUUUUh4:33c۵h5:sL J$u/tI6լ'b_KcEX؆:]CP.e$g8N N1Viv!7xބ\%K3ӡd,Q0UP1*Pr7Js AX c,G |ܠz7HS++M,˾o k954C;),ό샟Z,--ckeݞ˗? Q^ḱ&#bpzjd2vwwQBKk۪<)-; b]]DznQ m1[8knjzt%:.M1U$a)]db:"c |f҂$BAYl~Λ!###XlӦMf9Juvv3gΔ厎'''~ᘜy>?m6l(|8v:4>>r].phR͛7קR`0H~2_GjfCΥg旞N,ɵ,Zqcs\AeXh踜@*_}ƈMgvPEJ HF$s|Yt=mT*Q)YA+'5KDGCUՉɩGǓ) hjjlxvt9zlێ?K EQ!MQuu_~pu@ 22x(~6Rum20D!k&w 0{HEϜ9s~ f(\J AUki V]~rEV%tJwc㊁4 eUX˒$2@1 9 LU(`E*J%|ai%5#"D{iYJI\pLtKsSMgјj{{>vyl1N?:?1|n'tq Yp ReY9qf&O;-NV4\.w[ȪL !liiiiiٳH(eP*X^nqJ'b:qK1eiSd FAb^. m(ѐ]x06; u !EQy!Ɂn59q͍<CX6n2`P4>$, *r2Hr4KQ4\Ri;2"]k&q!C1YeWݲ+?V`*p39+ Y8(P*eEB FTBL40P1yNL!-ΞsE?.)r:"Bte:t\+ʘ)$I*RbYl4r%b`0XhJ5 SSSuuu555 FY Mӽ,?޼yP8&*"*s>gϞM68>>M&ӑ#Gmmm/ndEm۶;Ba,Lykkk3L<XdVuxxbtvvj2F[4˲7x#q166f2zzz6m444DEuuuPl6G"vFX,^JO0K65/R&f pN..ga,eZǕ-"ʐL`4U lX.o s=o٦'&&ۉ={455i^N> V衇",Yш ~:O#%npYi7tiV0܌ %BŖv@b3>f IBeB62M@*l> XfARHYuIʻp!L Y.YjF5aQZJ*hyb%s;X\\|W_}UQ#޽O&bqjj%ˉh*C{@EQ,cIRBDܴ1 s5nߺuȈ^&IK<NR=P(LQT\nmm%?4~ȑ;sjj* E"rhDW2:F'N`;PnA[[[u':<_JR ;ԗnhhhL֮]k2Mpoo#'NS^CU7w BquA<,GN&VY)A4dRrFQsQU[[k2BǏ3 S.)|_nf+VUB+ m):}t,# `'rM&ykjjnVl6kĴX,꫒$l%H8񅅅G曉DbcccWHZʍ7>$e=|k_;tnoZO>1NR}mNY_6dY??_1BOMet(b%\$[GOɜDm*GaA3kvӧb BJ?+MӪ>{("!>!Dp!ڼABQc8A.4Mk"0ƪB+{2W$r\b(JQRʉr޵s2I 0HMV) @?zlӜQ- EA|h9!{-hg<7f+#q;Թt f@ȱIJtb$*RLq9QBhhhT*,[WW7?? $I,wttk544xᇫYWUvGѺ깹9DeYmmmVl6wuuMNN.//s{˨;|pT"P( MRTY@ 044$IRcc$p8?O~a%(JWWW6%ם<;veYx1;;jCC ǎ#׉D.#ۚ@~rrriiiaa0;;[ٕ$rI(ѣ$(dܹ3\_ZZ9}tUUU(2e~~X Z,r(ʆ dY&׭[GbkZHNdF&bYɓ~wf~\~gbb4,_ONNT*~v2nw@SUuaaʹ wDц1 0Y fc^J*P22I%BF簾6l@l*MӄxiJz\#kWr>"iwts_AW̨Y檭TRw{Lt6e*<_Frp/3xLX#d2JEviI|^\.0ʼ J)j9i,3E UY)m, Q`E577wvvLOOONNqT*544_off&ONNiQ_2; d2dO666;vlnneSSÇݻ[[[_~WZ}EQ|WZ[[\.SO&B477$Ih$ B߉p8\]]sϝ={6LzC XVYGFFXckq8O=TKKˉ'(r8{ {_Qt:@8~[[[CP.[ѕ:۷Ow^qBhjj*qB{<`0=55ǃVP(]'_W=bI$}i 'z*kMd2`cc+V4l.J^(hsscǖ\|[? `vn/ׯ$R<7RK5yL#o0BA1rF]jUU:};a12N# gAꁿ7}>( E, Z[USH,KވW [Y|>us=gZ~[gP2)0LUTΛAY,Iy Ag$eTZbQN^Ԭ .d|f @6@B}}}XٳïիK 4h]vnNzfHV;C,{>*OVuBFJ%7@Ltڛfq[c;>M~X\ZZNLJT@S,RifFR%HӐlrjφJ\1iT,Ɍb48p$ mwLEMGߜo~D/ Y =?h^^^~ɤ${ !$r>'uK4iek622r7CEB{zz~+jX Emٲ_r:]wvͲ슪y<>O ###{֕ 7n&t:M&6ri޺uve_i_ nE زeoAj}+ iG%t*9Ұs t:|YQ~!Wk{{?fܓdu*(,eVX^b@, f n744ttt{Yps(MӲ,?= 1iZQov$x I0ЊZz]KYmk'E!,M; 䎢() ?ٟ6U&'' ÓO>oU%4ReVԋE;S9j [o9❔4#N3gF-[tuȗR]Rڊ "}M>uAME*t6H+^5zE璒kGU\hM5&ciؿZqtL{+Mr_oCU'3f c&D:2|?^-m9)YMHCJԒL'3ىb&mvX78uC}{_җv]700 sܿ˿|ꩧ>p tМ۷/ VWW˲[o={v۶m <[lYfK/p8|>{7m3@W eybb"HhBɴX,O<"TBl@C!JIy1,KQZfY:MnV~)/֛<) 7vEˋaGyczjx+⨐5lhhEQ3FjW:]屛vFdR;ByGjH ] 9VuU&P-uT:z(Y? [)cְۺUw$%! dY#L rT.)d6/ vZ 4>~hhl/~wnjjZf<,dH$dq\[[Mӕf<={|[n_Şq{{-[(y뮻 a~*[{i04z/ 566nݺ;(WH˛{.;{looo;0addd2Y,Y2D:??eG̋(fK[:6yjdɑ򫿁iYύ͟HB讻ھ}œMOOCO8+۷^Ȉ粋̤Sb=݅T,ȪFʓirιR3/09XX.BLI&.e (L78#-'OCX6_'g՟w_{`0}7o{;accp"{ \ذoq:W:Rt910Fdiq><7=caiyr'Th_1޶mo--- lذazzرc6mBep8֭[FU CUMi{uuvv={l yYՑ( q]/$'V5' ].~HJEQnw$F@^*SRTGGJ7 477OLL`eYVUUUUڵkTlooWESUTHQ[+h|atLCՅ4g |ԅ8Mii~,..~˪8sv[җRaS4= 8춋lu`膭WQEQT(b/Y 2>9 hnS?EѲ;~wĠōjh*EQ(Yb2󌉑0(D Ud#PfC.աC9~6zLe6ycg}ѓ/,v/|L>==(mƲlss38;;+I~{zznzI{ 7XJkcD"(jG3;;;i6Lqw3glܸȑ#D)7|s%$21333NZvmww-U.I977cǎ'NW \\n̽"␱Ǐ_̙3===cccMMM555dwd0|P(+\JMNfssR}n0 LK,)Qv$x:aMMj]k*X,Z.//݁,f++ҤŖϓ2ka.nYQַut3  1"qUEss[7#wdP!7ܴc0fΝ#Naw^t8_XNwm py|kڟ#Ӟ:lJ'R9J H0g񮘺P̦3MQ.*Xe()%F:.2G2qiBy{CWS3:>!ഹ+E3gb(#j.iSSSSIY!mbPi`Yv}A̖h6f]wʝR(^!xȅj]4_]c9T]FI-K% %K._@G"///;Ϊ1e'&&l02L:r333ډ1 NzbСC&IcX_~}s]HhPr<m <(0~wa!T.t%wVGK|ϧnu:R BrU~?fv:LLLSYc#3ߺ Wvu޲BX'&RKR!lܸ!{6/AAsQr KٜfZSFcgbnh\T2ۥb Z:.)JEr,挔0qMs bvMN2:t`WH8/`Db*&T6tAGFF< mkɲ H,ųX,/7 E9$IrB"HDQsYܬ_Ml*޷oߩSVx縐+段WgUYE45qL6;ªZnS.C(}o}^e'ff閛n>qOb~~;oyrY*RonsgG#JB IDATS7\]S(c:3V.bUxe.ޘ /͗dahb!i0uNֵٜ>%@-dv"K:.ilb-valM!$zCϼR$`%p=L( }%28}ɼvtHDžK<@L/gQY^ήΎ3'3o9`r̅p6mDݻO:pql:lRUUUIFwڵ 쭉u\7o޽{w___ӥV"n9J QRO2d @HQT }]J2pC_#fi1Hl6+Mx"{.2n+L*jn(=6\NpN )E-eyU*PBJ/ VhGe9 F)ʐa@!3h:t踰*rzLE-eleP"cGED+3qGXWWco5k>p#wnnnff^eӟvwwo޼yhh([n_ h4j#;V(+E%Id^.)DFGG=wyycLvuuAo 4 |іp80Lg=sݾ:}03 `6*hJ%ٲrRN{ҮWJ=ˉ7>9KeDG2EI X@:g?>i2I ZXk0wyX,֖L&_x7nbcccR U^mohh,뭷޲,r ۷oÆ bN}q@GGݻ9sh^([lq)J,vcr/ť\.W.z{{^o%u=H|׾VЂ 9r{=vXmm,z 6=zԙ-Y!NG`6GFF4MJO, Tfe5MI,Ҟۊ鱾WDN~00W_ꫯ~YǺlYǖWEb u ״Uy}>Xj%k ˶j7o\x})`-Hq}SicOe_n Rկ n4v7wP0DW`'?#N͊^ VA $40DP,} vy^:sfܶ(9Ћhhr|6a.ݪ41.hm̋Cuuu>|x˖-lvppܹs[ly嗟z)뻻zݻw+W:ʬ톜'ObׯY(۵_4MOS:p> V޽{+9!+Vڵ#s=/R*Zjt8%kjj}1[])G+xbgg$IsX5 CCC>ѣNGO>Em2UU}wɷX 51IEL J/Za0UY''1՟glR]]uiVmnܨB/e vӡEFrpt8bm9sF8%cҰhC*ST*W,8@fIMX^B"ےe\Rj]E[Etj%Sgb彁`ŔffTyjRM@ X~W^yem^_!ڊ"iMӆ (~2QBQWWFa !LƩtRGQp͛j6)NNNX,voKd2L&s{AQ&Ewvv?~|۶m&T<7 UG]ѥmJ%mN81>>.ڥZ\iYD@2fD2}j>}M+28881goŋ驩2C؆[*&b<s/klQKKLDÝ+NN&N|/ZSH&fqKja/ZY[D~#Ћhho9ȤMGaVQTEQ!4$K.,-+nYbU8[&[lԩS0Bh֭a|>Y8XhO&N#Dn;꫍<@4~xTӴ^{4K5n'NY?y*ϟ?]*\~]){]]ݗÇJz9d2m:thzzӑHd}}}>QyXe ڵ0|i|xڪʲL<˻^ab'6+[6>1޼ywz=mttoγQVٹͺ]}敕Ag{kF|͛7g~q_jJ/sp1QPI(aCBy.cS,^E[EWT/XḛKun;R\*EYqM/@V]3ESo;{V=Am RJ_|__SD)e9E2+ٌ1'trvtAa8qYBX |+{'pM'X|('|R;@  / AӑS,((l%.I|(g\ [lq}E#/$NLLOL$JeU_L'ΛBNtk:\.]MIBHY2f46/]|_a獂qM 0.om0eŘ %|@X ,P2(4[X!\E[EXPٌ9;T˦G(YpH|4q A|@q;9XLo7?֬2,W^n4Y/ݥ*%_X%+;[Jg鲵2hV, b \Rd$3&ɥGGǽgc3{qU*&Amn$C "-I!u->Hhd4" hhDAT~KsA6,әi1OC_^BXZE[J%#T-E ]JRJ"宏ޫWhV&q{LBElQ ݸ02L$S3e*Iy-xbmm? ^@6rS""BldР0eJ服%u=2X9g;vȑ# dҶm9%m^剹 .u|qi9cǮ9G䔴m&,0U$ڦz RjԢpmGG/]XE? "ƋE$ e.x$w^Y]E[әaٖl@F29'Yh<a k[c^&*f4_*6hEx5D*Ug5́k?@KKˊ+|Y0Ɩeܹ瞓e ]mr@x<]ֲ|1vȑuUUUC_Sc$5mO6u;B,%49׫w~[zG::ϫHw/2:֬Y /]ɴv]m__sο"z]6 beHX* LzZI uuX_.N׫wSo:2==}̙{N!7ԧ>uȑZ,Eў2vvz^UUm۶9dgӳLLP|AMVD4ى/?snlllt^f-ˊb|#?F؞1cnZْ$UWW{>^ۉBկ߿۶mT@!1"u>Quu^-eQ<4;% U23@H@`l: z8cdDKF@f a] {쩷E%9E*L*z\ [p/c>z~=+ږsdFW/3ѭx'?d2c6B[n5k*]B鴩[ޠRBL`٦frSq.'zy-  dsU& 6 rͫGn-[O<īNۇO_,KRp0SҶp8D]]u]3gd22/B?ٟ߿ҥ/^[E)JH$FFF֮][2)%8yNJLnqlej,)Ɉ"̌`ZTuKN ,MmkzQimm-h8%իW/eYUxw_dk0Ν;WI[MI)E͹>R(iރ>`؝걇C 0N<1:://6lغu}Bաon͖|}̠Oj8sc=uvin͖\x= `w;v82-\o036hu0h[R(@%H%JF ݰTZH*>T; {_?^r>W::>$Qߏ::@;\U_* a9cki@ !A(9;R%6EAxA(B%,)nB!h[6&8OȊv{c@)|sިmNtH` p@[i Ŷ 82(@y^`iN&Mb"(+W_mƮ/lJ%cFET*fS3ZB pll*Kɒǭ soöm? ,]Ѣ5MɊ~{{{W^yӧO;Wm hnnk֬Q~ʕcT>qĹs֯_bŊǏ|Ôҭ[V]69###+V8sڵk{X,zoKNɱ{knnnllBˑ콳c,ªU;::DQ:\)@ʼ 6m}Y6۝//_|(CÛRwqzw2]Q8"Nv7s!#r\wy"Hd.i\NӒ+% ,B!QqΓdUU BhӦMK.;wp΃)?V+;;gRԫH̤ +~kT:tܹs_\{<۱LN>{ɱ]}xX,ٳGWj4=?}KST";6敿;8&q ұqSTEYV[PdJeljbY*eP#{ *?j⼦T-L 42Z2tG[oh*=-@KuM'xhዶŢ!\*B:9dCL2=9V#ѶxN5#H̦7 1feYmQ(Eٹ$nMh%K/.L4pP IDAT,g0R|A.=^f[^ Yp yQ&BTv6%*,D.^"B(UJv0M3VV6~9᭓ h^Vm-ko\fClVTT!'2ٸ(斦pʶeg}s鰋h1Q%qU+W#Eq4«jUVKP(4;;[WWgYV2tݒ$U%+g?+_y¨(&;wo׿gDJV]]/\xPssnmrr2.[7Hd2fC(}bY֛cƯB-S `x[0.4_0㳟-[v씡c+xhѭll<5uK{{CCCSKGW=G^v C 9.ݳ'>ٹ qP{"[I'3.׭miG{߅Tr g6l䑱[CTReF&Z\.dl^o*n9C@O*ŋjrUHIYt -h,C"fIg)k!]–2q;LVS KPDRHؙNM/30$ЯXP˯ڑiBO\.Y):f#2\8^Vȱ2@fߟr9ι4vG^ Lcry^Ryg"F4`2 D qnbdF xUV,1X[X(*MJz:igqWk%Xxo~p7b]]]4E]FG"Y555N=OpWW,N gNݙXlucwbp3.XlR)ln,"Ĺ`jFav%[&CCCK,p;{?rYFڸqѣGcCviD"ɓRrgfͫoK;ٳH$ ?pΫO>jժrC9{{OcmԩSe,-=T*ٔNLZv@Z<'SXN@T,۷od?1^lY@~EQN9N_iB˗/$vq*7x~c ˹!\fM%vR!p,jZ)[^vj._HM[- CI„@(el6{'s> }TPa1F$H`۔sP@ Dq||J[aKHffK<޹*X߯H'z$y.ui\[o}M拥t Pl^C&¡cK|JY3u͍7d9THMꗈipiTG $cg!IICJ iy 6!BQsIV$CE!+Aݼ_  -ŧzB+TE.1vrl'efQORDrl,0(!P2ŰK䈹@/in Od3aBp]}K#X2R67E-kee eH8g:|-[sl/?S^7www?Cw+W, ,rO<֯_fB3d_4MOf}>CZ[[[钪{Kl#Xsk׮{{=KTjժU7%㔬ٳgOwwcǼ^%Ko?裕_xS}9LN!wQ'|ҁ1¶k׮WU_ܱcێ?5Ȁ 7 Yp$>Fp)\+(QrKw}?2ٳg/F)}'/ K;~DAf3+`d| !ĦRt=JÐ P¬ A$v[7CBmeYj۲}3\2DJ._RWWך5!BeJt `"CB6KSl6WtTDA[rAo 9cC룁Pmۅag%@cd l !"ԲxJ%-g\L1ᜉ"yB$ X+PƘE)İ5>ƪKM'Z,_^;9^o)+iX4#d0%@9"U.K7Iv)bRhٖE$Ĺ%h6 ԠFFS!pha63[9`6ЃKTwe5h(!XY +_~xrrW^پ}kf۶ovww"!tZӴvgKﯔvtt9,cc0:՗.]Z*>}i6p ؼys___{{3AmRJE Xv|%d$ ÙL>555332 cٲe_ggǷm644455 (h8**Qֽޫݻ !۶m;qew-`mzYWnjr+0΍SΘ~%gggoZ_ވʥåC"gE!j躞eGAt7Oo+<>I۔9ZSe:E7%=L/u^Kl)<^(IQ`=Gl|"je぀װrقBonA e|X1eHT}㱁XsSm*rƶ Dk}՞ȅ1v:l3n~K!OCcSc>IŵX2;KoDRNO¶1% Iڶ H $@ Cϻ,f&yC4lȘM -JUw2)d藛n눈 /zB7nOc Dgn!R/#n7cɷOeVF^Bd rV"SvG"W_}F?<Ojke8'NXfT*DnKׯߵk#}{|@ P [[[81۶:4==}H${g}.s4͟'|~ӦM]v/!⎇?W-]\j@1ryUUEPY,CeՒ9)Q&Xuu7=|3Xn"$ Db 2K86J644\iBhՒkզ|NT@diٳL<;u,Jt]y-1ӂr.A\>/B4$,yxIԠDTe)tY]R]bb6w.( W&(PBƊŢ(p@X,<ǘWOg&cJ$wwLCtstTAd$lK4B- PtP(tT2ƨZDƦgO,mA$+u]u]o|'wX,BD(Ea9(Ya?؈cb[ vTgzJ3=nVR\/NO=Hd%/@nJAHw4ea`YDzc?NXv9/| NzO>h[yf'͡Ƃ>v,Wo{CCó>[({}߿qFҥK >3N2͛oKǥ޻{)u}}ɟBf֯_︴f͚;v`mcǎ2w&f$""P 4i-\C/>|j>쳙L楗^;޽{( 6Op8mԴll:;::6:<7 [l'eISߺێseizlJE915316~ЁĒ%K=y]zgomyث"&d<^o1Lͥzt]3%ۢM.im;;R~a`ݶ!E˯Jě @nY|DC  lRL8m $6bɬ%!%Ȱ KIT="nC(Bڰ-́əh&&3 R!Lx&7gwmg~P0\phKeU*۟::vuڬlRK;rʎ*떿Y,?jjذ ЄME󂠺|؛/<2ƶo~wdɡѯ|+noo?r}e:7wO{gBt76AQG/=V۴iSGG<Ȳkn&bJ&O<2p=Ot]ZY;}dϛN\K@M38 A IE[+.dJBPPĔ(A ˙N!Ps2 JOBD.ܢkx]d6"B89,fKy @R%;843 F鼫}J,T=yf &Fӣ RsAŏ8غ3J`Vbض,a$Ib`%(d0.2cf (R$-urfַr꠻¹S$\ bq "8o❧6,tmW%Ɂ]Y+!É)@ǀqK0.cC:x…p8L)u3D0LRο .Yf©'xG$K#ykjkk|C"B !~9@!8Rq"!;nGo/K*T[$+b!751ˤ 6mںuGNj1ұӧupSLL^UU~RaKGO]KuJ/۶.I 6 .|1_44!oT%Y@@g5 gm2&~O0f7d@mr:_#EQs6< -5-eĭ| /ZJ) tcOu4ogGgr WbL vQӘK 1ŵe}>?Br+-|(ɲb6 # D(%dTB.I)Mgrf1H- td^ Hi|uV":;8>Q)[% b|65gfUΣ~\M9?qc;L^p,7}ilN׶m_/+yk7%pezػsČ9*,pUض='^h~SYBdugqmۜApjjjpp(H4>>>>>~\.1ƫVf9Wҋi7  χ_[].睡cR _}g&3 SJ!4!3LOW^i险3lwlEQ~~{ff/w(A뮻z[ZZ~СC'Ox9inX߳aÆ`0x59|եku "pm$ ۹\^E, P$$C*SDU R٤Mej/m K" DF^QevY˼M> rZʳƈJ]OONL,n2-H@"5>B0S4u$: Bdh@Ʉw.,ܲ9/h乜VƅCmZ zf[hOLR^WC:઻.RnLY9WUhd`TeA!bGMג[,BnF PA]/_uuCBXUUCqX0 $I555n?4Mrs5BUեb,%[6P-ŢR$A- fXr{<4յ{.v@$O3u\I.TH=񭈻<Ïg2,,"aL`_0R IDAT0r=@I+]'^4S@! H G-] /xĪC-B A0xZG|A+W8[pSRpR0E#cI> 3rŢڶZ=o'LIBsRehPГʨc,Hl߾=ݻ;Fohhhmm- ǎ +r6}hsG]ϲ#GLOOʲ|iCٳgO0FhW^innްa!555eOtP[[[KK3gǟ{9A 7xSԑ#GjkkF{zzǼT*;wG`0m۶OеXŊ0O$(崂h<[LT|bʓ+᧥K{L.a rs4=yzњ1xZ*e|f~ϧTJ>}jʶmv-${rR֯O9SݝG;Lكhp={Ȳtiqo~6LF@'IGqxxٹ)cX8AUL&uB!Lt{۳l<BdtSiX)P^!rBΕS`~kjjd2`0r\ c ]\Ǣ(1XD.5El -ꚦ.o< Á`?TeᎷ% pU`UZOCp( mQl@0^\nN%1Ur9 }kQ*5'3ϼmmm˗/?u@www$,+;.r9g=SŎq%d۷/===8M6% W^}vgp"x뭷*UKTU-I)ٱcTkk͛yEQnK^)Y[[?GXfP(8ij___sszs9|;v`U:D"+VO~3,Pi~HTŒWD\L1og( B*hT !$IW&& tSSӕBw~w9M78̑&SOsZ[ vBVssח44d 0 5]SczuԔ/Q*DloGOAוUC ccr--offfd(Bcǎmܸ!&&&;̮9޵U5%* 4}b''98N~1$y_c88!*hV{9u?Ɯ\vWKy@sgs|;bm2Bp0pWUU8A`OOOii(~ŋHTx[\\ڻwΝ;MR$I"J ayy(^d2NĄe`aa85;;L&S\\,Iܜnw8/rHDDPͲJ@J#bB$X*JddbT&^pIGy|qɕa˪~HRK\DRYI YFJ'HJnBڹs{%iƍ===,sU'555 a\pǎzWohh)M&EQTJE'J;::r3c*h|+.)n@ WTԳ٬=w\4UQVVk=GC I$I, 6qSxK ')6v18G 9˧ 1{]:Hx;>S\ZH(LZ-6h4jZժT*n۱VhL5H477kڻvVVV>gADea8Ö@Kz}B!jh,+m޼IJرr%n] o۶D "^oE\Xc1xb#QZ6;v,lnW9PT!MtNi4ɓ'S0}}} TVVvtt|>)IRooo:il6 ׹sGmm-q]]]vj y   xyyӧSTeeӧBfyaaAV$Y,_p8`X(0˲xN<yT*vs#5^L&rB 7n<,˹Y: %IСC7n* RWTJFw&fQQo~eG<,ˊdfV5L:!DtUUWF,$!#%D M$C1h 3!ZAϤlZĖ;˲|٦&̼(1v755]m%vvVVD?[sss,*..wڤΌe%DT:I(VADID⹋N . <3gi2% ({>^VT7b0r`aaS~Z&.AjqePCә[\,u`z2ާkEɍǖ'5BЈ(ɂ B8 Mi_ J˚TV&ݥ9NJ===80XZh'VkMM %aYAA0555gΜEQ766疼2:VX\XXzŝ$l6|yyyueFn@˸R-(}}}zU"̸\.ɔd GFF %I2 ljqFߏ=ꪅ9Qr'H놆eXCWwFFFl6[MM (J.;X~\ !1:?W}V}rr,8Ip8{뭷kpF=LhF֘Mz{FEV]bF\2&dfy)^K+:c'6r _6?9,}ҨCDž"ݍ$Z`)Rp&c&ʌZ-c}A 0Kӵz%A2dY%2p$M )rb24=[gIqBǎ3 G"L&388811r ʞ~;:tz޽E^xy+**Μ9X$IRX~ד~H$A>\UU/ʲaÆ_׹aWf0˸y^>88#6lXw{쩬`x[{gdd$\SN=zT6R!:Na"xn+]%s;\eLĉsV\\611 {=ٳg3̲>~ر mΝ;g333ǎ{wS?N:%rgg/d}eY:~xnx\@nʒ:CEYeV;q‚$I]]]HvkbhĈip%N3KĽO N[q1\cd~ni*$ʌBK9eӒ",H|VDXbD  K0PhhG8$BđB HXֲ2es[n/--喼bjiij-..NRf(ۭkkkVk:d2/BUUԔ2Wx Ź\|貎X,( "yl6JKJJ)//WnJQTQQf+***++ éT̙3dRA ^/^l0cʝnwءLwۇƮ:<;3k8jr/Wv۱cXQQah'2 ~s'.L|>3~fAFQjmii9ydUU>pXzz`xtf|~^K֖2W_hSDaYd mmUEs/C=D`UUñ|>_EEE0|g/oٲsiށ455)q&'' A8r Zvttjzttt.@MM͞={B7xcn6Vvܩ8qBN7333;;Kdqqq<B Kx\)i4ѱ^B@駟ַ 4}k̙3gxxXmذ!411QRR{~LHq"Eqwqld2I^镟znKe ;Tl M Z Eh-)2h<7 _U=[Tk32$˥r N:Gz[sm1Ti Z#d A$N %xCXTTv.Sj,˂ R)܎JEG?ѕJ 뿖uj>}d2)f E=Cuuu^7%I^S8Y:&"cX,v{8~ױ 5 |g-|h L$X0ɓ'1۸}z{{oeG֭[:NՊ]AEqpp!q˄t*jK] D0od%$$kz}L"B4L^ oHSSөSvLJvܹ{~l6RGtM{ dRR)8ܪۼysss3EQ؜j<ÖFgx<,i4a9BJF侾kW^ ÍW%^K\7|̙3AT%I:zߞ;&irrrll {4>|NLLNL{`08==եht:/|w' ާ[v*aIǥfD\H*Q"@K}DɲbK5Fhܼia?7X{g%,(~! b Y2*^{ZnuqpB˭ 09*9ey׮]W_}#| X&CM<`dSNg| ADQ$VlTq4JqRZ 4~7 iڪ*l!ij$O#Z裏q5h4AV8 mF4I<IX'T>aW*yz 9E=nG}+6\-#uuuCBz$ING׽ITV_ Ǐ$E} vŔ۷oǽ(Ö]]s\e nv%72EQgJC=$-ܢ<~Gğ"qNDMM AI2Sy`ԪnikΞMF ×R29iI'E~|o|}7Ͽvڿ({=tP[[[yy9>aUUUdRVLšȕi|"Ih4WVV8LEQ+fmpBMx].b|:ʳ nGKN}aaaii otKKwuur- ~8ۋ3x \ޮڝ;w>3V[nU\XvCK֢j UW]0, bEMLL{8,_=˲xP/RJ:p|خ)_es?}_9Wf^ W+/Xmkk[` 7ܠ ʡP.j5~0ݕwp]IǀշXyv]^6>V+;rOWeLHK_}pjCdRI=w{n p6.YBEa>qDkkd8h4T*,N ANd:\]9{p n^g2bs=okzeB#';I5|ѷ[o`=~G}[[tj>Bl03pVeI>m?1Yr_:m.(*}}}:.T*akNCB }}}&!422|III (**^ZZz^k=z}cY,,h$yĉ{:. ÇAc4WLKE狋$)?<b|\)Cغ{XE$755/~q~~~bbb۶mւzᗢ9Ed":HjGc ZB628mItVK*$fbY!IBl|6=Lc2$ˉ@QHfu:KAŲ%--d0?YrAC]߾ڿفl"4FO#[$keobr%9q\KK 0$j^dWIf\ ?oJJR~(nٲ//zC=SA<裿oΝ;788ӟ4?Ï?'x{/Znhh8xO}O$?gffFFF0cǎXfw:$?l]j~066#4551_zR+32BF֨!yJM dc&EE@̯yGkȻnz Ɩ}ɱ_mMxMxqjo Nظq,R埫_aŲ깧+U%92m˒rƥ꩑R2Pn3*<.,:OgB o72n+kђD!mԛ(DBXxa#f#ٹ=B(polKzu̙dP bYo}hYBY:=`5ju$Eit9fNu؀Vr[8xiټ*9aQQQyy(Gq\`g^Mf]]]8Y`MMoovm+yjuuu}}}4M+v2 _N/})p0wuWyy׾T*-^B|x@X,fZN>/>C.VRF㰳sutt h~XqYdRҀ ]"IǭctD*46 İ&e.k6CGy"3d!˕E_ A@B$ge:?y䱺wk( BZĘP0BªZJf|]bA5;Ah}A?F7t"o  4 ^aQduu-igvo@ß\* ګw_?-A(Ua1i!XTsE0ż^$IgΜMb199o߾_;<<|ԩ˅4MNNݽ+رccccJuaA-..4YYBhΝDbttr=qOOO Pv6mff&Hݺun7_גdooEiV/vז!x>#BN7Im<tf6lhX- PiI'c?Rk#<H5T"\~xZE19X nYڂ2Z`zuU{ Y6p .R+|b}pvᵇ!F[e.$I+"![q(ed!VXe92nߧ9*믿!A0C#I_Nee!я~T]]]___RR$ag$I>f' Bq B)r65͹A Ad~CbQd2KJPUT멫d܅j%<~ VyE,l*5(^ʆcH$*Zgls1<RYM\9~p055u7ĥVU!I, |84(mmmJ^[lT? 0KJI%hLcb$'??>lKK 8Εx__󃃃vO{g,y,L3i L:SEnh4F U GHl"1.s`F߾jY\;'$IUb"T*>s2(Q=!⽬$I ƪ]*Vޟ|;t[uu/B6d'*[5>Aʂ2"%Q @iXɄP5uMW7pnѣG ˓d__ߙ3g6m_b'OTX,v]w)PkkkAA O^\\WTgϞEv7x Br!pll,7M&Q4 ?|}}M>lXl6[GG\1R2?GPg/u@oodeeeΝ}iّ}Qrݛ6m2hܹs CAA-ܒOC;sBv/h:T\aGy)@˳ ^$!VfFF 嗖|fw4Z(*7(:TQQQ[[;::CXxرc Ԑ$+Pʲ|a~vӦMjzÆ 8x֭[nذa׮]¦&rEܑ#Gr9FiS$uw.,,o۶?Z, \[w_gghss󥥞L&GFFsC\ShJKKu:`!L($I \{k;bAsHG1LBG h׫3Ee*h^o?!D1$IbSUz:M"OQC$ $$dR P|6޼]]&8#<؆ÑDQh62JZX,F+a˝;wj2 ò,ֆ4mXXzMMb0zVuiiIE싏c,,vX؀;v8+ϒbYZZ$axxt*O.!uFSRRx***rfx i>N]nU$T#O3Nwn{X;>o|cP,eeٖ~A6mڔ5+&xh4^ _2h6, RSyK~;455iZ011!(jvv6 ɲ eY[nD"UUUZOen۔D"ij!ysæ$2b9Y\^SRQ"f+?wۺu+~\I!hxss3EQ333nȑ#uuuL&7P(ڰa_r  ).)dx/| ,2t4 $I8ODiT4(f6-ɒD(T,dTu(V A$EQxb1G"dI錁9VSx'UڬBA$0t `0,KLےGy|%io; AȒ `U*dNd$uK/C$988XUUaXUTTg}_-[&&&|>_MM G hjjRMNN_GAՎ>|]V|:NٳgBo̕&qt>%A:>q :nfffvv$x< >Rh4 Hz x駿o)4MӧOkϜ9xu:݆ ;;;񾨤D7nO:8 ?3SѤgaU|J(ʣ7V6TK kΜ9j V5HLbܜ(p8\XXٳgjZ...[^+1::w^Eք|P$*Ϝ8h;#!>yW\f{kemllۭV+V`0%ZVT<ϧ鑑Át:SN]{+Iaٔ!Z}UBn%3gFGG%I*..V..7|3,Kr!x<oСCNY ??6Dje$΢)tkkjwvFQFgd4MH).WHf_v3w_QQ@ Pg\˲dGN2ƪJF0(Gj6y#AQxdysSNܹ3 ܹs_W VRGtM{ dRR)l|͛7c}lWUUyfq}jkkFcMM ˒F9p@neZ۬G꫟)k^yp8x%Yz7td0JJJ.-uI=zNdq<>\QQ,ϟ/,,0bIMϟonn>zFyNÊ@y=M D09H (z HIAH4d4r~-h4JP;al!E/$t)X{ TTT<#ʟX ~_devܹ};|0PEEEwAJ&H򪍛YaH]"I|WVZE!KjB`QFCZ K @-EJ\:|Ʀ<޼bfvn~v@>M᥸J@S,ivn7xc׮]E`0{gjkknjEE"L&311QUUL&jdM!zX8( z$IQT4+++tEEFQJk`ټm۶E!Tڔ$IV{N,)%جR_XXXZZ"jIuuu]]Z IDAT]r‚8Nqo]E!#AFFFv-=;;#4R2d5T*̦blFr|HӉ00zRq$T*M4)<Z;T*U$$ G"ifMNN*;3~С@ aÆ%o~~W%rnWk4!Hdl羪hCFuզxn+UikyYyN'Ñ_i,`(ٹv_PfP_;Ϸ-FPvt5 !L&9#d29ε >,[@S*ٙI@VpYixb,SdA$a"Nc}U/,]a t:M4GNiv⒩Tjxx8/CGUxO_,).8ҟilf'@Dl:,D.IvM ,ruu5B('NL&FJ` AV~AWtc޽EEE7p~z"f2<˄\wwwss;+ϒRrͯ*N}ɩ{GyԩSf9W.//?qh<295lnkϳP}<χa\!TRTPQUGkǁOEc[5740j5 A͍JhQZ,I/|wj|($I,ozne=^B~vT .;2ͥ6q;XY`K!"f)WT'4.UJ$mSi>ű;YvK82K.D'SG9YN@H}XC(˲d;ot:84J.'\DCI@XYh[ULWݡJg>O E+=,+qS _~Oj ,բB,iЈ\TK1zɦx2$Hd >y"T*K$"@<_PPʯ`Y#?\xpKWMxд< oJ=wnbbbƍ WG/ JJ˄e.p|,)WẄj6J\Bu(OLCJCfL<$^cu\:VgS_q$I_山eN7oVİu\Z?{*Re˖-SSSkVb̴ XW_-+|E0dHh{n/9ӹm6eB?g%^$oC=|Ò/t05$ 2\ Ej Y^̤bLR7[Sl8M/Mτ*Gt:N1ѡ)JGBH1 X@`2j2HY^<( ,@(&iմ|9?y|A:e Q/dkG#OȄBNe'I4@Bf">Ac1 !x7߼rIBDuu$I+BѼ{WBY{Oo`,I4EH2MǏ߰a^U?{͛)8Қ?w;wn˖-hH|VL3\4*Zf4*+hd% LD<-dx yb-{<.b]!j4:T@H$WL&s(L$ BQ#@3,)>idt+jH`g,-S)Ҳ B: /!-r[[[0)//N-B,Jty, _B}#\\,wvdY>u6k^O/l!EBQTT2A" )|drqo;ʒ &k4WbՍun"ѷ0!QTZ3r _(ʥ,,,z[eYhhh:\Ha("1߼@d9㋋f۷l&$I04EP,/,gn޼fG`B52{aIHhS4a4Z*eAjT@0#e,*D<>fH( (^oZ!XLRKR*Bp@( B-)'B|Fuz6 k!/K\VVV__eIHU*"r)xӻGKK SSS7x,˧OnmmZ$6\W\E }b1&BW#KJIlRQSO=um)H'?? ޷hnn~g[ZZ`x) &j>3sҵBT>D"7/^{qӦMǎVWW[qCyGϝ;WKQLOwvvnذ|@(~UVt:GQ8v8y$u466|p$hqIQp8T.H;{6W]%kE²RTquH䴥 IT-y.l]zI߿E1B4so7tm[ < D%MWUPW7fV'EQżB&eydv;!$JƘy%W!!,.UxS.fYH׈ ,  B-IZn;\VT9 aE#B`36L,oݻ[ZZ-[vׇB!]׃`4l.kllܷo Ô ? _ذa4LY|-[Zvuu,;/={ʣHdifuu#<2==|뭷(r\.MDzo}[G\z^(V^]qͲ$IOnllt8.B>[Phb4'&&,FׯPiɐQ,f-).k^( PU+ڙљ/a: C&5t@$y {Ns/?imk%-͎A`.Νr?ܿaЗ]Kkz2>\X UZ|61`fr1 ͼ]r"Fۛ4qS=S\WcI, ̫O-APo ^` &!D|Υ ?LB@σ{N64M7v[k}/(DmZnz:13^9.El`br0Ƅ&.rPڮ/}fhi ,_(6ܶmv裏ܹe[neddĉ6mj}>ڵk;::^xjU^p֭htcWX100@CL{<eŢ֝a6mǎ,mEjx~U_kMNiC|إMƏa`cq$!pHT\0!6٬۾S#Aˤ2BEUUUU _UUj1 dh*MEt*>; xFV׭r! `0!b t7Ob `> Oea*V7VG[|"-Oi_QcWtk2E1~( 5 Hs0:M.O{e-G@UMu8ddH=pd*&?M7 M{!ON&6mr:LfŊNٳvvvJD"x,D<< @|>AN'133L&kjj~,3 1 E $ ,NNNnݺ5 }U|X4+VWUUYO#wI"HKKezUUUHnUUUUWW:u* E.ѼǙ955qF0fggu].?/*Bzzz?uuu>>;:1sz&ظ$4q7/&5%)qeYuV*臬iD"YЮZm^lڼy3 Ξ=L&B4x!@,)Sf+Ce˖K˷l̶6rٲe! ZdnwJmJ(RsjE=@(n{!?nyֹ |AY o&D!ZhuS\\7@USgSI*g EyꩧF:u7طo}zCS %@:t!H4>>o]wپ}40s`70\S\">v=إ7H{#Q?XRɱRܸq=3nWB=d /2C]u5vz1_ %4Xraen'q,Sԯ Wc$W < ¢ !e "@abc>1̒"f"-|J$!XR h!84MjO(@KQ4MzM0iTGcAo$IAѫg뚚su6Цi`Z1 -7m{PHg PFLMQBzr|d13 x-[M_<KBP\[=4okxKU B~Tu{Tf&ڂтκrrzn&pOLLȲLm9 |xl6D2ljj'I<~-[鴪mmmodo8q"ˍ~_?ydssu/‚HTTt]?s p444XB Ǻ tvvjjjﲄ ǃԔiѣG !Wwwwrs(jo裏~_]aPc"5L۽yf+Rc9ua+TiW4 9c@*20DK r:X  LBTM#r,ji޷jhh(7(9sf1Y92 zj~wuum޼ȑ#x]+H`_NMMB4**E]S^wSNr.K]!UUU===+W}<|]8D9sL(z'Ou}Æ X*S'd%{u>F&ԁݎR\QSzbaGGG0!DӴgНwIӄBI0BqTVӴ䫯sA׮]kɓ'9۴iS,[|wppp^(5kրdG֘ˤn%,H[lihh8{,LܼyѣGf7 #R}||<t:Ͳl('NȲGZ@ P,+'+xpp0KG'ɸnKVbbF"d2?(ǖrW~>nAEM#:$&˂DVbF !yL^01nش$z*Ҁ sWE+!nOxZ-͍^cŊNat]Ak:/3,}C IDATs9@F-MyYԒY[#&>=^b 4هXTc"dMkK۷dY޿c|||bba\.777kR.RnUtqBx'N;k8wuѣG#HXjզM9BE cvv2OOFGGEc41*s8 =S,]fͩ !pXQr5*'?ad%櫯,(J:TO~g|A8tYa+H)cS_ -.H$־6qܞ={V k֬I&k׮\ !>֭[{;ٖ1eܦvff[\.ѡTUmhh^ h`pzz:S;Y^UU555 d2(*R__O'5M[bE&iZ[[ǩ_αcn7.r:f ^` rbVـa0aR4 2YkJk Ǧb ~t"F B,n k4c@PPECcӉٌes"'eya\\9+8/ێl. ђ"\,|>* :ilh buzRU%:2%"_=岅i1`q-;_Llk9䘺1IGynr>O4В6/&~'*eRc, 2X^xD"~?RB@N֮]1VnG"Q~a͖NMӤ@*kbaO<9666558U;b??o| QGs@=h};::vS:::EyޣrI15(U2 |<FTk/f͚H$DbL#3T*P(D!=wܻKQEUUzAM @~7n>+uFFFLӌF֭ B~ طo_uu+|۷/|zzZp8R__/˲avvvwvvjV[[{MhqjjI]WUU9$2&TR"X#tɂPE|!X<_70-mw`uy^5L=FM !0tC 8&jEf$ / x}KbpQCsSǫPз\[!X@fkj,/WAo$@261c8&ȃTߩkCՖ$0X,W!v155k=oa.߽{뛛NEnkk+ (z<Žq I]WYd24{kk,---32ME1LMMUWW|x*Y)d( Zs9}׾݇Y|cxYUU-FU,FVX,eaxiy4 yb)YĈ-vMLc@*F -K{+rMiS}-Bhݺuk׮e&~FuժUh4}oΝ{ַaMw;[;Gϝ$q˗/j 7`zzzÆ TYq,HロwysV*b͛WZU0L8~ꩧ_Ɖк\[r U˲<33TVf2RDC,gòl[[[{{{__nx<ZXkkk-[f9wR[gZD"J*pͳmv*pPMFCDQ s& %T].-   ?'>Bs,~wuGÑʆ>G ı6?d7m|wN5S EڢU #ƸrIeUUE]vm6wP___2#'=B!pB;wm߾=;NӺ%br<~ի{T*uwURnܸ_;BOO۷o?rƍ-ٺynd 8xLOOO(zWO>ۿ###U󚚚'|СC^_|QUUUWZ^&+ y) Pz(R<@z__oۼkph[o={;Ո_cccX,&ɪ\.711rʉYYj% 27;S,dNMŧm]\6\;ct1޵kSO=uEo[.;v޲TN5CCC;*JH4M HRG"ǓL&ST L8---~v9NQ4Vw:UUUMNNԤ`0h@WWWB,RT__5Mkkk.7 [ӆ>ƦFsvuxMj1`8QJK%b2o/:zcruuͧzZ*T ]g2 c// SSS{>yB6C}J9Oš3GfD[TUi-e}?w@w1MEQ/+Eʢ&ե^4),+8Ahva,_nyPiC ֿ*єC :r'_OSZ(zi <7v<_~iqN=xX0^Ohn. ɤ [6Djol2 CW#)Dy \p^TRp-T~5 z͛GGG/@ή]033~y6ͺORS}?U[.VRD1BViv:w+W^z`p_/\=0Jp3a%`x  h%05wVBV)@*h57ߵcŞ X ˛Z"cgEvx7<<|-PrYʊf=,.de)n?O(뼭__KjЮ ۭZ/sUhaIO1% w7Icc&lP1HGBe|;.' BFL2I>ry&q\KK -әgBZk::\Cj0gri& ϊ8Bn%LOO_M˘Ez-y+tN/)%,T  єL͙%Ab ']VXq BпBJR___CCÒ;N7c; hwޙw)+p@&E]TVA]= UMI({uZV{OM럽e[EPMK=n{Ouabs0 2~ާEn|.eKں$"bn\ D<5>?3١\1r도@ ¦AXnaǏvuuTU]f 5/;|^ѣa8Ε+W b1W^}3"OQK=(H$߿/_|dddzzѣ577WWW>|41 H +WyŊ 8q8ѯ8vuu>==°CtQ :í6kfkii9yyNj:Kq_y@pͭR㓳ˈu5/XƋ{> *m*t$n&6 IE.bTLegj ]5hClG.@h+;`l yq~\|!Ay`vb +j=B+XB +aav-|-; jXXUE'xW)E)W@8A *Fpf|"<@ ka-|n{Ϟ=NJ&'ȲJy۷[?Ozݒ$=sgsP({e˖ ~g_Wv˿+!>߽{7{G}'xbժULgw3͑#Gjkks%@;w.ͮZ_"fӧO755[W- ~lhz,ePJXeKi[{`{M E=y}r+'P(g?WC6l(tH'Oy"3@RPR L1I: !Gd[nq\4L8B\UU \]]]0b ~&P:u',Jb_|q˖-,Z llldW_mkk%466z<˥|>V=|F65xL|yCthfC5oScEY.e4a> XE$e2AF%cOdaB]s1->U2 `)2 ANQաˆ8pbeSt:q܆ }Yjٲe/BaLLLK4_y 7,>ON$5554\~kFRmw^ySbH[ahحg}vΝǏ>|[o=s{/MCC єͦ0ƱT* <#G,@m6nyC1XoE9tPOOӆaܜf2ol=:~&s%mnimme`sґv8ScMpBP U"8Sr*?!EnZ&S.791%C$&W\"[A3Ѝd@>15^ \.'ctd=Ί&Juњtfh`<׽bXSSiAx"gOO !˗/衇8c'df۶m;S3gX~esKF UUyÁ~`A~ߦ}{zeYVt>zj0Ѓ>fwqY~\|,[>w] u 5eYZ{KN xqyڸq ,׽֭[rҵnY!--?yxWII%&X7x616q"2Ũ9 MV&nT i/rܥ_X`+u~۲sKijZR1D1P+thjL F q2`׭k/ǻO:,29šyC׹b644sٴ^!{4+Ȳ?~3@S?1Ɠ,z{iSS(D^hjPn7bȥ՜ˣIp > {NjrMry6ܲ^ O-1 5^=>`z^Kp UhZO*2Oz~7,dS ]L py9W(ʪb꠨W (r]kZ4LTuBu!٩1U'9f׽NsӦM$ZjordU}r] 7o^rS3֜+۵'5zI; g+xYZو*T, àٳg޶@%$&tGܢ*d)UHEЍL>| $b qouϥc&V5kRs26Q+V UBtG'XOM8IfF`ꕾڠ}>tl`T+Thvvv||~Vh`pBʤ^yw ~ٓd ֦6_$@o[^kW ޾uq'b׾ []_[4A_[3D'!Xw|3at.꺮d * 6pwG'*z UbK_˲֭ ) !`ln:?d\-S  MkP?H~@V۞@ ,+ݱaYv}KPl%x{/=hJnޚx=s,c`JXKpW7گ>հ{"vWOWHk8Ofu0; @Hnv DZ. 0!,VBWbQv %X]%uXXUE'x( WH uv^Ոq&(3%8  R%LL)/n@I&[ 6Ʌx B\̗8N)v0K"B(y~c";!R/IGA@ 1"r!F+ij 0M,ӈ%,` "6j UPa"VW  B0&MI1&!` džkE@i ,DITUUi5ySoC64K A4 j !(aq00 J"s6^$B061DϘXxH0K^B @1MӀl"k(v$`u/!!@ ,8N4]S @nR b`1:?@.XB0t@DO#XE1"TUb&`1H0&& !B0`!@ 0aB14 r aX CWy^,)2:gc aB%;o0ul` 40D6BIgr Ѿ5 :_w&D"/D_"PnL N@y48`Ir4e BlbBXV-A!A 61!+ϰiN.L 68E>KF,b8F/tݜz=@20 $YG"D1 (WLO  fSŪ @B*/@?dRjxpmN#l;; x@z~ǻrÆanl>r2,`l:\Mb872:G` bXBNSVb4aءӏV RWo>hT̜+$Oԟhu՗X]T,sZ{SpӶwGic+bX\Ng0γ +ˊ a2@01HYa"j9XXL\NOk{g:ÙlS[aWϦ)UNM-K`Mvs-[ec<>mj}ӭp:W"}oܺac#O?wv[͍d>+#4<s[_ad4>єDm-[ 8aٸbBsj_Vw@1'cG{[|߉|ݰ!_y{6AiSJ52<c2.ʌN'>k͚U3!ZC>< l3i&!p`?}z`+%Cp65±)ɹ-s~ޯg,3sʰXt"5kھrzhAۚUc~̈́ 962Q,(S !@j*=Y,P[Up(2-C.i:La7ε DoMՙt2%uD8UUtYӌ޾Hgg 2fL.k(2 :k+V67t S97?>1Ʊ<a@EK T! c8b x[k>u9Xuu~i5{qg&?q.CWǍXbl*>)$udfу7CXFrkV'r,dEB$ #eU8WKlvMA[櫊2TJ6WiNC,׼өo7?7|">+9$vUg]H B=3KϖJ &F$TL]sN9YE:M4%,a]1bB@+dceêgۺ?3@S**B 5qTgsRQ6iB#<[+tb4YDFm4Ê33IT ƶsYmę2KAQZ۵. tMƸB^K2T7c  #zrgwXC{5bOj^ު{?7VtDΰ8؝B.hZ,&cl6 a8A RIe"2dYdYLBnnogdP6<&sxvSP(L A :j HTM{WWjk{~&k U^o۸0Α9ub8S7ٶcOOXNΩc͏T{W!\{[)VM)ӎM̅WW9J:t畷p`Ig&wٶa]a fΎ*w6 [ ͵ٔ`G걙2zGfr13d_N F6l+:, 8jK/(N?u,@V!w =9OM EkόNO5%A0,҅eeӌPjzPuTRDjsNظMsmK/y#{͖ !BP,%*O*2[*hS#k %S:_:sl GISXJ |NǺpDrrٞ2 vqyMMMlp&2w8#9e(\NM ˩a{c>|UǺjj,ph4B!˳]{޻0Flz2プ/_̧[k7^c3>!l"l+p\EQHZ:CюkB B9vbEI2#cO-ƒ+7kciFs,ze!{.BC]f *  _zX/EmDtaKfځb:k>b#^Hz:@VzSH,GiR<{/^B@pxZb&4]O=T(d_ޭӓ>x읝|&sZ-0eO~:±VocG:-c(?K%]7gQRo8|hkhL>5sD6 +zE3ͪ_*/M> Ηf|Rr=~֔;6v 1q"m&ˊ$xnUb"6mƠK閾]w }ǽNwH2v9>KaL2Ishخ驐h[Ÿp/醽Z`̏ԞD8ѹ#^=ڑ֔y/䛝{>2 B>y~-EO:{Ս>d4I+8(fg-ùz^H*T lj=#GMR]`9aFL &:"9Fi4v(0HčW6̔9Ɇ>GglKxnmmgH4Cߺ?X>3|ҁ`=Am_Y$ l1~->;dil)VCU fk/DD&YʜYᇗf:-ʥ8@b)IB3Jaf)\<6bŨ @l}Gwx1"6J8w*t7ԃ`H 1@2T* J?A[nnJw=ߪn7H1axΝRwɯ0neoJ9$A# `I ~+h #PN`|,2@{V;/dl{A"JJ@ta64;QS82kCsܢNjXlwK_w:=*?=2vG^?MH5/ya͕$+CC 2 I6,pY)0AH; ;Xy1SWo] 9e"C5Cر](pgCL;C0ݑL  D4"pa4N9E$ffaUխ Cu,;>%\$4f&>4LSQuWa82*&r7 m7(gZ`c7n,,./ 3lLlⅇ΋߲|D4/UjT1`(5"q>Eb"E@ [xNy$"(),p$`[:4e^yc6qblwK'r&FbK8]sT t&5 ԅŒ! ,G޼s;ZyȡdꡇW02TnZ#HV\~\ehhAOFP;j@:8t1TE҅Brr0Pc3%@mA C 9m,C)mhsL#lAGC)Fd4p8pesG-$7nuB^Dҩ:a il*Y~r`UdJnA6 o5}b15*wi k&/KK ߺ8C~yGvd3 kW A\k,]d5e>zdҲ kG՞+wMK Ypd,Cb35 &gȇ?"`>~.? ~Z^tA?8\z,E BD^pgWPj!uZ.L.%ұ:{ut:Q;hێɲ a !`iOH"@Vo@vGJ\JLHW7 W"r#~hP>Owm#:%gwϞR펗RЎ{9jӀ˯bňBٲ<Dz)t=P,<xGvskRHxD":\ٽPѱCޠxTQKB<91u=D{De޻^t|)yt1Mdrɩzs͇DR-JN%<CnBLKɕ4㱄ccb)n$ahԠiAtnӀeǺޠkŢl!W:8;6 > ò4vZ 8#BB7 #% (Ӎ;}We@(þ|2:@q 3[ 9%4hCCU /HgTr9FױNM~b'ܺO/?sbZ}aWƒxڵN*zoyjwobĒyeّV#N<-da8:Aч 62v7\c3G"(vo^ U ž[a!LvL?pgt? ?OMM;vlfmN1%dYuCc s([p?l}',>ٟ% G??L&~O^_Ug'?'?a?ޙ{{?0i"3$ X1kZX)K;=r'&wu׷Tyio׈f*by9z_{c Llut0VTjseE.r7o\ԯ|ϔ>2eho_"sGPx3CFV!` ٭LtiaU iR<2bE3ak_t]U Pζ!!3&l.m%O0V~N2婉õfhKMd>xv^MD'umJzkw&NJ:K7_]:V*3ӻ~;TOy1>x[ۢNHZMߊΞ:heJ?tɅc/\S}lze[s wnT&9ŭݓORz}QÎ `@S evUٌEs=lw8!aǵ|隼(LL#/3OkQF "yaA(qlӭ#yD8t6 ^ĴCbBqFk[<ь:BXqSGwo%3X<ح$"Sۣ4 veݳѩǧ*{<@9H;t!̓?|׮}g]ì$$//nS2ƅh l!70G;&R>tۉ$!>EvywA>fT,{ qv;})- A/FǗ?>֓Ҥ S4J=䓯ꃸ033f{4ܕx@\Er,@Dzt%qR\~@s٩~?M~4PU; ِDn(&DK 0*VK_|7ecFpo8ìn| 1\ro9Z_$Xnz,cGe7t}O$XPXdD2K1w ԁ)91# # o1>8-mLGi ͰaX(a8aoQhFB#IʊgdN'kUf6;g#T66Kxd)%e~LeBOUN-,"˗6հ7qv /~:ynDsviA C %D6R=ZO 4 >:446>M>Я]&pGQKbij1}VW[ҕ9!CyNT. 4\03Z쓒Y. C4]t]גjoOx)3oػ<0DlK偢R9n=kz)VSwn][g{v[/E/A0ᨈ'yam7 [ =ucTy(KTPFN@HM+lNمD!mٴkfCv=աqH%x,aŬA*(L&G#`J)_a$΍|$J Gw7& g66UsFYĤP&6}qAľQrn,.o,ai`龦 D`/ SA[b8S>1Zx\VAX"V:ՔT*njEy辘HФ34ӷ\,M'Ţfkxcǐt.]}+{>SXڌ3hX`Yϳ H<2Օ[<ԇ>JXCU(&ˋok2~m`*G?I)LQ y#r_Х kB˷+7?yP۪#aV9]ܩFBgSJxI P5m ft{2 x*10nCO%KGжEuI\U8OUK'S?333?EQ4X+|ݫL 0`[S<&Qńq߭C!~4㎢l[<@L#hʰ,|4X<5;5]=34RVk{cӔObr[}#86/N(.h$^à6ol\*+f^vuehN jm96rdtqaƵ?zP,zjf2'ϟ7Ef D8SC( 9"965}z*c4.]9PN$O1٩Q(\x垼 0!Ks"4R,O~r[i7:}MnZ_w86?g~c2Tyeb=t_zRU !a_du'l~ad#Q4Z?ht / ZR\ )pI &t%h7:L9w.Ģl5a,J{#=t{{|F\6؄MKsw*ǟ8w][ k=w/O?\dȴpWOg0&D n _ŝ탕JXQSI(@>)g~ӿq[OLOO?ukBGƊ7ުY`ΜPY6Mzm۷.dc+ I-&<4'Of2Y^vwl$D2cJ*OTT, z`04 L0jH?PHO#䊔PNG;W;//MNCϸMEVE; yN-GS{VD1 AGeE;GO5DZOfbCUv~`S(,LNvƱo߼dYl9Wڢ$caZ={uVw1a" 쵻ݮ(nl|}z1?=FTk]{bqG?@*w-Ӓ*Mbr>KO{z%?t۬_xCIHKPB>rjL:^"``]=%0 so~wMФkP . }OEi!Γ)Q<WztN_{JJ "\AĤmXOI\2~"{dQ Q`ލ*ݎk>|/ڷ#G0$Ix/ ?9>zOF 3Bb4)Kƙq+~?0AL) R^g8(2BgYv|bݑnV4%F#B̧R$BT:zicˠ֟C6֕z&GׂWl:ȱ~ 5#'M_EBl+@{ 44GY;u=)n[cfFk6aH\) Rt*X4o kai!s%6U^ TLമa?^ȂqSj *ә ) Zw^|#~K|iipuTyfnR1~Mh)ZGd2_.VWuA!?Um}F|{ll{Y.r1^nuvn:F!:{7If4QٽL"AXxTslF Oŷ7T06GѫOn )ED$I}ټ_D|28;쯵*t= {Ӆf0ꭍAOMc`$(pJ$\K }O8M'\&RcSgށw"$]少| QV0rK.4ht뾏Baqd8 |)~Zk=)͛ {>LZDo\{/KŹV?91?{dP(UpȃRx!}?B'0&3Iٮ++Rl'G/({0ܥ̀4$RGx̄As3 ʖ{ű@~~1S4 ޕIwԆ}9tUkvߊg?l'`;Awt}̣a"l\tyga{8M$wr??/1\hsGS٭N5.ph4/ݼ}E3vIS\ mc%HEbbRV`'I7F˴Z4~Iȫo)#A"ӯ_[ˑǞ .?0;y}~hX2vg/#U{ J<06^[˷zm'{,?8DyF|9_u;\z>ӳ!0;@{؉NWCQ'8r>mMժFCۥb,.=75u[5EW(6tWF$A c4ڼ:lh)M3AqF2fr h$::+bf>)uw) 8 B3u)|8V~$8AD^ KgdcPISaǕ䡉Ir~% t<& /&dp$2>o?)K/m'*#翚ӵIyE9k5æhwmQt YO2}<0;$ESA>p x+ `g9B@PW@|j"ŨKlL!>v@ޒ<]LRBĐ!B:$ |ǶMKS#HB0GufrR82ĔELҮ绞Q[ noǖN-B Bb0! |mAh +ҼMd`f)W߼syP_<|Ҩݹ-0/b/$) DFݎTCQfH0;=x([o|9^߱\?!Y }#'l) Kwm.tFcC" !+ 0@4 B!@ $rc wD4ǡjC玟{8>#B:7= 08rlohmtQ޳"&5vl?}0B(Lg dF.BCYMN hW ZR!z߆!"h_X[XP~HQCLԢ IDAT( W-FG22W!IH5E1"z04DI a2Uhex>thwdYdR<@<t19cSr/|Wѳ~kgΕXlNڢ1"}C1"B9#fjk9nMDD]`Dm詪&.c_OR4iUBL(@nRcDvSc< g;z$ŵޫD(Ld4C!g~z?4ksRǗgWp }Eਉb)|8ka(_4^^Ψ~v.ϴ6gN|hG#JS1F1Dd2H et&Oo1ddUu\^X8zJ<\ܡ³|o_'7_x s>M ecP\uEڐ Y3Qgkm#jn>w{U~.,o%/"a,̃ƁJT5Rbto\}[̄~/u\30Ē@ A(ԁyҗ~BFҁXI(sAO iCamӱ uni3M'L(z*?+9Mݿ H96^hm]k"0ɟT BEdr#(&5C ۛ{dI̗:+tUWub`v15`f$O%<ȵ`0Xaj1KfefOV<`]vIa!/nnVJB3qḎ) TűÀ:cocJ…E9T);GjjRۭ=0arnyhϿviya}p h)?jE9w!jpRH&Q O^^]<{zZT*Yh>`^$΀ŹiŚXL`UER)xz\xTuǼdNitc]^yA4e*o]YH VkvKz#/P$҂nR"/Yy"J۾<Ҵ{퇻OĂSܥ\\~&#e37n>97QǞΩ鬲PbQ8ݍI9 բ9r#Ap,+8:S"'E탮2>*cObP4%vMLh(BN :n{؂e>wpY$ zZ`9xl_)PDRJI$!ue$M8O%,c$N&ɕJc3D ,D+‘}(NX )]gZVVJkEQƑTy? 7,:Ad;dfs9J2]+yRJwsR:Qtvg& #Ѵ_f+$ڦMsl*r"VwwSkr2۷򋄧bO/%x_h^K @.sԌ*|82yp*fSoMb͖a9XՅ]w~zx}x|̽e]:DcgomT85:>V cdtafF ex᧻G9Jt¶=߯^FI:vq rw>2Ǔ[tEA vT)O^8x7O}2V.5g M@?6ۂ]-:gGɵܓW?8TJ.y?Q(!TԁNLEE$ ;?'K οk:4yԥzeT_`,!BCeV =Vk2i޹W^c S)uiRtn|͍vnL\p SS.<9>t?xRf^6>_/]FL-=yu'JdImycRflwZ,O w1P40 = Ç$#S(BQ*<IӦ}q}Y2"7vn3'[4hnЍtqw9'՟NV/eLZ؄нvV僚qck@H2=esi`~q VO/*m=,(SbU3]^]lw' 7i` G?񅔶7rw^gBp'&^y[k3O'=k2Tbq˱jO+E#ބy9,U(QgJBHƇc4ٗo[-A/h?™+g/,s|rg`f4Ϯ8\.ɺA_e_~|S)psj?ÝS?UnyaN9]yOk-1$1ե_I>BQtL&ɲ BbPMA1Yxxm}BшDa6v+!@4ef1nnw&  CS{ĺug3/v˳GG)ӲJU5QTC74Fccl 8 WU+W)Mғ?It]W)Z^^LP⹾,n9~ . R`6J":$aEQX! "ESY`tJ1jqqtLPXɫc; J-x0M;/-LWTmL@F,sN$4 Eх'(AVJ b t}ej8uxM 8aGN*[RTPB\.jt8T+^ޯnnݒ8G搐Zunam޼ T.2V˄ ~9]ңk9/ě8j,lz$ hk}p8LMV͍kvo9 H4mrRcR;|hZv稘N^9yĽwLճ,v,Ql3llFPVˣll 6.VyEv>R5ѵx&颞Cgʋ4a_M`=KяV Hml\p"Ej0lCB&'͛Ӏ$rmaQdsz3DV`k{dx  `BPX@@2. K2Atr ̙ůD>s{Ƒ! 'od>Y+aܸiq48+o;g]0fcמ t˿yo'O>$JfS qh7'{"F"_\䊾p|4#;ɳOik9-Nqͯ?z*]L`njŁϭN-ϜX=yz4:#o7DHPP~<(`xF ES4M,-a$CBEab@Ri^TWw0,J ġR*Nެ rb  !76Jζ8DaYbY~z È9v939BQҘ} 0,cٖ4dIQDZs 3ZǑOQ@㐧eVd 3cF0auΊO^9M]x$,jKYzsѩOj1%hy)X-I {m ǓDcnjPL0 qvjrueQDe2)Y|eL.S){z탍|vG.]<> ySP0q7_O guǢ%%I}31!oR)vwKJ~$F(FI$6 JZ#gb,$I>b!3Oڝ^&XΝ\.!!c0FI1Fg 8IbID'@FyxtT( >ƭT:  + %8BCፍBYnvV۝q+%I h3uD(Ig_%1B}Yg?Ʀ856 "؄…r070v9TIM|LmnA21Qg%"0$F:ָqJZ9Hq mvzɳv1,)߱ 8Q OG - OL3 ,@h £RSOf/])Ԃ7|wl"(2L>6Ip r{A{hiu IDAT&jvMkDQ!Vc{w޸]>oܾ~w{l` v=s|מ{SFtaIduY>{\[׷+P|÷JYQ_Mϭ]WNJ"XChbI 3sk_Bh'.&}/4CVTYn;&MqYf5~]LVx]FNx)]GĆ ^hvcn3{@CLΟR;qtܬ7f q ".t1A8ĪC*fQ<moEaJC<\"O} 6 17]C'kjܯ>9I{W+~`gn8.TSO/:r5_+ܹw?YI`8<adВwKtz=AGG! Cf3(AϿ89NAv<ܺu'xXY^wo4}AuU)vxIsbqm8ool+p^`cW*s 1?~k~_S3**)-E%\Ś,ڿxډ5Yk8w)t9s86'\QPu-.Toq~_aD)@,B<_ġhMfJbo2l5q ug UU ?pQ*"PB C?^UYo(T"jDe tAMM9sj_W$;Qw; *.=yIs8X^w,аeY #00ha"#3"ǣtE˙H*Dŗ^gW?{[2Ɖ *7_+WԒ7]^X'b9aiǍfKGꔓ'R 82OZ90 !!0IX peUa#y bc4oNfkƐ! Ya0 a0l $60Ml&f\#|ވCb$JL0c;^b YFye2z,Ks(@gep%CA Й0*MhFFQXf@ @DϤYuqK/'ǝngⓗtiXja6`̱+*D qO]!جABcD=[|xt-U4ݾqa􇝑i1a36'+S"҄#w< =oG߿[խk t'#6or %$#ߢ/l'(;o+x]^NA%8?otg{wwwopjz {k5R/lnlv^z6-8HTt&s֝xR?j8jw 0 >C +lOoY eysc3,aGGA06&鸾z)r1-Mc0l4 7{A:eYt6 (giAI^/˒,KyiZaZ(N7Ww:N#,Jg_(F|Ndf|߿Av{_Ҳ^qZw c8J"TH*|w)ɪ$2'oUkEDy~R(I,Q<;4hH|Gt[.}Ed$ OFq8/$c*r#(AЏ< n%ӳf(cZv0ۥ Ec;QH" {QK| =r8aƥ"(Եg*M+[(]{WS}jukʥKU '@|訳sPa &cQ0DqhbJU2\n|0qb#@Tu[KVŎqg>(7~rhG|#ߊzTx[NQZ-TFAu2D$)N޸7doo7&ZX+Q}hMVj'?|ﺨ w>c}6 żbg0zh 2k#g~@ ?tr\P _ԝpŠ|>Q-E}ڗWbsP,PX~w׷OBR&[pҀZ|mgӐBAb$t9ΰ,k~5tܱB3鳧^n,G&# o7n}rp*ZSEXD?8}'i9m,d1a~0k9עJEygOWu^n/ X4čngaPƭ;yV,沥0]tҵOj˹vZ0盡 \5IFln|lRgO=ph+KkwVð [t0\=/@7mG\"@J~qD$9rB(I̱"a m͡hfT(iư3\Ғ=RUk>ũy'g3̽3W[A˰s Zt7Q\'TT6[CD'QT`GM}:ob)![ΈgK/=z ֯3S۷;* /&ք(](S`H8b[Y_ vcB_| /o×^T./?U)Ԫ٬еvghZ"K<+)J iĈaVtJL,G,Q1&SR)(<ϥ >n h2K ( :4 qJ9@HMhWN l^)% lx6no26H ā!B&3?l7>:<U-+qTKCMzhxgw:]Y;էgsp*uI*H:Ʉ@ccB8"GR UmBT)9YC2gB$V OWUcXO?y||9&4J0Z_tzLh ŜyT&z掏gjBtf ~&u{ln/WdEvzw;L6J#vQjig~:9qxqyv=7?RlƘh~iHQ3Z7/%n7N<c,rިvQV{v~>ՏꪮA*~ubd&$۶}%Y(j5}?$3(F盖-͈̌O=\Kv(r5IVxQ` 9N\Y:8nP<ɤ}]Bd(DQ~klށzJb&)гt0qPTy2vC?DQl 8),ʜÀ$CN' Ld OOW5tvUY h4i*4(7J0)WK^l&MI9BӴ8ݘb$PT:?#tæx^|w0}:'K3 |mcXi46wrq v}T1PL6+efGg5t 3 ۭ=@bQS)]Q?lo0̤Phz4h%pc|aWoc[ZʖDB1hm[N zq6S?hYB:+-zXeÝCE\C9[f#EO=!JAƹ/ͼH(n|e?yU[ eoK5@7{' a2'.ñ | t6U9CT?#KlL=ܫ/V^| ښNϖ:ۍ_{ٳ0(d( :Oޞb!s\9(&ǝ^0bUJOzN3amg_$F؄0C1R;7~g~oTJUkփPfzcL,JD]_ZZ[[&MOڪo*ayq%G~ˏyeL!Datpo(U$IN֖sHU ڍ"ϧQ۞cdQ@& Nl'u\J Mo☄ ťLÌѮ &_ɦq{b-,,K›W7zbJⰞ%~zN0}Q{՛߻/kRR$vp2$/J4ER]MLVǩQW>׾O(Ԍts05t!CQ44;=Ah I,(|&AS CAfq.3U~oϞ|쑵(nE`neadxg_~g&puOeA{ЋR*R̢rR]-SLl<]g*bU% pNDI -'i*S)]؆=Ըg?v=nO&혮7G{ )Z-g˵2Fː)*vҳG "c@.b(J#D(GB"RJ/9b""RuI{[ ]]@caI%.hcHJ!7;=Me6/vത9KWfseswLD1 ,2Ux1GMyǯD<3w'kn·o2f3 W>j -wBsY)TdRyBٜѲbV3Xss; )MB?((f(,, '&?  v(_Z_g+m/e0$GOfݾXs @%0BI}Va\L`Ea'AIe2QKF NJ0BB T8I8 8EAL r1J(P)C@O0& &a6 K%[MD1$!0I B(HJ!(R cf4MPBѴf%Da#Jac('DFhlAt_ZYRrܑٕtIS]׏)JlB߇Lc B1qCK+|6?uma]Q{ d#̄ IllH j sy-w&b2T&)vIXͱ~l,pI<$@cN|0Ѽ)^* Ms߿#20vV9~9,QT(KϞ=xXT8iӳS#HB*Ǯ,J]?nju6*Z[߮G䃫77T4?73n!",]4Ub[xxg=_HJJM9I{YXLu̯JGWRZ5n7:<]~>h<4?k>j'r?!{\;lܿpn=fǢL I˜ػv}Bw6;J :pADko\Bwc/h("/͍fw翂l2U2T'cs8mQd) /HAGB[?`orndd?Y%  ]`bTrrʩˋ{~j> N'8_Ѣ@rVk&8 nan20wab/= PIAj$%z䑪LǬNM~e6@4k!ϤR3GPB|_-gάݽsX,R0&F/iV! lTEgRm0fqb,Ew;uhl+őQ$E:~r94$)U,3IZs3ӳ!7ZG?ro]i幙O_Ԅ O=ZOsG(ww{U;ni-010|a(0|*Noe$'iljY8 ˆ2OHNK3h@sʒ,$QNRCk)iQl.tʊQ&aG#X8 9M9D8@lj?u REMӦĴlqY x8P5Ҝ2F(H .vYIIJ*b=>d$ST2Dt8qzt rb ˖t6C2 3SQ0λI&qA,L$< #AX0XqӪ]jJup㣃t3\Ʀ $Bh8 ӓjnPҌr UTm\dm8 WKZԭ(8C.&C?86 d$M"˳-A{n8f:&gSݰt|znk2ɝYLufF+C"&jG tTVL]S '?yiBcNT;%a@h Bp@SB-/VNK,ÄL4䮬LTKb//VU)D׎Ot*1F1ƦVDx8đQ8Ě,~ﴝZZx0N"#)0JeMM Kb#HelAtG1B3hV4`nQ a=?=)ZsPmZ_陨26nx?%SŋY r?< 'aOl{0RZ& Bhwzn6NN0]KrF2 Dȴ%RFn*RW_̫}to}~^_\+^{TjaIVmiZu(v KVUڵNꖍ2VI |<H/>$>?c Z^w<>-d,޹qy㱆}woӸyg _v[w._(ͽ7v>ݏ䘨tt: 7֖Wq;7_b&Mwdҹ>ZN۫OnR@{9Z5/EX[[-!zf5|}xwprriFH\Rt{lJ`g_zlVQGp0L99ZL'nA0~H MŪ$ 'iҀfE jeAtbd1N0K'Yıۿ;obSJ&bijؗV_(ދ*檬TgnQ2˒)HQsٲdJ=Sfmʠ&í嫏_)2dRƈE 0$T$@˳Ꜧi+d"#ϛ0eSD`LWf[B@ƭƅ9#C #;c 3 {(L IXvf$u3%sjg*[Z:`Qy~xprwMݲ^-ΡLHl{TD3 LvFÃ0LS#$Hg>PZWfLmppP?'Ow>RBHNcSP-1g3o 52(㢬ȪHLO Ɓ΁(+?)ڟ}\aY: $) Ja£(cX8?@%YMW4_KRư(ɪ&D'S{B:gg%YU1>%QȣD"h(Ɋ*CgJD~i&QG@yB@b7H#h*E3g_KO1Y޼!%I1 )'~ŊC,L)n !%i;&b)NF$W~ɨ~÷BNpvHd88U]:g~t)RFs歝O^ܻ[.I3^ZL}=>G?GZ٪r*O2֗eQT!(%;\לm: 3G(f3,F5K%@ R@L(issSPC1rLTh&Nx<"ؖ=\Mca< ~z~IhR9`ssƬAf N4!cW.Rn[>zo{'$jnuNImrf ( jmN+V9)k*)ږP޹$wM # |\ QchR Lu%OaA%ZqJUT"i`nm$#ՙ³^f{ldnq@R]= k,ݿlhQbf q<`fc97zFǟz|>vd֓bbKo\y6/*PNF|w;Ǣ*<8MMQ+rY4w=zʳ cX.rvz|vyaG?zhdzTe)ûi2Q~sjs%+>9nd!QCBLOq!T9h|akivF޹wRV._[lYqzc9 l Lh4'c3 ̰ō#G{@θg<5\@#$0(0$3gCRbd Y*& $&>2~6 9sbY^iZ "5CR3 #*$p VNs(3,`誡3UWHHaz+Wc_|}=vz$g3OWl&KL38 WW$#'$ɍFk<*.' I"@(Hh9s.df*ȊDDq굷}:\AJX:zEJ(BGDK2,w,ONښɊ(J}:M^."%6`.]Hv7"T$on*ofF`g_|mnW߲DmU 9f3'UPz%xӡ{_Noϸv;vc ="TzʳUk?r{{7>(j8k񶠇Y0h(?owvm KŒ.'.|1 o?Bឩsv}{9JAD"e\a_}9?ynVgϝtYD-Voswwzj+N\FmiQs/uѬ"a荇^2r%iaR.֮\|ͷ3/ Yz" CbvZX=;(g ~jsaeR\ aHJ)soodsttbY~7(SERTPst|~yx3r]޹w˶K>(Ug+gc92D*6;IbUr@H*vQrCÇ'{hT(者B0\Ϻ֏>j5*_Wz']Y'IDnVUá$E~`a86eMރ(SVV$T{? X).|zrn~v62TsgڭkVt ܩY:ó(~酵?Uz|qnySDw>}G\n93X!I9^EV.s A~)1εʹA,?֟`NDݾq渺qj`&^ IDAT08p@VIW4C(GC9b?Q%H!T!L Z̃Pf2D>tKÈRdEa=$Mմ v>uF)+ UB'". X.,$4=! AoLf* A!IaHzFID@aVKS ;;#Z2fA) b~MU[Kq^¹<\wlLS@ds8w:yi~wlR-7=7"1198zq[+GGwoܸSP4ϑh,.b-?gHzuƻvMq *SO-'{G? ^Ь'ݻ9 -m K's&xg?mY_Z`:\:woΔV JT)3e˴?@`:YX*_ip]^DCDQa_ rck8 \PTMT6! a+K+J"I=~@,>.*$8 (ԋR DV.o?_so qkkyr(N^>QP DU-`BɔQgWgL.N&)5/>?N?pyk*eA>@JihiY(O9ppDtnn6x  D?dL2IXCNZtgn { ~3a9#kpa'N?'&A``.ldH #Ь]8:U+2޺Te@`a~1g^XM8cC7T,W^~vf>S|]ٸPaAADpuec A^]8=N4˶-+c6Wv!p<= Squa̓ONwXhh^W{*Ծ̲7? #Ő0EG8Y:90)@f`$m]!$&ʝ`uFbL0$4 f)J"²(z8_iИ FEF)!)p L E7Ty:Vszq,̨&C"4#AsΉb,@0Nx̡N!#.F;,1 .aITČzY$ER`4IIPlɒ$Jc2rBrMd]{?*܋VPq2 ,펬9E;jbf `}w+;jypu@qёyt\ۆ"Vks;!ӠhqQÒQ-q6a zl38%zC! eŪ6YZ ̝ Ml$tSzj$DE(v?ܾZjqx%c& ^̡$aģ1a$J=ʉĂiNe]2("%fg'm Bv;A:YҔc" 䜑xj&kQH@\ˉ@MQDBA7k, 2 SFSKZD)$lj81%o ?ݕי Au$Ȣi[Է-]g0r67 ` g_tܥ'_??9Bbћ_Dc/Ψkɐn9 ,wϺ O3 lboʉp:ۜ-Ɠ|5ঢ় hqݿ%ɚ@F3cM3f4DcIuɪ7$]ՒEI'%@V]i9i6ət*:2óXWrZg6}FyfepzcEH guu= (}ߓdSe9ŎH:`21QV06Qt)_Zl0<1RhG{Ɠ~sEܶ5,Yxݟm$N8BBWH Y/BTe<Np~njwz G8N 1(Iify9ij5κF`v:.iZ͙'?{?qQXTfj-g݇QC Y1 77f/^Z{x{hu~,rz<'+ӄ|1~l_˶s}_UߡIX6fLBӇyg]p3?}wP:5gG+fD… J ~׏dnN㹙?y/8ݱȄV?YiMn_S5{Wx#iLQF"d)e$y[(M-EԌ,ʌb+}C6OvO Hm@h/slrpK Cw0yHp>zVc  @!@y4eYdCSY"R@@TFtt̳"8uYHH )Ҡ!)aRʢ"l`(ljXQ 44$I8c1*9!"EK+k[)8P4+gDye(pK;omFXnm1$ܢe)6M#tyWx|fM %kpT(L{&Md0'cHJ3lyn8,'ΡDHr|sml5'IE6f=DQ8N3 ,NhZ K *gM!\g ^{p:?T,V07G6J heeaD>8 .5J΃,K "LںZ?;~Ady/4<5Ʈ=jPБd P4L dBQLO} X/qI"L%uEt3,`0g'+󟋿%8(BfE(2nKP9$N4ZLTi3uQװ;@T+υ# 㜂:@윜rmW.=(}pcwn-Fu<X(C")Ee]hW.6`1Q`xѰ+YYU ,ZoI;A6, d,ʚ$9ͨˆaEr,ͩ(ł-JxB.f"R(+UA0\'DdecuH/}VgEQ4 8;iJL޾ĕ?aez{lٿo5,{-$n3SVdyq2 c[Tn< F=G\ւ$=eQסezn>D9&߸~'~R|񩭧O>`q|R*uN9[?N} ŤQ{VP\dgs5óӡ;(&Ln53͜]w![2Ss[/o8>~`4 zR9/f/om7 T1#P(YRI FmBSMuFYDPHf/ v<3κ(gEyK)è +e?p!s$&#gb[J-}FXmOXfd HpPغDxmVSxo4Q-?_~~$L&=yt2HYd̚((OR%98I%jAVlc/-,C/$1Aq1Ơ*qeaĞ>h6;|4OY Պ E0y &*rkϦq ,Y&͂Q׋yNTu+*avpaZN0dIPxZ02bӣ50J# i6pVq&rBW% jk>_6?;{q4,ˈ€\r4: aa9dbC+A(=SQU$RYSdAcΞ1Bs5b?"ύ ɇ2R9 Ô@<}>LCEt_yW_IQj| _]ģruI=0S̰$ ^W϶]4e#i|s?ӌzc˛-l& SD^W-#4c4bH$OH)K1(><~Zyhc^.thN&4 $U5* z[{>ItwO#[xcOI{I{]tڭ[,O>ݧ3G=u/7.h/aL0`h1,RVR3]F-W_ =݉2b\? 3wnοw5yvkkBmt}~4OfYR#'ɹ/fLfIЁ(+8~xs ݿ`\ _3s Z]ͲPNV un.FYS-p/}'d>4xqcue4_92a,DZZ$:_Ԥ>{2 4Qsj9JsJx\V(&'ȲR(Q1],v.굱y@\VEQEm2ЗeӇ5$LlF'~tʠq7CWe V uꥭOiKgW/]{cogz{U/ZNX]?tx^z(ʅB^6jE(uܭm 0Fmw* f>g-<1T4b/>}ʵkWqIB2Q}˯$1y8iHg\4 2Veae!:9Ķ. L*fF=#!c Za|2#tIE!%AX& E$0<|.ɢ.c:.ҩ( FT&T-RCӋxy3V&z|>IFfe$JT1Fa&1rw45M,$"KU!M3eJ,Ib2 _xr"v8 "eM vr>{D ղRj27]Z^'Ab߇]`DXHũ9GZ}vmV03.Z1q4lXJtyj):NL/ҩ< BDa4/i;?G(p|Wf{YQ }eyH(^:_(l:=9;?>y00"GƈZsQkeJν{ۛi7ovi{'i̭gsggʲ(|c`Q0?݇g M@Sz_ھ^T{|ruz[d,#Q7Z5ye0蝛I7dUGRyKLHEin)W>7fA;ub{(p>E/7;I8U4YF|Β$ բ(әY(IDuZY5'\,ltb\xqz vY*Xg3c^9<>rCA$&!/l]-{~z/hZ}:QpE\̐BIb ( y)X6,XxwM#kuEHttԅ _,*n0ˈ'vQoVdP+$q,t݅)$#Bk>RvRUCT"8oW%+o|+cz$bu\e?#Ǚلز,kY:K^_@C(2`Ez4gϞj(i4JłpZ,pV(!O<:N")w2nn&85؇M̩I"jwQW3E^})C/IyйK.5[Gǽ>_yד8O%bED xj tuzdl. dwڟ=z9ыʠ?t8gCM7\Xj/׫p|?gp6/gϯ<>hv'fsyBg'ʥ.IJ{7xr^}R6tt*ƗV|odW Ek Ϗy.iZ]Zj.&L !!X* ߊlA' ih/ŧ7?·st0; M;{?|c\~Jxw?yü@¸J'wt Eөc2/((]*1LOOziiE⬽V)IGTm,Ztow4\g-PT! J(q8[! +,ȗ_uLob}Fo}˱F]aZWb%iWꕔfAʂ#0 3C)"$fCK9yN(I X5MW18LӅf(TIy2Ft6seS:^Z>9#0/^"QR+3^';{M*>Q#IPoz`FbMڳɳaoԵ *9.,,p<ٰ?̅ia!e  t"Ʈ%$IqE@cq}?jb;)K?G;Z{qPz^Aբi *FMY%ýV1%FOsTX?hpfU.hcieefٟܽUDjX"Xvt{g%0XkF)&mWk[\;9k۾?&_6 d>5uY|=87;d,Y b؎:X4*,}|N;j s4;S_WbpȉOOƭR]/O';|N r_3j@g cQMRvyKݿɠ?h-.X.1DV;` oZAǖi8 C*mI]RM݃"@EBU8B9IH,W:Ƌi#P242&]Z[5{~<#,*JҀ͒a(L)LМGA @"]2ʕv'1@^f~+JCEXd3`ŠJJd2!͉i (3 @K邞h%& BJQ RPy iA sb) *@ew wV[Ջ‡;n.y <,mif.̑D04"Ӊ0E`Dԟ73˯MO[KՓ޾xv wpqHG0LDZ@%rT9s^-x!s,˅Nglj#%`X@$I!/p<%Y }GB`^RqxTh(D9N'iYi#\X'p5PД~q:>,qLVRE Y@,08='˗^*htrvt 0G8$Χbp\8,7ѯveM$ =J\Qݹ8V3?~ng'#鳝qB0.oW_`2[^="q 1fk$jGt{Fyr8ycZˍY^jʨ!+cyU:/}q첟,zY6"WϿS JztGQeUG%}?z̼wh{|qB"޺ 5˂qRT)vG ,( ,BuvG0S]m^|B aYJl(-JI@RAr.]:̓w|DVhj!˓fGO~C?KK$ u]uqa `yUEbp»`1I!Y!/"RwBFA8\[ю s׷|:H}%u(H,]XY eZT3j_{0$nԶdZ>쟭m,5'a4(!(l,dx~~t4OO %!Z+K0b',Irf_zsz8\i^~vI*VQiffNv?Νә#k:r(N3+850u_NO'AU #㖗$ǓQڐeIW<*Ù/'RĉX ';5Oƪ&CaMI_,4 ɷ~{;zzC$dj.@*N[sN$+ō*pxoҺ sfz7[%a _ՋÏ9G4H7._Tǝ ALB}s6V'g*b \?]>kNLb2FTnlomZSH:E%ʠ(g'ĀB[dYS(g4XeEJ&1#Z&&nT*j՚[iI 2AIrr*"3rpXeT2k`LGl PrW=>A';^"2Lܥ ap)ʒhm?U-0糅*I%CSAP3Н1995xI$CQ,#Q* ٤ߣ9# )Wj, iAa#'لP!X9gVpb\yQmdJѥ3C T p>}z6pqy\f[LlV!Յ9AR5zmI5.EQ/a)bsED&-+BeZ,J"'̂ hVjӣ(\ӏ ǡtu|\N9?;upyb{~Φ3by C n2DAHGǔOn$d$իBYkJeB;yyv_}?E>p]{.pX©RIx{>hPZL9˒r^I8$ٿ[!4HN(R#Y@B!RJ)e~3,\ent-Rߍ(ʰD"/:{0B<kқ_|?_gP0!%0 Sk4&ff0K!<cBǞWuZ, sBIDQ( R  (!{0֗e"p?e V{c} (Na&֗djΦ!k-29,fa9 dyHČAl,x&$ȢaXz@XAPNܟE9rPʾ_k~/eyo+Wϝ?Za9 9Y4F8(sbAFr^d{fssэW69UM-T;!(,,'mE.Sgn\~a}TWV|s/i ļ |tpSvq;_Y}Ѩb ݧZjFi6Ms{?58뇉u2ۋA8>3Gݮ^z E悀]ҩ`iy#( gxjҳj %*HI IDAT*Es!qQ+ΆjQ_~]תREqbpC]* BYfsTC+Xӊ)ʥ4L8 @YF'Ƽ"3)8οX8N[Vfm\ju'>Q˲=]_۸uRĴϸ"MA;ó,:::ꗯ_ƵC|r}}247h`F_`bǯyMwv(ŞA**Rus`8i^̕vTkMA,-(1 Y\,+VW߿s3B bEQ{JW: FJ=4;K$ ?4sVqK.'nҙ?yxxE篬~K_2a,ԚU!ElsMi +%nږ!'|kFufvGƔpNY1ai!PJsgw㑵Xxd&DM+xB|7;5iLvF`'͚|ٯTr#I޳Rt6C8 1f*,-*,+K F<{tO2woTRhVR2?w糗IiH/ɒ~ry;Pcgrk"<:9$SoJPm5E,R8A r|ߐ1wj1;}Kb2̆!Hot /~lc f1Q$F.]3 4M!k[r^KǽEI3CH!_8*SJD,)"/VEU#GK. H8yKXZ F(Y<_sy4yJD^GX/[qn}9 sӑKk+,m>}wϕ^d8a٫ c3Ap_xcmQ#,UX4"/m7. ieSJy꺱oiBs7~:{4q7/X^V 'څv ŬFvI-s}l_<>)'{G)_~ùPT,{G571oT+-b6J*<=jsfx6YT1$Y^*qܨTӕsƽ7:$15l\lzWv>_,h8,I~D$QVuP#w2F @V^=o}~8 dz(!Х0f*IF9Mr"8(>K;O?=8|xzpvƘ[%Ej.Smڲ"ɩ޾ç,ĝ{VŅR;,ͥ+s²z>՚?} S*ΡP[ o.v16!M=7-Q@OzrXJ#ˣZ ekbp"L2tPЦEĊV{oIrEDF{U]U}NtEZ+Xa /l^/ {!y%QJ"3$Nwuuugޙcpu@A[$2|~xIkPN Mb W38\WT3f|ww|r.'m}h_- b:339w*`L eK¸(s\O󖁚0iqjQ.XV4^(;#)cQSFxJ2 Ww{C HI{.ղ/<J+6C{nouszg~#R3[q9w/oRsθOŨ8 LOAuaʺffS39;1mBΘ*榿 q:Q|kߋ狳SuqBvvvn}W}PVTAΒ8QHɩ{ {wl @ CAΓGj<{_<;3vSS'|KY'6F#BhɩrB01 gEBF%4##YK9iE,/5;A,#H@B交?t<j@fr YZ.pu0$tZ##JN\*k-DQ0v5A9v|Ӵ`-Ͳ41"녢$EꬠB8X4eI2=ҋ/yԛ~ bUUIĈKeDCCy23Se䓀rwܞi9Rz?CBhɪ8+<3>IVLTDMST9e7GPU$E4D@鲥pu!cF ^OibZL7jTTD 43Ζ )Էi{?V=Nf>S+Uڹʩ K!ԍAgLjG*sMbT{BG?y\5MPGV@5PHk /W/.N˲ƍ eAH "g[ΰb*bHq#d:cJT0  ǥ܌kJ p I9ۇ ,#gMOc$E٪#kl羦?^R~}fXKV3/\GtVRjO\:9;}D֡e]<7ec0),')+xlgww~$$M祬BC \*- M=ZkTIp@Iإ{َ:J JdR]*0Cק2SÃqЍǯ[AZno#PHjnY]t˰7aRWVO:ˤ0d*IxocNw1un$#($0#Q 0Rrt?6S)ԥƗ.g>;R_ =bvBHEO`THhl7PMH *9!'Ɣu6<'_.S)(LCTdEZH;{$N4-ӽ6\U$Q!Ts ǣq 7rf(xlק`<!4M /___s/򫯾J)裏Aǿo|#N ,aDžB YH>o!ybF09<7ܒ%nj{)S q%+&G'KK66Q vu;׶d%X/z мz{wVWf^8:?ޣD#$ӜS)fI`qȽWF%3/}E^SK'fk(SFLaÆ]DB ȑ$ %|60'X!Ge2LE@!$MV{?$΅#'Z<,˿Ý7N^~mo'ofRtS/=_,CO1W:{oǓazS?W?I{vgYm=?Z ܼ4NMt#8> }fFutC|R:wE{n\GBB:#BT_3C׻| Ag*W>uⅻ7ecki>jeqriꍻoza꯮ K:R^(C#woőDy :HT7wϜxwq~zxN(oDES,fvְ!Ϧ,r8Z*&$Ga BITGݶb*e!څ:2ȧS 7Y#cEʢ&˜&"c33-X|p*VPZ驯|?R~X̟:N-hzmWC \EZȴgHcӧU G}j7.̮z兯3@.AU=~pqVTgtS%O#_TM]P1釡n> .o<0[J|pP#*~\Œ4]X kEBK6pxů}sΨsԜ)čZ)[^⑋~G?:5cw/=qqneGiԙ#ߣWΝz q=3S!"8_G!?}3w9~ncQ{X:ylwy3W6vG;O~bJb9K4qAO` cI"'2"dk$ e("N1^ ~[u;ZyҎCkw/pDv;C+LEOB[7Lfc#8C@X("46Ys-";(gCA}eq.MU򙌥hTbD3}= +Wu#DX3j}幄 $ܧ hZ,ʢ*TAtY}*$1H(g,Bo38N,X),x 5MjV€-? mExnI{eR8=?n5L?: y0ԶL5C:CcQg8޻Pb97˼6`dD+G!&'4Cz;ADQa d)F6@RNqRjVmotue/UV0O}B6jzAS5I0)#N#;vF<7}2z9ixQ;ڕ[\A9ebfRj@r}g8"U,iHR"=Suj<h/2)=;? !DE}wBBg(R5*"=;aPWrA`|K_RUUW_}!!477镟gxcuHqg4&9x !vF%$ QTM}! !'IB,$V8kZy‰񇷾<ܘOBw?.2‘ g'lnBҡD "4Xƃ~ІGq$jʤ,B/ovGq{Bi˟B=Pa׍MNp<!0TDl'0e(0J1c9ca!ei lybe3},\¯(>'x-_[^t9@9)P~(sIk/_zn}B`+9/މy?cSR{o#UH&zNٹkq{;oa:KB~k/Y^гaH)d*ʚ$@FX|ZTILiXV?dK9LSo~w'5+{qN %'C}IFN%EtIZDHD ':/ÕFV'U% uT*xJhv$ ]Q!%T4 CaqJ|>y qPDZ[i$&#IUzd5urnE14)sF9@$Q0D#g'I==mE v%05E5sZE"C==Y\8{Ma3:PS1b rg8,MLz0z|6 t17n7 Q`ӄؤy-'$U΋8TD1!|>!:U$ &\AfJ٥ZB<8h!nm+d;:}r8F䲪?B0 ]_@."4rkҥM_ͥ[t>cAS!N3jtN}zNa@tY5vKgD1Gr5VԐ~b\6i̝KA$LR&6zzcUQ dmZ,Dru]۶!.]lNNN tdBMӆa|ggG.E2BK @PFCW%IZ,dLjc/[SLe]M:_,Q8@02]sGnֽr8>+Ks O^zyM|iT1@t} JDij칈BfɈCvW g>zB`w?'.!9 82Uh ~GrA{EEP_P$ RS2r*}\onN{2PNջo|ų~ #e:~SX0*I{lrbtzb)!ZT-s?ΛNX2f0Ѱ "6B\87>rA2pV.^4{{p8M4iеyp /N O\m{bb rAǿOTޏde樝֏=w%oq~;Ddh'} ~G)"l1jcꜮZV6t (r?"Qwnil1W}?2@ (;X0?$v+`: Dm21r>HFBϦ>4Qmnw0j/?/m݌ia+<{ýn#*iaQ̉i3mvwd 2'xkwR;BI-bwVTsu_>?8{ݙLnGhfT &qUOB'L[Y!A\/934^K1-YJ ( Aq50 !˖JF 7vڭ]gG;iYbWnOGw7+7Z]Pg.FEJ.]LrH@hr4[]bjէ?xiZ(0D\^ x@78"b G*K/z}O՛Ϟxݔϗj/]|sG7zn3S[|mٓRY(uD'OO>Dm5oQT9-M)K/cz~xTvnm ܰe]U/MU,Vr2S'/.~6'rzן>;Ȏ{Ap?cB(/oWP!L<u1N9g@C$>R{30qsj{Sgfz0 dHABHi˚,(EqM JDݡ=r2řuJq:i6Wn(PNH@<{Q"p^-K®|@~`۪i$ BS@9-fAUGjtIŲ# 2Ă1 B *@%!C %́}RJH*Tq$㲌Hü;ʥLǻf^ՒT1cR1I?3[^:S䎤Kb2^kaýaL*3msjhnH 4`9:IK2X%ɩJ28eP@l).^TKMnn8E*Rwkq>|~>UUswuJX=wꕙ$4f:?$B$QHR&~ \1 @~cg?n 崦LqO܃u"K*DLMScLT9cEuǜeJd0rD SVCꌚg+Z %A8' r4@smv;s X /'_^^^ZZrR 0#3~W_}ف5"Dcj D tnۏ raQ #OQt*K9,C(6&,d'g&gʎk  >s~pc*YZHU&kG!mH ɢ$iBcWPqH0h;JPfssS}_,O" |LV[ܑw,+~|w$ GBQ33P;Ä8 O1p1z0?lN(>̇oW֤O?o6eez:xdwQ'oX>{U *vOɒn ׎n{#h\:![ˆ\ЄT}o̻,?PV'^wnDa;$Tk% 13lSA:z!]:t̊|g]"'/\..[8P(gkWMJʄ3ݮ1[w bb05l|@zB{{{ gze8T&kG9{RV$~'qUԌglmOg_~^_ p6!\޽bY _d' 2m͑U$Hav*Kgݞ Ra` CIX7=u뇪VEX:wOQߩW-ξxETHaF|11!S)s]!-10(H*pIpW;W$G}t=aBw1؁]L9>u;a }ݐ*={eps,;n֛4^xgOJzϼo:˷ovB}{,aW>3Sv{R^$go5f&k傱]6aiZx姗owKn"v>:Qo/T*%r̐(gOM$7&TAlJS4I=΃ǝࡑ9Mc2P8DGe#J$ jT( D)@c}&S.cIE$Q8DTHAȁ1$Q0>(KqZR ơ'TfCyhi<=?@O?yRA)y;6a3U,QYfv7) 9 a@iwjaj4(A$D^e< HA( Gqw4 LB秲axڵAKb6n <1$QOS3zB;8naE.@8$nfREULHe7{  Xlo2쉒RlΣTURRfLc(҈zABŎҬ%(aCP"%Q3ʼnYղ s7]B"E Ǚ3g^~xxxxxx -wVDQ8O?=9˜DQ477v]]E!ޖq@(S$@Y$dm95 H.9{(@%]H a&K6Y5c|tG"`l&PqE)ē~5M`$Hdi,cIAd3I;ΖyS8}xf qg 9%ry ?~^RxQ*BF  TUM1,Rd_X+.{ε;o%P] [D8BHVA6^[(Ry4>L0!^s 13bqQEÍxaaA`&a ĩcG^==KjwHNs9^5M3݄HZ,5i2te19XZTwŕWO~3jJ|*]\Ի7~t\JhrtjtT ʉH$~}_|ybgcKBDb( ߿1=xaH`L!pX$>JpI2cP`W@WuE:}Q(O6 ,`ء"gE C \$ił2D6 YS/ZټwvWY)0>׾lcg:mDZA^{0lȮ?]5QGI Xy*e4uZ,㮨&Q@"!e;B ~ ˼d rTSVbggڏoÏ+"Hx_8FA,nLEdݞeX{<6ۃC0(b)T$ OD$) &4v}pbY3D?v@*VӷG8A!9]BQ{G B%Ahsd>ۋDP30D⧰u]岢(="+W~Ӝs۶ZiquYinkYmmmL9矖?׉t]iF111.ɓ'Rv}4O;{i4Bauu^!ODE, G0$LzaHE( K|I8L(D)dpiUB( 9DWJ9cUB D2'Xw=$bST= ZGB^7/QÏ#ċ0TJ,Ah)(i9^z~w,Rdh4 1yHBbMN& SgN?^o81HyͣǍxp8mI"?ڕDu_YZ&iw0d9M( "HT]F<|=$v0L)8tq<~N[$OT(ze(5M]s s _ ~gL'D77qpFcye̥/~8ѹWN/dhwDө!/Sc|ک T[%Õ;V9Q:f`i(YUIqM]u:Ym .WL7p-5ie d*x<P+cGZ0ˊF@Ub?~|.@m]UL0$mхs'\ei Ru2xjH:U)Q F `@b-d|oMK;G?[6niǒ3߰r\6v,BuDõ5-,\[E >{4RxfM/x1I=~.Q{+?i 2V8b3(o3SU psz\{*cc0c"(KnoowڽOf3Z}}ӵ5z,9xs{vazf= HQHB0-B6,0 yŐ{ZExG# 'Pz:w}prRWtP9o_~=52l!<`U%SΌ}sʫ>􋀖q 9փRkC>( 0# i IDATOmHZd '$ݿ? ꃍoٙх]{LBORd? be4I%sv{8!S N4 IsA4:9w(d~vRe E;wo_'v_}O?wL;;No._U珟&w_66N8ܽ=?˅;2+3| Ol89KI-g >\UAY~\Pύi!DGKEE$[o~pboоG꟝?V y$) \?,ʉ"f,&4P28 mYbQ/0NCQRu`sD:/)(V&n&eFDT/;͎(C1Q҄R0`{ƞ+HX4/I ǣ0) / HA$$A QUD:9*]8;wԜ_hkmo'ԘƉa*o " qeBFKL@s(49$^_ϝ;>‹ oon&)a }j, XD(E)fM'wN{ "vd|,oVd^:g&4%%C~G,e1G;yt160qR<3$J^/dƭ!Iss'G4͂VD5\5o ݔA 2Y3oO0FJ%Cu]}DZU]ҀIkT$7)nXL(YևGa%MSc2/rj^눂p;P^Pl,IPIx>TU4m6'Oir#GqA|_xzao}o>OۮƇW 99"j 1T(VZ֎a/_6uLa@j췾«Ǘ$]97--77N3g0~G&løZeޅy:6ocu#tP[ys2ZQͨ6s"2"᠚x1>MrU/_~!x$);xQCT PQ5 Xp,קHJ( BD zE+A q"qV|$i;f  ,."߱^7[^ƃj\'<{k6|uo1;ǿ%Sgܤ: xDO>bio|}bqhec" *ů?Fd)(*or^zaQՔknVUʣ(3f&+u;~Ǐ!~SL0 1HcM3 (~DRFcS޷Bb $@I5K"ϱ$"!!CcD)D>JS2DX`$pPz1 W41dmD._Z@%%#^!>(F]&T+JB ]5@PJ(IuX+Ui %3gWn3Y=-BK)L<Xk}|%"A tؠsѵ&F}uھ݄HCF dJa^`8 Y#m fBPk*wCTVn Jo0d H$!a‹Tx4Q+du]Oq1D7e) sZ&B{B__٘G$Iq뺍F8r&qcoJjZ[{'C[v*E?+-kw7tKy]S y߅1?hl/HCc{byn748a6pƒ͌his+w\$g=w\sjf_f<`X!CGh$ըr;Z[Y^O akv7|_T-/ ՇoE]! VBAwgUA!!FA^8MRB)I$'{Ga) -VDwwvw p| #d)@h:p NPNM4Ř`ʂ x-MT^"q2K锦aQB)8C("R3' yL$d}agbNOl>]/;#D\:r!X eN'GFd8)Ud2^Օr9 Pysgw`q9 4a$:1jY֠ s\#(toP.gs^^"„PNH)GzN;SKK^:hݭ7{|^95uT"TEѹ3*73l>\kle\qd0I2?GȨ\1|@U|%`{7Մ^d (4 /wF_ysg&p(a =/]^d"d Kr4L} r%'H( p\![ CRS 81>ULa ,ɜs) 9(e`$ Y(Ie =+Z@EIɑf !W'emV9wѣ11@UUIesss333aLNNnmmPCyldì?d3ܽ{}{KKKğ$1w9{eYfsggg; m2O8|XAC`0j'Nx痖 Vkbbbcccmmӟaw6á|jj… w/\ڿ{ X__?NX*%mZ]8erG^j |&)D>@dHTձ`@ј@\%Iy19$C_S 4\;ıA 4J*sE76zN>_4Pv;b~H 3\Fm3edAJ$!,Sp4yvʥ/}~o6wo%K~ݐƏn{gB0"4LEVP"`8 ?N[@3CpVԭ99 ܝ[/! cR:P+'\^abF-=%t\'Nd/W?2B;:,e촻{qOONt0G5?i\u"9NJ67z2Ր0wN>k./cJ|aoWѕOmxI*+y%4*pH WPcD^P^/Q.7e2;N.w҉ fntىbdz[rA.3:XҌmEkDYxD;7Ξ>{ ^kZ4Aq]ӇNn.,.q/G wj ӘabFNd!MEyv>OVzAI 8o +)u{ry3Wի?裛)g?w潹6{ag $Jh#Mx3{NzϾfsz>fW(N_l Į`;2QqɚZhyuFP>EOJе׶GϱPJ>Higb]XVAʣB.( @YtcotU+,PǼR8Q^~m[In8ISu4#YH@ a(<Pk`DQCA$@Baf% ^o0]P2 ʑ%<\Ei0Rs? i'I̢(Hh8AJ%թR[YkIw-;"{ֻXX$ ,aLxAV .兣&ʪRN` sgg+wcS)Ua^J^yyS꽛t`8aAN(Q@B^Ydh%%fqDS3 nlZv HG& }p,l`ä;qg?e)7lo6Ŭ*Y2&) !!!@(: U &+)dg4-Dxdf,'$@?IŢh2  zVW Q1Y0&%@_մ|ca|t0(A0tmj KB9cH8)S9$Dj⇶o{9 n86\>#kdvaۖfd Kt^Ld%S`43;|?|ȑ4MEQ>>~…;w"׿uYDQLfaaa||<@DV*[[X1^YY$hضApÜq&Vɲ|v1~4#vPx7yð빮{XfAAw333qܣ+q( Gc{n4Zwo6:Iq)~VǂLC2df, R`mNF?qc7wkQ?v^qG}Ҙ[7|x+d@$0I=Y8oo_N)-;+^x'~0 *uBv}7Zmq( IDAT4%?ϥ sIzF_78>Lin; ` /mR #xP)%tA!3Aͱѱlʙ#GoZ!0 , 6v8(*Q8HS&ÃM~wn `l{ịg;%jgd߷x1T(Flնݷ-g8d2Bި5+ zȂJ/[8ʆyl$l^/d 'xի7҄SP-#Bq*߾ijOOB M`<~Z|FS u?o'b$"vb[V(omlz˺:,oLWSjǦfn5z"7!Ω3ŧ~<{89{hjoA[ |*pzvjna2>qpkcdu$uX)d9 'Ο80af+IT4&㉢b+;? bҕU.dE tth;!Hr:'S1$3yC4s`{a7 |@#4kO="sNw ]= g(t bj! % " [ȩՔFc5+(e4LOe^!V8h^/Hġ<5)NMPNM'/.sjɔMC2X  pqVomw/c|oȋN A '4I|ÈE3O\yJfF8zݍwxr5M/J'bQ~כ25eu8$ 1!~' oo{-*ble2'vFg㕚B(9 p{wM V5RUv޹F]Ƣ􄋝ah)Y]Dz{=2IĖ /zoZ-N޺5 j9E쨋ʔ oV\^-d}V̈)4]_l46{2FY(f/ '!$!֠sk dAﵖo-4<'k7'ca%i\q" ,$]S@[^e5r)TѤ|.jx/s~5'ħ LXPo4U.Gw6&PKSO="]_r' uvvJ0ƍF'=C?|0󋋋Q=ztoo'yk(bR:==Q*1+V^g29йsLӜݽ|< O}jgg!499q+W04mnn|>?==uUU9u0ģ&B'Ne{dt1Mc£? OY)iE IT$&ҽq!A8FnL"T}K!B.$ԗp E)T4IHE;+ n`F^OΌR^>6MNġc|TUJ崞?[yQw?ؽ+0ku3FAOR e)JZgQJ f-$aw _J.S{$r48OAFuz鹩~K{+xBzA])ź*og3Ͱ9f]}:Gxݽ{o/&ߌtr&{鑓IWv!Ε[&Ni!ǑILP}7tp_V4?~'W3I#U10|/t85w~OA.>2s,>ߋEQ+S33߸_uv*WPnw(5g^[D-HҠ#"n͚ś7VYQ k)HEXP9pcIӣ4A tA ,rq=[[[2C)m1|,WTffOr)Q $fou@+#k/ Wy>+F9hesg/]f Yuё5?pGGF0:@<$=pqn\v:R9DPq(a뒪x0eX$~!WRƦKKg^/R,W'K>0sn\x6S(.Dn鳙Lnt7퀎όJ"3{NP ØtBHӎ?_''2PsyƮ\[;X V^:DE:ց&xӄT(ތR=݁w~@I0޹(gm˦QTIX7 $cvb腭ͦ$$4Z-Ekij߀"e`"HpnBa`^TY,I\L1D1(JZkoI/eF>@ $_5*\{퇍9}$#~ku6޿upmI@8@c/g[Nw^n_X+O|+c_Ź 5wn?~֒ yt|z7[ X W87Ә#,BQaAxRو4=gbc5a:228J˵Js Z PFEW?LpBYJ PtTPÚY%1QĈ NB[Cq7e/k<NXF Ydf|B~f%Mk`%>C@"o誦ʞY,&gMҙm?Y| |N'؞>5ikʨPD޼F^b& UIFk<p,`$d<ŧ~J%p}I*2۝+Mn=-K\+;$ ">E@gFh҈"eq[wD 4<+cQB由dɶf2<B&^gmj*Yz?'i ‰9eVvRN`'}3'O[=sZ4 DI ֠R j[ѣ ݔ0^`XЫ&8Յ  "RWhF;CE9;S3X?qC`nalzlIh$) ;2Sl(bm_|1 ÿ[ʕ+?Q,/2L&QGX9::<Dgff~tɣd!5Lx84KZ-X>G(J`ɓ'y?? 31?_Dg$C#j(09,&3URF74M;*W*fإݺu E(5^|_Zo)PKEwȍU;}Qh@CfZ4L3/?YӸ{vsU{H? ^׳NH͘Ss~IRz+ {\UЇ,z7>>m\ ͛Q(ӌ|F.+a>0ñ9I2׷{~z6"ooa: u!# 'cȬwKE?v$ F1Se$v f/U}}0a"4],&) .{y^-,# (w;]Q|=ԌvLV[(ݽ- eZu;x.ω\BuC4<"qdr[}PN,z^Ļ;{~Vyw{A0(y)(WZ5_,A؛B{?%I66Zrf)fx/XZGˣO㸅hnnT*EFRA9Q;<sRnbzڔ'I\'URHPi)ڴ/lyRoݾq{skihi^K7FHE9(˙ VnnnZ%sg/IDnc;˖F3ZF0e,yq|׉TxN4%4 0 @dy˫=uW&-QMdiXQ j~雺lf̹ @b1/ 'uq8Ty>62;1fIDAd*# !hĩ% )qB!; MX$ϛ2qIj,M99f)P "%Ltؙ$:{+v)I{+V?HNaV/ z HS0`D?Ę1L+cft.kNlI+ss ~`IZ,GJcq)azC󋋳O7{ͽ Z&a)'st7_,7]U1Jхٻ^.3yCru˛E ]okz`т^ $8Xl;[Bm||+4ݵxsk3Wʕ5fKfzVû'?x;˷74MqF')!Bn4kGY! F½[LO|͛ZmTzb;")`gJP8 P'6ǃ44وJ)1 1f Z5mX3GJ-[g+jjOUng>ޡ%mqqQ\.?s?E9Zdkklz2*Faf}MC !KRQNNx J(&#˶B^s "ِGf}wι97/ _\&LMd AS@nc"p,CeS 7&|}v2wh/>?9~$\cj'6>p#C,P ҹtcvkSVce zv$qfn?|故ܻw|VltIc'[/_./Jg䗗c3I0H+9>jXua$1-ygg*rJ!4ZƘSt$'νOn¥O y'kѲ3XYϕ~31l(ߝ_{}xWǟQEZ1ӳs ijNi40'rKL<Ah_|00$ d !8'BB0BfxF)Ɓ! ރO#EAcB RY~k {ӯݻOts;L.oq~U͇O6>A&Y]Oe{ӕ"PB3D5s3`,㇏IB+VʥSs!ńEt/m4 eQD N`@`1y(DXȋBCwtt9Y5TL bIgp8ǒ@[Dґ)gضza %]R]=iB<2(7R`cgi$ ah lB$ ,cJy"xokW/[;[Ow0 CBXQAQFfڋّF_x7_驕FSH!/(rP߾{7N\҉5(`gO3UoktΝ=_T;w '/S$)2I,H)%EQZZ!x۴6?ӧ.._&&ڸ7B% m][;{N˷A|j]a{y,>G9Y6k}al>HCwBiI줩o'~JkW*J{sw{޾ I!PEEA>]D9^\4'/_l Ƶd$fjA.qRdP|萦iu`08^~p<䙸^pB/3u8vz@K ƋGmy_"?GJ*yT*J1Gli&J=ꪅN&+g1 Ry( \SVA,9LE#w<(BB)>IC< ؊C5H572ț^ |*Hl(JL*rL"z ^qFgRœk GQJQe ~s,EiA$%aհLJJ<ӀWd '0:}G-.]`^w<$ 뺶Z15:w؎?y3hͭ,Hgrl%`k9)x۞P_xa;nfǵZȰ(,qxBȇƾ3f̸c=ԍ3'ןn,sl/^p>\:XE Pat-rI+;~a}'{sϗ IDATwͺ DAYV$a}嫵JnIb{w^2O2;fơ8q#/ }!*(MP+|R} ^uDY%Q$Q<viRcrA]RzS< ylv܋F=2q JDX* $g2iؕ<\?ֿ*ҝo}9.վ(S^>wd0f>~^oR1^҃Wfm?մJNqnkWn~+W lx!at}j~*ų/>zO)Kc&?=7ܵnpԸEJAR;%]\[Z݌&`6={yT)Fil $PsqJwx$3̼ZxZ\PqM_e^iI2vPQ(TK] k7^TG?VUbO~Jmc29_ז/-.&&꯿F}Oo:b潟ܯu{. "! BTf@e<Hj6#]UAf䉋X0m*e^ v@Qtr |z?(yصXxҭ׾{fK?Ѱt'"O~ 7 3r75>%(bLR*'&8*Q oWlwoRXӼ楔J(I)4 „♓9nu,Vgv;;Р`aK${%ХF~iWO7dnf9#|)ŰBx27Var?hv(jlcA!Tt{wmc*]]^b9i;v$Z-14FAXGv2R BG{+p1nحrssfoRrٶ5~SSxgx/6jsa~,iR*cêKS׃DxW4ʵ|!uYVj>7 8ai!pؑK[Y8 ) 1C8]SDREؑu8O:UT-b6 uuWCslGC 0nOPm5;+p4 &C]` kΞ/xndX-ȯr+2GN~dث*+ޱgCRڒgw7kkׅDRyRP7nRV(+{땷W912-?ݻϟkO.yejDݟ y{*7ޘloݻAЋI&P̂z CJu{ +LQX,ƶZ΋8 tY m3^ɰض4Ʀyp8 ?z(0J?YizZ(tۻ6sjDADPV9Mի3|ٟO|[_7ox3ZdqI0&BCZ)'srlNڹ$BbY7\G쉓ŷk{;',!B`Ii( B! AP4M$uQ&diqLp }8ND(wP4ּ~ك{/=;$Va_n *]yeB/q‘i l38 ُ<gLIiװ?MS(>0'V2l}Ę0L #RUp: o}͵i·wi}K_ssAMfV\AHa6E*8EeRb/i NsZEo^8afo$ >x5p@l6s[,N {(9nzou,ЧWf fTQ=A^VVOYW_y|q8 9P\eq^J|p`Rrzc? wfua2hJ-{D "]0.ccD=pϡM0wnNiۻ7Sw|ԕ sb~n[)iέ_n`nє\/tݦ_ 2W+a/ %ITz蹉36Gg\ d2I4K &ǐ `Myj)rʭgJY8zɓI`SfۢTt+ I&0!R! &v_-־,O-4j<3E^4vicMCT-SD t̩]s-hM51L0Azj5 4S4#.8 'hL|]qֳ0C4E8=G*׫Zczq4|)"Og0~oQHAC:]RrSuܲL&y [E^(/N-$F B !19ބWtFW>kكAӬVg=S)QX _44wg0ʠ(9Az$glm'd3:;T}4rS§|owsB1'1}py'\''OZd~!۰Q:~4/q^:ۃ!jbxp P$u`?hN2,=qb 1^}t`X&aq:x^x*FS 5v|fg0$KTiZre!gjo<8|yt83Db:Bq%12qR dL$N$IR(\dAQ$/pAflY8KEA&(;v:B5#MvF?C@VTUdYB^@'fv̉Mӧ݈n0 QICė`$ Z6 0Z$p⃗aP+Zǂ^u꨹zQ\%zޤ4]m>Gk7Va/6 dtGp@sXROR)ox$sKg!NX;tLra-.IlcB9՟zSR9&ӵJ#j=\^Xas<ӭA3$vZȧX]zAB5E7{þXlU֗А)| psNVG6>;C+W܉~`0||f @e[#2p 0Q^-*}2a>.Wt^)- {h ژ^?߃ы|9u qnr*C I J\ʍW(#fg10j0TUx̰K5/--i׷G#[r va88 ZSQM22HQPSD\$ EqEYsKEEF}ѳ]:-QaGaA}sn'T/4qLn4vИA44^UiUj'fP Gv.ww{ m9 ӀԹ ?JptY*h'xzجD͟Z_?7LP~gW*g|$L__]kWNF]L'6k3驓'WWGftM*uP'|ҕ%sӧ-.<7jj٥ޤe|gFBVo{KJi~~ÃCvI[ T%-O\kcҊ]z7mxge |$P iHJN#rl\0%1 ۞X֨\+Rf91Y^rY QMOJBqs01*4^LT:Ɔ$ Mv{B{V|8l]rѲzz8yq}o䫍R0B/qVouQ uUTv $ƈO]gP9iĊRJA[.C;~tscPX-sS7ozWg$ݣ} gV8WI a^=:%cbmngwKA^TdԿcL2GRLXdxJ&1ç^p|I].q0 \бW4mJgͽ=zxÍ'_|E<h ?aDa 1L#ޚRѬ6;vW= Ej\Dm+T^Z\_^(}A}׆?~.qʵr/ayl[bM0M.m#sjazjzWovỽdE] GdEe@9no؆-W@("G+HCȆCEפX׵z2K O"_8m1*jEPasC%,Uj0l4hv$E@/*v臩Kq(H, >a~JlÝ~0Wʁ(F c^DF#Tm 8a*чkm)=L'O5;ZA+c/s~[9.j-$iLBh8݁5qXtLE ]J!]Usj.wbowd='LђBQl(eۥ|KvK2[~|Xԫ"ɠ^WDmM“SH.!M.JaQH6eMʆAeUfM3:s|=Z7?~ DR9E{pӇ+]/"=9X)6*<<~:P7JѵfWk dA "o_XWVOs!3Ovr2IbgǟEY]i!qE1M DIڊƪb;c۪K a/uBHqS(p2DQP d{)v?IFر9,S(6HpbJnu" #QsA\|yq  ZEDgrTlNn=z[cc99tz꧟>~:z65U"1]I5V(0Ih׾/q- H@Y‰|?U^}ŧ+q'$uo>dȨHf8ʌeE^Z8;OT9 |6"``v(Mp|ϟܞZ0hاH6b}fJ0N*|ڟwUdN(N |A IDAT7kǴ2'9&L0_-#!ICbd-e+JSHVza[~\[932*(HqBFpY %J RH!T,3,q,9Yו c¥_<~uEvlq=XT|N4)t/Ff*[˓yޘ?q&{>ǟ%E(`H PA)?˜ht@t>=5%*w\iiazVV7D8Uefj"K*Pu*RP'gr`\ѹdٮgN&SLYB@G^1')08M\J' F}U/4aÌ ?y~25!Qn; ((h3Ӿͷn)0 QM^܊-_yW]g |<8n/}|f:ك-}4_hpu!ac )D1KY_(twav2D c7v,3EZ4U?a3T[>]nj2 QFKӤ3LeVd&]5zE1,sO /L쑣TLi,KmiiqG=m?(NԦ'2]x6(˘~stwwҭ)18˧`峟I\~1yMɳT%|mj&I((R$E4(@ ͳ D1mG%шU$]4Ad{IqQG;Y~_.]ZV`۞ʵ+785 dDYgՓdpu|oFӬکmaӈMyxvb$0B;-|NS(n:y[ͣ3H Q4;LzV(@{9* :f{ +Z[%=a.W W+.llw{e|\|gݧvYp (>=?϶wvp2KӤЏZݭ\y]mn 8^eqͱy1Vd㔅'3)* cC㉂Vk;GyxLE/+I1ݽZͩ3t帳D04ib2% A)xlT*alMZe>"۞c+1N$Jb0\m^za 1z\>hEKK^%"0B JB0D8e[3S+8,3`XqBێ(vX(JDH 3x14'Ji^@VUr% Ja^WsoyYҎ 3^B~k~?w/(ьk_ηKSG;m IJ\0 < đkN{?k ~?O!搐o_vww\P'N.ߌ1Ve5 aΜhm 2O\]J#?]Ƕ˅5^W3rz,uj3U?V7(Ƕ݀ ):ntM# )7z;5& 8tnSdXSw]ۚnDXS $YlQtGe,I&x> )Eʲ̚8sZRx~{˷n9NH2EO4S&r.-b&؎iێy|GY)tgzube_zz 1ŃGS,azn03?7קOQXx`dD`m|h?nAeD95pb}߷泎Hbd46 NqB3h3@0\.2 ݳkK˅Rrͽm(rB&p\R7 #j$b?R$)CIv{%lQajyjyq*my<1Ǒ' OUJ,^DڹT+x(!"0Da#6RL,pH(+LӰ I%r-EϞ*#Ӳyxx0[rRYFHxdYLƖm+gOTkv{U=_;u ԏqۯſ?=tdz'2[P#zӪŧN9Id-aBVNqĵq#"J @a? bNFxX\;O&#' (H^U(tɅ }_ED1qZAPߖ\d[|y].rQut$梘nIh4=- ,Kxk\)0%;;J^ #^*8M3^?#hW33O鏻gWBI ?J¼6 !śKSkO?zO-Nz1ˣ*&$kġIN-Jhh#~mv*hDbYbj*v Zs^8TNJO@Թd^O{@0Hrz%=<> } v´/sg. sg41$ hcD"2qkw{{VK2N,QcGEðEs{i 0Bf^A)Mٮ<Hq (Y)$q+"iL=?,Kj N!ʮ!F,1\5g_Z_yt3)ŵڛ~ÌL[a/8638` Uƶ<::c%QxN0JO/\?$~u}FՔ̕m%I tgb7gTܺۿ ^dTB;p XDW ۮ"f^ *r1E1Xzjsŝwr`o~sn|oOn?1Vid v8v}7Nd˱CA@)QkvUK,qask`Kӕչ(11f0Hs2Y Sp$Y]/WAUtnЫqB0#ԇ<PXYF/.DnI X\d1!!/H^0=uբ6{ƭݭo~V 4p8@dA:vmM yl& k 2dicnd%&J" H<8Ő|}ziYh׆}P`aԤٙKe*| ƄFǰl^ʌd cf2., Tdư{*+LU |EC—aF lp,R/._kPa&Csa;v~mz~-NNk蓢Krq~[}vkK/~mqu=V7(Ug} K+U PQ9|WQ铇8v49V˜%g ( uzwۖd K<Q}d(Tbqv:և_"A $N1ǧ 0_Qs$#@G_nT ӗV?9=LN`Y&>7fm\E'/_maYxle4vፏYI \ff24YFď8bJaQx BWEQ?#k8I%ϋ/tB9|^c~[,7Hb8 p-s,fEV&? nW)l& z j"ـ'ۛG9&9,RǾ #&]k4D Ԣ0ryf 1&$•%̱"! }.-﷏J59pF4UY;9v߉bFqzmAXiIA(_8CA(E5WP}Jow 9<1YGģF!4 @^waPm6{qǷ;\kw|I4 79>'McBM,5oAϕ .); ׮M]I%+jnpp#v$2#'ss|.ĉIyn"GVi5jb؃A $)0eqYP VRDhCxa3W~ $4>8 ,fY6U+sGE.#R/5ۆk7l>b1#˕N۴S(׊k3G_p*\/NI1_QUVm Eckܺ3,~<="\Z[Y~1nWĈ@x;?|[;F뗯4[{_|XT3SkGl ,R,~d7n.Aȥx,J~cv%!LȦ(g49օoye:O`6 ̼&iYR|I{}(4u=<9aq 4JI30A/ -M+T'0F m%=N!Bwo22,Cb`a0+O UY$N"fN9H#ɕ77fZevA >wxKi[zqRRC>폻c#JbOW`a04LSE}t ʪZ_~~vg羽wHl⺌*hdFXuAs3G8$ , M!d0 ]bb\t% reA☔zS3Z;v"ZaL(HHДfP(˷NNJZ|~|adcD. #|7@Zd,2Hӄe0J08JE1$e V/y~i*4Ş݇E֗ߛ 3\阎K~Q9󪐖fg_km|7$!l6ګ-/F=5)gL.Rxɘz1^|փGYmyfnYR~񍟾 \ql#fk4=ծhG͓h:75715qpJș{7$j=XŠ,S3&ɢXP֎ kY/<YFS +eJI8ř=r-m:bxa;JV/QRsHU&*3Ɩ+p/=P Tf8ATkTgiSsY*B>5=CrA͕Z d\".ċ]~O]yQ3ZN;/Kig"?#VpYJ#z˝;H piw?{sׯ5ΟfxAаP-Uc](ۮ74jQW^k8%IAG])43УO>x^4U])̳/ r8|OSV_|}/jcy$j}iک~'۾ {0Q^}ҏzD|@RQ; tz"ô2\&ro3VVZQA=z F}RtRTOv \5wa4aҌv zmb88<:QU$kӫQx rYFdl!] ( 0 ;1E,(+,(R.MGן_x$^~<碍'̻oG~Hj9vez>P$^MW+Gy-ٽ֘z)߼&W/L^[cb۰]糕46˕pj*E+\Ngzń29=FQyrbFY$ A6U.e"g9QER;VOX+Fq)@I)H!CaBdɇ__z÷R&aQ9j`1$0lTnj帜@)C u,+KyQgǶ+(x.U IDAT' ϖztBsơwc8v/>+%!$rg'j;6Ǧ71 JI+j?G4*XABA_dnojċ3O»ٯ~SYnBr ;gA8~2(3q%b J1s&foݿ'v<홞B9WT97dXaD9|k SԲ}=ؕe pAɊ&*3߾l{ŨH tO{Z \CJ^($ID"kR&g`Lfh#*b&ur4@5 o8E#^kgcď(Z/@&zA(H!ٝo}[/~sJtvnqP/X *0Rdz^XH eejz`מB,7<P@n}[C ^aD^Tp{5\;{~χo/3PAQaJa$,)EEA e>#R*2%Y>h]Y[O64~quL6K|ys&s=O )pN;fDT|ȩ' Z'֦+H5F`R̳ڧst2P:= xkY6u"JC D`d'`yH  Mccwn1X!+$/^|OSEchH8Ƙ'{UU\s[%M՚kpH YO{}_gEEk{-U-H\{ '3Lv.̇ro`JrY3u}? )qά^!vVyz~jrλxWο%BJ3F=fR$Typ.(4@0^HB1 @8;`YQU8 ,X@D$BQ"E^$jh&0q^ئ+J'J)y RJc,dG r$Q:B/LJK噽4/^|nafa`#ߝWkS+1l}=I[Hqʼn+*Lc2擃U/0&!ki̗_~퍗fN8DIa,K/ƴ2]F+1{Y(Jgn)vwB1e+V`u{Om3.?(*Ň][NqJͭ݀x dY0aY8,0Zb&0" w7o~xs4T~~m[oCo3;?)l*cvBY Y#)e>-6bEcʥгF忮yjԫsofG٫ks뼺no<}:w)e36tb˽wA|]Uh fI%<'˅ ^_/3ӥ͍>Zd>lvѠ7 rJ M)f!I SF&$KP״{Z/&JfGQH y$1Eyĵh*UNLLJ 7p>|X̓x9ħ9oܩ,fI0bJH`t}(Oݺ*E">B>ArpJoonV|To9F>37>W^~ev۞=q:00B3{`=2nk+:On{[RyiZg;ҏŧ.U* ^{wf(A&5s4RRC"3~ u,X[-Їħ\u8lv}N႐ qHuVTlG( 3ҳ}2f^8 óRģ!H'sl>[Rfȱ}$\}olߞ])).>C/i:v1sAz:N=swA,3ah.(09sd>Mtl m'/-NKBl$)-ˌF(8ʜ"rq@N+vӖe߻w2 ův|߼ܺڛG7%8> 4exVC_ї?(P\. ͜$$b #@@$ Sa ,)( A xQYPi3a4D/2Gl۩9Q4 NZ݁9$VPduM)DƁK(q|yph sK,gWv?Xt?adr'QW Ƌa?LbVVV2ƈX8N-OTbˊ(WCˬ EixGV3S}y 74/ܞt0#Ջ YF}89 ?1IC3?4K%yfNlbrybLPVϭvɩz?9iʼn IjZQh'??q}t~()x?맯-_<؝NDW=g~A'*&M=vl+e%IFI (N4"84ǣqƶfi eIK,M2JAF)I3JiFc |Q&Rx( #ԪCbZwB4a-L@8='2$e(aID8!* XV(,BǚTsA@@PP*x&l0lSAbݝZc1q @>/zh"K^Z^^XM #A\sb yp˷WϜ}cmŚZ?-Jnybl[!x1tZu0U{iDV[ݭ,gΆI0vY3 3-kĠht&N;zjcg[+ дO-=sQ<<ڽxk{'ۏ4SζMIsS!]?{hwgq9'"aMxk+!B8&Y aP}?ޏV<뒌y] "`dA f#,3$)|MBF39Q>>9.WΝԴpf4v1xAIP BX2K1_9>NIgFp| >=]SsWSG:[G;[AN_xB{{~zqFV,#R#kO_|ٮC/R>wK3Ye]x{}ANT|-Wx]HRw]c!]i"xjv ̞t{}cL9 jI l&|0b͞ʙc aet,gřaY "("E y<[f&rrju),G?/_5)pY䐖#DҩƙVkH+/st)%Ο/̞7Jˋp?v ,>3Yg$9zZ /|qtUJgn޼;[\ѫ qWB_k^ÛpYZ5"hB[]3]M"6R{2H/JyB;er=ͫ?jQojVJZXW?)̄!J5߻~eŅփѲ1yIA1|ݿsD+ZןWPzs0QqjjXͶ~X7*bcГG]JwvO_ԥ`}ŇjE||.T49ݿ{hpFNۃ~?#kh!k,t bQ{O4f|hPJ UxqB:9AP*y1S0hwZeG뢜~l9{Q>898d9 9Ai]Gq= dž:a(jpUMOmT,IKI$ӌ9.N4dQa)fS1J18|.\+W+x :SUjUgqĉU2!DlT]DȐ1 y-\3tyj?_M4fD}o]^x6]c7F|,"'_ ?~R#K2Fx$Hq ^_z<޸Ԍi ,[3"reu^`E^T `<0x!Q3I bIs ҧޠ$yW9YD%M L6'g>i՗}xZ^A߼fז@EnAl<2+O֕ٴVVx{Bk!TQG\4qC "i뚚laF$00H⤔>We b sd+$1J24(8ύDQyɶ4`۶666^y&B^"/랄v{,Eea0+ΧB/RG{Uٳ>6Q/:eyq_Ų$,'\[qa|NSz4Tn\kzQgv)N ?Kk;M!YQgƝy͆:x%?Yj ̩5H[$dpn+ҸX`l}ib[ aiPtdhH/w8x-]q,{v'˧. uLgf'zA;<e1y6 VD[oR1 ܣMc](Hkي{$ 퉜VU+4-Gf5F^Y!"AJ) Wwwfegn{(Z8CCqę&eJlAYMգPXhƥFq||hwY!Cf/~QSGNU}tI$bEd @@3HD$q4p7GHBep1ęE)K Ew֝\|fO?jv G^x[ČMK;n}tKK ZA9.t)E,k7;3F~$)"8N$1Li< }D G8Hry9I녘J/EQer61Dz&v~oW˟qgbia2HȉuAMBz2MTl VHW!V2V@,XW:W}煳z{NY ?{5;0 㠨<Ɩ=tG^) 6v]MjB v"ʝs|$J%fCWGGvn{A}iTٳ%m} }3A0E011 ֞Y{u4/reJaez0i\3Cϳc#d焞9vwcT~/;qELßVWpI&+םO~٘Ypu---挺Cp0\3X8?n~`l,\(U6QU G{c)9ܿwSue9eEoTf1P"[,xNXV#ló;|>HU,8Li+)k`82͑b%xȻcέ x͔,$:iF?3Y4rZgc7 IDAT&R:79!c˰=gd\)_ $ $ # 86(0,Da9.IFK2 ~`H`yIh(U%2!8(\nb܋~J|{(Zr"$ac)N $W;`lx%Eճnh=c$cZTLn}r,!~╟ cmHİ;[g29[}c듗/7{v~@$Ji0ʼnFUb9SmڹsJThO+Z`T!`nmmMG.-kۺ1}_䄂rB Gi&IrқG[i櫋خ /fq^8I* 0 =*͚"r2G6/Ŝh|X.$g4(vw='KDN0Vkg-|=Z5ZX I|0hMH&?Ғ \$I9p@QX]jՁsj9\Z>&>b(9DaDAW(bǮIqE> bT+<' ƣ&J a#"HT IfY&qbFbraXY,5ץ3N3;NH\Cc hoLF!i yZm'§O4sۑDf)ghG((fԉ3$*4/R`837Vܾ!Iѳy.Rniq"Oi1rVg8!I H-6Ч45*ߖYf ;H׿qQ²´^/p4nlTt;)g{:(;IcCY=?/{O>{~G]W$F\<{WKGG?yzy`ڟJr5P i xL[@oguo~p2DL%*#3N_LN@4{O[tl=B׎8S-P#HlFR) tc9eQӘzĥR\K lhH2x,RPABH?m׃i*Jä6 _M M1E u<'a<|A`KSY&eӇ Rg(8θHy^KXNSIQ 2[CA^v3&D"dZc.' )" IQ%Ffi@t'+ RIb2 ^T#~p# M4ϕYL;*S"q$'rJrj1L^oZ1I2 37#cfs4I:u2hkޒ_7qt0<ªڔȕA=_M›;.﯋1_^/lu4bI|G,5Zb>=7o_VNl}MN2s2BfD!_i-ӄ? Y喳yRᦗ;嫲υ3KL;ľ;42s9m.USnTjz1LSw#A IJ$VbQ&':f|Í@E^]o_ idu̻Hۈ)g{Hr/?1;Lɦ8pTS_fIjouCE!)j"Wi¹՛W^g:mtj.Ho'"FO,,F-FיPڲ{wR&hR0CiN#ԥW[G*Ο<+O?24/%z!~^Iio#©#:b+Jۻ/--~b.w{{nyzzP+[DyRd~YcJa^zLyN~{p񇀩E,ɔ)fv"ʃ+M{) "\>sv~_,LJɕa F[b!kVciJCՊ\G;'1L8 R*E#o+_Ʃˣ;{j4H9Sώ5"n~(BDtTˀo &3h6ܴoy,%&k8I`X' YE.IDa@^ʀd8PN{A4+dzzx8$ a! ,GG)qʙ3H|p}C׭dliSWW 0tV NImc8Vr <C*z8gs zgvbP.`h2 3NFr@d<},2ah"Lx,jpTLoּ$TL=Ll(@:\') Z3,J;?Kpx}R8է27-^@2쨤`du5UeD$ҩו"MnN/TH(% zZLM=#0|gέ˗׮lL6z+$%Rg,#j1uh= +J=tabq :o)D~fY#@+07KN&ǟ]F" Gehs,O+sͯR s\k퓝\?}w2]VɄMLJ-i P@Z+r.,D;_4}x_w|ӈƐ ?r4&!ouýY d~yhjN-6B2#$rmy?́ٯ6p4azQgNIƸpT'3=וr"Ď Ǘ~{'”ֶK(Z!bYFqjn4o8AH" I#'2"7)8`$<+V?e ++P4O]RZD$B 1 F" rA2$EqE3ӫ/ĬDW_:?|1^x I%Cu" tg_ 1|qRel?ڳĖ6Q']s=Lqq&q̥[r)p,I B/|!fc̅DjF ww#/E%` 3+3JXfw%Y,)tǠo|'QYZYxg//L58t[h IDATۏ8˄U%/2d&{m׉1l+ 1B"Y #N%_y4I˟䗬,NVK,4JBa)S1D3=(EѠX u~ZJC9Cxd@ C%PXZH@ a~~y0M gY ȱ0(m4zGg( ޛk'+x`ҕ^dM;cC 7t۲DyR)'V[vw/rܙc?Kٓs^ IIbV.\i/~a1@~'B&FYV9&+WdL{r^{ڹۇkyh}jxaԷoOs9xb̅ן>@'jTwcۉ9$q,ל>{Eu㲘 `ё cZ"fBE=%VL@ 0@R* 3zB bs!Zd$C5FrR!& cwQ۶cH?qMϡַKYs4j.({hk_n\Yn[6^= k_|ro~;?/oppcn JJ$S~O~6X[-Z]5F9a>˲ŒhwzAoFTZk=z.B +U% 3/J*++LMaB$uii(`A&a 2݌r3vo./1  ;{)pBg1 /( #U%^a]k*" 3ͥ'֎}ϯZ'K+7{bpz:|QϜh\8VN:o3N”<ЏM+KV۱|ƬĵB~qO2dUXǻ=r$P_/kX噼0rȕw8fNp]baIؘh1*9O'k9Eh!SݶTj!^9z>=t^?tM`iJĉ,ʼn+Q{ԡqܻxU%N/}$N^>2~TZNV<7# ̩?BP<>8 4,K yE Mi*b8Do̬@:dꍛ+_G?ɏex8̂@$pOs?z/c!IQO)c9α8e2qe84c4}]ۤ  :I,ILd(CR4*M6M"#2AciV^xoTVZ_!o}o E '|xsvfDpMu=-N @XT;$v€H Su]]zkq-QzxxRDyNc?*O~\WiFa }HAvOs^!W(QE='9@^Po({F.,/ DZ^7V \8fZ&W;2Rau#PX[vD^BCuC",(EY:hH0өŌLǒI*q$q`B)Ȫ:䓏@ɲN ZK'N}G?^\ڛ?=Sd)([5e.\;O^?8?oi.6g[7AQq"Juq~լX.@uFUf{;?`~~fQZ45}8L#M-#4 lŋ0 TFN8$r泍-֖$G')[xG2 AmUNH?> q/w[·f NQL(5P qlZFQʲO(cpj>i|S'Ν^^r}:>vqٱ|oVgcm_sdO ʵ<{s{at`-$T *=bQ̋Wp,PvFJe'/w7~F(9Z:}!fx!wԖk7O:1,d ϧ`NX)Vk3iǾO=gGOJwEL4ɋGwu8Ѷ-H M0UWN=~|ל*9;SSXoQfaa@@,-ߍkkRU3ɹ5oo8\4[/7N>g#7eDp&8QeNe "őfdXQ~y~\GqnE&vrpZ+$~oc'n{};qZZ{MU*dǯqMKW䗷*U{ I%|?OuW|lS!>N g4IEa])p$Jľaj]cs(N)yK#/V˳Lc"V8dH &_L8(ޚgicl8zAzjjqr,B 1OS%Pa8)$8s9ڍ vjLh (׷?DM0?è  8eg+9Ϟ\?YKliRD~vZI*XuC7,*n\ t:Dzʥߝ[[2v7/v;㑖q%czz9W"3 %%XF FYD4BӚ8-ҵi角(y2i$i̙\m2ow!%$&Y2'X',`#z}kgέ<׉-=SUU0dwQӴ|p8UVO4PML~Up29#3+yzOG羚XWjϟgtkW֚l7@!zQ^('x41~}g)k'1-$aN]utLjzC h#]_Q*9fT^ ,IYm4󾳶;_;{##B`i{B,f&! Y%GiP+4ڛ;mąՄG PviӧϦTJtCr#:xre^ЇW!NYD% X)MdujGdZr3WӃPD^*'eUOǻ8:$t?GJim' g$1b,ń@briZ1 /^{|1]39T4g~4@5Pq"#J$ ˀo-О&Kb)EϢ0Fz9YN;>yt00# JGI A r"\Ɓa yrW)4ڳ :AE׮ ?fv)I`X@wH8H&r/F v8h6 m$ n4ci&WȳX s,Yvvƾ3L^YE2$!њmfbk#FsFZkw0U27_ֳ?ųR,,%SO>/QBBwϳv IG\o/^j;=g68((*$MCY("i/ N|lAc~quuFUǪNB:Qo5QBs~ԻKL%{ϻtj!Kx4}He8 0p*I%f,'pl4l8Ya(TZ[;wpd:д\1'><  HK0tz_WVOM ӉsY2'tх|=ːd( &Rk$qo?to|ϋ(MqI YqN~`R B^tw֧\YG.X9OϽt 1 B?B3 Mdv_|Ӟ}K5׶-S0\Y>w`&KUE[w>:0ȓ}p텶%LDyu?]Y(Km'VyI^̿whlLG!'s3R@rRn'BBrsa-k8V53T>AܿoUpѳBh !|/B$%8bGiݙځE(‰:u8ݔ9;M+΂ /CSfb,e\`i!;8qQJ.`:'J9G,$qdʰ`TիU/54(Ug׾~m??mVSIC3$0#xh,ْF 6b7r ;HP9eiԦp83䰓}9^r\_/>>M\]Reo~-bǻc6xǧ0smii'L.VTYmz|v‚Tm?8pN>xx=6;Nƞ79A9NdYZY)wIyw Te՛`6d95TȓɘSWBuRY VQdɉ(6jK[$ .bUP)PAF,tomcY)IP~[Y`_UuN KrG {Y޸ݝ/ݛOOzzӇ$|7o~YnZ"WοmVmɽ_]L 2!Ua/(Z0u& eG& A($Ë<tFB.ə!6<|mmۇ糋eLz Ѻ*Y0dzDhIve}+Lb/'"L¨WeVRK[K"';KUX,I6t|~2LeT̄8vw< `< C\'xfV'0?8c#w㋕׽GB=E%m:}d?![)ʦEFTx?|OG 0DZi >Q$Cl۞;q+InXZeck !qPjy.\ϋ[' ?zfW*=Y,3 "c?+"ן'iTmso1J_*e U˔jd\)2$, X,2T4A |_U9Q rIAN8eiO^uk:ޙni?z@DiAeUhQ&((͈#A@SLH"LdfQ[''tj7Uusjv:-\uwOΒ,9/,eYE8R*bk)ӴTssi&qj4֯l]'R$n4=*{Otק.q<4̣7kh? 2.1بHPDzZ8c F%fm|UK{]nQ9VmŤ{o~q:^pt~ZnfC }qogժZQazΊ"cģ<žU5“Ç/3s ޺104 $;jdfw뷿t6<;h뵎$DDUe49Ey Ŕ.q@%9s g̲pwyop]YIX9$UuirU)-r{,KG{F'$" |+.Ip'-&'jl8ەx6MK8$v%NB7*T l|[sW,ӝg-Ѿʨ7,pYKnԅQh"rQj'x@CBwß퍝g҆*58 gz Z5M 2|Z.ڹT- IS^s|b+;z[W?ytGaŒ<=׍7lo^-<9 IDATN?~z`ײMͶ87 ;%I\ Ah`fYA ^SToɺ V4px)]jY]y EE(aѸL'P2 wxecAD0E,댐x*BTlW_yYh 0Zwwkf3;ѻ3*Lb |;y嗻想G{^^X9XWn/WO|쌳pj6(Üyܬ3 J{@[9^yٳ+)c)eﻐ&ղ@Ym()!zfgt-対q~0B@LkZyF|̃K/n]G+kn[~=y>Pkmr|o8<=]}ٹ,v#'T3.JD:;^Zsg:?2l%ÔDDѣZ>Lvww?PMl8n^@I(-s: vd6xSh(zYF*cZ0PyĊD@lsjզԏLU__([pW# bSV u(ǀV*SYӤ(ˀүnJu^dNjiNg# Ŋ.-ՔYQ$ȒHȦg/ PAQ$"[rDAV,|\^#J,HܭK+WW?}V=:BQJ 4 h@0avrF)3U@\L"K**XWq_&JOO%M*p.Ue!z*lk'v.{Rtp~áEs$*^Lvf<sB 1> TB^rBEZgOƃ~o-ũ7<:S(R+~*V&͊]V .?/ٍ!;2"ܡ_ja;K0bWUլUy$UCMYRF:M*~jQX`\h.AAd Cڒ /\3UwuUYv}6vh^\]n,6NzL?|pJb0ts."Zl?R%h2 ӌSAd-tz'd{+!# EC ar!Ri[~]KeMԲhvufUGS3 Rfͧ`7|>{g”zkEe+_]>Ǘ]3YԬX D84گ}OCc Aih۴Pɝ fܽۇq{YWܹYFkKWd< ܾy?޾n$v+V9JUa{ckU%d8]8QV6|A YL P0A< 1y"atg䨟 x::&FU:~*KB9"ȒY8T!MEw+۫˕ãij2q!hf?u/Cuz\34DHSU%թ!g FBrZk۝ ;gG^7ОCI}a%t$G|a_\`4HIQDQ"Bިke< CyAz"YN8e8lVʆƫ`o ng/,| 8ˑ+ּ8eH#xnl]lotTY>F{k 2MT#0n\{飾 3*H2MDBS%`,, ܐ$3]HӄZXąjO`//ղɜw^tLeZi.azY Ivnږ,OBdayJH i&P!d§++o}esGx4lŭնnAig.e Rղil<_ZueM-QQE\Ujc+"2D0RZe9 _|ĽVZq~Xo_zկ>^V*`V4oa)O;̣<hUeA"XX\/yNCږ5+hIrwV4~6b>Gg->SU =Y^b$'q%?wo'PW-O?GO&SqUW]ǓsbhGkWA(8C^z{aJ>.4&X$M͂d:c.IY3"rӘjh\Fk eIHjxX]r%-)TTW6ִtxI% Ǘ~eR F H1Z<7bj%tдAVdEXdKaE˩oBbArċ,Yf'XE&) t݀H֐R-0*%5/b?s2=}:ˢV󋉪iYFQ $1<+F&4K3(Ѹ_kڪ @$=9:qBejka4 7\ѡ3l{?QĶLT$S(#PV? 4@-#?NNbmkvU`$"Q./8 y`JVyʳUhe$qjEyfaCQuC$|?Rd5˲j((Zd TUKдxڕ2&Jۻ\j"Y^jAH.,0v)|w^䩐h'v%LIc^cm"番 an$enekTsLVUeH%hfj[*jQ i8Og-nmoy||ьW˶YY$.z *l--/A3sa9\0eMNZ?9uԛAEA W*tgCj`醡)Gi\-Z <Y'UUdEPd8cl 7o靄hIw!h:XX^>;Qn˒?rT?,uW^rsMS׺ Lj TL9`gt~B%^ZYڢEiw<K˭|ߐrgQ~1^+ i ӌBX`.r3&HHptp/B;\C] I~_$* Ze' %Ӷ G˄ҔL` eViL+|8>x6qfMEDTKE8Kf9)$O<w!k3*)$O51愐"_om_Uw?gGO& (ZK0(.&jP2ZI1Lgl"U%ENq27JY4 zŝ OG7L $rtWr+[>MbȠ˲"q$Iʌ$DDfA銄D1Y%Ө+SxZ|Imcskƅ"i{+N[DJHATEn$JIhV_74c'!jY_\L~q⋪1׾zkqqN,(PY-˗3٪޺v^Y^llW D %;{ß>|Pѵ ՂDLb㸈r ArQ $i:$QU.* 61mx_۸<@I CƔcA&eC 1tDX$#g@HiiUMVTo}P{gӸ@J5ivYk^6Wa,/fӇĭW:F%bӳS&M2F!D PCWPB/?^% Vwee[ahHt]B)hѓm7=YQC.I(V垦*iIH\25i(E `E>B=5 ͕f^*/{iw\("O`: r|?s 8g8P ,vj敵N,޹Ŀ}ٕk훪bw>)N&Fe]Qó8N4MVuJ c, (if!&K7K7^ygur~_VŪ ^eY$I<j'T Ipzz^R[__{YP"01v#H4mceU Q4nˊ*9R9ّ8EQ)3&r@$M^_ʳG8 _ƵՕ!<0RG<⍗o̒yЮ?;A0lvƩR3w@Z&*^?=&ɘ8q4B4l(-Ֆ\HR%.-d(H. RȂ"DH8DqQpe;'\XzuDAXP!eA#UI-U8&ĒamFӋHaV+ V;dɩ3HR\}QɢA!KӘ13KzJ 'vE\q18?*:b/fi*H- S ǶU-)ӉiVt,|3NËyASGq^-xnO)Ԡ] GA A%4W,rM@l2B0t:ž*BӂJK)I 8qBFsr׀ŃvoQַWk漢:N nH4u 8ZT ^YQ;?A.Uպf-S}}kh:an<Ed֫s!7e-SIܳ%3* "݅k^Mw2v:!iVT 8uT̗puE?؅(B2 7^{T?r֓QZ[Y p9@ $YM;MZd+ vUZ\:r,LQ6.%obY]9XH8V[ŠS4t<;oWzg7,gTPV!5TJr!@,8g,H2R]N'9q4:`!,w|a{5,nd|)"=ep v%lwB!8 >|XvZ ?\Ҕqx;&qr(6઀zISvrrǁ{fuuseY.7z?{Q^5kZfIA4OnoP|~̟8I@% LpT(!(L^eYxD?HXXz'21v-⤟Z*YujM@PZU* P& IKt-bz1ԓh< MSRN8Yenu#?煢%c˰:]t:Fgw^|e^\6ޥ;I mxM%7#]*zPT5u\=X2^v;]P8Oι"of>b C4幆"A(Msl0bZZs^1.'ǀk˵^gtU//fU(/(h]6:5A̧~mL 2EY Ҁ1EQBPpZoL؝獖Q\rVNc\Y3r F$KeJ BP Ca0tjh8W\Ԍp;ئvzq%2=^gg3oWLx:'y5g-ԛuBjٚM.gjRY1abY֒$(r*iifs:car M(M ,%[,J9e׮nJR %L`t1hd@@BH5o4-%)úYW44Ue!!LĤHr2: ZjOVF٨P(-bʍ5s ꥸQ~cS*{~|x_k&rAe;@Byp6閭y4hy$ˍVgGϞz6DFV Z9ڢ*[rD*e;/ ާUH HQ88Z궠 L0K$i1KQ*KYQ99aᄵJmQN82%6yTh!8-U[CNCg*RٞMԯ K %p.L[ڼ_~I6ZK+i D"`ZB1 A?{ivDA Z++r/0Y][ٽ>T4rzgI[dZJ+6SRNMCP1@lKUI Ń4N7V%Ty\}d NYtr9G qgqnj"Y'HTNN_Fq6X\oHsffH,M3 Wy(/{_+XŸ2 AVgr9lm{By Fi$ e.(\۝zvf5YN//Ʒ1ʸ.(.-e9 jl1CMVeYw(HkűtG`SD)XQ8sVgo~p:ܘZD[IQ%KD^Џ)ȁw_8;om]ƪYFso;vQV! 0f`!Y89Sk-E4KJ^)D,*Td Kaa|"?]EVG_/ ,UAɉͦ 2I)Nce\E,V^+3cd)@b1%Rqʒ,mA(ҬҠibЯI"Ѿrj^FO9βbIT&% d u2h%X.2.IY"$ydx~yF{=˘kw- L_Ͽ|w?rp-ppv=ϫF[j: QʊpJ N]Ќ"ؒޛ/7O?Jo8 _AӇont;?Q<}J/fmd2mnv0PIXNBiHDQJa0Y-$;-Pg.)^zBl܍а5[CI$ eH\]oMGSy۽L?ɇCJ|0~߾~?_ʒ%¹00*-{͎IvRWӰ$~no# #C.·@4'x:@X1RUyຖ"Λ4nj1/hE{Ni"ڊ,K$TE*~uU>UkZF٣EIνcr*JWe|6ޏbck;hŸ͗?`U4$#4,3Өd2)FLภEYE.L]TVdNiqܩ;+a0XO/]MOl%9K$}r?:qy{{ewQo N&ʑa)+BJs5R̦휞_򒘊9/+0KOOϖ#ʲil>ZqeQA( "gYztr&$ z|7vz;>?WeAT*A:8|txW~ЩxPt-#g7׺xtpujeIY8M QD 5 l:ol@. 5;tdؾnFKD(q&H>Kة\wq+™U 0ʠ @ !\dI¤ px(pѬjBR/*GLJ?[P+2UYp: YȮ ^5q.bl@ FQ@r|{P~ kU(gEޭpr*V ޲k}\\FOL-%K )̩Qsc[,\gF1z#߸z46.μĝ N9U3TڳWz)y!֦_ٿ~/l ?6E,`ionjVZ&YJ@qX~A[\@n) AR"\<9~J?eDoĔku%7/%QӲ[Fy b߾S1wv6|NXE0CИOgyu_-lzXqL+4NY!XjM=IWOeIiHafF."U] , Jĩ47W+wl|m8>D#B?{2x9IQZI\:;qzr6 kvoXFz%kSkkۏ? s֋'r0pXURєLolcWo~cNYg h)@%Qݲ,oؖatqFF3EY!dAh* V {k,!+riEpt $ʪ $ij|ӱ\^+9EAMefa/=?=h% TTx9XXvB04)4ꊤ˨$̯LUBNt7^= qY i3DOʢzSWZT25bdq>=YTj;AkSN:7&KʹD*@pc[T$Fݻd|y^aUzs(MP'iQu8 6@Uj;GOJP!1|2?Wֶ7WbLl8gEOgGjɀЪIB)0LI75]oL~H$HZ" Ñ/]N*I1.`h0Zo9KfcY*Rٶ{rR1(G~D!2{l>zet RkP.2w}sO?><MuV)2:h2eg KJ׍4˱9<a s'R+ (ɼzqZ"WcIQyInGp讯*fbo<=j$.ehz @9cQa樀Ṭ 8mo袼X@A5YA@A/hy$z*D NAyp 2m BXs".k++j>#(յzFRUye:7e\*﫩[Zs׋˹+o"-4.(TjaQZ&[ke{,ͭ-cRL)ԥ;%WXs#2" V^<{6;5,*HsB UdE)!HPFŵon'[k+kݾ*Jh\04qH(hԱi'`*-X!D*-I(5&Um)!iD߲uMCLD9BZq 4GsdA.P4qh sB8՜ӉHI/XzaTeieEj7kYeAȪ8 "irrlBh0 (&4Εzs%KQV)],WkEMçf ؑ׋1PlY2eV(+8-cv̪Nol.,XDE wp]/ lXQ:(X-9א ﭯǑćݸ>k,O$i5Z"uEes(PXgGO<DQ ,Q7n0 he1\Dh@Cz7jVU q57ktOQM3<痳lz4 j[RF^"qfdElh#E9PD@Zcbny=E^O><~4!ս6e,"wZKZ]_RjȒ(5AAglG7zC18~Y@Bz,.|oTKS#pq:8?selYSI-M7DUZ IDAT;zH4d<6%d"*E3DnP<"&LM~W : 4^oom9guhҏE\>94:(00hHJ(j뤈̆BX6C7z2Qʒ]Cue)˼ZX꺑D]i,e(cI"K %Fm- Gnd aYaUqzc(J$e8^pAF d(fgTy29J@T0L0??~TkFY)j5$JI+:-#Ix2Xei<}q8 (,X"L7,%~oV:NVc fhaSd*~:4 VC.diUB$dxqN/_ UygXpxIZ2oݍ8$.V*PUEvoR?= `DVuIn& A\+oH}_/1Q趃ORWXci\H*El8?Z[k`*"e9]%My6kEg D3Zs+NM5:G|9LdݠeƁW #o\\]7B UEEBz1=vdq19g~H8<q9eu{V{oۛ+msȇ?hRqpgVA.jΕxzeX6m7RK{YրwѣN&8d\BYzs&6'g^[ɩa K{t~k~}x5BfiL%JjjRVs?J*J~/%z;8=;>:0-y4_6M+ +:H~)#A9)k> !WdUݬle;El<͒?pW6l}WRpf՚J_=ع^ۿjEVTYS%1sWQ&[r㪜8F q]Q,MAl˨tiYƧs/`YB:\Y5^K̟W><|֛hu@2LR dLk& ?l5tM%Eaw:wvnD"pjUh\2(^&KRVhڵvɘ_1niB>9iHgL$j{qB9^< $˘Ф!,@% ~E~gYZdIV]ﵝx:,|Kʌ%YlwTp,ƕۢ?zX~{W?ok+UϦ2sUJh(\$X1e",dS,'Q,76`%[ovu4@p0|GO/&SeݐG4M0gy@\XL9c(JIO4/DYdY!%qYJ8#tEGxih{ϲL#M)t@ ʂ,YsPJrR{YȘ:fUL&~0O"Q04ݛ,v`w ],TLUH dG2o[LJctҒ'% :-PDmAcV&nVJ΄c?0XHE iAlȬ!&~͋8(O+7@=5ں/aJ.D&XeCۻwΝ`8gE{_GGS'G RԚNK8gGK9Hip("I .a:'qHҔTr8 ]׮l/k2-Qrz<|NSP\S$KeAfqj jͪ>=LTlf7'/˰Y(N^O$%k5iYy ]ri5jF-aZde9)iVwЋ<֘(e^C(U[- ˀ_.mʓ,q{JLi-Es4 FE%2(].NGפ궢̲XAxgr01)еؽXcNy KDŽ4tȩ$)M !j]( )Db1 %C$"e2[$9N\s п/A#t]T(`0X[[R(SAg5N ģ$-nDznv$,UQQDal`U˲"˺eH0.r$rXiHO :Ҥђ $I*En%$]ٚj4X@rA`6_pu-l^K9J(ʌ!*$//?o}oU? vaVwoX:?s2]Y"u0 # YQ% KYo>=bVzC䂍9=8:VpUw_'XǃtX L\\lRј, i)FknS /CUwv:p|r&Ґf F0FskjQN},"L$/b^2}l.^zܺu ɳ eQfi&aI$ e,bYTP43 Wx%J4MsjuUі@lQE*0M칋fsES|Ɖ¤c\.f2 Y99h(cr-ƽ:U -I_IB%IhjmcgrzXQdQ(K")4!@„Lda9uqDIY\^,#MǜTE!LjUYԝm[aC!)eUER1Bm;vVuί,}ŗΫ{~mu%$'yzeӪ 1l% [(z|iNϑp0u[lI+'yS,q:Ɗo ^$!).a0kn>|H#Ѫ>vX b8O8zw iV$U_i.4ƎCFH|6 *kLJg2fU;J=e^lnuWz! -nhO*Ȁ(%m ahbeU 9/D`x^,Qp*hUUirZ-(OMǁ$NrZ1Q lR湄`Se3TdYI8׮rr2^Ny#ߏ#Y rEQm*rz[w=?INNfAv8͝uJN2% NrUPSȪ^ke|wiwҝ=wuǝvZXIr `*vsͷZ~dM+/ób_G2,T QXhHPTJQEl7|+kŋpnaK$y^S4MݪyzG &,VC4tǩd0;9\iԛMƶ"@Z ]޸z9t=S:ϟ Tg D8<P"~+ӼUE[_;t9%4/~fֿxش $;Nvo9O Xy0]Mø<+{LɂΣ&ɂD؟VVVV=ןFrĽ789|Zy$aFcYuX*+ p8)Jr8I(qI²"+ؑJvet5X`˅mW:;|Ij[Hհ-# B˴"8=T r"BU]<'% D:WdD2&kaF,*Yjoolؿqs^hИʂPXP~v6~Ufy  ZF9DHQ<+?:88! +{+uQi$ %1MUn##ˌ$Єk_8su}___/u]ƘiAﻮu(Ǣ(QJ6B>xlǶmRvtɅ귦ߏB BAdC35Ă8C"2YXّ^K!(qF5WJ8,$^SE2B̗!'fUL䱂r]?/V0y?ߪ/VV{ @5-,*X)"@q~8?=>=8ԷX(jùu .ܺRۿsɋOoq="}͋pˊΑP /"iIQfy@CnXnጓBj Y7$\ʊ»q;7}?#޸wATia@7&swҗaAʣ^stKN(|YU(iE9b*YiU].|Zmݭr;~w>) P AV;;$K L`E2 !TE@qE? e吼4 0iry+gy^2\RHUU`5%@ĂHP)*)F^G殛jjXW/}{z˝^dR.pummīe@rW?Zb {uם&LG(Pd*'J@P멟qU@SC(Yx˴wQB=K1 J淾}?zo/cwco6,l<!gg;oUuT~xUq%2_}7-ϞY\Q gTQ䫺Djsu=J \@"bcY%GEjP f &y٪ٌN9 yAiAAeӢ$ f37XiU+u? y( CYzB?^Ee8ORB(uh>Ii ./iJh2bp e5   kXYJF,.RfV?tt>攒*٭[ώO+oo>;8W}"; !iHϞ<8xzhp8'TDW( )AT4f^UBz~ \&Cko>xׯMT&,x:*j/޼{={2xr|%661 D `խ۔T%e\aztv4 NNkYG%ʆ˹wWXv&{hHOYzs|ΛI0{nQ1PQ$e"D~ z٨";9o8b3t(yFHIV1ǤHYYBTJ..'A@Ed+" VT$w aQM)t4FT0¥(h)XDB!sR^eJAEEͲJ D&VXf@˂ae^  (Jr.*Wouד(%eJbIHHA&A(D E\V*a@Л'(LRS+;'"**iX@ŊV0i?{eD^,=NA41>s1 MSA8v]WDQtzzj\Mo֏~[n{O?tccò,EQ~ivO̺ ou_YkYdE6!R*.Ds !uBJ`%+͔8/%Tse&Xb!4$UdU,0Qaq8%92ę, pMrR"si,KSĉ*Z 5jUɣg$eXe'MYזdӇ?7,i:Kϟ,g^ȒHRTԓ4d[5AR^B>$"RqMqF"&pY I Yudp/7%q6UwHo'i1ep20DTo0lrpyy9Q$jU1[:C| };mr8Y]MRFHKSWpwmW_#٢o*iO.c 񌚈e& /:/ä"eNi,K2$)8J~熮iyS IDAT-Րb"?Lxgw;NH\ .k"GDX\,_{wwh.(%e^zir]ώO_c%L\ji\/BaS$ޒ4VɄrCUY*+ U^[W22Ә"+/>tskkm-xl$7o7olpNnBұ;+V=W|G'g*hΙqÖO g(`|kbҐ`Q ( S8APUB"²($`*`(a3/hYTU3PRXuoXTQ(,Nbr>:f1CrpaKXDכrb7[jY5Ӛesty}t2?xW/|$?*&+{~6)2_],ȗg<.WAoj,]l\cp-7 t|~uJg`aA^%2raX14$fq 4XIԋ=MR xy(H%G({۲@o}sm\>y/{Yi*YfA6"APA@4 @ j#մEvu,r̬q#7Ǜm5(hr4b} ֪T5a(M'AO4c\TR Jno183`UHB c)a>p u݂t.oߪ;NyPv< U5d +zɪseJFHbBUBz)#)FQ\f Uױ,MT dq 6M\5U(aU9RGF+Ɨ6vBrHi_LFx/R3XYtkj~5c<&ɄOB°5.XsM4ȏRG0e2]dۗ{u6̔0n6@s677!?n0ݿhz=BygY&t:It8b1ƕJ(O^tt{{Rzjkk' Wө,Q. AG"?rawW0l6zV.)XSXDYV:t+&Pija\J]˚P!h2r+Sqrj(JCp5&RSq咝BeY,"l@%2\zv1 Ɠ)%itq8ȠVS?|4?xU4?u,BVmזA*֙&Rټz28Ěu<^K%XX@ūض $z?}=Ӧ޸SVQϤ[l2cZce2؛+8$1yZq˲m<4Pi<t0OFʶmdfڍaxF]D$'$dnt=Е;z1qZ|4:곩\󽃇yAkծn8e+ a_||).m_q4uJP5v1+_i)<j .FTQ0ZT+ef{SmYQaz89hLXNx+LARs!VnHJ&j[F٩9 a_ G$$/x1 /I4:-Ojsnzö6v ʒ^"u;Fo?ٜe7ߔDY;?7 e" lkfAqQbtZ̓O DRoAlQL4tXQ5M-9VNr[+.,fxzViFZ. 6,k8>Z߸|i0ch6O s9l0ZEhڵWWVՊk[|>^,g X2 ͂bt9Y,s $[5aBrr Wƽ7Kvm9)4ˮ] =y"* KIg" # " Վ ,N^NS3!Rr틗ͭvqKZ/cٞZB^r+WZn/>y,T& ϼO.tq6vg؀W7įT\7&``\Yr aMq)cE`+vzΕ4_8cVNڵ@ >|z,`&n]|kI|qa1gQV2;i?|{*=qr5z䳭εܿҍ'FӢ<dxНښWO'(suwZiSơD*0aq4l揰כniCDgәm6MŚnd@OsbRelV*ٸRv뮷nDbTT\*ٚHNT16*U[x< P) tvi]WIzպ BP@qz~B9Y[ݺr5K˛okwVUmlm$QB$IQ̓d8∑"K} IT +d-S3LEsI(,|\.¥.V F%r qe)nFd[ni%]5b+>^xQe`$+_dRz-805S2NH:yVTdY-\o\B]]i^궷 y$XnVJ-4ZDh(Jru}ccc8&IrUEQ ?~!?f0Ʒnzy\FaB$Oo ?Ck Oɨ?=aJ\is*rig ~1]^aB#FeqkZZ^m)2\S2zŝLIH@.KNRl Hq54h&4;?]̦I8U51)'a |8nl6e{s\jU?J sjBۖXGiH^\X+.^pz2898*TlZQ^4r5ȍxˢTK Tf[&REn%$9v+w޹sΝ$6 C7K,G\'_U@erQE7׷ol;óW K<_z4)8+% e _"((V2VW,~EtW^`H峣q.Į[usZjVdCHP?=z#)rkJ4]$Dp1&ۭn/IUGsdQ&9KU4I#?*r[ufnV}|bj!a5ӲX]SnjuG"Ox1-F'EWʞmwE…23WCe&T¥t B#8,S@ss8>%R ,4HRTi^-M!9Ici9~_fI<*%̆g~BBuV[STG <[ollnДTKjm,Q lQw5?L}ki[IFltVhjRRL( fq`{uC/i1EA#?A'IOk͔YEPvhԏ^8Qmmlcƨ\mx^%1l΃4̢i:HG9B esnRQ-(r jJ:d7=VjläG9HTuUSn:%H`r24MjNLNӋV+[pҬo_!!X*I@An߾|cM̦K[yIa2S %$͑`" j1b\x_l7_Lݵ je, !nx|g8ewݏ&sqre<&G #0t"sF#ەJvE0PmǾSC<'5]_k^Xt\zS90cV|._g^nED"MZUߗeNht.&+޽"<㇏n-dY_}8G/~ummOޣ,g[oF6g`оvNjT5wgG-+ 8K+V5) U,0Cd[&0ѠXo87Vr 儨ZJUQ$`yY"EՀj[.^y!Wy> XwKV9%4G3"/v%,Z!dYlkы#1C[咇RE ),̓pX;W߼IiGa,VXvEѐq"s4uCHr BBDJTP(Bpaۖ\ΧAj2~>|-,biFpD&;n0ϲ$'V4MW149V"H!Y^^_]Zo_Z.*;DA_|,f̀GO&d AGԧ޻wǷ0BkkkRJByޏ?V2vO?ʯ(_~YCÁd\Hp8<Uܲ jR\]1 |?w4N4.)覞SPX8%e)4Ԓ^fv|;ҨT%$)%UdmiXDĎ dk>;=M=eV-^p$!+%!DVʱt_픯^bX7LBյ,k\l7NNFyf5ӹjʳs("(/c%ЧЬ*q[4-BFd4Uh4M3υN7_| *U"vJǻ[;nm۬8Dty)PdIHA{F~Fc(Z^]q:*+m}0R0 $:EV/Džh/ώٮuݮz+=Z n\uݧC5*UpSIJ^kˢȜΥE|+'I")C 3!a`?1|aGW2Mۚ,g*iÉYFLַr[DIVzO,R348z8eFiqJ`f)RjZRO"VKUjfT *PzŵmyT CeT%ɜth.yN h*c!Y暚iiD -5UI$+L#\~+пrgJvS "@CLNjN{ړ''G/\\QFpA2Jy@1mP2)4I&PBERުq%54f,~Kf^9<=-ݭκ Q}ZZ_ ߼wo 2'Y_{`RSZ8fIk{Z/.-bd_v%BlYPcճMit'?8l*i˛M>ds/ܸΣwN ={uqR7.q4g^"YLڍYŒ*g`gcY_s=^HgyNML0-ʚlYip9,RؠX+785l<96u(X "T*瘆"/r\CqNP:E:PO]G|J(-r srBsH˿p{m1FK?3Lo|[U64Ṫ<<4]˪zE|ib-̄YFp M=T`ɪ}h+s )"-Uv 2Y'36ϿKϿ::<]&Yh1XY.2kV)"* ͩ,P8bf-Vҷ|[[ p4ӃѬ;n~'nmˍ?|r5|f_uJeOU2߻}x)bJY˞?RWb>*(.)% *9TuLH$^r 8 IDATA_]m\ IeLx;fw˿nw-ms{/?HnW!GZT-||ӽ,Jeqֻ~Y6&4yuHP({/6Cu E*Pt%?SX*W۪vQNHf[N6ONW.h0g0,y ag㐃aQ=|y5w0<~6lȥ<ʓ u ƄHyH J8N*7R?z?{V(BrʵM1!e&wQbװc?$F@ % u ȂyL<,6E]B-<~v 78yMUqvO\'#=}ocUU lR*^\+5Y–Y `ZwRP;g4K%%432u Ƹ,hQ.LFn) S?X&-(+P s4R4/X]ǟ{i>GO,C^Kk?X]Nf`I*jDIo6/(xw:kG?-X>x{7b2tKcfJh"lk/vnurÃRQS<⊒UL`ES%t-I`@ιR4l$O{Nz d˽Fo>>{q0w^Ti>xѡRynoNųGw+kl޺x]lfQJ{kwUZnW=/[/\x<;~5K?[#?̿?oon h?GϿOvڬ+{GcU&I\աޢ젹YOa.UR f28|R)+iU{u4ĥjOyJ;"27ʵbC&An`b6N[F0KCUf,1QwZ:¥fKRU͊p$+q8> C+]$핋iuP Mu,c^I W%![NCe@(EA8(5{~Rv-$||ut\}G  Hm[H BhYVs46,' xA~|pfWZ͵m$ƎKPU5 J!떋<2vJIS뚦k)ZLRF{PE`>.%$#3&g%cŲ8:.5n h9R+8áf:H%8 ȅFOf{4Gh^EQRʕJjq `iliA &k" IQ]i''4]k,p5o`eyۀ"~v IFH*t5K?*hF YUTrU4Cl6 Hak+z7UM҆vN:Y"XTRBЧ 38cB2iHMd9]+v/H1U,>/QyTxGOp6.(_;\l|~D,flȖ# S1A,D'v6w/w>,Ixr>8 Jn[x}WWÝ7jY__$yhh!szw^_\V5@*^ Wz+Oaۊ.NWu8ߟu-\ܩqbG?iNTvPgc3 kU"Zڱ-"a4iM77-C `*4#Y4űm[Ղ ,fJd,T d `.իYwOOOG$M5A0 1ȹRhg90 RHQ@ -bQB|wwO?;?ȍ܍o ÿ}~J|h+o>F>1_}w{&x aqzڟ-qVt|ԮkZ/(mEJp`;vӸplOY1JS~xvx67o\dqƮ f'LJeRo.]>ݾw~y煯\x {?ONΧq)mO|4PPJ- L1%*ZkVB IԵ}-6 l 1 T+g.cY6,CB 7lPXNkmRy\0H&w6IHa\,>q@B%8X˳o6zp:q,Yk橘N DOogRluaC h6JVM:*oV(\k  FWu%FcU\O3mx^&AYKsu-୷$ 8=/n]Ru-vJ۶:oeqnd<)+pm/@M&s%`obE{sGǔ5[ӓ^scWb6 j4bZ,Ҫ(+a2@//A42ȢL- ^`[fB ¦Ji4M&q-g'2o^ `u IDAT0qEb28QLzΘ̝&BԩR:3+@p-&"Kllf3$ #D`A`mYn_ގOѢ*)| ڑ/Viߺr~Uu)0qmhxf#EoR~KgG,QIZ]x6,: LLRjjRʊW;]`זWxɃ+W5J*skT)K;;+o][k۩k?YV ~P}1|Y_^^LGW]x`ekc:M>zɣFIJ6Ң ] 9WA@I \SjmZhE)5DIc 1!S Gh ڵ1KY +oxޙj;~jh-C(!W. 5R EOU\k,4h=\TI.TR4 +E|qXLږ¦GV60ZNg+\NNY:;-zvZ Qm0h6Z9 \pA~׾us~' $޼|x4 iSlh ~`5ZmVQa+Pčo{Y>ϋҠEH54m'̕0DCRCqU誔FstQg;R'E:fmPTL{4)&kآpÞ EUe5.ҬI&"NDpM&eU&ZQ0HKA`!{ggWPFV08ҲVh6t>JY{'Fbrv|,{0?|useð*)N>쯶O7_}|x骿_q>L+:>I=/_n//Oݹ6RشޣƅB$BIb%/]-'y1CWe&b4*=]%<]~z, ʥ;()ct0k׾;_ϓɠUN/6EQo|eҕk?~t2no֫׿|i< |xlzpl鸡;aKEi9/[_5HfZKki:繋:8~+/X6O_x|A'ɿ_xodie`E<@\vw,Fk~VP %eQIƅjxq y-M4漚.9Q'`Cy9> W8>RuՉ 7Gþ0^Рo!ؤh:Oi;K5y /Arh2+cyßlԗ.{b:Ej!b*6@hSIɍı(v7'yƆ j6b)VI`w" FZ hY3EDh !)-Ą82!j: k>æQYOM)Z$^.!/f5CZ*nFY1_|Пe-yV9nn-/]><|JwvxIeiMD阹;J~d-a°c UJÄ0-ibrtpp+xFx>%J.d\ʥ+Q΁ј>z4BՈX %t{六z哳*(8VqS!s-q]n+Q Iʪ,rjAƫbf0BB5k-0fn ȯ )e4$RB@b6sܰ jۻm5(_]4ypj%μPmia橌rpe< Qh)-^yM}V]a~- @F>UUxVm^+Cz/"W峓n^~;g{?:j.pA;g~Ͼ_FN&ЫЮ1z{I(t [x+[KAʥӽAm.$c47ҢV;lFf1 АbF" &k32R D"\SʀAZB)F@*KWZ $FMg^{_Ud 2&ys,(4T*-AH$J $dCZƙ"E#A4[̵H"ѥAn_y|fw)If,+5YQ3Ɉ[jldϚu/>zpK7yAɇ͓@V1AR˂@I<6l]GOn\a|Īc58ݠhi3W>|XGr4P7Vǟevj5B)hVfe!`Yq]jH!P|BRc.$$JJPRu6l\5vvvexn%!c1H ) IzRis4 Q .,Eki?Ma m0WHz6.{rg!0Ţ_dIA0Zp9g; ʭkV)Z7_|~>[f\.ݏu[[Eճ_b4GoU&9ζ],u˪5WG^l\l8<% R \p+{{{Ε[oݹhj Rs ңmߎ'Óta *ʕbd9.CkQ GRfk3-E 8 gZa?Dpb}?yIϏ\`cA/=bq9 k5>?OEU2m*Za^ӭM&ELhMh=}wx?>!޼|39:VR 3^%y8iZZ !Ijr]if|2]Xͪ)qՄ$hTNnwi?zF8>J޼Ҽrdp7,>ff`tkAUtZ y4n=sgÉĶV#NV%R@P Le3u CelRVZ-ʦieaew=~~bTӔڍ koܻIlENUj۵p d{RE+`9 h ƗVElS%6Z~pr~2쳓C`'R-vpe ΦxoeMniq;yR]Ç:u}K!dvl ֘7ʒx hByyuwz}66a/^~?3ah|arN3d`H &Rf PZ#D$r.0Aa!e2sei!!1 l1Dz)u3H*` 2pH"R@g[и#"*W\.\ܼv/aQ_r>F8=}|>lvaiuc!D z'Cܽdʔ7 X3O<ϓa9.4D  TiO\I+u?;ޯ^zkpze'ޅʁ^$namM Q!G-wΎe {20ѳ7o8tK Ye,9(0-h49-oÍ{WvO_9MR~z>9 q Vbk}׾|0BPi4H d.yUۇ;;W,l4ݖEYGY>ˡ"@Q O|V@#ey펿zܿ _%ȾqQ6Wݿ{ޯ x>[Ǔ2COEzYw×._,_|X•Z2^ =1DҢ䲳r7 "3N>xiȞ4yck>} zNo#FcfRĂ-Zv4CAIz>=k4K~dAvA\)hJD E\΋d2/qٔO -ڗzsA^[_&ghPEٓJfAC!@,Ɋ,T4FyHR5Ѩ{cA(4fmTXY<;闥!m6'{6k+\TE>Hf*\r!<,>6 ^x4^i_魴|1/Cn9AIg9HE-,(tѬ3]u?>RTjxҷO~ /_u<޼^t&?nO1LАPt>FUqc Ɩt0+xu'Vo]jvdhApעyD7{Z Gw~ܢ;Iy)˫+7WZj}%Ps${ZY|ǯ^~b_ǃOڕOeU`NiYb} 7.?{W71ΪݳjUQTDu*40Y^yAP$˴F˼(l@1_Ri1q],Ke1cF 1)H+D@imTFj!fVX\J,H0<#-Bir'e{i.Yo9¯92*tTUU߹ӳtRciڃ5Dd*h[Jiy^KA\,V4dOD#߱pR Y>6\vi(u: N)wG5 Q&Yް9/&jp'm5>|t8-kWW>xӳ8Ϧ ^FHr+KQ.# 4YJ31J!4rH ZZ +%|0<ϳlťM(`"*j /M]|t gK@6a, B)uVE*UYoy,ʬXhLj C.6zR7mr5P)ȈmD9 |zѾR[U]hw{>ܻ<0-࣭gw~rZ{ͯ|דx}u6>yH؂\il2BK]hw0F}mK\ l2(@GxE?OS9߲°QY>_ (Vu6 #,?xaP.b۵K}utB=2}pzxfti}_>{Ԙ&x(O&G8BӇ>o9|k4wŋ;am?t_:εG|$ @|1Q%pT++Znxv>Di:y9Ihf뿺ua~tjJ~I| k/U$+BEUL341 RWM77]DkE<_³1`ϞzlX2X3"d2vWd֕Z͟, 齏?|֫~84eg؍v8J] Rƅ\(,K%VOfz{}4O,Ģn4>i4zm pQȊ+c0R0eSZeIJQ(Q RHЍ&gh! ٌ k mb38JB$ay|e%s|h`.v-& {n}pa]T{?tLNdNZQeJ~e_Ѐ6L_i<]r1lޠ?NI%>_$?1˶ FcB.JiԂ2(bgymyWZ)E)hTU"&̈˸m.4R,; D:~W7:Nc%ׅnHy*"[Z^ yk/\v?N~L]޼*thZ ](=fՑOwouW>ѫo޼ \Qv~acfrc/n Iyer6 IDAT4ӃDЦg|41/Jۡ\]Zp<~?ֿ:/weVeXU?? VpxuweGOW/hCs(2?}G fTb `bDH%+_ۿwieMj.J%m9e3f`1_$sB!@*"/r W#JY|ގZLI"UVĈFx2(*{pbk-8&-l>wWu~jZV ޝ{;\R~sʶlǭx1*gx~s͗NZQUhP\RDp%goG݇œVWlS\2f4+(x\I]~a}sJsE9^^˪*MUq K|.m\YZq, ̻ݚ9BM<6{pmkTpԣQJ˪U lF,ͩ4TBױۭe`Rg?y+/k \( qrQg)fNm20\e^UFH΅ aAЦf} Ա[Erlig$K *r DXǓdwir+ύfCq4FuMk[Ţ* !!$8㹑<1Tg Jr8/O 8XПeɒeVU;'*wV aeNvfbCw0!hJNGǭ<\VI>4_c1b RzgYN fy.KL5dN,'$ͤ,Gpd@xQ[&QɽaƥULΔҲgVҐVKnݾO0I2~p|W^|ܟ 9%LIymhfWeiJD 9BbٔXJcR%6,,r^qDZ2UBqԥ\׿uXȹ4 Jr/l~T0.2^m6?}OҵE"Pe2ߑkpQ}E?x資H[[[˷._}r[^X|,tWX=} |녫^+w֍o}Om֯Oix*x& *s\$㵵 !ģOAbƍ| k:t5]ں'$v}/?ChkJqp<( .FŨ[%hfҚh50 lRjj1GPҼ9"CAd[Ԁ PFR9?l$e6"0R5A4gp/][Dt~ !BZ,Wo~w6WWf57ŵVx^yëuxE̟U*6U2fy TRcEM=Rb$[,fiSFRhi"TaL|^,9eًi'IQ;{gК!amt/]^,vM#\y).eFInX rMmR`#XjQȳDUNU8=zŽ/?|d Fݶr ̯޺FIF{5X}?"y 4 ;\|}IAhq*¥Eݯxڅ^~~|0`J+ %Gi ɋ]TyKl#'0q^A@Z:o^6g?{K UM(ǫK+F<+,bKc6ALR|e)|EaI 楕8w*cAo2ܻ1js9 [rZ\]}_8it_8?Nگ-  4?-eh4e7΋7nA͢/(>Z흝btq}Fk^d޴Y DIrㆵEiVeRiׯl_a)Х'wجBǢd3qi!)f0YEK[؁x⋩Jb{KXy GcU$. uM2Mr>͊Q篸kexVfYM78޻a]ph(Tkי[$KD#W w#yM,4Օ"Q]Pi Qep\bSUBD fki)8SLl(&3q]fbsjTQ"ʹ cx49cض,; j)s)Jb2c~6O(* aв%TTΥM!(Cύyqhx;/YTEEyuXЂrhŤYq,,e׉UVЂb5®z>1m7;n4WW=|0@h66t #9 3͝2$"D᜗CMGV %O<_n\#J^fU!ug)*zwFf엮죍w~J=:>QJE%%(K/f WGw/k 3էz} ~x3W>tcV}*~wq10{֣3OR+\x>ڝw=78 Mi=@:ykK㿕j0nRk$پ;An<)Q,^?st0zsnl-6gP}a/ɪ8)lw7C*Ry2d$LJHDRH@E"԰J4 % QiYtfY Ҩx֠I#)@F*t9')/XUI +84}aa0uJiR bL#ܾK 5DwWa.(e<9 w(0 הDJ!+CrZuj k?h.=WѨ{?ce*!y*% bi$JTe%`+-2'͋W~ UR/NZLݎas>3@tTJ2M"zpfqªiJ0: ʰԤyJ5$(prܹy'hPSM;60T*ƾe IhP *<0 ⟼zw|F>Y~/;t5W_ҏ*љ3r?8zjڿq/zO?;ꠊ޼ a{>|w`0m,zd5Rp$dبSӢH*E .dȤqϝi뛟{lAT޻qzy`=hb;Nu/ԃ*,, jx6U\a=h?K Z=FْzYksV[k'^K&5i{;›iQnzi)Yl>=z[2Xδȷ;?wV'EP 08.s^*hz`I0!xJ*>8ފEr4㨴10Dohs N*КD8*.$p}dE%V MSR[Ӽi鮔!gJʄ`CU i7t5Ǟ ݝaCUX (д<R@ѐ\ @$rOCA5jiRB9bJa|mܠ&w];)fi&DݨahPS`y&&[Щa/4M'44uzMI((%+Q8En"l@b%%zDqm`YUTg~S>~ޛY~_25&,1T",gcݱU!Mɰ@>LDJ8BH)ɊRͭuiT#(lXt>163LPHYaV+8$ ѸҪ⢜4K,>nK͕$.=E+"DEp D'XQ Ӥk䉫˞m޽}0?h?~R ]L-qJF<*EQ؆eo(^4{{?&ETٵ7$Hg4֬`9Qnٯ^չ$CB0,{([^wOtr~ڛX0Pt2o|˿[ӓQotf+8|/\r?H. I6<[`6b~70!0q:Xh:{^0י ;$ 8̞}v, ~];5+'/';}'h۪ ݞd:R1գ(P,KuƓDJb(/BIDRR1&ZgP1&2r!JĹ JiV. F:L0\BQYZ(|iy!QRYDaMfPo4ꮓ'#յNBs#M]CH"S$bTE$ c ;JiI{Lڦ&RUY$iNm0(U}t<-vtϱm6;Gb^h'DqX=s6oΜsj_{rx{vog?Vͫo'r?%ї_,yAVsU{Ia!t ըI<(aϘuo6hag& TLBIkuĊs QHwo}1>{x3 gGI8n# OJAY% @i ^45]`u}!El5$~8  )Bqjd/YqM3uN87\5 k^ye'gr "j^ؘ'/q:Kˍ$9yKY Aݾ{Ņ_~>;ގ'k_xd2׺@ݍk6~)$)Lf`Qp xgٜPWC"iUU&Z_o{}c04)$Y],Ħ ͺm1kjTHUUdZ>mL"^fQ7,◖X%(9>b%M݆2J4̶8nש}SG'M ݓEgf=ǭto5ܾQr` ]uF-wowT3C**+ӂ2s ) .1AˇG7 ^nuU cU'^ a:)eJL0.VJܤumlJLfil+eQpzGdIϵ (u#@Iah|@@\(Qy`f&Ŏ@!I 8XY62x0: q%lv'EUٗrZ򭆮0R**½ɉ1,-Ҝ~>RJAE΋j|ay)UIyo4̌c;PR!5% Ml˪*nYv^S pMAj渢Ӫ*ffV> ,/}{N{\UpXM%+o߽_Ȳ\6 LôG`^DYX ENh#bJJ@4 Egv㊂֬G f4Ɂh?X&<1@"ߴMgieʲsO?Ͼ8N͛gϟ_ظqdy{kP9nA?>Μ~azPa0M/=ukvPèyfv׶]tjfPQSםՙN'qQۈ}"WNΧz+}oLGwjoܟ&N@ \ի;>~/;fŷމNpM$Qiʒ;'sᐦ*xkd0^:{eYM4f+ɉT +!X*B` tt;fE^3(xx;oskoX`m2J9S iwT=0$BF~wn;X%x2&i)EkoGg2jϞҩJI) T@X{ؽ'}PU`ϏO]\$HO9oT!}zϒ^|{;w*o2~G\R!Μ4Me֙m2鍻w|{Xͥḟe,+pmkxܵV{AQ_twd[FEi&$vDH$ fE42Gpwrک뮳b;< I,\xAdq4NIPB"Z5*f#ZPukVd27 d*/,9.4`C(.u(ĹDBdlO7-bX1ٖgYVβA;8wB5OC "+fJ(? IDATGP2J)EbdZfEUURسPbPS4N#IĄʙf-p TDpAt]ieV,n5gg;П@;o8fض1zR12;ch:O5j2^X^4OoN&( hYF5φ'Gv WXfgW~;neh;L\X KEӪ`E *yWyD4 @061Y.b<:<^kTBIyN O8.e]Pb8oL"No|zi8FY><8ARS!:+XnS ,WyaC]GL׮ߨy3a [Y]87ni8%g.xn_6n̵vkư?^CÝ#Aa8. iF,vg%uͥF}7,(uO'E%^x/߿kn;IY۾+ L6޺p6 fps#rnuk+iY5_%Gl}_i{xf/t{i--!j?>^Z<<`h5{JIT}:ߘ}t翲tiFLɨ/9$I 4̲JVBZB`)A ,M8RM8+ Tb1Q*jvfv\Taiɘ&t) T#Ds.[ vٺ^UqhPxp\"]9xpfc]iڃ$yz'/=}ve- Ca=NCK6}-Řey!r4>y{_>Ofoʌ0Ic(&F˒GaXdFHfX!^ #kl+hZ^c?rmKpAoΝG;5mva5y#A, kq'[^?}9 J:XG?:+s_Z3h6v3!a%FU! P<( j `eϷϮ|zU20B#;@3!&KnjE+5 ]0 )v4M?~˥ t\hFeίn/.ΕV>Vk߳}aw5e=zkOs0t{?] ښYQ!+TW\"Ʌ 4,rE4ʳRdq}gmt&[-Wiī^g@7)JԴh;w6N%ۍL|ݴ,7$Ex!`c_Kk0../>%H`;U@O4[K+BD 8G&/\$ *\l4 8M*vm N0BS$,;$dD=MaRLΝY03?&4WB qfU1] X4hׁ"qYp.4E7|oZ캎µ - !r(# s3os UԛcCwu ݎ_p! mG!u0޿+Gըh7RcfVw֧:E?mWxfgLJSyҳko @ lY͏0<BΚ SWTgίO>g_IW@VQQCR)`)&L)UILAé4L!DB(-y OziRUy^Ӹ2ݖXb2X"tLǽOvwwܚ_~ݗ$[sw:W'ՙM̭ V\-2!g5 !*HPHNYh/<}K0q.sl b hy(LGwVw-,0,aTy3Hv5Od۬LDy+\|ʯR)RfD61}.yPTHaU ;IAz mmBoAhsYw>~FV%8+Ijj͓S  Z4s7<\:cV"ofJ#X& 4ڬ0^Ji!j 2۴eS5)*w u~a63!Gi Í-,+bII?,Ҵ5Fzv\=97S~څ۷n@TϞʢ0څϵĨ"EzȶcKGhͺuשF$X"7L2A[אk;ݓpT1ɥŀ*T@IhAݯg i,[Z̟i NvmpVε  PʮdO^ᆏ=2tt,GRf2-h[3 ӪC`69OXM`+HqY,C#Eۍcq >@7Fi+Wl"հq꥖uz;ɆBgڴWҪ*ڄtIzn'$k4ꮯ800XAm3QcpJAg{aQŎ93kXKݣ^ȜLVIM{4>- NeXI!#M\-tpi?[nM<7HI@H(*"+e^P-$\YcO"O6((0UJט^Mt0Ηg?|Z᝷?]/A <-7t˙$L3aVQ1%pp0?ڏ>m)RG!{gh-&LȊb(Ja&!a45RJJ0hږ$ә-W4 u40T+J! yt}hd֨YdkR$K:9jtާK^w}z}ߍ(#i湕^sīO\~jGe<2k`A{q2`<[YBOo߽/$VdbL$ۺ vnLx/u=wl ɴqc9_[_ CJQ0DB(^ Au_7Aò;v@"Ug[3kH&CE>s`^fZ3-Ǜq9DŽV^n4x0>j4fDpVAN04te:JCؾo~K^V<M%0ˊeAlLjLZ؂ \28;!V1L<ηaj֌K}]]1B hʡp뮉dDl|/K2wsF8N T)S#fА0sB:uP!D(P(% WӉlv2f2Ӡ\oOܛ[#ҌR֨wdTʘ;N^70h#9N8Mdx[WZUwV/#RݪjӚWqO"xCVkشdܣD  4XUH{̕ړ`uۆG72I^|D5\[=/n.$s3p4 m-1!XOFmNU~q9t 0>xJY*2x h0mOA1>^Ff(\MNBP7=ZQV9uZp{{kׇ>{Ń]jz^gٖS͖3bQwۗ|Gk_XyN ULp%:Zk~';>潜eZuh̀THn5#W̙,A'7W: 6zGФ:6H2ʰY)#ロx7YMiQNNqCUV2m!)gܚu_M _*']kww}k1d|t6n5k~kjSmª# (r^9ߩ7v˸FӪʡ:^Pddyœp~}R%U缒h4j`Ms`9c[X\,ʳ@1zњ1EqTr[ l :չc:&u(K/.oݎF1S_,/U<.@5PR @BdUUaal M4eѰpUj/ouZ, $$(? DiW76 ^eFa-fh \W*`J*‘d"r2w6Ҥ4K+O=;s XUĠ 89+PqYs]҅Ep^daN UH0L&UY,j*8lMD JBGPČP˱aD1&fY%C pՏ?lLVU8_|[{{ySiGФpG<.75X؟XԙޟAOݬ(rV0L ́*/?{> RypշC\DgvvFG;gL16ImyyE11<=\9sj+IRgAx}zkr8<f̅WuF҅_*yZPRUCMM ME D9ϰYdyvsܳ h AR"S,q1!_x"1/~#싙p8<̈("($(Dhlݍڗ3~/ |;|^7x7:;K:1@aXCUťD @j*M0R!ldB`D @B Xh$MlB&%L E!$`Җ̈́ʛaEc v6lrlB@E# +<1L,/K7V9둋Ř1 IDATͲmm2xr3 >}lqUk6#*$"C%}%wi_͗t!Ҝ~_x?} $[߹_8<8}C,OZ.vwͦ*@"Ü :K& lZl,f~`vo`ßBBUȯ~ȅ\*e\kӤڔRś ($2Mr{wf89>,`f Bit2+yzU7h^,őa-g-ҤYDWg7ech-r l;.:I S) 1"L%C& f%K`yl87/zUP2Mi40ld`diyAh$|ȫT.VzI^Nvv{nt{hýFR [{oO>_0Sy>En Q *e9Kkarщl|SA9$F21EgVą 0#^ vjs^U@ k''Y" \le<20fF%6f# ] j!6K҉T.7 :ɓ*] EA K]YS/U.kPT*C"7D9=[KVճs޺7=vl`rLW^\.V؁˵h4:+lLӬeL=alsj 2*t-Iŀ}PM?iV|).s*uMZRȗ&v ZR)fچ@J;= iI9ac/nmWIz&ܰ A8[~m/l\%ZJ 4zku_Y {ar<]f;O3Eacx A/l.zoO~iZXKH."\jL=7NV(On?}K{ߨ_>{.j8~땯l~VE{/^3/Ѫ{csQ;/*Z4}q6,h`nNCT%F>YLŲXY+ ƌ"40M!dB`*0I`j0H[H5lD~9sՒGnT_ičvsN?ˤj6jCҎa~r9oN?v,{?aܻo!]5|Row܆jWX` OkS3]>~7V⟍yێ 4 X4PU%*k>BNd%BOk57N@CZ1ؖm m5gaRQř8GuϴYF;+Ɖ|4xv>G;tok᮷@,g'A;juA˳:-:6Ac-~7—^pܠ,چmx0.3-Fjb(D`;G_ Y!Xɕ%ס.&\iPS^$բ2\sm# \4 xB~-Zs,$m4 WM/tM8GgTl!A ՛0>p|A+ W!㟼]MNow#x8/WI鴛po3Ɩi2 (VӹQ3XTV ;k #m\1$YKr;GZ8ivslWq2ETEmHVʃ^?쵃XqERigA ^ Oms9CDT,$[tp[* /<B21lꚅUCVu9=S4h0x6{()7'J/l?x7~6~՜1ok2Y(-mIRjYֽW׿p7nbkkYLٸ܎(x.K ,rc"YG9yrP|mW3:HGl0(Jm$n5dLfj0$ilb1;qK%(b eF.&KL.R{?ni~9^n0,us򔎯ۛP!ńEzݯ6R%\C&c]2y60oHBz1,O ^nlU1 b9/He"#hhG,1 < "xD|sw6F|r00%۝ZVeRЄ,K8蹛/޻w7)]Bl(I>3^RklRiF Š)MžSQV,VVzQiN,O>C3'O>wWM;b{F}12bhzn\A& P&tBC8|YTG_ ny\/GiQFs⚖)뻖$à cZy!b0=,Ub%b8omnKIQݫˋՎ[[]9'"Jbgْqd$K@D:iUBe9!Ĕi)+\B (B(vA\]2 8~'4d7lybRt,d"T#5%LwUvfݠvgMZ??a8`IvJo٩|?V@UF2MYߝG?=?ݵ[5]4~ݏq|hVQymg[O+LJ*lCѢY6u#ZkcX! J5BYIyU $)e&"@E 0 k$T!AȪ$aONļώ(-k6[ Hlƅ/U &,S-U=9=k4jme-\dr%!5:ϴ_KM9q)].Y%tɳgF{$:,[uNt+ w },}|8Oc,t#nh-I<TI_m={jwdIӚEZ.l[=W|b9Z7͒R!c(rU:W$EEᱼ\\2kak*Ʊi#-{ .  p{{k4R1mR >_mO?Yw*@EUD+khj t\"{k_??ad @; RJBpp!@0{`knt Fb`c"Ę Qw3 ,_s`=:OO ē_ow;mWYs?1ޝ5# HTpіge !T5"NW喚᳟㌖Enfٽ'=޻6XhŢ^3ӚE xa\T<▬mS`ĴƖX+D'qDk/9ߧJ)mfnwsu[p=y1\ݍu7 +h(W$-ʌKl,lI!]|/ eSvlI4/)`t,>(>NS0"NyIF&*]&jeeJ[Liv(dR;L-+alT6+kk4/Nj,l#0lCv2'q}z5 bUE2 ĸ~ɉ{e7n[7L{?әfU 6IhTVKّՕw;:9LjEq1GtY%FbB[3m =Z;S(/sPo<]6Gl) jowӃ "Rqo-m3$ Id~^us,oV2[kU'gvGAsQrK.jÕ^̼߰JFXEԍe2; _=4,ֿ ɐ4j __^/c0UTx'$EU* ((SURȲlqช*S :uOr4XQqBZc&%#bX6Z35氩ݦIoo t]SyM50Zq\bt?lD/+f5W{+9=\fɡ4BjstVN_>h2L!3&W_R&H|~? Wl۬ܭ~}b;I: A7 42 b2 CR)S!J*Ci)JbjhBVpBĐXBR0$#8 hlH) Hfc7K.cťabiZmp>¦yxyBl,\c"Ĉ@Lt]s!VBHK # a+s*@t%񃋋CZV|;[;F6v +Vzo<zY6%amݰٱͯ4M^YR=Jo |ѣ:G'b+\$I L,ҼJ*.U\bYK$'GJg}!^J!u# [abETGOĺy:֐ :,__VVeEAV WlŶm`g|Z@U,,aR09qWGz[Y{i'z"u۶:NͶw ҿsWm7"Q_7مi f~ 5Wڶ9į>_nMǹ_nl{Xp9pq2t8185۶P97/xOČ' żҐe%(*yWG֫֒|:Kgs0vA6u,ϱa`kehY;WZa+ ! h#X(Rj\A ]G]/]iLE 9VE:+wd:|zT IDATb:OzX++S)X!Ҷ6,kNUTn0c=2KCq6ɕ K!Q.aYrʔixB2(6lN.tZ%ONIN@X z,mb-z5:jDBj/Ev}o5X罶ˡ \Yb1vN#K:+DokmC/(^*U,',0Γ4#SxWk=xLΥ%TeU,aZNS!a1NGe͵͵Yvqu z/u QUUW ZЫ XsPB= kG_GAnvGɧ7^z㗿xpOvl>] iVǤi]{K_yg|Φf?\aU&ko~awolovo\˧'5b*Y`TT7[ N.pZ/NS? %z߶l!ën(?i)7h:2-jM/!@B ǪhTA T I s! !ZK1@A0"\(!@*!K B!AU2* f+l0JiQRhV*)94QZ~%V"&4JBs 005fV Ri ԲBe]u,f'Zk+oHM9M&y↣GWayᅞ$gEQӀ776{'Q A{-D(FٔEL,}G}r0gWeYeW lVd` EYky [_bǗā?ykv/;$ ӊiYϩ{ADg aj&ZhFK & ~я-40!/ol~7h; ˂i/D ,gTqSn_m'O_'~h~:&cf׶⤐J;UQ'݋b}5Lַnuۭ/DR>[N&,wC-孻k_~pmCs1aؚpZ$ ! J߼+ o~ݿy?’Yx%Z 8׭k+GgC_E'IRt4>:~헿;<mu;~PwM\_u֤hx'w>9읟]?7uST"Rŗ^G@O\^]Ez仮'mO36",$u8vëa@n_|>M)Q(ZPT[ |yC!,16GE|z|5Of _Bqz/_]ad䋑Ri<˄5 uRB]1CGH*3RclUPcP.0}?ҒH*b_e!dZA٬eQkyH,6 ,LvmcK;5ۯDUy(+9tͤLL%"b^6! +eoX+^Zөױ4 I E2\Fڵ OǧY4)GR,zc5^բxYJ!fҒIy E nv7,DQ?4),(:[}kk @dhVd_4k2G>zX*Uyq9TB)" Q=9jflOpD) D8/=~,O]NR̍\`ZsF볹ۦl5j^eREN+Fbxb|\ՔnbozW߽Gx-TUZXYiURr 2LKIch 9ٌEIE,U\z~J uVU džmqcjb.*!2OK12l7Lwx5D׽Pb{0ԣs]<^ÓWamǟ ĴpMyHZR7*d6O|O]߻9ev<k!a&vgCǩhGbiTn99>>-/ aEUaFjiİFIiYi2Bh\0-m;!@ fT J!5$ #dMEf8ͳbR `Нdˊ'j3"Bmiʩ暘 h4̋ DiphAE+2fPQ*6=ߥjm"{+Ir|Lٲۭ;{"Aل}^=xXr><9>^aׅS,j}zz2?{c5,3MT*v5j'ikqC̚cִjDd"&ZJ&m k=-ήڝu 2*ĖVT`jo[bE5jJRbqq~mSo4geUգ&&8IRq a@Ld; >MZp؁gS 'GdU-<]/_e g040,p"(ZahAebϷL LE2&kGeaf8n%fezhvBe(D c٘VQzuYAc@s>[HWz 2|^M$/²P ւbva`rt0bqq8u9*{"1JԨ]+>)u%VU(~o|7o^z`ke$[QLSdhU#lm݋EdV*9Q"K_b\^^Y°(KN\#ZQYq.czJ0琇3Udjɍ$pl@. 0u#8erԑZS"Y31 }WϯXXX ؔA)ĞL뺷eղu=_pQm]xɓ4m{1qkŲkd6]/ ! ɓFD0jxȺXm~x&eN-g:_B+m'@3\'NwQuD޼qiуO/9ѐyYZB$f+lEUk Nvwkh7_  2F ϓtJmǓz>If|ZNΊŬoیbTUɋ5:9YadFlXafq׳<]W8_9>Ŕ fHˋj1N?i|yxnCq@j M,CQ+^I@h!*/to{n<<S)b0 ܸ|Z7nۻ_˵!7cx :AgYj9[OODh:۝˔R@YR% p'Y` ۚχ'\c0g͆7A3t|<Vu +-$r v.h͢p- ZGGM7w2饽I*Ҝgn|1[b@AWi qxTI+MXkZQ[kR1A$+)K`-l:.܏qYM&|HagU ^0N4^7B/_<;jGe,4$E:#U|PQ!{nwݦ(U\aT@FՍNRfTA"/bY|/r#>9,VA8Βw68ϦӱVX5)KYTsvS+JSde-/^k'" Ąz6 !dUVVߜ[1Ok=Vdt Ϧo~MƛNNNx o^eR׶4hNjϞLc|Ñ^5GaU(|vԷ#w1]ռXS\ jV')Vt>I>HaG eWk~al4@7wvяO^LOY_ٗ/Sqv2>6ya'0lө֪o n\>^,rHM X NڙEC-@:5eIěNEUIQgiY2Iz^fBR|{ԱЦT5[r56D3).ay_Cv0Ȁ2KQ .X G'g\ʐIJVUy.z+sSCaZȴ.CH(rTZ]7T3bqf[Z 9wEbWZVZ"J+rcRBk*`PZJш RR#% A"BP@C@K El PIXC 1 u41C A cR @FP$Ul6-u{kYL ]+y8?NfT5]f~CڕU2_/;e^G^>g!#jmww(xڅދm{~9` joO~c,YHAV\eYPFMԄڈQ4ʱqUli#c d9L"d~i5,Tjs5XXaQ˪JaQU)r.u^l旁*{&;ZkXj;o&U dG`QS?$Ҩy @Lki-zv3\J IHlkzTP ;Ū p3bR,z r4]{e1?KfXQ \9%׽Nk*UHS@bT-+>JumjBP|r`@a|||:jhA5$ہtKŢ9-IYRTk \"s]<0) &#Da$/VIiM-!Jˢgٜxtk52|jgIČ7.mvw8tr5aZTbOG /~T/7/C23cX!4w{nﯖej;ǧv~Kˑ͂{O _J T2)E͹#eY59Z οk}\%ﯻ+Y,W~3YKu\Bu:n_Y`z,',Lk/z>MNo^}ve]n8ܼl6b -<]XSY+^?z(8I1QU|!̐VڞÐ!@ȴ\HQV<=/x=yu<$S2O8ePd6\h>%Oj LVYV(vۋ\d'/gɟ]޽yYBfÓTKRs0kt#3Ht7htFgk/Ǐ3Y/8^e@w-2InO`A Zl u۶/\l\ӌ|bQKۗx5>>A\k^# !wUeB+Mo%fD^dzl"Uвu0lF7w[^xaʕ_}|iҝkoȺ gsTt*@m ",)6#If@,!4W*OU UY ET-JK Ҭx4| l;TiDPt;݋RP Cr|+;05K"umY<^˙lE c&@K8cI͕KYɘi@c Lb0:t06/+Jk*5A4`q6@4Wc!B`d4i`R(!6BJ DہN< IDAT#B aDH#4JiAQ9F"d"W@2׶m*jfy^Y#x>|Y,%Ct!?^x;HK:pBm"U9P]`y Vv;U[$w7Tsɛon u[ͫjkqӪx?ZER`4bXTW\IՊԱ*!TZ t2k tQ O kH* \eY6FX# 1'ǧF(KZ[钠,ŵga$fwoOO1~e9i< c SG'M;IG~y9a>~lգ_ Fr•ktz!5֪Rm^8zAҘ/VxqIWI\d<}XrG\$~ˣFp *Ι FGd6lFӑhN|Q~sG 4:ڰ}sBP[z>;;9E#Lέx띵+7Z#&Koo65ԏ'( BU !Fª,w7, Vq܌~ڡ,%"l\i(y:ZSEW5LB2`8)G߅F/dH4'_[ӸjV3YK<ֳ̊Q/lCk>9ۍVypzmTJc@Yt!]ǿ͋{|u GO[- {lQEdjDR-mmA;ua3KY+RUZ0)B*s-|,42/VRe&E6!mYyC<%B0l{D-PZ ,6UUB r"tnfE^)0PTE!0-UR:;?/@*hh9Ev4V)lJbY)2 ڽRe*^`-ik*vҥ)*znC< xptE&d|(7E湍r&97se`Ug cYV*ƳU<,I|3aw-6&p<`H|8;NE=B1F2ߟ/GEU[ˆq ZiFıG'E9mx޼򝏿Ue6F]%?s `Ȏz<{6+30`$ysRUYiU0\c,PxaE~9Z%uдMڝW%2 a,\3]ӭ vVW'~;~X]nn?}|o3 h w󯿺_ݿv{m<_ .lH˔@I u7V/N /쭽߹o#z27DX7۽380_&F8xA@1b/ܠyu2zh`3 "fH<" lXԹAh7:ƃ'Fi0DUVA\,񤄖e6:\A磦3.]gٶUWuQrOb(]cqZ6]חFWJ QBuQU#)v;CMQFEC*ɸJ+!Pk0"#10:RJ!xc40Z V@(@aXHS6ZJ]JʶXp.8abkA@Q1 Fr!ZZ CRpizRee!A@l[Pn[k?{ZY9_޸F{~~|6w3ntŽk(j5ʺiu:nF;7n1bhhQW/;;O?~,3LjQsϿz` D*+%󺮴*I6Y. U-ōnYNiŹ DtUg(EaC^%bfMϺB (!ڶp+Y?[ZN2k[.9~v:Xƛk\^w3p,`x<괊lT>-gݓϥcJqװ⟜uם퍈a΋8۳y& 5zӷ߹X"%nϖQM> ̪\r4?Ô]{ZUQQ,"e\i $Z$>|慌1df~Ӷpɍ9.".vG) [o.蓏>y8"*@0"ܫ-G~ہ#5H @`6FH8NZEQלPJ)UJI! JJAUn~o,-M⒂oDx6h+=Zŀj596]{6]+e~vҍoy}l'j/Nj6wl e.Ds.+^Ӈ~dk1~-ˬit YZon 4k]"׵zwfJ hDq/K˲ք8NmF{óc:hVe"RZYI7\)P\UmkGA.BXkm*.Dl3(+,Hd0.t]u6 $'],d>Vq۽f62MVg'n^7:}>z6'Y{]V͛ޥK*>9<:L>yL'p͓/{ os~o6 7Ʈ{7o^Xﵑ#~pŝMׯ]Kdti~W&O'edG{/U]~sϷCԪZ^womJt/̗ ʵn)Kآwߺs0Ȧld>z3] 8͋|eStz7JE?ݝo>zqae/&,˧oJ2+ҥ=%t2{|y6ǧѧĊ*UN%|Ro@m\p!ejϹlEViz2D}wzwo( `7Nکs7_֣ݵK(-E DƈL^<{><Wàqzz1&`EHK uuګ8ΗU-U"I˲ BԽ^ˡXeFiY+l4WllE-RLW~q ͨ1-L9ͳWO=a4"ucE݋~NTs7o{kdj2mhM+moxltϧ6Bb-/ZkAM1dC˝}T:#jロnԩ21E2HؑǨGut|~ lA-l6*Inj6{ &#+ ϏNRU^ݹp<*pV΅B PUU|$A*MHZi?M]g$Pp^z B@PS//mb>-fS)Ek<_Ά1$v7/ol^a$RA(Mvκ1%jQWC6#D5_Msr6ڍfًg_|dwkӯ>QBȪRT Nlϣޥ+ذ<)$]Ji*2ƕ+^#; (04Ε~[&r5K,%Vue(q~w}Ys4CZ}of,V\4_9٧l{k]IM41nuoyVVeL]ΆYF'Ĥk)!6U׫Yv"sVpyȍbzlLW~{8.,h @٬+<:[27B{;-x,u{xXDhգֺ;e1E]Gz$Oi>9yg޾u|'o߹zG}/Fp{_|q_{FY,3d4<9[fNՏ>QDQOvU3җ.vV?]{=9N^\kVBٙdxysg?mjyIµ2 aomB_ÃNjdFKcGB(li$c"f۝&U:5唣(+: 1@2ilBWRd!bV@jۮǘJ DCDB&(AԷxYkM@~b'BJ%d,R2˒Eh}mgc2~b1[~sxEp8= 5Z˜ eQ0Dldk͆;,Nו@()PeSEQ3l5/$i[ҥKt2BGA8<؞0I կ?:0g.OF|k76:|6}~x]w3⋯'16?Ul.$7{WO|c1I |i󃗃n߇ -nݾa9q;ڎ2^jAmsuj6Ȟv+ \B9/rUV@m&[I6 >tJ7tکOIa3$Rj]$^YrVΔ I %1EJ" QYlv()ҢT@2 [q\ݤĦk]C0!hc!ږAr#ގLlg_}w>hxz>~45 $M)ڻ p˥Ql:;*Z9jluYYXƻ[[;okSGJqvf ?,N|}4ڻ|k>Kl5i)W'_%ӀLYZno7(s ţdr^. wLYWbZjYf^<*  jI)5, |'odz!” $ILxNXm4(b44ۍ4hn_."lDq" Jr1<Z>պ+϶@F%R,[ǯբ?eB%'~￴COG d >*0 a'LMibr'岘EkZL8l @x e]k1+JD1bN\e(T'㦷yeQ.yJ`,&@v"$P\ CRVM`v[vhE4Fc |C˳]m/F(pϷ/|볻~un>}ƅ7[n7t:Bwß?zxvJW雯ߺ$_OOyq;?\|G?~[OV*^ϟ{a#6CMNVdiEng j1_w^~W.K]:Ng lZ@J,e m˃5ynݴ!T*0oCE0b7Y#IRlQJ)HiZB9.5ZZSVVEMyCYj%@ci# AcQk10#TY˘MCh\t9)lJ, M`#pt)|R*yn Nӿ^ھNS:fQ%H^A\aԄ3^S pۮ-M9b"Ͼ|F{}p=l}oAi8B!.pju֊l^?x|zdQ!PC-%ͮkd,2e[g3[|\w=d*XhPtF60Uq]i.Xub ceRHiksohHeutr<[i g@6?'GlֻvbH9;5G/KP\ZGaͧ'u^I+Ͱ8l#RVN{Q#2_ܼfE͟ ?KkW^{|ɳ\ܸy26O>gk5:M J@]" ۇ6Ogк|y7T W_=Ί:a'2KVUdY_ggӯFa))oE\I. ,8&"ɕعz~jϿ&hbkhI| fY+luuÆC,^ףhDXTg q:,Z;8eYQ(v^Q&yHlBFvu- nhŔQ!,K4`]^CYž 8P*TcKIH6J ]RKɅuvHJFrm"k۶gmSBQ(CZhRJe]U0z?!x]=x6&\ $?Eιh4,} jlI+.kj*acHѣd6jR Gl8ttb<}߲p]?ET bA .K}dMmbB, 'g|Ra`$d6 ;e3(B]We15k(yN`R۶}+\+gr9ϋĂ*Dz m5" d wv N* or_TXJgeyaR !Јv1%3n`z8Y-߽敎*',ZE1n ZPx%,[" t9tEl1Q[0D^cQdjaV0{;K4m6޻^Ç퍍nu*,97b"!&`.sj`!U􅍞Dgz-K3q+9g\ف(FQ=X@\x` 0`C6 mh KSDj(%vcUwuW<9V^덾g]>pi4IY̳< 3PBRIR6&Mp}Γ%9̶̲$ɥ~5[ZKҐbPKM6mZs/FscQ\_sdsu4_+/ƨj]>11Ew>wΛipem{$i/IQȦrxС-ʢƾ=D6 3WGY<$ (F[_}~?9qߋ 6Q)x0=v6-f/`-hq64\oHv2gٰtOOǣT)LvkA4]y7eJ[ ah.Hfȩ=l9w?W(+,vVݗ_o 6/4}gP?=x4 o 7㓄Hw>zѤr0 F S a\]PlCy뻊 \5Hg'|vt\I{_>qBQ jac 6FݍZ,LAV!e6@P Le}Kv9]\ϒ64+2#UmA۪(,P67 ],3i0c,͒{GzwZ۲DfYi܃&JI-݉rRj6chP@@ZI H~+njQc)ZUaNЎN/nm^}KhL M-\fT{,qzcBIF":LUO@wg?Pa-0zmNiO_{3ZeE{;|Jц+U0ҸrT;-< S"-wwYH)# =HY碮@ R)a:6,nFHKZȋZdb\eINx)$Oe!9I:ANc`2 O|uݏ?};5G6:b CM/H8Bl@eˋ:IDl\ 򦅬DgÍv5#C;Liqtv:_=|]no<_kk[}:ɧ@'iljAedg*(n4)tJ"}m|AT((FpscFT&(l8^(Od*b,aH]|zNGi'k.Q e1s K' E "(͎4m$˩*:zk_Zn>ow\#%$"ϡe52.<`]`Pa|V+(,yNb`g['E^Y;Wx?@V[uyyˆ͖pUN:^'l*^Fi]~4\\eVO,Ueq9cnCYsM^ r⩕\lq:_ jEhhi]cL7'Ϊ^x-''A{u]PLƫ\S"H-D Љ*;[gߛG3,/pβ*BHū˜l+JX²,@fI1XEJ226ڙd Ǔ6ޕ2A_VX̷o]e[ CBAbP^J])L k<8EQXE,P{n3hDZMֺdqF]~fyAx |69%tl߸AgPyfg2 sQVeePbiq9۽:.&hFU;yrY,^^:ZeR:'g_گ6{{?< ;żPHj0^_)I {NɒX SˢYL6,ɓ"NI2g U*b`&Rh-BP! %@-؂P)XV 솏\m\BU,bdJ_+Iuk{j6`W@$do~#]&,E-磁lndǷTB. s J2BֲW?aoxKk%~OivCw7Q-UY7[*KB؎FB#h,эyaE/q^V"HTDF bl2YL:uBo^UQE#cw5];/e nF;F|OhMKCi/[;/^.Aim6a`c!<0&9 TVKLT{բ7ll:M&n8k$Nr[٢ Nj*; v_̓r^}aZtm6.WI^kGoQ7x?{^n!AQέm_m?>JM9O*9 P \yQקOXBBNkiogѻvOOƵ0\RZ]y.]}@VB(In-e]]*R"ǽ/fO._ۆhʫ/?_ 9vxuXOMs}`5qCʦ(a$٬b2++~HrIʜbϚ yH۷˼nk-EQ?E!BE4+-j%4 BH F;m6 ))9*+J0JFRHr$eQjQMZB!($ng{j8Mlf1!Z#wu1yFx QMK6:惠ٺ˭zQQGՏнzuvЂGφg9 [yV](Ji hf{x6uYdڵ+W}N>50Ɛy/cBba3 ʳqpq#bugm'DPvB46W֦ԩiv"-G>iIafLQo~mv>Q^$YEKY*5VՊM0D%cLJ\.9`@ߦa5k5,wskcaZIå)ʊRy^wPw 7w tݻWkh1 J]rztpxk`,UecC۠FcoM5<f]ˋJW%QҲhJq,׶\j$..Oc R hh%dK2]/ ZPhMjlRe[WkyQj1$ݖSç[/|la$I,kبN* "T@ٙ$:ry:KU9Fp絭uDu#̳camyYdϲn%|ߎ{<0>?ѽ'xܭNiƷv|R2V{:0 v 4e:ġܿ}NhiKiAH/ (F*7PA@IYQ7WLJA$j .[7^bE>@b"rW R@@#jRr%\B1qB G ijQy!~va|vq$YK7õͻ7_yB['j~ c"zty~t؏4!e(Yv$Vgkq|x80ܱOW$|gy?:8Uao~WU%x 0֞,+xIaװ*jnn( Re2%^KݼNUe ZPLb` $3y* IuxtE7NN}%lv ߸K}G۷tntTR Qo =/\:@WΓNVT梡\o~#'E:ZY;?;5NxqzQvU E`TslLf*#mLQr(H\P+H0DBx]U1I5`(: $h2C\΅1jl %i-0ZC! F"Ź%+e\%B-=β* "ݳX}Q IDATh^<[4"/V6ix^Mfgrr>3=o?~y'D]چXDl~r8 hs7>|1//sJFf$Yy8Lj%Hk<#(28Yq0{WBzí;wnG~[Z 𭆵]?ETb .yl3 _UkP3w~gߗfJHr*1DT<.B4oܹ,XrєJ2^%iEk_}LZi/d1KF˓믿n[ӃGfy2@@sKxhJfx y_]X-r2Қk1*Ӻy,].|,'k{+kG= ϱyeNNfIb4Y#JٴRcYT)eY!8L*8Ѷ4dokgOFk"1@@ ,Zn!B4x~1Kϋۿ74.tc4NNg֎O5{*PS&]6=fU1OkZnoPbK* Ba֖~K|Ͽq9JAfcHK|46b:OGy\c 6j.rǥO6Ogu܀VekF+8 5|arIv4`3xD-حՈT0,VjH qlhfVc7ņ;hEv۷nCle<&V6ϟ>]^JLeBYV[(5^&퇤۸]oWIP /cQV(8<쉰L⵪ :*Gs, n# G<7:^Y& ѨB~Xi/Ų(U6dfRvFEont8^Խqs/l]˜Ƕӄy$:ˍN{YmAf98+ pcpwkoM/?Wai㓺X0huZ9':0oӕCR,ӖGlcP@0$s$IsߥTrt7?σ+w>vOÛ{_;؝NaxW_|ɇ?}я0&`hhkAέq]I@oZE f޻8]yKBB *Q&UYwx%r(ZPaH-qzt^TK˲L0eU-4%glm7}Eg #rՉGQ & iyaP`Q+x@5>Uq!GQx0joaEPF3^ k;Kf@aJJc/ls/ī7&v{'Cb^~boxW'?potv"3?67OWnjKT*1CF)R9WIeP` c C!PZ#PD [-}EZ`϶-jYyVJcphu'B'bc(.s1e-҄P)%@+iVRbR̲\ߣ ˪J/@.(,=`0FTkU=_žuM 9v4I%7n\+_'}{ޗn|-x49Klk~7jv67ix8vv^qm۽Axw:^wm\b!p5ˆ[ ggXEBUp.=/,وB+)y<+16̢q{XO~ӽ~;7v7{/^7:L\brھ%T1OC[B@o/Bo U푱{}km}miatĥ,ϟBk,pW^1v2g'|Qxek1jpLGI:熧~>ӓ"E } ,r^S mU4C}.ueJxe^Y66 jW_b(J I憾Pm{{gֶ(ge Yw7n{-xXNok7:8>@D$'@۽.1JhkۭeIj y(qOϚXg5tH*FÉ\>LE-OO§~䴈^ %#ޠ ^Bx1gY_m5}65\V%RB$:X[a'Wx'j ceY E;v"Uve.# ڮ%/R?Um,57Y)*Q ~6xd5Yt{mȆL8m5>1񂠹 c[AE:xTVkMW<t5k$Vy>1z*H+͗41:JL-]u@ݻz8nBZGJ(hV滻W{<:{ra9H%5*9~r|0n^Zh>gQ) (2r܍_~QDY`vx@3;7vh\u[x'^A} 2vOiis8yb05eYIi8wQ`C +dLf"yY{E&۲uEڞBg~- GEOǽ !Emε͋h> \م"ﹾ{~?Z.o*jlwdz=+W$u)\<{䣇?u+莘)aN$w8G믽fQ'ht(aWo" *{DuZ\}slƠiZZk92mbQx4ĺ(U PHg"n ֝v{¯~뻹}OOD޾ Hr׎P+W`\ c^{ӊ4 U;v_Oַz kgl n^}Bɪ5Z4+вС`MJLsFZ Ҁ ÜhmhYLcUkXA\(~ ©2bhED Z~Y`7_vL&#,`kY{{W~,/ɓNjqR`|WӤ''dz!cfXf:[̼0bv MIH`xz?ynW_>wmmgOgǭ~߶m "`8T ~a8F tcN,+v_:y|~iCt??(@褅PTBׅ5{ͱ!ؘ!hKnd&*PdpƃNP(O(|pRjFYRHFnMCt6 = gOS~%v:]Jrnhk^Y>$-&nf3Fp>O(.gܿ7~\?:^,&aaSK*(WeV櫸ʒQW_89lXi gU^OZ[{|g5ؿ{*K/|oN"R,TCXZT}Ƴ:~o쭟[aHf{ܼxvsri*91EBVR:p<lÿ6H+zy`jShwizRhء7f6|Kn[;BؖRR9. xB=ϯR).N3.K29 11!tc}k{{>sqkse쇎wc(cG73JE5FY><}F* %( VQr#xȱ))\#<ĊK%B*c I>Q*].%2/6V=dL-GJRZdgH ߫8Z e}qOOWيQ޾ufÍ+{O9=rxut_?sw ix"NYyf!VEQJ)!uUe3JL]0^FS5Ͳ(CUKιw[w+7?:>=t=cas*ǣdbYjnt}wE 9l}hlyщXq2cu6Q lmoYtwO-sx2L'pW L'JRtr^蘺sx#ܼv"4F@fpq&#½^hN,4c|r:gn\2Y2@[vhTV5dSs׿ow>9?y: ˮmܼ8.{|릹b^dBPwV,=∷^mor>OJZFS7Y#,*wec5Ey8QYeuKo ҟjʛ[W_ebzyҎiK!%q-GO!,g{)d6GH>(^ZOL[zJv=S,4Os/m\L:=ر`P:ެ,E^d+k!c:~(ymvkOܲ##lJ",j,˲ʢZERE %|d_z>A56|<@z-+DY\SM v4!dYfeaANUea+E:=!0 mӚM/~LIrb6MH/iSc5qRX#R6 4mn,bp &&ЄP\ a7qkeS +B?xk{f g7\luצ]ʘaۿweOb<9 R_۹퇓4f% O5MWu}a  #f\YB n~S@jLyA5h 2 *?=?OZWVֹiXC4|'Xsœ\f$vnų~ K;7n^{)0I2>4U-&7:{TO>el*b/F߾)F:^ףU {?Xtou] YE}\";j' ,VC,;:zr畷~88/&_<8:~pAdxA֠ *zY-406g*x:ItC#״LeYe_"HOT)iK{2HсcZ'8qg^E"ز2*yᐥꅫWhx4HQ ?xfb҇{aq7{JdBt^wf&e*=+4MjҡWٳ#Aq] R@J0 AeA]l' r.A;[f 's[J ^޾f[.aT bJ>*Ne~69پ|Ƿ=&z/5K!1d % -ljGo_i{s>5'e>6J2W6oHi\{uzrkWjp|F5to^$ 5ɬ$"aU׺4ڠ)ȲJXY:g^d[Oy~ IDATO8xO\C0jzAg}eeC8AVSZCtrK93 ,OQ7zPCLL Kh* ʚ*NY5ͳ=K3Cc5UP '#*xjMl{^˦dB8%%<= IeZ.OgayZVB4JTi&$R88/uT<m;2lYz tݱ8H%@il-x|o8ujyqҸ,LM5th6~cӧ߽᏾?|o=>}ׂ^'=/J_v:\<;>K1DEr^7Y-a xOj+Fg^wAwDH|kQicnLq)nZW+'bqS\!a*>_9?B}=m>y4fHd1I!5Ek,fw&V0IYJb (Rbfg<>|։nV$!:F.bWU20TQ">OËn;h矮m@iD{Y07\BlYs$֥BH*Vr4ui@`AșB؟<]w>'ONByp(1$x2xuzǓӓ)54IǽD^n7ƉӚG>4N'o߳8k$lP<a?zk/ٔ 8-)MknH_f6MgZQ@J)m sLIS՞sN:[D,=oMUf.AfjsƲRՍlh,=.\68>^dd:?!0 +d040Y ϗyD0~8ce+\7l1ƶ $wlo8Pض`U[XB.VΕ,y#mOt#jvv77.z?Wn I!䪹||pF MSwfTW;9|x󦑥@xbVĞ!X$|m7gYЊ,z&LCĐ01BiѪ7B{9o"qO>%oѵ;+tTU#olu?rcGӢ[h?9> jg][uVT˺m޺u-&*[ں4L7e/rk燯'NxQUn?`%k8wAI ӎ P*ja*% 1np p{3L/EE}4NOGW_Ð!X=|ɺ]o ?[hh>4"0O'0( 4ҺRZrwyp~544^xo55q{;:2bE SC_WedQ]UO?ՕK׵{w/W۹n{7VBPJҲd jM0@ hv˳haXf\V6v8T,.:F9aDvj?,Օ('DjAR`{]Rڭ`Ja(ŒұܢeVt(0&YEGA[ʔ@-FqrZ@7ÇGp[RaA\r4X#Ԥ11ur&Z(rl< W?|42ԛ/ĕwUPɉR) 8 eSGg#d֍+4[ge2+a_46vlDzLpy0 J$3ˬ]i]'@D7פ* Wף,-_wmJxg>wZ&1Q׌Kb2\WBbā,` SH `YPؖ-urQaL]4k]ڝpܬ.BXx<yOiL帎SVYZdPqq1m}um+NF2֑f"]Cko|i,8êLLt]׷l4]}_JiY6(MSVUH)^sN亮I)`nUiA]O㹮ˎig +D|g WQDR!(0U{M^懟R^>`kf<]L$bd<[4rgiLY9@t6exq k+vVƈK`kEzgw:wg4CA~z4 F|O?kx~r6/<|\ֺ[!8/O﮸?Xƻa.HqhZqM.V^/K6<~!&ۿn{/?x:ѐe ".gl~K@;ۓ|kдL %#ӓ 3M(jt 4(n6I5nnlhv<^tֵAoi`e:35g*ϡ&iUF7K8nRp^<ɴb 拥C_vε{/TIÓ'5Ȃy (('^+]8ekK7,_|Q/vtq1iJ&6|h~iJ۴]VakOs<>{t#6uyp%x6 Z`Rq5> j&W\mR:8:veJ0O @B2nJ78~Ba@`ݽܧB.j:p}b;ض-'*(J`],"Zݳ"ܰiI[.DUĂom]j㣓l.egqv<o&:5eYМ00|&8A9?=ZVqTX1&ki@-+ԜSU\701DH'Hס m;ԀӨ[>5\d/]8mGQ|;fgeq;88:<)jU%Z(K$W9Vsi^\yukskղxŧ5 Jw]Ӻ iZpz:Hu=BpZ_]/~ME&W/_{/BO&ÃF"@-+ z7wz&"TfB4]!^XVR2^̟Psu{Q׵8_PkJ .ɴq|j :uՂXиd+PP47Q+ӰN lLܺԩ8IgY*YBњV5@GQp>˲ԴL, l2=Vq'E&Zd1`8E! yQ4"2R- C~4 .5JYyBD Y9?<!C!R0.5kɋItE7\wt:WVg.c>.Fڋo;?\Fj!(Ћy5'iۀ&c%yN4HY&d5pj~Uk $$ud:kgw>hxF .Ӻ2g|zuUvR%tp4I_&dqh9!`OsZFpc;tFLZI9kPSҋzۃY-(b^F (Ȱ$2R&FhF*iTRc4-`=ۍtnG^y7i*VC.uL)4-,:3MK٬;X[|4c7ѝO?l+k">4 R!/޺K"];M;۝S{EVcKӘ/"5JZk?\[/ٽIh矼r}{|p(rvt2sE4+NN6Lstl]xK׶1F>]_[ P;K2߰P:nmu,MhhУk VVzءm.L)bAzx.+v/yƶoG -hZ `!]uY*tWn|A59;:Y&I4b0jW6fxe*a"F9wkW(؁(jI!%D'3YGJ15:++>9_Zou;vURrFmTHũ6 \ k:qR)lX]E4AU#Mv@óôHb'uc2ڶÕ*, C ʙ@Rbi J4t<tgRPZ! ]q}[-y|ѧtpt6,?y1xp?o/>e 1.B clYҰ9UYpeZP[akˊf8n򴿲~>\4jXuiw]"M&j훻vz6zZ㪮sЈo)jZ]2B˰!~kh<%9a֌jzY1~t>~y+hix+Ӌ$_;kQJaI4$ȋ(B*ñ6VK't<1Җ`Nek>]Tu6y)-}2ZK;+\/;~^0,DRۏ+~0E^5hu~\)^v_k>|]Ѡ>~mu5 [5[L'cii[EJ@ 9;:tn`{eJDyZuKx{sek~Se㇎يFdQ5֛RJA)jZuY9⵨۝N30u9AE%W |~A鶭bAQ8܀|s_EQpRy<=9(\iJ u5b~,8'bXXFL.޼y5\8e{|wiIݫ<;_<=z_BG͍9?\ZlOI.EBoN.nd^ PwI#Օ|t麘N-w%rqk \(9'z"NYOO̗F?8y~l2^ ,pBy-zQK1UIE<y;dQ D2 ZjT4@Gc&0*! KZ=yYv77\ ե&thXeF&.&F%Tz1S>:s*6w_ʧO/,+)@<3&5ݰdbl>8egaBҒƧx'@(5Ǟcrݳ–#@J*YfHni`T16]K)TBRqRyڱumW`4S|VW֮] _r<=|8Mh<ı<۷lHCՏXձN0INb0Z\?h,2cв]ۺ٧>EA~?`6&x~Yqoko~ߌ&Gˤ|"@i%9b6nofbU1̠շf{Icb<7L A̋,*˪86{~׶l曯~ޏKcѳʥ2WTFÁKjZ`0x-jdr/wiv{>*I2ߔ7,q, IY wzO>(MyݫKrAKJbZ?wW«f,?g>I6p :/{7*[AVd5+>o g\p}v:OV"?$Ο?fuYtF'@W7xo.Z GgI?8>Uz=ZLJsLi #!QR6<|x1?.ij=l$VΪStmPK7o,FeKBBmJRWeN+r:֠=ʹlˮ5]}'ѸnbA؎&YVK9v7A+3/Ea,4@^0a ^ Y15 hT|:g֩x]e~$~ٽڮ Y,Z[AyO=:|m`v(TJp@ =O|x>'4?.ai`Ҧ *iUVBV{|2~7^yk[?bOIcP ,`jgQYBӴ ~Xszx9 x"5kuǸ1 uEl9ہZI)H$˲B+wh!0H#~U!D麮B@OaVذF j!0a r:hlPI!-%9o1k[=%`0Xx YlKڎ"闀U]DmN]j8Ʀc,+$ PURFRJlZi0{6@YwI|[td3(9J]JV uJ"5\$^X(o9 WDQ(!]l |@\}nVvO![X.g~ſMO9cZ&qu56m+T^~+ʺ; t7o_{/BX \.q`x\(+ΦMP[(ru5My6ge>ZVg[ ^cEia]YKj[8Riu݂|TDk DцbƂ e]4|h2 {iJ1nT\ .RJ4 FcT|K4(m]RXpGq4ql$cMUWkD6Y__TZJh0-[Ctp%T1M0A8RDN"Bzx`o{[{ݸlh8&`R0[x>wnQ8?{vqʍ =?4l)NLG[[ۚa)ViCq2HYM?[ 4 M4tX,Ҧã7kg~#dVZI$Enr08HlAqG&[cMI6s3>s=5מsAG@n jjתuup8<DalscT_Bo7aWi aaq&tYCDo%~G^  0uw}p|2oȫ#Xak ."`w؟l>zb$C@DD sp8+6–[9jVz!ue})42l0~еhG:Zeq<ݜ,/|{Bm.f2dd00G"1T [Y@J-J+g<b%aiu%ƪ{|'?*}e]'7O_=˳ H-)9qdPJδj4M~?XUO'F$Xz~}ן5/^t}dC}]~j}8;lUI $*ɁV٧jƒts8Q \[gK̃_oEtJٖ2VKj4h[[(j5 %`P ČJ_5 ]8l!@t09"O9t7"wsnI$#%."TFzNvcQm1mٔqhs9^BHW`LiONZմ%S.FvXM$Ƣ՜(ՠz&ߟGg~ӬiˢP"d\a:nkϏV⠿7@ʄɛ~Dϟ]UG^IN'yr~s x< SiV 68B۶֢yul7M'~Z4kI/^=ޔ`  RWU"[b$U(IW]-]͓y7fIɥiIT+0 i:4RP77 U[Uyf6{ζB˧?w'gL4=[o,ZӗW{-0aH[_㗳U4YVhIjd͑5F 0A7-v4V#ܔl#hf\%("8p47}չ-Z-TIaĈR]Lɠj5 Y"fYN8?fy+b>ϚWE7;/4? {~_lαZh0 픅;Y D.ϥ%K~ƴ87&|iTBD$nLH EC`kYlJ?0(~5mSI! ?#-AK({yv̗[fRXQk]U=٫(ݹsyioty@OR)$c ]+mږP{ָ @ňF(**Euj]5@0/ߗPW֎bQmX:vE C?si8p^UZ% >"b<㺪:,l #BVJ~m t׺izkOAٮZ&,m-qjMfU˫d4O1 %0ڶyQܒm.,PÍO[۵Ox_󳏉~ѳ\j<*If޴nn5lkޖ 6 Xup.y??BtC$Ebt0ߺyg<<"Ћc!km|x!z q;)(zi E9L'`isAųg#B(cRWjxM6ksL#Dw @vb|^/aẩk* MhXEHъ ]n6Z;g8c d;&cԊ`G0ý"j, :і bm5 'WGM]4u1?boݹ~ܼ~ƭ\q-f>|ýUvVe֣ȃ9|wr ""(&1'ՙ1cxۑ.Z0oݾwO?,X)']i&DK04@-tֽýj zEm4OV/,p|i?  j}b|eKiӋnt?k7Pvz ٽt?'&o˗KMZg-6dFu)y ":H],WuvJk7oȋ^%Kr>z!rdJ#WJ -[Eyyu%uެ5kdČfY/EaʒPCCs1#`?8ɫO3+7x9QIRC}7<\-Ɲ_889y\3lOSAko<ӏ̱.fa>x[VȺ|^TF'Aozl?o.W7ڮj[!aG(Р7w. $Cq(z0SVV7V!ٴi/j_%8gʴBBb\oYSJGmuTBȶh-Ss,Ri`_Nlt-~"hchmR@v;@ |DhYLҢ.Fb$vh'kmCn<NZfsFUU{T*N3bqy9KMr"G IDATP+uv~0s :/H rKc(N(j-Du EDtӭ6B dgzw`شm1@7 `d ~8X拢ihI"+Zܨ?߹k_yyK eG%VB &0@3|#\@rz立yyyq?9YeIr}lQbhR&;j˯gU rh,h #x}p# &4Wkۦj&$A#$00T\c ) dv5ju-mebZeri u.f2-^7ZҖ;pt,YͶP[)52BitC+ @s k85aMY@:[hQ7ȺZЧsYɦNzY^o4 GTQfFzwb{iuZJ˳6,{q*B1np\Dԣ"0mU0p//8Nir6k狅uVF)휵Bsj֪ !tnƘsNh[Yhϱ}mVC^ ~k] W?}l?i|)M kӧ/}Naj _..ü ;eѸ]08յUbdn25U.7J`LE6#L8 YG^/<ػzq슲i2F6 0σIzmZ$׆4~Ϗ~~턵MԛJNQ]\5@hcJ{7nݙ&> vnj%nS"R宿%~w=^\<>~K+N˶y^Yȇ g扰FH!Oװq! X̩'託W0 ts9 Ri7b%MӀ^=eNqDN`?/|6[UtE]^l=.$ei2`alʢGlN=~rZxHWs{j<_N \.ƚr(M~Ԓ0 U޴j@ʊ"˵1`$#2bd}:u&N9gvy=_#S)kɍ魍_G^Vh'z޼qwѪOJAw}_:ECz&dm IudPT0!W”yg4L(ҹoc̄j8´*^/٢%!>hlRáլ)"`2ʰifInAFV4Iboqzϟ 9Rul8y.# _ < \ H&NШjPV91'~մaL4JP^]mV;P9Fls&ϛ!&1 !D *O"䶸N# $N>{XJI)}cZ+s!tI]rʼz)Da dxu€[? F(y^uuRcBsZi1BBhӔ$R]۪]]I7=8;_>wYM( tr+MHYg~>t{{?韮//w_㱨PU^6H'5N[ƽ3;7NN?40D_,W W*+B֮)k;- heW[Щ ihg}yLU^/nka/ AR"k[E^:8?UZ0›Fi}6HQ(PNݶ8g`4HYt R4ܼy~>B?EAU<~"RD^/r ]kA2GZx9֌ssBD:C^EVN}hO_OѐSJdp?6F^oyo4?:~*;1b| 6D<Sh=gx1_N|6f?ώ;uw0Bٳǯ_ܺ3r{욺Yb*UQz " ѩ\"qVjGecղ12\ .kEEGcD^pp3Mljrh[wlZ-$&^j }0s2s@0 bXX˱|ogwn{ǟ?^kȹETJ -NѮǂ:z{yebr?U֪+xk"]RAf1`3a 1 eQa>|z{ry_֯M?'8};bOي#ţ[7Lebxh8;{l歊yUw~1'e Y ;1 cwX^h QYQw.Vyk! P`-񸪫 |KԵSώ.9]i ƞGndƄR+e=d[ "dpWۍ5sy]n RmYDI pÄh!(ek-[ʽf[u"LFvM@@" <ࠔ笆 1Bc0B B0$ gχi79<7u[q?YgYGr=G4LڲvYiVKBF/O6hdٌE탏 ݸ5j{>^0_hwghbsn޵]WWڷM7V +: ̫㮓IGUk VkGď-Dq8<ϲˋj~y-t`oLj6#og+2pgl5SBI;QQ5BB Q2FX$RŐ燾xUUi0e.Mx>% 2蓀q 1m0&@?Wn =GSQj9U:[U ϮΣ0 tk {l^dKvHb4{;wN_>Y4y'Wr5lVyQ| x͚UEqp(ڎ01Cz1&~4;e8Ϟ|M;i^;?H1襳U&6y]%oWً7nݻޞe3RupBG=?L=B3ZBg)^6_u`gzoRP޸KͷF!6"פ&RwFFl.>ƶqΩfyp럜0-BUS '3:C0Wgh8 hmAķE]z`4p@UkŢ@"l;YCJApthk]6A a4윕Vi5th@QKjm pFm^<շ>zViġZ59BՉSrY5pLbmnT8?0Z)^E$pb+?G}7l—8or:sx_K1H}gG&vFaViMv(tU^LR0 Gd\q4l%tH1?leňغz7a|U* "0\<C/(!900R6E{AFAZZ02! ˜صR?JaNk !L A9';B3VFa$Y2B!8yH)Ħ[ "TZp8gu#T7]'e0I'ҖqP (ƭy-Z@kG<ȑ?ѳ'BQ/ܗgWWeØzjȣ^$DI=.92MàGwv~QB_Ƨǧ秋{c|O7&SIi`pt#nO&;qr|9/gfYI7$'w'on;չ.AkoZi>dZm#uu߯|vyzU !d"Da]~?MkWҞز"a0TQ2XdFIPuJM=3F+M MӄsO h۶!: qC_k!6?k=W>=}}Vl?|3ex?۬^)a:L iz=2STYe={ҳ.%}kw&|ϟ=F@+]U%ex֮F|uv|HELáO:_āϲh:a0 hqu~E6tF>߼x1g;@Fc/ q]ȮJ(}Q\۲9!ZK)1BiKj2C9U84tPD q@rUPhB n7 Vz;7EV>~~.x}P?7t7}NQMΎE*"3}?Lc{(< f}^i K(o Ƹ^/MgΆӘ^ۊQF۪=ػn-gh :Q:%Dm+qPನ6OЦ)pŶ9V͐^^70U pRmtvjkیMnl)ZڋF$DrƗwE,ٓҺJɳl^B% {wif= H[+mc2?:i.+yOXUv|~Utn-AAMGTk)Zfa n^B󼨻Ps[\^ժ6D󘑿S!Ei9!Vb:0O>d4m&@KE1++e,`ȰV0~7ohĘȀWaaG0@]kR iީa'>}+E&zpގ"܍W 4!,@BL&]T1T TjO(L'1 FQ܉:֚qXɇ6_;{__h,&l8ޟ4xcE#evxgᅂBW__xO߸eGG > P IDAT6E5/j)gr^ֵ╍b1J-6AfHfϞ}:5  4 u&B01 8):$vuh<#b CLR("@$cۻ PPʜeYbQ;ti5+^0iR*a!QZMDYfT/ƺ#K$-uV%=i&Èx79Ww9 vGelt |<8@vx@! :/l]iڠ^<_gnezXչ Q; > !z '?ҕxue3kvw{E魛7F|яygz0&1cd]lֵp bv|HQS)g9AcRJkcSL5, 4вephfU7p3^ѣGz_uh_巏+9,*x,&$4MRu:Wk[Zp-.>r@ 9!t4eu…8UCiLDƩ͹jϟۉ񸮍MSYN3ѵ(䁅4I "*j{Iy9O;a3\Kc M.NYd"#Ui:(3mœq( 82{l> À`%kJPyQ \jT/؄vem= ̣xᩳt,xgw૟8{mwLU矙؅d~o߻&2ᤷK_*5N/yeEq9( Rުk. cN7- %raLQ;CvwGWoFw:QR! 1ҨqCҨ0퍪r-Չ%!D!t %& @0+L!PBu$] FWֻ7|-ij=`xKxb7RxUsqŤΆ (u0%k׮`1{Ȣ4+%i" uIX>vstEQa8/64%,&3lv694B 9qӦQ}/xU >tJ)=yN/*~;TzXbϝ;O}}/BOO~g~|o w}_L_=#O>{{wygGݮo}ɓ'Xk?f3J(ŋ~??HӔ׽|!U{B!~~k_{̙ׯ39uS\'@q2ޣ*;!RG[NZZe7R+ iMh@B S;gY0~ԉo|sNCx|%ZV, !cG;7)Q!ym6:5p [QOXzV@L<fb^9;Z]YR+v"w^lZ=0%~GȻ MEhl:c!vfk3V1NUUL;"+gbiS'#̌qJ5$Iꝧ9qRPڢVyZgq sq'׮]Y[]x7ɍsyɓ/ϚqVQVF(k=y,0 !x8,,/QAm-+Yz }yR1&Ih ) sJzc Hئl\+=,_pm)>3-agL0z>?EnZIS\xTA_t}>冣~1]ov'Jv3G7e=4/]3"1]F#;1$V,YmNl'tfC ہRn؝%pMR!ƅhVϊ|>*c!Bƺ1 Vbİ5G˃f,<$PO~<+٘fs7o[ g@1彽IU'tuSYc&i1I`rnAZc0hAwm^%Bd0o0M-v/A&Jl+8-y9-q!4/Mݠ ᕵJ Wu- LZk{igaiF`P6: CsbˆgQIRy5FTEZ!DV9-U. (#´VuMq-rYi`v8*z^̮^> EZwq/_soІzA^ۀ )_|ྫ-N1O|0LÝIrVfZ;1 hQMsOތEq&q [ :] n/[^4lF=.ꢸ(.U(Ɯ<8L*K4yt\jV%Qjj%48Ya/̢ EqiXyOJټ^? 2fƁ|ǺBJw Cf%*àloÞ~6m,"yf|.K@ Zm,Eҕ(r\6r.Y@igCDIuSCH;N ufaŬ)B 0 gyo׿iZŏ?~>O-o>6 OӿKtܹ^x̙3'~Qx;>7;(BXš4Z{W^]__G?$Pŏ؏-//{;?뭷;wnmmЍ~{{…_^^B|ظy䑟ɟ?Ebxի^u|{{X[[(~~nyyGݣgN>_קt3}h.pCn_Ѓݿ}liZZ>NchDc2#R.0vTp#ABrjpm i>Ecc+W,&`J :'UvD6@+a5F|82kiR">eE3O@8$*C&\qQL,󃍵ߩƕEw>XwwgrliƖR1ldnEI`fsk$M!-, Cbc C T^ΔI"qBjdU khXo +:'tIAjHhF;UfhRQ$0 X1ДwÆᬧY{eh\o.ܚȧa5ʦ 7:*J)uwr,`0DLVg<3al*Y(,ƞcuAh aL8_ZKTӐth$Qs!v{b?ߦV`wgV\^˺TG(CϞ; ! 919M0؛E<28DK/;kvvkd\O¿\ Yjj%d1:KlJ]BX{l|HÐjkXOYID8MQpWAxYVZ  S"NXjWw&8fN~E{dgqy?g_:o9Q6kG9UjQw:#sg(8.HN ]Κ&MÄkwF39I,q5 $ S0k.urxEVkܵE֊ [iks;0la `vGAKX_>446{EJex Ƕa[_]\>*,.UB}ܵ[ʅR B8CAM] ڡ0reUfY<$`ϳ(^I+ɋSMfKJkDZh; XYc_;~ǗlyA\ Q ?+X䢄.e!DYZ 3މ (*f!EM=f*_239umR'O(m%:7{,5՜KENPRKJkwd0)V(RI6Z^˹wzfCh͍r)Bm wj\I-Gakd biseblwP9A, ʖ=i!e(ip `1V󽃋Big[u 4GEeTas!dYa[ +@WU裏… wqR|]wo!ĥK7Z'OfY/~k_{sZw<pwX{(~Ao?77}kxdCt{{z!)忞>Vu}?S~=?(:sL|X9sf}}}0|Ȳ9X,~aٟ?}?|w^⻾Aި߭t2j;lM++ټn~B):Y͝DE2g1H:`YYYBXI>|_p AjY#";n60aAs:e}DR{ RuSn?5}1chVke@wD0TVV+$Pt5i AuR.M#+=UDIH;-gA܊jQ@':Itl}ɛc !sVy\-k=@11;C( Q=!iZu]cB R N:y>Me)saB* ,]TUU(ZS\Y3y )mTQQkx@zbʜ\y S$Сi`Fk FxyA b6jF{Mx2mGIdTJv7ea}Ø,8)(nM,: $nմUWYXY,V| ܫ<ﴻ8iǘ*0B+x*`tD70d͵aK>N{+ù#l jG@OŢpnDӤ"v/^:8RE,֍ٞZ οpK˷wżȧ 1Z$,8n7N]zmLc#4J)eF8Ȇ7D+  $Z- SZoɊ@ ENI_C(hWs;~l>ee0UZ r"J9i8^,R֐ ZϑϒRP{fÀA/ꪔkh4uKB4!AyF'BDY)뵣 1I9- gYڊ8 B0. f RkCcǎ Ru3=@FC,M%40h8,ycN2tu)5 h%„ 0Ke*羵#7cp~GgM6'_Wc4(gn}- ہcX.oIﶖIu>io-GV3po}cQ]7Q`vz mc1cP a zb޴r"k= l>7&!:;1A2Jx\lvMbbϫVga3>W6Q-L)Yn7Vn^t~8;:p3y[5s`8Z8<}eV]_YDC[wͥkNjkwCB˙7FxV+,+JpQz_$IH޼q2Y1.T(Q!"0 M%z:x. 'P ,F]… t:9s0iwppO|͇$Iw??|ӟt'NpBesaH@xާ{;λgy擟vwwwO81L0nll=W/}̙3zb?oy[1_b.]ں|ຮϟ?4Mt:Ν{'!>O=CRaLJM!pn@I$"?Mpzm}7}ӧw_gg1bofz@W;7wg>׾mA"SjkkabVYŽy f!aZcBxܳՈU IDATRJb@I尨 i$qx*#Q.8 B)( ZZ w@k(j<7Ժ&!S%,* b ̫ĸ(KwAak !{co`s3(gl!JqbBg@ 4{%ZQZXBh`x5s#尤!! $Roզ I4& 5jqZ9r5><98x٧v}7dqL[^.fSӝ cWDC&fKH)ĔbW2BYkF/e48tƍo9w?^zpww{Qͯn]K8FVAkNJ"jidXx%LWrwe:ܾvEб 1q &QYSNq|ZL^yR"^uB FA #B*̃089-#A1Q@ !+g4nea:98\~ů`bydi{~B NBĠ7,RU͓$R֖4Hꠍ5otpPJ<{[Zjܮw(O[_L'y*jerlt9J9K8,E5SMXit ! c,̲Nd6S%`<.-qrBF;aZe||wzի?ώ4M?OBN<7 c/*J뿖Rz<(Bq(///gY[[o[6V+_ʵk״?0Mozӟ>cǏ?qBGQJoWHӔRz[[[__ _?)ooB;v',xc??|ԩS!tw_2?Ј[_v8a48~,̲cg V~txō? {]X9[4pyl5 ;BaY댅B bY pH 8@ VLRhvf]$+w9(7~$&.J Q3 %rRDYjT0PJsD)Bx}ڍ뛷8O]=̹Qx=T,Ry2!0 {D`p6\}lT:8-.^r3训 x`/$aʵo|+tCcQ|dc2Z"R2Ei!sX3"($!mrcXȈ @xਕ3m:Jy CTc'l uӰgGW5bd.Eid]Rߺ (qtmmi7fqX Xg|J 9lB`Q,x!Tms0=v;7qLBl98¥F{o= ~ &s%dUԋG,!k,0u˄:岉LFhsDz'f5*:SB0Y^uuyMi̴D,JWbmy-̒T5 ( q`A@{ MBYeI0H)sƐC1gA`僫ism~V+KV00ɕB$40Ifڱ7^ܼ-pB^4d=[=ޟ]:zOZB<칺tێwbʼn%=`wF9wvᩯd5;>6릖E_tS- ^AUU빨K lp$ L=Fe*wH `E[-UjMx-a4U4l|%!Ũ ;;U1$IR=}GX[fӋ#"]fF&~}VKO1EiS=YFI*%("Z#oRbXqXO#Op(`<^ AD{-X荋Hak4"Cqy|xϷa #o+]@^p>;_~;O6wA!D_`aW~}ay8o}?B'O_8˲~9~]q~ӧOvmw]ʯaJ}߃Y1y{c~~~>W{9d2y_1C='OnO)粮}v֗i‰1YU|oݽ6U;![Zꮯ}_#(Lα'oξdFcwRBԄueIhAͩD-#BT2 z ۝(vb{q^:77pγ(7%IFH(*I c:-Zip1ee@@5 9)"f-#(usKi*!$1եRYDY#m]`,JJ'Q 0*rRYg7yAd\:ёB@g !.%0MբZ0( xw2g9KRi̘s(>Rwg)u>z*D^;x%(dUjM2Q P7z 8T,'ec1c zFi#nq㦩kה !P9㐷q@g93Jko9 qzZTh!:<@CKR_j^zI'BY?qկxjΰ?$6={`D1Xmüdcwq.Jf$,UOlTUjz$jȁB'\|,E{r2~[O(i*PӀG,xjs +'w_-$TO-j?\Z>j٫/zG҄ŦbZnJSY0A*Maܿ|~7mݽm̽Ylu&s)wg>58VER%[ɦjˆ n,jK&)THo3瘗.U(Pl!2vdB$o}_+r]ޖA˵ "bZ)  X$S 6b{ĈL.jei({Ŭ~}?mK5"<:mij\׭.6 ̄8p:ƫe:;o¼yϋA?i.H׭j^t4V:My% 13H榳3XkmL$$!Ţ"ud:Le1#S˨G0Ґv5t$$ nGa*<a܀ &LzKRvNDB(P&o& &QėJm6Gx~狫W_߼g>? YgOnLo>'%X3jm=ƛ'4^H*6zB] mt{u~/Vo$?y-g^ѵ/xOhv->yMMnLYWq/Ckcʎx=JE=[: r G%AvT'o> >Bmuf.E&?vq߽}Mݣ^LsoX,{^Cwkg'mxW7I2i~5i=Ne=˳2Rlb=c%&x6E%[8O,/3$Y%q8XkY h{8?pwcMk$DKQ?;8:#?\Ùҡ@8ui"?O/͛7x[?lϏ#k̇ʲ޿qM?4oapqTcy %;oܾu upo3~ z e"Bpr(N(c^p/{B$Q[}n5J~+$q4EsUtq̍Dsk't0@~c Z6k`Y)eW:@,bR4otT6A9xDl@6 {yt`Żv"VglOF;H*bIy^Keyj]TTDiTzm{rz(<ԭ=ƫz6{q Te5<") EQ&]k;;;/ (AnVi4@EQbB8!@iL!q|!(; ڀS( fI{eAOYaE۽/WA{ժD1?HjXB;SO~^y'aqݝA_Wמo|t8vbdQ.y?~8eչJ[g;J1";cʺk5eH'#i1 I$,B<8ށ3YqC6kƞ`, @1" u;F<#bguSFX"$cD(C@%X8cXMӨFumUPpxclN! ރ1D)JDbց~/1BH< 9+NUO޼N7R d wڶm۷٫M,yK%Z{oCJ) Rht9cM]EQOziSFLTHI}xaZ`{?J SQ^aצYOv;h[ȀdM 9$qϼŏ>W6;F%k/ޭؿymg @)[vхżxly9vwoqbv>m '|-V˳`Sr9??/#o/Nwovgwv/~DkU֣EZj fl ('4IyU͖pvA*mc<䳛ղ,[1C,Q40kΤ,ޝ};F#t~(KS=vSz/(?ֲ ӷ<2e$ʒ!bX\mx4+,@"A="GhQŴRJ("@3 **7[//Gq9eYF.łCdrjyrvuh'J.]'%HlcJ0!mBD[LQ.(N1Ja\q.˲e҈ (V-еJR]KJశ.iQ/PWK#6UHZ8(Iҭxw\>ZC)q MeoObsϿ~o|_|pj̃_/o1> XعW;Xow/+ 纳m޺y_7 b6I`!ɪ:TkHQ9΍1؝s>F)%x%sb S1 cF8 BP 0 # !eDF;AiPEBi1u:M,E/ q!PJGQFS<Ă80(oI hh# "Ez]wQJ)8e`[|ZxH7r^(Kdnx,gtL$TD+p4:x!&9`|KZqg֌`3O## IDAT*թÖ&t zQ+iP,:l$yv}9;'>~w^KDj5-ֶhPM{U_7o89iVmh{`\ PX2ǜ yۯB3!)=ʯ/mo=|Gi?_}yN/|YƜ@[},8׋ ˙j*o$քc("딣 !R+Tc>$CrL,盫Ư<+ԣ"~:P"0 %x4wSXot-Nmˋ8]& P@j֓b[.8C|ww*h,Rk$ڮy3nʧsQZ8O:BI1zБ$M3qS&9ӌIz(YZ6ɔu'@o( \0]MYBRA<,#C'h{2R@ѦgYo:j&˯񪾶3LoKfpȮEOf $HǞ.O~?b;}p8mgkhgEq~t&Q]WAUUs(}ytn}K$58q_Vw4E57Q/cxPҳub0m3{a<]G( ٣sieS.f8BpjiÜ/l e]tgg+̮P4ȣp_o֛ {ᅮr/Ow>U{SI(S̓24l<7MaqfpՅsV. 3L&AH $cǎ%LrvNr#eُGGGWWWU9>|O~c, UB !~zK/]\\$ 'M[*gWu. gq ΔY|2Kۚ11unߜnJ9Iי.EtoF!q<"a煳p  czjBAJ %#S XrN ,8[\Q.mYU/}gk٦iqW˦(e*ik8-~xuD{( B1(mÂSʉNdIƦ) |,y`A?بF{v5VĴ4>>:\s%y` +TO 囇gz;wE=-@EJjV {x_{[߸gK_jMO@EӺvvTP( &}޽Ant[H`p8fxBI ZQlE4 8!qT+»`D} ?ߤJжj*,de{"n |OESdz*Ժa6R ubO/?roߙ+t'?X&*pJEͺ|d#PӨڴJeչ*nF]+rnfшg=Q;X(eI,Ks #>2Gɼcjใgrw6FSN=Q,vkn.gqLYxo/y0?9h#I],r)EDef|ȫɫ=frbUA.J:ܽ;'l{_?Y{vQ+` u]r ޾#:Ur&zYD1E'Ӿ0{㾸0fYgvP:cƘm# 0&"g%\a(#b u%E,c#a|̀19e3IRASe%%( 8=X6!(HFỊJgi=FV&xG vlmrr7?ׄ CxtPz@(#΁"! S|b0!|k(^Hi&1ŀvZKQ` f!8o1j.^FWʋDžl6fjX'㸨!Q̘V[Q90KCLǽ8vs.0;e%8 I :8HH);;ƫܬU@b] gCi_l6,m' t|^/.Zˢ )qL&[V"8TG`֙4i팭b^[}M4-.E Fje!h4ۀ%ŌxvmFY>nZz Ibq<if)HA ei|h*VZ0 X7(?<~gec,;_(h -ZugݣkGr\Sg_O?Sg.$4,5ݺmGiOFѵ'o  x]֔ Tۤ,ñu(ԸY)ۈABnm0V )aQ%1 P"Ȫ%)۲;o3%7;Zʫd8gJ+wj=F az[_]6ޢm;rJ`+Uѭ  (cމk1DA(+hr|;Y>ӣGG [^. 4K~wf7Q{pxI/I{)\oL+`T[W5{yfuӤE3K!2<*wR+hCXA'>}S߃t'@ݝ-tHv(`uAyfTz4`U?8E$!EI(N0z}.!hG JQ=Q\ܿgF3f?I^zy=ʾW8~_eʂժB(LGMG0([o׫sO Ŷnzq̭'OO!`u]I0ƴ2CZqBg؀!$NX}]ǜv6h}&'MHl8<:=p`!p+qN`aLl6/$K0"Q6 DqrjddPGI J3m[tTb0߽`6mBAr^pLCtŰ$H/Sb'XP:3Q:1 #JG &@!3F!D!BAYŇa $kږFfߺ?'~gi>*ky[K??yGo|;yՄ~W[o@|{Q^yLs̖ͧ?+Ͻi1UB9OEPIQF)C")ԜFǔG""@g4DOk" acG<^o0p)U]_^.7M[ϼ|=&[mpޟӧoN-8g˦;?-[cQi z>_3.xESHz48obMh*yM]*tOϯf˝>+:∈Ҟ$NuJ 8޶ mX ն YB;Mky}JVCBE.MuS.n Af޿!?ʲ<^8?_o[ӝŲX棭?@jgwBou'aT}p~yv{^ -Q`o+ڨώf't|z3+egܢ)?qo?R c%$=hLGw2{'8v/.($ienQG=. GBo cxK;Kh:c=x&Ygw;.y= |Z{$Vi ]Q L)[cA,P`aqJ獳1# BhD(a|=xp.J`<Džu6jݦXxB}a[:F#[88C-1(G$~o^WWQCU~O~.`K֠~{6?_/߸v`{l8pn]?ɟ/D~6ך͝G~ĵ67^~S7h_aǨ5۝o_dqo֭o_ 3wg>*_Uv3×?[ۿwYۘէ˫j(lpxl40!( (,m4AB:BWZv I^jGI8H|w(1u,Kv58~Kh0?x۷UnwDŽ.[{S<4Z\7bXU^.}Fp?SqxwY[\/Q^ lZ&ʲǻWmCf]mU5,?ؽVE\"8UF1&J P(ƥƀDP9,Ry=qZY߻v/o=mՅKrȳx8F2Ře*jAj骲Xպ5z?UI @r}h'89oh[R{qNDX5$-*6־nWnX  sIh7[/ZEB ahI荷vnC/xt4IxAioQ(B(%U"W;ͻ'N>^pINJ-KhD a/֋zusW미k] L7 Qo;623G=dsS{|YUog9{`lIhO},enk? IDATjwzsڴ&JsY!"4im ѡssk="fTܸ& ~8?$]@ϳK2?]6JG"9gR {4|S* ղޔB08%3&0s4{E$1@)aJf8sl$曮q$}g9 # "0j%g= QP|0AYIrYtJ)5NwUy"kcbb QSaBHĘ wA0 ؊HXk! ÄB@0 B`DR8#MUuAzo x@4^RLV#q#B4 TQ!@p(ڔ50g'itydLr,+9)B88+Jp=f>P!A<@ƒ,Izu ץVNUhb1vi"0]|`H$MB p>"F)r&X/_;g>2;Az2jpy^?:;?:^?xu9Ѓ 4x7kW@ GdwU9K{tr`Yo6i>˿|;N'׵fyD+pvqpةpxͭí[W`w?xg)מ|w^~ݬ;:㌳^kha& PEWuk B@QcbmIk^Z{tlRlT]Q,Ā8F rAHl%%ذeK$KLdM$%RDf3O{ּj\fԔtaIf (ԏzE7i5=eCa(FVB~@6XLdЌ֒V׺謢̳"MXac@GZ[-Wma=]Y^m[dKSNYN&SQpm ˳E.* ă2-RأI@i Re (<-)BS#xU3-Iz^)fʔ‰2,+DJ) q'@ΝN$0qAZyg)eUj'~L(BHkE":Ġ4I34ٙﻆ6XnbQ-^[,[VujrZh&]Z MEխnyb\;>=}/8ksE{sGѭ~Պ~ԈEc0aߡu|p|6~ۉ4q,;7ct{Rjk4> " gst߾Âo-2278$tW%y{;q-K!z4hFyp>"i7"ki8ĕu)A>gזSW3ͯW O?{^WG?cI?9ֿtOɧ,&tptr;Υi5=x0i$Q=({a'̲ym5ZDPB-jyyO1\IK)Am Kj6NN*1jSY R 14YI*E" YvFPd2AJI~:Vɶ5b~č>?IccxXoWۛVY׍FBt-fjSKoj7"B4zKm[!xVL8qN:oa!e0(c!8몪, VpTVr1ka@VF͵զV*TjI;ISJWSzzݸqזJMe eE;na>jQ)&#̷ 벗xK^UK-Um\k<ıaT/lH66Q?\_Y;>ea &q5X;zDLFxs5N1XG(&` t^Bk>Us7hVlvnhBp&lt.YG?쌷әzv6ݫ!A\'r{…$7ބqBHJ-l^<]$M9iv+<4sE8@DU"KƚJIb2Z M0 Q=\m5ء*]y:x;<x5=!V̥Dp#n,;wd8R㑷wgyoLFάFn" [}? 򬮴jK4KvjS#M /VB8 JQNټJE0cpV/3D),wZkW!pu9{'/KnW¥v%C;5[͏SWs. ?s1f+_xĝ/^-&9YN='޻9ޏ]0`lEo}V˷$o?:#|_}qp_pXkGPmȢVZ@i3oð{J.>?ܗ?S?}//>1^?3?>[_|7'pg~S^31޸'|;nnܹq3CP!_i^7q͎뽝^{4>v_J9P:AA#kmX#H2?ĨkEÓѱ -?8냝tW-5 (ENNG Cja0Nϧa11ڊcyQUxy5 c<25JKJ!,Q !eQFՌ 1 3hm4%|zGo<%ԕPJy'TJ Rg2i-% 7!!9O0gP gaD,!A@<''6(paJO4`1@,lX :m,2sg-cLYF# !譡ge,rciFiZFR{a@9MƪQa&p~ ~:+l=]Ƙ`Dcl}s95!bΞ:c1BP!`%#p~A0=^#6ؾKyV0@˝,B֪``zN)V:^6[<@JuQ'brlOyF;C]f(dܽسkgw} 5`WIThryway~tWW׋U|~<e;)܃|.21a-ծptE`l8*<үM0i^.$z(.Et!,%GCƅsA9ޟil:5ASphi1Q)e -RJGħZ :I7LUV*ig,q=VXpy%nOu=h&ZkFVֲ2bJkYk1A#QmOVv7bV i=C,qDchk@"xWgr(KR`vvُYi3 HI{0D7# 03H(W7nܸSVr8"ڊhI*D=kj,ilmDy]^esnÌHQH=N( YjAuXͲrL)mB69e\`|r]tZ]'3+*_PictF0ˆ/l啯6~յ\tQTyzLj2 sF^tbwGյ)d;Xzs3'lINK<[f{Q@ ?lio:X (kI5fuY;4}dBjЌCJBUirE|#cQҍ `˲!49 :7ܯ)@ cv%8BpS#g4> f+빒fj >ΧVl|h> }qzﵗeN_}iHq(y+8ܤ Oۃ4Nfǽ2}+ls*4A;Rospf^_xA+gq{{=OV?s5xcWڃҷ?3ϾkyOG?g_zo>@ӜӐ;}~YI2e("YˆD~WGӵ o(M'9FU#lq*2TDf1Ҙ>8ye.<8m6iYυaYsjumj qei.'Xyjsmv==(PaL"¢heRq]<{Xə2 iメRՁ8P _ͭuMF+xr>6X>\e ^7ti4M3K\!R7,%ɤ8B:*vnΜ,dyySqc6 d#ºA$ |b)E*c=ϗB1V퉓IWYJ$ x4+e6Jh'0U3xQNa)8VKO=#YiTd$&A:{qQy+W2yPdx6"ZiA *Pa& +qiDe6 8jߟBB666ݻwgwEY;wK]Q[ogNhmGO~. J{s;~gQ%uB&*O9TEI=> K~+GC()2mߛ֯n>LV̭+jecQUŘ|b௫8MoÛRΏwvR/0|cogaVf;~#笭2ًx]ƭ뢌͢ia#iYFI˘`ýTG>_¸V QLJ/Vig AQU}MW7?ع.}:A~pX{x2\T~tn&7mJq+^<&n7{c|6kQ_Z;w44<$I{<<Mb.N” 6[[YxKxWUei+V IX8,tF )$ژ, pFJP}'K'j9 !chcĄi&}BJ2$U@uQ(h%D0F)]-&NΓ7c(r븲YGu` XJ3BQdRbcSB@[4x'TRj)X a"PbcdMh5ǵQX9YҘ`,&ԁZa ʜsZc,C@,Y|hz:p x3" l0:A9g"#$ ˆ:pO@Jk[Rh9D)sk:@(emj|6ı4[Yi"4ւ&:844ZѮ+)F!3cԞ9xUB IDATR,!ꬓV[0-hka0 +F`be=#Q*d1sFzMFCCAYq"fPjJ]ܾRs4ړ_+ 8R"[-dۼx̕~_cG{`蝃̿H~qf) /m^boqZ6yb6zPPzhkY$xA! sc;eO狢$URvN-ԩ5- VPNim! gr"D@bj6Z,wztisgtPR#(uT[Cj{ac׈ޢwf{ǃsGxśwYK| 3%7v=ot` oHO3~x2i5لpa*R1otL̩2Zt c1ÖFJJUy{!<`oypg/=1}"񠹘Ŷ$fVVZ|Vb)*nԈc#("=)Ӆnا^#B,"dYcH? HSe!#jnZVr<~nei nÍ0d\U΅>.zPݍ‚h0*]KiNGuf) ul'ZU8i33E%4.z՛7_/ GdcP30֧X̹3N'$V?[dqf'!RyhO0\{<bnhFH=OD ǠstQ~ĹoAR 4ZIeY-^ݎcjTTeG=~G[@~t0O&U1AB@#-c7igӢ!VZUQ'v'XWR؀34/YWr76ϯr&_H,"ڣNm6"#Sesh6nd<9AyK/|e>=?\h te+!uH+b*KLR+ <%!0~rk-Z'p'bʲ<_Z-t٩G|gJOj})_|nu*Eַͳ׾ԛOޠ}4%<ig\֒W_>Q+R CX̡;or(}?4|jur.c'|w|нXm[qOy2h4(cVx'~|^G[c:,~9¹t_\O!Zɬ-rsW"'YKb*lmoe¸T8x0Z)+7_}kǣ٫ׯ9w'X?ʺʒo7[^;Wl擙7^-e]|uߣzǒ&gY:; CnG =W l[No+^q?$Vz g̓xc+V^eY\[y`Ȝ+f9NKjQ+Cn Pr1Ƶ [,rBN# (K0E6Gt1=BHfcYMkj(ӬL'96<òYa=ap:J -i9C"@1ƄPaS YksE[S&KBVXeBQđsjՒP `QА:%@:gcF1֞^w2!BZD)mb,baqD5!hTUU)1Yc̩¹7!y8utՐ~l,B%E*yڂ31q~ zĮ s!0`DRrjY9^BR[8q8E(4ņ^[ˁꭺ)BClVh$ƚ|Ng8NpeT19yxoܼyw {v6Ww|>G>ydl~Wr4W}eJsά_y6y`4^_ 'kn@P~DO +Y LYc/,?̎+e"/Xc|/ Q.s6-fuNY4Wa0$&r9@͵2{ O??h"RT{"/,WWy^Er3Z͝(@"\+Juvynpq~{'7x+_=޾3O#g.lVxȱ0:jtU3y-4aSgVZQCǴy y7UQKA'`odzTvqpSI 8n(@JI(9XdJ@ +-A(b1"]fkK P6\ʣݸYPb.}W1Sa'CYZҐK(!g7׈EU-wvTHJr(BY B<`kc>c^]ޞy^ L6O LLCL E=`C!wʱ=H1-7qAJxMqOE;œ잚):  }0f?0~ǧ;'NBۂKH]?80Xfc?s=!yg~M^πsӽ_dYΜy?Tgٗݿ/t~o|OI=X7̃$/_m.^ZvCҰ?|2ElZL|?(j׈U5p|'4I54;1"P#S;I9]8;N5OGƯZ#{[wnܼgufPՅqv{+_k[6v x>oD7#cnL!8 DC!COBdiv6|ZBhwwY]NQB)c 0 0 =><"o}`upҊ D-Ɲfϧif*u bA HhVΝC7&ө5FYh֘PI'e]K)+cXY)\etJ(%%&:P$㬔"X5u8K":a,˜b ŸA@w qG >Y@6bk}F-RJk11&T" kݩ-S[;i*|RN#L &'2~ 6Ɣeɩ<_o Ezo{7(Zk훎25,c 3juoˀFA!@s\]b"/&FD۝AG0KSHE"Fcs?O@펇 E6_hn>kb mˬ?(\߬S免cL-;j8yS?գ=N, wƮ˂dyxN{RJ˛q3iL*R#ZmXcQ}G싳)pAا_~k/z-LQA5jNέoVpu=yS"z>aOHi~TY)&.\;ǶV'uqD nǝ_9JKf`bHz+EJVFQ"`X͵3s|zRoWn_ep9V/7ζ8؜^M"%4g`GfPZ]79{󂘩m˛ iǢ.|hjL=?,FUB&UC6%ym㲬r&TAI][W/J=P)3BO ]#}M~hcm;+vvq#FJi`8bRelq3 T*8J Ȳ(**zI4GǓ-Ѥ1hծ߹yU[MZ}-/VM(R" SZOHz^-YXŠMPiYQSR q1Vbf2|zkt>fyAY!ЂקOӺm(x73?;8ysuzzvtXZW@S+?=Zx D|!=0H`wirtrUlqsjĘr O>9޺{'_MxgO|&DbjrX18FVWGKPm;kPA\Yy]DJ:73M.ģy{T&xsww/^. Ө~< 'nf''$_׭Su䢨A MSZ5J  kڻON*dx~o;?U UZmnoqɍHo߼[oJ^߾&UOyQk;{|xKT,(~yc\OӋ~uv{ۋrmM*U٪0/&Y V{aóbmmlY{}XyM9rx0H2n0*a%;w M)dX'˳UMFA`%%pf@lԣϺ&yM(KBF1%'AǤdc8v4!e7 < ޅ,N(+Y^?>\4⭯,0%hKt~P[6 &* #ʐ3ZeOY!H@,x,Zm%{LcA݉s&a@ `&)Rȏ*86?&r) !cJPa^`D)$?n9}onܺW50_i}? eؽ7+f؋e'$ŁH#Ԛ|ʅ&yd bLrYaDqFrBcU%Za* AU9)v4IDڵ,I֏{cBx EҟW?p Uqdmc?h~w_#g0Ums|6W)D=ƦaH%"R2 s`at/VxDK+*I6q88?` OW -CD#ENZeJ#$jCWuz0ŲД1M0.E :!8 ^וo 6!*d-!8iqiYg4Ea ?l:BHPVVUiCh`?V!F0ńadm0 @314H ĶryG(KPʌQ. Cykl! B)eQRzu{F)*$c? !`}114c\V(cSD~wn Nl}ƃQO*7^ʳb/Pry=Yoom?Q=9&ٴ>|/M{:8Fg_,E*^Ŵ<98۶Y IDATBj"i&wb`ahhX; 1p!P@o-` #^FU"_rskh}U r4:̐,%x?]ұ\ "fH)rUUQkh i4.D1;,˲6-~F}Ui7|l2yۏ}jUz~orOE66ReR`aEI1[>y}jUu4e|8Ix^UA#xL`EaCd"o]P0MOTn^ .Խd>HM')eQ .LVyi\6Q>v=%2/XۖQı8~|ttaG)+Tf~vVE=XӆIQ+EX~?V=8N2?gҧOڢ]\KJ[o$`}RNu8.i eUv0#@ q׹IL&+ (xԅwF9̈NH(5 bqxo}kZ돌1BmrJ~HX0xtUQe߽68i#A_QJW{&O||_&ߺ?O_~Ə6e{_VN2?nժPEdQDmT-в"l'|8!B&b(M{y +j=ġD!n.^o]hX!A"t"fF;C 0ҭ칛7ܽ{>J_?ˋ+?o4eg2&{ƻU~C'I? h첨=F+DVF TfAڿ5i쐱"F6!ո<*\"i9f$$0qJC$LEwRBZIe UA͢X7[dM ʣV֪ZƱcTY b;ㄌc'0&,Y,VX=X,ԃEr5˰Dn;$Bti-Ͳ, e(``I$+y:9=0ƐGn2@ZiNF!Lk}Ouc8Z_GF@AVI p }sRオ1ƌOkýqi4BX8ky(7%F˗FJ  #0 ~81HQg΢pgUSF Nj* Ğ[u%A*[OB@;EޔmZSK7BZÔ2iQw>vso4߼}Gq/ٻ'7 {7}4[}+*U/V)A?7yW۫W`G|om},ր#ʐ ~Qwn1N52Vv#G@1Ukk|ӃR8 h:_.bEp4}'>/.'_o$xn`bVÜykJB8\Iw`@ Q"9b-A pJ~/bƸRֽE f(:U<іOƍGFAlswmeu+n5Ynvm[u\MQ;H ^)X 6Xk R٣:ws8ɓgfK/~ʵnv׾e)y'Ȇy5h&bZj&R74mQ+K;;NTi)łP_quGI/yJAx0V3ZSƌqh,$ε٨gru77wFCIH&vVm0F4]K9^Q qlrUQ06:X$"XBaDfe]ѓӓhKLնD&2 qc Q˿Vl;w_wP~堷@ & 0!_޿D!0O+P3Pf)!s2o&9 ƲˮjWPLhanW! Bɱ$QMcZ;sfTN 7g˕k\Hhc.k߼>*7S&x}ճy]UbZе@co 4uHܮ .-<`2{e gPk}_nQP~y4rV$I8bq뜳#1LfgYt^SIPXCe PkTgCR)ehpwue F+pm[W>~O{U5eq~>?J$'p2~8XG$фtU]|9+[I8 vzöΫ@AI7%ӐEAtu!gbU\ۺ(1MP:ו5@=_?#>\6R!}GÑm,6vdz.;^}Χ'7w|<=Zr'Y?}i]ltȁU+F/'٬=JۇO]۹3!ɪ;xvx0;Y3;UjBLAfH^|1Zۺ6*δ"CƬNwq\$YȉnnMF<n,W4d~smgaO~% _G ޸rrٛOZ^^*_TMK؂/Ti]iJ?xZG P$ag "˲4qtit:)p2jκ;Vk䅏?sN }r^׫DFBkj#:ղD]1đ eu%BKvYw޽Sk i$VEUgǣ]ٳ.d&enNՔkÞZ1zHH:({y$$&Tmͮl_0#B@ >_"\&|SL ( ?8MLFc?1ԒE7ZДvXIJt5Ѹ8, Db͵-TSTxՍB<sDD јaXvh@F6{de,ˡ4 CYQv(bj֖9&ްܻ/~c{{c'm_HG}*IzWo,jz1{b9{ oڦՍsӴUm{VŬ瞿6J, & cðV4 qi i[@$jiW/k$(OBfڪ=sjESj˳I/,$!g4MgZ! 4/Ƙ3U LRQtRf2)zy>2ܙ.c9X pFZZgke<(A9c nj{/ZuVi#q0 J9ugc LNpʕas3 ciH&5p"{NP/8k ; un d)jƈQ6ZG#N)" Q2aYA~d}BȥTl!o#F tF]>MVP1mG8aqq(k;̈́4!LyF30tY`i <lA` y`E`= 32lf0jj~v*(WiuPYpz']yUQg3'V, >x^RC/v׷G1kAeg6eNd[NCμ4˼LwbLtg&uS\1IS]Q;8X] `+iH`bჴIAMOߺ5gA*9ZAzD!c?{k^,*AHG)[,N/.{fjI$*綿5d΋d,N* Dx yՍ/ &naIl %%(h}s# 듵]SMuxd8Tgj HJ7W6h]v뛓i>X׸"ʩ!rBc"ms,oռT4$B+B؈V%ay)"<^D5gWo|KI{;W bP4/j뽉c<[Nzhab@׶7u_{蓟\=<;tpfRR;I?CNxTwU%RV#DK4V42SP dǮ|]o>xޣݤq`4-1\pR`QB{QUݶz2Z5V-bIL`ϬWv7]-O^A%#"D,m@pjϝtw{.3f$/.vw{*?WQaVM.8ƃasEy/L>P-Ӄ%[ ׳$dM}Qg[]h.V'xMlgx0q5_N_n>vekcxکϗyLzEC ᣦyF"נi_8ps0‘纵8} ܖø {C.i\ciٶ@F5 f'mpFy$E3'b98jdz1av[_vmg [=lgEck4*x~ٹh48G7x7scMԁ5NZJyX.MkH 38B!|Y[ ѐ8"X2H qmbHʳ,1JeX(8fw.> x@ Γ)0lҏX@X'-&22BǑFi<@=9y90&\Xf3Bf$MK`,KOq3 :o*#\-;IiT-'罱 (q0! 0e\XrVq ;'XgA$&8Z\^.{BxcYWeZQB(q/C`x;98ZLf KCťU900.3>S!b<,V+mxmҭJ4% 3 N`-s(椗&V(68r<rS3[D |a,( l(U(8Hӓ WCֿGWNƢRWuak4{*Oݽ}ugg*v>Q,~ӋSvBкwk/,KҶѠ*qIIZJDR rXսhB$b,hx9;_+lxlg}U4S[rVDǝwXA] v>y㝫w{rkzÍao>37]׳/܏~oFޜ= Xy[%{#懾GB&Lܼ\P"m}B$׽n;]aƲ!#FCBy3K8Em^? ]376f~.W<nzK˺-jhaL?7zu!HŢYHĒA@"mm OA6r!L1`gk-x]?^Ο~Y?ĈCbmK g"ŽGUuebd$N u2[uppZg;^2J=DZ㧈"*%ru. i7 '3GdQͬ^qr${?؋/ܘ\i*mp{DX8t|2 6'bYioHۯ+߾ҍ?lt;d:ˇC>~'z؟&2e|9/2fޚ(@ ==,V(؏JXrq3F?)-iCcQ#^m7/ q{~1mRƫr|봻(W"Hы0zBk -#Z8l~gTQ5@qF֢t}k $" >]ЫWouՒh4xF"}s.'{ppET׏W͝x{_/(~Fa.,D)y'4lBH5R0J tc{ۃ^!?p9+Vі`M^+MmZ֍mu^P\e0+?<׭% 9Ko&Pvw#l4qNqb{ jJ]JAd$q$N+Lw,0= H:K K"5x +Me2 J"զJ@PAkPP@X7W9gyp9="B Ř B"T; `Bi*8 ۦvB1m-%~[żp\ra)L v h L<FOWy>_R1XJaתF{TJ,R3C5z^ \(bF<2؜=;/7lH Ggͬm>b+tYr>rQ>rfmOMog*Ք^Bw5u@ ݪ@Hjm5 yLk.vш1g CTSa1 WrB&cKP_-Sl OGι'6,`ɢTYX*Ϲ@߽[z[WnuBĂ6A-gӃU8tA%0h 3lp8b( ;wʣT9K a4] m]P0 d\56 r1FBڦy/h#S:ՍkXƓD:A5mF4|")gUn0J‱!M,`+SV-˕SV *]+QӴ:!Jd+[˅:G p D­K>updt~8J1C Ts#6Go?xi){0\04c &iaY#BK+%b@kC&%02R&V.cvw^n#AuYa"=`8oTS42 \J8Fᅯ;<`ibhi@޼vÔn*0cEB?|7w^A@{sOdc_A)/}iZg_>:Zbm(וw_EqfsiH#vp\Q/;N+48lM6wxլf h8BhZgyoitǽ4MNLv0a;uVlܓqoEomO+־`>RbU@=\D2Jnډ~cw^ 8TAOIcţ w!΄Q L H d{-OͨDna,@zW*ٟo}3{54!,Ƙ` XH*q9vrL9mT@ʎ$U,&%a#i4ݷw>s5a$&_}rXy@Ie4@97O)!h.pMIwKdOqo4]^kZ1Bp6[uVp]ոVi$+]d1!jI9f NO,B.򶨗~ZfíM[̴aw{9\"y )&Y̕=qmr:~9n>';]g˓1BJA: ay%('eݸ(&T~OO=mNU.`~+in$j #$!OtjR*Bqݪbbm[!pE:-걦֍UyUWV@LfOưaac>8%a|\6H7!D qibg(E%b>'kd*LW[Ŵ C(c?0oa{BXغEp W:vRk8 z%6YgH# Rc`녭+&ou]yQEAet`E) $_s?&XRzԊ-_֕ZmX֓zw׷69e 9-nlFF zk7|49Ygsx*X%D"jmY@)]ʬ>anR-fE `_Y M) BDHn?[>Hp0;=^Tz`;BҺZ6M'E*dan mls5HRXBЕY?l׾'9\ksZa8gG8DZRLq!뜵Hk=2!䘳sHCLKוJ28P`j)mE,P2A(-3g!pu0izyFSis!B N%0)ΰt8`Ά(!@ʠ BkÄ@s1H 8 Lq 29,9HFv~rNTY.ѿbH a@ZF[J׺(4&D,3**Ra:B2;4a!~/! |ns{{{;wVłQlV>` 2ϗjU1RFA4uU-`<_̬sR]PF\j_܃Mϧ5#'†ÍUޡ.8ciﶇi( ;~]ZkЇ$Vr9'] 02=hƩnj^Ų -ZЂ@l* 󪹷aLaKmy;!J~o8{{$/o=l#ԛ?z˟t9h6[֥ް{wgM@Cٻhw:; V!0JjyqAiTiє>9~kCZ6Z ^ R6XZJ;^VZ1⣤+JEbƳTiHXx2-U}|t:]jT$AFU+bJ |c:Ha h`9-Fc¬"K0j1ݍmo,rx8<\iA/ic4+c^֨QP8t?)uJ3rs!IuneqR(lz-?RS[۾.]zٴ qa׮>nk[޵kyrcm5~ۯY9hy" [HahkkSm /*M~i )",V~OgGֈhdZ1hRRj+ކ+6N#OIԻg eWZ7e\uJ*^k텮 wdwcwsj}Oz>Cdw2+a5IvލOY9l^Wav7kQ#m]{o/VosY߽j gaZUnoE9:.R4߾K/]r|nٞNg=A0ɖ@k)(}̨1sybtxaH F 2F<BFG;^uxX,tѪVk'mb}欎|IoǪVY%M^9ЏêV`½|ۻ aʰ T,Č$,<_.W~?M$ĀǔS1M a <Ҟ&:NN4Aܕ_-NFꕋɼ8z eN,Lwuik7`tRJ"t&@e%iYεN,{1BCL`xA;Il|ϷVyX(A; ;qE)1$ri'N~ 'PZr.5-(rp[r]: tsg/|!yX6kj e `€Qlo N:5b[ۈ]`c Q$emZVӖ_#RBKj`VՍ;ye.㞷,syւ5f4l@D'9 eY:_@agz}?S?f'Qл5)g1ALd* d,fȓ,;l]iT R!Gpow=~wZJtgs4:MIzD:mM6V!;|4Hbr8X Ď@D%'y*ʚF:u(iZa7Lqw|-#׹u*U߸ʴnZ7i5(jqk G[bϐ2L/\.6`'[t'DkHiJE^.ebdTi؈b/MU Pj+nyuaLipiP0 'G``qgŘ|CP]h5/ιi2=yf<666P޺Ӎ/uXN64,BG  :J)y@5,JX^pYHlXJ25X9ol_e3T*} ::XHq糓6ͳ"šCEs:O9 !!-UX-F6rﮫ kW/đ/`9>pŗϵc6h! Z9ky>;uF|ʪ( <\P;x> 55bXazYJ )y` 'v@}Z2!gMS{a0Yvp _y<~;;? Rg#tzRhkp8جȁ!t-(CϣAd-9epŒw#)B!p<Bc)Vi c)si5SJ5@`vS |o2z|Now?}XٿtasMW8s DȻC_B0X B@Ɣa䐳Vz$Z  !`K 6VjE "PkQNԎD!9h=)S:\Ai}sX,<)\VY*kzͧjY "F=T a>O/\md"--v*T Sk U0R+eSZ73iE Yn2!zn%$tws;`4w(k/ /-g)}"eu6Y?|h?mM{9m0) "O^VzqBc1JƬ)'*["x4|JUU)* # 0wx1)֙5VI IDAT=_cƘt?$^lv~0v-}|CG֚Nkq<{X,(8\z6NNdUU5ch.<DS*r|6aL5yF>!,Uj1ؿ5dl {{93߾ZW_N9a읎gH[Z; vѲqTJjJk !a(a,4C~z !^{s*J!ƒkX40juͫ00 ufUY Xx/bAT^E1%W%F8ߧgӱ"_Kb}(t>Z`8T\)+ H q|NA`MNc!r!Pk*8VD@90$DāʖJ)e-E-AUK.:NIk>8(Oo1EvuB7?d\uQ@ gm9Z+:]ی-R2@ W.޼{8[xQ )J"EHfRiek(%4creJ5t/lJ@tcӬPZSG~׆¬T7l>O'KU{4_߹{sskQQXʹhp<>rH/:9fRKEc"=$&l*+ %śxXs+#LPeRәEnsFmt*LTj2OdZ~{r>?ۯ6egpd#!iltY-fqmr J߱`( i\-u-#FF^YU.MKv6}H]c|&$tw?;מDM7y.k8g;;׵/=ƝW]YG`[T[;mM٣?ά֡WUAR)rQKIH{BCDeֺ, Bi0ʪ50bM 6$zˣ+W^_ pʪڼze=7S߾s‰ kMY.aggG=x7vT {6NXl'ӢZk18 :Otqn"C%Z5cD: vYNao8g12 :iA E kQQG1tY[NRB Qy*kDeY~Cpo.]#o|TU!`D!5A/CmB|a5,\xt&jdM)4pgOP^omHuZ1Bt48a^LTxSUUi<"d{*+紒e:;Z;ي&u 0hu0J瘔,4@'.n]\>Z͊л X>^Nrw76M>ߺ7-zO\ GOl\ [/`V9;)nEg/{ǟןvCj|5* d.qDiD]\XGcVklWQ H&Ffkݨ$ fU,kD#a un"@*xè*xDg|ū圢z~FG%ak66}؁E:wQem HnʳjLJ&ӅL'l' h`'"È0f@"4lX Pce1f,mWHY tjvt6:yF-ZNeJY`(ކ{h:q@@a]gIAP&.B[*QPӦgYmS )dn j]QJuޭ@;j;ʨU&>lQ5Ԣw[6WM#Oۃ35#pozzrx~t2z$^E `a<䥨Nl2nՎND }x4| dV%ݽ?&(c!DpDڣhui ֎ k)%Z^xy12{GDN0szVj'?-WAk| 0CN2*04MlJCPFZ8 1_},3Pn,D)| ,8<ؿya,$B3)m6j5L BͧfXtD98`$>uDu:g+{~)d!mj"V.?QHź_5㣛OQ{{7.82~3Fd02#洭E"95;lLArYPm :w0NS=‹/i}uzCx|_Ax e;K;tt_B!AZ!2Fy {, ںy`倵N)un>{Ga-Dkm9OG>of  -pjgFU4B!Ƙ0/imݿU.~?m>qT[;PJKBD)!eJ78/F5Agh*`@d)BZ9$y HBV V@K}&Q0Nĵ2@ImTY8 1"yy_(t:?zh1t,9n h,t8 BV{jz(3{~k||rvzd;Or{ ]]WGO}㭭w'!s!& 4Z7J);I^^EY4FW#u~ G lQ` a"1Q- 8[/"+P+gn=ٙͧiӘR0^G5F6,D -qciq'"Dfb#85Nm/v:Alu*]7Ga@wnݸ מuk6 `l/Ub FQf%cPH-'_M'wOŝ Go~8Y< E^I:@aΚNj$QFC `]PSC`Cv#1@pXhLk G{{:M#~00,_0^T&uöNsx01X/:[O\.8MC;Bl n\ۉ7{*G jy4{(o߹yzz(M ao۶iQ8ܪbr0^._x{qKNZmEY-WیvyZQ;da|DY 4.}ޕK?0>~CλxB./F\7}Ci4Bxyt:9 ZͫWZ{0eap޽! |Do^M1BgB6l wy,C ۝sIͧ~gW;߼'~{_nj{dӔ;//|5yϰ1s20~>~(t0h [~L*JS|6_BmA91J皴Xpr(-p"f˓SRs 䄆>Bc|L km(lieijq`{sYb[ &wATɦ'NqEmꃤ?[/o[w>9Ѿ+oloM *)\V~C{_?;i_%~f}n~ W|+_Ћ%o[7ngi_Oi bS!)G~q ~w=;WU%&Y EQm r0H kH`]FeV쌺vqev͖}ʮ_jy88g;+'U&q]E;J0 5RJm !N!G6unM9B! t?XNZtZR UKڌ|ϝcg~Wܻ w'8E*;PUЋ҉U#ga)k0֍8+m8W+@'0 {cxWs +],w{rv{2--@8l:t ,uPK5H92]glYi^Rny]>םa(;?Wc, Gs}< k7÷Wȏ ZR 7>d,8̃|s4߿8^勍hv1UCV,eY6l z3-=?쵓t>O=E!A`*OB Q cvZXb nm r*c6'뇃NBiVAf2(a%bGǺ]!.ox>?MV Otdg9Va7ّ 䅧cUY5yYWk|@3]Mx`ʗ+dLϋNiU㒈wc/[Mh96B@<*+*JQڝn[׵1Fʦi1f\&~tZ({vP3GhON&tp ^u i b+t:]4r( *-{XKJk{)(Jdɖeme[ 1dLA8H$?b$[Ɩ$k(6d/ݗ[Qe׽_N}(:us29Qvh5$C)nN|K|st޸w4R_99|>wvL{;[sHǓ~ iX=yiM2SWOw]^0 P'O>88꾶o Ν;Tv9Do! n4֖wD+`0HBV!44Ա#t?S8>?_N|'"rZ[;θ@V_;NX~xߪ7{S8V_{\V "T_^/-`ז/_:}2y :{/,yʫw?]#T/ٶ\5O !'?|R??^S=ly_~?w0$cl4d7n,s^j,X)xy^PiϗYkH&c &V (R8z DH\\%H!IfJXrw;*B4'ڱ]hq7.,Rg8"0Õzkeq1(J}e<ٕ/NJqӭڂ$oO6OGBYG5#shrkq4|.\ e e1ObjXedommYv֣ k͔ o[ =kڹuGwά.M^>{s]X+WOүA0?^WQsJ0hɓ$U:Ø؄ra !P 1BAZHk1-18Y7ck !e DiH0@A`VJ˹/Θuۛ;w^{Go>{joWSƱN==^X_~ 8nDOXeYVE'лxg87e)4圧y RZ!0 J\1BgIŷgyRp:Nk_~e`qO 0z-Z^y =Xd|qRH[776dʌ.Vb²$|`;Rr]x@(NssQ\g[̕dl8bQjJ'['r]*-&ɸ(7T0%!I3aiPЩW K*ضY.rOwZ2<*^{?zgQCbx<*Ĉ"B^^|ڟeӏQXw"afEI!1lʲj K˱EU[i/VZkAz\*N^ a;K0.e DsI]4Y e$"8Z\\fԚ {XΊDJZT8U ڇ;ڨ,V=ay4KIӉ #- êX,׫LSfJIb侮 L Ȓm{TuvyʟdGYοW?ݽ{^e&NG?f}~tv9c1g2} 3?Ng>/dٱGQ4:P^޼> N:<ܭ>cw{lbkD|]NqхZ6eAlPu&JH!AOhcmO$ܟOEh2BS6v[=wbg|ajp6S ק6~/զ$[\?Ygrw?,,ea[k6FyCex ch (  Ô"9 %B1D S,f4h Bia1wKs KkZ?/;Ki lИžv"}|6K Q0d[B+QZRys-ѹ)(g[[ZJX/;ޭqOk#۶ 09jR>;si.ܽ^ܝdF@,`0.O;R %I:ˆEJFIDE1 B XIitwpw+;5일ZEdQ+i;4\OQφ $PL峫R>$=j?4d|v~an3=`h7 .>~jy+OY汆y lC~kO}[~xڙ|TL@E7M{vوh<ߞBD<VZͳ!d(!^ײ(nlww[& "(c+\i,!~)ń17?DЫ׎mcP4 9\O7M:g^ t1JjEzGy_zPvt-`1x̥mP@5 2@)" P**v TQ:ֆLb=m$FwxgVirxɜB(F1J̶8&y?=*$ϢFcBP@4Zi"kͿX;wȳgVz?)@Otsxvu9(L41ʖ_{kWw7s';N~7XTkT;[e?''G6!X={R!?_A|٧WVWZ]&Pۛ[B\psndYV@ʥ}m&;/?g9Pi, il$B:bSd7S/HbHQJc4 |3kp.k](}&Xۿ0Z?Grv7/z,4V7܍GQ, *]H9e4\a*2e㸖M.*,MlGs-=ъE'MKZ̗8+ Q8?@]7GQ:'U/ Ov՝"ǮfpYѣPМ/'!lWi0\]Cޟom?ٟ}x<3w/|_{䑋} 3xF3bftwjNK$9IWFP)0&!v첏9/^]jݛdzZSן{6tB3IAiʡEr9r3PMSVua=izVӁcCVun?L7ɦE4vۭņi1=慃820՚N;v<"$i75igZo fd£W߼fM GUSWCd38γH"+;QTAf "U\(Pel!Z J]h1Si94|a-1 Ԃ7ҩ_Ѥ?tZuA)RFe6gvh[D\s6kAJ}zְ[Ŝڦv5I3FD˶8f{ C(m[UFa!TettüZmn6ZDD>MKΜ93ܨԁԯr3I.__^ɋ[QjaMeR( y];Vy)Q)ZH163=Y##B:,q}B\"FH,)%R &DFYR2Zi0 }n5_{@yKYُy^EIq Yq\XX 7v]qUWoe)+~ݿ;PZ݃h8x6ƵjeԃzҸukUofl Dx25+VPHCZfs(g8OS擳1?0Jrad)8/Kq0D9 !i0-*%PLZpd@b&1"DiZgYecAؘ 7_xO}rW*@)/"I2◿_/ݾscX@P;ֆ˲Y B4 snZYmq2,(OVu hpgNd✥y$xsX$'j.%n2!A9nX^e?ќ!X@Crm NP7ȰY9/X0,ck]5K( ~u0$εgηtԥ;~[ϸɇN_NJi8@q?y.a,@8/tk`Y5"S:QZ^7 UhZ@1*rDa'E<%e\T(.=X_9H%cuᰗB 1LHH2FcDZ2s-OWăy Vp< RZI/ e۴?dB`LH(MTlijBA(Q@ H8f` x-Uot\XLK֖ε`dA/ߴmoaa B4tR,姗/[ PV^ C^F)~ע¬?-GӑʩƣJE)0&i ZvϳͼMN _itZA7ʵBt^UK@{+~} UcQʿo\(gyދ7Ї:HGNZ_;T`p2((͵Bt4̈́݀5=FDZu+}UtwkˌJ%G9\U5 @XCSs rËtHy6zKmEWRҤp,_X[ߨ̝\?cig~c-O B>?cWι\zon"_Oc?y}=y'D\H^s'x͇?5 ˢW+fئsJՌ8f/x8RQi@(mI^Nf1 bq̭J)5Z-"B#m} EMbMD2aҗޝ_X*D ;$Lη>OQ ^[9[8ڥ%IʷGʄ#4`B4qwasц @m,.Tҡvu~Wa?zk}=t0 |iN^Ifpj$yK otlm;?' ȹ(HEi)5h1A#صK1 h) \K, M1+ب4xk%NVK SbXVQdC.%\ XB@062U<~C{4$Kgl(E,]lzY;sq.v\!u!LV⭛Nt"ЙœVH$kloY23` s& Ц!&$GO_e'l⡬f,$@Th-TAuWoasa&olG>i0 ţa +n3zדb)f̎4=: `1ۙ<|$իm`.[ͪYV  H|#\#/h4J"T@Hc^8q,eBT WWe P`ZI1[Q%/:z,Bpm$RGx;XKt,j.RT @6K,@f5Sd9PEb3T_L\isAH 8:٘_8{a;{[IGd<ܿ}{x4s{tM'1$Mʄ'x4J+K J:e0EX ۷-FK^2FBęh!42ŅVF#@kmA fS!k  Y&R!ń((2Cb RO)WwgOZKk/^'THįxC?j/|CEd7;̅(;;JQ#KvQ=Ջv<& G18@j'&iuAaF{+(\ qiBOB|- ,JXCײ!BIM! AC 2eH`B:ynzeMRrkw?ty斗Jݗn@a0B|Ϣ45oT%G'Z˷n]eB{S|d}/_~FoXvX{H%gw}{ Yh5+͊[Yn<* +XaaR\(*]Ο~kۨ6iTfRyt8/:oR&3qPw5(,9F%Hyެ'WfPR DTh m$Ѕ.2A$H4Bڲ(@Z ŵ6Ru2 V !f 1E2;/{|xϿT^qJ2ݗ^B~ڼyc{,\W6B '3ifZ`:qR-[;c:뷾k#Y sE^@64KlS9H%F:v8{='( [-qm }`DҘLeaa!4q' K)s%e2I Kp4,\ZD M LHL\Cd`ZCqgNvͽQw4,Ci5Vi6q]MYj^x0Lg))doooG N2-M^jUϱhgy"$nj֣,0/*J5+Lb,A4A\EHq!4!1C%@C`3ȅX4ÐY%Aek.9zu{nlw \kݟ *i=lp_qDeNo޻x,뛯&DiWC CTY^^l+dg򜬔0p( "$Potj _+ʓ,In!T <4o.}S6@I F=r}Ye$JyIvɅ'Ξx;ϯ]^֝Yf9^^jD:υ:ey]gVN?oo  ",G#BhjasW1!7פZ.ΛZ3\{=?(<Lj(Byd|4ӂPC)!V$-tu._b/_O.޻쉅W539i4͠{c?FZ)QQ /poll+U06 EQB ՐctR"D+L"5B4CH1 TJ2LoFvPi!\ҠR.qYImMDRR*"ZzK8 !jկWC#RO`o-CfOC"s=c(W_lx;22 (,b-юEB)NBXidgy&g͓{ޭֽ*-@H C`l<{"t`vl6  P%$AI*{y0cOD#8qs2|<<)ܐa1ªF{ ۖoC 2@p bKsrB1R! be$ f3@9ƉFX ]܈R6P,-.+_/ 'L-U]/tN/ <#8/1离X#& N%(4<"%Mz"LH-\ZL"#ƣ !mVJBl0dQA)}͹{QkH)"`L!z\ vHv,u[B0BqdHpHHPB0k4E5H%-bl12U ^yb)e7$Zc:zϟ<"c`I{ z0[2ڃC] sJqe&F6PPŅ *CJtdMrlF? Y)$ą5 Fj ۞$C DIOp^AZJ3<0(9eW97PpY;hP9 KNVfݍaiVDamyzsTQMkU}iI!APBP;)Pd9u-v̮>́$\=@K+*WƦDwN m0!u0!!RRgzN EʸTv<[veS6Ehb&ZIqYD4'[qڣ2oP{՚gIћzNRr)5@Qb(kVP #$PjeQHEaK!.2@*ݎsS$ÑXdP)˥Ʋq - 00\EL%Fa cFmA3J2A$Dض!L ! ]?3Q*0WqdR11 Kc"ZS e!w\MJQdI>״_|3SWl 2tseBe,T&o4]16j $RZX2f1BRXa20l9R0LH0!$)nhWX aQph3I0q֫RPQ .d $xJ1e$M J1H%ٶ)D H%3RKc-AF!&7l615 kcnY c1V0Oқݮ~8N×ϼ"SjhfmC/C=j;`@%Z`48p5e R E>`I&j啜D":1 :֭naP(jUa#ƫu 1޶f]I.AHc=l, !r%Fu5}3暾p_󝧾-om, pϷAI3ȰKjH H(ͱ_LbST iq]V6׳$6Ja0"Fq`QYDD;wO uųnZFbSsɬVCސ#da?T&ΙõJM`\Q{mY#E=;7P+M)TIW(yunbA;&Us,;4y˂ N8." ^DUqbd8Z,A'"5H"5?p=;j y ]Iv\=s24(q$K8¬TBVt6v/>1&s{~5c]YT|dYXd< $,RJ7ƪ TJi)\)C38RO1RR0) &0,v4ϻqAauoZH:5Wܶ?u$v۫n>.-q-s4 lPj4 ]BaUD1wWl FFY؋=i{^@H2SƧvM۝aOvN@Gɠ0 ٖrEۉI\9lG[jzkjXՍ4F3Yvx4qۭqwDq{ym0&x!LrEaxlZJ+B49cUlvFmL&a&W-_zeB+f[V<(38%j@T< xeJve~)B(J#sd)3kye$IJVbr|,kϋ$*@oSl2Pc-#߬jRGWjhukXlfמFuށ܉>"\f8ozx,8py;> k~p;u,afC= 2ϑ\VnG|@U9OؙB(Jȡ8pham=L ĨU=-h];tmWnojXY@{^q<-C ɐHWv9<L➽C˟?tC^ΐV!۽Z}w҉zjv_If!Z禷VV*ۥ_\,j4cuV3?I (n>\t(Bl @0FPYj' q%ܒ@b;[o-kF+WAas7y0µE'n:]@Ƨpd/ ʎ[u=,-A.U*̱\#빣"c,Jm~Ão>՛d[Zͥ0t]?zwJ~sEHBr]`rʄdB+^ gΰnϜA"~RKZ2!< P1KH/W2i/8o.][]Y@ȍ8g]`*tmln]Y4"f͍ SW=F k( `(HvW_yb "Z_]Y]=;7M@b0yRJ%< ]U @%xB32‚+puۣ7Vnsxuei#G 3#`D2iHBGB;u_hMMl+ s]p9e|:Bd(K4Zp};JE!0gwt*l9F"fm40ǹ[xeb/h8B6j[G83^K{E4rk X%"Σmj|ggaA._YX& RjܲǨ"Fy-*uCnhݻw{ ] 8ט{K'= w=_{O}5uox`+uUi6z2VT dW]ݼrȡ0w}6c͗_呷mO|F?ɟ,ض1rK,Q@~MkΜ9yg_Vj?Jnww©e˝q;_9; ];7v)ezG۹xz0n{h™ꑇO>|g_Z>=5>o|ce~}/e,_}#O>mJ0P7?zG=qw=N~[_ZiPZijaJBA! Bz*M `,bpv`V_/041b2ABlO %PK-tE\Dl e^;19)8ge9Jia !v`>}Qp`0A8AR1y\ !ZRJ1!Db ;ܮ3?zER @Pp#j9J%Yj0CQQ.23JL D(/8aBh keic4R@M1Fcc,-YLsyBԍ?;ov^}gA)o!hue- Xg~#9eQ1R&:c*XUr L`0̎e!&6@eFJ 5!+իF J&+9iCGci.1:N-.}fj4ReQibNkp?x)Abr\WM fZ͊3*Fk|<'c=V3,2 Q,?.K]Z^>wj^bɈnۮ]g8"7 р$^3;Wn=1|gm{g)25cؘ Ey&jM0GD ж=;AxNSMN+zkB$Q1{zu }\"i:Mr99Ӷ00(E^P`҈"͸6ZݢPEm06D`v&ʥfKmN)y1o$F! "9w!Œx(rT283YG_sLQqYtk;fQ(ytN_\I;Gx e'S|FmnO5ӶjJ" 1Wp{8l5]pN<6ߐ*eNQsַK^uU+ݮMIh,,ƶ6jH8b,aIZ5R.yR+|d$F |eŅ4Uâ ,6 [B U\ \(x86 * 8#B`Ga8 `D1Xd6 (CNjP-L|C'io'yO#9p>c}{"mo]x C$Lz!ҁCpR1{_zUIyߙvkSc3S=l}մ+>bϟ?ȭ\^^jS#Q?FQo?B0/̿uM_HVLnE}m~;mSʕ}u޻/_[˗^9|׽՗t= ;/yꁣBaV{nzi}ԍK Vv/-kWT/Q|[T*Z5?Wo~gvgO~āO}S◾иq a AT* Z)};7|tv{7ӟtQ[Z' 1p8#g^9oϞyoO'ctv>),B'xNҙsoxS;qeۈJjksgOq1w`=_i^Dݏ___ټ{˗K- (ok?O'>ߙng9t3{R?_Sg^_]P}i%3 lAaCw/ɱ^d3}a'Hi1{hЁj1)Ga u瞱ro|ӲozӷUBAQL>|O>yQ4~qΝ>s+aϋR:VkvDZO(qo[PHqmOAx,)QJ#QJm GPױ%ZTP 4<|Xjj%ֻRZ[]y[l=ķ}}Z}muqfqn@%0ZZk J% Ԙ! !@Ke@ ڨѠ/~ Ÿ_oO?1Bg+^ ;^lu-rli?X;vص\ ឩ]zV"QaץϼdmV%ELZ;&wP UZ-FԱ\ 7J"at%M@? Q"JH1зwp1QD"@!VYz}U$5SV%zӞGǦfo9 '6WGÍIF=Gs1xT'K1t׎ agK++NȑEHFݑIIeQ{@0 ;P)$mjyԆH-r$lLwWzZګYfHc ە\13$I'\dT]0tq27=<1fE^Bq\bF/t0}?Rå%M/>3*ׂ^T~} *jaB(YX2DZ(%EoأLMV1%W6HlTkW`_:X6 C08dD01~ybl걷AtҲN;:N~+SFu{I8.bޓ/>Jɻ豿?9vF_y`Z Z/4/ ZPβP(9uԘD"@#DE'KB8@/~czGǿsv>@ȍWT\eB//C0mJ0XK\"KmMν} A(JS@i.!0@clF@K  B2~t逸^|ȣA|3Hٝo׿Jx#w4ZS/yױS'rr(ݻWKY-{/?yohgj֣2W^xnh~קvĔǞcKW.6ʵā[=oV 칙w{+YxƲpI.QXy)OH94͊rd3gqŗ^ڱ{x_f׿~}__M7ݴs` aΥ@"L0&Dz&j-WֻAW-}K_tiT˙̣"kLǪao IY<+NQyEyZiַһjM6"ςҬUlmlh5JuVhXQe!ʉNe*D%P`xQh)ՠN{Q2ꋄ7+-"Yfy =]iw6N&kׯZ=5sueB 49eBhVzT.EkV͜$Vͺ;m+Xe!\R?y\ bѠ0 E;57kS7km(hR*hlGqSRKEm@+֝2ũQ8h6Pˋ22A0Pz$~\ HC\Fk'W%kYz%\)M"̲0 uԛ2dpr a/Ӱd<[.T? HBbrMD}MP8M0+%Ɣ^@mF )e(2(˚n󄛞Ƚ{ʌ^[tmFϙ)"zlKN{9]6MfX:yr IDAT.Sm{kA+G:D!:;l ͋iTu E:].]_rPݿWiU6ap{}g{L!8;y~镗A:2Íec`UmU0jh٫wz6VIS "q"u .BPF0ͪW \ώV`֓{r9FhTc,sn`h !a\͍M^wk^YY9~xl/przzD %i1Jm7яdwvM1hR*E!ZVul\k&e~L=19v+<3ƌ]wi}||||4 /B&hqu}0XeVk5bmme=_Tv7^?Bʹp a:̶,C,IFǿ+/| oyO~㣿1Ffv_D<ޓ잽N3//>?[;g XڔAwLOLMgѷ{~qq0z$F$ٿ{ܹK GFP&I1RBքxJ2qBfYQy^8n@p{Rp=wEq+kkp>}#ʨj 0\L\R@11f*ˋϤ#Fk"M(}4`~;KG$43IQb˅T0SmUJ 5{]ϺLgzs@"`0 (H(-BvOuϔUcӎ bDTF@$9IΒwjѮ{~ﺭ盧t:+G?S;Kv2 L;eɥ^=U؋]t"11rVUu^eZ8Huug <ո(^6B}b4ml9@7^4ZJ=R""JvDA+ V`M5T@Yc6&J֣bݿʕ쁃׬bVzk:=5G.YXmNow怕nX󕕽[BSؖtٳȣKͷ;U{:$<).-^gq NΛ2U+ #|ɏq[V;]nkjr=eJ[Ho6žƔbd a X^jB)}0,nk7t`%Ù.*& }|{>bƀPgؙe>3aX#VS`B )N;7JJ,LXm/@U_r:{y[S j.MÜZDsB*2ιBJI URE~|hp$BW./rdg2&bequǨ:ڇ,dg9`1d3wލ-_\-4]^$o\z^y//,ÔVN+{89xవxޖglg^\۸j^g*쵚σ85Nu'3H`RT՜a\F1:BJc@EdV*E}b=dKw&C'}$ T~}9{!_d$"?ƶGج־G psRZ19b@TlG~/jEy+/,v3'=+]ﵼ6<^[_@RͭO;NͶGc/z|Íح-מ8qÍM}XSO9a+4tT=r%oxm7cl6B!&ԩSw?뜻v:Ͼ=>OF#)4M~//Ç~رcyy{ B?^{kQyl-Jӵ4}(m is7x^zʲ[)D6 CVT(UjiO1%U ?93~^W(RdYQt۽6bK+>%*L)=}ַXX<̳Ýr> ~~V'S;'SF}>N0mlOg? <˳O}ӌ͍Aȣ̦3m&3)E)MJX=t_|񅍍˝~cV?q?+ۃp{{cͅ^{=^>d_ɧm6g>48@}8|˧/\\Ķz݊|9Q(X\~#н*i5:̙tlje:gw5eSC< DRHc b,- Y#ݥwOA7Ø!c{bD1`*!x" ƽxwik Yc-)a*UZ+8# BƙYw3{.rm='ezVkirY_w'?3Xm,DB*`סͧ}/>ӿkkFqwAY?l^w: c?ggn﵋TˬbӖI)ds~dqVQ qaS48mrNC9 Q)U&[6^oy]3%^֑h0Tb6ܖle%g%$Ui97˔_B!;.=7ڙQu+"d'LyV&d VkyuFa w'M^Q)ktyy:gҲQrcKXۥEHQJHߏC$bwq~] G@oJH 7/b\Y0VhxFYzvRy#QM+UBF;aH'q"X`,*bҁNҮE]F-Y]]zo ؔE[hzr:MYZomDl\0=~M̕0Z.lY72)6nQm_I+iŃ$9q, GZJb "as8id݈2]t#*/BVYXO)6L:sq]u ]l&ƙW/l} g{^뚅#k:? hyg:{VjϖӍN=Mxx_I+v9 K{ ;۲d]!@Wξb4zIqBƔ0n%9M!NB#p0L=-x< |mE%.{,_-+u&rHu)۝a5[Bhv`|&.]@Q#cY]7EQ쒞Pc9ž娵؋Z{ ̣;NB/ _wN}7"1jaHU> UyZWɠM AQy-֫ӆ-/_zomJ9X27Yp/K)r|_pʕPJ]H]5(c??}o~`0x';v뭷㧟~駟>xRG>M@UUM\p|g׻ޕ闿__m'I/I9MJ뜵F ^(Ef4 ϹR`Ѝx:[;)LVBT8!R ΖڍvLC^QU{AUȽE=P vQ9Xh;k(]P)(7\@q,Zx8;qM>t{VߙC4O UdHZց*9X@ J"zn**ʼv/ckٷzpN8ȍ5mPj{4[vƣyD ;mlbpŖq,O~G vXE #l6JwȏVZ4-LFPVb}slm| V'*lf1}g0_&н/׹ljML< KI%U%(ܻ4ˆl$0F-90 @$Vk77ٿ; ^=cm55!kvVGXep_~x_=yrϡCtBry{qkJwVQZ_tj[;Gh׭CbL vJYv+ 6B#Qr?nAc w}J1&>wvFW.]onE[jFJя~T67fY5D'j7E%wrYcu;$g8F1w={{?~1? ~K~}Ͼ{{[d29 }͡ymϵ[cV3 !=?O|mύw<ُi·(`L;dis ٞ|t+ϟ~ɓKFIkնJ] @xc Dz~t;(j!{Iۉ.kQt;us]Yh!VmUq'0)quyyq8:u4,/fE78q }|;c]l5ț0V<Lu |{,V1a,Q/vJ8>M!OlEIpwS>xO]z1v7ݻ5k|~'g?i!nU ϋW.v:-%zA'd>SD/m:I1DdI)իe»dz݃Z݇RJ!U #*A3 B8@kG>?yiMB8ZU9,/HTy6u~ J"͍miOgx>ƜsœSVIFҺQ!Slͯ !(Zsh^W|zNrެ΃mE8N9 G2Tԥ"ٸ=& x>+ZrN)%h/|3l{ZγI+(ϫ>0L:M?Fȃ/U@3鵺N_,C^i|V7gUE)@oUy7_ sPƘq1Z$dMS ֞a[,e巒8HAE&|L$eB?ΛLF)! i|> !veoBvߓY1U*C 1P+.]_ ?vxp<lo\x|p4}/h/5,V:! =kO~{~y8?>r('ǻ]~kna\BZnoMq B@I6wFY* F0Ⲯi c QMM8p`OfIdvq'n\ PU `hDJbd<SP)]au{;&V_ІC/mKjZqԢNJ8,-c4ai*fbmݤ O?b啽zY"u>>eDӄa⌅8g%,<%Ѕط b8Lx{\]UO،?:_շEBV?=u,aV˜pcO0Ia4Q xjmw(ETHY PE-USԌPNJ$k/]`s/X*ɤahq䅼tE $q^;Q2.Im"HD3 (l3JUuYZ B(a>ap"?m*%ngy f3g[n78ל=s~mcm\6qw9zo7;,g=]\]Y鼮M/zN_zc7ip<`uȁ[o9 I@=sԕKWN;;oCܘOMFX ۝(<ڢ#,5P9@0b̳zck'of(&Ý$~;4yP\I[#<WlU|ax IDATWEZ={GG}Ibxt2>x뇗'I>:/ƙ5xg<۩uI`1~|&"A>DJ]Vjya]^f NZNC!z=1tW!j!0ƞ%Ir{LknBa .auկ~UgϞo裏rojB?"c*!~{!k_{[ߚVgJKK/<[o隕>n_M'/\O<=?@\휕XL%K mK8UV6yh"֞}v._|Us'tqNC2Y'.ډh)ɊZc2뢴A&B9n|W{ w;]]0r CABRBEʊ{!ȣX3HnDyE{f,a餬RB@9ʐ#qfKU lphE1$>p$Y"弁M t^ 8PEØP*lGyQTy'&йB-b6J}(quƵ6FKiBuČqu@4:b%CF!5z+Ji]$(phe%U>RVZHIY˲>Dx,!eh X\Z'kBFш ruNI\:{<+{ލ5 |ȫ=w+csY]Z<|0n;[Q77VBH& c*9)8QЦse[c{lGۂ Íbl}aa5ph0KatdC_=V4Ao}>HLg$~Y^_:Ɔ%QaZ]lyBfȴDZcn 3? T/Zz=+['+3;>!KeJ "F8|um sgn#DuJJ÷ n<]b4[X>؊AwaW68r|ŅW.9/G,&iUX(eUھ<٦ )MDB 2TJiI+ms9)'7nW(8(2aqy6O'HJN@4-3KxO4 A rb`T",TFzCD%Ui q HZI6-V}9V1za-Ƶ,/g".&)fq/[vmΨ^y丛IoZPHY,Rs12 9tWgy,x=0نx5][~ڛuצB~P^zꙧy=o,W6Ǐý \j)p@$(+e^R(! v]KR4`)9`Webŕr9ҙT1 @;c vZCH!stWlf O>1솮ۻ=Ws?׉?K鐪>I%dZy@"?VԵ`)#R0jCBU3͊)TgR[j${D۞d-|Cl2d% %gyAfJi77v(F,(F(1 8W!F;kU壕^p C0H9 ~@ hץA 6RJԪqJ9w»K{:V! 55BJ!s.!%e_hQ%)m6*yi, <8VUn{q?m]GB&P6+}" Cͭ3I$qltIHR,BO]3:Py1ٺHpqu @ Zm5(\iH  j X;@kA:gTz2|1lDjsZ$@@h3IZR V#H*e-aG)@HiqݣG(cOSV#hLC 4PZHaʂ3fRZ:8BnGԕRjZJK6e^fR s4BMXQz6ͪJX-8d2(=;cDB.1)kBQn#` 1R c0RY%B:綷.yO&Ͻ]wyڣg^vg`07u/rǾs[?/}Mj~KGpqs^1 wGmUZ loa{VZKBBk!& h A, !a%+\9习XQ,@ ,pڪQ|q%8"㠋–рRo#1Qhre?g"Ilt]4e09v3σUUP'ҡ/zu1LUʴH"aGq$i:v+(Lki̪э?bQ#zټE׷}kucͶ7I==sas=D֍qK1 F<@!8@0 ZWq2`qt>f$hA;!ZrJA(h{6)2B ,dqZgOh}i@pbb0Vty|*WDDc^k @3[H1'4TzU;,ol`ϋ>KA?B8Nw28{hꢮE/i3]|{+'77БoXWl=~w_xo]}3ygO_p'U&vyœoNfNvK#:8#r9,tooO/^ȋtmb6Xj8tX`rA܊ 0ER& γbgs٤&puՅ 糊S4䦩Wo3ıO< m|N|%qTR6aM1uyYlOkB tA|J减ظzʾ(U ˺U,/',۽D1βIckok홌ǛEsVE4K5Ֆ)jŔAJ km(KvwokS0sk߾ĉ:$ wx`M/_~W{ EQV`wu,;IRƃ,,FVSĘγrii(J)CR3[lf-uUOgTJ)oѻls󐔪r@6L4c t!cuAQ:hzUV àreRUCHtVx*uj%!S (D8d9A>\NJi-FH;K)}K ӝtkƘhUӔ* B^(-y Ba[ԞeY#ɖ+΀Aw1d6S:qן$1RϱWOq"_s#fDqf!c#0#?;룙@dcQaL0BK (# ІA֛nwǺb}#JGۓK? bG,/}Gt,S:H8thAQQ5`K7ַ2;Ay.H/.um#URGrl_Z ƬIůn<ׅV:K ;G"Ӎs PN`|+O/ܭo3/p+LGe1Y36cbGOg@lpX)4̣x7+--\r8ɰt;FQ>A!d4I^(e z49e4!)d~H}QC3S#.ƘK.:t'|rqq'Nu:r@ر~ᅗ.__yqFt=^7Rs]wC?-v0/~W${FTRJR*|YTs!t:KK˳ل`ZUB 4JZ1x>Tey!4H<<. aiU^ĜPJ V,/Mfa+.he0XR#464qr\* ,`(.(D=2jSFQjT "q2k( C!@a~80!TUBԕ}cS$ r4()%m(&~*MCe8eRk2F:k49cTUՍ;mE9" ᶮl.,A23Z@fU.5R-..*S̳CRN`E=hwvBi6JJ$mԕТs!rբ"'^ !r,ZyAUS !v ׾rt8b¡vUgpD)F#B#-k!F53Pp]fJi,8 6)'< C "3>+2ʙF[s@k-g,01{oXcgdʬrMvv1nAV˨/ $nh їFj@`c]+*381=_."]*7BwBc^=\@<j 9"&ӝ5 BT˜AL;+p86b0@,μ_3,2b6y?K~h?uKNer:m=Ȳ4RTl```S1ٛl)[}&F(˺sLnNN `Ua2OLa,bnF[йrB٩8IRX34Sq"'}o{OLKܛ~MA8~vAuk/[7M}72zԟܺZNwߺwyz{pylϯ&\]ctQ.$A^<06'XӉP’ !4ͦy֭rSt)۵((x%֭q(6ٳ0W̙3j;d Dm)lo51ާp/K'gϠ+"$" IDATjˢb<,4]@ sG1pƵW@j")0@RY+묳χ9|. kH K+@ ǎ=<ua|`QyuuUe6]taġ.Mp6x ιB, I!Kʥ@ui}婏x[c~dE6tƳpHݸ{?8d~ JV9C) x&t+.W2EBd Qg'On"2o~-{?~fHxǽ,fONtW)LʪaRmMU5!@QlG՛o/_?M3ڊTE`e%iGf:=?+>чyrg_Χ9+.UL2dgZ׫\*bӕ?TMڈ(Xo۹9mX{çc [ +[v0J'Ymʢ_9gƹtR2NRL0#1% A ALH>تP%b=h$h[ú-GÑE,k8gL@diM C ufi3)%W78=X<}qz\ܝR/t|7t۪BQʅl46duu $16tB8!ж2@&XHM0gc d>@e!F yi(]\pTc,XmS'PApדּ{[-T"Gy"18M$s&I""96pID<Qr !8nڨDuƤL>-H)c.Χi,s ݍa_me9g9#$d q^DXTUtsp@ H{7ᇍrY9svq}dloaA0 V:QHp͞ ]&W˃u:*aBy&8&&8JI8 a\|sΒԒw2fFA/e̔mZ'bks;w~=پ(󲶜'kyS7Ւnd<',*.9i /W#o&b>ouvՕq7OK.}z3.On"wګeSrwgi盫'/o FSUcJFj5!8S36PLgK  !mCYlj-2vܲ@If5PKk45*Ms͛ n޼8Mӫ'$gϞ]]]fϟ߾}g ps'?]@K)Pwa5?"BZPM]x$U$(W4( y'4IueP(%jI( Q#.87!YtG-d gY$ȾǬvTJE`6%G"k %X- 2!s.$Bp#rt.PԚ8eQYXW֍a ƖUmO>Q;` "`ι*5!x!R1J5CkZk:4ͤ"%u 3Ox" t8!4I`&Oqu1F3)hX(TX)8i*S{G6h<@KY]V*4T$`gygF#c cGR'OE$ L!HΔ% UKBʔi=N$5Hƹ .A><ڗ;|<ם h@z.<<'I?s&)Z$CV!j=Ǐ>9ni-֮~q"yNd'&IqRz&l tjI#g:= }[k\tUSbi5ޚ-tWey$+*?T}˟e'?oze86^//.W'ggWWox5WQt|֓S8$Q*8GQ$g./.~~0DTGjDLTX뉵>PBykmY5OR6 !ɉ<"r*VEQn35{{^tܓB"NRL+އ˫,i6:oyqx4XG;΀y-C$N(8NDjl`@D( ȉs="".6YB1,GJ0 B*%b {/E$Z_S$mjsW1(\PpҲ*Y?Vl'Q/p7Uuh`X,$Oh]F[k5 IoI՚%' AQ2HS&Rz:;?ݞNL1e2¶%׵ƘjQbj˳|K^>5qD F1dȽ ӓ*6P (ai6<"f3_iJ2DDq&%_ι,iumm,׭O(`0@Lː#d{,w{!5Y3<Σ1:92`i gE[kBI 6kB"8\egy mm0ȑ4(1`x಩;oZA c(΅ %d;'b% S8B #Ʒwj*ۗv9G<"EQU1tO{q2{|Q"գ ϒa{{={C<{.☋nI6`2Z@Z^%9y[|!h-l7Y2p~)bHݢ\d)ٺ"S\_2I⢬ώ 7;gі 8LXE*TRUEUon)-^PlJ2Hl4b[c#7pK]Q4%Ew^f -֋jU]ݫoW]?ζGok< PY$;wz<1YDqc>VUu jSoQ|=>>_EG}49u]?~_.߿ӈ(g?{}Vƌ1+. Ię#-:`BɎ rN 8c5g2NnF`]o;RX.bxr(Tވƚn4F)咑Dۤ2eWIAk=%`{9V*xg(jO.ϕ Lw8drǏNWl=[" ަ1Qp{ZggsmX̒;]v_z5:oOH.ٚLOOMIHbkH|x>zg]o_LY-#Ц IDAT.y~WoӾJ`$R_~ȭd#û.xUmLIu shc\A;zBBBmY][2p TjTj@$H@5G ݿ9H #O-[z9|t4}>L|/Zey^+ˢ*ًinb B;\"\Y=J&VWv8K=$꺰]j՟N&ӭ7YtA0 8뙦Z{yz,Wt|| vԆƛ6Q8k$co|ODZxo p(t 9cpd2Ib@X>%!#buGc9\ML"n`,"yr! LJ K2 9AB"H) eqh{e^, V@al\1tNh"PXoX.$ rD oDUZklMIFB/{A*i:UuDIdznt`ҳS΃ȄL(-%bt@WgYj"pǸl  2A'Ibu0D)D\pm jD9GdDסj̓mDZw$5}7ɃgAJ܆%BZ/KAD?6_gm9]'ZQW'E"&%U4,-Oʦ&gN*Z]Z`D(ΔzY` y'5""9G`U^i5JlsrtyT56z,|#7 ~\0[ktYaucX4۸)F5ue[Eamonʑi㸟;s6wQ"n.Kݴc@pv' "3{| z4 FcW s^4sQ`Hu4c-u[q@sMZ/Vhcӝ7^}|-hQr}{{ʳP:)9$ #ZfjF^eHfC_gny4Cӹ+oVt @[;z.|_'f6Hh-O_vUNݍm  ҝX?|PٳO_aDa8&jY5g^:"s V zsxMsryYZVh8s,RA%58 9$a(cqv:ߝ.E+0Frm Ūy+v|"Ws4o>|u}U==cqy2'Vw]X-C| ެ(ZCc(Z9@| Xq~s|?9 Ǐxx>~z1I+ğo ,.!gU]-_yD1O7M, IK>;=&>Ŕw"z ,b6 KRz\>F=j0WM}cc^/>{8qi.eI^^q|vg'W\ͭݓjŃ,ۈe4[`-a݆RX 'W{Y9V5!OUUU aAB(EвJÐ@^ DZHDb@JjK_{;7>m^^h4Fn/%A^-B7ADXĂ,^()fy*J* xl.pkWّeQ8f}dPN/^Uu~'uovw&C߹y=::A }Gr1|}v,$.!~Q,"ߞ]^.|rB/;=wGVm^Tq| woxzr?6- 鲋G{nܔ(mn(7pvvz@ \4aS^\͗q ٚy@Guf)+QB$ˋ"{tGE p/0Z?ճv' uQ6)rq6OUՐ($ݤ9A^ۣͽrr.YJ66 YDi7tz~9EY,Ӭ*pQEaЈ0,T{Q[olBI!Z퐑V"L,ުr16UBBtZE.QRptjW xD Z8M Ag!k8a NPVJX.aK8DN8r-Be@ijYИ Q_4"_tLWb|ckL흇Br^O佖\3t A=lj`lRUu9G<`Α˳Es~&y!h2W*:J)0$`w;2n+6"Icv@dI-^r&Rkŭϖz]R Rrw K VZ4d(ڻ{э$L?~P2JQi/Tc$¶/]T+̺"*V8 qQ899Lz: \^u,s ?ܼ|;oyd+?=l(lO_ίme0 x\=?i[w}8oxn9;窩YH%wӳ+'twr{nYM'/qmڿ;꯼-\6.odQoA]AY'I0R! C |YF"X)@)ᵛ;?ï嫾5}y㫦J:-zWo&.ϐeIJ!¨kv&!J^?íŒ894 #1ʻ_?ؾ'WVW^ D&=۾sW6plyu|8rڨKkvִ@¼۪n.'Ko0P$}s@9J߉+GzXݽ{m"8 q/WY7ߺdV!wF7j[-ʲ7n߾1o?y~4Kg{#4/k DShrhדvok8.֧ o4v"n0ibSԵdF!N6$S#C(ꆈ^vOγ^N!H,lEEb`Ax˶(WgW'gaXUGaQ}J#c슊(YMo,pʗ=?=3]3Þ8Q|s2K^wU٩ls\d-.f z|w{'ӳ'e1֩ 0K``WiQ18GaN_#{=&Ik2OcZ$u7Ue `T-֭8={Q% o U7V8U+8I:qmezhΉ@vqJ}3e# IDAT޻{&,6s2r]az`wo~ .g9䍽/>nfqXں9, CA@B`)JPNfN uNoi̧ܱ#ot* Ѭ\(q4ִg (eѮe3 XMK'ndFt/F#j8w€l=9=kOr)zvWyvw.{)n${OR5!%{_M>~B?X/qpoFyq%R_(B,@-D'W3_Fo>8k{{{n?d14v8@a$ }!b 8([N.M⭭ w@Yar&e}6ӧm%=r0cLwaG͛V g͍Ϯ^m0%7ӌquH,׿z| )o v4佔M_WgZ|1I/H?B=yk_˗/Gbٱ:NOO^/_Dݻw/I>޸q#`pxxxppϞ7^g.%{?#~뷾vp'Ug?~>Wo/zwnpى](FI: $E[E'şeI{uJ n v׵ /VM!ׄƵq9`)m_Z3//0`FF; $B=H)%ΛFT0JM-vVzaD8Yz6nnl$Ibʆ:ï|+7˲|ſ˿nt:/_nnn޸q#M?ߟN?yr=B|X__/?\گ}%Mn?`zKRe9RZd,TޅU!EELBXɔ,*`"cZ)1.jy/묖s<2/gc|Y6<5}ΩE)0@KK vm+P }΢\UN=vQA#Z)qBN_ɲq Id,Y@DmޠWx ab`+(_wCOB/Ab瀃M+WucUK"0bQzBLC 3VcaA7ƛ}ϣK{yӏ"C'\9C&.KlhVI:t/ON5M&1$ubѴͪXb*=z+[>- B>o^C}j*9Ob(MjΛŤ{B ]rQd RƮh68޼˗/8 543YyR颱7Лi]On6ih7!Iu+1f8N\/9uIYzffYz1YxqAOy ƀ@O0JliX8S YGJxЧaDƹyY lĒ(WNqrq&aSX1$q.,ݔmgo7D"0CI17ɭB [7v DKyOXy u]>w#{;3w^,fƹfqks#_&΍&gZg,@`= @I/ m)%fptP{p^Cz# $2`ty{R+Vy["Hh:KNbV _./_1ƶYFQtav!7{;['Gkx(2[qwH@#~ڧnFn{x8=g=v`iahg2Oz]yW]qJONRh%\!ixAzέgFf;<K$c @YuY )mӳޑRQ*;]`+J+ʘ)pUrմQs k.k j1m)4|\oNq%,j+6Nvx\|KZ"hr `ʬdg8Ӧn(MYo~;Ӯ4 ƒtk{0 Z9R㻎Ţ& mHGN?oo/ba !h4z뭷sN{zޝ;w!a~GO=׾_~ҍW^y~ cw^/|ٟq)Bȕ7`~.cƘ IDATʲϼZV)@0B1@7M->Fb^!j1`L5RImZWlQo=i Bn?R6%'b<9sNo'YaC' |k0-NS"AavÞ5)x p7B/YvrZGY )lk1p ^ 0b Ѡ;0՜ɘcg*j G;Bm bPONN B!J)e hArr qG =؉:!%֋3 m#a'2Fr^c#NM,QDI6gcT?@ k- 2c,Z2d[EsZ(! A`X 0@īVkzвm[F10Z3I1R Z i(!e4#D >hڕ=j w\ &m@huv1^,Ҷc !|8PmrSUZѭ5ДL eF c1뢿AV{:{82S"R2]jCf1~H$0b0X k! @B-BB |aF 09::BQ>{@Uamhڤ ȡpƮkE;=]}ó <}ʰۑJ?~ ÝX(RatDώNomI& nO`UA6yH"! Aܽ=\Y ;[Nj".1tʫG1lf\bPey܉O Z0 bUɩôЏ=J9!i za//t뎖/]gӀ.`acq)$vpT5q@"J C?۪YI#hQSWU\'@\P裓X pҙUM{H y{q#J@}lke$X),]JZΙJHFJťj=s)*[d2EVke>UYh^+Ѝ: *HJun;v&#ha hVͪr"picsB  &fd\VMD!`.)JDeݡ:8tiP1ٛouʗ~յݷg>g|Z۝Fʴؒ:0a\0 RG!p^֦Gke 6@Jk0>Z\0z+waV>)f W:!Jot" 7Ey {Uo :z!هƔɀ$; !LqqꃃAwEab!į]k=ִ`&c:0-U񴁼0t<~Dh~x++v??q=xn!\[[;{W /_fY/g? 93/rN13/y4lsnt:z#@j*-Ľn7;IO'q^|xpVJ(&BPSo~7 zX\)`VvIwuxDahytGS&dyUg5 y*=ّybr]F~pW[g{+}ﻱD SM,ZÅJi`Ōc<'vPt^((F5!%gs6].f84 XHӊrRIU6^93 9FA4>XhXLٺL֘8 )h׺Ժ+{ |}8̧P%.a`daM! ;AIҵV)- "" a㪒>ZNgBյ՜AQb(ZĈXcZ"h4為#<RB?0 mR_?? 1J"@1bRMY˛WĖH!&)k>[-E_k/A;Z+)!4j4ZTZ)'VV Wüؓ@JK@>ϰmkֶ>@?/7?O}YVP`ac yyL1J0OJ[\F5{ISk2wa aX}(YK. wMK)1rww{|<˝!"[kpApY8HngwK/|UXGi}oF:gB1XeUsK-l1^LuóD^Yh4ڒh9z PL#pok |Q̊bF2`ߏVO0&\4j^fg99y oFJO%GyYb :k=~2?<<}G Dq˨ aX/t:REK#%8oEt[IlZ6*cK t1OmZ:Esnk-9Fn~r=9)D2\u= l*)`D2nE P 1F@YفՎK܈3i H[Q7Zi2!$o[!0DHEyMP6n8*Tg'+a -`#N{]s%qnc4ܧ?{)g[o{}gv=r}c3ͭ^8L&{[Q]_(!(Rc0ly ̠5-&љ,S;o5Wc*W'^yiN o'@eEm,JCT$BN'<䕪5]\[<.+iF{m3qZV* $Qjc୒91ٚMs/n^x*?m?Sm׾w|湧{IL}NSAKomgxBcx *p$WnsZ]s{rz&vORhHk5,ru],e :L#|#'Nw~PϜs!t?Ht6 q47bDJ Ys F껬ɥ0fwLxptR jYwdyuwaBUu]1;n9f^ ǻ[MQU 􇨆Q8Zڿ7Uy> lN@FvIEpDZ7~quo|?iI~E"Wkq%.Tc uGV0 I$!6KDOh[Cb ."n6gg9*T3ziNg2` LIѼ1ԋƖyQS)*lW`wkѸ v6Ɣ2pǫkKڴm,w4=sqo1O*]BP7JѴ<=זiSmeA*l#k hC(FSFC hckX:IJ)… o{oE!Z ,(LJ n bF/w=-GgYy+s>+[APpaP2Jj ON'C (61QU2s )pYheYC59O_'Ot<9j/}I_#r'+tejf 51=P 5*t}=Z{"aJ4Fn~/ټъj8.1y]5iiA@(&|) zѣGqB~K˺qܸfץ7y~dJK׮d3AdPw܅hKQ&Ca81͌&Ow<EXU4BRй<|>8 ?3RiI[ ^<Y u([epsڪJ/OJ670<֎|[gi54Z C¨eDĺK8bM?2Z=sŵ{dqxJeg0M̴,\_+ Yk۟βA@:[!ap*zPj-T(QR ~=v;ӳiysRccR^7Gؖx("Lw S:K!BX(j띤gË\_yisd#14tR76*h2ggġ-"^^Ӕi!{ .aOLG[R毾ݸ;w?uM*AXie,z|6\ڈG vq6n*V<۟ly; ;|w"~LH=nvz;o,.OѶ@!Z.VsifQFFBg{S%Xlgs|1y,ɁDBP&t+AE1AP} Sr~v++oƿ8{AKz+ŬѥK@Cv lvje4\\*-UʛQ݃ۇw?g>g:a?r#ɸ=oN9 R = <+[}O5zUUNEQŏ_܄w7ou1N]0U5>界3,)p"+I!LJ@tˢx (Av鬓Zqśokgˣa#__O`(b-P5bDy*W[ۆ>[FQh!B~uq襊[)J+ug] ҍArF,RD^ &lrVz!IuUyZNgsʨU{ⅺC77Li /-梑kbQ|\`⬯^(itqt2ƱjG֠In\~%~x =Zq !JE#<u* J bl!BAZc12 #tN Z;peYMf|cZYY_'_]^?W_XN gzA* bd-ԧ.==@D.i"C`!ǟ-nz>7|wuݣɅ !y;n CO25@V)'M ޔN]<.q V#%0Dh=+''nפeYTUY6ʎg! |/<l(\tmgk~&͇3u9ojAt["+ekPk\brD.sðBB!MIYsYIIg56biPK8߾I"kFqXdJ!څDN/ Hu\fEڅx4Ȋj(BG:,gBǗ49nf2:%.R#4F\L5hX, X?M^fEh ;NbZ)4hw>q1Q*SRT6me9r`QEd]dQc6UxWZ-МhԜz4q{dű! IDATS4YȜ NDm rbX%@ieNHzyn,%k3۬ʺΠR<7ijD>OC q)p! B*^Dpw7X7"Ŧ,}JbGw'k˚yZQ6!DJtݮ1aډ=p_۳vF8m%7.{I>>+z;|˗Wܸr__}b8d1ƼɁx~?<>ɌȺR 0B ZbADb&UH 2';A&񕕵F[~r7|>.eLaQ\6!JB0^'uf7GhcqPmyecpyi69 c Un?XAg٪BY%ON7/,ol^N`3_^ۄ6e+khkGt'ZH\x6O!i1[Eg 9b@?fU x7=2tΠ@)-&!\s)"o8su 7kZ{QnV*k纮 ϐ:aq0s˂SQB`e[yl0VEtq0 #bG, 8;LLcХ/|Fo~7__y繟 < 79ѣ=nYzSl=wame1vc؍g/=< :#'k\I l&DQ8ܾQw\sΣ{Ȑ4Be]UY8aH EUmkIT5J5E&],3/OޟuA=)FFɰee85m ^βdxwDu󣓣V =:!\(mFhUJY1jf}P.@ 1!a<T/["< _*}|!SO>zh{{ S6hFcz&C &BZq)mNv_:YIkxZj4*tz*iLûA-L Y*JMJ}HL~a/^9kh;wn0pA@UݮWk8M bFZF1X(PCvǮ]-qQc-A^n._?t =eG{; PV B8;xp7eq'{/,oOy:y2`5IƷ8=H{6>u'|jrteͼw09폜(([ q(jd[r:'6>p^×O:LJ.ZZZ1zANY-[cbI\-ʌ`X0q~ +˃0VU5 t"Oj,J]M׏;*tվ[ '_nȢY^B#':!S5T" HZǡBhSֵcK e [B$7n\ӋMS+tݨ.d6] r!Ϩ﻾ҲX+K+"hMݪ6Kz\VFMcxJXT+M\4#C ǻa,E2[`FuTyF*p71) 0kt29?E|&MJhONrVu@MO7>&3wylohe+hYH'K8\;noϛӓ`1lz.-7zk%'wxck%)>}YJ5DkEL @9(r[A6Zc,T0ZA 6Z \Zt=W_z郇P׋ dvzqtJZ]_ۭ F/$ ('jj2v6VxQ%Ek;!\?9>,G~!p`sSڴ԰y,wuITg?`wv# C(mڨMD4hO>1síg, tR`?ǿb2"eZ4imMQmnQɄ&R#-Ul\}gihōu[mz:mS CאC ylǘshPb;O\{Kuú99Z:=rHn52?q qGlnPQR1A5c=޸ww뺎( !b1qcLE K+{pדdxbGbo4Dl>=;⋼X괪;k1+Jm LL!5۶Y YCwNbeUנ]hkW2ͳO^|Ks]S 7pcR5azIq6uVQ$Dp߫7s V@a0<-2p5`1L+9ch=GTwXX.@aBHl9N=oqsE oiIGn{ou4r! 0ev I߼JíO~Ï?z6@&`wHjYؿt>PҔRy[!T+`K U e1bPBe.Ja8 V O_9`G_bJej@XD[ (b"@1vnys.bu|`;NxÉ:#`b<SNMo>_ok޸9(`2^p}4 wwokzpitVu/\P1o5tW&'L L uq̏+2"sḩ,->>q `hT~D)[*]Z2{oK셧~󺚞Qm6?ۭ&3@O,:p<-U"gCxYw@/FEaf5q{ސJihjS$Y$Zwz*yS]c\ډӔEZ-jq̼!BS y+ qj-(@X[{v94QEa0FZm,(4ʪjz:BvxLgx!D*&rhj5tNd8hY+'$4B U!@RY!,]ǑHpp<-[-b&eSҶ;ÀƪG.+Q'jDm 1,?FM/mtteiDo󍧞~wW6o=/[ 2C&ƶGLJ֠jCg(5Eʊ2Y ؕ8V;R~6mWݷxl?3w^_r6sf ywkջrtqK1@3TzSVui- ˜bJӇOܹf5gx]=Y쏉cTu5֒Kdsx[w I\ϷPq tp~|дl}c3V誊~g1{˳,۟l6Ng`tgEO[PH"ڍ [qZ:ڠ@K"6w ebfˮ=3\lfsDfLY[ V-A!1pF!Dq&{oyk:9{lҊ$W:@Ԫk}٘D6Z Y"g f~__ L?3 z/>  w0eYU8$EiR1X[ $MKA[pTR!^^[QJjHcA'ӍskQZZBL$s,o~KF g̅ն\xԡiY/;`ct2 ֵɥ4PyZP8}+j4 Aw?x&B}ZDZyq[k]sqR^;4Z.H@dD m 'JZX\WwcW::$Jyr_[ccF1F #%4dc1??C_=)0 ˍ@hj^a DPRXKRJF[8cv>Kƾ㗅\jupv酯F QiJaqx/>+dJԶ:gǟϯ_`HIXdázg+=ރק8xph\/wnH֌Mf80 G`^9ʵ֥”E ,l1 !l0/fyU"Jfr2F:.'dВv9ardiDiJRI!ԐZRU4[m|LӬnHNJi%vSh8R?ȳR)d<^ȼ纳(䑥 $!, ^^煖9#$QiHd5K0Uxƨ;%vpaYNTd[6wv[7^D9i+eƆ49.r  UTYj5H  Sk}ƹճO5.ounͣ˟~ uY߾s xxzl w66)FF2.r9eUb 12N3, ,aTQ؈kW׶G|ko>xڥg0uHicP(;M6EQϓt\ZS"" *SO=uykrt::YYBuV)` yP8xӋvߢ K&;x^\Px|[^:וpJFZU*% a` ~1*ld/o [߾}=gtoe;ﵛ+WtTFTR"ڽ Œ*07zy,('%iijO@-8"~KeE0Am9B/?s'/PReyƘg`-F2bh=Uy 1Ęʕ?l>.H l}?т?i~!8Y 1c6h-˜X?p&ZQ cAdUR!<.B5RcV.;S)ZJ F̠.1uԍRzB1!Z+k AxF1kS!X` 02E2ΥHPhV3/_}h۟2U*'1HH)AP@ƩRRBj8~yKg )B(" $B-PJY;~wmkQ[a⋟ݻ&eet\E1d7.-DqRrFia iK)-4+uMAh1-8`:9ixMC}J1:t#YyWUR{+O:ǜӣcLx8i\n\ez*~~ݵ2&,h46FF%nF(`:`b 53d9"-\40Pj:Yo>ޅ?o@yxD)}T-bm&q$Ar(KaHXR "WUR_X"Pc DK.U Ís2郑աB/\8?F4zrh;+X ! 1f  'IZW % U.^K'o vz-3/|޽GP۟֞Jn۲IۇӺRaՅA8 (K 2Z̒ZUMRs1_!Y`VF8bmQi2UqTҪu]q(U!բJ4],ȟo\׿و}xb:dឞZ,"2J".Ca8vPB=By=7h$emXawƣYm=L\%$NMViJʬ(zO}Yԟp6H0j&"'6AGTE]WH>4 Yc$5k|^(fnԛq#~8弜G5BۂBdhU6r%^s>Y̗Ib#tYxU2+u(K2 k ǘ2FJ<)1kEΠ]+9U/yi~zx4f$[[rlTN3UQWRB+ |b*bĠjaōĩ.=,MU# "TB7E20j$,VE,mu;j<ǟ]٬,se^xo+ B\ 0ЊZÆ[ibFUbJ)k06}b逬H,8 p{64BD)eI !|x/|E&/M^*E[X2W"|/lwgI~x.lt<`#uaOoƯr/r<^ݏc[g,OaaQ훳4MƓZ_߻ta(ŷ^ ;&^y*ɣ}+W{dU1n/&;Vh!pe >Nx%k?zjVZ,w߹1N?.viw|r8@ VRu!wNYUx3mBZH/m]h8_`~ @]i!W`g*@h[A0JUX`Q@*j, 'o3x8{7ݵ)B tuCT,gq9S&yjD'Y7)&Aק xw?x K\췲$w{;[]4IELw._lKt4{?靝Z:''2n`4ÍaHJq$u]8Y ^I)/n\|N4sN?Pt'>M rU7TP|?«ߺy@^DIZH w>{!`Q{3 ]<#&pq:Vt-+UBY);SyILtqpoyxe)(YWjFKu"W+?y߆&2͛^8K;No̙˯=X8S@k#I8_o8?k5C:t j/<{8߹n4# R7.$(eR͒b:(l,%&ƋLA0l2۵oejUU6FrɲQ ZC<.s9Yݿʫ_ |kWG(G6[N?궃jJ6ڻՃ!V1yrp"v6a*10<::zNýッú~M)]BkY1XoZ?pmE6nFc$>jJeX. QeY^%fT9{#WϲhGzgIsqUK6z~Z1ΐqL)Bh=_+׆'xf6)rN36 !V+JkFJ^ݼ%||L YAzd)eY:ȼ ֢9!9!Rߏ\Xe.8E]͓7Q)?xp'ίߧݶ8ABhuJB)wgyQTe&F.ufs:46Qo rw glI%cRV>AYSO{7]_g%A.ffdEnuZ^BD2+А ,żbT~Xd^Ǚ<{e!t a 9Zk6bV\;.R)%`llmmz]q:Z[[A3~3vo ]1KE|, RFYV<-G;&_到 NIfVfLz ˻ 'E$*&6$7]UܯU cTD$s/WGLGdyrt0JR :ͶD }urS$"&K/y(|X\\OK!*fZH vMs2Y #f¨HgcZHK:תЦ7T g|*9]EX7.Mtו2m7 BjKx > _.!WDhe 2LǔPTJ[!M`2Ik.i9q 6PZJP7?Sޕ1̦cmv.<{Ó4KeˍW9D #VJgpdiDϊ^3wk5GGVI`@-~oF#H._4?*NzΠ~7U[\ʷ߾Yh>!΅ {C( Q"fإ}7XGBB(eಬRRLbكԉ?r1ԥAIj+Tlx$^FVe hYQ#BBJIZ+%~E[zq%G<,AD/l}+h鶷Η\cxUj``-T( N!Zud.S;ҕ#mZ4cx1SژZiKS(Z%B*UU*B3a QV,VVpbq3R/K2i*-(A:~1b›&pP 2e C 2P>Xyh4~mnn}bnv Xr0RyT 6%rz4^z5ot*UZ 74Iʫ(J(g?ܻ{`Q%reIV'}bk@{p0lZ*hUrթ0k7bQ$T p\ק()6Ԑ#[ˠ6Z!6Ad5 )IXkBi'duŋa󍍍rl6?.g[nCʝFs vܦ/]ʣ>mGw≀\I:܏|&jBa)QEۿ=J*݇e"QHjZ'nSDmY'ژU2hT~#zO#9B QTki C d<~p/3b8ۃQs]) s *(Ͻj͇C`8kLd`` 0ՒB `0)BTV}hS Zv ok/_xxxpra)YD`fJoa V(KVvvrf= h_C/^8}w{tx|ܳu`:==]r`5&~om4i(p?I [+`9|tGmoͫ'.oKj=H#(ևU L"΄XjzB(fd3Qe]o[*pg0_D/x ,(k\,xeYf*cjaxF!4߰A{|i={^Y-|v3kZTQHQE^3 Ds=)8RZ8aP G#YkRRIv^F2(BXeFh[%)l k!8zCD=EMdZYB94/jԵ6E,2Gbl#l` YcPLEYyp#*NxYה{~Z: 6|8Aȱγ;K=*e`4 2MuQUUuڵ,s| 綖 A ;_qs|ѹv'|{yD N)'t% bets]82,t*cm̻B]o~i^]\:#DD`h6V˥Gl^. Ajs3 k 2 l]Vj *1`fEp0rNP\[\ j le{Yt^ZqltX/gI`^Z>c|[7޹rwwVN\LʂpGgNKk v6,I{ ;x(uXXh!G*] ~"f<<Zk4H''s baAG/wkH1cgn3 P;vx6 11AHn=VÓ<,^?Z}G{[跚0 eV~/x;~7xͻ[z5Nx{6rŭg 0s! <zr䰸w{2Q7Nw8a5e6ǐZO$ 0a>Zk흣wopt77v._^T%?|CnP%xhXL$VU !\.5PK)kQjoKk瓢<:pmΧr%HϷ>.$)o6b#o9gu.Wbgs:YŌl]3V*4xJcn\}QTE-gu8ʀ)@O)C+ J+ɢshj*S 6no1fj$"b!&ҺBL t ]N  5I+j҆hH%tJ!HU&ǚnrO3 j6TSQgQ\|9-Ï^物 *nt:Nt5/5؊08;j)S#Ud!c蕫o LŁTrzr|ݵ{Pb4OO(l͐{wNG3qva1}e-2h.\XoIk/6..5;]2U"5+*xR`"wo2IN }Tj8Ͳ-˕/?3xx|,|WY$Г|57X.$;nxn LVuVϸ\o"ܵn KO.`xp,Jr0Vhˉ˳tA=g܆%0Qbr'n@9h!;:uN3ϥ Ӏ9$).-(sBB9f, 5BRJC+ڏds4`6^Ђ^i}r:WmUˍ((BS *A9Ck Ψ((" {"3`KA(cB\kSBTF"ɖYJ%C \iC)!v(u:-BfQԶU \ BHZ+Cй@QAYXUuU5Z^`'-G)xAH IDATM(U*Z{Om\;{C7]&B u4aɃ4nh 'K;[ۛO?G,65Dk( 'eVI >n:m3=siw`]hXYa'*5 2IUA}]D6Bd{Qy }o% nU1 @@S>FP #+jYCb5V:Xk !<}NߗR IZVf9666aAwkAIL J 9"yyM q6b;Z[ch $"KB7"ZP ! =ZjBr1eՌ rXLHqVK'vg8,C0X BkOweGyjI"ߘz'.&mr'[wg{mk/2kz+_y1?}Lh?|3O_{|~zxNh[V7~KŨ$»{7 ڨ۹3~67˼=h-dq 1=wF$7ΠѮ{Qe?mgKg*&~R&ckt1{tO(M|_UVWҦւA׋>|feuw9mիWz(6Dp;G  @|Al B@HfD$HME׷[m>Ig5@\-^0YHUR fjUtUm1Q@ιiKiuNg{[x4ώјB-,x% !CBsaTU-r U 3)(Z`Qm=jy8%uZ+J~k7@A.Osg/_Qd젫NYkN/rUw7vIҥј4n4RmYcٜ'yBZv>=?Nza\GGGsO*Yd9&hqYQZO~s3yǾm l۾ "+=GG]"ϯCHBuS+.LX!nKwhXk9?>9u!8/J?4M$Xm*){MFbD*T{_:>:c""嵵PZ`q;o>X@_Rg}BrpԷm˲lI$=QNtF1o!* Fl:-h^ڍ*?6|_Kjo -ꓟ7{ $y,OrR*3He%P"#Uҵý1';ɟβ)bQT$|6۽x韼/& -#a'fbϾ̓iZm3 %ja1 N~t! ;:<|EٺVHvŝg?~c#JTZTeۖ9~W)EUUu||lY.u]s+]O.7Szs3N{8Υh[#,(8B-MTlZi(V0\eK(m6ϊH b2sE ;m Xjuwu_(R੏J6P0CDcMZ ZZ(alDnoCDۮcs)lVRRB`AQ(RD@Z%U qw\.If /D73@gE1õն&"NRaCXӇgխ{TU,x 5 MfLBc !n[~zz97ٛ^_a̱k ]i"x 2 (0BW+uϽ~Fr|d8삒%"ϲiG4q4nAc_h˲i0;g[tV/dI.\ ]B@#mg1@lnnY/fDIbk|${6߸>bu1 㸼驢6Q6@kDQ`\W>"ִc^uBȵǂa`5G{q~w‹|||Vnz*Wj慉vg-$uQ;OYwQCR+j,wllY-,J̨7:\_{?}g~WrtۻFުt߈^Pd%h-8qeDmՒCJÀ@v ڈzg/n˟~%m4 #s^o~W.oׯ޹}3۱q} D?_Y4\VCw&e^zn񓣣MY;J"`˲j$I2̈́UU}qHW=sRK+D%aZzj&SRPb 2L!1fm BXsZ1ӷ\VUT{zOהRt:~Z-{"˲n}"%N41]~nݨc; .ϐM6**40􀒋rN0.)< v]ι{&JV@!m9Pg?|W;~ ׯY< ZRv3hA;JӟydyG;42@i`C0-;M5H…%`?,x{xb؈^~>/}ⓞ9GŻjN 0DJE#@ ;4~lApUOOVb5[A^5)s_3(}sc .ï%4w{_ص"?yG\NF^*6JBL׍:Qi2M4 BA3@#l DR/]TV5?OA(noAдrl`e9W.pm[ 3(`ZmU 8 j8RB9LV;$آǏND;%i./nkNtN<GYUB('EQt3Fc Rrx7Nl\W_wg6FZ\PJ&q!XAanmm?;B\ﮯw'kkћk[WU᝿Q?? Ndc{+>)6C'_:E.2Ң(iV~&rke{,4BZh%w auSMɵ1iU\677qR0b3P%XF6 /j#q9<s.n]4:nM`sp>jms{O+^2/<ϋls^1, (Iر#ojgm =|dѦRI֖j>~|z=Z;BtfBJTPhi#YQF. 14-D1WZk04`a] P-jMU%뽍A]:"h*$І 5LTH (%4JS0q|j[\f{[҅:iO4f~}b[ eY0s-d޺Q 嫤lj\ӳi2?Vv59>¸ܴYī;§\ʏh | X,] GwAa88WXb4ɍ/x.V޽;,F2.uL) plj_d gKPymeсbE٪@AJ d1#ojd/+˜ "Wʴ AXKerϾG׿p~Ͽm\1D 1 q4( 3}$]xB˓J==j1g\Xfm3 إC(0<Ͽ/H)py CBė<^&8J!˅bp0#0GZA")hP0A J͕J2C\y:'"ZO|ތe "X6IcРJYnr͈,+&Z*da*Vyr)erhQT6dfH|#\#chy +riCj+YT̡-2.l1J N hM)a̳fZCݠ49 IDAT:147T&6sq0RVhN0$RZЎ͠%1*6<|,KookܧF%G{Ý~t?{IzZpBʺI#,181il2lP W6 !T2%ݦn<ez2[]E ȡ+Ѵm1A=.ǫ%n׵ BrTB2P[AJ#=B-g СZI-T @!D#4HI)?%^vp8@z}*G ?ʚIl/wG7.Ϳdi(/OtėuZ7$8{GY8=Yڈ6,;wv{?\xcرa ݽO=((ݔn:oˮl6ER6\oq*B9oЁ51 YhJv\ӥkdmebD+@+!2uSVq)h8^)knAs4S/ U#Hm=BS"<8l<5M竲䵲e3Ӄe_6s|ՏKf`۰ވރ8 __|/^ Rxdrf2{cTV2p|@[Ֆv}e;&y ,}ʍ?ӴNllo_}$[+N땕Mq1[Kb$5pH\q(8=&ȒP[0M7{k0:Y4VP!6pڳEןŗڒNU* YVr4@e|!tad @[6tEk;Wo.fxx֥rąi0YrHT~|/?}Wܽ{SgGwҰSmRlm\ݜ\V7zc'm$m\TC l;ع|EO}MY.x?>22w::N\Þvwn޺~.p7+_Y5~m F3D-JeI3(O}sqΎc*sn=1Ed ڋ$YJ--<=E)(nܸ~k_EWuخ:0)7o.[tED3,aaq`9d0*l˚"L "EBBV(dka`~gsEbA~o *`c;؊˧ AaqfѨmFrS(6fu`mBtJ.Vz۶{t2P۶bѠ62<暆S^BGs @H `Oӡ9o%k!10mU=_N%~Tg"k>G;Xؙ/1`"[w;@P#!Z,/1`eiD>A:?[GJiE>'0mpS{ ֻ]ϲu]y̺qw4ݿ[,$n?>ObAli;Mv8bAyvʥg.4zܷl56<ܟG/RyQh!VAEyiS޶J ( gb%20mS9Fβm9h{k<0ZI@:, ( whIQ/VhgS keR4~ЏN&sӵuaUD4K\ƶ{v@\Vew<۲|fJK ls%YYJ[5DmMNT c1xЏ%0庝(N*O:"LK!E^55G|!yC⪉Sil(%`vx7'Iy{ %~xInέwnލ!zM+&5}“w2iWs ,uސ@,_ݠ⍖jh^UxE-raہFP /k#*f׍G?z uv9k''"敉w89MOsW^8yd-}ٝ/]n{6];8ѥMb(ׅyiM@d}8^-EAntJjUwۏӂ+uѺ2_Lg #RU[HվWgQBOZzQ c{GSeжlL#EdD)fg66D;m +;8{s4tSj3?ZK׆×=o*|tv٭ڬP+ Һn*10BJ[*j)-crӯ}SZ}fjh b >z~ύ.}W^~+_ݻ޻ux[W\sB>y޵p".K)8ر D, Ң [:O4~0ih7m/b?xJ[?{lO6mZ܍YO?yĸ uA ZtUӃnC mu:[ndI+%:NǭnyYk6xy !6e  ^'y~)1غpu7I@Kyzj#?!6u4X. qr<fWecPk\ˌ_(RJ}|Zw}oSy AB@)}B.꺦2FY\5# :Tr39V d[Ѵn5eTu96RFi$Q9i (e(w}cm~̈"IRb1i0&ؖvlж"IDgI.¢h ^qBHmGݨT7=*GR*)ZK7Di) BO 2F@67kbř1I.$E}/\ɍOږm`9yCx0<(rͳ.U" "Cj6^"]Z}-?x_ʧxڋ/>9oo6lDo&Z?%"oN[[m͖(צs>ٙ<~| ǧ'q?*s]|mؠ?:2oNY51^UUq2 $Z+0ƾﴒK-VJ]F>")Pʸ>vysļR5u`+ي|BƺU>lG>l6ҕ8>gv<)^yQN7Sğ@B ۺrmqAaZ*m +,;tmgQ/:AL6>r"˥FvlHu(5im a&7C5 :8`]7b4n HrCM$؁UU-XeyE{֒!}7(쏂>a;T=/2yy|VIPrMqcsz9QJ-t0K[PFiiΖ RvWn8DвphYr>FH jl`3\Q (yb{gjj˟퇏IZ ೎(,/mO&++糃8y5/O'/ u667^s;8CjxXAhhPzA+X%buWA4K)ELp`lúR46*@A|ҕ2545u9jU]BAvr "Tue96$]g'%1Oןyt<4 a!9~>mfӶ2yu"Rč|b[F(miphw`L#4A޻q_ˏΎ|?Cfې2޺{Fxl}lVy~_on^,DJBw|fRWfy%9vF#@#Q$"%*#Qˮyp'g$RҔh4(`sw{'FRmUg:[ jG@Yn 4A=ٻNnBVR4J'6P@mz{hNݝW*t7R%%lͼ3gW k:nfEFq)ժ)A%HOz>lxCĹN"ԗqƅ &ЩW8 3XhTVbJ1BI@)B2&cUAcal:q\m6*skY 4TJeBOLդTy1IE&Y TTȹ@9qRp xݿ6 iFyTJggۯM^ekdQHHTFR)a#˲$&9H#s0K4)%"I.*gaؖI Y'ejѰM@K{l o_LC 參fYX!ܱ[}2"9ęnV ,ϙbgȟ,Ud 'Z4N4 ȣ,u ibY-R!ra}^Ѽ`DQE%J1Hbc112 }4qZneiة {=5MdjB W$@N5,bye&~A(h*6iΘCd3LVղKnQw'udynUns$ֵ^WULSc[2+<<+,:\5Lk`m\,̷j(H, Lb݄q^|?ժ#G fkV9Q!(w=tOzv8NGrV2 GVL*ޥRx@)(5Tʤa  <y*)]C%,ay A\ aY5q.)Jq XTAMv3 RąmhF0q4ԍhR_~qXdF[Y(߻H=,6Fo1BKv;puu:G;L;o^Gkzr98dЁs'o]a, 5lj40ZŃ0]Ye1umNJG؃噰,כe*"W`dQEA4(z;] kWL11&I Ce(8P,C `ۛ]ɵF"B$iR4# H%!j&D@R]>w SMԛzٜ] yM SGTI"DL#SK1- Da4ijm3U7p*Q\30i*!FÐ VF Z.y{C{ g-"K% IDATwbSuJ}@ l%g4Mcy! :::tt!E  BfK$H>Wl0 冩:U/(t 2X%' زG?gfsѷ9cb:FyqZ\`\<55M`aˍV&x֫uDpj`3\k;?PVO b$# kPUs,)bjf2 ILNV"@ 1QhhTpW\b О=q}ًVI40u4-&I^U;qB NGg {J)8jw?4Jm%R#g6j+MQ;5Es Q*{%[.EaPj*Uɽ zo D fj&ƎI"YC%uJCQt"˥̪vEIe5treҲp#'I@|p 7hO5+ 9$3%sPӨ[~ _[X+ΎGzhg_}={}yv.Fc_3ySM5:ºn<ت 22Q{b]E\5 <gCnim/v?H2-2T6rHow =~i4&FE!LXb9' J 92BH4,l5 S Y@׫UqQs& @&@S.TdZǛۘB:aB,D.^n{{~#Oíxӑaϕg~֦b{ON?Qk[6Er:ө&a}K_|q2؍9F0EeRr\R4M˒DSk[1%Yνz T`wki 8"2+$UF;#,|\ b!zQ29 2:۱R8Z];d~q)r@8vFá]it+Pd8ӄ(?~CEʘi~=,,.nwד\xcF2j@$L>uKbC*ͦ3L "P,I|gBh%oK*OBErThv#]咅^m,L4z`LIl&,<4DI-J47'y,QDž=zn(L 7;/:Y2 HYD+t'4 v;(yB=_^wli׬fbMljv1Ti2 Gs{Mݲ'g5EvU7(Lf҉NA)BE8,;/ѭمMjTy:ȈJTH[XvR)`X$(KRҲjf%<$ % YPmΫ;hgN8ll Qp&xF5`AI$]&,<&df#(CZkWM(-d Ajʌd$(UزBq, `XPrg% ؅vcOt<te0q%Y: i Xh 4,@k,t6ӋݱLMK8z#~2nj[y1ņDEƹRr`nysGooYV(̒}9MPMת5\Ktfģ^0c*Cf@WWiz5\R[ʁb9|G `Ŧ^4kҲdk'.ӍaVBR A-b w¡fϼpLK36^22w_,#h6I$SR+g.UB$հ9W\CJs#Z^}~t}m֜j~Ϟ|F;gx&fnnn9XbZ6(RȜK} |~~0 aWp04-{eAJ Jdj&ƞc, VW-2!QjYf!nxUDZD"LnV*% T/'q>4xGi(`E (RTۺfaKuTL Pii;JBLT$a>ͲbW&:UOMy% S1@(āN29۬:Ua6R t^4O{Finn Y2Y*E"+Płҩk+Էt J\6;?0Pk^A;x𧪚c ]My:;7iwjzG*ԞdK/tf]&fɲ-0;3u뚦ڎ#o[6Pg+s^7%(ح!ђєĸ(rF,B(BiZhj@'olo&HɭwăK[V]w7, ӨDtl2EL}e Ís){;/>8 jm:"O0O1PW-UUmo,Fa=37;c氻;Frg%0]ۡiV^Lh{Zθ7o3f N>ubeLȣ&qʢ$鍻A T C*8fȢA'q855d^!>ܳ^qg(C'>"'(`B (Sy0A~tkNy  EɶNEc$oWەx6S̯ן>_x9k1iIJЦa6[ۗ,(uMSQ]QuSU,8< Bzn4WV\X޳o³LAJ4ylb("\s%0gջo>Y X?3(u G! jUVf4o6ˈzD7(?t˝.}W7~YJ c_9T'4s?YZYoľF<ϝ:{aW(qF#?OƊ NK+-UZY:9 w+(Ɋ(8M@-HR  ǒQSݓc%Z+c $QJ !(! b2=s V׼JY>l>x9Ofg#'zoQweVO~RlxmZi,0,;:bZ& }u=oZn{x3gߙQ&2PM2y3!(Ї1IT&hZYnZk޾;w2ꔭ8Vw?+$(|`}}l`6nYј9+[/,oǣ~o6Q#ƥ [߲zn?Ċ#T8?g`߻oko~ݾнW~??wUڃ¥^xIR t%S<Ě޽wA-1GE0?w~ğa;3ngvqoruפ&"1Mfqw>ß.soJE宻f:e@$WO^pU4˓_?~_^ظX0Gn7A[$Q@PJNˊ(38:ɘPc]̖[*S :1D!/Vw>ƌ!۶ , n1Ys{W׆hz6=zUydjTCfc:~/ bM f SlsENuS.,\j0B csSKlc3f0LLrfrTɃ͆K_|6lDKNO`rhd떒ᅃn9 7$ V唫KWF}]hFK4NH*òfBkq镪*ɧiM2WתUA  q&d 2'Y2lwsC'6Us%ó- jvoYí'hZ`9cѤly6 V.Zըz$؟@'G7jh&,yƓHVjDBK4IB=eLY$ X@ &RB;?l7U7lg2]-o>r4Kv0I@ iIEC1\2+vvllX,Ӥ(&XD-T@n|΅?dވ}qeY"! ǓQ'R)nPa^Bp)E^ᛎ޴_ӧOC?s,7Y3*>:ɣ777tlvaiޕkׯmϫY{}_?h?/|a$HJ,)@L1y.? K$#>3.nw_|~k[/?yL?͇?3?{9?KA0Ns÷+8Pꥃ[p|kGdWCmHɥ.iyJv3HA\p1 KCMVZzg>t/sIBOPTW>[Z3w-;_s]E4 5x짾_1Oɓ/~rWN'nPIKH R*#rfhȶW\cYJWl`fQ+R)B R*!OXx >P).XVRLJ[Jg\iyq =7\k?kVqp4Ξ8~S?wxTCA8@) @RZΎEo0 kn5*"=?FB(5;Θ@!eOt4fZ51$ nK?J)Q pU JՋ+)Ku 4fJq$2a#Q@*)8\L\rȑ#n:Sz>ofyg믿6 >ٟPQdqx:~/_|o+__W?^}’[sH,M/k۶6fĊDg$Z1uUZ vg+^ҹ!Rv7/wfeBuעWG>WO_V7-_g CX k~t:zc|{O|/^<+ )MK3M]HU-5; fbQmR3 Q{kw"ĵLŮE 0owtt5dȲó9ǣ?>hXN^v74 -$/$>Йu8b HÝBCe8^M&awu;[] 4f,ďc5(r="]I╚@#2uhD<iK*JN)U/ .rYܝsLiQa( irGaZRjk:I"LVk0g$VUI,X2 2\Pҩ;bl<.Rj~tw?gλp~wNt5;]سNo+v¡=? 3+b~qoLi> GAnY6 s0^ IDAT '; V0q-BZujZ&E6uol5;Mԇ^ISXƠ2tY5w+e2=ֽG;aDz]r]՜1+u\ä́;_t ~{][[wl.I3m|mPxn &mg"ax r _֨b\}=F8=|x{g7s>=Y_}򑛾sG_}#OgF)'YP*LӔMtfa?hMBt]*jsS3"e,qMT~ !@B%nئn3,/2.R! !F,-C7<͐D;J!4%>5 l6* @kW*ť>I@\KAݬh"C,BJ4Prӽ}εkZ^g[zԿ;QƸD:쮏wt8Z1+O,+2^~ 0R!$o5tGc,P+t~3 /z86.mM$-J4W!zs˩PE phUNc6~$NDyn8R̡܁@&AhV[fZ^]Rv&N!8iea֨HGo=i?`(pR0 lOaEZ& S0A<-Y%a`sPLbQ &S $Ӂf`l#(QU>4I^vn% r!ƼveCꦉdUwF ʉPIgXL<$ϣ(u:ך!$b2Iyr4ڦe TZ0 ιS^[:<nt3F-W$֚nm^rCw>GSs@/m]#rl:q5ff,ORݩgV'  MDE@Tȟ4Rܠ2͒-hEq*hҷ+NJF(kvwk=y{wP'J("eX Dcϸlqgƃ6a1р HHBVnu{ ^ϷHC c\Y9ܩ m83VU_>$\9=q{^K1B(S@x9Y-cUG[v[y uAƹ&-ݶYGY:vz ZAU#o:ov 1DԊy6w=R#vOϟK-^7}ï=:uN㪙ƥg'(yUEcƪtϞ"pv[5w5jMuJn)/7\6:";DM~/s\1cjm8ڌ}0t:# ~s2X8[XX…0jЀ1#\Ij𲐰 ]bKx%" +/rziJRܞ=`AKXYQBÑc;8R=Sw>|xqq*% J*$K$DD@*8gδ n0n܅s~?9G~S۲]/& BNc{x*"+g?uܪ1" W_6GUW.zIkssuoKeY@ m7o{+0L͝ϛ0 !UYrA*F5A w%l.&Vh<$OGa9s xtqFF,O?w9W9r^F= uݠ6p[) 5QRC ,9 Dmjzިwxg#y{~yH);~o[!q!M YJA!$XiR 1CH(% C`(PU"J0%*%LJp5,YӺM|Oܫбҙ\?Ӿw}?3qTќ][wW.]FԨgx+ALzCؠI?"6wkJZec?%.9ϳ4,tznR1J M맖.<~v&6D04ʋd,ŠѠ,IV+Ss{LjhmΟLv/Eqdx]Қh8j6ԋ*).@9/_eLMXaV25-ZYy 5֘hUᗚRJMEc &L-4NRQ#&$)82rĪYte))E:=61TQ^pms)Kp sqȾherr,ؓM8ӒÄk)jkz%gGI[F[".ʴTfs;eqZ|=q{'ɒG ^ X4Ǡ k , 8ZeHk>8rc^A w/⢨㇟z]ǻ'L{*]yVk,^nMa$$QJYqVE9RZq_JT V/9| **#4d*65=Y\Ԅ:?x&aU[)N>xx<=?kPAk꧰rг2X[8ɫJBFM,"RS`L"`C M}R243ךDǮb?:pX rkTX ^W \&6SzI`Aw$M0%9ʄJJp4DnP9+,+ IJ^o;I* ˂vÙjzQl o}sɧ6/_%)+/O>Q)y~}_H/yFn9]qZr^۵`eO 'N6'τag*J{)w1ie{(w~Vkkb\R$tleb #EHeiyy"U\ؓ K/R\\Z^+EmPQǢ*@2dSGi;[s:mH?+_*(M3K9'p^ ZK/}_g˶_\^K+u~7pIkė=+lkzZ϶hZв8 X՜pV5"S(@tgxǭ8cyi!2`I3$=ӘWۃ^"PWTkAG9jP%[c!p-EP%)S2- ȁ,ZO "4dM2(|+ K0=#hO$Þ\! 4ge."mּJ,-*J7ٞr7l/LF)ԥ;0z\"]`nssX%:M8͑Zjv|7ɷ6wbbbj{@I*h\{~aw63VCuhĪf/C J4(\7bo!$H [D@#MLꛎMb\ӯOY~GRGqJ؆aިkLM5-4`gXvזu|#Uwd}ޭՋK>\e7~g=-t gws{]#؃&έjr~ZˊL#<73o!,!K5۰ ZGcܞNQ>rKVnVRݸ4MSg"Miֵ1e j$ P=1܉6 ~eͩuWnY =95`)*Uͅ"eN|LJ!҅7QDȍnʄ/5,7(ZʢF"B r@ %bLXزIZƸ8QI)< (i{=ѬB>`d :{{eоfBo\%ہ]iUd_+ R&6 ݳ/ E5 6aẲ**ƽn0|iEQO~.a|0tplm4:cl[b;r]μԌ CesNUXа:AlQ ӋQ8HȢ ~i@KVyլ̞X }4 >vmⶭkaU1dK1TS șBŅԂZrΏ=rߧ4Pm7/kn<⾽f^٘?|psZC;ݭUUQr7xm%{0Kw`Y'8kn@K/eIhƋ/ќu|9ؓ]6y[^//wu9'O뽿ueeO>rkE7%]B(곟c9g_o*=GvΛ~G8~ FCyeiy~x++Ǯ9&< mR\x׼\C zW(JҒW\(G/}{>巾MEYYMoPKW!H kR+ AAK|"hµ4 fh9ݪ֨KeE? Y6:A-/U1YE~khkiAf+EEM!PT)Y!gQ!ڿwague 쮬xCqX`4l~9J&Vgf8U'0k6`5OӶ=ΤPɩqI%40mX^FQE׭ bYY$]dЬ M{=E ƼhBLk嵝 x9KWni aR (3Tq7;?*^X$&Vm~՞p'8W6!@UPc ֮uWh4JC*ôp1;¾W֯}5!L]=r#f BDgԯ ﻪ[/Ta:c9=5ᥥ$~?}N}oFqn)"01b%D^dΗ'YZИj0w<ۦrUrԋRa(Qdy D2JH W8- X|Jkr[ ? Dkݤٓk':q/,SAV?яͷoiU#!4޽yk{Ҳȝz}#>@ GnzjoͲ,777www,QR*F'N2!Z h4R Ud6mӠP}J\%dU0Z(!R3M2=VUf !E)% ZbAauf A+>P*8*=ű] g4t7|͓?3lyzײ]0ݻoeif'76C&=ԋnt1u["x>eahSз`3-N;NJ |,DQQk;vI,9=@@jɊdi%T~[6|hTx<ȥێ ,GZiMVq5{p_yմku4U ,8?9l}a"OT9=ffJTPR()i`! )$W!J =rh?|O/h@Wk:Oh珿ן>ɞWwe˶ozYL ˚g?yG殺|Dd%\qyo9+[kIR A4\R)} Z^so|lo|c׵O#o}ҕGZ{k?8v?Qf{yq^G|È|o{v4 ?я~;ƛ>>}ol) $I>+^qcBC,9[yC?v!_/}oy[&;_[oiyѣ>>wq4UVQQwwwiBR "!Ebb*)ԌsJ !@kb:mc2pB\JAPVWsZD²")i´P'\IbX[߳`rk{[4KE0A& `m:VJV=3BqFs(%"!Wd{jbgUTF8F×%9L\FCs;(8R3*yMd \a76X :?1/Ԃ%#ԍBP2DtR,lv{;΄eDiO,B{AVz٠7R/;xdøJ@a:%9 d.j;"}oÉRɺS V V[_g啭`WVȀb*HJi,UdBScB|ǘ, *mF V0q̞w]{!^K:J`/ZՐ'0c!TucZëxwe@R0 aߛ\$CQ4 әhMVm* ,K3n5kSDI4^k8hHXuj{;ۅRp5 xڲSLYUbL8}b xZʢvCSwՇM7o0[3zO=ؕ]Օj!9l5'OeYZIj( +/e?Cvԧ6fvwv._+0|Z"\vqumCp¤vW ӤԪ8uLisUg Ս Fg.58-)Z@.oxa5u[q+Q2f2 VPla@*%#LKC4ȀNӱKvaF^T &c Q F04cm.%Ɋ.RfĎ3E.Kn,ţ4%ָߋ8/fyOX57"ʊK@˃SK'gLcbE_[[H"5%)Sԟyqmٿ2ZKE'Q=B,B R2$@j..+G  ĆDlleb4DU#Įvmf42E\)@a9B $DyŸJR[* Ll+Ӫ2@~9)#(Hʖ7?ۙnwѰ)GA-;~|=e:z 4YC qLt&p4B̰htc ?]s5S3g^Hs\PJiP+wl%eYVQJ %+*WJZGL) 0XBIjHj"QÊUv"}`VYU ѰuI Gk4"ۉBAGL- Ts%LkQ#VUXA :T}-\" L#:@pU"7M'n17I[2`ۻF<4֌Iw߻gu{ceSӾK]X!RbXJa=ZjE^XMjN49ʒ¾3.LrL -&VSRYRP 1Q FHpX*p!b X,/59sDBay>"iML0$yY\B (%"e`J@(5 $PɎӰݿtp0mw>sY- w~FewaO~ҝsn\}⹓O>w[np\\X]^65wJ)+_8/u|3mȨ{FHN8:ùx/nߨMvf~`Ggof?0ѽ꫍ j{N~XώrEyb]ڭc4ޟ{鱮7<."#yK# NJ]z' :[Wh4ҰUb,/Ϟ=w^WEZh\:'/_?֛W*"ݭm0lr4"\=Lƛ!zw[LYvZiv= { Ls\(uSIQ8X׭no\0eGlh΃{[?Ig\CڈY$MIL0'7'rzdzs{{mf8߾gb=//VE(PA=&hrхn-7z^@ENA9@ 6 A6,ŀ]翻~ܯ^hWW/|ay?ݛf}_ϟ=>MtWOo5o}/oׯ^۫e_O<ϿG?G_SLu҄ N)d$K#m:SU;`RbJT3obFޅkeөւ$@A'p#AAm"2c N=0j׻jb!R=ʨ9e=$$[襑`cGVϫu9LmյR%"a eИL 3S2KQ 9dXtV2 ,q AC"FCV썒F^@`e;GC(D*@M>+S.F7UX]+YztOMr\DC`GQ6~jgib]& $d!?`Zfڬuj< !F Oa^댷E%eח^ɳý{_vcs: t62W|_n~ӯR铫G/{Kz/A9jq(ctE]QYi"a}G>o?{Ilª}^׫zg3ol=~я?=s}s?%dUo^?={{ǧ'_VS&_׿][_59 Dy!Ɣ| $ d"QNoTDTJs+%QD"~Ն)qZۺ/[ʧO'trbF;̗[4f]o`tcqutI/uK*U0N׽l0Xyk<)QвH] y69r8gjTQQ},^9ŔA"~ΏK2H + 8`A*BRb#0fa>*l2$mKO8;CB@˶} y5O&x~ˋR0%t:Vl bTp䭣Ѧf77Qi1Haͺ dYRADD74P@fY1FF\_1>"+6}]kVu{?7V02F!2q:+12Grws r|~szo!}]տ}ޙNK{{u'.VW**p@ߜݝ_/\u[k/&ӓLߔqVtM%97r4>4FrA4`!a|`XpX.[R!8tuu }<])u[߫7yp8SZ/vtz<-^^~߈',}͟ߔb{XeH^^\a1w|?A%ŷ/=x(a6`ow4Mtf"b uvi,!d hJny[5pHU2mӯ0q RhBp0yl`nwZ˶/onV,GGAe;Uv"&ycѵ2 OÃ`ZJ%X̐Ha%G΍Ń{%wڶ/.FA uR'H DB`+GvZ/oΫjY땪:krWW7yT171zi΃wAv%@6 qĘAyxVBh4[ʲ{O-ZFpEw0MjAʙz ="i<fy1̃#:`DN`mzEOBu/o @ |J# 6HmdD^XzTaY{k   =ƺfSֻUaҦzCVhB7e) bGz#G{\qkV˕zK"xoF6MI { !:8۟0G!'AALy&\Dqh)"(RA) jFcFSD>8TjF{c0#BRH K8L=v1xwAծTDYp(0>$ G@(bBH.=@8>`$2xbC UC1-A m"'c8egY׻j\e4"CSO# *ͳj4O,RLR3Ug&Zh-L]!(ݽ:N1(HMGGE)&HvmTkrn)b>4E8:'NC0.@i2BLۏd`4LɠM[,p:y|ukqJ3D"aQNX 﫾"Bs1rML(_ͣ޻wOo}=~ul}{Mo$pZU/ Cރ0 &kG!ccD)f(Q?`10Ͷyv~m5z̲=`#F ɛW>10MVEQE[o낹]/}q:F 0 Gx6`,tz$Ab}N,A0l^uX,&XPJx{Ni +R!0CB1$$){Da.c c# 0F xb H4Zos,  $PTp"Yj,F9뫗FA=M7]vr=0?iGӄ "&Z#J6:ց)G6 BLU[Mf]VY)fӷqn 3<DZUf2FDvJ8; ADvM}w|tZVjPq.iϊ݉q(=v,I^R,M#ke%Lq!1ʾu,gl}he9:H3L pYhӿuﭟmDy9"ӄcޝ錔 OFopjGl{śOjiOWoJ=quJ;wvtGrn'r0ݬVy:(cii4W+fT"u]ie0&QYw`ڭvs(EcT 1  !UYQgf<[\/ӽiM))0A^Cnn__\}' wRK?yN 9V_}9iH'zg2';A46Ko=ѡ EX&PtU۶[L}x!}(,KUZ$YijRNqʘHSJ V`03R?Э{z]lt8ҵNvvuQ[ umc$K!x!Ap?(Ʋ7*Db1%#ϥݭoT}Kz7O>wxStR 1h!@Y렶1hPl~wMcZdMUiYFJQt]Mz7.NP C5mဩv#M#8]JAAyڹb2ųۮG >/ҩ 01@tnSQFac'49u/wG?/WYd# PT##la% uRG:d$q6jTEβ*AA( N 0"G="pts<~vq`.ˋB.P1"e1L^[TRclޗp0N) c B&{EQ!kmcV)Hde)"  ZCBnN#Hc7p1<%XR =4hk1^JcLu@eAH4weAosF?q0 FL$8o)$$2L.Ev y3l$m2Nv붛,${+{Y7ƟH*#f^={trЌ>`iX0PCYj^;Jƈ!yXYkn7K! ;J՛ԛZ$ @n=!" 냽\Rm3Te!QUK`J~J`S<(VPdrprzz0 kGe1ng6("JZ%Mc|ac`dX4 9CXx+J{osf<qz7zu$)˴/wi$=X1_$E4M:RūEF]Ogz#s :# 6HJòiUZp:X#ֺцL0m9An8Gٶ&@ `p\oL3ozAy>xfV,tN7>nV?zs8Uz/e7׏"ɓGd?BIr{Aӓ:r{#2 @ e)7ܬmxD:czELV6n#n[}Y&M @eVFnрwNj5qm`iڶ-ćC;+HֺgYFVJbfs!}QNǛ\m7OON`+ :$*4: -ÙkK| 6EI*[ po09<0/wĄ$ N%Ç~~_~gٮW/;ݎG|w#tHv ,D: ju#ŨRYݗH1#BRm6QwNIwؙg4^ɨ5}Jch1AeG<+~o[ݷP0Rk4G zN;=0Fikhp&x!(JT9%I;zCWS!9gccΘjwgzN{Ρ6\c!ֶDkSNE9mS2VIlo!Xo!DXx k B(8cyg>H(`:eb c JI sյD` J)e.8DSJ! eIu->` eQ2,k 'Dm}1 n3 ۦgy^B 6v]d`{[Oˋ2@4/7Vd&Aiƃ H(8%kgRuq 3 Z9&F`D0c"($(m1B A*R`15@ڠ!VYﱲhD%sH jBh:)D"],P IDAT) nZ`3N]fI1'|w'C V뵔&奭|:evMNFx A*FAISR@֙$I7ˀh:~^;EpyѮ)$/>27'řL ]y^#tֵrVRz8:>JfYC8˳~yq{G٬PWSVM?χ)y@%Õ֭ uկK F2R5?[?4uc e,ȀI"zx~^D.Ң4^aNe$Y6b"N yU$M7UPVy,qCi"Q88<`j{y!y//x'4ϾW7T077U+Go;oGM'7Vݝ;wI:^ r]if\ʑ` hX0,LN9l){hI²bN zS'SS."QBmZӻNY}dE]움0I8Q@jgo[զ6"J P NrA6cQ$5R{}pmQ$d<ɓh=#PxgE'Sou( Һi@o#di>L#Q$v6ͫ_|xȤC Β4< 8] jkw2v8LDsGG`=h&D4Z#&@b1W5v=qUmi,D8NG*'p !KXc];_G!YR'DY],4@[2I{U#yw8DZ==2:5Plk]+njy%\CntCMBk[eׅ#ah:ovfEAјI˜V#L(eHiw7`NF@`2@X@XIA?|aΐjIbFIهV{w!Z@ 6­;zFmDtE\h6QJY.j.g,(UoMkچrjZZ1y 9Er~=:96"[hwك#bv]o;'#3lL6tv!DEhS;d¶0 E:c,F|(G(z~ Zj\.Bi{xo7\[/NNFSA;!oɝi94j/nt8b읟dc yDYey2T/27AFݝ><+ ))9gl4;;}`(t. M)ךl( A0"1!U'?݇{4Qgm@q';KOmy?z3Y{# 7f)SQ;Yt:c1ʺB!&_\zv֔ 灳kLۚ>FFlYU.e#[놳 JqPѶA;Fiلd BuY"6<:MWO.VO~FG@ 1>!dO|@*?{ш ٽdΎ"-Yʈ@x9EhtUl=',G{kڶ:P|0K=FvWnmz'21DҾT B r<ޙ ugi1)fӽ ]BUof QB%u/c( Q{IQ (!ZU-`<9e|OOJ}*A#4itP`:ۻ{^~XiT6m7oO='y'mE6~cßSNM{=ܚhzlS< ],VKqz+tλ5qʂdi{!Aŀ|6Ti&<' ӷ -!mͭBtN&圎l2Z'W꼸 $YJp0=}f2 *6C*{qY45;yK&HCpANQ٦0$ E%82O<&0*pIFsH",You[,%7$LGEI#P2bA% BJ!Zk!e9 JgV+Utv,~0֌15&$*{!kvmMgj7oVã/W,c ]^!z?EB `1b}p! bm<A 䄃au됷HvJ0ՁcY!8y^M#O3TUWWwac8f,$>k2 ]B;9l}Sǿ3tрKD_Dp$[G\@h$Ec;Ͳ C.# c8!l2),+uOS{pFX,mzMj Ȫ;͊H6.2&-zV,8"x;0),uأkDX`8z*6AiUs¯|)(N Ҹ0 ƌ(SJZ2 ?lv &xBBȅ!B# iDRJD!Đ1by!NDRLq:9(:> ۈ13GC1tbLøuPW`O'0=Vc1}Jƺ'l0P$^o."׻SILVJL] #º((tטf \Lx4 Iݬ$j {II87^~=e D vX߉351^g|Dwv}?v049WU ys BH'⤆ [CwQN._XdAcۃ9s Η3B}?X긋񻋛U҈#i/=֛ࣳk6on7YvFX&WKӹq{m0 ON+a4]Hɳ!ouC˽Oy \(Aۋs[H2@y(c0f`$$4Q1ovap۬,)A$FVM'eHGk$צRbVե*a<ԫ1l6 ' =/V6"߽z}yw~ioNå+Й7٘ՉxCk7dʢB֓JrD`1Yjrֳ}`8[?}["\_|M_~u+Vg'gy7F_4FjvH (uY}lv9WQ1R" 8t} ,"Ea6)}B7`ftey0n}F2wm;a4zQt$`p0"Xz6W1cw,UVgiv,S 04)9&s %!DW/ -}?WۻAgMKv;xƺ~k6kҲ:?~G[ӟoo(U_~f5VX5Yo///U3$4mhas>$Hagլ* Y&Ҏfl~I8~݋Rgc jkn:- vqGd~<ι)Yq8 0ژPD3*^d=8^3ദp8C$+A>o6ou*ZuUg "rTK9ʂ1e.\Th3z|t|譳1PN .aNGB"tw828v :3M?$}\ 2)8ŐB `1y>N)04}:uLRRc(<QF22 5 (K "1 A3,JI !ДP,3 bMUYh Rp(ރR%A8d&%6;z1ZHf#s1Sy(ɬVR$LA6`ۮ!E |mR*DʚP z:!qfW*2:|6w#Xr$At&@(BJCo}42r'?pcH ~ţyѣ\C]ݶ}krYMu!@ؔӅR3Uz<]-R1vm3?zNo:ҵh}зۮ- `0ƴzgH`1Z=<^qFR%f3] > $$t>!EHQX”"P LѓeUXNNYY!.l0%gEH!%CLsgʙHHQL'~~}p uYMh9m׋*_n'eC۾۬Y&W'Go?}2ׯ<d1f7D1 1Re˲EvrzϣC{H) )DATdYIYdy“J΋"n{UdZ,-IJ0vrv[)eFm_^Rc*!/f7&ׇBQo<\m0Ob N&~aaaܾ^7%eɱfܵb4"( B@-g|OƜB?xvƵ SQWfHN__r㊺^/k&͊Le 9ſ|boonZ"Lq.·vCgz &Ep"`RBM.+:_e@?erO@ ( C cYDK-щ𺿎3'yrޓǏϖz/Zxܴ_^D(b4/@}m*d\2wݺ-늈NO'(eQy,^΋<6޼m^Rm6w_POWWru S@`5".$uFns0ZƸ& #S?fiBĖQZGGڸGѣjyH Ͷơ:bGрkia!w~7CPe Wՙc3>@8Re~SMU$+* ~iӺ(#˻}rZ`!w;~oߩZڶ&QʈdKQVá|'M%Oyt"pӇ}R oy}d0jkMt8EeÈ0oMQEBn_&*c TD+ ]HZ`o~mZY.լxs{=e)gU9p&zv#rwߒJӣպ:^&|:-WR~\p9}8;C9`0%WE9ίo!eލ:==k}dL.e1ǫ䫯J)n5_B?}z u99}G ٨_k:QUf~O?IQU]^>鑰e͕!0De6p/c "FI1A ( ™TDG51aL<яs\fvDЃBʲ\ auZ ,qԣ21G9Bdj MJ8g3Jft}. om6y.Y1ʚv( IDAT*n4 D8-cubሧE>uI^L ,3z/T ɡ91 Ǐ>ۯ%gJI~1p2p 7w_k&dZQ'2/0N(t6U )9{خ אen,vf1Xq94!R )s΄s;O##$@DHJ!:oIJNě :x4SڝOO fotztUpĞxٴΫI c3jQ*2! ye."#;",e۝mFfEGG24'j{׎i1liBGBɼe6~8lͶGe퐱z.iU^ Cww}1 G<"BhYQe"&uyw@qxZn/^MQ(1$*D1 )Y\^Ѝ'<;6 %CJ`r2ey;<|YZ*PE9%E}a$$J[ΪTeH.#"TO#Sp~w?~~zyygЭ9nJݗ̚GC{|9RxB{ϸT!92kXL'8zsvgqu 7}çuBHJEZݸhKlo\Ul@!=⡭SȤ! L2S )AG?z]lFgSx34hʩ"pJ0FM H$,Nfۤb:QU ~;nP-xR^]0_}UJ#@\n7W2O>~Rד2$[ GVgWޠ{l2w19;Gjݛ7??Z}-ziB]=;@ZIlhۛ'}KE) yI׉SLL6SsʘTf<] H`!BSu{.2QcљB2`GfwٷZDŽ7JUZ`;LȃӛWw!1NJjL)!@b6mcM'+&s#vصD'=u Nwن . V?g!Wk%=w8aQsLF,af~7#__+@ `HcyAX (& SrwfZ31RU娭-WO: Tzv h,=;pحǃ=>>9~_'Su|u/jOgWvs؈|ܐc7 n_x(#":F4Lvg$iJpM1)8E:XZJGMFWaԎdHЛ`z٬T<\s8M^ , Tfm|yS}QMXm={]TSi a`XqGa IuI s0;H 0c)㜗e)0֊J2v7VB ĂWf! J`CY3pc Pph%) FBV1Y+ cIֻ{@qRBLZ2 uXusEE6'se`R<<ؾAJzTmCb2?G2ZL*Ij1B83bBLfg([c$̗դ CA>8:TVWzH>+g$ԄITYbluM|;,R "I{\g"dGGuf{'5a& i( =R );_.G)1e!hp$$ qؿy*"wp>F47Υd< &8F!ńTƈ0"#i32);k921xa4ŇƔTd"bg%)'B2Ĥ pF1uR|bXD!% 8L(mc3 &a,-%\yUO&aqf0&U(@{q`gqC$TON%řB7߼eH.nwM*. Ip$"%HRLfomt H0`@VcM)a2B.0 vՋiVo=1aBSx`SS)aD8c2佣Rc,P$c]V<}߮1?:hr\@!@ ""Qʢ;^|IS^|f3<.\e@1b<rzdowmo}ﷳ0hTJ0-)ޒ]ێoB.j&RTEJԎW Y)bDJ> J!f Cz˜.+F8$"<%1D=)fPDD4њ-N eөv;șШl+ݺMOY/UFH/UQA.DIg.Ǜ㧋u1b2Yclvgg%<WKIi~$`3|m{l6^ef}S߸b:>豕ǧx'Z|~/w b?~[fJR].<{//ڬY^LwWGGIҼ'2x5"GsDmrIqaGe%3|UZԣawD8 хd:%uFu?, <FX&x#-Wr9suq{w9TtAlB\ '?9>Fao~y݁g ʾ񡿵 Z to+gwwxOYmvU7jϔ9_|yWY,Ds\LL ! ގ=%Jz(+V$ Ȳِ`!oSDVxw7=xO{16,Ap3ŕ9l_FO>/kBw>HT-&i̕1¨5B10h)U׈e Cc5ZSEe@$$T=q.`lāc$Ipbڦwq ]&1J јDIq2ёfbZ!O"R~bi\$1 G<ـ1 c" ;pv2`c΅%0pca1`=!beeE;2?y!IrZ%($l7BU=jҷr5Ǔl/nAHۍ.< 'm G@< z$!upRl(b"ثQgpēBM0v}w0r,%N%\r$\("IRt&ƨݼTcQ}RGP4"#)E9 7 (.NT$%Qc"fƴfMJtؤΪqvùM5w/c*=:~6றA7g@C^Xbe.dMN3J14/^87 BdE{(9M#1F>eYVd?4:%3I!I 0`JAձN"ggJzC2YjgJbI38&@12{mmɺqj:GRcJ\`*xơt |jis8Ee8~|n^yzU;8zܼ#1,`=vb9]~3YL(¶SQƢp(ҲvԪyA35aT8KAP\$DFo0 Ĕ$s6?Mk^޾kBdϧQ9!ӆUv70fEu=f??\Vů6iLgwݡ:dղ>ftOv~ה3Lp&DͧC`8 ̠<\_Z2?1DYQI=c篊_K^=z7?7y짰|;/O>O>gfۯ6'љ$׾n87%._ygeXoúѺӻÆ{P5qӍVʳ~k*aY`Z0wzΫݦߖE)Jcd;lQD$<2>Oεzo~@mOO)'O?b{ru/~s󭾉o_Nvrk﯇뼎5nEƗGGo׫Umn78Tnx}yyshטM+DRcm7ޝo$ipܾz=֔Iu?<{ȳe/'gʣnh_C| 2#L[RXĈm pChE:]N+5r&42 Mk`}4+!f=5@Fn|zInr!\M cD4[թT ۮ$OIPJ)CU-tQ !N+q(%X(ɌxMM{۹.QR1k%sI\Dh3n4u0XH!(G(Y&)W!4* UP`p0RMr1/ygLΏ֎2ɳ}oQBP=TYvYRy}t  H)eՀg<2%UAS1b2)9Fqr9'!\ A VT*"SY5fY9L!T8R( 9ABsv$աmP.v{=.*T5&7}SgeU,3^i@zb}[FJG2E0$PD&'!#C*/v!B%|?N  ˺2U5]7vWטL i:)Ə*|2\.B7e1r%"N.] ,r6bAcC>3gb! (BRe pŞ`^)xFG""$@ YN1 cJyc(d$)j6fI1hZ!< F;eL`,c!<g(E aOr)~!1N0R̭ P `p"`Ӵ̏viCXdQ-?x06MgbPS5/nz]wf׼Y'Ūqǫk+^2+~t4[d is}&8cu/G=B! "1!,%2:4`jJƸRJ1~„ $ %B1& A$?|!$@3J"bw&Ds*KR@pŜQ m$6iqy= 9]p@Y%&?O؛_zt&KKòmݡk|U%>H Q!f\L3ٞVj_]^_lﯺ~۔EQj8l$pmNS.Wղ.<B3EI祔Q:\&\RCD`͝-+ezm6y,j~ӟNBd]$}} 4V;?Qx<)jnpn/"?Gsf"τÿ_}ۯ)Xe,L;SA9yoㄬ11@pv49u)RbDv}]o6!G]Qiqt!@@;j̹q5[a7DV<9{;lua&[y.Y-,)Y=?_ݭח_^f0?Yz_SY1/8ه?%w{0-|},ܽ꧟}ΓΘ@fZFb7{as & ,|U5k@QS5u{9F -r"%8==={p>}gxGd7RIaģM\dU1GIل8Bcw2)10'l`2NR0B2PN02`6`d2N&ն!L'qG BsEA^k"<&$t9~!:tbHet;zR;rbL]'YRA;Of"A]^Z$`kӴ5DWCvƌxFQ$d̗a_L!¨HQ9"Gk IDAT&(X<qOз~))!,(QvO|n֫2Wծ`>;NBDA2_${Z0pg#F"!H5 ktG )>PD[o=R"@00D# (`"&Q*dJy< ffhUyq&(Xh6%Ԡ- lldJIA<Jqxgut|1BSfqNpd7=- fz $1NEE.՘`#`$PS9h<:NꑟǣiY<]ܬ6~W^?{vww}sqAVVQ&g#WA~生q^yvW_7cP>I,]gA"g)귿W|.]D7/-?CoIg?wU/QV=|Dy>r/<^*ͯ Jp=5u0>RnH,M$ØapZ`Ӝ`;xÇ xl7u5Uz=XTD!__bpR$b%jSg7'Cau2?ó>8}U nZ&s&v_UUW~'2}/L-'Xf( H29iJkf<ۯWŋfoç?-yr{}!QǨ{FsgqZ fu :Xm i:ʲ FAՖpZ>?>z6:ԭR5ƚAwQysf# li;`:R*t'.GhW_CLض6vWZ@.XC (xc:C$PXX q0@E! 8A!lXRUڅH,1/KM! $d#LYhx*#Ww]URr1QΧnλJ ! Y CQI9c6# \x7>`DJA1HA)SԠt<ֆ^)O%Iygyp+ `0 =B#:*'mlnsO̼ #v>% )i3󱷶m]սf]g\kc1E,޼ @1!`Y1.E"XE bhR&%ipzic}uw0}"Dxd4ARB]m e&2" ?_J7ɹde92)( WMH([`4cD0,0Z=h덱Zk2pM)1X1DC90% }!@'C#Ba`]tއ"(8  1F>1&jL,sXbf$!A+`fƻ#&ưfк3GJH*XcS^rv1Yuy9Pgupy>:)9z˃TqY8mq1~j_c1`$p1c {? OOhjNEe 8>`P$jIV2$Z+Mbxz`,rP78)B$Zd}Dę@j!b"TYv @>Pdx$jD 1pF1; &ǃR1 P#nBb׃u0v )8 0݇#czw:K)F^WUkMm]83XEVhh(nfԫ;0Vs*'GO>ݴy]J"8Jl^N2*m"Ҕ$OfY2&wLٌ4(O'($ FP&Hэ3m]q>=Y2LuW!G 9B@Izއ|}*M;̧#N2)~]t>x{b~u{OӃCyG)\|飋2ML+2*X&yZ.aE"04x"wSǾ޼ln?pruUOQIgbMݸt|њjַ}N6xCgg2/!"Ƀ՛;ze+0K6q궯צBq눊 Qatvm)mm2"!AQFz"2%1Fx"ep^k[rT*5l[#Yۊ;&Id` 'K/}.(OOdBT!a˒KJC<ﯾkk$x}w{O?]ΏᒑD"cduꆚg_i:?mOu@ʺ^}׿?ş/tyt|qp( 2-G0jo'I-|q_*y"]woTUlcD"^onw1:AQyQ5Λ2O4fy>:֯[]DUZ}O+2x|xXdiA$ ~vG>/xkW#HJ֝bed4[}v&)IHWonnoVW2s`Mmb`Ͼ[?&'__?CW󣣶̠fh~H!ەNaJP"GiF1HBޓ)Z]^{SHb`50g6L 9jے/>8dbL"ŷwE6}t@\G͠EԽ5qj7#Nd?>N_Z?sbӂPzǴuY"†!xG(SW# B7. $Aw6DM0&!0C zb(><k iBu6; &+d9""2( {R! v ;M`QNrdymT;>w]1Ŝ1:91PJF"}0&R$I"YF$et¬S,ˬ!;7 `ԏ ֤<'[ ĉltNŝR3 ({1'z%d H E14!bZz;bB%#QQ=^O`ny4YRnpH[8Q.@ {4FӢ$21"oL/9snq]۷/?z՝}t5 ?uN rL'Ggf_ z-4DS=q/0mViOEz #!47^7bY~4[,雷o}j: ں641Q@>s~d".ϋP>!wqWB޿>wc.zW 1 O60`s. va&ΆØe2!|l^8N}ͷX`z!0PG4C SPmLQώ7Wd)o cnQ%}*M}7u!̓|4u&uMGN01zz~%UNwوŌA[I?8pRF"௮4_7)[ev.O&ڰyHHسgߍd=ؙ*M7/כ{z wn\e>+ [5{|Q`SIp |>-/e;\hTO}w!ʔRŤG^wBǏbymQN"GVk^񈈏hݩyX:|6%;Ķ~rGE| 9 9آ?t6?r+t??x/'6߿zdL~/^6z!s)HXĚ8 c9K-}vOd2+p"`y2/ T7mz\pƃѶkg{5Yg 4An?_NO C]_߽ >!0E#:BKy DDN mW!Db@Sv6&Lp$I!1 Pb%SJ0 7Ƈ0Q(zZm:D# @Sv͖h3iN$z7L4z7n;P(SԓQv\YYcDZwcM(9320J}&in۪NQB J)`eDR?|J<ĴscOg!CղE^l6 !!.W^;C(sD¾58+Y8^<< u )MTj1 "HڽgE 09j5ob 9<"0Wv&r2VC+^M_תBtY8d>1j[Oˮ1aLk'NHs-Οms]0;hS6CIF}pTN6Ζ: ׶ t_lGlZltFP z!Dh (<zMLFw9fлcw ޹ w kk-%!}}oZSJ)e.Z @0z@p6zWaEJ9)D^ .}5:B$)8D1*OgR$7wCAEs 3FuO>pw(l2,i|G1F9  Q<3) &&ћS=DjW֔ivuq|z2?oA;J H @p"Ɲ`*yΉv7>ei0vA1#֎P'=OD4Ymt@2 !{b$0 BHCB"?^]usuS?\ZLp<Zx }`0,/;mնnu|xxrzq4[^o.o>OEHxxºpnN$KQ-au<-Er_֮}cU>vt0ezۿóxY>wz'!/ܾyucTJ sRe4,͢1F3A1d.x}ϢQ8ez?b"bDnou߼]>Ibh~T[uޢA&=  &Cf.ݜZLﮖß?\|!g_Wx\&/uW/y(NjG?ɼR*2wkG&U@:@cloUDF{6YjצП'G'O^~ =C: ĕVHM=p6~;1;̐.2"q`ct_dQ:ww? 2edZ& 4 )Ʋ,-*hmV}D^(#nv!9%#&qtf'e1zD)nԶuvHrY$LDj ࡁ}կNDʜl4U׾ӽUyLS S @dT"#{;ءgà62L6)y" 1{)EB]alS /{uE!)JU}oP lLx IDAT73G!͒4g!B"RI^b9a8[Eu{8lQ7{̥Cz;tk!8Hɨ<89tjh|iݘN2v;"-!DC y5j 8p5V6D=GROGდ% hn,xir2_e{y\nQшMJG˃5M>~p<.Ng)Fj , +}QXnxx^Jq4F2#8_֫棒@(TuZY8̃sG~oڄ*>9c|h.DK(Ss.b@Y g|Xsjv[|:k.K; P DrHM1IU=?}xt{lLtn#'[߮ŜdUu٥iZBHl9VA>>xhk׻殯jmt}nM@W |LFd%"Oۡn?7/_Th`}`DIYR( l4*G(ɭ1P V,v]{b e\}YjW|G)x*d">z4M|ÿxX,^^-N>oڴfݭZd#٘'Rm}n4oksW\_]MqDiv_<GjoM}kn{u]ncB.oFqLZBF=pfYƏIJ!7#)=q3w. t}Y1:1Kq&F"(1ģIX8rLy$0AY ZR6} ԁǏg3"a&2W.xSR콏x\9`йe]mŐIJn~Qsf>𓏇޼~Z]vz.W]]=kw:Mя?x/pv~ݷ/񟜼3٨<.ϿW}g.qmvNy聴m% }*p,p`4!)98帘ceq *tRa8B()'&`gz}20BzG64yz d= 3LjҚIIP*DqdV~׵ ieRb"\RݵXF"1]czW#q c DBm;T$j\ _'x<: xqsw]&aqɂVU5(`NUC;T<c6xcJ5[5h J?4-F4:!Y*q]g BHYsw;yZ1 ?=_kBh9mڶuB,qy N 9ho)0Pyepww}9 r1uc %UUqHd^H4T,MG34K/?2(U({|]_@n^y!QĶ}t7Y.Xf|uwyeD* Cz\iȄmUX3@(xo5»뛤 wWddݯ9m&gt8 A|>zNџ/Gؾyw)9ㆎ6kI .C6'z>O( nؘy>۹VΗPV}v=;~^\`>6BB1&rl \y=O?vw_H'ы^_xе#rM^_^۾|6{R"]>oItyO~?N}g_~yy}G<~t/"j($up3FD:;ή:ǡGX\qEB)Ps¤B>`?d[ZtIձΩ-V7þXteoOԋ|ʧu&abY4BAK /™i-ZZi- [NH163B RPk2veL2mqCkԪ-/>w6zrB (;n*ު׊0$X$$ H! XL/㈚MSoFSJ;$eȘHB$PJ)S8& Q$1Rz`P*|1ŘiD02Ftd( FVV& QĺC.M"VWQ(u[*J, 1"z-4 lp({5Ì9=^j-UU1PA(,I""-?G)칁4"m7<0R#A( PR:_۠w]iȈ.bmaвz'2A5kHyA-jU#IƓR4B!۾- ~~{i?ulqgPPŒZKf9X9Q W-_ŒC{Z4$Y4+jxa BqjQ&i:!q4=tيhT*~ۑB땚$Rl&bȕӳsmPN9ꬃ$DHi:1ahi&aPlbLD&0\7v."%0[H—vvuV) Bp.8 Ct!ytla2d&lW Ţlw:uWr+ f.\ +i*@^@ThRere EW`d&jղ-BD$H"b EnNC9-)%" 1ak;1  y($ǝq)RJL%A!Q* $EJ\H.y"f"j D ("]`V2Ѭ)P GfHQ xO0@J"„iJ(0AJr$pw<c +B*h`L D@!X0T0ls$RJP B0!D&1б҉x2!!%@.B*(+DcZ@rP c BIPJ):b@J!P(G n b)L0 WI0WJI#laܗN*,=Kv``L a[ 0Zi̴, .bF\c}uaI0ň|%eBI*aY&eCBː[-$B'&0 px BJ }SXo~Vo4@,7lZh- X*O5Τ pmO p tCs-bDIvk@ DӸNweV\ؾ t=QK(<1?~"6L\xڕNَvj-/PI A ",Mשa $GH(\ (@a+(J)RiB 1(E1XG@ P@FBˀRodQ.1B d(B`! -@Rc @CAؗNYvLN7ۮD$@iڦn tS&ɘڢ\py*Axq\(X*"Qk X(0BJH΁ % %>0^ܠݙ ;8 "$DQ$dԘ!7tb1G\Z,֤LB B(OAY1%#(zs=%(-̏7v m !$ LHp@J"ιC )0@CC0HB̄PшIf1k?| @2d&XDŽpE*FL}0+E<OTmR#d.s VkN4!%0 #biX),X:M@p! ۵a{e3='N%4v!&+(KHQ)d4j+ t6" ֲDO\3Qlڞ rT^0\"9YT$E⃹|n0-Z ʪ:uڛ/[F!dFaY&1"@JQio;-2KTTNu vT,}gPW2KϝJ:z\7xnMUZf"qQV)%B3XL8-TZ|77(/TX2h@fHF stMHRl^ 9 Sq3mPaK՛~6Àc0"!@\pF41(Bኀːl01Mh5 %x4A~FQ A0a9B;BDb&)EHb)< R d Y4Kѹ/f $$dd>J9n!VЀj#{_:3qJ=?*"m0R4[( 1$Vo"[/6ۮ q).R+žQP:Ed;E<(47:qԈ1ðz}dvjjR)q4]C;p%cS#Ej; `h`ܼeF4 4=FuQvwe m ruP 4t3BR*8X -)a˅ MxKLkȨk7c&D15[vPSCN(Bha7-JRR)&P!UJ(irm_\A ^krM~"A S`Y/re$}曮~ŷ/[J-RJIx)bRfU.WZv&dRH2*NV/+i䲙x/tӍ~JJ8#ecrt@6h6^|>EIJ86Vih%PJ)EJINR&J)%&XcLB9u΀L竐jx+{hJb}K'4b\Wh gc,jQA3iiѩA(W AY Bm?D?m n8pkVwwu3FTa=ΨiK)u{f6|g';t7;׭YsVWL̖%>j1Ybk\~)>_-cGՇ7_A㧧xis[oUIu WyO~}Ϟzm'=yؙwGӴ.]@TlSEWruchhs%}?Fk|Uk!4=;vnml6R$K}߇[J)u'''w=<2l6VX~ C_Cg2(gKթw?P8B@~/7\P#")1 - zcZ^BDNPqְ yO@gK7o^|p- ˗/=H۷+AAo'v M&  LV S4@ O? 0>o4J5%ھr̛12F@"&f=P{ EçjDVn_wj=-˗ =y]sӧ9:00N.]m6劳rՆ罻}v :qW  1*;1H,*s%C.j6?T*iګ=7tNB́%K['w*P+W chP9ʠ(@*E)a?5& 14]2%(WsoZ[nww47|CTjcc/yz{3]{ᅅ&#OnٴqiΡ+f͢np0;swkr/xꭖ]'z NTY!4#㰿yJ.K" KQJvzG"vmy$u ,|0y<lUkj0>_ O_1ܷrV׊bcϏ<}kOr6#VZЮޙx1uBid,SSs2k8ojmgv ޜ93Z7ä.mwx;ۯ,2LCCdLH)AJ.R*ɥ)d(avX:}EݶO~˖8HgS?ӿ\ܷal6;11y)WF:jأc;(=~ӟA0v:1|$ܸyņ^bp'7~wlh>j;|?]Pj-ۖ\uA E=ɝʅtۛm}H);yzC_D.G htC[ B= !XHMOυ}=kTWB7,Jpv`IϚ F:q!"EvhqlG2=>{kpp@]םj˩>э,GөR̩zwjiA\Z'Ny-ŚgR^TơGOO )6mXݕ B(0T*DZ)AшSiH&VK4.o|_XFqz@Ot_>Hd2{C~qhtc1J)&"Rs<Bd"v ]IalYQM74M" 1}ҦEKJIGxb@d2u ?O}?4tD~jݝ = ^2Mm K >]fRLE-&Wp#&XVj@" 1|_\n٤̞g[ϾpÇݸ* 0t]/B@ .. i5 @ <`dblc<8 Ћ)wn;C+DH>~9 nxo5_FAprRJW}P!M(e:!K%24ҰP+HԤ!U"t3^j]1~wr;..1x{+^ !lN5hXjK[PΆH$rWh3\I\0 8ay8 x<q˪mۧFƶn~Pʕ#~[C6沓SG;~lD\l6[ÖiM2+7ټlQ|h߷^} juhnd?C/ڶl!czj.Y XQw'M}G0%Cg!,JB )Daޫ@ROznW(BqOQJoơEӧό w󎞞>V;;γCJG>򡹹ǎ[nqhh\Mڕlfى_@#o>ZJtg왒Sd~~8=02][?p#o+M^:(3z7^%'b4}wi^\͙cFFEF<ьEbg;vDKgPsDh-=J 8$sZ:6m_m/R,KM73f躮1E =aD)H' hI N+E8>S\5׳{/|IXsK\ku\'h5Oh`|'ղRi7] 0 Bs\zwM׷nv%ѳ32z %RJy;}M#n4:|c#j- 'z2XE0+ʠ1΄Z鰾W~~~ k7Kt>ez盄ve8=&R|.C\gWsI {NJ7/rh7n-Fu=FEӉ|<]ׅ=헟e[_𑣝_GFGw9|򩾾ޯ~.^~ڶ|m/EJՕ?tH\B}`c#}q`EG.?M;Q^w?y()BPrsC;g M׵y`;R0Q<@wk{+a}:fs~æh,՝fTBɮ7s6nFafgl,flݾU]X4DNO𐻮sfrtoq6\е\0?{~oO'ݳea>SGlSHK%x+ޞ+*};u|x\~ttjnm.><<"+V,B$Iy$FsS=ˮ McDR"P7Qu_`XwWyQZ-Μ9EdGq\>F @}^}1@B (DWᠨF"P+sM.$iZlK"cfZh  (zjA–RN|b[\.)Ē!J]V?#?;׭_J (E dm,B0ҥ;>O\ mLػ_O%-y \00}_ѩe.@(z,[^[5E@HRʪH{>6E\)5wV|Eאd+ef43ypvl۸vRJCoڸaxkQp7_w&D7 0YwPΫ^;ww 4=ϟF8s|dD%?z>g?pn BJqе e-h`}S6 L;?wv½¾=ؗW%u<#u2h<( BٰC !BHE0r<R@l;v[}:兹ckZHgپP_:=~Jig瞽W.\ajzY1pa\.7=3m|{{kgoWJ(W-NpgS׫ٵoǏVkLz+K˖,2 JIa^k{_DޫM~iӛWm>z}?oɺo!Wb Lӭ_kv4s[\/:>~@_pعBkBJ9::2r|wm89ܺ:=^X(8w588__իW0hѽ7=yfjG'''Si^5#t-A*p^~eWvP1fR(D1a`0]kR&o?'$ |f}i.pun -|O>?:LNM$RJ f{_yu K6lXRڶl*ΥR4~Dl-[8tf+Vf;1 6HD 6) xJP]cn]uͅE4B/}8Y/~fb@n8~jT@~@{LƼ|,*W}q{4l;@RDȁ^yIIE5Ѓtym]+6((z_=,ٽk;>|%JsR* gS!ϝFF-)=dχ>ւ %޸Fk@x @wC~!sn~?~vcg;:|pξc xW0idvVǥ 28,BQ& N̤( hL0חsvK4%o"]9ψLG[+knv@ETK+ N۩Vmj4E햽x^P).NymmٲQ/ךYdC$5M?ۚՕ߱T*ֈ[oc_3˧ |7B |I/ReOw﫼v#<|?S vwǝ3s㕥ٙ+b |qm.1ΗjQHD@)T˅Rrr,=56vۭkB!9\6;22J-_:~5SO~0 )SO}/ߕ_fBRaU7n0>~lOL&ݝf;!D"b*]7 U_˷%])ʮ˚û&nXq03뺡fR5McLO%s-I$f^|qbjj*\aQ)5>>ǿ}v?uzԩSa@ 9JnZya v"qoq䩵6OLLNpKu۶ 8>}1&@14MT*L& 6ڶG9wL̜}8!8 O:BVb|jjxvEZxy#" IDAT.c$J,<jЮAqPk-۽ W : V`t皼}4m =ߏ%s|z X#S|dy0c:δ>Z< 7j@TfVٵfbz?&E}$۱cӟ7lβ %B]o14QdK(`A ,2͔KH^;޲/%]7ܼ$6\ {en-~=m7- n\w$J\#cV}>oCV=FGI%Ѳy_5<=ӵ3p]_o-n 04BTZӌpQMiwOO3d9"B3x+pJվԍ71#['lPuNA",YO<4C[ e`0ʵA\h䢻,-)*keq݌PqζDLRjn Tm#F&b&*xho //tlQ83 lj=^$5"R= )$񉟕Iq;};]I.{vVtC.om/^>:gz7H;ʧ)FDUJy(RR*`5_tOW3k|=7<566jՊ'NnXnݺuG=omgYy\|l||?d2i)ѣ6mxN[Ѩrlll߾y5;it]H:ubtz͐ V?HX߹sgXdXZ 3^IGgv׫f؍マP5Ezɓ\?_`o~{-7tL&C0EH4۷ɓ; w}B Z9~P/NܴL20隩&%Q11QQͲbܲWtwu7RT*|{>vjjtt72TJ)@H)69SP(/ 9bيD/jK.]XXh6xܶm˲:4\0)e<D"F\u8Bw922Un\^Mo)+ ]e GWW>rtdCB̙3"N9Gx C"K\&y *Z+\(!ވ!1`i"@krZ:Dܟ!(D赒^q g_$ Ri>,>5ESTWW\ Y8kf9ZmHD("+,3fjգg`j~~~%-3#N7wO_Ϩcz 5e!֞9˥w"B8eKw>914dqŖ&-gPiҤURءٓ&H*+y%OQrM7w)h}byWLζpl"2H%wҋY^VB :T繃iL\p6rd*Pzm \,|q(.rCzmva\hmtS?\g!>ž^7`fj 5(on(B P."<$q)Pa%#,/-۞pFP_8:V9@wU7).swĉ@w񉩁S{FF!QI#DX6Q.=:=zښN#I488zdR\.'Bgg'<JRWWj06+bv=Qf8R R>An:Oˮ6Ucsk@:8$"IB(22df|lL1 <>1p+@6ȒR 3J9Wz0Fg "$KPʑD8`QkZ\#@؇F*ͦ̂ 53bOp/K&*=6w<Ʀ[ZZ>,YDZZ|ٲ`Уj p0 NI إ R[v5̦Z785m"B\#0eᨎ_Xe$ 9O'B٩ M 2=ma٬导_oX8EO@/uxx??٧"'f+!#3{W*cϔGf^P 0+TXX0 >wcGh0p zB@1 Hp%Z]moogx챏KOm2X,,0 IkxQ,Fd&,ӶM$Ib.hy_zW?3~ 7Pӥ}5\iUA_`a`F(| EFΧ_cx{'’nV? 5 uc \`?<^39caR9 %8ݲOtYȗ c\Ikbʆ=6cr~+/u;)dn8 B{#S|j?Sh1iO0qƵ\) 8ʕeYa1َmٖaXE %MJ:2:9?6K">H$;x|Q)r٬|?r~xF6q|l8\zZ8!PBΣo:W5J^Vhg]]^/Α{® w6Vb(vYT%Ŏ×P]9Q6 N(\tFeLLL l%N&Wh@OXF ]/luv{ګv+"ׯY~!e&Y*z#ڬDg64N HFO.>:::zɩl2lhY'HC$) 8s=PJPu; (t:0 Bv(eں09#3Jtux'^Ugh/eb=P|n33Kʴ,[Q䫱˩ÈØÉ# .H*]FVWW?qUN{$^Ct ɉc{O.7r "Z5]8p8 FU8ӌhJ>c|Ou_{T_,dS b-`}o;iپg|ukyı͹4"”3Bd^YW"> :4J~SߏХQo#۟Gow_J{}?s˃accoVO[n].  | IR"޿Gm-ս_Ҋb?jeo=.@d$9}aU ?JB-rr8o>Pu3_W~L?s+} Vc[ RvTTeAd ǣiM G$⩬wI"FG,,FZV{'7QlBa3GQƯ_45%VT8{8aHX l˖dɱݭ;#2 4Mۡ_A89OM8Ǝ΍dnbo4Tev.PQi\>MU낝m+ono3821qݞcӆnNS' XfeiScTl$QW2RV%keHZuaBݙqα(+% WeUYA[lhrg~8z[ӔKΚyuįJyYKّ͈jݾci5 Ib՚`߯Z-ݭi&!D4-MӴiZLv<9B~ƙ xĞ~7l\vy>7.Je9Íow|n!6YYVT-08GS7ݲEc732J1F!'p||*5;;S˃rAy1Zn8HXU<2LƲم(~_eB̌LsA-⊕:: Dj9.oeo8cD2yӧ>z,?@N 0j#6eK<ۊѿiۯi >T!nMnv}$y766^ CHDIDQEAsN(uvĜkp]I sm7fo2?7YI5;qê#lޏBQ,f t^mÚ/Gx<*8Fri6[ t_cn}nlݚ !-Ju/e8O-cA0QN6+5WQ/?D.95ήӺE?. |n̓NhKR7cr!8mGqGs TlJDDAsp$&b+!_wfEQxG?|c/+>8tmfkU">/{Ip>_0Ms>6>QV=wC, ##,G&]SE?.o{e>yl~Cƺn`9a$|! Esz9'P w#4wS߆Ac+` A֙K} -`ÀqV(U=UKLB(BP2qɂ& sqX0a1Xttɷ7wlP0pjzUdZ~v#f %9F))LHLubO\r+Yz\ī:g˖Q̊eThzrc9N<-ӳKZT+[GR*WCu^YzzzrդG5 |} cb< rPbN 3 sM{>rMwݧ_&BauRQv 掯k?YlmV2vk~m|t*y 1oBB?|y||\̗EDVoX))z5uH[P߿_QqPF۝dlm lfQT`.T.}M՗̤"$圏c)׭sjͥ89u(1%-f;NŞuD ]BeT/=#z[=}p;٪iJ(KrScBQdJeYLZCx-<6e'g˦Un g=ԁ"-(rH6Q݆py&&is7%9x ;(Z /9"gFb:osr239EOmcwl E Y+6ʚr2$ Oyz4IyōM~? M7*.oEI u~z䛽= 1WU.0"dp_aaQ&Y5 3pꟽs'?/,}/Bgs_$Ͽ[m#š{ aS ,DcOojṼ΍eG>&.>!l4vy KoI9s3yhB8zF1, f2׬twD1p s%GRf4-Af aN)AٜE(WD,pGQBk, LMb@rݪˇΙu{qSSE] Bw-Cc PN09FR%Kg9_PDD;w|D"4UoZKT}Ja&L ep\C~! 4=z7[;Bu&M1ƨC㤈m9'_U:IەeV-bvJ.6%ʮX0E ,'OLC$@ª5vBg29WϡZ>z!$PFp 6DR| ( ݡ:O,i,Zjy(sۆޒANl%?K:Zi 3 ; %U>@'g}A???]çO|ߞW֮YT%,HwOkپ 4~7.ÆOQJٱ'm6::8Dӵ6LJ]drbzzxbXssS((d._9q[Wm#,:85W/}=)|["zu^F! K&4WC# Ŋ L.,>ǶLL&\r\(*J,{<l@j IDATpΓɤjkkrMLLDQMt]onnf(npGW2ʊŢ059\D"1>:Ԙh 1pdIK=^\(7o޿Vtݯ}ONp~f-ݘh7[qƈykgFM` U!r-Z\] EA֕=CG{f}ܪ*l*ATfUn8'qe~ẺC! 89 l0Bs #9`Jof˪LM B`adH 0E3(1\ŪD%L&_ 6 x9K8A@Xq$Bslo颽/ l "Q-5upN-%(Wr\}rj*pe5VEmljIE۲'_ %0rWg$umNAV}k |8`h`a_L 41 \-m#ZupJ8hl;vRU]~8 FEt2UJ%HbGfmJűxP:/x]xs>!. CZ2F>ozrV+|s7^Яa@N[RDհeJdm9np jJS*8;lƍіN?QJ\)7.r׭7ţM&MNM?+ ZIضEsF a*3Fu}iT,jeӬFe"U[y俺:<1GKeMtIUkŊQ_kxKe}j*tQev+6^ 8GTWWNF)G2OS_]٠T)+vG{7 .lܵ-sUkϫ]ky5ARܚ #?t!_x1''_3[;X{c 7芴rG?mNø z>w*r$Qd2SCM1kXömwuv7 T*Y 5MtmA[.-[g8u%dMdF|h+m?xz[5dI90$˺WaPT\% :%K&o ~Gog  ga`b 2bĤ&ri9vsgaJ} ccTX69jt]K e'f|:QB{[yUUt-:ي1k`O>kR po؎,Q˧W )(?d 8a fiu6VDFR >"¹1 E0„!6@JL.uG:65Y.zֶt#$33 ;*2nc-x:BPB,(ULy*/LIUXȕ.D [%!C&{Iwrlٸ*Nd tq*Eu_^Os"չ]Qкjʆعݤ Y(R(2Fkʜ\TKVl˨ k?|jyݮ=ƻ62+QT+& "I*sn>pH"|W(j%5d\h99힙(虢׷~XA(L6O޹iE<ʃR:4w29cNEQVtuuwwusc/2!>xW.[Yd)Ty'1"rm~l[JM='Dԣ3-.{s/QJ/~Ta,U]?֎>m۪o\=$Q]:!ĮVBz]SIJ,Ƙ(MMMMһ{t.ԇAX"QD\N%Ggl.g4O^zSǮk ef'&;t躾E R5APdE,I?௖KCܩt<5879 FP[o~ժŋRXL$i00ƚ555rZޤ8(RJ=z꩎v۳Mj.}Y vK{[KDSS냧N2J9LNs3)È]};_*"\{q8m;ͧYBJ(!D|ijTw.PU}-9p.y9z8Z%}dg e[֐\ʍOopmO[9mm]>6U Xwz~KҺ2|0 >1@-'9𒃏0pxFc '-AepǙ "aID|iڷ/| eg?o~[??p8׭:A`۶{H92T\cXh\wxwWxU\>Qq盻^y5kVז1Ԉ0UƂ7ݜ[|ko.;alV_΀dZ t Xq · 6P猨'EAj2"?{QB("lJ18BŲl]dMQb/|C]1J9Bq)31~9QDyXCӱ l.U1iA˕,!X)ʅJi|R=uPgG:bO&$vq2]LJ#%/\C-2N)'1uQUՇѩ\fy|n֖ 04w&mhsss]]#HMMC#n;qѱ6"KyO'M+09ĹOm/T_c{3Ͼ174v<Ǯ=מA,XώUKeB۲~o*5cc(8ZQBwBuZ&*ϵG'dz28e4jڡ5ѠX@qIV&gJ`Q*PQR5Mx<^'h*EA~BnNEbb[.kS7m-5D"[n=uTm0%PJ$%D ?OuuG}S(=z"+W 8SB8㱆#ף"!,5DB6&'~1SR̯tn[}7–GYљq>>18!vlv0FڎBD)˲r =_ ϛ$~10Ɔumt˭kOi]DY}=S86IK'sv޽1a=x=:oPJt&[ p!)|ty7túݻEx^mst>(JdcU|CjvH#y/zWW'cltl;nK&{n喝;e2%K:AkSJG0%aEHRsϿ,IR C~{g[;>o߾R)o]z@| BI $R8ȇ?/әlssDm[s(Ɵzㆵ=ݝ\fqq읝z8QxA/Fow-`|M};vH%ITYF4'zܚ(ҴVl m1&#Ad|DʘӹDܳub X*PM=s`( ":Ix^/U*d!8a1-#ް~?V,h^E٫PlʾKp"/FBnFAHhJJ)c3& [wq[gĞH::×h5[ó@m"9HF䱱=oMĊ{1 ɚgMMϼ >,:>"ho EFV=\zdc ޔД=Gvc%}JsONNչqYf656?~bl|<͍76&kd6ZL)e| 5aY+5 }=[^xi+ _/?ϼkeo}9ҙ*!ӄ),jV ES^WլȐCad!EQB$I3JO.0m.'~I DMbۦQVE0jϋ4WŢ"K͉hWGǥbgRٷw *y&S*W^/qw*"q@@XǪ'P9 G#tu-]ٿ}Dѣ'F~VVaBTrDZ)sc^40ZJ45Ќ2bsb#iM8a&$ίFkruٲ,BHWg'F c,`TUXrJ岪\j!T)z|9qK q%~z=L..5"Bn]0!|YσT./z> {OO uMz!eCs bs. $#ʑDu @͌1T=4&BG>OiT(AT']MӾo~_,կ@:W?'x"a?G>)Hw鐿8ۮ~ &+D"Oωdy1UzғSSbqŊxASeAM݌q|ϸV+@Kx%WW;[r|a4"uu]:@ϏX}oi;JQ۫#AgΞBqƀPbYvXNӷ- ;6A3#Ϲ{nx##>`+(b )*Fc1]ׇÚ~RܵSU+/*<9>p@KKlj{4;wXCC!ǭ &&&zO~9شgd g9QʨC)93MdUT۶r%sǚW_w΄ۭw8\jik ;oݛ.mp\?¢̽^sv=\''%^鮟 9~r;/td/ͽre߉33޺ib"ڂ1_[Uk,;[ڿjy(R <8D0ؘ;_zr[nj-(`Q.(%G~R \Aѹw%n}XQ@3><}eOG"R19427j TA:1^޳DCRJ(3LP|۶]X|I0eH$$I$οZK~<3=Ngl>WH12#s㐩6h]HGЁwYaTo^5vD#uP \9SJ_'zd ?za / Zޞ.NDψͩa#66'6pWDUEk7/O?cwޱ)dOU;iZ-DN=ΉaSGŢͰ0rKW=A֬y=0ltmx˒% k')QneD02~ m`1nl ?ح]iF؉'E9tmtСCdjTѣ@`hp ;9|in+C.վnG\bX,zEۧ$I,"YEe1S cl|/DBPLMAj\lNʯ,2wsF~ &A2oC0En'9 {L* URǶ˲ke85 M)#:)LnY'r̒2K cEOю'Tr8\.GdW.DQ6 0M0-Hs`qv)QAc"јHlXn)\ B-[uicTĆs.Yշíkd2g_V,=@ 'wEG;}K0gRCrFAݴl2Y7˞9joC-ܲ,+QLÁm/ U 9[gB h4RoYݚ$I"˲,NpIDATUuQrXP<5;+bnʨOl[[i.,˺` rdY5]mmoF bXena(eBP ߩirk6bDr5J"Ъ9hyac[ɱ 90=sbr8kiqXZr"oFk ^?9q[? etET%AҀQp,4z寧\A:c O:|dtd\0Qzm-Kv/ KL$ݾ;};`ɦ .q"W0 A.e[n"k>׷(ZnVVw? ?H[SvRx5y>=Gۺ&ߍm̈́MTrlJuI+[b@a^ 4TP%ڊ,>x ͦRH ԋ.,VEQsEP(F䋥B>P_^+ ?JezRoHqw58[N,_ Khz099C,tzph)^#=ǹ9/8}J>Jq|ɘ+&KqՒMXte__(\$ zC';:Oug)ڃA1Dt-- ,ϙL/>e1U. [1wm>Z*3/Q4 5+BS*E&r$pQ>= !2 ζƦxAKwKJ.#i J݊xCccT*BZȒ(X7AVhEFFFٌ U_i*Ƃ `YuL躮岑$>o pG0‚ `AjJ3K+t1}o|n^RrFTV~O_,K΄=<VZ.0s՛ZZu;ux4ՓqEYQ`;IVcݷS[dz^ʾrRi4\HzUjD$48zH(;(Qhf?aK/D ]B+CKw8EX_kEU׬Y|LjiiI$ղAׯzpKJa&3_"4OɀE{#.]΅v) ݗfDZ(PZ6m\1Qڴm\s>:e NJG~eiqՊN7:+Ǭv|f>m3ލw8DQBH"q@qkE|O@T HU= $RIP&^{7kaӨ`NlXwؽfFo{ qT*5WBBI&V g_}{KN+'=w M˾ŋmnlu믇X.^YZNE/87wH!l~]R>)- ? ~= Swm?hGQ9Qf9-2%qRIe%"$I3$c PJǭjƵѲ,+JFe Qyqwz0 QFqEQ6NcIf1fRRj 䄂 T 8ij9yslDe8o6;[m8$|aas$;~CBDC &s v*۬ ET.~u~;*:kŗ/k2t,t\Nz:EL)u݃zݮXUBSU$gkl{bAMNM0p@m/?@30^~RP /0UEQ*IDXPDiD|N=^*6\mk5{mm=Qw-{(0= vv0~~#-z>n,pSؽ{eEBזp;=tshW2:K##aUZNLz>k?WQ9$܍IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/images/tuning_import.png000066400000000000000000000205271475757676000270500ustar00rootroot00000000000000PNG  IHDRKt>iCCPICC profile(}=H@_JV !Cu8*BZu0 $).kŪ "%/)=B43422˯WBef$) u_<ܟcP- V7, My8ʲJ|NCkkkŋ@"fj1ׯ?{J]]][[tذa3j" ]nܸqƍs~GTTTZ01KJJ.\nK~~~~~~JJǏmkkӦM#"SSS"@'_())?>//9䤯i̙3,މDq|233Ν;`iiiii:@⢬LDDT]]}'''=z4555??D >]CCqd23kݻD]驭]x^{LLɓ  ӧݻsLJJb9s渹qkjj'2000888==TCCt̙ "^xo~Y"ruu]p!{iܹ\֯_okkKD~~~""GGI&ωJJJ/۪UHD{x}ن XqQYYXXXff&[755O7b'd2eƪݻw*xt//chhT*ݺuk3)J/^cnKvvŋV^mggWo/.H2Ąի[qq߿m˻uYk^AZ{ڵֿYYY^^^Rm||@ uM6r? & @*((ؿ?#={^t@ ݷo_tttFF-Zt-[P(YwCCZ>HJJt)))ƏsN$7--SNEEEUTTlڴO]]1G&bcc?sUU>}=Z~ wfO/Ի[QQ0`wDԵkW^|Ա={#LLLbbbH~WWױcFFF?x->={ٳg\ +HK.Z}&b1k(RF:pYCWWW__?##C~΁֭ciʔ)  >3%%%yx\gm &=z-VWW+\#i'.5:c2,55 ۄ==~q[tuu{344V[`AWFŋ@riϟ?gf̉ ===bD]?|+I˗/ٳÑ u֍5O>mkk^k76ղ3g[7tLHDD;v())awZp;wΞ=khh8h ^߿? 1c\xۗ7dLc```AWFŋ@D=z`/:tHMMmCYYyĈ&;vbiEfٲeVVV6mj%QWW=zիWٟ;virrnzzz={dObeɓo֍#99VSF XQFF%bL~X/HKKKJJ߭[c޽ќ9s-[6f###Dֿoݺb___sssX󵵵 6p&yeTBpÆ VVVVWWwrrڹsg5ىD"UUU[[[yx***ncc't"H,--W^_1hm+Wp?q+8P/v"cvv'|–_>}DVil…&M233SSS{сX311A >|yZW\@U\\, {akk  nAgHxDj* )By.V-b"[wV(T+9{kCt>2ؘ>hqVVxC&ɐZHx44QVR_}  ׄgmmx<ÇQk/_vղczٚ5k֬Y'JW^=x`555Poaa1wcǎu菰>N 3**ʹ.6z|hkkk``OvX,3gq^^^ZZڕ+WrTjjjw&'O$)Sp[߿⢮.HLZWttuttX,677_xv6lxܽ{W /**5֮]?.Yd~~~6nhmm. Ν石!yzzr6={mY~=ࠦ6rHjEEΝ; &NP&>|P(433[tinnk?h 'ۃ>&DlK>u^6ovsi^l2rȼ>>>>ԩSQQQk OGG5N>haaK. z:88$&&r[=zta_uҤIaGx(gg犊 "&"T:v[nqdfffff:88D퐜uǏ $'DG!2Yd崤5:)4s/---&&f&&&lW_}]׮]wuў={>yVǁ߿Ν;Ϟ=3f K0$ݻw߿,B_133S{CÛ6mk\vJ"+V`S///tuu3gμ{DTVV'puQzɆv:qh, K;vl"ufnذa7oLII7o=ydܹ&‚>_{,Y[<ۡt ͜ë5uTZZ>>>f""{{{##JVVVϟ?MHHJRt ooAq޾I999\^|/X`Ϟ=DT\\| ;ONDGٳgAAAaaɓ'YDcrpp07VRR7mڴdfodžqQ>x𠹹9ٳ߿իiiiƄ <֡}?eO?QSg/zǏ*$ vahhhdd,u=f~~kWFOO9s\x1<<둑lt޽cǎ2eJJJJݳD$zK >\~]5%%?n4hP-ȽRS7m2PCxsVin޼ijj叚?A7ndmM6-,oy㨫O:u۶ml嗈BBB? #|yC׺U]^%aFEʵ E<ՌU=EiN;uTuuQ޽kFFFFzz|t.\ȞQ{Lo^wxDtĉ۷ooٳ'ؤ wQ\\'"---ӧOYƍ.ѫ72B$\gbbݡr͂?{9;zOua̵\:>ƫ(~yS-2G[8(&Nxi"ZhT*ټysʪ;w?~ԩSZZZk׮A)++(ؽ޵+WݻĄEDD;wjccCDbxԩDYXXcٷo_.JZJ"lٲEꩪΜ9}ۊ+MMMԦMGD3fؼy;SVV…ׯ0D ZZ]LNKD'|͛7_v 77/$"--ݻgffm^^^^^^Ddii)X"`/77W INNu]  6BD>>>wMLLΖB(?as?6l@Dݻwڵk݇5d۶m݋*//~]~ ޽{ƍ?MZbW_=a|.=Ғ܋hOpӁκɫ{EEɓk->bX,O0!,,-߿={ C Oo,ڽ]3g477d6mv*{ 6XYY ^z͞=;**{j``G}t-nQׯ_9r@ ?~AGG'""b˖-#FH$lC.Yȑ#&Ԣgk#}a/eJ%%az罶޿Lgn,TG:/Y[M]ҁΚ']~~~ul#UVUWWO<ԩSAAAGomi@'Ro` ZZZ."sv;΂Ąy.V&Ҏ1}s;N@޲e4 tA :>J@D?ev8t6HxHxm wZ@ 366O<( 4 Z,]|5nݺ5 zd2Y$<2"`|P1Jfb EC^dZZZ^<:Up/-  t >hoEhWZ ڞoCpBP7_?ŪVlZ^^^'4K+KE=!VZm^{LcccLZ+KiR{Uj}d2_@DZDA~AS^Z  7\R+|ְ_?fi~n3D珛)@'=w ) UZ5aڣ ^t)/kg`Wz+{xsI2+;'S~4-ICKgd>9XM뭪:^8y}lj;4!/hi;cVW?~7"8JNw]f0{(?I]BQ{AΰgadMuuۡcnJb6Ṙ={ED"'ai~n~/)*d;XQ^6Zo԰v9-)nb "*z)GVF:"/{ k{C=I}:着J"bl3HxWzt;bd‚<"x}c5ICSهH7?zЋiIqDtd/r\ /rjuqܜC>ks_dًġm,މ54]?ԹvەGv[8 :ݝ'Rh=գDH,\6[=(-)ڲsn>WC휬윴,ce~󿲴]SSq4rJx:]x< MSfE߸:u2Y`yKF!Xrriqkvc\C)Q[WRYY<Ϥ֫-5*Y L S['F&*D.6}NJ+u ME[A>< {4?L<;-τ*&DQVƣ?t|kK*"աvBʊS~^Txի7!q 5u kWս񃫽,Ra>J|@$<44Ǽ?c33 vEN&{rJ[a^$E[W֞:izrVFKi+D%^[nAg[HM]@$< {ˌ>'iw7e~))߱u؃nb e_=+{qUe{Y{+rK780U+S} jաvCkm8mizq,n?W~7*JFUvn==Wmo^Z  7\:t6gll:͂ĄKx/_F6ݺu{>ZZZUKdmlllrrrQtMDDD#N~>(jAAA_Nk 5"P7xF ruw/{ij&FDD<occR:<\2U*IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/navigation/navigation.html000066400000000000000000000243341475757676000252240ustar00rootroot00000000000000 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.

    Note
     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).

    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.

    Next (The Main Window)
    Back to top

    yoshimi-2.3.3.3/doc/yoshimi_user_guide/pad/000077500000000000000000000000001475757676000205765ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/pad/images/000077500000000000000000000000001475757676000220435ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/pad/images/padenvelope.png000066400000000000000000004343171475757676000250670ustar00rootroot00000000000000PNG  IHDRKcsBIT|d IDATxw|SUOJVޫ,\ Q|yT8~"PDTeȞ"BKKK[w4Gڐi9KiNn={Ͻ{ϽkAA`AAچ\9{HAAncn`KeDR5csAAV  MZ^Jn|+.%_dž3޾j S_ZNLfO{X h`*6V,;a!2D"Z1y\686,/$\dՆt"twm?â:ү{[tFտ{8w0z1A]zT//,eՆtTTss/fvF[q۾yhڇjc-<5aSF᭏eXڇtd7ɒ~}nV۾\ulm}`=jgoz/MBѲb5;Z0nxwGC~ju[2mcRfVK~a)qD< _z>]Xe~ZmeO幷KrA"SѫsU_}8&׸ݍJ}MFf?yFZi}nǷ}ј5p[htI Y6-`lVm%fԾܢ7ұՂT;goRmD6l=NYyK?@FV>7F&eΓ#h4gn`'R'~x9YO5V`|cucΔ*Fwңudx|X?v;RIDZ5Yon6L¬)Cy}/{0*;J}}G_Xʡ;&מ]ZHL =ܜ(+Sr%-+i9wW{uod_*O1ZBVr(+˵O`E4g/^%Yqlj6j޾`tFIO_QmgҨ9{*1 JqsqDQNfN!;s6/ޙmctNd'p78@jTjޮ$dQ\RƜ5?چcPޡ}w Z-;ُ@jz.S$Qdj$ݽ p^3뱾~`M~ g)(R1+f]kxRm6 k'jY5\{^ j6K?msmU YGLMro O7'ĈX2~Mqi9aA,x~2zMn aflmdȤRJjITj$ n.)ymɾcCM*%5$y)`W'cf|t:dH;}r.3D++dNTj  w0zu Dl2KَZ;qr J G1zp' K9q& '{} 5$xhZ['eHyy2hZZw9`Ǽ4p jsB*%ĜB5PUom_NZm}p^N^1/gPZVmVʤtlEm A"hl+"ξ*˯8szu eq6(ם5QsnMBYlU_VF.aR KVRr&Ij_Caogqu3T5fmS2s7zn v655R, py;ъy%oS>>_$ډJݙ/=+Wry*,_w^g񾼱cCM&Qe7n?<5nrUU4ddپa# ERq)9څ`@Msf_%t[zac#EҰq dߝ^DuoS^ͳqӋm*@̹+hZejeG 4 o'Aޖc`c#_0N_H #+e6w)0'N@* 4=mD"a>T*"9̾+,EҐ_TJZ*˩u6ď}ྡq0Le_]",ț=̦b>La 5ǓɒWV=C:}& v:ǨA8p<^?~n 6nXWv2hK$uvz,(+TfT '|=֧F2d-T)(Rݳ{&KuC+ V{}*V=OU(Iȳh_~#!.ztSVvb/ɳh[n~~:/wGxz{8-(u+/=Ū_W_pugF5뵗_z(iU*՟JF*ї kP4S^^q}Gf޺T<^]"Hpv6ė1wuTTXb>T9D_e| rԫ-ʝ1a -3SSظ$% %itmuDkOP OYvMw>&/~jiԆCjH- e cLNoؖntT_5]_hja㳇/ksMþ(S"r`{WW q1Xkم=9#P_(u;nm~9\֠|k5=}d]JD>aO?2Ï\zPnA )ϻ3u o|^ ?N7&sXү 4x_aiigGuΡ̞2:-ٗp4,woZd^NM󍾬! Ss68H~a)q3w,'*+wsq;J8GNC8nD^AI-Tu*3uAw̟ˡ˩9KT0z4laSJ[xϢ:q絺lOaqIL"(H]cYZEY=;'[ҳ 9v:I?m7;hJ8QYLҠu`pv%%#re2Ӟe}ECaQVKqEYQ*ƹ8M~VۦN&3g_3sReG >N Nۅ׺7mn_uTg4~}=yIbΧrDv2wGM_e:p wwg5b-2r4-НI9 m%F+ w|Dv)8O9ELˢ}A-[CÖOh^qYQ4+<ʓ>4z} gkh꧃FJ%L'Z '(\`petS45ʌ\?kRjcxy_c ~G%rK((Vp-Չ՛Vkx-x;_ e/cՒKrZywhAK_WIX}YTFXZ!IQ5uҝ_l,˚kQ^psgÒmW`=%eì][ v6(+tƠhM~NAulMm׬Ϋ3^0}||Y;[[ZkW,Wuoȴ#hZ~ hoDTKn eE%etj<6ZGv`oLJQ..}yc=[:?y%eOqYxʅexJ]mye]l;pKW(Q(q#,țQUFrgp.搝WBaq62Zѯk({k|L]g7TKF,um]kS.q F&eCrZ)t`XVnr~?߯k(mϓ[PT*{zp&>.\5ZGt]FnA)eH|=]޾Elaj~nMgɺsu1s9TȤ겦Z?xưզ:,6Zy1eLO@NA NɁ \HV9z/U4-[0~TW@[vܔ۶}뼺K%0(>f7il?p; nߠm*JT*!<ķ[QRcI 6l;%FkǼv<(,)C*m})}yc=[:?yU/%Cfn H,j݅=,A'>)Qqn-G9qVK= >[sHw]YM QUUKkITAAgtRɅČfm   OqiF  cIc1лwn 0qDfϞAnM')/AG6wAA]8[) StqSAA   u"AAAITe|׬[{/GnҥKIJJbҥM>UBB3foUVN_i&lRwNXdVe֭lٲdd2?=z B(A[o˭ָfKղ}v6oLjj*666йsgz)REÇSTTĈ#|4|Ύs(ovww7zcF ௿bܹ̚5cţcA[8^oooo~իW3j(ƏZҥKڵ;;;9իWD"1jcn_ϧC#Ο?O`` /"m۶5 R}ɇ!.'NŋҶm[fϞ]Xےj&K.e֭u]?x1Zlz9s&W6Jjkƍkܹsͪ5(5Gqqq2'''=<666,X-Z{ァ_QQQ,]2rH}{ݝΝ;ͫʀxG믿FT/ly=z43fZ Biu/J裏xWo}Üϟ?Ν\.ʕ+4"##=z4vvv9sz ҭ[7ttg-[Ƹqݻ7ǏguR׷2r{L~!m۶>}Z_֐x BSkPn*A:sZ$ܹsTTT0| 99k2ydꫯXt) >1cưn:z-;Xns$s=믿N^xWdggךGDDuVݻ75y'(..ڵkkFgvk9js}55$5GYY1ņ7$jZ͛=/xzzLϞ=ٻwo}РAb txzz2|&MTL2Uӧ//Rƍ?~<...T*^~e<==x嗙0a{Yodddꫯ ?_aÆѣ999lݺh۬/k֬a<3rssٳgO0pBzI^^__Z?Gtt4  45$0&*׸+??O?ooo233Yf saԨQ;sL.]Iɜ䣺+VбcG,X/3"`s=[oł Jҿx]]]qppdW[Q_뚯L!ɭ9Xpar$-44T[v,ZHHH 55U?IP^^NRR7Q IDATǏ7*2dׯ'>>ݻl … u]fͿ_~еkWvZ9BVVjڴic4]}q,++#))PAY-A7[nmImwuumPAYז ^RI@ppiju ((^z("<<ܢɜ$PAAIII aʕ>}h;v_|PbTRא\RT?6F?(J}Y߾}dc>j5YYY5曓P#z]TT/3]\\5{ErJ/^RC<5XCK.̙3L:9wtűjyo/^^^RuoR)׮]׮]ӷAfq^(A77 pss39 m 9 9IBaɇT*K.t[oi&&O\kQ}n͖޾$Mё^zw^nǠAζL>={/LUq3*zmw\NsߪU+|MT*gΜaŊ|&[Vsy/09}]p2r"""8z(j8,.^htA(7Z3 % &S ))) ήƸR7fsMC0d,X#GHOOgȐ! %66}u億o>!^Y)))$%%+WHNNf„ ]vd…(J#< T*T*ѽJh̩S߿<&&Ƣznς ؼys8}7&bnA94Jn$$HJvatca}RRRj@\Ƣ/0>>>\tɨ SmܚKѰAAAd\}Ύ>g̘o͐!Cpppڵk:t_|PSodO\\ׯ6oO<IlY|9& b~'ڷo_k)ˉdƍDFFVYlYW3qD/^Lǎիر׶>;vh Btt4_|.]W^TTTsNN8Y@OLL8^ %Av` s>}:#G֖3gгgO~ivJ޽ 33͛7#7n;8t>>>xyy94%**~]vѣGN:e^ksm54$5R߮Q^xHKr޽{g у?Ekt(^~e~Gv؁=>t[;dŊ /MK$Yf 999Э[7O^rϝ;%K0qD>|8{/E;>3{lϬ׶>MR_|۳eۇL&#""{=zhPA5sЭX!zɻիyw'<<3f]|݉`F71sαxb M8vʌ3Xr%K,K.̚57|Ӣ66_sMCL6Q̛7F;w49믿믿^k}:u>{FÍvƜꚿ\.7 0Yal->ȃ>hT6hРzQٳgt7=hPAIݵ/4cݻ7Gmf O>DkWN^s7EaAƤHܤ{? mƶ  PM q}EzzXSAHHB4Zwttl G$D$!` -[lf MK$D$!  BCH{MA~>wDD4G{Բ?o&B b?( 4afMosЏ=ڠF MCAn}b   DK^lAJyy<߭[s7CAhVKп|n]Z:AvI m* 鄆jAvG'O$]_jgCCC9wA %n Ȭ?2Z 7wA&`===kU' TMAt{{{U P ;˻r?4G,0zSɸt AS0lt{-^̱_ G_glpӰa 4 ;;:C_U#)+.uYZDD0sJwt1F[2rGGKpssI9w|Ci^t2d߫~Pd$e\KL'77Z/4{{jh;gdGZ\og֊Ԙ+0P__@Xv{x &3c jk׎O?hC2o޼Z˪3Zβe,wGGG{,_`AhV"rr6 NMK- 2ƴNnnp߉za3ʲ2})aݻ35m8{>AԌeLJ}6XD.4M8]o46ME ,(@P-2ܐ{zR3/ M+ RteeTQVXHVB DHބEEakoTnt".V Q/io寢JRS)89JTf;gOll*Q+)MJqr2 98s1A.AWsvV졢 ŭ;SԦ0ʽ;rpFV^MITpIIr\!;C~(lf^3%qQ9{#UU`S<*WqN9Կ..dIeNIp{vpblJgsR,ΗN4_%2NN 8?>qquްL읝:byFCL}vr, ܹ_-f;?8yx0YerN<'WᏃ'~ZEa.yg$S@QBr//w9$I/ ~U zJL ?QKd O^;Q;8?e(LQG_؀xnJ#0V&~fW#.ڑ9a E-w45PꅢE[; @V^܈c[>.T=Ɗm4NCP9~ιu MIw-'6[cv@=wbҥxlIVr2+w__<~ؽ{W8{xp|Ο[y[QWu\;pҫW߶+ޭ";7D7nt82/ru®A+tuE'~KPBR> *TF8\Z26ŹhPjAq.EOvq?K @Qkſ5cfR>#8'BmA&r[{n(ZRԶŭ;w,}{>%bM5bLCzN%Tl wG㰮vBq1=@_B֕&_(PUTЫ.Æ Cqqϸq8{xa@ֽ&E(KKI;ޞaO=3eY /]h**nA;zbk˨-h]C*E(N/ JJˈ'qSIpmӦQCA= }N֥KhR2FL#}heHK>?aT*%(8Vpso=eee瑒ϕed~^qؾr 328s&v> "#}42=VfTY_98.Apsle)0v}M {ܫWu˯PdT%%de!wtSw#>~liw$ΞF䀹ed0ggqptD(rKɺpb} h~ܑ΃jN]ލ2?=eyA-W(ZTTNn$>>EmuI غT*|2Pl sn>.ӯ?M}Vٙ3``$'ەxoSы%䥦/_nr{"hG9Z#8rW"zD"VHޣtlyHml˪% ~n*:~=/rt%nW␞KE^& FEQ KP)hhZ4 -Zbkyrv&!I7gDε 8~}s,~qq3SC%ڿY VTc 7c\(3u1)Z5-݇gRř7Y裔slтgbOOo~`꛼p!.ѤI|5km{Z[ /]")=is>9Wyydrh)W(WhFiZr9Q0}Jҹ2/9NQ`AnO+'Ori~R)OOO+rӈ)<\y{2;jRKq$89h-Z-={eH>̅/Sߥ?7SL{/-idze\>nddhk2BqHD3vwK%%? -ڐB.{ƪ15䎎k)S2eD7yY-;;GG_'Mn;s8RnTs6Π!CH^RXDABZ1Z-RTNHV3M{޽~`gTfK^#9w`ロx @2Nß('"N#݅?(A*,Qp)W3()U"2R) )) )=’2j5j/o_濽.< ۢ\%htgN[YQ0.#SԶ;6%Y\Ű^C7C\ɨFQfiܸ}YN؊9ؔSޓ7DfZB xG` .}rj/&>9YyEL*AZ>R XQNzv> YRiPkԨ@~}?E??[{B FTr /r%gn4?E@kG< @؊9xλW>M gKJT;$׆IZ!3]Q /v&KJ(z\[1l*y/UIѱ 7C\Ic`҇?@o*m{( ]*飞'_cK%&RoH{\[G'}л6+TjS3)@qѺZ Z-9%\GTVkPtҍ;wW@|#)IM  4-+KKoW}c[pТ Ws-(%CXbpl8I)QT_jt6'¶ FBhp%ul>Ux2n'S3.dl9d\}dZ-c=1n2û2.΀ACe2% )Y++0I$$$ k)*bʔ$[>;ɺ|V?nHe6d8ѤA=n=* J#(0Mӧ_k IDAT;U4<&J2QT5RDO:wAN5*KKI8|baHH "#+/_Z-.|*JnXSU-}_4Kkw" Qc<7oc(IM<'Hl+U{_?B&9=Fdb.\5HUGܢ2***Ϥk4 r.@(tI <;F[~AJ/9@ YmI>S>D;{YyRArTk>R)Uh(PϚ;AΪ$=$q*.Yu?*yls$J%]zuqf5ހc=Trݯ kOcŸ&8HkQ_M~quutcίghg fȤȪD^V8;8Ѿc2 ~uGH(oeAnggVfC~'ݥkÛ٫7AAr TK$J$ﮙHjj%hZy=vɗ;Q(58hjsGdΟ=cTCnr28{{7ADtq#ph8ڊ]J2jO IѪZxYW28R)OFT4h捋5UŸ$'b̐''맱FhuI8_K/8'jW%eވ:{l5׮Uh/J>Gd놻h4Zt y]"AZ VVwi'Z$HAѽ'P"hҲU0Y = 8ZuX{*pygn}~#n=?JB;| RnuϵZ-ťa;av=Mi=c r ZFTF6"m +!MsUq)j;\:iHqYh49MHZ$Z)ZTrŚ1BwaRY߾:O 3d,09+.9aZuňE@%( 9 qrN={'1{}]TuUOUw:98-מ'GoŞԍÉ8-$6w.\ؠ}>ÀPDmjNu%9G8cdriE%,Ή苤 H{ω (ȊKR@QKnؽGyʴIKK#--Uuhhhh 6'~v8e99Tv@?IڍpdY햩9) 1,]b0P9kA}ι, Cۊ"c4ԑj涊]lv9WPb3Ă|.8Ι( Uc[K08[vy)E@VFٸ }+cbORPظs-˵ҥKCAw""hʒ<A3۫wdC=/ )xK\B* W4#bGaaP?{SIKKc=-CCCC&--[48A10dҥkbs< ajT̰'L|9wވռtYϭ((jء#ZQP:vS'1e5.0 W\h4DsL6vxtS_{ "4ƦLRU!q[Aw`Ge9Q F$YF6gs{AWzhD% Nda+dT "q7={`?Eqjhhh%%%A9Nqv;(5PGdT.&[u,nʢj[A}DF`w3YYRN#kl~b,!rPۥ'ǜsBr :hKK0Nݮ(!26U}Zth(FɄ#M#C1[]66fRuE$pCAl6,IeECddE<<)r[[сE}yҴGj]AET\A$EVKXx$$tXivv6ɭ-CCCC&;;5v㠻L6VDo]mr"8PiEpPNU޿nWu+-(PظF #(>='޼'̢^ڎ =V#j^\=@}h\ FKD?k0hF{HՋx 䦧>jvkc4=kϠ,8Izk)؎ã))-EvE) FFj B Incf-/`ᵋWT<$.Ag|\щosg8gR"[]ƢIԾM>q[*2- 8NYF^kѨ( ?w DNȑK j]qU,!j(1Aqhh4+3(Y(ˣ1 {Ǒ۱` u@f$u79Y{ャy'Oz압L::˧Osq0ag̟OO_]d H]=Ϙ>'7&ձ#edYؒ{i9e-a(NOE7 ~$x:8x[!(U ) 8vn7`URTWCgdRRukKJEE!dn[y%c)|)NkFЍXgMaQTTT` (^'xR]𝏪B^Ӵ3E6@u_9j.'N  S54N>z>zr#H7n^pN%k~*3{}wC1yz\ g̺N>}q6~{2xD[Gctу=Gٻ~=\ɤfUT1z\{&ٱzu=ϰ_0Z,$vbXnӧseq OeڍУqHa :_ٽ{,"GѣʋD$;JjspW8OϝUNI}]]dW( EDUuI2&mHZCN:MtRѤYDgۏ?bֶ89bXzuγbT;9<=]9rydrdhǎg;f &Nd5w}ĥp+ߌI"l:ևا*AO|"ҷ,Ñ[r6_ːG(2߄/ܡSH$IX+*ž]Rrh:G%;v &>ށ g\2O {ki$OO2r("dغ ҝҩKWOE!GA xxV793۪tYV{r٬~$tXw0Fy>cF[W`ݧE0M7sET PL&+U'1x-ʓ)zr' ٯ \x1vwٳv-7\FvG$$Jѱc1Q0f;df'cLYYտEPpw(n2nI0)+5ڕj_P`-?Q0<Μv &m?~g]O>muoƾ}@h"薎z3Huɮ72҆hDVd,@VPApTVc͚dϘ1$tBlK:Ii^{ׯ?b8k+,͌7A_'4OMi mh_;F⯟P0z6yg'ǷO<e DA]/ %E_' KrSXPHՊ,vuv5*n|vYcΣp$Xr%xmsǝO|Iocsx4tq ڕCqLQؕ۷0xÎi * Hy`eYS=3ytEQ|9 n kY:k}=.)2 L[pakKh|ᇵ?\O'owk ْ~9ؼ]_dcXp`BWF^y^~-[رf t:׍eUW{{pl.CnN_mDw``7ZcE1v޼&G۾sT1\27JN kM?}[`!^ndA2< vp:؝nNE]kFc[ 5w8Ϲ'Ov &>g#fJMܻ0sқoӇts?ubM`HG-Uف.J~%ɓw. 3K^Pi[eF^qOo;AQVindB_Nsm,讍>K. Xn`w`X7ii~x݀Ywɬ; Xevtߟ{?Wgأf3zDsTƤEfqΗ xhar:EWWH}9`H?iW1,^gɮ￧W/Po,m%[>:θ(n7&K(:dEA!z"iNӅfwKQA LVPgjE)m`oN_txNFƯOz{ofM7Tw)>c{s(z A6׮ጉռ}EAqXQWᩪHt$to06 ‘;I9AP.;aJH ]-O}h貆F|D]Q)s=8NNGpH~md:%Y9>Olc̴+`9px=B%d͸ԅ\{˝#+ nˁ%,фdnIFйDX\n7 +99X(zYg8bb?mZK"*O=zү]_OisdκC= 4ÆOdHs(ͮ[!.EbR x|ynl NÅ颤].hLC(=g"[, ɓ'rʐ9em!ʬ z! lp#9zn.Ϯ:sgȢt11Sֻ_cjd׀ M&]|1\B-HpyVz9 |8vJ (*ȧAIEJ;6J+).)'3;Cp( eYKJ(+-UU`vIM"sJ%8ܿv_{IdZ;Spl/Iz 8w|ȸ.eŔ`;pxR6Jk2JJ+)-QTZ8~0NsndSRRHUHYOxDt& #11BZZs!33ӷ˗֝qEyfAh4RXXd];w(m۶&\^sx6lAIxBc4ݱ'L`g5אefAѥMEEzCkz .-ֹj2A-\yl:@a0Ja߂7޵NQa%o3\H=.U^:A$7. á|y6lGvF/zy& .߾F9m]I-w;寽֤slYE 7Z$u̎km;|+WV70̘-azQ].7֊r˱VvK('U8Lna:t+ u9*9u5Hh3k,K:t(YYY|,ZN:չ_ڵkYtiGp9߄nC. [ݻ7刈vk39زe aaaу}A6$v:Yr睜u\Ȓ;uj-"8%3WW-_ܨgTe<'%AvE䐷?}Q5nߧGワqTb}j/ioto^u稸?ujHۗ/(Qhv =ƨ(Ə'{*nZA13=j[{vPTONdltV#jm(vIҵFNᰓqvqb.]pMmfУٸOiõ IDATճ'"mcᰖ^Æ+֓*[N.:?s"?8Yǐ¦RyaÈldzMii)w'O3`ĈXJy={6iii1Xf̘_~ҥK6lW&++hfΜ ={9s&]ta͚5,_ǏHU{9s!ˢEx饗0L/Aʕ+v%8Q=.%Xh#g"u,~]؋SRGhYP\9=q9X_YZ=O,&}7*yupp: %lAo0r:*)-.)ԫӡwo&|sN%h6n{$vSsgK#rA;ؑXDV\r(/0Ң?k0|x>^a0OYb+;;e8W {s+cWK::Hn7lav zU| ~qZoS\xl߾uc95_GȆFM9-sTFwblZNJ]l!woLajwwC bwws!tPSF\vϏ?$_LC~P%h6n{$ )6~Cv:Onao,H ޽IEv;_5saРA 4R~a|< L&\po7|3%%%2asҥݛw}H&N$I5F֦9yJiIy5g_߾uBI4.k@]c6˖1lFm[PSqK8m6:1](f'С$+طjfL`g$Oniv ==z`JL$oZu 4.]H7]ֆn/&**~a6Y~=ҥ 6m'dժUtMPo3^ve>V۫ @EE_~%I>l'clؠ:@~-999{\x:vC,6/_ЩSKI$7˖u@6qqddoK;tI0Fdy7m[<[mG;tF/'jgoT׮ƍ;uJ#1~<6i]Bf㶅1*3fPq[ਖNTL $ FDnA9^[#<<~bZڵ+]vwqo￟={i&Os'L@׮]9z(@@:_ΪUꫯ j=f 6{wΝ;رcj4SNYAaQQ5wfW3ϰ駙`察K~`ټd{?,N'I{1<'SQP@}:Dyn.v\v;DDb"II$AR>7Wo{@Klܶ֍nݰfdP?G 6IQ'[7z&s)m {1{z>|8v5A8rHF>u<@/ n> . yxׂz<@GGsIɨ3hDU!UƉ ,g>H}0]xό1񪫚 EhhhRz=a:Vό B>xo, .ӆ?9V~i}osP"m7Çӳt:%'fK0U4tT?lbc>+Vݼyk8vgi n#u@tSgO>#iuJ[ݱ/@}:Iii̸6z  "rޣF1{ nee)'G@WŶkzdKcѵ..B֨=#Fx )++ksՐ뷞Q .f/3z ;S9t;9+%;vR }aӧSڲNj >zo]ʕ""j3뇱S'}"6pFֲ+5Vg=Cȧ uh[hFۤ]8:Ϟz[͵{Zx] gOs|"v 2Ʊ1r$|=N_>,&snES2uRsLR>|a2\S=7"X?`63a|&\ziڢ)2KOtES2I;4.za7ذl.ȸ8.}qR i t$2dTv^ ˗SYVFBΜw=щO~8EA@v8@QpVᄆKVVQ;A7L6e |)ݶr%u#wodYbI\ptN޺SSԄW[=m`[ y[ILM Y٢RRЁ1r,R 7ِ۵~m?İس|=LDl,EYYNJ_Obj*Iiiİ髯xY7<e?EA*-ETP>!j X'#zzHTn݊\^>>lF<ڶoGv8no_s/Qy3ݎ!9CAAQCCCC4l1s&\1s&{RVXGg0}PL–o{M*cbԉCsp{I If8@Nz:.Xh$69__A6ES5Fn_h>_GL (mqϸtz=:^Fw/Nn'$0p,:G<3{m 6ȸ8DQdܹL&=@h.6wa!Bk`ݴ Cr23f`㾗-#LEԔ)wgf&5y2b!bU窫8<#۷pf-PCCCԢ݄1ӆ !<6B߽Gǹᥗt\BHDeI ){sK/('L༻""6yh̸OLXd$:oe'PVPQc#~ 댛z+8Z׳gsϞ ;tؠ41&'#B;?gwox 6m6xpk˫YUWIF9QNyn.bv;zت%[74747i7:s?rޣG@tb"?YYFi nӷ\YZbՉIJ}Pe`iJLdԜ9|#gfXKJGYd s2Rp_> &'ٳQZCI>!(.Ӊ`2Qe ˅I_lŢ~׵֠<2=ђ"3[?x$,uN,?)/(Bg00~֪䤧񣏒(iCOxL ~;P-Ncۏ?r89{6Gwŋ}XAcw ev-kR[d@g+( '))?ǣ<ވX ݐmTPgOsuV+Nڸ WL'$S#֒6.RXX"Rq];}%d:6>KKId8 |EQedܷoc̹n>yQ~Kb;v39Qg9sp\$vZGy(Md 8+7n¢=jSYpVV?IAFzkicشi<{ĥһ7{hmY'N>&{z:fYqqL[ĀN+;Cr2Պ;7cU6֓͢ł9fy'<\{( >r$mp<`6cHI ܻ7;0vʏbGGٰ[u:'Z|"R1IUQE 9}s9}ƌ dnκt?2gs,YH\7a=@xX+*wJyQ䏛-FعtEX?㮻NA $ ɜ};18ؿVk-NLOYR8jy- Fꢺ(>~;Hω;cgVqCiw]u1쟆Nj-'AEHTu EWki%ܯH# xMQ vz=J}*vE}NzIn.uVKT:eO?MNz: 4Mƍlx]F ҁyp x 6Q]A3t:)*,dشw>5E8>.*zR__}1W_M#Eu$9r&|EUz_>JES:`4Yu٬j=ĚS,ۋ^nS8G}gg=}C [ƒ̡}"ҷg?6hFEs54doGdظQs[;GAF/Za 㗏>wޘZ"/z&C:`;Xu_lx]\a[:Nk5<.)"##kh419L62>d)߾v;ȥS2L._ #di5Oox o{ [rwEw ;CW?EztKk5Mq:ۊ,EfWX4o{[JOtrRWy4?f4{:#8pE;{GmFoSn617Ɖ1i.c?hV>_-Rd5לvbW3ϰ駙`έVEjb>} ~| Ɛ)S|9卩%g̙lK.~ܦ0 1}K%Z-tq% z&^(EDp2<ӄs>x[rw2_ ojtnlW%wTAnᴎ<-x[J/ }s}k=ٚWsBf۸6q\2$)8E(l6qXEnaH6111_[1[KdrԨQlܸփ,Φ~Ĝ}5444%ŬZ{f^?wziv6Ķ"׷ﺋgQ#1yXEᩧ( g)4S1>w-njwb̃ + E%Vر; &0dYtƫ/ꏭ=)oC\j*]&fr(?Sa}2$z&nDohk)~3/dRzvnjλۮFNA)nIF@ԉfҫK.7EeEY  7߆ʋHʞߣdЙ;.c5o Q2zxcw'?믹:L fE_VUthl^k?BJG4H󎭛<~i.@q)7Au Je%%&ኍo17X4]CCC#dolޑ#wク].'kP!8m6oTb~;/K l'OrZB$wv9V :Q@o#SԈ,+X0 3 W\}=OCW=Eۈݺ~KqN8W+*z?'bCq'ɜyKkN~C93C_cm^kvE9K*'`kW ;8#N CrOyw EAєL:Elt vB(r[Qs0jΜhoXoᬬ${-Hw%i:] r NqDPs+EQPEu|d݅$˄t 7MKks\&5HoܛDLǝ\dˏ 2$[Ekh4qC.˷aۛ^͹nC2gCc[`d2 IDATӉ-b"É8k׬:: 'E%6nAsv;v6͵F{nckN@ڵȦ0 G 75<´ %((>1 Ȋ(( ؝2zQ *: gO7(?ѳI5[wBG!}Z$S\._!zRFknoze lꝖhް^:ġdWS˞i^3s8Љbظ9AIKK 44444jaժU<8vlk8)̤4;ѳ,E|n:\g]EO$EPAQPdAP@S&"3y ~[sRzQ|و4;j}-9h!_るBzWK6f.x~oS:l*)c??$͢(xڸtt$K$₋l^:谣 !qs Z}~r2K:sxگ @2t_R+$y"x~Ѽ*gA?X;. 2 (zKBDh6ӻo?2} 塞87Gu: >I\bTN5o(wv ;o T^\ǚ O>Ԗo;~aU6[/N'bY#U6]'IbMkg-jhnoz5W  jFF_~a5+:W۸pwe=qs J;6th0QOZ3hm4eâpGĢ[1Ht 8 ވ ^G/( :;, "KFeRӺcDG%8$K$e99덈 K 3WrcܰO#Fs@t5T^괴jvEQ9h4{E1H46,#]AFzÎXH46n.v:x4-\CCC# 6'~ 04Zʢ"N_Q @LL,[D*s ~Θ7ZxEj" H,ICzk NS.X 6H zæ XPT%Y8GdDIS?ڸ:ajnozө(Eif dF' !#:[yl쉠 6oڸ%={q( :HKKc--tԙ eDDD t% ۭ,; ~y/Cj ׌ٸ Qc(Nfu]OS4*+0"8<vPjVt h(ouv_LO_X04MoZ$*"P۸A߳gbQCCC#Ĕx+z ƾ}:@$dYAdarԈ4PY 5;a,Xg^$˞ڷ aC稬e@^N6WQ:&#Ϙ<|$:oj'W{TYWYgPv y-x]Rs{+X|]ڼEQ@Qz68ZqFɮ-,\0FɩSQdKXc9z-1;c 7jTH ^E߻ rIII ĉ'.Tj)***_TTT,֩7y$$&N=5g?(HDQ5(n [r#(N7n I(%5,.D-bүyz=Λ"]g^}VΆh^>gW>tQQ!z_E ZEX\6O ;< Aq-~J( ^x!%J;>nBs-M&f3 Iᑑf^Zŋ̾z|/;o}{j@:fSc}3,ET~a3fԻEmo󵨎)CY!xRٽ{'6U' xC8.,sp͖~Q;Xoyȸ6JsFi**ۻǥߚeEެm[BCM8ޯΝkա,:GGsirn ,s%Zn׸TӬ}{.G@ǐ}8ea(VR-TgNIlZ9Z`[‚|d*=s Y%ّ4kdRrjx?J2uㆢQsdH^A}\Cf vz]V\ywZuLɓ|~eA~MKb(,dٴ҅^z zǍO?j0EQ2o{W"7=^^O>O:lyxR/\G`ܹ m>z=+|m}ǵwdkʥcqBRϟs +;%Ջh]ϞL{1iSiΞMr261>ʞ~#;%Fqsϡ}k裌v/XU#J+p-;v̵[:8qkH֭IHH૯;`ŊL>`dAa6us-'ѢL$ȟdE!(}~h5 &EBĴjkq%xl>eyQYV)6,+p|L^.].7Vz_K{ّcG.W=I(-#0=zqC9ŠƱwfzqa? _z]sq17n Gr }D)eoc쪫fv+oR5{~'~㏏?~S`5G`y##EE,?'ɢoŊ29s8n7y2'ca-^̻wͻwW|C!Ch[?ɓ8~=̑[$>'^>(rq]zؾ};v~x2!GDrh3d5k~CedF5[?or(2'>.== Ɍ,k&YOV.7nzh3ڢ| [w&3uh,Wb*F9=Po1n(z5ڄ(Vjc h(p@tA8};EyyѡO dgw"i aogN(~ O=5kk̙hәqml%09{75k%K;t^q|.^e\5Nʡ *Ֆ#GL?nݢ#E .=Jfb"v(7ԴiR {PgjL{, F]4~K}y(+IwIIIݞx 2 _cF!ZK߾}c<h4Ν[7nsq]wtcƌ)V: T\D??Qܼ4̲j6a.6X8lơ +*&،LjjyȲLvvG/eЪ5d>i=צ4i6yyd} ޯ^cܐ4KBeID]1>.lzբ=Zom]P#lFh$C6YUY"^ZV2C?o^F,=˱֨6*$ЖQQNdYMTr\ϏcpbN.^t"oǛ5ֳ]4d/9q)U|[e^o&woBYe\wݜ&X&2G= ?_XsNg|N.]J 'N4h 'tB&OLll,Ѩʧ~ZͣSNF-[Ʒ~j2?B԰ar2B:'\1F̲l2`(*d˹1erIPh(`PLRr2驖^q1,tk +sENZQ#f\F/oU<" E«0ѤDžMo_-%}ozXEtA)7ٯ_<8|m洽:VZb_ IgX}6ib7͗Cr!k89m#ys&e9L -"#n}kYnR:NزkrdVt5V t^cG$cSi.y f1립ߛ.1 |u/[h,^_%>c ^u]vtujO"..ݻw{nN:Uׯ'99VZuVVXرc+>bժU̚5 NKv/__zNW~~{swB3?-~ɽPH^nE=;g00M)(2[` 'r ܹsٶR^a5u*^UwһC߱3y먹4/H MfLq|!y^zc1ITPmn؀l2'ʡ$9/^dߚ5=VqB޴۷%*A6|e 7м];ZDF|,,?$Η: H@h(//Ri6;Ǟ+hENj*'vR]/f?O7Ul׼];t%11n_$ &Xo98'CgkWż.1s%[WLHHHffЗ/_ڵk歷ު5WggR#=I`QܩS'{]J `_iaƌSzQ8_rz$N?w~5bn@jQL&EExheED2F(2;%qaW]EԈ׻Gr !0NYYQsfFUU:jfJrz$qy\9ңa&j:pSrΝj|_|, aW}7)84o׎y^|շ/s};i{W.F?> .6l!IGG_KF|<r ssKI͠k --wecή|ugIM8\}&&&X zc2ȲVѣnoIuAm]4ĐٳYD~/N>*=0( ŦVUo g(4|.Kw%TAu칐ISon{S\2V$t NƖ:% ???V^ͽÇ?~<ҥKuW_3kRJf}spnڶUQn/IEUL& HNĥ q$\<\~G$1{h}W2K^O\9Oa5ޅ}3c'R iKfz߆y܍mhE ҥK_ϛ7>9I-6mZ^R(bccX+z / R={ѺnCU׿ų>[ N>+SngO钖>-ƪ]UzDQe]EoC6D Mou]Q.4|ܓ̅,OnˠvA b7^`..ıJe;ݢ_g0xdb4ի{elْn4/W5wFQ*U^Lxv|iIQUФ];̚ M/4< M/4< Mou] -rn~E#:l_`hػec}7.UT0xgӜ޺WXPȾ2#21酆酆*  A5j&5 ?u.!S N/HCpfvnNvbَҪðanBBVa  ;b&_q+Νүb{˖Ѧ[7&<e8i3xF_b2o{ENTqÛ6y2NGm5vzv崏feXM_~I1jSE}.;=z0?u+?-\k"iN]oV/ZDɓHZ--"#4w.*Y{9cFp͛W$:ۛfW]ŠisٮH3jJe'wS+] .Czl%j0~_ @ɓ]/I՝;_8W]^ ki/w?Æsz^]ANNK?LY.c8=~5 O?M!CIKcoC1lj?u*3LX&Vb>?QwɬwAe.wĴZ+y/w:=LH>?f.ʴ= H=QDH IDATh4?$?f\\̚'G7]@w/_w~]}5^~sޚ9.<eLL 'f?괍݆gicRC8m#︃3{٣2b \:v\3q#Grj.to__;}kM hޮ:>,"0u*mw/ѣ<?k?L@]ǖ/' 4*_ɩʨرn"2G-?$=ƲU.wxEZ]>Cۧ;%@+}=s'!!ڵd[oEjZz+֭WP^߿V8Ƥ264;$Ny )GϯsAM2C6`޷z5L)w[/3x~X>7z+Z//^^t8'Kٕ` idn]*~?0/ qZ=~~?cGZb{a,,DQRΞѣ5LJ^G3ж{2-_}E~V99l\^3jf;{ r)M+^^P*޺kWtl[E޽ܵ˥4޾L|AV6ׯǐO|ҭ4&O=ZLɈc|3Yx1c..&%v3WQ$=ÇQd?zvʴV'o__&=~?|C~>h4 hֶ-G*_wRP>UDu?UEdA.[!j4jeJcf7)1htf&+~NdUW ]O++F{CaNFڻ,Y>W먈_p0-_Aу1iӵkKSvI,_>:'=fM7`ҥ|f3W_͜?.6ՄEDЮW/ON9ߟD?0i@bϯ~ WHLJ}VX1 c_7QU:0e< gx޼6""ԉ:T~JǨ\yT^~'>ɉ'l8p@v]'4$q@ pЗ. zD9ˣ,Zh"j=d^^Xީqx࣏<yIu[]ßNVl;pgryJV^nf;Zd F",;Q|C"p}&ND#I?tHt.O6NNo'GID-^\VFox/DV8 v.4d .Gt@Pg46#ސzNW2.N#G*|={PrsշAϐEYa0,tz}0@АqUF^t@P+t#P:e@ AdA]rNCAAnACQQ}F`&]FHy˓ʕ(IlڴcRPPPqAo`Tt<%ؕȊOϢώbə3;wAeر.G`_+aa0o@(rX {0fK0➋f?r>-C -CL&^ڶgX { ͖a= a2Ocə3DFFt@ p'Nݧ/mƣ}j(a=wgk0u0wɱ[@ 4ZµZ"##9[뱄Ag3[^JUUU*"xS'?~\YwҺ5]lyM(^ڌ6[xIIIb@ $# zP5J)F\PO̢t:t.ZZY8n0j֬++='t8~;s6Q?=sc: fc64t.̸MK+CKޱ#mwGethp,O^!u.(5'_j=F eͭƽu99[H {Z:1}C6.RwMhhjhzuCU/c;mK@h:.-u:N$Ix{긑f^e%,w(o\Wcr ՋAoF-w/UɴW7-2wie.+gwҤ2?>`ܼsp.٣0y\nSRXhqFɴi6NN |gVGeoBQzyݿ;5kyQF~;,`UL}Fye&+9ٲF":ub҃ٻ)w*ru\xT{`4շJ[@cq2F_n[Ǜ-uQz;ۭ1O*z_O֭{i=F߉ coT{h4ND z rϠt@ hdǓ`^3grx&334}:ݬ"y3i/ҲC .\Νڰ111?n|i ,l;N)DGH\.9.njqz.EQD_PlDk$&qRXLVLڶEcoѾX6BJmedrع FCrn1ricu7ʵ`B>I9iMn@PX\qZjKpp^W10U@r@ \I&:~ iH9d4q+O0-绷l\صkJNFOQ ̺}KFHN -~@ҙ34iՊ84AjL΋o숤}l*w}}Y`D׆77])\ hKV}Ѧ[7.;jՋq66ӧiwL|A{I>/@e0kL@|bY!!}|ugWSYA@RR.nEs@nD]PW<>=oӭO8dmsK/Uy\W}/Лof7;FuEDR..C0pڴJ!5D`_ g(L]+;-?(qO)uh(!`&H:p'(-e.CB.&vC[ zc4˜ @ \y?a]ѷ9:p"!tl'mw[q53gΥG:ptaA}#&  ,|' YݖA,#oT..ı ?zs#\A7˜ @ =[Ng뺶~/ȗ_rեt1\ x".do Ҩ Ȗ @ ., r@АYt@XX|Ku2B.Ar@ e/qʹ)=s{zȻo Ȗ &$$k"֮][#111|Jkj'H=}DRR0 u:u:[ 8";ҲK|Usv|<'OG^J YY t:CC lтf:ТKBZW"uCCz+P{6i]A0"[.vCTTk׮-sƃ>ȍ7ŋcX+$CE)="iV|%%r\T)(W:<ڠl@ Tn6Ν;ǢE8|0f";;Ixꩧe٣qqq2Ο$>MU1O);š-}Of"ބd2yhѓoٽHEt_XyF.5~5z88-[Q13"[.AAA^Ϗ|~w9”)SOX`-b̞=Wl2㏜OPUr;$y,:DYULBxcf?^ȑF.՜ŽO?%%W\PΝ >7wɸ6ze %u(~m"E`hs@(ڢ|$iG[G_br}ןϢep4mJ``yydݻطw/y'+>ʵSLQDGEy\eZ=&NC8== [wFk(o_űVͯxf^`N(Ey5Zdջc OtasM&>YY$Mm7m|~i`edYAb;KĈQ2x0VoY^_>`ܓOV^:7%}Fڭ;O>,M5szd)61-:z{EUUk,&L›oS'N8_E?g3T!Ǚ9Qt:}[g_xTKk>ЇEDK@ iiv{);'WFaV trs1.(p{UϞ.+jx$Q@ =?HV|<&8P/酯mͲBVny ŖmQ·?_udFbui׾=o y%Y.qয়7cFŽO?l4rnѥ'bbPUƌCm5ON4 VQA__o| Уڤ /X>-m2رd zZ]1r_ v7ߝā<2vŜ(|SL4;e [w7"]ޙ[)'OrxJ,*Ka埗JChhEϘZtT76D@ IblҊ7? @U^x{8JJF..$؄$Ih4p~ HZ c|Ƨl,tڝ_h8u+gVY͛ɺtȊK01fxq/R2(6ZIB4H$JLfҳ 8An~}s2|5eyl"b1p*=GtzV.q)Qs5 ma.A/8yPvo"HD}(W+I=BhDoy䥦y"6igΔkEUI=}oEKdF F)&W:r~\a[ቧUրلtҳрw?~ kWuxICN\Mfff[0gժJ?VIh՘phlՂ~ ؗN&w5{GVhr0ndɜj Y)+tܕi7\FKٳ-3۶Q\XHty9d#i,Zʘs-y?Ze|}!n1w! >C900VKnN6l¦7e! :-V - }}un[;ؼhQ4 pߜx|'V{~}swt2ȎO?̶mqI ^+Y\+ vX)\7Rz19YQ% S$z]U-*( F^kDZe2iqoG%mEc_cju4mjH_DFv>i);!#GY0RAQU44 b ^F\3:i9c]Fn1#uMrc,I|4\,Ծc'5{>:-搰&dIn?.oGѓ:Cc/ wu$ |uIஙlߡkBBB !}bٸ8\ڷQU~mƈK 2;@ (W' I:tΚ4v @TcjmAE%):vVҸ%i=ښX3Yvª7e&{(Fk^^Yq^G~ŅZ>}YEdb2ɖW5A[Dhz_/ƌ@fy㕗kH }=̛wY=tQw.EWʀ! I~ r PULqavm20e4 *tփ::uBn-oozrO͘ngv^aIBH(-ȡ,~Mnq'F.1E4*hAU%dȨJ=g\Ay@Cq^à;n,76ew)#$4-Z-N;YAwR-MYge)#rfq jXU,WNJ))'Nzҧo?T,Z3s ,}TRNfie"ϗn{rwWK&=JS4B[0Ġ _@ p="";Hfs j7[ =q0Y/JRRX,k@Q1ىjMIItYQ0-(mF1] ֮o 5%oɡˉX*#)dIB6YVmپrVl1 .\1G[WA#i8{ƒ%عCv1vĢ9b57.ؓ#z5KPې$18j~2e?9={9S)`kh;5"YV21T47;ZR(b@UkcɲWgeY!hk=9w,q,KIUQ4*f *ZJ8~oz ECB*qI}vTKΜܹsN pXg**l5bd  ,[x'9&%s,X3*P$TUAU'=YQQe?]۶9b..FTJZ̲lLz A-佷8r 2,Xɀ✉֨$b.̲FNW+!Pcl jjcZ3'-K׮nwئY8"Hsf1\\X0l6D- ;-Btuh"w@U!%3oIKdg*2>-б3g?PU&jĈJ5F\br5 @P}/ݪ &z)_cCef{+B\Z/s=4|V`3IXX*<5T;ƶ+[y˖jƭ11[ɒX#́AAtI#Xq;v hDoN L/4`2xZDg *j!b n{t QakGЧ&@ =CL&^ڶgw٘:El7!4,̞)}ZC=C6oĨx{{3x]uXYAȲL^^n*l| ֖*Wr[˯;]z/mv5cill1̹mt1,vYPKgRئY#[ɦ8V|juL={Ber ˳4&ݱ2oªY"+LPR%ӹIIu몴nxܙ'Oj}ə3DFFt@ p'Nݧ/mƣ}dHolK-c1l[jW!-k2 d¤)NY2E`3 %Y4@dBQrss/[a/, Cecq֠ѐJf-,?8g !X:b3?Ʉ,ds%/,Ÿ0;<:ƶ.`xf02-2M[{^Ԡ;,cSt,Mzaa{vngаXK,~tIRP5̲??ouyg+}{ ?u :w\K2葑+uC #\%22.3Y3 OB[ԄĄxڴmx9t(TtX^U4%Y<@U1RUA-[wn:ر r9_P&:!$Wbh-AA]!F#&p\UZl1އOf"ah;7SP zf޼LLat_lJq8fKW((WCb%$ L\AIfOLʱz;u%q.1Ǐmnq'BBZ")/! r@, FQU^xfJjbKڪ`Ϭ_PXYc>{bHDDo}<̾>2p0EE+Nnю{ܢM$$rv)^V 2pL:]ּ1Q">ܣc9 .vњdH^A,e9f9++˾mZS4+/pV0t(2,K*,( fR%YcF[%=))IL7w|MM!T%^]ޟbbAzWQ(@AE齆$nm3cv4@y>wΞ]vssiDʕڌ1'y]Rػ6 #(d5ʥwc]8sEԪ@ ,;(6$ CѲⱲ$Q[s9y]i?шNK ˢnܶ+-@}.! `0 $"N(yJN"}g Qa?wFnkf!UZ;  99s%=l(2xw+dό^&$4P犢 n.vvD~AxJ)~^':Ѹ򙙒"<`!e&+a7k1eJ}1G Mth\W^ldDB&mc6oj/BYp>̑uEx= I& ݎڷQ䁆=:k1EMۓ՜ߖ.qeAdQ<WȊ3,w@QmOll/kZ lLzcOkѕ(iI~ffOűIG6FGc:s|=4Qgs7f~Lq([ j׬OII LMH-].ΡAW S(W_ٴi_׵[^'m[$I"08^ϿﺋCu,Z}Ar+t57cN=,pi;-8v-, adIa|<ƌDŽ #8u5__@1ڑs'!7bl݋3&dtAYFR[HeIMQJȺPIREd6c,Cdv;֯*sN\Tjw}پp!!+NүʚOAuEAݰEDQAߙ$+V39MFdY]ho׶sE%d̫eͧK{\p!$k(k}=VNOx^ݶ-ivo߶~"(:{&deϓϼHhX;=KEpAQ~JIq,s$;/]V<_kz Ԓ@ K`|v}^A硹sʊ^gM-ccWdkdBA!aaz~ fqf >p%˙cǘs5>SW ߵrCI۹1EְD`dEFV$ԊBDAyK-x9$vsQ Y(ޮm0Vgh9pymnѷ/{._#8L-eCVXdJ7)uS[LFJFfVy9Ȋde\Ѽo+|0&L!Ǟ67Z9>17LNfٞ{{c;vd˂CsqcbdIٲq-YDSP,+8d C"l3Yd>y ۟׶P9x Ш_lWbӟCXn<֭~WFY۾Ǐgƀ|7s&j'wnX9og b/*uN31aiq=uƊ/drcs.R^[<֭K?=yyO>8%&SdgՌx<3x0s~ӧ/*?hOȯ~n㉅ yW^`?sj ?˲eUz[Jk]lnMDӦH ȾI~_C-%&,V 6^fw5\lJqN_LF~f&vy˿1mpp~~$vHAv6Vza`s6/^LQغt)/& 4U6z4k,GiK|6Ub+)aԩhҾ=EʼsRR`cX'[PW?'ݱs͠ow)%~H^F6n$\o/]'MYHX:^H~dyqSiYV Y!>HW:ݹ)l$c;(XΦ C@ @IlsoX=mPض/G}F+F!XKJף7`Ы8]/T`2QGaa<$IlX07hҤZ /kֽ(8zwK{ټq1Q~@?Snk{;\s z=Y}#+6= ;RC6 b+=$ݹ3Ǝm1{JN_ 4fuL5h@.]hӷ/~mZF_?c q=}c2fT2/&2}SOѢ[7ol]J}^s^=Ǎg$ܕSM0Ƀs tIݼ}́9u͛3~4rN /_ٴ4Φ@(rP#H220A[ڦ_PMWb:N[X;KkH{"99f;Oyc*ј5}ĉd;^O\֌>- #GMF`h(oNHg=7}x]ߵGzCаY3ZիiLF@!>64m؋L30KeEd6a*4b2b;L;Ɋe?c-r@"EEz}7^}yp9Sܶܜlƌ0dYf7a2""N(elV+vEV}fU~LvFkn wH:]^G>'ziRԭި$۶%s>_}Gh4k VfCvQpބ:(0d6!2i'irkŴo_i>9OJ7]DA[ 4mʮbin R`eqΒQ`.YdIBt.ڬ Iz^\qިIuh%벎幡C9u饗:r׶@tfhtй4[$# YFӍ$4g^^vU: 3Lf.AiA Zbۅ[n|E_o~92әSG\4go1;8NaN:_ߋfur;[@ɽ( CFеGoDATd APZh%}Ӻro]mv4f$2_}_{!lO/:Qj`6)*2S+"۾z=]'Nmq?tDE IDAToVU%FhlZMYf]K!Ct΅J׾*Wu?v1ؽ|9yj#WZnmZ" n?_PAa/V-4i = Sl_x"N!$ƌaS( tJIaʕ}]GdҥnuR^}5+_]t xx >YYl7 &)=8sKK(;֕i>" <s7eeK~">Jad6"g\ IlN66!wZ <7hO:h]d EnYǏ{[.5ộ3ٳb֭ۨQU>7,*SgqxzO@MJL$1yE8ͻ|TR{߾A o*cZExgE4nт3g8a7<|vyy!J*M@H#xo͊/`ڵjjz>E(㱟z 5G *:ڈt r?7ZF.bM:tp LHpoJL/ Sж-~{^ tPf{Q\N0˖؜&ZJ`P0X)20 8}(i]<*Մݻ׳m 9v tos>O|zs||\1gq-{ΎI%4I$c17Pd6Ql6GL?U:nN.Ⱦ+Mk5aW^rp /,z9YHDc~}U>ww}ipj>{QӦ\7c _zwӢkW:ge?y_}˗ӬKɖ%K_?۷g*#"hֹ3 +3X~4oƍY3>驩ȒDf>v,n~4 VSlLza~˗[[HͯqzMY2 $}kf˻Rb6Ӥ}{LnFmR$p/_ &etVT2Z->*3.X8Ё3fOɫBjZU @DӦZi>.Kmfdo~ `Nwu.|v t r7҅k(7_||ԩ:ܱ{ǵזMǷi4HĎ^n9yBv<; p /x=fgê3_: \f!ZO'_'"}g|+gEs7fQu5Ƶ~a:>}!-\Nyt:rS:nZRR٢@@x8)ӧ9zu$y„ZnԈO=ի/X.?8GӢj/V<U..7/'{v%<>m~Ki׎& &544#-B>yms 6IMs,'إ 7ΝtNI@DpN\X4۷5kF8e gRSϜ9rη^Z5a[@ШF?ܛk# `v1qa4ZūRo+ڷ KA_|Q`i*\n4l֌>xUH߳!۾=IUANmO!$Baf&Ys(lS>6h@HT 7'ukB~~ڜ*S[v4r$g&MZޜ8c%&eL\_ .\6Խ;|Ƌkڶ8gKCu:4w) ?{ohֹ3SͫF~%HBը=228s' YCǡC/IUr_ˈss9{7K;wr_jhl|i~C{Kmff㳩SxȒ={u*!KR Hݻ}UR7JۊԕSɵrbWW'صreK''xIm.HK#!r]eq8[EdD%'{I|Q*BE?[.Iv$kǖ%K*+sYmfFQ=?l]bqq\ܥ 1yEΜ8Ab΄DD,cGEˈVN EahϻD뛏c;\Z?AL  bϊ{)쭪}볐AQa!o= պOBJ ojecY8mz=o7TƜ6GmCv8h7p <~3NOǘCA ?ρ9m~}}ww|vjz!г uJ2*@ D?7C>tԕ+}|i׎Ah|[,]QYq"lEE䧥qj6Bcbh޷/-.Rs1DZ[,h>M{N:o^M jٺt)n&w`+1SO Dev'g *1#0,͋3'y_↑-2sc28y3?(o O>ɾ5ktݓd"bc9cG7W3gػj =} &FX t3m1xuTc۷ܹ|}Q/:ҥΞ<@dBBc(=F|6a{c9i;ws'Mu$6kVg*̡+ٻt)-`…]G4p`7r|C~ᘛwI[2ʜ/;HiI=ET^0qys|N334laa4cM\r2{WۨQٲ?&ps8srNvMڶ; xmH=iyUnSuh,>?s|팊&m[awKeoUX??|+Y G1JwVFj*YG9Hxt4}'Mb_Ѻo2f>LΩS<8g{fʍ#"h7h+Ыb_zjyW$]w^crO 6ARgmV! 6SRwN{#;Z>Yh9`]\r!Y>]+ي۰KpF22>nՃwaj܁^&W6MBJ 5 `ɡ&?,iТ[7n}UC^HIĉXKQ:ubO:rՙVpGMRm4<,YB=G`˒% ]˖m(׏֥KYssu:99nm!qc8=ΘC@hhꋏ+"닟oz%\}5i0E'ު/߼" _~{?B6tnwosVУ ;F*tg0P]S}U^uޛ gYGcmz%ڭDe؋t[X#;S~`jSˮn!ak^#GׄݻY?g R_|cOW^wۡxN]" ZLYCW#||i=+Wc)*[n=\S4dӢEsNؽGeży *RU:تwo>8=‘-[GSW e˪t~pmJn?eRRd"#5H\ǡCw(f ѕZ%Q!O*-ͦrs%*︃0hֹ3-Zݲ% !w ~7wީ@Y[4JLb`x8%&oAIуV={Vۖˁgyl!:5܎W`yd>@B۶ .^t]PZ1ol]IIlZFiѭ߼11D%&`)*W'2!}k֐Q/k_XA=uw$A V'(ȒYN/Gת>s83Û7Ӳ{zgoe,ede: &l6MڵsS?ĴlIX~_'жm1bLHwasKս^.h8?-3FUq{ ߾J|?Q޴]*~~{ Mrqt46|&.`/?cyGYs'c%{۳&_D\[~F>ʪzW2M11ec-.3#1'WA>|:h!42+/?qs9 WpbAjjm}SҺo_ o%K.Xw,YB1c|&LȢ7dCkr[*_e~9F?{[\t>n11$%Ѹyza(L= nذZ'k~!zWk.xyg0cZv^>uY $?#OLK@HI=z0vT1U L~-~~^Zv;M0_pɳg3EQh7p` tAuM]")_κŽ9XTo=شiS 23&)fCOK;'_>$nvǝv<>C$NGާ + v/@2'ejO}rS.ZiG!a;;T;|}ts۫2Yټ55R,3^ψ3w1R'|؃|lZy!%Yw搻kbx!%}˧&S':67mrz!%O>I5=淏?fZ59q"︃#GWڦCt_}Gx"G%*1A,[3͎￧[5kYf+M)FeE!Lقj (KH?A#"xř|GY]On~?d*|m*f_]bи<¹Grx,pjMnb;ﻅ(d5z2<QDtu"V|3r7p8pHɭ˯\Nի-U?2\Yn%Æ3'±\d癰N[EQ@n g1K$ A߀Aew$VU^|Dc[cAa).s<8"3q" 9%Ǎ#U+~{߮9sgƭ״baN]{- 7/D<3p W_u~]tPTX]b<{{AKΝ4l}Ln@LJ=z^LFEy}߂pj~zw.'fL{5bc5mTVQAY sz^E@AAVlb#"ĀD6[oNP)rAZٻdIɭj_frЌ(<(( ȲBNAAz?|e['Czzǎx9ܻt)ROި. qWLJ绯еg_M{?\; v.?^{O@ ݫ']4OTS& =qL7w߭MW"JJ܍@JS5Cѣ^c"иzց<.(,4f&>|CXZV(QsQ[xQt|bH̙"lvI&Uk0-ǎ](֑kZϓ3uogu GQ={?c,v VgWYz>N InV|lUO$c5Yĵn!8(Bhd$99^)Vq,ɨ f44444j+@E?5袬(Cewʂ("GKI&ׄȲLA`,3`p Vܜ2D]rۘаX\*Jlvˊ(( Xl2>@Hh ey]$R%g^}1}J\Z>At:EQk%(hkgԔ)@}-޴qӧܠ}CS?O4~y.FrI"4 ڡ–{FSЮJQҜ<VC8ł iwN"7`tE~,SlqS,\=]H>}lksAzx IDAT:^z=MRSdE!+Pδ 5% HQQEVd@) MU+J θǶ1jPoejuMNUqP AvXFEE !"1{~FMha"m.(?g*!,piC\N5Y_Τe`RRK\ǎ4NN.S.6ey,go eyjvz睈ȝoC 3;ύʊWF1:_CCCшg1dA >pQ_ZI$ЌPJ8V-9y(Rx-DYF %  doc))q$;d:D|-Iԥw^aN9)WpEdAYEv  ?0/k ţy] `cxs%j\dU3}\,sd:.YBIaa%4G֬FQh޷oTDɓ'(w);Sv6Yiܺ5ƍA(peDA(i"ݷZ~D?|8ѩ9"). C+ z L{gM#_o0h]CCC;K4_(u&V䙛Dlݮr77(y G(sEKoYdP R+^QddA Hnӎۼ#hgRS+\9B-j]B32}.^"" SEDrȲ"+jݮx=vVjнkjcU P"jˣ(/5}D~ZZ))(`^OG2.TS7p:p$i@NXbTd;!g.Mɓ,A]tރ81Lfݳ)Of٫2pʔjGmŬ,CNJnM\Ϟݻl.'r% ӐjBɓUJ"rhOldTl01 K'k-Q>^srpq2i$IHbG;'i9g'~׃/['sGˠ :# pTY]QWf[XX8CbC\d-R]@MP!λwCBBr8u[6`1X\=cU,IeĹ``7z*B} k_?pDҋ{s;ɱCHs{Ԗ_4bJGШ}, GQQSg^Rlp|5BCR#x*x^xXdgj؂ݡ&% 23ݷo|t5-'A]'M:痕7-Awy+ZFa9Q SPŔ٪Pw`pȾzΞ%8$TcGW)"xDdE%<JzvdEh,[ίO psQU3k6xW^"44K N<^nG$yc*jk0W{~(C1r]ϑu(L^NgUrLExH$Ag^udqAYӮ]6feyRvcb)4ov^\xYTqnYEoА)W/ܯ͘EHƕ"OHffh~)QE|w/]*Q;b p HS5bi-44"+ >PYrƙ[ 8tfuL攭YvQƍ)(U:o}PM<*90?U21,,CЪ6CXVlv;,sx HSSѕ AC"4ײvvݮ}P`*fwӡEPvU8Ȣ BA(>w Ѵ]r͜t:K{H)j-Y$ub%ʟ-H߳F=mn zl{ѷW]]{]_4ǜ#GHLLr5444]ڵ<ҥSg=,63賎ci)*vNvYq;{6^jv sAb`).!5]?^vThsdfںkێm[ѫ/m2;FLl"!ΨKEYQm,S\dFrHȊ̱#eE6o~^܋1']5ײAwzGtGuJA N,ҕv"9HJn'*v;vB`` "dYGNԼs%(DdOjЬEձ3u rr2%>GW͖/>>E$&&VCbb";oqL7JJ"uJtmw+Xm6AGP  |^WtŢ3b+8&$I8qxlTN[oQ[ٶF#C:A.,d;~WѱqdjޠKSQUr2cAw=[(+ K] .[S*QOQ! +(./ZE :VƩ389LJ9=Q;L6ojGYp>CvEx=L#p 1$_nGQdۍT<LJJ: CGoKs͸ȲH찑wx~iCdU:K `;P-n{ zC&mcǵc+g>00= p(R\dvDG9QbQD݁K} cKkDJR\dwfg^t (z&:KhՃ]GPlvuT_t\ 5Q}233EuLfffSg/ vH۹;0™X:t삠Ӂ,#)譬>dY@Վ,_)$Bp`21!I2vMW9'CvOl޷/.ڶfrDHhM o`У#IudCjs`98s&Ɉ, -V֖>}㐃1} -FZM^~v]nҕ*T\dY3݋X5uXSUߙ<WI[{%EiVeΕat.$J׬ svE[_\.ϗ}׺_4^wW>3SRPd, $2s=jeo=T^NIs'1K?ß=V"Ȋ0pp "#+jnEһW"wasHX,622e׶MMe-<-eҥ^vv;CVXd!)vJqVpH2+YY + _KD^Ѽo*8j|{5lZq@x[gӾCgu1sd÷-b}W EAجVv9g*!4ܜw*wMA-?ޛ3ןԳj Hz anwxMCC -sܿ~dlϧMzZ*1xW t# Z )I2,V+'O\*V oܸܵœ=98V jvA i)@yl4l?SlP?& Iƶam YQ\.E`Xx}puY¼< .!{z-\턄õC֏% 4Թ=($V_|Q~ZV뜙}Yוd)cށþ_~5?Ι@dӦt?vUsr)nO7 O_qj} Hogo㻣oӋ FtB|I! ٌ#֨_$c(2 /'I}n[֮,,BFۗAιsŶ߻ EQ2lFlb6բꊵSd AC'$[q"ph޻w}MXNnDғGx|&Gw8tQ?"Y?~JzZ%=ЈPJ z232zc:t(w6mHOJؑEfyTt#9А&P2ػ0zsmVe%oƶpDb~$QRԚËkgS8_{ogeȐR۟zdY5knР{oE{b-Sx}ed8oV 5jT#Ne_"ϯ\V?~P{zŁr v\I#q֭gq/݉J zMҢwoNlF78sˤ|ӇX7CVd jutn C>CՆQ )gټn%fS.-V4NEz>^&+3[GAPp,c0QA5jͦ>Y\Pzo]ijNU=} >/$<EK0i  ! Ч@t~Hu)u&ɘV F.bرm/$§1:pc٬e o\Hat OMI@``EQk,62/f`Xػb9 UCY~i\4܎<3bHTKwebr9u*+Wt׮ |rIM񴳧r/VϟAc4:ۃwn~y0yJ:t(ۗ- '{M6mY,|#d;GA oΐ&1m |]~;67܀??J{u~A?4W /BYdIXruQ's;C֩S{5z@; #O&t(j׬ǠCVdAMcpiw/wFY8|pv,˥mԈNFU栈z?~ J㦜;gߥcn\F|}ujlCegKBYQF_H6[5QX"ZQ> $_?ƨ(P^^:_}ٴnoݘh9ﲂM)(2KJ9,&n7th"#l9MtƵtܕаp|}|x CaIΎ.Lf+EF )id׾]#[ѐ"_:KHxN (f ߕN[Gs˔)|MWhza{OY•e˖رR7|ZbZfi4l޼!!֍S;cǒq4ϯ\IKw'rAZ ZFu ɬ-|R=Yٺa vA>O{RJFYԉ2 hkdwL0?٬Elf5iNØXt~ ,cX),4zgOz 6̵Q#7{\ʼnm=kVbItHIa0 ɟ;u3,.J]d:ڤ$u̢OE0[m&=7_l`XJ~S+W`sXKo{ƨ,7ٸN.tAAӇ?׬bikO&&>մ)Cv6_>s22=xڹs2S\jB\ɓ8`@2K3ISY m E9 KEw_([+50_ug)0_^7\[([ۅ)&Vr]ª/Ln\XȚ/Kz?'5=ǚ>b̌kԈ?@vj*wS7!*T!l7$\֮-VۤqM[@t< IDAT ޾ME 8$)N]z~.#5ղcRv9u"S'|셇犷VKXEL/`@Q6[S'xaCJ̅bώD}#UJ e߾$o@ >.cp x00l6}~L!)"&=HN-Kuwrq|Ѥ cc/,lDN$:g۷>+UXUv9qbZҸ~{1~!&S'sdbbi׌0|||1&i2.Ǫ.cǢp {hVE~8M;wp LOvq9NOn|yT' '3@sLutji]`.*b/׾}'Q,Ѥ >~~;rضms@|дi_۶U8@}4jQ6hĶmg̅5˳rHCi޻ۣԆEIW=Uߚ/Ƿvޜ[YjoĹsoܹ KHp>Mq[sj$ROO$u.A͗z4֍}~7^&5˘17i FEZGӞ=8o䥕R!4Ջf7P5X{ΡU0U С4իϏ'I޺9H8w$Μ@~w?3eBCmSYwvu6mZb"4i.wj[S*}b"?F$:طVDRrdE_Lu5Q`X8o|L]tȣ~ *v<9a6z-uk|%\^Ӧ 6$n%Сb!zy@~%v'.~'ObȠ0'=0""׬ [&ȥZ.vD7H=8~>{^߀t7nLLDj單$(u8~me4lӆ#G^vyU~33I֫W*oփE'd#H;ÛqWIXCz5 f|iGՀ8u @@`BCiݚ1j~3ډ'">HzRѧdj4ApT Z$2>oܰ! *KvhضmԔX= Rѣ:BC a6t@`DDwRg|YG]{C]oxҀ-BH("&ėu>+VTĜ={*̅rZ*,Ij_)%SGNJANNn?WW@wѨS'utM?ZDk{FuM{51,ѳIrͼ<&wqqi̲ ?(_ֲ^bK/^L cg$â>uU%=x$U2O85σg qD&M2e }cݱΡ}}%(5Z9}UN⚻V9}t>?ג%i㚫^^^H牉qŋQ]兗O ]wq`zf3Vo?[w;8u_~gФS' q~hؐ:HF{=?zFmTh׬A5v,~Sa!M;vdijϢ7ĐŢBM?yAo433I׏3gV[䤥Q;>nݫ_']|p38%/ͻv-׮w[/ ß~vW¢H׏C7Wj'\_6a4hҡC렼kJRk駟fǎI裏{l6|kqހ<\i͞0zWU}x/x{( {oի1dgԏUϞ|3t>>w{?wԊ]1GGsj~bZ..3Ŕ?`SOybNȨ9}{_ϣ~ |ذؓEp,5oضmѹV~D&p%_[MЫE?q:e/y =pbn=T]U˭JRRM6SNrJf͚坜2ٷb7mBB] ߟΣGׁe#(JSA@}qYV6ע>*/4x,S[#,u.п{M~z]4i7q3 LɓLsDQ$aCnvn܈h(Fw߭N֍VݻתAc‰7z8n?>'NG`x8#5)LJ.d|䤥Ѳ[7<s7 ϟgڴil۶ H=7o͛7%0`@7nxǮ 2j-] ¦ DAhJEPd Hڰ7ϟ_gp!T0K'MB4oNgE+Sm!HZ/6mbVDž99NwZScC8u{+ E"=7=&MjdSSiұ#FS]r҈ ;5 ]>APt>yΝ9sg4G _6 vKSP]_Cз/߽'Or_fAm׎wÔ?#~} SBrr*\e+ۛoI&n:هnݚ+WVO:t(6y~^~i׮7/|L0FRR_G;V&D9k{[( -^L ~9[u#}D :E7U:f$qjxĵkGlvY@5h|˖I#},9ch޵+_Ǫ˵PkAw%E ¢Y |Z2Ϝl4Ӻ5Z-]J;ԟr|b}׏?ܠ={V{mXCv6gyhH6mPd\bcͷ~%M;uBE6}t; ,ZyܕƞU4haQQedk׮Mxkԏ䤥U;r}]s}|Ķm[O[\>b>w Ĵn/6o&!1s8op\5_Sjr͕GuТ ]LC7^ɭ.hKYQ./ uB"#}5juN7=u٬Ekjz͕u]U~NPP[Fղ>92Ӽys;… i׮]E:tS8`_[urGO_4e֧^oMHm[jߵTlT1]T'O.W8r} ƇȆ lؐooX,RWd'Of\ #||C\!Bm'nlbt5qFzzk}g*Zul5馛سjU1dj t{j1;fMZT6-zٲe{VΝ˰' 7qbnZujઍ{.Yfے%t<6e̙3Y~=7q]wO~~~lܸ3fm6~"##ݻ[\).\y>1[r}3lH6IBd4// g(һo"=z`ɗC*cH?zҿZ)۴es/PD&aڰTK4z{AQwDny(y䤤Rǖm6ֽFs]}|<۷hT$[fn؀,4P` -9TT?VZk ̪?dؓO}H;BYop1U rm#hܴ)&)O?Ɯr ǟtϔ&Lf  VP@__o| С΋/Ƃ?bͥ>scN:ke8|&҆< L n["h4L\8OիVC^QXm\Zkc0 tti]@dYfSOѾ7OP?6 #K15mJR֣{W7~J_H@@zٵk,86aTL 87v:1߿K㓻xԢ9-p0[Vs  EQ[e+o30痶c4FVlqƌ28'~Z_`$=KM5"%R`ʳ_DX7 #SP_m)ӆ;>J:|lX5*G4>J>V#ix>޳jzk^c;ԸSWEcQs%ku z|tr&%͠Dhhکd/8zysG"og;%gϕ6FT'{Y u~Fs@z`Q;co8&q.=ي( ɛ@19" +/0QhC7)O[J0ߺ S4,=KOQи+&( yh}FOxN]͡(OLN;Ԃ}ٺ>>~(~9]WP"X6rQ9jTmՏU PkO?8шL"bp:wj-}$2ۃ܁vpBd*bGm9/.~ Q5;UQdIJTs"LtsA(-UMNa+Wћ¦-[Hh/-[f|}.}24|||LgvzC8N =SDYdEe}5CA4E$xeE=s7܀/'Į]606.\Hܑ#ذG,˚Q9nZ#=xvVVAH)jɈruPN^fwOy%1`6[]chi(E w"{$lhA[o/>/iwI9=7~mZѷ WE=B͓(j_PYAEhY0hn\5>o9y[¢ @m_sOVǎ5:AW^2SR8o^7&:v׷Fǯ/۪RE۷ k\xk15ExK;`S ֵ]JJ߅2 {p0[/wQkǀGE=V (<1?SetV";~/Fz%C"ƆPD5$ᥡ=k/harri b/wIX)gUesGʚQ9nx;dO(h ۷.]s/DQ"-,fdcAH[ FEFD6 A@68gZ,2zrw~|Q갫՞F#¥|KPVZ%݈! @jyCu?v-YOٽ{Jm}oM}hvVIǎr诃X,KVV<4|]~Elz=9>Jngw1$:&QDb>~).-hޜw젉g< 5,YkRXXtq>9lIdɊFsI90K|vޘO@cϏAAG|eA`14f] EI,\:ŢP^%K.7"j(Ȓ+q@(PkcHwqQ$mPJ_߭;M|ظ25vΝ=âwnIڸv^_Jku:F͈Qc+{"_R>#Mٯ:$m\'|%4߬[av_/j["4o6Pkubm=>Ěbq.=&BьF/R/؏*v٥9k^{^{µwU.-1PDzvF%lC A Q~//0 id˖ѵJU˅1F@qpU`06mI/jNFyNضZ(<ś}ԧ=Fm~$e*r_<@ZHm dggaIj~\8v0`@+^ZLhaZIw*Y$U*-(0g|Ij. 06Iͭ}>y GmYrӐ{|\/\YE&<s.9q bb.EQD_hf1l`_իR9Q dVh4n\o4(4 G⠛SëWW'd_w /Aɻ1,|BUEs_<\nA6y8s%B#..Dn6D{L>t҅)ST_]ǎch48q"۷`ܸq̞=e pֆ=WjӉ+}ǎ|Ζ{Wb;? kP=,IKMQlcdEKأDts{AvZ(-fgDVfFֵ'=z^7SS&% |0uRS\cUmQ!f3Y9wd6Uh@c,@` |yv 퉍#PjS㩃(9P@eY}mUGФY N_È$V~|g5Z PJ(ր"l5_^ǎeܜs6IfЈ!?y1*_x`{zq)`I)*,@9-N\yc٥w{wkw}a֬Yl߾PuM߾}9e2uT΄ 7f+{1&Nܹs wKI\ ??#GG`` ݺum۶̛7^x.6ػ(3~x-ϞZW^aь19sݶ^zϡC ;wd+Knn. F⮻ᆱ5%8* з`XTA.W+8`Av+vmP 26Z$irdiZXeL.IH,V+&FpMElۼwP(",V+!aUZU|<6R{~|x(")`ڈiW"j ԯW_4ӹ/.@pMҢE 0ٳdYf̙iӆ+VSO1gvm}QΝ˂ osp$ԫW~{b(=y' W_eɒ%Np!>C-ZTgVdO]_)̙3 b,_6___[e۶mҬY3Eᥗ^A,[{]vȖyBlE!e;wtK؜bLvykC$ܼ\,\GRNvʢSS f3I&!(6$Yb1MTL#|y+: +"R0++U-ǯXˈrqm(䷺c7$X6ggGQ|K_HC#؂(b~P6+V\A#RTTۯ7f;Epb_f?(^BhDGvx>%<<s?d̘19'r rss?~<^^^$$$зo_6moh<#F`n,Jüy ?d̘1J?b+1uImɓ裏燷7 n 4m۶a 60h N:ř3gx!""Ç{S[4hAɻH\s;~ٌ$ n $;"2"ɲ(H*,6r$ ®߷GE7kVe;l߲LlbbawxrK$~.$+Xmf ŋԨq^^.GYږ muX{,AI;}<>vKjut xWE7[B$7<,cZ1ԠV$v%EUΜ>fh$'"_w)V͙"Gҳ7;$/H5KvvvE?{&00/{err2~###~~veUv]IKM%}'``{X_xUCAQ #a1Zmde^ֺYT6~r;9ןLDdEA@͊j# - }rds j+G*(h `v_K'M"~BJ^%~ bhڼ`d?⾒G咬`2[1-Mr`ZeG'(G+9$:RRm?w4+^ȱwQhkV_"j&cѨYb0YHFAŞvdf\(eGXl, V~݁MO΍{c7KQ߀h,`0oJtL#BCC.H$$SX`brĥ'򧱊 =ڝ|͊FPdE|R/zzh4bH95A%KI( reYNȊRp).TÇld^KH޷r:c\,oK/D޽-֬YÞ={*=N- aɒ%l69¶mHLLt~fzYt)}*9xbΟ?b!55UV|hh(:nm[=vc_͚5#::O>DBZ4\e;p@ǚ5k-;"##0ȲٳgIJJq݁/z6kK/$#=ICCقbdQbBL~"r/Ο=l&Ide2|sm1xڴ2ohw|٬eg`h;(f{z'ZH (b vE|ED^(*E 4)R!R7M6[f~ldS ̝=w=ssr6ט7r59KbEvD?S< 祗ʬi^3DF$u*۸lRhs!6Dwt51[xzz:=P*쎲f`0'5%9$#Ϟ!++ )yHh-^yc>ގxsϾѐ` 1.ѮGeCIv>35bSQ Pv)*7nͭ[yOqv7: ;2|cɬ^aÆꫯ:ݻ3g/Bw<#,X1cУGO΄ hРF>p\]]IJJb <^x^|Ecƌ믿fȐ!lݺLVTչ]{ 9sHMMeر1~UT[AAA4mDΝHKKc 6 `(24݌'qsCw=k aLR}kgs1B~Z@+lRSJff.+\kHb/ǐbE% YlC#C@M24W{ I?2)dW;ȕ.I|lFҼuٙ&:ݼXm"< \]Mlr`>BA|)j}V+,dgDphM^~Jd_C`r=:Š~2١$f!uo}aŊbb\T&,_yo_&3ڵ/7)S8{cS'x8>?U4iTҊ0%#YddÇRn"#S./^̪UJ?õksvz=gB$>8 _7zmDg"?ӈPDa V ŜϾ D3E =WѸoRnPU*5EоSWZ{hOEXP$Gɔ˩ci] $E,[FlC^H"h\quqAUըЪըU 6CNɩ$$a68y GuS7"Γ'^|37=!lw75:]CY\\%Jzz*~k~6.\X.[˟5ڑgTYF.]]*BbT< oo,7+ IDAT}W6nDʎ%KI1v\QѣyqJ*?3 hwNdߠ68~<Ǐcwlo݌j5bPiѹCRcY6I>Q8ush8~-v旽cW/j*,V&syf{Ll!Co 11,=\o^pڏ]n[˕_E_WrCڠEsKe}ݻslV:ʡ N׭n^^l҄+OX+ תuWA=:Ñ,V K~v0onZrM9$>6K%.@P(vGqs/jp)pmi[O>ɞ/m\ccJe7^I-\M'++Ӟ2?h!9+7 @3nZuz;ccQmd#9FJVJFL< lYm3zv}j֤NGay_@F=Keu(V֫G@N W-x2#"5婯Z+A`6tdxIOOǔ%$$0єxkڵwZvz"##"##lF#wwwjԨAƍ % *c]&33r#~SPx{{ӰaCz쉻u3tO:\1Y<}lϣT=sm;< ϱͷܿMp?J,}cq͜>qbaW+ ޮ]?n]*0\ظ`̞]lMxH#94o y].z-1ֹy+*͛ӨG7B<<]#)21cPiXx0Ne"۸jPTt<Ǔ| 'Ov z=yZww\[-[ظq8 x8ްkΕMi5l>Uxr;d?CQ^FAHLLdٲe%jl݆" w~̌ 9r/>qb#ݙY  6:ܖ6n$ݞ5;L"":VO lȥabVjځ2'N`doͥsxًػ7Q+BA`ȑnj(\ΟzTWJNb2aEZ30j4jDP&]\n&dNN&v9ddルMReK<YLe Ϡ+IKKcҥsqaCyЮv:hي h0nj6o\ .]O?}Gf/^Xsޮ}&LBgN^0?F{ {];Ȣ%IWà KWUvqV*MLŐm#0} /TAPӧO&+;栗w}򌽌+Vs[s/,frLyXtJNNF˜qջ./82XgyJcXrsT*yɧyhҟ$a hlWyS*hTJ]uhԪ]Wx_l}EuR]񃦓Ѧ/ &_N]xhզ`쓃3C$#[uho{>''z-B$ CJ%I}zbedddzuKZJۿ3e̽Ɏ;ŜW@!Iiz#l  ePxח/>ωm^v;v0`*˦MͽQ[T֜hӶY\ӲXl0fA@$ HY9T |<\qѪݷ?5X0ocL.GM6qaG{AYh |8iDfGexxT;våCRi?Gcv0ÏJ{CU6˖-ävHJ~mыۙJ&-c_zxo_}Aռ&^cALj5mZR?RC>[R**[<==+YIqxKY~(WNu`PiNƎLVX,  zU`޼k~Fe*ؿyQbXXf&ZƕkiVJ)B=>+IiYF\=]P*U< }u:ݷo:tP.y$hӶ']oDP*N Ϯ(aUUK3j_ .pҥ2틉!__b:$;~YO>A2]c?-,^_͖ŋIpRI`z<3ǬV+Um5M6{6w.5wrr?WgͿB8K/Q?j0Ѽy&6Nf^jݰamjvϱ{nT:7~_bT*P*?*eoJ*(adPxjNk 2|Tۋvm>eRd(J (R 7JFv.V={ӴYfR;ҟ.YzZJڽ{7uHoF[rs b VK 0ըCz7.5ܽstN07OLjLmZY~:Kk}XZW_VMej6 ~ܶW7m)(Ji*^;|x0/_NիlTeT5WU* AH`JeSD׮&0r$,]?u|#X(e!lBb+:xh\]i.l֭DDǞ=5h6ٳXU`۶Pm !!V$<\ϴiфo9yyy<ᡏ$I\$I(   Pa!S IB$Q&d)ၞ}9N<ɠA*^ʕ+ 0a=#ːKFj~8bGn&@UD@B)H :ȳYTbccʺ#9^ϕ8?in+=@zuTJE*ᯀ `Fu({s^cEJJ IAR(ؿQ]ڗ:ѐM@`!!bt`6RBU9ۗncrrv,yyZt6̟O̱cu:M1cHty뱱kO??ܼ+q (Jiէjğ;GMo}"HVK(j~7T"JӦoo,RRhޣ#x܎uիzqx奝/-de_&Ϝ,:. ڵ+wօ),_Ε3g8c #( 1º'ߐ]nnᅮM-Үꤢ\Iŋ̘1`0 e˖|gY;vjj+`~kW_}Ր?DWNg#445k62lX<ÆSk'4fS#qxxX.lh?:XKB:gvƿP[:Y]׮%euPp7уwFU5_V*źuU^ ͛k׮yfRRR߿CPCS/KJkk{>+VkSOESQ8}523gfrCƳxQf:N'?dܬ|f̈dt{:]1/:oݦ nnnH@Z1;(t8?.0JV VKFMCeCNrLXB})po> VFIƼ+Q{|n#"-u:**mr55ʬK8u^u~MOf^٫N괭Ѩ4AZt4I11<4}:*`;wInv6BQD;vRݞfeTFP*Q(t5eHsD|3}:7=u~xP(8t(jBO ˝I11۷%T[lAvf<0n>g,)K3 CII/,ܭ>jիW~Py[^/8p VEq &LmۈYf|sŶmXv-&Muw4NpO;?T 4KN(0fL,YY77!fx"-2?2HJr1_>p#Q#g,ǶhItvx]8uoo3O?UզGa2{y`Z1[&[GfF6ł)7B9Sn. 6F}"BD$Ijvs.*aZlܘ)/p Fjb< Ѝj@THN7#V=4<0H*!b*.BA`3h@W.Ʉ0d$1'lV(X`F[c/If/̒2'隼O󛷏XZҰ!gT:)R3<{ncp1.:޸5hҹs-IFvZWNEhѳ'6ERuվ>vXA֭ ~[ZhחԄ*I9~*Glu߾́~Nfd4]{~M!{ IDATS}][*zר}}U0eǒ%D.u5Qk޵={Gt9ұ\"\iG~޽?H̙5,_Wӊ|山9sXzTTVNzu9pe\PStJ^+W8s 77+Ze0th}͍.U @Tp ]7oB2F&Ǘ گAP(Glc2B@:6 B woݚE @ [o[oss׭KѣĈ[*u߾odrzZE zOĆ 8}:us#U~YRSqQDoӯoH!ݲ`Revm vV}h?p 7ndoVXkEиpl_ܶ._3w.{VߟE%n皯(JM&7ofȐ!4oޜ͛y7=/jEխ[/^i[P%UswAe.Bt[3`U  \6-iӢK8Η_Ue9V:5S~A?NGftNuIMM% 0:/$pqV7WTj#v >>{#VbbZ;?ONzjJ : B `4d\ML f-^{]<<P?lqVFFxIВtia[|nx*<<W.N:+ކׅ3!(*{A]2xi͚R]Bz__ƾn|?i_k,.:u5ٓ={:}V}L)yy1oOI *P=3j+p~PQ;(VK^*lԧO>x][˜FEۡ\IUYL&F't:8@۸.G dҥ4k֌D~W-[VvF^^E)Wi8EnQ*x邙`PE$I&6E-W«@ϝ=MPpJXl$!l\+{x~vG/?>7^(᭞Jdݨ}#ŞutM/Ω}_/[KY(*^Vrn/_]KF^EEZE~ 뒹pss7`\xH:u;v,=\uuueΝٳ 6Dnn~qtٖ(!!!$c˲v9D$B^Q)(n8DBEAXrsEKӦU#ƍs9ǎhr<&Zٯݱs< v'X11"""V%Ύ:cHWHHn &95sr/w{{{`?Y7Nnz%#s/b孾} fGV3g̙s "uaժUyeW__=HTAXXVAeԓzju(Ebcw 〹MOJ("aID23ұZpӹ+<<<7:f/DJeCB$m GDCj27ȯy M~UaeV''q5޹Zi- q#ڴDBKWLM!b(E{RWXX֬Ca6S1Ǔ3oذ!IG41s&$TwD22U;uÇE!Evez*xCjϯl$ D(r:{؅ Xmddgl=]ФI*///ԩX.I֯agD (Ѳ]G@.quufQ* 2&bZ˳rz lDQޝNJ֭g+]|O/0x:7yơPBĦz]h{WR; !Gٳ''>#0#J&edddnGT Q%Wye]Gкukv$Co~GD<E nT" )%<قõ X,9q鼭[FTzW_}xy4{!Jf]{R0[3Z 䙭rMrHzD3'q۷ou]H=S hNBl6ZU >sZR;>LJ6oD;5j g:R; !]~[uըQפNCRcedddJC7d>Nq[2QQ,wq)UWIpe]枠{#m"0Ox%KfϡT,Y67$I-*46Q$dƘGZ8f3f[~jQURѽ{*KiܸS7ח #yy`jϬ- {l%3+k6g\>8&M8Uzu^>/곧]cBZ .ү_e/T2CI4g7/1DW9+NW2222aD7Ț" ]*ѵkW~] p1x=J)/\-nh+*+fÐc"9) }f=l6֥KJQs }ps ج\:ϲ/3lx<<0[PTTJ=e]~ܜl$l=;n(ЧPUߟÇ?؝YNo[6u,]z? ٌ1&Z%DQ&8-%c>P(9rdS~]9ωP >z2e sΥҗDJIZ͔ .@U̎Lɘt*{> Ѧt-o>]@iױ jٌ(HHJ9/Sq*ia7nYUҢE L&ׯwa|1ؘhj֮KF ! ^Zbӱ`ώ2tP+Tfº }^ .{NĉYd MH L8gtGAWǔ)SXlB[,:cI:]7 Oot.H` KN|%&\fkÃɓ'WihKQ:tNcڵp)_L|B裏Ҽyu4hȑ#Yz MeѣGWJjEɄ)7ۑ)Dn%8鲃.sO?͊+z6JlL1[Mc=oeJ--Z 44M69--/M4avq7[Ǿuxyyl2,煝եV ޽'O:c FCVѣG̚F6mzs1 L&t:ҸqcoY矨n{N3}ZFFF.fe޷!./;evWZUa12222222222fƎ[}˵HT~|*#########SȋDeddddddddd"d]FFFFFFFFF.Bveddddddddd"BE2222b}\]] bNE 9s YYYӴiSN-׫W/^yz=<gϦw |g4j}v:w̜9s&&&?rqpss^z 2Ν;/rjժŗ_~V [J%-I&7# %%sE!}n: n4jԈMPJe4aQd[L1 q[n} #>>K.xbԩSڷosf}G||<СCK۷J!I_|q}ӥKbۭV+#//P>}p<,\өS'+V+M4)W1{_~x$I"--5kC=t=(H2?5u9mWdasI"7!! IC<4h ſc B_7?Mrj9کQ2ŋԩӿ^29z(>}^2dH$I">>@XXXۊD0b3f Nh4rYڷo_eѣ{ocǎ8w?hZ0|rA^y, ZٳgT*+͛+thd͚5 <NWd%d#77+Wg\8BʐɝtʾL7jT\6c~)-%yR{l...ܣ^!i$7f;\ 99{o/Yfh4L2̼qXF c W^ҏ`~a~'6mTl{FFuY.͘1)S8;m4j֬Y22w=ќ8q*zèY6^de鉏#R Vi͛7ӺukG̿AlXm%ˣ 4I 5 W>Ŏy a<LJrm +V2ṵfcU8DijFLZj@NN׭a0raŊL:k/)4_>'N ''#G0dȐb3ťxX xh`kZ]~7۷rJ7o:11q 0 t܋ bιFsnt<?9&N8Aڵ e]Ȟ=Ė-[ޗ."6:lϖL; 9$$s91ˉ$$eD0vHVnB0H:c!lٲUelٲ}H0D}L;1j,~Bh荙dnM;` G-qf{zzvZL&`u8}afc~iG{COʋƍ#;;˝n4Pp3!B5lݺ@ӞyhKQ(TtփSFygؙIȉDlxN}vIiYDE/<3dM _wbZ:d{9 m2!!)fFY9}Rڴv%Wֻ볹v5#%Sy4jԈ^zcVZŀBƁ1oit:2G{xz1r~XiCX_d{_G^AAݫ|PݹEL$IBTTJ*%ԬҳrPiҋm۶Us૯bɒ%ޯFgAPG>8T{\8KB\,9 3o^III3"""jՊsҢE F#0p@{govT*iӆ/Mtt4 4hЀ\22<)))ZMBs)wP1`PTB ? Ϡpªsdky-P\R3 ( B HHH3ؽs[Өa||w~;Ѥ=uTbcc?F1}tիwG_^RRR8':5KMeγwuuAT" " gEme]Xz5qqqѹsgq<<<ذa-Z?/pz_FŜ9sJ1= oV>[oseONwDD^e٧k׮ܹkժ̙3o.I4iR(w;w;Z䱿Ѻuk=zXG?? Qٷo_ۛ4iP] ;Ν#mBv-gcC%T_@PP( b.^`gb6QnZnfǶ-㑑%:f͢gϞl2͛WfG8w |8gԩS133Ņ#Grùrr9ܺu ȟHKcHR:uꄯD"-;2U02TG;d iyR,1SaJC&Ch~ WWWׯ_.] A]aŊXXXWXY RSSJ|_IJL^}GOJgNfVCz#Kiܜ e䔺!B\v(c8JB&ѧgw:%Ve(d3`A>\Vs72~L}t:4 999>|5jDfpuueÆ dggj0l0177(:u***5I r:!Zenn+ºu8|0DFF`ooϠAʔ;< j?]K5rwHII)v޽{^lJ"uA >EKkIZZ s%Z>EVC_W"bju:rrsH';+;E(˗|rr9nnn̞=f͚d֭[/Jà &y=Rŋb ~7K767O?UF[neٲe<.fffeʝիw 'xc"Hc_j*MfX*ܹsE߻w+WЧO?H$HJJё7oKeҮ];Ν[H+++C233hT<NJr"Nx.󙓗CjDK[{M uDB֭y&IuH]qzUVucHjۛ]{70|`ЀZ-E.բhtXNZ!/OM|\,yyy;}H|[˖-WΞ%m߾qޤI֬Y+KVp'HfM/~ѯ_Re[dI[lYjGѣ>60zhFmf"i*۷/dٸqe6lX8paQi$wmݺuRh|m;t dIKMǠ(v~IϜʒSҠPN*U E۶m[y%VW`:^_>2|lC{88:RkJH?"+;QѤ@ЅG4o޼M*y,lŅNB_@`4WfGl̙3Q*;vڴikV:$&޻w᳇GMD^>e+poK+k9G ZS3'+3ػr33s m$?yps .4]R@׮]j3weYQNKxPOHr,mPcc7SATTiideIMǒI$f̘[M^ѹ xwh?/@ 0qqqg '6Ι3g mlRBUn%7;VnhԨQe E"gYz53f(v|׮]ku3s~2)SG"`aaAƍg)׮Tcƌ;XKA[+YNщ d 3͕ $@NN.餧QkHMIbgSYY}?3} Q(،<{M4!$$Đ+=-#е'Vzfgq;r(9T{͍ӧsM|||HNNfڵ\t R?=V"))P(8q" `φ_}L4 /}8vnݚٳg#駐J믮!J?%G zq!{c]ݰFՑN\L41Qh4"m5k֌ǗkV"%B*2`gp5j5V6vf:Tydf\dA(g孉UT>66j̘8Id׀W^ %7Wxp Y`aa*п?ZNeժslވݻ`J%Al&M W8sfⶴk矟|A;ڶM/Γ?xЅ8%nnL/]$>쒪jY$ڼysܸr ,Z֭[m6;w.V*%88UVE$GNWj XXX0evɓ' YH4j5wC% O>$Æ ? %ʊgyK.q-qVKjR 9+WS$ILԏk4}3FL3,m8\Ix'h>={o_"#Mdr5_ݜxs&M Qy6^^GU*)>>iRI0IPNCѐѣGYhzۛf͚vFApp0㌊*Ҟah-KY @ C1ZL܍Y|?I^#9sR-CS/oҥmX^?b@lkX4aNEh5ǏGě7\ġ_bsFE {p9eK17/P1|r +/?!_d g;v,ׯgȑ޽ӧc^u6lP@ &M2䓋kLn7pr8:3ܼM]p !M3ʒ*g#/SF 7n|߿:"(h+Uayضm[߫D@__cNQ @8@PxiGM ߿ŨVjM%;;/ ¬Y 9iS @Py_}N8DR>V9jʕ+ ֖vܹsgYTM@ A)3h ßgP:0IKll,D"b 5kAAAڵ1cT}VMS` @ F E@P-uQFմՎI0t: -ZĿ[s7n\6MɎ"T a_AmGLK/DÆ ygYp!.Guǣ$%99Ri8V9))RTMS!r @ ILsLFΝ:t(z"<<+V0~0999c+uNe4]v%==Z¾f5꤯_LftR,XΝ;IOOƦdL{zz"HHHH )) GGGn޼ @f8w)))kgg2)OՅY,Ke6F ؗPNzHH-[4|JA:jwЫ;ݢItWWWâٳg˗bذalڴ7npB<Ʀ6@ ƣVZKVHJJ`ĈԫWZe\&ۨh̙(J;FLL mڴ^{OYTM@ A uΜ9۷]vcǎ孷ުV9jj"9薖̚5YfXf͚ SV@ vf̘YZD8@ g,_FeɝSM 8]v%@.A߷o8;;״]3.Ҹ "..B /R_a*olwڵW8}xx  Q]AoOT{y\\۶m3A*ɳϒ_Ok@Mmԗ{t9݋ԪJs?c9fQ/a>wV)ר h?hPRX7mܻu FC=: NC"CUR'c[{xq(Q@ߨ%UV#-}+B4^R ua*FS>3~MbfaAZ0^Xz.R =_kZ 0e  )v.]j<;gD;vˮի pUn.MڶeoS;׮ۇO8:<5z4s搝}1,,s mۆ߄ @oř"%66}0z;5.=_}ſΑc,\޿gy/ g#~cTZ_ɳm"0⭷=n?/^ٝ;?u\UM CT1T}f{Z24.ˏǙ;O6UO{\rם1co44ǔ)SG"`aaAƍgA*-{31cưdA1Sy߿5JTWff~}+WҪGffXk߹Cqr/~C"̙d$'4ØSYzLՏ-[0p w\@^;y0}ӧNF8daauH.ϹzZ'J8J*MNCr. K{{84j5WA*Q W8 RRez"y990P]KRt47Oz?~ulR T/sϏ$_z* ,iJ̌ݻw3yѾ}{ EMVmx.wz Ͼ6rwڬsAɓ\޿ 2wqa7 J0c'Owio7Nxh?]F0FñmۈyÆ|$qX;:2맟 OZT&͍׉sxG*4y:uŅ;׮MlXiitmz"lfiBƝ J]Qkun=>Cũ4zLV&LNbbի7ӴiB+@ IDATj.U.EIO'73ήH}I Jc;0j-߶m[cMLXfJ%-[?w. [ݵ+ΙMۼc2[<ۗ/3kVxtZ" ɨ_>{͍ӧsM|||HNNfڵ\t R?=V"))P(8q" `8+,,,4i?<=ǎ###֭[3{ld2@=F.\~>PvZR)ӧOgdeeѶm[x g啡&z-b%%N%չsr~zP>0@snҤa:)kfXX[@RtV4s#{:Mn9.K_#J8dKoX;VrC.lzRKϐW6 hذvv-xvbv,Jҧ7#+- K[[CYj҂:S;0+//.^ffغp!n-Vwe_{=HGVC͛7͍+W͢Ehݺ5۶m#99sΛoI```B\Yj3gȑ#JkߟM65C\~+WpB~ƍg4Lp # o.|"lH !2VD*%.y1ݵ+ԩXqԩ"m \<= ŋ' SZ<$MѬcG""=nmzݹqCieUfc9ϘAS_rܤ Zy:-+hT^vYZ/hqv~J=-Gmvn]P(Xk+x<vrv֖!_~zyذZ^Lg*JnVqvtN# "z}~] :vàA\,ڽ~ʃƿq.  _Pȑ7a`'#8c4ZRsn?oɏ[ Ir zEq^x,a*oz+Gl!*$FkӦt1JYcL敗 5?ե-C' Oعr%4n0 R@C9F_݄M۶mJX[[qstLTRO6E TY8;;?SOj*9uӦM+RC=ݻS1e0%A,,R$>=s 0nRkԦ YSO0ߋ{+σ 6AP윝yqRhSHe2--iSփ$y=F~h[!.=3vFh]nr.YSߟk1{"EƵKe󣝟_jw`ZW^ ~8f`ίbbKc; gcƐMCUvNF!99ِťW^x{{puueÆ ?sss"##ΦE888U$tˋs1tP dȑ咥Yf"ѫW/>CZhsE+ڵC"uV䇱SS"tAsqZFi9jf/ߏkܞ,i^wT_P8`Ҥ7hӦC J$ ]2u}vluDӡh#ǎK&2d15~muxwK,ѣ=z(rˋoo^ _i@\ΘӫWbe秀}P1bk؅6V .1Ü~Ė'=m˧"QU=(Q~T N9h BBz %߶h-BPPݝ VԃnnA۷/^J` &2^FkA6miMr_;VaԨQlٲ$] x(^  ;܏ OiLʂ  #,~mbcc 3f̨.MA9:q5 L sR:=MJ>d6nC73V|Z>5: Հw>HRț~#ܹa@M@6mhԦ gw*0p Nmߟ^cDze޸WN#,, ='NIyw*'K`@zǥ{Q2HOJ>Q(zEz @lX?/^L\x8:`䄕}@J`<,XK/Tx.j1=""m۶!H8tnnnݛGn:^|Ňϛ7(}:Dll,l޼Ν;ܹs9rtޝUV r9+VqF"##9r$~- -Zd>|81cakkKVؾ};x>/|Wxv=*(~:/^ npvO7rɞKyjkWuau:.lN9rH}T*89ښ̌ )%#P'p|G2Wnss1E:2`{8H-jeSVe)*~Qnaaۆ5[(v`opa/6!g }+~,|vj@@W䷦ʕ:v#$okjA"!F+WFĔ:>@qhܦ &N$=) GGCCq#9|KD\¨wűaCֿ/h573`r_kypL@oӤ];7NFyImI^߳gUHG)w3f<y?֮] 9G)󜠠 Z-ڥK=ʥKhݺCsrr߿?4oޜs5 e!!! vZˍ7 #9cƌaƍl޼???&L Xr%qqq1OOO:wYt)mڴ^#!!^.}:馢Zӧ VOv}qp o'EOY@^^I\ ̙ӧx\N:7_MIhҥK8iatQ["L%whnO>E׮ݩWh8Μ9ũ'tBS_xUGn- 1)m{`w8n_Kkn',EmDU8t:u+0̂II7hKok֭zȃLTe֭2PNUt*: ݺ%Kb2FuK$߻G;0 7q"VXӴCxyѠysG^1c a'=nj/ebΞ/FףCB oE*Р=^xc@vz:}^z Tw׮tVaY ^Z렃9y3n‚F[dTɐ!LY;Jhh(wC?e++@`LLL78;;sC=JŮ] M6ۙ4iu1l0j5VŋL0w}8NjA/Ȱbee7#GdŊH*<褛rA{2?Ҏ7& Yv:kAxQ/|M盙ڠ 0``mA^^mVK#77'*%_%,0=#tR6!gitnńsj6;;3t6}-.^(V/,03++|Rtkeϭ֐,'[rxn:ݦM+Oܓ _5}kaCבYv:kGۏj} pJue~(2>Ғ'yR8jk](_Oi*%oaKu|v.|u*?vݵndP*Wܬ{X}qr"aZ- &JEvz:!!y?| 4qoĨ(lK%,66ؕr/wqښ9Vlεk&$j NzrL .՘6eך59n D޸_tx>,@*e'$q,d _}NCum"J޽{4hЀsOY_]vLZI&lْիWFy iI#٩/c 4Xl9jpuZ-'6l@Kԏr<-VNapμ>c&1Z R3r H+_t`n;k tpprbY=|Hȃ+w&nBcnT@N۽X3ZLI">9< g?zqu)8XbmiVG>8ٲ̖-orr66/YJޫt-֭ʶGϴٿ?U-؛7 ڱvL˜HpTaQ&|LfVGj OwT[gk9n]e 2GQ_|Q#w @K޴&;W(SJa:t\}qa$2s~yE\@#*>4Tʁ78s;ggZOJȲ-w njF6"bMJ'OB*"Jv{wT"A&RIHvt"ih4$)^{?)"Ç-~CCĘ찻~~K dJMhd4/Z!.)ȘdrTh4mKJg dӦMWi&770e8p=z`߾}8?\T~^~eټy3aii;v,ǎwG,.a޼yjՊϳj*iw|UْlzH{B*B"}EZ ,?QU!TA*E:{d&Y%S{Ν3{nf3|xxᇫ٪ՇW#a&ac+hc?.9=|fF{G !!I izu>kEf>@BU.;8…Kr_dAn~h9z!6`rR$qq6=7OA6l0$IrU$9# _*Zᮙ\4\޿7P;6 a-Wh[}~.}OHh˭tH^HU ʴZ-$'\!';KoPڶ8ɧNk LzwkZN҉lxUϘAT -Pp۠0oy VЭi} I4Sԅ\~q1Zv `͕S.iSk#rs+\h?E-u\6..|R5(a&*q\?y{uLY,γ~[g51mʕyJi  TXA/Iϱ;ךoImvdW\ԛأea#AAAX+VTf͚_Y˖-˜ r*3 ,`.ݛ'N?(֭[~Μ9nMDvF܉wc|jMN /p&g;\*R;EA dWPm3F[tDGf9"-vUΜ޲$l>oV;b• $*LRY&ڦ)A ;׈lbo@:uA$Nomcg` "n"mQd#Z-.Hz[iۢv 8lr1o֙KpAG^<ȣ,c>(=z*g1s 鑎k{MrV =*d|,!||nU_5]T$I/e-rWz5׶=i w_PGJy$pr\FS˜PO(,^eŋ+ ^ߵ Ǐ!lxM4j$/w<H]}I,ϢoMVmQT^ivKTF\kIh)$IuuG]s]Bេחf˻" B8o0|)#w+'Npdfn?0,W]rЫ3A){PSΝ[m6@NR9F#$aiyO$s6\5f#PIB%AD M"Z%ع}KI-RNl0Kp/(WdvT*Ɨ1nۯ>_g~h6$Y Jۇ*a0YQ "͚GѾC'Μrh1 >MdLL3NB^:Fä8nc۶mԨ1idgeѬ$xݶɶmǷ.׶U*kMe[;ii#\V#2~$HS@~ZZDE1祅_/>[eD}+WҠysK/< rKm{TjW-@ÈņTu:1cvrYr5DnEz={icwEY''),u%FØS 5z4/[X%+g|}qB[,sOvrǦPK`h"J]b8)qqe:vv˘5wmLwqxj!E0B:k|vPݶs`jLNj5Jz˶l CdI"+FE |5ĎKƼWC`f8("m?T>eڮjv pqUJS75Qv4K :.۸4ϊ( Ürv+_~rQU'kzmD~k|}S֖$𤽃uڢ"(w8ZƖ O $P"jI@TX-"hE%:v._@2.Wal ɀI$ILfLf jHPtq>Z~]Cu=&) ZA@*(tܵ mA^1vuGm.eenx׶mFOe[f |(c[#Ňx_7Drcxm)iY4ҥk S/?w7 Rh(hFV>AG ƨnAQX`{CךA/bzU2.]'dOҨMuR*p:KCXg0lXW-MNjB27=N[A.7~X$ΟO6mզV>.k}: ܔ,C6KLXEقdvQ"r*1Km⏣%@DB~Oes̬6,u/79Ly))G aaZd*tA]9s~[WrhT JT^J`PZfsQ$)/5b˫Rxlp4GWmlkVuml[%ӏ \rav!vȝݖ-hj U3tD,GE[g)Wӵɫ(R.VOxk^@4XhGi/jOnYumq Ӎ}Ѽys#j<cG%VorRNb͓Oyz~WRMxsx|ts)h H}͂hٔ뛓L].'w9\ ? 9ODhh+Wl\ߪNX|ul>@JBhPrh}VVzͅޔ˄5j"J"F9ApywwL絅/}&bG@F7$Y ڝNXHHPpE=Wү 3S%ȑOmnˁLOK yնHyUmQtUqQ ޳mV ̘y/d9E]Spy*IjhP 7NS'9nFQ_Q* ƍno;{l 231F$OL9/;b^+}ȏql G[us޷_Jw'vW._O>eY /ѪÛxs^Hڣj- O5y,ye.]8b߭6vŧMA6`"%3ILfnp#N8FV|<ӭ[X$k#(hOV s[J:s^ҵv޼*RPx-A/%i|SXh-:!r:GNT> O:RlAj1cX1M.뙖>_YXlX)@bأ`ƌP4aP r9@X,MHqSƲv V9ei\yl듙$?R bxVo[NLL7V+E"yyj (`Y-Zv9OnRR4>>E~ng Vu.QtO4XILY<\M-n˗]Jo_LHCl&)0jxN?cJ׭̀VvI<ꚫ]7SFF~,Ƥ fW9 ?F].IH?{F{KAXYDc#9_:=-55:9"U::[Uٌj%B25io% Zt`6bE/|asl 8Eu?r j%++sA Տ d$ȶm֡N۶w bbStMQ9tCa;l`((^K `Zw{-q} C@ad{TuKqќ_q3o!5>eQmiҢJb$aESѨhE}FV-"Gobp-9dg;ʑŎk垿,-]JzZ_bԥVˮJm]ۖ-.MQDahɓ'ZH90U,S:G(U32Fٌj'aQQh r rDC+rAIpMǰ,9G2Ti4a2Z=]2!,*bf`7%-mW`E yj >%-⛯`8Eb6EOf"M[v TraErychiOnYe1݈jIv^\.)1v8NN3@J&n[N8z:p{- Dv4eK{UT6W.?TPpkzkg^9eJr %nNN 8EOU*vEVQ@"^8WExےKibC|Z^$hQEzΤ|nbU=\sq蔰XErsyϖWn|}m[fuֶX,.J})7p0[)z'ZuW4Zn.M9]v аwi7pf-xaBCBjL՗~Ys}3^1fVQˎVcsB<_j0[,tT{ƥKn[7 .VGad;G޹kZu)(ޤsgO7oc j>Af!9PYqHvk\%V D~^}~>JFEnNt~8u,ΟgKVD[NChs&풅7?( b]t4)gAmCm;zb5Iꊭfj/mWgy/Zv+Y. )SӵBQnthտl2!)*͚yרfAbu4nٌhvS4jFC;mh(tDNZBP1̈́6(J)fWwg504nR,Q KAំHB"#i6ԅy4@Vx+6YZEIxIN7; %[4V+== YNE8ggf]Yuu^<_Y~A?~"GcXX"V]"gVbdPPh$5)UֺgGZж!w.̣0=Yy\:FXBI:Nڶ8yEΕwp9o *Jo9Daa!İzˊW6m rѷ&#cm-z(n4Kl2 y xE]Z-Wm Pgܾ݊tij ;ۤpRkTy?/+9gɶ 6'UP0-9YyMHtfA$QcWIrb quh1X,s-] +[TMR9i?IAP4ڷN> v QoSfև?+i' ԙ~v]ZKmvi.뷗(8F GA@EfKʛo9Uj XI-So:l$Qc֥PyvɬY?~<'O_^G IDAT-ڙ2e qqq-n |hK4IZPCL&#ـᔹdgb-lLL$%'*GGL&u?@TސZKُݯU\x^v& 1 Lfd`2Sh0S`0QhƜBgdsy z,V+IW<׭hݶ_0m߉? w~]l۬{wpA9u˗.yUޝ$'&ٜAU|33ҰX,$'%yCThʠ38V^]+".Fv >E!SR.m iVk}YL^n~]Κkƞ Ąf<6Ƨ7_AEQb9)&BzZ㘞(7XDDL p9).\"A 8$qoHBX~=o&cǎ//`̘1lڴQ(ku4LoqyK\g1LfVqBsf ?@D_9WP#:I-_(bX1H~~-?qHK)YOĉhܬ[HoZZGn~\aC}͚7fNsʟk􊒄j%7OOzZ*y9(Ȗ_@,֨}u۶Oqy\.Xu߶Q߽ΩV剳mCC oۖsr$róDy"jT-VlùE*bX0푻e\"zWnVL=?|+/֨CWJUt7l@Yz5OWi{.>|cP "Q //Arb6e4u\cPYEAl٢aVz}~g裺[h١K;G=U!XL&||Z}v6-cbrhdŊdry_$5>> 9maҨ]A<묹85ecwۅ#O_Bx"ٵ]]k֜g'88 *I0[!-%+mw^ ɶom,6$.Q]8ޤ.U%?`9౮J,T+ qqx1gϞ%??Ç̞JK/1d/^̩S3g͚5]vDEE|rBBBXhV{1}4 qqqlܸ+VBrr2jI?>]vedeeӼysIEϟرc9t/Ù/X?8{aѢEtMou]Pٸx1C uaG'=-L%8$Q1ATjT*4hl1; ݾq-)%έx*2yZCƥK޲.OwZ,9 o$J`D={gdә_{(m˘1#}O~Fȩmmt@D׮$(OFvMzL&#~AX}}r&3JNk1,d摜D^9z"vN\)㵈Krq! <ua~m*A?R&4z[3%.$CNNfHoqũ 'ŋaۯcH쇀Бj4E#kh&O_HRb&;6;FCC˭20Gؾ|y,F=$YoGdexf8$ L$QU.kW$+9[{Lޚ2׮G޽ud&&"z0.=e0 TL5v}ԈE_gϞ%++ ZMLL Æ c֭k׎#F87nVի!4iZ[JZ`0pyuFSZϟҥKT*4i7̎;J8qqqrRݻ7zr|~u-u I{/;??X4KˬXg`|}%Q \uC!GX-T*{oFG[oŤsaϞ]x˟Eִi׉ *</u9.F1iRt:۶ӻ+-Fem;XF@~곏5&;d@GCERcX0 #ɣ6VoX۵K_FvJq8QJ[GS[JO7XèLwANmiS4 *xЖ-Qi4c:y60hH*7x*F3m}F*_`$%=W`28/_p;z„ l"uM>jeߨ 4"M"y=l]}A&@$Q]_Mͼ~뭌1|;*j؇FÒSiխ*55lHvJ ~5Epp0R 6l(צѴiS.jo޼,T*:mذm۶O>ի 0_`6ۚfڵkWƍrzPp7ɱjAyl̙,3őjՖ< ?@Tj5(b6HN'y\b1z.A{P|3f-[J@"/ɝF?0__F29)6V΍B~bҩm4w租:EQd;}AG( & -B."p3R8^qMkT*̜YigZ޵[M7a.( nUfÇ*wNd>omм9|z5Oz5Yߛ~]b 7:-V|F%;k 2㗅 *ؔ^":v|z˦* СWO>p٦-* $:q2c;))4jѢ;Ӿ}{پ};ƍsL$6lHFFހIONNQF$$$|ryZn wr]3vXƎKNNo&_}cƌ!00> A 6$!YYY'q*5NO?-uis̅}It-YZǩ_t\?v,=AV4kBt\5)S IքGE|.:Ge$QqVkTkyrrÇ9tf"44UV1m4Μ9Î;Xd z___5k={HNN.\.]BөS'Cжm[6mʊ+뮻%>>B:[Ck. DBB{emc5hЀ_pbQeQYn}E\+W*ޓζaV\}l٧;t5\>p+융ۗ'Wꑊm߶ߟ_|Hw"&|VVpʫSmoq8Zh2G*RS?u摛BS1c*#L:l|wv}:*_~{ɓ'OtKRY>(l ;n=:*. J ~h~]9k׺D?ݻ7۶QY\&{= rŰu'Oaҥ̞=֭cdt;svqa.K]_͚v@Qj6r )gΐO^j*&V' ƍiТM:vIǎ^(~R8v-΁; и];tmQk:vc5H:~̉ejKY7\ܷ^iW'$ejVV6U,{𚍍}Ăd*`bƍ07ONf۲e32JuHUZ-z׭XO=}ߗ/ZVZlԈ'( ;)gp2._0'c~>аU+wNk1MK=DPFXD~]%PWYL&>} :ȼ w*ےP^&;9&%noVw̛w;^KY8.x…w/~-COgǪU|5gNm˪hߦںo~_QK͹gO赩 p!.ѺgO6$Vt>{)Z-c~WVAPՄEF3|8lQvLLDÐi#"t|^_0z4COȦMF_L~| ~{xA槟nwSiב;>u+yyݥ٧z¹sxٽ{74mڔݻ|rRb[zsȑ#z*{eܹꫯzu1^+i{C^f&Aaa%9f Vף @El̷Iwu{)jO~NG 夦r|vhQ絭"}na4n ;q"Q]4\p?V$I3Ъ[7^Z >zQ£J=$|Ӵ҅9?Zʉ.?i#A`pdfzm.\!?.K;V]wz>|3C3sO:ڱ7hީ 54ܹLm >{)\ɨ+U @xEזo#FOxj늾uƱ)/(j ehߵAu2qDN>M6mٳ'] 8]vU)?#СC?ذaWH\w>:-cby CR$]\뺯:EANJEiߧWtt,7I'Vwy h||o0o(V̞MvJJ: t,3~l4>>4`wwOӉgϒv 7=h||hӳ6# #zpNv{Vy#G2oHZ˳S(c؝wRЯVNan[)SPըjOa7UGlrmjOl]wnԈ6z99{7WU]Gz j9A]TOHIIrI6mljM6Eڊ~&$$3f`63m45kFXXǏܹs+R_ޠDFJu-եF#֭c!cr`ݺR'޸s\G_Ϯo!7=ZMnZZםFhӦ.ڞki?q{9r jذv]}6 "[ y`Uͼym,f3:v,uB7.wqHx>~~qsg䷪ }J 讍s Gpj 66eH[h[PÆ䦥Uxji][5 %xfk;}&{O n8/:!!k}})}V5Q}'BNN7t <>}5kIDATfʔ)|g\#F0c qwдiS-[9uU\ v˖-5vJ5;#"O=#**%KԊڤtߛ7#" F䎵0/ĸ8";t(OX־9wf9W[oDk7H U׌p\t8k"$Q N~|Mz]>6No7tY~;Msk֔}B4!;5\ܪP\;:*_P!,_9qt$Qt8YLHHurssw@FBNwME6εU|o~Om aH>;w2+ zBiQU1wڦ}'hZz!6nFTΝYv-lv-? &`Xx8|03f`Æ 2E\\6lc̙Lq'@=Z%'$fڴilذ^zn:"""jTC]R\oߎVwZArd%',ش ]@@mQpƍ̝;e)l4h@pp0;wFӱ{nf3K,ᩧdGjOK`.\}'|BAAݻwܹsL2h6lGxGܹsYj'Nb}VjW^y):11ԙ ^^'|#In*ho./]٥ԭ[],zYITAAAAADVs9K/i&Ν;^e˖L>g˖-̙3;v?ҴiS Ra^B1 5z98 L=<-GhZ-ZTab) `ZlɪUE'@LL [nu{9s0wj;BBq9&>DmKp`ӦږY2axbٷo(zJד~Uy)uNj&Eqo8P*;5Kcܹ+u`yl޼V›ؿSMۤTUǡ):AOPPPnt7Lfu59)*J?}|QN\k=_eUIOCUǡ)~N}'(((T77n D-bWA[&FkSASn p;JPݬZoROUF)m-ť'9kS Š4JB+(((+oA7  P @톡 ŹU>5"ջwӺuУPOٶms>Qm6^5 ^_R@DЧFDE.^XSPP̹zǿo׎OΝS/j QTYmQ]SPPأ9J=M営RPPPPPPPPPP PPt:z}XUAAAAAAAAA.2{lu{ҥK+%FAAAAAAAAAA}'m_AAAAAAAAۻI*DJqiX5TvÏvlmjmW~:u.T*]6ĺ$DH&L1kb"z|oĜ||"1""""".tu """"".րn2DFF:JFFCW#kcVqq! """"".D]DDDDą(tR: 9MPr"%4i}qv MɓCs4y%ŎlB[73kXg!""ҤmK]]DDDD9<_&DDDDD%ׯ; ߜ5>RR@{f|#|5ZuEDDDD\z7c77LjNG>|&DDD~Ɏ{IOϤ*~~i&G'>>sX:!!A.٥(? fߪ>r8_/SXXѣiz+nm{mp38۫J:""B:0gX;u """S%GK\6l~GlrsWYۙMʉչ#pь1c[h*+HOd׮\aӠ^)ngX,~u;E _1~~|>d̙QQQ…K)** яwa./gג`ch([/?RH{2_ \^Nd|g7ww$mA՚O o頟H>OyIpPv= U 3z@qyq=.]mjpwC]ڵ_cX ׿~@IM=$5[Ҿ}[̥{mbЭ[43g>G3֮C i@R@o`^͛8uG XZoIGI]ڼcǹVZ #lCk}?8:gR~  :y0W_4939%;vR5M݆sӧ0_}?T_+MLJb0X,\nݒH"#MY3VPPĢE(--bpD%:~FH\xz[r414?,Զm ma.+*o@¹sՋt @VqgcM*r\㋃DjoL-ZٶcX*ڶo;hl3όaÆ$ʳ5j'mٳ9{|nuW7ms_8V5-+,ɄOf7&sO m%'WQ.^iFDD,l5ZxN("cF\;#{O.1rkFڶ ''B&u艇G3j>+hln۾1Tź]vx&&fx3Ͽ9s&m۾%1qݽLϰa}6=I'@?&dץ-Z`v-MxKqe$%s.-6ݺc[?dGq.-҂+[vkN)ocKYY|"""widc'ތ^I %=?~m{lڴS2IK;Ö-;w>ׯk6*!||d\JsuT{G.~CYv~&'TVVq)>`m8+Rz=t(KW* >\^_H0#^AnQֿGIٰO?iwGwͶ}77O7C^~m/V<im"nsc)c0wEDDΓW9?91S )*PU}՝ Fqc2fs7&qc/ĺĉcYb̛x]޽WYfkl //OۤѰC1 L˖ ==0m_j8u (e&`xѡ__b]vJܦqoɎB#%zI/q.-JVt>>s]va/qh7\ldHc:y_92ng$7ر3qmڄ3`@:Z4$%Y. 44^=Cԩ, PZZFpp;w`„q&((CiiFڴ gϮ.4S;4f,̙U9qO'5{k.ޚ{ZtfڒwTxyąy \R;k;myUgڐ)tۂZ]eOjw?.9c[7oLCnS,kWmX_nvz:؆j3J1s=j +,lmY0nrf(j5F|:途JUv2~Lo 4f6etA|cwc.Uc|:ZGѣmc}n?wATq3+Ofi;\J%^^ՓvM~/wlq3>Xju!sQ5(J~CrDxy3Gص[c/I[f99}viV#PgdX?$]vvGO^)8pʪ:{rt/T*%ru K C\$M)[wYG_Abxv`PaQ)KW̏?_D&ѽc4'#Pb >Cp$%'})~>7Oc#y68ݼbbaFݛ1).]͋ C5VaKFL|S2oPT\sWΣZMh Q襽dzlgլO?_T(Jnϛ?L@f @j7OSk.9kr-?o6/sNIo _}]?%zul %햔βwcNlg';$,~)vpsW ϫV}qMR%W3)Kx 3z_Aa =O'/Rkݥ4@_#۶ndG.]t~-r|XF51(vZmCm *|I>T.[d]ۢ Xݼ8v:éh48Tm%ܼ#ST\F7 Ly!ziۗ-W lsь>߭~1L >g277/ao-QVyDRę+oQu=yx ߜ ?+ɼCJp7ͽsTqU*%JR/l';+BܥkI,9o-dP՚ZmAo&I+uJop*97J*SȞ8u*|<9>\O?-sMART)i8k3cfvMpZK:Ȱ.|)4S\˕k Ly˿FP!Uˠ[w>X{Տny-Ee҇Yktg)Ufg~y뤯4 ʫ[Sȸqes~[m\զiM֏v-Y ?W5)bD?!]t¶IVՄ3M/]{d][Avd 2N6 ӎS$\&'ETT*XvJ :u8:pU~Z͇kHi+, %udEފ)Pp$2 zq%L'o)__Heڅ:jˏINn~ 31@mP L4M?/'WnSZ`$)EP<$ķF!Pլ_=Evnо C9/V'jD#˹ **_K7pwB,O?Oqi([t6C:?ޞpJY8y3WBiY%+6W/=Zvd_- /VB֏¸?1JkG1~1~r47Je -E7 eeڂ3ze2R$>6r(1RJ5ER̛9(J\+Q\pmufϑsܺS[8)jo<{Ot*UV*T>qwX:)<<xxH'fP^`dԑ'.IEUħdžw /h݄zud^]o؁1*J_Epأ~gt*OLF(Zaz-z{X6*%Je}kæaR&g2O[͑mU*e5ڤnwSQ$q s_MBX9laC-Ee|4f/,kkڀ}ny 淼G_Ӂ*o4DZQk|nAZ.ݠ,bnk9lM_-p.Zjq΍amG3+m^Cˍب0~9_sHIoRFzl'[PLxvy=,] GD-cG酵nW+KuZ?,@az[rt6 ^J_#6\!>RР{{O jhǎkm]\Tj4&8--lH]{j*wPl> !2Ybִk xJyxHezʼR 9RZ EuǚO`9lM_-p.՜Ok43]Ɇ%Xiޏ[Q1I|^ѝ{?m9HX}J M.4j,] /j]]|rT7`GT-uZ4OQ?3Y>)-R(,*דW; SnUYrotEFͬ|T]%7D/Y7sY'ꔄ^[՛V*;=;0AێQ?ˣk5sП5Zm]V^o++Y:]֢SެDW|;P 2َٶ͵KWn[]*LgĠEc<~|$L>AnPnA ""5dשM3FR$d#C;I&sĮiV:彙O&AZ}~Kb2MK:ۣ'Tgsm-ON?Mf Qy6h@_ Kx6~D9}~{C?(TTTp2;GӦemZѽC OWm+(11X7u;m팟%PS2~X52{,z4rv1J*[4 fώLw),.'9ײj+YdܸkPlr=;EӢ1~>.3R6D$Jʹvɬ;YksT3iIZ 6WԺcܵJz6 e*YfFA^HUٚ%{ʻm)B_:)0َٶ͵yPmR7˝puLÍ7kԹK7Xj Є1yR-toδ taj A50jLa]׵ XWwS#W~FDH/y$J 7 )b^L͚簥 ZVϟ(Y="F(bobW_&؞{ÏrS~FB˝_pwEQIԦқscazp=z'Ԝ)t:΁)uZDI'R/EFάgT*5o/A`?rKpw/I:hz37sݹm3"&jͷIaҋcIݵMJft(-[bMay%vߞ`'jMÒ٫s4: eW?۪o!xzSS\4Ee̪&c`zw;mkkW<7?K?W%<駟(**bȑ,@ 7nLEEEڵky衇?~<*TG<==8v7np|aժUl޼W^yѣG;X" 7Ҙ6m9-Z0ܹ3K.~k4vɎ;z*nnnmۖӣGH RιJɒT1y#2d3f̐† Ƴ>kU9]MGձ|̚5 M6vO\wpp={0rH&LB`޽̚5^xG}ԑ" @P'期?M6qEʈbOpB ۷/_}oflذFݻw޽;:|\p͛3sL޻w/6m͛2f&NL&wРAlܸ<ڷoό316+zI֯_˗ ..^z aII eعs'> &MI}DŽkI\tӧvZ"##ky֭&5kY雒/**'OfaРAL6 ///2\<`Em}vyǥaÆh">SvJtt#XigLܼyxF'gϞe޼y,\nݺI񒓓Q(̙3???BBBz*7ndʔ)TTTe˖Έ#;v,7of޼y[Nڻ}-Zѣ6m.\`͚5J^pwwwϟ;/ޫq{Bbb"oz_ݝ3gp]y۶mٹs'___8< deeo_̡&k\ɗٳ8p 'N$??UVQYY̙3-\xڵe˖W_7##g}tnݺ|:v/72'+Wb RRRP*3nܸX2pm m6lBQQݻww9UemFxx8cǎ53po.Wn@ p$;&cccwGsN=\T2g|>C7n ;wذa3fࡇ <<ӧ*mkXf }W^>hSYY֭[?~<@>7x???~i^}Urss 5Z+WҩS'ϟ/:4x嗙7oG.C7nw`` >>>xxx8>5j|Ř|+W$!!9sHa̙3ɓ')?cC???m5`-[Ƒ#G5j K.V 0;wZ5|̞=>LZU1'9sдiSf͚Ԩ?s `8c=F޽9qK,1K^>>>QQQŋyᇍn #..3gHaK Gbs… ׮]+--eƍ;vl *֭[mlժDEEЫW/lڴiCEE?^/!Ce.]DcMp]yAAlْիWs8}4֭cϞ=|'`&L6RWXXHZZ>{d2ҬvM u_>mOϞ=9xs>h iƚKr3 IDATCRk&kƄ 8pŨ}||}6g&>>@ s `7ly祴rss9p@r^p!={$//ZM&MLNRRPї@ b\.K39˖-ٳL:-[˗_~Irr}ƨzxxk*++0]TT$μiӪNaa!52z&r9 $$$pa͛_͔)Sjߔj.2[Bu ׿T*PA3g5x`/^LAAAAAqui@aÒatt 088RRRxʿ_~G1n8vj֖'sε鱼  d3X}jJv끁VK GbBU*o#F =:yyyzR"007 $$$k׮Y>RuٜM瞣gϞ׭Ybjp9}Ƒ#G3f qtnaИ-kv2ŋzj,YBee%;v_4p`u1w\孾d`M\.'++YYY12m4fϞ;Ð!C!++G2sL/O:stRŋٲe O=Co3<T9 RSSի }qI^xt%k/BOGݻ7NKX|t)39w0h{']=˖-kyw9x &L;P˙3gX~=)))ɓ2={i&nݺEHH?s·ʺu!>>W^y/--O?@nxL p-.]Jrr4p8~8Vғ=~Wlٲb:t??tQS}.\ӧO_׺bhعs';vիѶm[ƏO=xyyyK&@ e_KOy98 _!s@ 8ι] @ ˱۞έ[6l?$@ _NIw@iol @` www @P9E \@ 0s|r6l Y ꟩I@ ؛?=y޽.@E @ 4$ݻ77鿋f9ϙ@ *s@ Eι@ @"\ @ p>Jʕ+Cbbb-@ ,:|СC`g\BLLd @ 0H8ws.@ p]Ğs@ Eι@ @"\ @ p,s.lêUؼy;44ҢE ~z[xǨ$##e˖l2<ӧO7OѰsNvիWqssm۶?=z8DV-V믿fǎ͛͛7YbCe'^zaÆ1vXtܙK9Ne2~~~4k֌ݻ裏ҨQ#O?DQQ#G4+~.\HAA\{e}ż6O[ 0p'wnݺŦM9s&9uJˬ]iӆPvMEE-D}-Z`֬YO<U*nnn}ud2<6ydHm1Ɓؽ{7ӧO‡ ƢEOڵ+!XRV6C.yNTGʓO>/;qwz۫֓{ۤIt7|?o|-9\mpmޒp߾}ꫯ}6W&**{i&n޼Ihh(cƌaĉd2}]< 91}K'Od͚5àA6mUkiӦA:۶m#<<\ 3<Áؾ};/ ƍˣ}̘1\Ο?ϦMx"eeeDEE1yd'1U6lQFs]w믿N~~>|.\y̜98kҿ%z2=ɓ_˗/A\\/YĜN<ɤI,aM6oNm۶-[PTTDyGx7%yg͚Ehh(tߥK>}:k׮%22R5iK?_|APP?--iӦtR:wlCCCy;w.ǎca^r+VR$<cƍGϞ=_XdɲՆ6c^kٷoƍٵk͚5SNVߣGd2ɒs^9sдiSf͚g,|M{MqugE&3{l>3m">>ҌN*^8P7iJŕ+WHII{vS.uhǏ]vHQ eee@lsJ%sۗf+@޽d֭? i PM\̙#2g&Ol2-[ɓZI&&ㄇhx7O?ͫJnn4бl&J>\Z=aΝ)@~~>~4ps6l`ƌ>]Jh0ecɒ%`.66SrLQ<غMDGGŋs.;97֭݉[RxFFoFTCllYdddp-j5oߞ*++IMM%??777"##i޼ApL&]vB:t ]OMMu;vf͚R$((85WKyyPx Ottï Ə֐!Cزe .]jZXXHZZ3f ξ} CڜcbbVҚ6m ݻw lZ<==YpAڵkYFzoƍ;vl *֭[WNjJoE!** ^zeggӦM_SPP@FFY+ mŘ.[j~̩`2222e^Z[b3=>Cl߾TZn),,dĈˮF1y-000>#ƍG׮]M~ÔW'**Jo%22RRR,rmB&@nnSsZF"00P [nxxxpmӧ%%%deeѣG<<<(//ϟ'00>}PYYə3g18v&@TFΝ;zK$$$p9233l!~ŢEda0 N< /`֖\g֭ǣR n/{7|7|QFٳgٳe:ړ--CsoҤI,XPz/©S 0`| GFkK1G 8#}jǏUͩڵ F 3ΫΊ+ׯg@P߾}k<̜9:c:m۶ޣG-%̚5K2i$1b<8 {@Ϟ=Y`k׮ex{{ӦM/ұcGBCC9q[LaN :\l·~KBB3f7Kk׮L6իWtRx;wyzׯN1Jz-d24k֌1c裏H̆ ! nݺsIqFIrr2K,P:WZjŐ!CXr%999+ ̭suر0 ֬_|Z+wdagPСCr劣e;\&C-7rrr͍˗/SVV\.'886mNee%iiiVe˖56~)((_m۶z'>;v(nܸB ,,֭[K/Y#8AcժU;U|t?B,Y .j*g" Fĉ:u*#Gt8˗an70֏fbccH:ӓ[$}}2A}'`ʔ)lrUٷo/?ưaÜ-P/sWڵk4iD|W ~#88_]:PP3 , 6-CǣhxWMl:R8v^^^tK1`g@ll,sb g 0#sqǨu???bbbr@ zgΫX*Cu@ :m-&LpD6 VRR͛.@P{]K>}'@ ܅1w$ٳgԩp*w}1c퇅.\dIGCcgYm\|٬xNs޽ŋAPEpp0[yh;)pNGu?[c}ۖ-tm[Gmm)իW9q///5jB ++ ᜻3g'jp[6];o!t83 ; SNhh޼9z>SYYIQQرcPQQt҅ _5=\|vIK%Ν###CJ#00}U5WСC& 4Ȯyk _aOw:5PWBזc7Gau\;#Gض{avv6 jzzzҨQ#waa!M6%>> nݺ ҔdFs.\ӓxQ((p{;溌3F;TQ}PmIu] }&} ۮض1] }OffosaQ6E?b_3R;UpiKKn*>|8ݻwm۶LF~~>f(0|pkTwr7{`}[,ַt8,u^tBE#89nQՔиqcjN>7|֭[پ};WG< IDAT{]KDDq1vOqqq\C,\ l-^6k"8 ]׌m89 3gΠV]vz]Fjj* 0m_݊RPP\._~;!CдiSJJJȨ+l\q-i7ccKз㨾TGصݦ%Ýs8tzjRիz3r@N8?Lvv^of$''-{yyxM`9Cc%8~|еm !bk}]Fv89hٲ%&""ZݻwQ*4oޜ}MTTeee9s޽;Yg|||dddpy***hݺ55^l=χ6^z6>B#E#Q]qG 3y].ӻwo[_7n̨Qt bȐ!Fӯ+gї?cbb VŘ1cc^zwC΢{];я{A=lM˜ꫮ2s.\BII&Lpbv G] {vsҵ7?WHCַ뚱s>tP{gq߱yf-ۼynN:V8Ynя~8m;mm-~~~@ǀcF+WRIn>ӱ.wC^vmݐt3og YY;vucbb왼trGΛiHvX;z[,]7Tv$ Ѷ]iHE<#îι+ OCYֆ; E׮b gPT!ضg!۶HB4Yt6T1Z8pZяW'WB?Rm[8P5ZjW䝝3p]7v\M{*pιԗ`),BĕlٸR}g! \\(-pr9mYpv!tz~Ե^Z9]lܖ҄Ju\l+Zk 슫5J[ኍ!thO]MffE9fK&)zbu233)((SNR?AX˖-iҤ -[۬?NIIICAHHqqq;T]zتl~;6>eXͶ']={ ]G̒28}QQQS[7**ʬ4稨(=bm;ΰmsYzAAAdffhdTVVh(.. +++#88pG(Ѯ];4iBEE.\ ==6m8EGaغ8N]gn'hj)5y[kqۮKykGN'd tYSNc[{֋ˬ733%ǖ`m;Ҟuqm_|٬xu%g< )++ O@@PZZJpp0xxxUܹsrZl)9$''SQQAƍi۶-2Vye24nܘl)Tqss#22͛Uh5kFnn.J j7##۷oT*!66fKt+tձc/NYT-*v]khtu]oe_V\ *\}+ڶCd2)(( ?? ªh8w7DFFrz\\tؑ޽{9wܡK.ݛ"=G6***{.>>>RO>t҅7o#]/,,$!!=zPQQ7#Uӽt֍ӬY3Q5>R1\1YB}*K}(-Bquvu̡>v}:n;._u slzuQ*hLFHHxƈ7nlS]RRR8tǏG+QRRBVx{{GFF"ɐdzmҤ d26mf>ꍡ6kYo2wRʡ+c}tmkrkmquڈ+p<88J% 9W*9Ko;lvMhrT*Uk׎AѵkW*++h4$%%q N8{_8~8TTTP(*c}ԇNꏜ5QPl .S_P_4F}m-MpSu\YN;灁(Jnݺ%9nnnxyyq-ej^{ۼysRSS%9ٳ׻wo:t SVV&_^^.95[VVFjj*m۶O>///ѸrcQV>_dեڶ*}$1ɶ듬ƨm;9p5 0]ܽ{ruyC,cwx՝Iޛ%ؖ,[-7Z0! 8 %<$Y,a \rʅ$l\nlHV,KzIgXc2J4=soΜޒI?]]]Ġ騫n( mLcc#VJCCiii:\͆Zv}сdy) ',c*qgΝaBoZ}{@!TN\(!!zIrnZG\GR(..ٳ|嗜>}TPWWǮ]8U̙3c6ٷow寧 z|ZZf߾}0sL}#=7664?!!agvx pu uJC]փ{>1;wI'FJH`G`9"T`{NV0'cPB-P4UPO(P=T> 7hBeI(J%Xv5PPۡ( :BMe-ꢪVV+EQ牥ᤥ1w\3^J֭[GwѢEo9WIsl!_^S{[slH0)ہ };(SNqqV+Q)e!*>mD$m ـf>0),, l ($2>p]4j͂d綠IMMصt ok\㕓'NAoK[F5^0k\ }oUr~K6;Iɝ.z8Fss3eee-[涅UVVrQg Vsn{h1qf=6 mxRIH%"*Hco(a8d@lLeӡe=GCK>U`#?2bbc^}/uTGNEDť0{5>޽{Z̚5۷3g0se-ES>)75׌o9IK.X )_ >b6ikߓq$0o' JgFq9W}Xۿ~3<'::223Yj5ϟӏ>1 :0HWVVr_Eb3n<8yv8t(ZFZ""9tsji8-`WG|/vҷ'mЭϜ9C]]ūf,˷}( ̜o8sm줤ۿ‚/6 IY(ZJ=z V9 EqP}.5xKdQ#v+3f5oW %&N<O}@u`Gӡ  R`y}):Ou- ޳+W9B{ L,V^g;kj׈fca|-~ @$gqa[^^NBF_wj}8H_@LJ U7/Cu`h-_ 5: C@uJMµ=u`NA! p]455FáG{w6,,.r3I[UUf'y]+\rJ>xCQ0MG~)P}l:ԟItx]@Xr^WWG̹EDa!>zѨUh^3^H55F^#6y tcwCZ^1ǎT'N 5o>aQ z=^S_7aQM:PA oJ D[OAOK"}٧[[ G|/ Q|r{z?3ӏZr&jʕDkls`0۰,^#ֆhP]]]XVrs}oCNI|0 Iߞ1[+/L}Ώ?Nd\X]'StꝉgZZBVRPBAACQP( mvUvSLXt1 Dŧp9fϞ=xO!"*yc+\Fhit;xMA{Vt![Lվ]QQ1[l!''/ XqM;><9/$P-D%`w7x1;IJW F6^1&T7 Nbq|,L'$$osnC]M V@Q8ra6ZV-߸ X,8{ÁdhfLRz;Γ9xm?7=w񺖺h.=nN4ީWoGARnkۗq$0d=SS@ `w`6QkT4;q;lv@Q..8RpM7Sdv*6;ml6]h"Q51;&Ν;CO;f6|BPT8 6x]nܝ/ I{Z^8{hI&}|gddRh=} +9o76 nf5c۱?Dž*˯ 7MJɚvȘ9x 3.]nw`0mV 5쓉w gN2ȏ[m-}{d2#'}>gϦ8 Tja1Xm6,n쮄lg4J[{'m-Xm67&:e&IXן`3'M?x fΝwWVd㝪9hޡƛ @/ /'H`H_ˀ%/ACN歠sM ```0Y77ҩ吝^[;FOG=d.rHMM-1p.f_ũ:{rw !V훲$ oLF?as%Kr#ĥf狭Ԟ:fl48vεtpl35ug8QYEu)z=8ϟtu6RwFʼ+n83/ZkNU*}s>dd=_ǀ&k׮%))sunw5s`gٿ] F6F~}R{0*;dͶ8Xx1YYY^ǫRXd㝪&3 ?>ik[}RHIY5>2/׏8W]u;vy}Qz:lXl^+VSx뮻NDǘnl2?Ҿ签-g}{8{k׮u%Ɇ |薖r嗇LSD2OxZlߔ݇&FMoK[Od91ArM7QVVFXXظFYYk׮ۚ ǛW\x2Odj'>+}{ox8{A(((ofÆ PCUt:rssٰa7|3! 7W\!%zx'ǓA~r&GoOmߓ%#H`xŚ$&&r@P7yKɛȺ:'o5ҷ'Ov`xZjM#狵A9s.xx?1Z[ ҷCyWCƑV s!F3֧Ug<32{H^ҷ/srr\[uI7Y.[l2}T*wUTo x:t:'ɹpCg~?R?oF}kkO@uCvw2JJJ&}nhhB(k2***dth]u ;Х IDATޮhm  ПmP]]ѱ$9.$cǓ?Sm`d;@? HH};H|3$yH I[{жo߼ϛke͹2{S ZyJ ۾'Kg\ߘl\Ѿ5@/ mm;2o_IC޽{ tAO|5?#a۾%8ҷg2گkz=uuuR"??Cqq1^)ݶxb8cQ/A#%HmC-9w8;vlJJJP^Js%--+wNFw [2ж?־%HHm%& Jvv+ANJJr_]]bرcjHOOlZ[[q8,[l\TakXFCVV *++1 $$$FXXf򸎀[ܹsFdd$gv}83lKGڿG:t-9tDDDPYYIFFqqqh/((ce-ݔ dO?~8V\bѣDFFıc$;;n;FVVָp1bccYb*myTT/&,,fN8ʕ+/Hq&''{}B!-9WՔrYjjj0L$&&RXXHDDĨ<=^䷴tOii)* NGVVmmmc٘9s&$&&}}}FJKK]ǻ?xMff&  bbb\$B!ͯ't: ҌJXp p\{qf3pmf% Fhu8H4ZZZhjjbR0XVnjB!mBhxx8V;<@DDZv5fL&QQQsh#""\ FJKK''N!BϹdh4r9\ h4+$7111t:(`Z-(Bww7]]]c:Imm-vAOO6 ZMdd$Lq)B!Bf5 & f3aaa$&&2{lcrrrYf(..}p8"//JEqq1UUU>|'u,..{vk'664sLV Zt5qIT?(zc2RX|?!B伣m۶a=~hձz1ƲسwɛU▐ zj TEDBT| UgݚrP!B)oy}}=wVTS8TtFڨ>UəӮwuu'vZBlǏS{o"2|}{#*C3RH* QK"sN i9) ʖB!S_󎎎K¢y\kIMK `ͺ[>U8/]czlpΘ֟` 뢱U[~х[[Zغ}D%SzO||</B!Bϓsm\ɱJk5.@Oي@V#62Dn޵۶(+IްaØY68טٻ5_#\Mw+~cݴuNHc lw^!B]EEEC+;LN9>O{ 9Xm44wbPTT*4Nz4,f4=jRXt96;ӧ5kVЖ 矓Y]L"c31_~\/Y}{k"269<.{L7TPo ʖw+)) t~SQQ! 0J^ߩeT]]s}l6Ξ=pn+9>ԆVFRR Vp(t²mz;//o]LY6b`&7o3~㖉_?Je/j;c?;P (PoB!BO竪r-)Q\_ls'FVFՠը4j5=V+]JbF#--- {lC<ZKo{W]fR̟Go{j1B!ǧܼ|R5`ШIԕJZQ0ZƑ:sF-{kXx̚UvWW']-U* LBfCWnj !#oB!D鲖~E(BwZZ}!9VQkԨU**.,pPCQlZ[-Gb2OT޻#z{EF;YsIrR683ҼR(qɴK#B!Og,V+&ՙhgm63'nf sY`Z `lMxCBBRb0 T?[|ᵲ"Pf5?\6 'f^~ńJƆf/B!J>9xDՆ(TV."MlyюFba2**3j ZjC sbRs}Zu+;NjkOѫy심&#]VSy$Gڭw|NB!DhirR\ WOzJ [F7h'9% jp8T(@Rp8Z ʄRaNNM'#sk_I{K3-M+Lu#}`y˼%T?JG{unh"-_ s~>B!SO ꯣ9gj6"66 =4jkٌjW:fԠe&CL((GqI*pͲ嫈Jc/ hn.RRRho7_b6]R~__QqBJl!B|GGG~bQ9p8F-:IJN7ڹDѠvfzXtwsG"0tpۭl2"`{lpaniwcbc㮻IIMwz V|HHeB!!§̙3]?k:K[k+Înݝ$&[ **ʙ_Q;XvA݅.)YYY\V f F f~Ξ~εvR[[hܙ]czzVKfZ2WƱ#X M Fcu >w-r 8wOj5_~9}ʅ5֕zsAp`;;8vsg8k5k\e*{5!U ~)@Ѱrr|m\~ !B 99e˖~f:ZO">1(j VN EvZ"##Uvi|_enTmYl٘!B //XmZ₢@?hvz$^zŃlpQOHH`O<G/ /B!B_*LNNo&77,]zq ƍINN|JEnn.7|$B!ӀfjVX%K8u p8DӑDVViii^ۙdRMNNEEE^EpUWa<*/B!e~Z3iUv0/B!|o˖-\wuzl-B!7!LL-[:*)) t~Nf y}T3^@7P;w\s1'O:!]w% 'OpwOPXXHGG8rvիWϗl6K/yf:֭cڵg{0n6l@WW=_~%:7r-LxB!XerRX`Np qe߾}8MBSNN?<|<䓼ꫮ^E8 ر`08qzLy7p8O~ºu~ɓ'LVVsg}z۷sWŨ( ?O;w.ӟ rTWWW\q}*jR1?'|ҵ(<?Lvv6+Vn6o̭W_P)SfҥKG\új*ndѢE^e˖溯m+VfμyXjWmt!|geƍK`۴9b*wի]o~OxBVс^w?ܖIII#"">lFDD`4 99mzFFܞ;zt%߸8L&a[1 hiij|ujuxBOOl6STTP8Ir.D!55sxyg\[~[BQcƺRhp;q'--6l6ömWv(ih{N&ӾBLΝ㡇3fP\\ o{G{{;111\qs=+qW{n  +zV͛7n:{l222x饗شi={L 1Cx fΜo~~򓟰pB^|EzzzxXt)]v9;wtWtA~?x{/O>$8~_z _F~_Fcc#ZcǎqM7|kmk.ykQC[ݼ+3{a$ =NL_\yl޼ fϞՓj5?Oyg[HJJ⡇`\QT<$/wuV3go{bk]o{;wru׹vR9s&7x#vˡ( $%%PΝ;y]K}]N>ͬY_QV_k5\'|~;bbbaɒ%TUU%^{+_d YYYmmmRΟ?ѣGy\_|{拾ݻӟa̙>m뮻Uxd2ॗ@P5 =yO.+pdl޼ [ouc~ 7p 7~旿 =֝w9%%8Yn֭Ĵf֬Yv[bb">׎'t{zzJ{7z#eddc;o}+V܌JG?۱#"" | |NCӹ \ &%%v׮],_VK[[m3f~, jm# _HbQcZ`7Ț ceB3t9]KK ]v===<<,_J_WmzիYz5V>'xo7nI^0.#>剦K~_j\r7nu4l6(F IDATaX.+>>6Sf+`zIh4}v[omi7~'B!>Okk+k֬h4p8={6* ^|z^cc#bFBB*5Kze_5S۱큪Fd|G:u ;CGGk֬ASUUd… ˋ/IJJ"--+W3ֆ(466dΞ=;vXl߾-[\g3>F˗ 8}4999n_njjb݄}mBǭIHHfB!DйoK]]?|>g233կ~Oaa!O?X8pfוCnR%$$(<- /zIO+dD?{dy'//AQz"##ٱc,[l󢣣immN8ÕW^9n-#~B!-]}gʕrz^}U~ܦM?sל$ .Hvv6eee|Kcbb룳|EuP===DGGC1I{\\ntnOv"gRSSCll,˖-Cղ}vE"3B!B ME|GK[\4b0Oe09[j\o>1Ġ9}4455l6Μ9<=!eHR1z+6l"m 2g3,_jz=t,X怒*++Q<=~FaZt;K?Yr9=ٳj|*B3mKJJ~hKbxl; p222\yLTTԨ{_(믿۲[]K***.G>v-bJ{x:֭[II[ /P4[)9}4.B e?_WVi&t$''pBxUOY8),,Ƚ+~;ĐڵkywZ@k^T;w.?02s~WNh{:=U~pWiB5V<ʌw#Q  -g2w/yG2tvvRQQAyy98<ov[uu5:<_nxsNvo~~0:o˃>8W't:N:O?ͧ~T5|`L w3LvB$ z̑uIG?L>?al߾ݕ_wu;yyyޢx衇شi'??J?Α#G((([nwСCTTThѢG?NZ'.Os!DP))DBW+?RE% DƯ7u/Jo56<+B}}=gΜׯ`0xɔ7<󴷷_[^@Q֮]Kbb"}K,?/]$9B#͔sR>ԅxtIҽb^|8|nΞ=ju{o~zkveek J|ˮo&~a7@;Ã>nG@UU|˛ˤl߾q/B1aSuL랜){<.^JQ"~3$1/z3zd$]q`…=z?i&ZEw^T*yZŔf &_N_裏k+n$E__MMM[ “O> ݻ"9,kB1~Cz\?Y2!O<{?'}:t(>vv7|W^yܵkN8Ɓd׉OSWb|rx8={سgOPP⏶"..pN.O$?nx&"4,$蓲qF_<l6~__ l7W^yÇsw~us7O*N_'B}zj3gBVSOQ[[Kff&ƍ}D]d\!gBm_Y {ٱcz+hZY`w唕znOff&<~a>ӟ{%Kd"++M6{959B1zd,Yfkyx}嗁!hT*~@KooyB$cYt!-9?rvp}vL&_~%۷owa={\P}>O!j:9CGt!%97Ltww"##immu+l6{tO pB̖O̢I?" 4`, 555twwh";;UlZ[[q8,[K؊lᱥ )Cʘ|?G*x o2]lKeGQ8_~111g?q* i]gggÇX,2v;DSXXNѣ477z^cǎv屨(4 JII[r:::(..&66vǍp?N\\+WbpQ"##INN2u|>KR12,cy|TǿL2d!! $bâJUTZR-jZZmT-RAP6IH6Yg2۝{?&d$d&~>!3>yι099i&~ӂs;|1`%7nuOG_XUUINN>Xq/Z {і/m 8tdSNZ"L&L&DFF @RRR|ﴴ4=*ơC:蹪;6faC$f3iiiTUU<==]}~o\fΜIeeeHFR_y>kժU$''}.Lj{J(ߋ'⼢x=:99Y6.r7=nrr2;w2|>+cS[\.sNDEEu:@  !K{rl3s6!N%Ľ蜐窪3mۦS'D{Яu:Xɤ=_Qv$;Sh j.@ !6~j/'[@O`G܋VĽHČ36G8p^R())2g̘1nƎnFEEQ[[Kjj*ʈ#:',, qʜv}Ç5j,p8z\G !6Qs}y@І RRR;Fqq1ٽ799 CRR3]3f ɓS9r$Mjjjmj˄ 8t;v@UU, N ҿ  4E{nbbb0W_QWW7ldee3;;&6 27d).n뮻Gyˁ0 mZ\rI?Z(]nYguyq>s9Bvv6{졺//xjkk͟?`l޼s\pA-1xD+**hhhk!,, Xn_6l#FX ^{-7tk׮jrWh"V\Iaa!yyyX٬ꪫؾ};MMML4; / wl6s5װhѢ^ВR]]͟'$33gy r+b`;Z~!:] p!iu?:|pΝ;ill0fȑ<쳼\uU>yhxVk***x<?Џy<b==/555ZO048OLL`0z9x &MT/lB:Fb PZ`ek3固`(kpo-?\(? 뻆x |[gg}?Odeep7iؠcpI:INN&**HRiC{m_d:0&NȞ={(((ɓ }gff_Âӗ%w٦-k 5E u!Xk}+X9`ٰa]tÇ{v;ᤥ>a[^^~FkL<IxW ;=z4))) tMsq>ЖǏثC~)b:TU%&&,Q@  "_bP^^βe˰Z0}tn6ΝmFJJ G>]twu ̙3ŋw#I==x>˗C˼999p z3z'Ndn_ $&·:v#GŋSYYAH3*t股֭[y9|0f\nƏ|M&O_׀u\ϝznի{|;N  rD\p*@ ysm1sLf3_~%6l ν^ow9E@yKS!Hohi 0zS4***C3g2sN.^xn/\?~3guѢE|Ǹ\.RVVƟg gɒ%zz~z\.,[Nر={+?ǎI&1l0bccu5⼥\ bL \6nx@lQQ6.ù%$3^xbcc)//`0PXX_v=\.2mll,>= &xsu_r⻥ Xj׿&==3g 8R g.)m@U6abd(dYT۞f3s-\P_XXHmm-7tI&qGqt:9t'O444tz3f0\ve+xhhhCef̘i-]]z)dY: Ĺ@ zHg)z"34:i$}ӎttJ޶1j%!!/<%%G2zh.]PZZʬY;<6%:655,Tq0 q.3M`\輓@پ>[ƎKTTV҂izjKVr?>68ƍmƈ#AQbcc;v/éyyy9ÇAQQDAAMMMa2bnb0 {(B6!7Q;~%=w\G +V`t%CAڵ~[ٷE5ġI`ՁP]]ͦMشi111,Z~8OOO':: MXX~Szٵk `6ٻw/zu`0j(b`0Htt4L4I皦~4i ۷"##ٿ?)))dddPWW믉svw^""" !B>8kv;yyyHl&--*!((O@cڴi_^oc٘;w.555ݻI&1{lrrrX~=sp 7 iaBWSO=ɓ'P"5T^{X8Fv703,555rYg?i!z$QtY;of,[h xڴ)m6+WE%Ws;P"}Pcc /|^wj ?䷿-+ViQ :AUUlK#UUQkAp8kNXod2)-G;_yx<~n7fYh4rg`lӀ[!kg~΁Xc; =k֬D?dV\Ijj*sjFUU , 66k2f)--eɒ%|`ĉ/b-Zĝwމ,~}@E0#Iǖ5| 1_9K39#jl߾.r8\`⼺I1c_⼴TO5)))!99qcƌvw)**0JJJ9r$ TUUGdd$,S]]Mbb"ժGEEa69|0FBe^^(.b ƀX]:K Yc[ʹ!=߷o/߱˖-#55U/mv裏q-)7O>$''sM7YXE+䥗^n;`0t@9`y0wKmv;OruZg1|oqQV/wO>ɲe5⼢?HKK׻ꫯx<$%%8٬G"I'NRX0a߹'LCرcbXv`#H,[eN;}?_?r/fŧ7R}fa>?}oDQw3{;<'&L~KI7<0ᅿG:6lllg?y_#BRwU[4))If;7~x#F`Ĉ~eƌ]3gqDDSLt\dd$SNr0ƍy@0\j@z)^/dooDх;8,~_Q=F׋Gu5 -f,d U7߭y)>뗗n:=e*؄8AE7~B"РWE8d%df~ʷ.d),KeMMhHH;+(>pSQi&>&Y0Mgw;y~)gz@wt@CtA?s–=b9g  HA02,ce Ƚ?(,!dluؚ(^UU;70s;ءi/RP}o!`s{ɾݽfWo$++#G)+0 $DzːcҤI~j{ýˊ+Ğ]v( Jd,eW̗`l0~~ϯta^]g'e Ij _`>n 5 2iQ]DtD4U'(=^gɓ'ihh &&O.Mkپݰ3c\[ y0 D@2DEE裏q:"]窦kժU$''Qo@سqǧ`$s{)}LeMh=G%ahRZ$UCT}èq q;Z:!C|y`P#YDgΜٷ B3煅4J[+Q76"͹,!Kr/rޒҒ2" ,!ZSZ@C4MEH^7ITt ?:4ŹfcϞ=XVEl6˴iӈ9@wa.L0EI h_;8s$olZ-rEIohbe4*h,!h^TUc܄|g~?~S|@B !Hg H%28^/׋׫@E%H%N>2]\nMi+i[,+;#\e=\, ݻ> 6`z5ә3gQQQdffry1rH`^ a.8B "ED/zz*>L Gh'ۥdY /uҼ y-_Po!4%%/z(,,p9tzMKRg<@||<W/ \p7o\ u0 %xhtn$% x9+#34Cl9e}nl_LZEV[9]U5:4@ A^'NFll,x<ߏ`0=ᔹ>UQFs`!`G=:7vzjnAjfMEhحsٳ _sP}e zVQ9[J&FbΣix Ɯ Q5 AiA~Mo}{AU4dTUCjWJY%&&w=#`00~x˱l͉FرcqӧOgΝXV9r$%%%4U F>4]%X,v;QvcΣqtvo?} %04Jn  MSb#jp}E;ؖ[Tq.2&L`„ &v=7o)S0eʔ368DFFgVVh 'B s wS46 aVqعs'Ż(d ֙ hX 5z !K*"[hC}eM9]UzUݨɲM5ѣ̹ Vv;Gu/ j~.s7,ps5Ǩ7]b+X@y{;#>w,ARf&ӯs/ռ%Rg3-\tgGhKZ{pBvILvjqǧАs6[OԔ/MVQ59C$rG5 xU\nV^UUٖǓH;Pq>wn"W5۷og[ E@0hwG ^x~(ٳO^|I~\sF#\.>7eWAٕ?a7Qx0hEhWBQ+iȪ&neQx/nBEIn7Qv(ǏpM^^^ЛYLGF$;H/-7QS}+X9O?]+rb>4vAqCrP7"o`w{Aq9Kh!&spK\yH *.qN_Ο фxd7䳴VT= .ۃ䉓m~ЩM7|&γ5>-q-[`P ~4R!);Kޱ`!ðt_祿H@b(~RW.lT9ʂbϻwLk4>{e&cfdWOnqs/{L6kBSi±q{}e~_|[Mu( fKT&6_K]14(^.(79)-=暆|zj_#DGG.PL8 C4w@ Ȳ jq~Oi1é:|45ee̽nT{⽫Ɖ;-xQ͔ԗ_r- $n{ٗa=[ۉ]_(."#0z}yūwj*J8bVxTM/>:Vh$o97!TD\0i~|S۱Y^.-{eXCDÏvdlw}KM=Ę1c1b'N`{^Ğ99Xbw0])9S%^EtqÖT̙3G:l8tHo UqU@8V k09!c' pl4TUp46Hrɞ}~HD%$t9Zrg5r}qoz=Wt?)wj/pI=TWU2[ HUm\N u .ͥ[|Hp[?yT.N!FtPFWQ)+CzqS]~z뱎M ^{Zkc:}ܛ;?o8QLĉbs'Y=/ 95ה\4*سsJrh@wJ8!CJ=dߞ!fp} m'$gg1z_F/ ~J'Q ǍVqCemO̗ f?vPGaD2*{,S0GXBSUvʊ?zCmFc3$2A. 忺pW+Sw$˱vf;w[W;k{Ff"+WhlO|$&&bN|\OzE6_'}{O+###Y|9L""炞#""6\g/ng790̻6yIN܍ԡIY9|k@ނ˙zd1$n嚚~/|iHMMl  ,@yao=;,GFbCmOJ3GjP$//<E?EQ:hCI03e." !V۽=A9zb0m4L&8ps= c]U IDATP/}q8N"###炁HgA"adgCyQZL$eet%;1\s5mF4q^\\ÇQHNNǤRRRBSSQͻCN/OjjjH"E0\ L]p >&γHLLd2!Iv$ ˅χ^=ξE48d ܧ.]0[_y |.5F & Cqp8(..&//OOؾ}{L5}K0_B ` "~GA ι(Ȳl[VN)4/ٿI ۞i(„ tB#6 "E w q;m/1Gse ۊAAhٵkfn++oL+_f3\pA_A#@R(@9UE0i+xD T\ !LBezr(X9yhn"k5ٝ]/k5= @c]l6Kjjj->%I`0`XHII!779tw;N󩨨 ۩/&L 55o+Y9/JlS3k5:.~5!@ 85=Doѣ|Wx<dKl"Æn` @pq4PTTLaa!̘12|466"D'19 0ʋwT_(444m6F##Gdܸq+PA ]w̙3 $ؾ};wuW];6n܈$":qIHl8)E]*/ ̙3_nlBMM 2.$>5 `WydkE=z&L`GtA(!^Aؾ};O?t!!+Ώ;Ǝ;&2\@BY+rT׷PWWǦM3gA%E@`q~1OtƜ=`V[Ή?cjdn\%%'+{4gs.NOlfgo#̸;vzee%;v &)gIij65민۾|'~"te͛7" A@ \;vA԰][K qUtRb£x0 X&L0.b&M^uV,Xt֭[ I25eE8+ zKEI} g}ƼyO? !@0 8߸q#DԹ>a^VDNXXaS]këHR{5"-DFF%{s x^nʼy˖-[ &C T/ Y? ItܰnRWW_ɓK]h0 رc8N2.$," {]%Bn\#L&˱VnI0$@BjƪiȸNAbL$qWfKTWUcV+6- )!Ԑ5"Ll5'qW}Xa 3wۗBUzKM`@%b_@ ѹ9m44 A'/OB_nu.fD4 I%_}oisT8ZDW%.*Ix(fAA3fs_vEDt<p6vӁh jU5*j]R%+".cv'@]ss(klo3wqe ی0qnx<7 Ue784MI+!2,!K,!IRߣrF u6fsD$'wN}ݒ餱̼ _3| `e YP% Ij} @:=DsA(0_""5rB_SkG dOJ_v[#m`aUQ*M./FIe)|o7^/( 'O$##|G ĥdP[V /^W%,< AFS5$ݗAtA_ Yv A&έV+$dوVKf4Zkӣ˲,chrqilۼ1͝Wkh?F#SGpD_Omyy9 am_fM&#FYF@TRR3AlgH&5(D K\4MfwUUEyn%'JX"9o9,QTEaxjuuu} "&҂ c0|їEtAOhz] X\4-1vQ/&/:,dۊږ*vn / KUUAR4$<K6O}zDD5b/JsJXXٷ!T7_B")#@0ydY"Hd5W1~Ed`Н7i'(/UȶF?=TIyixE&WVj.` [m;@4d z}MM&4@g_B!ANAq79(;Oف|d@IAH`yE*^9[j.5(Dmxx8)#8נ*k͛-AS5< g@}[uė Z%$!^ečHeؽv炀Pqq}èo#:6;,Nۊk{,zM4|\<(45~L>C$<.ϗ0s|/*" sAdXz)g吔P~aXF:ӯZ@ނ1ɂ81GG3,#ckx<ďHe7/뾍l W߳_~EduX i#[ɚ1]oϻ Ԗ؈d"1sӮvWɜ%5p01gqO} $jMjQRsvc[Ά6UO FYhh"bV4n'KcҾi0p9% h_B %"c.@ 'dYD|ǾڍdlzykZNq44{q>'{}7=zf7VsWo\|a ֲ_W XZKBB'z\DD㘵&FTT՗K6 [YIV?lU _ζ׫RW[۔vS_c[;99O}IIIWHI;. \inϽ-{O b8&s4oՋVԔuts8s\Hѣz"`|ڴi;ԕ%!,&{D4OzU*aPe]ضI~^GhPhںh4?\ 9QLbF. # X_C]gslgnGM{F/kiv,t>O!k 5^E sc%XtHDl,(/*X?ε[qԷ$'[M/fhW\MzyqݝtҌts9!ÿGng7H(?ac6[M\TՃ"^ȕeA4\ۃx<;e?#Gb4[f 1# lyc@2h_b`# bߞ!fp} m'$gg1Dc/zZGgεLl>`-)!-,dǚε~s5TFZ7Zbblm9yPyW\E/%baݿRnNK\z9zr_,`ԩ8k"I2eGp9](ހVp=[+^GGr:q:/ (w 6mMXK 9B6A|e9` ( r&bU)ian.yԪ˱vfv\v;;׾ף0fL]H?H_C½OyaZ>y%}\SNM=}D-*+9_Ћ;cq}>^.>eS[Zݿ/5j{ b2FLz.۶nbd˅NdT4a= FbkrRQ^N}]-^׫pp?veV$99J|NLrDbKNNЪ]D e5W˯Bod63x';Ys7Bd|.{4=|s|sED`0DF2,#ISج5;l3k&g`۩1n &>|n_[{)<#=rVk}_%>> &ԗ":\  ιn|oɌE 1GE1i7NJbkk|5Obf&c1pf);OCe%ΆF7|OOɻ[D'$jxK1;%.E{wJgf>Lv^.?sB`[sA̚5sX[bG&gLxT*56 -dE\<ڇ$I,XV;ǢjY`YYYv,:sV2F+!Ԯ7ywf>>5z=??n,͙:wNmQٱS{|㕗ڦr%7~m\ lÄZ[[9yW餤,E 'xTZ?~~Z\meDS}-Mu,ٳ,`dd$f'́8^ς D8KO~!@  C $==;\.kSj HBB?{Bj%$$6 DB_9a.#\K+,,niȅn&.OVK aD!@ Đ'禛n#G`oKf+̘1cDy{Z-K.Ç{"}???IKK`ap@BB---dggS[[uO؋$Ij ѤnnbCee%& L8@Q?1|Cs@0B\0vuh4=P2epqNz th.)a.F96C İs`@A FB FmMm#ĹA5;sȡ]!j~ϐfke$@ ="ĹCBZ t c\ ^F XDC< @/.Ygff N>g@ |E|:!2@pIl-P|pY@ ~Mi˖6l޹? Yd Cm`-[ p#R=$+X 1Չ'dmlI L0&z9'wM4֯_φ s.`^ھh#8F>cbq}}}\uNiŸ?|G/ĹDL4Dx@ \0\pQ{=#B:&\puqw fnNTt!@ C€y[[[}^7 DE0ʋ޾jDr@psp;|Ww0vTǃ`ܱe/-AR /ALO&A hXK]d1k<;;hbbbA_.n0F)O(L^ LE{YLʄagsٶ%D>6 zfc^שvYqq1EEEէ}9rѣGݧ.Z' Q. Qr8(o'R[rxJ˰40:-uHu~+?)3g X ?vqB+++󣼼\ p?ͺWB jqITR>ٔ!,!gubډc~̉?Ks3j Lf&-_ ߯'x?o8y /L^q&*7_)7\ `C0w7ߢ21Lnnj|l EG K?!;gj ;NpT$+8ֿD]iq3_Oe9FDZ|w1iЕLjuuuXV&Nɓ'imm% @Yo>RRR jo>ϟOQQPRRh$==N^^ 2~x܇^VVFii)Ibܸq8N n0aAAAQ^^jϏHL?}`΋%k+`MKl.**<җ,VyƊsc(SC#gr(?J"}b&._JZwE VKk8V>AuSWVƒ}1=;$ %);}۞&6pX)(vۙٴf {*Z:O!̈RQQQ h4RQQǏ' $f͚Ezz:Or1sLf̘nSl ϟٳTMLa)ʂQ)evŐ&.[B: P"zM %t1EǛ`jlMuAE:&E{jgDs}6YPĹZ{9zYZ@eᄇrԩS̟?_bt :u'*t$~ʔ)h4Dpы zKf9\MRIMAܢ-|tZE9gsa>eX ; 8Sy.wQ64mq"pLʗ|f, NY1[WVVv{|:pΞ=p8Fw!2K"tE Gl;vL pkGJ*mÀz[`p%ۃV%((rIJJ"''ChʙGnn.2ydHDhhrQTTdb>==U[T pIII!00$;FAdT9z(vFCpp0IGQ0"sh36t!o,blv XM&Grw),)I_/E ClbH6{J^7 j2JWhz??<-u^ϝ;.:L{{*0ԞBI络:uYq5x-U>3sLZ4" Lrrreqqqd7CrHJJvLob}0!#&5U ?814=1B??Bmq \ tWPN&.Xq߸X Jر$ϟx{bʍ7Ε{N&-_쯮r`0qاۋsણ5;yFă HAhdͧwS&W^j֖^+Xӱӧ2vzNF7ԶD]1n,͙cwnuUUXck0q.Ķ@ @pi }}}}} >"Ĺ@ @0B1yOss @ hۄK)F B ./Y@ 炑@ :sr+\(8@pUW1<ۄ!Gs@ W%W|D@  =}bC) @ p|牉ʏDs@ M=@ `pB@  2?O]л"88dYF$l6,f6  **jPm@ ʠHTTT(EEETVVp8gܸqX޻w/cƌAPP)))Hd"''DHHF@PP"ill$$$VZzܹsl6N: _{PP Ejt:t.ҷ@ @0 8eIMM v@R)^Z,OFT*.\l6S[[뵎'u<ڷVl6v@ A?𰖜rrr$ &Lh1Fc4}.I'N$77RZ- 8/++6ܗܹs$%%p@ >3|ƌ=.7nƍS~OLLT>ϝ;k݄L.ݑ'@DD֝={}֛M+^)e{:`+Vַ5ܦロk2a„~-.'-@Wl_ʲMMM҂$I }($zΜ9ßgP$$$o~ɓ'~za'ַ(.._*#pI^y/'Ž;ظq#%%%0o<xAy@ ·-ӧzj}SHF!44{%𕲲2*++imm%::zP@?'8@]]w}̛7_vGӦMRGӡCު)..f̙A*T.\ܹs  ''gM"**__rqIFܹs={6 f̞=7kq]wV4N+66۷+WTTpNЖ-[X~=wq7o瞣Gk(ϱ/}j, .:* Vh$&&Dg+VVVr&M0nI0CZYb`3fRkԨQ^l6hhh@eƫ>j53gꦪ&nV%j:UV/c2`ՊpGEs뭷rm9vNc /PWWOS4 w˗/gժUvmܹ?:|MZ?7~mjkkYr%veʔ)?;uٲel߾m۶tRz-e2^xrss SBYn%%%ddd0j(/4l6x衇Xx1~='|Bss3gϞeڵv/,z92eJBOc׮]0qD~*=W_e˖-XVBCCYf h"|Guy|Z.X|H%/j\.3gTDy]]ݠ ?O=z47]}^Zsʕlڴ#rssinnf…^:sraoka20 \.?ǒ$uzd/Abɒ%=?44[`*++f2f̘mq\ӵ~:T8Nu}W7440u.P^"88?z 6({ΩKsO ##&N8r8=?8ݻ@e$IE`h# Gg FW22֖X]BKm%'N$''zx,k/`cbb())d2)x Ra622*zZMKK &QF);f0elW\R1eΟ?O^^P&LN̔)S/6^hmmeʔ)H^'66!V^`ƍTVV2}t}QWзr":?ロxQTDEEq-EXXi_Wuw*U322HJJR&:/X^X|9۷opu:ws=j222Xh~)&nvT*3f`ڴiʶ=H獍z CeaaaErr2{adggHKK#??4z뭷*bjڴi;w%K8޷v|&OLtt~_|E^yZZZHOOf,[|Ruˣ@y}W{:tuҗĆ (--Utw=v~_r7oΝ;8 SLͦ~AUUUӗb{Pk_⼸rPi OH%2qZ 11,-TB[0o޼.E` 444`6 ϏFCUYVד 999={ɓ'+6txyCe:\No ~n:}YyePϞ UUUv&㩮&""B?Yçt::ΧK,l6suy-%,,+MQQDFFz]4F#`,oOmm",YŽ;X|9;vP/9i=Khjjuƍ+̝;~1,\@E vkKo¥`Hxx8wu{PwQTzaWף駟&$$}{dge'zL&{q} .%##RgeeQUU@xBcfⴚNu" 3z#c<3PΝ;?~Wf$1>.W<fhll$00>ZMuu5MMM]@jQ:Nxt:l0n^z%J填BEFFb4)s*z]Dzmjj/g}C=,,,ZN"*++ ',,D1|XBiZݻ{L^~ejjjؽ{7/"vl{OŊXF֭[믿;_l驿ouQ՝AW篬^zk_W{t:/~,<ϯb/Ŏ6 de˖-TUU52aJ2tՅ'8m'ٟ`*9ZZGqpnTVё0y!Do$//>l(Q Qa6$$THHuuu.CQYbPTTdra6)//W>Fq:^򾎗hDSPPDeL&Ww*++yW9<62l٢L[oHSSo-ܵ _lrQ\\LNNƍ#66_~ٌnĉJ>ynƏxٻw @vr0$''† p8:uJm޽p})4F#N/Ν;immg?#$$믿p?\s5[hxFO/**ԩS8NUdt_ʱɲ r YVt:ڻw/ݮrMKK k֬r)sшVYill=?G}qDy~meH$g]7GF4>7,glb":]מJBQa!OL ahQ M굷jjO:z)Hw>rhHKKUwzؗ>/Zbp V}'k/88@kĉs\.cV@ee%k֬ Oηm/^~X`wqྮz)^~ecۉ{UP&Ο?_;뮻x饗xxҗԥwYn~!eܰJ駟^ncԨQ<#ۄ&L`ɒ%|&::qxfΝ|_Vڿ h%I4i=~ey_BBB~5/[JذaÐVyw"I sCŹ#bk=w~_f= A)2A4VҥKl#G $))I9όq޽{ RRegg3f%cXKss3OVfu[,$II`pYj֭@!ׯ@ ӾO(mֲuV!$M(63@ XdY咱Xm\.W;,6s1~8lF*IӗImm-GƍCVR:MJJBRy9 IDAT0kIp: ˲jO @pe0a-gϞ!V(ysfxWh%bLنJRb41tHKv`dw._%~!77ѣGRgva+F#IIIb2 w_@ cH&?;~apXd1S֕eVjU(\dZVMT* Kfμh:MR߂VVO5޽{bzRgO nٳb}uM# >%JH%9̞=ٳgh؊<s+L&f3VUDLL GJ}3gΐK}}=ʹ*###III!--Oi0mUo۶F`h='̟;KNJ*.`9ҭS\YeVZ-D$ Yv1efSG>eœ$.?ɓ'r=~obbWy T*f3NӧIlu[[[mP՗E*1_7HjpӟtMm۶Q]]=(}kbd3'9y#vNKK >|&N8,5ZO(..5v-I`H֖nXv+ǿcx]Ǝu]7$Urc*Qi:Ki&&"6FqE. B@%I IHG22K颲@=~* b92(ܓDcPWQٳg}0x3~;fܹsfT*!!!$$$'ko7Z[[y7@D:MkZZZOj 6 H]!r:iiiȑ#= 쎚vItt4SNlmyyy4,XE흿ӻ/ϣ_S+p7Ym;2l<++ TF E'YGpR\Q%R'N<#$@Eed\$CZ-4 /XoNk ? ORYYS`Nĉ\jIKKrܹs~(;]ӧOɥz~DRٌ ~_ 5rr{I된b> +Or46!!!4 ?C^p6=1,ܓK<8*^i)>MzDz,YK-y%=2*]e* CFve4Ď$ۚk˹pB_Ax;"|@p%U*7Y᭲ f+ͭfl'N ZOѠ_!<<'鶏y ,sABBB$>:??>ߣ~rzꟾˍ+鳽qɟ _l޼ѣGX 6ƽ1,⼮ȋO E,XLńB5(UB[M lms . T.d$\)Deďӊ8pU(Ad &ټy3,rI tryƌ3WGVTo0>yMfj۝smFIo2"4ЀΏS6QAvv6 .d{7l@k\~N+{ocwu+wBVl/\~c"JW"jV<㪶B[TJܹ[^sw;9ڲp8]ȲQᑴ6T"I*|:&!L-[`61XIgh4n6Q ]v{b2[nᗿ%~~Uʕ+9sp8DEĔ)S8v^'>>;35k֠Ѻ}w9#NCnf'O@*/4R؊J%V:Exι Z02舍K̥ڹ]鷲"""m]h9ۏ/~tӦ^}na[6S}%*Oٳ\r,6ƾ0,\exXMMhq\.Vkҧ=ڢRIHaMs-]mۢR;]2*: :Ck\---؄ eU+O6$_DK:{/.h&OLII oy'wG ˖-}6oJC@ll,SLr?iH='O=9%YsaolErni-&eI1[8.tj&M%^[x1e\ƿ<.c^YfkG҄U7s2f>z~91aS''\NBFtt:;,++"=? gPIj}Tv=!1JQt8NN'@x%!: #3gt+d2o>}}]vUt`lڴ<>>c6mĦM>#77>c}]>u]ݻ-[oݻw<G|B>MMM^WU'++KfpwCHH^Ix4i{vRSS9|07t$3xm[ZZS_ wg^#<$IYF'}'$..NGDD)`ѢElٲp]w;(x?~<~G$IR_+D$^|EeG}dHOOWb]Z$֮]Kff&:7ɘxf3.\ eMOò+hj1SΛVIm~~:~:\'f*FXSSlX,jHl'w䢩,m.+-**Rc$1atq6S3M$ [?`6b1'W{Ū{ľ;[~(P4xYBuu5޽?rӧ/ؽ{7GV;v,/}nn.YYY^?mw466rQvŞ={8{3d2QPPi$++c4NǎcԨQy:u l6ǎ/h4r(((LY } ΁_ o!̇,xgBK.\Fl6d6nȸqصkK.ԩS^=sXZͫoޫTyᇙ9sfuW{Bcǎ $$kr=xI$S]]M~~>AAApB֯_⮻uqrX|9mnn&++K C<m˗/n?OHH?q:<>˥3׿}_LBBN={sN"""gΝٳAll,lݺ'No=~K/u \jv^oa7#WVVu-?,Nvlćo;?K^m?& Ådtl|Z݅ǘ3kۢVЗG=ڛ>;8 ;kJ[G_l1a+B$sQitxJ ]yQJ"-=ۃ,˘Z[yo=og;\n5ħ;\..مnCg"G]h4Url&66V vYY6MY,JKK4i_c pNSTs!ynCd2$$=9snBCCp8wc8|'ժl?A|h\s6.zQQ&LP(..ZwҤtbm2//}u|(qs뭷j*ٶmۀq#QŘsW8JJJwyOi9k|ٲeo#++;wpBdY>SҾydǎ#f͚$Iy8Trssu<}siz)V\dɓvzꎭ[2geHaϽjEr,݆Vvz \3m6SϦ'R^Z©ٌ5f^.x'*ө/s#2r܂˓pCs2sQ"bV7pBX$(+RҐ ne@hK1.~ ہ%нC\3څʗy#/ YFvɘM6o 5C/4 .u@pqZ-c3ll6>44` #99N-::шJ">>#NDVɘ1chiip.\8xf3Ǐh4Xj˽ˎ;X,|ۓ1 |駬Z\nٶmWCoYt> /W^y ;bso}xvZjjjXz%VRj|^p?![nU<*'I&Mҽ%dEeT 83zuq{˸_WDeDY*{ tKi&myҒ6OzՐe3(;z455:nļn[L=^(]! ;c0 ?@Tl6X,殉֝AHt(kɻ#86 Vғ477Cl6iVk4È>BBJc呪F*âEz0cƌ~s7y t'Oɓ+^Iht;w.Ν퉉Xvm=<x'ܮRJ_\W\qܮ;5bseСC_~YZ?u]x{&ynrK tAhnnFuv(䊮ŮZhQPvohufwHz>`T*7:W!AF{ P,X m:o5/b04\}P'iuO@Bb2`2t-(YǞI8:u*6oތ IvڍJ@wn(@@ΑnQ](=%&%nXʮmvsw MϾVos]%Jo >*P*P t.J^iR")O8Qz 44~~~hooǩS&s4L툎vĠRY(dG"""6p:^Q^ѝgW5@*t*;=X'(~AaX`P9.ms 98~}KYE.88 ktn}1&ZCp0DO??*S> AyN IDATAAP(hkEMڐ(hL99ΝDC!@)( (E*JT}wt:=r: )ih1܍TQSY`cb mwa_jkk>f(̜9j&MBII "Z-&NV }% Z-ML&Jp766C 籱8rt:233eh4xq ,fJ !ubVW!Jc]i?T (vtA`vn hq{\Wԟv~2Җ4׬ S'5OMM`FZ>FvرM{gŲQQQC}QMtN*5!i\*4@gg ptst(! BE."ԉtfnG]m5A@ՂJd-[O]g)ɅDGG_ ~߿~vk=]\b/ERRR Drm۶]9y<^j ?111ؿ?:[]ZA!p8p(8%TQ.UUg gֱ 4u~RҌFcgϞC/ mM ,6 eZ{jQ]Yv\zcAhw(eǞY83g֮] S0 ?uP *) ށ( ɛfA o 4`\HlC@G 6X;l0->SΎ@ADYQ7E5۬h<J8]B4hf^9/iYbŊK>UW]Af/HxZ-"""P_zf"nt+s\ kJRC)@Tvҝgv;::쨯7 tz9)}?Pqqqh4ػ`ㆧ_kݻK/D>Iž=Y|DXXq$d] 0{pNZYE A8?wwFvеSW'v`\s+TnAD5C@\?zߌFr,_+n&nv1>(Agdd` P+D4sZ\zӎ6m8S] prlǻ .'>BČ<~ yW\y=zhZa\}lL .vu> ,~"ŎME{6BT!q\j([Kj uzP s]ۭڝ]m6fuhm>'"@Cm%8_$E{>FBl58[ywk6\W?rvpxk$~4C}}=G`իv5k **e]|M ިT݃q9hftvv@3.v::mPtvvq55hms6EuYcEGG_ sf9]t/V!8, RުRr/AJKK^$>./܍q9?i>_9++ Fᯑ6FkLՂqi]"l6X 4@PvojankEkk+mR(DV;xvJnϹ̙3=nyBQ~e6ipN#Pͷ:u*n݊ӇaL8|sҳ~q:;n6C姆j5TJs+`69W\./v+ԩSo׿`.&{oހi3G=뮻+Tv +>Tی 3~BT}( &OTi Ap.T:[6;TSʁ+J~@kscmqm0a€1x.LKk rrrPPPfKG]$M@]F 8+ F5z^B@^^zW;~x̚5 ?+#v|'aּEs5a;QU]TnR{X#>sa>W;?BZj !fl2T~-t)!t-x~(wm0VT]A轛K]ֈ!>>mAZmCph8Bã J??tvXa耹!дi^wuhooǁݮ/=ue76 )m-mhokCmu*NLȳ7x#&M#/D-[u .ePYz aFGRg(whkmBz47. $$hH$''CVwߥW؀ƆOV#''qqq^nmN'""*KQY>O5 nfdffznFZG6n&|ghooSmLUhϯ+aEgOdd$͛ QSSs;#::SN2HKKIhGxx[׷}U8/]vyء":tX-~ &^ٳa2pQL&aY1eܸqxPRR/eeeUP(ŋ#'p8w*//,1cƐmJDDDקըEKK V+l6j54 ȇz INNߏfĉC[[V+4 z=ƌT_C0Ev~Ϟ=]'T*Ə,hZ-RRRx$88yyy#jБDz .W\qGee{t:$''#==ݛ#""""هsbرcEGGs[T*jz 99>h5FL8wju3N9#W rJ_7Fts"""#//WuSh*((8s"""yǕhXsNDDDD$ DDDDD2pNDDDD$ DDDDD23fxt\N4=:¼y~P{$wѱCَwriÑ>sP;s8<Gsw^ȹ+.kἯ0΀NDDDD9 pt"""""\r8$|3]%nt"""" t8Lf@'""""9'""""AK9Q8rNDDDD$ DDDDD21pƑs"""""`8'""""soGΉdᜈH&ΉdᜈH&Ήdp>p""""n9'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" ?O4=>W_}yy|,q3wJW ^>lkʕXz5vt]Dz"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""`8'""""f}^וXr6h4+z!ohdۿ{| [ȉ5DDDDD2pNDDDD$ DDDDD2pNDDDD$ DDDDD2RdH0A\kI_7hDuF ~@m"t4&LkP>*XV8~8 /@6f0Ob-nם;ׂsZpIL&Gao@hloR\M _`ZV ӦMb?L><11Q\ZZ*RrBQQVVHHH9sOc 5h8pƌ†# n٘=e hbz?a*-CPT$t?D$&go>TDs^DFFb޽صkoU8 sرPTp8nbFR=v`9a0yC/3诂&`U {?-preGX&1'|4Y{W\ajj2.ѳeeU숊 WLWυJ|3_YYu6 Dtt$fΜ9s=yfx'.A8s7w|qHEՋpd{H{%N[$yIO@Qq++a?p(Jk(3MO>v|cwp(݆s3** ySSS?[vQQQ3gfϞyʰvZTUU!""7x#233۟|I ..<HO? [1w\|rz ҿWCttt'???š-.eee0n>))I7`޽0LhooJBtt4̙#-fڵ j>&ԩSxwuf̘1_Ī#_S& rg@ >navÝ:I:e#{hnnEee ,,3gΝ᭷>#TW?Ͽv=:[R)a0چ'Za0pkwxMPSuu X\/3֗L-+\Qv ZMϠ0y5Hu.͆ſ-^cԟ.Á='lV+: Ї/"#ϡ}(޳%CrnSՊl,PTPT8iTsEq|" )J|#((oW(PGuu5֬YɄe˖ގ+WjuZkxvB򺤤$gϞNCmm- QTTRL>-9?y$N> Z@ eeePTFnn.v͆BSj5N `}M `gʤ`<}WMH)2+7멡{0"&&j:::f'E!!AEXXPXxCaaB x")) zS Ͽj֬_| [UWDdd:.b? p̓T=v 0Wx?LdeN 8G;f@5WØ:P̾.TEHAQ^Fx`j[lF}zNĺu "gży۶mCCCCsN>qwA{V8ӟ%KH~'+9jr~ݹ<11Qwrypp0BBBeggK/z +Vn߹s' %%?Ch4=rZl%_c 3y 7OYq{^}tt9,盵+ERR< Xttѣ'd>Ş=";; PRRv뫱/&}u80EEE%3%=g͹KҴ!|l=?4!)) FZgΜlƙ3gzJKKcAs]}}t\NN6oތGf9Grss6 #m^`|ߕ\hp՜[l*:(!m.3gIjm5KBz\v;`[`ݺM(/?3W_=˗_6:TWz>5hl{9׋z)8y(njO:pNLGNG6mƄY3awVIHʹjCDԆr֜Ө0Fxx8VZB۷Xd4/l6fAV4B`3={+?@$&&رcFBFԓPTTx2)Ϛ5 ˖-F`h4">>8xT&3m4VL_{y:~"#(K.i dawI3v.u3i.]_~䤡 & 8y۷yJJZ ,+v?QBCq1Xص{M)1eDh4(-u[@--زe'&ONGdd8'O`Ӧ_Zt1BBhL4>جVðAUQ|QUxm@8KS:R+h0c/l#޾7n7#9$Gk)-.D#p`zu]x`Z_+VERRZ-, mۆ DDD@c۶m{ظq#-Z$M.dBcc#t:mvI?G`2B\n h4m@ RcJ9FF]zCee%8 ĻJZ #&L}z^06IDATW`ZV;V፽5n]i2q㍋alvlذ6l\e[ܹ<ċnO2hiiM QQ0#P(p7djC= =,+:; @0{Ѿ @c܌H??l߁x)s'Gk0+RD1?Q)K!<'W![jb'Mĕݍ gݖe$\" z̛76mb۱d[nUpY<0 X,n=i4ݻ_}tRt9uT9rv=Z̥HHH.pٸ5=GϿ-::nk4XV]`]}vv6֯_/H$''KNԷ|݌>_7aĹᆅHO[wT3b֬ .8gNBBismrݎp̜9 ^; M͛SaaHKo\,5+!ش+TlnGPqqFL:Iֻ2{hb^eKlioxϸ?{4^+ hEk >"_ؽ{7>_7coF/v;<9u^n˟F!]J667, uHF|?hQUϡ=7kO-ꇠюSjjkQXXf(`N# K&?{|Cι1  g|p"""""`8'"""" s"""""`8'"""" s"""""`8'"""" s"""""PnumBtr(4t°<7 Gg?ӵC)p> ! """""o{@Vmrۆ+Dz月H&?q[4IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/pad/images/padrandom.png000066400000000000000000000534551475757676000245320ustar00rootroot00000000000000PNG  IHDRF)MiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N/9ssgsyN#\\\0BƱ_N>B!:,0(ij){ʁS[ mG}j0?*A0/PEucEu"adϜ1Ǎ엧(ېv!4e\XD/wǒ BjG:?|]N/hN]svT6ͿʹzEg7 ϻsv>ZiN)l@wa澷IiY%K|wդ1#'ƘQ)/}Z].UK5B+>ob~y]GSB.v#:Sܗ7fE )9^ۗA/$zDG}{Qjj#),csR4UM@_{[f )KAw쯮u\pZoܵʜ5dF?N T%5kϥv]~…qmN SKjZ PEu\f?-eW\D3'a0\@7Dwކ".yߘCl8#87#[2{^*hqs)n\$S|E~FQ܆r^OB(zl5alڑw_xoe^p_|BJf1BwW^Lͻ[Fm~nM*h`u/!>{ѡHx3f A-݃KkN\jϕvu\-B^ӑ3Kj%r z3Æ?gn"Woua掽VpoVYh׫kgzu#eV`ܢjиQU7 ۚEn.E ywkTrvݕݤ KS]ğ|!hV]o{+A f|CeVHVT7H~]PX!. {}Eu)';]FMyy8ݭ䪷<Ęа`|.Kfŝ1:{5B !Bh1H>6([1E3+)pF(/oDGΎ6Ǭ۬s;i(o]ѫGo=*C֤*c?*(r(aYܒja.eQ^S^i͔q#Kkً#B|(2iWqL*W9Ί@_T,2eLҗ׷l/}zk/z/}?G߭UVV٨Pi_ņ s④I0Nd-Ko,D$0Nt Cm~n~+٫ isɿuu!k+^'!/wqoK,ٰbol 'GQמhIijWﯼVWB1('} gZ;ΫZ<TiZZejb\ >neWυ}ު5B A76̙;v~շ. +#7x$W9ZoyyUAYci[eg͝GSskmqL>lxHGkn育zPpIٽ 1wBΎ^E+uI$2_z4ߎʊWzւs=ߞ.Jqz\8A-DQTTV6ZQT=ГbIohn@nYur*LhYU~ʊZ<#V=Z^ aԍR6N?ogSsXloD׭{&Q0WcoG crم rCX㢳Y6aýϷcnQcy&ΚMCY<%Wj۲Fq!;m!nֵJ%w†{sU wpgjI|>9ylhnqmgax$M3--+>/M8,BEUMJԽ}v÷?^Rk(o^n00?ow ;^KgEhW;/)6Z(]ξr,*N|/=3ŧ7^TsRSVX^=!V]/%`dg}SBh椰K=b''EQ Mss}Dž hP-{;"닷o,EK<B1om26Ŏ՞}!nQ;Nvw(O;:"P L1<WT [iYe@OA5Ž (WNQEQ[brq}X5o2I9QNˆR?vٜYQ-dKQHg8dV Eқa(EYySڮd#mr[F..NvmEIec19%uE 6Dž(w/m ط#[l BQT{ܓ~p'6voS2Z/e?g7}tWPf~3 qfM@jVM.S6?5;v者4][V|FKs_qU^lylwSĉ#^gN}uC|YmYecoRo+⊆a>o1C[:?I H6$>9cn>}Ea8MwvG؍84=vEG E1l {0̋OOvղ*Jx8јӧ ! c:yM?z1nhTذ9Ox7O3aŴ"q$g+)C7&qB"S$8.:`p;Nz>?oa.ܧ}c5q`҉S E2v2EBhWϱolCA ʻk;@Bv<    t_\._ `{Aee%drY<       //]СC+Iiiٳg-0"҆_~|[LL̪U|||zUaa-[֬Yj*PҨ[~=V 8::3fܹ...0??7ܸq5k {B#E0`MVT*KJJ333;//_~ n0zT۷ʕ+$ gUT_/j(_! >zBBuaa![x}]P||}~g>yyy;w;v.^_ptn13'srrvɨzLO?̌ZpH$?xx"B("" ,,,|xbbAov75؍7M;!3gz{M4?IKJJZ|+e?p ?>88x ={v石U5EQӟ233kkkI֢ꫯYf_Js2##?9s惧8*s?fo2ݮm۶m۶oyW-[߅xO>T*5kB=?jԨ-]JJ BgB"""ƎkOgIz@oϜ9/_.Hư7!t~I~ϟ;w.ۿX,bimmsldll9לGeN2XoɆ 8k9u[ZZ.]Ľe''888p!eee4M3FӜkOgIz`=NE=s&*rGAK2f̘b3?'###+Q ''Ooݺ5o\\g}~o?c"JNNN\_svRtss>fs1?=&鱂-\IRgg>R[iz`~N>c9ɐ_sωW=wH$ q_[[[k:C>P(흏$(L&mz2sҜd/7fڵ(-b{,{ ÇJ%%%Ɯt\z. 44 Բ>+HXVV$E,$'IFhhD",((x쯫9sD"˗ِE!8dPNNNeLء;ܹkI'AQ ^~eݴtRЮ]/..抇IYnrr2Wsggg_~ 3'&4'촍={p999E9!bŊK.;vlΜ9|>ԨQ>_{I&yyy򢢢ʿ/ԓaÆyzzH b7n )))cǎ}6g̹Ɯt>lݺ!j[[[R|?k;..n{ݴiԩS}||RiAAAEEŗ_~Ɏyyy%''x6> X|iϞ=K.$AMV={VVPUUUK,@nne)NJ+bcc!AM}c|…AةHV;vl„ 0ӧJJJJ?5?noW;8G  RRkkKJf՝%J/_npB3/j&%%dՠ& whÇŏG⌙S'M0LEyׯ%=櫸СC<󌕕~Tsf~~ݻ7lj1>zh-U<;-!=LhN~Çjj"jժvD<&1 JfTTڵkjZ9m+מwokk38!xbnnn{Ͽ[V C-XXR\jM^ҢRF1477_zuݺuCĞ9s0AVS(Tp8pZ;kY>|}|Lt(Zh40 Ð$V|;1a1A,Zt~R7yf`` ̈x@rrr2220#Դ@,(do^KѭyL}F!k+-$1 cOOǶ﷦H1ygX,>q℅y jZ8ydWKh,]7QhAVܦPiAIaBi(5ZښPge;~bL*(/3jkk5jÇ NE|jR%G Դ(xKKKZ8s֋/? &UU5IBIII$Iz\ A*TՍaahaf'L3yߒ~_tPTT՚faaa/5A"/ʕ+&? |w91B¶ڦVc$U$IG$I G[4 `W{WW5S IDATCPogK:m+ajŭr HuVu/A\i(:jZ!HW  h-&H]ͦ&3W cdW]nwjM"Sdg]P9uWPk6ZW2nKUڀXxKP3%%5v"jkkÃ-~R߯$nN'~5` Zt*3gfږnW477WUUYUUU] 3rjnPa;S '}i __~?]D M 04 L]W)ζp5J!j>פsZBb A OWwzn~s0ϟ $APhhF3n(>HmjQjL&_J&{ 3 VKmR%Y+k4JtYA3scƌ`P(ˡ4D"1(5efCvuZ]&2Vu/i؝TI" 41ǚLI/`@W2YwX&_drQCl2 n)};:8zJNt.$! L"Dr~_S]@H}}#fo5A͡fMNd&2 Vk-:&D{S)/z^66q/fQ@`q` 9(jj)&_Xlf:0 uJ:_v}jED4:=d0Vk:ubW:HYv#3Qzt D`FA$b"&\u1cnf:  jLW lmuC4Vts-'0H t$i_\wS>~ZU0b84X[ۘNUs5AGdӝab`Sڿ^h\]$1h-Ҝqtف&_ww uuGråRߵS_M/mHn9}[bEaZí4G<== 5=<<@,PoyY)EQ 0a 0Fa~㤽q:׵f9wa ct:Jl cLieL4C7@&s4iYPk:ZWޭY+¨c c8a7],թˎ"(rnKC]԰t>jL'j>v7((dxV毜|ӣCC~5c 362I-z~ b=4MRnKiQ~ bjU:P&9ST3Gv!36lz[[:!uHw5f0102jY)*+.0#^^^jEH_38;-?M:'OMX*D=ez4Zm{[+WeR3SdԨQfLL j!/?GQ[H`-+;Bi?jϣf:4P4CLPHQZZ-ޫƌ;=z4jZ#8S'OM)`D<+?\.1b`0A`#Zafh(ZKZne޹jb34xzzoWo!jPڿ1ydΞ ;SjJiL>(M34LG^h0ZRFKkFKEfn_;i&0e(bfbb"jpJ:{VPjFhiB BQ4MQ41BchZhJ(676XRW/jMWDGG{{{[>>>5BٳM~TS}4Ba4*B&jiЕ?)Z4J*UR-Sd \Q4JFPTXuٝSϋM}֬YP… -P @͇B1rȰRrd_ΧiVcx<Ch<,t-"nmRMFvJEi$EDD9J`,**5#""@P/B2o2O<7P.mWH[5E*]"iZ}uiNz+yKVVVܰjմ]d jgg%K;v9wZDOzŕŘJ52I"I++k4MFRRZm$i{۵_tյA-^ ^quu]bERR%b WWWԴ4x`XkMzHR@iTE|j689s1<0 o$.]4{Ծ}t{[dee͞=CcN^Y~ AMcT*նm֬Y3wٳg+J|QQխ_{Kŋg̘AĐ'??7ܸq5ksj3믿~y睙3g~᯽ZQQѲe?ꇯ[ԩSvvvCUM=<<ƍsyzz>x{=qĴi-ZD=B駟nܸЀruu ;v… mmmB՗_yzzN<!0LKK۷sss_|E7:[nUTTUNNA \𖖖0m5P(~no޼e@doFUU[||]cccaaaffqゃo^ӯ_xSNmܸq*vԨQ`[-'#""L!JpL=j4>쳌GX,hO8QUUe>=͛7]\\x޽RXKQٳg322۝ǍqFz;++k˖-JXXخ]JKKmll&Oyf~Fٷoߕ+W$I@@>+V̛7weC\ѣOmժU ,xY͛׭[n:sn{nݻ] I#A^)B(--ĉEΟ?$D\\\^^^nn.gsssVZ6p}zꩌR}-BBBW^^m6M'NtR}}udd5k8ۺm۶'N fϞZxoiV֢"ʕ+9>fWrtt'{}N>]VVh<==ǎvZ77Qoccc]]HH$۷obqmm-[ó!&-Lj80}twcf$=>ݻg͚ecc}?{ p܈H;;.srryleٱcGTTTBBg׿-[L*^~㏧N={vXXw}ΚZpWAVgggH$0t'wyggӧ;::666&''O6~Z.bF,gee999NNNG7ޱcǞy?x?)333 ٟٳz-bccϞ=jFbc5[?l{I似˗+N<`w\=h~i$9p[[[MMȑ#75)bۭaaa\`FFƇ~8sL.$%%%--m̘1_~%\b͛ &؄}9MYg̘qʕ&L9r{9dt;w97888pc E 6L(8qĉNJMMh4&M bƗaD"ܹcդIf5w\Sqذaױb----uuu3f sNNOW ܢOG>s _|D"i1o<͛7&""!TXXHQȍ)//=VCO͚[nݺoW+W7>Bϛ7=++)雬*0ח,Yk>|XPsS[2BgϞEm޼3!@v/7c c믿wٱc@ *V5jȑoY1[BNNNDGGߺuΝ;+eeelJsn>C{---\\͆c C^MHt9h"g9`ccnF9{lEE}Zp۷ Μ9߻wSs2JKKrB%mѢE pSO=>k~~~ ^&`БxV.{Y\]] rݜ77篙?$RG}ds5..l=:rHv~hxxuNNN|||ߡfSVP?/bf$}LaN2LFxbжm]j#:pE񷼼~{nڴiԩ>>>R/43`чw^HH7uM$y޽&B(!!ڵkiii/R||<;WnٲƦM۷FFFdBPhooK/Asa2±cǮZѣ6l2ecss͛7?䓱c>bEMy8q'|r .M4߲eKo/A| ѣ|J2kWojfo%֜[ر*jXX/"֮]yɬ,BꫯrMx4MtYlmmGQZZj`AM|Ǐ_N8ammf͚Kꫯ=͛wmii!I{ٲeVVU/bxxӧ]FӴǬYs eWS7lCAg`P=Qmw_x8 htRiEEE}}H$D BժT*@`eeeggNDq5Po;w BT*J%J@OO1caY ȣ4 c\PPR]] &&&FEE ճA @MPTS#c /\_z{{/Xx;;@<@|N"+ LX,>|prrrn* 5AMPLb˹=~8dp (**\bE;&j;eԩS.\?,c@#S(aaaC5PqoRTXXhAA>>@TTښ꒒beddH$իW 9pXVݽ{wEEE{$Θ9uzbI&ׯ_Kw{BhĈ6l085P׮AyvZB"{4rOt7E&**jڵhP5Z̙3'wvg7>o[`cIq,BPR ?=eߜ| DDD~WO0VWK2Z*SI*L)WjTj-E3<$c>y괒"t {jDug9NҶꅭM-RL)WjJU5rZ"SdmRE1V|@c``lgg?=qfSccMuە=fXÇDZd?'}E3 6RM3$YIDAT$H jMDR<:*[ OIee&bѣ쁚9oQQѕ+WL~8sko?MoQ4D$IA:ľB@j-%HcM B0 =5AMPE$br-GDֻza[mS+1Avԫ_?NpQK]A ^x%xxɻ?^l5A~"oAA;7#T(nmACHkÉmGdGRU՘f$_z @`&3& j>755du} 6Lѯ!;Rlʩ{սZKպqsXl4@!5AMPsh*A?W }_~\CN^Uj TS:3g{ 3NFUUUW;I& j>7;;dUAUfNY@U/:$%E4 C {B5AGzxxNKH3!YL$';~I"uuƌb|(& j5+HL gpۤJWh8ύA A1&إ 5AMPQ&çN`r0A~HL(H=81wB5AMPsHz@{#e.StLupFF3]HCE8<~6&A5AMPsH_S #""ٵ FKN}} ~vʋ׿cMǽa0FIDP AMPRԦ˾~l3 Pi:("t҆./׫/t~4B4Ͱ~O/(&j<Ba3]}`hu"Įt$zt D`FA$b"&\u1cn$R 5A!h4Ɓ[[]P4M,":\} L $Iם:~Ĕ_V-!D >06IRP AMPRdޑdӝab`Sڿ^h\JcZ-萖FS^8R'̘=0 B$ " bBGɳOL&_kkkcrn9)^5t$BOxZ57el;`H`I m==4yLV666P AMPR;;;nP02!/ęϿ׹ұss}:/aEkٕ ͈[Lk@MPj80HnPj@v <-o+<\#UkbSYP5dޕRc& cF#c2n\6^#;n#!0A`R_:a)f3 jp8PWޭY+¨c c8a7$ItFo\V.;Tȹ . uSþ& &ߐӇ;eei'9=:T >_:v0c /aڢtwMӴ\.&Ύ &_GGG//k 3K;f$-C)gl2uxC‘k`cadR ղSUV\`///(& j)5jq`[kkߝO ¦L&qhdmb=̋ s2wcbb4&9رcM_:(FؑZVfGgWwWs&ݟGtih-Z*;3G E5A~Sd|_Sc} 39šgeGK|1F  &Ly`d\2 C MEkiZKѭL1;7Z rP5f!4}tΞ ;SjJiL>(M34LG^h0ZRFKkFKEfn_;i&Ӑ5A!kU*Ձ;Z R+4jEMs]fiB#-EZFPBA”zVkb'H(& j<@|N,5$ WW#I{[H R(g¨cn!bOihFKj P* hBkkw:0Ns]飮V\ UP5}qrE_G]]ɭ ypiҨ $te\=WJY(jU)n\)-5k@P5-'YK.4o2O<Wʥ Z`+67c R.QZ4M]PQZh21K,jaAuŊIII&?Ϲ"j~js.(ƴVIIZYYx|voih4*j{4llk57v+VB5PsR1L*"IM-d;> Mk5JT*rB!W*iu)ȹu2i{Wɘ2eJWþ j,9rdCCP(4)Mӕe%EyV֮1E[^RrBJ@TTʕ+M.@MPGKJ2KHVݳgOyyy;8E= !O]aD{%wˊrY[YYAa5Ps P=žXK!:o6^|]\ݝ]VV|FZIUT5u1FZz5χbjkٺܹss)S,^ a-ADxxwYYEQw#[[gyf%5Ps;9$gΜ),,|Ijc_:p r~g͚ႚ /,,LII1W'$$DFFB@͇ȣ4HDtttttP(ojj2^^^111GMX@MԴ| ***E"H$R(FR kkk;;;??8 @͇Σ1 `h_ p //////_/_CI||޾}'__?~-663!OOg]G/϶^c+LD(Ҷvkk@I&ѿ…ebqAv&-;U -ДqByٸl.^d/.deFfDQfPCQsf 6)BrBR({8k[fМKo7&9n699U]E c226<׌ 57?l+W ׭vϻ-SQ\z$…ҋl6{矮#cb"BJfbǎ}[^~wd I"#טO(@{zH&vҩ)W,ɌMwo&"fԩ5k[l$X&33}_uoYl%Z~={2l_/Isi>C%DI&qL$ /egQUCf u.ÙOhd2I^^.Df۷S*\ o}G*HII "Vo0:qZZڈ(>}ǫDr,` qdvLaL1(Tg\fXbqHdx$~xx**lpۘ ]O*+M]]rJ_lgϑ#ޖZ TU=Jݾ=+u aa!NO*B%cc߻~.!۫)+ө rD.˗3 -o߮Q(bBDc btMww397:7"ס⢢lDADJea7 ޺빶޽;Ǐ_%"n['O87)). wQQQMD5kz1ZPP %$ĈūtEEքVw[[%PP`6Otyeq8̓e|"uZ*ڵ-+c6˗sSRyAmo)+qi 7''MP(c_T/>73Ϲ|(\y:ouY ?!<_@  /_@ @ _/7^|>~>Dd0< khOE}κs.}%im`hU՛]V7 7,?pk^GIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/pad/pad.html000066400000000000000000000300201475757676000222230ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/pad/random.html000066400000000000000000000036741475757676000227560ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/part/000077500000000000000000000000001475757676000210005ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/controllers.html000066400000000000000000000073021475757676000242360ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/part/images/000077500000000000000000000000001475757676000222455ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/aftertouch.png000066400000000000000000000507341475757676000251300ustar00rootroot00000000000000PNG  IHDR>sBIT|d IDATxy|TLɞB @JXDd تT|Kgq*HնaQp$U1(TT6 dc $}G%LI&ayޯ/2gν{yJ՚B!pw;B!Zͧ+ϼSs{-B!h%Fc_*zulB!D1 $>B!p$>7_Wz2O>t;&ܤo01%r35Үmx߳lՆx8~z-ԢO';9GYy|R?DӷgxTzv-9;[붳.2J'D2}hGwr}X.Nfq:#pۍM^~ڹV,Nև7zV^瑩l-#{ ftEnj6Y82O^BrP>g**_{cgpuQ-F+qEu6>w?5n nIkͷw(۶8o *J);qY ncVigek,%lYoZk[RV^/dtF?kqoΜN'_ymN>4e4C@7prb6؞Z뇭#3]mHh9>wxoVImv^j'b\-gؽ$?LeUpt Ds&2o˱S(*ۃzG0DS晝znгk'z >WT\ƛc׾ST*܆'}#;E$s _{gi{2~;ɷȶ=ٰ'гkFϮWͷ>3.K7ȝMp +7 Ŏ'RṔc `2oɴl} Ν̈A=a rK`PL7OEDh2omVa oMua9r<,|,'ي'y ><OwEДl[on{Ds}s(.)L6w (*`4͠<8Wt UeÚo6+J-#>9:|=%Qw8F`6N~F/ϻv!YL&10Y?/ьn,uŢ?g>rCS~e zic/役_Jyc]/ڮZ..*m,xc#Bye5]z0=?e_7\ 2~8p1( g_o**8w1s8n0Z?Lzy+$zgfk0fe**y8v<{Q?ł7?EZ|c0^+2MMnOgsrgq ݸuT_v9F_aޫiAρc,\%zJ'r)X}lWV|Iaq9Z?ce˺`#d4(kp,LPBqiNgq&1;[ƞF^LF/h"9\j}=)-$'|,o 74hRMuG M.$؏󹔔V6pDwwPe-ӿ/ۄ .j5ť{̬+qsu[{}K ITWPjۼvz1ٮO;Ë IhI􆦯>jKjc'7oZ$g.;T7qR6|o[7ęK~3/tRIzT*ʪjlGo0RAq cgyo0,]A&TIzf?PPTƁz{(αx >5 =PYYڬP3T_7(x{f3=no JI>q!Yv1 `&I?(ܓ#PZVRy\L^^^siw #i9β?^Uގ^o Hâǹ_ʫX^7٢..j^;]+we˺6u>ߺz*=`=vͅg.qwmzcOu+(L%*Jyd@\ WCzѳk'T*GҶdrٽϢ?~M/u][uMFˤY? #)Fb;{}ʯP:}qƍ n, Fcl'z"xɻYQf`ƫ'?oۃ:Ś:5b;Ց\͟-{feQaڄ ,*i)8x9W1DAדz6|])zsК7G7#8v:2Ng-"WW5zϾ>@\"´tb^g7s]ùW_љ0L\#$uG #quU3ƞ9Ys\z}E;ɯ[x j`0*C..jnd227v;MyE?LWCj>O%cݽXvQ&#K~kіc(ej /#)=]VSׅ.ӼtF҇A<45gZ3ʼ=5Dʮ&q0?wKRzbzqYv=IAQz]qR%YJjCU?&lo>{nn.}i4~[ӡt8oFhl{|qѸ^B4SYK˫x޻{(oecdITGa~ǚ~aS߱:BqgN<^s<9o|]R/He֧o"xѬ#W J ?/O:KVqyE:Q^j E㪾zpޗHb*+XoCjEilQTR]7uY z}(k,C77κ`-5yż|YYn!2obWuT*|4ıFu%|lKԷ}4a: fNǦR)-bY;ܢ/z{+ޞnJyaIXaaϢk)[zu ]a:$Ǭ A~J#koQ65 y6gȯieW[=ݕ>]=C{1";rSH\v|2>&9 \jaRvz}@V+o||L(WTJgϥ/?s8fX6J;m'؃96]Y,[ׅQyE_F.שkp> k]\L7ʼ U` 'ەyY[m>|ħii{ z(+4ȗ;Fp9W-_Wde!ߵ|4Vcۇ=>N_j+P;Tgǻrk򡮇^+eQw~:ւVMۻiy+*T%v;~]8|*_8$2LKee_>nDwDtN !3ݽkʬ]Pws>__ɸNjKkF Fɣ޺8Vݶ`*cG5ۻv޳hKTVUqD?^YdP{8bOޤ>7,[^OՓ(;˯bʡF&_WʹM;oյ氁 zcMxضjyYeߑzի } 1Lڬ}zkN[kՆ]WT3l@7zDFvnd*u&vd:R_T +l>Yv׫uǃ Ne~>8q̬+V!چ͇{J^=G@kלMʮ՞VW \;a,K܅hb{̦SUL{&jO:'_UJ% \greF2Հj4;e,1{8]9Qwn̜f$_j5s [j0 E`d'CCCl.#\n).ܯKز.FvcǾ+v$~Ys(w7Wk71̘4u;|ztZ܍ i|'2_s*R Kʹ|->s_dQї?ї?7i&9{1}‰kd۵vZ\ZoKZ&^Ekl'zh`X$`0BfJqsu;y9>m,1VUʗCק= !6\s x|;sWNϮys_N4`2ud4RPJQIn.D3jpn޻aqC,O:/̆ 34vuCȕ1KP1E^{_XFƅ<.Nb?8:YހZEPczO g2s)*@q#"ԟB۵}nlYM]zFa|$yk1>˿̷}z𷙷NgAJN~D7k'CN .ruQ3_󟯓9{Wݙq7~j~}ԧZ;q(%S/,ZEH/Cndܨ>fm{ob4h41 :wL [{}ز{R/,CVrE̲hJ՚x$_& !p$kz md !WJ%%P3SB!e2B!7C]U͸]!Dfvũ"9I|B4?>Vy-=&f!B>>UUULt]$BTZ !Bt .y@)t#BaOIz$BсH#B!B!$>B!p!id℄{CA͙3 !DK\Slբ 11Bt`{(!h.k1-N|!DǓ`#qCabJS9>B!p!iH#B!B!$>B!p!iH#B!B!$>B!pvsh.]?gЩS' D\\={_fǎYd}ѽlذ~? ^}Uv @Yh׭B4$>jǎҬܹs;w/x:!2,ZHIzbbbxW%$>(%%Ea05jǏ' \~Gs+h4xbe_~,^//0!l z׿5?^>}=z4V---7dݨj “O>/;wdӦM\pR AAA <zN:){7ofZזiii|G=z"|}}6,!hdɒ%|w@M,4eNHH/`ŊDGG+?#dffL LYYV^?Vy{{[-Kqq1|w,]Tyɓ9r"pss|̝;Z{={PQQauݷogfΝt:z?8~NBqFo@tt4Ej=eT*7oV 33cJ#Z$>&77]tiz777deOlΝcVZFz˦> !Z_qq1ko˶ݥKOYYwǷEtځO jN:ܿ?<:u駟ؾ};yyyzϟ?ou?x{{޽{Ժ\r:7,{a ...6_Ѻ/+jڴmO2{R^^η~˄ 111t֭m:$$>SNjF#UUU\p&O߽{wo着*L& ,`޽N_UUe<<<\ͭ t|`??z)h['%%| ӦMS޷u2dݻw'33͛7ŋKINN`} /ž={xlZ}hc#Q jcƌ7!6l'OW^h4½ 4o۞2e o&iii\rKAs|Ҍ3<;w^`޽:u={dɒfçBW^`2̎^z?`6HJJs|pPcƌgQvnV\ƍm۷v2{nj!MF| 7_Wx  :FGG@AA_}W\ʕ+dee٫rqqᩧ_D \\\(,,on!ls뭷b4y0LXWWWnmFC\\ׯW0hm2n6}]&OL׮]h4xxxеkW&L>j> &\& Q=PBk.{=._d"44;z7K8I|Bh4np!hsǏu!'7 !iH#B!B!$>B!p!iH#B!B!$>B!p!iH#B!B!$>B!p!i) 7^f!!qG'`w3/ $#Dې_ϦGz7Ůn|#yPHmG+zAJJn]уw3#DېHII!;;lkR;mw6 :=Bh[9Jܱ';H[#?}||6z__#?;t4=<7bO/LFhr#D{ Wu5⑉C\R:['(+6!x[B_wh$i#>BF|pwh$i-#'^>xxz{burj mq"#>B8G;B4–JEa9~Ғ"uPsyavi_}dGHqG@F:rrǤTWWbL&{W._dۦҭg3-ȈQ\e$~sܦicoi|I~}$|8~qw0g?VѸkkPyS\ BqVw%qG8"I|z{䳝i6Mg||(/%081Ob dVݽR+ok-7±Ս;qZw# OO[e7VTWPQ~aWTTHQImHs;vG=wS{RV!!ڎ$>V93_ #cݙ7oYh"Ο?ϊ+̛7.\hڵkIMMՕX}Qeotɒ%lݺ)SPRRb'ùr DEE){_dffRRRJBb<ȠAmwUyPeyy9cFNN111SRRF!""!IܑwZ'>eee(]\\ltӧc4ٺu+VRHKK#>>ݻ3o<<==ٲe '!!he>%%%$$$0k,w 0__v}8p>, bTTTfYr%̜9aÆ++Э[71V˝QPPOAAGE` 33d Pt:e:JҳgO%55OOOۼ:;wZĝٳ^׏K6:/ިT*{w_aÆ1sLy饗̙37R~(lW&44E)Axyym֧d5S ٳކvwwwWNv HKK|||pwwW4 UUUhZZn*KE뒸cIHi؛7j &0qD{߿Fc0,ipZT*g[ÝX^^Ps]^U퍛(FՒF8.Qĝ4berwwg>|0"##-5ԩS7ߴ\9}4+,,MC߾}ٵk999=zf\xQըjd2)*++N(j)((,s>NHhĝtޝj6nHLL DEE1k,ΝK||<'N$$$"N:c=֬0{l/_̙3 dvwƌÚ5kx{gׇ3f330qD***`ԩ-: NGyyٍt:ePy9rG`ٳX8iZΜ9\z ]yMD%qGԒ:.ٶm=ОFE\\֭ 6l@Ϟ=Ybk֬aժUjn2'MD>}OO),,ۛ} /0b"##yYz57ns<C aѢE]W_}U… mQs111 66LRRRQT,'//8h=w$؃ĝAjM.y@)HLLӉ=)Z+ !q$;ӓucU4#Rqn ;Dw=Hi?*"Aawڏ}B!D!iH#B!B!$>B!p!iH#Ba3g_d${~8T`ILLl9?F~Ύh?${>8\`4m~z$-[fE6l_^y޵9uӦM-s!>RRR(++SN5i[3[7kk"55Uy]a!!! ; q9dcOg&((ȬW^@SjuVﴇ"))MЧ~oM~xjĮ]x׉h{F`4$//'N@Qt9qawZGO|Jdd∋kTWWfǏrJƌÂ PT|͌7_~+V(jR^w҅/rӕ5!@⎰;éD.XDJKK;v,cǎ5KOOcĉ?x=j6+Wr̟gƏo]o{F||E {̙38pN@@fI HNNfٳcǎQVV_\\Ν;),,Tʲعs ܹ|),,To>ڠ^$r~ħ嵋 N7}tF#[neժUʴP"ӽ{w͛'[la$$$̧f͚ETTVg2HNN&66???uƌڵk9x Cmg ZOPPOAAGE` 33d s't:jN[ӡRίҳgO%55OOOۼ:;5Ii̞=u~XtiJ",,wy^u<<<6l3g$11^zI[]]͜9sZf„ L8nUT 4P\\l]ܹI{rmY ?uU5޸QPP@IIhZ-h4yIuIil9|0aaaDFFZk*.]j1}%>3:w̰aÚ a?/^pj5j???rss;J kiZ (,,4 @\r???9$Hi9i@ݩfƍNTTfbܹ3qDBBB(**ԩS3 /B_)NFb:z޽;Gѣc08{,...?NZ3gΠRTʋnr':.;ĝp϶mlI4j(XnazɊ+Xf VVKtt4w}wy}ѻwo>V\Iqq1Pb' 3g淎u|@@dff(RS ,#qG=HiTZϨIM8!!D>sK#x7ٶm/f׻9B4I}5FKIܱ$qG8Ǝ$]X#>#FhH)>>{9|MMy#7GݻOuwl#qpħrqqa׻a ;IܱĝCVB!ӐG!NC!B8 I|B4$B!ӐG!N\>g,U=VRawJ|,X`4ў5޷awK|FMׯ_oQIJe˔מs]w

    cN8;#ui޽{h̞| ߿ȑ#TWWӻwoy ԩYjiii[mΝ;Yz5.]s̘1Yu&\rl233)))ARjRXqq1dРAWv<찼}1`IKK#'')))Aq]I#qǞ$S%>.]1lݺUV58}4O=<Ezz<***xwwfDDD0|FWQQAyy2f8pR'--xwμyd˖-̟?%%%,['xHvaўC/sM7Ox뭷0 ىQPP@qq1pQZ-111 233INNfȐ!xxx닫+:N @:ZNSPTJ!JMMgϞxyyKjj*yEHܑcOwZ'>tYY۷oWݢ/ިT*[j>>>,]l1rqF#8z(}?n:,,E)xw_Wʇ ̙3ILL䥗^RVWW3o<)SoڳvZ"##y饗PT@͐O>h{F h4 0@,ٻw/ϟW?:N9CNVV U~he<""K..PG%qGNk2>AT*n7j9~;@`YQTу˗/7iY>,!!!L&\ƍy?IDDzC1i$T*Fɖ-[hSsJ{L&)))L6M`gEÌF#EEEth4hZ*VKFFF2z=dggSXXH`` ߁ZVO-*++[s&w$;OIΝuBII FF|P޽{d8l0Nʺux)..F石i&iF%ꪴj} nRYamgQTTDII >>>+{d*Z|\]-7YJeآuIܑӚ$LO|ݠ\bVٶ`嘾7j &0q777JJJ,+**ۻ,j몮My퍛(FՒF8.; 2wZFnp 777͍X[۴=(+;ÄiW߿߬ҥK\pn.^HAAjj5~~~b2zf'jPXXhr ~~~r'!qĝIi?cݻS]]ƍݝ({1Ν˟g^:uDvvr:t,L&yyy|zYf1w\8q"!!!q){12|4i:VNNSzN# @ j֟#GpQ1 ={V˙3gKO+/Ntlw$X#qu8\m6 GE\\֭ 6l@޽IHH`ռ[TWWwaeVÒ%K̮ٳ'+V`͚5ZRZ-}6/sРA,XիW½k6D7gΜocqbcc$%%~מZ7ԽߟB!p!iH#B!B!F}Μ9rYfwp.,Xi[%Bg!qGᐇFMIJJbر7\رc;v,[ϟ7KLL䮻y{IDATd6l` $4ў9dcO|[n:Ⱦ:-ʵZS}hv܉Faȑ|7߿kג+<{2;wd\tΝ;3c y-Zϳb y… ;33D?NAA1~oooVXƍ;v,lذD֯_͛mʕ+پ};?]z+o6?3q 7O?իɓL:l&$$pL&)))L6M >k44^'))oʔΟ?O=~~~FIIE" zuپ};'Ofʔ)ۗ]4ij%qGpÇILL,/^lw4fJJJxtpz7dlٳg)//端/@ݩfƍwAQ^oYb%D@T --혨mn6PcmDd0(\?FHfVhwmLȏI"X ?ܽpqf"""5P#"""^Cx %>"""5}|FPF-T@~~M1L}J: ͸#t@{{Mg7nɓ۷l6 .$33vL&{HόF#ܒ ħy뭷xrk׮=щEdxiӦ1|pfsf3Ѥsd"""2FR=ʕ+1={gyƥnmm-Ff֮]SO=``ݺuԸ%>o#>IIIc6Y`l63~xF,۹s'111 ĉY|9{%//񴵵fL x9z(v"00y^qq1̈́PZZJXX[l!((Sj*L&O?t;0g2_P]]Mff3&%%*OZZ{XXs=Τ;?nLz|||6mNrK|"""cG|fϞK/l&''ٌ?3gtJGG]GDDp9Ⲧ:.eЙ\|k]mooGEDDG'>aXXlǎc.Ɨ ISSSMMM >p8l6BBBrÆ cȐ!̛7eNDDSzz@,Y⶝?N|s͛yiiiq%99 rrr]bժUn(""emˣ̘1C~ SNrΊ+p6lĉX,֭[GPP/ڙ/s%(((pY+< q>?NII %%%nmKDDē 6oAVVVIIZZEEE޽͛7;)(( &&kűqFvɁeҥnرcٶmv+W`0HLLdnmKDDē >u@Օ9?/[-u"""jkƑ#ǩ9Wd̘;̼)S&83%."""gQb 22m++]f#441cF~4GbMEDDgHJJ`ذ7]/_$00t?pB#[xy֭93/>6fɒ`w$Y?[YCxzЈhkJ[U"#8p0#Fvmshܸ1__DyX~ZϏйHpCH0~G %%-+n&{I#>"""v{oوחX̘'opZNLzړ'O @#>""""88 :6[v9_%8JCG1ʈ#;w3l87Xrv;nH8uc\:Crc-- FNBrr7|{1bɓ'0df͚NVtܓ;iKDDă̝;;.ǭ .0#!}#z/^n=z$?"""䮻Yd&A|yf̘Bdd86[[E^^Nuxٲ+%+k׮]A3̝; |׿61m=! iӯشWdeM'"@kg,^|P#""af6cqp A$$~Ի7aB"=KY^x|}}INK^}tNFc|[#1W8艋œOQV^}6^?Ό~GDDϚ5nx?KĉLc V\Fzү=ix %>"""54%"">'?SX#GFSDHeeeQQl FFEHng4J|DOe%͊:~Pg}HJ/KGwzF1LGD""""=."""^Cx %>"""51 HhnGI/g?ñO8ے>oCDDDn?}#ohwħ7G׎i{,}ކ~+GASIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/controllers.png000066400000000000000000001557551475757676000253430ustar00rootroot00000000000000PNG  IHDR sBIT|d IDATxw|TUo&R$! iR, eƪVuYe-UA& Ҁ'3yI&eBB(Y}w=9s ^^^2***********$**********mƺ cI;m%RQQQQQQQQQi#$LQmWa0PCE@5UTTTTTTTTTjz  QZ ă/Rxq̙٤:ދsp4KNZc9 ? `ݯG-/3)`$ +U!5 6اfOtmZK[T~Y]#JN~ O\ RɿiUptYVtjm9u:?wCyEm>ȑSIH'lg@1Lum.yc%oOW2 y_IAƒ,McÈ USI8k-i-GK[zbC2v!ز4e:{$Ymcuhm\I øKX u6v g6w\49 =פkVr5Mʾc dx"9ON){  )Y|a_wW'zDv`ΤA^B>_s |NzCG lR*.)/H< 3o7d|Ⱦcc4Mc8r* 7W'fȴqٶ:DnA)!,w4!5ꭕ[ ə}>kStDIrf]sHFoAҥJ*y AT";([wKQϏ7aoEPRVIGboml Ȳ4ѝbg.79!/BsMsѓ7le.eQZ#RZ?у8cK$ZO Dmyֹ)u1J=!t6GN]`7mZS4Mך0uٴ:B}L][zWTܕ]+ ]e_m J<`,T>7DI_mo?_T* P(?֒Y ?r7(Ί_w,NVkV擒/>:sߺ};ȤQ}7/,#&6螡ud0[q( /f)ei hpْ6|y)D'1;yw2~xϚ:DZ ?}7aۑWlS*v _/7~~mq]=@@Mec0H+y󬎉u5 1\R^[מBhuhH}Dgq[ ΤR\j+"Mbj64 {{m46[̯OًC'8ƝX]{Fq152 9`k PLg/=#+skSBꕼf涃$[? ɸK՞;z[P*`!\h`V[7a yfu4QTRc=q`k͑S2,Sqrljs8];(m_XrhvޮE=߆mrÅWE@c\l6t RurY>&`s B;;MjH ftJ aow(zz8_ϼqrR8ny~Y'mSj6?tO2T=Gcqj\|j<n "w ̠ޝCzvIr{4rây#;-ř䐬Վ2Dśh2C"w[+QZ޼Z 9wQ}wW^Ym\{umgWJ2o3]ڳvyP0b߬oN#!3`z=U/(F_xp;^nĦJY6˦ۻ1&?=ѲJ uúU2uwBrf˶B=P}mkd?ZQ8|*+YDv /.N]hwRoXqvo$I9 k5n=+uOkѕYQYc=ljӜtO~QIr&G]^QA|nDI!Gn-5.Un<Vq߾V,=S=-OAol^xyPX\N|r&{$Я[GN_!z3^tU{,zɏN~D*uz ʬzD`4Jd<fzeF<^8,:g`{NחIS,Ax9_XNL%J*y6q}Q_}nrBI`}mV}ILQ~HP?N_V5l W3nOr0 a<_گXgM,򉳩 ؙ݇0y_5-6wMŠк90u$;p0w$IfF;K*xJ/#-|#vy)pj[•jM7u ڋ$}i4N,K "k=_O`gő22yjodqcz4X_[ %<xi` 86T]re,4w4.Nv<;t`99Vn#Չ/`fvTy1ǚ3ԛRGSyh>[{Yc̘!]%͋q,UZŊ׍1mח~0=>eb{toaq\HˡҎ wt #"K2G|9܂2K+ߓy[RWl0ZZݍ^4`ILK)СjtK?ct׽vB|rEV#CX>md~{EN$ b~@á3b ЩHDYhזqvVQ_"}o@~w2y2axw~?~IY1y9s)Zho,GFoG 7oUy1}K~icTTTTTT,ra3ν;nNnv{IHanLٽQɉǫ=UlSQQQQQi , kV_܊7$]#߃CZgHEf妢X>[gkުq**-8s]gX$!!%/60yߐrcqqUU2T FϦrc͒Jsm&ʵ"i]**********qRjT**********ըƱJ5qRjzG1fhNil֞1cF駑m-JY6ƎENS[rͰkkTTTN[رyR-H|3g裉C0|_"$ GDR'3dH. @%Z$FeNN"<z*lUM\Gucrz5y ^#1y'|ott>/kWf6 .Ś:ȤI2eJTGgԨQ̙3~/Ç:u*O Z/\qE\ , lkJ?~܇$7%NTԥgծoTUi||at: &bo/]$'b0DF%,]v 4///XlrUnL}$,,˗/__uCE*7XE"1wwsݻx㍞Ȳ@v#:l20NLXX)nTTkC3&o*RlQ0qecj0l/q NN"㉸b?e%t_:Я_>Wp/vrWThG2kV*#6֓?1>~܇ӧ -cȐ\%]mk?i .bpw7 /"N3ge|M'ݩ奧WB^~C@fՇUӇ_|*MN#!!!CPRRʕ+9t0qDMFc_͛7VϏ'2c ÇCes=0k,ˋGRPP(3n8ϯylS)--e߿,2d=\|+a#o;wd߾}<3m{9uxyyk{6mbӦMxxxaÆ&z`N8A\\;w^`lذI&?I)m=CX) @xxܒ$+}ظ1 aݺ`ΟhT~qJߍd7 cذlJKps7 Cr:v, $/1}%<SVX@BB~)%%%̙3ӧ˗2? IF5k Y-dٰat҅tyt:ٓs2i$rrrǖ-[ԩrLuZz5yyy1:ߪa/&#V\I9r$>7}t&O ئoGGG݉36m"22"VZELL"-3ƪ춶mc[͘1t;;gѸo9$6֓x++X&Ҭ IDATԩ ^Cjg9{֋FA`׮~O*S89xn 1VTTckgco0hHNv/2kV* >ȽcGNyb`ز%֠ lWkW{$G.CsgmǏ`&c8љ̛7\]l9 p 06n*;v`ǎ1dذa;vdZ-/2nnnDFFxb6mĂ 4`oo?̞=[1=xؖ.]J@@ ڷoOxx8111sQnZ-YYYoq` ++^zq]wuV}9s&=L@”rLM֮JZEE,j*mFNNN+T'GGG06 4Ν:uҒ7/ڵ#""GGG9r$ݺڪFgtqQёqUTT뷾~Tmq+S\\̅ HII!;;\z=899aoo~~~ <뇛A^z,?Lgܘ2 z%}Ǝ K?ߢ pl488HS#Cs޽;/" رclڴӧoagg믿r^Wyx RSS9}4˗/g̝;W)l 3p@z kOS(98SYYAeeuGfh0di 3}zEzqq93M93Md$&;<=prtq{/yZ}njvs7JYFnbܑ%=Ν/*! Ǟzd  ;e#]~$$xp@;^x/$$x!(¦6hHnH||xD,Bn#݁6tD0sfUV=z4۶mcժUL0Jjj*| 233ωcҥ%GGGHHHiii<׏#Gеk&/1 dNw :۷TG;;;>V^;}سgNNN :TXUj0Ws;c HLLdƍ 0~Etݐ-_kO4Eu///%5G8݆ܸfe'ryHw"8d lA4yn BCC5kڵkJciDϢpztM>MhR٪o\JJpw ظ#o*VއV[CH?{M^ [?N⣏ӵkyujNbݺuTUUQN( 0W:S8e&cWVPt':QJihNiD_dq #k);GGGfΜI޽۬7;z ʔ?Sk`ԣKZ,1[qM)+"䡇^FHHiiF#}^!/gg Oϖ Oh-DQ ' _^qU\%{_~AF?+!ۿo:  $z@臏/GVV'o%k}1;S6\Aקo)..V?Ri9=2CsisHhu;;Wb_SǑQ2߼C8zԗ{hNȑY̙JxxiK-rڵBo(yUTTTZ8 ?l@(o#= Lecm‘<))޹~]2 <7,yf$IbY[ EZ{Rw}r!߿k7*gBde͏VLN:w}(:A9c3I||||l*Weەli 0w\RչeѣoQgvzTQJV {p>>˖-FO{M hrrrXn22wVWNCe>[={YcEJ*) VN7'Iqᅏ/zZeeɲС*P(ˤ{>++"rXu]qРAW]𠸸6ayxxoZ7* M-m,ҺvBqI㧣LOL48qITDc`8=@&뱤U_~c=Mگm򭅛܊|wotٳTTTTZ8~8vX%Kп6Qٱci}탪IeQ^YS5ec@)/@RV!P72آy7۶m_~ʫ'n=^#>nri$?K=ʲ,˔UTzTQZTTTn,;GH3/y[q) )$rh1IeUc82ͤ$sheYJDY̓a#Fs ْ())ݽ\z\)> d }뛥G}r#` a,l4J7a tR|MLFJ  HLT9Ϫ|-ͮNJH.4[%#La׋oe"{Ϟ=;Nq{gص5JrI6l@;;yMBD=/!?猤2bL6s,\ϤOt;84udaU+/QNn^xIvKny㏱uV i*.kw($IuCѰrJY|9,^]Z,o >Ν;?ǰaÚ]0z+t:hDQB%+Q<`**Ն:q?=p HF,FD I3{9EmZYpң$1+m`ytYA 2, Hd.% ׺&Z_֣K]ZM׸FJJJcɒ%LOs)܈5[ZzVSرc۶m#cO| ה3*#ֽGGeJX6[á\߶mZMzkyڵ+ӓ v֭[yy뭷ZLǫ0ԃPNڙ}t  mp^w]p9rٳ@nZLr; ^->ϛ7ΒfPPPE!k퐵vAquu6dDQ23hzAJKJէcƍ_!ɠ{Mƚ(ȒF{_kz֣VWl=i89;*޾tL>gϲ|rn6r&ʦ*-OLL [n%s}Oz?|xTdU;rb=x8˿˗.YܷemSiy"=!!CSOFF8ݍፙbOlQ8  e{ѕ[^̙3yug_8::RQYNڃ/O)fGFT/c$Ze cW[Hd4$XWsLV18`j#z>r4 62 }kf^gق0޾};K,Ǵ`kNؚ_e~pL1]+AS-8()D7Լ~3Z@xH{,}b[~ 44T\mhۍ88::Z=,**;7r-=.--x+q8>{˖q>y d$]HxmMzK@G諰/6PGA~>h4v>CX$&n|YD/*%d .kӳ ʧ8F=+3q]豾 5?&_~7矷8akŶo ~GJ57aI ]8s[y/h0Wr)(.~=@Yi1Z;jiE%z$IGLύ#%%ֵ94%gڴio]1cosV8JGGaʔ)tܙ,.]zS}䐑ACwt$/}%f3qǞPNDqY2EQb&cNnnn&4[ s% IDATiS'cCNcdZGM^/0el2{,$**0"(|1^TN.(qV2 ŋꫯ6tԉӧO+ɬXvqw7;f6݋]GMFD¾'O\]]e<*?PMcP1+2yŕ OY}DmC1Z\\\79'0|&OC=D\\7nd…eeff2vX23oinqAA+V>c͈YhQ[fi||<nEvwNSЮ|•Dq;UuT㸉_~%QMZjJu F$y2T^P_0ԱSpj$Q^^V K$+3ת)nhLz?@qA7oy/xyyƂ KKKS΃>… 0`|'/5f7KKK9;;_+ Ce-Z,lݺxkT?ӹsg}]ś<}6꣹8==Y 28f3h84uײ4D$]{Rj[-%I"##׊Vb-B.\جAxx8%xGڑ5bvn%_ !Bk@ب,QBo)(GWYA)).cu obң]Y^vs=7of>sʶm(..{6ewxTeڸ3Lz!BK(!4Q)Q@q]>T?+.)E]"]Ғ{H&v2i$$! rAf9Osާ5u|kq; Ta`6\JT!@kT-Iѡڎ,Z7X$f !aqq]pIMC11aA+VBRXƍcΝf;FYYY0Xd۷:#;h\8b6U" 4>zU @XnS}탶FRznnnH ;wq9996Iͺ/ѣU.RVV,n7[Cϐ!Cضm)))c2رc3gdʕMbb"ƍCEN8Ems%$$<yN:E@@e|T*ƌ_.g%f.c &SO㏳qF&MTkL%{rE,X`wɓmOw_~%j*3f`ҥ}hq)7?3f9bZ4Zj*0 d3& Zt̘1 RFɨQlߨZzu ~>~?۽nj]#am`{[/Yjq(c EG X,,{U*/{\䪒$,Ȟh2#s%%+ۺhK)<0R&݇<]v7~ }d3ee^)d舑89"J"(a0(U>m.z*QjL8v/ӧO=2j({1@NnYlK.gn\-Eu=~;;zH%^7]->'ى UuU`׽ly}ܣի#"B^&I'Iح.HKnZ-U߃ ry#CNQVZkh ڭq 0i$x O^Ӄ/!!!:t3gΰd@v׿ۨT*qphy1Gqq16mTV$IX!NH f`zDu.̉x, L8fJE3vX>3qܖQAsTvW'1Lr@UIEy,YǪ, $JlX(QYXi&%5XZ µZ: d_(gkBa^N586lnbcc$wNaa!{ᡇj1Jƍ4L=AhxW:䌣F }9y\MLYiîfA4iR5)I\&);;_~Ν;ۍiKYQо >>MAF 2|"8,ݺ$jonݵqYXDY9n6[JEZµZ: KJJ \>;vPXX9=z4oU)n%=*(.|1އ7?x i>_ɂ?VhqUUܠZ;h24R^aMf*++u:,]M{P Gdd$v"7 ~}sqSppphd2|tsV2~cPD߿?Ǐȑ#\|I]T*ѯ_Vi0omZn̙3[ '** K);!/ `d(9`kD &\"b0Wʡ /ł"kOwݻw܈b<*7||| "BBz჋Af߇)Ob(;opppzYPTKYY.]"991 TVVjK.]֭5:5) o]neĔ)SG~1a> ?SΘF}y3NN:j$I+*).*(J~ݶΧl%%n?L&'ߍ, 4sؑ_lݺ;vxzq᷍g'1Ro>X̤]A!Dee%E"$w$,wEĪR9Yݵ֎xcݷW6-8q“E48.3p`>fܵ[fF|ٵM_...qA GJJ8͖-AlDz3:Y"βW_FE OO}⋧xoK$SNz/?'L5yuBuB$IMF `6ꝿO>b!̘1̛7|ѣGE u3zh|}}Yn]+*\:_;!t:ӦM_~-Lvuw{Rj:^~A)ĕ+.|M8,Nz ػvwF^{8:??|Eb7'Oz`6  +'4T̙)pƜFNHLL$##Ys15QFƦM͛7ӹsg[gdgg@bb"$&&ڌӧO#IaL:cX8wK,N72l&33z_~Yi XdIƭ^W()))޽cXuZgϞ}mVM(*Ґ+7ݾtdӯ#us3awfyw(jN;X̙urC*bc ѣ x8;yՓ4 N^^Ν#++ Ql\ܵ]Ϟ=mS,8nC a۶mdbǎ̜9+W|rmr|IdWIAA8}4<öc&11q!"'N`ѢE|׶q DEEd{-//SNGx jj5DFF$pݻ?/+Wzj+9{,?<ׯG]Q}p|I׿ŰayKRRzIXp!{f$''gzju/ (l vZW(^33<{FXo]d„ ܹƍ8q8q ꊻ;СCɓ'y'jxzz2k,9ϱc9"66z)//ŋ&OLdd$i{|+i&|AMc=5jnnntޝz=iii<n}{???JJ}?ޖl9`ٷo_(lj69bS IDATvEh4 ;|g,Zٳg~***Xl3gdԩv!ZׯgL<~O?YvV:<#k^'2gΜZe:JaS/fь='2o<{W/{9nz[Vc[x5 QI{%u2gN>>L6M:(4W7xuVh '}O.㏻cE?"_}'' s5 78n&M7`8::ڽb!77___@MyG z=v}}} СC9sRFRdoNg3L;v,}0`onnn 0ooo:uĺupww',,عs'>>>^KOOΐ!CL*\z! {%~, 9数2a_nn.cڵ?$'']we;644)Sȴi\p}_RXXx=X)e2e^ ~߱rJ e޼yqY yׯ_y3 QX߯>g``` jÆ wߥk׮ $::O>E!"+V`РA/>}70{lDQo5Oll,}ݻSXXȞ={x衇ZW[IX,HDvv6]z>}l߾> oaÆ;l&++[m6^z%;j֭1nݺO?ofѩS'\ʒ+4;ƍ1^ um%++ Al7V:ķ~k{Pp9֬YéSߟaÆah%..wyw `_ӣhѢf< CH9ok9y$rHJٙ0^kɉ0;HHH (([WcP&`%KyGmOϷ{?'Օ#FԊ0`6l`ȑA ::4*U6ׯg;̛7#}!)).]r_5HNիK.g,_˗/țoiy衇ظq#=zk+rc cWw?:w5yy4h 믿9߭#Gx嗙T* Ʉn岊VNѸ^Ḷ>BG %99rˋRF#ᤥIyy-k׮ ]XQVVf{LOO'##~~~tAt\|4\]]իd1xxxЭ[7t:]]8VPPپ}{ W.yVZŢE(**ww?γ>' :D!--z٭^L=*VjEk{+ QԜ'քQyyyHˣ8::RXXȩS4hPݢXAA; ''uQBc5 =v!ՙ1c3f̨w[P\\ ШNY7nińpIjj̚5VLvJplL 4GQuy9vMYYY^$77łZ{vMrjyjlNNNxsH=la;]3AAA֛ca0cNyyy5QcV.H}QNcP,V5//@F Sܹs- bsMzy3pE]8z(YYYmnIwHM[7/r7ee3'!C450TL|7f;$WФ u{I]]jh0 W^zW!eT*A1b=aaam6j_=ɩs2*W@yuYgm7Až}~t\Ff3fV\-  XCtt&ٳj4+WF``Eƴ./!Fl3CÇm;&ӧOӻwoW^mWӨPE1 Axgxt?rrrغu+v{jԨ2ոq5k(0 J>(_JVڏ(Bwכb wߝ͒%0UL$=ډɓ6jL]X,۷iS jBCyDL|a$7[@``Gtҁ2wnޕkmM>KҫWq\WKQjKzXrss1X8::BJJ >>>Dfkd"++n[ZΟ?Ojf i]8VPPPPhSwV^3<`9nLMcdv{㸺I㏻fM8f>(oo￟omˮX,AU8p"1Q:U~pREAFQcB|{Y:4Aӧ=pu5p /*(СN|M8jT3g4\$a}::ٳuϡV:t:ۙ[`戈Ҵql6IKK#))Lrrr(++h4ҵkW:L 咒.]DJJ 999a2D舯/t҅]:wnuUvVGّk9~^B88$9ָܹ 5C*^rc]bB:s1uk;mfy˗]1UUFpzLxx1T$'ֹvf};vL߾}|: '*++˗/s!A ""]gi[s+& K.m%R(B{Bټ9FhT!A͐cGGr!60fLZQcꢠ@N0[Xj5qw7٭ӚxRw2^QG,#GfR5M73339uOYx_*av"tpM9LСC>|=z0~c\n$qQva1;S.;<NAXpʸDw~WIII$%%uVFE\\\Ȧ[wvC߹.}6GԚC׷Kդ.Y+P5}H*{`rAT;Hjg_wYo7c(^eK ˖ 7<3đƎEV/]kBYY3& gP\qc(,pw<5,Nn+_*'~!< cC N'g._ b qZS<æMԎ%[؇ױ}6S{F9<$뮝l[HĆ E#F8vԫ;} k^oRSRS^^~tWAʬױ\PW_|F$?J]~w d :M| ^LBQ=$=!]Xױ]|,\ځˏIQ?St:&ooFޅGgaYf۶lFZ6oތk1ycQ$?6JW:}tSkhluUveMܜ:65u(++ٳ$''EQQmsAI@@]t!**t;:` ##\Lr GGGח ZmaZ86|W˻RZBȑY蜜쎳"ez&YfwtP耫 I(qÊ̕"g }98UVpO~C$RfBQ8}Sg{wfJF ZAYYZ% n<>oG(I=-Z]wE}GH*VG5euZk(//o5'kq68`?o)Yn5ٽ{7ϟGE w1;mĒLyy9ǣVѣw}7G:e #77˹:O_}PU}f})YyyR 22޴ʷ?Lff&NUlzxJK)+IHN3NZGDIBհG`P0߮}l {,{^= 'qM&;w}v2A%$_Cջ3Q9w Qs=-J(rwu*4a-Adz|7]:ֹA=_9twnށt0s9u u3Ū5<@Щ<|qN;wVx[RdJVlp2:Wl$K$ Dr#nN3"OWw?>yCk<ԩS%ߑ#G5 ߷o IDAT=jᙳlc2WP[RUMϺ+jnX$AB%̢HވF(J4b4kƱMwæcr%4^vKm 9ɩJ&nv$EtWCʲU4ptpldɒ%zV[C{C&DmFGȘ20O'"#HEQKUT*Qz%pqlقWqw;:Gjjj X"|Etr ʓࣥ6h2W̅l^ҕl.]lrR)҈b&[w^}b:),,2EGSyW`r|7n*=_`3g f>6gc9πp)//o973ba{(.7Z"k58 ;Qy"J`4$a#:uEH ݰ|IIIHDQ߻5]GS]/F6kxtf@UB-J0$, fqHDRR f]_+J;+74Wwu}hRްfTSgv?ZԇjW-ko cӦMv7oLΝ[|"?e:Rf-1N]KsUsr(,)<~+[WQF$a<0L$&&-g[>wv(;% ׌fh(`ȆGT~f#IVqvk3e  $< &2ZqM#,/\UUXJ}=1]H0[D, xz.mc]ߍ`.}FdkUN: 鮡56<%*Nմ;Yr* Fc#<ر6gΛ7O>?O,\ piygh"fϞ[@Rפz!CEJUDĎ;0aׯgL<~O?`޼y^E1a͛Gjj*۶mc̙L2K"U=x[izw9wƳ`jINϣDۨᅢ{wxe%U**T #YL&DQOlw޳gt;:Gnn.GD4?$z{9l߉ub=v"+\m#rnP^^^bqFF8!I&J(BV1Qmǵe-TC5_?1[X$K*18j̚=sENqy.U :zv@K*g Vq@E`W2(X,"e@U"xf|V' "`2jptYrʪ55)J/"bX5d )2IuAPl׮k]ߍ`]P72.6KwVM֐%uwOSsܞdm Ս껎qFMfcw߿?</˖-^Uxxx0`ٷZY &y^Ç۽?av܉hdƍL8wuAAA@hh(SLV4iݺuCrquu%882nq9NER8wgU kV^1 Xo^@-`9TDi LXFۇ;wMb;e 󎏪wfR&CB -QT\ +?u]ZYEYt(EtH !ɔcf^2I2! OW;W=sF!55vYh߮c\S;[kg rb; mSSSy=e(0-P3zD3o07zA@afa|9Dט L1`1>([TPa`^ dfPmO0^=}`VҸS0r t`shq j`zy|uAl;yun;8Pt6y kvUX_h=KV:з&W(!B@QF1k,meĉYv-]v4KffMr41j&880֮]͛76l?~׋jʻ\nJ%JҢJ%*✚껩A= OI?%X(7B#К>JWSSLSrP2#F!\YgDs%-t\䔨))))tȇٔlip`|fe}1^Z$s==u,D`0JFXJnc1l5W77AVǔiZVx4z]>XŅ(e.pr@Y聓( Wԫh08Дfh =Ȗ9((]e=.Jm\fl1ΠWۉT':]eo̺LzjN[T69]klj`c6(A?f$%%YeiHNN? @ߞK{ԉ1'Nd͚5=GGG},\ӧf֮]̙3ʨ 5wS%!!u@4~tʽI+BFe*S r(,fzNO6m \^ n Asѻ)Q?233Q{tà!hicLlK;0pQvo@A^> nm>8+V24v_! \B X fEN`S\k|bxkE2 z'ހ  l)Bo2\dL\$BVf\~(4t)Fn2#8onbˣTZYE4z]NaԍFm08Eװ@@4xQ#a<rV^MFF˖-#>>~p^]>|8:t`˖-dgg3tP{b7j['0d>#¬T* aaad2 رc.9we +{G!zj9 G:X s" ^Ng|;t l)۪34#??7ocg('K[Y&!2S9y9d2ٗn[Z\;h2[7[8vrrBRPsACaAht+8ʼs'>mxIh"\.nFS!d̞U:N^IIhKCuOTǡ87Z_rsrЛCm֮̋,2<<=wD1tL+B*dxcyV *fΡ(/Zz[T7h^mW]Uj=zOwdu={t\-*ݾyf6ol^e˖/,]RIϞ=1c.|xN4e˖quXdUub DDDT/00{퍻;K*X߶1)7-,z= EZ3Z>2'Hz7_9;ibPE`KZ񣜋9`Ǐ`3XBF܎Ʊ'* t>hH7tA4+S~|Lo-|{[r Y5ו9ٔbhrD늯/8夢sFjs@g0WL22XTҫ0LrSX PZ=ǙiWWĶMCKoPڮbOmlndf]zQյ" ##ut|~X+̜9*< 88*fm˞4dTol۶ML>+M.],?ywSF`p4v3lNGSNh4v9;9Zi0̀\.NzNkaƘ\n.r6wʪLQQAkyˆ w}A&S7lg'' ݌c???qNm7JBp9xp& &xfYL' oo/,Z?- V"s!o.Xɰ4:A0Q&'R͸)=kѢ &S҅68{f'UϸЬlfQSH`B94*iB@µ˕WWĶJMWSWe}:1/0f0vOUIݸuGZѰR4]SXNC70[f~1Ka*TCkLào'3E"gcQժ屵Sd&o+h}\bUnv3x"bȍCqZ 2C0Z^V*+7I,^oqd E8=NAPThuZA ';,`w#XWBCC9~8'4ڷě7jA@.36 Ɇpa,zZfɍ7̸Cؘ]0Fau N[Ŷ+ An;Y)Znkjdf]ݯFcOtGZɨF3щTꂾ⠎ՇY.֢%N+ GpAd|Zz=jQ[EΦL&ky V&SXXXv~ѿԺ%%V|[ DKƏMN1r1K8q78|]6ˋw[BHHn%(,,'P  .!D1uO&AOA;zD A4ʻ ͺUo6y9 1qZ&]nN 7wkd/'uX|9-]CsoriJZw&=-ΔGtFteq \%.#McZVN'/2W|cn.z79ʾ 777JU<.4x;Y8n۶-8g&zdrz$Se وFl3"E4ȭCڐtW~`4Qj?M^OcHK5qss#$$yzzҾ}{>a8ib޸^`I huzrssШz 99۷wZ[* o5 bUmW]*X]%$+ݺ*NJO wfẹ\f4KgS*1N.ҖrU Z^i.z79f`^gLD̈́ng-YV24v3 ݻwAcM}S'd\o2  IZ ^{DO{zQkJqϞ&?/'L@Q ו}Ƅcѕ߷&^_kL^_ހ`)3+Qo0()-Ց_PHNV 8z:[~Wm7qfC=ڮZ]GUBҾ}{3qIAK{/šPF*{ey#r S\Ȝ`|. ܺyJMsѻT(o7 EyQ(Q(=IN`휗%f2)/Cc`73e2'ǡ8v9ͿDII1:^ޔyA4 IdDZe W7h(*$45:ǣq%!8{wd2~zx i+;rDGWB[A3.*Ot/No@Ѣ֔ҔOZj2:S .:ח={[7kۍٵ:=ZZmmW{]PܦSK/Un+r|b5v܎N`!t#tPad#sp5=yh4z1'ZP(oݪ\ll*0%sSyB:q6Tsr5cr9AAA fu`:uD||}p n޼Im˸Ы|l!V,c3`.)A掋+:cR2æz:=ydffQDrٳm9۶m[uAl?vO}b+ vW'ٻjQ|;J׆5g:i1|dL7%}u1J+Lʜ}TɲRu)* 9y$PUg{n,EΦ@s4̈́~׺z˟3rdS6V[J VܹmR\G UxxxVIysUp mуףQhUŐ'0&juhJ^ ٹy$''N3=ɣD?L0_ơ8aÆՀdt~$3p\ -Z PJ(*,DF.E֠Ri/,&7/LRS5l3u5voU%)J~i+o*mW7b;UB'+y{{>MFܑ|mk^ deB99<D]JQb)i&j۱̴v֭^˗ԩS?ԩSINNnz79o7ɼ6Dgddкu*+ݺHgި%$]HP:$ IDATzsYmժBgjztĿ79gqqqnx>cqMץcܸvLڄ!+LõQPP@I"KTKVV6)W1R(EQtU\ọ>j򸺺t ef"-W)--%i i8OTFU\LQa!ySTTڴY"NG0L&cƌU/hHC]\+UB1q ЦMN1GSة[Ȉ=EXpdr %%hJPӡ.R֐_HZZII(C7hؿs3I7[\OTORgk7'֭[k)..&//B???^LIQax|<ɉ B:NX , 2'''_X-FS"Lvv6_5ŨۣL=4|$!i Si )VV1 \x3'ʉg/~~~vѧ2:C>fg tϿ)SA?WNV׮q\4jL8q"Æ >f܎u݄w̥zq֭[GZ, Jw_@ O~`ZV&#:j Ci޿\L&Ga3۶mcĉU_t)k֬qbhsѻySWLLLرcv\@J1']{˧V\\ϭqhT# kJS[9y}u`*{u˧Zc /Wt Us=G6mKUDEEm۶c<<i_..8:9QQERu -C&1qDjO*nh;3w{`Ν ԅABYĞ9AbJ?~<{oeq G"D#66}~-hզ=n>$sIQ>)7)ȵ^GvDc$V\Iqu"޾~b3 PQSXOFjrya+O?M֭!M;w 6VJ~X{;̝k]͝3gV;nq w^S~WZ Aу6҂!ݻ7{W@FFh4j5Jggg  44:*Tvf$]nSHvh׮\tׯFnn8T*!007ժ\䔨 :FCjj*P\\,]8::憗48vPP> 'O&11k׮JVVbggg<=='880BBBP(%zpwwW^իEwKQ[͍>}ЧO\n.rJgggCt'A YBaڮ9j6kK/5ܺwzHHHؗٳg3m4 wnKHH4,= ,5k4,cv/Ʈ{Ґ+!q1w\xƎۨeH~DR`,K^OE.\G}Tiw^RQ:u .dԩ̚5O>rgܹڵVL6nݺw 999DFF_2fϞ$Bv͛b؄=]B*IOOo8ؖv :=BsN0CQTd vrr2Νc„ 40guu"o&,_͛7{5jÛ,DFFɘ1c9s&VlܸYfYi&"##i4Əω'"W]:% Aer4VvɬY-תe˖w}ǬYXx/++7x &3Tj\eelݺǥ0f؛={6xx;w..VT|̜9|zֆbll,>|h233kUFmqq(,,U9O&--ͮD*sq=mgggZn?ΰa-ƍټy3Vmڴ>H h4L2w}X(_7fˇ~hL.\ŋt:ڵkԩSo@ҥK]ϣViٲ%C aڴixyy(=l…oX?>ڵc޼yNgUVSFM@@@䳕_2vXΝ+³>+z{ZʦNpuueڴiXWqM,>3.\<| 6l_Xi?G.]BsʹsXv3g>,999Y[Wu"ٰa?3 x{{#xAʕ+VlĈ!!!Lbbb0`x{G@@?3*w}ZUy-Q;w;_|oM=X|9̛7}2x`Z{mŖzų>kk5U]mH{<ͶHIIĉyx9}4zAYS}Kff&iiid2^u86`5ʢW^=HVV8::߿?6_e˖QRR"^r;t@AAZB׮]qss#118X'+R}ЦM̫e>c9–-[,9ro+V`|>x&%%1*111[<͍/".jܹsϱj* #k֭.?ǼVm*jV1j(|IJUY~ATV1xU=>>>DDDK|N4 ({:+"1j( ֡qYYYV,Wmi=.]ik8o!::*CUvv6...a2(ŭد_?Xh]vX )((=zW_}߿TVȳNYn#GuIOO;uğ_^SmsGeӧ3}*ϩX^MfӦMlڴ L&zfϞmqL>}غuELF=8z8̂ xqwwg>|ru6 %G]RCjKWşIϞ=-:fkǦξ}j.=_pp0׮]w.Gh,dE/'{^]!!!\|<<<ѣGi7800.^ {ʋ~aΜ9SYa6跕&5%buҔuСC+m2ߟb9DLu^x 䨩ӥKmf'.^dXnM^]._!CX쯮civlL:BkcmOje^WDTV9ij5l-ˋ~U+\.S_d?.npi?%nEEE̟?;2&'qalڴe 0&-l(̞KK/Uy܀$NT;sɔ)0{lM +*qBsYt)k֬rό7V^߆nG kiݺu9ZflyT7ww |GhѢ^)v$/_&)) 0Nj\r]Vػ c{Ә1cF ;hMx{{7!#ŋ),,Օ*!~U+CSnS~TޗhHx*Ԣ[$ϱDa^~u/W}mٻw8x' 㦉V~$$$?ṞD޹3q~)XBQ\1RXL&$vICQ]]ur c\IDAT>}9h0*өkl.)%$$9hb,mH!MiB 80!&$XBBBBBBBBB„dKHHHHHHHHHc uJp吐ܼ\bN-](tE)3gj!ZǛ';wmO +oVGx' [ ['56aAR+xǩTBCC m(y$$$$%w+nVdKHHH4j9 %..!dPNǜnl1jEAEZqqqԪEBBBFr[ZSXZ"HHHHHHTB IMMml$LhjD 3 `qrqilњObb s7Gpw)S0eʘ玤ƱERlY$.s3ec̪rDR5Wa6lx?2GGbϳ  ?Xz;%!ѐ\pCs ppPТ={v"58V*;̴$}m G|ԭz$]\tߙ1'J'6l[Svԕ;Κ2RaKMVyH<K^j*U^?~<,ĝNc_8z4BNhht^'99[k!-z-]Aco; _ z kc;o d'rWGe׸׵7S;Κ2>>$ Zo(bwAq׍ð'+(u,ĝŏ?nh:th_-ZYOIIgݺ-4wuZN#u;f~]`0ݧ 8=^kD$$$$n{p߽aOd2_S6wGפ xsh8߿K;7n&U:>>n >L^xkxCGү^75ZS6k7)88953u{,?};>), |İJ=: lrNoJ+JK]Dozw?_coŞЊI|gg:ĨjK Ia$$y3sT2ܒW_}VWmYz={u, kˤI:f#eRZZ;4)v,;ѱ͛t:Zg~3 [lY2+A.3bC͍;~mtZZ0dd"'=ju;ד|R5>Е ӟmXZmټ6F`oKrpΜ8D skL< 3\s 7ơjkIמsxޭ8+ptt}L4(|KxUuqZNN0 ʗҮ#j۟Xkj]76GYLB2nĜ!?=~SDHrj&n9Ke=Gԩ#;?7?_ VǑ>bΡmCȑ8:;s\,KLY9gβoiխ+G&q%>6yԅ8W_g;oizc?ۋPzx}<|q|l,,_Aۈt?s۱\^hDE`afd2NNՖlُDGܒȡpY>ΝE>e]n6J399y]՛ƍ;ٲe/-4(''GO[~=sRZhzHqU` 5߰m jʀqrr֯{~F` RJnv:qNrRbk܋Ne+3xI~^9EЫpn%sqb ^5T ~Rvn\}DAVz $b(8Ͽ iϨ P\ω{ׂyC"gU 1l߿ҳCFMn /G_ރ~C# Ӻf j6DU@ȑS6sqة#:{׸zym(r4EEq -[{wDΝmNmL+GduVݵ.qGhћ}a΋K닃)Į܈Oi!G?OVYz.9ʴ% NWkN$܅\rn:֫'K׮?Y cgѢ/_޽h`>|__//~, lٲ1c裓{^׬̞=Q >{T/q\ ?vn ,ž+cضDNzϼjqmЭ@݂_ ~' h勮MچQR\ȶWډo^n|+8 >{vXK5s vn\EHh'^[W7qFB7~8NFҳ?x[}r\fQL&C,wB1ìbǞ=Q;'w"iI7qU%\|̴$۴g̔-=/(DN~|}CFMb߶>ba(e܀.e1fu)888`NGp0xSi_x1#0//'@p 5?v#D iQFDǽ"3MQqd3Uxwז ׹s{?Jbbh߃wzӥK: ݸ~zv^^A+q fgppFmAC+pu؞pz?7sĿd?l ֥֕gO} ]EZ}q5G':u]qI qrVҮcW}r+ንڶׯ%Ņ5=nl5QJN[3 ݹ8m4cwq.,ˋY1n>|}j}-Mq egcafMn :!| ?ji&?=ѧ9k#ydN޺ܥ3M>VK'\;L=Y jԔj(y k[1.7+f[}b9u+>0bTZe(ը鴸y09w0W.C#R8kPT?x-K@\ ( bte xA15*T'ڠę֎MЎdRmmZ/hR`*FD#X4( KA7daO{۞a={8\G <@檋fmQo7P$A:WWM5unU_I7w??dr"\=l)Figt~|r 1Zms ]{_u߇27j+4q:BNs ms3<}v8wc4n}dkwM6FFh8_ ;[ڣ퀨Ɉ]B~P$Aꂦp<Q\-_'OQ^~6cw^lx|uD՗ ax5xTA] /^AscT˅N@jj2 N"7w'&۷WA. 5,|8qx/f ; $< Y8~p~)SgS͸q_Puj>|o/E[65gnzel!Db1g'7gt\*+;U8:IPShy871"f`?r.䩉>/$Nu֖fTӧXmϵl sR}36󌨷K &%~aRpM]KEFc;;;n݌?䣶ڵ-[ KCQunVV~Z)Mm-U^.wj>bGG)[c&]:w8 et mxt^ffo˒u gށ&^\bYYK ׯBCmD"ޘ7/ IIq7dg/GqeeU(..?V栶uu_Rˑ=T1a8:h4mpss\ )vfR纴g;&8Lè<[+rcP{ ̵2"+r9\r+";S&hϜz`ݖ(?yw.۴̷7&> ?;$8(LM#7 -M{l~bqf77B11şD$::tA|&Oe/!65Ħf-pJ>s17cBgLGz44SG/Rx1ط}^쑒Du$'OGrspňel StH/[? `~J"%%%X9pw$  = b$66Gn8zT?xhn{/dcD ,IwAN# E}v#:b/b8ΔdH vp=ţF|[:?A-]m\p+XVwq=2Zn%rr~2={!9~VoO7 ۷-,V;"[$ybÆ,xf8k5Zh$Kext)ADDDD#Pő|昈"|n᳜IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/edit.png000066400000000000000000001426071475757676000237120ustar00rootroot00000000000000PNG  IHDR285hiCCPICC profile(}=HPOSkUvqP" EjVL^MGbYWWAqvpRtK -bxsx>@hfuMD\dW+zэeIRuO}TwQg9>8 JAeaIHKw!H@پb7 (iY9 2Rf&:k ףPd2"Jo#+45}~zjSj|7r{ԇ*jll&vo`kSws>X,&['?{̝8xܡ#n +k_.odNh+PDf&,{wS&H,6x zҽ';cފ!_䩧TR^cڱӣ=Iq0^mfɛfinRDlx'zmUs3sWu&HZ⣪$bɖnfsgmpktl4nV"+.# x.[-gwK/bw쥝Qk~1z-%y |5z@ג4Th*L٫K5h=DEDrx7^=X_=Y>).RQfᎌuRT"’8e(PTZdj 3Ps1P֑esm}b2ߗ5c:F 1K~RXR,6[p>}Ig>};)%!f*o=|17D"Me2&j]YSdD|׵_ouRVn XMoPDNokAnJWHz[S VWoK\9B!F- m ]fs{'InACcۂr("q =1XIq ^Pw |ulY KgD)?|FD TTsi:Q"8c}htjYem|3"]^V2p<p>qhDC@L&dϦ(d2E$bRYAd?%@S5w$khPReA/ m{uq8z}d$m|ǝ`<|m8u!m+V >bHja;&.>lwOUxjs7) *RZQ˭򏗈%L&%yJ│?{-cDGӉ[<_`L&$O',2X;"ǽko I$r'}jyIz#^OleGY!KeaaF njt6kKSgwm%)N4g;^'(ne;=~~d)I-5LKM^"tUEW&:^HK[7{I$?` 5v+VG@\,;NwrĤboK}f]dUM}r͍2s *9 m5ZSSg6:ʆʖ2461*.EI۸auMy|ݞK`o?s}O$ݔՔedkj*{WM]>u2;"S!}N^Vy9]y!/T+JȢsiGB:ݪ1'Ũr.r0"ѯ7|]V *'/'YY]mz3c-7e))On70mfm}#(]***BjbY,~A#&l0}թ/  7bX޶7<x8JJI6?a >%?ձD͎SJy][q՜54,^"M"*`#jr""d kNJ܁_%m59"p&YQUW]P\FVE _Իo}CcޓyWrnQq~x/ݴ,Q 0zD&W q^ZĂfhmpk| yg9٬v+VGBaʝx L\q;Xz-1ju ͒TnJ#Lq5|"*"\oA6V)|_ ѭX6VXkM`N+L7c9WWTדɤ nVY2 Yi)֗U3,!w>QI#fP]#gU( =/y]\Q]_SH&Td,{i;]wW]1joJkbMU9knIJfhmw ĨM9[3]K}&n A]dD S~5B;zhox1<B> 57ZBaXB!Z K%B=,-ea H4 k!P! 'N"&${b b&/=I@!u`XB!ԅ|ݻwc fuk=,@xx8VBom%HKK:B! ޽;זBu!BaXB!0,!°BaXB!a !°BB!a !%BB! K!"noo;vL[[!B|իW3L GG#FsB}dnnNbGcǎ+WHHHDFFJHH@zz` XdIFF =>k,;;;&߿`0<<<܈Y6l5k 8B} ިQDJrr2pUTTYNs8wޭ[ŋĬW\2##b~zΝcB\v 8NJJ y?^[[ %%%@Ӊ𖙙peP(xBR B@SSؘ74g&''555 H]O$JqB! K6lٳgH$RˮTWW744D,B!B/-Wp ["VB?s~N"JKKKJJH$СC2XC_z577z s1beddZ\\\\\\h!effA555 ׯ_p`H&O<Ν}"???yy&!Aĝ={P(֭300 f >?ÃB[jۚ[^^f066޷o_,,,,,,Z5p@E!󆥶DEE72xxxHIIa"naHZZaԩX!gXkkm۰BuZXJKKjB… )cBZ[" ^~3~llll6; kg`%tNXB|UBBU!X!0,!B ԩS¸RRRƍ[x)B}{AŅ?k~/@FFFNNθqJXSWWQUUyflL!Y FIIIjj 6l Qv>dȐ}GbbbUx555ϟ'B3g !P'233uppپ}zzCYb >X__G K222FF"ȑ#jjjbbb222'N.QFs>,B.]"KyyyWpqq"ҷns:thpp0yfӦM&L9rɓKp4o<Y uuuC:thjN'&&VVV~͔qqqҴ4QQ777>HTTTYY411QYYyƌfa[ib^]U&;vr劏ܹs__Ggɒ%T*uӦMmexyTTTVVVMMdϞ=]\\q9y/u&$;;䘚z_WW7 @BBҥKK,ٽ{ٳiӦM6v(..&>}˗;wL|hllLKK?~Y?xVSS۷ !!b GN>_=v111 .|ϊ+f̘!%%qƻw~h4_wTUU:$''}vGGGkkuu֍xX())MMMz'O|eddH$r-?~˗gΜٳgOYYd2KT(Lfٳg4hP^hmm-xOFVL]'bؤݿֶ+`P(gϞ۷>00%//Jpuuuuu ?;ģH$|葧81D"^teLfLLLBBBIII}}=;==_߿oeeݻ1cƤ]r%==lȑ7nL\yRRRڲeK``Ç>|H رcYxI"SE,]t„ a)((ݻw`=JKKoذ!888::> T*))EDDy޼ywϟ+**zyyyyyqOOO?~˗/EEEMMMgΜP+W}!!!K.֭[bb]씕/^@,((xѯ*L%{0666E[o_&7RTCCCD&=<>8;;anܸq-wwvv̝;x㎍MVV͛7D{AFEY-\ܼpcjjڣGٳg~;2`0z ׮]nׯ'~桥ղ7FWWW ɜ?19277ĉ..."""nnns̑K.IHH899 S aaaݻw37sLa꿭efdd@߾}333gϞ-.ill 3n͠bW]];P(^y'PYY)++[SSp蔔8-Zh"iiiiii}}}CCÒf?Z555MLLBQQ1>>^ ½PJ"􊋋9;;ח=]EEO>?.+""bff&`^0#bA]]:yqO 066 Z}!H_~țˉ'ݙLk׆ʽj"8Nvvĉ)zzzѣwȰ[ IDAT>}:1wΜ9-PQQ!ZD"YZZ^tNEE֭[|ostt ;z1c***VQWW`DGGPTQ.1GP&n:<<33sڵW\^3gNjjj~~~EEׯ_O&7rrr޾};n8;bbbv4c( 1U[[p;޾}˝v/>t:PTT䝫V$%% *0"%%{#^U^^)//oooEwwj* ƛHvE|hk֬}~pppXXh4QZۯw^6ݻwuq;f͚huuI&u}]]]O>~ڴiЩC钸ٗ^~(!G ƚ|ۺ&̾655P@sQo/^4110b/x+++ڋgٴzx߾}"W^-`'hAT8q"KJ&W΅n޼ills'PUU-))F&bT*(11,SSS!H$1qPTT677|Q9///77W}y&7n(((p MMMuuu:cLI$QRR7t[~rݻwkjj~ͭ$33kkk=ZUUaށ){vvv^^^[:ujaa˓_dqqq___Oo644\r`~~~ijd l"&&&ONN={vdd۷/_iӦ9sziw_Ξ=Kg{???5jǏeddߋ)Smܸ1==ƍk׮UPPrKiL\\dsSHHH\\!/v :~͛lذ{G0_0;44ĉ***cƌ|OgϞ=֮]KHHHYf߾}^hg>0pݻw6싞xmffjժ@ 3fDDD9^&A@h'N"&]罟> !aJKK'$$|RC !ơ0zۏ; UTTL<O}ׯ_?9ф7{[WF;:46~ChhݗƤ#GXXXFDDHHH?;C? U#ԪOڳgOVV… tY;wHHHwڵ_t73w0êD]A?5Gǂ-#SGoG!pP( B+BB!a !%BBމBYpa1E<2BHH["T6`"QɆזBu!B|a)A&ea&SШy[}]kVЦQ5j PW KIRhTwQ5[QE mz |ά)5U&ݬLW/s8v6o簹eߕk}%U-!U_~VbbŤ,ė^TX: qfV7ogN%f6vVJK8r"p7h?s Bu$..f<59-՛DbZj:p5rʊ*ynMb*;'&lXMA~Y~Y;Gws Q.\7j>fڒcH$Q.pRS~1W=x3y ܥbc.V&ggoE̺tFXx _1.Bjز"B}qX`S-[Y$ S#`2ҭfR)& \fϚ?}kj=7_fp8~3vnۧMsђ_-Ι0 &>GBRB=BL:;7/kYo"qӺ(+);{⫖1y>1mnnfdhBhl쬨T 7466=p<;+n*-)y׼lt8^.\vt P(0 s 6X\Bb]Iq?v*D"ס>ܕYY._;oc><דm9 fm_O{dNΎ kV~5o7"CqQk75԰-"%-޿+Monf6YOkk % K_ vu2_Qa1~&,}%Ȥ)*ͳjRn0ЎB$8JP-YQ^Y^VAM DR(3ܥ"NF1L~BaX23tWTT 8زԔ{x>]\w _eE%TBRʬe<~FL>yLAQP`?!7memΗ#aj`ћ7zyUF:'FE%nñ!"PÒFԾ}L\\,%.N&tV)UCog?T5pqN*++AEE j>ȟGUY򨪪TVV**)\9oJn)'X,RYZjzn˱|.!LKP()wif.&FgZQ^,O^r4*Փo&cnf2Ē2!&eee YFe gcA89;jikE,[q!$)%ini .566 poow5wq=kfӷWC}CƃL4mjBL65(|7OZв9}pQM&O:7oG}ܲIocl!lE"l[%[&s>R?ylw>n^PPYYś;6b2DJN;ٴv+Eɷ܈Μ;6M>o|od2yތEcD!^X~`~ӫ1M^ncg%"",L&ub2#OG[7à;L..*^kaeJ=*:Ble{+.C*Fg43vF>Gs6C?FEsFNJgŚ߂6l51vUe;<~{ok7%nC!ԑdۿ()i)S2U;wq'C#޹4p:zװCz~N}(xdȞb6vV-m/D:q(h3gw6@%X2dq75Jʊ= ֒/Ic_9ӥ~ׅB?uX*ou+[j  ZQQs$o\4/[j(̏?BjaG{9 B[Bs7^;._/+-߸eu˻BaXvnHڲq٬!aZzՋBHBB!a !%W9!0,)YS~kh&]MYO~^>b^Q5*:} m[7aI94Ƶ[{R<1}R?>1kIs=yݔ{4ƶ;"0,inΣ(*)t㡣})8)~3khϜ;mic< IGE&NO\"ޝ! HNL7s) 6`IR P7̩6vVOjht*_~vm"g0~3\۽#x˟tӃTPrZUe53*^T4ġe{t?ML1Plo W=!~R馣})ޘSgL :&`q 2w {e%O|62oVԙsMM'}`+qƌ͍I˯s5s_TUV (WhwSf~&ě#4 َfw!{xkc,cc>w55垛Htx5Ԭ0[ \g[ggLBMa*!0۱50ncgҰg"1'G~U=~3`d[yE]dNP`A#.:l0Mp9_$yo*(qSnHoׁuVq/ꪚmj;-59msھ{d0@BG Kyu 5};|ǝ\ʝ~e@P+'0>DΞPTTtCPlgW1 LzN2ȁk7=]9 ҳ?J!bŪa0F&ݴn%$&A  P(ά(䭖G& !~ԪRSM K: E]CmIKV.TnjZxMɨd6}&hw!{tz_yUUU:|&hik._$DZ⿪ZJ GNo9KEU+KB?RXzY^}c'9u3NΎ ~B&IqW/[x^!PF/ deex;pǾ]8ΕxBJ~6RRs+B?/8s^ =pnZ/\-xR5nZ¼^ a6ԧoSWŻ5uUޘ{#"w~e?ss>"6_-OۄWoxg57TVV}BH464oƆ ~cpcU #߉>au$Rr_=<+BGWE+bdX/1XPs[޾Mp?6A}-dFeonٷAw\\T|?a-LUMV=]G: mۼ3-5QneӺqWh 6j-mV=*:Ble{+.C*Fg43v{wx̘3G%!)q%6D"QVV]_WK[3t4B!n$Yrck~ ڰlnUw{YTl>6kO4uЈw?zj#\5l䐶Жbo^u%]=)lutJeE%TWմּ3 KpT݇G9,&.ncgr;{zNawlvp6q<***++FRRgϞ...?gdd7BH }gŊ3f̐ڸqݻwӧ Џ[zپ}EDDD<&B蛆3gPԀnL"tޝzz_|)**jjj:sLbց_w\%%3g:88FFFVUUoyyyǎ{10001cF>}x׶f͚zJII `СQ\\|СL:N /_.))m!qqqogSbanOAA_wޮm+WҚ5kUbbbLLϞ={#FÇƴ &/!!!++kܵ}QW^Ϙ1ݻwǎVTT$㜜ٳgO6M\\<88HSSȨ)??رcޮRRRK.5kg>}***İ PKKKy$<R]]]}}}?~CP,--͹]]]](--@~&#"&D} wmbbbDL"/ݻw?qĹs޼y!{KRRRmep8 o߾NJKKH$ި###;IL&ܹsϟf`l6;weHTT`;6m:~Sۧ3zhl(!UtB***x+**deeHIIdwwwNYR@@yʕ+!!!ʎVBj׷?dXyyyT*(11;$++J۷offYBxΙ3BhBuޒ7{aÆeddܾ}{ƍ0u˗/_ãĉ⾾f̙h"5kV2h**%%ykii[n1L l(!ԅxzz3*****ZJJhڵ666`iit͛7[ڰa}}ర?65j0ɓt:]QQȑ#ϟ/))]~='P!m$vb$b4Bݻo^ALN^z B BB!ԚoyKM!:… ۍ)B݉BkwNoPTuB.G&^[B!ԅ`XB!a=2iT-w:u q>PTT@BN_&֩;"1il^K]Eu*5Q זDEE7a?9Ϊ%x_ 1]h+Tճ3wڷK_Ij}(fH'/MA#7iTe{b -hllZjC?瘳wm54FUeu(į (6bg&b4}ݔ{>-{+!]M]p>d^UF׺Kvp7PЁ6K]/5tnNħLjF:R:F:s/*xSj/47^Hǜ`ڽy:]ODMVWwIc?z?6uxLj:*Fjz~Y^TXm=`Ӻܱ5!?5MTCn~G?FX"aYOm^yWott@$1VZZjҔqj'C#ffm2pz\܇in7!\[^gs^EK~g>L𮃳RUY5qʸEK~qrv|zέ(aڕO3isOٿL75wĹgn#<݈&} tDk&*̡\ߦQkˀv/_evHILu4Hr)޲yw}]!s66JS!D >C}쑙UJ s, 1b) 5v%C z)>ACMhr)5`8)wkenkf\)/O 9AqՈsa]pqvy= wU<w=ZW桲7dϑvXioΪ={6>c=O;xiw :ڧo/bd Mcpڽu3Y)%Y0ʬefa歄]ۃu1MS_W`0hU5[7D&G smj{K@*! e™e?_|`xo;?67pJlLYX~)<`Ia&I`dsqen68As:.Ced=yn1 s8d4٠gnp9(c+GB O+-.m5'J!NL,P֭$U{莯\ye]G覣;M""H2҂Q\Ty:]V3 s4;FIؚmBzuہG?b06| Kx'yÞ=.}wJs"""cF ')(~v];-TBRKvG=yӅ7Bf}x?Tʅwt?5⢒}#)~3 SI MuV-0n%$m ynzs3̗jOfe>UPYY[]Ihk>no;qoSH SL4&*̡\yK@IYxqe‘[TQU촢nj޴nk7\܇Uܼd,jjjj*-*wx[NUVV߄uDYY +ٗ;QQƗBH$5uթ3&}ֽǏ/:rr-KbM[6AK[s $%%I$UqjOֵl0M-Ÿ&O;z]ۃvIHJ8?HIKuV- kTTUd7i>^&*̡\ߠRSܲ/1)##SC?v[wTM`XڴnߧϹ?udŝ+̶deeKP3Ɨ"##]Z}_Ě/=׾]8Ε^˧P#--ղ8L5oڬyӊ o?zء c?;TM99b6Ob, s7ytڵ31^60mjBX3p8#<]=k[+j"ΉK ަ&/r_&ӷWC}CƃL4b젖Ϙjϻ5uUSn>}{UWz71CaUSW;3Zښ:@inٷN?""r!É5w~ѡ\^ͣ),1# f/&ɿo]5sTذz7 B3޻1x.μ3ٖDشv+Ð|N/,ĆALr_=<ꪚͿt %:E"1|zu[yĤ_!`7y6k"y@ PT( b?y,W\uőW_On?t K~#47|n_1s4 Vk߹m7Kdg<~h)Fc&xߡP({ڇ n._f0(3#%6օ2UQIjJiiYe7}s;ԏ̋7 ZdCfmFJKIzq!u4UT|.^hJ ^k:Q^\ߴm[fy瑥/Qii[{I$W/`nz;%r=duu8´ו!h{'CZjhEP]:e^W=w3=zfYie N{9yϑ'tsKW,1o; <9oJLYl G#^:kSޒÝۼjADP}Oo^D9rj_ZJݠPqgOhH9R Flr\:mPx-;tu6>i\O#Rg/[| WJ˚%KM"ʋ뛶m,tN( ćRlzjܝyt뚍+/Y.TM]40gg:vq%qڲ +I@YE_^35 AA4C>xxއ.Bwp>?|EEf%x/B6`@[Kȏyw)U5^y1ͩ[ݿ`pP?raFAt ]ƹt>yDb9A ,!  t:Yv߷@ͰD,d2'/aoh޲;qoBh-YeNKE)mE)mc}{O"2w뚺e0k4PDABQx Fכ4jf̉ oGs/?ܩ(*,n;&>C%$?'FE> 2aW4n*!99yR"33л዗fJԶط8fX' usס7v <>1G'b뢦I򩢪 06DŽa8E+ h^'^Uȁ.# 5Lzij>kQz8`F䣨nJ m%s3ߞrݪ=5+Jj x rO~s6[s`ox]9k)R26:a֫";뻵ShNÉN?|R^Qo%[7Bʻzba m';߸Sk5u%> 6}`KEI- ySDAx#ב;n*o];Klb|LHWs|q8yܨ㚛{uxqgjܬ5 5uU/S}jee[(q8&&/uw}uob folGXXNf[.cG7֐JʊXaQa{z5qr]K6 M6^4 X8bߗfUY9[6쬩~QQ^mFiVr[KBB4S]]WmK_M]5:1; %hMUX~m=і<[itnyoV1#5Ծ k#8 ½Un}SlݽmaUeڌ޳wդi4e2_6=ޭ-; SiXByw0gOzݾ[S]k9 ?yk =ܱe'Ϲ{D׿/Gb\QaM;Y:[e srK1KYDN1{u07ewm|ރgϟ|Gφ3)[A>^k{B4Աs;۹eǔ񛶭k,Q'N ?`oߺj麓f̚=FE> pϒUe'6a6*LfIz2KNh4V>~ՉV8 ]R;pq?24vi%{T*j@^)̝7sY"Ν>}<:pl7)J8֍G"@G[U5/%}^g_CBB<',\4+AvgOz=ye AMIWTR|xz핟W!;0*Y+ /ٓbH@x7. ׬s ,Vx$~z7ڕ&ƽzl/ Fcrb:I(4+dk AV4423H9a+m ksI2c>\یCr:᥃{{XSǬzg)wi3'Qy0K͜ܟO!`lw &B'?sQVNqCcgE]>~ksk47ESU0Əszp!EW}nXhb^I50STh>{t Vr[K#^:r9f]mU)ʹK=/-5sס/c6޹?9sd?흛sBnG@у{\󹡩~lܺkCcwo/ +..{}|c$|It+m߼n{#~ 8}d~fv)eEBM! (K? )1!2bwf);tm_D9rR(em6u¬7˸v$v gE)힚wnq3# ́}߾\_4]Z^qŒ5 !‚O oөb9peI1 C g-JO{l1v*CHPRY !?]{NH36]yy (KmÙ2wR_tڕcF<|2]\\l %e g.͞wOs>i~Z~?0$6޹o/4JQI;!`¤ͺ73'zNM?fqt[7g ƹsu\CFX/p;_a>;6w‚)3<-h'/Zﲶ'ЉzM>QPPpmw[07-55}9l/+--jW2""Zښ76qA~e9pr>oScCGbGaOG᏿ո1!`=ز9i6D!؉ };c~ MrFq.'/&B&O8vLo];;i(X,'!tԎ-;ד ǭX'͜Ľ=vصJzpшҨ%0lH|o_uh¹v#t0{bӠ{<ݫnPVZbȰx=8y\c|^8{YYE᳻E9`MIt ~6a0"^SRV1nN a IDATn3{sph,?b}t*Y9& 2q=#'wtU{0c=ѳ)ij(գǏ-{N(#ZjY>{2SG-#CZ:h`NCb 4mҴ #gh4ڼs r'-lÝ'+u */+'yܷ.v?] {Lᑗ7vCbіIMQ1Q͂| Rz 9ٹfۂ`'^RRR(_'[D]Yv@VNOW.5y^26a붇:9ͿF^Gs/GdQ+yy9(:[\\, Om`|r!Cqع[ܲODTcMֈemjOIICR֞ [_4VZZUޯȋ&=YUMeſiR( W+!ZK"ullΜ*Y9iD!(KmXnn^@oI$$$Ӿ 0͔ٙ7Yrۼn~N|o n-)99uWvv.UJJ*+3_K>Ty3Λ ,)ϳXve|gc_4VZZUޯC;pmwXzRS"DZ u(Ad̫7`=؂9MN<(? 'O餚Z-Lo)-)G;:r}_x( zE|415z O%7+J r']w{-ibRSͽ7Vx>o$|H"J֣+(iji7'| (KaDWov2$*ݠ3_`ÿ[?'px2Cb6a؊Cǣ"prЂM26ͮV>>r2kGwgΙ+^[TXLX^VDFVg,ᡏ8t:]_{^|ߒ֚+ACS-3#^dMs-XdkB s}><ܼ]s#5%aPfF֕K~C mVG5oٰӢHuM‚'y不ߒ7ƏYd{8䱭1|n_1s4 Vk߹d!,YoQcF0RxlFsFSTR,jY]**)ZX PUW)-- lbl %5W~ n;fH o[ +DZ,or=dmcHK Hۂ˝>r9#OfXhicgÖ͌:{:VQQr4AY*coxJYiYK>n'4$уܜ\)TO#m{6wݞ_𷤵8p8{خgOyKJJ wnq'CsĠc=2)1aDי#ʗ&P SoxyyEEEqLjZzuAe:߯E~|Jևt~e(9;;בOOO//+Ӗ]hs~^|/űӂ.CD!`]iEEf%x/B6:-2K373'.x\\Ĕ:~Ɋwg]`B~fY<}"U@!Xe" (K  ,!    (K  ,! (K  ,!  ,! (K  ,!    (K  ,! (K  ,!  ,! (K  ,!    (K  ,! (K  ,!  ,! (K  ,!    (K  ,! (K  ,!  ,! ]Q޽BAZa,!t9$ әhXN(K ԅ@YB秸 _}AYB40՗CAPAe ff Z:tСCǎ z3` ZcKU,րcKKNVvɛW[&EtY)vb"98~`ӧ2111)))uuuEEE"ׯ,YB_ښL#776lP'2x|wwwx={uڶI ed4r_S8bq|wK|yY yAjQR]\ZR\ZKڽg\}z=4~512TFv̼mk׉v/Nn&R62STR)DHQ!sќ6Gok)˧ıjrF\ 3iNY1a6PP\t׉WSlG/ > !SiyHKao]/E|ͧJء ^7WOrZ|uMg?8cD.8pzUQ^I-ŏ_J)p/|cc.X>HkN@M gᇉ9 {?JJҶu0|΍. >LI=5 }{ NS0󷱣g͝E[2_zaM~W5XӇ .HW= ")@|7 eWWغ9a9dd tf92fQ ZTtq6kq˴LUڇ߫=e͒,1=oϭV[]]=s$0AIg(&&6d>^f?y*--M={… d8d2L&~̘1~~~իW@Ç:jf.];Y}v:>xf7\˗I_EM-zTS]SXT*K@\BtYǥf)4,CZ~aؗ@~^Q pd݆JJ>'})..>fp8goe+v*նGgu1/kwNNL_t?]DxHfyd6=}ۚDړW1ދ>nXocU$x37D&&` {UՓ+gEƣFw57W]FݯUcGskc39tnaY8q/)A p87}C[9Y1/?]q--)y^Bp?( ?*1IQYԾ_̲cKײ:$`(5HUǴϱ ĎRGX &wYR!/.*ZRVYy9-_V^4ANnҲD‰3*.@2u+pcB ~CYң\W3~ Oms IYr)KC il&^g^^YzH X#{>}L{X7ʊ*@unN( ﲤ,'&.ZZRٙ_h4F6j.p]aD &R(#FJ*=ꉟ` gar IY1fPc3HkhRj%y ʐs[$Ax-UUwZ"*hn"|U略k_';H26'+[B>g~yЈt8]~>bYlmUU^: ǁ֊=2rd?16 |@|x\׉Aoڞ=6W%fAP¢sZ*77ɓ/n%lmmUUUlv||ׯ+++W\y7olɓUUUutt _++=zdggGGG6փG* qGUVV 7dž|I5^$=dFHH!Ki)7jԭzbG UCKYKWUI:dLAQ6+3/K169߃G0mN y=kK5=H |IdYi~ {zQᅱ6zn"h?x9nT>8y&>aeY) F{y1>1=5tcz0i>;QziVr癜z\HzEEMLLLLLtiijj,HJJ1㲲2&Y ={|lqqօ ^zT?;99QFyyy숈B $"Rl'*$JvYNLkOdeW__'݀c}] G=}sRt v8Hz88pͮ7JfMu n)*Z]4niqK"EDwe5xɘj}"yM\$@s '/ܿBS DrFRbb""yIꤲvE%{#EHr ^8X;[A!=ھ_,l2`ɀ܂_R?@B'Bz0d<dUtkވQ+*;/_6l[EhyL*..^RR#G"R #(#,2BYf}\X[[WUU;w<^y]~?h < }1^ۅ$?kW.>1j} R ,#B& _1 ?$ۃa7<$qU%0z]K}VAAAzz:j>| ǖ@EEEb)++kjj*///&&'2A' ƌNGHHH t kkk uur( jB&!]eig,.MV u /VP16VPKxx# eݧ x U,PT3H Ӆ/;7U) [7 tRO̒ŒZQ@FCy/ɃҊ^ ssѣ~ ӂ"iI)o?g~$cϢȆNxD}+A_]CbOOMhEXa-6MP>N=e:\5UWk r7/f̘G 픖yJDDd" U9BN?>km/ɷZccc -sB x5օd)488^nw<'"¢ udIMZFr㮅djj8/rZ{#;Ъ/H[WhE(7V *vȀ;#넷@O#K %EB Rc\Y}fZ/7֩ 2]pS IDATΪk_{[׎v YbWo>7cz`"tY)iUu{Ss7aMN(śĄ&]HXSYu1;`=kي560M(,:*ijMַoߨ "''׻wo777=޹sgppJJJh4bǎKrrr}qss#"6mZtttBBBAAVQQ?~|8@R… >}ZTԉь=x*j}`X;B Gӝ? JiXj'"]O#b&Ѕ4쇙O,(㧌ؾWYk/Za0q˂葦uN\Xx|B|jej}[,qaa*`>`2ryޤa d*FW9Ln@tteW^]'HkL7}=518_d')^I}EgeqcB@oHejp}Ik3n ~d RӋ57W-խߺukH/v tt"Ma s3_Mciwl۷oL&9ґUŎ~_T<4ԣ=z%Զbb}VV%$ٕv줾UPP| /&B{|;`d3b :䊿tSY*,)C?[7w>),gocYL E"~8dĿψҼ@ᗌ:!/qVG.˻80+~E+rՑt(j8p9s8X: .QC?׭E)X>yT& BScbw–OA!ĨgeEE!7AaIF+O ⵉ,ŕWEV0ca6$݁tOoHg+ {4J %%%4e+hbh݁h= wZN߿ y&M܌'8.EtH+͈܁t !Kt:].?B6 nEi?;"K iv1;q9ڔw-&͐fDwL0G3v8$K$6 K.Xrh Tѩ@wtbCs,'%?(ёC[u/\iQ+wjFy "4ͪ{g}+]3ѩj&C̎ԅk/^9QȚ珢 $TVML ;C4t:Uk k)}w%^) i䏢˓1U$ح^G1P.R9MDP* p]ES_u ֎YUZjCejUP |FHU= +.Y򉨖ٯ$R+TV&@5,?#]Y8=#:z+t Jg,-[|d(!e*h镎%M^Ai՘R40,6ѵnpMBw H~XJ@J&Z ]"$TT,EP 㦧@vp=Y $X4D TvCo S/Hшc%X6;@WܽF/%IBqIvI`|e0,3(kUeY@QQ:nάIe% 5G!F>]W?A΁/{0JL*+Xko2u }ʱZ#3e"rUKkEo_JVUQjD)I  o_JYWQ.)=dtB LbbQz[T5ѹ{;:k_k{:*傂:K&)ڤ$+Vf~AP,T*GXLB'W^HUT!"1䛑F~ 5˂JE@Qci0ͷwK|iꕵb[C k_k':oי)麛4uKeKYe{}J;UIQx@LjE "Z-&AJ}YI##ĝ`ObjYO@Gt;skv H{xZRҬNm:(~(uiR,uTjn)p ؒ)ߋE!ݐ/ev}l=KVT3āBW^I~Lik,ֹd=ځ Z"/.7[|j9K>p$ GE'89J3=\]M!㓧'(J9wPB88pG Kθss>p`Lss?%i% vZMeMfw?8;!6`[c(KmZI% 9 SU+<`@N5z%LAᑌO.,\qqO2qI_4J?]Z*VVP/+ rYY%e.VU,*U)NZeBwtiR^x/^ط#,258~tBWoI7J ثܫg*-ZKǯ?a2VNlpDNQR*4:_JʠX) ԵNYa \9ϣ&dr_L_Vj}W4ZM~K3XH<3N5EJ%(ȑSO"C>T;'qÈ=+K['a8xP>lĐfp?Ll n-Fns;H-~dz֒*]B[)zVa>:׵ mq )[Kn4T+?SpS;Kƪ~ކ t,Duh-MH|u+ aQQ%CWŗD EEMvsfy4u EāP: (NHʲ2a1QQCAOWʲ]ZcKXZZj# tcIO%=}f9vL2D4)EG#[޶4%!cKr4u#.+C̘ʮ@!Kt:-D?͂bZtJ3;~>wt J򊲲㐃GB!+!J2ܳ-J?~Zj6Фi2*r:( $B`@O?/0cIw 2#gtG2v<4i,i:Bei)T0dBs2||5lvn:k2fE<{1yx%[K Xvψ%LMP.!A+顭/_eC^J*yxHE=..K{p0݁;ⲲPVCE%{$}OB\]TJc-ZYiXKK kNkth VtFhk d Q4hRƺf'&s?<(h.9_׮ᔯ)EpȈĥe5955)c߷%P2߯kRm{ӧOXyZj݁P(-1d: (#}YQ]\VV^[[ҜNDWŗф~9OA!ĨgeEE4͌i/>T04aaiU}kR; VN݁ %fS]BbvqH*    &@iW&cF8B,!ىI}UAYBiWxt,I6~LŰ4֎.W;n!Kb#_8Ҥr -2()cijҍZKX:l6A:@*юVM5A:@/Lt,󀵣PJAP%A^*EPA:#s)Q"҉ZA%AAYBAPAWp ??fngv;,Ň?~qL. vO\xJ[+cv"qlh;8(4emXw D|$\3zm+K)b/mۑKAO?WWOOf()!okWŢ0uLc*3[vU'ıI?II$#8;*((@ %$$itOYA̕c]p.De0.·8$#_R>ш`Rڛ%yyO ,VUY37O&pSUV1+cLP𔽻Gp\QU%*hn" Y+Koi<Ň=7ک^HDD]5{DNNBN9a䒚$@9VE.+v *zɲ2?κM]˼f.R͝ocطNXYV&e=}Jw{WEāP7¢ωciUtxs^}Y1o͊衭-!'ط5lvNr23'ͦjh4NeEd/_= E!q@oBP~_=~zY bfd0Zm&%&̴7kXk! DLApRcߐWYR%.ŒVQ* E&,Ϙ%NMMyQM^>?5խh99<rPj ?,;eiPTxKY^=Uz&DDɘj}"yM\$@NC<=kK-bҥ=Sh5CIJOM(OM#5IDRRDR$7dʢRϟk[*4a:6vd|Ĩb22tqqI a1j6HRA^@@8' ;铸MX󸣳U:*+S6|)TP(ge) /"%YZP =|-U@+V R~ZZXX;=Tє;)TjMu2x{O{ e&^P_޼opykͯ9_ !%al  Ud%{`KU$)/Ùx EYYc˗),,,݄jnc t0CY~qVZqG $Q|ކcWUeO ZfkPەZfWٚMOىI.W5މW,)̨  u FCۮ~m*53iٺDYQDjDLיw1$FI$IDp7DQAP6YEfKbw9ު{ؿ6RsuMՃ+/nHADѴ呥٩ɓ'җuv֕ ;:Hh:CC_vFEu[*/ ]݀m[ws/&זt z.h`3 dRȞEϧ,y~I9H$y.?!͓Px,ɟCgc.bJ+Fc,|F`6Օ9໹WkPSPXSPNO]QJj׳1y۶N"j[1yy=s55i'Oi{k+j-.р ޟ,QnuBaKh6TfhjŽA}oTbp'XZ(Z=y@vn2NrGizh|4B;Λc6м,I$Ѹ NiUV}2 K 3zMv%3-- 3\g#xl#I.=:%$._u[X W(4%%).euun5Kw)M~Y2))56ؕ=33v[CcU% Iy8&{:;qKb9ܬC,є&Mq++u tKԔ5O> bv&uNι-\9ޫW~`{4$__"o=>h|Wc,_p;1ҋ37S$x/ܹ/5u>=N IDATҥQv'3;lu~Y`O{==EF^V8ϟ7 di!a+S9L_Њ}jz_Tμ W֤ͦ` NEZzcsFlc>O7Wi4uG]MKa F,6#cVV7 *WJ**^VxZ1 9cX'񋯤[[K3J3WiC"щ~@ztWWdeWde\_>Rڀ6/|\{xmOxܒ$Of?U&g*a?oAaOFVW&ოN _;NMRQSZ\ʒ$ob('G+9M':Lnxﱔ&8Oru+ HK{p@Yw$uL?fmiiYFf#;Y. M⛷Hd~e AdsG(ˈIxmKwF;w7 dƝ!K0e>5'SO;S\V}vv'6g?I@tTH{jB4+WDfQň48~zvM]R.q#> È1_^jBÒg] r54PsP4ϟR{kksU5dܹmly6=$Xz>\$ mwD$<-)o[.KF//ߛWӵ k\]*d2]=J{E2`L&CYyy),DˍdĐ? p} i=+ނqyxhO&HOn5!|Sԥ ?\(s ȸE/~hhR ߹mh O\S3p-)yɗu90LmmDcPx[K76=H5tuNRfi܀*5 |o !RbwwPe2gei딁zEwYrHxt/̦NzO<=d1D ~ѽ%),)4z-Y~ MG%iw; rl̗Ȉ\[RJRol&e_RST*TVRg&`35緅[­hn3⠺Dhkh4J#: 8e1_d7v~3=_SP(hi3ޞeF-v3=aqg[4r~=iW4{?K>c Phhka}sUuoY|}VZZTtmC w%A | \ˎae%ZǸk3_of/C-fSσ-<ӡ>i92 ([''2b^a@q/Kb%%d0> ,u\aCEd(Ϩ4C%^Aрs9날!Z0`gdOXz:F#3* .ؘ"ؘ"„x  ,! Fy@d샞(K0m6,䅫ei۷ñ@L8lAcٿ[K {%ܾ}Ql<+ "^*CoD?ADCAPAe AAYBA%Ae AAPA1Ÿ-u+ # FrBdDGGc 2b|ddY»A!<<߃%AD{K NѣXFss(K'>>o--X,$iӦa9( zʄ4wΝ;IO?1c+..'Gbq!c',,,,,,(S2,!ñuuu, ,,,jq|}}}}},yFPG%&Ϟ=W_ӧFj PKK+**7nnnnNzz?\ZZaRMMMLLLqqq]]][[D"aK,qrr2#ĉkRRRccѪU<$HΝ;wr@f}||fϞM{¶6eoodF5555FFFXY5(KE$-))!\r{Di#uuu׮]KII{_b׮]ԘLee} ̙3ed,**ԟ<UVVx<"Kd.\immMOOOOO_jƍrG/ ``9(fՠ,!O9tPLL gSS䝯&JKK}||rTVV~ZZZnnn˵qF4Z ϟ?D?k=.⢡F?-K$zj{{{>_SSsx\\$55+VXZZĈD'N899yzzm3Ja2(K [5(KP}hy˗K$+V466ӿk33<L(9::;DSN]v-˒ oyf8|0ע"ٹjoo`q$ƍCBBח㑁ʸ8 yUt,X@ؘȒSQg^xT oIPz٩_lmm߿/V^mbb2i$+++y \.bYQLP2- B ,rVUU% CCCl8p ..?/d27, ed,,,{}}H$*/////OII9zhPPPXXǓ]\|>AYB^15ղ{+ϧ=((KHK,,,?]XXXYYI Pzcǎ5 URޟJJL$}Y!3fU^Ys-?Imff(K@CC$jkk[ZZhl&s8ڪN}ڸqcEE@ff&hjj200[ bq [V[Vz~;(2((_P;߻we/a``LСC!!!555/c{OWWM___]]"CK.ڵkݾL&*###;;{ƍxK /V3[V-@viɓpPAlkkKܸ\.˥hnnnu :|IӧoH$999999=M:BBBJKKxjjjjj*pfl?''~ߟ2/r{ܺUPYkoWg0&.󴷗ed>y"TWShjN8wT9lf!Di׬AYBGDD B7|ze z-sy.jժ oYnݻw>|&N8cƌe˖O_4m׮]Ν+((hmme2^^^ TZŒ֛vVjϿUPp`Q#.KJᵷ"Krk-eZǡGѸ:- #Yv NFFFH"w?'>XRׯ]E?"~qqflkc㢪/`ߦM>'@-|>w03kkonlL/,d2شIN;˹ܣ/K/5p`AZrsBzzޣG-|>Nֶ22m(**z㵷995KEY;.o@YzʙgfE!":ñ3gߺ W\9tZY~e">q 滹 xXhC&,,l„ B6--mϞ={,!2lҥKCmݺ AYBtM6EKKK=Cnڴ"""bcc`ܹwJUwءg8x`rrݻ###KJJ,Yd5y;;e A/w-,,tqq))) 377߱cLLLܵkWxxubŋ###+ˠwLMM^z'N>d\kK`0bq8pfa)%~ }"?ncc#:tH[[{9 O555i4 ;v찳 .\rȒkpY1VG-*gՌ>Y:sdHbh"(;;;88ji4Wbb WSS{q\.k2{K۷\tttxYxXs2t-FSRR Zxn-@CCc{--aoit}@tR7eʔ{>XUUKzAjjjww7hiiחGd_k_ɇyU>6pA쪪*2֭[YYY7n${l-^X__6o B066N[ZZΚ5+**꧟~Z|yccZ#U7O{C|G,!Xo5556mcc{nCVVVQQQ|>f.Z <~8Ս155ݽ{cbcc֮] gNd_kĉ2=k(.fjj'KIIi۷oG9g**}p25deM^Q $! * jd!\Aym۶ABeB9eE? LCos5k O 'b!aA%AAYBAPAe A} AG"::][DeX%9?; Ȩʕ=X #*KgpW7utt0 C3gNTy$J 2ƐH$N]OH$F>_PXXZXXp׮XJC᥸ɓ:ȒD"9r俩vrr rr .l%ATQ={vbbbKK6X[[zj굺ѣ999BfӦM}s?\\\[oQ b'***''S__V'N$$$DDDܹs@OO?akkKٵkϏ_LFFO.\H4ު"IHx<r&9&(r@^Wx~!LoMU,mjj\QQx;!᲍Ŕ)QfN>}ŋ?k%ɼyȟ%%%aaa;v`2v  BffG}'tttDEE/75twwWU=z{~CI{{; C۽];w#G6lؐk]<O$:u/bX,0&Httt7TTTbXWWp|}}RRRZZZv5[ݾ 55.΢<^cLL(/ɓʚZ|Yښ6,wtꇡ,ADOO-99yݺuW^|~+))QC|A7666jii/Eر#???!!blܹDn]gggIH$%!!y.&xiiwgΜNg](u}}]hkhh휝Ȯ>Kziffuu p~ѬYz涴tu9(Kx%ĶAwo >ÇP@ӧLr޽PUUUft}JJʆ 8^mmmnn @UUҥKׯg22쨪vuubnn~С>`בyIIۻ7@KXYYʓ%'[O<7ϗgs8ڎ6::lYYYS"22}]3/[Auƻ,!2(f̘bN>nL%%۷t-zхU8`lٳ5}eqq0cl?TJ% A0=uֱcǼMMM@-yzzʄ c.77wɸ'XCxd޻2/]s;d,m۶mPPD7~[BAxLbiIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/effects.png000066400000000000000000001152271475757676000244020ustar00rootroot00000000000000PNG  IHDRUR'RUsBIT|d IDATxw|ݥF5ޥD(QyT~ *ET!"HP! ˵K܅#Ezvfvg73;'sss"  <+]AAJiyur]Pjno/  TB//ERcqAA*'Z JATr,PѨ^~oo1! ^ZVkR"o?` ΢ev_@ͪ^I`kfkXh:~U%:6̬\~_עrӿ܎oa~n+k+@z46el?e2\iR:/<ۉ&Y|gn.]K|R9J|\i<팧Iܸ6'`oukҫS>rY9珱hH@FHkyj Zb;/Kx{R@ ПgC-^7b7'*4M^|R| J\.; Tf|Q\p c9/]ʍ@߆GVKrj&ǯpU>}w(ZԱvK/6y#,syD\9kP}NI"%-8ie}T?ƎJ!>1CW8rK獣N-RVAxZTJ(NMnQp.C䔗h(!F0FRÞiKpuX}~\ ԄyWE޵^Lx''GIl1!9h*uC?Ւݚ˺G8v6FUP@1.'WU\.W&D^ܼ%FRJہWBk:v%'WW_mC T*ngßD\CjF6Ύv4[R/W3A2?n<ȅtv6x;X W^V"W+qd2Mj8#~?Gu?~B>?HxOk i qtkx3x-XEu7gWƼ[:?o7Z4Q(Jb֢9ecl}P?⏽pwq`7]᜿r,hި&/<ہ>y'hS2fUO Dՙ4w-oJU3Y64Z~tsvVUO&K]KPZz&'#ncK"5=F#g;Ra 'wH~ԡQx:h[(zh'=oZCikp~RprcDd2WR70V6J.am%Ձ-pJ499?BO\5XZ/ˣ *u'q_pڇy}6ӤJak} UU*e,ABR:9Jф&p.3UEoЖX?DK aP>:|0BɜoRd:ۓ?G/~ % [ hAwRZF6Wr=+jZe$VF* rmr9dd !="8}?~{[ka;)iYhLE*>+;Wz[ťĺBdtLt=[RukHu7)e5֜G8*efSsT&kKys,MQ=Po2 umF7 =6GQVnzUy]9zY d20;2 'WɢRk`^iɈ[|r7joG/!]oDWvk @Rj&'N:v2ykϖEvQP ҪԺ G{m(Űjs('ѯ{3B:5Ǎ9wx&5 !?ߢJV[boK}Ӻi-/us ׆,ҷ5nUOPx9Dl#Y,,JՀԳ .\ J͂Cz~ѵ>)ti"7A֒cBR:ע][y`ӼQu:!Fd2j[ui8t 7 B!gATAB*uk/yز$v6tj\TMrj.\˅wVжy cwZjJ:nS܇%?qpm7X|V4 0X%T/MM'T-~o߿sZa5Ty1޲ o:6^7*@@: в6U%]R3KͪXYQ4$Ft Nwи_68}6Zx{f1o+y(Uvּ0VVr: ;܋KFZ %u_`:?My=V0M˯z i]w#%+;[wz2هwy`?M>*U\cޖzLߏ8_dJE@_NF$fRiHN˔ގI0Z=Ӛ&uu/'*}a;Ia)iYX[+x޸9ەW` /x([[\Cǯr>kk|ŔuV J86<=;^SQd3+!2kؤOUeVA`*p J819]J`lj)Ԯ+C:Ӗ#'7좴ŁRW7&CAPMaFVUTy^}G“@PU,lؤrMkWbҘx9qm\Oرׯ+ƶkl_ع_*5LB5_w󸟐Á>Ԉ;\a+`YK[WJJ[yYcLqc(J,RӲK1XZ/ O6L]-=yFMY)-+ DKUW|psq 95+QUZ4+wwב=}e硋mZzPVW'Ms$d~QU.7LcdE]ךޏV|Qe0&Nյt աߟzcR8}z{kTvE,㊻I)ʼn7iP7frZgo !+n$&gp;&[tFXY)~VV ZƸ؍Zh3rܥnohM?OjadVddfs%RwPǵg8P]Ezf6Jg"~v6VX)dfKS_fvߊy#4+^ W|D<;y4G85߭=FeنP2^VRfSly ++9NeHAMP=?s2MeAIo(7?DN {2ޅ6!3 ߭9JcogBNZEjRڰhͿTvC>?ӒuLTuEVkvaV>\.3ZAUu_W\HM$&g4//l ܁ٛRwk5X_f߫jȭDTjN]1'9qsBiF6Xz1$Uܢ[:{P;e%Eߛ.]ո/S_ɮC~;\lӝ UhޮQwO 5=k+U]"nm.ve|P[D7x~Qdz1Zz.8[nUְŮK\GjF6r[kR7m֐f+WtimmBUoW)cᯃOJPX[)L>dmTtwB]ظ4bI=?zϊߎ؛vŵX4E)w>߻9g.J}S2IMF.LpP jN]1'9珱A&[kzҮy-:R:^s̹6 BA!2777mll}$ P\qֆZrK.  g[)AAT  XD  B rr-  Be&sss+^AADV,--= # PYdEnq2AA$"AAT  XAA,RAA0C۶m˻F5'>툠JAq~PȀ2ڎAAT  XABɠ_cOFmMmUiћ>vȔ.fDP% BvaF JNcz#˱4BU]Ϟ=ٷo_yd2`VyCx$jEVӓ|>"qr*ɣAz)$VhI= WɺJfz. yrT.fH7*<TJV h~ '=n]Ù4.7t&()p] Pzˈ`oiZ9}΋fsg}wqJb!%+AA(lgFt˛Q=3zsWU 0kOt7͜CY. %''3i$A&aeeezzK0pyNq+1l5g=-:Sa*xKV>ĉ1~-`dgw/ÇWG8u*J'2dIIO(tR-Z3by~ ߪU+N< ŋy,Zİl2lll>}ɯ-i۶-Gklذ%\e?jaxsUUJV3}t<<<6';;+jrV-7!=zBh. T*;v 44N:wQa8::>`BHwz\.7iTA*tPeeeō7]6u!;;K%ۻhțq#˰Q[*mPhMFF坄N0͠Aʒ9s˗/O?mݽL5uTd[ewAP,Q8>>߳gOL^/BUP ے%'s;;0lXcjp-Ί5C4A/lmܾ¶mWP3|A/y=K47 }^޽fRs< a >~\HK ?8؏]jٹ:ᄋGڇB5jKJA;eggs!Q*xzzҼysJ͚o 7Çٶm (1mvv6}7nPF  ᅬnޟǏӱcGJ%>}$7o۷t eӧOӼysܹs3nᅺuv튯o8`־ȧT*Yl6l ""th޼9>;wSNeqVM8LSც3۶mB%|rr۷S ֹi`y:v; iD.u+W!C1q.rsuykWM nJ ̄ο`?}9PrY4AAw,9 WU$&fzMe`MbNJJ oo޿ݻw~>:t`vժUC&͌3ׯ_[IIIуӧO,~:_}6mСCԬY֭[3o<{=3f aaa 777֭[W)/@wCBB8vAXbccҥ ;w.E(k@[lw֔hݻ}F 0|JҰ[˯H19q'qq̘ޙqS V{\@XX4;VÞ>}mFh"3h4Z/NnLfy U ۨQvOQguњ7> mY'^5/T˸uVNcڵRklmm1cƍ#""_~1c~RѺuk[T¼yXr%ѼK߿u۷={άYشij ˲eˤc;vLjgϞ=Ҷ֭k{/믿f̞=#G2p@iݞ={bחf_[R@emmĉ޽;߿_*CI*XV-BիzR_6x~}&Ḿ7eR0mDDZ_{}#F4ފE@QQɬXy0jd۶]A1t.F˪UgJ\5ݞh+VL=AT(dLw2Q yEV\9x|ĉt͛3bСCm|\x?ÇM+WI%Kn:" Lիi֬?^?~x "= "''Gz.KQ*nLJ_UJgoKχ*=.OHMMH>...ɧ2jԨ MzU8;п=mС:>>)u1&}ǎ-68q"F ¢88XYyu!bbbPցnе`rYB݃R(|' 4۷o?Mw rssAAAEyaժU_zXpakɓ'lL_^*XQ5JtGz}9f>s7Zae%zsx GW,%%r@ 22lpW^i7SRW.* ^d'I yEV[&8p :t|'xxx-9޽{& IDATR8|ETE?"]Bj՟4YLΝk\.y7n$vWpr ެ(~xr 5ӍJH?HJ>S>,Z&bc+u+ ye5֪/;;H)t1|:wL||Nn=]twܹG2k,tSk888R`tݤlSz?CJu3|i Geppp0}ڴiL:;wyf7H-JCCoZz4.!)) J% gܸqm}!*Ζ-x1Fч])&MEP7Mдw*zcV> 11TyQ7-EI¼OI;wAn]]v+CJJJ{9y2:ʘ[ YUرҝ}JN?sM23n];$!rQ%Օ~qQn]찲ۛ/^\9iҤ G.r'|嗴oWWW%88~k{W.]O5 G6~J1{9tsr>|o;&ӧOcXYCe47E )v%lD%+,o2777/ [aÙ9sfۯ[cLi*志>1э-UE,Z-uڵk߿uTV}*ضmR Tқucn(evn}Xˊ|%T+Ѣ% ֖뼹El;WgEgAZ~LUEQ AhIX ywiH蔖(2u#*^yH (P u31๣y+ T)?  <^6|63˩4% *AAx|bt;s-躊@T F3-PAX=yf9Ԛ-UrrrO>y|h4['8 {w T-*t%oq#XႪ[zT_.cRV?$+ ƈU%~+_e*1*q!/8$DzWR*{ dI8῭BU  mllϏ^ s6rss j5Z-՚5+W5KAJ-}Xցko|G_ 6h`3Y'^zeA@T!9-L2rPhZ|25hPhZ#+WAOcDK🗽{wyA&NȲ+Wʻ_eZQpOɬV+iך 'cmm F%19lsrA2d|Ђlmqq-Z==p<-l[M؏?{ڴr+PUa̙]Zvmyu?M|$uAIӮ5+KI^| * 92 NO@T"15{mhZo޽޳>T=f{W`4 O>)=4MyAt *JR9_!bTyv25Φ3^| )e2r2 Y^+վеhhKgk4-/*w!5rD';T޳5ӧZnec6T3o*Un߾݂%žy!r33j[b(V.ܸPɑTryLjhZ]ХDh@&17`JTtҠG2JKbL 11o^_˻XOЍ}鹭^ժh+׏ t;T cѢEM4ᥗ^bذad2:p`ɸIzM͚5yfj˗/ӰaCΝkSי?>ҥKhZ<==XYàԜLwRb:ڵyw2(Ǝ?ltB@RqVYeU? ^VVҲwoz2VygGE'6sQĩ nu 0mUu%$#ˑd22P_jry޸*V -4d窑J.Ս.O=; U~{۶ FZߵk+mP}yԞ{}ܼNO$̛ow v87*;w.~bbbسgɩWvfϞ >'IDD?cy㱰c6~1^ի}iF,Angdpn~XANV[c۶a[_ɉĘ.>̥PwI%ej[^A$ߋOSy~r<*O/R(dh2LE"iAh5djpVCϐ:`j_V:<Idfrf+VK ٻ7oR*qq.x%>Ķ ~|O "׶YCRs%j`ʯ*K:5 ;tITH]-zˑ# ۴'L(Jk7~*;;;MF^PT?s Fvv6vvvͳjժL>3w\;f˓\.io[ǵJB+EQn])яΔcHWn=z4[Tf d>f jnܻ|=:-iS2P5(y-TzU+J.GK~ L  G-QΎz qa.^,Xj k.+5E/o!Er23Q+GGڵ|5jIyzv ug3Ο*w??nmvݹt%oAfg5204uU;FnVYڵo_~Ԓ屮rjIfr2.dVH׎1cڡ.^{+~ݺ1C7ӧ Mә{3o_VMBNflK\Ivz:SZbJVפ5gҥK裏С]t6XN:닭-δk׎_wVZITd24iRhgΜs888Ğ/vE=puuΎMtR4Z9s燓Ç'..ٳ'2Zj~Zh5[n5ư7~IIqSZΥK-y "|Ɨ#G2C> ֬):S-soߞ>}H!!!Һ VGMI#ppp ##CZ~AkhժU&gJ;vvaggGÆ +xd27]K|JOh@L.Nw.Ӯ}@wJN˔e~ d(r鱴]ry N%٦i> s/(>:zE<s>#) 6ZׯYYY0Kгgb۷JbQ.pd̘!-2W 5 7}6tx9sG1M˖- 3QSҍ=%KşСCؼy3kI~.oʞ/11={#=˗V*[~`)MnVp #j4igժrH._LVVܹsjywq^' (Z-yѳgON>`g^`ʔ)hZBBB'!!I&_Iff&TRP]_ tڕWIΝMzYyM%<ӻwwlhѻLT2wmY Z7)焹&NO?-cLppIuԺܱcGV`_qeܹ.--1cp]iJ2hqu;>CsQ0۠)Sմ).dN߾ۗfq HvX%V;j\d>J%!uU'Yt),[ hIff@^Wo5 /͚5;;0c }b+׫>>>{e߾}F[;j];wP+߾} oߞÛ7o37֬YӤtkfȑ̛7,Μ9ÝaGk?l0V0|xYx1G%,,RNRS y8LXWr(7Ϟ߱&㥗JCV )SqrrBPRQTN0 ʧP oFOnL+CͽрJF&cgoOv^$*k"0ZMШWToԈZM}MqwG64 !|V99ۿǏK]&}lǸbGժustu-SiiU*_OئM4jX.der%[WooEQʧ4j֬)=xb<(ƃ+JO?7w૏ͧŘwu%.HZySQTbcW ~pw@AP7:<'=)>+[mSut|,iժUi S먃I@8͛7 /> '}1kŕ]A[g“G>NOJߵk9n57e+z׫@FJ |]Kn`.Gk3V6hZFEL޿pkUzMh5v| kV L'.}j`LMAu+1yߺ]]iҵKLhsr7ϞֹxyUV*j }%wrB.8dHi]7ҽ7}5n>>4|JחMr9_x1op 8~p??zQ(1FXz///Exi,N:%=NHH0ؘyAWEu|y?7j5m_:i VtRŬs SmR: вeKN:͛9z(Æ ~+Wv} deeIi[<==-P{S]}{>: Ҥ[7?_]]i3D_Hܭ[8En@VaEFz:YYy~j'oB;P֛1k^:mUѵRi糒Z*%*2נ 픥 1*\.'$o @ٳ\˻ޞfzѣS먩wm޼Ys^$77iӦի@.+q)icgGIH/k~߸w)\]`|T*.@J`bZtwҜV~FTVI22~r[ZiSԮe8AC^Fk, ظW_.Ğʫzu8fm<{ ZLwwB!Cp!#%Eĉ$Ʋf ZC5ݻJ%oSժ\[GͦMOoޝ <ٳgGG}dhk׮...2qDlBXXZPZngylK1ZGGGkƍGTTuLJ;NԩStիWAsb*sޟ=j0 t2U/^kV+?ϖwqy^۳kӥ.<ӧK݂utF+ }foTάZEI @eԽ;U_~惼r(?NȈ9sn&KPxŕ#G8kMvnB2|.$߹UZ"*gkp:vu@:4 ;!ThkeCRFvԍBߥLeBTn7Nzy47Nt͑oEMsrBae%Mu(Fk#o_V WMUaC^_`lsrE޼bIՕzL^jرh'Mb_w0;;]a6;{q ^ jhar>uG;Lr! ¯#UT?EdggsY>#zBuЁsRZ5~ަcDzgBBBpuu%11///~i/^,M2k,ͥYflذmk71h~Nkko 8{7+L<KiL='ʂut޽|ԨQޮ)<<<ػw/[֖ eNPd2Oqq۶ F7o/7mb̙lb_§J錽6_!+ޥ8}8*JBAJw>,vûdG4!Z!3#JZ&e29ܴ,xؼj_파 B啽{73gά0GNTTT[-<<3gvZϲ+/ȖS S7o.U}BNL(D/~>=69zw|K|`!hUrRɱR`P`eJ!J0 t?qTU$;GIzF&1woVk`o ~TY,6zRr2Ob|7eE>LT*AS lt?*kwRcSYꧥ(󎏪3铞@BIA` v)q-.UQE:RAtdzܙIfI2y̜[|ι={t0f=%[693zo_p ]f8]44fc,A-j0SE =_~:t?`믣C q0G=|YPnFa{cyO`Y4%p*LRh4=U,ưXX iq9qk\x/QEU2BϦ=xȏ}I\>|fMH Z]h.>PoE'߇E4dXFFF hki`m6,q,&f Tȯ . N>,07pks<|e2^s ~%6?(__nNpffBN*'Ud_s Έ::DŽyvmEsc}xZC FW@~~Ac"a"p_ ~tIgܹgt́R<DoOADl6XL&HdrJ( O* @Gv:6tth9<,{tO2 pĨ"D=T!<`C4f,_m/~_ @dhinĵ7-A\|8զNADi}B:j؄)سmD.˻lLQE !`ĥaҥطz5}(X?y*.>2ρ,1e6pA;} ,tM1}RĦM7QE !dߏ?%0  Ǐ\ :كPƀslV jQ]Uڋ`ߢh3.Eq/QE !L\keOfCyI1K0cb7$r9fX̂D@ c4x_[- *uN<\T"0ĦgAɏ?b0~X 3'ҽA*@  Eț7f@O?뺂;;s&rg  F@  00Q_s\V]c# mm`Cb $ĥ!97F!.{bT@:@JH@ U@ U@ U@ U@ U@ U@ U@ U@ U@  ytףyVVB}K X6"1ɈMM:'i(*ԱM4FM=kkK/!{$,0 FSSs)EQ|yc{:k Z*-CIB))PffBh&#Q*!!d]Bb ]N2 ؠ"## Ae![Zz}}LJ rLA̙PþKV'!Q/MT[855ŠmVׇs#a>_MGGq1i}X,FҥY&I\Gȑ @ {:HEF ^$0@d1 LjjhpCR w?iU&޴ ~ߏ0KPhbSSþYAˡ>!c`N,X5/tu(Qx)t'B?|,Lnz"/W˲_8h/VGBWV|v"0|ٲݯ7ZEӈͅz$HҌ]臎51RMbʏ#a$Q6n43)*fÙ͛qvvpx[H"+D…ːSKof\pkd(~?hRٷ}$RFȚ;ܺjᘏ=,ZCۉhhv&)) )hMHq㠞0H{k4 Ml"IG1V$i>Lش&ڋ@,MeTi^_ ¬e˒2>q| BYsCK~+X5YQ}o;Ҷ:H:Z0!ko3#@NuGcOX5 KkkP~/V$SytW/.f<_k\ j9}X ` ȚC^ 4h/1FUCq1~_DHRXVth~#G%~᮫iέ.XY}qŇpr7%HP)ZbA;Q.m&1G.FBlLXkh|>?!<߫k]S1֢vvp6רT*T1K`l = C~(XE(4 ʬDG<렻P{.=S1'[| '@Q_t0ef4x.jbp)GxC͉z+o_gWsc`tuRMG6z&591hǤdHiY5[ij,L HTu& dž|.9/z`K\[VˆՏCd t{HgQ;akT{\?PiZ^{m4m|½@Bsx D!W \A& ɓ&ISkQt>\dJk4a@gyl7*^ 7grm4ZϸT+#^ǽѨ55”_hxҎjʪCr 0-( 4E)Ps+@Qx2[h &h "H4y 9koDΔ)*}ו2_/HٷNn镮m] _E1u\ȫeM~%Gf_}`1?0yfosQ22"rJB @HK׮&Ij5[ǜ@ -#w\Ǫ Z;:P{סPk275!ndYl-{ >ROm γ{Txom1 ;3UAPƍ57=%`MmZ4'ODy~i "Gh0]g˲`9JU SJnfMnCey ^,/дLSSO iE^iҶA/,/ y^32,bO_ASwH|D"wa| DHer\};KyuxE^pNj]TӄͽWåh>+))U_& d>ų36_hҖchR3OH{akaZ^x#\d_ }tv^趽ͨ*۷oص{*M5K{$>ha0,8Sj UZ+SzJO]B\Plnޏe2Yu95UЌ+glOc6[k>y(4sA'іF&xv^1fܟz՗،M~i_j2z o[m{<ڋjo;6} ?M$(Fh eȲv`ym: Jݳ*عeƕ^݃nBWFP6N*,7q]55A[߽κ: RUCŧ.Wq w%h=SǠ>,K[4u^Gsg>c/^zkx8j>c\&@>t5Y`<5YZX55 Ÿy4ȲݹelX/o|3vۋ΄cm{;c!6m{Kc=Zq~a ּ_bT5'_kG|9,Ya=(,k)Ft9<~֫0n ju۩}bˁ0nˍ.JR!,؎nuQoÑX,.A8&ɉ'vYXڵ㸐?;ӟ| ku[j)f&B&9޷s'ML>pdySugy]" 賻yغ[y`@" x{љp-i/]UԔ=d(F'[UQ7_~gN M%(FUkExx)- yZk+\.8K͝O>e@n|ư#H4>Iԣ&gy/%gw/c½G? \3Z&^ĝ?SH$=+C$pLF||姎yoCP*]SXe#G8 AȀnokQ֊^{ OsZ^)Wxy 9P¤,U ml['<@q,TUgz^X(Ceץkj/ª4)#Z?M3ج5{U@j %YكB& >Y`ZVߣXe~v)_|\ Oă2,(7µL^p)i9misX IDATGYS{۽}E47e/V *z cbP*<xt{ҎgͻdbƚoY"LJO<(<q/˱9r &K|֥!^[P@hW۩A2œ:D$2RYvUv TH't/XJ )=E30xQ[]T$' !1񗈄$$&&!Ixa34t)T(*HeX,D*jyٞ#5yogQ~='bN4K|H N{љp.Vu0 )gp<ܟ'kqf tW\0$ cqSҤR|iNSl6X,f|QW[ŷtM%(6YXIMbc>eI@iR,y#]ٹc*eOwe9"QW߄̀IGcY$DWsh15?^$95=&M3m[Fs_Gc׎Yak "%MtyV;gp5U娫F@fq8uh҄V{3RiW>ݵ Oa,%8KXgeT:w >s6V|1)=E'sOc=2zf6y싦K/xHp۳s[ԝ!(D.ms&Krl67Ptvcw3#.>qkv?,gd9nz}1~B.5~( ~'n]rWte2.wF&4L{Q\*FA:9ߠGso>}w3̝Y )Xдlj]Q]DK܀fEbrH$ȤRg 2 2l7ʠ:iPW+i%;tG,yUufŷ߁[Q]xj4M9ǽ%S0|qyJPaUbTj]V R !#WSB3zsbOd< Mx՛u zM9LB|eXc1E ѺTj5U kbzTUO B>RN[x}߷G3w>?@i VZl`D&H4f@,!igגo: la<, Il,NFL&WMv}Au+}iIV#J֠RaZӟ22 6o;o=8y x m/*@ xLL:,ϫ9U-l *-QY{ħ(ׄ=˜`݃gl[,+L:ߴ4uQUuDTP#FF&4,Fy4hy.ՊuD4 fWFmmMHY˶H{GطgGʫw>$QSlj*hv8/”9"cljtVW_ĎJTbC o/8)sxUQ:}e]>uN/㭉=g`:aie6 {W *ea1rv_e=ܪsrz+)KTZ5լxFњ)ZEOx>^npdhMHaи&ebeyHŻD5'Mjcl(9KW%˕W].-59k7Ef_ rOCGY䜐:8m’B1l6&$̰ Zo5O(2{.I};QRz5f,.ra@;MJu|Ǻի];ϗe` JqAX5mA132S?b*РJ#JS =΄+W.x9kOp`1v;&qp }cSS+]qŇ]$ǤE.Aӹ]#Z4[RAoyOM+qh^ޥ JXis<&+PQv>$P?ez$KLː`𩩵 ]UB̽|Aٗ&i\ =jڋh:6ˣ*c'O `$K_ +]}mOEOŨE!gT?Onwncsr8ޞxpUe90 âf}^2eJt%./X /'r5Yߎk\YY>ҤBa93}\y lJ{B?z 5A]Ui7wý$+ qZUY X>w)G<,FG{Q-nML&m>?urjxr;N^ȚycTȝ5 M#}'BXkP % e60V`2'b31gFpM|xn2 6Fu:8:~]'R"rg쓮=4cDijtJoͻ];F@)b{jkjRbg_O[_ZHMs pVcI!L5¹' U0&MGeի&TnX+Sg_|iďɭ7⇏]z&^5Eg|HԔ3!W}%hF*) 9S@Uy qe+MP\r`3,&#Q3˂aX0=sK|a`XP߀845{E9SzɥS<NT 6noDruϪ۟G4NR4ʖHͷc6|U\Bzi)&wRM &_EG|6质聯O 67Gy$4Mq#F@7cތ:ȩ3!Kȫ?뚗ZmH.+ Įo6 -B YY('(OeƍE"XX*4~> MX,`Y Ar[+ фjh;څ1\d2tH"Ts?uu%`0%y{˩IUv-o4,x]ϧ9>MneqlH5 -ꕦ9~<àiFQ(b H '"sph4Y,(?w T"I'JLFǹsj*'<ǡ6(_̿흜ji4ϼE`1*bѸ~MDGw]<ǁPsZl9]\u2X>HM1hǤdHv`ڋ8\JRc4cv4qkа;)X$`RXH@gw!ðX +Lf &3P_[l0h?`B 0_ZOfvt)kDri*UhWs#YЎМ -©3(/2Md^k/I'Q6 xE\J6@N' &͊002 oŊ^kd9V CI=q"bݣGGlytTRiסG!0buykv}a؈ԙ4 %7NAtr?LYy0&?o08'rʑ z&V6L&3z;ЀƆzz,m-ضaDO<Xwu:K 2GplHw8&tS(5Sk|9{iC R;cF4& F(ՐW,4VɩKKQcT)))P'M4諫vf)$Ș7~|f~]}G=W'~qHXRD&w5Uw a7t`HcIlOhW`ay\xt5F % .lOfIᘸv˔9a_pT~9Gg$  hiFCuۤY$F; b4R)x#>K4hk48VTRpSw统44F4cDmSR1m\ 9^b4m^ Xy=^J5FM=?!󫂩 Ű7.>x-cWΪ8 ̓:5ѫ4hmBcmES=M2 c]j6oߍ7К(F…~9h,Ѫ+5`TŢ"X\7oT`Dhd ,H. n1PJTdbX {9!QW4jha & *'Nê'$RS3 U\hZ%MX6hZ}NFw']y9wְF%!c<HIQY"¨b[^\/W( +!K06LFX_/Q(0ᇑߗ(E4FM=5& < *'V%RP4 ج`[1cm-jw9jRd]yez:N]Ѧ)b*555k^]{w&i\|ѩ+5D4jiU 9T=c,1'۹ <9]9T=N]Ѥ_*!S쫀h=vYD 1 QSODEP{Lx+III/I' 0讻z>rss30.%C=a2΅X;N]Ѥ)Wu7oFCHDș:y2XDhѨyz"wk)_شZA[Zƍičĉ'#"]SD yڊPyͽ>659S`̙AsOѨ+5D4j^#`zXb8[ $e~43MGGq1i^#߫gh,@tTMoTQ_ZUmC mm`ffHrrjĥA=dRxhz"5rύM;CQh^))]i^)X_ss3 l:8gJAŐByJ &&:N])*@ PQ50{}@ F@ B:?[oWKr$%!+?,@^7ԶOW_+V5kȚ5AUֆ?^y%b_߬Z}%ssMT"9;nnm ,F#3҇ ֭Îk_+!vÙk+WB,b[og8ƍ^W\كz G7o;pRQɓ-AVC>jhG׿ƣG3kjp:ocVP2,zy ο J$B5xqf3۶!fl4hҬ,e{ T:xu%%IL%K07^ %LZ []B J"v46l,F? )S=OVPIm]_b{2huLXU0z\8|5g {~ b#~؄ 8aj1xt:4aPc5ʎ mE"!jGRV]~9 hΏ>BxtZkMz={u\"5'Ƿowo2f3>}Y̼V̻^+|3;Qy>XoVµu.eː>lny9U*7Xr%CdBe])|3={6A|ztO>3bo#mPJb2?998k%U(0曃GX<<`\. vz"XD6X"T ¹cPTa:mLӠ/iH: u3AIcP9\;IDAT0twZ$L j:zׇwoں`7qCqbNcިJt8ҺmzzO.:" 3ǎA,`ШQP%$@؈:$efr xgf3,F#,nق `\!f¨Ys'NDf~>޼ԗ"cpcǠѣ=n ;b4ӦW][̷B"<~kе!fwJHëWCO,4ߝwbڵ7B#֬AjN P.}!p5qV%$ a<ĥ )3d-=#L׬nzCnR Ƈ@bZ[!JLϙiIL&pF#h~L,h7 ݏ?v A(ݨv04s&(ƍ(`'osx_ bLơ'Y[7m]`m6SRXz9wn똰7vG:k?稳c0Q~@$ e`$%1Qurƍ \u7RW^~Zc?}%lA{C,FpAAD MC*byn1ILɓ@Xih@lRX Y&4‽k{87<Әbq+-wc"t:Eaa㮸w@[] }r$͜ kY ?YJZ qJ&:*ZuRx0QN(rq`K MٰaE`'K^|w`9oonm;ᬭK݋,'ӧ_hFXst9av܁yEEȟ>]86txa%Ӄ<Η^Bbz:dJ% 0o|~==( R cG|9lǹ޺kEb1lVj e7uc `2 }ǹNՂZe}M8 u11]ޤbGssXU ݒThmy(dj{$cIIvc*9(̯ %n'ۚs$8.CZa)+DH2:1cB>Q[:|:߽i~8T]zTk {̾}K¼S{ wD(:>lDm݊SPS\Wt?eG #}nlldV}lb(bb@4f,^2.b&/Zj8 uz=ðҵ@e%vJ3Z kM 6 nsj5,`JSbZ)NMn.Ϝ$#cX4dY[;mIl.t \_aXR<޽(;˹|/qTSr"u,<H<!QKȝ<eG")399] 0oCsU=t:b[x'E[x6=UG9iӰGؗ`k[ZU99IJ}=j0Yȑ)8or'OH6AQNoŘ9s;vr_+=$|9|9fr `@͹skxq,ӟW=V?0~C̺Vŋ/B6NWYP`{"5'wɝ;gb:`_9V]f3,Ai1wQB(EJ,$'xg&p^z(%`4pf?H23!CCh(+ oԠ׊?w:BWì ;uLX_y #qky?gx9 0'w=i !7 }-~9|j] b77g62cۚ5;0ILĠQ0#Cg<ǁ8D'O]/mWc#!- sᄏ*]gB{_{ ߾:JJJHO>a:qBLd!f 8Uuޣ(fW t ðDTU էn['S(pߪUAcUa7t9`0`V $oƤEpҥ!@ D+ڝ;!4r7B1k48VTr[ `*N|ӟOO?~PG@ 8/[P ?@ B@*@ QõO>С@*@ @*@ @*@ @*@ @*@ @*@ @*@ @*@ @*@ @*@ @*@  rrbB vfQ!!@ HDӻ*U@ ~U;J?5@ h< =UdN@ _2l6l2)B@ lo꺸8l8pCW@ "]vqz_g0&@  رӨ^oT*Azz qS$ϲ-{jZLcQ?;J0T4aƌfzEdl~@ :Ghmm$!7w0,+QQQ-[vcٲ0}GXU(F]K8S0()EII,τ @ twLf?~-S à ֯߂˯Ψ*)ϻ?i2$\45Ǐ'(@ tdƔ)w(bSøqPQQXU. l?Q^T[3jEBۗ xrE^/]ẅ́^/Xaڃ2o<.1Jy̞݈.Bb@ Ņ (-D"=ŠrG&b\]QQMv…r &`̘|\weHIQw96FYY۵$C~0\s|՞6ɓhm@*`ذAy3fꌪ8s^qΝnԫ>!Uee. "z=oYY.gO֯,|X͛`3!-[2woYVTTĠI: n$=dxeI&EC>z!8q`Q:9rW0t Cuu=;_~9z w0 acX,V47aϞ7nQUQQ7:))I((ȃ`Ĺse8ss͛0=WgTTK.2 n…BZsiiMoF%&Zq]{L8p9E(E-jEVkb545j466GcڤilTqmJZZZ  ",,( d`?fDꠣ<9y; ?w.`6Sl_Flcpf$YY^]V IM̚+F4N:;](,O wc>/d:,j u*HBsȑgŠ yىX,8ߟ`ǎ/ٸqֿ٘Lf-K'99nĊNn'C+Djjvr-6䫯?@O!\{=w'zve5:7,L*jj4tvEFFFm M\g_ = PlCU\-23iijdrHgRbw6BBn3aBgHB V;9M{I@R7oE\v $&`#6m;oBY24k3ݽjӫXu5[_ !p>F).DeJߓW(X~%pR%%\?:+ I==nT-etuְgOr,>!!vs笁̲evuw6:_r#G\\y)^h0ؾ=&Xt#G6zm:l?@kB8߷%(!OPS+ 7 {&УR;vm¾}gCRt:_jj~eL} Pj@nn Ybvr,&0>|6{{:ع3ʮã+&(zر>lϺrEÒ%T*қU\GVV0YYMjj=pBATTdd`Ŋ\a2;sHΝĩSJT7©SʵGFz՞V1p!\.y2M՚kfɒ vSSll AA,XPݫv5,*ƍLrڌFc"9mN3uMn:/$(.""ZX_Ԩ6jk M$%5Ҏ >>$$4f%R+yz:^^jβe.쎛L&ذa3ŗ/%e2j'8}w::&N|Zyĉ4669֦t=RR&RTT4ٝc69sӮT;voqݪxz;BB裳WhQU:f{3X>Z!+$$We. /PXx`4vP_߀؁#GWҥcWlۖATT6:jjz//5+W.T8z4/SQqw`ƍS>ܯɓqPeeUTU3̙AA{Oʟ8{+b2>}*g?ow WcX!::IVwN)[-tF}wX+*zԻ˅BGqww#--~ջk'<17XܯVaY̟?ǜS*G29BʓoZEn=M^^fBCޛ%B'S*go_Nk##[oK!' UB!4qFcj===|yF~$T !N>_ Ytg$GBBᤂX/}q%J!DF{nz7$T !i˖-z CD#VBAЋg|B!`P%BB!@BB!HB!pQOB!qT6y(B!0ǿWٽOU9? ~ !B[?[ v9>B!T !B8LcIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/kit.png000066400000000000000000002174061475757676000235540ustar00rootroot00000000000000PNG  IHDRFMzsBIT|d IDATxwxTJz$ "\H|U"W.** bCP½*tH %Bzd7uw% {}s̼{;@ @ xȈ@ @`q֯X?g}q@ɭ-֕H @ ,J P((@ @ XR H @ ; #{JJ3WpV2Ee&a~e44IZs`(7d_T*~;{.)_4Q7%]á nRR+1hק w7'ڷnO}hSklǍz#< %.mѽiJ|o%\@jg'=] i8DJkN[ԵRΟË;X{ʤo`ogKN-sesch]+e|<37v6cr_ޘƬ. r3F 1c$ܧUs? '((,7"HJ aRoZ#TB?<b\nT*5 >YUznςBY,;WʮI3jpWD^~?o9sP,[nLy.,R`gt7gӱu3<\;Bb5kTe?m:"9 ώZP(IspՑǐZ˾#߳-7yTq[VTgh/.  \ 븥()2%~:GRJO]lw"}2vXwxP(rl&&ٹ4]HF~Md\Ӥk`+xa|?zz@flqE&pL<wW'~r/h؛nIΞ=g8~. xGxbHWvڭH!8ЗHp`bEVF$^Gn[/<^nJOŸG.ṯ8:JmRYYR_o'_o's?AX`ʮjDe3x9"7/Vb O_fo%vk4c ͥjO#iMm;k,6>EG4av9tff/}6.}Yg-\Ǚ:;؋R i/E@Pca44r1VM`_HǫZVu[[<3w? +_X @S/ƏxR-(<±3:0{zwt<\(((Vb5 PKxfR}.P5eXJRsl7[I4&KLm"p%w?O#[JJ]mIr214pɣ,juVTU+O[Qj"1TV2΅B•\ nNͮ1po>~'G{@B<OwTcΝ{z߆\BNn3>YK.#dr?JGeÏn[쏾̍Txo"v&kd2j5bHHN˖wbL ޞ( N`W[P(d2<ܜȔ%ųp8Z6լ1$)m=ڞ~;LLo#'kSahv[qvTʊ+(F7@ (hZVU/lZ*^ uJ;U;ꥯشr kFBԘц}.KNL/O (,*f{P(Udz`wlɩ|ߝ(U*~YRJy:7ͪbe2hTJ5Q+SPX̡W(,,F'B ~@89)p%?W1Czc}陹x7/'CIr WcKnN|8} ]_Voe ,]Xi(_BMʖy79S&v}2rr=b6qR:ެ76t~nEp`#d2J~;gHIsx,&iֆeӆ$e¯us >^3u8 ݫ~̐AQ q \Kޖ<;&\gfǐT:҄5ئq׸q'=.H3?5A̅ %_s޲D2^ܾ@M%Yn OW>_Cwn%33jyEi?AiX=h۹Cw:iKY){xjDc-H%8;9PTBS2r`&>x4X Yql}o7<Gd>={{ru~2} ׁcgp-hmiBd$%gr!Nsounɱ3׈i,e%3*~,1q r3!Mv&уJkoCg4}ڑQ:}kˠP*P(l[1!>u,R@ (JWcTp_d H`n8؈4qH#tֱ^.|QR3r}tݙw_FSM\ZSʷciL~NP(+}`P(I4#* Z),,.HToU_pƨ(CFsF2JuO"!]tW$JOoH;LYծteڠglir>^MX{s)A&HH _F D ,vdQ߼W:7Є|'SO!^K>$&grm6q"3x5v!Mե:> wqgW;CP+6\wWbgk~5Q\NRmP(:mYFVYyEV-3(IFiJ}-ϓ~*MH1RWjqqcChvQ sޕnҌ;6oYs\rM<1m,0ۢI89HSstl.9tBIn؂RHLBFvvIw`(DUƚ+JiTFS; N;|+Տ) [VvH& KWGR˶Ȁ:!q L?#dЙ#,Que$Vj֐ן+g.׶5Dequvdp8Y󖘜Ym^1C$dz OqדL#2i!}׮U5!}AT}: 2iG8p).n(S*Q*#SK^{2le޷*=Zͦ {lv_P{Z$Έkҳrv;f^5t~ehvQ J?H߿_αI3+3ČRx;G$:GM9y9ߓ"vHX愶hDhF<ܮnPPXLFVnJSUpL)1$D[~'v~8U> 47DRvf>U*ht ՞ңĔ,\sɁF43F6/Ն%^^~V{BSWKWkѱu{ڀ\6<+oVm<ҡ9-5ɞ):>ay"?NKWY_CjkAM}r35;6oRUF@ff"?w49OnPZSm ݂5BJVnGGڣ17H+GI!P2bcT{S51q X _0a[ut([5))ͪyO;?; e3&m,1 Te⶟K@R_\gc#|*çu5)C˕YT\glƠcwdpU3s^j%k2V9G;FoWjn&s31[7!:>/-`gt7$C`5r3E86DPr1*OVgGwgP(U|^cgkĂ=_qKQR~e)dЎQ jʟ_/qV E87p 8!i{!J̀\FjF.9AxRaP񊎕_[楖Z!Z:oeaB2Tc㥂a1e>ܮ %~~'+ݵώIȑKW(Uj]juҰXٌ2]ֆ&eg۩mYᘦU!\DrzL떾 _jɡ9{)H#;n<ܮ[dji؞8Ϲ Tj:6a]% +hfJdFPGxTzm ?`8t+7R-ў?BҽcސЃ!7QeҲri}x._hY+kS)Ydc##onAi!T=1>LƲe `…ڵpΝkbBrrzNжm6EE6a$$8+q}[|m9 3tnz0 JOz{N:_et¢E %;;OOO ,coQe٘]s+x{ңG*pw/6[ً-bΝݛ>@mkk37gϞDDDlTZs`I=fff'N 3i$T7YYYDDD0k, {{{|}}ׯd2^az:88ˀ0a:MilJh۶-_}'O#pqyrf1R|7"Ź>w[wASwׯP_'m tٲe dggk׮ ͛7nݺYRͅm۶>-Z[nDDDVYp!dffh"j5cƌ1)R(fq|ƨL9t{0\.~ ::45jDxx8'OW\W^Lv=gz1a X>P:ncU>#5bx2StU7^|*r?B*#"/K$44?hMHHpA%<ƴiWpv=FSKiTLTː!C<}^cƌ!;;HN>ͥKhժfbo1;vT>|8O<66"rP?`l޼B6cǎ%##C,=n8\Bll,L6=z-êUflٲy޽oǴiӰgݺuUSboյ#GeΜ9899b 7n{ѣGի~^256;煫ŋOӪfo|}׮r7ݻgmؾ=.]i8'|((c;Bػw/xxxDRRvbܸqvM>p'11{账’zT(;wsҡCT*wܩQ=ڴi7n\~Fy%uةS'Y{r!|M)\hP^x3g/͢gdd /Pe%槟~sqEf̘M^c0[OV * x ~wT* ??uoV%ޔꕂw11쬤_{ 6VsM6hq 7nY<6ͻ].cf̘0o^{ J psSM6w]:~:۷gĉ1;riW^#nnn\tW^yM6BVVk̙֬3Ʀ|M6l؀ ǏGR7߰b ֻ2`ٰalڴ //Jފh޼9[&11( v4nܘ/-[?yQ˓ bU׎ٓcǒGTT7oѣ3sLkw3/uDI9LAAvK 23uCaۗ~5;ѷo_ #G6$XZvvvi/Xj@.X\|/wyt۷okbff&w(7o 4%'OW_>7Ύw}GGGёwy{{{QTwwwsU`6cԸqcFņ شiS'Nƍ|I#Z.]… o\Ec*'?ߖǻ2cg6 IDAT%atYY4Jk\Q(dd.]2ش&1i A_<<; (-d⶜9@?;Ь;rpp@VSXXH^^vɓ-[\bi6lؐ`iԨm۶yKڧd"Μ9gذatE~ᚊh1yd=sWc$''+ 4js=tܔڪ Y*dƌdeٓBC5ӝ;.e/FZ-c׮@suF/ks{.$Ijh@izG#Gf׿EƍYnG0|NsS"JlΎ?P!Q\\,  Ϗ}~ Aח2t!Co>V\3?~|r'iݘơێ_ݪ9RGm=P?v![0vMRy&y`%]C7%***FʭU8p667$XCvw4lؐ~ѣG8R5nܘ8(..ޞKyW+AAA8qBr͉uƨ,OK!Y`j#Gk,Xi0>|/ٵ;j(6mDbbGy@nݺŌ3ҥ Ǐ4J~7Ė/ۻ_Bǎ\ (A%IIN:͢Eg,VBevR ׯsY#мysn޼իѣܸq$V\irDMưaê 3%]vw||Wd2Floo駟`С_`<ٛŋ{.{weŴjժN$M80nAV=܁l lvM3=`@ixɚȉ+WӇ"k f6@ Faa!{:p I6m`M4aڴi7$)/^NӦM͛(Jh׮#G$%%3˚Mڶm[lh> @ǎ ԈX+i >SRSS dʔ)Ʊq~!}xkbm?Y?\Z$g;v,QQQVU-Q% T8I3:ߣc U>M>jm,:wAŞ=< xx| X>~kƍ. $m ПwDDD~˩S7Y9O>$r~m۶%-7]v5x3k,,Y G)XuЁ/0Mvdƍku]?/",9Apu-&6֝TGy$>ٳ/HeGjz:ub޼y̝;W/%L%deeqJ%DFF|r|||oHZS` =>soߞlΝ;B[nDEEI<;w?cǎr%1bͫߖ֭[9tތ1_5ҏ>X+iioΡCc8::J/888paouzmF[Q@ _\pzKl 8r~4(@ <9r/re|||8pE<@@ m۶qq7oΌ3~@` H y-F؟@ 7_@ ڎp@ p@ p@ p@ p@ ^u[@ @ 09&M^61@@ @P[t@ G8F@ G8F@ G5Fϒ%K-f͚5E.|5ʣ"pwwg& lr&tWV[۶X+ݤ2}ңcƍ̟?@߾}Oh߾E:DTT'O޽{,ZzK'ݒ%Kشi.]"--FΜ9s$[˫Ҳ}Y;Ꙙ]Th q$Bc =z-2ml}#wAgvZz)j5 6$//[rN:EV,.ta&L 55L;wfԩUv /pM~GӧO'&&+VlRM߳gϲcZn-9FdLJ~W.^HӦMd8::\V)**drlD: zr'~xu: {N7k"th<5݃ڂgBJ'ΠARRd̙j @RR͜9s"XO'L.]a޽,]<t:w%55;;ӏݙC'N$;;ӧOWٳٳl۶ 8>:e˖_45Lf ' hNݔW8.+JT1BS[ugm ʔ={ 6 ݻL&7`Ŋt{{{d2fͲD8FXΝ;?[[[߿?;wl`Z݌;͛72b/_NJJ o&#Fwߥ|.\Hdd$Qvb 8sٚ...զ裏ԩ_~U* .`Ĉk׮t5)Ni mCCCK-z W^ՕƎKFFSL?3o<N>g-Vڳ"oߖkqNnn^^saPd:u*/^d4nܘYf}vƌcpŒ٢E  ɉ˗/ӦMYnyUm,|g0jԨ mذ+W}au2 ZmNiQ~>V}ǕG('][*~䤥I=sv8ӞeI~}Y?߷n^Bc){L\z<sL>(̞={P(xxxдiS`kڤOo>رcԹ(KnCxx%4ڝRs[[?YRQ3_/Kdl;7FOUנp| b6Ex,>@ vtt䯿QF,]/裏M={Xt*ԆKC͗|l;::lH~~yvЁzX0c 1mg6Z /^{۷0>\iɮ]uKu1^l'ԜzyJ*q3tkxyakgǣGq'7L1 8{z# C㱔㉎>DDD ~W.Oٶm1VZ#B%oߞ_xIMMe߾} :jAW4hg޽|fAHHMm `֭m|g$$$H1c[n5L%m1VŚ[[[,Xɓٻw/呗|d N6߿XNnڴ3ftX|9]t_`ԩr֯_3g䣏Jkٿ?oY.ܶfԒ g[g&ޥ(?|MO2ڴX_x̭7m3g2u1m4mիy^%"޽[tfD ʤIX~=ݺuC.ckk˰a8x V9EM4vY3emքRY\N||<׮]vPS\\glQ-?~d7YKhX9)s*&iھZ"zLJwL&!uW_V*{MƓO>)E$%%)E\l۶Hi` fjHXXzl̦@ >DDDX[ RT#GdȑzvrfϞ-G_V\Y;vFC/_k$+;}tt4*JoGXcTCjS]gA 0'U pc%TCFk;%0^*bɒ%F[VsZEeK9" C1j󠏍+|}]I8F0rrr-%,,҇kvvvm8@1"#"thUoZcק&'')Q=6^ ژCU6UUL]58[_g7cB hc$amǢ> thUoqԈ@ p@ p@ p@ p@ ؕQ_(ݬYojE;qm=Cunfs#lJkٴiEڷoomuCɓ'w-⭷Id6mĥKHKKQF3g233򪴬g}lu1z&Nb*fB:)t ۞1dfV|>@~~>7noaժUz*J%muAYܵk2fN8+ [ҫW/^j C0a bРA >>dgg3gu9K.w^.]jpٳG}]RSS3}P9:qD9}tΞ=KZZ̞=\ζmSPPYly&ؚn '҈Ot+Cmt$I eEֶM"}Ξ=ˆ dx{{s]@ C&ob v튽=2YfYL~SbqΝ;;={2i$VX?鼽=F] @P1H#ǏΝ;&V7cǎe<쳌1˗›oɈ#xw)((0*߅  ` ϠAtݻw3p@5\\\MGѩS'w~T*.\#h׮]jpQC-eih6ub{Kرc`ʔ)|?~`͛ӧqvv&88ؚU1VٕgϞ4~LZ-ݾ}['} ==\:梬P<Ȓ%Kcԩ\xӧӸqcf͚3fKf- >00'''._L6mسggݺuUֶg¨Q*La\`XSښ5P)\ANZ*'wZ¾AEE$ő=>ty lϽ|nՅF%9EXW0/vmxΎO?'!"N|j?:=FᏳgrR`VqǟiߎhPlc/[yfΝKTT2UV|ߡ[bSLQW n999ѦMrss1b8;;ӣG<==кꨨvA6tT+k/k;2qD<<}ZSETT;wf IDATF6x`كBÃMOE[&=='|}Ď;EYJtۧO-)fXjͻtޞ7Hpw % RI…*,Wi:Ka~OTKhos>$rRd2ͷ/G5)9ãAdžM@}>@ vtt䯿QF,]/裏M={Xx(':tڵksӧ3Ơr u02X价UgL:9::VС͌5zA8p;v`vjpEwξ} ÕڵKZTW-yj*~!!98 hԢERO^VAhF@W~99TfpΎG$N)oxc8%q3g4-} @ꫯ]m%rsNyiڴ);w&((3g+dT)>*}/?Ojj*`СV jW2ΠA?>{/6 0BBBطonJmk[n婧B.3i$V\I6'sذaf.ZU_wullP!;,*wLJ3up;GGr(pp PloҁfG鄄g̘֭[.SIm6⎑-ӦMF&ILL`ҥ2i$zYm^j,f֖ 0yd݋?yyy|`5ZG522ɓ'֭ydddf ͧM61c gQTT˗/K.L:\Y~~̙|QiXRtt46%5[;kBRJDTbck h}TMYl~N:_~gm3ROQ^>Κ}nzzy>1gd2֭cڴil۶իWO|KQ+..&77W]v_yB׌Q )ڽ{^|}},@ 0I&~zu\.֖aÆqABCC"S]6iDeؗYӶm[Jer9\vM:F||ϫBOqqN%E-Z`ffg#n }Gq楦JyJ j{''8Ti~aƲcݲ !LXe2Y+,J/WK,4o\ fرDDDaNѣGbbbߟc]^?J;{rϲb]{93HXXH b|{̐ڌ)Rjg^{5e|J akX֌M[BevV Gf#Q4j}X[ו+B.m۱v:\ӆe+Ccc{X>zw[n7<7b8)|nj6O?tjKS^ /&=RRRφ}}kk+|>_Dq%0  Db)ȹ` d`n"?Htb$ۃԩS;k/:H Db lȾ˓>Ri;|Ny$'CK0:G|rV쓯}L4|M8?O}nބq[Vo(nwҶ-!0Dnn.J%$ a~~###l! A"RBCdZ ǃ&q> >dE#_[$Z>R 90_KtߋնvHMMUF8s ~cttnJ8p~ddd?Hr5)ZgϞų>?OP*ػw/JlՈ8… xֆ7ny}uN믿Wbzzصkyn޼ 6|?_|Q|nul8rN\ֳM$+BfGkarT*,,,`||/?VuU>/W45}"8p(=s >ŋHIIs{nXG8p<8x Pyq 6ىz 7n\SN Nǯkڵ cccDRdet:^u=>F‚?8@{Fǂ m.)\.z\y-K axq:t[nӜyAb^_0 ߏI ==xgD JKKm6v455'?I2{F#f3r#Nu*wC,s!b`D"Yo~H$lܸFbYWWDۿg?ۡP( H=jI#׋GyǏdB[[._T 6pƂ 9(|2;S2 ٸoho[<8|0^xLMMpa)) ;vVEqqmH$`&=A؃Q第,lb\X^X48uQ__n<׿u7>F,vfQQQ@V7o{gg}JIJB!-v?!=P~ߠbjhi<u*+Bx\.LaL@zA~Gsp48T)m"b;EsށOTStYo?nt+;w|{?}SC./ß}+*{7c?)>Cw8Nappԧ>?biDD PE#<t:t:QRR={8zsn݊~n{NIN0bזbX}|JJJ[omgڵ+jƞk` mLyxWQT0}$׋+!ee1kņ<貳B^-59?SPi=8O Hw | ÁwC:/aOQgALX Q|6X,o} |L{O;tR999Mp |[“O> p8F{{{2)("$f >NXƍE]-⛥%%%pD,[nf^vwz-|Sbtww㮻|:z;5_?ZxNfdC~8"8v80o"Rtq>Rkئz46@&cc0nN1'IIHNKruaH700V#G //}SO ;myT#L^Cuu5*x^LNNVV4 AkUUWō7:$zxD?SNap8WNrt:Xspwc``>(>C6m3,<ŃK0x⫭  n R % Z-=ι99 H$8?{8/<) sӘRfɄʆ<^z%0 aV9qvA_jTtKjJ0 o9R*"//iiia[׈ BL&??CSS1??yhZ|Mx;v ~!]6ر#bO=fffjP8W=sxm6׿׳xW8-~!OZ0{9 .2-pB*X:w9>HN[Y.yɋ9eUawgD"+/x7K/_Ϗf#χYCraaa* 999ؽ{7ӱm۶eBPu]ff)>(^}Uر6 2 <~cӦM\va٨Q`000Ai X_9΀_-***?ytIIa sPSBZ[VPȕJ b053v[#̚ 6;z>|^/rs`Z |h}D"%=ӣۙomD|>_%/#o/~cǎo&;N Q]1|q=!nݻC-'\d2a]|0lygΜY7 lpwoVD Zi9c -ٳkQI4s6outvvCP YVUVۇrhMCKχ7'PiȯMӆϿoބ:U;jPC|oˏ TZ-*])x_~7DvE9>o}HK ƩS?l1~Go~܌_}/_˗~8UWWo|+t2s~E|GzcL2K'mK0jgN8,eD׸^'_0/"9E(. `Ȕ rgl#๪YiCﲕ!Sȱ1=~,s xHp ]ͭs^_S  l|oI~:hѥ /^X)))xgþ>/vv8< l KA !$/p Aj#|%N,7ޑDh_ ,>`| Db >m(t keDXJ#sI^S\F"uuubASB7KD\J{\2 &!#bu(p$b>T߱zųX"GRֶ^7ǯ/yxkUGMAA1؁E" Vp$%D\7AAAD,BAAA   XP`DAAĺ#   =T.[b>X\\&ٍ Wfj2~IV&צDy|㱉`'mD JKKf!j϶/YjqZxP) r/%bmh4ȫFx'_ `0#СC!;ydx׬g8xQ A&jT*^Guu5t:تqlFOOfffAEEEu}}},\.-[vqِ***w)ܗDˇ:q ِ;|n=-VdZlQ$W^a"?F|siNq![tP__玎bx`4a6qD?\,[DBKK N'^T"-- P*aikkR;;;aZQ[[߀o޼yjl`~v(J(J8arr?j5@*]Y) 5>DK].7|N \AZN !wjjXA̽PQ$ 166FZZ\.磭 A1BCC(e]]]LݻNo6\.\"ھx %% V& `˖-P0L(((,,,tB"VPP"H$k!χ`@ZZ˸z*@Pȑ# PRR»kBѐ&}?с yegU|A6v;wNJ<ݎf(J:t* à غu+100 ayfTWWGE>z… 000ӉN\p/_y`@MM v{䕤p $x5R UUUlPϡg===\Qەk6C_HlȍXV^g_r. ^X, r(Y|#F<|{CGGmN4m G̠@ 4.. 'A|fl۶ ^혝ŦMR IDATp%LNN"///b>%ͳɐdlj0LhIJB!-󡷷[(͛Ӈo_׋aاx֥" [ pXg!S(^ptp48T)ŐِbJ|혚ɚ;vvl5r۷oͲW# сyyy^BwJ$@a#>mBBNF2:LKKæM8_5|P(~>_[Bss3L&4 2so[^tA%qs Cᶭ)0cJ7j&Bҝwz1~;R8f. lȍD[ww72 {/űm҂+WVf߾}!#!RR`4o⡇͛7,Όx:8ף;t .,49)FK"H-lNǦwlUFff&4:>_3;;& 7nCܸq333]-hq:a3U^R D"8v80o"Rtq־@lc !7nv3 Veee|uH" +F6mu vc~~C bzQ6t:j8NV-^HkAVV^ Ʉ>l߾=b9 M+--]O} Xǃ4`\zWjn䣗.|.Jq J! _21FdCn$뮠t⾢]]]{ɿrr`455|3 vP)("2Dd27ހ\.5(EEEfbƍ#QVV%*P6@WWW@jfOO;wX̽:8rll cccb[,LMM~(|-[Sv8zz!z\H*b,C6zfcSv܉F\~=d ' uWVV}w}cǎE[5ADRPPTpkNNjE)j0LT"^Qrr}:l|l9Czω:ˇ]W;S\\̋,eZp'2Ld@$R 2g0 dJ U,Y[x*5;>/>\!r/ۭ76iS^^gd[mm-[+sssCCC8zh؁p8D`.\O28 K@|A8HK(J|m%BZgáJb"@6_Kdϙ3g"WЫ?F"2?~|2b5!|-8BPި>/!r#QiaYKWPW:>CL/| ѿcy.^!_ Nf}"k"'={B6~lD0  C" r#Q했>|#[      uFAAA{(0"  bCAAAJ@PBLZ"ϱJUU՚e466]f!_[I\f[KTXu+IH(D9y*x%/kG15!kSp\>4NZ9m(nҶ-IFyyy!E|j϶/YjqZxP) r/%bmh4ȫQRSS|?|>|O=d2Yߟ}'# ⅆGhii$%%h4l6HI~X8NRDZZJKKT*Öֆ9ARwvvjy&&''j(P*P*p8$~jT.S( k|×:\onA)?BlA.dCvn{DcTTTd2٪AAGCC(e]]]LݻNo6\.\"ھx %% V& `˖-P0L(((,,,t8[+BZAA Hk.??iii˗/իl0^RRB#G7446@II Nj FC>dpG6A%Vِbܹsp8+>?x v;T*q!T*0 &X,c֭V+͛WQuܹsxwсl<:!4_XV3χD"JBff&`rrR`˖-⛛111>.\N':;;q\|^o#555(**W7=0הJ%3VUUAddd?arssFmW·+ =o!!7bnZz}r  \.z{{aX?333dYIWFrM'>< E̠lqv\xWB}|| 67o,>|^L >= .YeeP\: B3snAGFJ /G(ȆHUVVp۷o&&&Nر]̨fY|߾}kQ'''QZZC!)) F}|>ڊ|0ڪEba06χBBNFa NYOOIaӦMt|>( v Ă-r& { )ᷭ^GzzzŒ`pV 1~EW!OJBλxRVVY)uF6Fح{n۶ ---r ,`՛o28ҥƱcOg~vH "1Gww!$/I]Xis)RBͫEJ+އ[f):MlXLLMMit| gvv>L&6n܈L=qfffZktf6#rEEp9pp`jEfi R}ajdCn$v;, , ~g0&gЫE+F999xa|Evv6|M\.!6{׋AAVp`ttp:ll*uwwEZSNNpUL&aQ(l]ii)zk`4ǃ4`+t:Wjn䣗.|.Jq J! _2qU2 r#v]wM-M?=#NhEHU~n&r9,.ە:!"9 H$Akk+L&x x<x^rQSmZTT)l6X,lܸ1beeep\ eӉ tuuf`ppiiiعs'{ϭ#066^_QQ*bWׂQu1i9n>>[քlh$-ِn6M۹s':::`4qD+(DH͛!Hd ۷iii֚[ "~)((Ν;anH$VExj6|dd J%H5qݰgo\.vvo9>/|H ???^IIa lSS` j]*Gn`X+p9lȝh.Q a׋2 6+Mŋ ш/LQ_1q/6-P(`0p=`Æ !w~V4*7.{xА9DƿjgjXnn.rssÖlcǎ۳gODĢ0YÇ-skQI4s6outvvCP YVUVۇrhMCKχ7'PiȯΙ,dCexjl6#99-3с]vazz}VV**Uф}kqq1Z[[#>CTD|_]]L&N>=|l9Czω:ˇ]W;S\\̋,eZp'2Ld@$R 2Q\( 0)0TNrgl#๪x\pllڤMyy9W||-͕!=z4@8+' RåA Xahh ^|%D%T{G}-سP%1 r/%by̙3wH՟x#BLV[hjjZǏYFظf:GH_ ߭T{;dCn$"M56kic *0"V'gU"w,+k7_O[VcMT䄿gO݆b/f|AsX$dCn$q҇o^   "֠   uFAAA{(0"  bCAAAJ@PBLZ"ϱJUU՚e466]f!_[I\f[KTXu+IH(D9y*x%/kG15!kSp\>4NZ9m(nҶ-IQ#\|C&<1??>.'NF|E1[uQ4Mflk|mhW!w]-V6F=H.v_kaffr:'ggA?ydzR{U ( bqjB*Bף:NlՈ8l6333XXXԠ"຾>LLL`vv. IIIHOOǖ-[X_s8{lg;_}Cl>l+DB-jvvٳ###JjH$y&0::20ֳN>͗ڷ%[tP__玎ٌ %%b"ZZZt:Jiii(--R [N[[PWWJ~ ՊZ|͛Ve`nCTBTp`ll VRʺH~OP7 'z| _rvBP]vr}n VۭW bz`z ###h4ؽ{7j5 n7$( ģA2 .@ff& Ӊ~. W\m^<GB ae˖djL&t:!HxW_+((@QQ$ ^{`0 -- pe\z KJJP(pȑ())]x5hȇR̾<貳D* rCl;wcnGss3J%:Jałrlݺj0ؼy3?D\BD" `3liiowy?-HODl@/V+C"@R!33099)^e^͘G} .```Np._ 7+IeeeƍIdee kJrؠ222؟C0 zzzHMM]+mIɷ ِb7V ^Ͼr9  \.X,HIIax_܈ꊑB[\l6CVCRavv|, /A6bEfȖqv\xWB}|| 67o,>|^L >= .YeeP\: B3snAGFJ /G(ȆHUVVp۷o&&&Nر-V[[ hoof[.ϟ},{5{^XVZ'?I( ?hmm X2y|P(P(h@&##Sgviiiشi'F> okKq\hnndF={rHOOTX=0>n B0Ưtv;`*II(y7WC*+cֺȆHuww pXm6ʕ+Uoٷo_HHJrn,jP*hhh`# HsKRnnPtwwjERYNcӻl6۪V#33SSSlĂɄ7b!SOnܸ®Z8*/\D"AFQ\ssp;ZYZT8k_X 1ِd7ł 2Y:$j#aT*a2`!HV HD׋AAVp`ttp:ll*uwwEZSNNpUL&aQ(l]ii)zk`4ǃ4`\zWjn䣗.|.Jq J! _2qU2 r#v]wM-M?=#NhEU%; SSS A69 H$Akk+L&x x<x^rQSmZTT)l6X,lܸ1beeep\ eӉ tuuf`ppiiiعs'{ϭ#066^_QQBnX~Qբx`rn]LeZV0qn# ِn6M۹s':::`4qD+(J,.}3={1?? ^ݻw#;;{쉶Zkn%;wĆ #rrrp}AՊS<Tj5o>22IJˉ1 pn^W4 ٫ IDAT!|M>Q>kp:_65aP֥bzVAeI` R C~!wmD[(A[[^/`0جN6}zxx/^d'tF#.^0<'xϟ-ǑJHOO޽{W]!o\֡!!!rհ\-^Yee%*++#kǎ!/da͚>|8lw^J!fy3ׯc ^2:ϫ)3`2co/nNj_3YȆvnlFrr2[gv4V+V+T*UDF bF}nhsrr:x)uuu0L8}tmG|GzIK?',v _Lqq1/㗵kזg0H%(.BFqQ0@TP8!bURSPr!wzj6(//_ɶZd7W"'pѰp@/dpKA b!΃2 pg(&~{ePPJ`CDllvI3gD|Okk+)#W 1YmEi?fFccek{@!}M(|^oT v40ڬ+(XD!&>T߱m[5Q=!weD[OvS`DAD!v` vKIzn   X#   =AA   uFAAA{*]AF1ٿH\kF<*UUUkwe|m%krmJT7]lچb/QCc**M$:t"qzL> Ϋhjje@̗վDׄ@Msd8!jxXKt%J۶>'md2رckf3ĉ:A7_-A#|V=zMe@SY<>dE#_[$ZUj}CllvնMD|Occ#:D=0Z0 !>XVHRzTWWCӉf`ff TTT\ׇ r!)) زe kngϞ "y}Ot| Ç֣bHVX͎j`z177teP(qƪrގӧOG$G‰HG xQ(ZZZIIIx<008pRRk.-"N}T*R(ʰ崵annuuuPT睝Zo}o޼IhZ60 F?v;J%J%099jnGPG1|\˅ B#t9HB6Zm^+*z!xGׯ_GWWT ihh ðmOff& Ӊ~. W\m^<GB ae˖djL&t:!HxW_+((@QQ$ ^{`0 -- pe\z KJJP(pȑ())]x5hȇR̾<貳D* rCl;wcnGss3J%:Jałrlݺj0ؼy3?D\RW8qK/ajj V{}HA$ jA~~>$ T*233[lu܌ |Gpt:ى .Vb0PSS"y%LIdee kJrؠ@$`AOO 77kv%|Z#)9!!r#Vjٗ\.``B{{;)))l333\.JZgϞ HOOS- Ai\].<OX^!X7ضm^/1;;M6ARҥKD^^^r}>kK.g!`٠ja2P]]шeBl_[Coo/UPvg͛7 ߾&>SCðOO@KEVY=.&{{BP ?L7ipR4ȋ! !7n(,,\155 tww5;vL&a֬~o߾5^ #N$|{cƍؽ{X*Eba06χBBNFa NYOOIaӦMt|>( v Ă-r& {aV >iK6₱Ƈm[!S(`nnLt_<) ;bJwHYYepZ]ِbnX,vXm6ʕ+3o߾D=OAA}X4pzz:rrrR (R__НC4H^tӼpSW-- JWRt:eV->b$|,}L&lܸzr vעlFVy9J%$ 2r8ՊHYՎ)ȆH$vX,X,LOO`0LX !WVRRR|;TdeejA3E۠Vp80::b8NZQvx")''YYYz*L&}( 6w=50hiiAAAA@J0^ `O4_[ ׭|ҥ%R) JQh>൸}!ڮH:?uuu0L8}tmG|GzIK?',v _Lqq1/㗵kזg0H%(.BFqQ0@TP8!bURSPr!wzjcr|d[mm-[+sssCCC8zh؁p8zQp=^(. Aj CCCe@ PL.'*;k *ِ;|.˓>gΜV^S\FB;bڊ@SSӚ?~|2b5!|-8BPި>/!r#QiaYKWPW:>CL/| ѿcy.^!_ Nf}"k"'={B6~lD0  C" r#Q했>|#Jn   X#   =AA   uFAAA{*]AF1ٿH\kF<*UUUkwe|m%krmJT7]lچb/QCc**M$:t"qzL> Ϋhjje@̗վDׄ@Msd8!jxXKt%J۶>'mIRCC.ny/?'uHo"ZG:z(Px|5|ɊVGH|DÇJqِ;|.mFF^uz`TRRZo~xW`,.hPYY{ H$A?ydzyvxQ A&jT*^Guu5t:تqlFOOfffAEEEu}}},\.-[vqِ***w)ܗDˇ:q ِ;|n=-VdZF6lO>W^ypݰZhiif?۷zӧR}@BCCQx`4a6qD?\,[DBKK N'^T"-- P*aikkR;;;aZQ[[߀o޼yjl`~v(J(J8?{g֕1lcC MB4mnNHj+Mڲ/byj*JbFQhV*}WRJԝt$PÃmlcblb|p/o1`b_HHܟ buuN׮]FYx0 1|Dq9}/@0x|>`:%uSj(jwRu 8ܾ}PSS.j|`Yۘ?20P(E__$8J+Bꫯ,&''%۷ a|>\.pִh4p\X,BA _X,Zdϓg6a2`0=>} wM8oqq###v.H+&6&3TBJk?eЪ܂j( uux  BR7߄ZqEcc#:;;y|>pfg~d\'OPZZ `7}eppeQ\\B HlL&ZFee%tJbnݻs 0>>;wѣGFO1LjW2X__;NF⁑XR&|0== Fqq1=i_Ut((,|P -t:?J& & ,btt033׋">܄R$˂$_1 q d@ii)Ο?i(HH!ۛͲ,"HJ^1XI{<={h™3gV8NԤn,y ~:. XYYIdHkbL5>lnnҾ&h%66Dse᜙AзàbN8o:nf'kΝ;Bۖoϯ\r춏"BdVVVP^^s! 3a._I(JɆ*ljGNf0 aj@BPg6==wgΜd[|(a~ ²,rjqe~p(++ծlHq1Ԟ턂aYZڤ |m ʂ\bmҖ-cC=[F5Ff077`wꫯ{Y arrАM+W$ $t `{{o`F+NprB/ْwpOMשHf#ޢrT E]~GQYY ͧё$|-\.իISOױ @"eH(cc#*n 6Dh{`O}>T֟\.ߝHmvVA5F>zz;ɔ0a =W^-2bF~f455!aZ MP^I6zh4APV͖iMUUU0쬠9 itp`hhH%! 0iUUhv劯, _y s\HL.\rdd>@5F>vCS}E{'&&/nS|(A(CT^wl&BAP)d2 —_~H$h4 R)ijQ TV+n7~?^/_d'htbij1119== ͽ<{p*VWW㛚ƿz\Wr#s7i?`hhghe* P'A7ϧ`ll ?NH$SA AU:ÁB}}=Z-|>PRRgϢ.JuR(bAOOJJJ!PUU^{ :Nrqh|eAmjQM8F Hx˲xbEZf& I'2Е ϞDwq}168xT P8._tKqA4ECCL&?Nӧp=~Bp޽{ @@Ɠ#yTVV˲82 :.\@KKK@Jx]1o\NᭋbCP/GW-_ Fuuu]xg---G޿ܹsI+ExjkkS5}Sn^:I!eX X@4aPCW^iicfKcP0J+w{Wf613'v:y& P8Ri< >suuccct666ğV_ZmxpZyHXVW_]ʅ rp͔!-~>G'Y-$t9 R:"mj'QP_;|m/$DKL.CEuv-qB@_eeQuE;CKj(Rڝ4ݎillDccOuww%V?ׯt bG!P(8aqqQ HJI\/R$k?_Ivv}kP%1 v[6O|gi3<f$40P( uHXTCan8CP( BP(lF BP( C# BP( r⡁BP( B9BP( BxhUPnyLU j'Qߏd@+B0uIKZ95J|-_m{!9iHPP*w/ŰǏ#|3 c~ᇢ:A7BEHV]~%Ҳ),{ 2uK|MhGHI9P8wݲަj> o??pP*0LxpyG)_O?=jES^(dmm} IDAT |(//G{{;zԦQrǃilnnbggсfgga۱eQPP2_$jŋ/(ޗ!>10'' v'Ql!j1V3iZhZ{. JKK0??wO{ $m't7o2}K@ }}}uWVV044(((@$믿KE: ! U* RRngdd۸pB¤8|> H8Nt:>0:9T*T*Atڵkh4`]xwT(|Dq9}/@0x|>`:%uSj(jwRu H`bbwhnB 8ݝI(Ir]011+P( ,brrR}{@QQqhmmM FA(L&#nfX`Z!'=l6d2`0=z)>?}4ロp"FFFO&nؔPi Kcc(QBr 0֭[>7088J7|ja``^qޞIr;;;X[[s_~\.l6[&͢P(ח@> f3d2j5*++NS ~ppvwŝ;w0??P(qܹs=B4~dBGGV+ Hh:th45J=6>( u94Ǵ }-WURB5FP^^ķL&,Q ^/gssJR, dth{{EEEx!_O)HH!ۛͲ,"HJ^1XI{<={h™3gV8NԤn,y ~:. XYYIdHkbL5>،Ҿ&h%66Dse᜙AзàbN8o:nf'kΝ;B|(~moʕ+n(2sP(~w܁GII \.OyB]aq摓Ff Àaz~'z!3;I3g-j0 ߆k{aYp\j|2?O\rjW6i$jvB0,-amkwn=EXLblGpwl6V~W={,099 hhhHX&͕+WGbT:`W_K.e$P(W= {7_"%6F{"LJz>Y|(*++v4:d7|˅R\z5i:677ZL x`llRL&C 6Dh{`O}>T֟\.ߝHmvVA5F>zz;ɔ0a =W^-$(]SS V+ |gZSS#Bz{{%۠h :B!ZѩSUl9TUUш)\.΢+v)",KBaLMMӪ*_; ber9"!2r=*PMvM?/,MLER{/Z-XӧOFFQPJPr)d2 —_~H$h4 R)ijQ TV+zQZZv `YVU:4혘HH͜ zzzG=8ruuMMMhkk{^n嚯F|/Gmn*~ b(b(ς>UU0Nn~O?~4"I"@T:W~]zٳhjjB]]]:JbXӃad2TUU^NĦ\j4>|yyYPjZkb ,@ O'%_-j0͇5A1|M>)( g~|h$ h4英'0= J6xOlɴv[28(`2q>kii 'tݻ0 d|v㥗^\.ӧOqd2Z-qoNZb߸[4B ^4ZٿV]]ۻxZZZҒ]ΝK˗/ՖT֦4koK/t$C>Ǐ<>h8 àPP,FǠ`ЕW$mlcfOu:;2Lp.u;9x<}*p%lll`ii?AVտjڔSaxx8<$U*(E… p\yfl?BVhpD9-ÿs>Β0HgꈴEx[GA}p򵽐9.b 2 uVTYp*ı_몋Pwt P8;i5i؈lKv e{{;~bqqׯ_O9N*& bGZ "%8aqqX';H%y^tI~~G} ba"wBA5)Yl>gxxwʩH՟\F)9jE```߸qmdn#YpRGL_X4#TCanfcH9Q&g) U>w6*'|- ڌcT=1u /u 3nQ( B:,0U|!MuS( BP(JA# BP( r⡁BP( B9BP( Bxh`DP( BPN<*]APիI}%B?9[ikk;v9WYl$W}M+H6!5R|8yvhnACB(|y& ]* IoG}2kb!g$Yp%-J_/!t:X,hZd2e8cKJJ`XVcii `051?CQ TDK"$f_Ni?k但T[Q_%S&`$B¤j(RnzojiObQii)>|?^ᅬ.@YYp-׿d2***;ڵk(*JGlӧ~z/"^4BN0== \rCKm%x<&vvvhjjJ8nvvv[[[`Y(++Ckk+kp_|EkYV}ñ( srpHhwuYc5X`IJ,k|w5tuuA&j_8* hv_Ǐƍ0 IR͛NJ-E:+7]YYH5b!044P(ĿWT0 JJloo… |󡻻߀O. ǡ564 \., `ggP(!-bbjL&8 O=zSSS|0~i0 w}7EN>M\5)5PR])VTCaHۭ[o `pp* o&j58^/ى8477=#XH$N|O=x<=?2)(Jח@> f3d2j5*++NS ~ppvwŝ;w0??P(qܹs=B4~dBGGV+ Hh:th45Jmmm dsi@uu5iAHZ(GAa$j(lMӡQ*0L0L`Yx^&J$Y$!ZNVCT3 i+fz555XYY˲`YpxB. $̐M㊿fYH$Af=Ξ=h4Qlmm̙3PxN'jjjn7Z <[XXBN˅vV2b1؝4Ll677fi_X4 E"alh9²p ۂaPf1'7i}np-, u5Y?bA5F҂wuuvnf5ΝBtwwFGGm˷~{W\9vG>%|R Boaq摓Ff ÀazhZ>ԙMOO`3g_5b`oCl𵽰,A\.hZ\|\'myy9D+4c{p\ g;`x6i{6eA{.F6iKږ-߉K #_tl( v2Ξ=!LNNVIsʕKKϧ@(B$AAAJ EJ -y .4jXl6흀?!%S.l^ϧw#Eee%n7FGl8[[[orPZZW&M=Y__&qWi"PTnV Bx4r}Ej 0I@ ׋ߙL ٿ:$j@pŨV &a0؈9tuuAVcggkkkX__:{40PNmh4XYYA]]B_)*lHkh\.fgg30|]}}=q;5p8B$bIHC9)~ZUU%]kG> WX]]ojjB[[v(|0{9j;wSFF!FX9P qt| ]OOp8㤁I2S鶷CeY+`||O^ZZ½{ Á{%LĦ<;$=&^d2ƍﰵ q)G>)۴w?X7.E1͡P(#gqUWW:.^xೖe׹s.W&jkkS5}Sn^:I!eX X@4aPCW^iicfKcP0J+w{Wf613'v:y& P8Ri< >suuccct666ğV_ZmxpZyWhnnNyɿ![.\͛7S>`KQN"Bds>Β0HgꈴEx[GA}p򵽐9.b 2 uVTYp* }G UҵG(TCvԤMcc#|/-E\~=@8+$O38ʦ G B!Q e@ PJz%YJk]*P8gݲy>Ka)#WrQcƍcmdIP_;1}M,bhFP jis!T`D9|!.$T10) v[۴ZmX`TZZ?y|+Glӧ~*ۤGMyP5LOOA.RF<@GGnXEAAZ8_|ZV/x_p,Jœj(ڝDݲtVX&,}s3'"d͛7S}K@ }}}uWVV044(((@$믿~> " * PT)322m\pj|||>} N't:T*T* VWWt:q5h4\~.Rc݀xFO8R>bnpz`<SU0TB5q;e R"n㭷ނL&í[uB99Ir]011+P( ,brrR}{@QQqhmmM FA(JH&fX`Z!'=l6d2`0=z)>?}4ロp"FFFO&nؔPi Kcc(QBr 0֭[>7088J7|ja``^qޞIB\w$Agg'>|'>B HlL&ZFee%tJbnݻs 0>>;wѣGFO1LjW2X__;NF⁑XRT>|0== Fqq1=i_Ut((,|P -t:?J& & ,btt033׋">܄R$˂$Dҩj(J9B7REfq_,H$ҠW VRgϞE4(pj7SY^H, #_tkiiAmmϻvaaɚsAPǶo=+W)$d@#'If30j| SQQ!3;I3g-j0 ߆k{aYp\j|2?O\rjW6i$jvB0,-amkem ʂ\bmҖ-cC=[F5Ff077P(xW={,099 hhhHX&͕+WGbB,BPҡ6[!I]ػi>:)lD5[A.xjaz>Y|(*++v4:d7|˅R\z5i:677ZL x`llRL&C 6Dh{`O}>T֟\.ߝHmvVA5F>zz;ɔ0a =W^-ja$ 1;;q %to^FA0  jENIW!fDZSUUF#r0;;Ru0 çSj_Á!D"X,4ØUUUٕ+v쳀|er9"!2r=*PMvM?/,MLEo/˄tYg?CoooJǽ[LP(Y2L r/D$A4R4(Vn~^ieE[KSݎi,,,`0n}ك#WWWԄ6 jQarv2' ""B,sZ%_1 $pI)d*(mooÇ ˲x VWWS>.nPrł C& t:$6@U˂PբT]p8@ Ӟ>}z9X,g~jVl> "kRLAtep|?kE#npFF_g=85*? 'n8###Fhhhd饥%ܻwq8w^΍My<TUUwIz`Hdܾ};e%w$q9Շ...iB@i>_5)w%-Ν;w/_N-MiN͗^z8&I}bUs3<cy|p A^]y9Y,A(+I^ Pt0wd,TCH]vsssx<(,,KsUҥKZNj)?൮i}A4_9%Tυ rp͔!-~>G'Y-$t9 R:"mj'QP_;|m/$DKL.CEuv-qB@_eeQuE;~t P8;i5i؈lKv e{{;~bqqׯ_O9N*- bG!P(8aqqQ HJI\/R$k?_Ivv}kP%1 v[6O|gi3<NXn BP( BUh`DP( BPN<40P( BP('Q( BP( ( BP(ʉV#h\z5Dh /GWW?X\\ӧOQPPш'xP\\:}Q6}R)jES^(dmm |(//G{{;zԦQrǃilnnbggсfgga۱eQPP2_$jŋ/(ޗ!>10'' v'Ql!j1VF,믿w}̵5>0wp:PTPTXZZB__K,Kɦ7o 2H%"Bۛ뮬`hhPPPH$ǃ_{XHE: ! U* RRngdd۸pj58|> H8Nt:>0:9ouuN׮]F"=a k$H#e,x ?UC)Q*TCW[ ^(bFqq1z-d2ܺuQYYfC&favvH+++M4 Ir]011+P( ,brrR}{@QQqhmmM FA(JH&fX`Z!'=l6d2`0=z)>?}4ロp"FFFO&nؔPi Kcc(QBr 0֭[ney7088J7|ja``^qޞIB\w$Agg'>|'I[]]sw0 b2 ү$e4οw:0#|MRA|lnnҾ&h%66Dse᜙AзàbN8o:nf'kΝ;B|(~moʕ+n($5 ~(,,ŋa0(Y %d@#'If30j| SQQ!3;I3g-j0 ߆k{aYp\j|2?O\rjW6i$jvB0,-amkgm ʂ\bmҖ-cC=[F5Ff077P(xW={,099 hhhHX&͕+WGbB,.U ۱K.3JJJpeTVV//%P(6[!I]ػi>:)lD5[A.xjaz>Y|(*++v4:d7|˅R\z5i:677ZL x`llRL&C 6Dh{`O}>T֟\.ߝHmvVA5F>zz;ɔ0a =W^-ja$@W_}C0dBgg'N>_W*)(J+^F`0! ՊNBfˉ*FLMMravv6 i0 çSj_Á!D"X,4ØUUUٕ+v쳀|er9"!2r=*PMvM?/,MLEo/˄tYg?vv'̙3xC4 H9 d0\.KD"DQ(JISrmjZvzQZZv `YVU:4혘HH͜ ߟ" MMMhkk{^n嚯F|/Gmn*~ b(b(ς>UU0Nn~O?~4"I"`*6>|ݞ,@ 'O`uup8aE)%D"[1nPrł C& t:$6@U˂PբT]p8@ зOzo~jVl> "kRLAtep|?kE#npFF_g=85*? 'n8###Fhhhd饥%ܻwq8w^΍My<TUU%ޏ`ӟȒGU}v6KI|ro]\\ "x9|f*հ*^xg---hiiIˮs%˗jK*jkkS5}Sn^:I!eX X@4aPCW^iicfKcP0J+w{Wf613'v:y& P8Ri< >suuccct666ğV_ZmxpZyWhnnNi/\˅7o|iSWW948D>zo|\%aiT;񶎂k{!'r\z@dr*ꬨ&8(T Lm*#-K..Bݹ˥kP!IICElKv e{{;~bqqׯ_O9N*& bG!P(8aqqQ HJI\/R$k?_Ivv}kP%1 v[6O|gi3<NXn BP( BUh`DP( BPN<40P( BP('Q( BP( ( BP(ʉV#h\z5Dh /GWW} +++PT(++믿k׮"u>裔mOR$P( Q^^vzMMMM nckk ,ˢeeehmm}-/Hz-Պ_|Q/CR}b8%aNNB5 NnB:+bf X_EEkkk|` cii P(x)?p$d͛74I%"Bۛ뮬`hhPPPH$ǃ_,HE: ! U* RRngdd۸pj58|> H8Nt:>0:9T*T*Atڵkh4`]x0 1|Dq9}/@0x|>`:%uSj(jwRu E,0r(..[oL[nz" ˱qb1lll`qqLP(YN__$8v|_yB!|W`Y˅0 |>\.8CkkkZmh4\.X,BPBZ6)5 L?Iz\4__ƍp\GvQRR"JgHPҤ||g`6!ɠVQYY p:D񃃃{.ܹyB!Ν;xGL&:::`Z@F#NFx_ T*(ϟglkk" i8jڃ\EWQHI P٢NCyy9T*a2`2,FGG333z(**⃟M(JI,HB*ZRDAAs188ȿ/((sUSP(ٍAi\,"4lٳgF1::-9sjky-$tz><{O~~>0PTP(l"ɬ=Ij,_q6.jjX|9vލ7޶CuUWW'Ő2k?;E/mmmhbxpMRӻl6ۼ';;&FǥXhk~8vF#222u֐SOFGG1>>"Ӱ)+@z8LONp`jEvI1bL}aՎ)$Rv;, , ~:JKKyϵC|C׃a9Ijop]w!%%%`Jt^?!d zoJ\.0==ͮVlp+Ŵ&Vh4]4 ðJJJ8m vQPP0 %v3TVxikq^MΝ x_$=H,8) YRG%0:n)T:`澢[[[yf9Z01JKKÑ#Gj IDAT3L޽{D~~>_hXS !M 2H*466h4߇D"tjQ]zL&l6X,dddD\Fii)N'ot|txxS3;::Z3sW988A+V@ee%bd2(Z0{9 WLej2v:SҚO1RfcԠ.] Hqi"ét8<# ݎ˗/χBĕ+W ɠji&dffb͚5\UkQЃ[ _Azz:\.D"Z-n6(JAroU2Ur`fK}SSSAz?ZP(Nք8'2Pj2aݰL|`rUi뿺ˬ4T #ߏo-v%n|>9st쬀vt__N>v >}:(p-g6jq}Z(v܉^\.d HM6;ȑ#aɿ.7.^>C9Dv4,77aw7ykݺu!W[[QYB),, tǎaiӦTI0B0_Vx\.$1 RT*(5@^E ]kjF#R|:;qyRy& 0zB.6nfKsϙhnnƍ166>v; LUPע"466F} a o۶-7lш V4KSrDhd={D".pu)**,5jkfEH,BVYEr|>$I*;Tv_o د,-E뾸_.Db=b6_MYYmg[uu5dw&''#:ObΝa'n(Dz>XJrODH_ H($KUnk_$&a]"-;}x㍈ill;UbOĈiǏ/|eĚꄰTւ㳭,0:H.cJ*1"KbJ=wZp6;c +߳LJxPK%znJ!sN,0:DguB!BHĈB!QbD!BY(1"B!,yB!Ba⵭I?mv12~<9UVVrdD;fo(y}E\yǏ䂘re}a1$T8\E/z Â.1*~D9e gRDAA D"~? CmJJJhf/^ hwD}sڹs'5ֵ|qy᪬:Q[Xm-;':n.w(*vX=)%F8<^x={m7p}Q]6󙙙h4x'ot:z!l۶-~v87\My!$6 VbVJj$fttt`||W\TUUaŊ0&&&t:L\mk. ^}z_/Ή.%aR[dl#ӉG?Fjj̡(99&E~Ffzaa} dBLG $^߿uuu߁44496n fqsgAXDkT ZHҰ9s &''ad2XVTWWs7:/_J% T T ÁA\.sEms:w:}ek0t,T˴PkpQ -ո !,12LHKK!pСD(++ oCVtbjjBٯCkk+ ;;r t… ݷaXVF|>\22r9F# W\tl !;\~~>t:j5>C{{;a<̙3b/mo|H)fA,GZatۡCp8wnԩSJضmd2|>?ł2^===x"V+|>˱jժE?8[vcصksyyydxGrP]]$A3B+V=C$A&!;;022"H`ʕ^ğ:u OqI\xhiiɓ'g|NCUUz=n|%GFFybW[JHXYY&Ej{χ@nn.X۹nkJArJ?HBF'VT*h::NMMMNX,8$ ,t2 AP(_|Xf T*Ui'dR l4.Nn;^>/X7Xf <011˗C&ܹsA^^^z^6<$l6(JFZ mZ^fFB}hhM6ymM^>u!W!n#pX'0,~t~Rȋat%n(,,ڵka20<<6fݺuFuu5 6mu9qDlٲ糨gt477_F^^g0 \qT"!bBw9Q~~>0PTP(l"ɬ=Ij,_EHb0t {!INFIy<8&Kn0:6twwp뭷6_f p@iii7׶l29ӢHR8q^Ɨe\|Lk_~9\GBH⨫C[[bH5uaMÝ"ŗ6Nc4{QX<\.81$Ğ:AmPTp8@QQՊ-n֤jvFtuuyΫ sb'%A23@J(ItMA3hmm͛yh1"(-- G3<0 {믿xŸ=~8v;t:{BA 2H*466h4߇D"tjQ]zL&l6X,dddD\Fii)N'ot|txxS3;::Z3sW988A+V@ee%bd2(Z0{9 WLej2v:S*"2atBl6;0 tRDK&F8<w:p:`ؾ};***x(++c_ZJH*((X,xVEee%J u U\,FGdE0嚳NΚ~7hB@~~\⣭ qNddy'rJ$'vcj| rUU|>Xf%HR8zω8:E\8STTIY\/k>ւ㫭9l1X"Lr|>$I*;Tv_o د,-E뾸_.Db=b6_MYYY.k;۪%599y;w ;p-E!'R72 "*.OTw⻭|Q(*vXy7"ަWߣ?#"Ff?,Z?ˈ5 .# ag[Y%"at5nN5\l 9pUbD=$~qqA;{⭭mv,BWcAVhÿgCqK3.ݔB!$X$at5n5 B!QbD!BY(1"B!,yB!B<ǪQ__w0\$E6U DB*++in2WIrK<Ͼ".pǏsrAU9~־me*.עK=aA} D[fӆHT "}}鐗ӧO]4ݻw";h G\Vܹ Mz(֮] HKK /_~9h9;vO?߳gOu:p@":&^4児444XVbh4Z *J誑8`6сq\rPUU+V| ØDrr2233rJ\.{!~z :'.("vK1n"j>F9KN'=?s3"(`tLQɾ@Hؿ?}hhh$''v`0l6;s<[ B" f_KRj@*]Ι3g099 6@&ﷴj|2FFFT*(nvHRHR8 bddw}7r9@,.0 gkk\^W ^ӉS (X$gZZbn-Vy/gdBZZoHC]w^UV4oRDI<d>lr-Ƈ~Ӊ .v^<$G a`Za4rʈʐ0(((\rA;VPP^Hwy'V}d  خgΜs^xik|CHa_57#=7e9*P #t:1;vNT*Ŷm pqX,aŋaZP^^>?p\իk.۷/mp!|GhnnƲe裏RbD/bZٓA~~>D"d2### V\ES0<~AII mۆdD" |zFcc#Ů!d…q6.\{0lL&vbMLLرc0֭[CN=8~GbsOOf6# "Yz=''r80e"bx׾@jat)nvccctV!GGӡ0̜$j5V^{ We˖p:f.T{ARA.p```EEEfW+ZLbZVENNa4 iaѕp^O 444v `J0\U*Z-o6Մ|ܹEb1Nb  pT2P Hq馛Nf+=7oNH49r8rppWXJbdhQ`rt-d}C6IK1RfcԠ.] Hqi"ét8<# ݎ˗/cpp(//FH$•+WN-[@VoZJH*((@MM r jqmAT RxP|ʐd70[w]~7hB@~~~"8G[$'CɄN>_vf2!Wa>,`$R)?Q رKpx<BӱZZZ}}}8}4ۡc0pxYlV}3j׾l6vyXayf,ȑ#ai1V߸[{{{!$ HѰ\]^ TTTDTuօ]mmmDe 0^;v]MR%yNԖ|[Zq0HQhy0tvIJMl&s2aadJ%, x|a6.?g7nV+V+d2YDWB^N+5_UU߰aF#<6\ZEEEoCY}qtq*_|W[sb "YEzdˁ ]IDAT$e Pis}1`T~H-aR|6eee(++mњ<ۋ;wC喢Lb)ɉ@WExPHxqP'P;jksւ (VILqD[,wowĈџxG|#Ǐ_p?ˈ5 .# ag[T{=at5nN5\l 9pUbD=$~qqA;{⭭mv,BWcAVhÿgCqK3.ݔB!$X$at5n5Ζ&B!xE!B!dɣĈB!QbD!BY(1"B!,y*]Fn .t*++\F}}}-7jksk[(Su\sBW!c(d5n ys\vB'#.Q<*?1W˚Q[b5>Hp\_.]9c(T=nrlN#R( D"~ J$Gff&>SSST}Dܽ{7 웫xEoΝ;9c We-ڌjkі?9vsQC1WKMPDM}}=u,1 /ٳl裏bڵ3;Hj*v|;#qH$T*~hgϞ=a ba7)/Ħ!tttjB,C`ժUPTBWٌʕ+*X"s]]]N'+Wmr /^e89pQD1[qP1Ybt:qQ|HM 944&FE?b1J%D"._^ LUF"N-tBQWW@CC 99nfwqǜb*hhh4Z*BVR4rΜ9Ilذ2}V՜ ˗122R&FtwwnC*B*p`pp###!bu=a87_[NNtj@$1 .= 2-e7\-4vK5nB{8KL&Ұ}vD":t(233O 6m\.0p\D\B~A -܂i|p:p`Cr`VF>+W \ш+W0==0-+|zD";!?NZ &`>`v8s K[[.RE yP-Vbv!89y睰8uR)mLχǏb WFOO.^ χrZjQ%ΖvXz5vڅ} 0Dx뭷̜ pa|G=ˁ4WV+{2χH$L&Cvv6`ddDzʕ+9?u駟ɓx"҂'O>N*zJR999e_ ''Ĉ&J!\M ++9>\-sq2K䔔D1NMTBѰ$ t:t:N'X,HMMem1>t2 A0 L&l\.L&b_:'ˋBbIӸ?;N.z`7l6c͚5x\5!x=z`\R0W?Ntva@ ?`әF/bzr ƞ!KU /_(IUTTpk׮d0ΚuֱUWW`\'N}˖- .{>zxCBSZDŽuMF'Qֆn@RRnV3߮Y p4`ԛk[l 񉳩tp:P썥JRg3ԩuBG]]BCʬ o)qً"9]f6JNl.>0lL&vbMLLرc0֭[CN=8~GbsOOf6# "Yz=''r80e"bx׾@jat)nvccctV!GGӡ0̜$j5T FH\ns !᫫J\Áazz]h2VjkkiMZ999hoohDWW i$aѕp^O 444v `J0fکV^㼚;H,{ X qR$:J&at)n7tSЩt}Ebͼ?rIab#Gg Յ{_ښD&9JM& wuZ6 >\* cW`#Jt3bŎ]-χ3g񠴴:NӧӧOtκf3Z-ミ/S'x'Nj-2HG N%wq9܇YBHˑ&2ߵa oy{^֭ x$+,, tǎaiӦTI0B0_Vx\.$1 RT*(>0>.55#@ɂdY^f~> |ZmXO&mÆ 08x`pkE %Gd)IֳNY. WǙ"NY_mm6.ω>_d"dU,>C2C@aUƀRQ"O(*vK-nuڔlvUWWKvGkrr2Doo/vv"[BO39$'!\Boooe@E*@!U\BB鶴w[ /.X%1P U9noDMcc#)#G%FDH?~|? .#/P'z<m/^gQ(IԸE:p-URW_U"XWւa]Y =>{ _"-;̸8vSbD!#tb(IԸ%b8[B!B%FB!%#B!BȒG!B!dɣĈB!QbD!BY(1"B!,yB!B' Cʂ*C!B!B '9 +1 7"B!xDB!B"B!dALbDc4!B! B!ĠH"K!b_*~mT*҈#'GG]w9B1xIpr ,m*xʒYb//8s w}7~__x d2:t-H'q9$mqw?[8vw?Q{_u~adfdlB1 RbדB\6$:g/bBT@[nۈkozџ'btt]qf׮j&']̔Go}{㎰>wQkBxv`|o~͛7vC"ǭxwߝ|ho^{ 7X$$8=࣏>B__z=\.=~*˗/?9Ξ= Hu֡J{… PTx衇p8| rJ޽999wĺL9ط4HIagsCR;=Çӥa;?GG9󟝯 7dzj=zj=dS=vrDH$BRRQWWI۷6mH$“O>u֡xǰ~|{ڵk& ={='-܂&ttt ??㷿-l6022H}{MNNbAqqqD+ؽ{ ~DBsBs:J 玥effF\md2d2RSSs8kB_t#&n7V$PVV5 TWW?)*+W`2__J Ӆ_);;;cR;v/| .++ & YY3 3=W\RRR?O9Y~%+z ݀fsv'TdddUUןvϬ&ji'G;;FNǾwt\ɾ=$X;wB|2$+9)Dxӏs:g[w$Ë/3tFS`ӦMx饗 ZUUU/~Il6M7݄ 梲o&j?gggcƍػw/Lj6 'N㉪̇vlK?-%+| O>YU%E`zz.]¯~+|GxꩧBm˗xz)_\\ ?!//~ڂH ΞZxI$ ֮]WnϞ=xGo|* >lﻺPWWg}]gN3<{vBCCü' v=rg44 BKöm%ы?m' @^/~ȑ#a}n}]l۶ ? f jkk- x C"Is?8q==x>3wU?`0##fu̱{ppz{pں0:jfoѣ'12b0G\ZϿ~íFٳ^BW)A>v= 8{֓P!lذoKN˜_}k/#5U<}vW^yj<f~?O155wnق_}}Bz 7}v; Fr җnŪUvtݻ9-s19zc~{#B! aÆB-ii׾}!?{^K$Iع^yok4xooK%FdAVZcǎE}ٳ(!B%F$j2zqAjE!"Q3}'!K"ֈ+#ds.=YcϞ=adN!rr4x$ mذFF#xr24uB!&#_(9"B!BHĈ. !BH81rTw0 B!W^yE*ġ~ѵ(1"B!K^"]p!B!1Zu !B!K;yQzE!B!$1,F/_7u< B!$s #FCQA!BIC=FB!%7͔OIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/midiCCs.png000066400000000000000000000550321475757676000242730ustar00rootroot00000000000000PNG  IHDR5sBIT|d IDATxw|TUw&F-@MԐPt}Ų*vu}⪻Ϯ u]YEJBI$^'fnf˄d&筼νs|rϕ"##5@ 8!@ ϖ/y-S; @ DUE 5NY;19@ AQN@ :e};&Npms$㸢,z|9'NKMß^bZmNgһk_߻b^3i&`f@ 1=5W͙ĘFWs;عgK΄Qz$Ƕ(v w0eR#{ud]h u0IaAޟL'hkYH;Gp,,%eȲBdDceTFmYv$zy\6c^\}ijnp}׆;|p,ݍ!Jl] :ɽd?Z~p޿1:+]mkټ+l}Mѻ/}{ 2G3sYRӲ( d~tEH͙FZ eȀu bB\J^|6$IL3n >j?8}zk_y ݿk˾rݥpqA>z; Ћ% /fȀڞpC6FzY#LcwɲumzD[Pʪw3}*rݎԎd$OH3gc7;xSU[l8-}? xjUƱ!z2yB<֪jxZZ?Fnvl633u/=/=}' q+5Jk}t.{W"Â/n˯ZB+*ٝu #" p5S#̈ hcLw̞2wIj+ 4$LD$F˜hM۱yWGp;#ײ9tMܻ`Q֔c<*\4fG_T Cxkxf>m?'_@ZU2a@^LQnik鹞(?GNkK x9t K'48m/<ZGEQ_C>ǯ'b6T|{MR9wrKoy|o΢1fz1OsFq +2;gk_!+F[RVɖGپ8 '??#!fs*S9\=g"hZm\Ͼ%Eƿo?kRes [ޚZO CAu⮺kZߋQj5~EiyjmCuuٓ4( f)&aAX+,M9x7z[V-)떠*Ygٰ]PY4{ńst>V&!aPo mت+i;k^3tZ}*6.cp\ ye ձ3y%-˞U f`w}zo61aTLʐ=$ EUqEl%Y5ӿMհA-呷(ڌGG?/'0yfbw(L`z63pdִ*m܈aH| 3#kŏ=9~2Ȳ#Y5j<ƒ9}㌴" ёkΩ"TVY}V[Zn]ݮ~awnmܳ%yt:aA<Zٖt /ٛ~l당vyWSx ,LŜ)H Y9v2+#e /~gS\VIډ3  YVYnNʧ_l$E3uКc{7_q!G:i+:dN7\v>㢉 1ܠ@^=?? 1gK~Ԃ)XUsdh>]3Ҥ7NLMAq(۲[fVj^vhW׆SsJ!ZS?v+kL$b&3CbׁL7ݕ:}u׍_azьmN(.7!sh[XHP {7z |aqIeddYfԐXvG(.DUJ+sO6houJf˺9,ԩE'70̐=I9e7 `dA?q8v*RNgΣU=,YpPچP^Icl2q.5po(FGÈ$IͦFD@UUfNΧk*.NAg]vQhdAc~k<Iԫ[s&FrÊov3WihiuhluwMw76TZZNP Kcޜ ĭpTfʞC׻ku˪}*)#ٸS_Sd)r ]wtLENn k{J o;3z\зW5M巵y6f EQٱ/b ~Z8| aۯwq7hîinumѵ umŹ\mR+'N?61n&ixPTB5{z./W?ǭna }k ZH"Ã))$-,?đqKp͛aA􏍤ΚMH7A=IԓIc_&jť{"7P@k:{.Ly!2 ˫IC S.?DXH8H瀷|wRvfRPle,eǮ5?T$̝gQT2;23HQI%{ƣw\ܪјаA.#sQmw`voJ5u!l]B*jW'Ȱ@dYfck-͕uc,d3e@z(=šl? L^ѡn;<]FW=B$#|&ڼMѓ<`0'0t`OeSRwlG֌ATD0ťJ=ɮL@Iy;eWX«/lչ*kuSRO2lؑn,hcmKjz6?їt$~55u*獊㞛M'#N=jΡy9߁CVH9tCq}~Ȳ*FX?n9[_']vuٓTRVaccX)"5͔UseҲٶD,~\9sti's8SqүWxOr'_\vU=d@ 6 -Y*JY ?3zE4PXEu6wvk']NւM[Dѥn7tg-Gdx0z0mCҲ 'π>QqRXbE$ƒIԓ1iimW_ȷQP\al& fԬ~IWk'iV~f2~9Ŝ8]>I;+3Һ\Y7a:v U՘&zD3|p/$ WtXt%{8\J+)a2IƤ<ܽ>y\$6:ξ#٨؄@ڼ>rD$,+ t~kߛ?=6hf>eV`^\8nq~kD9}?[7JLd>MszYnh[zaI25Ecn;&+|ZÍg#bƨN rY^}$̋g@ tܷO?w6ݱ‰ӅΜx?nmBL mf2ݱ$~-$+EFFjzקvr@ ;8GrL @ ɵ9qS$@ x )22Rk4@ { A:-1@ A[:waj\@ +N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ N@ tCFFyyySRRfn`X "22z۷/&t6BCGeGjj*c4 M$ IX,ѳgOƌMXBTHڿ_׉XE!--={Fuuu $!!'2|pfS*h cY~=w領]qEFFry1sL,R(h BGG_*}=Jl֭[w\ *n8hB3yٸCBBHNN&99H5ñ?'((檊z |gddd{%I">>kH#_[9uֱyfc@dLʆ'b8[A O5b|X,L:Yf0 q3(v>b5$4d#"dCee%|na nX#t~3Qur}v!ԡCXz5%%%FuX &_IĹ(AM^o߻m κuHIIa޼y9MҠPtU4d y> @U:$4{6l؀FXG!@ff&< 3gdܹ^P#ύʲW_}ۍ0[l999(Aad]B3/$V%(+ m o߾qy}xTʼn۟:q*Mo0z3!CG`,;ơ\QQQu]x(KCy=j5D?߽EH~Z#T =ϭ(! J!--ߘ*vh2;6lrLtG|-,,_j?zN_0_V4J$p IDAT dE3uFTU}_7nf5}'n$ui躤63% 4l ǎ6޸jv(IwuCm}BGG<srKKKYt̥!{r|z W^=vݷ/W}/Vbj(/^LDD0{9s]qseq1Vw^kE Jr| 4l,^uc䯫ڡdbɒ%ŵ뾾DAwk 9@6!2o+3:Dv|S租crR2{yA4, cƎ3=KvVVl6?/ B= gF勍Yi$]aюuDYKŰI8acY < 4lƋ/(@׶CMسg:Ltw#/~Nի9|0yo 뚇ca;IXz?!J/yﺛU;(JQ ˬVTaUp(LfLOPP0S}PUSUUňSS#kƱЌ$BULC6+*'`R6b2E:,4lW^y2E=oCUU9rIII-/Gg3NoCCG3͇ NRz+JAIyW`fwdECQT첌R+Ȋ_uZc؃0rhv؁aw?'YYYѳg(UCQPӣ?aKKx`9p̈́qأ$Q6b2_V 4t#55.;@4 }L|u8{l6Ԁ`җ"Ft;a?1,a۵QP\"ըL&IB$$DEEygs$$eUըSRViXzUPU10m[64ɓ'ILLvı^G/.",J&o nߴНQ0e>%Lf*G̎Yh?MӼטޏx& :>]֘9u(~!/ٿa nUe2s (CvdZ+3lـI6Qj$aLՄG0b۶lv:+6 I胛js[p DASςIMBC6'F;4SNqwTyBGG<N׭Zl޼@40zҪ.=e_ajWɘo{R[7ޛKH;|Ewޫ7Bvt z7ܞv'ח5N(XuZjȔdݠ|4U7i^i7I$ckԬIZc8e{4@#@ ydY M.N#!{jl&]cwBءo t~AxkX2kwe45+1&htvq5j:ISdij+ldjTmj4o/ /VCV&MFlywf15Q;wZ.Jn_nO]}_ְ;٢c'700* k7vN/:gd,-IbʴpT{Ez/֥Qѝ(Eݦfo7SCKY#4nݡݸݰ Hhk,9F޺N'Wءwiwqr}YdkpsQdgmMb2In"5=Xudl\Oހu3ްʲC /yq311&w ͼظbu2h}s,Eg89/лYG}_ְ;٢c'gϞXj~ hf?233/OM5NsX>f/fF-}͐5"| {MaMrskX|sdK1?zCwt۠f!]4 z;ܞ{>awEA5Nn^5{ZK (2­ƒ~0O X/OsS5kլ:Fs]N=4E;dӧ͛㦡hul2s2!GWZ3(2.:>_nOv'[t,^<~dlx"UUU9tfjݻ\ szŀM0z#gUs魪F­}:v{[7yC_];TCĽKgŮ:} #jX:*}J힩vsFaX2eJTMï_GRUF&uI / T~_ to Z㷰CWS뮻c +vw[t ̟SԈNLN#2`]2~1Vy ]d(;H&O +%H˶'5DE.cFl;vPVn%)l*cᾪi>Ƶߢij9s&ÇꚸkXu^Ց=I-^?}D.}[w088ǏSRR"Ћ4>>iӦupiuM|En 1~~sr @JJ 6Ќ)J%DC)04a!!) EQ~5k,uQr,"ުAٳg=,;\d<~&dzn]rX H,4FŦM4+d2q뭷vO>^>حuD@'\LLL {ER*^if#G}Lt|ӍV,,%P2n&HaR8 FmDUTj*TYlTƟ*[5Vk%ew‚|*+. p@ ~ao2L:K;jأQ>lh>+52dRSS6N>}X`A t~v{8=xN[y6!2:999P,]fsŗ^IXXaR7\m83elߴSǚMo߾}YdIVKW0Wwc> 4lƳ>áOGv5 SO=e|-J#t~z{Zў j} IR YUUdD!25ޕP>ۚEGh;v~MkK5k %I⮻bСmb@$&&vv% ,hu\]Jpp0GlfWU9}ETRUYIeeeEƱ#mג~x?Ey-{!&&iO=8p {mt.54Ly 6yޏhO=O\\aaa MbL9>|U Z[r}]c=Rgӯ_?nv:;)^9s gɒ%ӧUўzDV\6,ZO>|u矏fӝd,X@PPPz?aaa$''ҎO><#DEEuj:#SGbL͛I8˹#>>5b8ydjC222Yp!~#ӶHXXNJ|uRYY֭[ٺu+Vգq0eDc܁ BV\ɉ'<>"(IC a^ƶ7"t~D{zĚsv '׉(gөjS$OfȐ!\veDDDPZZʾ}ƱcǸ['󖒒BRR_}ʄ HJJ4dddjx7۷GٴzJ{/ IDAT^Ktt=vg]c2)/ tS^\_4mKa˖]:uJ _ތ KᇍSXX(ɘ1 \rEնu^&wԩ[-[0k,c}l+!I9rH,X0PU)7^ӿ+Isun?gOk:O<'|6y_)z,~a.z߿CutRzRaÆq׺ :˗?s7{^IWZ8n˶b׬Ywpp6#Gsq6mIHHuo AQrs - % ^8vo!gd2mڴŋoaѭxH1b}%==LnFR>mFqq1$%%h""""gٲeڵ M5j/'|o|@~o'44W_}b RRR8s 6XfϞM7dt{=SOϝ;wl߾zޔcKvZy{99?@aa!{f̝;1xKK7?4;pį}Ӧ]H@)s)mKXL⋓;w1j[ga׮G<̣ݺKxWͥwYjå^JBBG믿f,]UWTTSPPUW]IMMGl6{gΜ~`̝;MصkgΜҿկ0|y睌5 ɵ~ɳW_}Çcϊ+xׯGdgg X,̓O>=ó>˫b!33K2vX.\XW^y & Ixgp8̞=^~ Ohh(aaaȲO<={6j7K/Yj^z)]wΝ;{䜆hhgsv-4T'cƍ\y啍3w\x 6n%\_*iTZj]w<$%%qu׼zC iWɓ'yw cƌy-}Ғv޽{KJJʲLjj*$gɭ$==Ijͽ[)++cΜ9f͚iGxeg5~%wCbg֬dyw#G3b^; 1 ̞=-ހ #Geȡnᚦ+4kv<6'K,M:7߬k^3 0k,-[?… AΝ;/ݬXlxqС+|ڭ+VpY3gp@O: z\s /"k֬ngϞ2h ܢk$66?ƿ馛Xjǝ5kְf͚z ,]{/,_ロg}“O>Kxx8O ,@^^֮]7n K.5ׯMˑׯÍ7 t~ )) N-R*PTH$Fuu^c).`͟?K,{NLL VXK. عs㒐Q2  saשC$!**]~Utt4rssP(>{%e ,CnmpK-C cygăܱrܵt 111HH$J<ŋuV|CVs,iWgFNN Lwww$&&"?? L&0f/gZJ'~~~VoGx>=Q}Pp?0 ‚Z&3aooHK;ع 29PSSc-&VTrGH. d PZZ<Wh477#88Xi>{{{j ѣGz .Gz܆(.e(pxxр1>>>XpEe7mڄ[nΝ;Xb$Ѳ^^^F_666h>  ظq#{A$A,#::=-)c`qRZ~xcӐZhta jY~[71g ܼY{Ǔ'(.ۘ1#cST*q:۶Y7u# ..7nc\-J&D"$Bccո\.G{{胶ٞRDkk[w4sg.-FZZ\]]j*;v X~ :3)%E'OFKK xnXx1tv{В2j׺*66R?Wիʕ+d ?ǥ6oT(P*l\.f(**RdngϞÇjֶmnxM6vxB7K4)Ǐ,ey!`</`b]6#''ŏ?b7nn[,Z#úe;?4{;cx)u^BGGbb^=(H>u9+9mS';(J0 T*ze]\4so϶lhiiG},Z'ODiiYYY:H.ʕ+puu̙3noɒ%o 4WnM>,)cXf꼰.*>>jgݽ{GV^=mٚ< 2e .]\en߾3g^ĥ6o,++C[[|}};F\.&Uo.V1{l( 8Kl.ڏ.5 *JsQpe*z̔]ǏhM<i++_% &綬g Ĩ4yBϳgJrr2~gAAAEvv6u&NNNFAA>3TTTeeey̙3'Nɓ'FEE-!&&O!Hى\D|vTٳP(pqqH$bHd,/>>&MBNN]J?55UUUOq۞B7oƲe0 rrrڊ-[X4xbb"JJJpYTVV"** |>---())Ǟ={P(D@L8mmmr \\\kQcllҺ('''a֭رcΝ X TWW|>䃒Hqa㏱w^\xpuuEgg'd2̾K[mjlƷ~ @~ ̄ ¥K `g_P( gmsG`ի!AOs?7x{{-GƦMkّSc‚!%ŋ?bFcn --YBysZZ3g`ڴvCnu9\|(**B^^ݱ|r_^g$X ૯¡CZ0۷v\ac>bXo=r777lٲ'ODzz:J%⌞\y$"""Ӄ",,]O{bΝ:ݰa***ptttjT888`ݸ|2^ INDܾ}%%%P(Dxx8RRR R̖1V:/, ._~Aff&?zbcHw///:tYYY(,,DVV!m۶<`ǥ6oz^w@ @DDuFC9\p7QSS QPP`v각lk?:xyxiZ8pؾ}?.9sfbdO8;;A.FS#ܺU[P*-=wtt*V bbq(;}?~JQQb)^.{ xaݺ¾}G܆]`͚e1c5ae{{**jPXX`Ycxc5˸3e_p Xe&<{ADDH ޽xw2_bCpAN}}9GZMß<>| EE%Xp^_֗axxMy {QUgjx.ógl̙![oķGa >v_X|1֬1>s! /|`z.{ %]OTرcprrYBq ~2Hwp}tv>C__x<遈'p@xt7PSӀ.9#;O!UZ<|؊OW d{سg+ PZZ6tw?Ǹq@PП1z5gTBrppK!-Bg̝; sO2U'OIE\MLc%zK֨]B!d4 ;k]PPKF[o|%bxuAAA.!B4;|('B!dp +3e73yr !BlK.aWJe~?%B&\;@4!B0ҿC/xF!2L!G1P*;UdT]S_w{eK j# 3SCyQ*Ul<ХMՁ֟iJy]PTxlk2TR/gҨX[I(,*aׁS)-)f PTdfsxW>+9Y uoeq+-Sq'3LqRW'Ty꼪.^RfV.f`A%,ЋQ;ݮ),*ͻyGHIJʜCP*Jս`T.WTߎ֕[h} 2(ݚTi`ʲUb9l ~/z`iK~A1۶͑S (*>7:6Gq+:&^u?!{'EˍnǑxT*4yL}B}/9B}qk~}Ʋ9jod/}X7!*?;x;* ar ɤ9x)Y_GرEo.4m\.[|a ;'G;Z1D{k|;Os&#'MJ+xMGH<1?2{7OӘם`?v#9Όԁ;!-#ЦMxnbBޛew\C\HLa- ْ=Xxyp+-Wp~{L;>fʖ-#++ERѭ}(o ރx] О&ߎÜANnNvkđrӔwhY5o ;Dش*sur /k7ϱWر$7R2-DTőv-2id<;-WF3=\Nfٻ ^{t 磑H}ߩu#vD~oKw9Y #.B#4 K4% [4;T׾P嶡Z"XESM/0l\2XYIx~R=YɯQo7>BοYvMO̱s2 {BXwܼ #\yk7==vT_HM8 %>3ܶ B; }pG/j9w1E}ϦO`{wGq PޛQ*U![1pn_DTRjɗ?SzܲekØaf>q=m>޺ xrcg $ .Nd>uU!ߣ\>o}]\B:w{ۖʕ ]LD5R\+(lYN&aȦ\y:+RPX̩'BR)z븲߀*E eu_yV־j6@ 'FiOfz@wZ]MD??Ysu0Or@P~d?qDM(*.a!W(H`ti̱WyoJ%v͟ =+O8?Xoi@Fv>\I$x(*V|¢HQQ VVRm RGޖόś|AC2gK>ON =3*\JkARUڟj?LNOjwif;%6vXgN^#>!O ϝ"lm3u0Rb9k? \<3nʊo/(擯쥑򱲒{pNvbb %|&=16VRڵG0Bz"HP(|!~{:OK3#W(k DRcuuII ogX3']lkcmw(W~H0opռ=xRyv|_<9QV{WMFiVX}\ &N8}@ cʨ?wU3;2G " ˹t6y4W')O!ˏ'>!@?wJ}kyNώaw+|򱇺2n>JVZ&Mܝ.~~pN01: kk);r:)~Pٲ@O J*O:E ?ВߝR{$-ެ͞ܟ"b/`#m⬩hJ//W((,J':*\]jַiv8D"aˆ(r9-B9v*##;\IfNfk7=r`{Z+pM-Ί꺸DιGFD{<:8Z+~X{_Juٹ& *m1B}մmԠN K+꣦v<1ŮM=9~wMHlӏx9j>gδ=IeoL{7g=7os*Us\F] rnڽ \CgJ)**r-܊(}Q=[Rgpc˦xH;rygNXCeswus 8~ѡ:꭯|2 JQTddO[\% 2F5!z@["C))jM҇:lI7VPX|_:+;9,W&R8!JP*U(o^}z0JK!5=WYLT*gJ5*VоT*j6Uk/"2؊]\.ml}װ!J){̚,qhX BX:jSsuwn:ѵMrv Sߋdd<77Pޥ,w I+ \lXIcj/v[w\GR%K.JF5㿻ME]٧Ÿ{7//)94|׵m0&5XƲVUC:0b`;ǿ|-U3@ `~8{w7Vn~tVTzoLTdJJo]R"}̜[OvzY& jXV]v?%iڋA}K'Rt٬I 3\+dfG.о?8ɞoWW,]ID'[p J3P3ki44 U=K*lkpn37z\ώLӣgyBוH>\gpmly|T*< l's>o n.ddsUBdpnabtjC*/7\toUuR6T:ݜ^+;/##.!R?')Op<;_y\uj5o^kzJ:E%Xi/W"7U6ӏA}K7fMo=ԅ_5(=^M=.!-I >rKJ^Nf*@ *Bg qq ^#@PyfÐI E `@ 4x&|Xoz؊v@ [‰J,1dfdb:iǏPiLCff&+.tMlalA謫6[uYh:Fh8:B%&Laaa2q R}tYw)!h!h.#l4Ym~*nKNCRXXk3m憫+kb:t^j,m(BgNoozQeݥeC)lEԥYm~5:@ @ @ @ b+@ : @ NPTTkYf)4>}ZϚ50&DO]4B4i!h!huQgC G-v:D F*uլbn!!!`ccB\|\n̩u3qDqwwĘzbL2(uO?|7>>>4nܘnݺg:+TSc}*Y_⟪ɺT?Dc؊(빹|4̙3Fϣ:BcNNjՊB?g}ȑ#k2:SRR̤]vHRJJJp[n%++ѣG5` a4YYY=0Ƹ8hժ ;<<h۷/yyy&:ĀtųgϒQ*̓O>ӧի&MD"1jal5ɉÇsMxT*Ǐ/$''-P~@@7osrInJ^^=eT)tV1T?Uiu=TYeO.WsrpoݚA~~\=}3gΘ$}Kc\\}%??f͚ѲeK.\ٳgvI\:8p x{{#J5k'YYY&Ssh޼9ׯ_gʕk׎$奍95 }v)Hd̛7___>|8>}*sեRdҤI( '22͛Y:d*̥SPpI|}}`̙رe˖E^^2$yytڒѣGݻ7~~~̡ 1i sh,]wu>sx 2L11NJJJ8q_ܹ''' СCM6]ZYYaeeEDD۶mCTG۶mMo)y ZjEll,mڴ͍D7nyԘZgqq1:vH6m0`[l!++7ofK5ƀ())I#== ZjEfpss㥗^bӦMdggsuYM4֗2%Hg}*XC:-5:'ϒK[L4ʧ~ɓ'iٲ%>>>&˯,ЙJvv6={{BM>LΎ6nHJJ 600'OrEOXXVVV&̣x 2dVVV\z?o`~:Çg߾}|'lذp$ &1A:q-M>%"K?f[B\zMH$XI$X YI$(p0PXr%ׯ'** 777qrr2YژCg`` 666ܾ}www"""'??,v`z };}ؿ?f:tTƌCǎM?.}}}iڴ)\.*b/1NRHooo:wLPPO?4f0G]z&ݝ_~OOOͶ|̣3==$zEHHcǎ%99s-]Fdd贱a񸹹quJ%HRhҤhH$HRRe7M4ΎLŋr 1NRYKST?eWd IDAT}*iǬKMXlܘgZLqT*L Is)5ZYYk|@.]d…Babd֭?sYΝ2, iu޾}һwozMԩfSSץ?ŋ899qaVXA&Mu L۶mv T*}]J%40쎏l߾ 7n2Y|L&ʕ+d2BCCq* ggg >> 29s6~*mgyyy[m۶!J'4J>eΝ;wryϟ]h2dsT(0qDŅ`kky^ؘ.ؼy3cgg;wӧoVk{Qs>:4Nխˆ^A謌fFhm!hf+.l(mq5گsYC} qr-ZäI3vS̟QewN:w믬 A]GTꇫy|KLxe^p$ gb|,lՌ;ԯS(~Rdw /_x@P({M<#`Ӧ}v}1SDD_~8Zn^PbeUsZZvcȐ~F-@ u~;T*7 '?dyդT}y>Y-ןO~=}V޷CGm)&""/X\.Gy챑88[X&d.Ġ 9ϢE+i*_OoK>}}t';;3bccMnn+WF`?}O3g}7oKPP_7ߜ 1gk)**GҧOwٴi Vb,OuZ>%,Z~VhĈ) ڟOE_}v Y,+r9s'hYS8u83 PR\yK8xd6mώz^:;邷8S?JzZ*|'66r݃E[prv6q+.2vpsrơWWg23s'l>ţP(QT\~*<T8g;>Mxx;~?ޗeWQ{#ǟQ3_) yf;+9x";#{/{@Pi<&M<ؿ?_1,`٬$"J^_BIMIb< viHRXL'f{V"5?b2&q:p!Ig„9ر埱۷2|f̘kk^˞=57mGVV6<3SUA]9pcWX%u;W8:(W+?=c$'ߢU<<_.Ҵ?Igܸ5I6nbp۲m466^3 W&DWoI2{S2zLiغj ϡ7 vqd|gcȲYSyi8ʜұg_dμ5{*> ~a'O<1S_IFDDYbX/Μ9P.Yj)/Z46DJ5g().&-Qv fu1u|挟J>’Nj߬?22WmT68Gk J1t}31cWH50bs7>eaf9G:9(jt@NhA0~*0={v ^zReoT͛x\r]Rܹoy ?O pF"[E~,|}m-"Hz'``9* |B{[k\ӧeO#w-i{ }$!{eMjrC);i?/{D@=YۋHBqafBDz;n*E!$\?t|}̌Sze : ўK6ko-ssSMb  90MȄ:3-]60}DYD 7S*^Ux23ٺ#r9ÇOf̘޽$Sr9}Y\,g,욍bee|/}<'p ߜKѪ pxp9\|]jrb՚pv EO~a- fѻ}KJX2}&==CqP<Ӈ>\?֒|cz)JbڴiFm.jk7ˎ{%kizpgO-'g冠!2G_b2mlߪ;r`/R+kĝ[),)zN7Gb糳sغ#W2d\h `-sdg:m 9}Mج)!:Aѣ,X7ǎ.^wÑJjj Wh۶%A~Ȝ=kVm!7'wD@_,^YX lU]\$޲ ^:TBpL~s.*f8&4XVÛip-Νuor]瘨/MvEnn滐Ypߩ_#Mxh+r֦.8+7 ~dθy4Ѥk_ݽ˩0j}Buڄ͇͚!Ji5*˨E{6-bkD:G#H9(r,~8nZV~*0=bڍ\zCd$$\˷qȹs9i3-:н{i?Ǐņ+T70XnN#77|WAQI53JVh̞l\Ɔ Q}; >iwU>/ yV\xў͋k|@tqӦ-s2^~&3F60fp|}gL߾=8vO>vvpss孷Kw2Jc|\EYCvՋׯ2xg\eN|g2sh7Po~Bw'5W1,^RIqq <@Xx%nt.>;];p`o;;K7cem3M.-YSRoתG[tƕz Euiѵ@ϒ%`eeeXRڭdR)^xؕqg Am2e,y챑<@޾vkHRcoj?p琛ǒ%k[ux eq"N*g?I!spdħ||矟oi^bԨkJŴ˥S]vw6FC}kl%6owf=UE_{={]23'\K;/>EA~^azme@?vԞA86mZЭ['fΜZpĿDb"p}ff.CYHig2w,&d._Kk<ʺTsNKҩEkŝepT/ŝ{;KN8wq2oerkD}i}T*eŊEqYӧoNKD@/VvX:;{> p. <-Z}Cvh>SɵYY}-C ;wMt&HY>c&f/lymٜB=3nv߾ Л@~i73fL0~^ TX Cm8z,OgOЯS7N^csptmS{FUiYg:%ߝQ G9T`59yyz[nܨDY;);u;RoұW_GFTydW+VӲÆ?&ل, q:ߓr'N.Cm}e._~wF@eΧ˴!\dN9+7ǐ5DY{)[RĜE( ^0ѣ9o8Ȝd5IW.`=IIKU(}dLOظ+{G^+*䡇=^>Y 0ԷdՒw,?.x3:'"/)቗0o(x)6c;F4j$ o޽ћk𣤧jV9͂eܥ-6SMΟw?(] 0m"!<#HHĜ>N5T+s5-!wF"!· v{ 'sW䎨Yuٳ@.sb}3Jt@BkcvʝTt:JWD*ͣ M|p9@##ÈsE VȠ)6F \H*t |nGjr.]ꥸr}kUcѣ^wA)eϦUK]G eԱ4kہ ϗ0f]b؝;`dR#.Fb:&VKLIm<6Huhch s:up7!wF@e!AB?2\MIN~>`ؑ"wD6^9~#)e )[ Jh;fCFZ}y%ҡY 8Jʜ ;#{;j7*&!++_N뺠aco]RG?f\s=gaJ*Hᤦ$J3}Ub`.]0)4~e눽,`٬$bB^Pˌ,6]:;cѢ >RE2N)**&$$^PgWP(̟׮ ??VzR'Gs.tTSVK:6oUcs5J:t2ٽgk 3*o IDATZ]run|]|tl{h*CnUuGmlEV~ N!COǜT)RMb3_aʛ(,.Ξ^yC0@lll[prqNĚ2sTz}^}u)O?=I^-] :r֥f}rE7Էf`my}:μߣk_{;2f"NtٗSU!ڶmūҥ_&_,n.ۛ&jJ׮6rב߿F*(s" 4TJnv^'1f-wmmmٿ_mض5'" H3m?~ Ξu.U?j,'G}'"gSPD;59uGY[gN~}/"ˇt-zoGҤf;K':eFkcv)?cBݓS[N0Rʺ/\sEnFۍ<3_ݪ]7nj e5w~jNl_4/09ZjC]$.\õ19o }o {=_Uv[}mRl}GP_LhS\BU-|g%`w/_O*8Ssԥ}V$%Я_OƌB9k)/׿ }m;jMV,P+74;!w/׮Yt;‚|>9^_st-ߏMӵ1˯F׮u'|9s^'?_bbrI 0۷"<}zxy󖒜|98i٬^{ B3f8{+/Ο̍k)K^C5\dY0pc|2D~ǠaH$eHRGjK;ˤD'ף ɷ]ݻјE^PI 0>>MHNs-RozĈ) _o` 9voݞ_cѴ/;%&..δnܠyE΁%W}3uRpID3w'Gkxw" ,~ś&oU-!?_w%KV3{"^F ڵ3+֣T*5j7bc~JE<8~Kv_wBB`e%ILFd Sod2ްk;i/w)FlIR\\DFmo~;.Ox{xv['-N*>>^nߓxMn@d2C}0S|[o-Khh泿IIzcKQoMJEf-8y,eҤ1\{: q25ρUNAA:Ãt8kD}t.YZcj*d.{oi;qگѯcSoMZf;gۜ ܹSAA8q#ڵ$oEڔֻ@` N8K|%:thCB• sQ(T*.]Jr1C sbȹ77v`׮쳵9s^yE΁hR)t.z2y~ś&F&'"*j(G+_?T=4;sZm`ot%GDŽlyU ׯ0i(JYvz?N~޹TɁ_kגXj>ْW1F.8T9 ԗvngW끫zYΟ ]~ٸuf-Y]1tZ䦥jzucleB^ reϼwQUǿ3$$/nYTeqG+BU\j.K[jjJ]( "QBv̼ 3d${<>$w9'wر=U>Yg{}̔)ӵk'RSSϾj:c%kIj{s_&@msfuy.t6̞PHݾ}[nOޝɤIѪU2sί9v^Cxr9唓ذ{ڵkS:yM?Z~H賆7L}*Q]~Na=۷o/>` ]v>%%%ڵix/7ldٰ?,v-pE*]Ҫ3tֹ 3:t Nj?'&ɮ!տGo^QdU'v}6o =512hh[%g^|EHǎg ugcؠܫx V}pXۙj3\[_\\mg6~~u56js_iw Vy 699-/Ӈy]wϮ]{(**NeG׮)++*?;?3q%_|`ҒRvw?8Kru]Jn9p ?9 R3 ߮7~\c111pӟGu;y(/<7zՆM2馫Yx9?sR4|>n즤~{z;S\wJyzuiU*,~;qT-''66ɓ'о}}t6>/j vܸ3YC+f=x]bf>'%Kw1t | lL o(W?}3, y|LH]˵/cOqΞ> &4ZMg̜{۳6ĵ'&6;g>U2ᮿT:[M(gїgвebT4^'g}{vs-Sx^Iٱ5P:fB󽿢g x5DwU[^}˗+?9s ~ 6QVVr<{FJg1+Jo.yV ?sT{c1mOnA=8{W&"zCj[v|EϡklޱOʾ+==)l ]3f]_)}Nb^ yPr8 n:thGtYy `rԅL]7wḻ}/i۱y.zLwZ&v毈_w*D:m?~q' v?nݎ {C]¾c#ݺçKǑE˖.?oYEG{^Z^nӺi2l+"bw.\5;[#tZ.]^ϖU=cfi`:']/VxzSiV8Ͼr\9?WzL7֯ϿY$/0ƖM؟\V\WDįwՕU,vrT|J>d mGfD,yt#Yd]wsC{4诡FkwO8RR)6dV,]# OGG`EcNʒ/WΞؔ}38qOω'܃&{-|F:1|b 2?:dԙ]><]޹e毈Ę_U]zqm-' ?o|WO%!!_"ڵK` r-BLL+lhhʅJ?̓% >pyVVn?wx/$"b%}z ~Wnv]5=KT=cSӭҙxhmp}?=jvm]%fU_CQzHkq'snGЮw}ܖ.]u< 4a<5j N;М̄NAv9[)Ҥ#m ˍhԶi{g;El1 GccjgsgSҩߘFepʆ  ]9kB#hΆ.٦<S9B9[&-`C=igKթ9Lh3:Mhu: `F N'1KtN%""""""DZ-h+""""""mg̟??8yf{"}RgYӄF0ӄFPg8XӄF0ӄFPg8XӄFWgXzI_̯f񤧧V%''O5upӃ/wc@8^ܭءӄF0ӄFPgiB#iB#3Tv4(G`NZYfΪU{pGc@8 S:Mh3:Mhu8ӄF0ӄFPg:Mhs:4ÇziӦUx̙aaԐƀ?51vv44Yuftꬋ:MhvZ$Na'ZEDDDDDD"Ò H,6#(VG`EDDDDD*K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDiPbs+m].0~MUFtfttftt6xv+MV: XkӤNNANNAN| ^+""""""UYrHU\TeHU\TeHU|q!CT,==L8DDD,XXjUsqK.`GXu/zu]&4:9&4&4:9&4&4:9&4=:- }\Z3mڴJu]+ g&NtfttfttVqYftt=XDDje^+""㺀e+?MSNzu>вxgX2[1lL4 44 4li^+xhQfflS5( UX24m e6LhkY4bW[6HJ4v\6ED"GgxEl۔#=:+Ѥxqev-`S~eQfqS?t4? i%: q#4IL7iGvAgB]owC)a$Og0il¾ Ǒ;5ip*.ȄF&E)vl8T?Z}ѓ>F߮H2 Cc8.&4:iB#XS١ӄ Qf7:þ Ǒ:ӦMq]׵p6FDUCg8ip];Mhs?t6 `NS?`NSƳGh}^&f@O-;[(Lh 0ecJ؟I08l&ܗXrk0ILk1ecJHsQf;0Ē X5eK/gX)S:L8Ii~ӔK.`r֔Ib.f1LhȔ)boN<ܗXrk#L0LhkYLO2Ē Xu:ҋHs1ecJHs0(i%\Z)Ĕ_zS?t42y%\3}_i*\u\MUu4F" +:Mh3:-hǔΰ14 pi%\ֵFu^ $ c#~#ouNNANNANi3k`EDDDDD*K.`X>K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDVG`EDDDDD5 ,6YcپJu]h p6~[r"A44 44 4ill]iӦUUtfttfttSXʒ XVDDDDDDVG`EDDDDD*K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDVG`EDDDDD*K.`uVDDDDDDiPbs+m].0*B ~{"E44 44 4lill]iӪ|\ղG`؈UANNANNAN| ^+""""""UYrHU\TeHU\TeHU\TeHU1}jXl>Z}ѓ>l6E:iB#iB#iB#iB#iB#أӒ غӦMq} T5 44 44 4iɧ5""""""R%z TeHU~ l8Dʐ!C]^u&NXzҼ4"fݬZoRĺ,b,XʒO!XYftt=M4"dlp9W6u]?[!aldM=Ntfttڤ_'m$6iXȄN\ֵ6u/P-{6X 44 AԩSᩧ^Gld6hX6 &4-:-k`EDDĎ B~ oRzLV&K.`X#-dCc)bM: BTSN ;fqFRsftt'66Ž4},Y IDAT ΰ>ӡC !///qm?ę_ &''+{̙u>L/qҥ>^`A3fLm*u:ӄF0ӄFP:MhgoRWdNe__;k4( it! ~]=ӧ7qԨQMjeҥ?3L~=ΟO^{ydoiܹ>ZמK)n$\zהm}yf-ZD93ҥKsQs:71N]=i%>'6;evpsك!o lw>=[Iڲv̧ ;M͛7}9iB#1gߔ'5B ]KqcXKI5my%՚ƒuuJ WyHڼ ShNg?60kcf[^ֿw*oA.s&2nÇq,hel ]2ϩul޼sgp#3 |/9Wy )KnCq4;u{psif?]Vy,]rܥIwFqndz!۶o䛹0cKw0_p_| 4̘Π>>.)UVByb+kO[ֳ~,NogF8ܹd_ ?n*}>0rSԹEwl߶o_:'۪ɏ LؽY|K|Lv_:7_K8:T/+6n_SR >/'o\s ͑Q"^|g,'^.҃tY*1]۶Xz5{e„ $$$4sQ΢"+{aUSpuI:2}K:m@lgel;R;rz|`F8qgk#aPY%ҡm*eɾΑSxq|w˿(z}ev0_X~[L K4akN}l1b rh"N̩cebo!Zw'khϒ3d _v%X~c;ߙvpJsسo?+EGv+L`N?60kΨ/`z/0q2^| ,F y덹{MzxĖ`I;y.o9?}߶˄k.jP-[;w.&MjvTNt3wX2j >|^:|q{jm ocl/zG.~Z3; OaoiloN+]万Uq.]|)]r:>&49 uME/9Y-ι|2rKo25v7&\Dbj_3@y-;Nξe-[0iUtc?NVym9zh7¼ 3I'$W{ٲ#-;yO6s cy'|3o^3isw8%Ŝ<'6q˖-|XT3u:>>cwP³sT#;?;vYC/=?(+'\czs ӈXӄ %к z&N:>&4sE߳;Rv5zuܜ ^wI1?s+qϨn w|}Xnp>Yxf 32%t,&mf{;ο!婿K׮+$mdfD~Arƒ:@ƎЮ}G|t5}3>fJv3?LͿ 6v! s_ɇzW^ͮ]+u:sΝ,[̮~`ﮫeW_e϶hCc]Ʈs2h#?uV{fŲ&Ww.۝3`xsxu? ;,,`⵶9[WӿSpl`iQ]nXn̞4IIdf#3~}xs?.r -$&vZh>??)Zc~[pɿWj|xxdl?oJQa~>>Ss:/.\.~:O]sY[GN٢`|n:|g'WogLX.o| cus9bi:O_}I3{ZR~H,jciN珧 vtpyQsگI?v\x1[/˺55uHNxv`F̪e+. rZc f<60iΨ-`!׊)ftҕEdqSޮ=RR?zSE((:Hjv>ܴ={S,ֹS(8/|nNW1x(9xĄ322j u:3++I>^nNȪ1&(;h7B`,S)HOL^6mY}-R|@ϖYӄ eeNϖCڽv[ӄF8&Rp@9i޿?i:٬,֗'{Y>6!"囯npc p>~qSbsjgOl|?hٱ3qbgAs|:q9bHذ&!&םCq2FCLPް!Z95ڴiك 5zRzĭ?rnڴ):.>6EA._M_݇ ,K,y/ 5+iҳoBB.w:I'vFm;$-[r ׋vAj Ewwqv8XC=ܸ1Z95 56z>6!4X>eg#&.9sd?ėUP@y-:Mٮ(zq\QZZJyyyj:z=7ltZ' ѕ_nOJ̡ۡPֲuhq-u)z-i|uH=@ݝeWSO:TL;u0&4c3g(&Ooκ)2xu=5SKWb^ҍ.x rBt;(SnݶcYqjg/.o9eIڷ2O{q]ĀX>J)--#'''֭STJCf־n>nCmLJJj6g.7{Bh^6w#T e,]  %#2t'l}:MORˎ;MݛXSNӄFV YLiLsxl`ǩQ[vݛ?fM^^/^χu].W[ &4nC>v9Rc{g6nCdMtc?Nv ? K)+R^znve>rJJ؛֬s;Ջ6_O#yꅼᢰ7ٳE:٫W/ڬ|aɎlg%KGv0_XfE/JӄF2g?٫W/RG:20Y'N?60iΨ-`;v$-</'``Q!%eSZVFiY9eJ__|¢~ޱdUwՋSv1ЛCHU:{k.Yը9ڵc/[vJ1kC$mYaN^4aB` ǵLaNr_v:|>/??XFŘ1c0u:3Fs9 h?G̟S.ūi|gw%sйK0cE/_K4|tܹªPs:>so`[g5¡v-]wv]s\ el׹Opg§qlw`Ƨ1~#tɏ L83ȝ 62~ 㤓቉%@Ρc{)z{)-)ᛯV񿯿ٓ~^:;̗_᫟ƴ4Ǝ|APs:;~pl#T|.ñ&W8?4*-4c f<60nΨ/`]n7C^x.+))Kt=h:tBB$|^yd)?f{d5rGrLp̝˖C51-- &X#I&4&4:iB#iB#I&4:MLd؍7o|ytض5m[3.G߅ZnIXzu^6\.N>dƎk_u:ӄF0ӄFP:Mh3:Mhu:ӄFpVg,`$%pԐ!o2.л7}?2ysa|GddԳ0?{3Rϟ:fNNAS `F ةӄFpNg-`R8a7H~f&M(ɡp~SSIHICt>x:th[p;wfҤI۷ rss0jՊVZѣGzE۶m7:iB#iB#I&4&4:iB#ؿI:pgpg4Mm2l0 7%&4&4:ĄF0ӄFP ֵlYUM:_[~}nMdL:K6ki=44iEu3ӄFPi͔Ϊz緋&} N+ќ &4:Ds64&tИYQ؟Bz-C_[jYeCYeCYeSD56l=IIItڕ Mύ7xj_s7n:l1lR ,hJFӸ|r{Dž^ȃ>w{o~ÀX`r =qqqnN9Æ SOeŊ!m.s >>?޻w/ڵw{v5kpwӻwo[z.zg|9s*]v]w׿i,}>r _|m۶W^yN:ջ=;uz^Nʷ~Kٳ'_-yor-{nLBFF)))<uQ~]m [oJ۶myljvKEv@-<.rX ?W"YqN%]ٳ#G2zh^ux >Cf̘7X׮[ѣGnݺo733ѷXPPwѣԩwy'C / ilwsrӳgOz9⊐kNR|Fs+䦛n ~v2wy{L2Lv2wur f͢o߾!o.crJfΜɓO>iFygvoO4C DK.adggSOQRRB9Yn]ܬ1~ 7o駟N6mݻ77|sXBBy\dOM->.X";Yq]N%}9so>.e^x!SL ~_pYgѩS'V\nWԆ3f cƌiׇg}6G 55m;Zs'vǎm;t<L6-5ؽ{7s###K IDAT cd233/2e =P Xzvm7#F{0\.Ǐg@͏ }]|>:t 55:o!< y\dNq],ci.`n @6mЭ[ǝ:u?>l裏FoСC袋h5B;g̘}UW]ȑ#m;tnܸ={0jԨFosx衇>|8W\q~am8#1c>(_me;ٳgs6v>}p-Osmqꩧ2dȐm't۷o ''AێfgUm۶TϯwoϞ=&vp><.rXΝ y\d9";K" ^z)((~|G|p)eeetMуŋGk4u,g̘ܹsyW{}wΛ7p 7CFFwqGo94h?ZPV֭[?ץKbbbXfMo())!==_׍ھW_c֬Y;\[o۷zرcy'Y`K.v͵ V| *ACOW \VeaS<.XȮ }\d9ېEVK;ݗDt;ydRSSga̙f~j;۸sN=\tµ^#<6\h_z#8;vM;uq<3н{wi9b ~m_z64#F ..OYY{lH۴X̙3/-[M;Ν;tBBn␶i3|psezC>@stVTZZ;qLj#{g2e W_Ç>E.vLIIgO <5Gy())[n~`<3عf͚Q̞=g}sr7r 74{#DO]eڵu>.rX)Y"'m,t_JIIU 6k,YjUsE㎣Jgr-[Ӹkذp?|L0Fjj*k׮峕+O>}(**ָ~z__x%3j(.] Ti3F͆ N:9QcFSҔNYtj,M~ÝU]mܤ鯄mmo`_i6*Ƽi uFO;Mh3:MhuF欟Ʋ~&4:IsOc8a[N0G`)gm(괦tft*ڙiB#Ӫ4gkgJgUa[6fAh7ˁ9Lh3:Mhu: `F N'1*g! -`EDDDDD[k`]˖[EԩSGDԩSxuZOc;Mh3:MhuZlL4iEu3-`p~v`B#J4gCcB N+ќ &4:Ds64tV, Y~~~oժUXcB#34g5 eB#34g5 eB#34g5Mt|Μ9\.uk\>h~퐷e˖5kVZjcB#I&4&4:iB#iB#I&4]^y啌9$~?Ӈ 5>A̬_tR `F N'ufttR `FgBUW]Ż֭[Yf  t>o}W/saܹorqYgqWЩS'V\YvnjØ1c"`B#"wft&4&4:+{ Ψo~^/< /&Mdqy ɓ׹ҥ )++矯u}QJjgB#3 &4&4:iB#iB#3 &4;=1b=-Z 99yǸkظqc;u:bB#3 &4&4:iB#iB#3 &4;_rssk}楗^gN5z;;S3T&4:9&4&4:9&4&4:9&4s;6:^t&N_> ƍYp!G楗^O[l_=xZ%Kо}.\ȁoXn ))۲j*^/it tШNguhJ tV tRRR|/?tUn0k,YjUsE㎣RRRevw nw]i0HKK#55kʕO>Uk\~=gܸqkO(gԨQUj3F͆ N:9QcFSҔNYtj,M~ÝU]mܤ鯄mmo`_i6f6ߟ$T4'Hc3z"iB#iB#34g43M~ vڀ0`@]6ĨQC"EԘNNAV9[;:MhuZlL*l ,&92u: `F N'14$&49UE,"""""""M؂""""""b }X+#xQƍrrr8S=uFV4;Mh3:MhuFliB#34g]ƭ\ɉ'Mwߍ"vƍQ(ꌎhtft1ӄFPghΆ [ZiiEj:*-[f>,ENNAѤ9&t&03G`ذaC$7Q꫈o鍁34gûw؎:#Os6qz 34gûwFtqF#:D|&4:Es6|L4-cB hќ :#ݵk;wv_|Azz:9993,FI'ޛoɼy>#F`ɒ%s}v+]3`޼yҪU+?xt&))~չH31u:ӄviBc`;tF 8ӄvNqzgD Fn\.|sI'QTT?ݻ۷Fİ|r-[Fsڵ$&&2nܸZi&4Ngt؎;Mh lG41w؎:iBc`;NtG򛧤PnR|I{=ZhABB1_|ӧO笳 66;06l]vYHIId1tV tШNguhJ tV tFl}bcc>}:oʎ;hӦ eeey„FP'8ӄF0ӄFP'8ӄF0ӄFP'8ӄFpFgsQG{n;>hJJJ())?x}44_sE݆qz 3:ۏ6؎;Mh lG~4vlqqqPH63iBc`;N41uFlxNQgiΆw;N6Yr%iiiD>c^rIľZZ%Gm3z"iB#iB#34gÄNAѤ9tFl'eZl*׀4ll ꌎhtft1ӄFPghΆ ]#f֬u: `F N'14$&4;}DDDDDDDBlEhƋǭ@aB#iB#ILh3:Mhu: иNWJJ凮 ^Bf͚Ezz:VEΝVvZ: 68 ~N{iB#iB#4gCc&vtT]mܤ45ܙvjGJ` ЧO6lƪDVӄF0ӄFPi:9L4 UDB}G`XS:Bj*f͚$""""""R.`Nʐ!CHOOȍIm/eaܹ;1m4?o[^xhD1\B,?2{lɡoH%Z ٤@JJJs.o#Gdվ>눈HxYo$sO6 &Nش8/5\É'ȑ#8p ۷o{8P.3 { pRPq(uDiQ3/`Zjǃ]0od4̼2Ne.P1D ri A8Z5{}Faa?;FR1w\W_ߦB!x. ]qMbФo$ LMMYf ={˗3vXLLLٳ'm۶ 00sU .\X!BqM)--5t)}ټ& BA.]ҥ ٳ C%B!jQZZ*V<$ ())NǥKpppۛ;v0~xT*GaҤI6B!h|jF` ]B$VPYYuFFF2w\lll5jfBH)**uvvB!B46 777jBHHH,,,=6B!y!Z.E43&GkCS' B!Bg!Oz2f>GLХ5XÙ:o.tʊrlYų')щGOǯOԖq*;7Gq-fMG0j7N8\FYY|}92y~7 B!B~ξ2|LԜP Eyy9 I/EuSGٴjZ;G|58{x ")f͒B!P}8~<?Eamm+99n&A=OtM. 7GKW1R*8N~{_ stbtzP5hïŷ7=-m/Vu(j,,:Ens\xG?dtq9l\؄g'w Y7\OIJmKȨտF36z~~OPԟk ٷ~!򟓙h5et&}N\%'+g&25î}zpFjC [Ɣ)c06II)srٹ )++ť#G޽_r) 077Cfydy!7BCЮQ$ 7t m6C B,]OIاP(25( V1OI:1FZ9q 6ZDݘ]r Z+azğ^ @ fq^nv;ۻZ_xUBj*{cosE}{'<\ s̠KsY& m|" h~8.)&iFJ5RRR %%U[3f>xybdfЩj5O#2r=o9"><''G{STTŋW(-߿֖~ϊt|ޖ5YUĭ᫰_B!ފ Paf޶vOKk >ޗ$> ,m022"`LTdL"xJ1J1}}R(-)ȳt~ד阘s䉁#9sHƖDa~#GilCŷN}:U cG{ 0{G'Vk*9 3m"9'c#4C(,zza3?Hff.߿9r;w05UhO1{{[ΝK$## ''GƍAx{{[SeLrVTjjS.*B!hZXSvҒ:Ci*Ss2GC),Ȉln~K+k)W]4s2(cUT֩Ac+Fmc `kמi=Maa晉/{!rMImnMPTUޏ8bBrYYYPQQI^^ABlVV.v;:=Ï?^`ݺ-0o4޸YW;nFFVIl+̙39~8 wߥM6DFFC`` ֭mh7B!y[ N66Y7o;fsXGx}(=Ɩlt:>eg m, Vo@6֚vfԇ؜mjR[Yɇ^acdT;%h5?]ߏ6V5eS|~01Q/I6偹%%'ظ3|*( ne蠟WnkA4b֬ vK;v Wת;tp 4tXZ[[6ʘd q+sIMME1{lham!BѲL:Em]PR\oرzRa ߓyAvqԬ qvj| aٷONi ZWvRdz֐qCچ/}Dee)I9s">OjYŷ?sZ2Z= gw/Booo|vvpTVVPCX\ndfCPp^ye +Vg,Y}||:cggKvv.˖E'ϠT*ׯ'.g_BnnՕxKK ||pphGz-'% 牉EQQqIp \z P(066&** ggg,YŋIOOgLeIDAT:'NT;v@PPPXU"B2 J[ +bogׇ055íSW>||}]< b籵sɭk_nFJ%S^^¶9{3woP(:o{印TTޅѓk=Sdz;f5~a 0i+9ri62g 8@#'8ϝgʪ#b:_zJ_ޏվ06QoylsЧi8x׸|*jaRtiʄ cRHKINn1''GJ%}w ((^+?v$)) X[[偽}BPպG7VGsaH񄇇W Җ-[ؿ?vֶG;GGG2226"RSSSb`m6D;v4iR```@@@YYjW+Mo. io>uw7&&&zLMM)ӧOӧO4uֽ{RKȧ7%jG 8pIҪi{dvvvC T%"b. D=yg&蘶3b}?]H2G>vv7no2ШzI^^.˫ȑIӧ [f_~~a$)499̙zz+'L*뮮Sclرc@*GEE^zM>]q(+V̝;/_߿j |rMӣG?~besK* iPY<xݿ Qg̘QF(9\}s(D^P{ܵkgSSǏ, --/MϞnqqϟr!vT6yg^ I͛w~eGOk3TKllԩ mlEEݻy3zȕ֨U{t)|޼鵇]hwR[.=^:uҥ޵&fZݥ٣GOw>mOLt}277E CYLC~S*¯s&-mm{>OZӸJ'_{Lq A̟HSSSw qqqYYYڵ裏f#NQTiiT*377AFu[4 ^WfΜ h:t0dȐw! 7~˗̙3k,77޽{Y0F ~hRzφּ=wuu?Ӿ9\pu6m++m޼vaPTT M_۴C]  cЀ_g ?9u1b;_z3np7:U6޹s_ѯ.@Nv_,=xdM~̙ Y~8bʔw!nn.^j?/YR㰦}{Ç-[&99 Q̝;H>xԿp_ K^r>&Y{cGG:t2:,?prbV-x1èlf 0}y(SnheNz%evh%߽/@[_ߦ|rԾCo_www_˗/733:u6A[n--5њIV jpBj* x\|GN1rH:Ha.xt'n<ų3r:w'ޡ}m!Ɔ]vV,~ꍯ{1Xp}KNHxQZ*6@ƍ;Puv_?CSaag޸qǏ23'OAB<Aq7o~Ȩ]%ȝ3y#G;hЀ/qf@IMg G\*SD)@!vkT(Ȟ>}-[(i\{Wu*TRG ΀v*7FyX$9ǀ DG߿#+?ﻝ[Wf J%W*X9 AERjzZZ̜Za jbz "Q+?[VVΊN ںrp%dfTin }}]P0jE(beeрa7 פOѵKgg'lEZXXh`Pwig/T+RQqttsNbb"'OT /ǿ7BС6ahsG%B>ƽݕsWE2/ 6w衆&OR}}eSd$a%F6E$bTbhٞnjodւyLLLjj d2 ߏ0sξ}~G<%%|>_Qlww޽{]zŵUVxi 4MCFF&EQ>o`+Ѿٳg}z|zuC.((377},155*`>Pzf@PȀ٩C[èZi﹊&P}P_=zttt_~9h mm( lll4233 cX&&&PS={DEE.y'N <<Y.\X1cƸR\Usʕk׮1fmM}h/TжK'4bC󼾣""ÇWM&Ǫد+Ec&Ï?BI0&C*߹sSd6zQJ%'eJY"n3%/,,Z`\+ ;$DR JVm#4I m\ (7Aŝ;{o,@h~ҥK;wT ^Ϗ=yҥKQ< 1\r_~Yzwo߾vy5}c%d/[^܉Py<{ǎVFF:: *+KOKKz2>I dddl߾}̙&&&jL)?~A4KՇ6(}z׮]`cc3iҤ={9r$''g͚5˗/4hPG7ڵkܹ`llh:SN[[W̙3;wO>d̙ ۹s@ ]̬#㣬J[[{vu}W.EQObGE޸&jVPPsyV?6>޷@qKv6Dfo&)b/=9Z={Ǻu8 gjj:|po&11q˖-VVVM,k*wqĈ/644T1sggg%U?R(**ڳg"clT*+gѽ::c'M9z_Iý{3sgψʪYZZ_͝;Weuo>۠_xf*g ld 2 hͧ+M-/)222Zr%{mm#G(4{쀀L:>裏6mĄ4:())y?Э[r;ņ IDAT777.XԻwJ%H҃Ә>${صgSht;v{WSJh`D"Ѯ]{T [ }ƩsߺlA,`(TyaiY*@ ?zƏW. ssC;w.""b… E%%%!\PPpڵȨ15SׯH${.ߕ6)hxϝ; a eBg2,((ʕ+eҤI]vU#>Z\\lcc3qjKTjii9tqƩ63epp0>r*Oqmf-Z}tҥL׮]{ 33O>yӦM׮]΁֬YSXX?j(.k׮ 6P8жKŨ N_p6\Gɨ7/S3s KQyX*Kafn˔)Y%(E((CZ]?o߾왲{T˗Ѽ]T (7P#ǽ 8Z가/QKݠha~=%%x<^ 玎)--ݸq'r>>>}ܼySIjzx<___t-PEQ'N0a•+Wrrr$I^^^xx)SƎ[$ϼy: Μ9.P&P+*yD^Jծ_{Yf-]t֭,k˖-LZ7nDGGSLYdƍ޽Γ'O=:nܸ}}sپ}رc_~=h$H_WS,-`;]_]2i/y&3'X"H I$ i)AʥR*UZ^n@4%Q:u5<<:7 BVՇ6dں'}O$~i=m +GI r)jڏR]~#-zII ([OO%/..ӠAKV"Ay:u bm[lax{{^:ϟkj #i0##@ɓզjh|FLL :#$$ãrW̙3: 2HiӦ1/Rn*5qU0dQFhM1urS[`lC6lwpdjI@! H,nyޭn\Hʻ6y%BQlEY.fEy4 8t>mC@ic-mRCޝ+lA -G-lZ_otppTbbbzniF?#Fppp`J|||"""֮]{ʕ#G? zCޠ tR5v@T^\\|g4%%%qJaݻwG?1u lll0 +TgW`Μ9x]Z(k9ڝyΝ%'eK'c,ߙ2!$WB'YeJ>h::}ٔjyfUBNNjC@BܾPuܼY@>pg8A#rviZXWWm7@6MMݡԼ#u4Vr֭ 'MĄV}g褓VGmmm6x4 Zi]x;;;'''4/JNP(0jfJJJ|Pƨ(tE(^rა~^Ko$lBt"ˀhi iiq$ #bqTTNj!((]MͿH_3|^_ T^_A"@i9m` 񺭭-BX`n8fID۽{(@qǍ677gkYt`X_|!ݱ|;~x˯>:&_xq GGǪ@0ˊUOt+..vqqY{{Fj!7ƥlO3{|ZXL&~A?9ID@,P>{V **Jb16Շ6(Z@`߭ĩ Qo X=ڹha~abDqUb]tQkwMϞ=JKK=z~zf*Bq xę6yfB^Νۿ?zj[ wA켼jX^^XPttt,..fWqqqܹ3M7nP<\Wc4R1zr&&MөyM0sﺶ~MVEOccz7b n/`HUա5CDDmC-*Niix^\DOha~ 3gΠOT%;;ʕ+kr2ҒY=z($111aJXXXݓ"h͚5M+0:M6]vСVLG}0*iY@!0ḫM;l3fXxq^^ޏ?f͚J`ݺueee\.m`S94MW(/-[ׯ_}6/kѢEu37o?(mfZPbddٳ===KJJ]&HVXrQoooOOׯggg3///,,O>ݻw:uC>XXX%%%ObEQ/^.^8m7/{I%Gc ,Д, 4A@M4V REPhIJ&&&R; R-MͿ,@iq@(a t@X?ٳgKҜ/HHH bK5Щŋ?t}ƍk2N}+V___Uɓ' MhˬZj֬Yt.]l޼Y1AW㏳O:ŋ˗Tjg7nѣݻwO<?F4ﶂ!̤RG%C !ɪ4v!ޫXJS:=@(b lf^|e $xu==.W{¯-үý.\!lll;|ޥ$ӣ̙3mΝ;~999)\LKRRr+ dR^Jk^$)߁#*H$2y0#T$$ #4M I$4A !@SŶwHL9''GM꣖۬_2}q;!޽a^a¢۷bndeGW/zy-կɓO{~t6W%PְӬE6M]31uڵI)JW*@Ј'$Q)щ"i h-,MP@4 AP@K[XZ5eWYͿ,`!/K{4` TZaȤ߾uJl캸-د7 LNֆ*y|^ztgiXbf:5XJTUti߭ IuttHg@c5( I)ME =MFBͪm`ȓd &#-5ۑ%gQ9ER `^24fff|MfHŴPŕo||>$R)E"345 @@EƑAtŲ$I}nMB4lCe[nXn+ŧڷw7w-hg%FbaaQU|L Xi %bpeBo|m]$3|7KI4]@Wlh H芻*&!Z`fξS9=oC ȴ_6,1726oEM(J~Jpss -}ʕ+$O h B*%h_xD˧ fn*U%Ip ]: 4n}"TC6>` (|t *"9Nޞv n2 `i rlMDGGS )++C9l@$,U L ()k}L+Fo),~7Rb* ۬_(J ? @&ԭؖ~]id(~ۡV\ٖ]VV͓A|a 8uB?cBkA$ "l"((hfA&2(@jR6>L~HwY{FZ`XuE%mG66E(++N<2Ә^eE??Ȭ1;c0@6E4I4|MMMդ>j<99[mM-دk.m`SSӜVnb n ϤR)A4E@ŊC+h&QK,S ?ܡD"L&HMVH5E"VqlS-ngFiq6.-- *v. Ξeee q EAi@@ĄW+՘cq.i9:+<Ѕ&]` 'OP,v-:va\sy3#ɜ &iª ]Ȋ B[0 M(Z* JcJHgXutt,,,Ԥ>XZZ,l~\Z_`.l6~b ))._^̝"!  "6 5W[ yWџQM(**,Jҗ qUl 9&䤾$ItAdжKLW^*+5*(./z$iMQGP:5C ^н2QTF K )tz|T*I<4RÇC3h `iPc~8U,p\fZXH^n.Z`Q!+ɻ8y&]"]hhdRL"%9YRL&(U\Tݪ7VǍ.4P}]]&8$0y ٶ\ `i8|epY\^^t3^(%d4*ɋhJFC,T׫IeDJI$2T&Œ̷iLӷH7:88p8դV!:::FFFWb[@M=>jQ˵s]^-j]m9F3?~? VJ$gЧ.Gݼ5bQ&rΛ\WX$8$HiXZ.%e"qFZjYY}Ջjըv&Mںu+hռ//ׯbl볿?da7n~Oc#Z4ׯƞd7KNNV`4 ccc{{d^skDzM)^>py{K2Ks8>nE,$)# hHe\"%̌tY|&&2ZHZX[[k׮Pi 80,, [hr'8hx3qhM4E Э[d`4)S[Kq_Sڻ3#-0J%AIqD*$ipDR.%e"L,(+/J"AH ,/3R$(&vLVMISNm2͛.4D}###??&SPRl볿|R/g֔)Sc 7 Sggg(,,?ÇiǴe(JNN&d7qy}ɒ  {ڶ>J"@"4Ede2DFI2ģXRR*H K) %H >]m4hksrr4D?ܼebb#lR*M3B3R˲F÷8SgCCCQ ^eff&v8.y: NA*+a=24EK$ł"pZZ,6E4%bL .7dzA̭kS}M9L8ŋBB~ݾ}[@c?LXZE9@Z_WN)ӂ;w%ѽKbCsͱ$J/21H}}>CѴTV.*)Д5ɠ5gΜ&P*K.]~=MͨÛ@j1bě7o222L#OKڙL-j19soNQՃU+Hgw\MWjDe¸OݕU|A9szv-M6,M6M}fO6mΝvT",@h2::zʕ4Ǐ9kwꌅFxFy޽{jkTչK7Kk[ j(z*1>jw21s̎;V'O^G͛7X4;vR[@-z8o޼)S vʕ_~e5Rzn꬏xް=-dMŋWOñ113 yl-6ED, J sަK$:!Irƌ:uR޽{25U̙3MLL-jݻwoAAA54uц[[W̙3;wO>d̙&8p֭{IK. :T}Se:t{tiѢE۷oHj^D,N}:1Қ?~ӈ h׮]"OߘFTߟQ{Ml ,+%%6X,LƔ:^[VXeaaajj[W+M19N IDAT^sǏWΝΜU,!ZOOP:lXfDl |̙*lYhe0o~ʕvR[qM&:vr~FV5|f\Q }}_x1**JPKrCBB zXӵkzuenSSS߾}˜ӀQ!/^T*iDcß~r=pQϒ:9梕W_}ﯦ2I ꫯ4ͩ#V^Qr O>zh ti6=ziӦ}l5Y@ٶx<^ΝH{frX|b'Vj\%C-L}ixRE~Cc;qk.WVsJ!x\u0yd6ĉG}BUrNp\\\:vqMubeP~ΝL& ӫ.׮]ݥKaÆnڴI}ML&==='IcHK #ƏO92 hXӧ@,& ,,~m+W, 9CA`3Bezuw`#Oq,'Gѱ$1c 7{D$LRDBK?0]Jdٚ5n:yuv׮EK<37=zdxgZZOl{+w_d@á:v,?>O߸xL##G3& U۰kDĻPQV-7gΜ3gμzUZ qܸq$+VHOO?rH~~~c߿~4F---y՘ l&@=z^CBB_.,, ƍ>>>+WD,Yrk3MnNN hCC)EJ@(d_GJx~BٲJ H.핚*} zs֊h_~yأܵ3cɒ%=߿o~}Wݻ;WR$b]`ef&85#~-SXXEVI~>_lY$kVmΝ:7JUuU x֬Ybڵk/**R{WՄշ~[VVv:# qrrrwwwrrjG KLL|abbbYYb 4 8sLQQ 144{PiӘCuq޽ȭ 4li@];)lAe3! &F{.WFwljLCCqXEV6\~Ԩ4Ҙ 8{Р,QbAyO}%~U;^us+06kkuPREիAAYs3g|GRkkf4Mdžȯ4Y=#֮ʕw_u2$˥ȁxrkMȑiVjqp8@Tɓ'O䔔b I뛚ijA+b͛EEEEIZ.MMM۷obP[#''H(b hxp;w3$BWWV5C7 fbQ? 8>$IO \iAO?=Bs̛'||3ՕǽYˏtq)0!EQٳ_i&bx/Z@Iɻ%(˶m狃CM?sxWq10C+W#nj*ڶ.'n Ə2zoh(޺EH5ʇA?LIIU˖Jڪfݛ[7 IVVVVVV-H_srrBQRTAC[4`@ӾY7o+AKZvf&alrsh 3f$):uPpU=jl˫<]od$?(+KHN}Lqf%ry|9eNQUMf*oaQ~B)6X:J `TNgmۖPg}]]ݢJ$i+B888X}4Š9mmYe={[q==|e(Lb$痥جTJ&'N;awW?Jt߾iͭϗMëWz*$MXZ +?`<.]kRGy[i8ov EPeRRRnsPvW-Q̚@kz4YzAڵ+//o„ wtt}vjjT|\\\}4}^բ4}]4] D\3kl6ݭ[bb^ҕJ+LTށoɓnjIũBfk8tmmzzҊBt)WZʮxP1}N )$ AF~[[&uO-(o+f͚۷o:uW)((hǎ?C~Կ;>>>//O__ںW^}&G5e ''رcwqvv3fL߾}㏥sA-Q-7nXnFݻw6mZME 6mڴvZ%Ӹ3Q<Ȅ>~,Ob .9%E>H?n D~F\ûuK狙cѯ$I;80~]8E"]ٔ]0+)Ѳ117/OL4`vW}(NJ*@kTGy[LQP>_)Txٳ{5uT???}bbb={d~hk͛O8 ,WS*DpJjPۡC pfPBgzY嬝;EFF Byq1);33QxETS0ux/K}MXfR;tH`v\P `?niZZ^Ew%L;jRGy[}뇆3F<---11q̘1N?rL&۽{P/33S|W ,STTf6eGGׯ_̙;4h9RWO5ѷo_???tݥK۷_xq~.%I͋ڥ'b(ܩSlmm/_.oܸx &Gь~=66V4ŠӠܹڅA,&uVV~mN ܂mٻA36٣GӶH={:F(b\աԴR!SŢ,xO4M}0Ю] Q̽R)lrST&uZaپ(lSdᒒÇGFFOHHCE/RUkWUVUUzV뉢XoQAQE._\\|AEѣD ௿ŋB%dRfBB'OXnShhhطo`ҤI˖-;rȘ1cۧOիWΝ Xf r B/!ʡVR񩪪rUYBz AAAx `(sssb5Çڵ+++Csedddggtܹs'O,}#G$ xٳj###1'ګiDA߿~BҒ%K<<<ZZbr\GGǂs%dRfBB~|T&ף|1oW<iiinnnQL:u۳*EnnnYYY!!!)!~ ]W]uoд7 ć899xWWW UVVVVV?^DјbǛeee>ڻw/p!߸kjj˘?~xxޯ_?//QF*E6'CP455۳x|駮<~GEEƖh[И ?h/?éfii w vTTT}Q/&ŃljjR%v]V" -JOOojj\:c e]l<$$kΜ9opbBl@@RRR233^߆(Ev>++'xo 6}iӦyxxHÇwh:\G% Ij/hxҊЮ+u%2z={dddƒd???BݻwMM iT *ZSS{5iҤI&+V8q"$$DY;FFF޽{Whi{J@CC4/XHQdAR`bii/!000x`ׯ_[:::\.pŚ@,@2rHMM+W?|ɤ$D6-vI[Y855(΃l6)p!|`6*jee҂7e)ԩS ]RRBxMMM_|(Bg `+333w0 ooGƕN$SӧO]wEE/$^vMAyrj^W%RA2iRDtuu}||RRRsqfϞy栠 GGG.իpс9o߾]d'|h"ѣGÇ {eLe-\&9{l???[[[B OF__֭[hѨQLfBBBiiiӤY.K޼ysϞ=׭8N']Cf͚O:Fݺu VHIIYjՔ)S ݻw [# }O>DCC#..N+A~׮7eV/Hf)))zzzBt={N>}޽wtss0iF'-]4111;;;55+ `ƌVVVNƏy=gbb_*^r<矨,X Sq3XpfJJ۷aÆׯv%cnn8pɓcƌ_dr'Kwh޽Gz*ͶZzu{+jiim޼?400 ^n"~ V-AVi@ :|ٳgeB}?ZhT\.:p8111}F]2k!gܹÆ yfyyЮC DMJNNr o߾7n;_@ "+p:@ =h!9@@ HA̸9]Gi6AԙZnyu]GҦFH(C1?$! @ *AL{o @ = 1vUeQ!] !!Ʈ7vJ50`9rHcҥb]@ ]ڵkU-9DFFwuE(j d2;Q*ЮC e=%::Zrh!QUUU-Ƒ@ )u>$fa/YMd-^ 05+v(cx}s#5Ns3M:ZQPx|::@'vl?GG/]xO08qs]h. 2et̗D^0!!!AL'O* $ "^d^vIWC͞=ĄBhkk}駗/_' |8T*< ojjw*^Y\M e%AD3T+wgξ~f2 m 5Čn_tS/ܓvߧn7VVi2p  2¥?{vۨ6=8}i7TT8LXY[vߢUd--3>}j3S^Ċ*zv߲ܦZ2UKW>nC>01C?b'ryL&݉W0s{3RN,(ԠP+Hٿ. &yՕL&*++ w---KI(flvUUՓ'OΜ9rʣGw|8._i%&]ݲ M;X pzY}V~Rg;;9 0%2.O?{*d :?E6cv~WY&̜tHE~ֲٟLm^e=)~x IDAT%&݋繧[8sk1vC|Tk)4jaw,Va}KW}3gwm G۰yne#;AL̝'.\n]nn >sKTTTL8_}%!( ǎ#ϟogg SO>MLL,^*q>}x<^^^ӶSdd3&L RÆ ?~0@QQ͛O owGJDv`_bvDQtڟG%=q?-}sI(7!Z׾zxY_22wvmkst7|lkU(20&~:#$@2\/X c.2 oV]s^MX1_xuL\C,5(07>y!3>KR:ۛ޽m@O7w}rJdzde344ԩSЮXYYx۷:P]pesMMMo%+V,YX`fǎkccVUUM8Ç{&&&7ԩSgUwUd;R:_oih i2g߼b9 mzE}yEajP?~O4 MSaX$vlcUL&\#xOoP `!QLר2: g?4Os޺bFH~%: &S|NNN_ɓ'L0wǏX,޽{h">9gΜq͘1СCPFkkkpp3ڼysPPܹs駠)/wdϟ??33hXs8͛7 f.++[z ٳ?~LdX` iimDw)fX֭<=1uĄ,yHW/^=δMՕ\!; &jv>ޝU^l`kΝqqqZZZ...NZb1EH===wJ֡ T]]M*ӧO^"<|~NNO la_zp ggm۶eff666yԩS޳g4744lٲ%::5779rdQQQb]7n|=Z f̘CUSSsiOOl˿}C3SBNec(H"2L?<` h DL36ʦEҵTu$@2 k7=jlPey3Q4sGG;_qck*с._͉ 0! 4L؇!2`2eou$liiٱcGrr˗};r䈙~mBB_|aee0idxxxdgg?y;,@~~>Υ2YcHCQGu ;Cљ+uӢ鯞d*yy?2jp3Z̝ ,-%zTQC &S.xUWW_~=jG3t˓SRR:~0{߉cee5f̘˗/ggg+nץ5~x'Og޲e˓'Op'0@A=];7oތuMMͤ$///M܊1 [~رc,X`!CKS ΀ݻwuu൮]6i$@}}}|||HHIfxx''''b)GЇ ٽ{7Z~=n$9dqq"HsqqOmKK Bt;L;/%ʴx9[ dCê NovSJkԻ襵GzŃ VܭZ9}V|O\G%8ɬ0!P!Cnulg^02Љ֬YB)ӦM2---YYYeee, d2 `8:~4S7uHuH2( nYYYd2ښiV]cbb][[ۊk׮8-iTfmm/XRRd2LHAAʥĉƷuB?RcǾKExڵkW\~7 ƚ5kmiӦ9s;E7oȄ{QQ`ŋ/5#5uuK7W g'^k=NJ.:c+ '6^0axJ7W.[ϗ% xzH`DYe*@A1!CKHLlma|P 2`2eBsÆ υ  frJXX'NDDDDDDp\s##):P9idd''Zggguuuw_ill؈ z@1 {bۗ($|g{:Bl6EʫW : AehmmaaL&ƍmn˱;"4ruqs~ANϽxawo>|ܼ,z~6 %5/1Ȗzt7 SCd&hi C܃.J{Q{;|jSG=/fy;}se]vL_+/(w7f h>IC( EmzJ`bo/\zVaN^.Æiy\]#}BwSƍerg5dK7O6+J wҿ`gVǧ 9:rpvvz 7mVV ݮOWQQ+ֺu`[4==͛ƍ#Jwy?(B|֝;wfz/B߿Cz@A̙sY|I{L:'ظb "-Oohhؾ};>Ç.\Į32dk ԖNY]B2i`Ȥswq ڽ ~%2:P(䙖IyHB% ~%za1Ww{2}hx:'/U111K.v/^8~tvv̼ њ0`K***\2D:t{vK.&L0a+EEEIIIUUU!!!:/,,$$$L21&&/ĠAtttp]###2,Er/_۷/ [lI<'555 vU|7/\a~SNgeeu8zSIKKkĉNDJLrOeee3&55Utܜ/BÇd1`V O$^t*޹cffv1b9ܹsfjhh@Q4:::::Zim۶Pr p¿K(ʕ+Fx?W^7̙C {xs]D9?lذy˖-.9BӧM^Ya }G) Dϻ#:J,--8pd E,C8vvv ̹7׹ B333svv>}Wĉsss8p–CCC333'')StxO>ڵk7o'yzzZ\Ԯ֭[`0믗/_o޼ĉ?3//Pӕ,Z$))w_}*87ovrrڹsgNNN۲eݻw%[AAGpBy<-ޑ:u::\*U9൶6TH@!zדu-ϝ[ߥ $==}ڵ RSSlll={4U,..u9i$! }{%2 tZvOB@9t4MS~Y+!a.! !+E)v?B* t{*[@ ^rSHBDIf͚5kJv? !DUlݺUֳQ$.)!]Ɲ;J[Ƚڵk%A _-6+{!j[ .+Z _pR]@ j Hgƥ@ tp@ =h!9@@ Hu@zЮC sv@ @z>{UDi,]TQh!HUK@ЮC 0<wPa:@ =^n/Ezzzp-I@1WW9OXbnӀv]*PUv9s ܥ0/ݓC z@U # e:D<{T 1])# %z'(((66VSndv$E9hchڕ8:ԩp3g555s1UCaaabbbvvvUUU}}=Fׯߔ)S ji¼y̙3޽knn#G|ˋgffZ=QNKY9RiT*TQʁJbϠ BX333MMMV0իj%%''t:WƮܹԩS<3Qi*G*JIe+K_ݸp0F[GجOfɔ}"7'QiV. 9A#)) 7666666#Qb I}7ƪӆ))))((((((>>^ЦMC kZGo߾ K>༼3` Py17JA٫m?}2c =Ҝ^0Q K@_q#Jz@KKT j2wCǏys„  %..nԨQDJsssZZ؁qdEa؉'6l ]Ȉ R ܹsƍ;{짟~HJ[3g_v7!k*˴utRF=tЅ  ׯ_۷/??eƍj8IJsuV--M6_ՊijbŊwݾ};>>>;;{ŊjT?JXAUBv'55wPNMM%H$ cd뗒RTTdgg`Qrr͛q=ʕ+hѢ`SeTWml.hMwWLPWk`h " vY޻w/a[lQrB}***zUSSSZZѣU-uuu(Yf Zz5 ::ؕ(dG<%66Gh Po>|~XYYᾄ;w0c <;hjjHNNݻw``ٳ55?/7;;燇_re̙=Eo'^Y9fl[wUcY))pykQ Vnew0l׮]111aaa|r ]bL9rY]]]AAǃ%-yš_x1۾tS# No۶JՊ,hAPŇLDu3t:}Ȑ!qqq]^~;njr.k./:>O {g{gO{gn45?\pMUOZX9ZG:vN&V;GwCurBaqӧϝ;W:uDbEEF!OX]]kx3tDMRRmiiSTc"""p Сw IDATCSSS СC&&&w*l…)o߾L8O> >ˍׯ__VVfnn=di캿_~ prr>x`eeSBCC/]eѣ &Mlٲ#G3lddDYQQqbDݮ]ľ@~ &^x-w*r.?qhtOf00Y!C"lΰSO ~[n͜9󫯾<Ԟ'%%_~ٴiСCO?$[.++3554Quر$#7nܹsΝAAA(r)#GTׯ_]|Y𐉉Zu>,nӦMLIKKaúqYooo==YfI2rHb7iN8/:#--͍F&SNݾ}{VV`=+HBB91ovkzzznCC|vRܴ[9[P]Ԙ#nex UU ? na؎;ܹ3{9sa0۝;wh4ڈ#DbjjYXX믿3fTVV^z=VXX|||455 ĺDQGJ|N",,/_lllGSnv]SS?..׷D{Ml 6mŋO8uVt.[WW+hmm \dBxJ3=#a@=RF\<},5,C1Я22WZpъ9s̞=[dO```tt4}׭III#Fʌ3?~xbWWW777777ѱfffDXl*%ֳE--- ouS&(U XvZ$0qĉ'Z4AAAVS2t:=44رcBKH8=3φ:t($044{ >_f"u5\:cjc>ZTZjB104WӷC-w=$3v؋/&&&YSSSs߿ܹs:>wɓ' f:u*աgKVBғP]wvv655ʚ>}zeNz…'Nm b``x^ P({~x т0Kl[G%dI}=}aL-#ܾ|QjܠDEkQ77o޼Wn۶J ::ݹsw166&:Eeee>ڻw/'VϖL# gD)(#x®J>\_Qp__ߘxy;@)ZT:xټiX=d举\.ˌs 1dG7/=}xu*;v6mڴuV"4>c_4-##>^xyy͙3ۂv]4v4-PG nr mw*SL9wPٳSRRVZ5eq݂o9rdȑgؼysPP#}URRRxxqs666gΜY|;{2eJܺ1sO)9ғZ9lFރG-F^Hc?wJZ:`n7b݈82. Qxx׭[cggg '00СC|>_&߲JQ n#J%>'-sR}١C{ȑWl++իW~mll,XpŇ(c:gϞӧO߻wݻt:<,,Ll*L&:thÆ <|cccTTTϛKQiԎ#%yx X)J͏:䳹!0;McKYÿ5kx}< 뎎BIMM(6'bT#}Nrd2 jjjX,ihhP(###SSS[[[Cm*HkkkqqqIIIyyyMM ć@ j~~~\rʕ#;88H(MD XXX_rBCCu| JG=ztbb/r9<ڵkUnS,v=7\9+UYYYm߾}Ŋ+Wܽ{w>};%O9zhxx!Cʼn4Mи*X7h6舒EӅ:q|>bXϟ?dggg///{{.aXaaaFFϹ\h(u2tPuϋUʂW4*MuZK-o֭VwmjjڡG__dAŲtTӫW3f(1HX7h#JnbbbRSSVr9daq{tGTX7(jRIYx"22RUOqF]Bpw9)\H4JM 2EGt:{yF_|5{JJ B7nRo޼)@)@* 2^fȄ>'Er ^}.Ƞ'Ÿ<>A"i0 ӵ?yەYw533#鑏(URZ!]@ j>'xEjjP" b糈fGQӅD"i(:t] P}n8gx񢥥ܣkkk/^*WjS+pi(j2H=VLkWCz*]9-22R(A Ϙ91 g(kj` !60&S^S_|ϾJxn$;|R/]pTJvjE񩪪:sF#KWV՗]z]}דZruy곾r䶸{\uy ^aa ͍l#A Cnjc65]<Vϟ ӧOESC JvjztFӞits:д+qD EQѩ^}¦Ee[_CQ :0`X[TMbISrse ^Ν;NNN2M0,..JUn=]9*Aur[[[6sд+9:$ Bab4ڒ-U^ BkAP A0EwMl: ðY_oϫ81 Ů!BTťv;:Dܳq` ICF11120EN@RSS#K"\1 0Hݰ*A>n!b( CHG1 #HKH *EjS+h!17ςR(f^?}AdoP nb=8|)J(bͬ6Gk[}D4>rV`EH|.C12EoPbmm-O(U)RZ xsN}Q]44𔂜+g5kDibf|>ajvV>LOyp? ݵmí@1> z}:dJ)JUT$VDMsH@Vz+IJ/ S,D wZT>bX+> 5CC }H@%Uz$if2msY[;  jv0\9o)A껀:? ,Q?Vo!)~#G  0}*!{-PE1T0@KKKJZZZATHO- Lfn-,gKlv҉:z[a[Uz H|>ح(}!Q~ c`~_/ML\a'Ey|b(տhRrd6f׬ۤ`| ]D?#T-Nܭf2Mmju,Ggނh)_H[VQW622R.UVwnDu>~.P+h! afE=ƅAJEQ43>壨&m 'KsoSޏFB_0 oZZ|>E_\>)t20wRV² èP+h!ȰQ>f/#:)WT*D | (bXJBlzja_sw~(GQ>xG|g}5--Q>[pn֣t.U0 yQ(ggg(URWPongkutuZ .b|WϳWNYjEGܺuK0% oa ad }1QDBP#0|T(\oa++x|>M O2>24hLR<|a rZ67J߶r8x)y577wppI+(UqRrIWuxT9iq!H/)&  HIIIyϟ݉9j,ax (M`ZXۚ]iO |csVn}CSYҒK_]wѲJE$00ԩSPv;:DA"ihH 0r,vUUeSC=ϳge ]AOWJ T%JvjzZB,]*g_ޝ;w٨*Ha̙Pb Lf_hqyLv SEdMM `pffSSSS39aS WT*uԩrK2e޽{bB JvjEvc֮]j 7e[<::ZQ]~Y8"/:thjpͫq?eV.لby&60S,}S"zO>W^rK544:u3gT%JvjEv]*fV+_*efYTJS"l[;" ܄}BE3kVqx 6yYx\U T(URZ!]!TK@||OpJ@}QsRŋ޽\(z^|Fz%Tr8e ^,[ 6fH r)))Pv;@ `/Ųֳ]4JDMQsR˗ܬ`Q QZ 0BsJ{Ю`:M;ۡI)o7oLNNW*ss k_NNNlllYY%@b^j]u"vH7B}|Nƍ7nݻw9B 8P!BťѣG999|@]BiϨG/SAsuu_Oj.B }N---<˫aX|>0 ---]]޽{ڊٕ888888pܒ⊊&R{ZzRRҦMk֬5jM6A;O. yo߾+WDGGhO{Ahh(NWḎcRRR222rrrx<ލ7ƍ'ҥK.]zYYY5k܈=\e֬ww^111 Hd2Çϟwss}>xܹRWL0at_nr4yyyՕ79a`| ۮwީ⡡!{{{̋Rܼٳgfff;H'OlhhaÆW_}A^F@LL֭[=z[ݹ<<--mʔ)J&LP[[+Qa„ UUN ڵ ybèHIDATqqqW\h֭dJ )--sА]dXCZƗɰSEE``0d g7&y٪1cL4iʕ0b_799n'''7qTcRSS//)))UUUt: 999???3**ݝv펎MMM <-"3 X%$$$>>CCCN:fW^-G}1lg}bfccct/!xxx̝;Wo7ЈLi4rNNٳg/^,l I]'Ю3̚2nϞ=wNggիWnzqDt;vӟ>}zAF@"-Z{ ,d27ndX>>>7oތ8|XX:`ĉ<{,;;Y5I$2wRSS%9pud!ﶴƤ4|Rf\vmɒ%k֬鱸PTTtЈL,+00p̘1nݲl߾~TUUd"{nhhhLL,҉|ѣOtqq4 |||86\ܹ#F%!3Z2[~~[l٪U8$픔ٳg޽3g/mMM͖-[KRRRZZZff&tr}ĉp/spp0b9ALŋ+WF`ffv/.[ 4?=zdhh8cƌŋKd&R ь<,(o.VX\푑===֭#&M"r2'u{{qݸqc ٙW9D,KUUҒ3Yoyyyll,DETQQRO<=Ш.\xСsp9mllٳg޿_Zv{Ŋ8.**JPSN$N5,:]okn?wỎvqzFx))4>.3Ow`({6UPP(D!jjj 2+(( NNNj˖-{1QWWlٲ~MSS"HB TTTx.3ww袢"iujN6$$DIIUOOӧOzM4H,I+fY \\\y$dk׮"6r2D\\\ _x`vv6hnnFjKp***n߾}ժU]]]qqqhTjnnnjjjdd$g;pttl4116_ݻwh#E=x !!AP@\GGDž tuu===%9KUjkϟ'zZN'w-η/kIÓzU~Mq󢡷 @&SRRZ[[x"¥ r垞(GɉVlBCCߝ999nnn;wDZuA2xE:9g7ɧ~xS5'ّ188hdd4HTf={TYSCmt3/ܹs/_|qmmmޠY'.\@RmllH$brr2w4ϟ?G]H$hSNqj 9s&R"H%y/4 #**j9s%9x kW_><88')JEӻ}VAAА-μyrss[@iiUH*l3/,uIvzJWW?[И\aINN>sLEEŲݼy3ʸرc?VQQqwwrpJ<t6ɾy@ db@ |Ç>-<;##]MMmԩ/^Db+++]]/Yqㆋ U59)) Z3f9… ϝ; "eee &Ξ/_~]YYYSS4yyy߶m)))"4M?{.e%U|F/Knjr mLMZn;/]tA<ϩv ]/((Fi-/i\^twwKˮ ࣳd xVWW JK&&7<<|Μ9?c[[[|||tt?b2[lQTT\t)@ϯ4A!ÝHgSlllII… MLLd$1b{:::9[455ǎKӧMv!:N&q8ܸqZDgƍwmll%Ĵ AAAuuuv*(( "/CBBk֬9tБ#G5D"NONNSc^^Ǐ---^)H;;;#}}}l6_/Qصk555UUUp̒35u j]챉)}=η]Q ^;iH7O@u4FLޤy{FFFNG=4μy?B *++}}}eE!"W4x$Ks??SZ[[[[[pJnhbr]\\V\ ݰarIWWWgcc_YYo߾sZZZXhgb}Tm[.^}V6V-O//wn`GB!#SHE&fuf4- --M6EEEYYYtBIJJb0***%dXE&ĕιthNb0mڴcǎTVVD5khbr9KzYYٌ3sB$RSS5apgʃL&JKHR\ J>bKKK.#(SA =~z'Nz*tקS(dLPN>mooF񾾾IIIZZZ'OtR__qhh(B[.77ݻCCCQQQD"1..̙3nݺy&Hק|=$>111 6_| kllcff/S::j2V=yP Uop#WvzFoLwpKK|\Sib&}EGGo޼yΝ1110HiGMML&Cnii委|e*\\\<`0.]4…29ל_zux5551p u%F(Q&qҥvvvseii))|,d{(dvYH۷s,!H j_v㡡t:Ns5 !Fh\}L%2۷NއM6q˗/H7͆i21 `߃Ҽ_Og&"i͚;0z]*]ccCl߾ȑ#FFFhyˏ.n߾UY%6|e*nhD& bjjiӦiӦ555k,X`ggpucr?~\•3BMnnn_uIIIuuK7lI/)Xᑑ!Crrrrr2R( ưrH-]C7/;-,)l7k.{ wqss;vl۶ȑ#"2Ӄ&{QQz|e*nhD&%%$//Yft믿vuueggcx<H;vX(`\ J,A;Ə ,K 6]ɷ o%eehwm8fH? M2ʕ+KҎ"spp.׽8E?^QJRT岗lW׿hϞ=999ݻUE9KKK9***< cr]> "愒hhw| aLoݺe* H$&)`!Ýy„ uuuYebb2{l>˗GDD̛7/&(_-7GY,qrӏl}#3@sc}e c,޾OD:zLj*jiz^YR/ p.7N88u9ᔐGx"33Hn/jN"ٸqcQQQMMMiiimC\Ntttbbb~猌 UUU&,,LPÝ@ xyyUWWߺuk``@GGgՈJ$e1vI"`x5|*B rܹsgH*QHVV779pj|_-zz"AUe af>񚓦zV/C_OUxO j~mL@T\ɸ4UUG4p_\\>>33S<l???KKˈy ͕?sG7<OvtͲQ͐',~[f0ʡw^22z>]gf?ĻN4Q#! (봎0.129aH\$}\hFy9 m?"ɥ[[c0.w0g'fE@&_~%PHv5J3 ̮@S#Wal2}>?H0"Y3R`Q2Ҝ00L0.OectўvzeB*7ȑ7nmc6!JƗ f1i_0ܺ#fԥ(\J]s2:@<􀝞G!Fg ]w_w܉(00$Ei```|PA ````PA Y^IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/part/images/solo.png000066400000000000000000000231201475757676000237250ustar00rootroot00000000000000PNG  IHDR)HtiCCPICC profile(}=HPOST ␡:EEVP VhФ%Iqq\ ,V\uupW'E)" q=Vif_tȤb.*^AY4>!ᔕ o*$00PCCc…՝?Ç߿ptttuu%p O~!NP(zzz&Me>s=zRVVVWWNX~*266^j aX ,2/Urɒ%\.[OO!ݻ$.;v- 蔭[̟?_KK6;; d\BӦMh={X[[p8nYBBBKK !D^|`\pǛbW\ܜBTTTW\Aca\BB]b~? ͏=~2VDeo{ 3tj-,Am%[nkkKHH0`BɉQ\\!.++p8:::'"lll6nرŋcA233\դh~LLL\\\B'O>|opUVܹsرFFF򋡡!BHH1F󟆎Ϫ߿ɑ4  L %qFc2 ض ݆ܲdee1r\kkk???PQQQhhhnnn]]E疿]{nsa /bc̊)\__wl``PUU$))? }Ν;qD!bE;i4ZzF@;L&ebdd rk֬8p`HH"ssscټ,B.ኋ `S%%%]n1cpg b{8lҤIǎ 7n`1ԼY>Vk? ~ Sr ׶(e4ƨw\dddeeA`` f~H&^L&Ï|[n_>D4E:̙۷Bӧwp999^nBhʕƾ (KTSSR{3jj32`Ml'qU*`r}ms2VWq\%UM&Rd?[.~}2,שw{Z-,c0j,]CoUʲ^f3&]M*vѶavߚB ʺǏ573ee)ʶ' 閯\׍-| kG &!WQ =dUm+z8uRܥ?sr؋}- oj{|k~hiի޹ڗƱspSP~0]g;6b߾ʏQ]y f-e>U.Nr% 3iIDc;Wq8K71NMl2gԿ[_V]@hf_~嶂[Ν;AN֋V6{1, Rq:}ڂ5V!$-#7ux0n?jm16YŨugU:&' ^|:>tNf n!TZůr%)hFGwdCK,ASCO[Ǡ+ :mL>s-kl>!TY^z-'ǔC\:դkUPV3?;!xF6},fsS`i7 ˠW0v!DUP`D>$UcE3XWWFӧy <bo?tccSttӧy55 qqqii)--5kvvxF=661##jbi%߹TCC/= ̛2![npHD2B@[-4epܳF?j(L8Kp}-N3111NqÖoew^Iǹp?[@ ̖  q.6*j$ryv(Aԅo'|z/ze+G,\-~O u5n_ۿ?`k/ q[^Qv!l7ꊲ}3$H䔤9)f67^A2FIEm女lhWɡ#r8KnCi`~~W<6=lx q646 9^RَV!'/Zs͜Ka{|BqQ%CiF&_9u1lrJe.o{$55;>ܖ*#;_YY! ƇlvaaIaaɳg30ü t:2σQGXɓ܆[FW}}EJd5~haaş߽$ B+:v1>in:rQJdc%hɫ|xB`D˧)QO\uImNOU Hz0SUQ̵$%iҌpx'S*jX;&JH܊W+"LvGvuش;%y[:50WF9lZB>ʩw+o ;=&Bfh*{9vb]C\v-"'U]%5=iȣ)(}ٳa.:{,Ek)~X'OFaVYOOݩ͙w:8644aV+Cvww?r$Ng\kiin!֛ LwW/"(;@9;;c9!!AD*֖'6[ZYg'a!,MytB -[[ BiYI}Ƣu9ᚹ\kLNuZ5:!~S"VONσv t,V+&ZXdȏ QUSY,iIfZ:hF!^G},aV+nZ)jXXHD2'['k'M:eN!22蕧lPT5adΞS<N.Fnޔ!޾ne-?!}5:i%3Cm,7i_t3I;A55|dǜM{_Y]!$''XvVkK}mb%9l^Ytc{KVln_W(6d˲S ܴԻv$rW)Yo=\AY9C")ZjjjutjWami*U7T J$==7v@$331cFhj_4{v@*>B-w ֛ N5&ZNj(ȑ$*B®ڪ]$l{@~T:=/(U ם_1q\^•3uadi~q1sG+kD1;?]#|W/v%tGq!n!.s575lYΠW.Yw@YMgJ+)36*ٽ+Y*rΗ閥%eZPvMLݞ;;>^zz۷,eѶmqqq b-OB*f+i(K wt;ECEH*)SSb?%eL >yDCE!=ֶxx44.ۃqB?u糈j6 @R+J+K?& jUSk"EVm1!%N ima޺E{4u ?yʲҫgCL-mw},)t[Ϡ-y&֖qqI;wRll, tyQt:IKK]EluMM^+//*(p xSI$ OOOO.[QQ}弼W F]I;55%))ɽ{pWaovwwWSS;{,T>}رc;nBCCdee p^THHȐ!CT? f̘1|p&.]C&!J…%e/]x}$.G/ͨoĖ~WYls "6-UIYնQ u 9"K:0?.! os//&mf[[O0Ω0?#N;ClAB"#?-~a=u% дY#޼~>o6'v:d(1uWnr;_@GY]6 \Rn"i" yԭ[>|66NḼ{VZXciCL9wFEZa[$$$q8^mmm1Bȑ F]qۄ6/ܫtrcccg͚5~|ү^d2r77od%KB/_2e#B(""bׯ۾}˳gϴ V=zTWW7""5++ {1222v=p@Њ\җJ{d\zkiI]cGk=4ffa~@݄[okjeW\\$#T!fSĞ?kзL!6~ݰx 9%)u?2w03/+-lACYeo2Sݫ~ ~еsGxEVm̬{\ܓ %g.tA '_X.| 6˷y2gM2r_}WY{+i;{zg=~p,xzɷ4C"-bܽ{޿pRS3y{J `ƌR76;~ŋ+(bX t:#-iZӯOeOOOOONmݺJvt3f̈E۷!xY:naa}vۛw|ȋu[[[c?.Cj?վcu?b[(cH L^`r\f SI~"ڸqZCSYЮoD?JC\0 n,ao8>+^8 m}&߾V2G*D.)E>JC |UIde_=a",1jq>];ֶ8hB/s3^f sK^ܼ>hK 6jjeݾ'n^Ͻji9;GsAԔ7mZ~??+--kjbH*ZtS† Kcc>ͫp*C tpyOO/^{RffcƸ8ueqqI9bbbrr2v귙rCCC}||H7ɓUUU<pԩǏ:thԨQyyy4[ZZbbbˇ1bq\%%n ]ԕBǏ ;s̫WTTT-[֓5l6ÑPJJ0GTinݺ_U4D\KmpVdN;ͯX')NSCAE"KWcgGi/pc(&!D0D2s|a.׎#+j^IK^:M]}N_nu]eQ]{HD}>>c}|䕕x{U^^#TZZrQ'XPP0gΧG]0=K,&&fooib̺ 'HLL{.Ha'VYT_}qm]]LO[̙3g777JKKCyfѢEqqq=S$L"_dG7 ~QӤ51݉x7 ZnիG>K%ڻJBBsvvv999۷o.]JJJ244]hZea[M!/ RhĦ&>zhl'O*++ySx|AAA7Di222_oId2F ?ѷԻw֟b ZnԩS$iҤI]% }m-IDAT$$$ 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.

    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.

    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.

    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.3.3/doc/yoshimi_user_guide/part/solo.html000066400000000000000000000061051475757676000226440ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/preset/000077500000000000000000000000001475757676000213345ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/preset/images/000077500000000000000000000000001475757676000226015ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/preset/images/copy.png000066400000000000000000000542671475757676000242770ustar00rootroot00000000000000PNG  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 IDATxg\SgI$lEU qցUjEk[ǣS(Z7UQU{ʒ ̌!"*9$;LF/ nB˲3r崏7HvfjQψRTKRFи¨JT'TߚVj6;߸nOR=?wr轩Z]|ΣW(Ύh_Fvgt'로l<_k9,Ȼu3J*6Vfw; I׉ϻM;W- Jy"փw3TD>^M(Mgf-IlXO ='$j0FRw#WVD|{sM]pK/ZJ0P `H/_ߎFGˬh{zψܜmG3o~sQY 7OD"`[jZ]5BTx5"4z>_WzP/ sSoK^/*ԗZ**F&Cir/GZ"625K;WwvDg&5gOXҰW'螐t#<Fi`T*o)M F.9~;q"EĵE0!"0**.]g3 }L$D3׈hWo6|ބDj=G^c"1ˈ~^1 W~:ĵM>-'xnֻQXElfaPvkf]=[)*_Ke~H~8*T|=Z͜GM&ZeWhR2 So?:P_bޘ.ߵ47~ٛu^=mDtcYE%*\Z#Yjm&Rk3xђFzV?k qD+o=JJY[@"7gg^%B!6Uhy䁲*"r;Rݥk)Ujnx۟lED 3#,̥iyiyÂ:Dyqqm?+O(WrkmݎaBAB{++2IM?[Z^i,6RpG]`c𨁱V6Ӯ'>>;'Ln/57Uk[EֺKqnD[?$9%mGgZiojc.^H/Ma s~`[ElwFff\XTzn7:;]L"274UTTFǧܦe6-yo~BR)k\PχKGy uByk1~5~dԚ3^˷84j|Λ}spr3KgڱˁbEYDR$djeTiqmX^ɵKQZVBf*V*nqͺ=*}]SRZIDeU_)(+Tjo}x'QO u\Kg # ~ov.k>Vk6ICh4*jGE"Q}AwlcQ K=T>y<4]AG3UJ)S\J;bE{6N2ߎ-؍0D|>Jo0|84MPLE%'_ekim\(Tk1׈hgcjUnbD+j_:VyUH]Yçij /iXf!Vof7_PQVi,6tma=RҨ5{?/@QTRn :ژw˧u1%Z9JS.j{Kkt~ݾy {37+T0 cafܦe]ٵt_ LD՚mDdг)*ּL!j_m[4B$7o&fI>[?f_x0'Rr J1(Gw.ի5Lcd2Yf] ~?s}"~֦5ȑyTьٳRz;kωǣ4T(k]?.%TXIthT_Bu^ haZe%n!5OjR?/1 [:Zס k*LveGOC`7|<3B^^HdvND J@c "+&%7SPP0w\"ڷ!]2i6nnܸSNX\Xͣ8[n///ǕkŊDi5#ūO0 [aa. 4#hôi&11=#0 ag3*++ M6k׮ѣG˗/5k֬M6]v]tѣ{N-.....>{@ ###?977߸qڷo.qttl'sѣGs*)^./^LDSNŗaDD$UJMM%sKUVŚ5kܲΝ;믿ZhzÇ{͛7/\@DK,3gG߿_5cƌ޽{$;;ȑ#S^^^K,2d'|Ƅ@ 3,j3w\@Rn:iҤ֭[k~>ս)S<..nСb]rc?~iv'Oڵ+uZ.f͚EDnJLL&I&o``0|a .IOOg/22w-FmڴiӦ;w5337633cr>ַo_J GգG={ƾ۷ظbVVVNNNDMlرc-,,觟~߉ulqlmm% q}:OʊRk4oӂ7m4~3g,ZtF^^^˖- e3,޽BDb800sΝD6`MjN^^^YYԻnH$SN믷lŽ7ED$ k1Dz4͞K$={JMMsw;d2WWK.9i:th>}"""_97oLMM-))al322lri9n 3g2 0L0ҁUQJJ ^LLLzu#F'hٮĂ O0Ldd}>}اBCC?E8++ĉϷCCC/_^i#F_hjjowJ777PXL?rn^]޽{=z.:w0x`"1cR9|nnnSLXdIfV^-= Go/OvٺukV5+?ٳg{{{؈D"#G&$$jՊm0a„E988GEEոKK˘.]kn׮]^^^zNcɓw;99a,M #ɸRE_  e˖lٲpɒ%r8gvw}x-B SRRen?i3wޑ#G:[-XvmVOCCCDW}o{]L6jԨ%K<0駟j{O?^pps5@aZ#QZ F0@z~7i{ŋ/.h…?KV{sF( adښ7 .0 3uv/~# ^0Nn߾=n8@Z%SN5aĉ׮]Bmj7|.7o>{쒒ڎ'%%eСRgϞǎjqÇH$Lcǎ(==}K.})j{0ȑ#2[1==z B,o3gZYY 2ݻ;vؽ{ѣG}}}hͬY6l0̮]T*Uø}vݽBCC333v9|p͌3|||mmmsrr?f̘˗sը3ҥ1crrrvV|ĉ{hh~[[AZxa7BvիWCCCD.t钟ٿaѧM\\܆ <<<R)-^߿zݱy-[};mڴ~ SSS7oέRZZ>m4={F .\d [u۶m&MZrea?lذe˖͛7//6gdmm|r.hݺuUUU ,P(988ҥKzaIDDK.0d2O:u4~}q $h4r<;;hĈeeeMh> IO0ٳww̙["^rӓzp3ADPcLggg}$''QϞ=Oi=䧏 I=6oޜ}xa࠵$//ˍl#E"%)gkk[\><X,5kP(Quƍ|OOO///^~q;cggץKҳMjjj~~>?JJJ VpKW.++ۻwo߾}6Νmv}9|pC:gT]׮]_~y6:u"'Nj=$''k}!{q>˙Ο?믿NNN (,,L$YF^RR믿fʔ)DP(%-q䨨(kk`vIV(&&kaDD|ADDĕ+W222xiô:t9cƌ}ׯSN*ڵk-[di8mڴ7vaԨQϞ=~HVoذ\ ;v <8zh=̙3b[oճg-ZE(ˆ|M//իW;vL*:88L4`K6ׯwww_~5k5k6z?'WWȏ?xڵދ/ݻ7ȑ#~ݻs·x0"SM<#12l늉F7_ Z?pBvo SRReiIsQ@a# F0zfM0@ ߿ap2͍$:::((ʕZkS¬k^Q7M[l2eݰalll>|xʕM6?ofu_gGʇQigHPx9- 6>4Vi @D/Hz0ӧ>;W>MSHHHeeevܙUM%Zڳgeff#xi),,ヒ[n+WYLk^0^7M R/^l„ &L(**:uݻ^rC}5ȎӪcc cffֿ9s?U }5Ȏ ;={p3r?jODT3P_k@cUgbb2k֬3882&&̌,$$D$8;; 3g;v}C __kFDrJ33~io֢Elllm.]zС8;;/]444ƩhꬿP;V IDATi`P7 ^y#@ a0FzS_}Uv$ 0k׮]V@5u-X?ꫯw~-aƍ_@&jTG~"ڷow[nы! nSg=_~Gfffcǎ˖-`裏U*0 de˖nݚ~Wm۶>CZZZJҞ={;vlm݈hƍÇwqqH$2, `ǎOuiu#;wʕ+mll&N(J80?3&&`񞞞ؼy3o࣏>ڵkhh(7}vݽBCC333v9|p~͘1'006''gcƌY|ܹs9GTdhaY||ʕ+]\\Μ9ӬY3"ꫯr xyyyyy-[,33sĉ>#gggB͛l2ahhiǿcnDʿ viii@@@xxi؛>GTdh,4~"O$""Hj*a6mԀ .\=ԩsssoVc}764\..**1bDYYY||>HHw=Q`` ݻw 0:udbb_֛MNN/[rrae2'|BD<Q QQXXضmZn1zh{{ݻ'&&r"Zޞ{AָDk뻝?/>>~֬Y?̙CD,s,aڄ Np@JJJ=t ̙3!!!ڵ ÇСCmׯ_Y???{FjzÆ u&BXXXTTTHHرc/\pѣGQ QQVZnݺ͛7WUU-]tΜ9m۶ٳg:t_h4-[Fڵk+**/^ܻw:ȑ#~ݻs·sDE6gi`P7 ^y#@ a0Fzkg XC hݵ3IKM||<{@40MGհ3 L&sss)ݵXO3f ~oZmǏomm-HtrQ͍j3Qy ^~mٲeРA/_:ty.W}VRRك~z??{ϙ3g999֭J.]\~}̘1NNN s熄ܸqcĉaaa*j}l . 0`Ĉl5xôVgK.dwww~/؅ .Ym&MrJ^QMAXy 0Y,""BR󓈈[hgqޟ0aٳgRͭkèY8p`#0NNNڳTs0jau>ccѱT$yjn+@c&HxFUUB:k)zgV40bX5<*gOrݵfx7tW رX,޳g ~a;# ï]_QӴ:ջ4T7d֬Y_gpppeeeLLYMYcǎk֬ :th֭򒒒LMMkzdm] ohҥݺuKJJ""".]U [rg}&7o|zqɓ&&&k׮>|#mf͚uĉŭ\r޽֡O{ثVڶm͛[a.]z:@B4h0 a0F&Cςn(##k4 (өS9rdݍ%:ꔝ;waCjmDѴiؘƍ"Hd2Y@@;RTVj׮X,n޼|PRRbmmݲe?j(;;;CCC'Ҟbmn9r٠AnܸADSNH$Ν{h:=nݺmvyyyٳg]6j(KKKvܹsW\icc3qDTz111;3==yv;v)SpFf̘hkk1c,_|ܹZӧOZl&vu9=\9sՐ!Clll޽cǎݻw=zח P(J[~}hhСCrrr֭[7ft8f̘ݻwq5j֭[777_v-::… 'N 5jTZZځܹ}Axd2پ a쿭[߿?A_|0/֬Y_;޽{ه'N "vIUU[/`DgþO<-IKK7P(;wH$#GGII sḒb``пRnŋMLL^u!W$,,LTjjwEPhii_),­[Qpp0= 6[­xbnoMD>5Ӳe?AU\\O߿Ŋ\d4mҤI`ܒ_~Ɔ)OcZZZnڴ°};v֍8oh4r<;;hĈeee\-[o]T.H$ٲ֭[WUU`BC>}.]ʵԧPZCt'|="W_q[c^piOL`;99'&&&%%^#}Ϟ=+^Vg2L&HNzG?cee̙3k%'';v+v%>gO:ED5Tff3>Ҟ͛7ȝ:u![}4?A&F1117o^|9)Sp t)Ȑ4{ȡCj47J҉'rϟ?/g͚ann. 9j*n.H$qsU,TuX?YBi UЭ6ZՓDqaUUӞ @ #Fm۶/Ϗz/eeeioUͭo߾gjj7n߾[ooݿz겲{ۗ[Yjjj~~>? B:$;;.]>;} q/Xxd̘1G矕J%[DOSwQ՛6m$3fWw=a q<==(!!P!_~A@Ctk@ {F-[lٲE$M0uʂ6lذw^///[jED111ܒ(0n ;v <8zh;eʔ͛7waԨQ vvv2СCdd3ۯ_N:Tk׮ƶlrرOu UЭ5 2=#"2e ;{5Fc_F?^)#G޽B8|pm+VD~mTTԠA[RRU97믿&NzM6ݹsgҤIk׮7TA԰'4޺iу 9sfDDDCmŋƍ۾};~ iM[b=K"77 jƠӧOō;CTxxx\\\^222<:pѣG0ɓ'?LnݺgԀnܸs΂HԶm۰_o =dSC 2d~vF#@40j`5g~#) e0j$P I JJJ %eeebakݺu ðQLwM1"R|󍻻;[m%%%Zm :R*SV:C:EGGq5W\ #grOLLdoG}Q{>}[Scƌ=zرsgΜalٲeРA/_:ty.:(\i{NLL}:{ HPx9=#EѣGGu} twHb?su>Dcd2!SNǏݷoèsE= B~U""s nݺI$6rӻwo.1Dk{lA={zߚ  8 +rȚӞ={qۇܹ3++ /8>Lc?:rHNNΩST*U>}=:k֬G2 SgYSL.W/fbbUekk[uO=0 .""c#{ʕ~h0b{=111'O422br۷׺E=W/VRRU]KO&L0a„SN޽8p+W4QllX,fGDD(:'_;qCNS9v#:ԹS#333߿DDĜ9s@L&۳gϕ+Waꫯ0[t$<<\PKJKK-ZTcBvrrrTTuppԹ>bbbJ%Yܺ?0홃M `gp0jѢ۷Ba@@%00pڴi7n ڵƢ&ׯ?{_fffTTZްaCqP# DB̙3ǎk߾=? |{F\uYkw35zZ~ի ׬Y}CFGG -]]]Ox{\@A q 4h$F0@@>MF8NyqLV DRQjH PYxuϾ5Zv~o#JL9K-" ϸ^qH#2m80];z #0nADZY(/-/έTZ4 OׄFV.^3^AS^^>wF tsrn.ʾmjJdd0xcRyuضn 16XZ:)ܭ*k4j֕aMV3SLٵ.xRQѨ e2vbSm 3SKdv6nZUeG@;1nOa@]h-r$11W* +K EF;-|p(Wsi$ [%je@d(66ok 6E[vQbR 2Iefvn\[|FԔi4jIěJ~.(Pd$leمS96mUY Mm\TU7N6sb,'"CcTV&VV %ZŹrUIDDv _1ZڴbX>Ձ7T-+2 6`ԼԋBDf+)+KK3J 2mQKϽ{^h`d,ʊʲT.toA" (#"M-Kn{ EFDdZέ3e좬[m-Z[8>4qɺz"6@HD\%qk?GD&Zָw)#_k?:ɳ+KDd(SŲyGn"8?ĬY37(j| ؿKhoԪ*=| >ڇEUUADJ}4"2o˾qEDTW@$ ͥjeeiaDj(䦒Q?D(+4?nZz1?b޽ 97Oil]EO&"C sj4j36Jd 3ʲ"ee飣 FHӧ0g*GoT* HlfTh VVUU;؜?#"#SRґĪyQ2yDfGD4FmZKר3Y'bhlu^ (zBm.24Z:Ug\Z:MLFO U%R#KV)շ*GKDF(IDATDy 7֐[Eٷ+sˋsPh(6jnl69s*eY #Jd6.\"׹0@lj:zLGuer"Z:i}AԦؓn@y6:[x:kֲ->_4[&PC*KelvEj؀C@<WB #{cjァK9#@,d(۔0ǥ:hBdzbX,A3Q@@@ZZZZZ ԛ#]xQSիC=ԶaKzxbyT=46NQm-zQ4 F#@ a0@]^n VPXMD7Ä Ν 1W;yu¯[#iGⷉaڳ#ᮋ:=s9 CsmuoG`/;\j;:۳:yq~hTLuDAB&0Y-9dDr5Uyxxgv:bi)))Gw4w西7W ^m<`V{^8^{(Aûn\9_SUYab&kλ{_nFUY?Ϋ{7_ha?FnfXꅿ1{w!ar`f2I _ᖫUcv$so=< 쓯Z]{ 5#'zzKT6s߯"n.Nq%KcjQ1;Wߌ[h4Kf=bncq޽mDt' -ң> {tAJ0P+8Fb ejnѥGC#n_鰅OInUf6wiӳHya^RBڥwAD-Zuvu| /ʆ[3 DDԱP$cZ{.l:0ax{F]""w_=Z^<7?_l41ѰWKpި#&4l°؇G\0=*rY׻G"<7!"52wr غ֢zCR~\TGDJmN;@DGgq#'1 s2vDj2`TS6J%K161;OVKwhҦӞ oHC"bΖw7òsli&,Sp l[;"Jw}h`hԵנWΟ|2ZTV )`!35fٲLADf2j["'ySsK62K"*+UpKz gi4ģ{ >=?0ax{F^'R"QQaryAIM%|6ŅD$1rK99™YN~W,?0ax{F]{  ENH]c2'6Dt3%lvFZQaD=~ֵgd>SO.@HDL =#@5ޞU3ATVU}.JVh&R5PغVtq]?q߻cbjۏ߬&޿qvu}RSGzF@DS?4o`1YR/f7wjH\,/{X5Og!btΤN]{/?uk;Ck b޺ڪmG{F:du\l)\"^1{~&";-߽H$;9 ޙG5uqBI,AY!Pڙ©Nu2z3 :v*V;ںX%"b)($D* HxBKL?8_޽~}_-8(h$?1íoii511!#"‚{_%%т֮eer83&f/^TDRi%8NM(*ml=#f ]jD|JA[HeZP_}K_yHBљ}Nꙡx舘H’ 7oӈQMM=eii4oln~w!իszm߾T󮔔㙙wMAt0zT,=*v7(Q_ZZ"%fa*J&wvvT(0W$_hW/lNZ0zFb*ʘeJtww\ɐrB]Νf75 F06&0Eº!TUU}drrEZ{!4oޜ* B*ؘ<޶IWRRSI$g sccrAnn~WWvEUcccR9lo!JB;w~bst)#M|R,,,IK{[;}B\ (**#F 8+V}}vj߾]s~L>YjBg4Ȍ&V1Jev ''G77۷RR*m3S#"ŠJ<@{"8د3ęqqk̬̘(D5݊"glܸ.3C|}H$RY_ )sF#szT֌bYB첱"S(=Ws2qϞ-bq0!N59'']fcc5kŋ)ZWWbnn~E O8moG.J42a;LLO_>pvvR)r.OS+k[B+7l4Lijg,hQ;e#.~Yq;?FXw;X_(rqTRv䉿\<*i \b?w}S1mJ\_bS3o_W 9=2v =uR hgF؝цt0a<ˉ+fJ n\:KeDk;>JQЬ \sq؝|R]6I&ҳ!3 32@f ;z0aBۯW|U2#cÎPWa{ ,hXٟ]ڪ](u(䲑! h茦7 Yzvr6v/콴$ y[dFvg4`tF! nJB!tM*ˮzDF v6Fg!M8 byF\soӂ 3j+奏BN/0FûRvSȈSq6 F0 K^3W]N}N-7X!ϝ\\ ng^.Ya#cx]9VcC"~n: ??+WN6,WOLL/DryF |Lt!EnE[!kk jØDI. ~ii9xO?^<&gL^KgΜ,>iYfC#gXd2y'RT±XD!C3:J4i14rVH$7`J:ttph/ȈF&p`$bb F F0!нL&FY2ꍲ'I0d(>>dNz,+))nj3#NzF$#X!`<`:e0n1`|*mi0PM̻SC _eF7wVw$ vÚ#9iIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/preset/images/paste.png000066400000000000000000000546401475757676000244340ustar00rootroot00000000000000PNG  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 IDATxg\SgI$0d+"8(Z *(YiEk[G;*jhŊ"UpUDdad_=M sr}+Ώ ( /ʞn"!JqψJ.EP(#h^aT-+^Ƀ+t;=ޛ|p'߈yDvk&>fωD]Ufh&ta<15ulrH7f'$"?v\ɪ^8ݏ=Rn?L]] Oz=HZ;s%(ͻNiomiJD8&Qs*KZS ߄n=TK/o;JSUB.WڌY55wrYCg/\T~~K'F3׈J/&\ TY%7~,BvpK;~M9f4`_>2i믩[:G|bZ#I¥[/FRY%'1}Z[[s;|%e&FBse+iJ*z.Zg\o+sc"R=y© 7侦""?HDYKG&?)*V(J 3#7ZM¤v_Sd}'-p uJ2#NSFp1u?Jj6D-]MJIWȷsٓQ|bְjب+Yh9 VF3Q^uUѐw}2 [[Щ}GD+#*|Юr{+ܥ{¥[, цoOV^1UTTeddd  Hz>*,e\\t` \!~!HJD#ce'b~5{5P˹T*$#ZdV{˕&dy<3Q2kI7,*2\"{rҵ ØKe'8ΪO:;2eU_k?i/<^iYE]2AOq5|TFDbScڇ:Sv{1aHYZCDg=Us6IOS;nNKea(dr %Ӄ|tt-}O*ʵ[{_}Κ0DTTR~&FBvǔOt}4BP8RQYxq3J\@D f~+=Dxkhݷ~jⲤ N`PN"{9{&SZYyovuiՂaRmߙ1I KO_٧ۣR-jќI{ud\U%rRlGXfdw岪ȸu3qaqrD*"\_w8kyK?hWPҶMǢ%͝2}{sFlPF6A):AT=z\~jZ.N+,.#"7]\W?O;\K{XTR~n@˕{^VU ;ƅ˄>vDbRr-Mgnf.ΎVFlzSwx=\> Gr&vL"񘺚=wHUn:0Gto^Ԣr\Y\ZΐU zATylORvB}=UT j]3Fc=U뷲F"htdžR*hpNQrJF`G} t֎-ryǢ㐙B^Um2 [ЀҪDfvRYK!!+s#?i˾EҘvDzqk$ r\.s=K\.1&DJ\dUVV?~{ p=#8AƆm[[׹Cj9[Y-<JBNr[$)/kKJLDUurK.W_~eOƏ&B\p?rB'̜ʪj>!"3s3"IyĿ{9QqySԺ3UM/׺^K\ =˜ah7zG9Xiy*R$)#"#\я_Ndˉ,|hP_Vǥ|Fa}:_O)Mssx̔a]U*e\;Р NgT˔ #zFSԵZ%ui fiũ $RYn~CK[3>P(cRcRhc FqJP~KH'J*ͱ]kUT]קOe.-X7F۩\8ZQ]RsC#]Բ+FʪZMX:N]sJbl/TxZwWwdUB}VVz9;Z Rէ[{ JzYO>mk\C)jߣj|reBU& #U߿sP[_?GҳfwlgԽ{ϱo3]X8mϑS)ERw\1nml :G%e<=N>okWZ3$]cJs%R~ O"Uu,ZNbo-]W2 Dt}n+4svNκ_Ohxm7=u=9]UU"ZkV 3as jtMŅQ@ J@s &g#͛7])**7oN2o:7ogjժUlgپ}]EEZ )//UVeFDTQQ0篖Ð6CF_|n {3f 0333333..9l"..nҥD4}tR FOxEӉݝ ^׮]ꚓsҥ~K;vw꿿u떿rr2-[lܹ;w5jT``|/^8k֬>} 2dՕߥ "4i×-[vMn;2 qbb"0 ì[NcU.\֭P(tss;t萎0T*Z .aZn-:ut1v.]""rvvfcǎ{ܳgOCCC^0ݻP(TK9rs+W\xq'|Uq9ܹsmll9s){Y!H_S(yyyߥ={8p(66b'ܹ֙*iiiihhё Q-7n9/{%m۲ƱDDd``=4KKK"222})mZpp-[&Nx%K?1QPPкuk.BBB+׍j{9;;P( سg3o~NOul@&y[ZZֻ H4}of۶mŦF|~]WZO ]=#" daaa"W^O߽{{߿͍bիWĤ ַo 6$$$$$$pwtuuUܺu+==]*C65UUU}YYY۶m;w9n ٳg3 0L0҂UQJJ ^րS066ݻcF>F&.\8sLa""">',Yo߾999NZ`r TX&&&/[ruuud=בƕ{ڧO'N?Q.] 2f͚qF=#]i7:WWiӦmذaٲe-ZXf@84}||/rѢE{i۶1nW*'EӟJDDG}mmm-GߦMvI&-Y 88822XXXtCq,vNTУG/bbb1WXknn`Ŋ)))۶mSl2D^j3Zn{gll333@eSRRďo?eގ3O?zͭ[M6!!!H"xݼ1׼F{m߻wO,=zٲeh@=K]O}g +^[ ^eZsа F0@9kWO{?VxMW\y~aDD/F_yXJn @0+FVVV7ONNffmF#@4a ܹsg<JDgϞ=zɓSSS5P0F*bvM|L___++ Bm?{lKKˡCZ[[߻wo?qℯ/ 3gΜM69992 o߾DBQs7ܹӣG//Ƞ={1g֬Y>>>666yyyQQQcǎ]r%Wx;]:88;6//oqqqlʚ***&Owސڳl(66644o7n"xU??3gâX@O+1 x--޼y{eee} Ɣ":x wMy$@ Pؘ(uD"a^|_(Ι3sfff|>Wdi6@Ps*-- *F бڵk]K8OzzzaazIҲ2+++sssk.YF&Q!'))I[v$] ݿ.'661G`o&)))00f P@vZT*tgڴiDVVVN)//_dI-..VNJJ fiӆbbby"##FDnذYYYxy˴:v1k֬~SPƶnݚNe3fl޼cǎGfgdoo_sL7nx???wFJrӦMzhhhdd ƍ䔜|ȑ1chfϞ- y^zƶj /2fFDo{yyY&..ɓFFFSLq7mܸqڵ-Z3f_|'O?tݺuK.ӧ7?Q.];0"ӧL:#1bxɏnD54_/mg@Ν;u!qqqJJ8}8e4 #@ a0Fd# ^0nZTT0aaabWWW)AAAvvvKR¬klQ7M۶m6mí=zt-[U_y%ꭿˆuҥK/**Xf_eC_jMW/ DDIf_eC҇Qͺi:0aBUU{hh={rrrjSk 3N Wſ8pui5(44~ذa?@Dݻw橷.taTn#"\>fI&M4ٳ tu.t$~V;>1))I#8 ذaܹsKKK|.ךdCQNBDkODT#P_k @sLxΜ9|󍇇GpppUUULLl&LNNN|>'Otww:tҥZl^0"pSS_~e֭Β%KY||򐐐ZZSm@A4x!a0F#@LT~:tD ì[NeQ[ ad֯_pBssO?믿ѣ۷?~_k0z:#۵kWϞ=MMME"QNVXQYY>'0 + a+Vh۶-o;vо)))Æ 022իɓ'՟m޼yĈ"H,b IDAT޽^eZ͛nmm=yd##Ç/Xѣ111zzz'NX`AVV֭[H__]OOO>֭[HH7sN=BBB###3bj6k,@cǮ\r޼y#*40^ϟoѢ}Æ _p׊+'O̭O>qrrRE||WX> 1cFX< ,,lƌs#*44-~'"$""@zjal҄ /^=8qb~~CgD*J"斔9R&>}Zc$Tdha˗(00P}ݽ{j7<==էf'Z-))ifffbnѢEDC]Eرm۶6l3f]=g% j,egg=$lllj._w9sQQQs%"n]1jeڤIΜ9STTtٳg'&&4-RV4Y`6Zhlf}5kd}ʕ'N2dk^di9zFZyzzQ\\7ovvvrmvXGlvIIIRT} ;ߧ'8uS^s ^diGo_|V&"\>w\J;hY%edd˗/WϦH++` iӆ= nJddFh?FTdh&j_{=^z}k֬qww뭷 >ҳgO?155= :tGѱcǺ߸q )M6՛&L7nSrr#GƌGLjl"Gzj//oݺus׾;v|GoRZn%\\\""">uUVVz{{/]O>?Q.];FڏuɠnF0@a# tTϚڃѸk-g&@;kkӧO7 vx.ӴT b&,,LcXZsUkΝ;7vXns5̜8qH$ڵ#GjGK57mHK5xam۶_vmذa1bkXT* 0aBbbbPP{gƍch TzÑaGGGZcZy ^|5aհzk1PoKT P/4Ҙjn5+@sLR5F겲멷2\kL5֪aF9ä$xk}V7n640^5SNB\7D"|ǵg. KMMU_P۴z54T7xΜ9|󍇇GpppUUULLiU[SNk׮ 6lX۶m MLLjyd]\ ohݻwOLL6lPPP|xjXxx. n_;{u̙3֭>vȑ#3gΩS ~A++իWرe֭=0˗/?vXin4M\ a0FWP F/J5G(#hP p@gϞefԨQ5rss300(,,hSv%a Jծ];CCC֛7o1bH$wXJP^CBe˖~T*jݺu=zɓ_MK۷o5tiiiD=}tHҥ:@WgԽ{GEE_\\p!55uy慇[[[O< ,8zhLL7lٲ%'O޺ukڴi\YfEEE;vʕ㖚9sO?ԺuPo߾K.˵ٳg[ZZ:޽{w޿'|}}jeeeuJ۸qcHHްa\]]ׯ_?vXUuaرyyyj(%##{'NLMMNNN>uT``ѣ322>t] : &m em߾=***^_~%0*5_}]V}KDd:u)l/?|nJFF eee]tDǏQΝR);K.D-7`rn+W|M!W$44T.v>oaa>=33ScU X؉۷o'`hnKr|b DFF!QQQVG,7ٷiSLx[nTUUڵښ)KqYXXlٲ°}N:uޝ[9oRT$77dȑ2+m6kddNDwe_z…eeeOիܜJknuqrrZh_ͭ `;::7&&&%%7 C~G\z딉bH4}5k>|<矫fϞTRRRXXɓ'KKKէs%CخƅOQgQ@@@_Bi)v֭zS= bM4u?@W$䘘[\^ҴiӸ)ʒH$0{숈aÆT͛7M#T1aÆYXXKVZvCzEGGq5xVadlls O8߫o߾ZVyرc `͙3磏>dǏ?xAj;wz!JCBB&LzH7o={ܽ{w.]Ο?ΰm۶_vmذa1b3LӧOBB©S fիFJ2..M6Q.^xٲe_رcʔ)\M6u9!!ҥK5nMOD_b0$$wƌ^oܸpz̙3[(DDDK.̟+ M3;\8q{<`K0'''h5~" |,lQCĉ:}7]Pzd|>_*qEqQE"F}ӧP5;EZk&؂hzR_Jڌէ=,@о Wſ8p;0aBUU{hh={rrrxiRǏ;{B۷'̙s a zkI$ь5 llljVpӢuGjnn?lذ~`#;<<\}8^OLLLll3g ط\```ttteeӧ5nfff5 IRhZ]zuG6iҤI&={v?A_ΖLS6 6;` کS'j4QΝ;w\¨a a0F#@ a0F %hnW9Qv3oƆѹbs1N4sqrl^%?$-x)]+kyv**ЏWr5jH(L4hF0@@"@4$vYA\TZzMEQ%{pض/yʌˇ&0<ԸcSmE^YFVm4 K?L1027mGlޮ*<̮и}+ʼ^{z"Zz*d[4o_FEIB^iȜti޽jDR ,Mm\ =^QO204oQOh(~")bV ōiOZok ZPx v˹_)-6w|CVҢ1m۰-aDDףd#s_`Wʊsݹhm[v{zb;@)JMm] l)ʼn`dnb݆>J/H6<0(ۦ`dohV0EQUaED pJ}_/4V)l=^s/00h)ϥpڳ]ե5.kr.^a& ÓW|=a^ulۆm5 #RQ~EmLm\8$R*UJ%ˊ+K Dbǟ@,>SvTJJx-=Ԫ8G^U퀎x}sGwݐg]{6؏J2I4?]=ZIR(Nc1YZڹ+**aԘmYJYA@I=ݫ%YJɲWO¬kFB+cKAۭQZUTW>I74>yyY1 M=`+˕joh&gz"SDD$hd{ֺvn|uˆRcڶٞFp]VKrRO3 ϸ)GT<*ɽڙ+}t4~i=jё+ZrIDAT]xRQED֮oKniD&N a q5TƴgݻZkho&oW$TJxRcڶٞ%UJu;_i *9ldT+ eE[g6|ӲoKFukل> ].$CC[CK;7y{*K T*@_"Jif{^^MW+JSgSB^QϽT*ͯ|6jREuQ-Onk\T6kL>FOWeҧQ˦1JfkgbҼ{kS)/5ʉ$Y7َ:,ʼFDVNͪui : iޭsBh^ui:].L M4pV$2I}yQ7ϣ X E 1eEz" 1n`d^YV7QOhB c(L-< ғso&L TV<Y84~&6.%w3FF6z?Lgئ]EUz*$yUeŲ Eb7kgnΪwa5$(ocVf%w*K+J/4litgȼeG}Cq{LR)B#/z[v֥=://1ȸXԀb_ WMf|>2(.*ֽ~^ϧSRR)vj, a0o.67l[ H( E8a key8Pl|z@󗓝~έ4=#J~.р^ϳ sF;~m F0@a#{`s;+p ;wlr&M7okF;cnxzy?wǾywo&zFG=gg犊 k3F¨ TTT Ň/FJsE>ʩ fxè} 346qpr8PSmQ΃6 Omݽ mw Uz{&"B(aڵKi.eM5.!YWꄑ$߰'0-vp%E<I𪅑7<|[:˸q' _>0vIq@O5`hnK$;+=iiÛ]z6wn$gN\>syZ蒮=vġwn].-165k=p4ZNDb:ΟD?}p֊0hwmJvT2ۺѥ3Oam\ֱ>C p5mo]OR*mڿZJ ܘ|eoMUxYQ?ص9ŭؼTRtY2bҜ~&3?utMovibf^ZRyL~&vؾι{۴O‰6Ĵ /W.z[QswlIaԐE5&lQA^&foxVUTh413swnq\oNQ~ųZ:v}|> ey.Ͻv̺.][ddW6 sn1 NY^sKknʊoBGaF&Ds_񓙹7[yY)9: zl_g– r5: ؉3Y2{g[k[Kv-;(_cmDvRѣ}=;WMD4|썫$;~0rȩ,{1 z؇+ _8'`3 CDQm>okA' WUUks8=zER2΢-;D*BV&ROwn\şyv@G&f'ᒈΞ /k@= yuD0_D\5 ^ب]UlߩZ#UcKv鳱Q뿞h& BC#"2[pSzꟜɒWKsGD~Gιyr"2r;? _!+Ovر$R1O}â-ǻ+%ezݥ֮oܿwa6x<]{ڷlc߲̈́vn^viVT>Ly풥WyW7>CFZ>wgk<ҡsaf{βNHqNaaqUUsK__¨vNn-.-W.&V.B}#)Wq3Rϸz>_`aeP444#/w@A3B*Y[@`AAR::ww9MDǍ"#C {Р>7pdd̬Z33zFp JB4ڤ@A[odl<$,X,&'b4ƹR7_tS65ffx{f!diIf2DZD JKouLuu Ԟd fqPGu:"nωXb$쾿{[w(ѐN&?nH,O9zLM _% JJ*RRN\!TS3ǛEEffut?|J / /Tݴyޮ2pq_ kYiSaYYy))mmm&&&bI,twwâCKKNߺUS^Νt;NK٫VV #W#3\T_2$V<^+Mm]ށV~d7p[##2 [_VKJ{[ӴaS;! ,ަpXS(k߳Ol ,KiA\>DJɡW%CkcB[[E>jmg0 '>#&LJ [}e9M|IJӆi6xF>Bg{+14枮ΩfR͑LB (L4M,p&tX3$,LM 4 @wo~u[:E=%|Fa8ihk=}z4, 4fQEɵ{-  KfZgk_m/A(LY/;$݄+1֋?҈Lv㽪Fi! ʋ+͙94 HUn5+η [z(L4M,&Bʅ/M!ߟ+nnXL.N?{3JT*Fo GZ1b}c8Nbb⏧wO2VHILLT+1"B|mUGX-ZӿH M\h-\8 mP[̷$>ݛƌx,TKq 7sIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/preset/preset.html000066400000000000000000000041041475757676000235230ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/resonance/000077500000000000000000000000001475757676000220075ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/resonance/images/000077500000000000000000000000001475757676000232545ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/resonance/images/resonance.png000066400000000000000000001264511475757676000257500ustar00rootroot00000000000000PNG  IHDR>(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 IDATxy|Td#$$CVT܍+nU*V}*.Smպ!ufe,a  ,?&&$rzzɝ;s9{ju I"J`xo=;_aVrd МNaQvR Lfd;( n/ڱ$7_o]~ׁw}NJIźഐn[xגOݩa9}Cl;~h/=C6>-_M֟֠րYrHkدGk3E4z@]x1mtX۶]b{fMFy=<V%%&wv/M_w7_u`(3N9WS x{Heu2mޱ_EaxٓG ֠~!{O@$l+v1j]}t74/|_5*+Ko/w Kt:c^ٽW Ϟ 'Iꝕ~$\m\nj_Αb (vUN=>S&nw`Voܥİޡt@ڂ? s&i =TUS?uٹ8f鹓T[רVo%ӥ?D'&44#%ڑɺSuA*U7?X:Μ>ZBZzjנ$+Ƈmǡ8}@lWf/%I}_GJw$ZMWkTV^kꭲ}Q fh޲ھp Szej}` JeȽ\jJdȡtovvVO>ZVobѴSG7^^=J+wPoiZzo_K6h]ꕞo^rhZ l_p1_wι@#8Kk)*.ӏyUt5K*+ %I=RtQlVѺbM>yh+p}tճZM|w*%ISgzуu'Tu镏$I~V%-WFz^x7^}Ъkںg=x#ŏ$IU9yd@m 5#MÇ!}TXW|NTV^j YrH lն}9VTM7Ls:C9^$ۦ%}<ͯkdK+Pz9NJqCuUԯwFP땤Eq^UVW 飛>SO  iG]$I%GTsV wUFNO6jmazgR]׎Nu$*cѿ+)ɉ:mH-[MZHg:,\mNLLYGn60{Uti +;3ݲW'⥿0w>I[pØau$&Zn@?{I-T]C$il]_pl*֣|_vljeeuVۮ/6CwhJ'Y骯oTIN53y2sb]=/p^nY.ǞH1IR}Co'*,ګk{z~ɷoagtxM]~[wPAwYL?Lq>k-^QS z%/~Wɟqlڵ\ǎ,SFj=|Z\~$\l]7K8咤N?IU=jjrbq]elW]ԏ﬌T wϼ/!Ţӧ_lѪ;57o@m:ki6(1!AY=uAT =zћԳGr]ZݒYs^E}wƍpY+ziS`hw:._}UԹsӯ׶9~߹ղ[~:}O]UVzw㰥?Vm[I>?+,^; N0PzǺgڅؖ{?=v?\q3ӛ0&Gv>b'Z,ҝ7/&=NY,߽P3&i]=Gr8z%|tgeN$UTjW9f^X_וr:\sTФkI ;ܷmyO{x^Z!IZv ΟLڰDNnZױ-O2RQzZmu;tQJrN^~ăn~ty11O~M/yp8vCW_4U wɡWfN>su M;e~[KWmw}Vz'Ѫ?|wojW>$qySN{uu:=F8*-]=5c=%c{TIQ7T[רGzʏզNI6Y%&&h\͚6J#bin/T~FWoܮMw^Ţ?d?YWOQrr^)IUy鑊c^\&Z빃z+eG~rա#=|@տ3ݪ<\ecuZX5uJ뙢Os~9%$;{>bw>C9Sq_v];㒤GY[9c}X>8xrXu *#-Ӧ[;]N=WX_u JKMMrP9P h骭TeM%G|WX WxyƷ@*9)g46V1y?ۻN}I>ksŢ]Wx_Uv8cִ`i\W3vzs= ~]uMנ~J\NtI@$ì0ʰx u=5rh?D4O>Zy̳\kZ67;ѪcG^{t}vf~ve2'׀?dճ'nwNLɐnWR‰{Jgߝ۝zY M'&_>ۙ[VWf;"ֺUL6nl6͜4\U=ӫv =e[~7O/RJ}ep5P6د7Oj*)=Z*}ic|]ד՟h5o7 -ڪՑڵ銪ZUTն{RuM2zզ9N>~_S]6z7ǫ |9RQGkׯz߁;JI:inѰhugMuYIZH)ɉo$͜BmkvfO뽳Ncu>P`wf; 3]g0wn3FhN3zc#'ӫgvΚ>J3'׎rҮZf*kGt 8|eػ5۽& uvt˟vX>.y֟`ty زcOvl9-DWԷڎ}t#5'Uq*=X%om,[3oPIQϛ'Zɚ1qϲs:]ןWr::gWmpbk/'jb=25ꙗ?V ^i=<Μn:>ޟ6qoyĈܾK6{.*:,@NTWg:>?sgIyeO\ӵ[]u!}4oVR56xSGza;xZ9纬U{էI@$ì|˞_zVp ׂ>L =dU4UVj[q.ҔhƬhUCC>XY3'Ә4fx?MUݷqUTyKUD_zד{S{0}_GK#3KgNۮuMZWXut;tic+Uy[v?j{Yݮ,X&:ar*gWkݞe^9i,\ڲJJU=8-;&%z].d])1qvoV'=_9Z-ܣ_䓇H*kjn:R9W̐MrtԦ}sm]eHnu;]g2d@z[uJJwХgSRRv9DM38Hvf18|ʨEW^.mW|GEFz3韋7ti.11z7ʶο7_tI:'I@$l?xy-Vhl` UOXl{[MW?LNKNJVKHh7NTݡ7?X7?XJ롚 09a ۶_k¬NYg';܆:ٲ6tK Jaӌ{zYnAY7Ǐoׇ˷hGI5*-5E#եg\N?m>VDStu_|xmWUuut7NnQ};+MGjUSt-:ZUS0]_j1eyd}eѪZUWBE{gh\]xXrZlrdi k^ZlWݡK@8 0%9Qu;{:y.ԇ+hrUWBd a5cЀ۴I 嗔n<[o|A{J+ka2f.<} $8jl^=tEpˠGJTN,{-ЇYuVʨEW՟>9?Wy{gԈ>ڵS'.Pw(mמekwjr:]0ft$W}z(Yw"fǰj|T|R+=TǞX.K_6YgOIW,_[2R>۬r\SOɥ@ ͸GWcJNJ>Sd,״q5mVo@P':l`tf$I̻BWR*C9`6Ya,Y%p~~~fSAA-|ؿnl[4#I]P/Ocwyɒ%-ϕYfYfYfYfYtGR숫--Ĭ25 1))vE3 FZضߑ=0 a6]U׹: Ypyya6l,=0 a(@8x?|,TA w Ėg{ TLY&Db9ȶ,㊁!σVʼ=/qe Kl6[T7zvj ؎`wu%K:]n׻jpD{O {l6[Q7]>fݿ@O;.]PHig}";c}.'1̟4vY&O {ebd v2 Pߨap X¼<}3 BeR, ,~_,a"(Ї>u Qй4c A,VP0tbзl',@P3/ ,_a| `0kfP*̪d'O0}20lul=^'cl #I b۾¬_Ǩl4f l Z_"ff1QCP-H ~c¬'9L8}1 @$10.ȚiBlY%|D3ZY2nP-ja֌[ܢ[ \xmY0kƃdh+@|M`<ìY0gcģh}hgEYSN|m8u/֍fq0F᩻-xs @F\YW4`K'GAw1/C4WY@+#ҰX1-޲ a6l`oVʼ=/qe Kl6.($-e@Nd2::zoWcohױ( {ɒ%.W]s{50ۑ`{TP)`z5(unb-Ǭv#>2轮.`ϟ uE=dLc\1k[P/0!F fl@ln3,]L'W |.!&~,u"ߙA?g a pB{/!a@RjD) 4f΀ c$ |YOssM0ì+ l m,vbөR@m (a! D|kYsqT Af͂`0ǂ)at*L>q&4Sa6NB+ @?0Iԃ IDATdPĄ0St 4 "aGh'lDf Ǝx:˕has0@sL`q108[~ "ӯ83 t>h@E|`2wQ쯹X70KpA ÅYKe <<hf%NR@(,  @8I7Et.(al}"0 4^:UΆ"U08&sOڒ$&׺_[hvb?c Z9\=+6F|Z1Cz_ˈG2rEͅώѱ &?l ڻIA/'z1cf ڌ~ȰZWy+;\8??癉P p^lAZ3rl6 WmAK_(f(ױXYm(Hm53x9Q$(o\/.H K,u v1idFCJ Dna &'^ve!aǝa6 om\=^-`a kapM&2L8Z:0}-`8  B ;0 :}e6@v ̂A: cq\aZ7^Wa4>Q0K%lQ>0)&Dz7vp!:Zn@,@̄Y:"#'8IX>fhf^ .̂D 56WDH{8Y+g a֯ & ~1P|փi3ƒD¬)amgfF}1`01Cge><0a pf '&• <@E't`pe 8@E@o0s ""8# p.Q ='ZڼNiìF  qGLfAg+'B'yPN0`dbb磾ގXh&ik!ٿP+?eжlf3vo'V_Î ؗGe[*`{[Ѭ~slsAsbZ]̻BWv7HlJ(ZG(EJwp%20{zlasF{;w;ڞH+hɱd='2B3ZVtUS8ѬH}pm%K:}ݮw=?ϹUn3aW+x` `,:3[0`"6x0k@8CN\W=,4fW;aFIdi.&uWv@020 8 s)YD g y :fkx ̟/+?0F|4_@ ci[0 /^a~^eh_"f@N&C^!\u, ,L$D:v#AY0$`Fa ' bN=gYfpR0KgI R] }xL.:mQB-aΒ&a\ }x̎%m&\I@BLE&%&h&=t^Y$p蟁aFQ'G%2! `{t8>hg@K'>m\plac>Y$/Ļb`vItQzp50vc4 hW8S"_52ʥ[;n,a &Bi$BJ<`DWDB<-> @N2~(@?M)"zul10GAA{µhԍAįr0yy@Hݨ`q%ǍWj]8vM*picM %Z^_hj˧s;pv_Of ڌ-~ZWy+;\8???:` -ԂWޟkѨhGwv\^@H{םC]m`mı0~묻eLۍ8c㊿uUvgqӟ"utv.Yz^6c9,'= n5&"'?X+GhnD]<(B9 '\pjf\@NX;n\a8l / c'ƿ1=@m0B_˕Yb|3Bd0 5:\)A6Zs3,y,9@#ύd="27 p.uÉ18sXg0KnW<%Wf 00UY`Z8%@ d `>߸iu9Y"X^ј7f0qe``ܤ/2]'ѬuLt '| #x\EH#mK\!B+0ew.3p"vpE0ƜqU\5$c DKYgs f ^} _c]P@2)N<9 E I 0o0+|@cw 7@LI xm,N9g9S `   u}cG0|y*s6, |@q09a xQ>@-Q|fA'011X@7Vʼ=/qe Kl6% $I ;)_ v@m gD\:ڟ`li seZwҦ±ofi<ώ[%Kt\ݮw=?Ϲl,lB3 z&7rߺFL:|"Yޟ>/zLžFnF֝cJ% 7~ ~p:ۈnfl=~ f54@gc nYńЭ~1ۨ o,X0&,` Icq1f@†XYAq2frt]fކX[`,&l6gR`@0 YD%fz,L/"IY0M@C!P}4s 8Ea֠\  )2e8 mfM@;fdОf g^@,0 naA;*0jdj̱ YDx%hAc3o`@B6@#",n~@4 =s Y,!Xa+paƅtbZ]̻BWvp~~$fQr0ny˺:ZOW7SyPOX0_~ý<):1ovk'.(y%Kt޺]z~s߫X`mgwڴۀ6? f I5 gca,^`>W8~,Qƙo@ga6qEX 4銆+B00|Y '5L w a `m:;a1988C1ggvK_fe! "',\@  iq0 t?WghA`~,s+,1^iOY0 2`fg㫞/JkZWy+;\8??_d٨]Py!uwn:76" и+)zOx/h~}ɒ%n׻jpa6l6Os&nڮeeB`>3vH }D3kh7+O|bg;wvtf;B2a ߙC@l)^ 0|WY~YAi'P f.0J[:f,!^'A 흶ʾ)h;,Yru ֿ(pu0>󙭾ލ2'Wp}mO_^(3c> ~YhO`ZY@܇Sda@x| h&D{,F $ o9aH@yJWѠf{(q@( ,T.(9doj+},Q 0 EB ?ێVW;'fDEpW[2 @0 @0 @0 @0 @0 `"zeލzRJݮw=?ϹU̇0 nIVZem9sfΜn $鮻̙3;mO?4r7bhb}b**+˧]yb,~fmYx:j2/fΜVO?WeOB/FSNixz^x}.?soEt,xb | P^^) KSL *S{{&yoHF~A\_ҭM/S4hhg^he,U_m҈15!oV'C1Wl3ORhuzko7t{xP-lZn6[>a_HJK4 teڭꪼfJRӚ4ldi\9XM:TY٥hT4ܒjT^2JUY~#2\OK7؟ìEsm3U\{K͘q$E}{$i, "]v[[oݩ1cC}5eJ~].bE?-Z UVH|P0 tWzO6PԽޫc[o0L^vlkP/W}{t:ջ@l}$i*}:XS/Pk^f'O29;2w@nw}%IǪƋ#lef7K鴨w M&kTlmOro@F0nft:Z_{ *)IcƄ~2WVdIر5~-0pqrS))N'$_[< V(%g JJryEEu_@ryUz5uT[[G}T[lQnn),,믿"UTTH~+WU\\$M8QzY>sٳGղZ?~̙j9 ͛2=~硇RNN~Et;Kտs9馛Nh"l68p@uuuѣukĉ7:j#O~_|Qk5Uz?VپݞU#uڹEe&%&%(>wLEVmޘTjkhYoOuѕdoJ=^vkcnԛ/$ ;36(vbr]2pX$I?Q {~$iկNjhQlR߾ :$i^Gk4UWUWoHHpjܩڼ9Kٍm:2cG^}6nرdWګK 뢎c}jlLLѦMVUW'ڶ-S?y!ڶ-Ssn(SW_˽O]pAny\Z~ca8Nyw=[Էo~,4rrj[-S]_ի85hP}l s;uV͟?_׀4k,]{j~zJH/pرCWVnngRO?T=\.T__/B6mҳ>ϤTÇtRYF?AbەpZFxeH?>^MjjT=)Z`z{lקּ,ݢ㫔x\6e&:㖓GPy{ 0^s<=8ef6)9٩1cjfMgpXԻwznСCzr:-:v,Iש(cT+1Q0ׯɋQնI?$mْZ͜yDGtX\A}nG֬Y_[nE Pyy>#[N~iСYI:u%(!!A]zө/r\2eqUVV[oUuu^z%=;Og}F)Iz4|jժU*(( A{Scc/_]r%/Ţyy;H^|E 2Dol6>Ak%\jCU]] 'нޫ!CV6lPSS.2z뭭ա IDAT=zxiZr0j*׿֏c]xa)` I;uz>O<&yl4`ˮJm['N (TWUẕc&[.[g_|u_k)11Ic'LWőj ;]?;nޤѧ(11Q;}/W}} Tv]PR؛&{S,ԳiL9ҔkUCk59|:~xӀ+$zf't1ht?fkPV*N;S$kzU__;v4):餓7;e7~x-ZŻKӧOx.ۿ3N4Ԁ[^O$sM=9N=6&߭m[qݏWFUWVvoOLjώ-1vgC<>j^m?NZj߁u:t~:7M[6f딩G=vvJ UdX\7M'sZ֚dUM" ~m߼7*&6sC3tLf[jЗFN/Y=یfw cVBK#F;vϋ.:zY[\ ֿ5Dٷo}rZw>h=6U74$*1ѥ~4vlDW2͚UKn۩Dw T^nz-y蚀꣬jj|?:5ա$vn ӠQKJuYђ/k?p8|^ +Iٞ{|FJMm}v[͚5{=Nz{s N .@4|pzZ~:,7447#< .Tqq-Z*N0A^zisvb(7n*`NNz-Xgu:ڲe,YiZ}w/GmS#ڵ'iZk>Vgei&w9'jr]]~_iԩ r.&I{vn^xaí~UKͿhTU?UGs}\=<ZT>y}yyL}}`-: h") z妓uU|ĝGR5=7ôJk7L'5Gm;6z?Kh>;pԩ^'@H*owKǵre?}@Y,.SYYO:U \))N]fA|X+6mE]$%˥3g;?Veey5u;k,-^XZ`y=czꩧԿ`uUvcƌ=;vwWBBn߹C<n\˾ ^'Yqt.-_39g5&C4Wf܆ ka"ߕ,twwgjkƏ9www^(Ĭ]`ffԩSٽ{7ݻӧרݨ);}}2999k˖-\tu֕YR_TѱS\:{7.72lTLL-liץ@km#Ͻu:|*89(̭8*Ueϧ-BB*`]K P_ɱ_>( Gkh0]5,4(}ښƍy~⇰`a39I=oOk|{Zk[b}T>>sEzzW+44%K7iPt96!4ĭr'O]̕+W|777_>}:H$zuTv#//3tP9rD>77FMyRywqoΧ~uW2!; JewҬw˽֞όԟg;a cIf̤ٸ}kw^'iTu٧-v46(md$d<-fiȌ&l%{fsED$2 >>>X[[ ^^^=z,FQὪɓ|W~`߾}iӆEp˟R),] ./K^^rJU3ǎرcsǏ/cE Vlllt `ll̄  А={Gxx83LLLdoq7޸Vĉw8ƱnR >qŶWjoMի_|AAA̖}9{, ժ&.N3_322(ןmicDDD _޾܁GP"4ƌי>}:yyylڴ ???  _}FFF0a„*LJ,^}Utttx*d8QggmM \ΐ!C'%%Ě3a kn&\Bnn.k׮eڵqSAv!~:Qq0UqlU@B4  7KכYƈ9~Ȩj Q([?y8k2J&%%=q#.;nWk>ȑ#% ټ OO2KWZEg*Xl3=\iJy1o<<<<1c6m_uyxyyUhHP΀JIZCQY=#s OZN{= yg# l[I-r}VU/7:Sg6lbff<9V<[ffkKj|Rc `1:&4gHPBs ځ'PR h.1$j(jcx5 '[ֺqɳcwt]ZAFWd@ жuzyHXjN˰:*Fm_A#77R1eº%%bZѣ_ G]Uwn,yY&F\ G!6҄ 9FJvNdpdG7[Sqcz!ffgGWg3,, UViՏYcnԴ}J0֕*JFzdk@J>G)LlkS>?OJJedXiG9 7qG] yf5k!f{T GY@PSߦ!\5muEPP(B̊vC%}1$-ղ^oV$}ku3]Earϔ!c&^4i>ST$2*+]ze(d2NrE]ijˍyDͨdD> s Mפ,ꆠ.hձ8bPz f(,p/K3szH"&҈>nųc(PJY15 |v~s:.ġu3ENjN1!1tG%kMZ:h/ _6ҪZ ͑B qѪ}?t„ՌkjY qt"힜s'-JU3GcsTZv#>G׬2&I<&veBj'83&AAAnB!(+Ybi,j{16iCQV )PJH׀$n]k$}c 7Td*sE%LSs ^@ ;fŏ\2me,15m.bf[FC׵0VZ%ZyG),(ġ\ {IH$Z+upehVUhuӷy"nȘwWly"6*eGc{PvuA6)DZ7&I|fw )Sqv|vH6z+T{c I7Pq@~?nt!Ҙ:&Ǧ=(!fJ166&88W@ b/bRGc7RR@еWSILD*uI_yPdihZ[M,ٹ:?vggpt. *B[gլk^8;;5fEt W)pgp`JZҩ=}ˌ3#\πr9~3Xh+޿܌VUM^~0cƌ]~G||<999l777&L@Ν6mT%רD5jlQxzz9/we֭BwL2ss*ޣUVk"S9%Kz=DŽѕLOsXX,}V L型 ۩:S@T\9+0~x~e1LHI[~/(l161SE4.]wmf#;<0ummV@HH٥VӟP_ɱ_>;Ú5y^ޣ5,Xq:KߧqF^{!fVZ/񤤤0^^^dgg߲l2ٳg3o< =p+V@Trƍ2bvȑ̙3 T!dkڵk14TYNtrrk׮L:5kGP\\ݻ_ILLooo^y>ݪ%6miquu(4?=]߭$b(Chց}x{G.Tueӣê7 ӦMqww-,Pw;g^JcS[I8պ27r"YZ.X!+b>")+ۛ;v|wK.e⊌O?%**N:affFD :Tv###ٲe ѶmC~qsscڴiiӦθٚͩS2eZȖرcٰaȈ={ꫯҥKӹq'==Vˌ}}}8px1f͠a/кMΜ8ȍ+牏fn_Ly}ȤJʦ8,XTnʂ رcGeu=)q$ѾVYmFBAS`ժM*aÆ1~xΟ?… 7n\ôo߾rYwB|Ml``UV֨ [)**ɩNNN#vߟÇ+aŊ,] ɓˈl9ԦNmUr0Ο awl%TgeSBB_~%dffxY#G 1berJ@IDAT|}};w.jժ{5ĸ(<҆.CDgF/QML zѯ ٷSGLSvJv]nF&x}B&z>Ox{ۏұ[?&̘ 4o23oa.\½{aoo3{6_mqȐ!SPP 罼ԟNPP1112|pN:ٳH$,^8nܸAFFǏG*ҳgOw/)~ٲe,[ P-+MSO=šCHMM~`,Y+W0>3=Z4ɓ,ZRɞ={?cFRןfPPPffЊ = $ QQQ[kT*ÃVZٹs'%Ms*G5-;M=J_7V־+ sK::j$ɐHZGJewN l***bҥ{UOuWOUƍ eѢEX[[m6BCC4hPdggE4xx(Je>::dd՜ Kr| Ilj .V򠯖vTz֞\tW3/أZ9vTd2=Z9Vh78}wdzrr9s f6|:׷. ]ǫ5j@1WvѥK;tt2oMzyyONN>lbϞ="J{.w…#xwbeeT~ ,`(JBCCywٸq#333NݻINNf޽L>֭[kׯdffV٧ݯTj23ϣm"JeGFF"J%66okԟ 6mĩSnYQwdfֿWsMPTX>׭[4 yޗ'Ϊ󸋋Q*5`_M[nʕ+̛7F3U]=Uyyyݻ7|={2a/]σA%fff,^¾I]Q=VCqq3Yn79Y,~k"Eܼr V$G33nJ9Y,?{ <:r8 {f,m>WAA> >VN|+DGu*fү/[sOsNe պumTl| ]]4TRA}*䧟p9GЮ]Rm5v:@||Y3k/GScii  5ySo777O~is]y}vP/aݺuy ;5椥Lƀ\t={>vf7oެ!2Nmt獥=2tteX3x/㧽n$5ʕ+ >\/''G}deӎ;;v,iii,YD={ x:th8B||/cӳAfJMffy^{9sk"^u@_kܸq|rtBff&ׯ_gԨQK.ϵkrq&N|,t33Ń>%J8B@4:vTYk4#&&GCիVOYrg)b̙^{IΜ9Æ 5k3gbT>CVX]033+wY|t;u+2dᤤPPP۷g„ qLlj"-- :tIItRLdϬ6?S}YMǺuغu+_~%iiiЧO>CeӦME|\B1+>f_cӦM$%%^i&Ls ETWdY4rZuP*0U{PW;v,!//3tPV6:MeQXXHaaz޽{ ĄW;ʰE&Zݹs\Q"닺s!\ۑŕ TB䪆Г?ȫ\l*"%Aչ5io$1΀o¬ SYіOpw19̜w|geرɅMiiϠaI00W.8ЈC,tˤ6u $'ߥ?77gbc0G_ұۻѫWgLLO"?_g`ee5SbDGi83gd̙3fPtlR=[nիkGd;U 7j$ۏ 'H?~<Ǐ/5_|1??/^Ӗ!!8;;{mUƅ*s.U]4t2ˋMFttt?w!,,L=WSC.3rH6oLvhٲ%;w$!!#::Z%NʢO>zO|;z? ;+Tʈ 3Ne?nߚa ^~#,mZEasĭ{&V9a>cNIDтǭxvt J)kׁ;F8faboU"9K# DG} 1S k) ܳyH$̙3۷kYvϼy3>x.[GuETgV 4AngHB|Xj{CuV6iKӧOgaddD^0`@pׯ_gڴiށ#|:u>sIOMP"š.1ŗHU.wbѱ'Mŭ}j=p(7a$E%(,95?{&LȐ"`ւp]H'I RլZ+bE ݈6USǞ;F0V8E'rtiOp .o6++##2Xrfzpqq17oFоPG\\=Y/^7==.\bV3)E[sK_UʦGٴiS̙Ü9sHs2w ̟?ӣ..2ǖ/k}ceIRe(Jj8ios}̱hC R$5 [Zr7IC U%v8iRjIjf꟬*)f,Hnpv|uр7c&Mf5j0s-8_|#.>;;`lkk >IBB oIҥ&%> @Nǎ(Jn޼CaaCbVxxt5 )_O OS K6C gW|~U f$)ހN|!W6c{0n*CP⢍4jzeB .ڐx }t1lQA!&u܂ƃ-;̾}!ѢNN5˷BcoIv5O` ,,T+zܾMH C `@ѣظ?@;||֚bVP%BudffbʊyAСCZ+++R>T(!f@u-[7wjkޟ߮8;; DE}ˑLz̿dHPѭSH83Rl8[%vl ش*־{:\8#G"I䖻- -[0qLXiBOW^K/,7o]wo~x{k!!f+, ۲1̴D?KX_b9B̏Q U}vʲuc67U{a;uUy 1UH}C ="ub5 $$y[s:XĞо*LQ[;vYzٿ ;P-4$ x' \F\.2]jVGYouCꚨgB=p6A,[7Vښn9o] 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.3.3/doc/yoshimi_user_guide/scale/000077500000000000000000000000001475757676000211215ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/scale/images/000077500000000000000000000000001475757676000223665ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/scale/images/pietro.png000066400000000000000000002007641475757676000244070ustar00rootroot00000000000000PNG  IHDR }ۄ{iCCPICC profile(}=H@_S*fq:EEkP! :~A$Qp-8XupqU?@\]]%1ݽ;kVInTRW+$2D1 u[,ܟcP-X a3xWʒJ|NAp`d:[?=$2(+gӯůe3jBF2O]LxWZVT`)[9wsm*Z`)X{F-XJ(;`CgMUFޟSDBمi0&=|+d!)-U%].Gsn*Y*`>G{ N\y’hsFB ED4X2F;u 5ϏDD#0ùw7sǽȒZB5̗ hgۧVHqi]ProĴNQ i%?KɣL 4H) ;6M~je=\_\q|*)OTW4AK]D*v"P(vS*+kOƦfkl9x5*! vq/1Es҈zݍz}zLiyiC-Mt>L.qS9w]7Lx_\JL Z9wE.[N~q/RVTr򦆚3<@TB ˫PCMt*W|z7Z%f[iNd," kk c/Fnۿ$4evA`5/! _fo=x| *j?MI\pc ył PWSr >|֓c^-)c1@z(qA?W?r~Rۨtuu/,yy14P=B]۹=-ttQ$^n4@9ܤw9V(Uy4*UMES+PuQR[+04)gk!P(j* 1)/2w47j2c1YŃ#~@\0 G5"~h:uK.bRlP`!^#B ts7mPxUVAMQ?@yUW9*JL  l^:A(my<>F%=!A. N^1Csz| Nbr^o;SW= {c%cXgI9u|wcvKTaF L 4T*his畻 rk/x[gO:[3CxfJj[KIcS˫jBXA~ >Hd@ H~bN#w\".=c1d${ Z|eax`2h&^}C*SM"ԕEYedSOJ˫>NFꪊ2Sѧqm#=hAz  rz ArT PxchQ(8y^ +t"9]W+2+ ?qD"q6= L'[yeMyeUkTg,%'$]ey.n۠7gf^~()#j8 O}:9ڛeWf-O/t;q`C~}N ފ||)JEIKP114DR(4^􁭫BJζESCeEz}yd `axMrbrޮM~:NwiHX uK3~:.VFȰX{%PXQU&a\ZOoޥd5c=WwQvƱ/r<~y%EhEV[!D(8)Bac ;so˹GEr}k))ߗTŽAt4 0U`)Up N_9VN[,'GfmPSCY*L ? PWM]M&!)7UN#`ƾ)6A JX 5KmmʜgX1)xfOSkbF  EGâHT*eڸ"O.|v399"滛'd\ o'xoW4X=kD܂܂2 w:( Cۏ>|G1SSUfVUs#3*8յEl1-G2"`!@}&]Fesxƈ &3ix50s)haKƥoM<~-//\6i䘘naQ Au wLA߾ ؽˍ={krrGeٳf( Uqt,=|ӻwٺuImx.80ft{ fee 6}lڴI^^/^7nۯ]o>8pMy E$QGgr$0兦 ͛7o+0B jkVƴstuU#OU}#F2j"0xF jTUdrr$;2S`ѢEB2ASNmذ e˖-aaa\.wӦM+W~,rrޣGF)))P\\$lD/^o]aРH@*rDB!enQQ432TBBY9?_Ą,KȬ葎eĉynp2i..2}--^a!y`o_Z)(,TxT?UUtx䈕Fݼy2Sճ[[[kkƌ?˖-;~xnn<ܼy޽ct:lܸqnnn񤦦zzz߿fdžmׯ߻w]^FdCIIITTٳggL&իW7nd0 cƌ˗/o;@@DruCT'OTʪ <ЍVR"WW{Dk2+w t6nӦeϘUPXȼs (nŘO6z^njESKɤPC݋M ZWB4,.DB=ʓӳ7x4i~G!99lX,l͚5rrruuu9997nr\]]`Ȑ!SN566FRd…%%%׮]555&Ly.7o,6V4b%f{T(((DEEE*55+WN6ܹscǎUVVQVVx񢣣@ xŋg%%:fff2w4¢Jcb4E" "K1qiݻaRR"Ud7+w.JW(D?*:xD99 paػw\rR ϗ>w\vՔLmfn899ڵfϞ=svv600 Zx1=}4ÇHwwP>}t&`;wN>]]]x)z I}5k%k]]]* )))UUU|> f6o~)$$dٲeu޽ӓbxⓦPXX&O|s%eeÇkkk?>55J]]ܼީJ-D¢F9t 2RC]--رLB3"fe%]<22TuOR (Ϟi\h ƜRFaeIyܪ*U=32T(PS?bE'hiWWSyT)_M{}/|ě7ol=z"ʖVUU@jlڸE\$~8oǣs7 `,EEA^RT6h?>cwFF׿BŪoOJC"__9}\EEeݺuӛ;wnZ l r ¨ШK{VtlL~|w~@өT}8]f`a~z:#~вk$0 !`yyJPo)90r{rLtu{>ׯTE {.??Ry 1cFZQ;;@mOF+^x_Vк9s2%VkG0۷jUU ii޺E$"'qw糢!\]] _3ăH$j`aـi|EA{{/_i ~U$DK% vN1# ln.ΝsvvVUUURR^t)(;;[KKKAAW^| ű} ye#c_c^l6&==ߕ.8cƌ]v֫QBvEi.XgV1`p xG޽{YNNyڵk Tɓ'Ln:___==˗/x5eǎפ;ʕ+]]]}}}DJ^xqӧO}[ۀV9׮]P( eŊ477g2 >s())ijj9RNR]]?}e3***_3 y9kkkyyykkEϿx" 0`]t冇wI<>BGGIy&y}ƍ6ΈKqqDOk׮=3f Ǐƍc0n>|xmmm8ϟQMMAEFFUTTӱcǪ3Lsss0ԷoΜ9ؘd=z_f_|y懷AecWסC9HH033 077733;w.ѧSͻv.o,݃c;2.9::˾ų ޽;g990{&k:yySVV1b1 "++ҲÇ 7otҥ099w={B}JǏziii)r!7xFVҬx~͒iYC ~ds8;;߿"q?'N@GOS_xqZMM#k׮ro'~ɒ%<oʕ;vwG>,,L[[[[[{[n]hQc;ɷn-;'T‚Hd{={ۗҩS' qۺ3eo˦mh7otvvF%pcEEE!񀨬\n͛7wM=~xrrrE]Ṃ?KYɩx8w #Fh- UVh=@[6׽=R|߿]lmmɭڣ%%%m/QտA˥)§UUk7mz٭[&MXQ!߿-<#eehUUׯ+p4ҲzL *))1L.KRtEۇGGު$.נ/ڋ6 6ٳ񱱱iii"x<ޡCD"X|CyyǏ[}]hF#b…"HCCc֭ZZZ;vHHH?tx@m4<} }%spnjk|@ سg\~޻w}=zٳ'2+92''gǎ˖--:qp8\P{TT̙3cbbnݺܫW/OO{xx[@.|Qpf2y wa!s5[>74~[UZʟ `lUU~xCƧӅ%%̒_FݻR(>y K.+ T>=nEaXBgHcHNNFxѨUVV8 D5X#GDΘ1#!!ȶ^Y|QحeV}6钕ѣ*d2LrEEEFFFϞ==z4a„ꐐ)So߾]RR2h nݺQw޽^__ݻ7׽=.RJ-YdӦMEEEzzzaaa~~~ L&SKKkt|ޥ޺߼Z*UطL{_o]Tj399%%"8؂ &@x L=}z2=ґm 򊍍ϟ F&M:}ttttppp߾}7`2{-ڋx@pTTjG%3yT7 IUTOk҃|Q؟ϊ+ș-?/_s΄aÆ 8PCC#&&BEEɩ͍8qĉyf'' 6^pٳC ϟ,P444LLLP 0 P7<<6l؀jѓ'O֬Ys]ccctRqQHY5tgLLСClkkfoǏ{zz6p87o0`9梎@Adoݺm{LUIsss}W|R~)5iV"%|@@;x<޶mېVcd޽, tׯE@ vZ3f̒%KiRr6aÆ 6|6XQՁp jÂz޽+Jv3MGG',,,%%\ ]hjj|}}}777OOO4Yk׮fͺ~zii)َK"|'vv?nh.\0߿[ G!:w_L;:E4UMVf|*!4)X`xrt ݽ{pttb7 x6~{6*ZuĈ!C?Wƍݲ[ϙf$>g\07˗gϚTW˩MMk|}{(R& :%3[ջu0ƦϧAPoOӧ P(^rvvxo߾r@3lذSGUUU3g|YJJJNV^1cf͚|쐐R]]ѣGST pႽݻqY`0zubeUenN0սs -M j P5ģR!.M51᠀A!yر~I<ζ322O:5bCppp^TTTRRR-ZDӭBCC{ѳgO -[mmm=t>|x|c0sႉ@@ʝ;7*Xu GvsG_  wwqp"#GPٳij {r8qߟ`k[]}}_t)""Bю;E"ǫsNBBx5jŋ\rA6}q333??7o3!!!;;F]VYYj3gTPP2d:. Yp8rpPHիLO=zFbb*UTo*MŪCښͳTӫur*52+peҲ{`ԩw 3"(44ݻ%%%"9ܹ3033eee"3f CQTTdfffeeeee :i.~~;vؾp P3}}|jn2xyΙZH 5;[ =n4J,87'"-鐙񠢢2uÇ?yt e0V?|tt4)'>LN( y-zi&:|.檫w #;ݺUG*zźr8'G)878-3@EVJTt.Q訙&ײ`Ǐ((( ]B!~y ۷innnppp~\nNNNaahh #;/^ͫMM9bfN>ƥ8DF*|jFF'4d]XȬ =.r ''7wM6.'Nsαc흜ݻׂhs̙'O9s` 6 o b.]2!0eJ|F)- 4PE^+* jϪ#G44KCPPBY`իWh+Ņݻwxϟ?~㲎`E<-7W))IMIѣ%@$hABBԉM|4TQvEyX{`0o# F,hё#qb}\x9s2(عY7`x`0lj\a0Y %`ݺu80 ߩx  SgL0 ``00̷J{ ѧݻwx`0N!ⳳv7_ܸtq 19,31VAOF[ؖ/R( RɓѣI}\\ƍz>VWWS"T `-_43I|}}{!>|/ڵ+88xرc0M l\ѣ#""JKKȾP(1bիWIo4F ~#N&%%zjL&lcƌ&ocbbƏ啘`'k֬wñYdӿlc'NaaaKHHȨQ$΂o./++[t9044D:;wP(ϟ?`XFFB^Μ9WX?1 [L4nܸߓmmmTUU]]][%,Y"!-_NPdLDf6```f͚k׮Q(Wdõ;w/611777_~=OUffY444444lܹsTTTf͚%bJd,;99}&&&Θ1c׮]mv{{f=;644t…ۇ^pA}EEŀg͚ջwﲲ[n%''#ƍ8qbxx8::??uuu-9{oYY٢E,Xymmm޽ d2&L0eʔ[n,\p7oD?~Ν'=ztȐ! vvvmI]\\L땕O<)=*)и}6e޽ԩӋ/oߞ~92u>3vgϞ:uȈ40]J33244TMMm̘1͛SSS^Jg#njgvƍO<ׯ̟?k֬>}H ͛1??Ŋ0dȐrt}Μ9666;vX|)ik͛7WWWtZ&T]ddd]]֭[غwrJΝ;]vy{{:AIII '`/^ @y\.7<<< gQ`ȑ·N4Q .888H rt6mexj)Yxzz׽z,tHX,GGǧO'q㆛ ͙3" ,,ťSNOH8pH$BZ&ٹ_'55'ҵkWt hRuptt:>yбc&%%}`͚5^^^...҃sN8`cǎؐÄ tttf̘xb99P5"@eeSNL]~=??_(Uӑϟ'-~;wxyy:::x/޻w} &M:}ttttppp߾}7zxxA:|mczttƍ\r)mms cllɓ5k:t&$$=ڵ]wm@p]]]]AdϞ=t:ʕ+gooҥcǎ|oWTTzj``mttt.\صkW!K,ټy̙3w#}-whhhhh(NgX6666m;wqUUը~ҥKaaa***+VnY:?a0m۶۷o޺uk,z@tuc*Q@>ؿhh(9n:|zwމ#c0ٳgǎf0HKhSwM5.]7@>MlJjhIjiByGN=vXΝltHŗ%/_7 ;;;ww]8q"++8[0V޽{WNwl| ><<< Ǐق|! b{}ӲOK1̗P#ump(|j sttt%_G]8`Zlzߖ|3`0O-zh?]rٗw-Etl і#,g`0Lۀ1 `x`0  .ɓ[N1 {333F)**ĉ_kk몪*%ڵkcccǏ?6+ `Z(jjjEEEiiiiiiwݳgM%A۶mkY`0,A>}֬YkAAC֯_l6;$$$&&TWWwT*.]tڵb=z'@uus?~\TTпtɓ˧Mŋ˗=z9E IDAT|ծ詧gzzzZZ_NNDDDDDD#( >}tllN8߼ybAAA.\߽{7.1 ;c 6lDGGAIJe.]% >iiif&&&H'Xlٹs>|0x^z抿"$$D( Y8p`^^ƍ]]]ѹ?qdҥ/_ C =O?$H?ᦦ;w.((ؾ};E`ϯNMMΦhk׮UVVZ~}DD̙3\.tccc///aOHH;wS @H/i'Κ5 rrrRSSo޼իB;; HصknZZZ@@@JJׯ쐟/Xǧ:??rȐ!길`0,d۷WVV.**@0c {QQQnFuΝ;wܤIPdz$޽]__HMMmrC]AAAAWWnkkk  ŃLj-[?|СCΝAx<^zz:j RQD"h4 #:::Hmmm)P(sssե+ CBBB@@@qqqEE 3N߾}MMMsssrsrr ?k׮=zhhhQEEEѧO ˗0@$ݻWƔ\v,77B >y1F3333f o߾&&&yyy˗/ٳg\\t҅,54 FRVVvrr@ rrr{9s̓'OΜ9`0صƿ[]]d2u6sL%޽ܹsQQQ>d2NNNd^JKK3663g M81---==ʕ+}(֞sU'`0X _u]L[\`0L``0}0 ]|(|6%on: -D0 9{lsi ``0,0 `x|?NPȽl;0/ŋUTTO8_7VUUhP>Atuu===SSSaV_tBhiio!!! v^,X\7l0rHMMM R%@RR$=~~ѣȑ#cbbcx͌3t颢޷o߿K|B̙3i4^cЦMpmu!C;99YjkkMMMCV͛@bdɈ .7o~uϞ=":aÆ},^x„ 111NNN/^΋/3gA~~~'c2ٳgٳB̗c̘1/>vؖ-[h4:p8͢ƍw>ydppq> -t_䡓_PPi,رcgΜYfijjە+Wv}͚5&M"E_(;v_%//[^z F͞;wʬY!҈;wR(YfihhhhhI hkkث[?/611777_~=i@v)S+))7+~G066F{У OOOMMM^z9sF8LUUU˗/`2ZZZ7ngҥ 3;;yެ4ɨQW족5(3?奡b  SLv:J"ڂ4Rd$R /؂:<}CMMMUUG&(cdr+VWmqjjjܹ ﹓'KA${ѣGXR666Bfvvvm=L0`]ٳgN222ڲeooommu>|XIIٳgy;w&NhjjZRRr!C$$$H9Ylggwwŋ۷oOOO?wo0a”)Snݺpٳg# |ϟ?"޽;*[hٳg}}}-ZdM&X+WzU^^gϞ&bfݻwYY٭[͛JO @qd|QcY7nĉe ]]]W\y…sOeɮAJPSSܹ3:VW\ 6N!Əcǎ6,..+%rLLnŊ߲-All,A-;>r<6l1c%%%̤𫪪bّ'Nܹ}>zT$u"wOqƱlv۶m GÇ鑷5....҃p8PH޾bZdzt &ߎ^fΝ; ''8p޾}+9s'O-ݻree,qJO˗/o0.] W^wD?V>vdgg =]uߟnaaoj ,=듑$2d=RH&ˀ_YsIzƶN s%]8ro1Y2+~˪'BXvׯ}ӧOo޼l-e˖I/^l͛[*q3gΈ7-< )X,VK .$ kjj= LH$DQQ<ȓX,GGǧOJI@ sqqԩI^Ջ7H51ŋWWW￲)=EEE%pႃرcяmV7+= hnnneeQRRrAV|ѴiӚ I2eJTTKjAd/WR,ȒͪSSC 122~o1Y2+~˪ެakkO?M6m^[vmmmm}޽ܸqģ9s\|9((,uH%KfffjwPg?04r=R.hTZ%T6TJ$jSX*j-#*IZ{nE.(qq|!c|Μ|s|/@}}=Ԛtvv={ [n#X鷷WTTTTT5+**b) W>mN<&sLc{oƬ^ZYYY__…?)S`1XVE19铭[RT>>c O2RVV$$$~G4@_w@af{~6`#<piE+%%*?ӧ vuu2e ׯ_jռyJKK˶,CMX;lݺرc[l155J6},ŋY"(((!}tKc{o̙3ҥK7oތ R7^lsn'ؽy &#!!!n#77lҤI,S <ixYaf1+W9[`#ݛcB4nܸRX&ann^]]}-uuu)_z :gx|p|*qaaaEEŚc<̽wey ~eX{#//ljjwލ7 7ٳg3Dgtj~m4 XPPѣ3f ?;B̦vtt8Gގ5[-++#>%XHssEaaaVV3K,-VVV6nܸnuvvb_o޼YPP?~>|%u=ٷ~6=zܹs_`8>PTTTSS-[ѣGiiio5򴴴@,{W;v {S̙3uuuΑ kM͘1C@@ //=dWN:%''7?L&*???55Ȉc L&3""0}t|<ժoo`ee>cƌ/_FGGkiif0{Zba[[˗//\puAn``_b={.]`OOOii?ǎ|1?FXNN?DP|||r sv횬ZZZk)0 κun޼yŎO𨄄Dnn}.]'--mbbmgHTMg:~yX[[gfffddXYY ?D:suwwFDD` ȑ kM.]tĉX;wܹs@Ryhuuu o֬Y۷Ysqqa͚5YYYt:L&Y9))IJJjɒ%0Iy5 ={ӭ~](_СC۶mNWW%|mb>a„ 6vhee ,#dɒQQQ[]]A\\b𸹹}#G;jXr%&Es<1V111EEEfC ܹs DڼyEFf!;;;LKK[rpCCCVV:_<8p~شiӫWNW#Z`Awwwppamm?hJJJ˖-_|yIIIQQ̙3Ե̌Mw9r˗NNN!!!cǎiii%''t~~~iiiKK˥KN>}y]]ÇsAΞ=+ kjj >k׮͟?P\\1jԨst??[NNO>IKK;::;. 8:~ѣ_˭[jkk9rիWX511 kk˗/, S\\,%%U}2L{/^TQQШ mkk#???_LLLKK U\\|F{{{[[[ee媪*tFqrrrΞ=+$$نΟ~)99YTTtŊ'O<}4pݖ`ll ōBBB'N|}޼yRRR͛z9__ߞ7ottt~EeddK=w\QQ;vP(I&8qc͛'""֖*!!AR8枚:yd: v@kl,Y'MMMUUUjjjD}TTT˃& 5jҊ+ Cjjj#k{ɓ'O6 |7ow9zI&޽;55ECCCCCƍVVVsss췋-Yn]yyիWᲲpի/^8p@PP%++gϞ{n@~~>8t}QQ~!99900ťe}K.]z5իhr&q1D ­UUU,)S,,,+`ҤI&MBgD^^`޽{|^Vbvvv~AUU:,,իZZZcǎ500`*I$jyy9N2,++ ?~< sk׮eLGPPPII ^D*hkkC!!!++x hB@&_obA"?Ѡw˳$O?mڴ?~GQQђ _`}@@Ç/""#QFp|;wSi4`kN𒄩t,tnn.\ھ}srss"((ŇWϟ߿OgϾ} ƌ?D$wSOOL`]Ј1ACC#???>>,337n\UU֭[LcPaaaxx${7o&tAf̘?ڵ >}JEEo6sL&Y^^_0j(KKz\p!>ԏ?սyD"-\PEEEYY۷[n@SSSGG'''yӧlw)**VWW۷ի+aaa{ciiiuuuuuu:h~'lڴIKKs1_!!!SNmhh(..^n 痐}v|||nn)SCWWСCbbb?8r䈝]cc2 `񭬬}ʔ)p!ɩHIIi޽jjjG{ׯ_ZlYhh(DRK.~ |.խo+NRRrԩ,Sܝ[ZZ$qq|gϞ ~(H$Rrr:~⅏~#Izt[__r[=NLL,))ijj+W? }eaaez78a„ܤQF)**ZXXXXX3@?ѣG***[n6o<@/]T!CĽѹ @ idpYԸoԍezH`F F ucs{o1B|Cxyy*Cz %11+1tlܛ #HMѕK= @ yPUU֎*+/XfFd2Y]]}̓)FJJ ̎|QQҥK%%%EDD x[k @JD N5h4ʕ+ ֮]d2=<<Fkbbb*++1\@^^??w0+u˖-2##N777))/.Y… 5B"F ==}k ׏QTlRKV waq47 Zr;:O>PVnUPB,}wa4 IDATPPP@6lpIɎ;n,----- Fpp`H{{rFF' #$$>&&|||fΜxb'1Z/$bQ[+8 JJ(%%;wdßP(hߓ߼=~|Qa.%^ (Ĉ[\JJJ8?|||6mb0#Nd:;;c!%%%ኊ }E¦ fI!;;[CCcUU՝;wxUkn1Bܺu cƴ/]ZZjh }z3ss%%_|OH"`G!FyϧP(ZZZX̙3ODAAP]]M0{d2XRRokkkll痙ijj4"._g X۷o1BxJ 3'T`jkǛM@qاOBx1iRˆzbęV!!!| Djmm%e,ZZZbcc/_븸dn޼C[[<==[ZZlmmsss---5W͂!de}'Of>jԗe"|1V_v(Ĉ3d2 Ӄs'!!AUUu,Yh?V}W)Ç̚5KSS3""ȑ#loY#O%3>242kjp_ZZmOLҍ}ٗVVnaPB8 //@MM 6%#;;׎$YVV 3fP}}D Fyyyyyycc#? ߲eˇrrrࣷ꼪5fAzzH}ّic9ᗝg=+H3g~K<{v_(H4ӦMkhh(,,]'a8WӧO7NMZZzEL&3((h?|g̘1g|:f͢Rd29%%iě1B_n\::\X,X G@G_b?fC= 1òeǎ>~9&y3gN4% ;;;_~VTT`…kKK˃***䨢XXXh4کSOn޽dl5fA{$%Lrrd&P.NWsك~H+1!G!x`_6msTTTss˗srr"##F2Soppg⌌V\ #y{{=zc ,sssEJ *(('''+++÷xUk͂QғI17n de>>/aLl_i>egQcKG!FyDGG%&&EGGr, X,N8'%% _`X#!!AR333tǞ={x[A189~Tl4'O$CZZ]!75 ƎmG< x_(5?%H}֝qǏCƌUkU!#ѣ;#"_-S]-7fLf߿Rkz:dh8 CPB8@wZ|r6q0g@1H@ < @ @ d@ I^i޽?DڵkW.]*)))""bhhrtժU EBBb111x,p^(--upp%7o-//wqqQUU%jjj7nЈ<ȅ@p{`/@%%%}}7nyYYQggŋ,Yr[[[ŋT*UNNd޸q5//s!W(gffoiiݻwOٹvq=<:::==PWc #x n@ y(.//u JAAA?>v9sŋ [[[Tϟ"));A9B\\\<ࠬ;BBBǏ\bii CTTTs֭EI @7'`G <)?fdd@BBB,,dggkhh@pttܲe˝;w>n޼اy#ZPPcԒLEEEA& `ܸqXSvCXۜ={vJE#ڰQg?~+//ى'bcc544<`Ǎ'##3a„3geee uwwkjjZYY}0w\{***fϞ)FpL t5?m/QXXX[[ܾ}w ǏXx>>>@&r ,BII ??qRR_ffiSS`ffS*jiii``O0$/E..bn===o޼ikk&%% hik׮;w.NOKKc0,Gbwžzxxܹs͚5P >M|r//8k -ZwQC1bD/nccsႂYfijjFDD9rC;ekkק?~޼yuuu`|J,Bmmm[[Ӈ)ttt`v@^wuu{n\\ܒ%K&MCbpL&3""---< #K^:uꔜԩSa/E,\~Sff&H\\~pY Be[D###>~ٿ?IEEb,\PAA899YYY,ٺukiibmmmZZZMM3f=J$G__ߗ/_RTyy䎎6j(sUUU__`sssssgϞ\Fضm[jj'Lѣ}ҤIpH H8[W =1@?p;w=JVBBJffftYYY={HIIa?_fMlllVVN':::k֬aS$9h: bff7k,| AAArrr'N󓒒 oqÉǏRRR޽{'--~HSH8h!}G y(^UUcƌILLdũFoX.K9:::)o{7SLp`R@2 הw{+?n!P# @ @ k׮)## .044w 7on,V9tDo"FyPUUֆ.1VZIP$$$OADB},xWOOB(((<AVVL&o޼RRRH$D{suu%$J!!=zD"Ay7>>{{|%`ϟ?_NNR{8v{GYDҠHJJxyy}IoӦM ###Sn@@B,,--.Ə?gΜRvjjjIIIxx"hoo3 sl&J!@UUɓEEErss ?rJ QQŋ{yfKʕ+$ V^-)))))ظnݺcR(իW3Lꜜ$$$~G:r[YYYPPpw+VHJJK󐟟OP7P$S^PyygN8,P[[+%%9dz-˯T*aO||5 0,~<}4++ȑ#%%%{9X[[O81###66677>î],Xpɝ;wZ[[WWWqqq,?YlYmm?nݺ `|T*5..NNN/^XAA\B@3s$$004LLL~W,֭[>駟~~~[[[{{gϞ_Gq._S闕ݻwөJ!vp27oޫWk׮Ҋ'˗/^& |||***r?p{{ykPP˵!EGGg͚54 7o}۶m0uEAcgBBBAAAڊ\vmJJӧ-Zhiiy}R]]ࠦo>,.66vAAA_>&yfmmm"ST @jf Op/_}Z_6m>lܸ R߿g@Mggc^r~MJJ2558q"z[L&<3d2 r+=ekkק?~޼y3ͧO.\Օ?{vv6HHHPUU={P-u@)6 T&ə?f&Y;+&PBB%n`؄?qrxMUTT\z:ª~_\˲ T'W^upp, ܼ֭[꽗q0ei1c`aaa۶mc0PWVVvuu<锝]vq+5ٺucǶlbjj*)) Vx0uvvNc>~ŋ{2G͓;v jkkג?~"Ԅp ._-hnݺXQQ6--oKs̢ѣww[n͝;7777\ UUU 677777Y\\ʕ+ ׯͱ  +@pnߛ?c˖-W}Fuww1c˗/z̪UΞ=f]+,,,KKK#""tttV^ ٳ'++kŊmmm/_p PZVQQKLLTSSvuuŎY&666++Nd9Jς8c}63: ;q℟gppw/((bŊ>R{t{n9rȨQ.]t]]hCDD^^^2227n^x~@__nl;ALL,''NNNNJJP(jjj>>>7fo|3[,|GNҡCzz_$GGGHJJ1xS]]W`ʕ+fffx!򲲲tttTTT՛NyyO>6gϞ(((S컏RRRkqK`5˗KIISb[N0AXXxرT*5==8UkB-u֑H$Dž~x}aÆYf;;;]reƍaaa FD5f̘*"ͱ$lۍ졽itwxPWo>?z43g~TWo{xqՏ?Vhk3cܸrmmϤi֮]rÈ@ %%`0볻;== ظo>rL @??3g>\ZZz̙ѣGpmmm>|FȾI1 Q8t_zN{m6ukYeeeWW~Q39x٬Y0 4G9.|Ⱦs e3gΥKn޼M%Oq~1z 8R[+`v~6gѝ|I_Dm)?  x_hl1t_zta ʀ"\d̘1CMM49j󄒒۷Z竩沲EEED`/qr.){ss޽{4'leJ++GakbG;wngg'^{]TTTSS{A 5k%hFou?7X>C\\BC>!Ohh#:5_&,W"Ʉ{-tW=|JWTT$''wtthQF/DBX[[S𛛛; >xBCCuQdrWhh?:t(}x͚5YYYt:L&YqC>=V@;W\A fXta)BJDK͐%i{oFFFwǏوٱ ޗ8 &&M#ug:!Q_nV]LIT²/ #7JOy(((h6l8y$dǎNNNPbee2goo_zӧJ(`۶m}?fkjj KM,-- Fpp1R 1kJJ߽͛r==oX d%%%{Ǝ.,=Ƀ P #KIII///mڴ`dddTWW8/11 1?~9sJKK;::`<ǺT:2LggOzz@i)X޾\FyǏBVV'OA߮`r𽇵k w_|Ry{}=HtttTTT0Ɲ>}Bguf  X%R[n=|?`Wes޽5k֐d@p^@@;/^\ZZz0@|5 //.`K%} pH޾ի0wwwQ^^^^^w+++Ym yuuuff&T ,~#.j@p$++ 3lMЀWӦM'02&v6ht&4Ό3̙Eknn(,,LOO|;T ϕ`OII-,,,,,|||P y;v ~>~9 aQHթSN:zk>>{{rJ1|~z 騯y^'`'^\JJJ8|||6mb0h===յDd2x7v,[@@ѱ Aꏲ s0T`G\\~hjjxHHH<p >@ yϧP(ZZZ,Y4wwqL0JG||j[[>|1tT *q*E0 3c 8+}D|+ް%22ԈIbjjj!P swgbbbiiP^^~I7y=f JKKSE ˗>}ʱ}8 k!##~(wwK.A/wf!ō7} 1I$Rkk+:ywbG=<\PP0k,MM͈#G mllܷo0T,z$ o߾򎎎ʟYPPpbq:} //.`K%}c ~#Db9e˖>dggWUUgF{'N Fyyyyy9Zn_Pdru=m`'a2ӦMkhh(,,BsӦM'0,E QQYfQT2qJCәLfPPΘ1cΜ9sJ ĿH60e˖;vww?~\LL^zu)99Sa2ϟ9sIXǿ{n\\ܒ%K---</_%0Tc$AnMO69**999bbb0˗/T|EEErrrGGFcqp`0:TVV,\PAA899YYYM)..622>z(B??]r+isJq1p~ l`D <UTTԢ]]]vvv4-==B͚5"+z/!!AR333tǞ={Yl69C8ff t:)PyT`D < yёc"gƌOY8~x8 bgJpHBİ_ǻ`8nAz@@ < @ @ dMUUUaaammm(Bii,LVWW߼y3hQQҥK%%%EDD ҸMGMvWWWR_߮(//wqqQUU%jjj7n.zwWTTj*MMM "!!1}k@p{pssh+W400HKK[v-"噙[ZZ*++{.'';ZVVfdd&%%u%K\p֖` }F|ň455_߽{7}εk׎7ϟ?gihmmݲehss3>ŋT*UNNd޸q5//c!\1BPPP@6l y{{ر 1;88(++gdd(**N!((߇̜9{Pӑc }F`0ϟ9eJHH+Wh***{u֢EIİ'y?~tttHH$vC b` 1KIII///mڴ`dddԒpEEEΒBvv@@@ѱΝ;SIIIL&8`ƍ())X$<.,,̡1]{@p.bC~~>BbY4555EEE޾}okkcvǏ '5~^Ν w^EEEzzz@@ٳY#TM)Օ?{ĉi7+v Chjjj!P f+))緵566NJJ455mjj444 o*޷&&&񁁁L&ĉ}F.++w^,,,ӧT*UUU 33s嬬68~x]]]OOO赛`!\e@pd{,$~mjjjiiqrrO,_\FF+..ޤ߼y6,,LJJ*)))99B0dOm„ -RSS;zd27oᡭͦq֮];w\:`0i7+L!=䶶6|H{{{OO6xWp,Ά_mll>\PP0k,MM͈#GZ)&{wq5gms[JJ %!J(Kv&Jd.3eNhP KR&%HRۦ}3WF+G9s9s>gikk>7ի3gܳgOsҥK$Oyy֭[gݷo)S5r+=k <0Ldڄ*>:/))BVZ\@9qqqo޼3gF SVVnj9ڽ{{iiiVVVVVYp35XRR)d!Hn ,eee9777'IE(((URRMGZZzذaVVV!!!`kkۢ9쟛Y# Xm۶ΠA]B$E|}7AV3g#GaCCѣGeddIȌ3N8A9t;;;rpx_' ,L!HM|Ҵy*++x___K vaoooooٳ@KKٳg999vvvjjje1!SHOO8t=44֭[:uT777]] . w,ܺu ֬Y9tPuuϛ7 -B`7A wuu印m6UUcǎyzz***.[lǎhbX***K,ټy)4}'ٳgt?8Ç^^^!!!JJJ۷oo׈ ,8}ttt4Œ411Z`A AZD ٯ_l߾}\"d =z41e -7AAAAAy@APAAA&ŋ6l055e0jjjƍKLLsZ%@022Zt)TTTlٲeܸq4mӦMf^ב^~'Oz󦻭h[|NIquu5s|kq[l ;vĉzҥ3fF6muk MZZځۻgϞfffon6_:,]#2Ypp^,[>eJ%_?/ SRs+6FA^USSN9r$HwƺuqF'0iiiҔL&qn#mAz:@] _UG
    vX}}}}ߧ<<WRS#m-(.yyVD}[55UNJ_nh!S",&F%.NYVɹ3fׯ_3f@ߴHGN.񒗗䤧넹O>%KLLL~ Pm7<<\IRWNݻ*=̊Ǎ{:ԼЛ7l-4 XԣG-dᅰ>ww]z.M(-;9gp^Rkg>A:F8NDD\4EEEyyy=z """ȖV!i+P:ruu+8 .Y&%Ay!\RBYzBl2"|NKq}Q:rABr9mmÇϊt< 099bM8Q:F]I7hjVݛ"+[Z"h\= o _{WEE&# 9Ż.ݯ_IF{IHp>||Haޔ7olڴFϊ| PYY9~SSSxoA#]̊uu+(Ԭ"~El6-*JoR:J)\\^ϘNBͿꙕ%mkAC goaPSSׯ[ZZ6+A˗ǏWUU <<\EiŒ36nxĉ &:ٳf΢O߷Lo tzgU\|yȐ!",111#FHHHHHH=<< Ć +++&\__@v>}t۶m-+++,,۷ܹs#g ---š)۷pݻw;;;y1cF@@@DDDqq16l5tm={{ݻw<z]G8{,N*FД9sn1jDxxQ,z]G:?"#lOױڑ"_Û]@ool4gAP~z dfVdV?xXS#6aBk`iꑑj FFgU:M>}p}h`P-@w@"55UF]r?}74жo{aII7XCBڵhUdfi9ӦV%G,5+;=]&)I bbT㕤~~Y,| {О0z',sG$!QVݷ-,!t  7W zYٺ;wT`Р"y:"$ *ʕywmh K ,U^{&hRn $͛L(fgd0K%Ay@8)#q* ?J-]ee<9~\_A--,,!H K^^^6/YYYڒzzzK.}}"zj RRR S>_zO?ݛ`[XX:uJM~Q*‹/6l`jj`0ƍS@I.pI%1KY=Bq~{dVQi pÇ 6Ch4-}1[n-++$?bg+2zXhQ@@ٳRSSdr6??‚fhhh<?""Dx%^h_5y+WL6ŋ+++UU՚۷o>xߚ6mu8d-[ǎ;q⠠C^t-Ly൒DAh=Nopu}Mv6BJocސVԙINNruu|򐒒x~ <<<sΝ+,,䵻y昘b[`m۶}k2cҤIZ}ڴi醆1cܹSAm$^wEEErnݺoܸeXo ]{rŋbŊY|yii73hhhP_ٳ'HII !..Аg@LLlΜ90%]DDȨr U J@GG&33^2 7Z---jf8d}Yhϟ?={IydffΚ5KQQQRRr.\ k׮]|9dn֭[M]bE>}eddlmmyzOy=<<455tίJbk Ȩ$̣G#`ٲewvvvDDmllP[[KIL:=|P~'{qqqVVֳgώ;viCCC"KʺgΜKAA"1C+LsM=ztI/`ʔ)zqӧ,X{sZxNwrr"KtҥK111111MIttԩS~)>L>[[[Tf͚ ]vmvv61u'ŋ6lƍ#',--y'1jԨ/_Repqq122:|go߾} ߿E֭[׬eTWWtV]]Mꚙ޽ʕ+6l srr)?²e˪M+oo`像,p֧O 6̝;_}왪/{QyyyNNNzzz[nYzC~C.ZhΜ9nɠ]GGgŗ.]rtt&ԩS8믿/ \d0K||۷o߾O?5*33wiBQQqѢE^^^=8";;;[eXoRDEEϜ9ӻwݻL6ƣN}&xIx#Fl3228_ieggggg7tͮ80>4nJOYYwW(gjV`XjǏrssɾUe#>̙#pXRRTC(--ˋjZeXoDGGgTSS366irfO nk֬ټy^߿Ĉ mZѤI7s8zhnJKK_ÓIII$~z. ҔhcNF=KdU RYY9~hSSfŧ AZJFFǏk׮3f"[[[_揄  yF$.\0k,I0>}#!!{gS5a̙w>rȱcLj =zTFFޞD044LMM#!A8F֍ccc'OL9[JMMe2QիWTs!kFxUUU\'Ǐ_ެ;#eXoH;C=5GFF͛q8yIHH:u LLL͛G5F|!++O>_ɓ' Dj>ܽ{wLmYaHxΝ^qttܿ+W7ȓ?5 a޼y~~~vZ||/֭[:uT777]] .S#X[[٩kjj閖d_fMffСC ޿?o|x҆7ntȑ#y  rZټystt?4xʕ+n"Q-- ===WWWꬅÇBBB󕔔\]]oNmA^^***b,Ydwsɾ`ӧOGGGX,III/// 3f(..f04ե޽hS3a̿ސw+BYEM<ׯ7D=Ϙ1i˖-Ǐׯ_[\BϞ=߿qF??*##s999?|pTTùyfSy8x`nݮ^z̙~75_v呑ߵkWppŋ ڵkk~'3H7aRRҦMڭ#!ȗx|}}c{HܪIȣF7T\žy~s|:EG{.@y@ϻ;H(//-Y{@= HѣG:::^^^$x{{t--_~ |"8z@x[[ZIN\ѣ'OsΝ;eAPYremmu^PP@\ ?~144tʔ)[n%fWZJRRy'AP),,$FC_xAZZZ߿O>III-_СC&&&~<3FhHk[l7n"Fkz///mmm cc#q 33IEEERR`ʕ|J쬭-))tRb)!!!{W^O{f0N].UBȫFj'>>~044q㆝]yyO)bqwTRRey!S{,&Boo={ݾ}8- ={\\\jjj,Y"|ڊN0ASS3???>>sEϷ`...ϟ?xy#իV EJJyx}ĂW? a(+W񣪪jnnnRR|Hyhs ͥׯ_[ZZE)**_'Or [uiWy`2YZZkLŋC?ܹs×uuuNNN7n9Ν;WXXNڼysLL CsNGGGbŌbڴia̘1;w$!^,^5Q(((hjj{v޽_~bbbl6;11QKK@ѾfwG۶mIa֮];dI&2K⍜b6ŋcRDDd奥7n2BhhhFFKKKHH7r{߿_BBB@544POZ`@6V___~X1277777WVVvsswwΝFF FbZ>D\\!%Tbbbs *y1}&)#DGG744[NNNZZݻwˑX\l5|ph+V"8++ٳgǎ;}!ᓅF:ggǏ+++۷͛7 . z>e+WHHHxzzq,멭mDR>|?(1K!0!!Z^^222DEEMٳݻw9ӧdݽ{m(ǟ3f?YvZtt'Oۛkk'O~t~BU#ˢE-ZLۺu+_$55I>144LLL,((PRR"!Ĝ0(Cuuua:NѪPQQQUU5w\g֬Y+V \lYꚙM8QOOrrr|2Ԭ\rɒ%|J2bVZZ"3xh.߹sgڴiwVTTxbpp0|i%IIZސ:.K&̙3@5իW#O>ץKHr}2e[XXΨQ,^5}ėiL:)))Æ ݻÇ<|!Hlߟ@R@>fs???eee^dѱXݻwfeeeeeߜ>pGGǒHa.Y,^5*jժ?`nn^VV"X\I @||P jkk9F|i?Ūٶm8{, 45/.taxHӞ/'+++SOn6ldHHap+h󵇙3g޽ȑ#ǎG aƌ7n}:::bIJJxyy-XEW-W';tUTTRQQYd͛E:RrssG_F-[sXMMM\.oH߾}\"d=zQސFF5g!U#ʶ=AAAAy@APAAA&䡢b˖-ƍSTTh6mjK[[[BBؘ%++Y[[[RRROOoҥ>ŋ6l055e0jjjƍKLL_* s)BBBh4FkdO` H;Dk_+,,ٳ۷hѢٳg80,,ťfɒ%l~~vqqx9Ps-[ǎ;q⠠C^txyl:m0WM^jteeeAڹ'"H+$x]cR,^𰶶ΝK,џ;w0<<|„ +ZZZ7o8q"̟?[7n<LPv9 j;w8:::uEՂ '9lŋ`Ŋ'"|7nb%2e ĥ38w„ ctttlll233LPv9 jׯݻ~ V sODV<~`>G=="#Fe˖^^^Ç}@QQoi;?NJ+3V sOD2 !(sw~䉕 %**l111III?raZZZAAN,׮]&"Z{"4UWW7Mi4Zuu5kff6qD==:t˔o<'''==='"B؈+W.YAڹ'"Hʃdmm-oH]]˕$W^9sPw:::/t钣#8NDD4 a@AAK,i96ǧi瞈 h%&h?y lOYY dZ(&EEE.L8m>FXݻwfeeeeeW999@^` H;Dioy077/++KKKB[.>~pxB6nL?~|ZZZDD)I9moQM塦f۶m:ٳ0h jy\` H;Dioy9s&9r644=zTFFޞEEEQ_ m555? lEUUUbbbvv r8lSs䏖Vgpq!Aڹ'"H#Za׷os%^͛WYY9pk׮RN׭[:uT777]] .ϛ7Dpww1bDBBBBBYHOO8t0 t.0GW`0L[En{{{UUUQ H;Di}yسg5~=2oeeE%kiiR_x𡗗WHHH~~۩]o߾w. LPvarx_-=AZ_rssGޟзo+W|l{tSLMM\ t.0GaG=zՂ 4 <  (   < HbIڎ}W&U_/bo?vÇ Xtm}E_+zVͦ~9V,-Ë/6l`jj`0ƍlL##Kp>S!ݻ7nnL5mmLzSmG::ZaN-Y2D>}m V-[>|XSScʔ)CmJڛ7o҈g3ŋfff ]hy?)fi9S֊޻r&Hlh-cҤ66.u* * ߚ6-GOUJ([aCZ׾5=Hnݺoܸqƌ¤G BLG*g6n|A7p8:dŊn,MԬٳ)KLCC{Z;a„ :::666mmm%$$@ҩ(((-=X'NzXeՅ J v뙙Yq}۷ݛ&VR"6au#]wt_>bWUmڗ%гOLRYqVK#߫<$%%^70::8ASq@u3b&Ś r]]_MTT͕o02*]8CM) mӇC7""$$8EKdHI[;EAÇoذkWRSi4խ,/xQ'zCmta5$$(];nŎ&pDO`oP;p7V/m~zbf}+ ..gNOIJRrFx%iiy{kK"?_;wTee뼽JHpk3JIA@w) Mw6[F{+ Flݝ;*0hP|7w ҝQKJ钼z5*z[M&XXIK32֥Id{Q>.$$8XtI5`P}`ܹǏrrruKCs+`wY: ·)ݛ5< HwBf\\2uƪܻңGCYJJ5М=4ܻr劦[MYFz?L} 4uH7&;\ްxqh`  (   <  (   ))s\b0dddn޼? ƦM-ϓġ_~wA: \Bhh/x3eX,_~D!X|8DFFʍqU7iڵ4^ƟtƌC}}}FqN:Ç=z,ZjIII_w2444^:))ISSsV^lP!|iّ g2gϝ;;YY٥K LL`sA:;/_ (ҹlTMMEў>}ҼRSSu6 (416 (4 |LYY|@H1 j9 4< HgT7Q!0>ŷxG:3 <  (   <  (   <  (   <    <  (   <  (   |pM;3=\&D|g,+((3m_ DM; bv9AC4  <  ( Hk"Uк0z`%'iX ؆I 2kϿ}aZ +/4i{I) __S;"Zsړ^\;A7Ӥ[7WɇR+SVWti#>jdyV+xމf5 H#|FuKm;g]yA_,XXfþq|F٥݋M2l5aol3,f9{qv;*p2Qv;ѺQbХ'LKScf[[6./ҥKgϞmڵk__x!|ɫNXfڴigr0""ի_;w\]]͛7{l8nܸN<{ٞaYQŹywjs|;vXJN_{ee?[M555׮]4i!|[~,=+JVV6%%em`/|~~~ /_qubVϺasT #,.6icڃF"a˳EņíƬX*F@wOSٵuz6.}MY4eDu++l  aJXY\rcuI5y?KzXS%Z(έXDg'q^88xT`DD_Ç7oz}Ο??66ŋG[[{͚5۶m+++p8?Ӱaèt޽{!""޽{ϟuu-[4ʫ>u>{̳誒OtiZSn+/,=򴲤D:qza7ж?퀝]TTԀ8NϞ=I]rrrl6\v-[[9s|Ç3gmPRR"..ޣG166&V }I=xyy <ŋNquu533٢T3LC7ovBqYA: [QR#}}i In. zab]Q1-6.h͆'zhk;D/ݺ)h?RPKYP]S^~m#\(mS:毓P%i@X2VZ2fsgqnHiG!V[x.)5Lp~֓sE???:zjs>y ի֭ۙ3g_.%%xbM999‚:l2UPP(//޼:3ew~I~F-vwičMn -j}lx}s䇟˪(;OѮvLJ1˗YtxUl|էO'e)n+eW൫zYμtͤ$-8mJfBbxȾc?W7sstǮX 9o݋Wt6$$Nχ "-- #GLMMӣ"?}Ǐ6l:SSѣG={VLLҒz"<|pݺuaӔY,vOgc55MBB^CCJkh Er~ܾ EiDDDcbbݻw1Jbccܹrɀ`ii 222СCyMMM?O8ѨY޿?""СCbbbϞ=+..޾};9խ[7G*z ]k߬2Ȫ9 ZZPE}Ek.$7O{>G6  =4ZG(xuxEf̘noo/0&˵Xr%ocǒ---QHmmmEE"Mv:[ӱhh=,=>vc:!y)hS_ѢnKV0`@IHzzzpp#G FBBBHH $nihhhhh?~O>O333;g\.WSSG-C{+v϶7YrLf,VUU<.Kъ޽<$p &êO=ql2y7= )#Ce1ErZGVU4,[BJ+w*++kmm &&&III111fLMMRRRcƌ9sfff&'OLMߝiOHH(..R ;<ʹ>_^ܼ]bT+sxސA?ވ&yfe4p8Pƶ:rvvvrrouLAA޽4򼼼W^ӇԇRRRW\\B-,,ڸq՞>|H=E{LrLf量V11je%H8tqrg%.]{޿|8|w9<7Q-"{}>$m@yuwO#o*.ƁCեeYn?Qڳgϙ3g._9 8}ʕ[labbbK.鼣Çfl .\~=޼y3Nkd+Ы׉ɍا +J+*݋^% Nyj0AQg>eڔ-d>| %';hfϢw9nK5-4s0?J充o<nMsn ޸q#PTT,))=|򊊊իW7ڭr/]w^11nݺ-\P__:ZYYO.\hll}'Nq8^z믝 $6..6p8Z;n?ɜg7o5L/IIGٯ[CQit-6jH~MEaQm6s׿1A9l$mG7qq}e٤bb| x[*{(gik.8^6nH>~e֬YfjܵkW3 ...6E>}:Աm K盽;vtx8=&zQ.WhTA[nWIDAT}{ \š.aIŊhb aܼy= .*Ӫ7FkՆ)wtZ;<M:@^n;>ִgӥ۷o~F a{&90q*o[yۥ5M6N`Xmmp#϶'ܹ*Hmhhhb988y`X`kK P܏vՁdOBoq&uX H:%Ne4;-@y}#ׯ_с իP__˴4bgϞq222ݻG %}IRRW^SLi[!|̂uB HCUUUx ѻ<%%%%%>x'O*++WήԜ;w(ў 7˩l{"""FFFSNb`L:_~Yje200HMM277ozĉ>}=zt_ziӦ͛7c!8zh٨ȑ#FsJcƌY|l>l6;;;).3][U{Rizyyyyy]z566֖XNܱc0x`lؤ5yFL1L\8tEm+/ݞk1cPkkk^KIJJǺcޚt'Fm?-vիW'%%ijj߿UĦ(asCjj*feuتm>}4{3/o-eo2<~l #ߝ<ܹN\\аVhy]o/_N<9##Ӓ_רFS:ĨaCXX/e0۷o+ȷ/_;r vb2EEEt:XŐ /= ߻<;w}||455'mhXz{zz2L庮@(Һu\m۝EȦ>ê*dddgϞ%@ц@":c yCS׶zxه;{YǎĠK)Oz51nKOQ#ڭ['i<====wOT㲸UHMMmjW3v "޼EEE$dĈr25xrW^卬$44uPLl>4"b=X,ُ9ٶ)D ؊C-6D͝m;tNJDԙ-Eeq9%yG.^8x .-mcMi[?몫uR5Џwhj"ֶڴiӦN;;ǣ@[7Cnjθv7~ŬG)Z5+:w[O#nHȌpsa^X| iqAk6?C[|o'zYMIGOZ2UU $%&Ve]ߏ&f.Ӧd&$ Gk?s$?(Ub)I~v/FgC'4ѥ-_[X2qozYμtͤ$Za`5Kg7j[侃O#n|l$]mS]_SMBx{ח!Zc-_읷[*d[o{@s̢w9TIS3+V7v݉䡓7eep`"W&}UU[Giwcq(zC_'&_{g5HX lbAubjgaڱvv:嶽LUG)Q nla'4,"aIHBBDDK$9{~9ۋB"LW^uvj~ӊ@0Gc#KwOŧr*r|]# ayͬA{yoBȆ*˳]tW/{:Vm]{e͝^G',+p,W =~|o͉k>o2|{sfB>ZZfd߶y"t !xdkd !K9- nx?67EGbybse48O{~7BH" <& =w<~Oʈ1htVTji&|4`!B!s L&}@77+d2L&C9X d T}yP(X L߀XJZ`ôRfJB*B` 8&q^^^QB赭[Scb摝rߓ]h2@$iꐘLzjGRk"\$C. _/9qGA;Ai,ytKK4ww+j'/䰰PyŬ+W׮XjyСщD"=<%M*+ NߏD"3dWWL&Arp<ŇSz$L 0,i#Q[ n׫4 ^8;466ItB0u ɇB"~g!&A--~B Y[uv\rͲO??=# 9eZ`1LZD$.otsn}x8x,ckkfz}WWL&C jK"Dkk">`Mcu*Sjk[:ogsn8e=Nop>nqR:zE]aK=g}Db9jC#Z}egxjbB8a0|e??s\ P> S 1m[Yek~K, M+م xO<:(7n޻'Q(T8U4O غUݓH޽;/w ~\Q0d???RqG3gWV+7{RJ!{yyy8FYfS=hkP^^eݝEb#YЪU6}oŋҰ8cs/֯:xG"8NDDD~~~OOMdd[ܗِ 5s/hm@۷QW744iZ5%%>*jX0J}않ZDF&[3Mr8˱wnpPN9ĄmْAffKthm@1T#爥 BHWTqs rR& o=ܘ6͛bv0K߲'55I {6֤8%bH$Ʉ"3Go =s O"ҧs<ښ/%})c\fo(((0L~q0!1lb<"JEEd5}3ސkooWRRd+ʤXPVV.Wb*w;A/`||+]$:o] :$9"* `~iSV^v@.Sbϯ b0B˽ܹr1"ёStzKCX|pFrCySӀ\XjgzML3YDՊD. *xyyD'g:fyv]ZtFPT|><%kjtz@@BH$!4p8zDF  bd2 –"۰g 8%z )߿\>[[!^ Pkcm{ joo#xxa)ܔxyThq@Q7'/*wBy6{G|Mw,{'¢!!7RXx{5cbbryiiRH$w3}Fp8a݁:-z:4ZuLHw >#M&dkk{?qR6Sbtu IMVb}˖xu|~??_kWڵgܠ\N:ίBSIaa_"޾K2ҏ5v 3L66g[= ~QBO&{ĭT'A 0X(/< ዿ^z!^WQ}o$, ׯ 73F o5:JErr M`uS7@5  WJJbb&VH$88ww?{IF{ĘF}w֮% 4T*3J_3!FÚff9y2<~|{E/٭Z !$U(|ꔠ_&tv޺⧟V K*m DV> ;b#3o=e2 \X> ة|WM```]]`Zb@%]aKsFmx*oNMMqT P}S%99  CCʬG(J@ lmmn2\rL&,1j*ɚd,t\!jFhG_,/}_: FUUщ93/}X*-.~L'r@/BtG[ 6R@4TҶm;W*+33333y!TqBWDNV6m{!%%%??`0j˧v(Sh60]z |;|ꩬ'?wg˖d&%-) Ev=M[ɲ!߽q6/:: lI'Ö,]]=ee5k6aVf0Η^iRivv..’?ލF;?\vޗɌ  ޵+;Z뛞zџ!I cceK7=>`0N[<B /5Ud2ĻͳQԓ o֠.))/ka24 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.3.3/doc/yoshimi_user_guide/starting/000077500000000000000000000000001475757676000216655ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/starting/images/000077500000000000000000000000001475757676000231325ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/starting/images/keyboard.png000066400000000000000000000315211475757676000254420ustar00rootroot00000000000000PNG  IHDRiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N]۱aҵG^n1ϒ٘L_66+D^\ݧYO\#yY_eI, JQܲ=G]\!V뿄n^-kwNhFrcCﮮE׺ !)7v\kfJ0X$t٭-Ժ  ¶:7zo;`zBH/LQ-vս5B;gY7_\ !EmgeLQTߎy\XRL˵>-2>,\Kabdg6idOS#]kaQ=w"xzsO ɮ"+;UBts=_ ^Nw oD?ީx^-)Yد8W4Hci_ئ}a3x8Yۣ'I߷Me}%BN~y=ٹ$ cln쐮fzJV.%W 4Mq+sk xY^$f=w2fZ.ACXB_ !ۖt0gO^UR^3#Hdٛ܍OG2aR\`jMgDB)27+&C(Զ6MJAŦ LZTk58Ѣ ' !v/Bl,FDTԣW!Rte!ȠYy015'15gPZrƐgrᷞP43ort(|]\N^1!Bӯ#j7AKGr?.iUd^s?6aGXmM eTOEVB욯=TK'I7g)p8zEeF8ژٿMIN}EmሥZr@#n?yig|^FݔX.FlErl)ê qvmF9]Nv[6;QFA_o=[l[ rke߹M'lp18TE[_h!vwqo0[_h;!_#;!$zʹT pȊ3x?+Dף+*D<W%`_'\Ы\>Irn~Dvҫ` ﺘVk*mlu ˢ*,*|R}Z "W|`G̜–旯n;7!dh~$]cS6^ۮNvff'9u~Vnѵ;O{UfO%7٘m| -qo E&k|jn;g2_#Bfin!뫷[л^j- ٸWVqtVEN`31UShڶKP~ۧ|:u׷mb?!D&C3{l.bM.S}foms)9q,k Ckn|~e'Il%!DXD_W9"Ԩ4u]::=zLIʧ(kenrᮞNƈ(g<[޺]oGW[}aW$:v-- !6&ER-ҫ{s#(GE\,$\$R -O73WI2yB&ۆN,Buyqz@zGzY鳻*qo0lI>z^`|xDe&]ɦ$ ~z Y3YŒSyGSW[@Qtw/gwY/" KOݟ:tRR~ E l<.]--9%&rǭimLM3 cSt-l[Ն6W&ZuYPSGɨIJgY [zޏKܰ @%TjVV]Br'h |;N_WWG n,~ֱśkm/*d6>nvbV\`곛Cz?u[Ι6/vۆ یPNOG6PWZkj@7llvu'f uNvu1(Z̈{un*9';\ϳnnХcOuiSdוTNoiqM)lkX_ˤk'7~+rI2}]q+f(8ٚ)Sf\}e!-ic]2)]+>ņ1%M|,";bȹDLzz;ƿ*,)jjXor32ks;Kw ٯ!b>[a[Pr>Y')=ɡ6C9v9 +5`οb@?/'d_o;|O*q sqbH_S;[նɅBJRIiyVn`m8D64R.V.o73Ⰽm4ͼm@c144D.4 |Bǰ_[ F4*e/O"; mm@@m@@mo߾K6mZMs9˗/We˖:,jڴiu ۄE)Ç+NPROFJΥ|JԼ%r \vFF)6yɒ%ѣGGVuna@M֯_ѓ@@mm@mm@mm@mm@mm@mm@mm@mm@mm@@F l66 l66 l66 l6{x6"/EYZkS6ڛv"K%r]o'jmm@`)%m$?|0!6!իW={ PgNRMV]Uq XkpdЀ T5s VrL2ŵme{8qBqPCN)U^~@ wwdɒ%P+VPrqx 6FI@mm@mm@mm@mm@mm@m _4FJDJDJ|/Soa˸P34 l66[nĈcƌ?~BB2sUTT9sF&L~PS4̙a|||-ZD.\@t߾}---)ׯСC9$ {@ SUmOAA-[!|󍦦3Kg;]__?$$D+6mZM?lj*gg#Gxش4{{Z*//?s̟K,B8N7Kx6!DGG'>>(>-KKK9[8pRVV6f%Q{. T_}U35xxx,Za͛7o߾}̙JY>^rYâETÇ׺.hSSS׬Y]]]ɓ' !~~~cǎ͝5kwzz:EQK.=x`ZZ̙3 4k֬:Ν;֭[]oddoFӴìY`ll򊊊ٳ˗/kJlaa1}y rwnn.M6lX|@ .(((jK@qq@ s\|H'444ӳ۵kWI"S !W^ekK.---]z}K\jhh4rfffM?1 S9rDuzu˖-e~P@0sv988 2b۶m7n zƍ~JJʊ+lmm۪U+:ujӦM?d M%zogϞᥥYYY6899*y !ܷo7K~iGii)!-˗/dLן~j>$mڴb+GVu;v숊w^ZZݻ׮]k.`PPƍ'LЯ_K.u>PAIII2dڵk e`RRҹsBCCW\SnLBBikk[YY%&&Vp|^#""؅\zgϞj.u4M׏ջwo%S2 㣧ӱcǿKU iѢůz!X}vjöIܹsf444=z^ [XXB222dfb#ye<|0###88x̙QQQKh*:JV}}}9]m۶=}tTTJKK322^dBBBxxx.]gϞ-]ڪo3>z(33חmQpB__yyyV ,++ܹ6!{=TXp8>T29///'''??_OO,,,AJ݃6mڴf7YǏOMM]z _ѕ+WTFN8p@J6JM2m8Qԩӌ3$Srssj \&۶m{/^ׯ~j: ˥i::::66vÆ |>޼yBPn R9vcǎ mJ۽aaa}meznWS'J888-7n,,,_++wE-Zwpp`Tׯ_e˖ :RS۲Jb6+;;̌w:TG:Գ~OGV_=.\:j(@8yd[[Çb߿C2s //I&yzz9R263fXt)9zԩMya¶"hE)tʕ+B ˖-tUU +!/;w.!nɒ%rK)S|l67622j޼O4[neO;w:u*!R&åyĉˡCiii͍wy<ۅ $ o6{ݶ0222..nƌ/tePI8B͓ؿKK8p AˎC2겏J>BtҥK5dž)+{kk,۷-Z$}Wu}6Jd 'OdkkkƇ ԩSAAA/>yD>"""66677?V+}L>;WBv?$%%Mp$^Ӻ۞={;FyfX<{촴9s氍lP(?~v#'OF6xmñe˖ÇXdz>,I^b?=Q>\ AAA:t@0ijj\իΝ#xxx?lTBHnݢ>}کSZxM8{lPPۃoݺell4T~5t…_9r$1tɤI6o,chȂC2==kΘ17;0IDATа[nsm#?ٽ{5k(ߣP񺌌6Cso֬UXGFw-J6mڻ˫U2@zzzlQF@NІ7cbb⒓mll\]]]]]%}|xNe '-TrVX,MVޏ?Ìu7я.\HJJ8:}IoggƼ=&êmd c5>ZͷǏ_p!''GzbvvvvvLLLAT*SB۰pnݺmÖITu'l`]_DĭGώ5}7y&*R0!P_{pīWzCx{':u)l~:?#I?0ܿn˗7lnn*] b-8;;lܸvYXoV fʕ+y0]hp8!b1abs K-z?GNNN\\~R5lBKtt4{8qD||>s֭w:d},(8u676p!S-|c\.w  40?~i4p`o3}#GΝ(KK!CB?w% Bƍv(ǎ;bBZ(>ܹs~-]tv<`R7rȆUVeff޽[qFm[Uf5on. "Z籑$t| . pܲ q}6R%m_QQQ}577|28WTToDDDϞ=%7 (>|x@@@nnw}ױcBi^r%uܸq]vUO=, `ɽS'7lPF> 'nŊNez_yls璒%-Lnnnl+CͭC̙v1cرcɇ 1b_=_Y}]tYbŦMvկ_?+o77,XhX>BYA3LP!brJ7*5%ٱ@OӌX,qéhwO?1cư5kVQU6۷ݻ$l/ZHOObݻw'ZѣǏ777jOێbQ; r#wC1h X,KTmjjZ}6mH&J>,X@SQFU\oHYxŋ !6mzN èjdzl˗o[)lhP }}4PĶoߴ&-%v%|á!"P(f׿ U`%}&MT&VZ%$$JO?}tTTJKK322bou944[nۖ5;;PCM>g̘!f:::\pm;y=,(_ `VPm7\}ʀWڊ_%U% 2/驏WSQAU=^mbbWVm\L-7gisss M !rĄQ7 !rYXX<{ҥ+Wjkk;;;.]e ߻wo߾}<O H7>w۵xS!9WTl(rv ZJz9NY } >>oBϚ")^[xtbD&!...=zzjA~ޟxwkћ'ii+}t6%B̉1;x2ךMŝ.r ~?b02'a$wU< 23R&p8=zԭ]kcaUk垡h&[e/O#;Ir;|NNCiɉ2iLMM_j ijҍ@xq'; Mk6mbcc !666udz9T~у ǓAa>XCCC@'=S⌌ZpiM ?|9o7ۓyj#~߅ڰ[Y>0?jvIXĽm&skT)IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/starting/images/virtual.png000066400000000000000000002074701475757676000253400ustar00rootroot00000000000000PNG  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̹bKGD pHYs  tIME0!tEXtCommentCreated with GIMPW IDATx]w`TUֿ3I=$$:B ņmuuumVEP\ݏ]+@!! {%L2L23x$0odq{s=/\P!F8(EQjlicq08F&4Ͳ ˲}gԩӇpB! RAEi4>0M~5HG/0F#1 5NȜ6m`X,:`ꔙ)3 vs-$ARcg hAy7/}[V$,d09BS,d)0UlYw ݻ| a8),`haXZ sNܵi.(;B /"R{d[uMՅAEN, <**vw[`hH?/7(0̾[8aF$С݇Xa8K!̞{kTTʖ vHL aCDb#D>o{E"qmՕBa8ZVd$f^@:s.8D'dn~A&zPatMmAg55!Kq_rKNNW}4!R솶>cwUՙv;wlԩ,]0FO`gǿ.gрXG}qC3Zm}|x2-}&Ljt)9pb?uť||qjf cKGk2Ot`Yt4B)>}'22r^^^'OJPhK? "XaP"tǏH( ؤ;}Qh46fߗ蝏 %RAױ;NqаiSyyZ-6CB!TaEApx?wĉw}o!b޼y=R}۷o:Jc=H.5 fymmmCl6~\tq{2 *nɤ-5%uĉ˗/DB߳g/Xdɒ{G(:e˖~ 0 xWG#?wF&U#qB!X*IxwCOFF[>|xԩ7\ɢEF/?Gioo~MFT >w؄~䷧N`D"!$OT(~$Iɾ_GF$ V\"խ ð,ò /CQ$GCE,^΀ *h0F֎3Zur|~xLU|_ziS# O?dYrl۾,ԞvΑGsXΚ5O>!I򩧞zQշ~HT(('ΩSZ-lj4J۱cGVVִiӼۿQ>7TVZm²W]SBQk ҨQ^^.Hk}qZZZ1$5>e;JUMSѱ1iQ)>Cq!:"_[Ln/Kw[%Q G_řAE'"nDbbH15;PP_qYbbEp+߼(K.xZ7wzGyXXƦNYRz:2rEPpeƌ[l),,B5 kjjnfa{ԩS {=r2F;v>Ó&MZ'Np͝ZZkv+B#y?*j_M(I vww [_7>߶БDP@'7,f!f[! ZMׯiJ*Qh4A!wE,x{,-Bd2" 7`VTn0,?!Э7tCIR 28w |CD" ft:b w7Z*"f3G(l6h4j|pM: }!=q!&uu&$wJ$@SsehH츔|5!JGޱ''MGӎcC/Sonٲ+**Ν;o޼{ N_b1I>>?cL&LՅL .2ڛ“Nn|SsEeI B}.:*9)q"406|CZ,ͳYm ͒rVۀL TLK\!0ƞ("ɡq<0$(`o(8ajzd0{z55յ`Xj ,we7 j1dѨվ;G;}"6.\8#I6q2%uvRa~~ꚓzC].SeD463/,j$D C;H$RTi 7nFlgR_pp ;MlX C$Ov34>ZS9yEܢ"GfjΌ"$$Dش6lhiiΞ3gðm۶O4?liiqND3mH@'*́ҰsNE"Pp,˴u X&ef.Ḩt@@xaAX Ș !/xDTQ,IȬ) H{Jv;mb OWQY~K.S):re{{KRy. e q (9}رMj *o _aD,shI.\3 &q"}qBV=3c|zڬ]?}ѭk.dN2\.|_~ess37n]-jhh[^^^PP2 E9sS"iϷjpg}|JaqRAS[Va,p@D"Ir4Tظig[ZkCCc=5 CL}L~SseXh) ːqS`H_ߐؘӧ#2մ)%dhƆ&"Y V&M\p4oy$$8[^P[weԔŇ )iY!ZJAD .\t|:9AC64$͓S,ˈEҸش~FիW{yy;$N` >>uuu)`G 0i<΢f?Gx@)*a`<ǐh3@ 55CC,454Ks pa:: (ܨxᓿh<s49Hsb|$eyEwD"(;Az}wmY_(?ڵk X`_]UUn:DV/.[l$Itr?񏮩A*^}}}\Uf5\p3 -----#..YIU5O>[q "-aZm+ . /i4z}U3^vA< XeXAe\p;͡(KsS<>6$.Lvނ>N!xu +>aEzѽ 0'`w h۬5J bZ$7d,\y1 }SSS``T*dr\)$$ sΝ>}ĉ P`5aB8zq.*R)<bٚ҆1Iڌ޽KP466VTT455=:w^aj5a͵:J{ eB]ȗfFB_6{M'scX,얳y5uQQbLc„ ?0w9rw}'ѕn?p˲g<.'O)**7I%r$,bX*e qB55ոoK3UH,81 ]YUTβHXUtt7_,ަwJxf 6w|+|cPc|t2 ]Rz %î]"##9r,44.~u,ׯ6XfOMR*iH$ Ijϵ7FEu>,,.;3e'No퍏O+++֭[+u0( t׮]*0߅!V>}hw~=.2*z:>@[e}C&Mmm>mV◽h6STT %BJ$SWӑ$9}ak׮u wIQ JHd4MbF=2A Rd2kWvl6 +ٌ )(6N(V !WH%}}7tG6' &dfD;?S&xsKH$Vō=g rw O9NJ<\XuڒTBmnʭWX,v= ..nقOZ N99pg&11qĉ`Yjjj80F `Y&?'|LEe!jjXLudroP !t̸^,vRtCӷmۦj h"$B|'NRi8u􂃨W @,BQ7vfjqarskc=x V {چq1=:}Z$]pl۷ݻ_8b GrЃ-AG1&>4 B'(-uA]ٹGv/PQ8l_vka29y,gy)e1!E"##(ٳ4T6wU~XalXDP x\Ha }⒃SXĊEbv5M74G}駂Lחu뭷r+Vhkk[bQDNNNmm$XLc˲ڮsMm7>/aaagΜYl̙3o-[qg4ګ_BH.(}kkkࣕd g/,bpBNT5۴~ 'g{Xwꭊԯ ëX<ɲ(=uBE,B9>… / H$9s]fZq5k]ʕ+xV#$ɰ @da1c'p qigkjOUUe]׿nooߺum$L& S)Ͼ2σ{YitvDF$ b!tN+V"ܹsŠ,A{njܼ{nԔ%'' e\g\JJ~II*k[$L*8tvjT[ouӦMW9@4 Wj?]b4Ml6 p(/\Nw4`ooysv#n zGbiH;OPrl}K$!T20`be;;ǧRc zÇg̘1IK4iҁ~͢QܶL(zzz nnnd1IRl.cBqX^H$Dabbb s=v2.C UdH1IIٻf91bEٝg~w&gw WnROyMg{S٪u=X0H4iL،^^ FDE% 6gϞ=tпaF|٣i~֞'ĉ宻r2ɤ8PmgY]#T^xIZ-TؐX,644 m4 v](Fo@ O˟_2yD"Q)/@QE_}|orlsVMf)ۤceG}]$^Ǐ-uz)kCİLlL갾i*gLt E曝:uӧkkkwܩhHzsu9r$ɘJUWWwq͖+]@Γ0ttTR驜Eb 5h4W8*TV?##b?~-66V(]-Z믿vww0h4VVVD@1 8aqSoiC=#0^Ce<.u[zX ӕ׻Cj#b8v⡷.,(Fgȝ~-_uV Ygقo~+#f?m54Cs7]G~Q#'|?޸qFQ3fӟ4zJ=oڵknݪT*1 lEEFF>#{菜Ν;wm,Y-5u%ǎT1 iB0-uoȈ_v…UUUMMM8www+K e~ ń rsssrrd2,Z9s挾ponHCHLtKڸ^L.,aYd6pO*j&>( \,b{NY2O87~~]D5]M^ Bň$dllm|ή.HLD~pT[-,(6XQ6mo_\SSc2 o5Qz{e~{4MD &m󘌌Z>TJzzl# CZAB8_q#oQYY}v  %E;::Fϟ?Æ BL6LB6h_NTΐ2zBMS"W5, I h=4ޠ\, $Ug"#RF ՄjBGz V3E]o ,K;Hƺ6 fizӉρk#}p10l!wےGY`f^?sk~q6WM8dt999sMM͈s}][]*)D DI_p':%$$dĿ.>>#CGGiӦG8Zu?qbݪw S0vGNNA?z 6.!4 = minLN/(Y"8i]\B`{Ӷ[_aFփĴ]]]$Suu9Ej`08|&an ĎƮŤ˽j;N<7hޤ7UQnU;jTHfWlaa'  /U,f_{{oPPR?~|ͼeYV+le-ˀJ! *__߰0u/rww P 6O`ЇXV0^rPUVoooaԩS۷o]63soiii\qC<5a!QV+A^XO:}X?{h>;UUUf\Go[;â4_(1]282_ Q?׻ "bstoEv0 LN* bcc 8}zqH$J!loo'2L}}}{*++KKK b^뫪oD"@||o )E577k4Lv1 p'јw_TTTeeN"I2+++..ĸtadfHLJJq\7U*7|8eaKKJb144tX=d z{{v;'0A]]]\ I8Ϛ5K,­B٬700ܜ8l`vСqSD":uj``jJL&MtRT.k=qVHLLJ?DD```DDDllmM===W<id2]\]eee,rIII6 R4,,lܸqS򻺺rueXv;6zuuuN⺏{RLJJ"9Ei4+OL&0&$a?]QQQ]]la>>> |H$řRbBqAׇxLǏwtt𷯥RirrkNq!A$o]DZ|^AD\\\YY@&dNȜaX~IKܵ⡐s֬YIy`g~̙|bǿfr>_|`04M4'H|ɵk:Xe.]ʕ!鉊FGGZjɒ%>ʕ+P ,Jy]%$$w}#aoi32."hѢE|Cnvdz'mfZY˗2tW_2ۛzqs]l ?mݺ;qz>9s{agyQ0~^L}[رc܎"44Ob AbŊ{eYͦP(8aXjjSO=uc{vőB rEPd6n7Ͼ\g㑣{jpҀ=Oa6[~*!A{v m{woVo}aI̙cΩ VXk J/ / `>Ж~{ԩBo߾GyyhcJJʻ;i$Zj+2XW_}wygO>;wP"?~|C/zzkF{7l Twƍ97_z饇~X(V :4t-J?g1LCϟyfcI|a)G {; 0 HcNnd3'G' PdeW`k[5?d2;-0$&&L<~zyy9ޗ07tSUUUEEߒ=:8Ǐkoo>*{OHBsΟi2NvvRM:rXf͚?ik֬{)((($$_~ewر* }K,9qDCCÅŏ^~eE"B&pk kSSSvМ~~~?رcj…555Bs%~k~.zy75WXVA M3Y3gϞ?Qp^yX#< b<ӂ陝ͻ^͛7o<<.Zt)_O.q0^u9!!\,I-r_:l2g辇zT^^^8vmCXl諾jDDfgg~Kzxxpρ~Qw2b,=m |<}SI3gts3f8T|=BX<}tgvpNiӦGy,^xLUCy,X$]`tP"$%%9Hϟ3gO:TQQQ@p䟯IYFxyyk#~ (D2?AK]EZ!&W 3 _P? IDATv İkpBɄœO>ɝM8nrxz< nnnת;233L$RM>{{{ 4 |HA]DHş[a(bbb`J5ʷmܸ>0a£>7dff0==} ?'|wu)))܃/ e \mn1D,sNuu7\\A$/Jy޸QanX,T-%sڜ*$+0a;aΆ;G*>HoJ5znٴZŋ_{ќh4aVtdXpʕ+pomm-9B@7Z^pGf.,\D\sϼNe_!|N vBq#N >],pOq/FEEqEEվpl҄S1. .em۶ŋ;TW/~'gȿ;BrRE.Wzzh*ahwwoW\ . ~ƕ+W:e=|SO=qF'N/qۭnl((V3楗*}i\KEEEIIIyy9WKT;]p\(^&`ˠWRLf}q:{K%nQ1jj/0vj5G~~Mrrrv;WaeYe2ٺuxx o8zk׮%Iaq]*owt?d=,jh!tcvUUUCEE=s[7vvvƎ{i[njUzyy9&[RRAׯw^z]vvPeVKQԚ5k7+W4'BP(f̘b KaÆz>0v lIGy>O,{)gΜ=HM3B{80  i aAd l.(IW^T*0$I800o\?됗zL61]VTZ,_//|2yd6ǵENNڵk% 08a2|Jh4Ru-8?~|˖-gϞE8n&ϪURRR֯_tr1*++z-HanWNPpHBIHQɓw{7%%d2mڴR lٲrJN'ˇU~P(===`X,Z'Nڵ ag}[o1 c41 w}wɒ%#)--ݰa;79y"aa>%K[N(-ZH?6mrWPYe1bC+lf̿lr3'jj+@zrиq-ZĕWޣ>za$_|z0eʔKQ\$9kU]]߱lbϕw]7;MVd)Ըl!RIQ|$'Şqٳg߿1 FPP@4BnSȲ,BSdr[ZfJZfͥEQO<: !_rEQ|iaD+z]V!VE"h4jZ$wQSS30qwwD!.1Fqƍ۶m}zQD,7`㸳eֹZ[Z+KKy8gVZuX<{D/Ӊ/@(*VU.} | nذ.;;oQՎQ ACC{zzrssYx? l9K]hS*5gϞuH* @/NO"a.nk4adg^^ޮ] ~~D"yJoy苟ȑ#ˎ;XUT?~Օ;8EӴgBBu%++IB233Ս[]]m6fu0F~~>A,ˊ' ?vn?z.\h4!WLaq#h&*w?!$~;>*ߟsLzoB&EXVܷ*Oe-k>vWյ,\Uq)(PBK HHN cH%^~޹d~9_}pO֮]vکSvuu}@E4mZOS\zzzjkk<888(:OmB(9]\?x4 I5EQp^sW`IW a'gN?(*i{W$Gy[n>ݽsΑk/IIIVvI[,I{vwwĽ0͏8SU ?q!ɰ.\8{M61 sI\$0v+Xj}GGƍӗ| AXdɸ߳9=2o^FN[nzEw}q8rjeYߗH?SSSC_)(5`Phg[ߩ>eكn>c @gϞ?I~yNBj%gKoزeKII j=xeMjD`BQj-((x7<*7:tHwG8K/?=wT<:O|ՎM4ť(>pp%(,22$#GwBYV2! (\p%%%;$8w76mX,g$OTTTKKؼy?}޽^r%%%!v{]]J/Nc9+CSZb$8;vyQJB K/7RW_<1^j"sJ)IK)Z0QQQx0}~a={P5@ }^(J)wQ^^{֭S+裏&''ϙ3g͚5i'76VԖknj|Sƣ*5 $JMTTv8m3 $**3&,,v_WQy^ tlNcYnq'//=zO_l6BhѢEٳg'''WWW`ﻺiCRDQi_<iBCCe'6M~voذСCuuuY[[[\\,– @QQA<Ϗo3gDr-Gy$22e\5Bh 0O HVSWZZn58̠?wV)V 4<<c]|dkd\=?=x軬<\Uu:Y8,˒$Oŋoܸq```nL&HJZzҡ9??Ga+++(irIrxtNsԩ˗/a%gFIOO'Iiۭj%y i:33s 4V ! Q/JKKwx>Se5Uc4E)xOS#Z㸱O0l6t:yH/N;+{'7nh2XUj7߬G ,j$!dY]vٳ[+o*XO6!)dѢE_Hee ,$I>l6p뭷ʓ,='fhՅ;v8;T,8`pP$n:ۥe&}u@EGGfgg?sBp9!i33ҧUU*M[٘53-m*Aؿ^Ӧ !԰sr'|RRWW7zI~N7[͛fNhYHm(TصkI J2/AvTVNe^NsxH8pfh42&e4}]w͞={`Zʕ+]֭۵kTXW  Fn~R2UD"P#yA\.;h`WwǮ=5MSSUrrfpp=/ )))ڷo߁F%_~%t?yn{!t믿y2?M6mܸrTYcrN;,]zgdž -[ؒx,v>9n[kg|?v] #ϧXi4UTTt·***  g)K j)*pB.SO=uyl=G4M+\{˵}Q{嗋A3g]w%`E}IU^TNS ܥloEcQ#j3mL\8 'X#$q{+q믿l2Q;sL߿w7sO>Dy/_q\MM! gޜ!ܹsgss3q/mSU1IL{nzO=RrJij2|?,ϟ/E?9zoi4,XJE/$$Dqa^x;vUUU4qhLMM>}jM4I_~ /ڵf?~\z4Lrw)Oxxjm ThWQ~d4P褈xXVޅ n(+/͑Q 4æ$ zʓ3gݎc'&"iǑ5qv]/$IPmMMM--ͥe_4eUuu8u d??իW^￯駟cWkΝ; dyKRΉu֭[N)oM{ywyzYhJ b"RC?I*<_G(Szt34BHR)$iF>B ( gCB;vtaPPHgW|nN\5S)$*2KQBQCߋHDQ nw*xo… .W0X=EUa@Ѩg0a„ T2,q F%x)dJ| 1IR(tݒ^Y @S;HR$uߑ0R>vooo˱o@,u:S/eXFBа})7=fF %H"44j)8/BBH.a^ .1FG34){Ng8txO = IDAT x9ɹY3a U;@@ mG cLd~b!s~Ӧ~v{ D'u&F( ?n&Mʝ{R0FA p!@0Ycl0 ( r ǫbo9{ݵwL_wth.Yl R MKuY-9cb]b r8\"(I<4y*`@pryt:/^KR_el?Bc>_bbv$ssg A1Ip bDޡ~kE ]z s"uj~gJ$)8s WSֹ޽{OUJ$ n p8s.Z-s8U馹YRH HubxWOίJSl6)NUM򺻻 Sv-l޼LEzx`` UN.KB*dxgx:;; &[N٤ѰI}mmM[o?ڵK%R߿_سG-[[lq8:HsNbǎy/;hooW H۶mSH===׿U%R<_ǂZ麤D=ShllŠGrŷ~{1gÆ RWOz뭷ۛ8^%ub;UxJ?~\=:]b`uuu~hjj:+.Y_0⨯_wSHw>yQYn!k9kmmUT[n.8:|˷sJ ۆ/SXhhhFFFNNɓ/Tv/^?u$U6r1 +N_;z{*$K<4+?ȑ#ڼysQQ/<:u{nojjj랞O|?P~ԗGA nڴixÇ~;(+T7駟i_t׿\#G('Ek+LOFv{sɴtieZc0}oo ת'NPYEEmݶe˖7v}ɒ%Job) 99955U{իWnIj*ߏ+V(">k֬ӼENsӦM&MR]4_mmmIII~~bQD{i7:ֶrJEDڲeO7B}𪫮RD7|>-İa˖-IIIJ5TzG^~J]]]qqmݦH[n;O3v<_XXxjEz'_xnk(u6<_xc^N4i+4iR5&'{=ea DNgOOl@d5kVnnnff >GzFFFN<9;;;//o_TTаo߾Q/s 3gNxx رc%%%#=̙2gΜ Br7J`xxIdrB?t[x$dee͛7/,,lNJ ǏdȘ={602HuꂂNbbbO>j 766c111I)&j4f$)EgX`?v@JdB|괩^NeG_H8;;(@@}--u%G F~GP;vl߾65!?Ud(*o(YDAH7] 5}pӧE%W7O', 5煞N@kKC\L:A\^ommxFQ3Z3<a_>& :!f s{~`ҕ 'O>YZCHphrR1vչn d9sKMYS$b3\To}, {kin;ͣhCn{0 َ憓08&LQ;e5XQ1Td2[!fSPxx,r\8gGgi⸡ҥKz{{4M[,N-$Ar/LJJ{z$UDD}g},Kff8|5556_|%33!TQQ!}4 !!!aaa2DI+a``KZ&)?o~uMb4XyrSξ.&ILLLL8txV]XXDLtI@1a83p Q,:t^;\.IM͝:%<,V38׮2[t 64V<P~1Th$?nzZNxX'(5'-yWumɷ~ )t9,ie$Â4-}i\h[kPmm>F̸,r/WzN~l]v!I"55sj i.>gs7ؼy(뻴T.fyʔ) FQD;w;vbm6ۉ'W>>>>+++999///((HN꫶ZiWĬX"**JN:::N֭[8zy?~qX(KXUA̻_\J ,kvdszzzJKK JJJ0UUU~WZ5k,a7$$d͛7oX{o_]XΞ3yfLt3j5UՕ= B}}^oKHHh^ނShZk_(c4zo/|wCQKin ;aBʢ[<+!mp~kfɝXZIA[?xKe,|k(;hfC}mWZHo|;k|'믿`!HT{g-[*;}ܴ?22Wvz"""^{5VH<;Ӧ[Xn1 0䞂/=7aQ6!Ai~!O<2A2?twМ3y&I^)r#'&%p!E)7X(,W)>h֔vY,wm?.\xz"’&O 8w̞={xbe &&&77wxktn?N6u)  a 999sˇx e `ڴi ,fΙ<#8F1}c'edc-VZ.a;wYF䰰]!p8\yys-f\&4%7ONR~vQCtgaɤUVӐ42R ~ R35!d6쏄EM29eNCBU||߯f͚忾V?h , _y.[i5H5o< D +y}pddr||MŊqܵo9aTT^gW$0F1Q~7-IhTjڀjkx:@EJfˉ0IIYaTywj kUNU=YAjXQ@;JE07ot6b{pƍJ*^Tㆆ 8vu:(:1|ꔹuU`Y(&b9ӥO/@0fʮ֠Ȉ$% cL@k`/wQpn8p MǚkHJM͉M7)wKkdɟ`0$=0q{V OOjr<;e~IcFcPhHy`.bS"#X#PZ"$fNqu- З Ɠgܛ4)>UgW#AjkOYlsoLN9rtWeeQļ!$GFcHKLJL0Ȉ%ʩ/@05GE$1pPk[muE߷ OT"rۤ( Y3+*EX@\ r$S$<-mISrsWؘԘ Z\Rbp f ]@riA$IRRG_:14ֿ<)? $IAHS9%=p!> LAaD!4#7 T*w$au Z[ $gQꠠP-(2 @_QmQ'?j=ׯ%QkjCH{q ڄhnUV򼀐(=eC3KݎҲ==c$I8Vup8y޷|ܵ_z饚Qc-˟g9%yg:;;1o(YFӅ>ӊk֬!"$$OlJdU)ʛ$<,=y~( E䦦Lm[v-˲FC@ci}inM6! A5 ?`EAciִZ 80zLY`.y'NTfxcW8[3q`!c”+@(O[/=w'<^H$"'!y,ڎ'Ѐqƈ$I}>A@D-[s:Cvyuĉ! ,˲,v!6?͙IAsSI!#IRclM ;w}"qؘ 92ݽ^Ώ~#xvk4:!$R1<јbp\ $5#9({> ;`YYyE=J ; YсTp&&ȹ4ZylCLISaLx gp6 4P Ok0A@'fI<81Ƃ 2 Ƙa4MV tVUR>fuww4]^^CSP;I2%){ cI`ϑ<>+3?5%$Iw>|1a„nAoQ 1bDQJ]<EII9'@􅢘fFŦa.'BgWSXh̅y^<wwOklLֺp@wt6Hńdtڻ:iwh#mie m㸸F .0>;״M6<)-q-'?etݢ6{>veDt&6P}&"11vڈ16MwQ%eO;6$ڃ~'k97F}W<ٲhqˣ7ݸb *,.O > A>7|^BB+xv5z٧~a!h4C?q?~a ::  a(V3t:R-H-kĻeIJ; OMNKb^뭕2 PөAmܸ@f/Q|'h6LlHz$sݥX_ R;kz 0׸jofF1==}#TQ䚚0Eò==M Ӧ\G$'LȚ=cq =E0VۀT5kƵ&SQ.:\XB*lqbBZFz( N@*971#=!48]QYn@XXČic!^llMO$-՜2m#7ԴVOɹ2"ܠ!7bR8KK{fe#BN砑8~n>N QN֌_YdLr\jtywcp·  9αtz,˪H1zcKHN'CF+Fa'1!3-u.gu账bs& 3{e ~FޒX--yAA!3J iF,cɩ XlWNDpz%..y[2Zݾ¯L )ΨȤDI0#}yfAttRF4V\h4[--5e2'GF)`Ӧ.$pxatZx Q DclE `wwK\lð2o =P1uRǨ7gݢᷛ_7NH21b ce;`sw<2O=H6A )dn{B O{^˲.`0 T<"Bf_ d2A5mcSYsKN8phh(`ݬ˾ɠmLNF`WCÉ/N%^~B)H_( Ⱥ y`zBQщ煐0B::ְ؉uu嵵<υM|dryQ.Ko1C$1Κ50=ɕ+ErȐmzIA Aq1||oo[Hp" z_%:BoO%,.Qrkdx.K3P\.QEAkہ8j[Dt:4|nd}9Oz-y$IBvn( FӴE|>@Bg,vKxRHuCc A H>Y0G!1\\EvF#`d Ju׮))im;> jYVTڑ@H4BQl sRH_0:񼗦銢{6尌9+h5,;wCR_)zAz}n1vZ,־Ƃ­+W=q^DIB!$!c (Q)>v|h~zzOV&$d& fNB@HH{hbFR }7 8[ E>|X{d!)j,jiAAΚ(m4MK9,˒$#"b$KiiT 0t!\jUpp aGq2 BH$BX̉'*k]-T8|ĉqi]N풆N9dZBW $<3)IRuUG_sFiK[#b|š!=}';5 B$ɰfL$EQ]S2%g~{{CWwcTQ]}oL`δ0~ |RbfuцƓi9N`GgӔyǥ t>:ޏ4V'OWBlm])04Mw4:E$j5ZAF66LLPV,Qjt~uc[6@Ӊ29$ARR$AFČ<}&}MO,+շe6+2t<] ~Q PO䒏 cl00A$HO6?tݎKP?@_lF_0]ǻr(AXt:CCIh#:?tB97Qg[7bCB"].BH~ |޴Ezք6{v<ϙ"22!/o޽[''g&&L8__m!UϻF <Ƙ_߸^y%D__7ƀxhS5G< !8N4N4[7x/ܓ*WKnÎ B4_$*qrcwcBtfo !7 Frs||>"F"g\.NO&HCHL:o7**j5Ą(<ly wj-PQMmyjʔ+stcLkn''eI8s kkJMcV|m5:12"ArNɹ*=}JG{# *2eÏ O_Y2C0Ƒ]h'Qf HHqW^?ZQNz})9:)Nή*Hyv׭hY78ݐݝeafj]s?\N'd;4caNURf udYVtpVod5lym,,4_at˗l;$ITהZ-J꾌|۩ZH1!# &E(p[0ːyiMIAah$%fS9D (''ecE$ * IL(=Y$eBVOJr@Z##1Ƣ($=AAFE&LJ4@h)//|O% Q):gTFfQ||ch'H$0m^9r*.!5ed/iA\fl6j!xXD B UTTX֞b71ij28::ZOXBCu^;tSyHZNn1,F$@FR$M$yI԰ZF Зι`Gg Κ3JPtTI2moop ɕ6z]jki$I@&"/ɒ0C2 "cfx# Iذ\ٯc$76 i8$I 8I^3ccSGcb&GUFp{{eoh<jz{;qP̉WT}[}q^>gU+ &9|5͞׷VEK@i_Oy&0{*F;TFhX](:uTa7@fr˙Ez/M:b oSLL̃>(."]h93M0IčH˘rwnoFby+.lihlnZC@Hb O@ngv֌+)r7@_.zI7qٍd8_~ @#}*G L&멙RED\\X:DEr8,Yx4Xi4/Zo=̲:8 ^3mfM%Hm?a#0~@ϰ4^RO+m@% T[Cp\NT3^X_@ lٲ'Ytۻ{Z"A p&&Ȟ<ľ@ l-Zx c$ ;sVę€% ĝwiZ02%E%% +!!!A @_ΛbUJ`uzlBk+tCEyF/GtIᄏ$e/z4 /r`peLz5ü]-2Q҅E`1.]:^C8ġzֆ  UW7ojTNj@GG%ܞ[nnRzF !;K^%ʿ e_4A3$eipEcч>5T!%|oot߰_%<>tSI.RA@x<&U]]]m9wޑvbAzzzԳjkV5=8vd2400"])GA u{{+WȤiJù'3g3Ò\\\8p㺺ݻw\Ң"ǢZq宆`!)+j( ?8``~P60BHgggKKKvvK&>o4wC &N|>UVoYO G0AX :!,**;v'LY/H%8p7*s¡C-[vAV%aJVDrBCDElomm=-E! }8E-[;BOtd_DxB 8hnj( ?.//?NEbj`ܱp8Aqh쭭?apJj`)v\m|=AcyN bLC4h B#촯?BA8R|F_d]0-Ǎg6}qF%[f>WLNR!" FwEEhESdPj/n>X[{b1(ӧOʐ!C 2.h4qE 2dȐ=B~~~ǎL N@-BHP}B$܇E8t1Cو r3a èTFNRRZsbxZY,Nm6@t:Zs QG{{޽yyyҔBۥ1cƤIx 'hIzwy*77W 2(*##XJ:wH??z Rl5ktttTWW?~\"SLY~BgggO:gҥN>ރٳG ݶm4,X0{찰[UTIIISSSyy-[ 0''gҰ"""f͚Eqf͚ƕ+W8q*ZVVݻe,##kMKK7nhOS)۷~W~/...2"n( P)=ܮ(ng-=== njIG̜qElLFymsVRXS7߬R0e\qmPPa,|dFv4[j9B+VP?;G~]%R}}+4MKzNNJ˗_*//:TUvv4׻ / 0=7W7|?QQQ?cRR*,,|6lTx?va-qs=B/^{IN:Xkz뭮)77wɒ%{O?u~on41ij̫&ed> IDATWRyް||@dd䤌 :!P|TLcb4*ߐPϊ L̘:D\ #h^~UUejxUW}wǁ)O_P$OOOqMMMGG4{t9[saܸqmٲq'<<\O]Y.:.IIIwqիz^~kօRFFFnذbHjܸqq!MVTTT^~&e裏>kV+?7 T 'x](RLLL@@ۭV$Uddd^^kaԁ3r8rym``ƥO:yjY$):qL:(.$9YvWn!.&-8T1U^WNLEvC#{ꪫ3gvtX233_|Ew)S8LR-^q=iҤ/.);;{Μ9ҵBqE=P\\dp9~iu``>rn믿;(j…\q0vĵ;xʜ)]#@rm]HN'}M`*R`Z;FZ0&j`ҹ{DR*:ݩOT-ry#""ܤ A':צI&9z͡4#!!qBG 7A_Z2@)X{0K*OEQ*թ-2aǝiCB"i=44i񧿊SՒ HOO/j:((Mw|zzqqqEVV!qR ypaB'NxDQiiiJm˖-}G}m۶20"7tóoܹ}|d'.yd[T%!C᪫z饗,绕zOOE}n%޶ml6K`Y.cNoBDlݸiUTtlztrB,K$2dp?,X`۷oߴiSAA5kƍ7o޼D7dvZaX'̚5k V\o:G8xЉ#ǎgeN KpL_~u ٸiy{Gs{G^&e ("#F ٳgϞ=w}gOYPj'4^ofҥRVoDoO=޽{;;;m68--mܸqxWBIII>-[~g}朥eϞ=R]̳0|.(y??W7|cVq9'N|7pc`殮cǎ9`F@V w*PVVRrd# ArnڵReZBTB!K+!Bx]w9A_~Yj+|wVi}VZNQC?Ņ7o{Sh4n޼Y_/W>vnw}ڸqjr\B~ᇜUV9Z-]lِm:qhӗa  |GC|GVZŲ,n;2 !!!_ ۄ^PP}$p GƎ1ںf.@&%#O_( noy!q57om~<]j"0 ZO^V((b nfX:܏6x?jX"33sJM_~e'[o矕Jorr 겲wyh4>s-on:Af'|rORJӲ"j zϏ8Bl+g}vtCcc\EQ]egh5~( ʙv=ۚʃFl-[׋x]:B絚niڵAEI 8W~رcEyxx;SWTT {>RLɻ_,kZo6'k魷ڳg0?ښGQԬYF[-[pk׮aXBTj'6JnؕW^R-[Ʋʕ+F_!v]Rnf +jgZQQQEn9M?EQcǎu`2~{=J55tāucK<<< mA&7]枻Ш=ttNnvIhp2˲5uFq;~ UPx) PyTh[ovZ^R$QC=tji,E*|gz!t 78!x=j0ZD搀FCӴbm,YCt{{{]]ݐm}B} lZ ! dSK\YPGeh$Ϡ6(ěZVjqaaͶn0̼y$ϥOnM69y`W]ySccDEV T%Ocs5}ش/0b!̼755iHgMmi~}78a{-E"IUlvˑ#{:yj5\MB G}4mۧN /8_%K3`0Xo㸀B駟ͣ>y_{Ω}mY/bR؎2C6d2B<==ىv=>>>==bXֳkHR9!h4DQǏݝ۷7>e -Zd0#Ӧ xOIN[XÌ1WV }}=i9#gy[bQގVVX1B_(|Vۿ!:Bj[0 Q5enMMI :Tdf,cgg3! 1c FS_JrvHpEUȇbYbd<^b$ٸqcXXqyyyGyzz: | _MlٲKQ /˲_~9$ =|*|{4I#̹`عs3EM6"N(Zvkt:(j6zP(AxiQOOttkĉ:Nj/̮EQ۹;7n[XO{:r}kW.GrlwWU0aWs;EQ((܈¢(yIP`)4C1:: my9ʲiB,fSgo)C&bQtuu;NzzLfC34 vŌJB8u4[ZBf b&SybBkm0BѨVk{/;:W^y,Yd݅Yn;zJ:OڄM6Ycǎ Qsst(..2Lj)==B(p5 pWO?͆ AHLL7ndu! b H \s( !IgULp`@n9UIclv\nnQ|x!Z BXP(X_ wo}abSRS&$gǧ*X{yfLJIEaJV={VPvQ**@Xhj U(X(#/B啕1'-u(J»'xyyAΝ*0_}(JAgMΜ&=zlc|7;?U䫊),,||뮻y9sx{{wN8ufb}7t4:$U|NFJF,};wnHHdr.,,E+&&^N$!I:/BO?m==Əa$BH(81cfrށme\KҧCOʸ&GkDdF IIN;$q#OOsS6aLq &BJQ*N;d?EŜL@gg=%hZ///BHCCNaQQQR#G8n=zT'juK/Yzu|||x/^`3"-tww;SvE[nq&ˬYT*3 u૯lkkL L8!}vn#dp+O]}y{{#B!JΙvJ--OQ4)Z=<|"}t_uͱҭWD'xP<*MOY_M<՗;ϹRrssql{E3g>3fXd X/_ܙ@vv(,oݻkkkey<[__/JE?OtB H''ac) W^-e^q f^/zWz{{DQt: 7?nGCa py?XLS25GF36ΦډSS&C)ĄJ(qpP( >A~`F!dz:\h9kiفr׆S;+V}N>z.̝;WJ#>}wmf՚sqg,{dɒ^_|Eg׿5,,l66n܈sIrԞTTTp'&Րߵx9sX,Juq Bg+%TUUuwwvǑSv9{cN8u&D;ݾۭǥFKlt"bQ2̈ _zCy5n5W|$HČ٢(H,'-u*HؘT''XRPhHlHp }7Z뢣pڰaq'0z"A^+))9|h|뭷/_4^~劊={̟?G~%#֌3Į * ݁0Σzˑ#޼yNmv9Uuuuee%!a'@h);;[߿?>>a & ^W*#ڹsnokki(*=}N ):".4=ǏgFV#nV J!ci'*z2x饗jht3fTUU={8^̙3;[\\KPrXQ80 jDNS2dȸKssOOuBGsst矻HR:>BKotVF(M(]+?K%eS.jjj.p #(Ukk렋 w=m0]olKL) "/N^숬Egeν=sa;a_cR(--u]ݻWpZ*_{'mjkkD*b߾}n".=>/Ç! q[o&R | ,) u:go߾//<#K.Y8#s\`@\DlE\9/nniV(Ѩ{z%Ǔ`py1o} T&RUVVJ6M fۛEպpB8q"<<ܵݷpޱ* PSSpBve'xbӦM4MO6ͅ"Z>q6l?~|BB z>SGf=ڷo…yCCWVVkkz{5jO ׻@yg(☘8_  /F h-?|No//֓8 jVW۱8={A}}?o zӌFcqqjMLLTn/{>|l6?"?y% tX!饗nAv)A6ol0̙|>_}͚5B;::~G233/ʕ+׿\r,;Z[[\2MMM]7**R:t:[]]]nnwbbUPPp­[O?s__V wHǭ[n<_[[Q)vBsi(QysٲwS'Y1#>Q*CgLNN Ѩ= BY,,K?\u:hɆLCbSRRz}TTFqAq|ĉa,&''9gTֶ677,..;22 ys>!ꪮniiqDr J% '$)6664P BppppppxxNlr2L>0555((hرNTZ#rH\عq}}}yyymmmGGpH=GDD3fmBV\\PQQqcjܸl_`ZGQ M 0-ֶk`ltzB.R __Is{zh4jbSrpnwjӦMih4>>h'؋,&}x$Bϣq^Bղ alO/pO a^XyvRj5H*iiljnmh8@͛w /׭NjRk5joc{k[}ss}[[cwmw?~JRfhk BB5h Lpy2N^vuGCOSNa4ސ2fCxxfnh8 <-e ̜^yaqRa^_}$ˎd' \4J"^%w`2 - y/˧J59?Ȑ=JQ4ƼܳvW/bEC\ 1:s pZ Sdkؤ䱓(ZAS{ymS{,犻=k_E)d~KRiVfE\ 6 N= C iJV.2d,MOuZ]z444*3>u:ݜ7!w8V1aDSY+6&~w܄iQ<E#DFKr\aOwoZ/64d\ ::MJIIf9jua1ҵ^""!CƈnãkUF&DO GN Ҹ!w y>>>7`Zn:y{g:S(nF SkP k'Jױqqf^,ȈSVVvҾ% m2d6 .Nk*BBhpZ7~chhChwMa휧M pum!!DF>E_XVC!eL_Vsydwcx4j~7B:_f4ŲN^idq D+Yt1mXW˪E;-B(4} 3^"i śQ3 xE $7Vw!zJ 3 ¡[@E(FjKS𰱢{QBA 4jݫ8E 2d\ۙdcGNCE#;E 2dȐq@/2dȐ!C Ȑ!C 2d&hY2dȐ!CBЅVpaȐ!C ,w==]72,-2}!C 2d8 QUNJw_yc:L_dȐ!C &888ݾb0|/$2}!C 2`Xq8&& c_6iNe"CS@!"D ]inlZ7>!!. 32}!CP$òc0B1.629%qB!$Y!Drsŕ~@EuJasr>/#Eт(8t+ӗ!DxA D!B)0%Ƣ J6cPuj`yޮP(!!D!Dɺ:U8TV~a¢BcO{ ҹZ"D֗0a("}\ZܭgƦ1> r 6&Ulf?@휭BTjbcR)r?{wB7~b[{^uGNmm5uG ^yq|z_(Ą3.ºSKgR]MN}}n1&R]˘ ~~! %X[W8&#%y zo&KiYlvlyOZh¢HӌFw f0RbB}Z^PHQ*QOH!EXJ`!fQ(AEAB(t10;m6i"<<~qYzto@Q3-(l6C\˻H@BTcHVB1av`@}&sߔ#kjL~_wCNΙz=8=0)S <υJM 3t33aL?Vm0u{y9~*B㥅qqi*VV%ή]{ 6''OLˀ)U*HtD_ BOc{HHHbۭ4CKuͱ@Z[fY&9)(VV(DʪӦ^g[VfŘw,-(I#TrMNiف8R:xx!@Vq};7lobBfdd/BdLVxM)"$Va4Lʘ&<ƣ 9;G B%kjܵ{}جUV9cŒԖI_B#B((bQtf /BTcc3fDBl]SSsÇaXE,HNQ(b`pAb:7!@7"!BL``Dssu\lsgOI ' jrhIO\YYMQIM;^/48VT"ɛifD hl:yn8e4B7Nϋzj_}WU 2YA3Z<83s7bwQ_֛K('9)oDBQc[cI6 ^f:=`VK~?GSzMMuO (J'CEf!VQS la HX)y]$zѱLJUЋ 냼{͘/>vBMFFnm)N1hv6jߨsj@(Tk&##\'VA$|tv"TKWI; ֆxbIm1!6djv3q8<䱣?$CuYEQҙï`+Zvab&q# b @ĪWJ'82ҧmz.N߻$\j>0޶opgbbΣcwH$g.`9~ /wiF:QQ슢X񶪪.411;:|r愮g%ITU HP1FIq0]y|1=nwڏv׉" Rg (E] 8`0.ҲkKu#4WxRVSt\P B(\l-2F16LlbWhteeABF(#sF׷ \*ikzNgB?!~[Tj<nk/mM}>cp<*ou} !͵`$%$ iGuu#{>{_Aސ,Aħ4%B޽qLLy(/˶d2뚪5MB4M3q˝1q-?m{B-ɑ7bIEVB1!* Ͷ'f==i 9$6ͻjhۻڹ z>$;ʲdBъGWlxtz|ŏ?(l.Z>U΂sF #,)!ؚWy^{vڟ߾{||@(KWaH%BCRp8/{#:;+8.ߩlNO))_?XlP[l:Ƹ, k3 # T~hDj&z7)/57g-`@e%!=a \F5ԷL8ѱ;c+?$*+a3E)1麾8oa%k-0fcQԌ1bqEURejJ:BS쬻5<`&`>WZb-jo;e [v;yTTx~%uu%Q.`9:^:eIsm)Bp8\g;ɂ<τʭ(00dYv.WAcŤJle+ KPfyy cH)1fj X?1r:|0GB(47̎j'}_euIi5[+BY^\^1nwm)r~HdduaBs9X8PsNj'"V\\=~wY?BBo~9n(ȷGz'k !b `(1Դ܊׶-1| +,;n+w, C-U0Pm](tߐ,l |޲8o4. [z^eozȰ2ޏKDs8K7LdȗGRtzLj(J; B_u]><Uo/,n5hwmqIOYVB`8o!v[,v/Е_vփvѕJ:=c9oMf*B?߭pVA=ʈ-4^ !\/nJ鮎CZvݝ !**tGɤcm/m.mӲb̃N8Γ!l榎qU}R\{!z\p8q BA\|iԇ b/4sp8z.҉|>e7Ipp8N!Ia藺?{?ip8Ņܹ}/}I|>6qp8NɁw=p8/p8\p8pp8g}¢a!O=[dz_9"eyʌMaƭ+G.74x|jVniӞX!O$4_\gfntg7JP!fNϮkRX-*R4?/_ҩ4M*_BȄuE)uM6(bB\.]GSCg`F"1?dd3D0MBX*}Ϻt6 lR дT*+T*=/_sLZsvGwOό a461=5飳NssZUtfκ岺p8?+*F:JDg'KիiBh&, cuL&ÕAJKu.Ɔ%rE-4Ks( bo!aj`ey)Yu3H6{gΜZ?vMMb9BNGc(ɾoL(S~AseRwD\fl,R(JHU! ~o_ggg$

    p؛`%ɢBc[{{=0gLg>^tvPv7|,{QVVΊ&_B$u>h:xaۃ?YIVP㩪ڢ5/lAbsGź20Pf'&FRd29L.{hjlmmm/V ;3o_ƒ4Q=Dj4\!PM$ouӮ> g@HyױXYSSA\:`b'M  $ S{JAEiMӛJ?(ݜIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/starting/starting.html000066400000000000000000000071131475757676000244100ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/sub/000077500000000000000000000000001475757676000206235ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/sub/images/000077500000000000000000000000001475757676000220705ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/sub/images/sub.png000066400000000000000000003513341475757676000234000ustar00rootroot00000000000000PNG  IHDRpolsBIT|d IDATxwxTE[M%"E MR{yWA_ ao(bAT@DP^B !P{6f&n;w̙398;;@  !Or@ @ڥ輯 *hI9J$@ =:JYUh8@ @ V*@ 6D eF{7#_2xۙ|}Vnjr1% Y3`ݷ }Nӧ uo%CsI8FN^1vָ:!#ٻCҵT֒x1gwB}{/V`}faRG[tg(xG}Xv7HLBea~0{gX&oI{^Ɣ֔zb{sЦ.uH ܬh:@XVA+cxtz^u7*B}{{kӷ$nk`)qyT|p,,.l2unVږݚr4i,[7v4ߚ!t:]0"{eDya"lߢ6V/ juM3Kz7 mozOA ˪FXVA>Ћqwa#WTp|n<|nr9߉Ny?Bg2h uϰ\-6.V~o?8.]hgsEdϒkM9,It<-*IGbԐO^Dӳ2 KZZh}ԇŠwS73eaӰ=fi*>Bh)ש M^znjغM VT_K.@Pc#HFv!c3l$jø3aT?|\h4K?w2E8(mw',1+Y|f7 lps'4G& 0\>|DB.<5upwە8O^^i}weؾ47$'O6ЀVҭĤ yc#:GF6XW Wp=H$tÈf LT~ic罿)[ v +,* ZCxbP\,c;cq>?A^|x{RqPӧOכu ز1IdR7Vrc: c#ԢВ*vy/HIϥDѸd6FrF>E%hu:\`[pu0u܉l>IL\N+G}(yl`r XV-mLhw,/S g5ꍇ8u2%e8(mȴzx]M-ϦuP_fS0YE[zV#,ըjp!~,w=s׋*@oD&x_xo韔UT΅IwEp$6o@:/(R9=BxõWM]II%%=#zh^5 ;x3h:=1V\VF1 {P^QɗKLeo9cxu|L[ZUKNot,twbj6%yg5zE /cMuZcPLl0]ΐWJ.H{ugCqz}Yd%uog"\I\я/m =3E5E hct [:3FEU"ET+h:$=cs4/ۊVc;>R5E*JAict&$x1z]JƜLjW5Smx}ֽH>v/e|9{O3"Erx9лK1Yf;k17<2 n̽h:fʰ?wxrm9Y,i -Z%e*dݖc+V2)="w{B0UWݘú>eVci{}/=O'jpM݃5zPXR %;2Pmq5ymJ B݀M7 2g19',ړRC_k猳E*&eDzql U:9Ι 5ӿ[ aAyл?NJ Kt4^WX]_N jkF.PIs`ʣom>ZJv $W8lcjqsAʱK ۞]Pm2_x* k5CX,@3r.dT!IlM,yT+,I.\mߛG_UVa킳 }G_}^vX}ԇ^DL*RQXE[8H$v1cxu).NvD̩dzPP\ơd3mt KAFPoሣ E%_l]8IrZNiAKco=`[VW kלtL隈T hHYӭp|r7:~kT*aڽ}uTjl>\.NAqiq5 n7 30su¬3ɷ}Og2^ϥ<.y[G|=ȮÆT] Z[QWָI.(.cއLƉ%rH!ڳ8cXT8?vNdRZa>jQX-J%iɨ$>rR K)n>#'55 GXHҰ=\W\Z7ІkȠiypL?>_V'ˣB.R\j3ܯhSAFP봌ލFgqsV[P\R[+ @ hi̔U݀1 R_:)AԳO[cw1lٓlJXȁUh %˹RTR\=үC= K0M@\uk6oу iM$PEQI9ROWzwgDdG4Bݘ>/[!wg%#E\쎹3itz0idOPNKfPP6GDYKp-^cm.CxlٛlJˑ*rC'xm8ύȞtzM PT*ၻp*1gj!-M.qvv_ٷ_" FzV!o/݉^gҨ zED,[w x;4@  2|>eUK@ $'ΤqWu@ d]Rzl 'Ba@ (-t Drg^|rPX@ -FYVOHh Dpp0Ǐb… k+++<==2d3f@"غu+QQQ̟?$ /&,, m۶ɛoY+oL 0cgg+X|9|dff2ey&O eXj,]Ԙǰax饗,wє[waaa,Y<ybcc,.5jYhQqh׮w}7{Ei={իWGQQDDD0auV+=q0o<nq92Vzj;Fnn.J`ƌCdd$?FvrrˋLILLd|'ѽ{w0YÃ'N?yQY=y$oǎ)LYYh ]! +b t\yy &NJdž @jAsprrxT+;rE>3<<<0`@ڳg ,@DΝIMM ĉ#Ʀxє䄭-l۶'JO"p)KTTTyh)ؽ{7o6,YW_}p 9JyEV >>e}}Z9`FE@P*5p^z%*++Q(̛7L֬2bʪPV[ s-+Cb 3]ovlF=66 ݾxO*O3xw@I~>i TyEx2gMy/< sVR2윜pr Ʀtutjjsvffr%1+ڱG/ݽV<BBDlelEyHKK3^b2\xD0VVSSS9uT-ۛѣGn:~wd޽QY"##1cн{wVXAll,%%%auPWPXXh| nqUMHH1qqZHy=g WHLt=ff_ oooBBB8~8*#G0f̘Zrrr21np q^no++fM?Z5ٙ#Gzj{_ 'H9~=݇ Ljǂ;Q*ٽr%rY+]n|Jȹ|RBҷ݆ oh5g3S hbTV\FÍݻ5SR\\́={ضmFWuk׮5Z[[ΩSkzaqW 4|us3R&'+IO7X<寿 ֱ#Ӎ*\'/Ϛ\r}%5Uݸ!u>hXe@+WåKC66Z~ذ:]?~"1Ѱ6"#hy"""x7JXEa_((_QQիpuu5*$&&SN3uϵꈈ l~3ELj뚻 kFrl{.]iF^ͣ8/;x⼼z8y36o6 :cF54 ҨՔajWZP@[MH3&FՒ\Pٳb%fPQQAttt_GNzzzySOetyᩧ21]ZTTDPP2ѽ{wӒMW pt4(IIJ qvVSR"gBO<Š5|LjNеZ 2޸R``)r^םt[OHlfנRdg+9"9'ǠH?9ڷjұcQkU0 Yr%#GxQRɻヒB`ټ[:uSHJJ d2̙cpv={n222>}:^^^9s0|36w]7VrΝ˫JZZ3g$44TJrr2]tx%jou!=z J "+9CRV?{W&a^ "ﻏ_}UoNaPEo'-j`֨0߲:\]j]kz)܀TY帹ѷo_fΜ 檏Vݻw筷2{_g߾}lڴNeU.裏oԛwaa|0"##7n\0{ǍMëG 4sk+w3|xkRy[ ,!)ɞb+Kyt\HZ˗R'L1af-ޑ޽s(2Zf*p{ *VOrӳqWǎ4mFBs:ѿ5ah YnSN5ޫnt=d͚5^֖O>у ?sypuuzBg5 66ZbbX25 zUSt26ۛU'3X:`8&fݻu/)͒)qF9sc@ڈY~$vNʊ _]ã.yz={ؖ-Dw_gG?<njwR[G ?;w;cMi×.] SӧAIkciuy@psc8:Xq̞}ٳֺYW_Ӊ}x㏉Μ('77"u**p Ǧ ZZ^@ X4:e# ,h%i9fͲGGGa'hd2c&F(m'MzsVj0q/ȸsSLS5t >ExY*Cs &imZV+8fʕ)@ eU MIVVt#]C~'I nT9u879}- @ aY|3:,J= a3gۯd@ h)^7QlILL$DEaWgk\G{#h8<$gd+QPVV*ܹ33T(..&--LT*eeebgg888\gI & <{{uy9Uoǎx^o@>|xjy뭷HKKۛS2|p~xsh)lٲ[rM})o^jpd\D/afȑ6r̈́Ny`,|ڣp:R\\Lzz:ёÇӷo_R(M^^N"3)..&33X֭...X p%.)@Gey9V66(plPtwmMnf+W䫳o.׵$26J%LEH;{֨YkR==︃QO?m< [I=}H?o!={PÚ H>y L'TQz2eT))AV kggl۵CU Hk*>,9NNN=h~m\²eZ-t:6lRRҠ.fe"vSӁ2D%5%kg#sMʟ8k 0(٩)**_<8;;_km^9Eeff}vڷoOϞ=<=fPV:)Gr6:$)(iOEpt6He(S=M BǡC IL*VaGo&e`wۓqml_{Eӫ[YS:#ZgϠV۶̬nnYJsaJ̕ʐ~bP @f^>{r9fAIDpo)-|˴iS%j._̒?qj{y^CK>]>ҏov9#;^ ==E1sLsiZkm&  ?GGÑEE|5z+]L* n4 IDiOM |5q4v׸SlæSc*NFכHt:.N*olez8;~{ގʿz&~Xg?דs9.H=7Nl݊Me%^~ߎ{aĭ&p3ecr2hϧ8/JǙm66X0GYSYz2Y.(@++.>9#vz/v;>v HE\Gk[U:dL0H`E9x`*ZWZ-?]#;>޷L<;T*~+\_ yZPP߷r򑅨=Qd2/̻w~ff Q:>a.9c DCs+VTkPx?^#GrOPCe8{KK@]V{ 0TRWW}w 4 ! ]pdTP(+0^VFne;VJΞ(= ONƐ8D&ڊ*j Q緺 qFvNv}HtZ_Lz UʩKQ*U0e$_N5ssd3iq#{u.Yˡv*~X^/aXEaIdf^ӳ68*ŗ^ekizJKKY|9 {i6]:|0z;L(>݇RCJFJ RĄ8V|wːw*@V(ɎwKV/? .G׹tkM^^Uw}illl4A~q9ys jScLKՊb9\z5ro1|sۃt3;ه*ur*`օ3R&̥8/SS T3-[SU6Sq1aVmGcR{NI~5JR6K0CN;vL؏o `]ULkm!5%\.. :͋eeez|Hrhzp#{w/gSOMzV[^NPYTD`\SIۏ>)|nl8لx!a;ݏCPxzz?)A U Tگ_?r9ȁ$I+'oٲ/D߮,yp,J{{/A* I f݅YӓSN!N1xyTT߼y36$-[n$|8@pњ '=K,'dFrڴig(w}ZY/%e II%HR$  HG^ڱ= Ww>+OvvvsXyD=,,Yf2œ?KRxFMjFz=U$E* J% h%:4@a;kwN6]*,,… t4h~gRRRP*DFF裏]7uƒ%K/̮ɓy7 kvu+4gʕ-g[j:W7&;DD"B^NiOn=9q0̤9111ѥߍسgO;uꄗEiZB[ܤ$R.h5t!"][K( u%moL {k=p۰ӗß=NSSm)^FYC)SY.M{.h+-V6$qWM~ɪ7Y,XS^'0deŴ_,:J[N5/7)آEvvsӹmtH&$YښbbN>|XR\&C& Ma V2:YSEph.O4_SYݸq#| gϦ_~_ /h"ʢo߾gj^5t:]&u^}U&L?ޤeee|ٳr:uO'`wt$HtZR-#{(:0cǎxzzT*eҩS'^f+߳[%gh$:->NgֳFwҲ 2r(P#AB?ʁ"U9YE(psCa-Ύy{.ϟ̜ {#{թSmhrG[l0{?7z,$=tXFwo唗prvmv,swz˗)HHշ=AMpqȪ6DjN۱V0~lۼs61xSN~|<!!\  \.g̟?;11(JJt2dR 20qHH%HkV VKp{RJ2a$71hРZyK$d2ql޼x/???'N`ccøq_!w„ ?={PRRBΝ3gߥKHIIk׮wSdR|Wm~#5ʥR2)TQcee\.5(A멬УjaTV/_lZo'n@T2|MƶmۈÜ 64ySW\??F\&C.;<*m;%3^!PBtD@D@eIJX?ѵovWQ] +"HQDj @ ̤g3H&vOs{==R*P׻?wgrֶXp=w$""chB0VO ^~+N?D,.#8YXJyeb,.Zj'pһHNСm8u̸BiW fގ'vNn?َ2lPiǩǐWXZ@t8Zz/ZT$Q_s)5*au1%kfo1^4e?kԆ\zt\D1 >vU=xC5H<˦M_0l(v"W?AptxE3#_3l6yϟϳ>$33jصkWFӧO{Gw52Gtŕp:# μ;*^Yz}DF]%6$ ޤkvvG{=n[PYY h$22;bLLLut.nLS s[=zR*8R4~jƌJD$@)∢nyQb>"dn}]N:ѣYtiY7k%==g%ln, uLPPPd;Xt)VwyI^s53k٭~ &c)Q1hI[%%%^o+VFXm'] Íժӧ)=~jm&U /ukU֜ <2t7 K,IrlDĈQcf:}ʈQCш_IF$?L6ƮmK>id;]\9=d:=MQ!Wv/*K!^-ƝI`\\Ld  UB Z5sƾ_wSm*CH\2^]utfoo*bcc;4hжx 6m6yzRSS=I$ZyYhO<iii-|1J⩧h42nܸ TVV2o<\7=;g4y7طoNc4/6їЯ3:+ r9 !b;\5!g>kvWI(3p&Mĭb9Z-TT7Y-b &c)a̛+<]MbNר^pgcZlX,M^w4n> Dy$B|ô.|%+6Uz:B݉  ݱ& gf$]O9j ?m))}9{eF'qj߿#)9; 11_ 6lO?ͪU{ ̛o$Ip88x F+fǎM.Uw/P({=_d۷!I=}>@Vsȑ뫮'xtV^MYY˗/'>>됶Ɲ 吠@ŹXz  ׸Y̡{P@}4/Igpp*/Lp%$=Y-//'11>};ŋh4a6=."-- Föm7nܹsIOb&qD(( Ju&kֺU {)RS]n'';S~||55 y뭷j9oApp0]vYmͥ~tT*ϫߐ}t/v[U\}4iyϝ;A(--d2JV:$''{Ֆ+Wc ˽2zX-8u ϝlfO)3 `1}M:edi=`@Rq)⨨A9h4F}SxstZr(N?ABСԵ̈jb:JE.V.s],$OIZy}m|.ΧsCJEE+\3u3c@3XjN OɓߟGr)FANNyyy:tF/̶p-X;vϏ+V'ꫯRTTù{ ''|VXڽnuFFFgb_y E9_2MFXzsx*++Qk( 89DY$,V+5Ukk?۠xxPTr{~z믿NBB7pC( z)^~e>SBCC8qbkFMF'I"Ep:[WeUyf]%N'5TUUPR\LaI1?1{lz=}?gՇ~p>f3+WZYp! W ._gŊz̘1}\g߯*_|Ei%yf~bccٷozYfXo֓8q"͞|*555(TjDQnyݿ)/3UsgZ(3zꈎn,`0>|8 NVV5 -nVbP* q8"U3Gg /v[O=5U(IHxA b*jbdKER(О>IdP@e=~+( .l&͜Pp( +zƺCu% IB@\%IhW=dk"ֲ2`U& [\Ӽtj,eh ! ؚS8WUxx87n> BhlRؖxAo>6[6ztYK/K/z猹?~Ǎ8>jԨG=܃Ve֭1p@nfc41  -2Vj[j  ZgEotcB45prvUZZ:_HJJkRI-g!A(~fښjOzGEEye|w5:iqX8] ֘ p"J"H]A GQ73Op 3=nDTp:;lZw }&D/حǎfP(>s6^R)f \6opX8\4ƂVpe0hVQe ݎR1 ^ 3^Nbiu-@;Ns[Ԡhs}\رcE-oIՠAx7 !""^?lrF%ev |MPTT7|%\BTT%%%]3L\\o7|3*#Gb}5;'sa>}:{׾ΑEya>Nq'&&nޔ^1J] ߟ"z!F# >Ukh"$Ibرddd"}5;'sagZŝ௯5 o$84ښjj?4-*XTWWQUUᤢĦucƌiP(k1!!8~, Nee9rv"Ӊ(JJy7|e?z`u 5Eϝ\a5Y755gztBƪJAYZ@ڡh2E"Sx܁n͕$@Q>{t;JTV6\dYT ZW̎kl|OR6oPi4]qZӺk]^ޠPq\ JuvU ϚUKKlG\5Y͵n58GZOxn3Xdo_[Y7x1c+ݐiCyp|&O_8_̅c֬Ys[({ƢT(wůuf8Ox$*sUWjcY?$J&0$?? s-eFN8Nq 7tSK 2 Nv-cT]UK|{st:()8IIIzᑑy3nCCє܅!KK\Bpg-y3Nu-J(% QplnwG1@^S-[m|Z Mc *C>8#^`3ŬY!fW:4b?ȥ'Y^cUFFdrssNG^`L<Dff&o6u(:%KvZo t:dnyϯxϚ5usw?iӦF"(()S0bĈnĉٻw%\ <+L%TŸʐ!Cz XHI!ПȤ@*N`Ll$"HX70w 瞅c !yF%w6ٌbA%2%d;LMt*^md5=@uP*z]t4GRSvCh4Aѽ8MƐ^`гp|?(-9gk>bּ!(ԍtVR\@pLoAA@ʕ+۵|ϪUL![]s]WoRIDD'N$66KE߾})++^c޽hZ͛UW]Ŋ+0L<裨jnFNʴi= t:nɵ5\UW]֭[&==ҕ\u ٳg3|p6lo֢Ҹ˻Uj > IDATs( F!33>ロ;v ȑ#Xpe&O$IK)--СCdggS^^NE+CPP1`4T*}o߾.NHH&Ll6.Ӝ7V }̸AklFEEDD :ƺATnx^ fw`4AE2z>gz fNŀ1B-d:=8v|AR1rz?B6EEQELG k7YگU:7ψIhӅyj 񈢃ҼEG1t[¨رc+P(bΜ9lٲMyJ0Vu|WL#SvRG[jDp{<"$t( $IjsPkQkQTTDii Ӊ`ϩit'86CUuoR6t*r 0R*!{д.[/x_(83!1IE$Pћlb̤>љؑĥf k7PJ&P{PPP@FF'diZvwee%:EuGFF>tdBuO_ w췩lGX6N'JMTUb0[lZTZ6cSE5EdtqKaF_^ d8Md:=ˈǓ?.f1cp,gfM`Ϯm֙$/0BM\ Zޡ8l"njNpȴIp:?O0aHNN&::wyٌ(8q#GJHIIacǎddddd)fV'u+Q:f.u̝Nhw^VPiPըU*$\4j ;[b _4iĤNDT;ח*eQWP1p<{ g%5(w5'+{AOffAD$q.j/_ ^w+COYFFFFѩUM@S06o2㖍e#zAhuz@\[CuUe3l KJbwugټAփ(Zg_c))iܣa~4ZTj ۰Y-Ys$~tZm;Iqn-[&eZŮ])[]殫,L; .cfghI5-g:iîfۺl { ;vPy6k@2 0j(?ejt{9zgݗYlGe˖upkd~ Zh|tXEH>LEaa aĵvD;Y6o=RIԸqC?b++kSy~!!Dɔ 5<]AMw=꣏>ꃖt>|+ӳLuDnj' _;Jrr\ IA 2%K.!aذNK}l {ccIjAEE^&d@:=Dg222=76PnpߔXW#H1LNggSYTDшb@բ #0:Tb @??Y6o >}{U5Na.,V^f@`/$]t4C7^FFFFFF3ur|LKч2~<)wtS|Nwd=x: ߿cXl_μ/2 ޓ)t9cUFFF30j(hF6d.=fz[bXׯHKKk9)SFFFF;:Wp /0`@G7 2\*7nD?r$Ḟ ;}Va1cPg3,grD_!{mW^o%>>4v1#,sZSf{!/_#-I%g2Dpj}$?[_蠥2|E{x֮\I~V $fy'Æ靆ϧ1D-8,8F_ViJ6mšNע+_F5i^h5/"[W\[wO|5[\\\͛_~0>ڵkY`\r%^ ˴7=&:+X\vm n.~2:l6޻&-^ͯtrn6}:|>xaֿ:ݬC\YjIQ^`XSʝ`/![:|<Ņ@^*sӔaU/ cǎ!I~~=ڪszuɲedCBFFSk.X8ir_ 4WVmw#a¸2uj碋x p>e4:/] Ӧ1[aj*KJ=o.dcqaRF`/~*^|_~A2kpaؚLTT0aBT~~;1+iӘhsUI3<~7vPO${-RIxb"CMw᭷ؽv-sxf+ IYQ28gi)pĚz= h쬪_P!hȼ?Jͮ]Pc:M&jbAСk'^ @{=jdj9)=5jUUU(#{L#hWcU0xTv[1nDdĦ!"w.%+VpA޽n"|KM :N8?Lh\oy'>^$I=h[G_︃DS[[Whl,A~I. Ջ%lI'൛ofƍ >SW_c TPR9—پD_CW_hsQ(P0Q0Q!j5B'ю]$'4{aan|!U۶a/>,###>`q/VVӚ2ÌfKd3 㼌5}6aZؽv-#g *Fr J>C2dT|u|胃 СALj*]z)YYfgSePø}6\֥C^|ǧNe(/.nq,@RTH5#GP(- qø#ϋ/i<>e 3]F@h( EPrsP0RJ%%%ԸsPc=~nGP { 8.g#Z,DKw-S҆Jd6Y$::ړ'66}Ç9͖)####v.爙3ٽv-%]|1n*JJNZVP,Nf@̧g`O?m-KF_9s쥗|REgsԔSOn_[ Qz$;ĤH@p`E֍Rjj4BZ-{jEQջPeddd:sZ[RTT h9)SFl24I%t.(xo]|V_= ڥΈT ƒ"P,99tURuL bM b9SFS,]####s}q_s}^}UinLWbԨQT0lt.KA(&}vB2e aa\#ר9'O=?'$:^&BPp/_ssۉիZp.[[FﺋRI5fl)=u Ç3o6k| 2^^Xb҈a@0&Sw_UXǛN /޽XEjQ68DKOǯWCFFFCظqcG7]<2] vLD>|:]9M8jԨsȫ IJJdǓYcvug>+Wj*+hIR0;"2maʕ^#2bʕ缟>nfU6XoLFF砓}N/LڵG){VZM!ugƪVUddddڋS䔑XjE~edddddddd|OUyvEFgX: 222222222 dddl6z%))y/###)/+٩SiU=222]6|t1|t|2 :EtQټGǏoչ!>mLgCQQ#+22=26=JRRIIIhLea|XN$#)//oeee[e˖b߾V'##5hK6_ٴXd NW^L<+B ,駟&--M ƌ3ιbʔ)EOBbbb|QLZ,t>챫Vju=222] KU_x,_ɓ'c2-#X>jOYh-kr%e`~F?WzjtMg((n 4OR%0˗{Pu'4Lh rʿ$iP4M=͕ٙ͛7SY/a{[Xۖr"S~!R$""'ҥKʢo߾kw^Z-㪫bŊL&}Qj57x#SNeڴi|DŽo馛kꪫغu+դsT*Y5R<֬YCff&O>gkB`ҥ\s5\yڵZ222;QT^񉱪6#I/_s EEѻw+hj$t:jy)b/w̘6եr?JˋsRYRh1mj_k61Ɔ^{8>--S7`VmM .$U&5o!cZtNRC*>LdlX,ըBCed/X;,XKHߝh˼?Q0i\jCaXT!!Hw:lY^~(mj#`$AAm*5}6xkm.;㔦ms9+tF}yP}Hg?RSSOի)++cswcǎV9r+Vp=e&O$IoSL N'}=L^yq>-Z6!!>P1T~-3կji,lS|ԨTV%} `{r}a6UvpHo݋L{S|LKA5,y%]*cU{]3IwW@Ézr*<^{q1Áaܸ V2, qLmu;++ʳMlhGFa0ZP#۝RNrvZL"x񱩻"!3aaaTUUq1rssyWP(DEE1gl&m޼yaf>/44A?0c ~gsΝ;7|ḘA~: }%?+=6pҥ#aeڒ%ǚghdȴi\Þى"DQdֲeWT2hd-_,:y|z޺vN8{ ;dUW%֭t|l]7Lo^f&zYNwhvJrn;#9<@xBy5u7T^O_|Ayq1'MbcTX^ExyXn9u؟\]/0;f3PS pF0?P&Xt]^ǖG=8ϸ(3N fsͼKOGa0ggub;qlF!Aڽ{QEF"h4 3>ŚDAYY2 gUN UdXU IDAT5uz*-[ͮ]h @[ϻQZߐ,Fr m߾7ޜnjn@4+'ѥII9og3n]_i31h֣G:lƒl,+v߾϶-7/TCAf!(zTt4[OK3b!Z(>Kv6th_:`[%!MYH`` vnf>NJK``oFCee%O6m_}3f`ӦML:z?!!!Fj'ao})+,د|֚|8};_/hHnaw 4E{a!&ݑbB"r3a>xut4B$ToߎX]:.Fq?H Tz~[Bsԟo=~g"ٟ㬮Fh4錁vgV,/GFXl6T<՗܇ H餬̓ x„ !IѼ;,^FC^^f~B~~~ڔv̙3)((`ǎ̙3EmINN>o}DŽ xgׯ YA!}}ن": 2._֯gߦM{X\_W{߿?g(ϵ٪ժwVe[n16R@wRH('@ !$H8'-]6.ظY޵ަ|jW%aX3}I{w+ EC9U7>EE䖖ШJ^wÃFn(&!hA{E|B\FGu Mhe!?{ h\4ogeC^QPPHJJg*!K@lLծǚ.uxam2eqS=|(m&@CW6<s1ڊkf<mL&C nac2lHpjl"u݌U}F Պ`4OO'X_UrNIm]uTOd8liuu!^_܁(dTX :X8FN3/jѓb"bmȃtE#!3BA7ϞD\}O裦(p`睘 !U#'3V貶N4NB%%֕t;|@m-q2:d/K~_bX?~[ǣL'w<=>YW6nQiH@ $II֥ik_UQnVǏ#ZXAqm JmIa o6eA1R 7뜌g z9ѣjkQ^07fKBjl>W9QB:9j{((oPbq  " zC/Ə/&;{h^ADEP.)3cLHvk DejQ{5D0"[IYӉ*˝ 2;r@(Kṟ:d ?cO~{K,aIR?|J_QN=dsޜ9s+{`8)?D1'&Rjx8|[1`o:mhZN/uUdSRBc$Rsg&/\5-j^zAذ!)9~R{e)$hYc~\9t33 fzaŸxMM Fyyj[yyZ/zwO͡D[cu͜{S{l*Ȍ0L,Nsl,[\g @s[ CTWA̙Á^=賳NUUɨ>&,gw^/MF]3&D1RsQ+ou5'Պrܰ}F˅T+[HHM C~~:uS?**˗/K/z+²bH+w֮-C]t|3Ȳ̂5kXo+n'=t([b^~ANKܹ^{/9cB_՟}Ą9s{Excf?O>I]۰ &̞g7UOZ1K"aLNRB{pn45rېkVhh &f4vi=]kBghFXd:^Ke>.ZZZHbŊ(SEFX#Av'NĄ "Kdffv|]]sׯ}YϟOMM wu7nxbqJKKȲc=SO=EMM _~91 q$K/~c>yINNfڴi+dsʕ+{|?GdͰ'ְZ훆|3V#A3,=?y6D2ۇ^ӌ8c}t?{9kb UI&( 3gfٲe|>V\Ç4i7t>^yy9^{-wc:t9o~:z)}YVX77̚5k())a[z3fpmʺup:6V?Ó#1enQ8|}> f3Rɞ4ܲ2QSZgSn ɧ͙қ$Cĉ䔕ZPpJe<|8Yr7/ooSWݎrjnEՊ1%\,|ӍX{X=o*I64kk#`( h2aLIAB~>S:ƹF~Ir_|z 4.{ \o͛ ٻw/dggk׮ y7)//gƌwwyW^y[o5r\r%H?7O~7 .Kobb"'O/C] ֑1V|z@ T|zD3|9ee7Qi6aoh8qۍ;Hg%.Yd-'dIFNFJDsww9r$.8N[( Ç8|@TڒddNB Y w:p@I&Q]];#ڇϘ1#&Rj08q'+++z1Ϙ1W+__җ())>`ĉHpJv2m/fP$ݻݽb^{-] UQ8~=z=s-f^r =A]em&d{R ^qqZ@U:m.dHƸIdsR{S54)mv1w.ӦWI˛@ZDS0=~.ur`+(f5'^PJj^ Y(ā /z|R$eȸb؛O)8N=$[qVVJ G\ZJ֢E-=ķ+Ĵl'5sb 6RuprѸf`F[qԞRq><(b61͜XV:::`ڴiSRR:pnw!$ISN'lnnnPȨN@Q:W p8ػw/<o< ?,0Tr0ȮW^0 "n;q}I˖1 ? [MͰ/v8e K֮%EW;Ey74,jSK511şUdI>} K6?#gsphK\qI::_k+i,N׹FUU봡*2Ę`dIBoLЌļ ΢0i޲{y9睇1 : .W%d)שE͉)Mf`E@ەhfԅdO,|>Hsw"2 ˴N6d)'ѐq 6m:idr0sUWd ɡ(ÉhzS;h)9E'!3^Q9Fkv!St*{;ZN)8F$Gbj*.]Jzz:[n$:,N',Y>3INN/&''2>̜9sXlG??Xz5:t/̘1:}]z~?~<۷ofݺu|[ߢ}dddP[9ZFpFXu'騫*G7lew܁eR/ePHG8VS;=_:f g2eRspL= !Vw^ C~)ٸ&6{iqLYcmai{;sغ6\UU4["IdOl~ [i; ٜϧmL)[5= ,JmT /`iL]5aZWw1omv}snpGS5>.0fO'?jMmMco8hSlyh$)99ϋ Ћq4[ŋђDќL}w.7`Nt$ej}%E:pۚ1ddfQ2-'x"5,׌SyTVVRNII c˖-v222Xf {/|>nv>v؁j /Тw}7ׯg|,K位7\b޴ IDAT9H7?1bΝl߾ .qa4y#Mo ܆j:Xxziypyddf頭vlg;vr9{<KV|$ mgPg@ffϙE1 320MQ }{}V>>_w/o 7Zƶ98q(& : #gDMƷ}w3JiZ~gqQƒ_XN{<~u5^tPh 4n؀()lxpS{p+ɜujK&I$ 㕔>LgOHlY(B's;aJzGK-uw=e|+{)yդhZ{s5G>z՘3q*Rs[j;,^uǩG ػԂ!&R6m:Sʦ{GGf0C=a㛜597>L)17 3P{p+Շ()%+.8F=o^?_PP_+**uo&ussǼ6o<8qz̙3裏}wݯg1jƪfPƛnas#y0bJTYxz{OzUw5_='5F?o4#7/W_[oN ATO~ĸ3h_| @O(~%'pwJuB 1sn{_8PNo(1^hXŗ`MC%NހbsIHNHדNZz:slqLs)مL92n} !Lߤtd)@ޏq H`̱ o gI /Ēqe<2O&}p6W9qzS{IYya>%5 `bjw9VyqrDE7-o%sV "ζzBV1755 sW""jNHQx4WGK-'vopܘG }f۶m(2lQ1V`]^+|5_n 2Ӊ:Ֆ(rι+X|^?y6Tc'Yu]t45/A-O6~r/]rL (4A^CUU,V+75./(?|8U>}).WF˸a"jˏ_#~DWSsp-BO{2TǢfn^ֆt71''Gތ̜9l_T::hX1T>GANf:t|vLf3睿9W_Rҙ"l~u(+F .t~G6F0R뭪ەEAJOsNZtQ72%]]_[A#RG)1gd`'0ޥxpTT`ۿzK/3̍y=pygAj1aPT\f;oܥܶw/AE|QJAi>DO0פ|&;h:ƣ;tckrָR}C[^xpUUmnFzBRz}BlEE$t_E|p)Yl(x\GX+z'%'{YgyMl7N/~TH0ZL$Wȥ]A WrƦjjWw* '$s #*+_ͷ@QU;\]>| d b"ŚJZF b??P_Dŷ!( %GU_y5;$wXt{_J3gˮ8evI\wͼψZ2gߥᣏ(~?NĔ,G6Όӆ}{b۝* ܔoyӧ9]Z3:3 ߓ!`ӾgΊ PP[}>|t:דTZJƙgbH=!4}I[7" FJ3SEhГdj1(*S$%%"^'M6aC?akZucs׿9FZ0w% Ru[>n1`P2[k3渞 $a;x={H.$;kfk Hޏt@=-f"mڴS:v,`…477Yf#uEss3۶m2_ZG.HII6dUU): ϻq:1*߸ =rjjh*.qvV; .QX`PC!=9AY{'| bEeȧKwPĈԭ_ =qW<qOp67ً/RW^AkiQ|ٱ W*vu|(=yӧ3kI4/:JvtRr>ly3fpU_7KP7.Ӗ]MJv!Yi9qہoɤ 埾Ɍķ`0@fN~/|Us}_kFs*FjN1r1T\qp֤SC[ɷb{_=QAG{ g/B,g#F%tZh>= HÇq6ks"PG,n CDM _ (Bͮc"TUEd۝"dq_/>lF?aEsGo0co|s|\ Do4hVeTĵ~Ƽ#95}T.Zިɵ~7)9IFet1ndP2s; D><Znc~/&+_,\TSP 7V?{niz=?ɽ#*(T7DABFTM*`wpd$' Y9vxǦ*^yUw'_goLΠ0ffAw|EklfwW'_AsRFEUAQTZ:XF,E[A]]-*b>oW]9]S_=ӰyUǤ'ol1+hzp7v[&O#)9mDvE]f.%cd‹ubo"u#cz(ލϏGY{fq.+(_6TUE'^3RSPUU3Vd6'I& HVVXމٳ1$$7-qHAU7oKC vmed*0bR#}|=k.Oٶ4b\_CZzqM.$)Vm L2}AWAǾy6P*n;zDه(=\s9oހ9;`8"q,FtyCWUu{o3gu?NE(F[ub:YVh %$Ya\~5ݮzM]{B'xhYz %K!>s_$-Ѹt.k|uGeA`m߉wش2vNs|EGFEƅAqLYs8Fiʸ+*7of~GQb=ħSxsy磧s/oۜ9{N7/O8ba?t% g,tz#:U\sݗ#MÆsw87Wɛ4ޏ]<ވ2(. ϋ%1'_._ќsKD7bot_,U9&J@7hZ; CFqFJkaȴs"cE0?y`n,5s斯ˮ`Jn: Fkkm/l{v{mb$Μ9 A6P5 (~"t8,S:q]*7wLo<'q::٦Q7iNF6)Y5fJq^rQᇸ+N0uC^|@Q5w︍mp+W]HvNnEhbD eW\hCՍȊ( !% ( o::~$YFeXEFf=MP &Zh _yK\Ff|vm-MlM>OD!QQ^1( xA$I&9%sqk)HItǘW]ѓ|jdÇ 4/AUܸ o52rZ EUil# 7o`{om-MhfߠDo@A+W]hO_2,ռY42ޠ;KH﷌a6{q8]/vs02M5}y]Lj*<0%&ih頪c-T5ҁCdr}o|+f(l{YMޱc䮳ΊC7 l! xH^K ڙ>k6~ HZnqO_|rLxX@n~ =鏌JHpG3Am@#Ns2()95aoԚt@aaDy#"uGڵWc6'oVZ:h9x(`d򕬽Nrrc]>|0M:@s)u&L,%pz5МWk$)^3E oZDj))+_9X;?"75=_p^_'h&L.chrm>⒒ #p;FǾ.ɂWnz-:c6 kqC9tM5p<Ȳ3׾I~A,]p;/.q1ZCPD\Xz2@Hnw!FTBNE"eD z#W$#G?{vϜC)\)ZSO8s܈)XbꪏSWSœ97L) .T *( lfrTARb7!]el;s;#ըU'<;ߣ}jlgK%hLoA!GK\ ?_%Rn/MmAAϖ0ydebsxEҒ,$\uY"$A^zw'`^rva9C5X橹VfB̑\;:ZQ8s )م]WwZ0 G6?[[}"So|{lk8>`I)4ԁǥEG*pMcjJ& N1a܉t3eم֚Ø|oa4QU6V YQ4}HJMՉ( %YHHLrݍ?_XeE:6Zw$k^| 9''`Vs:c؜چa#5-3nb׋ S!()QTq4NFדX%5)١{9ȳ='Nʑho=8q&gis'װlã.voˆsMf$|ir4`1<4'W֭%ǁ |zAIK!)]^F= \}ݍ³46t7o݊(ި-16>yHFUl^oQ"hoUtv Ei;36qo 5\pMƼE5E*NOKMM[13Θ揿}O7M3]{$*hsN%)Sm}1S"Z*cڒ~8'qW(0(XusCZ4ڐB3t:cG7ٲ}t::5lhp!I2Ӧ/szav.~2eixC4sӀY;qh#poRhh_GG;~Dki{2N}rxbugncP2{!X 5t# p`۷c0Yp7hoh4d*k[hnsmdžw"GwMmK@AX}edfΏK0ь٪9-LRxAC|˼3t#-uB8&bH.:+)^! $w`dIF%<|19/iޢ۵`00|#۞ Aр%ъ4*rՉBdv`u`;pQm8n^xm > X9'>:NDdۜ~UK.'1rq@|c0bՎR-XETE,pQtKuUKTAPAPBDU@eEeҔQ_hjBJLşm1m dE!ZXlo;oyFPwpRE,AEQ(,>ا}yZʍgG]yo~X6'b s ,XHK 999֣jMz_a} ZϾ`J6 \=%~кfV 4Zk}몄dKȲBIDz+Θq{_?AzP?w: сh`Ңf>WE'?y{Y;R0Hks#͍ 47w0g22#k'-3 IM1zk0a0& osT pﵞC~o|c8esJVt)Dd98h6@FRmwcNL!@?k` ՚fN m5yQUUQDNQ&T AY}eH&UQh۽sE8Z1Xeۇ ddfFTO%0Ph(#)^5QLPE1#ٺ}5'jT`0t+u}kIr IDATR_[;]XdlO5LJNvq9IIIQ$m<\\Ó.\*{P2\+vsXVmNC;hA2ꢶu:^9UEQl.f=FyfGEo߳3<;:8#fZZ+*>_00B_1DEPTEEPPE m,Q xio'6T+AUHMMCd<BXq~k^_{67Ĝ`^\TUD(LbbR7N^\--H)~ͧDFf3S?7=0Suc7۬{u{Hj,KNn9ydR1f ?q[pn!M Cun.UEPK *:Ae_Ё}OsEގB8FȮu:MLz BnBiSc=m-{Nӳ"kh4wrhֆ{]A +go56(ɡ5tщ"?#csɕAX mMc(:2|`gE3-'0YMyxDFC1OB:E2úDPTdE',bNHdڌ3ٻQŋˁ3k)g)@ EADՊ!2A)̙.:sro_{x84TTQ)0A1'$J(׋ZmͶ-%XIb^e,ĂQ'q~Zz=TxsM\]=02ۻOd|مm,턛)5;bRK:24HU/<&NBEyWUۻx4$%D`6' 5+/tҢ)Yd䑙KZV. $A)vT`0 b8אl 2xcuH h@%esjtݟEo>Ϡe\ؑ뮮FUHݵ/_qmvm,Hh)ڂIVf6-rU鰳g9s|Ԑn'PU5eD !'7( b+t\&MAN;:|"۞@ZZ(#U ,pUu:qԜ"A\ZǏי-F7pA^ 9 4IR %PeJJmfupz8F#g|^KXe$EQ6n~3jXuő&JR&BEVe9_`EP"+1ÎpF&O) :.U@PDm#J' +AYQB>/隲<( l /=W>ٸ)֤XmTO E)أ&L߿NuB[K3-475HsSSț92s֜Z9 .d]!L)wP ?Rigu@qc TE@w$'y|2sr Ȳ2t4䵣1)iEF;Zq9[, iuspåq^8-nHC78l6m6WN"Z 6Um #S_[~،U뮻O< 6yܑ26Q<;seiil3fER%Pzy@ uVT@ 9*cʡgNgO,_E^^SQm4Ya6)1sĹ!Ro4봙g2md LLu7RvyZ]%M9? ]8KКg"(Zڲ DN8XDj(8]uH3V fs7nF!UЩssc%s%` x{S {VzrBc`j-BZm*| ?A {@E}` &`0ŎZB%)` 2o^MQW[ã?֤8jz#r2CQ)1O[IIIeҤ)-Κ14,|;3YqB[Vj1 tX|)NEV_Rs]G?G|Qm4CJo4y!vOQ _vUKmȒA7CM8xw۟>PaΑu89R6\uú&Fd-T͙..9TmDDž5N PUEQ4`@AUgڟ._&Sd͈:.)tr a/P0~\ }FET5d~$IC}xh|5Fg0 % Fpb0gQ8&W9G+J}FZj$iB''Q* Q%F#NDTdAӍN]g$$Zchc0b݀ ݣmmZzBxrw ))=GE7 T`0$8o4cb0,ڴ@q 4#IjG)h.;DbC|) oIOUyRL i8'$s}R0n(JZ/|ݙ"19fSV~ox = \dfG&> NKƱX#Dꡐ"Ӗǰ$,v;CiU MH a4DqDĞϢ=MX9%;E :~5r{k-:ThBTUMx'SZXjuH?jA5Y*03&16Tt9/%RU5JX>4Lٛo7 ."JgϞ+n5kְvZ.RoSOgg?Y`1fjvɍFAh'?=.Q]8rQOGCFG%e/-bvu-gnBaPb qFN\v,iO DCu1^ E(FQ42N0 wʪHC>:V_UUz(1K&{wu\pK);G'n^෿-ȓO>wߝs1s+*}p ? W*^'45p8;k#x"|?^/'\4-IN8C PF2;*R*HNxߐ%FHceU~㞾h2 712去 ц~v[y/)3.cw]UtwwF3B\4iU=r R ƍ5lCt2<|\tE͊+7 @cc#w˹yc?\{\r%||ѱ% *qկrM?pWse/|}tww+뮻/Cƭ( 8s;y78`{ocƍ+Q1ųfW^b4"7^J;;Gh@7+/_]W*^wBPC>80Y-5kИK o+t-cσrièhCiHD*c` pu=2NH'v ix=}4W2gΰel߷ל3^|>s2vEvk FB;OCC=~|?9hw}F{{ޡ{v{~dږ1n'7/5%d⍯`w^LxU] =hQj~3f-h$naٰa g<j |:eS9x03 t \)+C&lS87Y̅s_6Vϡv3ib!Ybdtp R^} uu@O*#-$ObT,[I``| /ν[iin&0%hMS׎&7/s vinW7} j$ޮ՜BA,>|)=Le+OO^ džcsJn^>86.plI=E wGEPXu>AUIx7ܰQmm-ZjEA4~b ~ӟw^QQQ3p /p]wa2"=v/~ L&_p;`޼y܄GԅtOK2pam'ٽUUZ➸FchTb묚z(kz:}F*g'#/Cy%Xl_;Gƺac6ޞÄ~rfm1;[ 2s'EG 5#mEtvvTC m$q-1hJ&C|}bHAܮ wPFrNJ|;nBp7ːF(%\? B8@P܄^=9ӦI$V.& Es2TXiKXEEv[dK9X5¨I5# J׋t6%xȘNF. ՊmVZ>db\W^yիW` /$##G-wW`6c->*QWWÇ򗿌b/<w$ p);XdbQ>ן_BhjxVYMc[[=lqIU ]cLTwo/.B~o6`ʅ ӭagc)zq/7^}X5Eh7BIbEf*J[[;nPx~002h[ێ`߻͒I9W Zơ%kC;~i2wނA˸m5h6{7^?2{(W.9mlz"/\@L?9{"P[FcA?h=~xb[sng٘%Hm}*O9w2mtPƱf'5j`dzxM:nx}:_o~ç?i~t:imm% /}oo'|rИىnOҘur%GwHxMBEa+X~*f#vlU^TdA5? yiij"Tu?J{̇3W6gͮ矧qg,u:~`xɘ~]$gjH 4^.#ۣ2~-4O'-c(c-}ʸ#-}W77>Bp;gmWz*?NF{*5r!+P4P@Ƞ 5 ]? (YMQ_Wg;BSÑ X`؎dMT! tnFKv f(&77/^;ZHn-FuĉT4ނʙ؋*qNMxcnIQ)db/Iۘce|C fur?ޏR `21ź#±> MC'H+nݮ>:tq\x%Yw+{7BU2>r,8v}ߖQg @ݍ?˓elͥh4# O=9/ ]hnW IDATF@U-56r¶3f§&*a0)X5q_xiK7S~؋wzͅK0l{N]^/-㍏9rtOx%m̱2{iܻiioVM AsU= &RMZ %c]ݽ}]NT5EY;c0JQ+yyL:uD.D*Z BηJ(s:2m-`WO']]{yztG(6  Egq\{a%eelcU>J(,bU N=VڽEHU <AV@%8y8{=44yh<8K…c6)dC222馛x衇FWW曬_3gˆ PUݻw믳zjȠ"pʹ l+^-#++LL&ӧO~׋i9r$6R2qXYf {<g{w1mYX=$t5 B~˗v+hN $cFLA 'W秵pbk8xg$3q̳V֓8O9 缳91=pȅ^hD {3X3mdZ#KDzNNܽ}twtEf~ Bڋ555Xbe\Ŀ{մbL˸p?C~be=^Ȝvy -[֭[Xs3eee /IfڲknfpwUMGWbj$Ӗyl_^7n I0|^|;wMt~a1Sg#+ǁ5_Ӵ뢹 &Fyi~HWbM}:Z_{\AFpx٘-hhb eX̠(\n7. O_/ 9z"l?Z~=rKyuw8-:fyXL JxNA7Dր Df/c  ض3UU+G_"o>s"G/Ӗ.S!##3Rygލΰ|^>` {wm'Ω ,GD2+!a#.2QoPpҔ|w㣴=s^ƒӗx0X,V3FUU}@=mݷ7%$f%W_=؆]b2ƳRz5/ľ幧_;Ө:1{癴97?v.-؋9 WaXlߏכAVvA㣵gOwdʑU &u:֊/Gq]WG]mWX#sFƀ$>p8YN(QlJ5g4]]ԾwrKv(sW_dƜV{ -: ǭBKAU3 /D%a\U̹_:/x5kkƶw7s湫5gAx2Mϴp3@iu{ض-z8_xUz*o͏<2`y[`+SS3uedڲ1F0MKc GXU &=b0pH婧We\фߍEELeSR7܀C؎~Lh=}9{苴FFgbFV>G*o7`Dy:55ZEk  p:r/"ۑlŀi3?}n\={S V"椉w2J*paе\(AwG >o߀LNҥ'ca\U'5M6=g«/>OLIv >}n7nW rn:g;SN?;-Ao`}lL3T|V+g}'TRUKr{6$$ׇZ*P3}eUdڲX3u( Xt\N;Y/y,ɓxeSve1BMhk]-t=B)f;c *F#kRyI}ᇁ.g7l;53:H @b"ч`RUښ0hRfͰ7,.7^7Q+ș6-aLx%Z~yt8tnۖ͑}pp`6[$_6`2Q]l٨ K͌t'g w([7n-Yqmݷ}}:Eg1ɔFj2+>¥K((}fItϜMg]=۳>{B~ llذ!*d­qv۟|_O:EQr%򸻥& v^|13V@1v!)㰱,%Kȫ?]gYϤodM>ٳm%i Jҥ8I/^|1OxT_v7L\U4;n5DT]+Tflj -kNuuCgXș6 GꉘLJ3u*UUtCGzFk_y6zxI:{~qOV!;w;dbfZE(;(SFs;9睇{i?xwk+}]] 󱗔P8}:esb/+8Ax<ϚŚoOOM}D8\^̙XveeϟOłdd"o, M_c#ޖN'jo/Z0<lƔ%7̒*+ǥ%d;cNxeȝ;;p80z`23c&c@1Ȫ"jCĚbBfi)ɤf^~A;ىTÄ&Q%sP2gA}hۿgSV>_lb/)Q^NYΙ93sBcw(+cpǞ-7+V0cŊEDXwk/L9^N/_N_}=&|n:CFɪ!Bq2Zf͐?fT B}<#466RVV_ϝwމy%aMd5ʜIբET-Z4ѡ|bI !Dz3LNB9Q[/.cӦM?wcvtHXf&!B!'zz?ϱG~hLf6Y}cT&cC%аgD+xw>-z&}*z1ڸPODݽoP /x4pqL]3du0։uHnݺ5283[lHy|&jk1Y,}.ﻏSNIat{մա( 6Sx:κj ǹX|dN[Ə?`4R2u*?3=xJlrsu|voWn:zǙhǵ?ۄN-2RZ N޴ b`.*"sB㬷*Tyn|wr:AQ0`;Sa!?{<]2=Of0RG:^ҳYpq;*@OClrrrbuwwKeBk㮦&vEaoLd(#r͏~=[oO<]6}oJ[{Y{+k% i5?nʭMM헿ܴPh #JYbhqNg2RǃY22ьd۶x1^Jιx;!%5qFߖ-JJ_p5kȘ5ktD Nw`Ng3&WCzI? =됏>s($yyyDЖ?{SxBZW?m3u"dE>wFu_*K/(*h$֮IR61w55tkc-s:k7=( {{}:WۿCsq(o{LZhe_^΂UعiӠێEWnguױ㥗䓸x{8VV\s +vc'>MUr%c>p`*L6?-7? tӀ8;h>hh1/@}=jk O^ @#P_ b"sS쉌 vپTPbƞ${?oV0ΙeWPP 62kBx2OG`KJc|ӧhlPC|jg'HƴidL>14]KKM{h>沲Fޢg6VԎ||9p54z$ 3}H:_Nh%h ~:& UUٲe 555l޼߫-[lL?YYhƎ(:od_]nY)9]F _Ҹu}Ku5sAmowV2"3f.\Hy\si^/fYY7Hs ͆jųmPXkE{]ؗ,AݼCvvc:}[bþf گ{XFoEKeei[`si)Q^CLGҹ:#'C9a-..+_ կ'~X}L&ǻP&;nn洵k;JBm݋d 7`0}̌{5EEx 8M or8׮[n5yeeTΙî^{aZY'9 θ 9?_. /D4.IXh-9\bAQkki9xnB^Yg3|8?ئZ["fd0߲Br gU4w\1>ΑwDR;;<,ss1de8z4 A0V S2|(XjjPFHw;Ӄ`1Sq1梢1k8>KuJ':9Vׄb0}9,<}o4w}3MhNB.b0`Ș:`cc}C.Z_o L XgĐ,<&$;ORt?&Έw2b:_NH<}S;nObZw?Q1畕n~?1_du,"BB?[ F#v`6kﺋ4ͣrUP3V:runiA b g'ݷ!'s}I[23q .ΑwD 44`..uTVZ1WV4OY ۋ Օ(#3JNt^TIJ/{tS׬W_Gﻏ?0e3fp2VEz|V^=O{/ f5Y vsKJ;O>t喔F(g,s$g2QP(XqF{ehz0HLl)/ǷkWP9wûs'g1۵qcZmZ7>q4)Ϙ)%& V+55x'7df;/aD@&d6ќ$xzdt?ҥΈw!]1&jk(F#_{۞|i;TΝ9##6KG}={z+t %Ut]G p+跿իc!殦&^i;|5wjI njKy;)(/"lRT] 7ޠ)&sWZWGwu$6ϜI~E=4M.61g͢gǃP}b?=o$AQ9҂E\0cδ>~JF1w0)SݨiPqFH5y<#ۋih}}7cH޿nhݽ]UA ݄"p`»kWx{M;F{DzGҹ:#ZO C>ۡObt|eΙgb0x'? ),0so/?r g\qE~;x;NŠkᬫ>bʢ_::ZKo5iQ׭C.ks k%Y([T*Y239몫x7a駏KFr\`~~v E55W=ƍSݗ\_rTSeT@Cpw8Sٹy45aW++lFy׌++}ؘ$);OǻcP3~Zg»s'?$s޼+Ɗb41e ?&(mc2ΈT_ɄзysKٌ8#zBֲexwˠiQY˖Xt4l&#njg=D ?:d֭lݺuoܸpRc:}?Us2]te˖% fE駻۶/I6Z~=6lHZlZɌ#q[ZXzE1k׎K $=X/_[y랎s.]#B!m掦qk7ekB!BH*B!"H*B!"d̪joF:!R!y'+BN!%jՊUf&3o !BTJMjf$BNC!DI"_ʺK'7B!"d̪"%Nd̪U!RL!R|>,I=΄w3 !>NnzE '4cyNxԦM{ZF>[e(bG x^RҲzӌ: !&׮=}. !Ĥw"7RqrDᄓh+5eePVv !&Ѷw"H!Wbr3LtB!B!D !B!H; !B!H;Jnn?\{!sB!B??|׏I@B!B!NrˈqaÆF!":C!(mڴiێj隭[:!B"k !'L$B!"H*B!"팪H,[lܸjÆ cmY!s9r9?Bdȳ>{~gNr9C!s9>'MCCN`0dpPUUn?ϟ޽{ikk#;;%K;k-[6!B;Rgfك~ɒ%#6V+V$~ѢECo!y8sGmTWWdD[I7nܘhB!BLF)OV׮]{ǐU!B!Nn)OVK4ׯ_^p2FU!B!Ġl%!B!xI*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"H*B!"&:!B!NV===ى*& FNNp8&8!V. !B1TU:\.נ===444p8:u*ӦMddK$w2X!BIHujkkٳg@ฎt:ٱc{a޼y̘1EQRrINEU!B!Ɯf˖-twwx@۷sa/_NvvvJ;ޤ\r B!CMMMlܸqĉ՚՚9my饗hjj:'KrR.H˪B!cȑ#躞3f1{\LF[*nC>؟;,[1}?"咜K"IVB!u։A-ܒ[SSӠl3sWiKd"/?|/7_wnF u[b2(//*R.I $ɪB!0nAІ &:ؘdGUu W}Z܄׃j@P%0dMLFt]'j張x$ٽ0Nr0 ^ٯ{?bSA- aYX 9ollepX`wueeedggzYx1_3+_ 7n#PTTa|_ka97 fΜIqq1w}wG/^LVV\r _җL/}͛7ŋy'3 8 //,[@ ̙3'?ڼy󈾦.IJm8X4 0M,&aY ,ɦ~exkmb m66lؐz}۷KR__OS_s(sUW}}kl޼n:m7M6mĦMb\s58p2>SO?cݘ1|ӟgcdee-qFGNNЇb:t(-} cǎi[s V¢3({1 ǒg8888F01L6۲z#i_~Uqhllv܎;ضMWWۿv<Ȁ6>O|sSQQUؿ?/26mb۶mg7>쳔w^֯_Ϟ={xSm?OfB!9¥^'m۶o߾T֭`ݱcGZK"vO$HY£~h.|$Kvq0p10dbې,.TP N2> 1zT>u]SNBp/@[kDJ9Y4=_xw fX8DZ,pcD9M6/S*"""2>/|ϗeoߞ*'+gx衇?3۶m본hx<vŗeJJJo~SO=ҥKәP VSSeY8i@jHW|)Q]xϯo5W3Nh4J,'aY47;AW;r_7yEDDD2믿>/}^ɽ˽g/>mM~;~{m?󊊊mw`ps=p=\w"N:g[,^ vpNr%V'9Ɏ'~GKs3 +;H>gD,311mX8XMg+aa;6M zqJ_bUDDDD$ l;Us0aMNO+*C^y)jpXM,'F"{ˇ.llN=ڤxqyyybZepXI:-q8[a<^e')b'}gE4 KP_@G{el̀s'B28TȔZjո!+//fY3mxHW'., Wx"a٩Mg$Fg$Jg$ٺ:IXD^Ƕ>1}>ߠTQ N24ݳ*""""S& o}kTUUa6?p;MEEZMs*lƎwd}e$61W#mKXDbq:;9s 8m;:vΎyTTTLgf_~HDDDdپ}TpctswOŋ9q---}Tq*\a8Ѯ.<>?@sl;„Zim a[6ߢ,Zhv/S\U!TVVR__?#v_Wim9ZaaoN"ԉcj|m֊a.J.HF'⩑1X4#haÆ>N_.LŪ*++:.Xsrrذawjk>+[vll;m88}D"N} Νp!$J\X_~U!Lu#kΜ9TVVRUU5-SG9N~L g+a6E<%B[P3m 3gd\ڸ_~HŪY`n*ePGsC]j{ߔ 9{$= /SG׈L9se FtH(,,d˖-Qx~<""""2>?id`0͛k׮믟G28Kr~_rAzlٲeBu]o8C^y v޼yqw۷v׃]oc.7L IDAT6ad8~8մ\u(yyySVV6-9_TTUUկ~?@={p}QWW> qSgD"<|g?W\sMZn.]ҥKikkܹs466NgggvENNEEE̚5)~_N""""8w}lݺO|7pa}n_|zx uLO!_? /Ɋ+?ϬY?9t---̞=j~ӟ_ŋB!~kaׯ;$'''W\oMss3ȪUc0aro?9ǎcwxؼy3g='?ɠ`?T>Enn.,YdSV/{U:nzw^zx;ƢEضmk֬|;q~/~ pc=?),,}~c6ַ{7:f{?oFPy Bp>}<̟?H$‰'mbN{&+**4M BpWO?lݺy/PPP擟$TWW|{ߛ*TsYO`0Hnn.gJ"tMwzZZZFGO>$v{~aq8Ñ#G~-[6@z?Ȫ FfΜgm477֭[ͧ?i|M:::꫁`0җԧ Gss3̘1c|p\͙3TۓwO NGG_='dee8e˖qwc2*++Ήs5xW@,^3jkk#SRRҥKӝIW8ѣGinn&(++=6z_{kצOVs[@}}='O/\rIeݤמ߉,>Ovo}G?=ae}Q{`HRW^y%ihh]vaYϘ1SN^Ϟ=իW"<W\1q!siK,񐟟Zi$;xm>0 ũQ'Nw^BP_|SNw#fΜɌ321$2~q\,^<g1U4"a`fGWWcݼ˩/ ;8x /wN{_UUO L\DDDdw~zO=g֭[yYp{!/C& ի|^?aOtRrws<hVKC*X,/~ jjj0MYfկ~55<M6bYͩ,֮]㡮aÆT F=i/XH$Bvv^C:89s&V7|@ @0^ɡ0hooOwrssٰaX}TzA Νˎ;ݗ??؛?ﳭsߎpyw= |˹.xn}]oc{C3َ=I$RVV<{ljjjL&ͻ tm:tٳgOt8rǎ5kA,0c̙;wnk蠫5k֤L f 3w\Rj STL2x<}3SwѣTUU8EEEV+**8v/m… 'jOŪZ~-ZE^,0թ+++sL&KW~6nܘ'PK7磢b^FCqqc<4 XDDDDDD""""""2XiGŪL;*VEDDDDDdQ*""""""ӎUvTȴbUDDDDDD""""""2XiGŪL;*VEDDDDDdQ*""""""ӎUvTȴbUDDDDDD""":H\t:N$g\. $q, wa!U0i{UUWdɐ u C:bݸrrȾr o~22U8X;9d.)IɑW^pzqȡCrrpq'\U+!v$g6/@i\3f?x}=w$x,H|=Bאhl$r0ǃKΟH 8G94*""""2:skwQQ՜kY֧jmʼn09YV]0zYglv׉<ڊgawt%kjpsϜd 3gQ{VgywA!^Wr 1sr\9>%MW޹s'm]6imy*VEDDDD&+/3xp[ 9ֶڿXm-N,E{;Gq+/ ->I=iwv`S};ќHeeD5#Z2['8~^e"Aپ}ŘXNʼnD;GVU3ji!r0ee#:o0zz wa!כzďWzR*"""HUݫmڴi<yyN&y$u ޅ 1\ak3b\ȡC$ϞqϘ_+ji=k`pc&DWV}΢bUDDDޱnNaZ>ڙA"tyK7}in]M%Kvu5y PQѷ٬'g?Z w`%x<'fFa9َq H߼h¦)3a"ZxTȨFjQ$J \^D68Y`]8OD6Yn(&,{mXDoqo@ 01Q?wy9~8ǎqXl-3ѹ%ZZ8|>a|9"ڶm#W~q\6/8ᥓ̠'xds,*f4Þ;{3~Q*""""O[[---n ikwcۄx16mhi黢Lk3^< ov)N:/$G Η[ kH=ceG"t5TIbUDDDD&ϊ+8x`Z[}޽{ZXbDى[(ϬY]aG4/[w)s'n',\Qz]=ϝsp};yDz𕗧5HX/D4PXXȥ^JNNp~ 綾^Juu5]]]̙3cv/õ_gg'˲gʕuO+miia޽QRR,^ˆx Xڵk7nU;=jIjfeat* p`x<ի=iX4,PM 1'` u%YD-pN3sAbjҜnmmm̞=+Vٳgٳgπ>LII apIjjjFeYڵSN 5k ڵ6,矧|ǡz®F_{^F=0M~7K}>={&)C鸫1 #(ۃi\9\[ydv/성mMMgΜLȪH-[`&mh"? bxq֭c8Ñ#GBnk1 *jjj8vD"]wasQWW7q>#-`/f\3Uyk5^M=~F|׻&!Kv./eA⠗h,hH45p'K/hjJ~Vo }W*"""ضoSF}E>fnn^4ODѴWisrr&XXGZδ.4<8ՊM_i)]hihN&̉ͲYYf{(y",T'N^uՀc:k"5V]gubړAŪp)=JNN_~9n]v ռѴ @GG`mmmdee@{{aSN8ACCM#>gϞ%0{l͛7vGIϼyYY8]]Dq1|>p='11moB| yL9*+S ԟ]< GmX!9*#HP[[{"3]mM8/ @SNa&A~?]]]ܹכ@3ISS'"ڊs:p;; "v$..&PQ:ƿt)]oIo[ZJ*VeZ;;qlW08թ bUDDD(--3gΰo>-ZNM6\.7nd߾}466JQQ+W$//W^yVJJJ(--ĉy$Ft[n]5SzZvcKcc#֭<=*eeeSVVc--P__7SUUl9?{.ϑ 2}?h?h"۾44H#{-+wz{_uuu=_RKeXm#2]\wui_zr}| wtS3=5<%3h5hLluPʠ=c:O7[rφb(b(b(bd~Ν˥ܻ?ڴiN xߦZZX\[˅&/[9 S3R9$O\Li{h,xŪXfBdGiy?e?2Q2/r1bG?Ѩկ~5{eC1C1C1cx'iq7?"_F""rI"""""""i?Q?(b(b(b(FǸ3>O=ExÞ׶m-!""cӀ+++AM IDATi}T?p1bC  PQ"@)܅ψ8Tg1"f:kk:wXk+x #PRB֜9AgZΙ/d^Ι/dfj:oˢAx.Lm̙g"oE'&r%"ÎF WUi_ 8(hjp[^=cߏX;7B!Lex-"V[ Ds3W\ʻk>0 VMRΎi}-BoEJn?#EZ65~8-#o2~ϖQhts=D:B$io&ifj#XVYYcP'3o1Ar6nz~rl!z5gɮĕ:>K ]'1A<ń_z …-"DxpU9sn@=A\yy$ȹ0MH[o83gn0}6Ƕ 8@ӫbE;sr=/ \G˙c՟izUf[Gݱ?籈LZpbK]PL{i|31L7Ss #??wHm2聕͛رcǸځvU P P P{w!l+|cmNWˣm۶>ŪJϓF QUEލ70srX =^wqq*/3oi):"iӈ%bgv$؈ǗEqJ/mM8J0MWjXg+*b.'*t{)Yp}jkJ9}p>΄3-ٺ:mՔ c?&od?[lw>۷oW P P P 77c>xp, 'pq(vqQ0 H'X Ƕi۹FW^v$ $_ޟv>~= [ZJi<ӥI܉3cW\ 'Tws5tu';'x>s_̬]Lh:}>'`<sJ19ηxas]*F-h9[Mk} P|Gb"Ĝ3-Ly,&udUDDD$~kdձ,ڶmK޳ZZ:`Ӿkƕڶ};Yk9?99{dۺu@[VK˸GVW^Sڞ~W׿s} v(u feב?+ُP=@3ĢKdrD6q8v0@.Vl gμ2ga\{--gǶzGsHWΩ>vYZg-Lno8EۯlVfbΙt9GVEDDD "b]5+poi)˅L<χUWn.,%.VG$1nǎYM44I9|%$B!⵵&9sܻWA'Orgq<,^'=G\J޽ZAwRPXus奪mdϢ6ucۜ}YL Xm8΀}g9H(m:r]7)JĨyyON|31L7Ss[V6x zy󨭭tdb֭yiqD:D X oy9h$ΝI$cfg'6׋+?OI 3gڿ#$qbg rp"\^/"0 '!zK.I-4bz p hgwlSb*^ʝA<[o囉9gZsGG/moPA%ZJ}4 XDDD2xOpUA E3ϐuM7Ƕ9cD)_B'XtCqhu!i8y `D#|c@|Q5?HG3oekO{ȟh^**]s)9O4&E,Ԕ\ ;G꾣8D3w66R8o ˱8^FeR[;8rۉ.ibi2M\.xKD֯}e$/`4݋Ǘł+87E-klfle&z{e ډeY$lY%s#^wМ@ɬ2qҞsOnˮ便20o9:G+6fbΙo.*VEDDD&[{{ٴ OIɘ2\.nM&uaCc1f.\㣳j>tGqKkj01Ms`grX8;x]Oi uD, ބw؊Dh}MVή.#9;k^NxzTƻWvzo&ifjbUDDDDzmL+8Қ׾範m.H̢3'X>ȔַNkVK"6gW0ӞsO +}Qqo&ifjbUDDDDmn&Br^?P=pwoH.Rؚ\e0R#:? ㇩>ݛS=iS-՗v{']98|C^٧9'?{*tylm 6>YƜ|31L7SsN'""""2̜ @빓/^zcsk˲S:i>8v]אg0 q+ar{(3w@Na8^GtxR_wz@?ԟΜ{-S@#cge 7sδ|35tR*""""C:w`a^PI-ONuP{'a`tr 3XeY|eѠ- aYX 9/S:r齷2thO?Α; FsN囟\%qׄ曉9gZs:X!B!^?@]-,(]eDcq8ͽGyz-2 ugN5n31uϝaibY6 ˢh93gnbe6{/4}2p:sB=>1fbΙoN`.Hp/fpX H #;fφa456v{q >86abm`9e1!9v{6}x>q 9N.vV=61fbΙoNY!8;9a'0Sa}v='4L9ԜI#"""xT+W^~fceYضm+voχggG9\z\.39ca$3m#۲8a<9ϙ7`e&&4gL>3~vXxy`0)fbΙo.^#pjjjp\}Ѵx_Çijj1|n6ꪴĨw'N żyRM7xN~XhѸs}7|3_dz>?DZ,"6lw97o<\z㎳sNqN>M$a̙\uU|&77wCwȑ#%\'> V\9F󞫫g?*H ~-[%x#=w<,}0Hc?1u?c}~|1;nƍö?qqڴiSצC"IDD9= zFy5540 uKrq10?,'?|;X3Dx<7'oўґs~~~RraǷ}?LIgBΙoN^8q?O7 JD"~.nqx7yWSǎرc444}n1zX}ݗ~3~_V[[Ν;Rc=Əc OGW_'? a v=ܓٲ,^u/o.lm=?ySێ=wBv۸c?siGcyOƿ1cHc?y~<m1;.]n5dgg|p6wv66Y?ִO~uRCQS S tOUvm;Wx˲#2-gwv69 7sδ|35tb|#Xzz+1<ټy3l۶ _hB(fG1>^B(flǍϵpI֒GOp{*kss>Y/gpP [TKY۶XT\d2IJױ,љC?m~Opa6nvj5;pe=7p>"i ٿqR"4mvݗzkn- eYtuu*--- nMo]LS oE-?41 6 هT,yo0(e;cَctt]70M gDrӜ;1؅iT7 ,YQrӻ\5X}ok׮NPU<~ENǶl__]g.ȯ~+^y.{ޢ3 y饗yG===\R+d㏗ӟ˲4-?,}׾51oo;J)Cs뇫ފˁ_8iuݗrsn-X>_~^x~QN>o[> 87m~f#N8}*wog݀S<\7*yYRىet`9upُ1R gmZzϴlt$2H GL1MX,ߦkS,75Xhݶuגֻ5/7Us^xضͮ]ߖtċ/kO~lQ_WܣGqn<Ν[W=ᮿz|Az||_ξ_l)c=F [D24M^yU=w.~`W7 /"< x?ǎ+o_k֬μ>f#737)zr@_8ewݗj{n-i;Cee%+Wdddwyp82kQ%;ejOMg'0R WQ۲]1LSO snԾiK%)0M COg| Z/'Y>ГT7SԱd.GMr\*c׿5?Om{w]ټRyfn&P=9\T09R"Őrbr >￟)sxv}lЮ]?~$}=g?w?O㣪Zmmmċ/f_{Æ e/ \R1 cqWA"@ݻwswގeY;w:\.P0qLdll EQf'잯۷o/y}. օMΝF3Nuﶭ{ِT"dxx"$:N<"O&MƘG EbLLLp'EfzW|3jrӜk$tu;#_zwj.e4M"HopB29)~jOs:;;y'8sL 6@я~}ǚ5k8q"[lCQV^ƪXܹロj9/ L-‹eݜQ,G1> ^(X IDAT3 _y3 Q.GMr\ Z}Y۲w±c~0WU}{;wn_ȪU=%g5/l>w}k|-]˿lnc~$|;ض?f./Krxެ/`Gq뭭_[!WZtB?[/bb`!>Q_X-vG1>^B(fl=c_|}oСC3rc)UQQ%EСCtwwanFN:ѣG"O+vD"lܸ믿p…8ar-yUKAEE ں&r!ڵkyak' rQlMw>FhSN.wm t;^˲l˲PUPU)bItCǶ,, N%\̊CǓOYD9fGԇض$.GMr<08gNWWk׮?:|+_O?ehhh4JEE֭(G|7ԩS*k׮G,In3?y477{ny晒:ټ ,g}zx .^H*bŊx|[*guӦMlٲ8u]|_/IO~~H$hoo+_Jv?FA/1e/'NXرf***F~zzzPUuN~;8z4M~`*9jY~m6..Om-ԁx5Vuu47maYeaЖm- CgcC3PV{Qs3.GMr\,e  {ڵիWF9rIMM ۶mm /`F֋zlEǃadJ )#{YA^QYUn6j:; 0|ߡ*je%ގ<3}:s^|O妘߹R#ƪ  ,oĝc fk𴵕/EQyo&\: ?V\(12BgVcՊq75ޘm_R.\ ~ԄH8vSuPSH<9K871mYD? T~;XDYw9˕>uۺ7ݘq77x~P]ytcUAkUu޻[n,ďJ&:O[v2I1Mûn:IiRu}y(9'Ϟ[DQoN]14mh o.Q lt [Y}҂eO>%q w3c>$Ç&'q54|(-[Jv^3Ӳܶ hn7[oer^(yUGR/8ފŰS)g!ʕyd~l]U_OF)R.`[KM7X%`s̱r.z۶А=lغZQ۶7R:c7J\s-+b  q?DzNDŶ16,/`w8u [םPS&Og1'&nCH=oƂt bzg>7DTq77cNMMD?oG1FG|AI 0'&f+k*^R$ fj huu(7ܿT_V`TOUދbb 2w>d95VVRu=(n}DhZ:KI\sy9K  \?kz5"/f(;]/{wݺwχ}h[0z֮uኂw:ނu(*ב;AQp56R\BTjT^dl}{MHb*wߍ;rkx_Iuu ۋ{_iKzuvc&ae|D9Y̪;xC>HEz1lhV]8D7mB4H B5y*bVW7c<{TgdJcVmxre12I]f8ZsN02ۼcNjSV2IQpV53 c+w|XTw7V@;'UmNN:P\.'2[8X*}cYuvcغCJٞNJ >rS<>Fb}1\VK/$}H҇!}H҇$X =JϜTvc˿8rmҹx׮EzI=Z]V@nm%[ZMMú$(rM~fc}H  $U{^{ժlY%s|sQ/8VgƵbSdQJڪ/糍|j'<~B.OkkkDv9_yۙ>ޙZ]Uw_BK|sl|59Ƴ/gۗ߈t.Ʈh;7[ N  \.Ca`ۄOގZkXQ|˹Eߧx<ؑޚ\)_l7"9lقq'N`b&z۷̴߱ٳT?m#u"V<{*7JOH߶ &ݍV6\Rtx㘣ؖV]of\ l!ӃHnicGC>+i|9K  UE)&}w%A񴷣x[۲>^Dz@Qp.H+mD@C؈16F1''5uwnmEzI]H))\Y,*q9Ϫ  pUaE:O wu$lΪ>0UWر#۾>4ߏ}*;0};5kz"yoݚ-ht)JZ'4tmPhȁ(>z_*cc~ }hwڛ[Y4Vzpk΍"yHxc28,b`UUپ[ b  Nު59 bNLZ]H<1:50jhXtۼUNyO{;񌱚6M[1 Ѐ3y3?ގsQ}^x]ȶM\/O![;cL!HX] *  \T?м>ؼϵZ95 sgJ3k]ڵPj @-̫ j4ok}^+$ @U[-S&If<54~Uظq   \mDR覍[Sر?䬮p3)R&gZAUAAA"MO{':MI[ҫg#%)T.rsV֬@MMT$ƪ   sPhpa|R4t8߰,W*+Ƌ}ݺ6 EUAA"$FF0Il{_qм^|MMTo@ڵWHG>}T8m0h7n~+#4Mr|X_!RF$;IUWe%ZZ_Q4/7f2 91A*uT Au୯w4^]\˥nih1VAAڿhOcqy|k\n F*mAHWQʻ\6ͩP{I_`6 cc<୫TĿsI,]'tSH@<>NׯGExJ'2+"x8c|Lj.8ɉ dOhع-[PT,z\juSQۘ9T|o4.9xZ*j of6.LJ~}##xUԵa>qNf|>wiڵ ʕe+1VAArзw/ahp+;\F[<x/}5>L=e懍[1|k-ڽ\zmdA'NPJu7RUj$c×)ݲ;@Ѵjʏ  iF?O>iVZ:oPщ!& wmJΝعd|s >>9_`fwѲgb%x}tc~Ǫ$zknͷf5G&?hHl;knt94ϯw.C$!`aD9}Nr|oE5 @d|T<'NpU&b  CK/xjk,\>XAg$x.w|U=~&/rJr\SW_M;o!;oᡃ>h+n(snc˿rx}mb୷Pn*;:w>Kdgi/^]"KOf Ֆ;Yщ8]gPUɧ۶_:KZپ,x_0a#Wx \,\^XA&h.0zd^iE=RS nNRKvriض⦛o?WZTkF(T;_/ >T0}hm3oO=\n YbsnU$A4,9a()kvxi{ܾNiy ibri(EaێܼC֛{,+F4J%athw7~cc0V+z<54hiVV^Έ* 5e w^A2/}VI˶FE$)P@I/mluSRSƦm^elF=,,j7G"Gxe۶nYrT"ʙ_f> 96F l9$C<쟱v챆i12MOÒ3]y x97pP]4l͌|PPT(g1y,ִ3f"Abxɓ.U6p /Q˕՝AAX ۇm4B5z|[ĿjvC㓤tUSTsTEATt`4p$i6I"w%w^^?m1۬llX_}v4gz|qiZQwIF*pE_ S?HQ7hXpB2@102GgsTP$Ahn`&55<}=-x!ؖr O"b pM2{p=Cxh/_{<c=:I=S }UAӜc `$GдiYX ܸf K,4JxkA Ԍ|)B'ObRW|DЩSqFsӚh.<ƑD@El3z7܀!4DsI$gprḷ?ų]?._~I6un=Kjrl_$1: -b pME\4 @ߩ]T ń"qƂlءQ}UUysO-kA5D$1 ?Y(=3ͧc Mst2ęccsb4''&.7xqiT;؁kTWUsfWw0p擂jF D4rY8.jSPTUNǘlqL˚w{ECi5E Falv=UU3C _N*ƴXvoןyoشƦ][n?,FE,\K* 5dWiRUs `}nY0Pɕwgji:=2,'4ٺF\mD/^,Hsݪu<>ahpV䑏x i4eQfl{ޅ~r|Ē㌞S׼%>9>ϧ Uujni-Uk/pp=: UUQM}M\JL~]sCY/$ɤhVY׆xV=nOxjKٜw:CS;[w>là^D"U--_C|~l O1:1H ),pϽ_l^?>{Jkb psZ096\r<4<;fޓ^7XZzE![rܲz3ijt>8;vRH$WÃy0"4v)qt}iknl`Ԣ4Р^ju[4O;1е`Uic52YkRzmˢ ;fvKkkNzӚs \eA7mt4M֬iMPя?&96Mb6exbddI.r tݠ,ok396_Rϵ  \s(0&#tnvBkm&8CQGJxy w.`M-M[q4L[tI/Ω9PQɞc=d}秎y9 ͩ7>48R379'SQYEmm]4gp /,XoXNKrM̫wpFgoE۸1;bxYt)JN9׸vQ goV۲YzKz8ѣyjikM<arw066.-+/X8JHdJGQzqV46=q\J#ƪ  `ۋWi$"A;`Zɔ^H2LS j47l2'(aԭhU%5{|xNa<21f=>o,>xo|T4Ej/\qَۋXrj:D4`5D&eg_U mڌmۘE8Ok%1TsM9uFrUlي%2yU=ovCg]7}WzTӲH<wy=q*mζB,ib]eDu0s,AAkUu*ibY6i+f:+ O`PP,lj)Yt?, ,ݴ-m?oy4U,[iO85uֱ"&[NͶe^@ խKcKQ|JpBjM$e(9'd=ctTs=y޻vZbۀm;fPLXզWyO/nu|>l`l"gH-gd X8nc&U-N~֯__m* 5vc-(U#H$Ӌ`֌:',_֌iYI/巍i8T/U^\4'i4hn5Ѭ\JbY%*aD#TVVeC{3599Frilڲ 5F e; lafG|֍;mH,iY45FE^7 j wlESerUkz\p׹l۶ 7J ƪ   Nn7P @8Y, ͥT',m,wm0t4Fg**.9yJ|.pcAQfWEI"s&t)U=Rw:u2 ma\O3pͷlq9m躎e[cyuuI4ϫ܂T}oGmh(6X??vU.C]={GcUAkOm-qTǏn:7W9!S5\frS^|`V3 &$)]Dz,GgTd 7kV]fc<9>N*>_ |g\K|=0˃`llMXKǴiƵ8zFAMSmL%ѓ3)<=D0 'lYaU^޲B*ൗMxkŤ j(Lax{1ݲ&i 0êҲ UcUAko}=޺:&0<1Lpfv΢Eqxyv;\=4{0M&WL3B֭W/`I*jU/YnL#~Iq`jU%4t1LO:z-cՙ1P0-&9=9Ѐ>:=Dxll 0!ֹ#L$x5T3TVVi.uʻî1Si29-?vȅ1P b pRىevm.N?B8xlCH%!V#eoC)d`xxd4Ţ ;f ͦH1Voi.$tr9hVmܹ5tvb)F.k^/$"A#5:ie8{Ƶ~cnd۶i:u0DjJ蘷/iϪ5m8?a_yTVV6Sl]7H@^_ OWՒ[nXAᚤegzf:xouq$1tÜa8yf^iK%)N?錽)5oA2x3TUԶZzc ^d5g?iץC| $R:ǏZzC70 y0lh.)$$Rh'xd|gjlWtkoEbj?31>F] 7*mn2UM"81a$ Bc}_"l}1,'CXAEuiع#盧ú'aDLIBi$@Dz HSHu_׾+ nQ]VOU!)HI29cHH$3纸̜yԪLz z ::jhGMj(/Sp uMg"1bRhhb6\HZksVy`O٨GC<6|MN} EDjˋPS^X{0J 1à@ohhF6rl][5^gVg@Wa4laU\h2*K 1qfmtjbޠp̘+(JXa覶Ded@SWMm U \V-Jf:@B5DDDԍRSQ{* "$*DM7iCFB$A0` S@R~Y>9+E*TC>cUPU7] PO#$2! ==V gw>(8x<:}UT/7rXl؀6>F'Aw" `X@DE4[Mfh*ʹM9fLR3gϝ9y}C cƽ@TB*bX,E,Aj>kB]WK`2գe}:KKε?nP=R!SQ\*u["1&ʷ"N:XL^Mm  ? h@S[H DXbl`l0`4qIhj则4S49 βM9@ @+\݅1 9|N;5EHRSQ}4EI8 CXx$SZr J/Vj4BS[ *VV+Nl65!45H <5yy^l6cώm]Űj!Sl`4]aFb+$1,`TנFfOk4*H6xٜ \]VQ `C"U"""*b&MB8w`>VWU][Jd6ciýlBYeT5{'D"~{gm] (9!u<_oqf|9z4t*2̾Y @mPMM56ld E*j^jvcpDp`cU+q`_H,`N燀 a4!J 5[,Qzj5ʹݴdMMf!n9@_7HATlB< ӑfJ(88-z衇rJ緺AJ¡6k/\ݻ'7K$PE@0He2@$UlתQ[]MuUb~;zv(EE- >qw٩|-go\_+6\_ ? @DT,Vkò6B3Ep}mJ8gjʆ 0T6)8$GVHRHrH$4&:-tZchr&_H=| IDATv\)^i{/>]ewK\3-ٸq#c0c0c0c0[\YY&  ʯ9{n^%b='Mr)ӧ$+ M'3`뛘I:,-goWB?\WuN?\E@\b&FF hj*[=i` Oow .9e 6lEK!\[OY[qI} K`4!ew֍Z(+kΨ3#+ UWqeeem]!51Ļ՝;hs|LR[s$޽-?y &tߖxc{[ޔ\BY(ڶɨeلʲTt8_x8Rfn<8qӧxu,cXPp)E#$B" W(!!\E5굨UWBS[쨷qӦA}޳z_[~=c0c0c0c0KCB0gOF#FQ:BPLj"kV II(ܸq3f@";yc{[ޔ40sAT>З.tX*z@(l&ԕePW 8pNT}ˊsj'1111Db1Bo!PUծ6ҿ?Bu=0աdVw:}m9{S"Qc"o_8]iiTFE!rgu,8s"''Z?-". ]!qDd಑thi>χ1111g ""}.+V[O` ` ` ` oS#!qѝ:DPUWa?w7O<ګfVz+$*h?|B}=/) 2t ]/-==1111í~LhWqV۶! =5YYhl" lE"r6W~nW.,"A e9:Y)Xjj ( G WK rIӋN}CV se%DR)L׮AD[r6 8z=,UUН> se%FtwjmtɁקFf}_XnE kis)S:F[1c0c0c0F1sca!XPb?FE r@ϞV (o>**ڣG!h4CPGMt ggb1CDE"@$X86@h쁥(s;r7yL Wru0Ǯ:V~{Ct@EEٺ޽a,.,M mnK$~ݻ6'aVȢ?t= Ç!^9si)П;1cٿInmjϹJN/V[i{j%2c0c0c0Fzm~{C ޽ 5N M^f3DR)`T\ @4q"Dr9A)I$.ɻ=jEC'$@1~<Ά_A0]Ko& &<ݓY`z7\ʱ? G/!Pn0WV"h(lC!xpXz8q``mXΆ44Ŷ0nD4X\ y\\m CYt4䉉@m;.]7bV yl,$*056+*P<.V(D'&B$@-հPDFFB!V(`5>aܞ=?CP;su4Ǯ:Db1ǏX.675[A:]%' UKM ,PB$C$R[ [nb1፶Q D~~uPj. ț !_(V6GSQ0Aۨ-åK HAoqG^RArs׷8y'ssZp`QQ0z=h;su4G?A [h1~"X`fe @쾂NB꽱7V rk+V{WbJDDDݞbxXٺ j2RSLyϞП6 FjvW_[˭Xm/]aJDDDDDD*yDDDDDDq8M׻;""gYk2GJkpW@,SeJDDD>mɄTWW;""tW@KeJDDD>[ U""pjLDDDDDD*yDDDDDDqXaJDDDDDD*yDDDDDDqXWww DDNIIIo+uaDDDD.b;9ZX%"""t;""jzK,qh[DDD䵲ݝWKOOoG"{VX%""""""b<U""""""8,VӦN 73Q{q6`""""jߏ&ݻ7RSSaX ˛¹s[oaNϯ|N:N0$''cɒ%ѣG)n|>#xz?O0{l׷u箷.X%""""ARV(UVuI| G_A>}PYYG{<3]%55:VN$''ZR;sO==hԩS!>sDDD4zCaa!sx'p}?шT;wO?/X۶mCUUƏŋۋݶӹmG&؞=DDDDXx1/^l-SNez+Ν~h4_DVV)Sx %%M B@@L&x |W8s [ 0zh̛78x /_0 ~ϣO>ZؼysmѣG~zGAFFjww@a`61mڴ&u;;dffAC qm5v֭@hh(lقkh߽+Z{#DDDD䰒}-<ۇjL>~QTT^zG芊p!ٳQah"u]Ͷ/Jo`ʕANN !!˗/Glll9wd2f̜9w.^F\TUUGXb$ ^y{ 8tPP*رc"ȡ[o{ND <_u:{1|pDGG#//EEEFhgyC /"33 ,hߛ+=+ݠ v7ԞaJDDDD{W #JKK/_=赢F?2նF#??Ǐ7|[/rfݻQSSjDEqqqH$FZ[ǑqIJexwѳgV3b1f̘O>d"ӦMÿ/ر>:y&FEE5 ]'sչ{cbJDDDD.'>\C񑐐E5>,,ϭMc4q;IIIHJJB}}=>ֶî]w!../J%^x6 Cb\|QC"7߄VťK#;;۶mc=q9駟B&aʔ)m3rrrP]]A!22ҡΝ;! 1nܸ&#&&Osx*W7<U"""odɒvmOg>ñc0sL9(((-[ЫW/TTTxnh4bGbb"d2N> :th9X,>NÇ#,, xgG6qXv-ltJ BCCj*H$=7rڵkq,]b5""#GN0WX}ٷkwNav֬_ 2=(((spY9xwfb àAuyB?ɓ1wVsѣGO?ᣏ>Œ3P(~~~x뭷b \t #FԩSuV=~~~G}}=R)mV J9s`̙߿לqqwڋI&5?/ӦMã>j;mMK*F>sڻ7_+W`z] /_L&`ݐJS}}VNII5k^{v#J1|̟?ZW_mDsAȘ~z :YYQ(+SgO,Q*9G`B\SBFϞV$D2"#;3gz&%%pT*L8=XV}oK0j(<#Nʖ| U"""I #Y˲6ҳvm2.\ Aj":ڶF\aԨJi1`@ f1^{m0rsC1n\9ƌKaݺУ>},+1t={Z/$ĄW_'U߿cV`׮(~?DFꑞ^kAKh:"88oZK_\In>~6;pqqqm@Y`K.ҥKu3gO]'ksDu,VgX`x X?Ξ ٳ:XqAA&L^k_DJqcrsC1t=wpXΝ ¹sjPV'0fLC տ%"jG̙`m ڸq#_y'lt/;jtDu,VuP 0vl9NAvv820v[)䨬T* 9޾߮]; =Lhf`>7:'OvLzmpC:ؖ'ltcguh`'gҘ/ڏ XOjjNN㵈cjMq"&vpJJZQa5]<à$F~}R(f[UV^󳭯X\쏼`H$V_ޡ$Vvƨ/~dJDDD>{[*T###lgݺ$>b/5??uuR F~j9T~>cT_Z(}{ 2hRZWGV4~բX+g΄ ;A C2v%##%JOhO??t]#۞`nS*t9j[WU"\Dx[y~:T:\ Ч], rr±~}/ZIJ^6~T* ''{D"1a~pkW^y7oŋYfc]x#wC CaݺuM^>|8*++ uAPPO⩧rcfށ*XZzނVd}xӭ]QUV!-- 7o/^k׺%OaݼyShh4B.;.#//x3g;5b|Fw]>폣WvcFˀ~~q>|Xjf̘PXl6mڄ$&&b…Xx1$ ੧–-[PVVɄ}Ν?X`,VSv п(J(FQv%wζP;r{?Zwy~!1|wߍg} /2233]ry7!JQ^^+W:L&?I&OsϹ8SKDDDDY;vׯ]cxx8{={Ͷ)r&ק~j,g8p v^uҒޗdLF9~۷.\9zr?X%"""""wy]dggC|.xz?X%""""4LǙL-"##; Ybqf|]xb?ވ*ȎhP[VVZ thX#:޵[OǛX%"""6uvZ'e;G Vg̒3 `eJDDDDm%jW}q .]CDDDDDD*yDDDDDDqXW=b%K; "Fo'X""""zjw@DDhbG|/&""""""bY,XCܝy!DDDs\ERRܝO6t>x+u DDD䓒pwSpwJs ܕwgr&r'DDDΜ9^4|J)㖸:;lDb|իW4|իWݝu#,V') ( wSJ9DXOR(p45Uxt9wa,dV ww:>]jGo Fmmm%Xr ");_pp0fΜv.)JK PSUe@ bzcҌ°ѷD"۶2̫ PU(kPd EL5: N^_ wıG`plgI@Z.w@oܘ]RZZ͛pyBT"..0|-Nϧ{d5?}@mܸya""r|gO`ga4!ˑpi^v%Tq=}U@%Л-H¯xdڠƀcEu cdB~g/ /ܝZp\F 2Bݛb:tpYYYvf_"""=l6aʥ0􈌉W 0|tjj}*GxD &q7&ϸbɟBmM,f3"1v 'ݵE1>}d\(aߎ#RK0">njΝ?aim}ӊՌ g5EDDDݘ!ǥ%H~嶵JFY,fT]CL|6? uE_&өRtlZoxפ L |y ^v *$KKK+ؗRjBP@\\jĉY@"`ڴ6,/F[,TV _b*97Brl#01р+No&E>`J2< 2g6c{53oGTOl)e`mҦ6kQRc@?^Wl+ebH¾5nβe7޳J]wDTņ ۑd/>F._.BJJR Fx ťTݍR]g}͛0c${RχTKf6N,T;JexJK >D"J .ofմc3>%0xx z\DEi1+%`6P|NtE7BcuVE`xiJ%X(-+/b!P\| ))IHIi-CϞQ())wAnY@rrK '_ Fi^UrQ}!C`0˫/ti_K'Xo=\%u(,]N0\p%HHqSf7T*KSg?m{?ը1vmacnÔYB&?kWl 5+ͧScPVg DhQȃŲecE(--Gbb,&Lh{TW_} c?3rM^XH@Сذa;9$ ya""r|h GVS3;;-,Y}ݕwgrzb5883UYrK V\|Ng>Wdee]Wݳڝx=W,x箼;swvڨx\ GcJD\\6z:1)N^ޚ7T*wJ< W^U9[r"))}; BEEܝy!-xKY7ADDDM-9ww*>*uז |֝#b1N[u ݌*yDDDDDDqXT* """"""s.%q5?a+5,]sri@.ADDDDDD꺮Z#?݆ϾҀ;\\:޳JDDDDDD5?tIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/sub/sub.html000066400000000000000000000061161475757676000223060ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/vector/000077500000000000000000000000001475757676000213345ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/vector/images/000077500000000000000000000000001475757676000226015ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/vector/images/vector.png000066400000000000000000001056761475757676000246300ustar00rootroot00000000000000PNG  IHDR4~QsBIT|d IDATxwxU_* A  $:ދCRUAE()ņ E@D靄;$@ =[?B,llr!{Ν33gܙ1srr"Ba,n;!Bh?[Ѐ>;B!4MDT*B!ПZ$B! {!IBR1!7Z{@>ҁ~ݛ)NXAڑ55h _']`+iy>>)hZZ7FIp~k ;ws Z4Juϲ°j =4Bdۄ+h,pWWWeݡSZ juS7bG( G.C7dF岸rȓmֵ,x'Tvw1<BJzhBeҼޱ!s$-7$8`ia'uBѠvdBRg}k^k^ Ϋv[6,ILRq$`meߑK-jJKh4y2DE-(Ȗl8t.4[/SJ /2fL`ܻ9GOIpuv@Bb.P*[o.'2&b6ԪR~ݚPbA,x+7X[\ VJO凥 ^qgp`ݎYZoɷhk9|/Ů otjDs v$$, .RnFn=оe->9úV4a'rMZ5 $_2O sZ5l<bN.'*:b6ԭΠ)Wuz]֚ʭG,(GOߢ[:thY%s?1!݌SZm˺p%2:S5N\WiR JFeTj5K:Q(Hl\"dh4Z-ߣ$3=˻VV\"֖TjfOz=G|4-^}E>߁9_E% zlB N|P?_ӔvP^J䨭?n pym9{rݾEMVtARq~1,KW4_"cq1圱4GҰy>\'<9ӲAg%ϩSyrZ-!8;Mz N. Xޙŋ) z6Ҝ=x'TĐՠ`%0}Ͳl]&IؙlP(կ|)=LiTQΙ!_+9QKMI||U+ڈW$_;.Ȝ),֘mOc)bgR)phxR٩κ]x1Јh*93͖rh_ܡ(SGv| T;evm<`[N]WR=+{-lJL)+UРRiHULBB*v3cGI4Ss"b MӖV%2*VnT[z4ԧ4:u^U*gʽlqd{Bd&|,M[c=i^lSWѽbJyphκ;[kT*5VImn?QPws-"c9Fh ^3&qh){qJFjnantQ}k7GҾMQ3K:[HLz~Qʛԩm3l3u݇29i" ˧J٦.\O9 J{u|L)ˉI05iwp2N89%<2~O8{z5sFמ]Eho['UvG)zA-7|.#>!tO9ժL+ӤSz'܋RG"i eOmLzٺwPܱ(UK*+WڑE t5υ{=bPƔ/H bQ(sXZZp~xUMmޮOBIHLYw>kFךlB}i錷:Kg{S9?Ub{&U,[ وFGu377cPFhTj6sMEIP Nx/Ӥ)IhxhtP|^Q>}*YJlsAImwjOkRkq~lm0'*&z5+ګ1 B{)~]SRne0GְuKW})bmUdY !2h3ioiO eT.Da ժ\Iü}HQk<+sT,|H]Ӫ?%$,x,-(HziӸJ{ԙWv@ 7Ku%)'6ғ:qTrsçJY# iQ4o׸u/Șx̋XQ#U]h\4*0>z~uX[Zʁr.J=;l̮W V.VXe{{Bd.e{e}|l:[=g䐄B!s~Z{,&1AB!)\-Bal!佐d<(X!"ҹMbbr!BSc#fB!L%JB!Dvݦ=h~B!D>' B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!IB#Bgi+>>>!SGٳ@4ibLm# (ЦNjҵvZo???߱c!.^>SHB# ءe;Y¢ fݺu:ulmmVziӦ9noPhQF,X Gӭ]6"; \BVKtt47nƍ\|9_IJÇ|ę3gPtHܨW3vHԮ][̘1#"tSL!116mAdd$GaԩӇ>(Gm_~UVѹs4 MNU&M D2<`ذah4|||8y$O֯_?KfСmVy_e_p!cƌ!11;vɓtַ>)RWW\!0m۶ĉu+++&LŋYr%ޘqF~w~֭[ٳg^#GEشiWڝ={6g׮]YF@8 e˖qYP}]vJ,Yºu%))3n8J(ԍeժU=zObkkK ߿e @OhRФ$3+WNy=zTgHΜ9Ù3g4iW\xQRV&881cy'&&rE.^O߾}ݺuK*URJ)y: 3gRbE<<<^V^Mhhhm[PM9~8666:BjvvvjՊ]vq]/w >͛ǤI矱{T*n_|$:*U0`FMRRzɉ0sL"##իN/v1k,Y`sa֬YJcǎѻwo֭݉[ܾ};ۿKS/lieeň#pppPʪWNJGp f̘ARRW}DFF*Lz3f VVVr6͛:uD cƌxb5k[GFFnԨ^MڴiC:uؼy3hZvɨQZ1rH֭ˢE8}toɔ"Dnݿʕ+cinrJ Mƍy뭷(W&L`„ ޽nݺQlY f͚ hժUDDDpBu3f K.C:cqZnСCQ,Z@J. $ٳ'Çə;x y Q@#uNŕ/&4իWO7mSPDY[[cii&QyQ/&>]RtW&))05k=www4mx@cm|9sx\2 6]vTX1Gqf @Oh핝z&M`Æ |+Wb ͱM7>33LwppTRJ O> OYXXy_eOXbYߟQLMn888HB$ *p=T*Un߾ %$$$M 8jyܹs<};w榜gƍ&)3Ӷm[6nΝ;i۶-jҩrӋ#335~~~zOS,>5kڵk9p@jccc9reʔI3:T*=z-`ښŋ4"FW%޽;ݻw'>>O>+Wd@ATTNLJ͛7*TsΝ;;wwߥ;m۶q5BBBPT$$$(k4iذ!<6d̙ܾ}Pn߾Ͷm1bRׯ...@pL> 6zj  č7|]d$1(lz#yOR1g}СCiÙÆ ˴NVꫯ^RD"F|(%dFv,\0:o"Z߾} mE$"dF付~^14@˯#Sn芏<2AcCSH(4iBPPׯ7v(Jz5Y"#>>>bpjAajIhDe G.S-g0͔1ЈMic!Dn.򒌡B!ɓF!&O!Bkܩi4c`kplgd]=c+.BaX~~~ncǎDwHB#@PPC&TI￯ݽa6a !($$)vڋ{^^mm kn.牅 K,̌{;aD׮]GGGضm[pS!ЫWgjժ@xx{gG9:!DAz IDATǑuzk׈͐!xnx8{7|| HѢ\vヒ[Zy6ܹsQF ÑxVQy=zpZ֭$BDLx8/ŅUrqXݷt)7rToтH.~HoV۶gDDΝcܹ OeT. KN9B66E(Q8VVV:_=*Uop4G0vxyfV|<}|vHMCf]lBݙ;WT*R'::eTҌuѧϻ8p,[B}ɒL/&lBqtam {'0rrmmoѢ֭{!{VV;;; E)BQuy:Pvd 6jՒO>333ʔ)a0<9T|ǰ?ƈCsvҥX|>ɹqժL57ng>9ڂKx0;PR^FU&O ˫aL<:% nݺڵ{6lƆ^zOfHLLdԨQ~z @hh(Fi[SNQGG,,:0a^}U §~J׮]9raxÇQzDFFq .\9}yӍYoߑ4I>uS۱?5k Jyǎm}Ǐqu- {fakk ZfӦMtUi ĉ4m?-Z0ydlRwV{q$/ݳgz5]vցjժjVmڴQϨ<3uEN9kפc6t؆7…3ٳ .}\]k sҽ>uS$%%Qj3'؞> `ʔ\zfͺҵfojDտujw^߿RsNZj)˜1c/3\/;-28M_MrhzM[ց2uEBWVkt[WRgNn &Ȧ}l۶"CG=o ʳj&:wϪU(𼽽qqqaÆ Jن pppPNC%$$HL_fM0ٲQڎ,+?Fs)Rh-@vҺ" M!2766V)stt 11xdΝ;u^<|Hkʔq!00zWv..%4 ~{|}wU~-Eeaaoɮ] !![һwolll ғ^F]F;2hV~ J5}A^TIh !Vˮ]+bUr㧔֮ݜa[+VloݺOh׮eֽ{.^ĜZll11Tjbbbu+ZOOc3(V&&J.LR5wHm[0w.wϞbz<|/7=0ٕ_@ś5Mz_Ҕ0Lԧn~ׯWr;bL1&}S|wT*M)8q'O_~!665jf d9#;׮RGWO;߹siޯ߹sYL$4BB+1V+WfӦM6lÆ 3dh&g֭AO?իWOw]ʨ\ B!ɓF!&O!Bd]/k]7 ¸d"K&W9 !IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!Y;!2bv萱CSGu|{B& צNjڵkrƎ; Bx{{w^#G0HlDRwxը6|8nTʪ6k9s^JBI!{f{RSxq_}ZZZNCW$36vv8Z߸] dZgV籄<|={(Wvy>OQ)'Ǝ~`j˖Lmm۲,i~xm[Ff'wpp 麎CR/+LO<}˖2.opD =4HJHs!ܾMBl,%JPBjoWvXyr$,::9s닯/L2ӧg9֭[yx1eʔps$%SΟ'&, HN`XU*6OZRWoтz:+BŅlK7B4yGբJLĪHc"$4}FÇ:၁r)4j5 wXRdjiShܨWtqqq7bŊQ\v{`sRSё~ʺ)SkPW~oRm5i1sٲt5*zYkG ZQeKΟMݽKtXqqQjU&՚7Ue+2Y[ μy:+0`,jjYe6mf?e =>|l!kjmײEFo2n?NDp0utLxu;v#yLtFDrx077V6V:1׹c(fjG&YʣGpuuԨQ#[Μ9sssҥK {:ۛ3fQ4Sukj{{sYҥQD<=6nv%J#DMAA,#e[JLyΟzm=k׸ 1c#"}O/Q"`ffW6AesyYAA[XHBIB#k>Of,,xw<ѩsEGth(׬DbniKŊܙF={bn|ҋG$|n%Jaèl#_Ns䓝xSH\]]Ν;̙3gGrⓏsYCC y櫯R}{c&;^ٖ(QCyל9ʶA׮:hѡl6 7jlI (_o~e<=)F!u6~$/[Fݎ5iN_bzx$ּۧ9u:t 16e,J2ٰ!?K++Ÿ<9Tz#^Ihq1ΥQϞiG]\}}Dӧ+$%*WrIޞ5+ݤ:=g7P=#ėd!=-[һw|485}潢0Q }FDpIw6q"8/O{| Q.w]rBICբj6.22:=vEq]`\,E`ffV%>:G(YuQ% b#"Hu֪Mf99sd|͚40W⢢~oq^i 1T_ݿ- Ec>I$7eGqYk(۷o|n(w nҤ#1M`WKjӦ+`OMQz:9)F+Ɍ fƽvm,,-ʁ62IMШ1YNj,}/pP%&Õxp֯6{"^ Ih^bGdHH;*$ nvV)w\T~?$e%'Gqk(}QQQL6mR{#ɏOzc/<*VeˬYZp3%ܔ.L/-,K ?#̵re*կ@TH!!iKO/ɱM- V/lS]k[[JۡCj4>z_spBBx|AOܓEqpq!-R\`mSw1,)I^<2ɶ&99I-f"(( &AijQϒćV)W筯\M]9JLd:ն-\Q~W/t?Xa,srr!&<Ӧz 윝~/rnn:|! ,=}g`L7aI}72eptqDWD.`,x^{rիXj UBfA|h&u9nTҩD\d$%˗W2`"pxrE_-du$Bey_N|2ooM~ƍwNh;v8ꑳwvĉ\ƊT ֭Ҷ-3F"zN# \>p ú]]lؐ;Oϲ1c/Y:WZ[{{⢢ V-=|8m ~X>eyxxt^. ˗b9/O||*& Ҿ}VX2jT}hVչMO>ax6l|=_|AA cJu:tqT #/\?zG037ٙҕ*Qys׬ٵ`7ODHz2z4+?$MBcimM3޽ %x{Lv !PMd^=gei3t(/^$="#j8,I&Mh;t(VVz $4(Ȑ~`ͤI}|rcDFFѣGG 4www{t)>%%$eL^ĺ;RE u?S=~ @z#2e&M|ӏMS},Oa,}7:"&reɝ;$PxqJQCw%ʖeZ'N*V~4+W7H&+yG>1{lRݤСCzvgҖ-[nl)8?>`ϢE: wvر:umm=y2njQƉڶZm٠KWQ999iWVSxqRݿ@C0;tSwׯWRw^|||:ujŋ,5JwfΤs^" *Bx\zqϮJm߃&!{f+ɏ3kٮmX{#! *d%?&3BHB#D>Q"ɌBdL!If"sO$1!D$"dF!Gٳ! Twx]s1!(mo5i҄ gfS>yzpIC$&LoC<-;?XO!MoͿp!9IF0d B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L$4B!0y!IB#B' B!L^yڶA';l1;t!8Gf d]1䛄`ڵAMC:uC(0 vZyJJhB6v&鼇C0Y;&Sh4( ֖d]=c+.BaX~~~ncǎDwHB#@PPC&T)X*nKXdCaY^xᑿin&EFK2nݕj};o3~,N\:gu~GlLΛU߆qBǵk333mۖi(d]19.ܺ{3&A xa3li0G/a5f8o]Ӿw?t-:tŽr4546dxB ,,sbooOF2-/B<ЪU}l[?dsϜ=vUR4磩3)^%۱gâ`]кk/z :uA6- ߃{hٱ;MD[ND{wfwo`]*2DG9 jVmR1 fтχaqKW>/xKc [Suk2Fq8c>[#]}h*Νy6YWKc{vzO|g}rI&.Խl$2S& ~+KK~|,6RjGSgQ.W׮Щ ?|x=5^2!<~x?Ϳtzf{W7wy%,JY w?iٱ; Ze˲ߘ7u\oDŽ? a۬7aOs5}ư4i۞dF%,4Qz?o>!ߐ󉍉ݷc:vkj IDATӢM}//۷۷/R~}֭[?l0U133L2 ]frwGѐkB8n?Kk#J'=4v>5+VB &>NymmeŽLY{~J"Emz)W46 ,2-L5б] gӦ-f#`,8˔wlT]- K|yaSxzicV0r-e,$0!snBJG:sz y^JyYOQyV/e< eƽ|4yr)S077j3O2uO05fYR^3{R /?͚5#11QF0`5 &ꫯ2d>Sv튵5 $>&X]ٿd 8d=q9ouPWs:g7nu4HBc@ I$T-+~eu`uͽۖAdna\>}ƭ)fgϵxDd%;xu)Y5MY]u^Wd'֣īQ3\+7mב_ΥS'uL_^#.:AmĹ㇉Kƶ{vQn0&ӄ濿Ѩn$&$)m;4aƔ8}$4i ĉ4mᇴhтɓ'3x`UVZjiF>;[ݛ/_ΉMuό2(ѣeԊjG֕t]14Ih 5VĥZڭ`/Kwz7WNvGGDHxލҎqqT9 ͩXJN=pR-K\U4. #ÕbU%%8m*Ȱ:]ʖym| GFƤIh<*ymnaGL9q@0iV_uB{;wUV H"3sAza޽{ʉݺQ~}¸~( 11$@܌{|:.+-YWL$4YCVca|+J*|tYvE|U,Gejq8l\͖1|Wt~ksffkS-JVjUiڛ>HzR[?"r663$ڻ|zuJΛEE%$$NfOC>jG#ҞLlԣOgь㏗:(5$wsՎ+y 6["V֔t*Νi @/B72a/,$5^ao~Aaje]g2Rի^J)k֨5B.bKUjʔ-iX~O`u3O?<ю;(/oo⢢yALLXۻ?"-K IȒ%$ 1d a5̌eL0bFf7eP%RҢMڗNmuo_^u|O==y9k CfZbbSbc_WTd0c /<};wǵ;}x_TcCC>vꊼnձ+ˁ'%HhC9n\ELBzuTFKp_:>C=}x eЪ$Lݝ?E֨ a8Tt4ѢM$]WGPSSCNݠoTճ!&DyV_y:Bl&n_5=kPXٶGNv6?yˁ'W_lc[֤fN\.]KC aٗO1W/b̵0}k\D`_&31q1؇ri<>G-qDYclTv!Ozt 9}2#twC*6mKe6g΃y)mc'uF)7t w»./iV1} $'Œ0c2'177Ǖ+WpBlڴ 鰱]0vXE'8 ($oPW]͛I8hP (1a`BCDV˖-=SJҺu'V^[e:{6\gϮԺ+ʏH1!"""cBCDDDDŽ=-Z$HH *'"L[[+Wr;χ "e$„ͺ Aj]FVW]+R%4ޡY0]晖_II摑|km+##-$4],;;@ֿP" PEP!;;EQ/ 4 P3AHBž"lʉ  """<&4DDD$xLhH1!"""cBCDDDDŽ  """<<hjdUz}$4000ESDDDTKedfVz*'4YXZZV)"""Ξ=EݻWz}|lfDDDȢ9"""e2Jh¤ffjx """<&4DDD$xLhH1!"""cBCDDDDŽOf7]}ڐIBdBΞRRS/&UzB&nJ'52D&"""R͡חUSDDDT$''Wi}^DDDDDŽ  """<&4DDD$xLhH1!"""cBCDDDDŽ  ̞TU!V):"ByB):g̙ Ut2Ǿ"{W&___E@D$4///EPci٩T $^WttY3E XAPfX&|Eiii2kKWWWfm)3SD_Qd+""m=zTr_aBCDT ):^Drpq/ Lh "7/WT*ybXK}Y͑'<<Ӄ ,'SNsS3<!p]!hcǎERR֬Ytܹ(;#wFTXÑ&C!ED֩Sxhkia˖p8ァH8B#0iqUL: -p0财ČtE@[n=z47n\jym&9||FVVg~W){ԩw#9tܣ7srzVعn%GnN9t^+a`l"V{ؾ[{7ںz::bV?UT7-%{~F𹿐#5 M:uߥ^žġ[7cZGk}v%~?97!%dy}[v}ҥs`dd( aU16Çcdg=vB ;Z>=nj p_^> #4s|zC]}::!77'./_NKW^ck FM?ǭAؽiD{o`#q~8wŔߢcܾ?{}YJ~$^KԍxW/SL521X2e "+QanU?_L-ŦM?P;999GaԨQ022&{nɓ'4lذڬtub Yx܊?\f TTTp >zzz,qEPTTfΜ6mڠ~Յ3._\bwŘ1c```cȐ!bg/_{X"XY:=\iV*.;~Zh40+zdc՟иY 0۶ϱoX 6/_ SV}}}kۥ6 yGccڒw|]b[1u}hfk㏧b#;vAnݺ!;;011ƎDxzzbܹx1a̙3 Bz`ddTb9)7ӫhСC1sLZ >ԩSₐ8}4F ~_mۊ1cԩSx)O'ɓ2ڄ :pqp y 7A܋(4j"NAb.gz)Jhn\:d546 \l;wYS dgʻ:ϵJh\ND$ُϊkhF}]Xٶm<${033ř3pK.EBB\] ON:=z… 1~xX[[`mm޽{/\9;;W^``#~OnDTXz]?{ -[}>3&Mx{{c֭bm5 ~[x0(̙3Ϟ=E&4N6OVm cd 4F&iL$B$5kj):7'1ш(%ƘJ}*beݝJߺ&Q7#?b""??O̴D}ㆍJnII`&fzQI;={PWWǬY0~x?C Q`X$5>-ap8Rm7N쵓4icǎ---:YYYׇnܸ!Q^?___<|yypYZZJq:::DxƜ 8t4khbE044*.\Xb\Z?+V7^$989o|US+վ}z Oʲ23p^](\tEEUyybe\ƓnbOݿSXZ$t055%t4^ӼlPU?Egf ZR{<~X޽Fڵk1x`t]vEJJJhB+Lh+HN{~K#p}M-vKJu)bQSf@]S^Gc,thM#Q̈́E+k o8?pmeLr銨bIt~WϞ–^8sxv[&-n+%&L]cuXx%[`Ԩ7wĹŋ eggڂ[ELU5o^qMr$.>M-m44o SBM5ԭsq4jk7#<#ݛU `jCՀNXt./,Y 4={pulذʾ}JOǛ‹ΝCsdtS4maDߋHYC#""* W{ ,ZƂ~EQ`ʂeZϯQXQm""2̙3066Vt(T&4DD5}עEd );!r""r*| *RFB+LhH*6|ŋAaTUe7U5}"T wh(B|): e|uWMMA^h HEm02޲mQi(MBe<̲d %" Ut2eM(iGuIhBD(aUNDDD$xLhH1!"""cBCDDDDŽ  """<&4DDD$xLhH1!"""cBCDDDDŽ  """<&4DDD$xuQiT͜9J⻋e p1!WsDD=zT RzA.^IqvvF```uDD$XCCžQ8BCMby&'+ 'L(QY#kkLݺL1bIb#oGcgKD5"%Sڈ&5jp?gDAAŃw/z-V ?V%3smuy^X:}|`֪cIxw 5ܷI5O9?/GGx9:"߿rN/)'U̶mH~RVQQPШ8IyzgoqYEC5GhʐǏ^P^>zt¸iSNNF#BiiiXz5BBBD,^˗/{]ږΆ ੄7*(H̀33qdZ_[+&&hW@z IDAT{fgCM]]ѡ1)Eg] ϟ'"96]C~^Q<{{ڄ&!!~-ѡC9su:uU^!VZv+V)Q_Cşr9۾}qt:d6hӦ)"T`ԨQ-ࢯ//]B˗S.YYh(V۸o}ڗTپ^xBKO [m߾h߿r3&4%HOIٳ PUU{{yوevdR^fffxp}ؔۦ+>G*{w)+a휝qqoodgf"+hhkWw$8ls{!fg#mDܾӦ1eQ{熘))xt]RT/ۇ*Exzu6RZ%Ą}}KfNNJ\SRDqa.<|)P[&0p :*vǻG999tI/_B}'OF*r$S#i i|*oIaff&U\FzРAIe_ѵkD{:휝%U۷E%E 7OբŽ}ww%&bҥH-[`MMll0oаE h"??c7 7'goG6>^6oP8JLrU|JusqAvz: 5j_SRDLNW/qr?sdee,--7`„ r^eI;:r0/oٲ2rKOIëW͆Λ:u`Ԥ ?ǽQЀ4 `Ѯ9>>HBvF DW%FG##5 [@J -==XHyڵ, [ĸH/uաd! 7m ;;4k^fql1yGzJ R}XU`őիEB6mox׏A77uӒ0h,4ǩM089|B#L_EH{W^={bРAhԨ>}͛7O>AZZO.BpppOઌ~p' ._X6h,W@TT\I]"#EHzJ Ub; Ϟ~>f 9Rv3Ҡ[ٰ+ĦgOTK= vtDŋ; @<]Oaڼ\DŽiibuˬ&9_P!墑<]zt # :bhnNۛI{$IU+OeʊWVڴi .M6 m۶ŋ1qDhjjtկ_*:g~;VsqQ`TTI~VUUE=-+M%3jp_ ڡNݺX=|@2)'Mrrv_`%Cŋ@nv6޼s?= 1yǻ 0*~_AQ_RN4)VGCGGsđI+OeʊWgaٲeqdGK+KGh W<@eln.:CNzy Om1kRt9&$HW$G{qѭT삌wS>|>||$xëWɍxٟ whAo&.5R>5\|KQ wL*IEe|tijnY2FWWWiGhHe.x7ػt)zCi^ٝ;u\NENb=“7mdc֕? ǃ˗ gb&MD܉||Tv U:mlE֭נrsv>Ps+dLhJ`쌋w>vhMR␑ &MDj|k@ZzzbW@#++h kNj-&~@۾9YYx3Y3=}*}wٝ;%.3jMprJsX6OOop||k|4jQ@q%\?zZy%>x84kAMCægO͟&mڈl-==Ԅuqc0ԭWXF֨&\cViS. 0.SV˾ :ƨ[ꨩ ]0yc&M 0᧟k|B~^9sԡ!s.~~v-X u4dH)Hpww` #38p999񁚒I{`e|)FQRS+Hhï(/~ocᅲ^+*K$\gφW}q8:\Д>>8qggg,X=zI,t""~Ɖ 4Kw_L J˫NgEDD ..B, RO ^.vSEGINNFxX' 2 ,3ک`"%SZ"d:1!RB&/LfƄHI%1LfDŽH1!"&4Ԫ#efRVQ^U@DT*'RZC J$"NLhHiՖ]]*!".LhHiy*:j8  """<&4DDD$xLhH1!"""cBCDDDDŽ  """<&4DDD$xLhHUtEBVRtD$.): Q Rt5̙30d}E(MB*HHh^^^ƨ+S}EN9 !z~:[U|OLW}Udyї2Ǝ跉Jϯ_2-7c_}}?Wh6w@__JZ___$^R;C¢#=3W0#4*AAB~~CQ4DDDTG puu_++ ×_]u ,Aġs E@UH W={aaQQ/ eaQ!Ja}B8y9}ٍsŐ9a_G_P35 ,<,C{!7UydX[[<<< ZNTTUJOWH Ѹ{7ΘUtjmtkxtǔXonztn8q***ѣ4۷Ə?~9sǏ…3K:uСk ++'Nb@'hjlٲ5XlX&8::ny,,Ҳ)ffezz.h= -D66VXp>l(}{bɒԴ94QQQ֭ aرHLL'Ν&L9s0h ԫWFFF%7oy86B9ϰC땻0(]BSx N67ip6uTUO$OLS]],Ά:thoEGGׯFLL4uFpXƌ8}<^NÈ+ߓ&ANvbe66*<=zݺuFf +KIjR2K.EBB\]N=z`…?~li ::1^%nԨ ״cǎgϞ(PWWǬY0~x?C Q`X4x0#-) /]B֛7ȑDfg㸷7eb_ΡQBw茼|\GbDrMXv uO8xp;wk׎b2?.]:[M?a{#GPDFFիD\pÇ 6R$k' %~M0Jl4t\,Ƣuڴi2**Gܦ-ZgOt2V gάIvBVz:&NR;++t Mm)INnMfFxח۷':vCx:M1??"$lmmO[6uC'p_ͫEvv622ď?[VbU2uzhį4"tS)39W}_߫WenY$%®]p6 iiHARL NLNEj||b_RUJ\xItf-ʩ]HUEEbkwunn޼@KK-Z4CZZ: *T>uqqo7j_լ9}+_u^-2WWܹ'$Q3$~?IMЀ)߿/YfU{IPEW7e;s%%!7;vڑ#E_Nl6O žR:JUqv/ Rk}xw,,\ݱI,^=ÇOw-[ZF3RS_9uV?$BEEBu9r&O 2ť7 1{L8uԁII>i]‰?.PSSCallX/bps"++Fĉ@޽ڵ*6۶mCHHtpB75y*IT*!2Fb٢ MJ8e#/ bK_;r^IuJ!YyQ]! ;Zݺhb3GǴV'NZC-966믫w7oé__ c _ɓgƍ0g4xxpq!RS_W]555t*l; 1~(XY5ǤI_յj//}.\X|ee-֮_ɳ8z4`a}.Q(eVXd OOO4h{ױaJ&5,>Nn܈WQQhjk ]ccINt0mloDFԵ`ӳDkV]J(k2(aBS[{InŠ bB=~VW//]ULE5prr~?BGah7?$Kjc<0(:M̛*W/4_dCQ___6 oٶ4WW&2of\}`g0j"W&j?)WWM&I  """<&4DDD$xLhH1!"""cBCDDDDŽ  """<<hjdUz}$4000ESDDDTKedfVz*'4YXZZV)"""Ξ=EݻWz}|lfDDDȢ9"""e2Jh¤ffjx """<&4DDD$xLhH1!"""cBCDDDDŽ  """<&4DDD$x2{SM3g{pppPt5.rxyy):"|}}jGʬ-&4St7O+:z1!"""cBCDDDDŽ  """ 'ABBCQ*LhH)PQQ}رCl]D>}E²e0p@u֊VHMM޽DZx|"L^^kqI):<DŽCnnn~ux5.]SN!))I*Gb8y<1`@/ ƍMp KoGܹUq EIDAT&MۯuԁРA|׊VHKK>Ѳe3_a N@8BC|r[/66_~%888`ӦM˓/\#FPSS1\\\p1SNٲe aaammm <ٳabbQQQ}֭͛[CSSݻ79R300իWWx="KHIy1cH$3IFNll~OL 7p-:س(]ɓs V؈;wy__̞&ǜ9+q*GhHu׮]ӧO)SZɓ'pttDLL,++ !!! Sp!ԩSG. ^z?z ޽+z}q 4͛7ǡCDǎCjj*Deϟ?#"##Ee BPPVZsVxzݸqе}HLLgFp-l⋴t8;ر7oE~=Ѩ)3i>Fv6,X RлwW8~,bcd߲Rz:t(`Ŋ.ԩSEL.]~  uVmK.?hDFFPWW,[޽ӧcݺuСC1c֮]+j…  dfĉx!.^sss ϋhܸ!ֻ֭o0gFXp5kO ##}{`ԨApt2c ,jȑ@ǿŞݻ+݇}8oSQbeaҥPQQAdd$~#00@|cСE*l&. Ν+zǏ(y|7/@߾}E1{l8;#@BBN< 022¯-[_}‡޽[}&"E^^45իᰲDuť'23pc>@bbJm߆MK#''Wձc[@x**/'%1Eߋ.13_F&x"yyyR+Rme ں9n޼G8s2?qзoQN%'uՁ Fv0|p8p[j ::QQQhҤ շf`8{odeQ#|tVx uaaq?˃!Fŋر~BBnCCC&&876l Ee꿛h6wS`8%88^^^r;]@DT~~~puu)?%ܼyZѡYB@@f<>o 7g#T4ymHc嵦::jHؘ)zFuWS4DŽHS'1!"""cBS\OD$K&&&|fU,o94eppp@\\ rrBe6p ]<)~*^~B$ MADDq"""<&4DDD$xLhH1!"""cBCDDDDŽ  """<&4DDD$xLhH(:""" II}CVղ"""RٿX0r ܷADDDCޟ/9_}(H~r)"""{='IENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/vector/vector.html000066400000000000000000000063271475757676000235340ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/volume/000077500000000000000000000000001475757676000213415ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/volume/images/000077500000000000000000000000001475757676000226065ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/volume/images/volume.png000066400000000000000000000630241475757676000246300ustar00rootroot00000000000000PNG  IHDRLS* pHYs~tIMEttEXtCommentCreated with GIMPW IDATx]w`u3M!tJ ޤ ^=ԳןE=E;C tB7euf3;-BHw9ܝy׾[lRH!IͿZrRH!.t2͏ ,QrKN4hRH!.zV[lYj0C)|Qi:$2pʔ^~-Zy ԖؽGm 9 yhaÆ̘btӌm}͹suug˽?({\/r`*팅 |&$hz}xxdBB|FF!}njQĥ-z23_BnBdٞIu ͋W!үж;x3NBkִ5m)v{ڵ#oopӓO];aB˸SbvLmlm^&W!!x0. cc޽ >T?CfVON!*1VUo , ?ۮJxwe W^&Z \Gn9wns㶷ߖ6}Ӯfi<v_T]-n'jR{TXPPco1.\='Ὗ֭sZc:"O>\ĉK &]h i~+?c%BCQE6o#'sxQMۢW_Ϳ˹7Is);@1)).H|kiD o4EQH!E)tQIAS-r"H=z4ر3'-//W/-[lF#TV߱c#{8KT@~iB=pzR(HYSH^q #6 ǬYsS?矓wkm(/uXl>6-ҤV:e_L?-M|+(%LN}njhn?ṅ&U*g4u?{cجYG6ofwťe vVJdvKC^R _HpTH W*TaCQ&Az}#Į]g1g)kr u;v=Z 6,>#aib2K9?9#y} F3hTRHCp)j17޽0.wC^7g$'me_o΋5~[)R(H W*ԅn#sڀq-=~Y3;xY*1={vX1]wV-PU.u[w֭{ckJJ<x$9?7m[qISx YBSۈy>j©\PۣAA~R!f1[sy7|a~jggwF׈׿ [ *w۞2  0VVV=04;_vKFA37:p SHRHFӧǃNwgWٿC? 'vہի+kjXBӳgz^Й3cSSy6$U*UPpppxxDBB|zz!9ƩԊP#b˖-K He\B )BYc%% +RH!hIQr )B )JN!RH!%B )BSH!RH!E)B )RH!RHQr )B )JN!RH!.ddUU簲[7{ﵺ}ɒ%I\8v]}ce%VфFE5tXW0ώh^ٶMA_Qr)yi+8|=Bm7VTټ.Bʓ{ )9 N2 555uuun˥u:V OLLLJJJLĽGv {/Jnw~~kjjFD!qA$Idppplllrrr>}ƍIwݕ;q"wwvW_=u>˛4)G}[fp4McS BVtȄZ}> B˵Ç9r\.uuu'|9 >>yyyCt8V{1WXXz겲2#caX,l۶m_~eXXXvvi̟9ӅI{'v1g>ƪ*Jķ{^kZ ñc4MxxxϞ=cccM"wz[? 4 H `6";aZvĈǏ#B U-Q- Kzqpl]vڵ+=={@au 4:ZqŇNKOO!Ɗnzk?^v _~o?}= ˤ>}cNݓOثWlKCoYWV[,cǎEŤB#4 ]@A4u;.auZ %kaհWu oذ~kjj`db.m~(HI鐔y-fر {7Z}/2o޼'^ >?B಩0a6 a0doW]]wi0l )Y|*//gRRR&&&p` UޣF_~yyaC⋿FQA*嗻>0{p`hzً/mܸaz՜e/DSG{ S}J,p:(@ƍEۛSrrx C=_ ⺺:>LHIߓ$Ug{fmp65<6/BXuP _(((ѣG~HU_p0EQ?Ugppt ;=8s]7x/=cƌn9dop30jYi\~m[f/Ĵv|;x{srrLg%rMHj(/wlan2@ceL7N6:9Yz˥ S0hTW >~ssCkoJ7>#W~B=2ӧOs[ca0Z <.H!gD.†_硾 crʒG}]u8qM _}'=aAʋ]߷~rJɯwmp'c-< 50_|qƌ~{cٛN)j޿hQljÛ6;V=$>MH^/, (;.@ĉx ԾڔrNFzv #DF҅DiV}/K38`:zu ߿?55w/gxϞ=| $ 7>w ѳ]><'A]=Rx d L_^eeeeO=… ~{p@ɝk$ (O\E.駟~Z`gәh}~GٳG`:p|HD\+i5kN:y?̿$stiycSV;Rneed 'W}A<~ŋ#EI+ao3򂂃2ッ5 :cccEEd䯀/_  ? ߄QW«BSzwɓ'_Ђ&s_1m~f2X!aovVk-w:]|Ǜ\yR>w=j_Kظ^{'%'DDDbq:5ե'OӧO?C~`zהXO/\#tŝw?_|c_͵&Y*yov H{(AucUIsuIr!!q Nnzf#،6c-$ŤGr֞_Wzul6[AAQU3 ˗/_lixo=V';p;Ǝ;n|n䶾ȑ;؞_\ @H̼ yGLnB_|l?*[gCDt+G[`ɛגh"`og2q!."^`6ҧ\91cG,*:W477޹s UTښYݱ#+kܹ;/߸xSUj5(i*l.ݳcߒ1xu[7]5{ނjRA̡bC G.Ջ''=33-=388W8ӧO:qTkk9/!s@Bfȗ% M>uޱcѣU3 Y$/w{˧Ĥox`{jϷ$$L6JOe_lX f"QxOx>X -[V̙s V;nxVXx sm.\v|n[2@RMGZto6lx;l1gΚ>s+we?/?|n?}Y`7Ze2\9|lX;qZ˵WmTNnѢe.:΋=xptk8}XTֈiT^ 4Mޠ KNCr˝>ʊRnGu)9#3bSwfv9f̘nrUwq]ӱM[6]׵P-3#^yO":&_3nwݽ %5d1 אR{Kr[T*|6px>|8"""+++j5ED\("R[GjeUr/p:dfdt&{7MTװsg-LH]_ߍ4[VnSaJMX~/ K-$$\sKNN2A))WNvY|C.??ԩvynN%oҤ 1̩ 'I2.-N_Ѣ V|yI'<ŋ tݲG5[t:P>iSɎ۶U>#έ*.&UwyGB"z nuUPޠc]wEDDv >} 6 :2NyD'mtrXCyl0.%%%f'vщd }}ܦ[ߔgQ63kݺc 7ެ :ox-[|WB0 O]%/%x5w?믿޿?tw@'a ^#LM/#{~ZX7>\ QAou=>Bllܹ{llܳϽiێ3jFgxcXlnߊз1Tm..ν⊇,LHW5/;f`8ib3y|g~.4*ר*QjcVXyQppk<_R|t\. IL{%;80CZZZ^}|1\UUEQ믿z9?yrrs/ۡm)n/e-F`7Yf{nn/E3,-QΞsV۵a ^̂~nt8 EL0Ef {OG)^P]];bo+Ç/^{ D)/`4tذeuĻw={v,\4nBhؿaWˏV }r|t.AZmN &VцDqSm)!--+55kp~ɍ~goZ__1{HL, IDATUu'+M6! !qaaF? / K#UzjcH@^R/+ s}iє썌m|Br]Oð k/7ܴx-V!rhQ a'y.Ǿdq164!>~駟z]{ Jw++Cpӭk'I9rƪRzd⾝a;-蓁$⪒o|X @x~N?  Ā-6WE}a0I^{+&M*p𝗃cx溪#wyd3ߒڏ>AWN *ۛ{Շqбcֆ )p$G47hOCkaU6Mv(8 ~$v6ܵ/ 0L}$404|5-E'On޼9,V9{$GXMt0{ /=^ 4MsA5JLv |.}$O%=M3tذϾX,c ¸TUobAF?֔=llX u5d9lg>A! zy~c;(\/%:6r \=(g$pD$g>0u=1Fo保 AIm-t14oqo tb^jƎ7;e^&Zj$EIcG HL (5ٝn/E.lGx.(= &/68W!HB <^CMX55u~)0{T7f3XԵ`6FFE-f*1Nߢ maj1rh' Lv1bڷ(<ߢKUU%p>X,|LJalZ냯fYz*Wk:,۷dqnl]̺@Qrn߶m7pzioؿu+x!9vW#VElG8Rm7Y\7IuϘqa28^vbw(b䈿ΑH;m]ߢEZ=ر >;Ut{[kv<"@p)f'pRObb/v>sř;[JRN;\0G- 0w޵2BlCC&Lu6Q20` Ocrol^/,,>%ٝz|Aa@ҥ#@Hs%0g_x%8$L]<{S}F|l'WI;{ۦ@c& y+0z\0ٲz8qEmKr x@' αJ-#IFfQ&M0q{9}2wVt:y(6/!h ;[X;k23p3? HWl.^ %WTTe$|/]Ygf!%g p6V^ax(B Tgfov.R~x$- :ݥm/]ȪƇ_}]΢Fϊ֗IMfJN xq)6i]^,JC=g$O3~KKKy1>#W0K.{PPW#-?rZuٛkNד-lZ@O۶m_P.33뮻Lʺ&@*šg-AWꎛBn= 󮽡]P;[eO出!D#F].->d -aCBڒ}i#h4^au}? YȣfKK& +@r[x6eD$A47ܺ! %b on?7{vk:a} )g/)]{|Bycfhtl1`{6lI{Y1U|Mjڶv:tH^!GcRֆ*h4nj;w[[8rj4 6(dW]@2jg߾}c 0`8~cpSV|ӧS͡3V8p`aQ|nSZUA=ue`!{Cs@_gd*=qPdw͑ i*uC{ٛ9r{?jM~ʚ74[c"r)C"9 U?}Umu%LZ5{ۨUgﻯۺ#GtD%9{" Nv{$IW5$IK`\J`dazI`f+D ]K9 E+/!( b@M zWQrMu =S0m1ajҦ >fsA?=wcvS=bh6 UaIrX,\¤ Ju7(h,r`Yt+"U|Kb DZɗ+`bB~ccE*GZ$b "%Ij ,nՖ; Gb핺p{ѧi/XrƊc35S  DgE$/(B~_lJ눟B-f:!_)jXkLձ U2o@4m=SؔV@`oyrNdF!N~J 盶o.޻&M"6@!ڒwUj \.!;XLHberF!)1c{k _&էog/+:wƉ=f//4Z.+# %w)U_iۀ\6vB˹ZֽRZoV8rԫn[]g4HQ614x{s%&?*:4-QrAZm+9ʤ4UZew!| 2R|h`N7E#ސ~aFj)O"IΊ8)(q}'y= _P[Sk|^%\"ї{w q`k2`j.$B勷wYIJb$%?lY-2FQ7j|V{K.190kjCa)6h0?ȶbLw9{sge%ȖݱA.If]9jRBsA` Hƚ!MΔʘS^$夊l_fQ8 #޴`{I(*Jɒ9#|1v<v/@[@hU bp0f3ؗw8  %`_arpxxDDd}܉/ъfjzf ,}qiZqkXak2oPr ϧBBBz`\syB<$5vU-/&)-wޗ3Xb>,1ƀcY,pw^+9йz 0} D-.3_=r|? akC5dfeS4͂Vڪ'4*$Aa'AC ,̠B&[S hCtcb;}sG?$,q{Vym%X NU[!F0P#TdQ5<@E6i3:kJp0%V Bl,[\dd$)!sv"{J)ZOE.s)l^a A4IseF(9V^"p,:k r ? %,ξĹ>1]$ΖNhfb(D[}>8ٍtYj@(9oE nGDD4#<2WC,~}nue+\J;y %5[ +BBehhؙ-eoC9Н^ٯ7kQTU]T21'I'R7"ao)9?P|@3HK!]a'qq(ȗx\pENu 1|k Q5[h;8X)ӯ'SWőpYJuc BBBcaLrYx|(&^8rgmJe_35{AHsP`T ^RsOH\ຜpMb @&Q/DG"&DFE֯yn>0dhZEu2X/ z, && m0&y,X+rC(OT*k}732]Jӕd?˰ a I~;ٛг۫WzW_=$ qbX$vQM!#=V2{I%7s׍a+} kYvP^8-(<^O'?aTU8vZ4Z!EjKœt. Rp|,[+B5B(HӲٽo qYpP?b"M suKj|E*; En$a5njv k.9{ !_nِoz׈'{}$\,ff@ _[x5޸KT*L>`ǫI2Cɝ$ ܺ&>! Y(l9C!!ݹ104DzC{ً1 Zϝ7IsQpT&ft;Auke 5p\ڬoLŹ ښ6[Z+j Zfѧ\~F NGON V;Vէ_w:l `SC[XH X#g4؆lO5IZM ^3Үd"xW܇l|0^#d6l68E+ ಛaIt:g߷_WϭNj;bÕa7.KNdGZo8Z|~Udp[X>+iHN!QeUXu@"Z&mcb) C.Wc"O.twn;FH ;QlyU-"D ބ^[p32/Y~m3<9=[QP]]q>;k5깳BlRQac0]>@ r^#`5Fce oZᡕnDmmx*z4ES$Ⴡ$[zX;_CWKTJ C/ݻ ^$aAzAʁ|(h: v>cc)C9(3ɭf^wG#Bc<߯Uss }sS#Hgf2'<{tdLjIݵK<!欳6v!z@Ey _\ϽzTϭcD!lШob0x'n/1Ďէ3x7\ͲmkO`_le3`I 6B*-pl)=yC|%[尋j*kF5ngoQ[%sS;w_ ㆃ\ 3nvL<[]]u@ޠ|F^OLmDB7,&)B/)`GN\=V1!Q*#M6S+Ã̸qYUUthKG݇Zh4l:'F$V-Z,5 =9rcغ)qFv3o55y.@tY:@lڴ WφW '˪9?kgĈE@1R+$ (6fQ4Sos_ޝk`uŽk8eggZ'ħ@P?}H$8",։ q⍋`B4޾vz2>yyr &VC` !scG{?}zW>r꿦̘*Bcz̪0l]f ??Z'jHaE1!ECEJ5;3'6W< Nm]^^^F<ݶB]ހ%iӦqJi`U@5+W,x`aLt _V&@CjI=i@Dp7oSAKQVYMͻwls3ftvݨ={Jє*2!Ф8 'J9r1"=3 ?{=ZPK}%+55C j7&7ֆU%NI`0&l -d@l `fMy۷l0 XݹVސ0f /)[ :qw<'"όXdP,nKrΗ h8LMFDXfl-  bccycE =g6#b~ IDATo˝)ʷ$Ik+O!4DaX]J2#F<}7<jwKa+ VN`#PXΈ&at\6!VFa} { Ľڵ^R~Zqh`huxXeR/|H,f!iXu:VO11(AKc_L YyPrj=oyQї]>nP8Vc {Xu_>4rO?bQ^xlj_KQ@" `3 bP0Hd1 k669_49{X,iOW1+F_ 1? =.G-l@Eb/}09m^8(avSQ {?7ގR!Nו yAPgfxy7ʲc1AиˊxN@ R2رJAh/>khGa  b'; 0 >E7j^7WIJJ '`Zɾ}@tII=l۲qXÍaB@bpy$[3NfahQ4C M38ΆZ+Á=; Udff3:#qsS_yj*?UUq*75Y -o<4Vq(ºz)9 ̙ý .r:o20Ɔlf<.F,f8X ު <񟗢 Nx |3qs I".yS O~7{q/ /fd0Hex4Mqaa#0t2+K^R)Rm6i۹7l{ ԔM3""{[vkq9+ˊ Gzx\ c{0&Mׯ' qq⽰fW+*b,"u9|6 ' $!A #+ƒ=ehK1n>Bx͊ߏmȓ,g=7W^* dNI ?@aߋ@lj}]NB1ix h$$‹F4P4h x)R/ FCM֡Ī\NHMM\RM|N0"cD.غR݅>M34g_Tk ]KѓZ=o<͢%DbډD0ˆ/E,EAȇx)r{(PnH/6t/P/#\sMg%H>Y {ٜ'8!xAn]0Ԛ%ůC3XL.a(EmpQ Exivy(tS.NWuU{ 7TY~8'PܸǗa\qh?F$C&ijjܽc3;ЭGU2z G$@b鷂 {Mɱ >|ŊP Pk`ӧN1z I1,@v9AA-ŎKNhum!fy/?y=_׿꫁f](ĢYra Ns]aQIڌVbjOL yF!aV%_v>4|tTɱKTT8y$M0FЇGdݷu ٽ{$&@/v9h 9 1VFa CSn< A? "f͚Ŧ*a/ưo LQV. c:f۷֭[Yov@odG<ࠡ!!lvz8c;L&cCr9 MƆObWNs=hsD?22`rk UI* fX_CQWש+7!4GX \z='C t]~*9`-,,4Lr0Z`_ MjM}I#qmNP4E3  yNjL͍ MMF0_ڕ/K_|VV?Ld>r:pl?L|0oF {PɱfJ\\9~8{6¤y o߂ɧ%777oX*|sf^aYVj,d6fSjq]l7Qh>=~FSc/{Μ9W\qct111^hd8d#klVSxdJDwer,sJM얰n7 h%,)));wCQ[x/,~1T[~JFݛU AC@R/^,ٴnW~Pg9$co{pdWr8q֭[N'@c|Xj6[Rziz_gŴ-PӮ5׹'%% vir;sdj+)FsD<էʊݮ6 EzG&Еdxxipm4$E4]>QrȡƳw}703/ʪz;wl#&.82&.<2&,"JAn1YF[5\PPPwo1<6xp@+9^/_|ٲegԜܼ>9=2c;쏟l@Va"HBi2ii;3c؅c3pB$#r֎8''';;{4\P H4COWd4,kݺuVǽѼ-r֞n׮]Rst9Ν;i'MDqqqS}ȑEfyܴ4D1d46ިV9;;?̲X}'yƃYYYG/ Xb:n2_]]]WW7 tn(,RiYYYӦ FNZj˖-SXA&^}UT)~HHHllӕ$ɸ8{S8wW 999fJXle^x]NF}VWA777or[M`B_;Fu pڵWMk֬a 1wփjoH %yQ#u...NNN}kNa"A,R455ͭo>DzLT:d4Fr<( ccckjjZ]+((hӦM<4pt:X+nP(Q*ܠgRXXxJ5AaC= vϜ렑 @ss={\h>>?o޼\P0[P===mmm߿-l6[. {#UWSVfSRR+** Ν;7.w2ϏΝ۷L ѼLgP(6leeeGzN E"QHHҥK^f:::t8~~~2̱ONGa0+*****|4IP̝;7222&&vvfhD?O(ڈ frOXXXbb"zfQ EjV bQApxm,,०9\fr8 bۯSI qSR-Ƽ̼pZ >hh}E S}E,K=v ( #+ҨTssc-'u:\:ܒ]SRxmbIY'|ƞӧ++GS̹/bk^{$}LRZYiJ!\\hjog9ȱCB5SrUSw{P|;:.e0qhƼ\Xh1}QM@xgEN^42m'c:X,,%SZ-,f39X|}пg*]w;w^pugDR|YuQyȈ(F~{r7? {n7/''sW7%$XO*>t-uu<`]w.Rd:gO#&'({ӟ~pݧokh2oԤ+xNNfqljW{;H׉.muGynj!oܴkεStrϞuܼ NbRm)9W_Ffk7o%+}f/9fkZ(i9J&x<6'GtJ"پ݈|rk3MI!xd:; Xb1;8%H Ep\M%}7諒#G(tn^VgII^/\+y5~9Go7)% 2X~9cOϿ]BoxxNWgu~?X3g2.[ݹkǴs|*bkyǎ;tΎ_+ */V=PUUYwh'~ܿf%$NL(%%O`١q>3{vhBɩ<7u.<9_ ;f3\Zjo`I$}h16!G7 >P$i|<Э,T2;(T2%0WM.&K*%Hjk3;GOpg[T=[rpښ5M\r0 0|Kz}Ҋ=,3즪 GGF$ >ߴaK{3|99{W^c{S#NU;0&;,Cd spiNۗlϖ-幹9;w~mf{RVgz{-F̏x" 2Rh'n߷ ]Y |4@&!TFӗiJ%\\aI$@i a0@QdXzxDHd~,R>GӖzN\Օh*/55@xJ@(67Ŗz&wxg[Uk֬řPg8jɺu1; 4>y?HM- UUUs왻;:ĘT00XΎ} NLå K4l42YcW>yE6I*bc-]}R, eŋ9|uyy]C^@^@&<>6˾URT{;[,X% 2 l~Z}lb)j9^BC=CB9932*{zu/*iƆÜbLC%BܮX`njb<+#m|cNNS=ʕoAf"?;H>7\TuKTW嗩K֮}<4VV~$ƍ!b77#G|A`Κ˙rD? uBC# 2jIDAT-;{Ň(;`f}"vw!{ƞ!TvwڮQ`B=E``ښ5vnIk*bDF]7<7<|֭vE.^l@Rz(MQ<xz~9 T*K`prf35ga<C#ﻏp.^.*-.fX~A@ѣ3XDp:U4\.,߿yȅ'6-4c{S-#apӃ,i[LpzxnkJn#9u:͛Ce%lKnԑ92ߢR 7 `g3ZDIIwCD˽ *=]p㏭#M55;w@ʕ#vy$ESԱ>XyTWD.^T}ζ6ۯn᫯ǘ/سysuQ3i s+EE6qV:7 [:ژ[>d$侾p!d[ ]]hB `&!g+Z溺Qql˥;:,uu֍Fc.gRnCX~|x@TϜ/Zr՛oκ9&nxns~{1?I"%\lWߦ&=YW.]ҵY$)qww+?tS zP& Zk #!˟WmI']dܓb<@?δ^?HXr97>|*X ''rlP#&Mf-vp0a"G|VK%^ A쓒mm0t##Q^ACr}L A!ȭ6 ! r 80: (r2}@%C+A9AACA9AACA9AACAPAEAAPAEAA~1}  hAdgŸh* 2m0 _hAdPPP)!KWBIENDB`yoshimi-2.3.3.3/doc/yoshimi_user_guide/volume/volume.html000066400000000000000000000030701475757676000235360ustar00rootroot00000000000000 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.3.3/doc/yoshimi_user_guide/wave/000077500000000000000000000000001475757676000207745ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/wave/images/000077500000000000000000000000001475757676000222415ustar00rootroot00000000000000yoshimi-2.3.3.3/doc/yoshimi_user_guide/wave/images/wave.png000066400000000000000000001535021475757676000237170ustar00rootroot00000000000000PNG  IHDRr^lJiCCPICC profile(}=H@_JT !CdqU(BP+`r4iIR\ׂUg]\AIEJ_Rhq?{ܽvif hed)1_X df6$)u_<ܟcH- I0, My8*J|N𪈎'_^z2%Cy읧{vpyo}s!ķNΧ]e旴jr2=zyׁ3B[ѱs7:qQΟG iz_W_lMtS2S.\ By7OZni^^Co}@_ń;~Y>^yM/*UP_>]3_΍jd۹lOW^Q-ߒ ʜmYg2iܠm=6VMcQZg^h?_ .,H%SFx! Ydl:9Z?p^VN)S !~vqZmn\vWTRQTRq!V3n.Ye~rBئgvKOv? %SٱCxPrұ)J7,Ja_՚|xm%Cʅ ٫7KSu oYL^Mh4R w?`ʂ9juBwɦ[P;%Z>DVh[:UEֻVMcJJ8g׈{Uşe_-\jBQ;F{йе=$lN7*F_C#3ӮO<0FR+Mac{Cw$CVN^Wme4͇Y낰0zh>V륝Δ?ViqI-793.|}sXt)lg=֒W!J%?tԐ^%+;}>j~E+?_44f1󿮋bj[-z'h(|=JOc=K6r=~Ȍiqu]4Y7~tbL) qZyǣo !6~w\KFu %jgwK^ѪjIqC%I:{1N(. W)b{wkW rɔJ_ouې\U\R};QTCuqA~B/=)YwV:"x)?l>hjv?:ڽ="͘6Gdѹ'0BY!}M/Li !v䠞ےs J0oܹuGv {[#%esW MVo7)ǂBoY7eү~geb̹ѨMs__V7.|أaK3bPΔWV>rBQV]Q:2ΎWs1#w}G |v {(?vIdV:Q"B-!ON#[dR?aJy>>W}pcwPxZ,&ܢ)k.(.4c"@!ZkXk=pBhp҅7E&S?ܿiYy%O\t0-F)46|׺G39tNw|@ېΏiuhi׊9 {,9]3tޢO !V}Wu;j^[9!'׬͆.ooc{o-YWQBtnaAHXX\ٽyƤ؁݅/m֕B!DHeeuZV^ZV|\j~ɒ8 0$ ^yB*z"%}ׁʟN|UK<mhVe_r嬜B!-)YӮzw)Ol).͵ Z?ЮmPjҲ?-z"zEEx5fkefᙏ !2._H*mdJ%&/ JHi~vK7N|[~=ώ}g[95rpw!ġ ˕Yۙb:ÿ́զȒ)g/f 8x﯑$J +,y餣{[綵Zn rYEUrj|mLT{>:u[m^o)*B肌 )[bd48{`ЅnzB3z e hf]Fv^s]F~TNW7d;,vZ!0ڸd%N~}@|aɳOjeOO[} ԿwFD7Yɔ*1uJj}²͒RY>|@'.F>_Tw  ((.?xboMεT*w %+k4j$Q Z<4oǒ3 JүW(CuUSeYvm}Zy2bP~:)+}S5t?Lmn?=;ZdwC'.V 'S2Od*{fߝC1:[,[y+\/5-+y5gyK֡=cDKu(5g Wm<<#~iћ/5SS:MZwn/!ؘ.!JRB؟rX 5em|kfEqIdvkjd+ 4;Fdnޓ,/,3;F|rWZVBx e1Fl{~-;ήԲ lΖn"8Ų=_=̗N@yo45n3ìѩ^.]Bl~bġzɰZ!8XOjeʅl%uv#ctOflsi ;hiLsݷX@Ӯ>-vFު.usff_h_.{T**}4T|@nvJɲ6gK'/nƢ&)-[6g.doߗ2og2O,^WUUa]{G rS+EeV:w,^Z\:m,_;^ 2xb-Ať_NM!̅n$}J]uiujc8co%eg !bojTNOkmUz͵Z5~:j4ʕ.!mzwma|;G Ҳ޻nj5.]j5{wܦK_ط"+y%&},$˥BT)*(*B/Ϸ !|Z?(KYy's J#FId0ێeyEK]$II֬6k]翃k/ojcg([u]k[ΏYg=g‚k.;tүܖn_kTmGJ]ZK{?Yg_,Kl' q(]Oժi&Fdfáo6jm|Jʪ׿wq,ޱzi4y=VXi~zW6lIGSk/ԔtjK!v<=}a:2/FiÓ$l48)+bة[k~>=O.5`iwOho>~:jz;9d4Vl$Ɲ6Y2qp=;$/zi5꒲*!ĠanAًo`Ηkfi­M=6eq鍻_<٩R YZmRz~eɎ ˊJ+rrK,Z893-F4d;:3mJGXy>}gKݓfeK[D͹j{_]p+6_-Zq-eX) }~y\ղ6="ukn$ #z_-(+.j: 5ۯ6|'Z~(l+JNӞL̈́٥mhp y9u3w/*WUMz<%hrkxt 9Eťj]h>ňjh;N Nt{jAL~ǩ܂RV)dШUG{kEh_.aya#?x>?:rjqYCxPvʇvxuūejN> g\RcQ}zu ߺ7%ՒJF.4NcG9Iu8^_j5S× Rsp>KW5bB[uasfZ썒itBwfӫufl~vy !ݛCBBzχȲz 6Tg}o߾O?ŋǏ?wZG`۷oͭ0`u񩧞:"===..N1gΜ;h4~7?˗N:`ehӧOxaÆe˖[-˖-+**pB߾}TU۰aCff7Ot}׎lgB̟?۶m{裏Lkܸq۷߰aCuuullYڴi#Yl/^lHZT`gj:c@{a!Dll}ӦM'xB3ھ}{UUU~~oq騨Ci_~)--B$$$Νn߾ 233:Ǐ$)&&fFqΝ/$IݻwtBoo}WyoСC/2&۷oR<$IyyyJp\mT{?4hPxx={fΜyeDR9yݺuᥥ[l1S^Lʹ3hDtILL111Ν999Œ$y{{롡B|̵k !F?˫?988ܹs_._|̙_|Q9m(""W>i&!r_VVO| 2 `0$$$W׳R\\4)n֬YJrPmdYW6l 7oޯk8}+WΚ5LbŊ_oq7ݦMKϙ3JWl⬋'kpnݺtx 44GG0aR(Xڵkٲeo*RRR'vk֬9syZ xJ?}FEE96Cu\ϟ?|9w\#:t8|pAA!iuӥKɓ'W^zyyEDD|GW>s̥K߿~xŋeY3f-R\\!F_8ӘέΞ6mZyy?0k,q0aaaaF ((ᄈWLfߎFQSI.f6X ҶmA>|x߾}V8qrɎr1c|||˕̚5ɓ=JeoӧV----++3 .(駟߾}_}||g IDATwz<ٺuk>}'ӧ'0e#IWUt~+SRR1>:.???++KQXXhq0@>}["iɚ +g~sss?_Z\cEEEo^SN !zթSI&YfΝJQVVٳ+{VF;ӻwo!H!իW{챀W^ysǏߴiӪU[\\\RRV}Q%!DiiӕNp5qqPqɒ%v x'W4hPjj/seffVTT8["iQ VIuaɒ%owJHPPИ1cΞ=ݹso}B3gFEE_>===;;;**SNu.]̝;wٲeG)..1cƂ L;rȁK^xk׮e 4hڴiepFŋB__=zLTjnu )SL*[c VhRլ$K Vp*P[  r%VdJ-'Y0Z )[XN\!g5b%V@Ɠd J-Hk g@ ͔V>STUZ:WdJQh<Ȕ)t:ES~sBBBbbbRR靸8!D,5J^0V> c7o~@nS͙P{5мSdWmuՠCchM&tä́$/q24mh:U"Yxrn%18<7UJøS6C`]MLe_DşX x1+<7m$VTh.YW5O6yJcnriRغYK=e% +k~ik"VV wxl%oNp3* J)Lh<*ZQnmJyBSL,kheNp{~i+[fKZ =9mx4XhQ-Z / -ܨ (8p T<Z~MLI< iy`ɗZFo,S*7АNp ''ijV-"Z+7e{ս9hdVG+wV$KM(q=5X'K!mhuX ]@S^<+Yk%iF[ `W\$Z+7=͹n@CJ+5!N[h¯NHHHLLLJJ2'yiOӳ\J^8VyfO <\}uWͫ=+O]m7\Cch;4rdٰfF۩ l5Oz|k8:wA׌ $7 X :Hci*j`gJn:Vu g;%Z ~Gf2e @k% Jh^[9iZ <w<*%@OH ldJb%P3q$Ӥ|㦭r&Vhl%RXJ4/έZg=%3hՏ(IHJ+eEI4 VȢ!8h': U3Y @i&B3Vr@4o1p; ڼUfRs+ej1@9ZyP)_έTY5M1W8+c %5S h\qJS8(\t!4-QV }hui\z;tγ@IT*N|T_-dz'..N=[ *O p!Ɲ !6olQZQ&+7Ϟ'6m[Xs`l(:T14C[PsП,2ih[iCs3ŊJk=4wEX6|pզ-"GJYڬ4J݈fm=\k&Z [Y{s8ns'K[4A$U+ILi& pNtȔ4)h@ID눕\inJD@9hűd @Fd  T' rH 9.1[к\p5Ss;Jd`,DIFJ$<%V ,PZADsh_N` MR+ѱb`{}(Zu~}K[o m]$W%i*c//-Z:bpi.J$.K/ Y%PQSq"xX MsdϼehZmWv+gU2Zˬ.͉'`%h Q@ +[IMhL+]75 X]I@tq$Yҝ?_,nB2st勦*/m焄Ĥ$;qqqBy9Ӊk\Œb~6"X8Vyf5jh^H^y2m mCmuՠjšcJи4] 85Yv~u{Cg'o-s']ٲ?@oqZf ŋLYrA?YO.)sEoq!7lzi*ҳ`|olY 'S6J/Cz+)2%@XJ[-}_i,kYCu3̱ v /pL aO$ PI4Fk%Q=- 7!s 5͓7inJ' ʃ2&;Z+]eD~qsXيeK(4hP7W7B}el{ž@gR+Z+!Y6c%-R7(-4Y6Wd@ Xn%[J  ʖ +t VzVl]DZK@2p%xrq^@=w@l}jwɗ?F%N& ¬;nq8)M}Qel4hcP@)XCZjmd!zXIH^0X hN@,P)4+.֙&mz  3!PP@I@4(P)+ ͔JJJp S Z J VJ2%b%@ Qt勦*/m焄Ĥ$;qqqBypb/>>ij`򂱦XRͫ=+O]m7\Cch 5q v/qP*,ƲCch-C'84_ y@+Gi2%+JzJ@2)pn%4m$PpSV\Jh@I@44P)+ ͔JJ%;@\) <@\(X pA J V@= 7hXV\J2%܈J M Z b%ZN[h¯NHHHLLLJJ2\6olQ㩁<W?{*RWLJ@/)))apKSxlt}tɷ'W^pK`˽e0 siZ_h4!İa?5dh˗/:uJBu]?7 Z DEEUWW?۷o7nk#**%Z|C={ˋ%$$0r3g$V 5I C@@)kKԡC^x!00JOOWڵ{7'O\tiEEZ>}AKii?w ! äI6l >}zjjjFFԩSG%8vا~ZUURf̘o>8gey2))>3:ԩ$&&2BIIIsn%ܘN<÷v0@#}J2e]wՐ?~ӦM+啓3rX?BjʕO<z'|"(++B,^ zY-[f݂/*oo4"##L={QF/?~߾}FcyyV\CiT/ZgΝ׭[`>Y~ue&+qɓ/=_|3gfΜ9|0 h󣢢|UVw}B;vlݺU劊m !w~Tϟ ʕ+Jcz ^ZZjo4.h߾}QQ$I'Nٳg߾}jԌjԩSzܹ⮻z۴ic=@מ3 n7;;[+WܲeKyy3<4K O>mڴUb~]v-]488xСY^֭[+++̙{!^.]$XOiGs),,*4LΝ;t+#F޽KIIYjgϞB߇>xҥK?SY###}]EȲ<$Z-T*0+xl<;@ϑk׮zgSoϞ='LЌk#ZT$ĉ/XsA_۹s~M9hȨT6LZ mju߭X)-Fw߿cǎ6m,Yٳ\؅8x`HHH=W޷w>:|gt'۷o饗x㍧~oꫯΝks6'zJA())95OBg<_YYw)kkT$k)=!z2v _4 ʙ^2+,N:ӡC!ĉ?3N7::[U޽mNZw+ѷTj!"ceة+9z^1BYgMƘGyD1xM6KaaaB/~',˲~=sަBCCΝ;|{1 IDAT^:o<ִZmܸqͅK_ѡt|Otȑ-jB_N<_m].)2Fq/B.0HUB/!EUv`0w߿~`X~}EERDvBJKK5ZE?s PN4f~uJokoܲe… -[bs5U m0ʄjj`o&bJLJB4ޔ)Ӌ{ B.fҔ$[~w5zIEj/lСCO05.^N3f̘1c=kך,M xr i[|Bg[HY dFS^spؾC?HB8q|Ƕ.]BTUU-[lҤIGզ*2;~}_Ѡ4kkee=wܦNNNB 0֭[WYYns[Q ҳ\pkG1ƍgϞ/rƌ6oSLLG}TZZ/tUIRZmDoB())IRdJmiƃȲ((.+ιٶ]@nz?ޣ?طW{~7qm1i(H'T*,!DDxPuօwe"%;;;Gɔ.)2}_@uyѨ/*˼z҅sՕ9kV~YR\ܶm[әiC۽[ɔ:]Ïk Z/ !: X鉜BlٲH]xO▨ ׌4_Ϟ=,Ecu>UEZU#voqU/*ՑU] ݤ}rI?rHB?XhXihZd4994b%\fޮرի ޘz뭷zV8 7]ӷo'zJmN;+ AU*uEAwZTZy@QjZaWyyiG=lKS 222 q&:]8]7{OV;Xx𬫅jpҮkV*owGސ[ ҅>7g_|6mݻwc:Vk0?*G޽{[yK"S)|UG/* ^ZVVkB^^jVRTV'}F133:>At;2J^7s]h,eY6e'"by8 /y;/^>}oCN宮0aj v\Y5jrAnYiVղ(`UtrVh<}#8&?Z'wqƍi0 ;wy`-YdَWtKrO"B+K| kjS5jABkR/ m.Jv~~!r//yY3.ɲ\񎝻 ]RF'"b"22rݺuX~]4dׯW5koXn]}Wuue77$?K=sXE膋{ϝ;w7O<ŻMN+0V RVjZBժ(WW  ɨ81.liΦe<2\U**DYjFRګJ,FJBTF̓.ge!+mL9r_jժ7?ĉΝm3yW_h駟^}Փ'OM8 8q_tұc !n+?~<00[pESk tmx!ruuu P1 B_oQV hTU~~B M79~ܙKYw|ij'Rbȑ#7mtŨ(^y?\իWvm?Z'O 2eoj*.ژf͚5k֬Q>-zG/_SO 4,Ϙ1㦛nRfg}gϞ򘘘3gFDDcJ;s9t/^>Ҫ?aÆ W\}!6l0x`SLܵkׇ~|_~?Opp[o?/_]x⧞zJ)ӦM3fLJ:u/矿t{'8vѣ{}ʕO?^ԩ?n_[n QrSZ')S-b jQ;_B^_]]P 7~^ZJ J2Hj}UUk)(}}}###ϛ7חʙTBΝ;O:t^9qDzzzHHNNNRRҡC.]ZT ! szVTV !*ZR:$4TQXXsnJeKF65]%%% . ;wWڼg^xᅏ?WUU͜9󩧞z׬Yc yEq |v]RE(b4XcŞh,?KkQ#-5błXJ*v?\x)'>{>3<̦MA,[,33[199YK  M jȥ"!e29I!$APIbQ4A \&ɄBHOOOCi]N]PiMGkk -Ν;7xઇckkKD֭ #P^^^rrY8U}}~j4M_|7gΝ⊋,X`jjbMנjh;B"##ҥKIII, WaBwHW^XrMP-Ut̘17oތv5JL*;w'MS:ZMBzss~ڴifڻwNMCh"UЇ57B{IZbDb`"000XEX$I BbH" |Paagg7xۧ51ҥK}Y~}NN|QQQ:|EߐȮT&A:rBP8 ((ͽm[6‹3X$IA B!Wh3tTuPЃJKK:QGG)STM[LOOwDU ٳgSS bllbŊ .zǧ!MԩS?~㤤einj2vTXb|4Mu!$( $~%O(UVPSDPEi-ȭuvv>z˗/ 4/^zȑ Piij{2dȵkפRi||R#RJ᭜ XtԩSN_p8m%v!/_vv,--  ˗/l6T}<ކOjժO?4$$dĉzl̘1AAAAAA_ՅQQT}@ uf=ah>7=3`ngϪI4HrA%uA>ѸL۷sݻTųʾk}}}77KVVV" ar$I,..Fuޝ ||…ܕj_(kkk ֮]ۧO[ MAQqhB>}zԩC?~}TY߿hѢSV|A-_|wƁ%wwIcI!J%b1 "~:l="Y,EQ$En^*V1q,[l„ 9EQxPО={*RaÆUMVU6mZLL yf\4Qܹsx<w_ 1cL&6lX2I*{gddojqڅRkdt L,؜Ĵ,F)7R%BP*شֺ7!jQZf!C_~ԨQl6[&[fͺuuFɓ')b'lmmcccXUx^^^=}駟FY :88` u)UHI*:::9sfzzz{6m~3g5jA!d\ӦMfh$VٳgԩS}E54?ӫWT{Ŋ{d2ѣ+W>}: ʼnD"M&Mz^}F&S2")Jf4M!߭ՔJT+s[(QTT]"cccAݻwJJJ6mBCC/^u֛7o޺u  >|cccO2-eVF>G@_O"IPX\RZQ^&Wf?{NjQZr+Y,.Zkk3f,^V"V^?;tя?aV۷˫=tϟ|8Bl2@SQQallIJxIIjiAGGƍ6l8{ ]]]3bĈ :thٲe{6lXU- ^|9fL9{lGGGPBB±cǦM3j($Wų]G֮bwyv ,.Œ|>B.()AF ;;;___==֭[gxP㾆QU믱111{fx_5/5jTL3x N2EWWW___f|||dddAAֱ^s ̦Lrԩg~ӻwI IJW߀X \*icݻwoPiS8pGZZZ~Wt >}`W `RMFoJySUw!U놇2n~uU\Xo`h` fHP*"P.;!WҢZ6D!#Cd```bbbzz:M Mye5$HQСCoݺUPPP4CCC__߷|n%w>}t?;j(/^fth{ՆVVVEEEo,Q IDAT^jÇChŰ NLLEѴR$RzR 8%&,,… _xUdaa#333?,..n߾=^h&2J BP] T0o*'88855DPyzz~gMnBV"꾔; qE iTP*i%hS$9nܸ&.u3iaaъLIIC)zzz۷wV*={T(uIi} ߥOV2 9ydݻvMG ju1y[>}ZP`']v~)>'--m޼ywhw|TTT~Z$% Zu`,,,vUW铇VfM2jPH(BfRySf*2`CRn DBٓo[X{Y۶WҌ_YM>AC P*?<]#b:t蠭% ڕ-j `4LP'OFFF4Hf?>B&&&&&&1h9FVeެZΤI._ݖY>OWWwp02 V"bR4AthVC {ׅGn%@CD+ԔZ΀?Iڵkpp: _hqW0p+r>ޭWkmIov@q=Bofs/^ի,XS2hР-i[E?~Ft+ի a;v qpp;yj]Q7soay.|i<7`BZKPHl`C?Z _|Vl lĔabbe"G5πe|޶4ϗfiK(lXȭ>n,hHzHCV~t. 2g %4W1[j\!sNUZ$w. VV-zr+a2 \!.`]i67ϯ䖀H$/(()!B9,V__>)z*...33S"(JEQ...ꊊ2rfff&&&`r1%$$\z1 z(kk렠 OOwV"ȽnVz}ʕHXR.f\};[uV**s"///=== ǻz{T*B'O2Tkfk`b-$-P(tuuhŝ;wN;9էw{3ssPiIIrrҍ^1х&M{$Y*C PoF]z5fsBy)l6[PzJMZvwW.-ussFGPcH !_e7`"zmZԪMYg:=M{}B{dwlr\b&==}Ϟ=&My ֮]+HTkf Ü?YzHWF4\0!r} 1NNL&aBg欋=35ѿZtrLYfC᭣^%ktr^ZҰO{n| ݧ߀OBPR*I.^y#asgb;m۶|J(p+h7#>w6<Пkb"IK*" 1!B21kae輬a?䓖gO;8:}ʪ߭{O'6| uY6Z2MǏ_hR7q)z\m0 * KJ%MQΰNCe:9uɢܼViSIሡǦ>WMitT.;_Ft=[ꐆD{ZgnnbZ7wBH29Bvj>dЭ/++5khiܺuKՃh@[Bcƌ)//_|yPPhrJs~]JJAÃ&"$X$@AL,,㰌 {.ryJJJ.]5h ro4⛘-X!.^X%Ittȑ#T~_R7څfG ! JDVZ!01]U|yO_yj͜ač|T0{7BhBFF\8r˄W?!6ѣx;-,+x|1"0)e tڮ]1l7ee999n۷/FK#? &rຕf ڸqjtUjY#Ō>R&vtrM +x|EXEY$EYC+܊~R=*"J6zyu]|EXD, \ Q5VՆv9244Tz…[6hލbAɓ'[†bQ>mlL-ݼyVəֿڻS$4V׵F``7]C\G˗/k݈ɓ''%%X( n%àbޛ[icYUR<+_CJeRRRMiBˬjE JB9,Du ~f]l//ǯ0ݣ'+Ld(6r.DT t !$SSSt5]6}I&nڴI[Y5,QOtttڵkk׮~zqϑ23[6،wjj#F Z;v$$$+J++L8QZ)**Z|ybb'\7-[\r>f?y$##R)MC?j@'''꫷ݻwѢEmڴiΧ^Wn_ttNǗ.]z+++l]\\BBBۦ׭:t@ٙQRH"IIQA$IRſK_~¢H\Ir{R:;;ku[nurrR}j Uz2eJDDŗ_~pbbb>|Ӣt@epzix3DЊ:"233kJNI}fss(,)ݵG@ 4ֽ{_j7]CxҥN:)֭[ܹs-,,Ο? 33k׮Z*))hԨQ6m3gNDD˗sss5#u"?C8T3-G+q>?nܸ#G:88yBhѢ'O|g4Mٳg޽ ?~!CG8tqqqyշ~*A-oW\a;w={_|s~U=G.'M?1ҥKv// VN0L}}}Lw͜9sk֬Q}022r֬Y۷Eq8իWW{ʕ+ݻw7229sfyy9B 6m|Wmڴvjodddkk;oF!^>{54dX.ׄ"IDRr i\4… q́h^dɢERiJJʢE̙_WAAAG]nݹsѣsΝm۶mذƍK%B8֭[뉶thӡ֋ϢH& U-lS9 fst {x"T(zuk}}䷽R%%%0Rҭ[THt%?TVVe˖իW߿o߾8ol6l駟W/MtssKOO owlV\ihhz3gL2-[0 #JE"˗߿'%. W_1 3cƌ/^\xqܹ ޠ7nr +ctttj@NNNSNm۶qss{I׮]Rinكz/Br|߾}GW}P__޽k׮a`' .\~%K7tС?C||/|ŋ+VXxE?~v>|811q͚5 \#ڸ( aҲ\%"B"^)Y,!H Ia3<{TiIJfH!W,[gS+˖-W_}գGjGOuV|O?yf33⯿?kkkv޽՛u_u  2$++AM=ѢTVVFFbyE7qilUM3A0.*j[S2B,~X"cًW~ wo%ܽl:5UnQ Nd^_{dPjj+^[k.H鉷,Qѩӛ}9s/Rҥ ˍpuuծ[ŎIg$$IvҹkG ΜHyH}t\fUŢE͛Ǐ?X0U\.oժU5o>rYtMdd۷U\pZZ}KU#kƁ{i^^*`Ym*,iz:t{n: |||?~ִj=z~㩪%WXQ^B ( u%o)!{g 8F=0 bA$EN&I\ 4MM3RT(x3 }u+qppk ,Wݻ XB5Uw޷oRRR֬Yo<ȚzE0aJ}cGq]cva?rt,`Eo.>YWqL!$76/.J461z[-,3jgJVSLi߾}U˶}֭[_pU__3<<\ ޹sGu$WІ&%%ݾ}{Ϟ=^rӧ\n\\H$ڳgɓW\s$۞(CU B\!D cHd!F bH$,-.š\]ZiC IDAT>BԾVis}=ӑǏ~pޅS * ,; ZIkYޫ#!*,  6t- ArRPD"W6N 4u'O sP(='Oܵk۷O>aC;::&k58E'**ȑ#׮]{&vLl!$/.Q͌P$գg^4ipnСC ۑ-X`!ӧӧO߻w/'tQPDDD>|ԩSɩ|B]u&.u5̙3}… 8p`#k,͛~yĨԔ)S mhh 8DMeܹ*ip8kxx3d2ٰa8g=}322~v}j2veRNԫ\BAa¡ ЏMQE`F"ˤҒZ? z{{|RA)&MJݻw_`{֥7n܈ܹILMMD]uMRnF6$Iix_dg[rR.KjmUI)xu VuҥKׯ_?mڴ˗7̙jժ͛7N޳gO _I_*Çgã!.)"RħT*i;HEΒIӌT*Tҟ)rPՄPD\MLUӲ֬бsv/ĭn-KK_"S4#@$AP) " - gDUXX#,?//LF={#,~ +U3lvK 4HS郰ջw>}ܼyk1TI0w2kF#Z~?3333--oڴi755533۷2e 7۷o?z;w=pk-Z0jԨ˗/߿_u?<))ٳg[/۶m\=G(JoZK,qqqxbTTkMqww/-}[III>}T}1 0tH{:uᄅ'={vK.5661cԅ׬Y_4 [C۷'$$U!dmݪ8ԺM@!ID+$M1.ޤZ"( 0 L&f՞ѣG/X@GGgΝׯ߷o_xxRtqq$K =x={;wܱcǺTb:ujr9,, vu+7no32 /T&HKBj}=۹'a^M,OyرZJ-B?uTwUjիNAv">p@_T5N߿5ϏlOk߾+Vk^];pTJ#RFdHп R,[18`V5ke]>-^6ή_{CN5ױ7)/]d)ia"qu(d$W($quz Y,͞1cyjJՏt|󍑑9US Klll2uC A2 ӻwo777P(ކ[ٔI_m=B{fʺſ=-[j=dll<{ٳgNĜ9s̙zs Ɖ'(\Ö{u$GURJø\n5mS m#:}bΟ?K.5TmjoC;)SUxj[XXTEv;Uӗ4?[l[lD"R QBbXU'(++ظ#B;;ɦm ,2=wldh9IRh0riLX(抄|j "&LP駟g")Zp… _Jk'?N8٧YjbiIʣU3}D LdmoP[Yߛ;4MwС;å~C=zpW\2chSxha(L^Z~񲲒w'JEY u<{osK 2˘ѱ͸5׿ NM\)1m 2 T("B %-JJ+J_z8!666S1vرc_TIU KD"EQ8EP?UKC7AAAwR{}/f!Tӌ4[ 4*C%&&F.WL9i$lҖ.]2QE9GW_T"E:bQ"'/~](rܦMqpQTY;^{y۱WU1ZrAz VKڵkiQIUhkgZ?].HP;}"eXrUTȤ҄S<@ꆄ*mFw~4\ڃjfffOvVQTddd,)4-W:,fH*WQ}̛i߾-njxbZ^pv*t]ƙ+++m0D]{!:u N//w8?|rMGWO",`H(H짏rBf{{{j4o؞87sȖ?gGCc.;!)RPښ/;}-bWzh.YWWIAcǎՕTro#{NΈ JeRi΋*J#Z׺%WWI8?ĘKCrhc]DQ㿍jmkU:H"2u j6:99A!MGWU[ Jzj&_mGS]K޽ě:ƅie:XE iTP*(){}J tuuA\.wz?Qba>qL'C{3Zedr>?Ufl/I7n;_uņQtd*).:w8613ptIEy)^ǻDtDH_>^rbZi_R Mj ʗMѺ[YܥP(|>BH&$?7025P,f_^QZ"~S __-U<<<&Ɲ;aPpV.^ֶ4#Wdg<-/o oozyxxL-;w%1dmC/{G``ӟ _(ª'I}%,Ν; 4Qq#+y,5(\[$U nzҤIг؎iѢEk׮5PV-URo;Ioj``p]{.E:fw]#K+ǎeKKJԍ.4nd]]kk&Vqvv^bERRҭ[glllbbҮ]Z託\PPQQQ! '~ʕGMOO SJ%.NYUm׮ݤI8톚c _V՚(__k&&&[&~ &fΝGiHy[EbqJJJvvv] h۶o&LhTVV^zU mC%'$$ԵI]v nιw'@sRVVvڵgϞ B\(CCC77JvC?~| BM8 r!/>_zUx4d-ڞʎI >t陟_PP 4zzz-p3gllfFj\뛐pUW5b\&Qf@__ť9VpppɪoFеk׮]6vS =@I-e(0+G Jhx>:>q@ Jh~рCGh\%VZʡ4 .Sv?r @e?S}KCA45e.S՟YV5Ppp,! B@iiB>N4] ӣ@! BZp+QpAjeȑ/^P;nܸoFHHL&{n%(J ܾ};~Mm@9zWϟ?%B@U6nܘP(lll!M١CÇM>ڵkdɒ%nݺ>Bhڵ[F(@,[z}srcǎEFF~}kkPg\}bccov'N8vҥKʶlٲc{{oܸƟrpp7n\aaE[Ʃ֯_AӴH$j͛7;99ƍ/nܸq5ab={Vl`` B]GGK.!OO[n!RSS]]]B!!!vDnݺa) S"IаYԟ3~]vݾ}ӪC:::/kU%AzA4VKJ??z_[ )fff82&&qB<==oߞӺu .PoߞT*E"nC3.:u|7|cdddnn^^^!fffK.]~\.733[|yr~ݻE"EQk%;פ59uT?_XW^_KKK=<*4r+5[Vj&ܹ3** !!p+p+Zv'Mi&fPPP3CBBd2B(::zs  4saFEaa;hNKKSsl6Bٳ/1FDDRn%Kyy9$:-̙Zp3g8k.ggg.K%KB7n $oYȑ#ujG_yxxL8cǎ^^^Wwތkb3wŋ;;;cs֭lMN+**G$xǏ۷{ @x0 NdXl6{ƌ 0z ܹ¨(uJ ƍkUs/^/UG'L0a„fn6L[9zρp作wJޱR~fnU C-^2QSljUV5O{\Ҩa>pR󢕚8oi ǎkOa~~~s#@𞹕 :JZAAAU5/2..p„ [neI[YMܹsgTTBC%-٧lGիW?|pǎk׮}.V>%B)))}]vBwn9=)B!nqq1k!=)U0 SE i*om-A"^z*,,J\.4JóׯGlllXX̙3Bsm9dhϲ$ysnܸp޼y+Vh9^/\677$p+Ss#Guq{b&jJn.djPZ# c(~~~ء,**:vXU JwLppp\rqq& JsN'̟?& ݲw!iwp+0*J(U p+ zR;Z?>R|Gl; n%[ \F2oVh`ճzVs+a [ Imժ[ VoUĝ;wFEE!|>\@g}K/|[GΪUjyʕ@! gC 00PG]6}I&nڴ T̐L>}ܹsBaDD05O޻wĉ|{]V6X ),,ܱcGxxM]۷lٳg/^Pܳgϑ#G.^X}8oX )//p8!$T"##E"ќ9sB .Br|NnxsN9`t>>>mڴ8qbNggg?dmmiӦ.^o+yfͺwG}ԢE \j͍ׯ_h47o&B{=O/ ߭-h^dի;vxӧ+= !޹ T},//Ǐ]̙3h+j5ww!CYZZ޾}ܜAQ˲UaÆ[nҥ˝;wO^\\6 WW׊zMX䬬 5M~~%322!=z9sJeổ'v]n[YanJfff^;v޼y%Y~糲BCC---###={yf89r$Vt5V B3=!xM !ay @l+*fͤ5AB!P;ryې_(0}gR{B !AB^tl&' B _Oպ\I:=fR{B !AB^ yFa&* l IDATB u ]w~f.8`si̤V5AB!zJݙ;+R[+ !ABYnke-SQQOXrk%[ FVJ@[ !YXXT:\XXXbb"0nnns_Ϝ9s߾}w^p!JZ'**jРAEk...nnnCϺwNѣ@ʕ+=<<&Lo={6&&㸢"={,BZnmnno1pBm%i4ssǏB9qPfH/(J߿n:;;/!ҥK%r1BHrrr||/!Ɔ_rL򜜜S>}W:Js}~eYΝ;NNN|Ahhʕ+K=kΜ9 ,"9vy͘1xƍ<?o yU;/,,=;woo{ҤIƏ?~O ooݺUwJ.;/(;rlРmڴYn]ف􂭕`h+j^muvBr\U@[ `uq'OLKK3h+LňW:ݹ4*SG۵k5"ԩSUIƑաxѢE-[477wqq7nÇR)EQsիEQ׮][+:7nٲeR>իѽ{D6mI]a'8]r?pe1c8p`͚5=!D"XXX,Zh׮]L```;~Ll09~v@@jo~BT*?ovmSOli&E <;;;{]ovƺJ  \z5##篿ϳ/{U[giċF0]>\PDDDhhVr|.׶Sccr;Y`mJ0|hLt0ywh0p5`Ç+JFSg1"}=Jn3ƘbX'NpD m%@]"ˏ))kİ+a܍P!aޮsRhh0][VjCvm% Pz5V%H$33 tܹK.R4Ju8aXOӴM5Jje˖tJ=jZmbbbbb֭[6PVV֏?sfa3?gGYU*@h+ێ;bcc,q\\\w}7lذv;кu뒒 MygZoO !][iVT+VrʬbMwK%iZ&BrrrJׯ߀(30|M!%M$PNdvxtXrJƏEhl}WL|~vޔiB˲I//;gs9;uTFFo]i0̢E<ع !ϝ\-āӌ5Jr|Y[;'WOe2ۯTFt͚{7>T۷eeeݾ}e}7. sj,,C|n;vpC";'7xbGG'BH~aqn~aaj !R¬W>m~bÄx>'&&Mᅴ٣k4vNOn q7H[ `yyyc>.n2ŐSW}Ta&gH/Ҳ,EQEil^*U"iқ8ȑ# Ô;PZZZfff-(n:9aHU˿-5s1od*[l)l&!$|jffVPT4)ڕK2J$RD*F,(*&܏d2G>-''ҥKnݺFߗHUHh_L@h+ZNKKK8PT?=L0)Y{޸rуR -R -HRoiWkllFyKyRqB juj`0( 9@ -iD B8qBۓbO_BHrZGMSH$%咖*F0]53_xQjHKN7u;Uj MK$\!9Yd2$$P( ~ !ABe!֭[ E>5[ Tjkެߠaβ̿;%n\%JjZ.6..@O>kӝPkei>rrv&fg}FBB¯z޽bggN4ISSS'NX(]l۶Ν;yyy666ޓ&Mk]ӷo~͜771c :TDXprr 4iT*+D|1 ,)BssS!Yx&"Y`&Y D|1 _!+V`I[pb*V D| DdVW D| XQ| X+"b+]݌# <]zeЛ%f o(B4%iuGPDZ,[X0iӦ7UJ$6g|ׯ^6@ZJժUG-((ԩWbb}C[Q^+0KVaرCq9smFCX-j,˲qؚZ=")Bc6??@ݿmӦM<==eeҁ288888… w1[d?2 ,sΕ+WNWW_}'ܼyS>/ܽ{wԩ[nJ[ԻwoaF3~ӧb Zt?~hDJJJ"k׮_~&!!Ax>dѢE2짟~ڵkרQʩrssOBȼy{ů***jҤI+V|1 ,)BEs+.BsE!zLsE!zsEŠW T_KXDVlsS!+*V`&+*Q(+"bBWUix9ٽs9zn?9c(i jiYwVj4ڢWypNv?k޼y%Kif瑦8mQtYw[B4ib@͛7oܸի۷o[[[7N߄W޽{ԩ:tJ}aaa_9&$$B?>n8Z;sLEޱcDz f@u߿ҲeoVKKKݻwtϯ˗/ {Kj~ߐ!㸸y(fssEŠWB /)bBWlsSUb^J+V D|VoUdEKV3ܼaÆ'}Uߠ=[g-!EC4@|']T)(R&&(*R)r\[٧O-X[[[XX4:=]~_Em%㸍7e:sL޽{n+Vڵ }9s믿&j(߰KUP(sb0b^Q!+ZR-b@Ŗ;}+l+ꉯrCز!Vl[ŏ/1!"+V D$](ӧO_tգ] _?mEjZcerZjYV[f(hmJ2XQGuwG&u޽܁BBBVZrpFS Toʕ+˗/(ޤI&NjժW.Ydƍ~܂Ђ_bň#z%>g/DFFn߾ҥKV̘1ƍKOO/KtttZZȑ#}nQQT*l|夤$www!E-ZhȐ! +W$8::xlmmu/**mŌb.}+(%">_`I[n[LrCXWOdŖoŖoŖ>[U4D| dK3WǪ|*m۸v;6*U~^(ZT;*E4|r"8;;kQTܠ&L4Pmi+_xhѢ}~l`FXYY4ݤI6mܻwӧ)Ow^;oܸWNRRRftoo5--SR7^+gBȨQlll}zFFhqq1)qV}}~kΝ;;/!...F֭[K$Vװa3lݺu(fsŠWVCW^[Q^+0g[Q^+ꉬ؊BXXQ|K8Dd 5ɢr4glpppXXO!968G![7_{N.(gYeY-˲Zqܣ/-,ׯm۶-\p@gn ̙3iiiᄐ{O͛'JsrrBCC !666{0M֮];ׯBt 5jԨQ9sN04uToo͛+ʫWBzWZuAamժ3g,--Gm@4iҤA{x"!ãqz,_\պJYf;b:tÇ׮]{…7nB6lWbXR|1WVsE!z/f,,B*f/把A&X_!+%(D_¯Ȋ(DȊxWp1X+WŎ;%0>S-VwOkND8eYar3_<{8~NVfɄ: 0ҁ-ZhѢjJmӧOK$o[y&^sOHHu떥G޽ǎ[#@zׯ_|Y4mڴ_~dРAf{utt2dԩSqoF6lg.Rv۳gLcǎ) \>qDM Pl~L&:{ӄ &OobXR|1W"Q_!Y D|1 /f,P +V D/"b+ZRߪ X+"b+ W`&"+V}Y!"+V8Dd UZH$%KKHxų(!=EQ0`_RtҥK.-y9oS TJ& 焮V^J=P(7KAAAL;v숍,Ɇn.u2@EO7] yyy[nMKKEQmڴ 2Й9sdeemذTqRVT{{ 0 sڵׯzJV-D"177oРAΝvJqrr UTh4,iֶUm%@Jݺu֭|mhj0h#=Z"H$BH.]>ڶn rFB !!&jժ={ٳ*;>X !ABe!_7oԩS/\6k֬ӧ/^?Z^tgΜW_ݿ|~;-ˊ+͛TP̘1O !G[B֮]{Ѫ/v͚5k^|'f͚_i{6m5͛ !Rf͚+W:99ϝ;wǎfffO??ٳw^͚5++˝:u:C&qqB˗/}}}򜜜!O c̙**77m۶ϟ?v@\\^;v뛐H믿ruS[+LBՆ(;888q?svv&<{lq7rHWWWBȲe6o޼aV۲eE59s,Xs…˖-h4NNN}LNVXGE[ P'?~Rw͚54M}7/+ P7Lܬ7NyxӇf|ֵ S [ Pc>N2n*SB-,[X2k_{mGò;"\?WFN5`dNVѽ[/}ӏXmL.Z Pcr /widJVvM=}6z6޷h9DZZUT8s,Ε}ީ[ߩ1麠12'FZjbmJO%ZytwjLVFj&Qv(L8Hokݾm%@spt돟[wjЈQxE%ttiHHh9Fvritv[;KgWSs!\ɧ랂H&}S)IKMQtJۗj+};tm_ШU/_ӭBH/53?w U#+5af?܇6ݶs. EcC J9V+M"/ m%@m!s9ܴ Q6u?Jf۱OO:7d۶m@[ P[: bܴc1D[ `Bgu |T{Z朝mم!L&>kT#"""##JT( 8ydr9B !AH= %BQnOɿSk+=lr~β!ƻ wZ^;--ܗ!AB uZJsm%!w:zOKK< !ABeHY*NΖMT߭(cHHB !AH &s{I1q[Y"˅#!ABS|enVE]T;QV~wXѥDB !y=CN}-o]Vf[YY;6nk`BH3/e} .NƮejUѫ{/mtbPa !ABzRuZ-0!dsB|lӊ-G&#f(C-A_uE~KNX0)pقei+Z)+x@B !y CN":5h{˪o4lߨGE}to# !X$R隯g|W.o vYcCVդW#!ABԧ Դl $>5!ރF2܅ 3zҜ̴Y S3^xLK$SBk)ӳQUmi+şIlAB !2Xy, ۖW]}z (p- !ֶ¬TB.7AVde{z.ިP(w8B !AH= Ǯ8=o̱]{[ZBŪ bکs_C%o> @dCarS-73335o'VdŊʎo0`^H n"!AB#)lpWf2ԤgVkaiN};tm_ШU/_k⻕&hJiqͭU~zCO̯CJgɬ#)BF=R;l[+LBxk/۬sɛ/YH֡g+Np5=[+LBnn ҋ;-hs{Kn!;t'ø닭&!=!s$4xM-7-#V}}$xQVX8(gu@/xi!ks t, 6XC3.yR`E[ `_N]W_OK٦ /Qۡw,6+@cw+LBH/8(%Ogl\L7C=${A-˭;iI";Ԫtyѕbk%InWA[ `3|gYƧP(ȿ[//$$ܱổ1t{o,V<*VJ`T8hry\/B!|9Jcڿ h+m%@[ h+d2V^J=P(>300] !ABtHfI.pǏ_DEIHxTXYYxz6ӧk@@{BGlmw-{ʢ'.eJ\T*JeU& !ABR/C}aٲuɯ|cƌwƍjmmaî[bIbJG/_sv|0Q"V^V*;5毿63N2dOIiԭK8t(dT5~ƍeff{4.qaaXZZM0 ӼC[4Z'V Y llMN~5i}AA#lFKIL|lٺ)S͙36z0O$WYcBD"iС*MeFx^|OI(cGӧ/}bV>}Tј1KW`VVVVYb.,,8vɩ:t?OEFrrr8} Zɓ碣/q,r5VB*zm۶%X@RuP7?kӦ{~ڊGJ[[Ô)L!II]ٳOggYǎ~4Mۣ~tPt=ϐ!}5f?Z)13zy5zn̜'[{two4apTjf&mݺŃ4prss-EZ __ZYV=jٲyP.^CϞ..؇Wޙ;wJGw[~K=ߓC%dffo٭[FPu-V׊×/q$/|4[jE[Y)g?~&?˫ٓ:thSjI?V}CQ?K"nbܡΎkk+77YY9IF!!S6mx⹇EEE)-ih-#G_նmm[]rڴ廹~DS8|&@.m%^S@O i+zJ0N[SmeLL666"OWWL| 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.3.3/doc/yoshimi_user_guide/yoshimi_cli.html000066400000000000000000000252361475757676000232400ustar00rootroot00000000000000 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.3.3/non-install_README000066400000000000000000000006371475757676000165750ustar00rootroot00000000000000Once 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.3.3/presets/000077500000000000000000000000001475757676000150565ustar00rootroot00000000000000yoshimi-2.3.3.3/presets/Advoice.Padsythn.xpz000066400000000000000000000017241475757676000207700ustar00rootroot00000000000000WMs8 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.3.3/presets/Bubbly.Padsyth.xpz000066400000000000000000000064471475757676000204660ustar00rootroot00000000000000]]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.3.3/presets/ChurchOrgan01.Poscilgen.xpz000066400000000000000000000011021475757676000221010ustar00rootroot00000000000000V]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.3.3/presets/Deep.Presonance.xpz000066400000000000000000000035601475757676000205760ustar00rootroot00000000000000[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.3.3/presets/Delay.Plfoamplitude.xpz000066400000000000000000000007451475757676000214710ustar00rootroot00000000000000S0l.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.3.3/presets/SmoothSaw.Ppadsyth.xpz000066400000000000000000000030321475757676000213360ustar00rootroot00000000000000Y]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.3.3/presets/WahWah1.Peffect.xpz000066400000000000000000000006701475757676000204370ustar00rootroot00000000000000[O0s8p-!!0)k*k-{ +;Ļ_c n6l Ӑ!B75={47Oq>-+Z?_ӫGqj ɋ?[L`2{Qo;Ea}1`/0Ryoshimi-2.3.3.3/presets/alienWah21.Peffect.xpz000066400000000000000000000007031475757676000210670ustar00rootroot00000000000000Tn0}+;DAgP!aJ:Akh1WC${9{ 7& >s CAu5pn<*<&$ (XHyMsپ M4{sHE&v=ϝ5 .#C:S $0cxv \k?Ǖn^;׫>-}`1]dz6QJԪZU܌Uc yoshimi-2.3.3.3/presets/ampenv.Penvamplitude.xpz000066400000000000000000000010201475757676000217140ustar00rootroot00000000000000TMo0+)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.3.3/presets/disty.Peffect.xpz000066400000000000000000000006711475757676000203340ustar00rootroot00000000000000Tn0}+;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.3.3/presets/echo.Peffect.xpz000066400000000000000000000006711475757676000201160ustar00rootroot00000000000000T]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.3.3/presets/phase.Peffect.xpz000066400000000000000000000007551475757676000203030ustar00rootroot00000000000000T]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.3.3/presets/sweep.Penvfrequency.xpz000066400000000000000000000007241475757676000216000ustar00rootroot00000000000000T]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.3.3/presets/systype.Peffect.xpz000066400000000000000000000023271475757676000207200ustar00rootroot00000000000000͚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.3.3/presets/windpipes.Psubsyth.xpz000066400000000000000000000015161475757676000214460ustar00rootroot00000000000000Vr0}+\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.3.3/src/000077500000000000000000000000001475757676000141605ustar00rootroot00000000000000yoshimi-2.3.3.3/src/CLI/000077500000000000000000000000001475757676000145675ustar00rootroot00000000000000yoshimi-2.3.3.3/src/CLI/CmdInterface.cpp000066400000000000000000000100021475757676000176100ustar00rootroot00000000000000/* 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.3.3/src/CLI/CmdInterface.h000066400000000000000000000020731475757676000172660ustar00rootroot00000000000000/* 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.3.3/src/CLI/CmdInterpreter.cpp000066400000000000000000007360761475757676000202450ustar00rootroot00000000000000/* CmdInterpreter.cpp 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 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; } 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")) { 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); 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); // 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); // 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); // point number if (cmd < 0 || cmd >= (pointCount - 1)) 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; return sendNormal(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 { if (dest == 1) name += " Main"; else if (dest == 2) name += " Part"; else name += " Both"; name += " Chan "; int ch = int(readControl(synth, 0, PART::control::midiChannel, TOPLEVEL::section::part1 + partno) + 1); if (ch < 10) name += " "; 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, "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(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 (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; 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; 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, "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)) { 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")) { 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")) { string loadChan; unsigned char ch; if (input.matchnMove(1, "channel")) { ch = string2int127(input); if (ch > 0) { ch -= 1; input.skipChars(); } else ch = chan; loadChan = "channel " + asString(ch + 1); } else { ch = UNUSED; loadChan = "source channel"; } if (ch != UNUSED && ch >= NUM_MIDI_CHANNELS) return Reply{REPLY::range_msg}; 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(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}; } 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}; } 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}; } 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; } }//(End)namespace cli yoshimi-2.3.3.3/src/CLI/CmdInterpreter.h000066400000000000000000000120141475757676000176650ustar00rootroot00000000000000/* 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); 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); 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.3.3/src/CLI/Parser.h000066400000000000000000000202151475757676000161740ustar00rootroot00000000000000/* 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.3.3/src/CMakeLists.txt000066400000000000000000000434741475757676000167340ustar00rootroot00000000000000# # 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.3.3") add_definitions (-DMIN_CONFIG_MAJOR=2) add_definitions (-DMIN_CONFIG_MINOR=3) 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/XMLwrapper.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/YoshiWin.cpp UI/MiscGui.cpp UI/Splash.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.3.3/src/DSP/000077500000000000000000000000001475757676000146065ustar00rootroot00000000000000yoshimi-2.3.3.3/src/DSP/AnalogFilter.cpp000066400000000000000000000342651475757676000176730ustar00rootroot00000000000000/* 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.3.3/src/DSP/AnalogFilter.h000066400000000000000000000071441475757676000173340ustar00rootroot00000000000000/* 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.3.3/src/DSP/FFTwrapper.h000066400000000000000000000323401475757676000170010ustar00rootroot00000000000000/* 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.3.3/src/DSP/Filter.cpp000066400000000000000000000052641475757676000165460ustar00rootroot00000000000000/* 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.3.3/src/DSP/Filter.h000066400000000000000000000046421475757676000162120ustar00rootroot00000000000000/* 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.3.3/src/DSP/Filter_.h000066400000000000000000000030001475757676000163340ustar00rootroot00000000000000/* 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.3.3/src/DSP/FormantFilter.cpp000066400000000000000000000203141475757676000200660ustar00rootroot00000000000000/* 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.3.3/src/DSP/FormantFilter.h000066400000000000000000000046471475757676000175460ustar00rootroot00000000000000/* 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.3.3/src/DSP/SVFilter.cpp000066400000000000000000000114641475757676000170160ustar00rootroot00000000000000/* 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.3.3/src/DSP/SVFilter.h000066400000000000000000000047071475757676000164650ustar00rootroot00000000000000/* 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.3.3/src/DSP/Unison.cpp000066400000000000000000000136131475757676000165710ustar00rootroot00000000000000/* 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.3.3/src/DSP/Unison.h000066400000000000000000000050771475757676000162430ustar00rootroot00000000000000/* 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.3.3/src/Effects/000077500000000000000000000000001475757676000155375ustar00rootroot00000000000000yoshimi-2.3.3.3/src/Effects/Alienwah.cpp000066400000000000000000000215161475757676000200000ustar00rootroot00000000000000/* 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.3.3/src/Effects/Alienwah.h000066400000000000000000000054341475757676000174460ustar00rootroot00000000000000/* 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.3.3/src/Effects/Chorus.cpp000066400000000000000000000233221475757676000175100ustar00rootroot00000000000000/* 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.3.3/src/Effects/Chorus.h000066400000000000000000000072701475757676000171610ustar00rootroot00000000000000/* 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.3.3/src/Effects/Distorsion.cpp000066400000000000000000000233111475757676000204000ustar00rootroot00000000000000/* 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.3.3/src/Effects/Distorsion.h000066400000000000000000000065011475757676000200470ustar00rootroot00000000000000/* 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.3.3/src/Effects/DynamicFilter.cpp000066400000000000000000000320411475757676000207750ustar00rootroot00000000000000/* 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.3.3/src/Effects/DynamicFilter.h000066400000000000000000000055761475757676000204570ustar00rootroot00000000000000/* 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.3.3/src/Effects/EQ.cpp000066400000000000000000000302431475757676000165520ustar00rootroot00000000000000/* 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.3.3/src/Effects/EQ.h000066400000000000000000000073741475757676000162300ustar00rootroot00000000000000/* 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.3.3/src/Effects/Echo.cpp000066400000000000000000000264741475757676000171360ustar00rootroot00000000000000/* 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.3.3/src/Effects/Echo.h000066400000000000000000000071761475757676000166010ustar00rootroot00000000000000/* 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.3.3/src/Effects/Effect.cpp000066400000000000000000000057421475757676000174470ustar00rootroot00000000000000/* 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.3.3/src/Effects/Effect.h000066400000000000000000000056021475757676000171070ustar00rootroot00000000000000/* 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.3.3/src/Effects/EffectLFO.cpp000066400000000000000000000105761475757676000200110ustar00rootroot00000000000000/* 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.3.3/src/Effects/EffectLFO.h000066400000000000000000000040471475757676000174520ustar00rootroot00000000000000/* 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.3.3/src/Effects/EffectMgr.cpp000066400000000000000000000234131475757676000201100ustar00rootroot00000000000000/* 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/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(XMLwrapper& xml) { xml.addpar("type", geteffect()); if (!efx || !geteffect()) return; xml.addpar("preset", efx->Ppreset); xml.beginbranch("EFFECT_PARAMETERS"); for (int n = 0; n < 128; ++n) { // \todo evaluate who should oversee saving and loading of parameters int par = geteffectpar(n); if (par == 0) continue; xml.beginbranch("par_no", n); xml.addpar("par", par); xml.endbranch(); } if (filterpars) { xml.beginbranch("FILTER"); filterpars->add2XML(xml); xml.endbranch(); } xml.endbranch(); } void EffectMgr::getfromXML(XMLwrapper& xml) { changeeffect(xml.getpar127("type", geteffect())); // not convinced this is OK? if (!efx || !geteffect()) return; changepreset(xml.getpar127("preset", efx->Ppreset)); bool isChanged = false; if (xml.enterbranch("EFFECT_PARAMETERS")) { for (int n = 0; n < 128; ++n) { int par = geteffectpar(n); // find default seteffectpar(n, 0); // erase effect parameter if (xml.enterbranch("par_no", n) == 0) continue; seteffectpar(n, xml.getpar127("par", par)); if (par != geteffectpar(n)) { isChanged = true; } xml.exitbranch(); } seteffectpar(-1, isChanged); if (filterpars) { if (xml.enterbranch("FILTER")) { filterpars->getfromXML(xml); xml.exitbranch(); } } xml.exitbranch(); } 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.3.3/src/Effects/EffectMgr.h000066400000000000000000000072101475757676000175520ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "Misc/SynthEngine.h" #include "Params/FilterParams.h" class EffectMgr : public ParamBase { public: EffectMgr(const bool insertion_, SynthEngine&); void defaults() override; void add2XML(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); 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.3.3/src/Effects/Phaser.cpp000066400000000000000000000351561475757676000174770ustar00rootroot00000000000000/* 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.3.3/src/Effects/Phaser.h000066400000000000000000000125361475757676000171410ustar00rootroot00000000000000/* 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.3.3/src/Effects/Reverb.h000066400000000000000000000130051475757676000171340ustar00rootroot00000000000000/* 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.3.3/src/Interface/000077500000000000000000000000001475757676000160605ustar00rootroot00000000000000yoshimi-2.3.3.3/src/Interface/Data2Text.cpp000066400000000000000000003411061475757676000203710ustar00rootroot00000000000000/* 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) { 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); return resolved; } 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) // (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::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointChange: 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::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointChange: 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::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointChange: 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::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandName = resolveEnvelope(cmd, addValue); break; case TOPLEVEL::insert::envelopePointChange: 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::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::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::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::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::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 offset = cmd.data.offset; 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)) + " X increment " + to_string(int(offset)) + " Y"); 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)) + " Remaining " + to_string(value)); } } if (insert == 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)) + " X increment " + to_string(int(offset)) + " Y"); } 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.3.3/src/Interface/Data2Text.h000066400000000000000000000052341475757676000200350ustar00rootroot00000000000000/* 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 "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::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.3.3/src/Interface/GuiDataExchange.cpp000066400000000000000000000203131475757676000215440ustar00rootroot00000000000000/* 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.3.3/src/Interface/GuiDataExchange.h000066400000000000000000000222151475757676000212140ustar00rootroot00000000000000/* 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.3.3/src/Interface/InterChange.cpp000066400000000000000000007725651475757676000210010ustar00rootroot00000000000000/* 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) { 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. if (!synth.fileCompatible) 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"); // cancelling and GUI report must be set after action completed. if (not synth.fileCompatible) { synth.fileCompatible = true; #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 } } else // don't leave this hanging { synth.fileCompatible = true; } } 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) { 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) 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) { 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)) { 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)) { 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)); } 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; } 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); 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)) { 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; } 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; } 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); break; case MAIN::control::masterResetAndMlearn: synth.resetAll(1); 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 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; 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 engine = cmd.data.engine; 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: 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: 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::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: commandEnvelope(cmd); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandEnvelope(cmd); break; case TOPLEVEL::insert::envelopePointChange: 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: commandEnvelope(cmd); break; case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: commandEnvelope(cmd); break; case TOPLEVEL::insert::envelopePointChange: 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().showGui; 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().showCli; 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::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::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::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::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::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::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 , &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); break; case TOPLEVEL::insertType::frequency: envelopeReadWrite(cmd, part.kit[kititem].subpars->FreqEnvelope); break; case TOPLEVEL::insertType::filter: envelopeReadWrite(cmd, part.kit[kititem].subpars->GlobalFilterEnvelope); break; case TOPLEVEL::insertType::bandwidth: envelopeReadWrite(cmd, part.kit[kititem].subpars->BandWidthEnvelope); 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 Xincrement = 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: envelopePointChange(cmd, pars); break; default: { if (cmd.data.control == ENVELOPEINSERT::control::points) { if (!pars->Pfreemode) { val = UNUSED; Xincrement = UNUSED; } else { val = envpoints; Xincrement = 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 = Xincrement; 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; Xincrement = UNUSED; break; } if (write) { pars->paramsChanged(); } cmd.data.value = val; cmd.data.offset = Xincrement; return; } void InterChange::envelopePointAdd(CommandBlock& cmd, EnvelopeParams *pars) { uchar point = cmd.data.control; uchar Xincrement = 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] = Xincrement; pars->Penvval[point] = val; cmd.data.value = val; cmd.data.offset = Xincrement; 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 Xincrement = 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] = Xincrement; pars->Penvval[point] = val; cmd.data.value = val; cmd.data.offset = Xincrement; 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 point = cmd.data.control; uchar Xincrement = 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); pars->Penvval[point] = val; if (point == 0) { Xincrement = 0; } else { pars->Penvdt[point] = Xincrement; } pars->paramsChanged(); } else { val = pars->Penvval[point]; Xincrement = pars->Penvdt[point]; } cmd.data.value = val; cmd.data.offset = Xincrement; 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 && engine != PART::engine::subSynth && parameter <= TOPLEVEL::insertType::filter) { LFOlimit lfolimits; return lfolimits.getLFOlimits(&cmd); } if (insert == TOPLEVEL::insert::envelopeGroup) { envelopeLimit envelopeLimits; return envelopeLimits.getEnvelopeLimits(&cmd); } if (insert == TOPLEVEL::insert::envelopePointAdd || insert == TOPLEVEL::insert::envelopePointDelete || insert == TOPLEVEL::insert::envelopePointChange) return 1; // temporary solution :( 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.3.3/src/Interface/InterChange.h000066400000000000000000000165021475757676000204240ustar00rootroot00000000000000/* 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 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; }; #endif yoshimi-2.3.3.3/src/Interface/InterfaceAnchor.h000066400000000000000000000036411475757676000212700ustar00rootroot00000000000000/* 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.3.3/src/Interface/MidiDecode.cpp000066400000000000000000000573331475757676000205650ustar00rootroot00000000000000/* 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; */ } /* * 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 (!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) { 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.3.3/src/Interface/MidiDecode.h000066400000000000000000000036601475757676000202240ustar00rootroot00000000000000/* 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.3.3/src/Interface/MidiLearn.cpp000066400000000000000000001005631475757676000204350ustar00rootroot00000000000000/* 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/XMLwrapper.h" #include "Misc/SynthEngine.h" #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.size() == 0) { 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) { list::iterator it = midi_list.begin(); int lineNo = 0; if (midi_list.size() == 0) { msg_buf.push_back("No learned lines"); return; } string CCtype; int CC; msg_buf.push_back("Midi learned:"); while (it != midi_list.end()) { CC = it->CC; if (CC < 0xff) CCtype = to_string(CC); else CCtype = asHexString((CC >> 7) & 0x7f) + asHexString(CC & 0x7f) + " h"; string chan = " Chan "; if ((it->chan) >= NUM_MIDI_CHANNELS) chan += "All"; else chan += to_string(int(it->chan + 1)); msg_buf.push_back("Line " + to_string(lineNo + 1) + " CC " + CCtype + chan + " " + findName(it)); ++ it; ++ 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 (midi_list.size() > 0) { // 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(list::iterator it) { CommandBlock cmd; memcpy(cmd.bytes, it->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; list::iterator it; it = midi_list.begin(); int lineNo = 0; if (midi_list.size() > 0) { // 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; int lineNo = 0; list::iterator it; it = midi_list.begin(); /* using std::chrono::steady_clock; using Dur = std::chrono::duration; auto start = steady_clock::now(); */ while (it != midi_list.end()) { ushort newCC = (it->CC) & MIDI::CC::maxNRPN; cmd.data.value = lineNo; cmd.data.type = it->status; cmd.data.source = TOPLEVEL::action::toAll; cmd.data.control = MIDILEARN::control::CCorChannel; cmd.data.kit = (newCC & 0xff); cmd.data.engine = it->chan; cmd.data.insert = it->min_in; cmd.data.parameter = it->max_in; cmd.data.miscmsg = textMsgBuffer.push(findName(it)); writeToGui(cmd); if (it->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); } ++it; ++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 && !midi_list.empty()) // open the gui editing window { cmd.data.control = MIDILEARN::control::sendRefreshRequest; writeToGui(cmd); } } bool MidiLearn::saveList(string const& name) { if (name.empty()) { synth.getRuntime().Log("No filename"); return false; } if (midi_list.size() == 0) { synth.getRuntime().Log("No Midi Learn list"); return false; } string file = setExtension(name, EXTEN::mlearn); synth.getRuntime().xmlType = TOPLEVEL::XML::MLearn; auto xml{std::make_unique(synth, true)}; bool ok = insertMidiListData(*xml); if (xml->saveXMLfile(file)) synth.addHistory(file, TOPLEVEL::XML::MLearn); else { synth.getRuntime().Log("Failed to save data to " + file); ok = false; } return ok; } bool MidiLearn::insertMidiListData(XMLwrapper& xml) { if (midi_list.size() == 0) return false; int ID = 0; list::iterator it; it = midi_list.begin(); xml.beginbranch("MIDILEARN"); while (it != midi_list.end()) { xml.beginbranch("LINE", ID); xml.addparbool("Mute", (it->status & 4) > 0); xml.addparbool("NRPN", (it->status & 8) > 0); xml.addparbool("7_bit", (it->status & 16) > 0); xml.addpar("Midi_Controller", it->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. */ xml.addpar("Midi_Channel", it->chan); xml.addparreal("Midi_Min", it->min_in / 1.575f); xml.addparreal("Midi_Max", it->max_in / 1.575f); xml.addparbool("Limit", (it->status & 2) > 0); xml.addparbool("Block", (it->status & 1) > 0); xml.addpar("Convert_Min", it->min_out); xml.addpar("Convert_Max", it->max_out); xml.beginbranch("COMMAND"); xml.addpar("Type", it->frame.data.type); xml.addpar("Control", it->frame.data.control); xml.addpar("Part", it->frame.data.part); xml.addpar("Kit_Item", it->frame.data.kit); xml.addpar("Engine", it->frame.data.engine); xml.addpar("Insert", it->frame.data.insert); xml.addpar("Parameter", it->frame.data.parameter); xml.addpar("Secondary_Parameter", it->frame.data.offset); xml.addparstr("Command_Name",findName(it)); xml.endbranch(); xml.endbranch(); ++it; ++ID; } xml.endbranch(); // MIDILEARN return true; } bool MidiLearn::loadList(string const& name) { if (name.empty()) { synth.getRuntime().Log("No filename"); return false; } string file{setExtension(name, EXTEN::mlearn)}; if (!isRegularFile(file)) { synth.getRuntime().Log("Can't find " + file); return false; } auto xml{std::make_unique(synth, true)}; xml->loadXMLfile(file); bool ok = extractMidiListData(true, *xml); if (!ok) return false; synth.addHistory(file, TOPLEVEL::XML::MLearn); return true; } bool MidiLearn::extractMidiListData(bool full, XMLwrapper& xml) { midi_list.clear(); if (!xml.enterbranch("MIDILEARN")) { if (full) synth.getRuntime().Log("Extract Data, no MIDILEARN branch"); return false; } LearnBlock entry; CommandBlock cmd; midi_list.clear(); int ID = 0; int status; uint ident; while (true) { status = 0; ident = 0; if (!xml.enterbranch("LINE", ID)) break; else { if (xml.getparbool("Mute", 0)) status |= 4; if (xml.getparbool("NRPN", 0)) { ident = MIDI::CC::identNRPN; // set top bit for NRPN indication status |= 8; } if (xml.getparbool("7_bit",0)) status |= 16; entry.CC = ident | xml.getpar("Midi_Controller", 0, 0, MIDI::CC::maxNRPN); entry.chan = xml.getpar127("Midi_Channel", 0); int min = int((xml.getparreal("Midi_Min", 200.0f) * 1.575f) + 0.1f); entry.min_in = min; int max = int((xml.getparreal("Midi_Max", 200.0f) * 1.575f) + 0.1f); entry.max_in = max; if (xml.getparbool("Limit",0)) status |= 2; if (xml.getparbool("Block",0)) status |= 1; entry.min_out = xml.getpar("Convert_Min", 0, -16384, 16383); entry.max_out = xml.getpar("Convert_Max", 0, -16384, 16383); xml.enterbranch("COMMAND"); entry.frame.data.type = xml.getpar255("Type", 0); // ?? entry.frame.data.control = xml.getpar255("Control", 0); entry.frame.data.part = xml.getpar255("Part", 0); entry.frame.data.kit = xml.getpar255("Kit_Item", 0); entry.frame.data.engine = xml.getpar255("Engine", 0); entry.frame.data.insert = xml.getpar255("Insert", 0); entry.frame.data.parameter = xml.getpar255("Parameter", 0); entry.frame.data.offset = xml.getpar255("Secondary_Parameter", 0); if (DECODE_MODE) { string test = xml.getparstr("Command_Name"); TextData::encodeAll(&synth, test, cmd); } if (DECODE_MODE >= 2) { bool ok = true; if (ID == 0) 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; } xml.exitbranch(); xml.exitbranch(); entry.status = status; midi_list.push_back(entry); ++ ID; } } xml.exitbranch(); // MIDILEARN return true; } yoshimi-2.3.3.3/src/Interface/MidiLearn.h000066400000000000000000000060251475757676000201000ustar00rootroot00000000000000/* 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 XMLwrapper; class SynthEngine; class DataText; class TextData; 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); bool insertMidiListData(XMLwrapper&); bool loadList(const string& name); bool extractMidiListData(bool full, XMLwrapper&); 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(list::iterator it); void insertLine(ushort CC, uchar chan); bool saveList(string const& name); void writeToGui(CommandBlock& putData); }; #endif /*MIDILEARN_H*/ yoshimi-2.3.3.3/src/Interface/RingBuffer.h000066400000000000000000000056271475757676000202740ustar00rootroot00000000000000#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.3.3/src/Interface/Text2Data.cpp000066400000000000000000001421331475757676000203700ustar00rootroot00000000000000/* 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, "Filt Env")) { allData.data.parameter = TOPLEVEL::insertType::filter; encodeEnvelope(source, allData); return; } else if (findAndStep(source, "Freq Env")) { allData.data.parameter = TOPLEVEL::insertType::frequency; encodeEnvelope(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; } // 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; allData.data.insert = TOPLEVEL::insert::envelopeGroup; // this might be changed for freemode points 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.3.3/src/Interface/Text2Data.h000066400000000000000000000051421475757676000200330ustar00rootroot00000000000000/* 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.3.3/src/Interface/TextLists.cpp000066400000000000000000001516571475757676000205460ustar00rootroot00000000000000/* 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-fatal errors (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})", "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)", "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.3.3/src/Interface/TextLists.h000066400000000000000000000123111475757676000201720ustar00rootroot00000000000000/* 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.3.3/src/Interface/Vectors.cpp000066400000000000000000000301251475757676000202120ustar00rootroot00000000000000/* 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 "Misc/SynthEngine.h" #include "Misc/Config.h" #include "Misc/Part.h" #include "Misc/TextMsgBuffer.h" #include "Misc/FileMgrFuncs.h" #include "Misc/XMLwrapper.h" #include 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 *_synth) : synth(_synth) { //init } Vectors::~Vectors() { //close } 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; bool a = full; full = a; // suppress warning uchar actualBase = NO_MSG; // error! if (name.empty()) { synth->getRuntime().Log("No filename", _SYS_::LogNotSerious); return actualBase; } string file = setExtension(name, EXTEN::vector); if (!isRegularFile(file)) { synth->getRuntime().Log("Can't find " + file, _SYS_::LogNotSerious); return actualBase; } auto xml{std::make_unique(*synth, true)}; xml->loadXMLfile(file); if (!xml->enterbranch("VECTOR")) { synth->getRuntime(). Log("Extract Data, no VECTOR branch", _SYS_::LogNotSerious); } else { actualBase = extractVectorData(baseChan, *xml, findLeafName(name)); int lastPart = NUM_MIDI_PARTS; if (synth->getRuntime().vectordata.Yaxis[actualBase] >= 0x7f) lastPart = NUM_MIDI_CHANNELS * 2; for (int npart = 0; npart < lastPart; npart += NUM_MIDI_CHANNELS) { if (xml->enterbranch("PART", npart)) { synth->part[npart + actualBase]->getfromXML(*xml); synth->part[npart + actualBase]->Prcvchn = actualBase; xml->exitbranch(); synth->setPartMap(npart + actualBase); synth->partonoffWrite(npart + baseChan, 1); if (synth->part[npart + actualBase]->Paudiodest & 2) Config::instances().registerAudioPort(synth->getUniqueId(), npart+actualBase); } } xml->endbranch(); // VECTOR } return actualBase; } uchar Vectors::extractVectorData(uchar baseChan, XMLwrapper& xml, string const& name) { uint lastPart = NUM_MIDI_PARTS; uchar tmp; string newname = xml.getparstr("name"); if (baseChan >= NUM_MIDI_CHANNELS) baseChan = xml.getpar255("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); tmp = xml.getpar255("X_sweep_CC", 0xff); if (tmp >= 0x0e && tmp < 0x7f) { synth->getRuntime().vectordata.Xaxis[baseChan] = tmp; 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 tmp = xml.getpar255("Y_sweep_CC", 0xff); if (tmp >= 0x0e && tmp < 0x7f) synth->getRuntime().vectordata.Yaxis[baseChan] = tmp; 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.getparbool("X_feature_1", false)) x_feat |= 1; if (xml.getparbool("X_feature_2", false)) x_feat |= 2; if (xml.getparbool("X_feature_2_R", false)) x_feat |= 0x10; if (xml.getparbool("X_feature_4", false)) x_feat |= 4; if (xml.getparbool("X_feature_4_R", false)) x_feat |= 0x20; if (xml.getparbool("X_feature_8", false)) x_feat |= 8; if (xml.getparbool("X_feature_8_R", false)) x_feat |= 0x40; synth->getRuntime().vectordata.Xcc2[baseChan] = xml.getpar255("X_CCout_2", 10); synth->getRuntime().vectordata.Xcc4[baseChan] = xml.getpar255("X_CCout_4", 74); synth->getRuntime().vectordata.Xcc8[baseChan] = xml.getpar255("X_CCout_8", 1); if (lastPart == NUM_MIDI_PARTS) { if (xml.getparbool("Y_feature_1", false)) y_feat |= 1; if (xml.getparbool("Y_feature_2", false)) y_feat |= 2; if (xml.getparbool("Y_feature_2_R", false)) y_feat |= 0x10; if (xml.getparbool("Y_feature_4", false)) y_feat |= 4; if (xml.getparbool("Y_feature_4_R", false)) y_feat |= 0x20; if (xml.getparbool("Y_feature_8", false)) y_feat |= 8; if (xml.getparbool("Y_feature_8_R", false)) y_feat |= 0x40; synth->getRuntime().vectordata.Ycc2[baseChan] = xml.getpar255("Y_CCout_2", 10); synth->getRuntime().vectordata.Ycc4[baseChan] = xml.getpar255("Y_CCout_4", 74); synth->getRuntime().vectordata.Ycc8[baseChan] = xml.getpar255("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.getpar255("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); synth->getRuntime().xmlType = TOPLEVEL::XML::Vector; auto xml{std::make_unique(*synth, true)}; xml->beginbranch("VECTOR"); insertVectorData(baseChan, true, *xml, findLeafName(file)); xml->endbranch(); if (!xml->saveXMLfile(file)) { synth->getRuntime().Log("Failed to save data to " + file, _SYS_::LogNotSerious); result = textMsgBuffer.push("FAIL"); } return result; } bool Vectors::insertVectorData(uchar baseChan, bool full, XMLwrapper& xml, string const& name) { int lastPart = NUM_MIDI_PARTS; 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.addparstr("name", synth->getRuntime().vectordata.Name[baseChan]); else xml.addparstr("name", name); xml.addpar("Source_channel", baseChan); xml.addpar("X_sweep_CC", synth->getRuntime().vectordata.Xaxis[baseChan]); xml.addpar("Y_sweep_CC", synth->getRuntime().vectordata.Yaxis[baseChan]); xml.addparbool("X_feature_1", (x_feat & 1) > 0); xml.addparbool("X_feature_2", (x_feat & 2) > 0); xml.addparbool("X_feature_2_R", (x_feat & 0x10) > 0); xml.addparbool("X_feature_4", (x_feat & 4) > 0); xml.addparbool("X_feature_4_R", (x_feat & 0x20) > 0); xml.addparbool("X_feature_8", (x_feat & 8) > 0); xml.addparbool("X_feature_8_R", (x_feat & 0x40) > 0); xml.addpar("X_CCout_2",synth->getRuntime().vectordata.Xcc2[baseChan]); xml.addpar("X_CCout_4",synth->getRuntime().vectordata.Xcc4[baseChan]); xml.addpar("X_CCout_8",synth->getRuntime().vectordata.Xcc8[baseChan]); if (synth->getRuntime().vectordata.Yaxis[baseChan] > 0x7f) { lastPart /= 2; } else { xml.addparbool("Y_feature_1", (y_feat & 1) > 0); xml.addparbool("Y_feature_2", (y_feat & 2) > 0); xml.addparbool("Y_feature_2_R", (y_feat & 0x10) > 0); xml.addparbool("Y_feature_4", (y_feat & 4) > 0); xml.addparbool("Y_feature_4_R", (y_feat & 0x20) > 0); xml.addparbool("Y_feature_8", (y_feat & 8) > 0); xml.addparbool("Y_feature_8_R", (y_feat & 0x40) > 0); xml.addpar("Y_CCout_2",synth->getRuntime().vectordata.Ycc2[baseChan]); xml.addpar("Y_CCout_4",synth->getRuntime().vectordata.Ycc4[baseChan]); xml.addpar("Y_CCout_8",synth->getRuntime().vectordata.Ycc8[baseChan]); } if (full) { xml.addpar("current_midi_parts", lastPart); for (int npart = 0; npart < lastPart; npart += NUM_MIDI_CHANNELS) { xml.beginbranch("PART",npart); synth->part[npart + baseChan]->add2XML(xml); xml.endbranch(); } } 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.3.3/src/Interface/Vectors.h000066400000000000000000000030571475757676000176630ustar00rootroot00000000000000/* 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 XMLwrapper; class SynthEngine; using std::string; class Vectors { public: Vectors(SynthEngine*); ~Vectors(); CommandBlock data;//commandData; uchar loadVectorAndUpdate(uchar baseChan, string const& name); uchar loadVector(uchar baseChan, string const& name, bool full); uchar extractVectorData(uchar baseChan, XMLwrapper& xml, string const& name); uchar saveVector(uchar baseChan, string const& name, bool full); bool insertVectorData(uchar baseChan, bool full, XMLwrapper& xml, string const& name); float getVectorLimits(CommandBlock *getData); SynthEngine *synth; }; #endif /*VECTORS_H*/ yoshimi-2.3.3.3/src/LV2_Plugin/000077500000000000000000000000001475757676000161015ustar00rootroot00000000000000yoshimi-2.3.3.3/src/LV2_Plugin/CMakeLists.txt000066400000000000000000000157611475757676000206530ustar00rootroot00000000000000# # 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/XMLwrapper.cpp ../Misc/XMLwrapper.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/YoshiWin.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.3.3/src/LV2_Plugin/YoshimiLV2Plugin.cpp000066400000000000000000000711121475757676000217330ustar00rootroot00000000000000/* 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 = NULL; 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.3.3/src/LV2_Plugin/YoshimiLV2Plugin.h000066400000000000000000000176011475757676000214030ustar00rootroot00000000000000/* 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.3.3/src/LV2_Plugin/lv2extprg.h000066400000000000000000000155021475757676000202120ustar00rootroot00000000000000/* 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.3.3/src/LV2_Plugin/lv2extui.h000066400000000000000000000067221475757676000200430ustar00rootroot00000000000000/* 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.3.3/src/LV2_Plugin/manifest.ttl000066400000000000000000000017201475757676000204340ustar00rootroot00000000000000@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.3.3/src/LV2_Plugin/yoshimi.ttl000066400000000000000000000237451475757676000203220ustar00rootroot00000000000000@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.3.3/src/Misc/000077500000000000000000000000001475757676000150535ustar00rootroot00000000000000yoshimi-2.3.3.3/src/Misc/Alloc.h000066400000000000000000000056231475757676000162640ustar00rootroot00000000000000/* 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.3.3/src/Misc/Bank.cpp000066400000000000000000001614131475757676000164400ustar00rootroot00000000000000/* 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/XMLwrapper.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::list; using std::optional; using std::to_string; using std::string; Bank::Bank(SynthEngine *_synth) : defaultinsname(string(" ")), synth(_synth) { BanksVersion = 10; InstrumentsInBanks = 0, BanksInRoots = 0; foundLocal = file::localDir() + "/found/"; } 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(unsigned int ninstrument, size_t bank, size_t root) { if (emptyslot(root, bank, ninstrument)) return -1; return getInstrumentReference(root, bank, ninstrument).type; } // Get the name of an instrument from the bank string Bank::getname(unsigned int 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(unsigned int 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(const string& 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) bool Bank::moveInstrument(unsigned int ninstrument, const string& 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, unsigned int 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(unsigned int 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, const string& 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, const string& 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; } 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).yoshiType = 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(const string& exportdir, size_t rootID, unsigned int 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, unsigned int 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, const 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) { InstrumentEntry &Ref = getInstrumentReference(rootID, bankID, pos); Ref.yoshiType = true; return 1; } return 0; } // Makes a new bank with known ID. Does *not* make it current bool Bank::newIDbank(const string& newbankdir, unsigned int 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(const string& 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(unsigned int 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(unsigned int n1, unsigned int 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(unsigned int firstID, unsigned int 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; } bool Bank::addtobank(size_t rootID, size_t bankID, int _pos, string _filename, const string name) { if (_pos < 0 || _pos >= MAX_INSTRUMENTS_IN_BANK) return -1; //invalid location int pos = _pos; string filename = _filename; 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 getInstrumentReference(rootID, bankID, pos).yoshiType = true; 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; deletefrombank(rootID, bankID, pos); // is this actually needed? InstrumentEntry &instrRef = getInstrumentReference(rootID, bankID, pos); instrRef.used = true; instrRef.name = name; instrRef.filename = filename; instrRef.PADsynth_used = 0; instrRef.ADDsynth_used = 0; instrRef.SUBsynth_used = 0; instrRef.yoshiType = 0; string checkfile = setExtension(getFullPath(rootID, bankID, pos), EXTEN::yoshInst); if (!isRegularFile(checkfile)) checkfile = setExtension(getFullPath(rootID, bankID, pos), EXTEN::zynInst); unsigned int names = 0; int type = 0; auto xml{std::make_unique(*synth, true, false)}; xml->checkfileinformation(checkfile, names, type); instrRef.type = type; instrRef.ADDsynth_used = (names & 1); instrRef.SUBsynth_used = (names & 2) >> 1; instrRef.PADsynth_used = (names & 4) >> 2; instrRef.yoshiType = (exten == EXTEN::yoshInst); return 0; } void Bank::deletefrombank(size_t rootID, size_t bankID, unsigned int 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(const string& 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, unsigned int ninstrument) { int tmp = getInstrumentReference(rootID, bankID, ninstrument).ADDsynth_used | (getInstrumentReference(rootID, bankID, ninstrument).SUBsynth_used << 1) | (getInstrumentReference(rootID, bankID, ninstrument).PADsynth_used << 2) | (getInstrumentReference(rootID, bankID, ninstrument).yoshiType << 3); return tmp; } 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; } unsigned int 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(const string& 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) { auto xml{std::make_unique(*synth)}; if (xml->loadXMLfile(*bankFile)) { if (xml->enterbranch("INFORMATION")) { // going negative to catch all previous versions and to be backward compatible writeVersion(xml->getpar("Banks_Version", 0, 0, 999)); xml->exitbranch(); } if (xml->enterbranch("BANKLIST")) { loadFromConfigFile(*xml); 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 (BanksVersion == 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(XMLwrapper& xml) { writeVersion(BANKS_VERSION); // set current format for (size_t i = 0; i < MAX_BANK_ROOT_DIRS; i++) { if (roots.count(i) > 0 && !roots [i].path.empty()) { string nodename = "BANKROOT"; xml.beginbranch(nodename, i); xml.addparstr("bank_root", roots [i].path); BankEntryMap::const_iterator it; for (it = roots [i].banks.begin(); it != roots [i].banks.end(); ++it) { xml.beginbranch("bank_id", it->first); xml.addparstr("dirname", it->second.dirname); BankEntry &bank = roots [i].banks [it->first]; size_t pos = 0; while (pos < MAX_INSTRUMENTS_IN_BANK) { if (bank.instruments [pos].used) { xml.beginbranch("instrument_id", pos); xml.addparbool("isUsed", bank.instruments [pos].used); xml.addparstr("listname", bank.instruments [pos].name); xml.addparstr("filename", bank.instruments [pos].filename); xml.addpar("type", bank.instruments [pos].type); xml.addparbool("ADDsynth", bank.instruments [pos].ADDsynth_used); xml.addparbool("SUBsynth", bank.instruments [pos].SUBsynth_used); xml.addparbool("PADsynth", bank.instruments [pos].PADsynth_used); xml.addparbool("Yoshimi", bank.instruments [pos].yoshiType); xml.endbranch(); } ++pos; } xml.endbranch(); } xml.endbranch(); } } } void Bank::loadFromConfigFile(XMLwrapper& xml) { string nodename = "BANKROOT"; for (size_t i = 0; i < MAX_BANK_ROOT_DIRS; ++i) { if (xml.enterbranch(nodename, i)) { string dir = xml.getparstr("bank_root"); if (!dir.empty()) { size_t newIndex = addRootDir(dir); if (newIndex != i) { changeRootID(newIndex, i); } for (size_t k = 0; k < MAX_INSTRUMENTS_IN_BANK; k++) { if (xml.enterbranch("bank_id", k)) { string bankDirname = xml.getparstr("dirname"); roots[i].banks[k].dirname = bankDirname; BankEntry &bank = roots [i].banks [k]; size_t pos = 0; while (pos < MAX_INSTRUMENTS_IN_BANK) { if (xml.enterbranch("instrument_id", pos)) { bank.instruments[pos].used = xml.getparbool("isUsed", false); bank.instruments[pos].name = xml.getparstr("listname"); bank.instruments[pos].filename = xml.getparstr("filename"); bank.instruments[pos].type = xml.getpar("type",0 , -50, 100); bank.instruments[pos].ADDsynth_used = xml.getparbool("ADDsynth", false); bank.instruments[pos].SUBsynth_used = xml.getparbool("SUBsynth", false); bank.instruments[pos].PADsynth_used = xml.getparbool("PADsynth", false); bank.instruments[pos].yoshiType = xml.getparbool("Yoshimi", false); xml.exitbranch(); } ++pos; } xml.exitbranch(); } } } xml.exitbranch(); } } xml.exitbranch(); } yoshimi-2.3.3.3/src/Misc/Bank.h000066400000000000000000000164351475757676000161100ustar00rootroot00000000000000/* 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; using std::map; typedef struct _InstrumentEntry { string name; string filename; int type; bool used; unsigned char PADsynth_used; unsigned char ADDsynth_used; unsigned char SUBsynth_used; bool yoshiType; _InstrumentEntry() :name(""), filename(""), type(-1), used(false), PADsynth_used(0), ADDsynth_used(0), SUBsynth_used(0), yoshiType(false) { } void clear() { used = false; name.clear(); filename.clear(); PADsynth_used = 0; ADDsynth_used = 0; SUBsynth_used = 0; yoshiType = false; } } InstrumentEntry; // Contains the leafname of the instrument. typedef map InstrumentEntryMap; // Maps instrument id to instrument entry. typedef struct _BankEntry { string dirname; InstrumentEntryMap instruments; } BankEntry; // Contains the bank directory name and the instrument map of the bank. typedef map BankEntryMap; // Maps bank id to bank entry. typedef struct _RootEntry { string path; BankEntryMap banks; size_t bankIdStep; _RootEntry(): bankIdStep(1) {} } RootEntry; // Contains the root path and the bank map of the root. typedef map RootEntryMap; // Maps root id to root entry. class SynthEngine; class Bank { friend class SynthEngine; public: Bank(SynthEngine *_synth); int getType(unsigned int ninstrument, size_t bank, size_t root); string getname(unsigned int ninstrument, size_t bank, size_t root); string getnamenumbered(unsigned int ninstrument, size_t bank, size_t root); int setInstrumentName(const string& name, int slot, size_t bank, size_t root); bool moveInstrument(unsigned int ninstrument, const string& newname, int newslot, size_t oldBank, size_t newBank, size_t oldRoot, size_t newRoot); // if newslot==-1 then this is ignored, else it will be put on that slot int engines_used(size_t rootID, size_t bankID, unsigned int ninstrument); bool emptyslot(size_t rootID, size_t bankID, unsigned int ninstrument); string clearslot(unsigned int ninstrument, size_t rootID, size_t bankID); bool savetoslot(size_t rootID, size_t bankID, int ninstrument, int npart); string swapslot(unsigned int n1, unsigned int n2, size_t bank1, size_t bank2, size_t root1, size_t root2); string swapbanks(unsigned int firstID, unsigned int secondID, size_t firstRoot, size_t secondRoot); string getBankName(int bankID, size_t rootID); bool isDuplicateBankName(size_t rootID, const string& name); int getBankSize(int bankID, size_t rootID); int changeBankName(size_t rootID, size_t bankID, const string& newName); void checkbank(size_t rootID, size_t banknum); bool loadbank(size_t rootID, size_t banknum); string exportBank(const string& exportdir, size_t rootID, unsigned int bankID); string importBank(string importdir, size_t rootID, unsigned int bankID); bool isDuplicate(size_t rootID, size_t bankID, int pos, const string filename); bool newIDbank(const string& newbankdir, unsigned int bankID, size_t rootID = 0xff); bool newbankfile(const string& newbankdir, size_t rootID); string removebank(unsigned int bankID, size_t rootID = 0xff); bool removeRoot(size_t rootID); bool changeRootID(size_t oldID, size_t newID); bool setCurrentRootID(size_t newRootID); unsigned int findFirstBank(size_t newRootID); bool setCurrentBankID(size_t newBankID, bool ignoreMissing = true); size_t addRootDir(const string& newRootDir); bool establishBanks(std::optional bankFile); bool installRoots(); bool installNewRoot(size_t rootID, string rootdir, bool reload = false); void saveToConfigFile(XMLwrapper& xml); void loadFromConfigFile(XMLwrapper& xml); 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); int InstrumentsInBanks; int BanksInRoots; int readVersion() {return BanksVersion;} void writeVersion(int version) {BanksVersion = version;} int BanksVersion; void checkLocalBanks(); size_t generateSingleRoot(const string& newRoot, bool clear = true); private: 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); } } bool addtobank(size_t rootID, size_t bankID, int pos, const string filename, const string name); // add an instrument to the bank, if pos is -1 try to find a position // returns true if the instrument was added void deletefrombank(size_t rootID, size_t bankID, unsigned int pos); bool isOccupiedRoot(string rootCandidate); bool isValidBank(string chkdir); const string defaultinsname; SynthEngine *synth; RootEntryMap roots; 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); string foundLocal; }; #endif /*BANK_H*/ yoshimi-2.3.3.3/src/Misc/BuildScheduler.cpp000066400000000000000000000116351475757676000204630ustar00rootroot00000000000000/* 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.3.3/src/Misc/BuildScheduler.h000066400000000000000000000402501475757676000201230ustar00rootroot00000000000000/* 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.3.3/src/Misc/CliFuncs.h000066400000000000000000000304051475757676000167340ustar00rootroot00000000000000/* 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.3.3/src/Misc/CmdOptions.cpp000066400000000000000000000272461475757676000176510ustar00rootroot00000000000000/* 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.3.3/src/Misc/CmdOptions.h000066400000000000000000000022471475757676000173100ustar00rootroot00000000000000/* 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.3.3/src/Misc/ConfBuild.h000066400000000000000000000000611475757676000170660ustar00rootroot00000000000000/* ConfBuild.h */ #define BUILD_NUMBER 2383 yoshimi-2.3.3.3/src/Misc/Config.cpp000066400000000000000000001573601475757676000170000ustar00rootroot00000000000000/* 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 #if defined(JACK_SESSION) #include #endif #include "Misc/XMLwrapper.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 std::string; using std::cout; using std::cerr; using std::endl; namespace { // Implementation details... TextMsgBuffer& textMsgBuffer = TextMsgBuffer::instance(); } 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 = ""; Config::Config(SynthEngine& synthInstance) : synth{synthInstance} , isLV2{false} , isMultiFeed{false} , build_ID{BUILD_NUMBER} , lastXMLmajor{0} , lastXMLminor{0} , oldConfig{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{1} // default will be inverted , toConsole{0} , consoleTextSize{12} , hideErrors{0} , showTimes{0} , logXMLheaders{0} , xmlmax{0} , gzipCompression{3} , 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 , 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{} , presetDir{} { std::cerr.precision(4); } void Config::init() { 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; lastXMLmajor = primary.lastXMLmajor; lastXMLminor = primary.lastXMLminor; 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; 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; 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) { TextMsgBuffer::instance().init(); // sneaked it in here so it's early if (!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 (!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 (!isRegularFile(defaultSession)) { renameFile(oldAllConfig, defaultSession); Log("Moving default state file."); } } } } bool success{true}; if (!isRegularFile(baseConfig)) { Log("Basic configuration " + baseConfig + " not found, will use default settings."); defaultPresets(); saveMasterConfig(); // generates a pristine "yoshimi.config" } else { // load baseConfig (always from the primary file) auto xml{std::make_unique(synth, true)}; success = xml->loadXMLfile(baseConfig); // note: we want correct base values even in a secondary config instance if (success) success = extractBaseParameters(*xml); else Log("loadConfig load base failed"); } if (!isRegularFile(configFile)) { if (0 < synth.getUniqueId()) { populateFromPrimary(); Log("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 auto xml{std::make_unique(synth, true)}; success = xml->loadXMLfile(configFile); if (success) success = extractConfigData(*xml); else Log("loadConfig load instance failed"); } if (synth.getUniqueId() == 0 && sessionStage != _SYS_::type::RestoreConf) { int currentVersion = lastXMLmajor * 10 + lastXMLminor; int storedVersion = MIN_CONFIG_MAJOR * 10 + MIN_CONFIG_MINOR; if (currentVersion < storedVersion) { oldConfig = true; saveInstanceConfig(); // Always resave to fix. // User may wish to accept this unchanged. } else oldConfig = false; } if (sessionStage == _SYS_::type::RestoreConf) return true; if (sessionStage != _SYS_::type::Normal) { auto xml{std::make_unique(synth, true)}; success = xml->loadXMLfile(stateFile); 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("loadConfig load instance failed"); } 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; //std::cout << "Manual already seen" << std::endl; } if (!man_ok) { startThread(&findManual_Thread, _findManual, this, false, 0, "CFG"); } } return success; } bool Config::updateConfig(int control, int value) { /* * 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 resaves 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. */ buildConfigLocation(); bool success{false}; if (control <= CONFIG::control::XMLcompressionLevel) {// handling base config int baseData[CONFIG::control::XMLcompressionLevel+1]; xmlType = TOPLEVEL::XML::MasterUpdate; baseConfig = file::configDir() + "/yoshimi" + string(EXTEN::config); auto xml{std::make_unique(synth, true)}; success = xml->loadXMLfile(baseConfig); if (success) { xml->enterbranch("BASE_PARAMETERS"); baseData[CONFIG::control::enableGUI] = xml->getparbool("enable_gui",true); baseData[CONFIG::control::showSplash] = xml->getparbool("enable_splash",true); baseData[CONFIG::control::enableCLI] = xml->getparbool("enable_cli",true); baseData[CONFIG::control::reportsDestination] = xml->getparbool("reports_destination",true); baseData[CONFIG::control::exposeStatus] = xml->getpar("show_cli_context",3,0,3); baseData[CONFIG::control::enableSinglePath] = xml->getparbool("enable_single_master",false); baseData[CONFIG::control::enableAutoInstance] = xml->getparbool("enable_auto_instance",false); baseData[CONFIG::control::handlePadSynthBuild] = xml->getparU("handle_padsynth_build",0); baseData[CONFIG::control::XMLcompressionLevel] = xml->getpar("gzip_compression",3,0,9); xml->exitbranch(); // BASE_PARAMETERS // Change the specific config value given baseData[control] = value; // Write back the consolidated base config auto xml{std::make_unique(synth, true)}; xml->beginbranch("BASE_PARAMETERS"); xml->addparbool("enable_gui",baseData[CONFIG::control::enableGUI]); xml->addparbool("enable_splash",baseData[CONFIG::control::showSplash]); xml->addparbool("enable_cli",baseData[CONFIG::control::enableCLI]); xml->addparbool("reports_destination",baseData[CONFIG::control::reportsDestination]); xml->addpar("show_cli_context",baseData[CONFIG::control::exposeStatus]); xml->addparbool("enable_single_master",baseData[CONFIG::control::enableSinglePath]); xml->addparbool("enable_auto_instance",baseData[CONFIG::control::enableAutoInstance]); xml->addparU("handle_padsynth_build",baseData[CONFIG::control::handlePadSynthBuild]); xml->addparbool("banks_checked",baseData[CONFIG::control::banksChecked]); xml->addpar("gzip_compression",baseData[CONFIG::control::XMLcompressionLevel]); // the following are system defined; xml->addparU("active_instances", activeInstances.to_ulong()); xml->addparstr("guide_version", guideVersion); xml->addparstr("manual", manualFile); xml->endbranch(); // BASE_PARAMETERS if (!xml->saveXMLfile(baseConfig, false)) { Log("Failed to update master config", _SYS_::LogNotSerious); } } else { Log("loadConfig load base failed"); } } else {// handling current session config const int offset = CONFIG::control::defaultStateStart; const int arraySize = CONFIG::control::historyLock - offset; xmlType = TOPLEVEL::XML::Config; int configData[arraySize]; // historyLock is handled elsewhere auto xml{std::make_unique(synth, true)}; success = xml->loadXMLfile(configFile); string tempText = ""; if (success) { xml->enterbranch("CONFIGURATION"); configData[CONFIG::control::defaultStateStart - offset] = xml->getpar("defaultState", 0, 0, 1); configData[CONFIG::control::bufferSize - offset] = xml->getpar("sound_buffer_size", 0, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); configData[CONFIG::control::oscillatorSize - offset] = xml->getpar("oscil_size", 0, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); configData[CONFIG::control::reportsDestination - offset] = xml->getpar("reports_destination", 0, 0, 1); configData[CONFIG::control::logTextSize - offset] = xml->getpar("console_text_size", 0, 11, 100); configData[CONFIG::control::padSynthInterpolation - offset] = xml->getpar("interpolation", 0, 0, 1); configData[CONFIG::control::virtualKeyboardLayout - offset] = xml->getpar("virtual_keyboard_layout", 0, 1, 6) - 1; configData[CONFIG::control::savedInstrumentFormat - offset] = xml->getpar("saved_instrument_format",0, 1, 3); configData[CONFIG::control::hideNonFatalErrors - offset] = xml->getpar("hide_system_errors", 0, 0, 1); configData[CONFIG::control::logInstrumentLoadTimes - offset] = xml->getpar("report_load_times", 0, 0, 1); configData[CONFIG::control::logXMLheaders - offset] = xml->getpar("report_XMLheaders", 0, 0, 1); configData[CONFIG::control::saveAllXMLdata - offset] = xml->getpar("full_parameters", 0, 0, 1); configData[CONFIG::control::enableHighlight - offset] = xml->getparbool("bank_highlight", bankHighlight); configData[CONFIG::control::jackMidiSource - offset] = textMsgBuffer.push(xml->getparstr("linux_jack_midi_dev"));// string configData[CONFIG::control::jackServer - offset] = textMsgBuffer.push(xml->getparstr("linux_jack_server"));// string configData[CONFIG::control::jackAutoConnectAudio - offset] = xml->getpar("connect_jack_audio", 0, 0, 1); configData[CONFIG::control::alsaMidiSource - offset] = textMsgBuffer.push(xml->getparstr("linux_alsa_midi_dev"));// string configData[CONFIG::control::alsaMidiType - offset] = xml->getpar("alsa_midi_type", 0, 0, 2); configData[CONFIG::control::alsaAudioDevice - offset] = textMsgBuffer.push(xml->getparstr("linux_alsa_audio_dev"));// string configData[CONFIG::control::alsaSampleRate - offset] = xml->getpar("sample_rate", samplerate, 44100, 192000); configData[CONFIG::control::readAudio - offset] = (audio_driver)xml->getpar("audio_engine", 0, no_audio, alsa_audio); configData[CONFIG::control::readMIDI - offset] = (midi_driver)xml->getpar("midi_engine", 0, no_midi, alsa_midi); //configData[CONFIG::control::addPresetRootDir - offset] = // string NOT stored //configData[CONFIG::control::removePresetRootDir - offset] = // returns string NOT used configData[CONFIG::control::currentPresetRoot - offset] = xml->getpar("presetsCurrentRootID", 0, 0, MAX_PRESETS); configData[CONFIG::control::bankRootCC - offset] = xml->getpar("midi_bank_root", 0, 0, 128); configData[CONFIG::control::bankCC - offset] = xml->getpar("midi_bank_C", midi_bank_C, 0, 128); configData[CONFIG::control::enableProgramChange - offset] = 1 - xml->getpar("ignore_program_change", 0, 0, 1); // inverted for Zyn compatibility configData[CONFIG::control::extendedProgramChangeCC - offset] = xml->getpar("midi_upper_voice_C", 0, 0, 128);// return string (in use) configData[CONFIG::control::ignoreResetAllCCs - offset] = xml->getpar("ignore_reset_all_CCs",0,0, 1); configData[CONFIG::control::logIncomingCCs - offset] = xml->getparbool("monitor-incoming_CCs", monitorCCin); configData[CONFIG::control::showLearnEditor - offset] = xml->getparbool("open_editor_on_learned_CC", showLearnedCC); configData[CONFIG::control::enableNRPNs - offset] = xml->getparbool("enable_incoming_NRPNs", enable_NRPN); //configData[CONFIG::control::saveCurrentConfig - offset] = // return string (dummy) xml->exitbranch(); // CONFIGURATION // this is the one that changed //cout << "control "<< control << " val " << value << std::endl; //cout << control - offset << std::endl; configData[control - offset] = value; if (success) { auto xml{std::make_unique(synth, true)}; xml->beginbranch("CONFIGURATION"); xml->addpar("defaultState", configData[CONFIG::control::defaultStateStart - offset]); xml->addpar("sound_buffer_size", configData[CONFIG::control::bufferSize - offset]); xml->addpar("oscil_size", configData[CONFIG::control::oscillatorSize - offset]); xml->addpar("reports_destination", configData[CONFIG::control::reportsDestination - offset]); xml->addpar("console_text_size", configData[CONFIG::control::logTextSize - offset]); xml->addpar("interpolation", configData[CONFIG::control::padSynthInterpolation - offset]); xml->addpar("virtual_keyboard_layout", configData[CONFIG::control::virtualKeyboardLayout - offset] + 1); xml->addpar("saved_instrument_format", configData[CONFIG::control::savedInstrumentFormat - offset]); xml->addpar("hide_system_errors", configData[CONFIG::control::hideNonFatalErrors - offset]); xml->addpar("report_load_times", configData[CONFIG::control::logInstrumentLoadTimes - offset]); xml->addpar("report_XMLheaders", configData[CONFIG::control::logXMLheaders - offset]); xml->addpar("full_parameters", configData[CONFIG::control::saveAllXMLdata - offset]); xml->addparbool("bank_highlight", configData[CONFIG::control::enableHighlight - offset]); xml->addpar("audio_engine", configData[CONFIG::control::readAudio - offset]); xml->addpar("midi_engine", configData[CONFIG::control::readMIDI - offset]); xml->addparstr("linux_jack_server", textMsgBuffer.fetch(configData[CONFIG::control::jackServer - offset])); xml->addparstr("linux_jack_midi_dev", textMsgBuffer.fetch(configData[CONFIG::control::jackMidiSource - offset])); xml->addpar("connect_jack_audio", configData[CONFIG::control::jackAutoConnectAudio - offset]); xml->addpar("alsa_midi_type", configData[CONFIG::control::alsaMidiType - offset]); xml->addparstr("linux_alsa_audio_dev", textMsgBuffer.fetch(configData[CONFIG::control::alsaAudioDevice - offset])); xml->addparstr("linux_alsa_midi_dev", textMsgBuffer.fetch(configData[CONFIG::control::alsaMidiSource - offset])); xml->addpar("sample_rate", configData[CONFIG::control::alsaSampleRate - offset]); xml->addpar("presetsCurrentRootID", configData[CONFIG::control::currentPresetRoot - offset]); xml->addpar("midi_bank_root", configData[CONFIG::control::bankRootCC - offset]); xml->addpar("midi_bank_C", configData[CONFIG::control::bankCC - offset]); xml->addpar("midi_upper_voice_C", configData[CONFIG::control::extendedProgramChangeCC - offset]); xml->addpar("ignore_program_change", (1 - configData[CONFIG::control::enableProgramChange - offset])); xml->addpar("enable_part_on_voice_load", 1); // for backward compatibility xml->addparbool("enable_incoming_NRPNs", configData[CONFIG::control::enableNRPNs - offset]); xml->addpar("ignore_reset_all_CCs",configData[CONFIG::control::ignoreResetAllCCs - offset]); xml->addparbool("monitor-incoming_CCs", configData[CONFIG::control::logIncomingCCs - offset]); xml->addparbool("open_editor_on_learned_CC",configData[CONFIG::control::showLearnEditor - offset]); xml->addpar("root_current_ID", currentRoot); // always store the current root xml->addpar("bank_current_ID", currentBank); // always store the current bank xml->endbranch(); // CONFIGURATION if (!xml->saveXMLfile(configFile, true)) { Log("Failed to update instance config", _SYS_::LogNotSerious); } } } else { Log("loadConfig load instance config" + configFile + " failed"); } } return success; } void Config::defaultPresets() { string presetdirs[] = { presetDir, extendLocalPath("/presets"), /* * TODO * We shouldn't be setting these directly */ "/usr/share/yoshimi/presets", "/usr/local/share/yoshimi/presets", "@end" }; int i = 0; int actual = 0; while (presetdirs[i] != "@end") { if (isDirectory(presetdirs[i])) { Log(presetdirs[i], _SYS_::LogNotSerious); presetsDirlist[actual] = presetdirs[i]; ++actual; } ++i; } } bool Config::extractBaseParameters(XMLwrapper& xml) { if (!xml.enterbranch("BASE_PARAMETERS")) { Log("extractConfigData, no BASE_PARAMETERS branch"); return false; } storedGui = xml.getparbool("enable_gui", showGui); if (!guiChanged) showGui = storedGui; showSplash = xml.getparbool("enable_splash", showSplash); storedCli = xml.getparbool("enable_CLI", showCli); if (!cliChanged) showCli = storedCli; singlePath = xml.getparbool("enable_single_master", singlePath); banksChecked = xml.getparbool("banks_checked", banksChecked); autoInstance = xml.getparbool("enable_auto_instance", autoInstance); if (autoInstance) activeInstances = bitset<32>{xml.getparU("active_instances", 0)}; handlePadSynthBuild = xml.getparU("handle_padsynth_build", 1, 0, 2); // 0 = blocking/muted, 1 = background thread (=default), 2 = auto-Apply on param change showCLIcontext = xml.getpar("show_CLI_context", 1, 0, 2); gzipCompression = xml.getpar("gzip_compression", gzipCompression, 0, 9); // get preset dirs int count = 0; bool found = false; if (!isRegularFile(file::localDir() + "/presetDirs")) { for (int i = 0; i < MAX_PRESET_DIRS; ++i) { if (xml.enterbranch("PRESETSROOT", i)) { string dir = xml.getparstr("presets_root"); if (isDirectory(dir)) { presetsDirlist[count] = dir; found = true; ++count; } xml.exitbranch(); } } if (!found) { defaultPresets(); presetsRootID = 0; savePresetsList(); // move these to new location } } guideVersion = xml.getparstr("guide_version"); manualFile = xml.getparstr("manual"); xml.exitbranch(); // BaseParameters return true; } bool Config::extractConfigData(XMLwrapper& xml) { if (!xml.enterbranch("CONFIGURATION")) { Log("extractConfigData, no CONFIGURATION branch"); Log("Running with defaults"); return true; } /* * default state must be first test as we need to abort * and fetch this instead */ if (sessionStage == _SYS_::type::Normal) { loadDefaultState = xml.getpar("defaultState", loadDefaultState, 0, 1); if (loadDefaultState) { xml.exitbranch(); // CONFIGURATION configChanged = true; sessionStage = _SYS_::type::Default; stateFile = defaultSession; Log("Loading default state"); return true; } } if (sessionStage != _SYS_::type::InProgram) { if (!bufferChanged) buffersize = xml.getpar("sound_buffer_size", buffersize, MIN_BUFFER_SIZE, MAX_BUFFER_SIZE); if (!oscilChanged) oscilsize = xml.getpar("oscil_size", oscilsize, MIN_OSCIL_SIZE, MAX_OSCIL_SIZE); toConsole = xml.getpar("reports_destination", toConsole, 0, 1); consoleTextSize = xml.getpar("console_text_size", consoleTextSize, 11, 100); Interpolation = xml.getpar("interpolation", Interpolation, 0, 1); virKeybLayout = xml.getpar("virtual_keyboard_layout", virKeybLayout, 1, 6) - 1; hideErrors = xml.getpar("hide_system_errors", hideErrors, 0, 1); showTimes = xml.getpar("report_load_times", showTimes, 0, 1); logXMLheaders = xml.getpar("report_XMLheaders", logXMLheaders, 0, 1); xmlmax = xml.getpar("full_parameters", xmlmax, 0, 1); bankHighlight = xml.getparbool("bank_highlight", bankHighlight); loadPresetsList(); presetsRootID = xml.getpar("presetsCurrentRootID", presetsRootID, 0, MAX_PRESETS); // engines if (!engineChanged) audioEngine = (audio_driver)xml.getpar("audio_engine", audioEngine, no_audio, alsa_audio); if (!midiChanged) midiEngine = (midi_driver)xml.getpar("midi_engine", midiEngine, no_midi, alsa_midi); alsaMidiType = xml.getpar("alsa_midi_type", 0, 0, 2); // alsa settings alsaAudioDevice = xml.getparstr("linux_alsa_audio_dev"); alsaMidiDevice = xml.getparstr("linux_alsa_midi_dev"); if (!rateChanged) samplerate = xml.getpar("sample_rate", samplerate, 44100, 192000); // jack settings jackServer = xml.getparstr("linux_jack_server"); jackMidiDevice = xml.getparstr("linux_jack_midi_dev"); if (!connectJackChanged) connectJackaudio = xml.getpar("connect_jack_audio", connectJackaudio, 0, 1); // midi options midi_bank_root = xml.getpar("midi_bank_root", midi_bank_root, 0, 128); midi_bank_C = xml.getpar("midi_bank_C", midi_bank_C, 0, 128); midi_upper_voice_C = xml.getpar("midi_upper_voice_C", midi_upper_voice_C, 0, 128); enableProgChange = 1 - xml.getpar("ignore_program_change", enableProgChange, 0, 1); // inverted for Zyn compatibility instrumentFormat = xml.getpar("saved_instrument_format",instrumentFormat, 1, 3); enable_NRPN = xml.getparbool("enable_incoming_NRPNs", enable_NRPN); ignoreResetCCs = xml.getpar("ignore_reset_all_CCs",ignoreResetCCs,0, 1); monitorCCin = xml.getparbool("monitor-incoming_CCs", monitorCCin); showLearnedCC = xml.getparbool("open_editor_on_learned_CC", showLearnedCC); } if (tempRoot == 0) tempRoot = xml.getpar("root_current_ID", 0, 0, 127); if (tempBank == 0) tempBank = xml.getpar("bank_current_ID", 0, 0, 127); xml.exitbranch(); // CONFIGURATION return true; } bool Config::saveMasterConfig() { xmlType = TOPLEVEL::XML::MasterConfig; auto xml{std::make_unique(synth, true)}; // Note: the XMLwrapper ctor automatically populates the BASE_PARAMETERS string resConfigFile = baseConfig; bool success = xml->saveXMLfile(resConfigFile, false); if (success) configChanged = false; else Log("Failed to save master config to " + resConfigFile, _SYS_::LogNotSerious); return success; } bool Config::saveInstanceConfig() { xmlType = TOPLEVEL::XML::Config; auto xml{std::make_unique(synth, true)}; addConfigXML(*xml); string resConfigFile = configFile; bool success = xml->saveXMLfile(resConfigFile); if (success) configChanged = false; else Log("Failed to save instance to " + resConfigFile, _SYS_::LogNotSerious); return success; } void Config::addConfigXML(XMLwrapper& xml) { xml.beginbranch("CONFIGURATION"); xml.addpar("defaultState", loadDefaultState); xml.addpar("sound_buffer_size", buffersize); xml.addpar("oscil_size", oscilsize); xml.addpar("reports_destination", toConsole); xml.addpar("console_text_size", consoleTextSize); xml.addpar("interpolation", Interpolation); xml.addpar("virtual_keyboard_layout", virKeybLayout + 1); xml.addpar("saved_instrument_format", instrumentFormat); xml.addpar("hide_system_errors", hideErrors); xml.addpar("report_load_times", showTimes); xml.addpar("report_XMLheaders", logXMLheaders); xml.addpar("full_parameters", xmlmax); xml.addparbool("bank_highlight", bankHighlight); xml.addpar("audio_engine", audioEngine); xml.addpar("midi_engine", midiEngine); xml.addparstr("linux_jack_server", jackServer); xml.addparstr("linux_jack_midi_dev", jackMidiDevice); xml.addpar("connect_jack_audio", connectJackaudio); xml.addpar("alsa_midi_type", alsaMidiType); xml.addparstr("linux_alsa_audio_dev", alsaAudioDevice); xml.addparstr("linux_alsa_midi_dev", alsaMidiDevice); xml.addpar("sample_rate", samplerate); xml.addpar("presetsCurrentRootID", presetsRootID); xml.addpar("midi_bank_root", midi_bank_root); xml.addpar("midi_bank_C", midi_bank_C); xml.addpar("midi_upper_voice_C", midi_upper_voice_C); xml.addpar("ignore_program_change", (1 - enableProgChange)); xml.addpar("enable_part_on_voice_load", 1); // for backward compatibility xml.addparbool("enable_incoming_NRPNs", enable_NRPN); xml.addpar("ignore_reset_all_CCs",ignoreResetCCs); xml.addparbool("monitor-incoming_CCs", monitorCCin); xml.addparbool("open_editor_on_learned_CC",showLearnedCC); xml.addpar("root_current_ID", synth.ReadBankRoot()); xml.addpar("bank_current_ID", synth.ReadBank()); xml.endbranch(); // CONFIGURATION } /** * 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); xmlType = TOPLEVEL::XML::State; auto xml{std::make_unique(synth, true)}; capturePatchState(*xml); bool success = xml->saveXMLfile(sessionfile); 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) { xmlType = TOPLEVEL::XML::State; auto xml{std::make_unique(synth, true)}; capturePatchState(*xml); *dataBuffer = xml->getXMLdata(); return strlen(*dataBuffer) + 1; } void Config::capturePatchState(XMLwrapper& 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 { auto xml{std::make_unique(synth, true)}; if (!xml->loadXMLfile(sessionfile)) 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 while (isspace(*dataBuffer)) ++dataBuffer; auto xml{std::make_unique(synth, true)}; if (!xml->putXMLdata(dataBuffer)) Log("SynthEngine: putXMLdata failed"); else return restorePatchState(*xml); return false; } bool Config::restorePatchState(XMLwrapper& xml) { bool success = extractConfigData(xml); if (success) { synth.defaults(); success = synth.getfromXML(xml); if (success) synth.setAllPartMaps(); bool oklearn = synth.midilearn.extractMidiListData(false, xml); if (oklearn) synth.midilearn.updateGui(MIDILEARN::control::hideGUI); // handles possibly undefined window } return success; } bool Config::loadPresetsList() { string presetDirname = file::localDir() + "/presetDirs"; if (!isRegularFile(presetDirname)) { Log("Missing preset directories file"); return false; } xmlType = TOPLEVEL::XML::PresetDirs; auto xml{std::make_unique(synth, true)}; xml->loadXMLfile(presetDirname); if (!xml->enterbranch("PRESETDIRS")) { Log("loadPresetDirsData, no PRESETDIRS branch"); return false; } int count = 0; bool ok{false}; do { if (xml->enterbranch("XMZ_FILE", count)) { presetsDirlist[count] = xml->getparstr("dir"); xml->exitbranch(); ok = true; } else ok = false; ++count; } while (ok); xml->endbranch(); return true; } bool Config::savePresetsList() { string presetDirname = file::localDir() + "/presetDirs"; xmlType = TOPLEVEL::XML::PresetDirs; auto xml{std::make_unique(synth, true)}; xml->beginbranch("PRESETDIRS"); { int count = 0; while (!presetsDirlist[count].empty()) { xml->beginbranch("XMZ_FILE", count); xml->addparstr("dir", presetsDirlist[count]); xml->endbranch(); ++count; } } xml->endbranch(); if (!xml->saveXMLfile(presetDirname)) Log("Failed to save data to " + presetDirname); return true; } 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::LogError(const string &msg) { cerr << "[ERROR] " << msg << endl; } 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::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.3.3/src/Misc/Config.h000066400000000000000000000222101475757676000164260ustar00rootroot00000000000000/* 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/Alloc.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 XMLwrapper; 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 LogError(string const& msg); void flushLog(); bool loadPresetsList(); bool savePresetsList(); bool saveMasterConfig(); bool saveInstanceConfig(); void loadConfig(); bool updateConfig(int control, int value); 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; int lastXMLmajor; int lastXMLminor; bool oldConfig; 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; int enableProgChange; bool toConsole; int consoleTextSize; bool hideErrors; bool showTimes; bool logXMLheaders; bool xmlmax; uint gzipCompression; 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 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(XMLwrapper& xml); bool extractConfigData(XMLwrapper& xml); void capturePatchState(XMLwrapper& xml); bool restorePatchState(XMLwrapper& xml); void addConfigXML(XMLwrapper& xml); void saveJackSession(); string findHtmlManual(); int sigIntActive; int ladi1IntActive; int jsessionSave; const string programcommand; string jackSessionDir; string baseConfig; string presetDir; friend class YoshimiLV2Plugin; }; #endif /*CONFIG_H*/ yoshimi-2.3.3.3/src/Misc/DataBlockBuff.h000066400000000000000000000102001475757676000176440ustar00rootroot00000000000000/* 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.3.3/src/Misc/FileMgrFuncs.h000066400000000000000000000546411475757676000175620ustar00rootroot00000000000000/* 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 "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(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"; gzputs(gzfile, data); gzclose(gzfile); return ""; } 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 char * loadGzipped(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; } /* * 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.3.3/src/Misc/FormatFuncs.h000066400000000000000000000162001475757676000174520ustar00rootroot00000000000000/* 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 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(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 float string2float(std::string str) { std::istringstream machine(str); float fval; machine >> fval; return fval; } inline double string2double(std::string str) { std::istringstream machine(str); double dval; machine >> dval; return dval; } 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 machine(str); int intval; machine >> intval; return intval; } inline int64_t string2int64(std::string str) { std::istringstream machine(str); int64_t longval; machine >> longval; return longval; } /* ensures MIDI compatible numbers without errors */ inline int string2int127(std::string str) { std::istringstream machine(str); int intval; machine >> intval; if (intval < 0) intval = 0; else if (intval > 127) intval = 127; return intval; } inline uint string2uint(std::string str) { std::istringstream machine(str); uint intval; machine >> intval; 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.3.3/src/Misc/Hash.h000066400000000000000000000052231475757676000161110ustar00rootroot00000000000000/* 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.3.3/src/Misc/InstanceManager.cpp000066400000000000000000000564061475757676000206310ustar00rootroot00000000000000/* 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 { if (isPrimary()) synth->loadHistory(); // discover persistent bank file structure synth->installBanks(); // // 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().LogError("Maximum number("+asString(MAX_INSTANCES) +") of Synth-Engine instances exceeded."); 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.3.3/src/Misc/InstanceManager.h000066400000000000000000000051161475757676000202660ustar00rootroot00000000000000/* 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.3.3/src/Misc/Microtonal.cpp000066400000000000000000000723641475757676000177020ustar00rootroot00000000000000/* 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/XMLwrapper.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(XMLwrapper& xml) { xml.addparstr("name", Pname); xml.addparstr("comment", Pcomment); xml.addparbool("invert_up_down", Pinvertupdown); xml.addpar("invert_up_down_center", Pinvertupdowncenter); xml.addparbool("enabled", Penabled); xml.addparcombi("global_fine_detune", Pglobalfinedetune); xml.addpar("a_note", PrefNote); xml.addparreal("a_freq", PrefFreq); if (!Penabled && xml.minimal) return; xml.beginbranch("SCALE"); xml.addpar("scale_shift", Pscaleshift); xml.addpar("first_key", Pfirstkey); xml.addpar("last_key", Plastkey); xml.addpar("middle_note", Pmiddlenote); xml.beginbranch("OCTAVE"); xml.addpar("octave_size", octavesize); for (size_t i = 0; i < octavesize; ++i) { xml.beginbranch("DEGREE", i); if (octave[i].type == 1) { xml.addparstr("cents_text",octave[i].text); xml.addparreal("cents", octave[i].tuning); /* * This is downgraded to preserve compatibility * with both Zyn and older Yoshi versions */ } if (octave[i].type == 2) { xml.addparstr("cents_text",octave[i].text); xml.addpar("numerator", octave[i].x1); xml.addpar("denominator", octave[i].x2);; } xml.addparstr("comment" , octave[i].comment); xml.endbranch(); } xml.endbranch(); xml.beginbranch("KEYBOARD_MAPPING"); xml.addpar("map_size", Pmapsize); xml.addpar("formal_octave_size", PformalOctaveSize); xml.addpar("mapping_enabled", Pmappingenabled); for (int i = 0; i < Pmapsize; ++i) { xml.beginbranch("KEYMAP", i); xml.addpar("degree", Pmapping[i]); xml.addparstr("comment", PmapComment[i]); xml.endbranch(); } xml.endbranch(); xml.endbranch(); } int Microtonal::getfromXML(XMLwrapper& xml) { int err = 0; Pname = xml.getparstr("name"); Pcomment = xml.getparstr("comment"); Pinvertupdown =xml.getparbool("invert_up_down", Pinvertupdown); Pinvertupdowncenter = xml.getpar127("invert_up_down_center", Pinvertupdowncenter); Penabled=xml.getparbool("enabled", Penabled); setglobalfinedetune(xml.getparcombi("global_fine_detune", Pglobalfinedetune, 0, 127)); PrefNote = xml.getpar127("a_note", PrefNote); PrefFreq = xml.getparreal("a_freq", PrefFreq, 1.0, 10000.0); if (xml.enterbranch("SCALE")) { Pscaleshift = xml.getpar127("scale_shift", Pscaleshift); Pfirstkey = xml.getpar127("first_key", Pfirstkey); Plastkey = xml.getpar127("last_key", Plastkey); Pmiddlenote = xml.getpar127("middle_note", Pmiddlenote); if (xml.enterbranch("OCTAVE")) { octavesize = xml.getpar127("octave_size", octavesize); for (size_t i = 0; i < octavesize; ++i) { octave[i].text = ""; if (!xml.enterbranch("DEGREE", i)) continue; string text = xml.getparstr("cents_text"); octave[i].x2 = 0; if (text > " ") { octave[i].text = reformatline(text); octave[i].tuning = pow(2.0, stod(text) / 1200.0); } else { octave[i].text = ""; octave[i].tuning = xml.getparreal("cents", octave[i].tuning); } octave[i].x1 = xml.getpar("numerator", octave[i].x1, 0, INT_MAX); octave[i].x2 = xml.getpar("denominator", octave[i].x2, 0, INT_MAX); if (octave[i].x2) { octave[i].text = text; 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 wierd 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 = ""; octave[i].comment = xml.getparstr("comment"); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("KEYBOARD_MAPPING")) { Pmapsize = xml.getpar127("map_size", Pmapsize); PformalOctaveSize = xml.getpar127("formal_octave_size", PformalOctaveSize); Pmappingenabled = xml.getpar127("mapping_enabled", Pmappingenabled); for (int i = 0; i < Pmapsize; ++i) { if (!xml.enterbranch("KEYMAP", i)) continue; Pmapping[i] = xml.getpar("degree", Pmapping[i], -1, 127); PmapComment[i] = xml.getparstr("comment"); if (Pmapping[i] >= Pmapsize) { err = SCALES::errors::valueTooBig; break; } xml.exitbranch(); } xml.exitbranch(); } xml.exitbranch(); } return err; } bool Microtonal::saveXML(string const& filename) { synth->getRuntime().xmlType = TOPLEVEL::XML::Scale; auto xml{std::make_unique(*synth)}; xml->beginbranch("MICROTONAL"); add2XML(*xml); xml->endbranch(); bool result = xml->saveXMLfile(filename); return result; } int Microtonal::loadXML(string const& filename) { int err = 0; auto xml{std::make_unique(*synth)}; if (!xml->loadXMLfile(filename)) { return 1; } if (!xml->enterbranch("MICROTONAL")) { synth->getRuntime().Log(filename + " is not a scale file", _SYS_::LogError); return 1; } err = getfromXML(*xml); if (err != 0) { return err; } xml->exitbranch(); synth->setAllPartMaps(); return 0; } 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.3.3/src/Misc/Microtonal.h000066400000000000000000000077641475757676000173510ustar00rootroot00000000000000/* 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 XMLwrapper; 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(XMLwrapper&); int getfromXML(XMLwrapper&); 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.3.3/src/Misc/MirrorData.h000066400000000000000000000051641475757676000172760ustar00rootroot00000000000000/* 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.3.3/src/Misc/NumericFuncs.h000066400000000000000000000300151475757676000176240ustar00rootroot00000000000000/* 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.3.3/src/Misc/Part.cpp000066400000000000000000001632261475757676000164770ustar00rootroot00000000000000/* 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/Microtonal.h" #include "Misc/XMLwrapper.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}, 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; 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 = 0; 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->filtercutoff.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::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); } void Part::add2XMLinstrument(XMLwrapper& xml) { xml.beginbranch("INFO"); xml.addparstr("name", Poriginal); xml.addparstr("author", info.Pauthor); xml.addparstr("comments", info.Pcomments); xml.addpar("type", type_offset[info.Ptype]); xml.addparstr("file", Pname); xml.endbranch(); if (Pname == DEFAULT_NAME) return; xml.beginbranch("INSTRUMENT_KIT"); xml.addpar("kit_mode", Pkitmode); xml.addparbool("kit_crossfade", PkitfadeType != 0); // for backward compatibility xml.addpar("kit_fadetype", PkitfadeType); xml.addparbool("drum_mode", Pdrummode); for (int i = 0; i < NUM_KIT_ITEMS; ++i) { xml.beginbranch("INSTRUMENT_KIT_ITEM",i); xml.addparbool("enabled", kit[i].Penabled); if (kit[i].Penabled) { xml.addparstr("name", kit[i].Pname); xml.addparbool("muted", kit[i].Pmuted); xml.addpar("min_key", kit[i].Pminkey); xml.addpar("max_key", kit[i].Pmaxkey); xml.addpar("send_to_instrument_effect", kit[i].Psendtoparteffect); xml.addparbool("add_enabled", kit[i].Padenabled); if (kit[i].Padenabled && kit[i].adpars) { xml.beginbranch("ADD_SYNTH_PARAMETERS"); kit[i].adpars->add2XML(xml); xml.endbranch(); } xml.addparbool("sub_enabled", kit[i].Psubenabled); if (kit[i].Psubenabled && kit[i].subpars) { xml.beginbranch("SUB_SYNTH_PARAMETERS"); kit[i].subpars->add2XML(xml); xml.endbranch(); } xml.addparbool("pad_enabled", kit[i].Ppadenabled); if (kit[i].Ppadenabled && kit[i].padpars) { xml.beginbranch("PAD_SYNTH_PARAMETERS"); kit[i].padpars->add2XML(xml); xml.endbranch(); } } xml.endbranch(); } xml.endbranch(); xml.beginbranch("INSTRUMENT_EFFECTS"); for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { xml.beginbranch("INSTRUMENT_EFFECT",nefx); xml.beginbranch("EFFECT"); partefx[nefx]->add2XML(xml); xml.endbranch(); xml.addpar("route", Pefxroute[nefx]); partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); xml.addparbool("bypass",Pefxbypass[nefx]); xml.endbranch(); } xml.endbranch(); } void Part::add2XML(XMLwrapper& xml, bool subset) { // parameters if (!subset) { xml.addparbool("enabled", (Penabled == 1)); xml.addpar("volume", Pvolume); xml.addpar("panning", Ppanning); xml.addpar("min_key", Pminkey); xml.addpar("max_key", Pmaxkey); xml.addpar("key_shift", Pkeyshift); xml.addpar("rcv_chn", Prcvchn); xml.addpar("velocity_sensing", Pvelsns); xml.addpar("velocity_offset", Pveloffs); // the following two lines maintain backward compatibility xml.addparbool("poly_mode", (Pkeymode & MIDI_NOT_LEGATO) == PART_NORMAL); xml.addpar("legato_mode", (Pkeymode & MIDI_NOT_LEGATO) == PART_LEGATO); xml.addpar("channel_aftertouch", PchannelATchoice); xml.addpar("key_aftertouch", PkeyATchoice); xml.addpar("key_limit", Pkeylimit); xml.addpar("random_detune", Pfrand); xml.addpar("random_velocity", Pvelrand); xml.addpar("destination", Paudiodest); } xml.beginbranch("INSTRUMENT"); add2XMLinstrument(xml); if (subset) { xml.addpar("key_mode", Pkeymode & MIDI_NOT_LEGATO); xml.addpar("channel_aftertouch", PchannelATchoice); xml.addpar("key_aftertouch", PkeyATchoice); xml.addpar("random_detune", Pfrand); xml.addpar("random_velocity", Pvelrand); xml.addparbool("breath_disable", PbreathControl != MIDI::CC::breath); } xml.endbranch(); xml.beginbranch("CONTROLLER"); ctl->add2XML(xml); xml.endbranch(); } bool Part::saveXML(string filename, bool yoshiFormat) { synth->getRuntime().xmlType = TOPLEVEL::XML::Instrument; auto xml{std::make_unique(*synth, yoshiFormat)}; if (Pname < "!") // this shouldn't be possible Pname = UNTITLED; else if ((Poriginal.empty() || Poriginal == UNTITLED) && Pname != UNTITLED) Poriginal = Pname; if (yoshiFormat) { filename = setExtension(filename, EXTEN::yoshInst); add2XML(*xml, yoshiFormat); } else { filename = setExtension(filename, EXTEN::zynInst); xml->beginbranch("INSTRUMENT"); add2XMLinstrument(*xml); xml->endbranch(); } bool result = xml->saveXMLfile(filename); return result; } int Part::loadXMLinstrument(string filename) { bool hasYoshi = true; filename = setExtension(filename, EXTEN::yoshInst); if (!isRegularFile(filename)) { hasYoshi = false; filename = setExtension(filename, EXTEN::zynInst); } auto xml{std::make_unique(*synth, hasYoshi)}; if (!xml->loadXMLfile(filename)) { synth->getRuntime().Log("Part: loadXML failed to load instrument file " + filename); return 0; } if (xml->enterbranch("INSTRUMENT") == 0) { synth->getRuntime().Log(filename + " is not an instrument file"); return 0; } defaultsinstrument(); PyoshiType = xml->information.yoshiType; Pname = findLeafName(filename); int chk = findSplitPoint(Pname); if (chk > 0) Pname = Pname.substr(chk + 1, Pname.size() - chk - 1); getfromXMLinstrument(*xml); // possibly changed part-effect; publish to GUI if current part if (int(partID) == synth->getRuntime().currentPart) synth->pushEffectUpdate(partID); if (hasYoshi) { Pkeymode = xml->getpar("key_mode", Pkeymode, PART_NORMAL, MIDI_LEGATO); Pfrand = xml->getpar127("random_detune", Pfrand); if (Pfrand > 50) Pfrand = 50; Pvelrand = xml->getpar127("random_velocity", Pvelrand); if (Pvelrand > 50) Pvelrand = 50; PbreathControl = xml->getparbool("breath_disable", PbreathControl); if (PbreathControl) PbreathControl = UNUSED; // impossible CC value else PbreathControl = MIDI::CC::breath; } xml->exitbranch(); if (xml->enterbranch("CONTROLLER")) { ctl->getfromXML(*xml); xml->exitbranch(); } xml->exitbranch(); return 1; } void Part::getfromXMLinstrument(XMLwrapper& xml) { string tempname; if (xml.enterbranch("INFO")) { Poriginal = xml.getparstr("name"); // counting type numbers but checking the *contents* of type_offset() info.Pauthor = func::formatTextLines(xml.getparstr("author"), 54); info.Pcomments = func::formatTextLines(xml.getparstr("comments"), 54); int found = xml.getpar("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 = xml.getparstr("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; } xml.exitbranch(); } if (!xml.enterbranch("INSTRUMENT_KIT")) { defaultsinstrument(); return; } else { Pkitmode = xml.getpar127("kit_mode", Pkitmode); // 0=off, 1=on, 2="single": only first applicable kit item is playing bool oldfade = xml.getparbool("kit_crossfade", false); PkitfadeType = xml.getpar127("kit_fadetype", 0); if (PkitfadeType == 0 && oldfade == true) PkitfadeType = 1; // it's an older instrument Pdrummode = xml.getparbool("drum_mode", Pdrummode); for (int i = 0; i < NUM_KIT_ITEMS; ++i) { if (!xml.enterbranch("INSTRUMENT_KIT_ITEM", i)) continue; setkititemstatus(i, xml.getparbool("enabled", kit[i].Penabled)); if (!kit[i].Penabled) { xml.exitbranch(); continue; } kit[i].Pname = xml.getparstr("name"); kit[i].Pmuted = xml.getparbool("muted", kit[i].Pmuted); kit[i].Pminkey = xml.getpar127("min_key", kit[i].Pminkey); kit[i].Pmaxkey = xml.getpar127("max_key", kit[i].Pmaxkey); kit[i].Psendtoparteffect = xml.getpar127("send_to_instrument_effect", kit[i].Psendtoparteffect); kit[i].Padenabled = xml.getparbool("add_enabled", kit[i].Padenabled); if (xml.enterbranch("ADD_SYNTH_PARAMETERS")) { kit[i].adpars->getfromXML(xml); xml.exitbranch(); } kit[i].Psubenabled = xml.getparbool("sub_enabled", kit[i].Psubenabled); if (xml.enterbranch("SUB_SYNTH_PARAMETERS")) { kit[i].subpars->getfromXML(xml); xml.exitbranch(); } kit[i].Ppadenabled = xml.getparbool("pad_enabled", kit[i].Ppadenabled); if (xml.enterbranch("PAD_SYNTH_PARAMETERS")) { busy = true; kit[i].padpars->getfromXML(xml); busy = false; xml.exitbranch(); } xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("INSTRUMENT_EFFECTS")) { for (int nefx = 0; nefx < NUM_PART_EFX; ++nefx) { if (!xml.enterbranch("INSTRUMENT_EFFECT", nefx)) continue; if (xml.enterbranch("EFFECT")) { partefx[nefx]->getfromXML(xml); xml.exitbranch(); } Pefxroute[nefx] = xml.getpar("route", Pefxroute[nefx], 0, NUM_PART_EFX); partefx[nefx]->setdryonly(Pefxroute[nefx] == 2); Pefxbypass[nefx] = xml.getparbool("bypass", Pefxbypass[nefx]); xml.exitbranch(); } xml.exitbranch(); } } void Part::getfromXML(XMLwrapper& xml) { Penabled = (xml.getparbool("enabled", Penabled) == 1); setVolume(xml.getpar127("volume", Pvolume)); setPan(xml.getpar127("panning", Ppanning)); Pminkey = xml.getpar127("min_key", Pminkey); Pmaxkey = xml.getpar127("max_key", Pmaxkey); Pkeyshift = xml.getpar("key_shift", Pkeyshift, MIN_KEY_SHIFT + 64, MAX_KEY_SHIFT + 64); Prcvchn = xml.getpar127("rcv_chn", Prcvchn); Pvelsns = xml.getpar127("velocity_sensing", Pvelsns); Pveloffs = xml.getpar127("velocity_offset", Pveloffs); bool Ppolymode = 1; bool Plegatomode = 0; Ppolymode = xml.getparbool("poly_mode", Ppolymode); Plegatomode = xml.getparbool("legato_mode", Plegatomode); // older versions if (!Plegatomode) Plegatomode = xml.getpar127("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 = xml.getpar("channel_aftertouch", PchannelATchoice, 0, 255); PkeyATchoice = xml.getpar("key_aftertouch", PkeyATchoice, 0, 255); Pkeylimit = xml.getpar127("key_limit", Pkeylimit); if (Pkeylimit < 1 || Pkeylimit > POLYPHONY) Pkeylimit = POLYPHONY; Pfrand = xml.getpar127("random_detune", Pfrand); if (Pfrand > 50) Pfrand = 50; Pvelrand = xml.getpar127("random_velocity", Pvelrand); if (Pvelrand > 50) Pvelrand = 50; setDestination(xml.getpar127("destination", Paudiodest)); if (xml.enterbranch("INSTRUMENT")) { Pname.clear(); // erase any previous name getfromXMLinstrument(xml); xml.exitbranch(); } if (xml.enterbranch("CONTROLLER")) { ctl->getfromXML(xml); xml.exitbranch(); } } 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::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.3.3/src/Misc/Part.h000066400000000000000000000207671475757676000161460ustar00rootroot00000000000000/* 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 XMLwrapper; class Microtonal; class EffectMgr; class SynthEngine; class Part { public: enum NoteStatus { KEY_OFF, KEY_PLAYING, KEY_RELEASED_AND_SUSTAINED, KEY_RELEASED }; ~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(); bool saveXML(string filename, bool yoshiFormat); // result true for load ok, otherwise false int loadXMLinstrument(string filename); void add2XML(XMLwrapper& xml, bool subset = false); void add2XMLinstrument(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); void getfromXMLinstrument(XMLwrapper& xml); 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; 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 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'. SynthEngine* synth; }; #endif /*PART_H*/ yoshimi-2.3.3.3/src/Misc/RandomGen.h000066400000000000000000000146731475757676000171110ustar00rootroot00000000000000/* 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.3.3/src/Misc/SynthEngine.cpp000066400000000000000000003103521475757676000200160ustar00rootroot00000000000000/* 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 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 #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/XMLwrapper.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} , fileCompatible{true} // 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]->loadXMLinstrument(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.LogError("interChange init failed"); 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; fileCompatible = true; // 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 (!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) { 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) && 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 } // 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 if (part[npart]->Prcvchn == chan && 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) { 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]->loadXMLinstrument(fname)) ok = false; return ok; } int SynthEngine::ReadBankRoot() { return Runtime.currentRoot; } int SynthEngine::ReadBank() { return Runtime.currentBank; } // Set part's channel number void SynthEngine::SetPartChan(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; } } 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) { 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) { 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) { 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)); 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) && part[i]->Prcvchn == (type - 64)) { 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 } SetPartChan(chan, chan); SetPartChan(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 { SetPartChan(chan | 32, chan); SetPartChan(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() { string name = file::configDir() + '/' + YOSHIMI; string bankname = name + ".banks"; bool newBanks = false; if (isRegularFile(bankname)) { newBanks = bank.establishBanks(bankname); } 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"; Runtime.xmlType = TOPLEVEL::XML::Bank; auto xml{std::make_unique(*this, true)}; xml->beginbranch("BANKLIST"); bank.saveToConfigFile(*xml); xml->endbranch(); if (!xml->saveXMLfile(bankname)) Runtime.Log("Failed to save config to " + bankname); return true; } void SynthEngine::newHistory(string name, int group) { if (findLeafName(name) < "!") return; if (group == TOPLEVEL::XML::Instrument && (name.rfind(EXTEN::yoshInst) != string::npos)) name = setExtension(name, EXTEN::zynInst); getHistory(group).push_back(name); } void SynthEngine::addHistory(string const& name, int 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& listType{getHistory(group)}; auto it = listType.begin(); listType.erase(std::remove(it, listType.end(), name), listType.end()); // remove all matches listType.insert(listType.begin(), name); while(listType.size() > MAX_HISTORY) listType.pop_back(); } vector& SynthEngine::getHistory(int 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 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 historyname = file::localDir() + "/recent"; if (!isRegularFile(historyname)) { // recover old version historyname = file::configDir() + '/' + YOSHIMI + ".history"; if (!isRegularFile(historyname)) { Runtime.Log("Missing recent history file"); return false; } } auto xml{std::make_unique(*this, true)}; xml->loadXMLfile(historyname); if (!xml->enterbranch("HISTORY")) { Runtime. Log("extractHistoryData, no HISTORY branch"); return false; } int hist_size; int count; string filetype; string type; string extension; for (count = TOPLEVEL::XML::Instrument; count <= TOPLEVEL::XML::ScalaMap; ++count) { switch (count) { case TOPLEVEL::XML::Instrument: type = "XMZ_INSTRUMENTS"; extension = "xiz_file"; break; case TOPLEVEL::XML::Patch: type = "XMZ_PATCH_SETS"; extension = "xmz_file"; break; case TOPLEVEL::XML::Scale: type = "XMZ_SCALE"; extension = "xsz_file"; break; case TOPLEVEL::XML::State: type = "XMZ_STATE"; extension = "state_file"; break; case TOPLEVEL::XML::Vector: type = "XMZ_VECTOR"; extension = "xvy_file"; break; case TOPLEVEL::XML::MLearn: type = "XMZ_MIDILEARN"; extension = "xly_file"; break; case TOPLEVEL::XML::Presets: type = "XMZ_PRESETS"; extension = "xpz_file"; break; case TOPLEVEL::XML::PadSample: type = "XMZ_PADSAMPLE"; extension = "wav_file"; break; case TOPLEVEL::XML::ScalaTune: type = "XMZ_TUNING"; extension = "scl_file"; break; case TOPLEVEL::XML::ScalaMap: type = "XMZ_KEYMAP"; extension = "kbm_file"; break; } if (xml->enterbranch(type)) { // should never exceed max history Runtime.historyLock[count] = xml->getparbool("lock_status", false); hist_size = xml->getpar("history_size", 0, 0, MAX_HISTORY); if (hist_size > 0) { for (int i = 0; i < hist_size; ++i) { if (xml->enterbranch("XMZ_FILE", i)) { filetype = xml->getparstr(extension); if (extension == "xiz_file" && !isRegularFile(filetype)) { if (filetype.rfind(EXTEN::zynInst) != string::npos) filetype = setExtension(filetype, EXTEN::yoshInst); } if (filetype.size() && isRegularFile(filetype)) newHistory(filetype, count); xml->exitbranch(); } } string tryRecent = xml->getparstr("most_recent"); if (!tryRecent.empty()) historyLastSeen.at(count) = tryRecent; } xml->exitbranch(); } } xml->exitbranch(); return true; } bool SynthEngine::saveHistory() { string historyname = file::localDir() + "/recent"; Runtime.xmlType = TOPLEVEL::XML::History; auto xml{std::make_unique(*this, true)}; xml->beginbranch("HISTORY"); { int count; string type; string extension; for (count = TOPLEVEL::XML::Instrument; count <= TOPLEVEL::XML::ScalaMap; ++count) { switch (count) { case TOPLEVEL::XML::Instrument: type = "XMZ_INSTRUMENTS"; extension = "xiz_file"; break; case TOPLEVEL::XML::Patch: type = "XMZ_PATCH_SETS"; extension = "xmz_file"; break; case TOPLEVEL::XML::Scale: type = "XMZ_SCALE"; extension = "xsz_file"; break; case TOPLEVEL::XML::State: type = "XMZ_STATE"; extension = "state_file"; break; case TOPLEVEL::XML::Vector: type = "XMZ_VECTOR"; extension = "xvy_file"; break; case TOPLEVEL::XML::MLearn: type = "XMZ_MIDILEARN"; extension = "xly_file"; break; case TOPLEVEL::XML::Presets: type = "XMZ_PRESETS"; extension = "xpz_file"; break; case TOPLEVEL::XML::PadSample: type = "XMZ_PADSAMPLE"; extension = "wav_file"; break; case TOPLEVEL::XML::ScalaTune: type = "XMZ_TUNING"; extension = "scl_file"; break; case TOPLEVEL::XML::ScalaMap: type = "XMZ_KEYMAP"; extension = "kbm_file"; break; } vector const& listType{getHistory(count)}; if (listType.size()) { int x = 0; xml->beginbranch(type); xml->addparbool("lock_status", Runtime.historyLock[count]); xml->addpar("history_size", listType.size()); for (auto const& historyEntry : listType) { xml->beginbranch("XMZ_FILE", x); xml->addparstr(extension, historyEntry); xml->endbranch(); ++x; } xml->addparstr("most_recent", historyLastSeen.at(count)); xml->endbranch(); } } } xml->endbranch(); if (!xml->saveXMLfile(historyname)) Runtime.Log("Failed to save data to " + historyname); return true; } void SynthEngine::add2XML(XMLwrapper& xml) { xml.beginbranch("MASTER"); xml.addpar("current_midi_parts", Runtime.numAvailableParts); xml.addpar("panning_law", Runtime.panLaw); xml.addparcombi("volume", Pvolume); xml.addpar("key_shift", Pkeyshift); xml.addparreal("bpm_fallback", PbpmFallback); xml.addpar("channel_switch_type", Runtime.channelSwitchType); xml.addpar("channel_switch_CC", Runtime.channelSwitchCC); xml.beginbranch("MICROTONAL"); microtonal.add2XML(xml); xml.endbranch(); for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { xml.beginbranch("PART",npart); part[npart]->add2XML(xml); xml.endbranch(); } xml.beginbranch("SYSTEM_EFFECTS"); for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { xml.beginbranch("SYSTEM_EFFECT", nefx); xml.beginbranch("EFFECT"); sysefx[nefx]->add2XML(xml); xml.endbranch(); for (int pefx = 0; pefx < NUM_MIDI_PARTS; ++pefx) { xml.beginbranch("VOLUME", pefx); xml.addpar("vol", Psysefxvol[nefx][pefx]); xml.endbranch(); } for (int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { xml.beginbranch("SENDTO", tonefx); xml.addpar("send_vol", Psysefxsend[nefx][tonefx]); xml.endbranch(); } xml.endbranch(); } xml.endbranch(); xml.beginbranch("INSERTION_EFFECTS"); for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { xml.beginbranch("INSERTION_EFFECT", nefx); xml.addpar("part", Pinsparts[nefx]); xml.beginbranch("EFFECT"); insefx[nefx]->add2XML(xml); xml.endbranch(); xml.endbranch(); } xml.endbranch(); // INSERTION_EFFECTS for (int i = 0; i < NUM_MIDI_CHANNELS; ++i) { if (Runtime.vectordata.Xaxis[i] < 127) { xml.beginbranch("VECTOR", i); vectorcontrol.insertVectorData(i, false, xml, ""); xml.endbranch(); // VECTOR } } xml.endbranch(); // MASTER } bool SynthEngine::savePatchesXML(string filename) { filename = setExtension(filename, EXTEN::patchset); Runtime.xmlType = TOPLEVEL::XML::Patch; auto xml{std::make_unique(*this, true)}; add2XML(*xml); bool succes = xml->saveXMLfile(filename); return succes; } bool SynthEngine::loadXML(string const& filename) { auto xml{std::make_unique(*this, true)}; if (!xml->loadXMLfile(filename)) { return false; } defaults(); bool success = getfromXML(*xml); setAllPartMaps(); return success; } bool SynthEngine::getfromXML(XMLwrapper& xml) { if (!xml.enterbranch("MASTER")) { Runtime.Log("SynthEngine getfromXML, no MASTER branch"); return false; } Runtime.numAvailableParts = xml.getpar("current_midi_parts", NUM_MIDI_CHANNELS, NUM_MIDI_CHANNELS, NUM_MIDI_PARTS); Runtime.panLaw = xml.getpar("panning_law", Runtime.panLaw, MAIN::panningType::cut, MAIN::panningType::boost); setPvolume(xml.getparcombi("volume", Pvolume, 0, 127)); setPkeyshift(xml.getpar("key_shift", Pkeyshift, MIN_KEY_SHIFT + 64, MAX_KEY_SHIFT + 64)); PbpmFallback = xml.getparreal("bpm_fallback", PbpmFallback, BPM_FALLBACK_MIN, BPM_FALLBACK_MAX); Runtime.channelSwitchType = xml.getpar("channel_switch_type", Runtime.channelSwitchType, 0, 5); Runtime.channelSwitchCC = xml.getpar("channel_switch_CC", Runtime.channelSwitchCC, 0, 128); Runtime.channelSwitchValue = 0; for (int npart = 0; npart < NUM_MIDI_PARTS; ++npart) { if (!xml.enterbranch("PART", npart)) continue; part[npart]->getfromXML(xml); xml.exitbranch(); if (partonoffRead(npart) && (part[npart]->Paudiodest & 2)) Config::instances().registerAudioPort(getUniqueId(), npart); } if (xml.enterbranch("MICROTONAL")) { microtonal.getfromXML(xml); xml.exitbranch(); } sysefx[0]->defaults(); if (xml.enterbranch("SYSTEM_EFFECTS")) { for (int nefx = 0; nefx < NUM_SYS_EFX; ++nefx) { if (!xml.enterbranch("SYSTEM_EFFECT", nefx)) continue; if (xml.enterbranch("EFFECT")) { sysefx[nefx]->getfromXML(xml); xml.exitbranch(); } for (int partefx = 0; partefx < NUM_MIDI_PARTS; ++partefx) { if (!xml.enterbranch("VOLUME", partefx)) continue; setPsysefxvol(partefx, nefx,xml.getpar127("vol", Psysefxvol[partefx][nefx])); xml.exitbranch(); } for (int tonefx = nefx + 1; tonefx < NUM_SYS_EFX; ++tonefx) { if (!xml.enterbranch("SENDTO", tonefx)) continue; setPsysefxsend(nefx, tonefx, xml.getpar127("send_vol", Psysefxsend[nefx][tonefx])); xml.exitbranch(); } xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("INSERTION_EFFECTS")) { for (int nefx = 0; nefx < NUM_INS_EFX; ++nefx) { if (!xml.enterbranch("INSERTION_EFFECT", nefx)) continue; Pinsparts[nefx] = xml.getpar("part", Pinsparts[nefx], -2, NUM_MIDI_PARTS); if (xml.enterbranch("EFFECT")) { insefx[nefx]->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } xml.exitbranch(); } for (uchar i = 0; i < NUM_MIDI_CHANNELS; ++i) { if (xml.enterbranch("VECTOR", i)) { vectorcontrol.extractVectorData(i, xml, ""); xml.endbranch(); } } xml.endbranch(); // MASTER // 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.3.3/src/Misc/SynthEngine.h000066400000000000000000000257311475757676000174670ustar00rootroot00000000000000/* SynthEngine.h 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 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 XMLwrapper; 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(XMLwrapper& xml); 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, int group); void addHistory(string const& name, int group); std::vector& getHistory(int group); void setHistoryLock(int group, bool status); bool getHistoryLock(int group); string lastItemSeen(int group); bool loadHistory(); bool saveHistory(); bool getfromXML(XMLwrapper& xml); 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 int 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 SetPartChan(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; bool fileCompatible; 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 yoshimi-2.3.3.3/src/Misc/SynthHelper.h000066400000000000000000000174741475757676000175060ustar00rootroot00000000000000/* 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.3.3/src/Misc/TestInvoker.h000066400000000000000000000520601475757676000175040ustar00rootroot00000000000000/* 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.3.3/src/Misc/TestSequence.h000066400000000000000000000101751475757676000176400ustar00rootroot00000000000000/* 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.3.3/src/Misc/TextMsgBuffer.h000066400000000000000000000114101475757676000177460ustar00rootroot00000000000000/* 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); } ~TextMsgBuffer() { sem_destroy(&lock); } public: /* Meyer's Singleton */ static TextMsgBuffer& instance() { static TextMsgBuffer singleton{}; return singleton; } #ifdef MAX_MSG int count; #endif void init(); void clear(); int push(std::string text); std::string fetch(int pos, bool remove = true); }; inline void TextMsgBuffer::init() { 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.3.3/src/Misc/Util.h000066400000000000000000000052461475757676000161500ustar00rootroot00000000000000/* 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.3.3/src/Misc/WavFile.cpp000066400000000000000000000053731475757676000171240ustar00rootroot00000000000000/* 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.3.3/src/Misc/WavFile.h000066400000000000000000000024361475757676000165660ustar00rootroot00000000000000/* 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.3.3/src/Misc/WaveShapeSamples.h000066400000000000000000000143741475757676000204450ustar00rootroot00000000000000/* 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.3.3/src/Misc/XMLwrapper.cpp000066400000000000000000000620671475757676000176330ustar00rootroot00000000000000/* XMLwrapper.cpp - XML wrapper 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. */ #include #include #include #include #include "Misc/Config.h" #include "Misc/XMLwrapper.h" #include "Misc/SynthEngine.h" #include "Misc/FileMgrFuncs.h" #include "Misc/FormatFuncs.h" 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::string; const char *XMLwrapper_whitespace_callback(mxml_node_t* node, int where) { const char *name = mxmlGetElement(node); if (where == MXML_WS_BEFORE_OPEN && !strncmp(name, "?xml", 4)) return NULL; if (where == MXML_WS_BEFORE_CLOSE && !strncmp(name, "string", 6)) return NULL; if (where == MXML_WS_BEFORE_OPEN || where == MXML_WS_BEFORE_CLOSE) return "\n"; return NULL; } XMLwrapper::XMLwrapper(SynthEngine& _synth, bool _isYoshi, bool includeBase) : stackpos(0), xml_k(0), isYoshi(_isYoshi), synth(_synth) { minimal = 1 - synth.getRuntime().xmlmax; information.PADsynth_used = 0; information.ADDsynth_used = 0; information.SUBsynth_used = 0; memset(&parentstack, 0, sizeof(parentstack)); tree = mxmlNewElement(MXML_NO_PARENT, "?xml version=\"1.0\" encoding=\"UTF-8\"?"); mxml_node_t *doctype = mxmlNewElement(tree, "!DOCTYPE"); if (!includeBase) return; if (isYoshi) { mxmlElementSetAttr(doctype, "Yoshimi-data", NULL); root = mxmlNewElement(tree, "Yoshimi-data"); information.yoshiType = 1; } else { mxmlElementSetAttr(doctype, "ZynAddSubFX-data", NULL); root = mxmlNewElement(tree, "ZynAddSubFX-data"); mxmlElementSetAttr(root, "version-major", "2"); mxmlElementSetAttr(root, "version-minor", "4"); mxmlElementSetAttr(root, "version-revision", "1"); mxmlElementSetAttr(root, "ZynAddSubFX-author", "Nasca Octavian Paul"); information.yoshiType = 0; } node = root; mxmlElementSetAttr(root, "Yoshimi-author", "Alan Ernest Calvert"); string version{YOSHIMI_VERSION}; size_t pos = version.find(' '); if (pos != string::npos) version = version.substr(0, pos); // might be an rc or M version. string major = "2"; string minor = "0"; string revision = "0"; pos = version.find('.'); if (pos == string::npos) major = version; else { major = version.substr(0, pos); version = version.substr(pos + 1, version.length()); pos = version.find('.'); if (pos == string::npos) minor = version; else { minor = version.substr(0, pos); version = version.substr(pos + 1, version.length()); pos = version.find('.'); if (pos == string::npos) revision = version; else revision = version.substr(0, pos); //revision = version.substr(pos + 1, version.length()); } } mxmlElementSetAttr(root, "Yoshimi-major", major.c_str()); mxmlElementSetAttr(root, "Yoshimi-minor", minor.c_str()); mxmlElementSetAttr(root, "Yoshimi-revision", revision.c_str()); info = addparams0("INFORMATION"); // specifications if (synth.getRuntime().xmlType == TOPLEVEL::XML::MasterConfig) { beginbranch("BASE_PARAMETERS"); addparbool("enable_gui", synth.getRuntime().storedGui); addparbool("enable_splash", synth.getRuntime().showSplash); addparbool("enable_CLI", synth.getRuntime().storedCli); addpar("show_CLI_context", synth.getRuntime().showCLIcontext); addparbool("enable_single_master", synth.getRuntime().singlePath); addparbool("enable_auto_instance", synth.getRuntime().autoInstance); addparU("handle_padsynth_build", synth.getRuntime().handlePadSynthBuild); addpar("gzip_compression", synth.getRuntime().gzipCompression); addparbool("banks_checked", synth.getRuntime().banksChecked); addparU("active_instances", synth.getRuntime().activeInstances.to_ulong()); addparstr("guide_version", synth.getRuntime().guideVersion); addparstr("manual", synth.getRuntime().manualFile); endbranch(); return; } if (synth.getRuntime().xmlType <= TOPLEVEL::XML::Scale) { beginbranch("BASE_PARAMETERS"); addpar("max_midi_parts", NUM_MIDI_CHANNELS); addpar("max_kit_items_per_instrument", NUM_KIT_ITEMS); addpar("max_system_effects", NUM_SYS_EFX); addpar("max_insertion_effects", NUM_INS_EFX); addpar("max_instrument_effects", NUM_PART_EFX); addpar("max_addsynth_voices", NUM_VOICES); endbranch(); } } XMLwrapper::~XMLwrapper() { if (tree) mxmlDelete(tree); } void XMLwrapper::checkfileinformation(string const& filename, uint& names, int& type) { stackpos = 0; // we don't seem to be using any of this! memset(&parentstack, 0, sizeof(parentstack)); if (tree) mxmlDelete(tree); tree = NULL; string report; char *xmldata = loadGzipped(filename, &report); if (not report.empty()) synth.getRuntime().Log(report, _SYS_::LogNotSerious); if (!xmldata) return; char* first = strstr(xmldata, ""); information.yoshiType = (first!= NULL); 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\"")) information.ADDsynth_used = 1; } idx = strstr(start, "name=\"SUBsynth_used\""); if (idx != NULL) { seen |= 4; if (strstr(idx, "name=\"SUBsynth_used\" value=\"yes\"")) information.SUBsynth_used = 1; } idx = strstr(start, "name=\"PADsynth_used\""); if (idx != NULL) { seen |= 1; if (strstr(idx, "name=\"PADsynth_used\" value=\"yes\"")) information.PADsynth_used = 1; } } idx = strstr(xmldata, ""); if (idx == NULL) return; idx = strstr(idx, "par name=\"type\" value=\""); if (idx != NULL) type = string2int(idx + 23); if (seen != 7) // at least one was missing slowinfosearch(xmldata); delete [] xmldata; names = information.ADDsynth_used | (information.SUBsynth_used << 1) | (information.PADsynth_used << 2) | (information.yoshiType << 3); return; } void XMLwrapper::slowinfosearch(char *idx) { 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 (!information.ADDsynth_used) { idx = strstr(idx, "name=\"add_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) information.ADDsynth_used = 1; } if (!information.SUBsynth_used) { idx = strstr(idx, "name=\"sub_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) information.SUBsynth_used = 1; } if (!information.PADsynth_used) { idx = strstr(idx, "name=\"pad_enabled\""); if (idx == NULL) return; if (strncmp(idx + 26 , "yes", 3) == 0) information.PADsynth_used = 1; } if (information.ADDsynth_used & information.SUBsynth_used & information.PADsynth_used) { return; } } return; } // SAVE XML members bool XMLwrapper::saveXMLfile(string _filename, bool useCompression) { string filename{_filename}; char* xmldata = getXMLdata(); if (!xmldata) { synth.getRuntime().Log("XML: Failed to allocate xml data space"); return false; } uint compression = 0; if (useCompression) compression = synth.getRuntime().gzipCompression; if (compression <= 0) { if (!saveText(xmldata, filename)) { synth.getRuntime().Log("XML: Failed to save xml file " + filename + " for save", _SYS_::LogNotSerious); return false; } } else { if (compression > 9) compression = 9; string result = saveGzipped(xmldata, filename, compression); if (result > "") { synth.getRuntime().Log(result, _SYS_::LogNotSerious); return false; } } free(xmldata); return true; } char *XMLwrapper::getXMLdata() { xml_k = 0; memset(tabs, 0, STACKSIZE + 2); mxml_node_t *oldnode=node; node = info; switch (synth.getRuntime().xmlType) { case TOPLEVEL::XML::Instrument: { addparbool("ADDsynth_used", (information.ADDsynth_used != 0)); addparbool("SUBsynth_used", (information.SUBsynth_used != 0)); addparbool("PADsynth_used", (information.PADsynth_used != 0)); break; } case TOPLEVEL::XML::Patch: addparstr("XMLtype", "Parameters"); break; case TOPLEVEL::XML::Scale: addparstr("XMLtype", "Scales"); break; case TOPLEVEL::XML::State: addparstr("XMLtype", "Session"); break; case TOPLEVEL::XML::Vector: addparstr("XMLtype", "Vector Control"); break; case TOPLEVEL::XML::MLearn: addparstr("XMLtype", "Midi Learn"); break; case TOPLEVEL::XML::MasterConfig: case TOPLEVEL::XML::MasterUpdate: addparstr("XMLtype", "Config Base"); break; case TOPLEVEL::XML::Config: addparstr("XMLtype", "Config Instance"); break; case TOPLEVEL::XML::Presets: addparstr("XMLtype", "Presets"); break; case TOPLEVEL::XML::Bank: { addparstr("XMLtype", "Roots and Banks"); addpar("Banks_Version", synth.bank.readVersion()); break; } case TOPLEVEL::XML::History: addparstr("XMLtype", "Recent Files"); break; case TOPLEVEL::XML::PresetDirs: addparstr("XMLtype", "Preset Directories"); break; default: addparstr("XMLtype", "Unknown"); break; } node = oldnode; char *xmldata = mxmlSaveAllocString(tree, XMLwrapper_whitespace_callback); return xmldata; } void XMLwrapper::addparU(string const& name, uint val) { addparams2("parU", "name", name.c_str(), "value", asString(val)); } void XMLwrapper::addpar(string const& name, int val) { addparams2("par", "name", name.c_str(), "value", asString(val)); } void XMLwrapper::addparcombi(string const& name, float val) { union { float in; uint32_t out; } convert; char buf[11]; convert.in = val; sprintf(buf, "0x%8X", convert.out); addparams3("par", "name", name.c_str(), "value", asString(lrintf(val)), "exact_value", buf); } void XMLwrapper::addparreal(string const& name, float val) { union { float in; uint32_t out; } convert; char buf[11]; convert.in = val; sprintf(buf, "0x%8X", convert.out); addparams3("par_real", "name", name.c_str(), "value", asLongString(val), "exact_value", buf); } void XMLwrapper::addpardouble(string const& name, double val) { addparams2("par_real","name", name.c_str(), "value", asLongString(val)); } void XMLwrapper::addparbool(string const& name, int val) { if (val != 0) addparams2("par_bool", "name", name.c_str(), "value", "yes"); else addparams2("par_bool", "name", name.c_str(), "value", "no"); } void XMLwrapper::addparstr(string const& name, string const& val) { mxml_node_t *element = mxmlNewElement(node, "string"); mxmlElementSetAttr(element, "name", name.c_str()); mxmlNewText(element, 0, val.c_str()); } void XMLwrapper::beginbranch(string const& name) { push(node); node = addparams0(name.c_str()); } void XMLwrapper::beginbranch(string const& name, int id) { push(node); node = addparams1(name.c_str(), "id", asString(id)); } void XMLwrapper::endbranch() { node = pop(); } // LOAD XML members bool XMLwrapper::loadXMLfile(string const& filename) { bool zynfile = true; bool yoshitoo = false; if (tree) mxmlDelete(tree); tree = NULL; memset(&parentstack, 0, sizeof(parentstack)); stackpos = 0; string report = ""; char* xmldata = loadGzipped(filename, &report); if (report != "") synth.getRuntime().Log(report, _SYS_::LogNotSerious); if (xmldata == NULL) { synth.getRuntime().Log("XML: Could not load xml file: " + filename, _SYS_::LogNotSerious); return false; } root = tree = mxmlLoadString(NULL, removeBlanks(xmldata), MXML_OPAQUE_CALLBACK); delete [] xmldata; if (!tree) { synth.getRuntime().Log("XML: File " + filename + " is not XML", _SYS_::LogNotSerious); return false; } root = mxmlFindElement(tree, tree, "ZynAddSubFX-data", NULL, NULL, MXML_DESCEND); if (!root) { zynfile = false; root = mxmlFindElement(tree, tree, "Yoshimi-data", NULL, NULL, MXML_DESCEND); } if (!root) { synth.getRuntime().Log("XML: File " + filename + " doesn't contain valid data in this context", _SYS_::LogNotSerious); return false; } node = root; push(root); synth.fileCompatible = true; if (zynfile) { xml_version.major = string2int(mxmlElementGetAttr(root, "version-major")); xml_version.minor = string2int(mxmlElementGetAttr(root, "version-minor")); if(mxmlElementGetAttr(root, "version-revision") != NULL) xml_version.revision = string2int(mxmlElementGetAttr(root, "version-revision")); else xml_version.revision = 0; } if (mxmlElementGetAttr(root, "Yoshimi-major")) { xml_version.y_major = string2int(mxmlElementGetAttr(root, "Yoshimi-major")); yoshitoo = true; } else { synth.getRuntime().lastXMLmajor = 0; if (xml_version.major > 2) synth.fileCompatible = false; } if (mxmlElementGetAttr(root, "Yoshimi-minor")) { xml_version.y_minor = string2int(mxmlElementGetAttr(root, "Yoshimi-minor")); if (mxmlElementGetAttr(root, "Yoshimi-revision") != NULL) xml_version.y_revision = string2int(mxmlElementGetAttr(root, "Yoshimi-revision")); else xml_version.y_revision = 0; } else synth.getRuntime().lastXMLminor = 0; string exten = findExtension(filename); if (exten.length() != 4 && exten != EXTEN::state) return true; // we don't want config stuff if (synth.getRuntime().logXMLheaders) { if (yoshitoo && xml_version.major > 2) { // we were giving the wrong value :( xml_version.major = 2; xml_version.minor = 4; xml_version.revision = 1; } if (zynfile) { string text = "ZynAddSubFX version major " + asString(xml_version.major) + ", minor " + asString(xml_version.minor); if (xml_version.revision > 0) text += (", revision " + asString(xml_version.revision)); synth.getRuntime().Log(text); } if (yoshitoo) { string text = "Yoshimi version major " + asString(xml_version.y_major) + ", minor " + asString(xml_version.y_minor); if (xml_version.y_revision > 0) text += (", revision " + asString(xml_version.y_revision)); synth.getRuntime().Log(text); } } return true; } bool XMLwrapper::putXMLdata(const char *xmldata) { if (tree) mxmlDelete(tree); tree = NULL; memset(&parentstack, 0, sizeof(parentstack)); stackpos = 0; if (xmldata == NULL) return false; root = tree = mxmlLoadString(NULL, xmldata, MXML_OPAQUE_CALLBACK); if (tree == NULL) return false; root = mxmlFindElement(tree, tree, "ZynAddSubFX-data", NULL, NULL, MXML_DESCEND); if (!root) root = mxmlFindElement(tree, tree, "Yoshimi-data", NULL, NULL, MXML_DESCEND); node = root; if (!root) return false; push(root); return true; } bool XMLwrapper::enterbranch(string const& name) { node = mxmlFindElement(peek(), peek(), name.c_str(), NULL, NULL, MXML_DESCEND_FIRST); if (!node) return false; push(node); if (name == "CONFIGURATION") { synth.getRuntime().lastXMLmajor = xml_version.y_major; synth.getRuntime().lastXMLminor = xml_version.y_minor; } return true; } bool XMLwrapper::enterbranch(string const& name, int id) { node = mxmlFindElement(peek(), peek(), name.c_str(), "id", asString(id).c_str(), MXML_DESCEND_FIRST); if (!node) return false; push(node); return true; } int XMLwrapper::getbranchid(int min, int max) { int id = string2int(mxmlElementGetAttr(node, "id")); if (min == 0 && max == 0) return id; if (id < min) id = min; else if (id > max) id = max; return id; } uint XMLwrapper::getparU(string const& name, uint defaultpar, uint min, uint max) { node = mxmlFindElement(peek(), peek(), "parU", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return defaultpar; const char *strval = mxmlElementGetAttr(node, "value"); if (!strval) return defaultpar; uint val = string2uint(strval); if (val < min) val = min; else if (val > max) val = max; return val; } int XMLwrapper::getpar(string const& name, int defaultpar, int min, int max) { node = mxmlFindElement(peek(), peek(), "par", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return defaultpar; const char *strval = mxmlElementGetAttr(node, "value"); if (!strval) return defaultpar; int val = string2int(strval); if (val < min) val = min; else if (val > max) val = max; return val; } float XMLwrapper::getparcombi(string const& name, float defaultpar, float min, float max) { node = mxmlFindElement(peek(), peek(), "par", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return defaultpar; float result = 0; const char *strval = mxmlElementGetAttr(node, "exact_value"); if (strval != NULL) { union { float out; uint32_t in; } convert; sscanf(strval+2, "%x", &convert.in); result = convert.out; } else { strval = mxmlElementGetAttr(node, "value"); if (!strval) return defaultpar; result = string2float(string(strval)); } if (result < min) result = min; else if (result > max) result = max; return result; } int XMLwrapper::getpar127(string const& name, int defaultpar) { return(getpar(name, defaultpar, 0, 127)); } int XMLwrapper::getpar255(string const& name, int defaultpar) { return(getpar(name, defaultpar, 0, 255)); } int XMLwrapper::getparbool(string const& name, int defaultpar) { node = mxmlFindElement(peek(), peek(), "par_bool", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return defaultpar; const char *strval = mxmlElementGetAttr(node, "value"); if (!strval) return defaultpar; char tmp = strval[0] | 0x20; return (tmp != '0' && tmp != 'n' && tmp != 'f') ? 1 : 0; } // case insensitive, anything other than '0', 'no', 'false' is treated as 'true' string XMLwrapper::getparstr(string const& name) { node = mxmlFindElement(peek(), peek(), "string", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return string(); mxml_node_t *child = mxmlGetFirstChild(node); if (!child) return string(); if (mxmlGetType(child) != MXML_OPAQUE) return string(); return string(mxmlGetOpaque(child)); } float XMLwrapper::getparreal(string const& name, float defaultpar) { node = mxmlFindElement(peek(), peek(), "par_real", "name", name.c_str(), MXML_DESCEND_FIRST); if (!node) return defaultpar; const char *strval = mxmlElementGetAttr(node, "exact_value"); if (strval != NULL) { union { float out; uint32_t in; } convert; sscanf(strval+2, "%x", &convert.in); return convert.out; } strval = mxmlElementGetAttr(node, "value"); if (!strval) return defaultpar; return string2float(string(strval)); } float XMLwrapper::getparreal(string const& name, float defaultpar, float min, float max) { float result = getparreal(name, defaultpar); if (result < min) result = min; else if (result > max) result = max; return result; } // Private parts mxml_node_t *XMLwrapper::addparams0(string const& name) { mxml_node_t *element = mxmlNewElement(node, name.c_str()); return element; } mxml_node_t *XMLwrapper::addparams1(string const& name, string const& par1, string const& val1) { mxml_node_t *element = mxmlNewElement(node, name.c_str()); mxmlElementSetAttr(element, par1.c_str(), val1.c_str()); return element; } mxml_node_t *XMLwrapper::addparams2(string const& name, string const& par1, string const& val1, string const& par2, string const& val2) { mxml_node_t *element = mxmlNewElement(node, name.c_str()); mxmlElementSetAttr(element, par1.c_str(), val1.c_str()); mxmlElementSetAttr(element, par2.c_str(), val2.c_str()); return element; } mxml_node_t *XMLwrapper::addparams3(string const& name, string const& par1, string const& val1, string const& par2, string const& val2, string const& par3, string const& val3) { mxml_node_t *element = mxmlNewElement(node, name.c_str()); mxmlElementSetAttr(element, par1.c_str(), val1.c_str()); mxmlElementSetAttr(element, par2.c_str(), val2.c_str()); mxmlElementSetAttr(element, par3.c_str(), val3.c_str()); return element; } void XMLwrapper::push(mxml_node_t *node) { if (stackpos >= STACKSIZE - 1) { synth.getRuntime().Log("XML: Not good, XMLwrapper push on a full parentstack", _SYS_::LogNotSerious); return; } stackpos++; parentstack[stackpos] = node; } mxml_node_t *XMLwrapper::pop() { if (stackpos <= 0) { synth.getRuntime().Log("XML: Not good, XMLwrapper pop on empty parentstack", _SYS_::LogNotSerious); return root; } mxml_node_t *node = parentstack[stackpos]; parentstack[stackpos] = NULL; stackpos--; return node; } mxml_node_t *XMLwrapper::peek() { if (stackpos <= 0) { synth.getRuntime().Log("XML: Not good, XMLwrapper peek on an empty parentstack", _SYS_::LogNotSerious); return root; } return parentstack[stackpos]; } yoshimi-2.3.3.3/src/Misc/XMLwrapper.h000066400000000000000000000153171475757676000172740ustar00rootroot00000000000000/* XML.h - XML wrapper 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. */ #ifndef XML_WRAPPER_H #define XML_WRAPPER_H #include "globals.h" #include #include #include // max tree depth #define STACKSIZE 128 class SynthEngine; class XMLwrapper { public: ~XMLwrapper(); XMLwrapper(SynthEngine& _synth, bool _isYoshi = false, bool includeBase = true); // shall not be copied nor moved XMLwrapper(XMLwrapper&&) = delete; XMLwrapper(XMLwrapper const&) = delete; XMLwrapper& operator=(XMLwrapper&&) = delete; XMLwrapper& operator=(XMLwrapper const&) = delete; // SAVE to XML bool saveXMLfile(std::string _filename, bool useCompression = true); // return true if ok, false otherwise // returns the new allocated string that contains the XML data (used for clipboard) // the string is NULL terminated char* getXMLdata(); void addparU(std::string const& name, uint val); // add unsigned uinteger parameter: name, value void addpar(std::string const& name, int val); // add simple parameter: name, value void addparcombi(std::string const& name, float val); // add hybrid float/int parameter: name, value void addparreal(std::string const& name, float val); void addpardouble(std::string const& name, double val); void addparbool(std::string const& name, int val); // 1 => "yes", else "no" // add string parameter (name and string) void addparstr(std::string const& name, std::string const& val); // add a branch void beginbranch(std::string const& name); void beginbranch(std::string const& name, int id); // this must be called after each branch (nodes that contains child nodes) void endbranch(); // we always save with a blank first line const char *removeBlanks(const char *c) {while (isspace(*c)) ++c; return c;} // LOAD from XML bool loadXMLfile(std::string const& filename); // true if loaded ok // used by the clipboard bool putXMLdata(const char *xmldata); // enter into the branch // returns 1 if is ok, or 0 otherwise bool enterbranch(std::string const& name); // enter into the branch with id // returns 1 if is ok, or 0 otherwise bool enterbranch(std::string const& name, int id); // exits from a branch void exitbranch() { pop(); } // get the the branch_id and limits it between the min and max // if min==max==0, it will not limit it // if there isn't any id, will return min // this must be called only immediately after enterbranch() int getbranchid(int min, int max); // it returns the parameter and limits it between min and max // if min==max==0, it will not limit it // if no parameter will be here, the defaultpar will be returned uint getparU(std::string const& name, uint defaultpar, uint min = 0, uint max = std::numeric_limits::max()); int getpar(std::string const& name, int defaultpar, int min, int max); float getparcombi(std::string const& name, float defaultpar, float min, float max); // the same as getpar, but the limits are 0 and 127 int getpar127(std::string const& name, int defaultpar); // the same as getpar, but the limits are 0 and 255 int getpar255(std::string const& name, int defaultpar); int getparbool(std::string const& name, int defaultpar); std::string getparstr(std::string const& name); float getparreal(std::string const& name, float defaultpar); float getparreal(std::string const& name, float defaultpar, float min, float max); bool minimal; // false if all parameters will be stored struct { int type; uchar ADDsynth_used; uchar SUBsynth_used; uchar PADsynth_used; bool yoshiType; } information; // opens a file and parse only the "information" data on it void checkfileinformation(std::string const& filename, uint& names, int& type); void slowinfosearch(char *idx); private: mxml_node_t *tree; mxml_node_t *root; mxml_node_t *node; mxml_node_t *info; // adds params like this: // // returns the node //mxml_node_t *addparams0(const char *name); mxml_node_t *addparams0(std::string const& name); // adds params like this: , returns the node mxml_node_t *addparams1(std::string const& name, std::string const& par1, std::string const& val1); // adds params like this: , returns the node mxml_node_t *addparams2(std::string const& name, std::string const& par1, std::string const& val1, std::string const& par2, std::string const& val2); mxml_node_t *addparams3(std::string const& name, std::string const& par1, std::string const& val1, std::string const& par2, std::string const& val2, std::string const& par3, std::string const& val3); // this is used to store the parents mxml_node_t *parentstack[STACKSIZE]; int stackpos; int xml_k; char tabs[STACKSIZE + 2]; void push(mxml_node_t *node); mxml_node_t* pop(); mxml_node_t* peek(); struct { int major; // settings format version int minor; int revision; int y_major; int y_minor; int y_revision; } xml_version; bool isYoshi; SynthEngine& synth; }; #endif yoshimi-2.3.3.3/src/MusicIO/000077500000000000000000000000001475757676000154705ustar00rootroot00000000000000yoshimi-2.3.3.3/src/MusicIO/AlsaEngine.cpp000066400000000000000000000746311475757676000202150ustar00rootroot00000000000000/* AlsaEngine.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 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" , 2); 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.3.3/src/MusicIO/AlsaEngine.h000066400000000000000000000120341475757676000176470ustar00rootroot00000000000000/* 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.3.3/src/MusicIO/JackEngine.cpp000066400000000000000000000470271475757676000202040ustar00rootroot00000000000000/* JackEngine.cpp 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 . */ #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), 1); 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!", 2); 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.3.3/src/MusicIO/JackEngine.h000066400000000000000000000072351475757676000176460ustar00rootroot00000000000000/* 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.3.3/src/MusicIO/MusicClient.cpp000066400000000000000000000153501475757676000204170ustar00rootroot00000000000000/* 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.3.3/src/MusicIO/MusicClient.h000066400000000000000000000047661475757676000200750ustar00rootroot00000000000000/* 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.3.3/src/MusicIO/MusicIO.cpp000066400000000000000000000176051475757676000175150ustar00rootroot00000000000000/* 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.3.3/src/MusicIO/MusicIO.h000066400000000000000000000124051475757676000171530ustar00rootroot00000000000000/* 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.3.3/src/Params/000077500000000000000000000000001475757676000154035ustar00rootroot00000000000000yoshimi-2.3.3.3/src/Params/ADnoteParameters.cpp000066400000000000000000001303351475757676000213120ustar00rootroot00000000000000/* 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 "Misc/NumericFuncs.h" #include "Misc/SynthEngine.h" #include "Params/ADnoteParameters.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, 0, 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, 0, 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, 0, 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 = 1; } // Defaults a voice void ADnoteParameters::defaults(int n) { int nvoice = n; VoicePar[nvoice].Enabled = 0; 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 = 0; VoicePar[nvoice].PfixedfreqET = 0; VoicePar[nvoice].PBendAdjust = 88; // 64 + 24 VoicePar[nvoice].POffsetHz = 64; VoicePar[nvoice].Presonance = 1; VoicePar[nvoice].Pfilterbypass = 0; 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 = 0; VoicePar[nvoice].PFreqEnvelopeEnabled = 0; VoicePar[nvoice].PAmpEnvelopeEnabled = 0; VoicePar[nvoice].PAmpLfoEnabled = 0; VoicePar[nvoice].PAmpVelocityScaleFunction = 127; VoicePar[nvoice].PFilterEnabled = 0; VoicePar[nvoice].PFilterEnvelopeEnabled = 0; VoicePar[nvoice].PFilterLfoEnabled = 0; 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 = 0; VoicePar[nvoice].PFMAmpEnvelopeEnabled = 0; 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, 0, 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, 0, 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, 0, 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::add2XMLsection(XMLwrapper& xml, int n) { int nvoice = n; if (nvoice >= NUM_VOICES) return; // currently not used // bool yoshiFormat = synth.usingYoshiType; int oscilused = 0, fmoscilused = 0; // if the oscil or fmoscil are used by another voice for (int i = 0; i < NUM_VOICES; ++i) { if (VoicePar[i].Pextoscil == nvoice) oscilused = 1; if (VoicePar[i].PextFMoscil == nvoice) fmoscilused = 1; } xml.addparbool("enabled", VoicePar[nvoice].Enabled); if (((VoicePar[nvoice].Enabled == 0) && (oscilused==0) && (fmoscilused==0)) && (xml.minimal)) return; xml.addpar("type", VoicePar[nvoice].Type); xml.addpar("unison_size", VoicePar[nvoice].Unison_size); xml.addpar("unison_frequency_spread", VoicePar[nvoice].Unison_frequency_spread); xml.addpar("unison_stereo_spread", VoicePar[nvoice].Unison_stereo_spread); xml.addpar("unison_vibratto", VoicePar[nvoice].Unison_vibrato); xml.addpar("unison_vibratto_speed", VoicePar[nvoice].Unison_vibrato_speed); xml.addpar("unison_invert_phase", VoicePar[nvoice].Unison_invert_phase); xml.addpar("unison_phase_randomness", VoicePar[nvoice].Unison_phase_randomness); xml.addpar("delay", VoicePar[nvoice].PDelay); xml.addparbool("resonance", VoicePar[nvoice].Presonance); xml.addpar("input_voice", VoicePar[nvoice].PVoice); xml.addpar("ext_oscil", VoicePar[nvoice].Pextoscil); xml.addpar("ext_fm_oscil",VoicePar[nvoice].PextFMoscil); xml.addpar("oscil_phase", VoicePar[nvoice].Poscilphase); xml.addpar("oscil_fm_phase", VoicePar[nvoice].PFMoscilphase); xml.addparbool("filter_enabled",VoicePar[nvoice].PFilterEnabled); xml.addparbool("filter_bypass", VoicePar[nvoice].Pfilterbypass); xml.addpar("fm_enabled", VoicePar[nvoice].PFMEnabled); xml.beginbranch("OSCIL"); VoicePar[nvoice].POscil->add2XML(xml); xml.endbranch(); xml.beginbranch("AMPLITUDE_PARAMETERS"); // new yoshi type xml.addpar("pan_pos", VoicePar[nvoice].PPanning); xml.addparbool("random_pan", VoicePar[nvoice].PRandom); xml.addpar("random_width", VoicePar[nvoice].PWidth); // legacy if (VoicePar[nvoice].PRandom) xml.addpar("panning", 0); else xml.addpar("panning", VoicePar[nvoice].PPanning); xml.addpar("volume", VoicePar[nvoice].PVolume); xml.addparbool("volume_minus", VoicePar[nvoice].PVolumeminus); xml.addpar("velocity_sensing", VoicePar[nvoice].PAmpVelocityScaleFunction); xml.addparbool("amp_envelope_enabled", VoicePar[nvoice].PAmpEnvelopeEnabled); if ((VoicePar[nvoice].PAmpEnvelopeEnabled!=0) || (!xml.minimal)) { xml.beginbranch("AMPLITUDE_ENVELOPE"); VoicePar[nvoice].AmpEnvelope->add2XML(xml); xml.endbranch(); } xml.addparbool("amp_lfo_enabled", VoicePar[nvoice].PAmpLfoEnabled); if ((VoicePar[nvoice].PAmpLfoEnabled != 0) || (!xml.minimal)) { xml.beginbranch("AMPLITUDE_LFO"); VoicePar[nvoice].AmpLfo->add2XML(xml); xml.endbranch(); } xml.endbranch(); xml.beginbranch("FREQUENCY_PARAMETERS"); xml.addparbool("fixed_freq", VoicePar[nvoice].Pfixedfreq); xml.addpar("fixed_freq_et", VoicePar[nvoice].PfixedfreqET); xml.addpar("bend_adjust", VoicePar[nvoice].PBendAdjust); xml.addpar("offset_hz", VoicePar[nvoice].POffsetHz); xml.addpar("detune", VoicePar[nvoice].PDetune); xml.addpar("coarse_detune", VoicePar[nvoice].PCoarseDetune); xml.addpar("detune_type", VoicePar[nvoice].PDetuneType); xml.addparbool("freq_envelope_enabled", VoicePar[nvoice].PFreqEnvelopeEnabled); if ((VoicePar[nvoice].PFreqEnvelopeEnabled != 0) || (!xml.minimal)) { xml.beginbranch("FREQUENCY_ENVELOPE"); VoicePar[nvoice].FreqEnvelope->add2XML(xml); xml.endbranch(); } xml.addparbool("freq_lfo_enabled", VoicePar[nvoice].PFreqLfoEnabled); if ((VoicePar[nvoice].PFreqLfoEnabled != 0) || (!xml.minimal)) { xml.beginbranch("FREQUENCY_LFO"); VoicePar[nvoice].FreqLfo->add2XML(xml); xml.endbranch(); } xml.endbranch(); if ((VoicePar[nvoice].PFilterEnabled != 0) || (!xml.minimal)) { xml.beginbranch("FILTER_PARAMETERS"); xml.addpar("velocity_sensing_amplitude", VoicePar[nvoice].PFilterVelocityScale); xml.addpar("velocity_sensing", VoicePar[nvoice].PFilterVelocityScaleFunction); xml.beginbranch("FILTER"); VoicePar[nvoice].VoiceFilter->add2XML(xml); xml.endbranch(); xml.addparbool("filter_envelope_enabled", VoicePar[nvoice].PFilterEnvelopeEnabled); if ((VoicePar[nvoice].PFilterEnvelopeEnabled != 0) || (!xml.minimal)) { xml.beginbranch("FILTER_ENVELOPE"); VoicePar[nvoice].FilterEnvelope->add2XML(xml); xml.endbranch(); } xml.addparbool("filter_lfo_enabled", VoicePar[nvoice].PFilterLfoEnabled); if ((VoicePar[nvoice].PFilterLfoEnabled !=0) || (!xml.minimal)) { xml.beginbranch("FILTER_LFO"); VoicePar[nvoice].FilterLfo->add2XML(xml); xml.endbranch(); } xml.endbranch(); } if ((VoicePar[nvoice].PFMEnabled != 0) || (fmoscilused !=0 ) || (!xml.minimal)) { xml.beginbranch("FM_PARAMETERS"); xml.addpar("input_voice", VoicePar[nvoice].PFMVoice); xml.addpar("volume", VoicePar[nvoice].PFMVolume); xml.addpar("volume_damp", VoicePar[nvoice].PFMVolumeDamp); xml.addpar("velocity_sensing", VoicePar[nvoice].PFMVelocityScaleFunction); xml.addparbool("amp_envelope_enabled", VoicePar[nvoice].PFMAmpEnvelopeEnabled); if ((VoicePar[nvoice].PFMAmpEnvelopeEnabled != 0) || (!xml.minimal)) { xml.beginbranch("AMPLITUDE_ENVELOPE"); VoicePar[nvoice].FMAmpEnvelope->add2XML(xml); xml.endbranch(); } xml.beginbranch("MODULATOR"); xml.addparbool("detune_from_base_osc", VoicePar[nvoice].PFMDetuneFromBaseOsc); xml.addpar("detune", VoicePar[nvoice].PFMDetune); xml.addpar("coarse_detune", VoicePar[nvoice].PFMCoarseDetune); xml.addpar("detune_type", VoicePar[nvoice].PFMDetuneType); xml.addparbool("freq_envelope_enabled", VoicePar[nvoice].PFMFreqEnvelopeEnabled); xml.addparbool("fixed_freq", VoicePar[nvoice].PFMFixedFreq); if ((VoicePar[nvoice].PFMFreqEnvelopeEnabled != 0) || (!xml.minimal)) { xml.beginbranch("FREQUENCY_ENVELOPE"); VoicePar[nvoice].FMFreqEnvelope->add2XML(xml); xml.endbranch(); } xml.beginbranch("OSCIL"); VoicePar[nvoice].POscilFM->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.endbranch(); } } void ADnoteParameters::add2XML(XMLwrapper& xml) { // currently not used // bool yoshiFormat = synth.usingYoshiType; xml.information.ADDsynth_used = 1; xml.addparbool("stereo", GlobalPar.PStereo); xml.beginbranch("AMPLITUDE_PARAMETERS"); xml.addpar("volume", GlobalPar.PVolume); // new yoshi type xml.addpar("pan_pos", GlobalPar.PPanning); xml.addparbool("random_pan", GlobalPar.PRandom); xml.addpar("random_width", GlobalPar.PWidth); // legacy if (GlobalPar.PRandom) xml.addpar("panning", 0); else xml.addpar("panning", GlobalPar.PPanning); xml.addpar("velocity_sensing", GlobalPar.PAmpVelocityScaleFunction); xml.addpar("fadein_adjustment", GlobalPar.Fadein_adjustment); xml.addpar("punch_strength", GlobalPar.PPunchStrength); xml.addpar("punch_time", GlobalPar.PPunchTime); xml.addpar("punch_stretch", GlobalPar.PPunchStretch); xml.addpar("punch_velocity_sensing", GlobalPar.PPunchVelocitySensing); xml.addpar("harmonic_randomness_grouping", GlobalPar.Hrandgrouping); xml.beginbranch("AMPLITUDE_ENVELOPE"); GlobalPar.AmpEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("AMPLITUDE_LFO"); GlobalPar.AmpLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("FREQUENCY_PARAMETERS"); xml.addpar("detune", GlobalPar.PDetune); xml.addpar("coarse_detune", GlobalPar.PCoarseDetune); xml.addpar("detune_type", GlobalPar.PDetuneType); xml.addpar("bandwidth", GlobalPar.PBandwidth); xml.beginbranch("FREQUENCY_ENVELOPE"); GlobalPar.FreqEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("FREQUENCY_LFO"); GlobalPar.FreqLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("FILTER_PARAMETERS"); xml.addpar("velocity_sensing_amplitude", GlobalPar.PFilterVelocityScale); xml.addpar("velocity_sensing", GlobalPar.PFilterVelocityScaleFunction); xml.beginbranch("FILTER"); GlobalPar.GlobalFilter->add2XML(xml); xml.endbranch(); xml.beginbranch("FILTER_ENVELOPE"); GlobalPar.FilterEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("FILTER_LFO"); GlobalPar.FilterLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("RESONANCE"); GlobalPar.Reson->add2XML(xml); xml.endbranch(); for (int nvoice=0;nvoicegetfromXML(xml); xml.exitbranch(); } if (xml.enterbranch("AMPLITUDE_LFO")) { GlobalPar.AmpLfo->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FREQUENCY_PARAMETERS")) { GlobalPar.PDetune = xml.getpar("detune", GlobalPar.PDetune, 0, 16383); GlobalPar.PCoarseDetune = xml.getpar("coarse_detune", GlobalPar.PCoarseDetune, 0, 16383); GlobalPar.PDetuneType = xml.getpar127("detune_type", GlobalPar.PDetuneType); GlobalPar.PBandwidth = xml.getpar127("bandwidth", GlobalPar.PBandwidth); xml.enterbranch("FREQUENCY_ENVELOPE"); GlobalPar.FreqEnvelope->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FREQUENCY_LFO"); GlobalPar.FreqLfo->getfromXML(xml); xml.exitbranch(); xml.exitbranch(); } if (xml.enterbranch("FILTER_PARAMETERS")) { GlobalPar.PFilterVelocityScale = xml.getpar127("velocity_sensing_amplitude", GlobalPar.PFilterVelocityScale); GlobalPar.PFilterVelocityScaleFunction = xml.getpar127("velocity_sensing", GlobalPar.PFilterVelocityScaleFunction); xml.enterbranch("FILTER"); GlobalPar.GlobalFilter->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FILTER_ENVELOPE"); GlobalPar.FilterEnvelope->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FILTER_LFO"); GlobalPar.FilterLfo->getfromXML(xml); xml.exitbranch(); xml.exitbranch(); } if (xml.enterbranch("RESONANCE")) { GlobalPar.Reson->getfromXML(xml); xml.exitbranch(); } for (int nvoice = 0; nvoice < NUM_VOICES; nvoice++) { VoicePar[nvoice].Enabled=0; if (xml.enterbranch("VOICE", nvoice) == 0) continue; getfromXMLsection(xml, nvoice); xml.exitbranch(); } } void ADnoteParameters::getfromXMLsection(XMLwrapper& xml, int n) { int nvoice = n; if (nvoice >= NUM_VOICES) return; VoicePar[nvoice].Enabled = xml.getparbool("enabled", 0); VoicePar[nvoice].Unison_size = xml.getpar127("unison_size", VoicePar[nvoice].Unison_size); VoicePar[nvoice].Unison_frequency_spread = xml.getpar127("unison_frequency_spread", VoicePar[nvoice].Unison_frequency_spread); VoicePar[nvoice].Unison_stereo_spread = xml.getpar127("unison_stereo_spread", VoicePar[nvoice].Unison_stereo_spread); VoicePar[nvoice].Unison_vibrato = xml.getpar127("unison_vibratto", VoicePar[nvoice].Unison_vibrato); VoicePar[nvoice].Unison_vibrato_speed = xml.getpar127("unison_vibratto_speed", VoicePar[nvoice].Unison_vibrato_speed); VoicePar[nvoice].Unison_invert_phase = xml.getpar127("unison_invert_phase", VoicePar[nvoice].Unison_invert_phase); VoicePar[nvoice].Unison_phase_randomness = xml.getpar127("unison_phase_randomness", VoicePar[nvoice].Unison_phase_randomness); VoicePar[nvoice].Type = xml.getpar127("type", VoicePar[nvoice].Type); VoicePar[nvoice].PDelay = xml.getpar127("delay", VoicePar[nvoice].PDelay); VoicePar[nvoice].Presonance = xml.getparbool("resonance", VoicePar[nvoice].Presonance); VoicePar[nvoice].PVoice = xml.getpar("input_voice", VoicePar[nvoice].PVoice, -1, nvoice - 1); VoicePar[nvoice].Pextoscil = xml.getpar("ext_oscil", -1, -1, nvoice - 1); VoicePar[nvoice].PextFMoscil = xml.getpar("ext_fm_oscil", -1, -1,nvoice - 1); VoicePar[nvoice].Poscilphase = xml.getpar127("oscil_phase", VoicePar[nvoice].Poscilphase); VoicePar[nvoice].PFMoscilphase = xml.getpar127("oscil_fm_phase", VoicePar[nvoice].PFMoscilphase); VoicePar[nvoice].PFilterEnabled = xml.getparbool("filter_enabled",VoicePar[nvoice].PFilterEnabled); VoicePar[nvoice].Pfilterbypass = xml.getparbool("filter_bypass",VoicePar[nvoice].Pfilterbypass); VoicePar[nvoice].PFMEnabled = xml.getpar127("fm_enabled",VoicePar[nvoice].PFMEnabled); if (xml.enterbranch("OSCIL")) { VoicePar[nvoice].POscil->getfromXML(xml); xml.exitbranch(); } if (xml.enterbranch("AMPLITUDE_PARAMETERS")) { int test = xml.getpar127("random_width", UNUSED); if (test < 64) // new Yoshi type { VoicePar[nvoice].PWidth = test; setVoicePan(nvoice, xml.getpar127("pan_pos", VoicePar[nvoice].PPanning), synth.getRuntime().panLaw); VoicePar[nvoice].PRandom = xml.getparbool("random_pan", VoicePar[nvoice].PRandom); } else // legacy { setVoicePan(nvoice, xml.getpar127("panning", VoicePar[nvoice].PPanning), synth.getRuntime().panLaw); if (VoicePar[nvoice].PPanning == 0) { VoicePar[nvoice].PPanning = 64; VoicePar[nvoice].PRandom = true; VoicePar[nvoice].PWidth = 63; } } VoicePar[nvoice].PVolume = xml.getpar127("volume", VoicePar[nvoice].PVolume); VoicePar[nvoice].PVolumeminus = xml.getparbool("volume_minus", VoicePar[nvoice].PVolumeminus); VoicePar[nvoice].PAmpVelocityScaleFunction = xml.getpar127("velocity_sensing", VoicePar[nvoice].PAmpVelocityScaleFunction); VoicePar[nvoice].PAmpEnvelopeEnabled = xml.getparbool("amp_envelope_enabled",VoicePar[nvoice].PAmpEnvelopeEnabled); if (xml.enterbranch("AMPLITUDE_ENVELOPE")) { VoicePar[nvoice].AmpEnvelope->getfromXML(xml); xml.exitbranch(); } VoicePar[nvoice].PAmpLfoEnabled = xml.getparbool("amp_lfo_enabled",VoicePar[nvoice].PAmpLfoEnabled); if (xml.enterbranch("AMPLITUDE_LFO")) { VoicePar[nvoice].AmpLfo->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FREQUENCY_PARAMETERS")) { VoicePar[nvoice].Pfixedfreq = xml.getparbool("fixed_freq", VoicePar[nvoice].Pfixedfreq); VoicePar[nvoice].PfixedfreqET = xml.getpar127("fixed_freq_et", VoicePar[nvoice].PfixedfreqET); VoicePar[nvoice].PBendAdjust = xml.getpar127("bend_adjust", VoicePar[nvoice].PBendAdjust); VoicePar[nvoice].POffsetHz = xml.getpar127("offset_hz", VoicePar[nvoice].POffsetHz); VoicePar[nvoice].PDetune = xml.getpar("detune", VoicePar[nvoice].PDetune, 0, 16383); VoicePar[nvoice].PCoarseDetune = xml.getpar("coarse_detune", VoicePar[nvoice].PCoarseDetune, 0, 16383); VoicePar[nvoice].PDetuneType = xml.getpar127("detune_type", VoicePar[nvoice].PDetuneType); VoicePar[nvoice].PFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", VoicePar[nvoice].PFreqEnvelopeEnabled); if (xml.enterbranch("FREQUENCY_ENVELOPE")) { VoicePar[nvoice].FreqEnvelope->getfromXML(xml); xml.exitbranch(); } VoicePar[nvoice].PFreqLfoEnabled = xml.getparbool("freq_lfo_enabled", VoicePar[nvoice].PFreqLfoEnabled); if (xml.enterbranch("FREQUENCY_LFO")) { VoicePar[nvoice].FreqLfo->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FILTER_PARAMETERS")) { VoicePar[nvoice].PFilterVelocityScale = xml.getpar127("velocity_sensing_amplitude", VoicePar[nvoice].PFilterVelocityScale); VoicePar[nvoice].PFilterVelocityScaleFunction = xml.getpar127("velocity_sensing", VoicePar[nvoice].PFilterVelocityScaleFunction); if (xml.enterbranch("FILTER")) { VoicePar[nvoice].VoiceFilter->getfromXML(xml); xml.exitbranch(); } VoicePar[nvoice].PFilterEnvelopeEnabled = xml.getparbool("filter_envelope_enabled", VoicePar[nvoice].PFilterEnvelopeEnabled); if (xml.enterbranch("FILTER_ENVELOPE")) { VoicePar[nvoice].FilterEnvelope->getfromXML(xml); xml.exitbranch(); } VoicePar[nvoice].PFilterLfoEnabled = xml.getparbool("filter_lfo_enabled", VoicePar[nvoice].PFilterLfoEnabled); if (xml.enterbranch("FILTER_LFO")) { VoicePar[nvoice].FilterLfo->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FM_PARAMETERS")) { VoicePar[nvoice].PFMVoice = xml.getpar("input_voice", VoicePar[nvoice].PFMVoice, -1, nvoice - 1); VoicePar[nvoice].PFMVolume = xml.getpar127("volume", VoicePar[nvoice].PFMVolume); VoicePar[nvoice].PFMVolumeDamp = xml.getpar127("volume_damp", VoicePar[nvoice].PFMVolumeDamp); VoicePar[nvoice].PFMVelocityScaleFunction = xml.getpar127("velocity_sensing", VoicePar[nvoice].PFMVelocityScaleFunction); VoicePar[nvoice].PFMAmpEnvelopeEnabled = xml.getparbool("amp_envelope_enabled", VoicePar[nvoice].PFMAmpEnvelopeEnabled); if (xml.enterbranch("AMPLITUDE_ENVELOPE")) { VoicePar[nvoice].FMAmpEnvelope->getfromXML(xml); xml.exitbranch(); } if (xml.enterbranch("MODULATOR")) { bool loadFMFreqParams = true; VoicePar[nvoice].PFMDetuneFromBaseOsc = xml.getparbool("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 = xml.getpar("detune",VoicePar[nvoice].PFMDetune, 0, 16383); VoicePar[nvoice].PFMCoarseDetune = xml.getpar("coarse_detune", VoicePar[nvoice].PFMCoarseDetune, 0, 16383); VoicePar[nvoice].PFMDetuneType = xml.getpar127("detune_type", VoicePar[nvoice].PFMDetuneType); VoicePar[nvoice].PFMFreqEnvelopeEnabled = xml.getparbool("freq_envelope_enabled", VoicePar[nvoice].PFMFreqEnvelopeEnabled); VoicePar[nvoice].PFMFixedFreq = xml.getparbool("fixed_freq", VoicePar[nvoice].PFMFixedFreq); if (xml.enterbranch("FREQUENCY_ENVELOPE")) { VoicePar[nvoice].FMFreqEnvelope->getfromXML(xml); xml.exitbranch(); } } if (xml.enterbranch("OSCIL")) { VoicePar[nvoice].POscilFM->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } xml.exitbranch(); } } 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.3.3/src/Params/ADnoteParameters.h000066400000000000000000000213331475757676000207540ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "DSP/FFTwrapper.h" enum FMTYPE { NONE, MORPH, RING_MOD, PHASE_MOD, FREQ_MOD, PW_MOD }; extern int ADnote_unison_sizes[]; class SynthEngine; /*****************************************************************/ /* 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 uchar 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 uchar Presonance; // If resonance is enabled for this voice short Pextoscil; // What external oscil should I use, short PextFMoscil; // -1 for internal POscil & POscilFM // it is not allowed that the externoscil, // externFMoscil => current voice uchar Poscilphase, PFMoscilphase; // oscillator phases uchar Pfilterbypass; // filter bypass OscilParameters *POscil; OscilGen *OscilSmp; // Frequency 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 ushort PDetune; ushort PCoarseDetune; uchar PDetuneType; uchar PBendAdjust; // Pitch Bend uchar POffsetHz; uchar PFreqEnvelopeEnabled; // Frequency Envelope EnvelopeParams *FreqEnvelope; uchar 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 uchar PAmpEnvelopeEnabled; // Amplitude Envelope EnvelopeParams *AmpEnvelope; uchar PAmpLfoEnabled; // Amplitude LFO LFOParams *AmpLfo; // Filter parameters uchar PFilterEnabled; // Voice Filter FilterParams *VoiceFilter; uchar PFilterEnvelopeEnabled;// Filter Envelope EnvelopeParams *FilterEnvelope; uchar 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 modullator instead of POscilFM. // It is -1 if I use POscilFM(default). // It may not be equal or bigger than current voice OscilParameters *POscilFM; // Modullator 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 uchar PFMFixedFreq; // FM base freq fixed at 440Hz uchar PFMFreqEnvelopeEnabled; // Frequency Envelope of the Modulator EnvelopeParams* FMFreqEnvelope; uchar 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(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); 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]; /* * didn't want to make the following two public but could find * no other way to access them from UnifiedPresets. * Will. */ void add2XMLsection(XMLwrapper& xml, int n); void getfromXMLsection(XMLwrapper& xml, int n); static int ADnote_unison_sizes[15]; private: void defaults(int n); // n is the nvoice void enableVoice(int nvoice); void killVoice(int nvoice); fft::Calc& fft; }; #endif yoshimi-2.3.3.3/src/Params/Controller.cpp000066400000000000000000000400611475757676000202330ustar00rootroot00000000000000/* 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/XMLwrapper.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(XMLwrapper& xml) { xml.addpar("pitchwheel_bendrange", pitchwheel.bendrange); xml.addparbool("expression_receive",expression.receive); xml.addpar("panning_depth", (char)panning.depth); xml.addpar("filter_cutoff_depth",filtercutoff.depth); xml.addpar("filter_q_depth",filterq.depth); xml.addpar("bandwidth_depth",bandwidth.depth); xml.addpar("mod_wheel_depth",modwheel.depth); xml.addparbool("mod_wheel_exponential",modwheel.exponential); xml.addparbool("fm_amp_receive",fmamp.receive); xml.addparbool("volume_receive",volume.receive); xml.addpar("volume_range",volume.data); xml.addparbool("sustain_receive",sustain.receive); xml.addparbool("portamento_receive",portamento.receive); xml.addpar("portamento_time",portamento.time); xml.addpar("portamento_pitchthresh",portamento.pitchthresh); xml.addpar("portamento_pitchthreshtype",portamento.pitchthreshtype); xml.addpar("portamento_portamento",portamento.portamento); xml.addpar("portamento_updowntimestretch",portamento.updowntimestretch); xml.addpar("portamento_proportional", portamento.proportional); xml.addpar("portamento_proprate", portamento.propRate); xml.addpar("portamento_propdepth", portamento.propDepth); xml.addpar("resonance_center_depth",resonancecenter.depth); xml.addpar("resonance_bandwidth_depth",resonancebandwidth.depth); } void Controller::getfromXML(XMLwrapper& xml) { pitchwheel.bendrange= xml.getpar("pitchwheel_bendrange",pitchwheel.bendrange,-6400,6400); expression.receive = xml.getparbool("expression_receive",expression.receive); panning.depth = xml.getpar127("panning_depth", panning.depth); filtercutoff.depth = xml.getpar127("filter_cutoff_depth",filtercutoff.depth); filterq.depth = xml.getpar127("filter_q_depth",filterq.depth); bandwidth.depth = xml.getpar127("bandwidth_depth",bandwidth.depth); modwheel.depth = xml.getpar127("mod_wheel_depth",modwheel.depth); modwheel.exponential= xml.getparbool("mod_wheel_exponential",modwheel.exponential); fmamp.receive = xml.getparbool("fm_amp_receive",fmamp.receive); volume.receive = xml.getparbool("volume_receive",volume.receive); setvolume(xml.getpar127("volume_range",volume.data)); sustain.receive = xml.getparbool("sustain_receive",sustain.receive); portamento.receive = xml.getparbool("portamento_receive",portamento.receive); portamento.time = xml.getpar127("portamento_time",portamento.time); portamento.pitchthresh = xml.getpar127("portamento_pitchthresh",portamento.pitchthresh); portamento.pitchthreshtype = xml.getpar127("portamento_pitchthreshtype",portamento.pitchthreshtype); portamento.portamento = xml.getpar127("portamento_portamento",portamento.portamento); portamento.updowntimestretch= xml.getpar127("portamento_updowntimestretch",portamento.updowntimestretch); portamento.proportional = xml.getpar127("portamento_proportional",portamento.proportional); portamento.propRate = xml.getpar127("portamento_proprate",portamento.propRate); portamento.propDepth = xml.getpar127("portamento_propdepth",portamento.propDepth); resonancecenter.depth = xml.getpar127("resonance_center_depth",resonancecenter.depth); resonancebandwidth.depth = xml.getpar127("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.3.3/src/Params/Controller.h000066400000000000000000000112131475757676000176750ustar00rootroot00000000000000/* 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 XMLwrapper; class SynthEngine; class Controller { public: ~Controller() = default; Controller(SynthEngine *_synth); void resetall(); void add2XML(XMLwrapper& xml); void defaults(); void getfromXML(XMLwrapper& xml); // 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 yoshimi-2.3.3.3/src/Params/EnvelopeParams.cpp000066400000000000000000000457731475757676000210500ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "Misc/NumericFuncs.h" #include "Params/EnvelopeParams.h" using func::power; EnvelopeParams::EnvelopeParams(uchar Penvstretch_, uchar Pforcedrelease_, SynthEngine& _synth) : ParamBase(_synth), Pfreemode(1), 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 = 0; 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 = 0; 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(XMLwrapper& xml) { xml.addparbool("free_mode",Pfreemode); xml.addpar("env_points",Penvpoints); xml.addpar("env_sustain",Penvsustain); xml.addpar("env_stretch",Penvstretch); xml.addparbool("forced_release",Pforcedrelease); xml.addparbool("linear_envelope",Plinearenvelope); xml.addparcombi("A_dt",PA_dt); xml.addparcombi("D_dt",PD_dt); xml.addparcombi("R_dt",PR_dt); xml.addparcombi("A_val",PA_val); xml.addparcombi("D_val",PD_val); xml.addparcombi("S_val",PS_val); xml.addparcombi("R_val",PR_val); if ((Pfreemode!=0)||(!xml.minimal)) { for (size_t i=0; i 0) xml.addparcombi("dt",Penvdt[i]); xml.addparcombi("val",Penvval[i]); xml.endbranch(); } } } void EnvelopeParams::getfromXML(XMLwrapper& xml) { Pfreemode=xml.getparbool("free_mode",Pfreemode); Penvpoints=xml.getpar127("env_points",Penvpoints); Penvsustain=xml.getpar127("env_sustain",Penvsustain); Penvstretch=xml.getpar127("env_stretch",Penvstretch); Pforcedrelease=xml.getparbool("forced_release",Pforcedrelease); Plinearenvelope=xml.getparbool("linear_envelope",Plinearenvelope); PA_dt=xml.getparcombi("A_dt",PA_dt,0,127); PD_dt=xml.getparcombi("D_dt",PD_dt,0,127); PR_dt=xml.getparcombi("R_dt",PR_dt,0,127); PA_val=xml.getparcombi("A_val",PA_val,0,127); PD_val=xml.getparcombi("D_val",PD_val,0,127); PS_val=xml.getparcombi("S_val",PS_val,0,127); PR_val=xml.getparcombi("R_val",PR_val,0,127); for (size_t i=0;i 0) Penvdt[i]=xml.getparcombi("dt",Penvdt[i], 0,127); Penvval[i]=xml.getparcombi("val",Penvval[i], 0,127); xml.exitbranch(); } if (!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 = 0; 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; unsigned char type = 0; // envelope defaults int min = 0; int max = 127; float def = 64; unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; 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; } } 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.3.3/src/Params/EnvelopeParams.h000066400000000000000000000147001475757676000204770ustar00rootroot00000000000000/* 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 XMLwrapper; class SynthEngine; 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(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); float getdt(size_t i); // MIDI Parameters uchar Pfreemode; // 1 if it is in free mode or 0 if it is in ADSR or ASR mode (comment from original author) 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.3.3/src/Params/FilterParams.cpp000066400000000000000000000505371475757676000205120ustar00rootroot00000000000000/* 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/XMLwrapper.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::add2XMLsection(XMLwrapper& xml, int n) { int nvowel = n; for (int nformant = 0; nformant < FF_MAX_FORMANTS; ++nformant) { xml.beginbranch("FORMANT",nformant); xml.addparcombi("freq",Pvowels[nvowel].formants[nformant].freq); xml.addparcombi("amp",Pvowels[nvowel].formants[nformant].amp); xml.addparcombi("q",Pvowels[nvowel].formants[nformant].q); xml.endbranch(); } } void FilterParams::add2XML(XMLwrapper& xml) { //filter parameters xml.addpar("category",Pcategory); xml.addpar("type",Ptype); xml.addparcombi("freq",Pfreq); xml.addparcombi("q",Pq); xml.addpar("stages",Pstages); xml.addparcombi("freq_track",Pfreqtrack); xml.addparbool("freqtrackoffset",Pfreqtrackoffset); xml.addparcombi("gain",Pgain); //formant filter parameters if ((Pcategory==1)||(!xml.minimal)) { xml.beginbranch("FORMANT_FILTER"); xml.addpar("num_formants",Pnumformants); xml.addparcombi("formant_slowness",Pformantslowness); xml.addparcombi("vowel_clearness",Pvowelclearness); xml.addpar("center_freq",Pcenterfreq); xml.addpar("octaves_freq",Poctavesfreq); for (int nvowel=0;nvoweldata.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.3.3/src/Params/FilterParams.h000066400000000000000000000160231475757676000201470ustar00rootroot00000000000000/* 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 XMLwrapper; class SynthEngine; class FilterParams : public ParamBase { public: FilterParams(uchar Ptype_, float Pfreq, float Pq_, uchar Pfreqtrackoffset_, SynthEngine&); void defaults() override; void add2XML(XMLwrapper& xml); void add2XMLsection(XMLwrapper& xml, int n); void getfromXML(XMLwrapper& xml); void getfromXMLsection(XMLwrapper& xml, int n); 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.3.3/src/Params/LFOParams.cpp000066400000000000000000000201021475757676000176660ustar00rootroot00000000000000/* 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 "Params/LFOParams.h" #include "Misc/NumericFuncs.h" using func::power; LFOParams::LFOParams(float Pfreq_, float Pintensity_, float Pstartphase_, uchar PLFOtype_, float Prandomness_, float Pdelay_, uchar 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(XMLwrapper& xml) { float freqF = float(PfreqI) / float(Fmul2I); if (Pbpm) // Save quantized, so that we can make the scale finer in the future, if // necessary. freqF = func::quantizedLFOfreqBPM(freqF); xml.addpar("freqI", freqF * float(Fmul2I)); xml.addparreal("freq", freqF); xml.addparcombi("intensity", Pintensity); xml.addparcombi("start_phase", Pstartphase); xml.addpar("lfo_type", PLFOtype); xml.addparcombi("randomness_amplitude", Prandomness); xml.addparcombi("randomness_frequency", Pfreqrand); xml.addparcombi("delay", Pdelay); xml.addparcombi("stretch", Pstretch); xml.addparbool("continous", Pcontinous); xml.addparbool("bpm", Pbpm); } void LFOParams::getfromXML(XMLwrapper& xml) { //PfreqI = xml.getpar("freqI", -1, 0, Fmul2I); //if (PfreqI == -1) PfreqI = xml.getparreal("freq", Pfreq, 0.0, 1.0) * float(Fmul2I); setPfreq(PfreqI); Pintensity = xml.getparcombi("intensity", Pintensity,0,127); Pstartphase = xml.getparcombi("start_phase", Pstartphase,0,127); PLFOtype = xml.getpar127("lfo_type", PLFOtype); Prandomness = xml.getparcombi("randomness_amplitude", Prandomness,0,127); Pfreqrand = xml.getparcombi("randomness_frequency", Pfreqrand,0,127); Pdelay = xml.getparcombi("delay", Pdelay,0,127); Pstretch = xml.getparcombi("stretch", Pstretch,0,127); Pcontinous = xml.getparbool("continous", Pcontinous); Pbpm = xml.getparbool("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.3.3/src/Params/LFOParams.h000066400000000000000000000102371475757676000173430ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "Params/ParamCheck.h" class SynthEngine; class LFOParams : public ParamBase { public: LFOParams(float Pfreq_, float Pintensity_, float Pstartphase_, uchar PLFOtype_, float Prandomness_, float Pdelay_, uchar Pcontinous, int fel_, SynthEngine&); void defaults() override; void add2XML(XMLwrapper& xml); void setPfreq(int32_t n); void getfromXML(XMLwrapper& 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(uchar n) { Pbpm = n; } void setPcontinous(uchar n) { Pcontinous = n; 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; uchar Pbpm; uchar 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; uchar 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.3.3/src/Params/OscilParameters.cpp000066400000000000000000000352151475757676000212120ustar00rootroot00000000000000/* 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 "Misc/SynthEngine.h" #include "Params/OscilParameters.h" // **** RHL **** 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(XMLwrapper& xml) { xml.addpar("harmonic_mag_type", Phmagtype); xml.addpar("base_function", Pcurrentbasefunc); xml.addpar("base_function_par", Pbasefuncpar); xml.addpar("base_function_modulation", Pbasefuncmodulation); xml.addpar("base_function_modulation_par1", Pbasefuncmodulationpar1); xml.addpar("base_function_modulation_par2", Pbasefuncmodulationpar2); xml.addpar("base_function_modulation_par3", Pbasefuncmodulationpar3); xml.addpar("modulation", Pmodulation); xml.addpar("modulation_par1", Pmodulationpar1); xml.addpar("modulation_par2", Pmodulationpar2); xml.addpar("modulation_par3", Pmodulationpar3); xml.addpar("wave_shaping", Pwaveshaping); xml.addpar("wave_shaping_function", Pwaveshapingfunction); xml.addpar("filter_type", Pfiltertype); xml.addpar("filter_par1", Pfilterpar1); xml.addpar("filter_par2", Pfilterpar2); xml.addpar("filter_before_wave_shaping", Pfilterbeforews); xml.addpar("spectrum_adjust_type", Psatype); xml.addpar("spectrum_adjust_par", Psapar); xml.addpar("rand", Prand); xml.addpar("amp_rand_type", Pamprandtype); xml.addpar("amp_rand_power", Pamprandpower); xml.addpar("harmonic_shift", Pharmonicshift); xml.addparbool("harmonic_shift_first", Pharmonicshiftfirst); xml.addpar("adaptive_harmonics", Padaptiveharmonics); xml.addpar("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq); xml.addpar("adaptive_harmonics_power", Padaptiveharmonicspower); xml.addpar("adaptive_harmonics_par", Padaptiveharmonicspar); xml.beginbranch("HARMONICS"); for (int n = 0; n < MAX_AD_HARMONICS; ++n) { if (Phmag[n] == 64 && Phphase[n] == 64) continue; xml.beginbranch("HARMONIC", n + 1); xml.addpar("mag", Phmag[n]); xml.addpar("phase", Phphase[n]); xml.endbranch(); } xml.endbranch(); 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; xml.beginbranch("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 && fabsf(xs) > 0.00001) { xml.beginbranch("BF_HARMONIC", i); xml.addparreal("cos", xc); xml.addparreal("sin", xs); xml.endbranch(); } } xml.endbranch(); } } void OscilParameters::getfromXML(XMLwrapper& xml) { Phmagtype = xml.getpar127("harmonic_mag_type", Phmagtype); Pcurrentbasefunc = xml.getpar127("base_function", Pcurrentbasefunc); Pbasefuncpar = xml.getpar127("base_function_par", Pbasefuncpar); Pbasefuncmodulation = xml.getpar127("base_function_modulation", Pbasefuncmodulation); Pbasefuncmodulationpar1 = xml.getpar127("base_function_modulation_par1", Pbasefuncmodulationpar1); Pbasefuncmodulationpar2 = xml.getpar127("base_function_modulation_par2", Pbasefuncmodulationpar2); Pbasefuncmodulationpar3 = xml.getpar127("base_function_modulation_par3", Pbasefuncmodulationpar3); Pmodulation = xml.getpar127("modulation", Pmodulation); Pmodulationpar1 = xml.getpar127("modulation_par1", Pmodulationpar1); Pmodulationpar2 = xml.getpar127("modulation_par2", Pmodulationpar2); Pmodulationpar3 = xml.getpar127("modulation_par3", Pmodulationpar3); Pwaveshaping = xml.getpar127("wave_shaping", Pwaveshaping); Pwaveshapingfunction = xml.getpar127("wave_shaping_function", Pwaveshapingfunction); Pfiltertype = xml.getpar127("filter_type", Pfiltertype); Pfilterpar1 = xml.getpar127("filter_par1", Pfilterpar1); Pfilterpar2 = xml.getpar127("filter_par2", Pfilterpar2); Pfilterbeforews = xml.getpar127("filter_before_wave_shaping", Pfilterbeforews); Psatype = xml.getpar127("spectrum_adjust_type", Psatype); Psapar = xml.getpar127("spectrum_adjust_par", Psapar); Prand = xml.getpar127("rand", Prand); Pamprandtype = xml.getpar127("amp_rand_type", Pamprandtype); Pamprandpower = xml.getpar127("amp_rand_power", Pamprandpower); Pharmonicshift = xml.getpar("harmonic_shift", Pharmonicshift, -64, 64); Pharmonicshiftfirst = xml.getparbool("harmonic_shift_first", Pharmonicshiftfirst); Padaptiveharmonics = xml.getpar("adaptive_harmonics", Padaptiveharmonics, 0, 127); Padaptiveharmonicsbasefreq = xml.getpar("adaptive_harmonics_base_frequency", Padaptiveharmonicsbasefreq,0,255); Padaptiveharmonicspower = xml.getpar("adaptive_harmonics_power", Padaptiveharmonicspower, 0, 200); Padaptiveharmonicspar = xml.getpar("adaptive_harmonics_par", Padaptiveharmonicspar, 0, 100); if (xml.enterbranch("HARMONICS")) { Phmag[0] = 64; Phphase[0] = 64; for (int n = 0; n < MAX_AD_HARMONICS; ++n) { if (xml.enterbranch("HARMONIC",n + 1) == 0) continue; Phmag[n] = xml.getpar127("mag", 64); Phphase[n] = xml.getpar127("phase", 64); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("BASE_FUNCTION")) { for (size_t i = 1; i < basefuncSpectrum.size(); ++i) { if (xml.enterbranch("BF_HARMONIC", i)) { basefuncSpectrum.c(i) = xml.getparreal("cos", 0.0); basefuncSpectrum.s(i) = xml.getparreal("sin", 0.0); xml.exitbranch(); } } xml.exitbranch(); 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.3.3/src/Params/OscilParameters.h000066400000000000000000000100461475757676000206520ustar00rootroot00000000000000/* 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 "ParamCheck.h" #include "DSP/FFTwrapper.h" class OscilParameters : public ParamBase { public: OscilParameters(fft::Calc const& fft, SynthEngine&); void defaults() override; void add2XML(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); 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.3.3/src/Params/PADStatus.h000066400000000000000000000104561475757676000173720ustar00rootroot00000000000000/* 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.3.3/src/Params/PADnoteParameters.cpp000066400000000000000000001361161475757676000214350ustar00rootroot00000000000000/* 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/XMLwrapper.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, 0, 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, 0, 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, 0, 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(XMLwrapper& xml) { // currently not used // bool yoshiFormat = synth.usingYoshiType; xml.information.PADsynth_used = 1; xml.addparbool("stereo", PStereo); xml.addpar("mode",Pmode); xml.addpar("bandwidth",Pbandwidth); xml.addpar("bandwidth_scale",Pbwscale); xml.addparU("xfade_update",PxFadeUpdate); xml.beginbranch("HARMONIC_PROFILE"); xml.addpar("base_type",PProfile.base.type); xml.addpar("base_par1",PProfile.base.pwidth); xml.addpar("frequency_multiplier",PProfile.freqmult); xml.addpar("modulator_par1",PProfile.modulator.pstretch); xml.addpar("modulator_frequency",PProfile.modulator.freq); xml.addpar("width",PProfile.width); xml.addpar("amplitude_multiplier_type",PProfile.amp.type); xml.addpar("amplitude_multiplier_mode",PProfile.amp.mode); xml.addpar("amplitude_multiplier_par1",PProfile.amp.par1); xml.addpar("amplitude_multiplier_par2",PProfile.amp.par2); xml.addparbool("autoscale",PProfile.autoscale); xml.addpar("one_half",PProfile.onehalf); xml.endbranch(); xml.beginbranch("OSCIL"); POscil->add2XML(xml); xml.endbranch(); xml.beginbranch("RESONANCE"); resonance->add2XML(xml); xml.endbranch(); xml.beginbranch("HARMONIC_POSITION"); xml.addpar("type",Phrpos.type); xml.addpar("parameter1",Phrpos.par1); xml.addpar("parameter2",Phrpos.par2); xml.addpar("parameter3",Phrpos.par3); xml.endbranch(); xml.beginbranch("SAMPLE_QUALITY"); xml.addpar("samplesize",Pquality.samplesize); xml.addpar("basenote",Pquality.basenote); xml.addpar("octaves",Pquality.oct); xml.addpar("samples_per_octave",Pquality.smpoct); xml.endbranch(); xml.beginbranch("AMPLITUDE_PARAMETERS"); xml.addpar("volume",PVolume); // new yoshi type xml.addpar("pan_pos", PPanning); xml.addparbool("random_pan", PRandom); xml.addpar("random_width", PWidth); // legacy if (PRandom) xml.addpar("panning", 0); else xml.addpar("panning",PPanning); xml.addpar("velocity_sensing",PAmpVelocityScaleFunction); xml.addpar("fadein_adjustment", Fadein_adjustment); xml.addpar("punch_strength",PPunchStrength); xml.addpar("punch_time",PPunchTime); xml.addpar("punch_stretch",PPunchStretch); xml.addpar("punch_velocity_sensing",PPunchVelocitySensing); xml.beginbranch("AMPLITUDE_ENVELOPE"); AmpEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("AMPLITUDE_LFO"); AmpLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("FREQUENCY_PARAMETERS"); xml.addpar("fixed_freq",Pfixedfreq); xml.addpar("fixed_freq_et",PfixedfreqET); xml.addpar("bend_adjust", PBendAdjust); xml.addpar("offset_hz", POffsetHz); xml.addpar("detune",PDetune); xml.addpar("coarse_detune",PCoarseDetune); xml.addpar("detune_type",PDetuneType); xml.beginbranch("FREQUENCY_ENVELOPE"); FreqEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("FREQUENCY_LFO"); FreqLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("FILTER_PARAMETERS"); xml.addpar("velocity_sensing_amplitude",PFilterVelocityScale); xml.addpar("velocity_sensing",PFilterVelocityScaleFunction); xml.beginbranch("FILTER"); GlobalFilter->add2XML(xml); xml.endbranch(); xml.beginbranch("FILTER_ENVELOPE"); FilterEnvelope->add2XML(xml); xml.endbranch(); xml.beginbranch("FILTER_LFO"); FilterLfo->add2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("RANDOM_WALK"); xml.addparU("rebuild_trigger",PrebuildTrigger); xml.addpar("rand_detune",PrandWalkDetune); xml.addpar("rand_bandwidth",PrandWalkBandwidth); xml.addpar("rand_filter_freq",PrandWalkFilterFreq); xml.addpar("rand_profile_width",PrandWalkProfileWidth); xml.addpar("rand_profile_stretch",PrandWalkProfileStretch); xml.endbranch(); } void PADnoteParameters::getfromXML(XMLwrapper& xml) { PStereo=xml.getparbool("stereo",PStereo); Pmode=xml.getpar127("mode",0); Pbandwidth=xml.getpar("bandwidth",Pbandwidth,0,1000); Pbwscale=xml.getpar127("bandwidth_scale",Pbwscale); PxFadeUpdate=xml.getparU("xfade_update",PxFadeUpdate, 0,XFADE_UPDATE_MAX); if (xml.enterbranch("HARMONIC_PROFILE")) { PProfile.base.type=xml.getpar127("base_type",PProfile.base.type); PProfile.base.pwidth=xml.getpar127("base_par1",PProfile.base.pwidth); PProfile.freqmult=xml.getpar127("frequency_multiplier",PProfile.freqmult); PProfile.modulator.pstretch=xml.getpar127("modulator_par1",PProfile.modulator.pstretch); PProfile.modulator.freq=xml.getpar127("modulator_frequency",PProfile.modulator.freq); PProfile.width=xml.getpar127("width",PProfile.width); PProfile.amp.type=xml.getpar127("amplitude_multiplier_type",PProfile.amp.type); PProfile.amp.mode=xml.getpar127("amplitude_multiplier_mode",PProfile.amp.mode); PProfile.amp.par1=xml.getpar127("amplitude_multiplier_par1",PProfile.amp.par1); PProfile.amp.par2=xml.getpar127("amplitude_multiplier_par2",PProfile.amp.par2); PProfile.autoscale=xml.getparbool("autoscale",PProfile.autoscale); PProfile.onehalf=xml.getpar127("one_half",PProfile.onehalf); xml.exitbranch(); } if (xml.enterbranch("OSCIL")) { POscil->getfromXML(xml); xml.exitbranch(); } if (xml.enterbranch("RESONANCE")) { resonance->getfromXML(xml); xml.exitbranch(); } if (xml.enterbranch("HARMONIC_POSITION")) { Phrpos.type=xml.getpar127("type",Phrpos.type); Phrpos.par1=xml.getpar("parameter1",Phrpos.par1,0,255); Phrpos.par2=xml.getpar("parameter2",Phrpos.par2,0,255); Phrpos.par3=xml.getpar("parameter3",Phrpos.par3,0,255); xml.exitbranch(); } if (xml.enterbranch("SAMPLE_QUALITY")) { Pquality.samplesize=xml.getpar127("samplesize",Pquality.samplesize); Pquality.basenote=xml.getpar127("basenote",Pquality.basenote); Pquality.oct=xml.getpar127("octaves",Pquality.oct); Pquality.smpoct=xml.getpar127("samples_per_octave",Pquality.smpoct); xml.exitbranch(); } if (xml.enterbranch("AMPLITUDE_PARAMETERS")) { PVolume=xml.getpar127("volume",PVolume); int test = xml.getpar127("random_width", UNUSED); if (test < 64) // new Yoshi type { PWidth = test; setPan(xml.getpar127("pan_pos",PPanning), synth.getRuntime().panLaw); PRandom = xml.getparbool("random_pan", PRandom); } else // legacy { setPan(xml.getpar127("panning",PPanning), synth.getRuntime().panLaw); if (PPanning == 0) { PPanning = 64; PRandom = true; PWidth = 63; } } PAmpVelocityScaleFunction=xml.getpar127("velocity_sensing",PAmpVelocityScaleFunction); Fadein_adjustment = xml.getpar127("fadein_adjustment", Fadein_adjustment); PPunchStrength=xml.getpar127("punch_strength",PPunchStrength); PPunchTime=xml.getpar127("punch_time",PPunchTime); PPunchStretch=xml.getpar127("punch_stretch",PPunchStretch); PPunchVelocitySensing=xml.getpar127("punch_velocity_sensing",PPunchVelocitySensing); xml.enterbranch("AMPLITUDE_ENVELOPE"); AmpEnvelope->getfromXML(xml); xml.exitbranch(); xml.enterbranch("AMPLITUDE_LFO"); AmpLfo->getfromXML(xml); xml.exitbranch(); xml.exitbranch(); } if (xml.enterbranch("FREQUENCY_PARAMETERS")) { Pfixedfreq=xml.getpar127("fixed_freq",Pfixedfreq); PfixedfreqET=xml.getpar127("fixed_freq_et",PfixedfreqET); PBendAdjust=xml.getpar127("bend_adjust", PBendAdjust); POffsetHz =xml.getpar127("offset_hz", POffsetHz); PDetune=xml.getpar("detune",PDetune,0,16383); PCoarseDetune=xml.getpar("coarse_detune",PCoarseDetune,0,16383); PDetuneType=xml.getpar127("detune_type",PDetuneType); xml.enterbranch("FREQUENCY_ENVELOPE"); FreqEnvelope->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FREQUENCY_LFO"); FreqLfo->getfromXML(xml); xml.exitbranch(); xml.exitbranch(); } if (xml.enterbranch("FILTER_PARAMETERS")) { PFilterVelocityScale=xml.getpar127("velocity_sensing_amplitude",PFilterVelocityScale); PFilterVelocityScaleFunction=xml.getpar127("velocity_sensing",PFilterVelocityScaleFunction); xml.enterbranch("FILTER"); GlobalFilter->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FILTER_ENVELOPE"); FilterEnvelope->getfromXML(xml); xml.exitbranch(); xml.enterbranch("FILTER_LFO"); FilterLfo->getfromXML(xml); xml.exitbranch(); xml.exitbranch(); } if (xml.enterbranch("RANDOM_WALK")) { PrebuildTrigger =xml.getparU("rebuild_trigger" ,PrebuildTrigger, 0,REBUILDTRIGGER_MAX); PrandWalkDetune =xml.getpar127("rand_detune" ,PrandWalkDetune); PrandWalkBandwidth =xml.getpar127("rand_bandwidth" ,PrandWalkBandwidth); PrandWalkFilterFreq =xml.getpar127("rand_filter_freq" ,PrandWalkFilterFreq); PrandWalkProfileWidth =xml.getpar127("rand_profile_width" ,PrandWalkProfileWidth); PrandWalkProfileStretch=xml.getpar127("rand_profile_stretch",PrandWalkProfileStretch); randWalkDetune .setSpread(PrandWalkDetune); randWalkBandwidth .setSpread(PrandWalkBandwidth); randWalkFilterFreq .setSpread(PrandWalkFilterFreq); randWalkProfileWidth .setSpread(PrandWalkProfileWidth); randWalkProfileStretch .setSpread(PrandWalkProfileStretch); xml.exitbranch(); } // 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.3.3/src/Params/PADnoteParameters.h000066400000000000000000000276071475757676000211060ustar00rootroot00000000000000/* 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 XMLwrapper; class OscilParameters; class Resonance; class EnvelopeParams; 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(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); 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.3.3/src/Params/ParamCheck.cpp000066400000000000000000000020461475757676000201070ustar00rootroot00000000000000/* 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.3.3/src/Params/ParamCheck.h000066400000000000000000000066711475757676000175640ustar00rootroot00000000000000/* 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.3.3/src/Params/RandomWalk.h000066400000000000000000000113751475757676000176220ustar00rootroot00000000000000/* 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.3.3/src/Params/SUBnoteParameters.cpp000066400000000000000000000415771475757676000214700ustar00rootroot00000000000000/* 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 "Misc/NumericFuncs.h" using func::setAllPan; using func::power; SUBnoteParameters::SUBnoteParameters(SynthEngine& _synth) : ParamBase{_synth} { AmpEnvelope = new EnvelopeParams(64, 1, synth); AmpEnvelope->ADSRinit_dB(0, 40, 127, 25); FreqEnvelope = new EnvelopeParams(64, 0, synth); FreqEnvelope->ASRinit(30, 50, 64, 60); BandWidthEnvelope = new EnvelopeParams(64, 0, synth); BandWidthEnvelope->ASRinit_bw(100, 70, 64, 60); GlobalFilter = new FilterParams(2, 80, 40, 0, synth); GlobalFilterEnvelope = new EnvelopeParams(0, 1, synth); GlobalFilterEnvelope->ADSRinit_filter(64, 40, 64, 70, 60, 64); 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 = 0; PBandWidthEnvelopeEnabled = 0; 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 = 0; PGlobalFilterVelocityScale = 64; PGlobalFilterVelocityScaleFunction = 64; AmpEnvelope->defaults(); FreqEnvelope->defaults(); BandWidthEnvelope->defaults(); GlobalFilter->defaults(); GlobalFilterEnvelope->defaults(); } SUBnoteParameters::~SUBnoteParameters() { delete AmpEnvelope; delete FreqEnvelope; delete BandWidthEnvelope; delete GlobalFilter; delete GlobalFilterEnvelope; } 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(XMLwrapper& xml) { // currently not used // bool yoshiFormat = synth.usingYoshiType; xml.information.SUBsynth_used = 1; xml.addpar("num_stages",Pnumstages); xml.addpar("harmonic_mag_type",Phmagtype); xml.addpar("start",Pstart); xml.beginbranch("HARMONICS"); for (int i=0; iadd2XML(xml); xml.endbranch(); xml.endbranch(); xml.beginbranch("FREQUENCY_PARAMETERS"); xml.addparbool("fixed_freq",Pfixedfreq); xml.addpar("fixed_freq_et",PfixedfreqET); xml.addpar("bend_adjust", PBendAdjust); xml.addpar("offset_hz", POffsetHz); xml.addpar("detune",PDetune); xml.addpar("coarse_detune",PCoarseDetune); xml.addpar("overtone_spread_type", POvertoneSpread.type); xml.addpar("overtone_spread_par1", POvertoneSpread.par1); xml.addpar("overtone_spread_par2", POvertoneSpread.par2); xml.addpar("overtone_spread_par3", POvertoneSpread.par3); xml.addpar("detune_type",PDetuneType); xml.addpar("bandwidth",Pbandwidth); xml.addpar("bandwidth_scale",Pbwscale); xml.addparbool("freq_envelope_enabled",PFreqEnvelopeEnabled); if ((PFreqEnvelopeEnabled!=0)||(!xml.minimal)) { xml.beginbranch("FREQUENCY_ENVELOPE"); FreqEnvelope->add2XML(xml); xml.endbranch(); } xml.addparbool("band_width_envelope_enabled",PBandWidthEnvelopeEnabled); if ((PBandWidthEnvelopeEnabled!=0)||(!xml.minimal)) { xml.beginbranch("BANDWIDTH_ENVELOPE"); BandWidthEnvelope->add2XML(xml); xml.endbranch(); } xml.endbranch(); xml.beginbranch("FILTER_PARAMETERS"); xml.addparbool("enabled",PGlobalFilterEnabled); if ((PGlobalFilterEnabled!=0)||(!xml.minimal)) { xml.beginbranch("FILTER"); GlobalFilter->add2XML(xml); xml.endbranch(); xml.addpar("filter_velocity_sensing",PGlobalFilterVelocityScaleFunction); xml.addpar("filter_velocity_sensing_amplitude",PGlobalFilterVelocityScale); xml.beginbranch("FILTER_ENVELOPE"); GlobalFilterEnvelope->add2XML(xml); xml.endbranch(); } xml.endbranch(); } 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(XMLwrapper& xml) { Pnumstages=xml.getpar127("num_stages",Pnumstages); Phmagtype=xml.getpar127("harmonic_mag_type",Phmagtype); Pstart=xml.getpar127("start",Pstart); if (xml.enterbranch("HARMONICS")) { Phmag[0]=0; for (int i=0; igetfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FREQUENCY_PARAMETERS")) { Pfixedfreq=xml.getparbool("fixed_freq",Pfixedfreq); PfixedfreqET=xml.getpar127("fixed_freq_et",PfixedfreqET); PBendAdjust = xml.getpar127("bend_adjust", PBendAdjust); POffsetHz = xml.getpar127("offset_hz", POffsetHz); PDetune=xml.getpar("detune",PDetune,0,16383); PCoarseDetune=xml.getpar("coarse_detune",PCoarseDetune,0,16383); POvertoneSpread.type = xml.getpar127("overtone_spread_type", POvertoneSpread.type); POvertoneSpread.par1 = xml.getpar("overtone_spread_par1", POvertoneSpread.par1, 0, 255); POvertoneSpread.par2 = xml.getpar("overtone_spread_par2", POvertoneSpread.par2, 0, 255); POvertoneSpread.par3 = xml.getpar("overtone_spread_par3", POvertoneSpread.par3, 0, 255); updateFrequencyMultipliers(); PDetuneType=xml.getpar127("detune_type",PDetuneType); Pbandwidth=xml.getpar127("bandwidth",Pbandwidth); Pbwscale=xml.getpar127("bandwidth_scale",Pbwscale); PFreqEnvelopeEnabled=xml.getparbool("freq_envelope_enabled",PFreqEnvelopeEnabled); if (xml.enterbranch("FREQUENCY_ENVELOPE")) { FreqEnvelope->getfromXML(xml); xml.exitbranch(); } PBandWidthEnvelopeEnabled=xml.getparbool("band_width_envelope_enabled",PBandWidthEnvelopeEnabled); if (xml.enterbranch("BANDWIDTH_ENVELOPE")) { BandWidthEnvelope->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } if (xml.enterbranch("FILTER_PARAMETERS")) { PGlobalFilterEnabled=xml.getparbool("enabled",PGlobalFilterEnabled); if (xml.enterbranch("FILTER")) { GlobalFilter->getfromXML(xml); xml.exitbranch(); } PGlobalFilterVelocityScaleFunction=xml.getpar127("filter_velocity_sensing",PGlobalFilterVelocityScaleFunction); PGlobalFilterVelocityScale=xml.getpar127("filter_velocity_sensing_amplitude",PGlobalFilterVelocityScale); if (xml.enterbranch("FILTER_ENVELOPE")) { GlobalFilterEnvelope->getfromXML(xml); xml.exitbranch(); } xml.exitbranch(); } } 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.3.3/src/Params/SUBnoteParameters.h000066400000000000000000000076431475757676000211310ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "Params/EnvelopeParams.h" #include "Params/FilterParams.h" #include "Params/ParamCheck.h" class SynthEngine; class SUBnoteParameters : public ParamBase { public: SUBnoteParameters(SynthEngine&); ~SUBnoteParameters() override; void defaults() override; void setPan(char pan, uchar panLaw); void add2XML(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); 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; EnvelopeParams *AmpEnvelope; // Frequency Parameters ushort PDetune; ushort PCoarseDetune; uchar PDetuneType; uchar PFreqEnvelopeEnabled; EnvelopeParams* FreqEnvelope; uchar PBandWidthEnvelopeEnabled; EnvelopeParams* BandWidthEnvelope; uchar PBendAdjust; // Pitch Bend uchar POffsetHz; // Filter Parameters (Global) uchar PGlobalFilterEnabled; FilterParams* GlobalFilter; uchar PGlobalFilterVelocityScale; uchar PGlobalFilterVelocityScaleFunction; EnvelopeParams* GlobalFilterEnvelope; // 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.3.3/src/Params/UnifiedPresets.cpp000066400000000000000000000556361475757676000210570ustar00rootroot00000000000000/* 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/XMLwrapper.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() { int type = cmd.data.type; int value = cmd.data.value; human = value; // used for listing. 'value may change before it is read if (type == TOPLEVEL::type::List && human > 0) { string group{findPresetType()}; if (human == 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 } } /* * sending a message here was doubling the number of messages * but only one was actually being read! */ value = UNUSED; return findPresetType(); // human friendly extension } 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 (human == 0) load(); else remove(); } } return name; } string UnifiedPresets::listpos(int count) const { // If human = 2 we want to get the extension not the friendly name int test = 0; if (human == 1) test = 1; return presetgroups[count * 2 + test]; } string UnifiedPresets::findPresetType() { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; int insert = cmd.data.insert; int parameter = cmd.data.parameter; int offset = cmd.data.offset; 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+human];//"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(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; int insert = cmd.data.insert; string name; if (kitItem == EFFECT::type::dynFilter && insert == TOPLEVEL::insert::filterGroup) { ; // passed on to filters } else if (kitItem >= EFFECT::type:: none && kitItem < EFFECT::type::count) { { EffectMgr *sectionType; if (npart == TOPLEVEL::section::systemEffects) { sectionType = synth.sysefx[engineType]; } else if (npart == TOPLEVEL::section::insertEffects) { sectionType = synth.insefx[engineType]; } else { sectionType = synth.part[npart]->partefx[engineType]; } name = "Peffect"; if (isLoad) { sectionType->defaults(); xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); synth.pushEffectUpdate(npart); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } } } if (name.empty()) { switch (insert) { case TOPLEVEL::insert::resonanceGroup: { name = resonanceXML(xml, isLoad); } break; case TOPLEVEL::insert::oscillatorGroup: { name = oscilXML(xml, isLoad); } break; case TOPLEVEL::insert::filterGroup: { name = filterXML(xml, isLoad); } break; case TOPLEVEL::insert::LFOgroup: { name = lfoXML(xml, isLoad); } break; case TOPLEVEL::insert::envelopeGroup: { name = envelopeXML(xml, isLoad); } break; } } if (!name.empty()) return name; if (engineType == PART::engine::addSynth) { name = "Padsyth"; ADnoteParameters *sectionType = synth.part[npart]->kit[kitItem].adpars; if (isLoad) { sectionType->defaults(); xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } } else if (engineType >= PART::engine::addVoice1) { name = "Padsythn"; ADnoteParameters *sectionType = synth.part[npart]->kit[kitItem].adpars; size_t voice = engineType - PART::engine::addVoice1; if (isLoad) { sectionType->voiceDefaults(voice); xml.enterbranch(name); sectionType->getfromXMLsection(xml, voice); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XMLsection(xml, voice); xml.endbranch(); } } else if (engineType == PART::engine::subSynth) { name = "Psubsyth"; SUBnoteParameters *sectionType = synth.part[npart]->kit[kitItem].subpars; if (isLoad) { sectionType->defaults(); xml.enterbranch(name); sectionType->getfromXML(xml); xml.endbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } } else if (engineType == PART::engine::padSynth) { name = "Ppadsyth"; PADnoteParameters * sectionType = synth.part[npart]->kit[kitItem].padpars; if (isLoad) { sectionType->defaults(); xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } } return name; } string UnifiedPresets::resonanceXML(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; string name{"Presonance"}; Resonance* sectionType; if (engineType == PART::engine::addSynth) { sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.Reson; } else if (engineType == PART::engine::padSynth) { sectionType = synth.part[npart]->kit[kitItem].padpars->resonance.get(); } else return ""; if (isLoad) { xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } return name; } string UnifiedPresets::oscilXML(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; string name{"Poscilgen"}; OscilParameters *sectionType; if (engineType >= (PART::engine::addVoice1)) { if (engineType >= PART::engine::addMod1) { engineType -= NUM_VOICES; sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].POscilFM; } else { sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].POscil; } } else if (engineType == PART::engine::padSynth) { sectionType = synth.part[npart]->kit[kitItem].padpars->POscil.get(); } else return ""; if (isLoad) { xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } return name; } string UnifiedPresets::filterXML(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; int offset = cmd.data.offset; string name; if (offset == UNUSED) { name = "Pfilter"; } else { name = "Pfiltern"; } FilterParams *sectionType; // top level if (npart == TOPLEVEL::section::systemEffects) { sectionType = synth.sysefx[0]->filterpars; } else if (npart == TOPLEVEL::section::insertEffects) { sectionType = synth.insefx[0]->filterpars; } // part level else if (kitItem == EFFECT::type::dynFilter) { sectionType = synth.part[npart]->partefx[0]->filterpars; } else if (engineType == PART::engine::addSynth) { sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.GlobalFilter; } else if (engineType >= PART::engine::addVoice1) { sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].VoiceFilter; } else if (engineType == PART::engine::subSynth) { sectionType = synth.part[npart]->kit[kitItem].subpars->GlobalFilter; } else if (engineType == PART::engine::padSynth) { sectionType = synth.part[npart]->kit[kitItem].padpars->GlobalFilter.get(); } else { return ""; } if (isLoad) { if (offset == UNUSED) { xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.enterbranch(name); sectionType->getfromXMLsection(xml, offset); xml.exitbranch(); } } else { if (offset == UNUSED) { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } else { xml.beginbranch(name); sectionType->add2XMLsection(xml, offset); xml.endbranch(); } } return name; } string UnifiedPresets::lfoXML(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; int parameter = cmd.data.parameter; string name; LFOParams *sectionType = NULL; if (engineType == PART::engine::addSynth) { switch (parameter) { case 0: name = "Plfoamplitude"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.AmpLfo; break; case 1: name = "Plfofrequency"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FreqLfo; break; case 2: name = "Plfofilter"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FilterLfo; break; } } else if (engineType >= PART::engine::addVoice1) { switch (parameter) { case 0: name = "Plfoamplitude"; sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].AmpLfo; break; case 1: name = "Plfofrequency"; sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FreqLfo; break; case 2: name = "Plfofilter"; sectionType = 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"; sectionType = synth.part[npart]->kit[kitItem].padpars->AmpLfo.get(); break; case 1: name = "Plfofrequency"; sectionType = synth.part[npart]->kit[kitItem].padpars->FreqLfo.get(); break; case 2: name = "Plfofilter"; sectionType = synth.part[npart]->kit[kitItem].padpars->FilterLfo.get(); break; } } if (name.empty()) return ""; if (isLoad) { xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } return name; } string UnifiedPresets::envelopeXML(XMLwrapper& xml, bool isLoad) { int npart = cmd.data.part; int kitItem = cmd.data.kit; int engineType = cmd.data.engine; int parameter = cmd.data.parameter; string name; EnvelopeParams* sectionType{nullptr}; if (engineType == PART::engine::addSynth) { switch (parameter) { case 0: name = "Penvamplitude"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.AmpEnvelope; break; case 1: name = "Penvfrequency"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FreqEnvelope; break; case 2: name = "Penvfilter"; sectionType = synth.part[npart]->kit[kitItem].adpars->GlobalPar.FilterEnvelope; break; } } else if (engineType >= PART::engine::addVoice1) { switch (parameter) { case 0: name = "Penvamplitude"; sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].AmpEnvelope; break; case 1: name = "Penvfrequency"; sectionType = synth.part[npart]->kit[kitItem].adpars->VoicePar[engineType - PART::engine::addVoice1].FreqEnvelope; break; case 2: name = "Penvfilter"; sectionType = 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"; sectionType = synth.part[npart]->kit[kitItem].subpars->AmpEnvelope; break; case 1: name = "Penvfrequency"; sectionType = synth.part[npart]->kit[kitItem].subpars->FreqEnvelope; break; case 2: name = "Penvfilter"; sectionType = synth.part[npart]->kit[kitItem].subpars->GlobalFilterEnvelope; break; case 3: name = "Penvbandwidth"; sectionType = synth.part[npart]->kit[kitItem].subpars->BandWidthEnvelope; break; } } else if (engineType == PART::engine::padSynth) { switch (parameter) { case 0: name = "Penvamplitude"; sectionType = synth.part[npart]->kit[kitItem].padpars->AmpEnvelope.get(); break; case 1: name = "Penvfrequency"; sectionType = synth.part[npart]->kit[kitItem].padpars->FreqEnvelope.get(); break; case 2: name = "Penvfilter"; sectionType = synth.part[npart]->kit[kitItem].padpars->FilterEnvelope.get(); break; } } if (name.empty()) return ""; if (isLoad) { xml.enterbranch(name); sectionType->getfromXML(xml); xml.exitbranch(); } else { xml.beginbranch(name); sectionType->add2XML(xml); xml.endbranch(); } return name; } void UnifiedPresets::save() { synth.getRuntime().xmlType = TOPLEVEL::XML::Presets; auto xml{std::make_unique(synth, false)}; string type{accessXML(*xml, false)}; if (type.empty()) synth.getRuntime().Log("Unrecognised preset type"); else { string dirname; string name = synth.textMsgBuffer.fetch(cmd.data.miscmsg); if (name.empty()) { dirname = file::localDir() + "/clipboard"; if (file::createDir(dirname)) synth.getRuntime().Log("Failed to open clipboard directory"); else xml->saveXMLfile(dirname + "/section." + type + EXTEN::presets); } else { dirname = synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]; xml->saveXMLfile(dirname + "/" + name + "." + type + EXTEN::presets); } } } void UnifiedPresets::load() { synth.getRuntime().xmlType = TOPLEVEL::XML::Presets; string type{findPresetType()}; auto xml{std::make_unique(synth, false)}; string name = synth.textMsgBuffer.fetch(cmd.data.miscmsg); string dirname; string prefix; if (name.empty()) { dirname = file::localDir() + "/clipboard"; if (file::createDir(dirname)) { synth.getRuntime().Log("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) { synth.getRuntime().Log("Can't match " + filename + " here."); return; } xml->loadXMLfile(filename); accessXML(*xml, true); } void UnifiedPresets::remove() { human = 0; // we need the extension this time. string type = findPresetType(); string name = synth.textMsgBuffer.fetch(cmd.data.miscmsg); string dirname = synth.getRuntime().presetsDirlist[synth.getRuntime().presetsRootID]; string filename = dirname + "/" + name + "." + type + EXTEN::presets; file::deleteFile(filename); } yoshimi-2.3.3.3/src/Params/UnifiedPresets.h000066400000000000000000000047211475757676000205110ustar00rootroot00000000000000/* 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 "globals.h" #include "Misc/XMLwrapper.h" #include "Misc/SynthEngine.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 UnifiedPresets { SynthEngine& synth; CommandBlock& cmd; vector presetList; int human; // used to select the extension or the friendly name in listing public: UnifiedPresets(SynthEngine& synthInstance, CommandBlock& cmdData) : synth{synthInstance} , cmd{cmdData} , presetList{} , human{0} { }; // 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 (XMLwrapper&, bool isLoad); string resonanceXML(XMLwrapper&, bool isLoad); string oscilXML (XMLwrapper&, bool isLoad); string filterXML (XMLwrapper&, bool isLoad); string lfoXML (XMLwrapper&, bool isLoad); string envelopeXML (XMLwrapper&, bool isLoad); string listpos(int count) const; }; #endif yoshimi-2.3.3.3/src/Synth/000077500000000000000000000000001475757676000152655ustar00rootroot00000000000000yoshimi-2.3.3.3/src/Synth/ADnote.cpp000066400000000000000000003042011475757676000171430ustar00rootroot00000000000000/* 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 (!(adpars.VoicePar[nvoice].Enabled && (subVoiceNr == -1 || 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(); auto &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 != 0) NoteVoicePar[nvoice].fmFreqEnvelope.reset(new Envelope{adpars.VoicePar[nvoice].FMFreqEnvelope, note.freq, &synth}); if (adpars.VoicePar[nvoice].PFMAmpEnvelopeEnabled != 0) 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 != 0); // 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 (!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 (!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.3.3/src/Synth/ADnote.h000066400000000000000000000364241475757676000166210ustar00rootroot00000000000000/* 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) int filterBypass; int delayTicks; SampleHolder oscilSmp; // Waveform of the Voice. Shared with sub voices. int phaseOffset; // PWM emulation // Frequency parameters int 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; unsigned char 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.3.3/src/Synth/Envelope.cpp000066400000000000000000000141661475757676000175560ustar00rootroot00000000000000/* 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 (!_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.3.3/src/Synth/Envelope.h000066400000000000000000000040751475757676000172210ustar00rootroot00000000000000/* 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.3.3/src/Synth/LFO.cpp000066400000000000000000000225031475757676000164130ustar00rootroot00000000000000/* 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 (lfopars->Pcontinous == 0) { // 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 != 0) { prevMonotonicBeat = synth->getMonotonicBeat(); prevBpmFrac = getBpmFrac(); startPhase = fmodf(startPhase - prevMonotonicBeat * prevBpmFrac.first / prevBpmFrac.second, 1.0f); if (startPhase < 0) startPhase += 1.0f; } } else if (lfopars->Pbpm == 0) { // 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 == 1 && Pbpm == 1. 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 != 0 && lfopars->Pbpm != 0) // 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 (lfopars->Pbpm == 0) { 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 { std::pair frac = getBpmFrac(); float newBeat; if (lfopars->Pcontinous == 0) { 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.3.3/src/Synth/LFO.h000066400000000000000000000041751475757676000160650ustar00rootroot00000000000000/* 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.3.3/src/Synth/OscilGen.cpp000066400000000000000000001231411475757676000174760ustar00rootroot00000000000000/* 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.3.3/src/Synth/OscilGen.h000066400000000000000000000140061475757676000171420ustar00rootroot00000000000000/* 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 "Misc/RandomGen.h" #include "Misc/WaveShapeSamples.h" #include "Misc/XMLwrapper.h" #include "DSP/FFTwrapper.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.3.3/src/Synth/PADnote.cpp000066400000000000000000000426101475757676000172660ustar00rootroot00000000000000/* 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.3.3/src/Synth/PADnote.h000066400000000000000000000103671475757676000167370ustar00rootroot00000000000000/* 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.3.3/src/Synth/Resonance.cpp000066400000000000000000000245121475757676000177120ustar00rootroot00000000000000/* 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" using func::power; Resonance::Resonance(SynthEngine& _synth) : ParamBase{_synth} { defaults(); } void Resonance::defaults() { Penabled = 0; 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, unsigned char 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 (Penabled == 0) return; // if the 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(XMLwrapper& xml) { xml.addparbool("enabled",Penabled); if ((Penabled==0)&&(xml.minimal)) return; xml.addparcombi("max_db",PmaxdB); xml.addparcombi("center_freq",Pcenterfreq); xml.addparcombi("octaves_freq",Poctavesfreq); xml.addparbool("protect_fundamental_frequency",Pprotectthefundamental); xml.addpar("resonance_points",MAX_RESONANCE_POINTS); for (int i=0; idata.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; int insert = getData->data.insert; unsigned char type = 0; type |= TOPLEVEL::type::Integer; // resonance defaults int min = 0; int max = 1; int def = 0; unsigned char 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.3.3/src/Synth/Resonance.h000066400000000000000000000050511475757676000173540ustar00rootroot00000000000000/* 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 "Misc/XMLwrapper.h" #include "Params/ParamCheck.h" class SynthEngine; 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(XMLwrapper& xml); void getfromXML(XMLwrapper& xml); float getfreqpos(float freq); float getfreqx(float x); float getfreqresponse(float freq); float getcenterfreq(); float getoctavesfreq(); void sendcontroller(ushort ctl, float par); // parameters uchar 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.3.3/src/Synth/SUBnote.cpp000066400000000000000000000613361475757676000173210ustar00rootroot00000000000000/* 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 "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}); if (orig.freqEnvelope) freqEnvelope.reset(new Envelope{*orig.freqEnvelope}); if (orig.bandWidthEnvelope) bandWidthEnvelope.reset(new Envelope{*orig.bandWidthEnvelope}); if (pars.PGlobalFilterEnabled != 0) { globalFilterL.reset(new Filter{*orig.globalFilterL}); globalFilterR.reset(new Filter{*orig.globalFilterR}); globalFilterEnvelope.reset(new Envelope{*orig.globalFilterEnvelope}); } 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, freq, &synth}); if (pars.PFreqEnvelopeEnabled != 0) freqEnvelope.reset(new Envelope{pars.FreqEnvelope, freq, &synth}); if (pars.PBandWidthEnvelopeEnabled != 0) bandWidthEnvelope.reset(new Envelope{pars.BandWidthEnvelope, freq, &synth}); if (pars.PGlobalFilterEnabled != 0) { globalFilterL.reset(new Filter{*pars.GlobalFilter, 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, synth}); globalFilterEnvelope.reset(new Envelope{pars.GlobalFilterEnvelope, 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 = 1.0f; float envbw = 1.0f; float gain = 1.0f; if (freqEnvelope != NULL) { envfreq = freqEnvelope->envout() / 1200; 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 || bandWidthEnvelope != NULL || oldpitchwheel != ctl.pitchwheel.data || oldbandwidth != ctl.bandwidth.data || portamento) computeallfiltercoefs(); // Envelope newamplitude = volume * ampEnvelope->envout_dB(); // 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(); 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.3.3/src/Synth/SUBnote.h000066400000000000000000000111041475757676000167520ustar00rootroot00000000000000/* 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 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 freqEnvelope; unique_ptr bandWidthEnvelope; unique_ptr globalFilterEnvelope; 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.3.3/src/Synth/WaveInterpolator.h000066400000000000000000000347521475757676000207560ustar00rootroot00000000000000/* 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.3.3/src/Synth/XFadeManager.h000066400000000000000000000064261475757676000177300ustar00rootroot00000000000000/* 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.3.3/src/UI/000077500000000000000000000000001475757676000144755ustar00rootroot00000000000000yoshimi-2.3.3.3/src/UI/ADnoteUI.fl000066400000000000000000004246171475757676000164460ustar00rootroot00000000000000# 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 "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);} } { 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);} } { 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);} } { 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.3.3/src/UI/BankUI.fl000066400000000000000000001655671475757676000161550ustar00rootroot00000000000000# 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-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 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 "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); else labelcolor(gen_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 (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 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 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; 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 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 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) { 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.3.3/src/UI/ConfigUI.fl000066400000000000000000002615511475757676000164750ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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 "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 {905 61 390 330} type Double hide resizable 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 { 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 hide } { 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 nonFatal { label {Hide Non Fatal Errors} 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().showGui);} 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().showCli);} 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. If using LV2, the plugin needs to be reloaded in order to reflect the change in the MIDI program list.} 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. If using LV2, the plugin needs to be reloaded in order to reflect the change in the MIDI program list.} 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. If using LV2, the plugin needs to be reloaded in order to reflect the change in the MIDI program list.} 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 180 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 180 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 160 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 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 } { 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 {5 437 460 270} type Double hide resizable 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::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::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(); 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().showGui); enableCLI->value(synth->getRuntime().showCli); 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); 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); 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.3.3/src/UI/ConsoleUI.fl000066400000000000000000000122531475757676000166630ustar00rootroot00000000000000# 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.3.3/src/UI/DynamicTooltip.cpp000066400000000000000000000155701475757676000201500ustar00rootroot00000000000000/* 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 #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){ 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; /* Calculate & set dimensions of the tooltip text */ fl_font(Fl_Tooltip::font(), Fl_Tooltip::size()); 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) { position(Fl::event_x_root() + xoffs, Fl::event_y_root() + 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.3.3/src/UI/DynamicTooltip.h000066400000000000000000000041661475757676000176140ustar00rootroot00000000000000/* 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; 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.3.3/src/UI/EffUI.fl000066400000000000000000003257051475757676000157720ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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-2024, 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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} box UP_BOX 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 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(); //if (nextEff != EFFECT::type::none) { //effRtext(this->w()/380, nextEff - EFFECT::type::none); }} {} } 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.3.3/src/UI/EnvelopeUI.fl000066400000000000000000001722151475757676000170430ustar00rootroot00000000000000# 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/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 (env->Pfreemode==0) 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 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 != 0) { 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 (env->Pfreemode==0) 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 (env->Pfreemode==0) 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 (env->Pfreemode==0) 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 (env->Pfreemode==0) 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 ((env->Pfreemode==0)||(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 (env->Pfreemode==0) 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); if (insert == TOPLEVEL::insert::envelopePointAdd || insert == TOPLEVEL::insert::envelopePointDelete || insert == TOPLEVEL::insert::envelopePointChange) { if (insert == TOPLEVEL::insert::envelopePointChange) // adjust point freeedit->lastpoint = control; else if (offset > 127) // delete point freeedit->lastpoint -= 1; else // add point freeedit->lastpoint += 1; freeedit->redraw(); envfree->redraw(); sustaincounter->value(env->Penvsustain); sustaincounter->maximum(env->Penvpoints-2); return; } 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 (env->Pfreemode==0) sustaincounter->hide(); else sustaincounter->show(); sustaincounter->maximum(env->Penvpoints-2); envstretchdial->value(env->Penvstretch); if (env->Pfreemode==0) envstretchdial->hide(); else envstretchdial->show(); linearenvelopecheck->value(env->Plinearenvelope); if ((env->Pfreemode==0)||(env->Envmode>2)) linearenvelopecheck->hide(); else linearenvelopecheck->show(); forcedreleasecheck->value(env->Pforcedrelease); if (env->Pfreemode==0) forcedreleasecheck->hide(); freeedit->redraw(); if (env->Pfreemode==0) { 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 (env->Pfreemode==0) { 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.3.3/src/UI/FilterUI.fl000066400000000000000000001710641475757676000165140ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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-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 "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 {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); /* original version pars->formantfilterH(*nvowel, lx, graphpoints); oiy = int((graphpoints[0] / maxdB + 1.0) * ly / 2.0); for (i = 1; i < lx; ++i) { int iy = int((graphpoints[i] / maxdB + 1.0) * ly / 2.0); if (iy >= 0 && oiy >= 0 && iy < ly && oiy < lx) fl_line(ox + i - 1, oy + ly - oiy, ox, oy + ly - iy); oiy = iy; } */} {} } 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 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.3.3/src/UI/LFOUI.fl000066400000000000000000000452001475757676000156770ustar00rootroot00000000000000# 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.3.3/src/UI/MasterMiscUI.fl000066400000000000000000000552201475757676000173310ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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-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 } {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 (Vpeak < 0) // its inactive { fl_color(45); fl_rectf(ox, oy, lx, ly); } else { 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); fl_rectf(ox, oy + ly - panelpart.oldpeak[actualpart], mid, panelpart.oldpeak[actualpart]); if (panelpart.clip[actualpart]) fl_rectf(ox, oy, mid, 4, VU_over); Vpeak = fetchData(0, MAIN::control::readPartPeak, TOPLEVEL::section::main, actualpart, 1); if (Vpeak > 1.0) panelpart.clipR[actualpart] = true; 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); 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.3.3/src/UI/MasterUI.fl000066400000000000000000005140131475757676000165150ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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-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.} {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 "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 (synth->getRuntime().oldConfig) { string msg; msg = "Existing config older than V " + to_string(MIN_CONFIG_MAJOR) + "." + to_string(MIN_CONFIG_MINOR) + " \\nCheck settings."; 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 {// 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 {9 24 385 500} type Double labelfont 13 labelsize 12 resizable code0 {mainDW = 385; mainDH = 470;} code1 {masterwindow->size_range(394, 500, 0, 0, 0, 0, 1);} visible } { Fl_Box keyHandle { label keyhandler xywh {0 0 385 500} box FLAT_BOX code0 {o->init(synth);} class KeyHandle } Fl_Box topcontrols { xywh {271 28 111 115} box ENGRAVED_FRAME } 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 { 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 { 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 (!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 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 { 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 { // 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 { 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 121} labeltype NO_LABEL labelsize 11 labelcolor 96 align 22 } { 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 {280 32 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_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 (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 68 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 68 24} box PLASTIC_UP_BOX color 89 labelfont 1 labelsize 11 labelcolor 64 align 16 } 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 {331 32 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_Button mainvirtkeyb { label {Virtual Key&board} callback {// virkeyboard->ShowKbd();} tooltip {Virtual Keyboard} xywh {83 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 {83 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 {83 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 {197 30 68 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 {197 60 68 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 {197 90 68 24} box PLASTIC_UP_BOX color 228 labelsize 11 labelcolor 64 } } Fl_Tabs sysinsgroup { label {System/Insert} callback {// if (o->value() == SystemEffectsGrp) showSysEfxUI(); else if (o->value() == InsertionEffectsGrp) showInsEfxUI();} xywh {3 118 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 146 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 156 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 156 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 156 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 156 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 152 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 167 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } Fl_Group InsertionEffectsGrp { label { Insertion Effects } xywh {3 146 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 156 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 156 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 156 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 152 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 167 25 14} box THIN_UP_BOX color 179 labelfont 1 labelsize 11 labelcolor 197 } } } Fl_Group syseffectuigroup { xywh {3 188 379 95} box FLAT_BOX color 48 labeltype NO_LABEL labelcolor 64 code0 {o->show();} } { Fl_Group syseffectui { xywh {3 188 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 188 379 95} box FLAT_BOX color 48 labelcolor 64 code0 {o->hide();} } { Fl_Group inseffectui { xywh {3 188 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 285 379 178} box ENGRAVED_FRAME } { Fl_Group partui { xywh {3 285 379 172} color 47 code0 {partui->init(synth->part[npart], npart, bankui);} class PartUI } {} Fl_Group partControls { xywh {3 286 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 327 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 327 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 327 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 327 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 291 195 25} box GTK_THIN_UP_BOX color 198 } { Fl_Box instrumentaddbox { xywh {140 296 60 15} box FLAT_BOX } Fl_Box instrumentsubbox { xywh {200 296 65 15} box FLAT_BOX } Fl_Box instrumentpadbox { xywh {264 296 63 15} box FLAT_BOX } Fl_Box instrumentlabel { label {Simple Sound} xywh {139 295 187 16} selection_color 64 labelfont 1 labelsize 12 labelcolor 64 align 16 } Fl_Box instrumentFrame { xywh {140 296 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 291 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 {34 350 40 19} color 7 labelsize 11 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 291 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 {8 373 86 22} 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 {100 373 60 22} box GTK_THIN_UP_BOX color 198 labelsize 12 labelcolor 64 } Fl_Box modepatch { label Mode xywh {155 328 32 17} 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 {82 327 68 19} down_box BORDER_BOX labelsize 11 labelcolor 64 align 8 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 {84 351 14 18} 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 402 42 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 434 42 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 403 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 421 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 439 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 {195 403 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 {195 435 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 {240 400 134 58} box ENGRAVED_FRAME labelcolor 64 } { Fl_Text_Display sysEffName { label {Send to System Effect} xywh {255 440 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 {246 415 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 {278 415 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 {310 415 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 415 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 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 {58 326 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 460 379 35} box DOWN_BOX color 43 labelsize 12 } { Fl_Box vumeter { label {VU-Meter} xywh {3 461 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 463 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 68 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 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 88 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 116 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_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 292 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 292 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 {216 376 160 20} down_box BORDER_BOX labelsize 12 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 320 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);} } { 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);} } { 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());} } { 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);} 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);} 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);} 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::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) { 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) { 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; } 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); 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 {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); 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.3.3/src/UI/MicrotonalUI.fl000066400000000000000000000706431475757676000173770ustar00rootroot00000000000000# 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 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.3.3/src/UI/MidiLearnUI.fl000066400000000000000000000576471475757676000171450ustar00rootroot00000000000000# 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 "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);} } { 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.3.3/src/UI/MiscGui.cpp000066400000000000000000001550211475757676000165450ustar00rootroot00000000000000/* 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 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: 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::envelopeGroup: case TOPLEVEL::insert::envelopePointAdd: case TOPLEVEL::insert::envelopePointDelete: case TOPLEVEL::insert::envelopePointChange: 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: 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: 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.3.3/src/UI/MiscGui.h000066400000000000000000000251651475757676000162170ustar00rootroot00000000000000/* 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.3.3/src/UI/OscilGenUI.fl000066400000000000000000001467061475757676000167770ustar00rootroot00000000000000# 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 "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);} } { 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.3.3/src/UI/PADnoteUI.fl000066400000000000000000002277041475757676000165640ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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);} } { 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);} } { 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.3.3/src/UI/ParametersUI.fl000066400000000000000000000152731475757676000173710ustar00rootroot00000000000000# 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 "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 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.3.3/src/UI/PartUI.fl000066400000000000000000003231131475757676000161670ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 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 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 "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);} } { 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; } if (Fl::event_state(FL_CTRL)) { if (choice(synth, "", "Yes", "No", "Set entire part " + std::to_string(npart + 1) + " controls to default values ?") > 1) send_data(TOPLEVEL::action::forceUpdate, MAIN::control::defaultPart, npart, TOPLEVEL::type::Integer, TOPLEVEL::section::main); return; } if (choice(synth, "", "Yes", "No", "Set part " + std::to_string(npart + 1) + " instrument to 'Simple Sound' ?") > 1) 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);} } { 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);} } { 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} box UP_BOX 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);} } { 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 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);} } { 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);} } { 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.3.3/src/UI/PresetsUI.fl000066400000000000000000000331651475757676000167130ustar00rootroot00000000000000# 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 } 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 } { 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 } { 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.3.3/src/UI/ResonanceUI.fl000066400000000000000000000563551475757676000172110ustar00rootroot00000000000000# 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/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 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 (_SYS_::F2B(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.3.3/src/UI/SUBnoteUI.fl000066400000000000000000001161371475757676000166060ustar00rootroot00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 header_name {.h} code_name {.cc} 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-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 } {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 "EnvelopeUI.h"} {public local } decl {\#include "FilterUI.h"} {public local } decl {\#include "PresetsUI.h"} {public local } decl {\#include "OscilGenUI.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 {463 28 735 470} 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);} } { Fl_Scroll frame { xywh {5 140 435 326} type HORIZONTAL box THIN_UP_BOX when 1 } { Fl_Pack harmonics { xywh {4 148 435 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_Box {} { xywh {10 6 205 60} box PLASTIC_UP_BOX color 223 } Fl_Group ampgrp { xywh {5 5 215 135} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { 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 {22 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 {66 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 {118 22 29 29} box ROUND_UP_BOX labelsize 10 labelcolor 64 maximum 127 step 1 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial } Fl_Group ampenv { label {Yoshimi : SubSynth - Amplitude Envelope} xywh {10 65 205 70} box FLAT_BOX color 51 labelcolor 64 align 144 code0 {o->init(pars->AmpEnvelope, npart, kititem, PART::engine::subSynth, 0);} class EnvelopeUI } {} 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 {178 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 {155 31 15 15} down_box DOWN_BOX color 48 selection_color 64 labelsize 11 labelcolor 64 align 1 class Fl_Check_Button2 } Fl_Box {} { xywh {108 22 4 38} box THIN_DOWN_FRAME } Fl_Box ampLabel { label AMPLITUDE xywh {100 10 20 10} labelfont 1 labelsize 11 labelcolor 64 } } Fl_Group freqsettingsui { label FREQUENCY xywh {440 5 290 135} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group freqenvelopegroup { label {Yoshimi : SubSynth - Frequency Envelope} xywh {445 65 205 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->FreqEnvelope, 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_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 {445 67 34 12} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Text_Display octavetext { label Octave xywh {446 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 {445 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 {500 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 {558 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 {620 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 {675 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 {491 47 234 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 {655 78 70 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 {654 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 {445 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 {440 406 65 35} box THIN_UP_FRAME } Fl_Group bandwidthsettingsui { label BANDWIDTH xywh {220 5 220 135} box THIN_UP_FRAME labelfont 1 labelsize 11 labelcolor 64 align 17 } { Fl_Group bandwidthenvelopegroup { label {Yoshimi : SubSynth - BandWidth Envelope} xywh {225 65 210 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->BandWidthEnvelope, 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 {225 67 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 {225 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 {344 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 {440 140 290 81} 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 {570 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 {625 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 {680 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 {460 171 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 {440 221 290 185} 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 {447 328 275 70} box FLAT_BOX color 51 align 144 code0 {o->init(pars->GlobalFilterEnvelope, npart, kititem, PART::engine::subSynth, 2);} class EnvelopeUI } {} Fl_Group filterui { label {Yoshimi : SubSynth - Filter} xywh {447 246 275 75} box FLAT_BOX color 50 align 144 code0 {o->init(pars->GlobalFilter,&pars->PGlobalFilterVelocityScale,&pars->PGlobalFilterVelocityScaleFunction, npart, kititem, 1);} class FilterUI } {} } 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 {446 227 36 13} down_box DOWN_BOX selection_color 64 labelfont 3 labelsize 10 labelcolor 226 class Fl_Check_Button2 } Fl_Group {} { xywh {504 406 226 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 {513 421 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 {590 421 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 {670 421 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 {442 415 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 {445 446 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 {540 449 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 {576 449 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 {625 446 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(); 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; ampenv->envRtext(dScale); bandwidthenvelopegroup->envRtext(dScale); filterenv->envRtext(dScale); freqenvelopegroup->envRtext(dScale); filterui->filterRtext(dScale); int size = int(10 * dScale); int size11 = int(11 * dScale); frame->scroll_to(0, 0); frame->size(int(435 * 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); 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::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.3.3/src/UI/Splash.cpp000066400000000000000000000107621475757676000164410ustar00rootroot00000000000000/* 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.3.3/src/UI/Splash.h000066400000000000000000000030011475757676000160720ustar00rootroot00000000000000/* 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.3.3/src/UI/SplashPngHex000066400000000000000000014767021475757676000170050ustar00rootroot000000000000000x89,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.3.3/src/UI/Themes.h000066400000000000000000000304241475757676000160760ustar00rootroot00000000000000/* 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 - 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 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.3.3/src/UI/VectorUI.fl000066400000000000000000000762301475757676000165300ustar00rootroot00000000000000# 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 "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);} } { 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; } 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.3.3/src/UI/VirKeyboardUI.fl000066400000000000000000000541241475757676000175050ustar00rootroot00000000000000# 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 {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);} } { 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.3.3/src/UI/WidgetCheckButton.cpp000066400000000000000000000136561475757676000205710ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetCheckButton.h000066400000000000000000000026001475757676000202210ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetMWSlider.cpp000066400000000000000000000112751475757676000200410ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetMWSlider.h000066400000000000000000000043371475757676000175070ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetPDial.cpp000066400000000000000000000175251475757676000173500ustar00rootroot00000000000000/* 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-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 "WidgetPDial.h" #include "Misc/NumericFuncs.h" #include #include #include #include #include #include using func::limit; 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() { int cx = x(), cy = y(), sx = w(), sy = h(); 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(), Fl_Window::current()->h()); 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.3.3/src/UI/WidgetPDial.h000066400000000000000000000035211475757676000170040ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetSpinner.cpp000066400000000000000000000025321475757676000177650ustar00rootroot00000000000000/* 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.3.3/src/UI/WidgetSpinner.h000066400000000000000000000033311475757676000174300ustar00rootroot00000000000000/* 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.3.3/src/UI/YoshiWin.cpp000066400000000000000000000041141475757676000167520ustar00rootroot00000000000000/* YoshiWin.cpp 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 code is no longer used but is mothballed for future reference #include "YoshiWin.h" #include "Misc/NumericFuncs.h" #include #include #include #include using func::limit; YoshiWin::YoshiWin(int x,int y, int w, int h, const char *label) : Fl_Double_Window(x,y,w,h,label) { ; } YoshiWin::~YoshiWin() { ; } void textResize(void* done) { //printf("Timeout expired!\n"); if (done != NULL) { Fl_Double_Window* currentWin = reinterpret_cast(done); currentWin->do_callback(); } } void YoshiWin::resize(int x, int y, int w, int h) { Fl_Double_Window::resize(x, y, w, h); //std::cout << "Resized: x" << x << " y" << y << " w " << w << " h " << h << std::endl; Fl::remove_timeout(textResize, NULL); Fl::add_timeout(0.2, textResize, this); // ensure at least one refresh within FLTK update } */ /* * In the header * * decl {\#include "UI/YoshiWin.h"} {public local } * The code below should be placed in the window's callback * and 'windowRtext()' then used to adjust text etc. * every time the window is resized. * if (Fl::event() == FL_CLOSE) o->hide(); else if (Fl::event() == FL_MOVE || Fl::event() == FL_FULLSCREEN) windowRtext();} */ yoshimi-2.3.3.3/src/UI/YoshiWin.h000066400000000000000000000020501475757676000164140ustar00rootroot00000000000000/* YoshiWin.h 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 YoshiWin_h #define YoshiWin_h #include #include "UI/MiscGui.h" class YoshiWin : public Fl_Double_Window { public: YoshiWin(int x,int y, int w, int h, const char *label=0); ~YoshiWin(); void resize(int x, int y, int w, int h); }; #endif yoshimi-2.3.3.3/src/globals.h000066400000000000000000000754411475757676000157670ustar00rootroot00000000000000/* 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 }; 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, MasterUpdate, 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 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, 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, 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, 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, volume, velocitySense, panning, velocityOffset, midiChannel, keyMode, channelATset, keyATset, portamento, kitItemMute, minNote, maxNote, minToLastKey, maxToLastKey, resetMinMaxKey, kitEffectNum = 24, maxNotes = 33, keyShift = 35, partToSystemEffect1 = 40, partToSystemEffect2, partToSystemEffect3, partToSystemEffect4, humanise = 48, humanvelocity, drumMode = 57, kitMode, effectNumber = 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, 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.3.3/src/main.cpp000066400000000000000000000222521475757676000156130ustar00rootroot00000000000000/* 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 (Config::primary().oldConfig) { cout << "\nExisting config older than " << MIN_CONFIG_MAJOR << "." << MIN_CONFIG_MINOR << "\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.3.3/banks/Will_Godfrey_Collection/0082-Sharp and Warm.xiz000066400000000000000000000053451475757676000250510ustar00rootroot00000000000000v6=_ջ+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.3.3/banks/Will_Godfrey_Collection/0083-Sharp and Deep.xiz000066400000000000000000000053451475757676000250210ustar00rootroot00000000000000][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.3.3/banks/Will_Godfrey_Collection/0084-Sharp Reed.xiz000066400000000000000000000070361475757676000243000ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0085-Far Reed.xiz000066400000000000000000000072051475757676000237320ustar00rootroot00000000000000]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.3.3/banks/Will_Godfrey_Collection/0086-Clarinet.xiz000066400000000000000000000071241475757676000241240ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Collection/0087-Bassoon.xiz000066400000000000000000000071171475757676000237720ustar00rootroot00000000000000]]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.3.3/banks/Will_Godfrey_Collection/0089-Daooww.xiz000066400000000000000000000042031475757676000236210ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0090-Yaooww.xiz000066400000000000000000000042171475757676000236430ustar00rootroot00000000000000[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.3.3/banks/Will_Godfrey_Collection/0092-Eeoow.xiz000066400000000000000000000054461475757676000234430ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0096-Power Guitar 1.xiz000066400000000000000000000041501475757676000250110ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0097-Power Guitar 2.xiz000066400000000000000000000041621475757676000250160ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0098-Wet Brass.xiz000066400000000000000000000042211475757676000241530ustar00rootroot00000000000000\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.3.3/banks/Will_Godfrey_Collection/0099-Wet Brass 2.xiz000066400000000000000000000043741475757676000243070ustar00rootroot00000000000000\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ə