{"id":13608626,"url":"https://github.com/Jackojc/cane","last_synced_at":"2025-04-12T17:32:17.667Z","repository":{"id":37454558,"uuid":"483377100","full_name":"Jackojc/cane","owner":"Jackojc","description":"A small MIDI sequencer DSL designed around vectors and euclidean rhythms","archived":false,"fork":false,"pushed_at":"2024-05-22T21:44:01.000Z","size":2427,"stargazers_count":84,"open_issues_count":7,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-07T14:41:36.303Z","etag":null,"topics":["cane","composition","cpp","dsl","euclidean-rhythms","jackaudio","linux-audio","midi","minimalist","music","music-tracker","notation","pipewire","proglangs-discord","programming-language","rhythms","sequencer","song","tracker","vector-language"],"latest_commit_sha":null,"homepage":"https://discord.gg/UVYAtpYYD2","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jackojc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"Jackojc","patreon":"jackojc","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":"Jackojc","issuehunt":null,"otechie":null,"custom":null}},"created_at":"2022-04-19T19:10:34.000Z","updated_at":"2024-11-03T03:38:38.000Z","dependencies_parsed_at":"2024-01-06T10:17:36.889Z","dependency_job_id":"43661930-a14d-453b-ae5b-b7130b0f6659","html_url":"https://github.com/Jackojc/cane","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jackojc%2Fcane","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jackojc%2Fcane/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jackojc%2Fcane/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jackojc%2Fcane/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jackojc","download_url":"https://codeload.github.com/Jackojc/cane/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248605220,"owners_count":21132129,"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","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":["cane","composition","cpp","dsl","euclidean-rhythms","jackaudio","linux-audio","midi","minimalist","music","music-tracker","notation","pipewire","proglangs-discord","programming-language","rhythms","sequencer","song","tracker","vector-language"],"created_at":"2024-08-01T19:01:28.754Z","updated_at":"2025-04-12T17:32:12.658Z","avatar_url":"https://github.com/Jackojc.png","language":"C++","funding_links":["https://github.com/sponsors/Jackojc","https://patreon.com/jackojc","https://liberapay.com/Jackojc"],"categories":["Uncategorized","Languages","Music Programming","Other"],"sub_categories":["Uncategorized"],"readme":"# cane\n\u003e The beatings will continue until a banger is made\n\nCane is a small vector language designed for making beats with realtime MIDI.\n\n![c++](https://img.shields.io/badge/c%2B%2B-17-blue.svg?style=flat)\n[![issues](https://img.shields.io/github/issues/Jackojc/cane.svg?style=flat)](https://github.com/Jackojc/cane/issues)\n[![pull requests](https://img.shields.io/github/issues-pr/Jackojc/cane?style=flat)](https://github.com/Jackojc/cane/pulls)\n[![license](https://img.shields.io/github/license/Jackojc/cane.svg?style=flat)](./LICENSE)\n[![discord](https://img.shields.io/discord/997102432133849088.svg?label=discord\u0026style=flat)](https://discord.gg/UVYAtpYYD2)\n\n### Example\n```\n# Constants\nlet\n\tbpm 120\n\tnote 60 # Middle C\n\nlet\n\tqn bpm * 4 # Quarter Note\n\thn bpm * 2 # Half Note\n\tfn bpm     # Full Note\n\n# MIDI Channels\nlet\n\tc_bd 1 # Bass Drum\n\tc_cl 2 # Clap\n\tc_sh 3 # Shaker\n\tc_ch 4 # Closed HiHat\n\tc_oh 6 # Open HiHat\n\n# Notes\nlet\n\tbd 69 # c_bd: Bass Drum\n\tcl 69 # c_cl: Clap\n\tsh 58 # c_sh: Shaker\n\tch 69 # c_ch: Closed HiHat\n\toh 69 # c_oh: Open HiHat\n\n# French House\n!... !... !... !... map bd @ qn ~\u003e c_bd $\n.... !... .... !... map cl @ qn ~\u003e c_cl $\n!!!. !.!! !!!. !.!! map sh @ qn ~\u003e c_sh $\n!!!! !!!! !!!! !!!! map ch @ qn ~\u003e c_ch $\n.!.! .!.! .!.! .!.! map oh @ qn ~\u003e c_oh\n```\n\n### What Can Cane Do?\n- Control hardware and software synths through [JACK](https://jackaudio.org/) MIDI\n- Play chords and melodies\n- Generate complex beats with relatively little effort\n- Embeddable in larger projects\n- Create polyrhythms and polymeters\n- Live-coding (TODO)\n\n### Introduction \u0026 Reference\nSee the introduction [here](doc/intro.md)\nand see the reference [here](doc/ref.md).\n\nThe EBNF grammar is [here](doc/syntax.ebnf).\n\n### Requirements\n- [JACK](https://jackaudio.org/) _or_ [PipeWire](https://pipewire.org/)\n- [a2jmidid](https://github.com/jackaudio/a2jmidid) (Optional for ALSA MIDI support)\n- [conflict](https://github.com/qookei/conflict) (Included as a git submodule)\n\n### Build \u0026 Run\nMake sure to use a c++-17 compliant compiler.\n```sh\ngit clone --recursive https://github.com/Jackojc/cane \u0026\u0026 cd cane\nmake dbg=no\n./build/cane \u003c foo.cn\n```\n\n### Rationale\nCane is a project born out of frustration with existing tools. DAWs and other\nsequencing software generally don't favour a rapid iterative/experimental workflow.\nI want to be able to edit all parts of my song in the same place while listening\nto it play in realtime. This is generally just not possible with other tools or is\nawkward to use. I also want to favour use of the keyboard since I can type faster\nthan I can hunt down context menus with the pointer which, again, allows for a very\nquick iterative approach to writing music.\n\nMost music software also tends to favour a very western influenced style of writing\nand hinders more exotic compositions. Cane tries to stay fairly agnostic to any\nparticular style and allows for interesting rhythms and arrangements that would\notherwise not be possible in a traditional DAW. Tempo in Cane can be varied throughout\nthe song for example or sequences can easily play at many different tempos concurrently.\nThe important point to note here is that this is all _easy_ in Cane.\n\n### Design\n- Cane is intentionally designed to be turing incomplete: all sequences should\nterminate. This makes the language deterministic and keeps the implementation\nsimple\n- Cane is designed to enable an experimental and iterative workflow, one where you\nmore often spend time removing things than adding them\n- [JACK](https://jackaudio.org/) was chosen as the backend for MIDI transport for its low latency properties\nwhich make it desirable for realtime use\n\n### Acknowledgements\n- [Gwion](https://github.com/Gwion/Gwion)\n- [Prop](https://pbat.ch/proj/prop.html)\n- [fennecdjay](https://github.com/fennecdjay) (for inspiring the project)\n- [qookei](https://github.com/qookei) (for conflict)\n\n### Resources\nSee the list of resources [here](doc/resources.md)\n\n### License\nThis project uses the GPL-3.0 license. (check [LICENSE](LICENSE))\n\n### Progress \u0026 Discussion\nYou can join the discord server in order to follow progress and/or contribute to discussion of the project: https://discord.gg/UVYAtpYYD2\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJackojc%2Fcane","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FJackojc%2Fcane","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FJackojc%2Fcane/lists"}