commit 5ab2096fc4b1a30316be9a51f7a7ff8d73910802 Author: Me Here Date: Mon Jun 8 11:43:14 2026 -0500 PolyMeter — slim main: landing chooser + mobile app + notation editor Clean, dependency-light front page. Only three things ship here: - index.html — two-button landing: Mobile -> mobile.html, Desktop -> pm_e-2.html - mobile.html — touch-first PWA (+ mobile-sessions.html practice journal) - pm_e-2.html — engraved-notation editor build.sh/deploy.sh trimmed to just these; deploy mirrors dist/ to the web root with rsync --delete. README/CLAUDE.md rewritten for the slim scope. The full project (PM_E-1 editor, embeddable widget, all hardware form-factor pages, Pico firmware editions, the Rust port, and the KiCad/SPICE hardware design) is preserved on the `concepts` branch. Co-Authored-By: Claude Opus 4.8 (1M context) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ca36a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Build output — assembled from index.html + assets/ by build.sh +dist/ +tools/ + +# Python build artifacts +__pycache__/ +*.pyc diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..0bebffd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,48 @@ +# CLAUDE.md + +This file guides Claude Code (claude.ai/code) when working in this repository. + +This is the **slim `main` branch** of VARASYS PolyMeter — a polymetric groove-trainer / +metronome. Only three things ship here: + +- `index.html` — the landing chooser: two buttons, **Mobile** → `mobile.html` and + **Desktop** → `pm_e-2.html`. +- `mobile.html` — the touch-first phone/tablet **PWA** (+ `mobile-sessions.html`, its practice + journal). Installable, works offline via `mobile-sw.js` + `manifest.webmanifest`. +- `pm_e-2.html` — the engraved-notation editor. + +The **full project** (the PM_E-1 editor, the embeddable widget, every hardware form-factor page, +the Pico **firmware** editions, the **Rust** port, and the **KiCad/SPICE hardware** design) lives +on the **`concepts`** branch. Pull anything back from there if it needs to return to the front page. + +## Commands + +```sh +./build.sh # assemble the self-contained pages into dist/ (git-ignored) +./deploy.sh # build, stamp version, mirror dist/ to the Caddy web root, smoke-test +``` + +There's no test suite on this branch (the track-format conformance suite lives on `concepts`). + +## Build system + +Every deployed page is **one self-contained `.html` file, zero runtime dependencies** — no +framework, no CDN, no audio samples (all voices are synthesized in Web Audio). Pages share code +through build markers that `build.sh` resolves: + +- `/*@BUILD:include:src/@*/` inlines a shared partial (`engine.js`, `setlists.js`, + `base.css`, `chrome.js`, `header.html`/`footer.html`, `notation.js`, `midiout.js`). +- `@BUILD:favicon@` / `@BUILD:logo-*@` / `@BUILD:bravura@` inline base64 blobs from `assets/`. + +`build.sh` asserts no `@BUILD:` markers survive. **`dist/` is generated and git-ignored — never +edit it by hand.** Edit the source `*.html` in the repo root and the partials in `src/`; +`deploy.sh` always builds first, then mirrors `dist/` to the web root with `rsync --delete` +(so anything no longer built is removed from the live site). + +State (set lists, practice log, theme) lives in `localStorage`; nothing is uploaded — share +links encode everything in the URL hash (`#p=` patch, `#sl=` base64url set list). Source files +keep an `APP_VERSION` placeholder; only the deployed copy is stamped (from `VERSION`). + +## License + +GNU AGPL v3 (`LICENSE`). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ace263 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# VARASYS PolyMeter + +A **polymetric groove trainer & metronome**. Stack as many "meter lanes" as you like — +each its own little metronome with a grouping, subdivision, drum voice and a per‑step +pattern with accents. Layering lanes produces polymeter and true ratio polyrhythm. + +**Live:** https://metronome.varasys.io · **Source:** https://codeberg.org/VARASYS/metronome + +## What ships here + +The landing page (`/`) is a simple chooser with two doors: + +- **Mobile** → `mobile.html` — the touch‑first phone/tablet app (tap a beat, set the tempo, + practice). It's an installable **PWA** that works fully offline, with a practice journal + (`mobile-sessions.html`). +- **Desktop** → `pm_e-2.html` — the engraved‑notation editor: build rhythms on a staff with + full keyboard control. Best on a large screen. + +Every **deployed page is a single, self‑contained `.html` file** with **zero runtime +dependencies** — no framework, no CDN, nothing fetched at runtime. `build.sh` inlines a shared +engine, the seed set lists, base styling and the brand assets (`assets/`) into each page. Every +voice is **synthesized** in Web Audio (no audio samples). State (set lists, the practice log, +theme) lives in `localStorage`; share links encode everything in the URL hash — nothing is +uploaded. + +## Build & deploy + +```sh +./build.sh # assemble the self-contained pages into dist/ (git-ignored) +./deploy.sh # build, stamp version, mirror dist/ to the Caddy web root, smoke-test +``` + +## The `concepts` branch + +This `main` branch is intentionally lean. The **full project** — the PM_E‑1 editor, the +embeddable widget, the whole gallery of hardware **form‑factor concepts**, the Raspberry Pi +Pico **firmware** editions, the **Rust** port, and the **KiCad/SPICE hardware** design — lives +on the [`concepts`](https://codeberg.org/VARASYS/metronome/src/branch/concepts) branch. It can +be promoted back to the front page at any time. + +## License + +[GNU AGPL v3](./LICENSE) © VARASYS. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..fcae301 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.68 diff --git a/assets/bravura.woff2.b64 b/assets/bravura.woff2.b64 new file mode 100644 index 0000000..bc83293 --- /dev/null +++ b/assets/bravura.woff2.b64 @@ -0,0 +1 @@ +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 diff --git a/assets/favicon.b64 b/assets/favicon.b64 new file mode 100644 index 0000000..76dbb67 --- /dev/null +++ b/assets/favicon.b64 @@ -0,0 +1 @@ +PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNyIgZmlsbD0iIzFDMjgzRiIvPjxwYXRoIGQ9Ik0xMiA2aDhsNCAyMUg4eiIgZmlsbD0iIzBBQjNGNyIvPjxwYXRoIGQ9Ik0xNiAyNEwxOS42IDkiIHN0cm9rZT0iIzFDMjgzRiIgc3Ryb2tlLXdpZHRoPSIxLjgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgZmlsbD0ibm9uZSIvPjxyZWN0IHg9IjE2LjQiIHk9IjEzLjIiIHdpZHRoPSI0LjQiIGhlaWdodD0iMi44IiByeD0iMC42IiB0cmFuc2Zvcm09InJvdGF0ZSgtMTMgMTguNiAxNC42KSIgZmlsbD0iIzFDMjgzRiIvPjwvc3ZnPgo= \ No newline at end of file diff --git a/assets/icon-180.png b/assets/icon-180.png new file mode 100644 index 0000000..591653d Binary files /dev/null and b/assets/icon-180.png differ diff --git a/assets/icon-192.png b/assets/icon-192.png new file mode 100644 index 0000000..17357e3 Binary files /dev/null and b/assets/icon-192.png differ diff --git a/assets/icon-512.png b/assets/icon-512.png new file mode 100644 index 0000000..c02d04a Binary files /dev/null and b/assets/icon-512.png differ diff --git a/assets/logo-dark.b64 b/assets/logo-dark.b64 new file mode 100644 index 0000000..0682847 --- /dev/null +++ b/assets/logo-dark.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/assets/logo-light.b64 b/assets/logo-light.b64 new file mode 100644 index 0000000..58e5749 --- /dev/null +++ b/assets/logo-light.b64 @@ -0,0 +1 @@ +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 diff --git a/assets/logo-side-dark.b64 b/assets/logo-side-dark.b64 new file mode 100644 index 0000000..ebbab66 --- /dev/null +++ b/assets/logo-side-dark.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/assets/logo-side-light.b64 b/assets/logo-side-light.b64 new file mode 100644 index 0000000..97cd680 --- /dev/null +++ b/assets/logo-side-light.b64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAjYAAABGCAYAAADfC97dAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIuMQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKNDkbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jMzxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvYODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqyvnUOfXEeunxeUsTiLGcrq9zcXEsBn2spL+jv+p8Of0NffM9Svt3v5WF485M4knQxQ143bmZ6pkTEyM7icPkM5p+H+B8H/nUeFhH8JL6IL5RFRMumTCBMlrVbyBOIBZlChkD4n5r4D8P+pNm5lona+BHQllgCpSEaQH4eACgqESAJe2Qr0O99C8ZHA/nNi9GZmJ37z4L+fVe4TP7IFiR/jmNHRDK4ElHO7Jr8WgI0IABFQAPqQBvoAxPABLbAEbgAD+ADAkEoiARxYDHgghSQAUQgFxSAtaAYlIKtYCeoBnWgETSDNnAYdIFj4DQ4By6By2AE3AFSMA6egCnwCsxAEISFyBAVUod0IEPIHLKFWJAb5AMFQxFQHJQIJUNCSAIVQOugUqgcqobqoWboW+godBq6AA1Dt6BRaBL6FXoHIzAJpsFasBFsBbNgTzgIjoQXwcnwMjgfLoK3wJVwA3wQ7oRPw5fgEVgKP4GnEYAQETqiizARFsJGQpF4JAkRIauQEqQCaUDakB6kH7mKSJGnyFsUBkVFMVBMlAvKHxWF4qKWoVahNqOqUQdQnag+1FXUKGoK9RFNRmuizdHO6AB0LDoZnYsuRlegm9Ad6LPoEfQ4+hUGg6FjjDGOGH9MHCYVswKzGbMb0445hRnGjGGmsVisOtYc64oNxXKwYmwxtgp7EHsSewU7jn2DI+J0cLY4X1w8TogrxFXgWnAncFdwE7gZvBLeEO+MD8Xz8MvxZfhGfA9+CD+OnyEoE4wJroRIQiphLaGS0EY4S7hLeEEkEvWITsRwooC4hlhJPEQ8TxwlviVRSGYkNimBJCFtIe0nnSLdIr0gk8lGZA9yPFlM3kJuJp8h3ye/UaAqWCoEKPAUVivUKHQqXFF4pohXNFT0VFysmK9YoXhEcUjxqRJeyUiJrcRRWqVUo3RU6YbStDJV2UY5VDlDebNyi/IF5UcULMWI4kPhUYoo+yhnKGNUhKpPZVO51HXURupZ6jgNQzOmBdBSaaW0b2iDtCkVioqdSrRKnkqNynEVKR2hG9ED6On0Mvph+nX6O1UtVU9Vvuom1TbVK6qv1eaoeajx1UrU2tVG1N6pM9R91NPUt6l3qd/TQGmYaYRr5Grs0Tir8XQObY7LHO6ckjmH59zWhDXNNCM0V2ju0xzQnNbS1vLTytKq0jqj9VSbru2hnaq9Q/uE9qQOVcdNR6CzQ+ekzmOGCsOTkc6oZPQxpnQ1df11Jbr1uoO6M3rGelF6hXrtevf0Cfos/ST9Hfq9+lMGOgYhBgUGrQa3DfGGLMMUw12G/YavjYyNYow2GHUZPTJWMw4wzjduNb5rQjZxN1lm0mByzRRjyjJNM91tetkMNrM3SzGrMRsyh80dzAXmu82HLdAWThZCiwaLG0wS05OZw2xljlrSLYMtCy27LJ9ZGVjFW22z6rf6aG1vnW7daH3HhmITaFNo02Pzq62ZLde2xvbaXPJc37mr53bPfW5nbse322N3055qH2K/wb7X/oODo4PIoc1h0tHAMdGx1vEGi8YKY21mnXdCO3k5rXY65vTW2cFZ7HzY+RcXpkuaS4vLo3nG8/jzGueNueq5clzrXaVuDLdEt71uUnddd457g/sDD30PnkeTx4SnqWeq50HPZ17WXiKvDq/XbGf2SvYpb8Tbz7vEe9CH4hPlU+1z31fPN9m31XfKz95vhd8pf7R/kP82/xsBWgHcgOaAqUDHwJWBfUGkoAVB1UEPgs2CRcE9IXBIYMj2kLvzDecL53eFgtCA0O2h98KMw5aFfR+OCQ8Lrwl/GGETURDRv4C6YMmClgWvIr0iyyLvRJlESaJ6oxWjE6Kbo1/HeMeUx0hjrWJXxl6K04gTxHXHY+Oj45vipxf6LNy5cDzBPqE44foi40V5iy4s1licvvj4EsUlnCVHEtGJMYktie85oZwGzvTSgKW1S6e4bO4u7hOeB28Hb5Lvyi/nTyS5JpUnPUp2Td6ePJninlKR8lTAFlQLnqf6p9alvk4LTduf9ik9Jr09A5eRmHFUSBGmCfsytTPzMoezzLOKs6TLnJftXDYlChI1ZUPZi7K7xTTZz9SAxESyXjKa45ZTk/MmNzr3SJ5ynjBvYLnZ8k3LJ/J9879egVrBXdFboFuwtmB0pefK+lXQqqWrelfrry5aPb7Gb82BtYS1aWt/KLQuLC98uS5mXU+RVtGaorH1futbixWKRcU3NrhsqNuI2ijYOLhp7qaqTR9LeCUXS61LK0rfb+ZuvviVzVeVX33akrRlsMyhbM9WzFbh1uvb3LcdKFcuzy8f2x6yvXMHY0fJjpc7l+y8UGFXUbeLsEuyS1oZXNldZVC1tep9dUr1SI1XTXutZu2m2te7ebuv7PHY01anVVda926vYO/Ner/6zgajhop9mH05+x42Rjf2f836urlJo6m06cN+4X7pgYgDfc2Ozc0tmi1lrXCrpHXyYMLBy994f9Pdxmyrb6e3lx4ChySHHn+b+O31w0GHe4+wjrR9Z/hdbQe1o6QT6lzeOdWV0iXtjusePhp4tLfHpafje8vv9x/TPVZzXOV42QnCiaITn07mn5w+lXXq6enk02O9S3rvnIk9c60vvG/wbNDZ8+d8z53p9+w/ed71/LELzheOXmRd7LrkcKlzwH6g4wf7HzoGHQY7hxyHui87Xe4Znjd84or7ldNXva+euxZw7dLI/JHh61HXb95IuCG9ybv56Fb6ree3c27P3FlzF3235J7SvYr7mvcbfjT9sV3qID0+6j068GDBgztj3LEnP2X/9H686CH5YcWEzkTzI9tHxyZ9Jy8/Xvh4/EnWk5mnxT8r/1z7zOTZd794/DIwFTs1/lz0/NOvm1+ov9j/0u5l73TY9P1XGa9mXpe8UX9z4C3rbf+7mHcTM7nvse8rP5h+6PkY9PHup4xPn34D94Tz+49wZioAAAAJcEhZcwAALiMAAC4jAXilP3YAACAASURBVHic7V0JfFNF/p+Zl+O9pC2XHG0SQYSm0UVFFg+gSVzXXZUCHqiru4r3fa27on8vvNfV9URFkfW+rQJtPVZX7QEqnuu6SlsQjx5cAgrN1TZv/r9f8lLT5KW524Lvyyc0mffezLx582a+85vfoeOcEw0aNGj4JWD0RPdEvU4eTYivsXX1Rz8MdH00aNCQe+gGugIaNGjQ0F/Q68iVlLDTCZFOgJ8vDnR9NGjQkHtoxEaDBg0aNGjQsMtAIzYaNGjQoEGDhl0GGrHRoEGDBg0aNOwy0IiNBg0aNGjQoGGXgUZsNGjQoEGDBg27DHRSte8YSkjJQFdEgwYNGlIFpfQLT4VYN9D1sNhdIxmjk2SZDCOEU875D3J3oHHDulUb0s2LMSbAHxiOCZdlOZjkXDxPUH4G4fys/HZElU0gr+4k5zL8kyRLGZFhXXJ6bzF5R9c9ad5weraL/7hnGVOHjNsp1bxi2jNpeen0w1Tqlaw/JcPoPVzFej3ZhzJSDK+YKDPewYO8FcaAL9ua6jarXaOjlFxCCXVmU7AGDRo09DMehM+AEBucKIrt5X9ihF4CX/eHJBoaxkNzASWCIBGbw9UM31/y865FmxtXtqWSr6XU+R5cfgDMtI3w09HXucWlM05mlD2h/HwGPn/K9H5G2g+2WuzO/8HXIfDxwceUpJ7/B/W8OUm23OZwe+DvN/B5LxiUn9+wdkVdKiTFUlr+G2Cu/w7nQk6F/5/o84I0YLGXXwLP5a5w3sHJ8P9/Ep3L2CQDtEsgyyLfhc9vohPGTJjuEgQB7w97TcuICVMnbVn70U/pZjx8/P5DoX5fwFcrfLyki+P9NMeeZxlfPpHoaVPoByfXwP+39JVvid35OvTkwzDPMWXOaRsa6z9Pt27wDO+EZ3gpfkeSky45LSmZbBaGFJ0NRGaeQaT7EIV04/8M/xNCP7GPfUlk/qQ36F0c3YbaVpQGDRo0pIhRo8oLYWJ/Ab4e0feZtBT+u1qk+stg8L2rTV5/k9zUlO0kmQh/tDrcL7Wurl2eycUiNS4mYVKTS+DMUwCfSfgRBHYOTMLv2ya4Tm1ZWxc3+f6S0N7c8K6tzHWfMvHbJL35bvh7err5mA1F95IwqUHCMj8P7WrSU/bysHHOqdu+rd+W47wTwlbqng2kZhF0oRKFziQCHv0VYfR2iZnn2+yu+S1NdY/hAY3YaNCgQUMKQElNiNTQHlLzBeH8riCldRu8XRt28zGdUCSPE3R6F5xzIoy60+AcCT5Xl7Axv4K/R+WrblDWQzbbQStaWj7Yks51VofzdEpZEpKWGJzzm6D0TSr1McLR3eDLZPiFEgs9fA4merrKMtH527Y19Z9kWuYA4X3OybNpX0V5q1pym6/7Kouk/z20jwPa6rSSMtfL7Y11r6aaLRDZOZSSU5Sfb7Y11z+Ydt1Sw54FInsa+v6sbLbMUoW1zH09Fch1uNmsJP2Xy/yfQUZq+bat6zYN6ewa2TlmuEGkKNHEfoWSyrFw8m5AcB6F63/d2lh7gUZsNGjQoCEFWOwz5pIeSQ1/ua3Je6Isf9QVc9oXyuf+ktLyQwQmPACT1wT4fUeeqzeGFIi4gk95Swq3oERmvCubQmmX/EzL1w1NfZ2DOhIwEWHdjoPPUKZjlVbr1L1bWz/yZlN2v4KTr2DCvD9X2cnfrfQBwTsZ2uJ9+KkXKFk8bOz0Sdu+W7k12bVWx9TdKDE/rPzc5pcDZ+RSDykOlBxZUuoEskGuz1sZAEuZ6ypG6QLlZwew5ovamhueULm39crnHSBc18Ni4xyo423w2wh06GU8QSM2GjRo0JACOGEnK8tIb4ePn6VCanoBtxzY2OlTSow6Z2tz3co81qw9JLYPbUm5KltX1y1LdkVI+mR3PkLCW1A4caAekDUftdv4Td16KO+EEnt5kBL6B0gaRwpMZ8Dfhfkob2cBSq1sDtfN8OxuwOdXYNIh+Ts52XWUmBbBn9H4nXP5gs1N76tKhXKAFvj44TMRCMO1ljL3h22Nta/loyBbmetQIDU3KT+3EB78bUtjQ0L9pwgUxeQHrI4Zb1PCJrWsrn8H0zVio0GDBg0pgIb1RZAGfJqqzgGuzOHPv/JZL1kmlzBGULegAIjDIpvtoIZkW1Il9hmnwZ/DlZ+L4aZGwB3OzV8dZT5m/IF/1hslLAONVo4lv3Big2hrarjVUuqciUrj0P5/spY5X2ltrF+a6Hyr3XkSZSz0nDgnL8C5z+Wtcpx0BIPdxws6HUqVChglT4+xl0/d0NTwdS6LCStpj3iIhJWp5WBQnguLgqSkJhqtq1egwn1j5LdGbDRo0KAhNYTHS4r6I4MHlJN1RCaXw7SAK3nckroP/v4x0fm9tqA4X9f149a/6ocNfyzf9UQTeJvD/Rl8nQq1/lW+y9sZgBIHq2PGPEp0n8JPiVK2yOqY2qAWeX7UuPISoyQoZJC3e3zd5+e7fu1rVvzPWuY6i1KKBGqYngmvlJRMntbe/pknV2VYSoefBH9wuxa4FH+4vbm+Nts8NWKjQYMGDamAk2+A1OB2zWRYue6Z65VrNmhbU/+wxV5+FBCG38PPk6wO10tqW1IxW1CyzOlpGzZ80WFzuPqppnyTYrlr7qcCBz1Q2mC1u66kLKSHNJpw8wPw94TocxTFdXxuwwn6lyH8jFT0cXJSv8a6561l7qmUksvg5z7CkCGo35Oxe4FYcErPUrZ4uwNy5625yFMjNho0aNCQGqrgUw4fnZ6xKovddVxbU91XA10pBG71jLQffKbIjP+Fn8MSbUmV2J1oVhzeguL8Xqh/ff/WlBYrX/rNfHhnQPuahoUlpeWzKaWHAoE43uZwvtyyuv7FyHHluR2J3znhD7Wtrn+jX+vXXH8FEGL02eQmqMtld33Y2lR3X7b5Qh8dQQvEg5Wf7+RKX0gjNho09EZEkXIDDCCdMEEYSHh1iyt1aUBrtnOgEz7fwwdF6diW2Ga7wQcnNKGP6wY9gtt/WsSGDDkDVpdlMEHvxRj5j83hrpQ5eXo9X/92Hv3UpAScFCwO18WM0KeIypaUrdRtowK5M/SDk9Vtvu6r+7N+lj1njGUG3X7hX/zT/ix7sAOJKTyf0+ANQWI6lBP2QPGEaXXr1763sWT8tHGC0XC3cupa+aftlw9A/bpLJs44QdDp0EzfShn9h6Ws/LO2xoaGrPItMExligiPc16bi7oiUiY2UOgLwCbjzd14yBFgNXwrylGdtpEgmQMPWM187R/wOTBH5STCS54K8fjoBFZZKUjGima4z/F5LjsMTqp9AfnsjK4VCBVZl1GW9UOontgYZziQuKHu6F1an9N6pgnoQ9/5P/1wgrzA1cvFtqnG9wwQiJMGql4AP5CYV3iQPB8gnQ3ynCE/xp6AomCx8sc9qN5wAKd8JtR3Nsmyz2N7QD6nwLOJ8w8B9dkbjj2UTf4/Z0VOgzLitk1kzkcxSp8n2fcLJIFP0m66zNe97hN57l6dsSewyq8MBnHcrxin0+C+joL6uMlORnRQrwAmn99BrXElfRAJt9uJjJITLbTYCyTnA85JPUwCdRvWrliRrSv5TNC2uu5pqMfR8PUYErUlpWxBRRzxdQc5P01RbO4XYGgCS6kTfa2EfDRD33+mv8rOEYpLSp3udC7wd3f8Z+u6T+PGkkRoaa5tUYjpk+iXRaczLIJ2mwvP7Z9wuBA+Qfg3L5f6Lemgfc2KTSV211yBUfT4bWRUeGH0Hq4paPWWaZ5wr3tEvnNOkzoYxC1gHeN9j1ddzJsysQFSU+5b/9XJ8ln7x5k4mmv8qFh0Tqp5JcEznjliHAtkVb4SKey+PN84Gu5ndyA330cS5Llzg1K1byE8hLv7ujBnoMQvzzWlHWtGBegKuwY+N7NlnlGSTjgXvuM+aa69jKYE6ENjjZMPQCdlldHpwSC5VyeQgSA2SJ4f88n8Wnm21B5OUhfKKL4U1imf51nl5gJRLEAHWVfARL17JoVje8iE7+erkNREuivM1X504HV0Jnn3gJN/emaJqi7poZ/jBJ0NqdkB5Oi6wNZND8nzxvrDSXupnqiQnU+Vz/3mpf6xXM8vhLZDBcg+XfgPJuDkA5PNDEtp+cnwAP8MSfsoh/AefkMp+Y0gMNw6+AEIxjMwEd2J1/RnHYPd3efBynoGfB0V2ZKC+uB7F7GC+nt7U92q/qqPdYJzdyA1D/3s2JCvam9e8WLfVw0yUHIkPNcj07lEokWouJTWVh8Q06eg3+CzOgbffWg3FBpEQjL8HfrSe+nkl2tgv7GUOS9mlKGeTbFeJC8xNvWQZK4PEgEG1cKIJz5KgtuTna9noVAU4/o+idSnsxVVIo3ZCxv8pdgD3TJfomM0J8QmGJT/qZYOpOZM0j8SBx2sJi6Ev/OjEwM7fI9KRaYbSO4kU/0K+Sgzege9kVV6F0sie5QkdQmfH1BG0I14L2ITmCN9aKrxvQeD8LR+rApuG5wCBDajAVaeO7ID/jzIKr9aIonjkSxeSzKYoBmnt5pe2V7jPaZoXdxBTi6Btx1jthRkUkfAel9HJ/RjMe6AVOWbC4v44zLMF/G1LHfN9M0ubCJkbNoXe44Wv4M/l7Ol3rtEPb1L8W+yU0AJDPg4fix2116M0iMJ5W7o3UgmQosGGt5+u4QI5BxrmWt+a2Ndv5k248raWuY8l1L2CsEtKbP4FNRneuggJ5+3NW+5MWeFGeihVocrPq6VzE3wTC2c0RlUH/JsHBm7v/bLnXMzDa74SwCsoc6FdxOf12gkVJgGBOCz9qYtNwxw1UJoa6xfbHW4D4Q+dTo84+kldhNa2F2USV6c0M6fiQ3LmbVhejo2lJxHVIhNYLb0Maz+0O58vyzr87F/jinOfp3dUKeTphyY2dZMBoCV9Jns6Y03yH8a3SPyk08avh1W0I9BG1zSX/XIB1ASxCorZ0nGikVwL2f1d/n4IhirfL/GPhOTjhYB/UVsYOzgJ/hmSRnF1umVUVgScZtU07GMER1u6+ybVgaUmKnB8Ahj7LexHjY9s8UWc5X/RsLI7RnVTeYXyycWxSlpspqO3SSmeyCTPBW0+bq4Wz66MGtFP/loE4qxT5SqfS8BQcBFzdBs8+xPKMrD+PkHRkUu3nP6ZCoIFZSGgjci4xNhPLnP5nANbVldd1OfmeUQ6AvFVuZ+CvrXyVEhIDq7iDxPlr+I2yrMHOwB1XA+rCdmYQTYt5/jxHPJ5qZ4U+bBD17JSfDadK6gnsD3yc+KB0asttmdZxHGqpQkv9zdfUpun1t2aA98f4HFuDtKK38NY/eFFodrFW6DppsP5fJGXO2GwIgt2flc7j4mSKgqAdIxAbdaQ76m0lUedkvLOhy+owpWxxfIl1CmooOTBjjhS9TSjfsfgPoMlmzyThPDxCFFuM2wKDqRy50LqWBAZsrUL9s5gFtrQG7Ok8QK9B1wSH+XL9CQ1KaXuaDvk1WviFMO+D7TbZ10wDm/JxVSg3oJqboqD8wuapKqvDjRp0dswviNuNyDJHNx7AHfxq/ukYr3mgdf904zz+W+2VKl2gGRCLj1NSr9aobBg8F58tHmpKQmrfYj8kqJCAOqfJstFCkEEvaP4d5vLplYfj4qWZKQtIJeN6Z0+nMbmleu7a/6eDq3X2w2FuH7HfIoDGT+hkwiNWcBfJ5fQgf4d7Cr6+n1a1d+0Y9l5xac/tTauKIx+Ym5QUtTfbXN4UZ1hDEwMX6M/mT6q+xUIK9b57dOcB5LdexjYK8jGaEPjylzfpFu/wpS+mUPCeF0SrLzW5tWfJboGLRXR+R7usSGMkGHehpxUgs/73xGIkaMh5KZ5QhQef8O33Nql8NK7ryM8swCsMq6GAanh6IHZu+coq/NNX7c85yT5+L3g3Iy0ueBSbsLyMGPMIg1BzqDdfLcgs1q5yG5MVVvP5tSw5fw05BVbdMEtO1xbKn3cmW1Hq7PAle3udqPcXX+nufif/QHAjeq9rNntxZJRSYkXah4aQeiIsJzwHg2qHj7HvSFqsBnH70Zq/yMEJd5UFdkZqaVgja5nS31vSYfLfUiDKjTBu1yPrRLLem1AO4T231+foHaAanaNwfepxMzrSegxjvH/LZq3jUdZYzr/gK1PBR+WqH9dNB+22DBgguhWjnIK1UlskCApOVe3B4dnUW9BhUUxeH7bGVuA7QHjos6HdPh1t/f+qsOqLhqLXWdSQX6OowMH65vbshI8tcXgjI/iDFvnGJ6QNZ1blmzakdeYxjt+hjUbde6tv57W5kLxhKKnrVNekJfGTZ2+tR0/OtsbGr40mJ3okuCEbjthkrmuVC6T9/cm5JT2NMbr4repkGgJYmpxlcJk2rSWBdq4JS/hNs9selS1Q47Y/pDM8kzDWBDxrZFmbGqA5XtXo9O5HLwXmB3+SY2E+FzaSYXUiUoKkxeRBJ13aZq3wt+Iv9FnmXeGHuud1bRWnhmL2T6zFKEWtsaRF1IabSXaNcX6FwiGQ3X4fZMHuvznDx36E+xiagwLhWa3oWvsZZvqDeD4s1J8NKdg1IlU5Xvdn/nN49ErH+kqo694H3MNsjhEElHUSEvjhx5Zon18Byfgmd7isp1cQBye6U8V2qLTWfPbR8mFRoWqV2TKmQiP6yWLi33zYJFz0sqXnmH4/Yj/J0uCPRq1KWCl+h67yzzW5ETQqRQ0SXY1dDV6Xtab5RCfQOen72/y29trvuX1eG+i3bKj+TDSkvoln9s+Xpn3FrSkAu0NNa9bXW4roJ3/O/QwccXSPqnMBK4pbQ8petRyokuE0jY+KjYUurEUBsvZFuvTPzYDBWHFKIFyyOxByinS0J7uhkAGkZVaRhIzbkk9ZVqJuBc5hdRRuMGfEYYkotexMY72/wuTIIobstky6G/oYPB9I8iYeVsqfegaAlJD2T+DLCg/BEbmVwFDYkEpjA6GZ73OeyJ72752ZoGpUhFW6Ftn4SveZPQyZz/W/UAJ/enYs4f2ipj5H5JHH+xabnnfH/Xdw3wHU1Xs/dxA5M73P/JngrxqdhD/qB8uaQTZsHXYX1lwQlf4f/09ofJrAVxx8QC/T0k7E8mUwQD5Kd3YnWkFUkXPrekyn8hBXEqvAn3+SrpIhfIQrc5B6Rw0IL5O3cQ48C6P2pdXfvXAa2Ahl0a7U0Nd1js5Rjr6lglEviCdIRNsszvY2HjIAGu/9uYMZNeRW/Y2dQpIwd9lDKceOKIjW+OqUGq8mII+/RWJpyshlXpithkVrPeJJFh8zKpYxplv+OdLT0EAy0qJ0+OOXoYrsZ9swt6eRflsnwvZSHLop0COBmL+pACahyB8W/fsUIaOgT9qORDb2iLj217AJ4h6s1cGFOpkeKIkeg8rBehlUn3fYzo8kZmOZWbYtMU5fR0rcRKqSC8JQnjc6E0H417WKX3rVhzf7RqM1X7rgai+mAf13ZyOXiOvGBBnF8ceC9RzJuSxCcRgDS1yBXF3th0Y4GI1kDpKv3OJHpSDs8arfUGveNDxQ/MY5yTj1sba1PWJaRFBT0uKnB7OD+106Bh4IDbjaNGlZ9mHC7sBaO2g1JyDfT8L1O9HhXwbQ436tei1GYP/dART8L7dnw2EsZMPQ9PNlb7DgrMkj6ITsQbNFf5/5m2FQclqiRB5EP+AMf6XKFmC5nKuIpFsrJQhaxAku5i+HtudKJ/2+bnpBGjbyNZKGD2N4DcHMsqvzoj1nkabikCqUMfLtZcl8k5f0SeVeyVajoegAnsAhJDVihhl0AHfjR6H95XUdAI9UF34XkxRxeIsCPBoUyIHd5PLBnOFsMlkeHEGRdpGSUx0pQrMCrz1ATXMs5ZnL4Uq/xxiCSKqltI6QD6kHrbcZqpo70ispO4T7CUOq+CP/Ng0J4Hg7Az2N19IZpV93UNGz9eLDHaIjo16CgxLnaTBg27AjZtathh27P8aGIQPiThd3pSOtcHtgQvN45g5ejRO+S/x16+zGY7aF6yKPUIxqbqS+zmv8Bg3KN8nHFIBSG8XfBBbLpPDj4hMeEWkrrPmU5fd/BJtQMw8eU7eumawCd3vEYqFkTIChKy3WLOOZkt23G1fFRhTwPj9ompxvcQDPTX5bl+uYQk6q1oTqcWuA91TnJNbLr83SRkUqyQFdSp+F3MOZPEpTvQ+VQvZVRFIpYXYiN3d4mxfl1Ciss1/o9I/r1ap4pjzdX+4zyzxF6uFVASY1zuO08nUHSupkYmdILAFrPKyoNROTySCKQG3ejn4vmqSlYCXfwjSaBqulS7DmTyLrR42EqFkOMEne5wW5lrCefBp9rXvPefaHKO0p3iic5yi9EG4wkN9Sk4+PhgiSu1M0GGhS1GI0/zsu2bm95P6uxNQ27R8nVDk9XhmgfzIvpPSkvijsSoZPy0mYJB/zbq6sDlM3mB2Gh1uO/sDvgex8jwsdeM3sNVrBfp8Ra7GS2V91SSfVwmizMeiCilx7Oajr/IFQW9FMdQZA6TBNrfH5tiVtWK87hegAH8ABjAk5p/ZQOZ8IURsX2IrFT7HoH7+r+Y00ySTo+muLdFJ/r9fJEk0itICnoFgwU8SBNJJXI+IcHy9OVoCx+ZyAsZYbHEBs3s0MKuF7HxH1XwprTcuxrFmrmuFxUY+haJ2xLolvklOhbS7h8Qr8xxoOR+INTvRBNqRGCO9AmQHvTiqmr1BJhqNM7EbT/0C0RM1Z7DKBVOz1GtLBheJJo0IXDbDN55fG9uJ/nVhxswoMdXq2MqrEJNCxVngoXoeZhS3Z8tduePNod7DQ8tELhUYnfaww76wk2B5s5kh+fCvkvQoAYYsO4WmTEtC1HOCTqyuz4/NdLQFzB8B7wLKKW8Kt1r29e9963F7joInvkT6HtJcXL5N71RuhUITjPlsCinxAMvVAGhfE+DSNHI5ufxhpMVMJmf3dZUuzqbCU2UZB2KxeMU/ziXl1DKUiI2eK5auiDkT4FUwY8Bf8dj0YtQyik6rcMAY7HtcgF75NM7o8NJ4GCOFkepWqoMAnQG5J9aY3R4IxiT68KCPDyxRoCSMWnKFSgt2rPXiZTMlF7ZMdF3TOGaSBKufk01vntzFCupN6iATgDfik0OzJZWweS8D7wc10Od0Bw63l1v/2KUKOiwDf8Ue8AnB66RBCNuVamaRzNKb4Z7WeqTPdtEakJduFyRDUkvzkSdkY9iD3gqxH+g1AsI7Q3w3Jw5LHPQoHV1yPrnRFvpjPtggLoMbhGVuXFhg/pFU2Nd0gGh+QEG47+3N9ffMxBxozRoGAi0NdVfB+Qe34fD0r+2Dt2THGkpcx/DKLmShLfd0dbXDq9WWHeX9vyHkDnn78J7dk/bmoZXI5LT7FbqjJzDbrjhzlhlRf+nd7wp7j//O4yF09flMAh+j+fGWnCwyu3DJdFwQlZ1SwJojEcVt/g9CHl6rfFj9NLYLQmrNGYvJGrPRyfKlN8rkJ2D2EBbL5PnWuOC3pmW/zSOCsZcSyk+iNO/gj6iSPL+HHMuYwY9ihIvjk70kx+fksiwW+Hr8FxWDF6HP7LKyptjpQ4IJT7Y6dD//iqKumMoYWh6jVtlA6IHghZtUo33eV+FqSY6HV0rmKv9f4WbibOeUoAhGB6QqLkVzkk/3kEf0IX7exyxQUD7YXA8t+KiYS70ucOB5BxEdrEtqpbmFe/Dn+NG2g8uEonBCQ9qX2hn3ObFdvfA29bKZbqqnayvSyfiN4zQ82EEHwaDdCI9sB4wmb3LBR6KI+bt3hEfjiNNBEnwdkaEZ6jMk4c66OYvcT0JKYd2e36McyuQLWBq+i+lPPMYaTSY0JFelyxX6Rj7Br/7uv3f9J3Rl92clIfrwYPfZVyfDCETGUMWiJzISfVM+kJXx9Z23bDhofugXXKcc91Y0CC5HvrWgzBWJu2HakAT7mHjnCeYJepSfqftj6etsRa3s16xTXCVyjruhrFwErRFCTwII+e0A96372B8+aLbT95WC8KZ7YCzp7j/5bi98EZ0Ik5iphr/YySZOJCTx1QtOIyGU0l+LSWChHbeH1uEMsn/WvWKcCiFXsTGX2H61FTjq1dWqIMZG2kXna96hBoydiqXEDK5JzYJtzBEcebRVH0hfyqr/PHaaP8yaH1jqvYthg59ZY5rN1E0zkRpYELLFjQ7hz8oSVyCFlP6/Q7YX8eoG16kI6A+aAHUbxM1I2wRtE1DrO8d3xzTM+JyzxlQH3eCSyvyJDM5E5XBUW8q0Qnh+FEE9exuYVVbCkUqTYfJ/1B49hWQVpaXWg0AFD2OGuWTNWC1WpfquUpgzZwF12xfvQLJqiphjSt7bR1u5ebNwktZtedF0XpDUwNKjdX0DOMAE7Kcr3qkgrbV9W8kPys5FNPplO8jF4E2t31bvy2dMhPWJcO+lvUArSj4xj0AKpNHFf8liSwmZNpNH4tNDHkhrfLmextqubdiSDxbZwa8l0T1PUjNEoxzci+ssgYtseGcNwBnP917dFHcioPdcAOTplyRq6jsEbT4Plv1Mpnt6pVoFGfOgoltXIJrCiWjeAb8vSs6kXL6IHQw9MGRUyIBZOAO03LP/7xzzLXJzlW8DH+ofG5ny3aMEAXhGMjkFBoOephvWKFt0C1/r7heuAqSqjouoFSHLsb703O0yIhuKVvmcanpxsVCnj0CV31vKJ/LMSQLFYQT4LnO66M/aNCgQUPGyH7CQKdiS/1jlWi9PVC2dd4kicx2OXkr9hqEWNWB+3ITsq5XX4jR/0CEfObQYWf2dZkQltr0IjaBwKvLJbECSdIeOawhSgwyWhFxwruBEGzjlH8BE8fr3lnSikTCL3Hy5egjKC2zvBTwoFrIAUZo39FfKbmQVVbeG71FhH3IVO17GYhIrrclRZhcXzPVeC/2zy74ZzqiUkWZF/VWHjHW+KbqCMXtst/muH69QckZpirPC97Z5l7OBdG/ErTPXXmQaiVDmaQTVsL9nxSokFJa5UegxJm7Hp71TZKx4ni4N5Ts5PLd0aBBE7P68QAAIABJREFUwy8cuVgJC1zP0bnd1bEHZM6XMEpViQ0eU0unhOVbWvMpuqiPTRT50D8l85mDvmDMVX4bTriRNJyIzdV+9Fp7Zw7r+LanQjw+h/nFQazx7C0wIW7LKEt4ff7OxbF6t+JyzyRBEJIF29zDaJyJoSpeiU4ElnMPdNJ86FtJ0NceEas884A03OA/qvDtdPeClUn9MCAX5wG5QLKcqouDdEEpExazys37xOqF+X/afrM4pOjEZPpsecAEIHXvw+Llcc47b8PwHOlcrBDY59jTG6ug/g+jPlGe6qlBg4ZfGHIi4ocJ/wxW+dUNsc7fAhtWV0vFe0V8P/wMTjYHOr+pImSvXslIGmBpX5GLOiWErCKtCW9/pWKOqeeU43ZVL5Nwnxx4VBKMaGJYkKNa5hXiUu++gl54jeReKfYpRT+lF4DUYNsm1figYYlYL2KDW38weaLflrz4mAltJzHhLTQvB4L6tBzsXqoWvb4veGdJi6Qq32boRhjjJF+R3/eQxEI0o+wl+UIHi1K17xI6MLoAuG17BqWG0+AZvc1l+Tk/k6tjXUD0Baw/vH8nQ/v74GH0KTHVoEGDhlSQK92F0ZJxPFoNPRediObRphrfkzB59FJcBXLwZCwJUtLPhnPzqZi5wfd96wuxO13ish1ukuKWDKwsz2I162+Kdi0fslKBlSuJDRswyADk0yCJ4y8Q9OxmEhvwJ3twubs7njSGAy/GmSyrAZWwxWrvZP8sU+/Q9JzcAwefS3BZbhD2mXML0+lugWeJW4vvQrn1nAbqVfWxYuCbLVVCX78L7iGfcXnONy/3v+iZIzb0KnuWtBxIWTXcw6w8lt0XkMwdRhk7TCIMJZifwLtcy2WyMuDpapBPLNrW18UoKWOPfHo+LILQtHNniMGmQYOGQYyckQhOOG4hxU0+vLN7CTXo0TdMz4qddwfjAl7CwKaHge2MXNUnARbJF06IN79k7Ow08hghkqEYc6mXi3q5s+s+ZtCjNCdfK/aMEZKEUXK8KO6BxGtcXgrh5E01SYdYqMPtpZRJFCMUA4/2ig/m2/DVy9A30NlfzsM+JMAeoQ8lp2OwaiA6aEVRHSTyU2gJl+gi/3bfTVKRCZV88+XkjxEhZM0VN/kHqXy9QNhAEZtoYCC7A4DgHYDuIIHUBqH9Pob0pT6//ERsDKwIcBEkVXmvYoy92s/1zRoo8R1T6pwqcO7ijCJBRsdinBK+nXP6Nbwb77V3fV8vr1vnT5ZXXxgz/sAxglE8jHGyv2JeLkL+Hvj+LSXyJ55Ax5tb1336YyZ520rd07jAR6HKfntT/avZ+N0ZNaq80DCCHYrfKZe/bWls+E+icy17zhhLDUKfYUkodG7CuKcL8tq0ZuU3irVSSrCVzjiYC8JoaKfOtsba11K/i75R4pgxFV5GSzZ5eAM7amOfl9UxFfqOKWSUQDnvaGmsVw/a2wfY2OlSiUn3e/wuc9K1obnhNbVtdqt1qokUmkJOU6F9mqB9VCXVFofzCHifs3ZEKxP6efvq2p5FosXu2gvGiNLwsWCbYpmXEawO13T4MxK/d/nJqpwRG0ppOepS+OeYv4hOR8drikl0yEwGCNBKtQkQJi60s88m8nAy+H3dwTiHb2yZZ5SkE9LymUA5xRhHi3vFOIL7hAEcX5z8bqVlAM74WdD+1yYwtc4JZCrHSWsQlLC0dCdQUZhVeq+IngBx0jNX+9FC6tZs65kh0KngpUAcLjVV+2rhXi/0V5jjgrzJJw3fDseX59VpI1d/R2hncAcxDDpOjcDtKtxGPFAS2Y3wHB/1BfxXxpqvIwKf3fGGNOUKtLTaKWKwwRigs0x0nmmxO1FKtyfupfZ+w2jIsxgmWoy7b4XB91GYzv6uOPpLGVDGFCbQa/RGCccWXXQhtOc7I2ZjUcBW5n6xM0hu2rimdo1KVokhkAVQ29AkZyl1XkPC5voZwThcQH1DxYqPLSExFn3RoAaGbgDiFroxdcMziZ4KpMTu/MHmcL9COoN3oQv/pJVhumugiY6Ey7HNR6Z8E0kgEGE+1Ckunls6MOkK0bN+r4VSe9Mn26A/4Xbzb/DhWsucJ7U21qclrbaY9Kg7eXa4nuRymKdUFwvcaBwJC8mlyq+b4D/VEEGMsMdJDt5JgYd2NB7oKZ9RH4xYGE6pUCA67+iJ7v3S7rckTDLh+loSEtTwrzbTlik53fYRBAGDRca5egcisAQ6Vtj+V+aqnZhzjgqYuaxOTAHkOTXzVCA1+NKlx0YpcYjLOnAQ+FevIoLBe6gg5I3YwKTwFyj75kTH5SA/3jdHqo5N93/y4Y3SlAPR2uygPFWtMTC74A0Ss5BC016m0x2aZl5GUaQo/evltdEX7Fos6fQ44OZ6Cy0toN8YGNTeE5d7Xf45JrWVKFrN7RROGwcABui/50qieBCrbJ0W6zBSceKIq7bc+1bKMWx7ltthksUJJ1raEIRxphnuER2GIcvEFf14Ep6ah4e3Kc2nwUr13LamuspkZSjB/f7GdOzPpLckeCMsENdCb/TRsHQQfQOhS3EjlH2yQUeOB4JzdVtz/V2ZOEeDPK4tmThjefuaFf9L91Kr3f07WIXnTVdKcbN/NjEIp1nLXAtaG+v+lvSinQjo3K54wrSTdHoDbscXU8oetk1wfaL4c0kKIEInwjUhUgN9ZHl7c0MujVpyCpTeANm/DN4LtDI1Qb99AhYL5dgGqeaBgWYtht0xBANymS4eJCejZDTX+iwns6otVyq+K3rgC/zwsiTudh98Ffzbd7wYOzdJVR17weKnt+OTHCPYHS9RQOdrMOGfq3Z+MlDGUNG1F7HxH134jrTc+z9o5F9lWM1kwAEyoat/WNUtYdWefeRZ5o3R6Wh+bXpl+x+pIfSy5NyLLpDS+9QGUCA1KSkNxwI6+jns/rW3Rm8bopk1THpPE2UlMsAoEgSGxCtO0sc5acsnP99FsJ9oHI56V4+oHGtVSRtUwG0bmFhfpeFQCog18A7c4fHzSsUxWQ+GjZ0+3GzSHQO9GqMPIwEZwRh9ESblm2HSWZCIeOA2AZCa5fRnVwK4jbU4GJQXtzfX95IWhgjQRNFNmYDeu3FhhQTnHyX28l/BRHFmOhOFAqOg0z0O1x6UzpYUemI2MsMj0XKkdABNcVwn6YwLrAyrcSNkOJIRYV/GCFqLojdwPSwybrWWuQ2tjbU3ZFJejuDjxLN7Jhe2r/1Eddtw/dr3NpaUOk+CMQa3oQqJjr7Ixk4/WP5uZZzn+GiMnuieaNCxiIrEtx4fPy0jYhuDTj/fTzZ0qvp30zHDcB2hn4d+cPKknwfirKMjEH7qiLvf1tV1S6wO92x4vriNfrBlYvllRCVMUyKUGHa/JSqm4I2tzXUhCViuiU2hSE04YC2KTsSVGUxKz8BXA1pBxF4EpAZX6PmcDt71H236PDZR2v9AnJgy1ds4XKrpKIv2wBqOceS9F82IM61olhglEeFRGJAqYju095iideYq/0Ww7nsix2Vu9f+0/clYXzns2a1FUpHp5AzzHC3uXnIS/O3lwBHG2Huhr6CELeu+AhNR0pAfSbB3gpy7d8EwSbHASRYHqYxjjME7kqD9SLqTcL/C6phRRgUdehoOkxrO727jG/4vUeiEbd+tDHmxhnfy8eLS8vmMUpyEcTtpWKJJB85lKA2KkBo46TPaxf+QaNUuyx9hDDuMf/YWTBJzaPi9GQYLhFMtpeVItC7L4FanWOxO9I+UUEIcC5Ea0ZFkRpO8gs2bm95PRGxRzw1Jz8M2u3MWNBJKy8xAoa61lrqqIxPaQCDdrcVUAOS11lbmXhCS0FOyr0XS48I84aKO2e3GEl0xWmWi5C4gdweP2/ZtQ59K+6lCLWRBBFbHVBgLzKHvnHLP5saEzy8hugO+s3VG6YuQNI7RGy1216ttTXVfJbvOYnc7geheqvz8oK2pvidQdc4tkGCyQJKyKDY92CUv4Xoa5yGVVW4ukMTCTCfAlCBzrqr/AQ/iwiz0TigjOlwhnR+d6PdvfUYy7nYrZJuz/dz0akWOFJd5sE4PxB7yzBafNNX4jlCiE+cEnPAlamRVKjShJEw14mYqUCRivYgNOqQDgowDeFyU8HQApOYZf+Cb0yXj+Lv6iJKdDKqrLUZZTmNbDUJwIpMzfUFeJ+kpbqdkZIYP/Ua1/SB9WD51wbIB6tQA4XgWvob8XUE/uirVrRBF8nGrrcy1CgbJ49qbGi5JdG6x3XkxtMDs8C++qnOLfNimTQ0pxe1pXV27vGTiDKeg02F4huFQ1qWWMve/U1Wcxfh9FP3Gh40Mri2eMH35+rUrv0hyWa8tKCBib2USADFVtDTVV1vLXGfCXIPkRqACReKWkuXlzoS25vq/Wezl5TAa/h5eibOsdmdta1P9s2rnltDiO6myLco5+WvbmoaP+7e2mWPDulUbgKScC/0HxxORMYrSwml9SQvHjJlUoB86/LHQNAzrdtLF50Wfnw/T6kkw+czwVIgrohPVJCYI0ViAK/N8WZEgvg58ent1bKBNsdqzD7wR2YVC4OQU9tz2q6PNWVE6BeRhMQwOCUVy+QZl9HZpWcc7akra/mDneaJgmAb1y2ZlFUE35BNHoNgT34nS8NHZmj3va1rucceGPYDOey90+myIzQf+rZvOlOeF3A1cKFX73oJVNFoapSu5e1EtEciyY7BOzLkATHy3emdLKH1FS8ZycYzjasXzcTp6at3wHF9WOwBtt5da+mAATDIoLYxMHi9kot/R0lj3Nvx5O9Hx4gnTRuv0hhtDZRDyQ5efHJ0qqYkAdWOspa6TYMJ/nYSGA3IfY1PfUiQ7fYJy6gnK8vmCwLCOBp1eD5PM1IP6ujZmC2orsKJzBEKyDszZF6Dtn7c53GhMgBaMeSNRAwm0/rI6pv6JEjOqEFhhsfewbc/yT2KVpoEUHMtYzwLtpdbG2oRx8AYr2ppqX7Y5XE9DH0KCOtVS6ryC9KHArh82AqWD40M/OJkfK83Mi88YGPxQYrAi6YmkR8KTN8icL1QLtCkQoW8X/6kAepxUYMDB7vboZL9MHpQYQRP3/ozhEw0T0+meYZVfHRTrL0iJDH0y1P0dkjguVkqA5/yKt0L6PjYdSM0JuZBYUUFAMWNtdFrgqILXpSovvtj2dPPD7Sc/kY+S543tMbtFHzCscvPbkliIqz4sr0/v06F8CH/R/8mH95CKeLWwiGXJLglOKv1zzNdGlMTRWg3+XG+q3v40ofoFiiQw2ZjSDc/hgljrSQSr9I6RRJbrEB85AW4PWezOy5Wfnq4Aj41SnxMIej3qpYUknVwm1/S1DdAXWpvr/mV1uF5QnsmeJaUSWvCkZF0T3gZx3YfSHvi5v8Vuxkkm4ZaUSA13EmWhxLl84Qa+sd3C8mngGga8h6vg/pDYjMIVvBLscZcCbnPBc/wD3Oe7BB3AGoSX2NjpB0b0bYrLnON1jCle/HmzX+7caZ1cegI7LjIbi3BQRfck1xU7XNXrV9f9N/Y8IO2/B9Ie2ZZ7s625/sHYc/JCbDD0AJpRJwuSZ67yTyOM7JePOijYHtjheyxO/6Ny+3BJNJyUiwJghX4Bu6Huruj4SPJsqd1U7XtpgN3ETxaNe+BgFBfVG0NKmGp8t2UrVaIyVd3iIzHecbNAhemV7eNRPyiSENZj8t2nJilKAp8MTyZWsTqUZzhMwY2ssvUOybjbUfBMfwf5Y79EM2/0Jo0z+SYYST+A4h8LWZ6pkBrjct8UnUDVo8Pv/PjcR7fNU9MLUcIpnMyqfFcYKTmOhSOOowI9WgWhsjsSIHyGdUESXOifFW8qjwBSg4PVoLRZL57oRN8ikZhWT2dKOPoC+sMpsZeHLeo42byerH88m/yAQd6mp+FtZ0oYroRTNhtu83VfVWLSH64oPF8Lk0yV6iQT2oKiiv8xXommyajvkU29UwftUabtKhCzWqQNZrSurltps7uuJoziAnqSRdIvhL9nMjbJYLGPeJ6E9b18XZwfr0Sc3ymBPn1sZc7TCWUYY9KgI/QJxqYeEC0tHDbOOaxAChE5lA5u8/Ou09XGpHx5+TVIgoCdvU9RLWf8vDyL7R9F3yKxiUBqTic5MhvGLR1FCfml6PQgJ/foKBnQ+DdArP5iqvK87p1tfjf2mH/96hukMXsdhs7UMsqckw89s8W48PbmZf6DoVdNySjPeAhUb0A9pkujE/0/bn9CGjoESVtS6UoUJEbYPFZZOT860GY0FPPj50jUBICTTehYEusCjJQuTpk/aE0rswYnE4xk6OEkJuRFNJDQw597lU8I2H6pWGawpT6rpKeZKLn2Cyjlv+1RCudyUlPtTFBc6iyjivItp6RablRXSE4VGxrrP7c63I0hckKJC62nUtmOQqBEoMQx4xSB6PAdx0nmsdgtqRETpg4x6c2RSWYjJ958x/mLRURq27Ft3Sc77YSeCtrWNPyjxO4sD1kPUXKGxeGqs5QO3x8OobdulF5djM97gKuZNdAhoc3hup+EgybvV1JqupZE+dcpEBmOLSG1Ac7lCzY3rmxTyydv4Qugoc+BSeT2RJMIq+wYKYm64/JVPkFu0dm5MNY6GuokSGLF+QmuyQiwwseJtxexCcyWPjbV+FYC8Zmey7LSBKNMeII9t33fWLf2oXAX1dv/SIkBrQnSV/Kl8TG3EFzHL8opWaXkNPbs1uuiCSoqK5uqfUuAuF3e16VxWVF6GTz7yeal/tPUIsurIVVzSXHKFdfCXefVZcGAghIzI/QlDBvh37Lp2ujtvL6QEqm5f61RHGtBpch86tplB0oj3p55YCtflZciiLxfj8CK8ziz54zy5GQlZIxSF3OJ3YgSyMZk10SAnmCtDhdKdtF/1P4Wuwl1qW6KHDfpzEjkbaHqEnJOPqyDEqGk1Lm3ILCwXy5OGnJh1jyYgfc3bJxzXoHEcLweB+/iYkIVvTZOnmxtrFMNKr0zgu/wXkkKzb+D8dSO+nuWic7lbWvqP7GWOY+mlIUMjcI6bokdF+aN2KAprVE/80j4GucwDgGkBqUm+RRZVkdvYURgNMxE5197qJyfMeDFn2Zc7jsgMEf6sFc6p/fCwYEkNgibWKBHK7U4SyjcQjBVeS+hjD2aZp5tvvVfAZHbv1ciW+otlvTs2CzqqoYiY6F0GiG9iRQNK/yinkO6ffgQoif/Ndf4b/J927pQNcRGGghJavaffx3UZ0Hys3d6MHQyJw0fPVOq8v7VN9uUtYv6UCyxcVZUxC7PQf3yBvqzcvm2dJV5Uy6DU2vPmoDTlIh3CuhxYU95KARAysQG0d7kvbHEbp4Ztrih1xQ7XMtxS8ricB4Oq6bTldOeQGusHNU3KdA3UIFJjz6twixQJnEe5fsRks3hTqs/wKT8Wmtj7QnpFoQ+kkrK3CcIlGCsuMiK/cvg9p9yulAfaLS2fuSF+zwF7nMl/NQzHXvCVuo+ggpMec683ePr7vOe8xlwEh3GoWgyjtjgZCBNueKcfJbNg0FViQJjNC+BKgUhFJm619aT79NVS8UpB3yfIwukjIFhCsxV/tfQ3Dv2mHe26TGY5I+Ar6lLzzh5UFEc7QVRR/GZ5lxhmlF6EfSZXkrgngrxe6g3ugPPROqHTgrvEMdZLoI8Fvp2dP4zWaBGNWCUdOjHdxMkS78kUOKASe1VlEhymdwT+OzDZdE6ZqkAxwDj5PnHiIV6XPUP6PuRIiKLsKyIcJ9gP4uXedhXUA7AfZEtNJnytN9N3HoqnjB9nk6vR4/QRtySsjqm/p4R82ISzrjF2+VJaLqeS4QcEZaajgVSg/5KIj6oXmlprq3qj/L7QEFaZ9PETlaToYt0tQlEj0RqhJK0ecOGz3PUVwYP2htrP7SWuf4GcxduRe3NBfKp4nUahhx+huIfKiHySmwAv49V/kQYJ1+Oe/U5lZrEoJ0KQjeanUcnyjIfCcTmt4kuygZAXo4zVXmfpIz1+HSRphyIW3JofXRqmtntFlt3pZBxGVeQkYWmau8mSlmc5YAc5E8BCUVJVip6RzJ0rC/V6gedMF9egfc0Tpl/IZTZ2wkXJ6ugTTLezlQI5x1SoeEWc7X/3zDwvwE3937Xtk3/U9tqCU3G+142gep0h0DZfxD0zEX62xsfJXq1tmd6fX8FCI2qCp1OGZkO/XwLtB9OLu/IXV2rAvK/1qltQeOWk353y34Co4cDIURl1gn9XefMwTuURz0kVb2hDNDzbjLe49U4K3BCiyIdFJ5XRnoo6MfG6nAvgHyQUOwPw8QnJLwFxbkcPGPL2o/i4n5lAmjWK60O16kqh0So+xiL3Ywi4p89p3PyGu/w5NUHWgrognpcldYVFMNhpI9QbLLSUBiPEVHJ7pJSJ+qg7HIS4/Zm703wzHHXZ4pCanA+fahtdf0bya7NN7Fh1GD4Ggbi3oks74YPJfBpiKsMy+scpAdSE9fgGeqboAQgrv5ZoghIzetqB4DUpJMPNCNdlpsqpVEoUbHAyt3jxBhGR0IZR2LX1I0YjTGLUBEWVwWeUEmcDIHJGAfzghyXnS5wwovvGwPrOmcE6kLB39OYQU8kUtEJ7dcCv3+CgcgP74Ae2m+ENM6K7acf0JpmCM7pd5SGnBGaSsbPwPuIc3OQdRmEfNOzEyWE3MRnL4mg3B7pHF3+zH3LtDfVo/Iqur7v8YGFk0xrU8NbWdfxZxye4njZCguQm9evqX8knUjfeUJ3S2PtP/qjIEtp+U3QPMqWLb+McPoHNP6AfnmNrczZkEkk8MEMlBZa7K5TYMJBpWjkKt/JP21PSa8y38RGg4adEci8rSTaad+u63MvH8AtD1RU/ZnY7+TtRzn/mFB6fOi7jmKsosdzXUaAd38k0h7eh8Fj/55NforvnZBCO3oUzsZEHeNNjSmdPk8v6DHwK/rQ/zrVSSZ18K+ImlSJky7oP5vhWyOXg7Xta/y1qVp37SqwlLmPhAXlFeFf/OWW1XV3lzjcy4RwdPChhLKnR+/hmpwPNwQDCQytYHO4UZKJC7qm9vbP4rzcq0EjNho0aNCQBEHOXxMIDTvipBR9zTye6zLQdNXqcH+GirrwOcSy54yxbV+vyFiJuGRCOXrkDXvK41TViCMdbGheudbmcM4HyrSQE/nUVCeZVCHL5Py2ptq6XOa5K8BW6rZRIRTjD5cH33gCO0JO+DA6tsXuPpOFQxGMNoj0GeCyh2UQ9HSXg0ZsNGjQoCEJMKK2zeFaBXMLbkcdUlLqdKOH3lyXQ4m8BIgDOp/UUYMO9SZOT3aNGsLO/pwR/x88SPniXNSvrWnFouKJ5ZvamupT8iyvITuEFKbt5ucVHZPOIOk+AR3ZRY5jKAJrmfsBGo55B/2yHPvMdQkz/IVAIzYaNGjQkAJkTm9klLyK3wWBPTJ8/P5ToyeZVGEpczvaGmvj4rgh2rzBx0pM9ArUY4HJ7FSb3fVKS1NdTdpllJajK4Rp4V/8ZTWvwZlAUZrOi4NCDfEosZtuoT8/xyvRt1DsOe18/V9KaPG0kKSP0qttZc76XU3fJl1oxEaDBg0aUgBGyLY5XDCpU4y7NMFsLFw2alT5rFT92oR0XkqdtwI5+qutzHVmS2Pd47HnhDz+lrnOF2jITQYljD4Lq/A57c0Ncd7DE8Fqd55EGYvo52z18+5L+7xAw6AEkNoKymgomDCwyar2poZ71M6Tm5oCoye6TzDoCFqrFRLKnhm9h2u/XU3fJh1oxEaDBg0aUoQnsOMss7EIPfn+CniHyzhcWFVsLz99fVNDn56CrY4ZZRZ7OToYC3unhpU1Gzv9hUgww2i0N9a9ai1z3az48CgUBOENq8N9XXvTlrtl+YvO2PMjwECQ+qHDbwJSg35lUB+jk3D5hERu5zUMXqB+FTPoQno1qPjt8Xaf1peLgY1ratdYy5znUMrQg/cog0ieAx596C9V30YjNho0aNCQInDrqXjCtN/q9AZ07bAfOivUUeE9W5n7DZnyZ7u76arNnV2towLbBX3B8BKu41NgsplLiW4OnB8J1PhxwBeco0ZqImhtrLvOWubmlBIkNwb0IWOxj7gA0h6Fqe4tmOhW/yT+4BkjjxwCxGcSp+Rw/dAR86A+I5UststEPqHtF74lEQG0nwRtl7Zz1vbmLYv7IpMAwepwZRRRuzvYXYsK2bHpqFdjsZsxuOVw+HTRID0xmUM6BIYYgH54CNzsWUi6S+zl10PytZnUbWeHRmw0aNCgIQ2sX/veRjZ2+rQSk+52SkLe1QWYTI5ghB5hgBHVotMTYgr7UIvxy9IFq+972wMt18rfrkvqLba1sXaBze78GGY6VCZG3zk2IDoLINcFBSY9KUCDJ8UlGO35j4RiJ5Gu4FltXzc05eymd36Yoe0WpnvRiIkF6K29L2IDpJM+kkmFBEGHzgXjiI2l1ITbiKE4WByISWtzbVyw4URo83VdYjHp8dpJUK+rrHZ3Q2tT7ZuZ1G9nhkZsNGjQoCFNKNKWi6yOGQ9QorsUJqBjI95RVbAJCM2LtIssbF1b15xOOS1N9dVAov5tkfSnA3FBC6nJRN0rEEy+/K0gJ4s2NDe8tqsHhdxVYXW451BKwzpRnLze3lx/ezrXY7+0lLlPYJSgkrGZMvLUqHHlkzd929Cej/oOVugop/fLhC8d6Ipo0KBBQ6qgXP58oOuAaF29AoNKnssYO3/0+IP31umFMqAUw2BygmGVb+GcNq1f09CYjYdchUSh1OYBq2PqbpRL+xFObdAKRk7k7UHC1wke/38xeGCmZbQ11aPreiRMWRMiVGaF9oh4GuzzvtubVjwOfyIx7HKuD9LWXD+bZOEeEh6bagy0tqaGP2STr4K4+21vqkcLuEhMr2AmBBUt7qD9h0TVT/UZoI+kVJ9TImBE92zzSAbom5Ht1ZTbQueZJb6Uj8po0KBBwy8FCnH5QvnkDTiRwJ+c683kWsk0ESFQOQ/bLW9hEfKlPDvY8001n1SfU77zyHX+2lb1suJGAAAAXUlEQVSUBg0aNGjQoGGXgUZsNGjQoEGDBg27DDRio0GDBg0aNGjYZaARGw0aNGjQoEHDLgON2GjQoEGDBg0adhloxEaDBg2/GHR1k9v0OvkxQnyNA10XDRo05Af/D4869RDgFG9MAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..69e82a2 --- /dev/null +++ b/build.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Assemble the deployed single-file pages from source + shared partials + assets/. +# +# Each page is a source that shares code via markers: +# /*@BUILD:include:src/@*/ inlines a shared partial (engine, seed lists, base CSS, header/footer/chrome) +# @BUILD:favicon@ / @BUILD:logo-*@ / @BUILD:bravura@ inline base64 assets +# This resolves them so each built page in dist/ is one self-contained file +# (zero deps, works fully offline). deploy.sh runs this first. dist/ is generated — +# don't edit or commit it. +# +# NOTE: this is the slim `main` branch — only the landing chooser, the mobile app +# (+ its practice journal) and the pm_e-2 notation editor ship. The full +# multi-form-factor project (all device pages, firmware, Rust, hardware) lives on +# the `concepts` branch. +set -euo pipefail +cd "$(dirname "${BASH_SOURCE[0]}")" +rm -rf dist && mkdir -p dist # start clean so no stale artifact survives into deploy's rsync --delete + +python3 - <<'PY' +import pathlib, re +A = pathlib.Path("assets") + +def build(name): + src = pathlib.Path(name).read_text() + # 1) inline shared partials (function-replacement: no backslash/group interpretation) + src = re.sub(r"/\*@BUILD:include:([^@]+)@\*/", + lambda m: pathlib.Path(m.group(1)).read_text().rstrip("\n"), src) + # 2) inline base64 assets (all voices are synthesized — no audio samples) + src = src.replace("@BUILD:favicon@", (A / "favicon.b64").read_text().strip()) + src = src.replace("@BUILD:logo-dark@", (A / "logo-dark.b64").read_text().strip()) + src = src.replace("@BUILD:logo-light@", (A / "logo-light.b64").read_text().strip()) + src = src.replace("@BUILD:logo-side-dark@", (A / "logo-side-dark.b64").read_text().strip()) + src = src.replace("@BUILD:logo-side-light@", (A / "logo-side-light.b64").read_text().strip()) + src = src.replace("@BUILD:bravura@", (A / "bravura.woff2.b64").read_text().strip()) # SMuFL music font subset (PM_E-2 notation) + assert "@BUILD:" not in src, f"unresolved build marker(s) remain in {name}" + out = pathlib.Path("dist") / name + out.write_text(src) + return out.stat().st_size + +for name in ("index.html", "mobile.html", "mobile-sessions.html", "pm_e-2.html"): + print("built %s (%dKB)" % (name, build(name) // 1024)) + +# PWA support files for mobile.html (the phone/tablet app): manifest, service worker, icons. +for f in ("manifest.webmanifest", "mobile-sw.js"): + pathlib.Path("dist/" + f).write_text(pathlib.Path(f).read_text()) +for f in ("icon-192.png", "icon-512.png", "icon-180.png"): + pathlib.Path("dist/" + f).write_bytes((A / f).read_bytes()) +print("copied PWA files (manifest.webmanifest, mobile-sw.js, icon-{192,512,180}.png)") +PY diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..574c159 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Deploy the metronome to the Caddy web root that serves +# https://metronome.varasys.io +# +# Caddy config: /var/lib/caddy/Caddyfile (metronome.varasys.io:8443 block) +# Bind-mount: /etc/containers/systemd/caddy.container +# +# The web root is bind-mounted read-only into the Caddy container and served by +# file_server, which picks up changes immediately — so a plain file copy is all +# that's needed (no container restart). The web root is mirrored from dist/ with +# `rsync --delete`, so anything no longer built is removed from the live site. +set -euo pipefail + +SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DEST_DIR="/var/lib/caddy/www/metronome" +DIST_DIR="$SRC_DIR/dist" + +[[ -f "$SRC_DIR/index.html" ]] || { echo "error: $SRC_DIR/index.html not found" >&2; exit 1; } +[[ -d "$DEST_DIR" ]] || { echo "error: web root $DEST_DIR is missing — is Caddy set up?" >&2; exit 1; } + +# Assemble the self-contained pages (inlines assets/ into dist/). dist/ is git-ignored. +"$SRC_DIR/build.sh" +[[ -f "$DIST_DIR/index.html" ]] || { echo "error: build did not produce $DIST_DIR/index.html" >&2; exit 1; } + +# --- compute build version --------------------------------------------------- +# Formal build: clean tree on a commit tagged v -> "X.Y.Z" +# Dev build: anything else -> "X.Y.Z-dev..[.dirty]" +VER="$(cat "$SRC_DIR/VERSION" 2>/dev/null || echo 0.0.0)" +cd "$SRC_DIR" +if git rev-parse --git-dir >/dev/null 2>&1; then + tag="$(git describe --exact-match --tags HEAD 2>/dev/null || true)" + dirty=""; [[ -n "$(git status --porcelain 2>/dev/null)" ]] && dirty=".dirty" + if [[ "$tag" == "v$VER" && -z "$dirty" ]]; then + BUILD="$VER" # formal release + else + BUILD="$VER-dev.$(date -u +%Y%m%dT%H%M%SZ).g$(git rev-parse --short HEAD 2>/dev/null || echo nogit)$dirty" + fi +else + BUILD="$VER-dev.$(date -u +%Y%m%dT%H%M%SZ)" # not a git checkout +fi + +# stamp the version into the built copies only (source keeps the APP_VERSION placeholder) +for f in index.html mobile.html mobile-sessions.html pm_e-2.html; do + [[ -f "$DIST_DIR/$f" ]] || continue + tmp="$(mktemp)" + sed "s|const APP_VERSION = \"[^\"]*\";|const APP_VERSION = \"$BUILD\";|" "$DIST_DIR/$f" > "$tmp" + mv "$tmp" "$DIST_DIR/$f" +done + +# Mirror dist/ -> web root, deleting anything that's no longer built (old pages, firmware, …) +rsync -a --delete "$DIST_DIR/" "$DEST_DIR/" +echo "deployed v$BUILD -> $DEST_DIR" +for f in index.html mobile.html mobile-sessions.html pm_e-2.html; do + echo " $f ($(stat -c '%s' "$DEST_DIR/$f") bytes)" +done + +# Smoke test: Caddy serves on :8443 with tls internal; resolve the host +# to localhost so SNI matches the site block. +if command -v curl >/dev/null 2>&1; then + code=$(curl -sk --resolve metronome.varasys.io:8443:127.0.0.1 \ + https://metronome.varasys.io:8443/ -o /dev/null -w '%{http_code}' || echo "??") + echo "smoke test: metronome.varasys.io -> HTTP $code" +fi diff --git a/index.html b/index.html new file mode 100644 index 0000000..810a333 --- /dev/null +++ b/index.html @@ -0,0 +1,69 @@ + + + + + +VARASYS PolyMeter + + + + + + + +
+ + +

