@devaloop/devalang 0.0.1-alpha.14 → 0.0.1-alpha.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/.devalang +10 -8
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +32 -15
  5. package/docs/CHANGELOG.md +93 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +2 -2
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +42 -0
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +39 -25
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +16 -0
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -456
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -8
  38. package/rust/common/cdn.rs +3 -6
  39. package/rust/common/mod.rs +3 -3
  40. package/rust/common/sso.rs +3 -6
  41. package/rust/config/driver.rs +118 -94
  42. package/rust/config/loader.rs +165 -156
  43. package/rust/config/mod.rs +4 -2
  44. package/rust/config/settings.rs +91 -0
  45. package/rust/config/stats.rs +257 -0
  46. package/rust/core/audio/engine.rs +696 -518
  47. package/rust/core/audio/evaluator.rs +263 -31
  48. package/rust/core/audio/interpreter/arrow_call.rs +198 -161
  49. package/rust/core/audio/interpreter/automate.rs +18 -0
  50. package/rust/core/audio/interpreter/call.rs +98 -95
  51. package/rust/core/audio/interpreter/condition.rs +70 -71
  52. package/rust/core/audio/interpreter/driver.rs +487 -198
  53. package/rust/core/audio/interpreter/function.rs +26 -21
  54. package/rust/core/audio/interpreter/let_.rs +38 -19
  55. package/rust/core/audio/interpreter/load.rs +18 -18
  56. package/rust/core/audio/interpreter/loop_.rs +113 -73
  57. package/rust/core/audio/interpreter/mod.rs +14 -13
  58. package/rust/core/audio/interpreter/sleep.rs +27 -30
  59. package/rust/core/audio/interpreter/spawn.rs +105 -102
  60. package/rust/core/audio/interpreter/tempo.rs +19 -16
  61. package/rust/core/audio/interpreter/trigger.rs +239 -210
  62. package/rust/core/audio/loader/mod.rs +1 -1
  63. package/rust/core/audio/loader/trigger.rs +100 -97
  64. package/rust/core/audio/mod.rs +7 -6
  65. package/rust/core/audio/player.rs +64 -64
  66. package/rust/core/audio/renderer.rs +56 -53
  67. package/rust/core/audio/special/easing.rs +189 -0
  68. package/rust/core/audio/special/env.rs +43 -0
  69. package/rust/core/audio/special/math.rs +102 -0
  70. package/rust/core/audio/special/mod.rs +9 -0
  71. package/rust/core/audio/special/modulator.rs +143 -0
  72. package/rust/core/builder/mod.rs +80 -85
  73. package/rust/core/debugger/lexer.rs +27 -27
  74. package/rust/core/debugger/mod.rs +24 -23
  75. package/rust/core/debugger/module.rs +55 -47
  76. package/rust/core/debugger/preprocessor.rs +27 -27
  77. package/rust/core/debugger/store.rs +40 -39
  78. package/rust/core/error/mod.rs +80 -66
  79. package/rust/core/lexer/handler/arrow.rs +82 -31
  80. package/rust/core/lexer/handler/at.rs +21 -21
  81. package/rust/core/lexer/handler/brace.rs +41 -41
  82. package/rust/core/lexer/handler/colon.rs +21 -21
  83. package/rust/core/lexer/handler/comment.rs +30 -30
  84. package/rust/core/lexer/handler/dot.rs +21 -21
  85. package/rust/core/lexer/handler/driver.rs +337 -263
  86. package/rust/core/lexer/handler/identifier.rs +46 -42
  87. package/rust/core/lexer/handler/indent.rs +66 -66
  88. package/rust/core/lexer/handler/mod.rs +16 -16
  89. package/rust/core/lexer/handler/newline.rs +23 -23
  90. package/rust/core/lexer/handler/number.rs +31 -31
  91. package/rust/core/lexer/handler/operator.rs +46 -44
  92. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  93. package/rust/core/lexer/handler/slash.rs +21 -21
  94. package/rust/core/lexer/handler/string.rs +63 -63
  95. package/rust/core/lexer/mod.rs +54 -51
  96. package/rust/core/lexer/token.rs +97 -91
  97. package/rust/core/mod.rs +11 -11
  98. package/rust/core/parser/driver.rs +513 -408
  99. package/rust/core/parser/handler/arrow_call.rs +233 -211
  100. package/rust/core/parser/handler/at.rs +245 -162
  101. package/rust/core/parser/handler/bank.rs +94 -69
  102. package/rust/core/parser/handler/condition.rs +80 -74
  103. package/rust/core/parser/handler/dot.rs +143 -135
  104. package/rust/core/parser/handler/identifier/automate.rs +257 -0
  105. package/rust/core/parser/handler/identifier/call.rs +91 -88
  106. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  107. package/rust/core/parser/handler/identifier/function.rs +100 -92
  108. package/rust/core/parser/handler/identifier/group.rs +85 -75
  109. package/rust/core/parser/handler/identifier/let_.rs +158 -127
  110. package/rust/core/parser/handler/identifier/mod.rs +54 -52
  111. package/rust/core/parser/handler/identifier/on.rs +98 -0
  112. package/rust/core/parser/handler/identifier/print.rs +52 -0
  113. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  114. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  115. package/rust/core/parser/handler/identifier/synth.rs +65 -65
  116. package/rust/core/parser/handler/loop_.rs +170 -72
  117. package/rust/core/parser/handler/mod.rs +8 -8
  118. package/rust/core/parser/handler/tempo.rs +53 -47
  119. package/rust/core/parser/mod.rs +4 -4
  120. package/rust/core/parser/statement.rs +142 -108
  121. package/rust/core/plugin/loader.rs +123 -48
  122. package/rust/core/plugin/mod.rs +2 -1
  123. package/rust/core/plugin/runner.rs +296 -0
  124. package/rust/core/preprocessor/loader.rs +515 -326
  125. package/rust/core/preprocessor/mod.rs +4 -4
  126. package/rust/core/preprocessor/module.rs +60 -58
  127. package/rust/core/preprocessor/processor.rs +99 -101
  128. package/rust/core/preprocessor/resolver/bank.rs +51 -49
  129. package/rust/core/preprocessor/resolver/call.rs +100 -100
  130. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  131. package/rust/core/preprocessor/resolver/driver.rs +310 -278
  132. package/rust/core/preprocessor/resolver/function.rs +69 -78
  133. package/rust/core/preprocessor/resolver/group.rs +96 -91
  134. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  135. package/rust/core/preprocessor/resolver/loop_.rs +320 -91
  136. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  137. package/rust/core/preprocessor/resolver/spawn.rs +76 -92
  138. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  139. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  140. package/rust/core/preprocessor/resolver/trigger.rs +113 -116
  141. package/rust/core/preprocessor/resolver/value.rs +81 -87
  142. package/rust/core/shared/bank.rs +1 -1
  143. package/rust/core/shared/duration.rs +9 -9
  144. package/rust/core/shared/mod.rs +3 -3
  145. package/rust/core/shared/value.rs +35 -32
  146. package/rust/core/store/function.rs +34 -34
  147. package/rust/core/store/global.rs +55 -38
  148. package/rust/core/store/mod.rs +5 -5
  149. package/rust/core/store/variable.rs +37 -34
  150. package/rust/core/utils/mod.rs +2 -2
  151. package/rust/core/utils/path.rs +37 -31
  152. package/rust/core/utils/validation.rs +35 -37
  153. package/rust/installer/addon.rs +84 -80
  154. package/rust/installer/bank.rs +62 -65
  155. package/rust/installer/mod.rs +5 -5
  156. package/rust/installer/plugin.rs +54 -55
  157. package/rust/installer/utils.rs +56 -56
  158. package/rust/lib.rs +156 -164
  159. package/rust/main.rs +250 -145
  160. package/rust/utils/error.rs +200 -0
  161. package/rust/utils/file.rs +38 -35
  162. package/rust/utils/first_usage.rs +76 -0
  163. package/rust/utils/logger.rs +195 -139
  164. package/rust/utils/mod.rs +9 -50
  165. package/rust/utils/signature.rs +19 -17
  166. package/rust/utils/spinner.rs +22 -19
  167. package/rust/utils/telemetry.rs +292 -0
  168. package/rust/utils/watcher.rs +34 -33
  169. package/templates/minimal/README.md +97 -121
  170. package/templates/welcome/README.md +97 -121
  171. package/typescript/bin/index.ts +19 -5
  172. package/typescript/index.ts +3 -1
  173. package/typescript/scripts/postbuild.ts +10 -6
  174. package/typescript/scripts/postinstall.ts +56 -0
  175. package/typescript/scripts/version/bump.ts +0 -1
  176. package/typescript/scripts/version/index.ts +0 -1
  177. package/out-tsc/bin/devalang.exe +0 -0
