πΌ Devalang, by Devaloop Labs
πΆ Compose music with code β structured, expressive, and fast.
Devalang is a tiny domain-specific language (DSL) for music makers, sound designers, and audio hackers. Compose loops, control samples, render and play audio β all in clean, readable text.
π¦ Whether you're building a track, shaping textures, or performing live, Devalang helps you think in rhythms. Itβs designed to be simple, expressive, and fast β because your ideas shouldnβt wait.
From studio sketches to live sets, Devalang gives you rhythmic control β with the elegance of code.
π§ v0.0.1-alpha.9 Notice π§
NEW: Devalang VSCode extension is now available ! Get it here.
Includes synthesis, playback, and rendering features, but is still in early development.
Currently, Devalang CLI is only available for Windows.
Linux and macOS binaries will be added in future releases via cross-platform builds.
π Quick Access
β Why Devalang?
- πΉ Prototype audio ideas without opening a DAW
- π» Integrate sound into code-based workflows
- ποΈ Control audio parameters through readable syntax
- π§ͺ Build musical logic with variables and conditions
Producer, coder, or both β Devalang gives you musical structure, instantly.
π Features
- π΅ Audio Engine: Integrated audio playback and rendering
- π§© Module system for importing and exporting variables between files
- π Structured AST generation for debugging and future compilation
- π’ Basic data types: strings, numbers, booleans, maps, arrays
- ποΈ Watch mode for
build,checkandplaycommands - π Project templates for quick setup
- ποΈ Custom samples: easily load and trigger your own audio files
- π Looping and grouping: create complex patterns with ease
π Installation
For users
- β οΈ Requires Node.js 18+
Install the package globally (NPM)
Usage without install (NPX)
For contributors
- β οΈ Requires Node.js 18+
- β οΈ Requires Rust 1.70+
Development usage (you can customize arguments in package.json)
# For syntax checking test
# For building test
β Usage
NOTE: Commands are available via devalang or npx @devaloop/devalang.
NOTE: Arguments can be passed to commands using --<argument> syntax. You can also use a configuration file to set default values for various settings, making it easier to manage your Devalang project.
NOTE: Some commands require a mandatory --entry argument to specify the input folder, and a --output argument to specify the output folder. If not specified, they default to ./src and ./output respectively.
For more examples, see docs/COMMANDS.md
Initialize a new project
In the current directory
Or use optional arguments to specify a directory name and a template
Checking syntax only
Building output files
Playing audio files (once by file change)
Playing audio files (continuous playback, even without file changes)
βοΈ Configuration
You can use a configuration file to set default values for various settings, making it easier to manage your Devalang project.
To do this, create a .devalang file in the root of your project directory.
See docs/CONFIG.md for more information.
π Syntax example
For more examples, see docs/SYNTAX.md
# index.deva
@import { globalBpm, globalBank, kickDuration } from "global.deva"
@load "./examples/samples/kick-808.wav" as customKick
bpm globalBpm
# Will declare the tempo at the globalBpm variable beats per minute
bank globalBank
# Will declare a custom instrument bank using the globalBank variable
loop 5:
.customKick kickDuration {reverb=50, drive=25}
# Will play 5 times a custom sample for 500ms with reverb and overdrive effects
group myGroup:
.customKick kickDuration {reverb=50, drive=25}
# Will play the same sample in a group, allowing for more complex patterns
call myGroup
# Will be executed line by line (sequentially)
# spawn myGroup
# Will be executed in parallel (concurrently)
# β οΈ Note: `spawn` runs the entire group in parallel, but the groupβs internal logic remains sequential unless it uses `spawn` internally.
π§ Note:
callandspawnonly work withgroupblocks. They do not apply to individual samples or other statements.
# variables.deva
let globalBpm = 120
let globalBank = 808
let kickDuration = 500
@export { globalBpm, globalBank, kickDuration }
π§― Known issues
- No smart modules yet, all groups, variables, and samples must be explicitly imported where used
- No support yet for
pattern,function, ... statements - No support yet for cross-platform builds (Linux, macOS)
π§ͺ Roadmap Highlights
For more info, see docs/ROADMAP.md
- β³ Other statements (e.g
function,pattern, ...) - β³ Cross-platform support (Linux, macOS)
- β³ More built-in instruments (e.g. snare, hi-hat, etc.)
π‘οΈ License
MIT β see LICENSE
π€ Contributing
Contributions, bug reports and suggestions are welcome !
Feel free to open an issue or submit a pull request.
π’ Contact
π§ contact@devaloop.com