πΌ 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.8 Notice π§
NEW: Devalang VSCode extension is now available ! Get it here.
NEW: Devalang supports conditional statements (
if,else,else if) for more dynamic compositions !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
# Loops
loop 5:
.customKick kickDuration {reverb=50, drive=25}
# Will play 5 times a custom sample for 500ms with reverb and overdrive effects
# Groups
group myGroup:
.customKick kickDuration {reverb=50, drive=25}
# Will play the same sample in a group, allowing for more complex patterns
# Will be executed line by line (sequentially)
call 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.
# spawn myGroup
π§ 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