@beatbax/engine 0.1.0
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.
- package/dist/.tsbuildinfo +1 -0
- package/dist/audio/bufferedRenderer.d.ts +32 -0
- package/dist/audio/bufferedRenderer.d.ts.map +1 -0
- package/dist/audio/bufferedRenderer.js +309 -0
- package/dist/audio/bufferedRenderer.js.map +1 -0
- package/dist/audio/pcmRenderer.d.ts +25 -0
- package/dist/audio/pcmRenderer.d.ts.map +1 -0
- package/dist/audio/pcmRenderer.js +1288 -0
- package/dist/audio/pcmRenderer.js.map +1 -0
- package/dist/audio/playback.d.ts +57 -0
- package/dist/audio/playback.d.ts.map +1 -0
- package/dist/audio/playback.js +794 -0
- package/dist/audio/playback.js.map +1 -0
- package/dist/chips/gameboy/apu.d.ts +9 -0
- package/dist/chips/gameboy/apu.d.ts.map +1 -0
- package/dist/chips/gameboy/apu.js +27 -0
- package/dist/chips/gameboy/apu.js.map +1 -0
- package/dist/chips/gameboy/noise.d.ts +6 -0
- package/dist/chips/gameboy/noise.d.ts.map +1 -0
- package/dist/chips/gameboy/noise.js +155 -0
- package/dist/chips/gameboy/noise.js.map +1 -0
- package/dist/chips/gameboy/packet.d.ts +3 -0
- package/dist/chips/gameboy/packet.d.ts.map +1 -0
- package/dist/chips/gameboy/packet.js +3 -0
- package/dist/chips/gameboy/packet.js.map +1 -0
- package/dist/chips/gameboy/periodTables.d.ts +16 -0
- package/dist/chips/gameboy/periodTables.d.ts.map +1 -0
- package/dist/chips/gameboy/periodTables.js +29 -0
- package/dist/chips/gameboy/periodTables.js.map +1 -0
- package/dist/chips/gameboy/pulse.d.ts +12 -0
- package/dist/chips/gameboy/pulse.d.ts.map +1 -0
- package/dist/chips/gameboy/pulse.js +275 -0
- package/dist/chips/gameboy/pulse.js.map +1 -0
- package/dist/chips/gameboy/wave.d.ts +8 -0
- package/dist/chips/gameboy/wave.d.ts.map +1 -0
- package/dist/chips/gameboy/wave.js +146 -0
- package/dist/chips/gameboy/wave.js.map +1 -0
- package/dist/effects/index.d.ts +7 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +1028 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/effects/types.d.ts +8 -0
- package/dist/effects/types.d.ts.map +1 -0
- package/dist/effects/types.js +2 -0
- package/dist/effects/types.js.map +1 -0
- package/dist/expand/refExpander.d.ts +14 -0
- package/dist/expand/refExpander.d.ts.map +1 -0
- package/dist/expand/refExpander.js +130 -0
- package/dist/expand/refExpander.js.map +1 -0
- package/dist/export/index.d.ts +5 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +5 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/jsonExport.d.ts +9 -0
- package/dist/export/jsonExport.d.ts.map +1 -0
- package/dist/export/jsonExport.js +184 -0
- package/dist/export/jsonExport.js.map +1 -0
- package/dist/export/midiExport.d.ts +9 -0
- package/dist/export/midiExport.d.ts.map +1 -0
- package/dist/export/midiExport.js +390 -0
- package/dist/export/midiExport.js.map +1 -0
- package/dist/export/ugeWriter.d.ts +33 -0
- package/dist/export/ugeWriter.d.ts.map +1 -0
- package/dist/export/ugeWriter.js +1997 -0
- package/dist/export/ugeWriter.js.map +1 -0
- package/dist/export/wavWriter.d.ts +24 -0
- package/dist/export/wavWriter.d.ts.map +1 -0
- package/dist/export/wavWriter.js +126 -0
- package/dist/export/wavWriter.js.map +1 -0
- package/dist/import/index.d.ts +5 -0
- package/dist/import/index.d.ts.map +1 -0
- package/dist/import/index.js +8 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/remoteCache.d.ts +60 -0
- package/dist/import/remoteCache.d.ts.map +1 -0
- package/dist/import/remoteCache.js +194 -0
- package/dist/import/remoteCache.js.map +1 -0
- package/dist/import/uge/uge.reader.d.ts +27 -0
- package/dist/import/uge/uge.reader.d.ts.map +1 -0
- package/dist/import/uge/uge.reader.js +545 -0
- package/dist/import/uge/uge.reader.js.map +1 -0
- package/dist/import/urlUtils.d.ts +50 -0
- package/dist/import/urlUtils.d.ts.map +1 -0
- package/dist/import/urlUtils.js +87 -0
- package/dist/import/urlUtils.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +318 -0
- package/dist/index.js.map +1 -0
- package/dist/instruments/instrumentState.d.ts +15 -0
- package/dist/instruments/instrumentState.d.ts.map +1 -0
- package/dist/instruments/instrumentState.js +24 -0
- package/dist/instruments/instrumentState.js.map +1 -0
- package/dist/parser/ast.d.ts +22 -0
- package/dist/parser/ast.d.ts.map +1 -0
- package/dist/parser/ast.js +5 -0
- package/dist/parser/ast.js.map +1 -0
- package/dist/parser/index.d.ts +14 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +10 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/peggy/generated/parser.d.ts +8 -0
- package/dist/parser/peggy/generated/parser.d.ts.map +1 -0
- package/dist/parser/peggy/generated/parser.js +6269 -0
- package/dist/parser/peggy/generated/parser.js.map +1 -0
- package/dist/parser/peggy/index.d.ts +3 -0
- package/dist/parser/peggy/index.d.ts.map +1 -0
- package/dist/parser/peggy/index.js +555 -0
- package/dist/parser/peggy/index.js.map +1 -0
- package/dist/parser/structured.d.ts +16 -0
- package/dist/parser/structured.d.ts.map +1 -0
- package/dist/parser/structured.js +232 -0
- package/dist/parser/structured.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +12 -0
- package/dist/parser/tokenizer.d.ts.map +1 -0
- package/dist/parser/tokenizer.js +14 -0
- package/dist/parser/tokenizer.js.map +1 -0
- package/dist/patterns/expand.d.ts +32 -0
- package/dist/patterns/expand.d.ts.map +1 -0
- package/dist/patterns/expand.js +184 -0
- package/dist/patterns/expand.js.map +1 -0
- package/dist/patterns/index.d.ts +2 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +2 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +9 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/tickScheduler.d.ts +27 -0
- package/dist/scheduler/tickScheduler.d.ts.map +1 -0
- package/dist/scheduler/tickScheduler.js +74 -0
- package/dist/scheduler/tickScheduler.js.map +1 -0
- package/dist/sequences/expand.d.ts +14 -0
- package/dist/sequences/expand.d.ts.map +1 -0
- package/dist/sequences/expand.js +137 -0
- package/dist/sequences/expand.js.map +1 -0
- package/dist/song/importResolver.browser.d.ts +29 -0
- package/dist/song/importResolver.browser.d.ts.map +1 -0
- package/dist/song/importResolver.browser.js +168 -0
- package/dist/song/importResolver.browser.js.map +1 -0
- package/dist/song/importResolver.d.ts +40 -0
- package/dist/song/importResolver.d.ts.map +1 -0
- package/dist/song/importResolver.js +445 -0
- package/dist/song/importResolver.js.map +1 -0
- package/dist/song/index.browser.d.ts +9 -0
- package/dist/song/index.browser.d.ts.map +1 -0
- package/dist/song/index.browser.js +7 -0
- package/dist/song/index.browser.js.map +1 -0
- package/dist/song/index.d.ts +8 -0
- package/dist/song/index.d.ts.map +1 -0
- package/dist/song/index.js +6 -0
- package/dist/song/index.js.map +1 -0
- package/dist/song/resolver.browser.d.ts +50 -0
- package/dist/song/resolver.browser.d.ts.map +1 -0
- package/dist/song/resolver.browser.js +536 -0
- package/dist/song/resolver.browser.js.map +1 -0
- package/dist/song/resolver.d.ts +20 -0
- package/dist/song/resolver.d.ts.map +1 -0
- package/dist/song/resolver.js +540 -0
- package/dist/song/resolver.js.map +1 -0
- package/dist/song/songModel.d.ts +34 -0
- package/dist/song/songModel.d.ts.map +1 -0
- package/dist/song/songModel.js +2 -0
- package/dist/song/songModel.js.map +1 -0
- package/dist/tests/refExpander.test.d.ts +2 -0
- package/dist/tests/refExpander.test.d.ts.map +1 -0
- package/dist/tests/refExpander.test.js +37 -0
- package/dist/tests/refExpander.test.js.map +1 -0
- package/dist/util/diag.d.ts +16 -0
- package/dist/util/diag.d.ts.map +1 -0
- package/dist/util/diag.js +29 -0
- package/dist/util/diag.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL utilities for remote instrument imports.
|
|
3
|
+
* Handles URL detection, GitHub shorthand expansion, and validation.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check if an import source is a remote URL.
|
|
7
|
+
*/
|
|
8
|
+
export function isRemoteImport(source) {
|
|
9
|
+
return (source.startsWith('http://') ||
|
|
10
|
+
source.startsWith('https://') ||
|
|
11
|
+
source.startsWith('github:'));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if an import source is a local file import.
|
|
15
|
+
*/
|
|
16
|
+
export function isLocalImport(source) {
|
|
17
|
+
return source.startsWith('local:');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract the file path from a local import.
|
|
21
|
+
* @example
|
|
22
|
+
* extractLocalPath('local:lib/common.ins') => 'lib/common.ins'
|
|
23
|
+
*/
|
|
24
|
+
export function extractLocalPath(source) {
|
|
25
|
+
if (source.startsWith('local:')) {
|
|
26
|
+
return source.slice('local:'.length);
|
|
27
|
+
}
|
|
28
|
+
return source;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Expand GitHub shorthand syntax to a full raw.githubusercontent.com URL.
|
|
32
|
+
* @example
|
|
33
|
+
* expandGitHubShorthand('github:user/repo/main/file.ins')
|
|
34
|
+
* => 'https://raw.githubusercontent.com/user/repo/main/file.ins'
|
|
35
|
+
*/
|
|
36
|
+
export function expandGitHubShorthand(source) {
|
|
37
|
+
if (source.startsWith('github:')) {
|
|
38
|
+
const path = source.slice('github:'.length);
|
|
39
|
+
return `https://raw.githubusercontent.com/${path}`;
|
|
40
|
+
}
|
|
41
|
+
return source;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Normalize a remote import URL.
|
|
45
|
+
* - Expands GitHub shorthand
|
|
46
|
+
* - Validates protocol
|
|
47
|
+
* - Returns the canonical URL
|
|
48
|
+
*/
|
|
49
|
+
export function normalizeRemoteUrl(source) {
|
|
50
|
+
const expanded = expandGitHubShorthand(source);
|
|
51
|
+
// Validate that we have a valid HTTP(S) URL
|
|
52
|
+
try {
|
|
53
|
+
const url = new URL(expanded);
|
|
54
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
55
|
+
throw new Error(`Invalid protocol: ${url.protocol}`);
|
|
56
|
+
}
|
|
57
|
+
return expanded;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new Error(`Invalid remote import URL "${source}": ${err}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate a remote URL against security constraints.
|
|
65
|
+
*/
|
|
66
|
+
export function validateRemoteUrl(url, options = {}) {
|
|
67
|
+
const { httpsOnly = false, allowedDomains = [], } = options;
|
|
68
|
+
const parsedUrl = new URL(url);
|
|
69
|
+
// Check HTTPS requirement
|
|
70
|
+
if (httpsOnly && parsedUrl.protocol !== 'https:') {
|
|
71
|
+
throw new Error(`Remote import security violation: HTTP URLs are not allowed in production mode. ` +
|
|
72
|
+
`Use HTTPS or set httpsOnly=false. URL: ${url}`);
|
|
73
|
+
}
|
|
74
|
+
// Check domain whitelist
|
|
75
|
+
if (allowedDomains.length > 0) {
|
|
76
|
+
const hostname = parsedUrl.hostname.toLowerCase();
|
|
77
|
+
const isAllowed = allowedDomains.some(domain => {
|
|
78
|
+
const normalizedDomain = domain.toLowerCase();
|
|
79
|
+
return hostname === normalizedDomain || hostname.endsWith('.' + normalizedDomain);
|
|
80
|
+
});
|
|
81
|
+
if (!isAllowed) {
|
|
82
|
+
throw new Error(`Remote import security violation: domain "${parsedUrl.hostname}" is not in the allowed list. ` +
|
|
83
|
+
`Allowed domains: ${allowedDomains.join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=urlUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlUtils.js","sourceRoot":"","sources":["../../src/import/urlUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { exportJSON, exportMIDI, exportWAV } from './export/index.js';
|
|
2
|
+
|
|
3
|
+
export interface PlayOptions {
|
|
4
|
+
noBrowser?: boolean;
|
|
5
|
+
browser?: boolean;
|
|
6
|
+
backend?: 'auto' | 'node-webaudio' | 'browser';
|
|
7
|
+
sampleRate?: number;
|
|
8
|
+
duration?: number;
|
|
9
|
+
channels?: number[]; // Which channels to render
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
bufferFrames?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export declare function playFile(path: string, options?: PlayOptions): Promise<void>;
|
|
15
|
+
export { exportJSON, exportMIDI, exportWAV };
|
|
16
|
+
export { renderSongToPCM } from './audio/pcmRenderer.js';
|
|
17
|
+
export * from './import/index.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA0FtE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,iBAgPrE;AAQD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
2
|
+
import { parse } from './parser/index.js';
|
|
3
|
+
import { exportJSON, exportMIDI, exportWAV } from './export/index.js';
|
|
4
|
+
import { warn, error } from './util/diag.js';
|
|
5
|
+
/**
|
|
6
|
+
* Wait for a directory to be ready (exists and is accessible).
|
|
7
|
+
* Uses polling with exponential backoff up to a maximum timeout.
|
|
8
|
+
* @param dirPath - Directory path to check
|
|
9
|
+
* @param maxWaitMs - Maximum time to wait in milliseconds (default: 10000)
|
|
10
|
+
* @param checkIntervalMs - Initial polling interval in milliseconds (default: 100)
|
|
11
|
+
* @returns Promise that resolves when directory is ready or rejects on timeout
|
|
12
|
+
*/
|
|
13
|
+
async function waitForDirectory(dirPath, maxWaitMs = 10000, checkIntervalMs = 100) {
|
|
14
|
+
const startTime = Date.now();
|
|
15
|
+
let currentInterval = checkIntervalMs;
|
|
16
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
17
|
+
try {
|
|
18
|
+
// Check if directory exists and is accessible
|
|
19
|
+
if (existsSync(dirPath)) {
|
|
20
|
+
// Additional check: ensure we can list the directory
|
|
21
|
+
const fs = await import('fs/promises');
|
|
22
|
+
await fs.readdir(dirPath);
|
|
23
|
+
return; // Directory is ready
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
// Directory not accessible yet, continue polling
|
|
28
|
+
}
|
|
29
|
+
// Wait before next check with exponential backoff (max 1 second)
|
|
30
|
+
await new Promise(resolve => setTimeout(resolve, currentInterval));
|
|
31
|
+
currentInterval = Math.min(currentInterval * 1.5, 1000);
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Timeout waiting for directory "${dirPath}" to be ready after ${maxWaitMs}ms`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wait for Vite dev server to be ready by checking if it responds to HTTP requests.
|
|
37
|
+
* @param url - URL to check (default: http://localhost:5173)
|
|
38
|
+
* @param maxWaitMs - Maximum time to wait in milliseconds (default: 10000)
|
|
39
|
+
* @returns Promise that resolves when server is ready or rejects on timeout
|
|
40
|
+
*/
|
|
41
|
+
async function waitForViteServer(url = 'http://localhost:5173', maxWaitMs = 10000) {
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
let currentInterval = 200;
|
|
44
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
45
|
+
try {
|
|
46
|
+
// Try to fetch from the server
|
|
47
|
+
const http = await import('http');
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
const req = http.get(url, (res) => {
|
|
50
|
+
// Any response means server is running
|
|
51
|
+
// Drain the response body to prevent memory leaks
|
|
52
|
+
res.resume();
|
|
53
|
+
// Handle stream errors to avoid unhandled errors
|
|
54
|
+
res.on('error', reject);
|
|
55
|
+
if (res.statusCode) {
|
|
56
|
+
resolve();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
reject(new Error('No status code'));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
req.on('error', reject);
|
|
63
|
+
req.on('timeout', () => {
|
|
64
|
+
req.destroy();
|
|
65
|
+
reject(new Error('Request timeout'));
|
|
66
|
+
});
|
|
67
|
+
req.setTimeout(1000);
|
|
68
|
+
});
|
|
69
|
+
return; // Server is ready
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
// Server not ready yet, continue polling
|
|
73
|
+
}
|
|
74
|
+
// Wait before next check with exponential backoff (max 1 second)
|
|
75
|
+
await new Promise(resolve => setTimeout(resolve, currentInterval));
|
|
76
|
+
currentInterval = Math.min(currentInterval * 1.5, 1000);
|
|
77
|
+
}
|
|
78
|
+
throw new Error(`Timeout waiting for Vite server at ${url} after ${maxWaitMs}ms`);
|
|
79
|
+
}
|
|
80
|
+
export async function playFile(path, options = {}) {
|
|
81
|
+
const src = readFileSync(path, 'utf8');
|
|
82
|
+
const ast = parse(src);
|
|
83
|
+
if (options.verbose) {
|
|
84
|
+
console.log('Parsed song AST:', JSON.stringify(ast, null, 2));
|
|
85
|
+
}
|
|
86
|
+
const isNode = typeof window === 'undefined';
|
|
87
|
+
const noBrowser = options.noBrowser ||
|
|
88
|
+
options.backend === 'node-webaudio' ||
|
|
89
|
+
(isNode && !options.browser && options.backend !== 'browser');
|
|
90
|
+
// Attempt headless playback
|
|
91
|
+
if (noBrowser) {
|
|
92
|
+
console.log('Rendering song using native PCM renderer...');
|
|
93
|
+
try {
|
|
94
|
+
const { resolveSongAsync } = await import('./song/resolver.js');
|
|
95
|
+
const { renderSongToPCM } = await import('./audio/pcmRenderer.js');
|
|
96
|
+
const song = await resolveSongAsync(ast, { filename: path, searchPaths: [process.cwd()] });
|
|
97
|
+
// Check for echo effects and warn (PCM renderer doesn't support echo yet)
|
|
98
|
+
let hasEchoEffects = false;
|
|
99
|
+
if (song && song.channels) {
|
|
100
|
+
for (const ch of song.channels) {
|
|
101
|
+
if (ch && ch.events) {
|
|
102
|
+
for (const evt of ch.events) {
|
|
103
|
+
if (evt.type === 'note' && evt.effects && Array.isArray(evt.effects)) {
|
|
104
|
+
for (const fx of evt.effects) {
|
|
105
|
+
const fxName = fx && fx.type ? fx.type : fx;
|
|
106
|
+
if (fxName === 'echo') {
|
|
107
|
+
hasEchoEffects = true;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (hasEchoEffects)
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (hasEchoEffects)
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (hasEchoEffects) {
|
|
121
|
+
warn('play', 'Echo/delay effects detected in song but are not supported in PCM renderer (CLI playback). Echo effects will be ignored. Use --browser flag for echo support.');
|
|
122
|
+
}
|
|
123
|
+
const sampleRate = options.sampleRate || 44100;
|
|
124
|
+
const duration = options.duration;
|
|
125
|
+
const bpm = ast.bpm || 128;
|
|
126
|
+
const renderChannels = options.channels;
|
|
127
|
+
const samples = renderSongToPCM(song, {
|
|
128
|
+
sampleRate,
|
|
129
|
+
duration,
|
|
130
|
+
channels: 2, // Use stereo to match browser
|
|
131
|
+
bpm,
|
|
132
|
+
renderChannels
|
|
133
|
+
});
|
|
134
|
+
// Real-time playback via speaker
|
|
135
|
+
try {
|
|
136
|
+
// Resolve absolute path to cli module
|
|
137
|
+
const path = await import('path');
|
|
138
|
+
const url = await import('url');
|
|
139
|
+
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
140
|
+
let cliPath = path.resolve(__dirname, '../../cli/dist/nodeAudioPlayer.js');
|
|
141
|
+
// Fallback for monorepo development where engine might be in node_modules but cli isn't linked
|
|
142
|
+
if (!existsSync(cliPath)) {
|
|
143
|
+
const monorepoPath = path.resolve(__dirname, '../../../../packages/cli/dist/nodeAudioPlayer.js');
|
|
144
|
+
if (existsSync(monorepoPath)) {
|
|
145
|
+
cliPath = monorepoPath;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const cliUrl = url.pathToFileURL(cliPath).href;
|
|
149
|
+
const { playAudioBuffer } = await import(cliUrl);
|
|
150
|
+
console.log('Playing audio via system speakers...');
|
|
151
|
+
if (ast.play?.repeat) {
|
|
152
|
+
console.log('Repeat requested by play directive — looping until process exit (Ctrl-C to stop)');
|
|
153
|
+
// Loop playback indefinitely; user may interrupt with Ctrl-C
|
|
154
|
+
// Play sequentially to avoid overlapping audio
|
|
155
|
+
while (true) {
|
|
156
|
+
// eslint-disable-next-line no-await-in-loop
|
|
157
|
+
await playAudioBuffer(samples, { channels: 2, sampleRate });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await playAudioBuffer(samples, { channels: 2, sampleRate }); // Use stereo
|
|
162
|
+
console.log('[OK] Playback complete');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
error('engine', 'Failed to play audio: ' + (err && err.message ? err.message : String(err)));
|
|
167
|
+
console.log('\nTip: Install speaker module: npm install --workspace=packages/cli speaker');
|
|
168
|
+
console.log('Or use "export wav" to export to WAV file instead.');
|
|
169
|
+
process.exitCode = 1;
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
error('engine', 'Failed to render song: ' + (err.message ?? String(err)));
|
|
175
|
+
if (err.stack)
|
|
176
|
+
error('engine', String(err.stack));
|
|
177
|
+
process.exitCode = 1;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Browser-based playback (requires explicit --browser flag)
|
|
182
|
+
try {
|
|
183
|
+
const { Player, createAudioContext } = await import('./audio/playback.js');
|
|
184
|
+
const ctx = await createAudioContext({
|
|
185
|
+
sampleRate: options.sampleRate,
|
|
186
|
+
backend: options.backend
|
|
187
|
+
});
|
|
188
|
+
const p = new Player(ctx);
|
|
189
|
+
await p.playAST(ast);
|
|
190
|
+
console.log('[OK] Playback started (WebAudio)');
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
// WebAudio not available in Node.js environment
|
|
194
|
+
if (options.browser) {
|
|
195
|
+
// User explicitly requested browser playback
|
|
196
|
+
console.log('Launching browser-based playback with Vite dev server...');
|
|
197
|
+
try {
|
|
198
|
+
// Resolve imports before copying to browser (imports won't work in browser context)
|
|
199
|
+
const pathModule = await import('path');
|
|
200
|
+
let resolvedSrc = src;
|
|
201
|
+
if (ast.imports && ast.imports.length > 0) {
|
|
202
|
+
// Filter imports for browser security - only block local imports, keep remote imports intact
|
|
203
|
+
const { isLocalImport } = await import('./import/urlUtils.js');
|
|
204
|
+
const localImports = ast.imports.filter(imp => isLocalImport(imp.source));
|
|
205
|
+
const remoteImports = ast.imports.filter(imp => !isLocalImport(imp.source));
|
|
206
|
+
// Warn about local imports - browser will error when trying to resolve them
|
|
207
|
+
if (localImports.length > 0) {
|
|
208
|
+
console.log(`⚠️ Warning: This song contains ${localImports.length} local file import(s) which will be blocked by browser security.`);
|
|
209
|
+
console.log(' The browser will display an error when attempting to load this song.');
|
|
210
|
+
console.log(' To play this song in the browser, replace local imports with remote imports (https:// or github:).');
|
|
211
|
+
}
|
|
212
|
+
if (remoteImports.length > 0) {
|
|
213
|
+
console.log(`Browser will resolve ${remoteImports.length} remote import(s) at runtime`);
|
|
214
|
+
}
|
|
215
|
+
// Send source as-is to browser - let browser error on local imports for clear user feedback
|
|
216
|
+
resolvedSrc = src;
|
|
217
|
+
}
|
|
218
|
+
// Copy the resolved source file into apps/web-ui/public/songs so the web UI can fetch it
|
|
219
|
+
const child = await import('child_process');
|
|
220
|
+
const basename = pathModule.basename(path);
|
|
221
|
+
const outDir = pathModule.join(process.cwd(), 'apps', 'web-ui', 'public', 'songs');
|
|
222
|
+
// Ensure output directory exists
|
|
223
|
+
try {
|
|
224
|
+
mkdirSync(outDir, { recursive: true });
|
|
225
|
+
}
|
|
226
|
+
catch (e) {
|
|
227
|
+
warn('engine', `Failed to create output directory: ${e}`);
|
|
228
|
+
}
|
|
229
|
+
const outPath = pathModule.join(outDir, basename);
|
|
230
|
+
// Start Vite dev server in apps/web-ui
|
|
231
|
+
const viteDir = pathModule.join(process.cwd(), 'apps', 'web-ui');
|
|
232
|
+
console.log('Starting Vite dev server...');
|
|
233
|
+
try {
|
|
234
|
+
const isWindows = process.platform === 'win32';
|
|
235
|
+
const server = child.spawn('npm', ['run', 'dev'], {
|
|
236
|
+
cwd: viteDir,
|
|
237
|
+
detached: true,
|
|
238
|
+
stdio: 'ignore',
|
|
239
|
+
shell: true // Required on Windows to find npm in PATH
|
|
240
|
+
});
|
|
241
|
+
server.unref();
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
warn('engine', 'Failed to start Vite server: ' + (e && e.message ? e.message : String(e)));
|
|
245
|
+
}
|
|
246
|
+
// Wait for output directory to be ready and Vite server to start
|
|
247
|
+
try {
|
|
248
|
+
await waitForDirectory(outDir, 10000);
|
|
249
|
+
console.log('Output directory ready');
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
warn('engine', `Directory not ready, proceeding anyway: ${err}`);
|
|
253
|
+
}
|
|
254
|
+
// Write the resolved source file
|
|
255
|
+
writeFileSync(outPath, resolvedSrc, 'utf8');
|
|
256
|
+
console.log(`Resolved song written to: ${outPath}`);
|
|
257
|
+
// Wait for Vite server to be ready before opening browser
|
|
258
|
+
try {
|
|
259
|
+
await waitForViteServer('http://localhost:5173', 10000);
|
|
260
|
+
console.log('Vite dev server is ready');
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
warn('engine', `Vite server may not be ready: ${err}`);
|
|
264
|
+
console.log('Waiting additional 2 seconds before opening browser...');
|
|
265
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
266
|
+
}
|
|
267
|
+
// Open browser
|
|
268
|
+
const url = `http://localhost:5173/?song=/songs/${encodeURIComponent(basename)}`;
|
|
269
|
+
console.log('Opening web UI at', url);
|
|
270
|
+
// Open default browser (cross-platform)
|
|
271
|
+
const platform = process.platform;
|
|
272
|
+
let cmd = '';
|
|
273
|
+
if (platform === 'win32')
|
|
274
|
+
cmd = `start "" "${url}"`;
|
|
275
|
+
else if (platform === 'darwin')
|
|
276
|
+
cmd = `open "${url}"`;
|
|
277
|
+
else
|
|
278
|
+
cmd = `xdg-open "${url}"`;
|
|
279
|
+
try {
|
|
280
|
+
child.exec(cmd, (err) => {
|
|
281
|
+
if (err) {
|
|
282
|
+
error('engine', 'Failed to open browser: ' + (err.message ?? String(err)));
|
|
283
|
+
console.log('Please open the URL in your browser:', url);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
console.log('Please open the URL in your browser:', url);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
error('engine', 'Failed to launch browser-based playback: ' + (err && err.message ? err.message : String(err)));
|
|
293
|
+
console.log('Please run manually: cd apps/web-ui && npm run dev');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Default: show helpful message instead of auto-launching
|
|
298
|
+
console.log('\n[!] CLI playback not available in Node.js environment.');
|
|
299
|
+
console.log('\nPlayback options:');
|
|
300
|
+
console.log(` - Browser playback: node bin/beatbax play ${path} --browser`);
|
|
301
|
+
console.log(` - Headless playback: node bin/beatbax play ${path} --headless`);
|
|
302
|
+
console.log(` - Direct command: node packages/cli/dist/cli.js play ${path} --headless`);
|
|
303
|
+
console.log(' - Web UI: cd apps/web-ui && npm run dev (then load your song)');
|
|
304
|
+
console.log('\nNote: Use direct node commands rather than npm scripts for flag arguments');
|
|
305
|
+
console.log(' (npm strips flags like --headless due to argument passing limitations)\n');
|
|
306
|
+
process.exitCode = 1;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function writeString(view, offset, string) {
|
|
311
|
+
for (let i = 0; i < string.length; i++) {
|
|
312
|
+
view.setUint8(offset + i, string.charCodeAt(i));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export { exportJSON, exportMIDI, exportWAV };
|
|
316
|
+
export { renderSongToPCM } from './audio/pcmRenderer.js';
|
|
317
|
+
export * from './import/index.js';
|
|
318
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instrument resolution helpers.
|
|
3
|
+
*
|
|
4
|
+
* This module centralizes mapping instrument names to their property maps
|
|
5
|
+
* and provides utilities for resolving an instrument reference for an
|
|
6
|
+
* event given the instrument table and optional defaults.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getInstrumentByName(insts: Record<string, Record<string, string>>, name?: string): Record<string, string> | undefined;
|
|
9
|
+
export declare function applyInstrumentToEvent(insts: Record<string, Record<string, string>>, event: any): any;
|
|
10
|
+
declare const _default: {
|
|
11
|
+
getInstrumentByName: typeof getInstrumentByName;
|
|
12
|
+
applyInstrumentToEvent: typeof applyInstrumentToEvent;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=instrumentState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentState.d.ts","sourceRoot":"","sources":["../../src/instruments/instrumentState.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,yDAGhE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAehE;;;;;AAED,wBAA+D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function getInstrumentByName(insts, name) {
|
|
2
|
+
if (!name)
|
|
3
|
+
return undefined;
|
|
4
|
+
return insts[name] || undefined;
|
|
5
|
+
}
|
|
6
|
+
export function applyInstrumentToEvent(insts, event) {
|
|
7
|
+
if (!event || !event.instrument)
|
|
8
|
+
return event;
|
|
9
|
+
const instName = event.instrument;
|
|
10
|
+
const inst = getInstrumentByName(insts, instName);
|
|
11
|
+
// attach resolved instrument object under `instProps` for downstream consumers
|
|
12
|
+
// Accept alternate property `envelope` (long form) and map it to `env`
|
|
13
|
+
// so downstream renderers that expect `env` continue to work.
|
|
14
|
+
if (inst && typeof inst === 'object') {
|
|
15
|
+
const p = { ...inst };
|
|
16
|
+
if (p.envelope !== undefined && p.env === undefined) {
|
|
17
|
+
p.env = p.envelope;
|
|
18
|
+
}
|
|
19
|
+
return { ...event, instProps: p, instrument: instName };
|
|
20
|
+
}
|
|
21
|
+
return { ...event, instProps: inst, instrument: instName };
|
|
22
|
+
}
|
|
23
|
+
export default { getInstrumentByName, applyInstrumentToEvent };
|
|
24
|
+
//# sourceMappingURL=instrumentState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentState.js","sourceRoot":"","sources":["../../src/instruments/instrumentState.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,IAAa;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,KAAU;IAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClD,+EAA+E;IAC/E,uEAAuE;IACvE,8DAA8D;IAC9D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,GAAI,IAAY,EAAS,CAAC;QACtC,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACpD,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST node type definitions for BeatBax.
|
|
3
|
+
*/
|
|
4
|
+
export type PatternMap = Record<string, string[]>;
|
|
5
|
+
export type InstMap = Record<string, Record<string, string>>;
|
|
6
|
+
export interface ChannelNode {
|
|
7
|
+
id: number;
|
|
8
|
+
inst?: string;
|
|
9
|
+
pat?: string | string[];
|
|
10
|
+
speed?: number;
|
|
11
|
+
}
|
|
12
|
+
export type SeqMap = Record<string, string[]>;
|
|
13
|
+
export interface AST {
|
|
14
|
+
pats: PatternMap;
|
|
15
|
+
insts: InstMap;
|
|
16
|
+
seqs: SeqMap;
|
|
17
|
+
channels: ChannelNode[];
|
|
18
|
+
bpm?: number;
|
|
19
|
+
chip?: string;
|
|
20
|
+
}
|
|
21
|
+
export default AST;
|
|
22
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/parser/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/parser/ast.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AST } from './ast.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse source text and build a minimal AST. Currently this parser
|
|
4
|
+
* focuses on resolving `pat` definitions into expanded token arrays
|
|
5
|
+
* using `expandPattern` and collecting `inst`, `seq` and `channel` entries.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parse(source: string): AST;
|
|
8
|
+
declare const _default: {
|
|
9
|
+
parse: typeof parse;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
13
|
+
// Note: tokenizer re-exports removed — legacy tokenizer is deprecated/removed.
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAGzC;;;;AAED,wBAEE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { parseWithPeggy } from './peggy/index.js';
|
|
2
|
+
export { parseWithPeggy } from './peggy/index.js';
|
|
3
|
+
export function parse(source) {
|
|
4
|
+
// Peggy parser is the single supported parser now.
|
|
5
|
+
return parseWithPeggy(source);
|
|
6
|
+
}
|
|
7
|
+
export default {
|
|
8
|
+
parse,
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,mDAAmD;IACnD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,eAAe;IACb,KAAK;CACN,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare function peg$SyntaxError(message: any, expected: any, found: any, location: any): Error;
|
|
2
|
+
declare namespace peg$SyntaxError {
|
|
3
|
+
var buildMessage: (expected: any, found: any) => string;
|
|
4
|
+
}
|
|
5
|
+
declare function peg$parse(input: any, options: any): any;
|
|
6
|
+
declare const peg$allowedStartRules: string[];
|
|
7
|
+
export { peg$allowedStartRules as StartRules, peg$SyntaxError as SyntaxError, peg$parse as parse };
|
|
8
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/parser/peggy/generated/parser.ts"],"names":[],"mappings":"AAcA,iBAAS,eAAe,CAAC,OAAO,KAAA,EAAE,QAAQ,KAAA,EAAE,KAAK,KAAA,EAAE,QAAQ,KAAA,SAW1D;kBAXQ,eAAe;;;AA6JxB,iBAAS,SAAS,CAAC,KAAK,KAAA,EAAE,OAAO,KAAA,OAwvLhC;AAED,QAAA,MAAM,qBAAqB,UAE1B,CAAC;AAEF,OAAO,EACL,qBAAqB,IAAI,UAAU,EACnC,eAAe,IAAI,WAAW,EAC9B,SAAS,IAAI,KAAK,EACnB,CAAC"}
|