<div align="center">
<img src="https://firebasestorage.googleapis.com/v0/b/devaloop-labs.firebasestorage.app/o/devalang-teal-logo.svg?alt=media&token=d2a5705a-1eba-4b49-88e6-895a761fb7f7" alt="Devalang Logo">
</div>









[](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
## πΌ Devalang, by **Devaloop Labs**
πΆ Compose music with code β simple, structured, sonic.
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.5 Notice** π§
>
> NEW: Devalang VSCode extension is now available !
> [Get it here](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode).
>
> Currently, Devalang CLI is only available for **Windows**.
> Linux and macOS binaries will be added in future releases via cross-platform builds.
---
## π Quick Access
- [π Documentation](./docs/)
- [π‘ Examples](./examples/)
- [π§© VSCode Extension](https://marketplace.visualstudio.com/items?itemName=devaloop.devalang-vscode)
- [π¨ Prettier Plugin](https://www.npmjs.com/package/@devaloop/prettier-plugin-devalang)
- [π Project Website](https://devalang.com)
## π 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`, `check` and `play` commands
- π **Project templates** for quick setup
## π Installation
### For users
> - β οΈ Requires [Node.js 18+](https://nodejs.org/en/download)
Install the package globally (NPM)
```bash
npm install -g @devaloop/devalang
```
Usage without install (NPX)
```bash
npx @devaloop/devalang <command>
```
### For contributors
> - β οΈ Requires [Node.js 18+](https://nodejs.org/en/download)
> - β οΈ Requires [Rust 1.70+](https://www.rust-lang.org/learn/get-started#installing-rust)
```bash
> git clone https://github.com/devaloop-labs/devalang.git
> cd devalang
> npm install
> cargo install --path .
```
Development usage (you can customize arguments in package.json)
```bash
# For syntax checking test
npm run rust:dev:check
# For building test
npm run rust:dev:build
```
## β 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](./docs/COMMANDS.md)
### Initialize a new project
In the current directory
```bash
devalang init
```
Or use optional arguments to specify a directory name and a template
```bash
devalang init --name <project-name> --template <template-name>
```
### Checking syntax only
```bash
devalang check --watch
```
### Building output files
```bash
devalang build --watch
```
### Playing audio files (once by file change)
```bash
devalang play --watch
```
### Playing audio files (continuous playback, even without file changes)
```bash
devalang play --repeat
```
## βοΈ 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](./docs/CONFIG.md) for more information.
## π Syntax example
For more examples, see [docs/SYNTAX.md](./docs/SYNTAX.md)
```deva
# 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)
# spawn myGroup
```
```deva
# variables.deva
let globalBpm = 120
let globalBank = 808
let kickDuration = 500
@export { globalBpm, globalBank, kickDuration }
```
## π§― Known issues
- No support yet for `if`, `else`, `else if`, `pattern`, `function`, ... statements
- No support yet for cross-platform builds (Linux, macOS)
## π§ͺ Roadmap Highlights
For more info, see [docs/ROADMAP.md](./docs/ROADMAP.md)
- β³ Other statements (e.g `if`, `function`, ...)
- β³ Cross-platform support (Linux, macOS)
- β³ More built-in instruments (e.g. snare, hi-hat, etc.)
## π‘οΈ License
MIT β see [LICENSE](./LICENSE)
## π€ Contributing
Contributions, bug reports and suggestions are welcome !
Feel free to open an issue or submit a pull request.
## π’ Contact
π§ [contact@devaloop.com](mailto:contact@devaloop.com)