From 5ab2096fc4b1a30316be9a51f7a7ff8d73910802 Mon Sep 17 00:00:00 2001 From: Me Here Date: Mon, 8 Jun 2026 11:43:14 -0500 Subject: [PATCH] =?UTF-8?q?PolyMeter=20=E2=80=94=20slim=20main:=20landing?= =?UTF-8?q?=20chooser=20+=20mobile=20app=20+=20notation=20editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .gitignore | 7 + CLAUDE.md | 48 + LICENSE | 661 +++++++++++++ README.md | 43 + VERSION | 1 + assets/bravura.woff2.b64 | 1 + assets/favicon.b64 | 1 + assets/icon-180.png | Bin 0 -> 5484 bytes assets/icon-192.png | Bin 0 -> 5451 bytes assets/icon-512.png | Bin 0 -> 16106 bytes assets/logo-dark.b64 | 1 + assets/logo-light.b64 | 1 + assets/logo-side-dark.b64 | 1 + assets/logo-side-light.b64 | 1 + build.sh | 49 + deploy.sh | 63 ++ index.html | 69 ++ manifest.webmanifest | 18 + mobile-sessions.html | 214 +++++ mobile-sw.js | 52 + mobile.html | 951 +++++++++++++++++++ pm_e-2.html | 1833 ++++++++++++++++++++++++++++++++++++ src/base.css | 128 +++ src/chrome.js | 22 + src/engine.js | 294 ++++++ src/footer.html | 8 + src/header.html | 14 + src/midiout.js | 73 ++ src/notation.js | 403 ++++++++ src/setlists.js | 42 + 30 files changed, 4999 insertions(+) create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 VERSION create mode 100644 assets/bravura.woff2.b64 create mode 100644 assets/favicon.b64 create mode 100644 assets/icon-180.png create mode 100644 assets/icon-192.png create mode 100644 assets/icon-512.png create mode 100644 assets/logo-dark.b64 create mode 100644 assets/logo-light.b64 create mode 100644 assets/logo-side-dark.b64 create mode 100644 assets/logo-side-light.b64 create mode 100755 build.sh create mode 100755 deploy.sh create mode 100644 index.html create mode 100644 manifest.webmanifest create mode 100644 mobile-sessions.html create mode 100644 mobile-sw.js create mode 100644 mobile.html create mode 100644 pm_e-2.html create mode 100644 src/base.css create mode 100644 src/chrome.js create mode 100644 src/engine.js create mode 100644 src/footer.html create mode 100644 src/header.html create mode 100644 src/midiout.js create mode 100644 src/notation.js create mode 100644 src/setlists.js 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 @@ +d09GMk9UVE8AABVkAAwAAAAAKDAAABUYAAFkWgAAAAAAAAAAAAAAAAAAAAAAAAAADch7GhwbIBx2BmAAgRwBNgIkA4EsBAYFBgcgG1onIxHCxgFAibFnRPIw6VGUQkkTf5nAyfWwggcPLs3IjYqq5gqHsB08vSzleNSB+WINESxsGSPx3OFpbv9u2+0OR9QZd3qHEQFWTnojYyBVG/SiyTYSIwqr683/1I+4sf01iXTxr7U+1VaN+i7UXfWeMEEdlnHAlt0RLP7poW6e4aVDQhVwaO8uaYB/8KYNTn5QfsnOac2zfXIr4JS6KzhlV2U7H3X2cJCYXrU02D34IUYQM2Uf9VX1EaQnN3/QpA9YIPthB1ZZfOJjntDEZ9F+/DqeIqGTy3szO7uHqEZoPnfvm4VCSGKhEnLih/ul/nfdmgl+B3JGkb1RFI6rqKyoBSMKdzZtlokPNW1AwwHRVOZ07rYkgO5TGzKr+17VdDKQCu6+YkDAAxiGkbOyohXyrGj1oyGWucBymGW+NbA8z7KAbxEL0Mi/nZYrvzvxnk5r7Gp69pM7Ntd6BzCS/w9AAjvQVS/9DDWGqxnm8+IvTKwkmfIoGVSo12aFdbba47CTLrjunqfe+OyXvxFgIswR64G5YAOxcViHI3T85ySo/SbHnOlHQ4Ymi83h8vgCoUhKOjKZsjncg7PS9pX3PfLDym3bNnMWO1Lpmix2+bfdlJmGlTmHy6uwuN3zK23uzHvZjOyZuxxV3pbuRHZqPkHTyOtWDTEXoYNI65jfOZLV9rEfCd7Jk/6mcF0V4UimQfWC5JNRWm56g8k1SlsvWaUzE0FoAIX/wvMdScd1lDBYSqwgyeN8iQrlVVZvFOR/5m77E9dYib/TKVXHvvN4rXtrkXfeup5MeV9bnz272XIHQi9wUvhZGPOTfKoFy1cMQdJ+L9sTSDr1ixr5Kmg/GQBs3RnWDJW1kbu3DWA3bb8lE5h43dz8V7OdS9XS1Rx0D1PECb6M4/F9wGQjX0UJ4l/qJTx5Ha9vDFW4ZkTMFsY4nflM0JZEb9BZgAck5NP8L9mh2sCSj4/Ge1t5F32ggYRqShUSZTp54AnLYMQMrDnDjG88KWy0i+SObuSZHePa8I+WZ9aStdmh++Bji/Sgs7lVsR1vjO3m2eaO6d6wFawsk+BD3bgjlGGHsam6QzYXv5y0va62m81m9SO91gwSHWSYecXElbmENf43YSarp/KwOK6xX9zbjAUfk1+4p9C1Ktks4sV1SYohe/z6smGVFgEsik54+a8KmZN3wZlE8mKkC0/pslfpQwrikwq7BVQ3s+RqM4vghauJLyqcSmFrsT9bhCLfwuQTJf8zEiWmqSVb9WgScwY40EG4ykHJmq26n29ma5YiVzgUUUr14u3kvPW5KP6k4ArD80AHlpkUefPr99N6j2i/KUNQOXilkSh3sz3lFMOio0aKAJsz5poKK0PN+hk1B5gyONc1rVX1Cn18JZ7E/zDTbthZb2sYDWdUN5ODVRPJFfp4A0qZ2bCPEHq/Qbrxq/HZBbbb+SCQOU1HTtfhQ61roLyWqYIHotAF/kTglriv3lcbdJu1bhBt0Gqd2VHJAtNeX/2tfoJuq7E4t7wtx4MRIZVzaW//heededf5nEoDc3q4KrEifCLEW/yp3yEV4tCeTt98k38pBmnRZZMRDJC8qeD1HCyUul0spOUDQh9ZZkJZb0PlHhH7+o70GebqCaRarSqNsA/CV9gonbwcOF1QlccaVhlbqe/AsDBNOjk3GSAnFzEZuiiekflJUm2WAtkwgz65xbMa4wcZqOgdua0zGkdFMBcs7LlnafWdEmuwtZ3BUe1gpKJRN1h2usHiOanAYnTNK3DKjHWavC0ZYzCroldQ8e6Mkzu2pumywrdql1gg1VFlSFRlS06rLdn0SVHxS+/0LOmYkqpiGQ1ghIhZezhzaQhrS+rWUXyvDqQ6fHddlKrvC8TvCvTYff3/4Qfpm/51OZJoWFHtkU0bDni1JRv6GPGmWGVmXk8BEeXYxde4zy7dXOq4t1rPp0yneyfZr+DESlPrvg5eVPUhNUyJqxm12latkbQesZfhbOcYQwxRRVhNtD93DMr+LzA2rHUOdcNc5AMWT81iGPIKIfPN4656diokal1YFuV/g24f3rvdYo47S1PrupWUbrOpjukGq5qSeQZdaqcIJ0bQQDwzukGdeijIXG9gSp7dj6Z2g2xWbhZy5tm6WhMP+JbqL+hJtib7rFOliE5TBT2qVad5yt/y8vYSe81Ts4FaQuB93UK+iYd7/kctFHCDSeFJqqjAW8k8VXddvLzNzkvbJc0AuwwM1jwT2izzFQ+xjgrwEQLAm/cZFjHfIL00jlQgKhJ4jp4ha7K8OQ4J85/z4EviOWnzK+BJQIzH0rm+/rYZmq6cH/Yg34W3r830eijsItB5k/+aH3+T3y0WlfHkcXM9zSBHzT/H0Z0SFPznYZ7AgbyAwgjVKB6LveZLq4XDz48QccS03eUXDACGGQeDoQUY4AMPZj9i5oXwXvA1AmtBowDiavy2sE74lZhE5BO1xE8ynDSSW8lT5G0SWvW3mmNVb/WwS7mov0gvemUtsh5p/dsmxgba7rB9b+dj99A+M9H20/GkG4eUVH0SUeA8AN9dqMVhgA1yk0IQhQW4znVRXqDLAplObQ0gZwno6rihUIBESDQUSQIOse8VoAiK3sM/mlgWJcMM6vKZ130XZJU4bEl00jtoBbts/HeAA5WHhi9JGoWEmKjgIKyTmhZtqVBevV0vgdg6a6jVQYS+kViUU6TQqflAVR8PwSUKJ3KilBp3i/MXt2P9KKINZ71ydn+WsYTZlV9e0eU415LmqM8SBJCwuI6imogJA56EAoRoLVBrlykYQrQJMV2t037qFTvD2mKYdInZOIsHzv26ZXnm3VlybvMj8rPvvg7DPfWSEHaPQpWVQe+vLK4pYte1rl+4hXlUf24993Be5VJSrlesu0hflC9IGzVo3uxIblqCLKRgYanp1XSjopU9UHr5IrOj4qsXzO5PDo5sawtewkRYTgmhBEWqJbmStPt4SUDSksizRi5MHTqwbTsmAT+/oMJgvFh3zS3EBlO9tSjpr7qAbA4FH/ukeZjYnOgZVCTTXlaAI+r7p3tPV8o5SrWkUC0rKx17abDmwFhvhisb1kUZTUomsMeUp1aWkO0iQ7ac1v3fpH40k2Xq36+Hn2NtII6HK5ct1xdB7mdLmrqvqTdoroR7TWilDbHKWQ0lptZl6u2rWb3hCPmNHNYsrmQB5OC/mZRLIgpRzrJYhBG0QwRuJHE0oHsihrh/GY6DuZVN2r5aQFkA+SXm/PyICi3N7zcVIvvBiEuN5jBsKSkVCNESRCac5JKwAeflIZwn1+YX6jS+72bH4BKFVTEfjQY1an9JzQZ8cIOowrxpknwWwfXbp6gye07XQ6LStKQ2JYpHw/3UcdVfJ828mMX01PxaZu34RLe53QZNIDHrs3AR9BvMVaXLuoZicd3aHfTMq2WIj3g+xZkchMqGSEzkZO7lsUstHCwfr99Erq3aFOUvlyWYWIFVFJFenTHQDlpfvPny1cybo1jfKHVeMie4UJJS6SyCb/DkI2rXhe0HnbLS4VP11KrpzMDSYfGL5pOLowsCwmga6Pl1gctjyY93HvzlMbP3Tr55F549tvbwYfJ55qVpyUnKnEyWc6EExayYoPOsPJUuo7Vlsd/LU+qVHMkL3yf7qosaVJCuXRsMaS83asPR7zw9M4KTkzMPnb2y+tA2BJBncYVR1FE5bJcWGnUJZHTFkqyssCeTGN+inJJibn+J3hhKL0i3NMRoeWxjSghn6F2JMtVpqLNl7eBwcXjh8I5jH51kOsrHWYHaOGOo1TzSuHHaVO857PLIFF8ZvaNMvRKqD5Tr1x9lFS1GxWZ0k6EI9v1G2/6Az7ZQ5w6u236C/EcDWzchckrAxBHb4w9ksDOzYpM86G4vYz99/rUbMqcTNoatZGeuoPp29Kh6QnbdW71n26+dubG5mUl57AC0jRrltenCvs27D03xXfJNhZhempK4gAXfIOVGRcclRRnLuE5wbMPddidzu/za7i23vDVXpqeP0jaQN4JTi3eQD2JCtkxsGRGsS1vErUrPiYig+99ccGfDxmbtBtDaKEMjE3Q472nyMSiYnSXVDaOVTdZgWDBVRSrI2K+hDM2pK2F+PKCSMw6dvbLm0LZtG77z9MwMTubAG1gMqyjfZzxyRMzClZKdwdz8bceWnGbg7NVw7NoDsyoJQtlGFOKlJrstugddoevtTZ14pG6hWsP7RbE5USmSg/kdnPxoHxHYDQ1t2sWCp5Y+sRTFooucqbei1moTIFVRVpB6F6K2epprUFGmUnr3wEK1lveKOL/w0nfy46jdPdroVTxNyTuiQOVswFgAXQldjgnYpMbfkYX3bkcPP43477PYmDV9DT2A0BSCos6LEr4QmU1zC25a5dFno9a3qBG+iqnPRXaUhnEuhDYSNm0rvvSGvt22f81W0EorTcMoCBDAo1spSIoKnZjIcc5gvpCRMEQvJlieReA9hCGKGc4nGMIAnIewCll8Kg8iDMMSbqTKKM/RLSSqOEuM8jgr8UZQfhsAXsEU6EChHpP85i844Q0Hw0lH7t25hvAjHdr28aTOluxOt9JXx2Z6p5SkJ2k5lpuVPl0Zv7JjCbdzRdGmDSRRhSkALPqAHCjoutHRG+9+v8EXDQ5DRGDArtRjnHwbtUPZ2BQii3iek9uu/739S2o2qGUNtlFIFqHeY0P9eGdfQOzhk8OxGySIN9ZtfODulE7ONgZuG9QYiT5B0WfcapM6kqAsElxKAd6xD7L/gZdzrjlFJIwSE1uOTjQQiQbhRiaThMAwLKzRxoCz/wEd++BmbaWhSVhkGHLHLQBXaA8dqPlS6bx5x6WXrxw/fuWK9Pg87l4YNVUiOYHXlSvz1fRATTg7wYv9Gyv0uapCdvLJE47/6721CgXt/boeiFcNJ3BP4uuD99v0q1eTCwManzp5whcfFObq5MyO3NqmNgdQI8TQLGr1amWrapvnH4+3HSBfGnddPsnSuPVJhCxoYoupO8adj2EBakxFYurpju3XH9OPZJ3i3SxFrSvBjVFTWkQbktVpbCZZWZSYSc6gws9dO7YvT0+Xy9PTl8s7Otas2QQAieGQFMo5EOioJ/6/A2GLFsLBZ21VeLScGoMeWuIczknC4eUgD4wLPvcs/qlA//Uwg2bDUYikDvoM4lkGpPGD/nwITCH+T0E0HkLMLICav+speeTPJzR0CIRdPD6zQfeinxa+JycsyHyahXzAeS1xQ/kO9dzSo1Hr6nqJD71AF1YQwXIs44TsbdBkCUR0mqVTbyYL6n6XU+WLa4Mj6ElZE/clsismznbzdAT5v5Lwk7goh9nEQNW/B88O3/OufjoDRdCBvpt7TbsBSljkQrqvIC+tgQOBcNXfrZQN7flj9IHgQHb/8q2sEcYRLY22YKI1ly7TzaIWDeRezu+Yfdf/pLSt4CfZyAcVeoqzPMSG7tXBFfM1ceV/F3LF3PqQQHqDKdWQygqqBCfpupKW2twNMxgHX1KFqwqWKlaGdYavVDwkpVJaExtlBSSpy53SkI1c9eb6lGQayUiGwKHy48DjIuQxZVxbgUAGdb/XUBU9ZaflU0cgFzfTeDMZN3QTGuK4ymtTGzjkRsDg3SufjSYrSnQzJI/kp001ILQy1mljybkP+mPnPrmWhHLAZEq1gW2TPfSIqo55ojFEyjeBp5EKI7JGk5qfyc5Jcpd6MTAV4DTVSmuNdd/Prdh/dvWK6arJBs9qoy0Fde7eD6rZqLwgicz6Vaw/+hUvp4mWNM+igKOgknNCTFwnIF3KrAYjhMJwThgXkYAs+z9pVhmdJTyOCVNcc0DGBTlVWmmNQbxZ5FJeLRRuRhj1mhhnGotZXyDsqlRdriNR3KhsZZ2lcVTajHBjWlnUw+tuHFW5syWvWUEa6gJBhBRSAuWJjCmFRif49XofoWl9kxgWErw75IaUw0nFCxrHxmlURhtDCrAIckir1pQCWSLLklyu23Zg8/bZaApKtKQ1ylCjtW3mb1Q1uHxfytbjl1RBxS3xp2Tv7zqwYb9nQ52mpEhLBdIPgnMK2tmQhDaiuVzYM5THNkKbPf/tbHpFUVREGJvLJbMB2d+gVgDcIP2L2rp+XXx8amq8oim/VclmK1dGK2l5uXU1ltvSDXNPa6M0tSqJuUpkgmzfbBSaLyYHK0qzemSKCoz+59n3MtpWpxOdelUuFRo4U0mEGH3nncQAlZNBPrVt/bq4+JTUuJhdGdvWbCqHa0EZow01WsS4NwgN1u1jd2kzlMWMsspacmHduvi4VIpg9YayOVRrkaAQLSmVgnZoy6fxnbKCv2Zz2tQOHGlxwFf/WnlJ0fLwH6YZtNKaRNAJDYQJwRHh77wTS8mZ1e6npStVxb7iAsyxPjNlusawCarXNu7M3qU+5pUi0gklqYSpCH0V8a4XnrArjKG5uSfUpDylxmhr8dE+/P9RRG22V1XIDPENkCR05G45cedwp+NcNvH0DD5ZW5e0iN5mzNbIWcEkFwSGsRMg1PG9ZmgLiyZsDm8nNhAX/d3tzccPdrfGpikxfPWaDn7MAOo5MaXr/NXzSbvYwlnrXq6tMS5FiwS+w2urXVWSanORpFBnCK1PDVqZxPhHgt7hGn3CGCls7k3BFjpB+J6ZJtJ1fWuNf/v4C3weIGMB4ZhbgdwbsM+MqYD6V/B0LVjXSM/yLHjk26mrxeQMH1MAAwvFGvh4ZQ4DAzeFQYaoBwPQBfTEwubM8/ADJBD8pZSL4oRYduEWaLU6LzY2NQPYpiQuigbOWQgjtvCAEAiHPAbIIB2ij79pstfdkLHJDlAGi2APg8DB7sVZnAmwvVg1wAHglfKCAADuogIWAcZY3c0y2F49gnR+88GMJ162B5Z+ABAPMleUmgDmhN1PCy6EEcwBwE99zlUAE5kCYPKx+U35wPZJonKrrLPDr6evn/V5NuTZ7Jb3+mXUZYfHBmGrrICf4CKZ0bKeX4sbchoulUvkojiOHdkL9vrS6z6jZKbRp+jjaR8WxyHcQRYyaPQz10i7KT9JPv9N3vhgyheKq61v0P9xf67zpvCH70aYR3TutNXJCiD8/6D7oBhDMziGlWyEt4BzvOAwrLaboA62w77QTrVpLcCx5ZSmH/+HrRFDAzdIHyL4jRLXekAmqjd2Ag0dm9rbYmQOY6Ab0i+FSTMsY2wLMPAfgM2AOPgN5/zXdsIeY59P68g4QsBf6f8DxlgAAA== 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 0000000000000000000000000000000000000000..591653dc81c7268de9bc267978f9f50f1aff1672 GIT binary patch literal 5484 zcmZXYXIK;4x5h*7p#^CH0!R~-D!m0ljS4}KDn)`+DFRZZ1d$;9P&|MTARtAN4kEos z5s+R&m)@%Zq~4r!?}z`r_ruIQ^X#?P%zkFAcfa$CHhiQ*N6kSE008LpbYVt>YxO?| zB{AV#S(fAg0I*2w!Jx+eA9l0gv0OOw?wbV#lhe7m$*abz=Bw&L748{nO^rlw zOgM&o$~Sy@VV%Sklp1#7iDAO9XAx6xbYbWm^g~E5iZP~KH_r*en4l+EYoE~VK4Tx$ zb+u>d+q`d&sGCu-H=U7gUbQqS#_Z)4>^1uulXZk^kILdx1Ka@IioH&6F`Y z*PjD57-Fw-_=+owgdlXaAS^gW6RN#E0DFamjo~6_ygw&gx;yj^?L9iUgeze#A5Slk z;jBaI%Vk|s-?vy?t+z}BGPn0&HI6v_`H7YMwzRl7!Vc{M?*Lg!Q#u~=6s6r^AUgW< zZq?5mF|0p6fYH{0%(^ZkoXa|xkCm03=f4q^rNEbE3Y}3fN)q<0wPG@AuA=oceyBMG z`O~0MpJQKqUp+|Y(G?iBLhL-?`kG;hse;|a4)!q(5^H4vu4kd3>{q^_b$d2XNft|G za7C;C$LevSrB_jo@k_WPukK3ClgRy`_tsS&3x9P{>8|MaX2OoXrV0=%Im-mNB%$6+ zfQF4~&IiOznlI>_<3E|AN=k~>T%voI`x)86%T-bmw0d274r05zIHheP9%6N5k3V2l zkG-c*UY%0YIvB{(vi)Y`Zb^AFuF-Yj8`Uxw8@ME+wdP!(`+F|6>+FcRFq4%0Sl#^i zq?02_7k7pBajp9LBQT6%LOa>fz^JE}R24*iGM&(NN|$l@kh3RO9`G{vgH!L2lMzCa zPu_o0yp22Km~{Md09+qang|{Gb>duV;_O)1&C3F77Kb-jo=lkFFZVJu3{9NAd`7Hz ziGG57UG>)6hLGIM4k+xR;a4x~oHS3))tm-cOp#Dp!OR&IA-lD-sy50;Y@ ziW4ls!-Czf_-&-4?gV2TpS0=rU#$k!eVJ~MvxTdth)<;?>8VKaYGU;Qwl84u|GbNX zXNu)96$dzNXP}Sr1Uu$Ut@P#o;DA^0M1V^)3gWml^dXoMv~%2FDbw9b)!cS+9(mC$ z4h(on)J!pWFkE`LT2`oJ$8CSN|;_zmtaw>Jg zPMqk*4k0hl-$$QZ2LjA1I&1X5bq`QL4xFBP6E- z4<7^-_Wmd8!RaYZNNx#$Mg}UhQP|Te<~DheWrr5g*ZJ&Sb+ZxG_}7_qpbsrF>j@GJU2D>rxnW%8O>u zrIcFFN#E3L3J>?>VhBfDZFD`)9}b?JPklcqBps%jNbdzGk*fOed)uYVM*b|RHNNou zVmd#SDruoqeVEaG3Rmivd_cyOPqQJnas}^WbS5^=4dN}Z%1uY{ExdUWE4{J_4^YPp z$lhjo^dd2L*0194`AaWKB${!7GxPPsHQM|N&7upjluJIg=owd#54Bf*SO@A{8%2iS z3YtGR=s%e`EgcSL-Y?gtzh)wrYRE|F#8|mG;JkwF7L)QoDz%&BLf(`|yrcs}Lgj0O z;{?eragjOi@gDW4Q?hp_`mU%Bsrf{*uny!og# zvY)2rB1g%yf$RyTVT&5hwf@f|QJvi6=F-GW>Q*1S3jzi+WVp?p{|%uF`;8N6}- zlb?K_GzBH3?kG5K($IBhVA4610twA2?^v#y9iT%u1ijVx73tXUO7D4ZrTm*3*`8j3 zGr;ikn-H9janVS|r2gtxA8}3e5nOOhWT(?rco*qAJ2y`;Aj$6Drs4y~efree@G9R> zE2Yr%Ta9gZ&gb!x2i3o%++HEgz@S&iy?j~n?()R1ZT zQr`cLgw)Pj72`(Yx;<0p{wniq(Uv#!Z~jwV1tzn(C2wIz`9q;9mA1bTUmCtwMf)BQ z$w6Hbm%R`x-KA_9j@yMtA-J`>X9GFnqKf&`)I7Jtx zEs~ZPhWB_K6ETvy{{dgV93=na)BAiz2*Ea}MTS=i6sdXAf#^WMM7vtNaBj21Jshis z2ndH}%GcUm9I%_clp48 z+Yc_6yVPO4$2%e~WEg#Hd31Fj$+6FtmOIt(GQW7Xi3>Vw#^4TbbV-3V3WEHl5!Nrw z`COMEe3MDh0nRmyPuPp;+7GezSI&H{(ovK@Owz4LUB%_1?!^YS&fO^Y z3@d1`!;yia}F-9OEif_n_wbL^W*DlQdcjJ){L^f5xSx@v~=BA%A4ZBIw- zh3sCSskIhJn>Xwa*Lq>%aNzQWZfieQS_yN;e>as!xG+ShL}GEA^>Y7Ol#>11uk@EF zMyT0y17Di0AbeK81<&;P+~DY%<($Re7T9Y8o1)+gn`&7~hF!Ovmfzb-JQp&%JM)8H zro+=Y=LtsIep87Au`6)XS|qFmapvHT*|Te;+jt%Y7z$s5BDv>lXy!Cn7yxp9`kW+T zp*CQctxnrKwr&)$Wbo3 zxhb|zrAN|X)Zm#gLz4Hj%eFeGWp^$t`8L0$IiGxC#6x$?M~PmNhx2otQQS{uugq-V zp1cVU`&ROr4s5o@d3F`yMC|Dbd88PE0;E4Ua9b#f9-K*->s(i9Bd9LiQF=^NOw?DD zl=VkDyRovHsu#)tj9|vdl@0&=_+%>#rOBQZ@3C}jjs7`nrb@wv%pbJXehws4SFXx9 zP%&ZiH?`S4krv=%JvfVT>3h}^=`lAexl@i45yMN8XxrYKKNYdZ!FtX<*?BBalS43PM5d0 ztID?L4}yOXQ;mwfeT}q5BeW~3Z&ha?Q3iEx=V<{Kx;UTLiQSIeShw>EaiZHT@+Yxk zZVprozgE2yEThg;5%}1qfK@`&qTut@PWzOHYJxD^)ksG~F-qaePnAZRA|~xqqfc!& zmFoUlxS;C2l_wXB4}<5KVW78)HU0d_p6v48{Pj)Tl@gFC$q|QU z3Vm+iTsQc%L@2>02HT)Z-#7NM@=z8K_O!*nJVJs}iO_g8`U#xTOl^_V;M57?NN2yu z0wsqy^lWo%>E@7bRC3RcQAqkGs0cpeU)WUqeN9cdbV50!?btOqpfnjmOVVetyFR(+IjOE$0vW z*pI5X0=+?e)LesQn~M^GuDd50pct$r&ngO6!Uzh{4= zKrtO`)Jm0}+FRpDW=L#X$i~wU7VF{$OT@3@+w^LtfW&cDVCW+uky}y35c6GM=v6~m z9>MoDx_a=ywzLe38%``xO-b01i%4k;PF?RM0~c&1=_?DK#Ykz8VEQ7qBzt|K*}Yb- z+L#E$^kdP<T5YzgoA&x@cL@bV6N3S&T%1d7d_F6V;MuppziNuSN$=1ebw$8~kg1rUq4IFgIUu zjozpzu;^$jW}09?qn;7``O}u!yT(L-rOi~*GB!qmYcb5IK0owkJ~`-gUQn(N#YYCnA*nVW|DFr5~U5sS)i^o_X z0Fq1lVeyxq{xpe~VTaJ;zT&vn^lr72>&@3_;i>oO$%@L^$k&-0>e!>*P>L~61@TrVTblz@bgum*JIZ^`Izr^aKcl@=jA+RpAAm>0l3)Ru=qIkJH)j^h`!}@K zn-ca0SMN@{5}IOewx?Ya+;PWmV9{!Q>)*vSN6bjy|8USUjuYCIR@qzhMpOTA*q{D> zZmL?A`Yr7fg^+--@}S$S^JNF-@ep(bF}l$ox9Py8oV1vvVW58A>2=c?8wo?@p}{t_ zmsuW$x|#>cc3O_UsI0@c!Ft=VHAS&EuecC`0RLiL?`CN;viZr9B&&JaHVsiW<#DXBg2(H zoIZNRMT8#0(WqUgA9P@h2LXU^#dnYj7@LV%!YkQ~&_6TJm*bys+D;CDYgAv%0)O5d zt?gg2kQsaj8b+==kE>a=HJUb?oX@D`{G6}wo*B(qkd2b8Zurh~IlgG$5^?ow~bq&2)33(Tx?KpAnAHWtfH}I1uWVq=}w7M!YC-M-&XHkmFG%XRo!QM=Z zj^RebnX`^ts!vC{YmBfVTx)sMgCk8!se>VJPWnk*wgw|ssofmXluWA1a3Og;OzgpZ;0!er7EBjtsKJ_Yvpo40_g zg;D?j|9UX(9!Nrv&XMyZh!obzI~T;97HC!Z0by*bu9P`7r|jf1C3l|v`rd)^{zCIk z$R2-@>=5o@xa5=?s61OXcz;zqGmGwp%*93f(8h1+*Nw^yS|+uB9M!;=U5-e%lR`5N zK-k>fo6OMl&|Qy3mDI(b75VC5K##2-^MGW!TB%x-bX2>U_j09q%UE0!KGO$H5?0~K zOBQs+tz&~QX^Ax|Q|fB8F&cen$TsnDC2o_4G&Mz-#QD%027CIL+DNmdu98gT<354? z{r>B(DSar1NLuQDb2}sSf3m`6mEk)1;|Bj3Og9HiV0{0d2$u_b7 jVnPCa{NG@(?}lVqTkfxl7fx0LiVD!vdIbBTVT<}Ns40f| literal 0 HcmV?d00001 diff --git a/assets/icon-192.png b/assets/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..17357e3d9dcf6f0fe5d708876c4ccd55f4be2aae GIT binary patch literal 5451 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 literal 0 HcmV?d00001 diff --git a/assets/icon-512.png b/assets/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..c02d04a40fcebc457910e7f64b355246c6d855de GIT binary patch literal 16106 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�j^cvr=@(3+bCRc>AddO8tQ( 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 F{{X0p@frXC literal 0 HcmV?d00001 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 @@ +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 \ 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