@@ -1,29 +1,43 @@
1
- # This example demonstrates how to create a custom synth and use it in a group with notes.
1
+ # This file demonstrates general uses of Devalang.
2
2
 
3
- bpm 135
3
+ bpm 120
4
4
 
5
- let customSynth = synth sine {
6
- attack: 0,
7
- decay: 100,
8
- sustain: 50,
9
- release: 200,
10
- }
5
+ group main:
6
+ let lead = synth sine {
7
+ attack: 0,
8
+ decay: 100,
9
+ sustain: 100,
10
+ release: 100
11
+ }
11
12
 
12
- group mySynthGroup:
13
- customSynth -> note(C4, {
14
- duration: 1000,
15
- glide: true,
16
- velocity: 0.8
17
- })
18
- customSynth -> note(E3, {
19
- duration: 1000,
20
- glide: true,
21
- velocity: 0.5
22
- })
23
- customSynth -> note(D3, {
24
- duration: 1000,
25
- glide: true,
26
- velocity: 0.6
27
- })
13
+ # Global automation for this synth (applies to subsequent notes)
14
+ automate lead:
15
+ param volume {
16
+ 0% = 0.0
17
+ 100% = 1.0
18
+ }
19
+ param pan {
20
+ 0% = -1.0
21
+ 100% = 1.0
22
+ }
23
+ param pitch {
24
+ 0% = -12.0
25
+ 100% = 12.0
26
+ }
28
27
 
