JSPM

  • Created
  • Published
  • Downloads 108
  • Score
    100M100P100Q64703F
  • License MIT

Write music like code. Devalang is a domain-specific language (DSL) for sound designers and music hackers. Compose, automate, and control sound β€” in plain text.

Package Exports

  • @devaloop/devalang
  • @devaloop/devalang/out-tsc/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@devaloop/devalang) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Devalang Logo

Rust TypeScript Node.js

Project Status Version License: MIT Platform

npm crates

VSCode Extension

🎼 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.

Currently, Devalang CLI is only available for Windows.
Linux and macOS binaries will be added in future releases via cross-platform builds.


πŸ“š Quick Access

πŸš€ 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

Install the package globally (NPM)

npm install -g @devaloop/devalang

Usage without install (NPX)

npx @devaloop/devalang <command>

For contributors

> 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)

# 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

Initialize a new project

In the current directory

devalang init

Or use optional arguments to specify a directory name and a template

devalang init --name <project-name> --template <template-name>

Checking syntax only

devalang check --watch

Building output files

devalang build --watch

Playing audio files (once by file change)

devalang play --watch

Playing audio files (continuous playback, even without file changes)

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 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)
# spawn myGroup
# 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

  • ⏳ 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

🀝 Contributing

Contributions, bug reports and suggestions are welcome !
Feel free to open an issue or submit a pull request.

πŸ“’ Contact

πŸ“§ contact@devaloop.com