{"id":27808260,"url":"https://github.com/superauguste/zenpaper","last_synced_at":"2025-10-08T16:55:36.175Z","repository":{"id":287989070,"uuid":"955707043","full_name":"SuperAuguste/zenpaper","owner":"SuperAuguste","description":"WIP CLI xenpaper implementation","archived":false,"fork":false,"pushed_at":"2025-05-03T18:54:58.000Z","size":172,"stargazers_count":4,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-28T19:05:20.239Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Zig","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SuperAuguste.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-27T04:15:38.000Z","updated_at":"2025-04-26T00:31:44.000Z","dependencies_parsed_at":"2025-04-15T01:46:04.791Z","dependency_job_id":"5d2837e6-9ad9-44c7-a273-615ca74a7989","html_url":"https://github.com/SuperAuguste/zenpaper","commit_stats":null,"previous_names":["superauguste/zenpaper"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SuperAuguste/zenpaper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SuperAuguste%2Fzenpaper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SuperAuguste%2Fzenpaper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SuperAuguste%2Fzenpaper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SuperAuguste%2Fzenpaper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SuperAuguste","download_url":"https://codeload.github.com/SuperAuguste/zenpaper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SuperAuguste%2Fzenpaper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278981513,"owners_count":26079640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-01T10:25:43.702Z","updated_at":"2025-10-08T16:55:36.144Z","avatar_url":"https://github.com/SuperAuguste.png","language":"Zig","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- omit in toc --\u003e\n# zenpaper\n\nA work-in-progress CLI implementation of [xenpaper](https://github.com/dxinteractive/xenpaper) written in Zig.\n\n[Check out the original!](https://dxinteractive.github.io/xenpaper/)\n\n\u003c!-- omit in toc --\u003e\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Features](#features)\n  - [Differences from Xenpaper](#differences-from-xenpaper)\n- [License](#license)\n\n## Installation\n\nNo binaries yet, I need to set up CI for that - sorry!\n\n[Install Zig 0.14.0](https://ziglang.org/download/#release-0.14.0), then:\n\n```bash\ngit clone https://github.com/SuperAuguste/zenpaper\nzig build\n./zig-out/bin/zenpaper play examples/hello.zp\n```\n\nAdd zenpaper to your path for ease of invocation.\n\nIf you're developing zenpaper and want to build *and* run, you can do the following:\n```bash\nzig build run -- play examples/hello.zp\n```\n\n## Usage\n\n```bash\n# Plays your lil tune \nzenpaper play my_tune.zp\n```\n\n## Features\n\n- [x] Comments\n- [x] Notes\n  - [x] Scale degrees\n  - [x] Ratios\n  - [x] Cents\n  - [x] Equal divisions of an octave\n  - [x] Equal divisions of an equave\n  - [x] Hertz\n  - [x] Equave shifts\n  - [x] Holds\n- [x] Rests\n- [x] Chords\n  - [x] Bracketed\n  - [x] Multi-ratios\n- [x] Scales\n  - [x] Equal divisions of the octave\n  - [x] Equal divisions of the equave\n  - [x] Individual pitches\n  - [x] Equave specification\n  - [x] Multi-ratios\n  - [x] Modes\n- [x] Root frequency\n- [ ] Setters\n  - [ ] Tempo\n  - [ ] Divisions of beat\n  - [ ] Divisions of beat shorthand\n  - [ ] Sound\n  - [ ] ADSR (envelope)\n- [ ] Ruler\n- [ ] Error reporting\n  - [x] Parsing\n  - [ ] AST to spool\n- [ ] Editor support\n  - [ ] Highlighting\n  - [ ] Frequency tooltips\n- [ ] Runtime highlighting\n\n### Differences from Xenpaper\n\n- You can equave-shift chords, so something like `'1:2:3` or `\"[0 3 5]` is permissible\n- Likewise, you can equave-shift scales; this uses the equave from before the new scale and is also\n  applied to the new equave\n  - This also works on the `{...edo}` and `{...ed...}` shorthands, though these preserve their original unshifted equaves\n  - TODO: this behavior is sort of buggy and weird and I'm not sure it's desirable - maybe we should preserve equave shifts on chords and ban it for scales?\n- Like in xenpaper, you cannot equave shift root frequencies (shift the note rather than the root frequency expression)\n- The default root frequency is `220hz`. This is [actually what Xenpaper's root frequency is](https://github.com/dxinteractive/xenpaper/blob/4684a16be8f2ceaa387406ad5abc67c6862bc341/packages/xenpaper-ui/src/data/process-grammar.ts#L659) despite\nthe docs saying otherwise, so this is not really a difference\n- Descending multi-ratios behave correctly (e.g. 3::1 and 3:2:1 are equivalent)\n- My ADSR is really questionable and does not match xenpaper's - I'll have to look at \n  tonejs' ADSR and replicate that\n\nYou'll notice that the most of the above differences are strict *additions*.\n \nIt may be wise to consider reworking the language grammar at a point in the future (potentially\nbreaking backwards compatibility) for simplicity of implementation and usage. Here's an example \nof a slightly awkward ambiguity (in my opinion): `1.2.3` vs `1.2.3hz` where the first statement is\nsemantically equivalent to `1 . 2 . 3` and the second to `1 . 2.3hz`. Other ambiguous\nstatements only works in root and are disallowed in chords and scales in both xenpaper and zenpaper,\ne.g. `123hz10`.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuperauguste%2Fzenpaper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuperauguste%2Fzenpaper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuperauguste%2Fzenpaper/lists"}