A polymetric groove trainer & metronome. Pick how you want to play.

+ + +
+ + diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..be658a3 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1,18 @@ +{ + "name": "VARASYS PolyMeter", + "short_name": "PolyMeter", + "description": "Polymetric groove-trainer & metronome — touch-first, full-screen.", + "id": "/mobile.html", + "start_url": "/mobile.html?standalone=1", + "scope": "/mobile", + "display": "standalone", + "display_override": ["standalone", "fullscreen"], + "orientation": "any", + "background_color": "#05070a", + "theme_color": "#0b0d11", + "categories": ["music", "productivity", "utilities"], + "icons": [ + { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" }, + { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" } + ] +} diff --git a/mobile-sessions.html b/mobile-sessions.html new file mode 100644 index 0000000..0ecb743 --- /dev/null +++ b/mobile-sessions.html @@ -0,0 +1,214 @@ + + + + + +VARASYS PolyMeter — Practice sessions + + + + + + + + + + + + +
+
+ ‹ Metronome +

Practice sessions

+
+
+ + + + +
+ +
+ VARASYSVARASYS +  PolyMeter +
+
+ + + + diff --git a/mobile-sw.js b/mobile-sw.js new file mode 100644 index 0000000..dacb8e6 --- /dev/null +++ b/mobile-sw.js @@ -0,0 +1,52 @@ +/* Service worker for the PolyMeter mobile app (mobile.html). + * + * Deliberately minimal and non-intrusive: it only manages its OWN app-shell URLs + * (the page, manifest, icons). For every other request it does NOT call + * respondWith(), so the rest of the site behaves exactly as if no SW existed. + * + * Strategy for the shell: network-first, fall back to cache. The page is a single + * self-contained file that is version-stamped on deploy, so when the device is + * online it always gets the freshest build; offline it still launches from cache. + */ +const CACHE = "polymeter-mobile-v2"; +const SHELL = [ + "/mobile.html", + "/mobile-sessions.html", + "/manifest.webmanifest", + "/icon-192.png", + "/icon-512.png", + "/icon-180.png", +]; +const SHELL_PATHS = new Set(SHELL); + +self.addEventListener("install", (e) => { + self.skipWaiting(); + e.waitUntil(caches.open(CACHE).then((c) => c.addAll(SHELL)).catch(() => {})); +}); + +self.addEventListener("activate", (e) => { + e.waitUntil( + caches.keys() + .then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)))) + .then(() => self.clients.claim()) + ); +}); + +self.addEventListener("fetch", (e) => { + const req = e.request; + if (req.method !== "GET") return; + const url = new URL(req.url); + if (url.origin !== self.location.origin) return; + // Treat any navigation to /mobile.html (with or without ?standalone=1 etc.) as the shell. + const path = url.pathname; + if (!SHELL_PATHS.has(path)) return; // not ours — let the browser handle it + + e.respondWith( + fetch(req) + .then((res) => { + if (res && res.ok) { const copy = res.clone(); caches.open(CACHE).then((c) => c.put(path, copy)); } + return res; + }) + .catch(() => caches.match(path).then((hit) => hit || caches.match("/mobile.html"))) + ); +}); diff --git a/mobile.html b/mobile.html new file mode 100644 index 0000000..28d2748 --- /dev/null +++ b/mobile.html @@ -0,0 +1,951 @@ + + + + + +VARASYS PolyMeter — Mobile + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
?
+
+
+
+
+
+
+ +
+
+
+ +
120BPM
+ +
+
+
+
+
+ + +
+
+
+
+ + + +
+
Play bars, then
+
→ + bpm / bars
+
play / mute bars
+
+
+
+
+
+
+ + + + + + + + +
+ +
+
+
+ + +
+
+
+

Edit lane

+ + +
+
+ + +
+ + +
+
+ + +
+
+

Share

+
+ + +
+ + +
+
+ + +
+
+

Save & library

+
Save current track
+ + + + + +
+ + + +
+
Manage library
+
+
+
+ + +
+
+
+

+
+ + +
+
+
+ + + + diff --git a/pm_e-2.html b/pm_e-2.html new file mode 100644 index 0000000..5adb9f4 --- /dev/null +++ b/pm_e-2.html @@ -0,0 +1,1833 @@ + + + + + +PM_E‑2 — PolyMeter Editor (Notation) + + + + + + + + + +/*@BUILD:include:src/header.html@*/ + +
+
+
+ + + + +

PM_E‑2 PolyMeter Editor Notation

+
+ ◎ connect device + + + + + +
+
+
Space play · T tap · ←→ tempo · ↑↓ cue · ⏎ commit · N/P step · A add · ? help
+ + +
+
+
+
+
+
120
+
+ 0:00 + + + + +
+
 
+
+
+
+ +
+
+
Now loaded
+
Free play
+
+
+
+
+
+
+ +
+
+ +
+ + +
+
+
+ +
+ + + +
+
+
+ +
+
+ + +
+
+ + +
+
+ + 0 = manual +
+
+ + + +
+
+
+
+
+
+
+ + +
+ Lanes — add voices; set grouping, subdivision, swing, polyrhythm, gain +
+
+
+ +
Click a step on the Staff or TUBS grid to cycle accent → normal → ghost → rest; Shift-click cycles flam → drag → roll.
+ +
+ Konnakol +
+
+
+ Staff +
+
+
+ TUBS +
+
+ + +
+ + + +
+ +/*@BUILD:include:src/footer.html@*/ + + +
+ + + + +
+ + + + + + + + + diff --git a/src/base.css b/src/base.css new file mode 100644 index 0000000..6e84eb0 --- /dev/null +++ b/src/base.css @@ -0,0 +1,128 @@ +/* Shared base — inlined into BOTH index.html and player.html by build.sh. + Box-sizing reset, the VARASYS brand palette, and the common type stack. + (Page-specific colours/layout live in each page's own