29
- spawn mySynthGroup
28
+ # Notes (per-note automation can override globals)
29
+ lead -> note(C4, {
30
+ duration: 400,
31
+ velocity: 0.8,
32
+ automate: {
33
+ pan: {
34
+ 0%: -1.0
35
+ 100%: 0.0
36
+ }
37
+ }
38
+ })
39
+ lead -> note(E4, { duration: 400 })
40
+ lead -> note(G4, { duration: 600, glide: true, target_freq: 659.25 })
41
+ lead -> note(B3, { duration: 400, slide: true, target_amp: 0.3 })
42
+
43
+ call main
@@ -1,16 +1,10 @@
1
- # This file demonstrates the use of a loop in Devalang.
2
-
3
- @import { duration, default_bank, params, loopCount, tempo } from "./variables.deva"
4
-
5
- @load "./samples/kick-808.wav" as kickCustom
6
- @load "./samples/hat-808.wav" as hatCustom
1
+ # This file demonstrates the use of loops in Devalang.
7
2
 
8
3
  group myLoop:
9
- loop loopCount:
10
- .kickCustom duration params
4
+ for i in [1, 2, 3]:
5
+ print "looping with for" + i
11
6
 
12
- # Uncomment the next line (.hatCustom) while executing "play" command
13
- # with `--repeat` option to see magic happen !
14
- # .hatCustom duration params
7
+ loop 3:
8
+ print "looping with loop"
15
9
 
16
10
  @export { myLoop }
