{"id":29675672,"url":"https://github.com/treethought/obsidian-livecoding","last_synced_at":"2025-08-12T00:05:41.092Z","repository":{"id":301291518,"uuid":"1005307997","full_name":"treethought/obsidian-livecoding","owner":"treethought","description":"ALGORAVE from your Obsidian vault","archived":false,"fork":false,"pushed_at":"2025-06-27T02:45:53.000Z","size":99,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-22T23:49:45.915Z","etag":null,"topics":["algorave","hydra","livecoding","strudel"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/treethought.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-06-20T02:59:56.000Z","updated_at":"2025-07-13T11:05:55.000Z","dependencies_parsed_at":"2025-06-26T05:42:22.491Z","dependency_job_id":null,"html_url":"https://github.com/treethought/obsidian-livecoding","commit_stats":null,"previous_names":["treethought/obsidian-livecoding"],"tags_count":2,"template":false,"template_full_name":"obsidianmd/obsidian-sample-plugin","purl":"pkg:github/treethought/obsidian-livecoding","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treethought%2Fobsidian-livecoding","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treethought%2Fobsidian-livecoding/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treethought%2Fobsidian-livecoding/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treethought%2Fobsidian-livecoding/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/treethought","download_url":"https://codeload.github.com/treethought/obsidian-livecoding/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/treethought%2Fobsidian-livecoding/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269976788,"owners_count":24506466,"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-08-11T02:00:10.019Z","response_time":75,"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":["algorave","hydra","livecoding","strudel"],"created_at":"2025-07-22T23:31:12.321Z","updated_at":"2025-08-12T00:05:41.067Z","avatar_url":"https://github.com/treethought.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Obsidian Livecoding\n\n[Obsidian](https://obsidian.md/) plugin for live coding music and visuals with [Strudel](https://strudel.cc/workshop/getting-started/) and [Hydra](https://hydra.ojack.xyz/).\n\n\n![Screenshot_20250625_212632](https://github.com/user-attachments/assets/210262db-2764-4c20-a612-04be315671b6)\n\n## Usage\n\nWrite Strudel or Hydra code in `js` code blocks. Use `Shift+Ctrl+E` to evaluate the code block where your cursor is positioned. \n\nYou can have multiple code blocks in a single note - only the block containing your cursor will be evaluated. Code is evaluated directly as written, so both Strudel and Hydra evaluated code will replace the previously evaluated code for each respectively.\n\n\nPaste this README into note as an example.\n\n**Strudel:**\n\n```js\nsetCpm(20)\n\n$DRUMS: stack(\ns(\"bd(4, 4)\").struct(\"t(6, 8)\"),\ns(\"[hc house](6, 8)\").jux(rev).struct(\"f(5, 8)\"),\n)\n.jux((x)=\u003ex.room(\"0 .. 0.2\"))\n.delay(0.1)\n.lpf(2900)\n.swing(\"1/3\", 4)\n\n$MELODY: n(\"0 2 4 \u003c[6,8] [7,9]\u003e\".off(1/8, x=\u003ex.add(\"4 12 \u003c7 5\u003e 17\")))\n.scale(\"\u003cC G\u003e:minor\").sound(\"piano\")\n.off(1/4, x=\u003ex.s(\"gm_steel_drums\")\n\t.sometimes(ply(3)).room(0.5))\n.room(0.8)\n.size(0.3)\n.swing(\"1/3\", 4)\n```\n\n**Hydra:**\nNote that Hydra is loaded via Strudel, so you must call `initHydra`.\n\n```js\nawait initHydra()\nlet pat = \"4 2 [8 .. 16] 6 6\"\nlet pat2 = \"\u003c[0.2 0.7] [0.8 0.1] 0 3\u003e\".add(0.1)\nnoise(H(pat), 0.8, H(pat2))\n.modulate(osc(10000,1).modulate(osc().luma(0.8), 0.8))\n.mult(osc(H(pat2), 0.9, 0.2))\n.blend(shape(H(\"\u003c5 4 3 6 5 4 3\u003e\")).rotate(0, 0.8).repeat(4,4).saturate(H(pat),H(pat2)), H(\"0.1 .. 0.9\"))\n.blend(o0).modulate(o0)\n.out()\n```\n\n## Commands\n\n| Command | Key Binding | Description |\n|---------|-------------|-------------|\n| **Enable RAVE** | - | Enables live coding mode to evaluate js code |\n| **Evaluate Block** | `Shift+Ctrl+E` or `Shift+Ctrl+Enter` | Evaluate code block at cursor |\n| **HUSH** | `Shift+Ctrl+H` | Stop all sounds |\n| **Stop** | `Shift+Ctrl+X` | Stop Strudel and Hydra and disable RAVE mode|\n| **Toggle Hydra Style** | `Shift+Alt+H` | Start/stop Hydra visuals |\n| **Open Block in Strudel** | - | Open current code block in Strudel web interface |\n| **Save Revision** | - | Save current code block strudel URL as revision in frontmatter |\n| **Strudel Web Clipper Template** | - | Show Obsidian Web Clipper template for clipping code from Strudel REPL |\n\n## Installation\n\nEither install manually, or use [BRAT](https://github.com/TfTHacker/obsidian42-brat)\n\n1. Download the latest release\n2. Extract to VaultFolder/.obsidian/plugins/obsidian-livecoding/\n3. Enable the plugin in Obsidian settings\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreethought%2Fobsidian-livecoding","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftreethought%2Fobsidian-livecoding","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftreethought%2Fobsidian-livecoding/lists"}