{"id":13468980,"url":"https://github.com/chaosprint/glicol","last_synced_at":"2025-05-13T15:13:16.514Z","repository":{"id":38448065,"uuid":"279422587","full_name":"chaosprint/glicol","owner":"chaosprint","description":"Graph-oriented live coding language and music/audio DSP library written in Rust","archived":false,"fork":false,"pushed_at":"2025-04-06T14:42:57.000Z","size":113985,"stargazers_count":2647,"open_issues_count":48,"forks_count":84,"subscribers_count":35,"default_branch":"main","last_synced_at":"2025-04-23T21:44:50.757Z","etag":null,"topics":["audio","audio-programming","audioworklet","computer-music","dsp","instrument","javascript","live-coding","livecoding","music","rust","sound","synthesizer","wasm","web-audio","webassembly","webaudio"],"latest_commit_sha":null,"homepage":"https://glicol.org","language":"Rust","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/chaosprint.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yaml","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},"funding":{"github":["chaosprint"]}},"created_at":"2020-07-13T22:13:33.000Z","updated_at":"2025-04-23T20:49:49.000Z","dependencies_parsed_at":"2024-01-13T16:52:21.133Z","dependency_job_id":"a5669f5e-23dc-4a83-aae4-9fd67fe874d5","html_url":"https://github.com/chaosprint/glicol","commit_stats":{"total_commits":554,"total_committers":6,"mean_commits":92.33333333333333,"dds":0.04693140794223827,"last_synced_commit":"b1c3bc8a0662677dec4ed9c54d69d900c7ab5e1b"},"previous_names":[],"tags_count":107,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chaosprint%2Fglicol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chaosprint%2Fglicol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chaosprint%2Fglicol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chaosprint%2Fglicol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chaosprint","download_url":"https://codeload.github.com/chaosprint/glicol/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253969266,"owners_count":21992264,"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":["audio","audio-programming","audioworklet","computer-music","dsp","instrument","javascript","live-coding","livecoding","music","rust","sound","synthesizer","wasm","web-audio","webassembly","webaudio"],"created_at":"2024-07-31T15:01:23.402Z","updated_at":"2025-05-13T15:13:11.500Z","avatar_url":"https://github.com/chaosprint.png","language":"Rust","funding_links":["https://github.com/sponsors/chaosprint"],"categories":["Rust","Applications","应用程序 Applications","Other"],"sub_categories":["Audio and Music","音频和音乐 Audio and Music"],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://glicol.org\"\u003e\u003cimg src=\"https://github.com/glicol/glicol-logo/raw/main/logo.png\" width=\"200\" /\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://glicol.org\" target=\"_blank\"\u003e\u003cimg alt=\"website\" src=\"https://img.shields.io/badge/website-glicol.org-blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://glicol.js.org\" target=\"_blank\"\u003e\u003cimg alt=\"website\" src=\"https://img.shields.io/badge/npm%20docs-glicol.js.org-yellow\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://npmjs.com/glicol\" target=\"_blank\"\u003e\u003cimg alt=\"npm\" src=\"https://img.shields.io/npm/v/glicol\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/8tmK2bHcwa\" target=\"_blank\"\u003e\u003cimg alt=\"Discord\" src=\"https://img.shields.io/discord/963514061528662046\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/chaosprint/glicol/blob/main/LICENSE\"\u003e\u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/chaosprint/glicol\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\nGlicol (an acronym for \"graph-oriented live coding language\") is a computer music language with both its language and audio engine written in [Rust programming language](https://www.rust-lang.org/), a modern alternative to C/C++. Given this low-level nature, Glicol can run on many different platforms such as browsers, VST plugins and Bela board. Glicol's synth-like syntax and powerful audio engine also make it possible to combine high-level synth or sequencer control with low-level sample-accurate audio synthesis, all in real-time.\n\n\u003c!-- Glicol can be used for:\n- live coding performance, either in browsers with your friends or in a VST plugin(experimental)\n- education of electronic music, DSP and coding\n- audio/music app development in browsers, [either CDN or NPM](https://github.com/chaosprint/glicol/tree/main/js)\n- Rust audio library, running on Web, Desktop, [DAW](https://github.com/chaosprint/glicol/tree/main/rs/vst), [Bela](https://github.com/chaosprint/glicol/tree/main/rs/bela), etc. --\u003e\n\n## Get started\n\n### 🚀 The Web App\n \nThe easiest way to try Glicol:\n\nhttps://glicol.org\n\n\u003e There you can find guides, demos, docs, and apps for collaboration.\n\n\u003cdetails\u003e\n  \u003csummary\u003eFeatures\u003c/summary\u003e\n  \n  - Near-native, garbage-collection-free and memory-safe real-time audio in web browsers\n  \n  - Quick reference in consoles with `alt-d`\n  \n  - The web app automatically loads samples; you can also drag and drop local samples in the browser editor\n  \n  - Robust error handling: error reported in console, but previous music will continue!\n  \n  - Mix JavaScript code to create visuals with Hydra synth made by @ojack\n  \n  - What you see is what you get, i.e. declarative programmering for both code writing and executing: no need to select anything, just change the code and update, Glicol engine will use `LCS` algorithm to handle adding, updating and removing\n  \n  - Decentralised collaboration using `yjs` and a unique `be-ready` mechanism\n\u003c/details\u003e\n\n### 🎁 For Audio Dev\n\n|                 |               Description                               |\n|-----------------|:---------------------------------------------------------:|\n| [NPM Docs](https://glicol.js.org)       | Safe, performant, light-weight and ergonomic audio lib for web apps |\n| [Rust Audio Lib](https://github.com/chaosprint/glicol/tree/main/rs/synth)  | Write VST like [this Dattorro reverb plugin](https://github.com/chaosprint/dattorro-vst-rs)  |   \n| [Run on Bela](https://github.com/chaosprint/glicol/tree/main/rs/bela) | Run Glicol DSL on Bela board for quick audio prototyping.  |\n\n### 🍿 YouTube Channel\nFind Glicol demo videos [in this playlist](https://www.youtube.com/playlist?list=PLT4REhRBWaOOrLQxCg5Uw97gEpN-woo1c).\n\n## Philosophy of Glicol\n\nThe motivation of Glicol is:\n\n- to help people with zero knowledge of coding and music production to get started with live coding\n\n- to offer experienced music coders a tool for quick prototyping and hacking\n\nIn [NIME community](https://nime.org/), it is known as: \n\u003e low entry fee and high ceilings\n\nThis is Glicol's philosophy to approach these goals:\n\n- design the language from a new instrument design perspective\n\n- embrace the spirit of the internet for a better experience\n\nReflected in the implementation:\n\n- Glicol adopts a graph-oriented paradigm\n\n- Glicol can be used in browsers with zero-installation\n\n### Graph-oriented\n\nThe basic idea of Glicol is to connect different nodes like synth modules.\n\nAll you need to know is the audio input/output behaviour of each node.\n\nTwo ways for connecting: `\u003e\u003e` and `~reference`:\n```\n// amplitude modulation and lazy evaluation example\n// chain with ~ is a ref chain and will not be sent to the DAC\n\no: sin 440 \u003e\u003e mul ~amp\n~amp: sin 1.0 \u003e\u003e mul 0.3 \u003e\u003e add 0.5\n```\n\u003c!-- Sometimes, constraints make it easier to learn and use. --\u003e\n\nIt also applies to sequencer and sampler:\n```\n// sequencer pattern\n// first divide one bar with space\n// then further divide each part based on midi number and rest(_)\n\no: speed 2.0 \u003e\u003e seq 60 _~a _ 48__67\n\u003e\u003e sp \\blip\n\n// quantity alters probability\n~a: choose 60 60 0 0 72 72\n```\n\nAs mentioned above, you can try these examples on:\n\nhttps://glicol.org\n\nIf you want, you can even hear how a `seq` node work:\n```\no: speed 2.0 \u003e\u003e seq 60 _72 _ 48__67 \u003e\u003e mul 0.5\n```\n\nThis is actually analogous to how hardware module pass signals.\n\nIt is very easy to remember and to get started.\n\nWhen Glicol is used in education, we can let students see and hear each node, even including 'envelope'.\n\nJust leave the introduction of data types, `Object` or `Function` later when we mix JavaScript with Glicol.\n\n### Zero-installation\n\nFor the audio engine, instead of mapping it to existing audio lib like `SuperCollider`, I decide to do it the hard way:\n\n- write the parser in Rust\n\n- write the audio engine in Rust that works seamlessly with the AST processing\n\n- port it to browsers using `WebAssembly`, `AudioWorklet` and `SharedArrayBuffer`\n\nThe main reason is to explore performant audio in browsers for easy access and live coding collaboration.\n\nThe reward is that we now have an Rust audio lib called `glicol_synth`:\n\nIt can run on Web, Desktop, DAW, Bela board, etc.\n\nAnd one more thing.\n\nTo write everything from low-level also opens the door for `meta` node.\n\nNow I can explain to students, the `hello world` tone can also be written in this way:\n```\no: meta `\n    output.pad(128, 0.0);\n    for i in 0..128 {\n        output[i] = sin(2*PI()*phase) ;\n        phase += 440.0 / sr;\n    };\n    while phase \u003e 1.0 { phase -= 1.0 };\n    output\n`\n```\n\n## Roadmap\n\n- [x] `0.1.0` hello world from `dasp_graph` and `pest.rs`, pass code from js to wasm, and lazy evaluation\n- [x] `0.2.0` pass samples from js to wasm, support error handling, bpm control in console\n- [x] `0.3.0` build complex node `plate` reverb using basic node from glicol, using macro in Rust\n- [x] `0.4.0` use `LCS` algorithm and preprocessor for smooth and efficient whole graph updating\n- [x] `0.5.0` build `const_generics` to `dasp_graph` and use it in glicol, use `SharedArrayBuffer`, support local sample loading\n- [x] `0.6.0` refactor the code to modules: \n    - `glicol-main` = `glicol-synth` + `glicol-parser` + `glicol-ext`\n    - `glicol-ext` = `glicol-synth` + `glicol-parser` + `glicol-macro`\n    - `glicol-js` = `glicol-main` + `glicol-wasm`\n- [x] `0.7.0` support mixing js with glicol in `glicol-js` using Regex; add visualisation\n- [x] `0.8.0` embed `Rhai` in glicol 🎉\n- [x] `0.9.0` redesigned architecture; see the release note\n- [x] `0.10.0` run as a VST plugin\n- [x] `0.11.0` run on Bela\n- [x] `0.12.0` distribute as a `npm` package\n- [ ] better music expressions, more variation for `seq` nodes\n- [ ] exploring new forms of musical interactions\n\u003c!-- - [ ] midi support? used in vst? --\u003e\n\u003c!-- - [ ] examples for web audio, vst, bela, etc. --\u003e\n\n\u003e Note that Glicol is still highly experimental, so it can be risky for live performances. \n\u003e The API may also change before version 1.0.0.\n\nPlease let me know in [issues](https://github.com/chaosprint/glicol/issues) or [discussions](https://github.com/chaosprint/glicol/discussions):\n- your thoughts on the experience of glicol\n- new feature suggestion\n- bug report, especially the code that causes a `panic` in browser console\n- missing and confusion in guides and reference on the website\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchaosprint%2Fglicol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchaosprint%2Fglicol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchaosprint%2Fglicol/lists"}