@@ -0,0 +1,8 @@
1
+ # TODO planned for future release
2
+
3
+ # bank devaloop.808 as 808
4
+
5
+ # # Pattern literal without options
6
+ # pattern kickPattern with 808.kick = "x--- x--- x--- x---"
7
+
8
+ # call kickPattern
@@ -0,0 +1,16 @@
1
+ # This is an example of using a plugin in Devalang.
2
+ # Make sure you have the plugin installed in your Devaloop application. (devalang install plugin <author>.<plugin_name>)
3
+
4
+ @use devaloop.acid as acidPlugin
5
+
6
+ let acidSynth = synth acidPlugin.synth {
7
+ waveform: "saw",
8
+ accent: 0.1,
9
+ decay: 250
10
+ }
11
+
12
+ group mySynthGroup:
13
+ acidSynth -> note(C4, { duration: 600 })
14
+ acidSynth -> note(E4, { duration: 600 })
15
+
16
+ call mySynthGroup
@@ -1,7 +1,7 @@
1
1
  # This file only exports variables for use in other files.
2
2
 
3
3
  let duration = auto
4
- let default_bank = 808
4
+ let default_bank = devaloop.808
5
5
  let params = { decay: 10, delay: 30 }
6
6
  let loopCount = 5
7
7
  let tempo = 115
@@ -1,13 +1,57 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
6
36
  Object.defineProperty(exports, "__esModule", { value: true });
7
37
  const child_process_1 = require("child_process");
8
- const path_1 = __importDefault(require("path"));
9
- const binaryPath = path_1.default.join(__dirname, "devalang.exe");
10
- const subCommand = process.argv[2] || "help";
38
+ const path = __importStar(require("path"));
39
+ let binaryName;
40
+ switch (process.platform) {
41
+ case "win32":
42
+ binaryName = "devalang-x86_64-pc-windows-msvc.exe";
43
+ break;
44
+ case "darwin":
45
+ binaryName = "devalang-x86_64-apple-darwin";
46
+ break;
47
+ case "linux":
48
+ binaryName = "devalang-x86_64-unknown-linux-gnu";
49
+ break;
50
+ default:
51
+ console.error(`Unsupported platform: ${process.platform}`);
52
+ process.exit(1);
53
+ }
54
+ const binaryPath = path.join(__dirname, binaryName);
11
55
  const args = process.argv.slice(2);
12
56
  const child = (0, child_process_1.spawn)(binaryPath, args, { stdio: "inherit" });
13
- child.on("exit", (code) => process.exit(code));
57
+ child.on("exit", (code) => process.exit(code !== null && code !== void 0 ? code : 1));
package/out-tsc/index.js CHANGED
@@ -1,2 +1,4 @@
1
1
  "use strict";
2
- // This file is part of the Devalang project
2
+ /**
3
+ * TypeScript wrapper for Devalang.
4
+ */
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const path_1 = __importDefault(require("path"));
8
- const source = path_1.default.join(__dirname, "..", "..", "target", "release", "devalang.exe");
9
- const destination = path_1.default.join(__dirname, "..", "bin", "devalang.exe");
10
- fs_1.default.copyFileSync(source, destination);
11
- fs_1.default.chmodSync(destination, 0o755);
2
+ /**
3
+ * NOTE: This script is deprecated since we use Github Actions
4
+ */
5
+ // import fs from "fs";
6
+ // import path from "path";
7
+ // const source = path.join(__dirname, "..", "..", "target", "release", "devalang.exe");
8
+ // const destination = path.join(__dirname, "..", "bin", "devalang.exe");
9
+ // fs.copyFileSync(source, destination);
10
+ // fs.chmodSync(destination, 0o755);
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ const follow_redirects_1 = require("follow-redirects");
9
+ const fs_2 = __importDefault(require("fs"));
10
+ const path_2 = __importDefault(require("path"));
11
+ const projectVersionPath = path_2.default.join(__dirname, "../../project-version.json");
12
+ const version = fs_2.default.readFileSync(projectVersionPath, "utf-8").trim();
13
+ const versionString = JSON.parse(version).version;
14
+ const platform = process.platform;
15
+ let binaryName;
16
+ switch (platform) {
17
+ case "win32":
18
+ binaryName = "devalang-x86_64-pc-windows-msvc.exe";
19
+ break;
20
+ case "darwin":
21
+ binaryName = "devalang-x86_64-apple-darwin";
22
+ break;
23
+ case "linux":
24
+ binaryName = "devalang-x86_64-unknown-linux-gnu";
25
+ break;
26
+ default:
27
+ console.error(`❌ Unsupported platform: ${platform}`);
28
+ process.exit(1);
29
+ }
30
+ const destDir = (0, path_1.join)(__dirname, "..", "..", "out-tsc", "bin");
31
+ const dest = (0, path_1.join)(destDir, binaryName);
32
+ const url = `https://github.com/devaloop-labs/devalang/releases/download/v${versionString}/${binaryName}`;
33
+ (0, fs_1.mkdirSync)(destDir, { recursive: true });
34
+ console.log(`⬇️ Downloading ${binaryName} from ${url}`);
35
+ follow_redirects_1.https.get(url, (res) => {
36
+ if (res.statusCode !== 200) {
37
+ console.error(`❌ Failed (HTTP ${res.statusCode})`);
38
+ process.exit(1);
39
+ }
40
+ const file = (0, fs_1.createWriteStream)(dest, { mode: 0o755 });
41
+ res.pipe(file);
42
+ file.on("finish", () => {
43
+ file.close();
44
+ console.log(`✅ Downloaded ${binaryName} to ${dest}`);
45
+ });
46
+ }).on("error", (err) => {
47
+ console.error(`❌ Error: ${err.message}`);
48
+ process.exit(1);
49
+ });
package/package.json CHANGED
@@ -1,21 +1,24 @@
1
1
  {
2
2
  "name": "@devaloop/devalang",
3
3
  "private": false,
4
- "version": "0.0.1-alpha.14",
4
+ "version": "0.0.1-alpha.16",
5
5
  "description": "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.",
6
6
  "main": "out-tsc/index.js",
7
7
  "bin": {
8
8
  "devalang": "./out-tsc/bin/index.js"
9
9
  },
10
10
  "scripts": {
11
+ "rust:fmt": "cargo fmt",
11
12
  "rust:dev:build": "cargo run build --entry examples --output output --debug",
12
13
  "rust:dev:check": "cargo run check --entry examples --output output --debug",
13
14
  "rust:dev:play": "cargo run play --entry examples --output output --repeat --debug",
14
15
  "rust:wasm:web": "wasm-pack build --target=web --no-default-features",
15
16
  "rust:wasm:node": "wasm-pack build --target=nodejs --no-default-features",
17
+ "script:build": "tsc",
16
18
  "script:postbuild": "tsc && node out-tsc/scripts/postbuild.js",
17
19
  "script:version:bump": "tsc && node out-tsc/scripts/version/index.js",
18
- "prepublish": "cargo build --release && npm run script:postbuild"
20
+ "prepublish": "cargo build --release",
21
+ "postinstall": "tsc && node out-tsc/scripts/postinstall.js"
19
22
  },
20
23
  "homepage": "https://devalang.com",
21
24
  "keywords": [
@@ -40,6 +43,11 @@
40
43
  "url": "https://github.com/devaloop-labs/devalang.git"
41
44
  },
42
45
  "dependencies": {
43
- "@types/node": "^24.0.3"
46
+ "@types/follow-redirects": "^1.14.4",
47
+ "@types/node": "^24.0.3",
48
+ "follow-redirects": "^1.15.11"
49
+ },
50
+ "devDependencies": {
51
+ "typescript": "^5.9.2"
44
52
  }
45
- }
53
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.1-alpha.14",
2
+ "version": "0.0.1-alpha.16",
3
3
  "channel": "alpha",
4
- "lastCommit": "e9243d1e7ec612d0d4d31307bcfbf28c5e912b11",
5
- "build": 13
4
+ "lastCommit": "a9b05a9dc7988e50e4992d16ce279444e9aa8aca",
5
+ "build": 15
6
6
  }