@nexart/codemode-sdk 1.8.3 → 1.9.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/CHANGELOG.md +89 -0
- package/README.md +121 -2
- package/dist/cjs/browser.cjs +3077 -0
- package/dist/cjs/browser.js +3042 -0
- package/dist/cjs/core.cjs +1998 -0
- package/dist/cjs/core.js +1966 -0
- package/dist/cjs/node.cjs +3245 -0
- package/dist/cjs/node.js +3208 -0
- package/dist/esm/browser.cjs +3077 -0
- package/dist/esm/browser.js +3042 -0
- package/dist/esm/core.cjs +1998 -0
- package/dist/esm/core.js +1966 -0
- package/dist/esm/node.cjs +3245 -0
- package/dist/esm/node.js +3208 -0
- package/dist/types/sdk/codemode/attestation.d.ts +24 -0
- package/dist/types/sdk/codemode/attestation.d.ts.map +1 -0
- package/dist/types/sdk/codemode/builder-manifest.d.ts.map +1 -0
- package/dist/types/sdk/codemode/canonicalJson.d.ts +16 -0
- package/dist/types/sdk/codemode/canonicalJson.d.ts.map +1 -0
- package/dist/{sdk → types/sdk}/codemode/core-index.d.ts +5 -1
- package/dist/types/sdk/codemode/core-index.d.ts.map +1 -0
- package/dist/types/sdk/codemode/engine.d.ts.map +1 -0
- package/dist/{sdk → types/sdk}/codemode/entry/browser.d.ts +1 -1
- package/dist/types/sdk/codemode/entry/browser.d.ts.map +1 -0
- package/dist/types/sdk/codemode/entry/node.d.ts.map +1 -0
- package/dist/types/sdk/codemode/execute.d.ts.map +1 -0
- package/dist/types/sdk/codemode/execution-sandbox.d.ts.map +1 -0
- package/dist/types/sdk/codemode/loop-engine.d.ts.map +1 -0
- package/dist/types/sdk/codemode/nodeReceipt.d.ts +65 -0
- package/dist/types/sdk/codemode/nodeReceipt.d.ts.map +1 -0
- package/dist/types/sdk/codemode/p5-runtime.d.ts.map +1 -0
- package/dist/{sdk → types/sdk}/codemode/runtime.d.ts +1 -1
- package/dist/types/sdk/codemode/runtime.d.ts.map +1 -0
- package/dist/types/sdk/codemode/snapshot.d.ts +72 -0
- package/dist/types/sdk/codemode/snapshot.d.ts.map +1 -0
- package/dist/types/sdk/codemode/sound-bridge.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-engine.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/chladniBloom.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/dualVortex.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/geometryIllusion.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/index.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/isoflow.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/loomWeave.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/noiseTerraces.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/orb.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/pixelGlyphs.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/prismFlowFields.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/radialBurst.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/resonantSoundBodies.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/rings.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/squares.d.ts.map +1 -0
- package/dist/types/sdk/codemode/soundart-sketches/waveStripes.d.ts.map +1 -0
- package/dist/types/sdk/codemode/static-engine.d.ts.map +1 -0
- package/dist/{sdk → types/sdk}/codemode/types.d.ts +96 -0
- package/dist/types/sdk/codemode/types.d.ts.map +1 -0
- package/dist/{sdk → types/sdk}/codemode/version.d.ts +2 -2
- package/dist/types/sdk/codemode/version.d.ts.map +1 -0
- package/dist/types/shared/soundSnapshot.d.ts.map +1 -0
- package/examples/sketch-minimal.js +27 -0
- package/examples/sketch-vars.js +59 -0
- package/examples/sketch.js +24 -0
- package/package.json +29 -23
- package/dist/sdk/codemode/builder-manifest.d.ts.map +0 -1
- package/dist/sdk/codemode/builder-manifest.js +0 -97
- package/dist/sdk/codemode/core-index.d.ts.map +0 -1
- package/dist/sdk/codemode/core-index.js +0 -28
- package/dist/sdk/codemode/engine.d.ts.map +0 -1
- package/dist/sdk/codemode/engine.js +0 -67
- package/dist/sdk/codemode/entry/browser.d.ts.map +0 -1
- package/dist/sdk/codemode/entry/browser.js +0 -69
- package/dist/sdk/codemode/entry/node.d.ts.map +0 -1
- package/dist/sdk/codemode/entry/node.js +0 -35
- package/dist/sdk/codemode/execute.d.ts.map +0 -1
- package/dist/sdk/codemode/execute.js +0 -283
- package/dist/sdk/codemode/execution-sandbox.d.ts.map +0 -1
- package/dist/sdk/codemode/execution-sandbox.js +0 -207
- package/dist/sdk/codemode/loop-engine.d.ts.map +0 -1
- package/dist/sdk/codemode/loop-engine.js +0 -229
- package/dist/sdk/codemode/p5-runtime.d.ts.map +0 -1
- package/dist/sdk/codemode/p5-runtime.js +0 -1033
- package/dist/sdk/codemode/runtime.d.ts.map +0 -1
- package/dist/sdk/codemode/runtime.js +0 -220
- package/dist/sdk/codemode/sound-bridge.d.ts.map +0 -1
- package/dist/sdk/codemode/sound-bridge.js +0 -128
- package/dist/sdk/codemode/soundart-engine.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-engine.js +0 -173
- package/dist/sdk/codemode/soundart-sketches/chladniBloom.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/chladniBloom.js +0 -53
- package/dist/sdk/codemode/soundart-sketches/dualVortex.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/dualVortex.js +0 -67
- package/dist/sdk/codemode/soundart-sketches/geometryIllusion.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/geometryIllusion.js +0 -89
- package/dist/sdk/codemode/soundart-sketches/index.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/index.js +0 -72
- package/dist/sdk/codemode/soundart-sketches/isoflow.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/isoflow.js +0 -60
- package/dist/sdk/codemode/soundart-sketches/loomWeave.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/loomWeave.js +0 -59
- package/dist/sdk/codemode/soundart-sketches/noiseTerraces.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/noiseTerraces.js +0 -53
- package/dist/sdk/codemode/soundart-sketches/orb.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/orb.js +0 -50
- package/dist/sdk/codemode/soundart-sketches/pixelGlyphs.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/pixelGlyphs.js +0 -72
- package/dist/sdk/codemode/soundart-sketches/prismFlowFields.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/prismFlowFields.js +0 -51
- package/dist/sdk/codemode/soundart-sketches/radialBurst.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/radialBurst.js +0 -60
- package/dist/sdk/codemode/soundart-sketches/resonantSoundBodies.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/resonantSoundBodies.js +0 -89
- package/dist/sdk/codemode/soundart-sketches/rings.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/rings.js +0 -89
- package/dist/sdk/codemode/soundart-sketches/squares.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/squares.js +0 -52
- package/dist/sdk/codemode/soundart-sketches/waveStripes.d.ts.map +0 -1
- package/dist/sdk/codemode/soundart-sketches/waveStripes.js +0 -44
- package/dist/sdk/codemode/static-engine.d.ts.map +0 -1
- package/dist/sdk/codemode/static-engine.js +0 -157
- package/dist/sdk/codemode/types.d.ts.map +0 -1
- package/dist/sdk/codemode/types.js +0 -34
- package/dist/sdk/codemode/version.d.ts.map +0 -1
- package/dist/sdk/codemode/version.js +0 -17
- package/dist/shared/soundSnapshot.d.ts.map +0 -1
- package/dist/shared/soundSnapshot.js +0 -128
- /package/dist/{sdk → types/sdk}/codemode/builder-manifest.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/engine.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/entry/node.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/execute.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/execution-sandbox.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/loop-engine.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/p5-runtime.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/sound-bridge.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-engine.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/chladniBloom.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/dualVortex.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/geometryIllusion.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/index.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/isoflow.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/loomWeave.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/noiseTerraces.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/orb.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/pixelGlyphs.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/prismFlowFields.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/radialBurst.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/resonantSoundBodies.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/rings.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/squares.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/soundart-sketches/waveStripes.d.ts +0 -0
- /package/dist/{sdk → types/sdk}/codemode/static-engine.d.ts +0 -0
- /package/dist/{shared → types/shared}/soundSnapshot.d.ts +0 -0
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
export const RESONANT_SOUND_BODIES_SKETCH = `
|
|
2
|
-
function setup() {
|
|
3
|
-
const bgMode = typeof backgroundMode !== 'undefined' ? backgroundMode : 'rgb';
|
|
4
|
-
if (bgMode === 'white') background(245, 245, 245);
|
|
5
|
-
else if (bgMode === 'black') background(10, 10, 10);
|
|
6
|
-
else {
|
|
7
|
-
const r = Math.floor((S.brightness / 100) * 255);
|
|
8
|
-
const g = Math.floor((S.rhythmicity / 100) * 255);
|
|
9
|
-
const b = Math.floor((S.harmonicity / 100) * 255);
|
|
10
|
-
background(r, g, b);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const cx = width / 2;
|
|
14
|
-
const cy = height / 2;
|
|
15
|
-
const maxR = min(width, height) * 0.45;
|
|
16
|
-
const shapeSeed = S.bass * 17.3 + S.treble * 23.7 + S.rhythmicity * 11.1;
|
|
17
|
-
|
|
18
|
-
const numBodies = Math.floor(8 + (S.volume / 100) * 12 + (S.bass / 100) * 8);
|
|
19
|
-
|
|
20
|
-
noFill();
|
|
21
|
-
|
|
22
|
-
for (let i = 0; i < numBodies; i++) {
|
|
23
|
-
const t = i / numBodies;
|
|
24
|
-
const radius = maxR * (0.15 + t * 0.85);
|
|
25
|
-
|
|
26
|
-
const hue = (((S.hue / 100) + t * 0.3 + (S.harmonicity / 100) * 0.2) % 1) * 360;
|
|
27
|
-
const sat = lerp(50, 80, S.brightness / 100);
|
|
28
|
-
const lum = lerp(30, 60, S.brightness / 100);
|
|
29
|
-
|
|
30
|
-
const alpha = lerp(0.4, 0.15, t) * (0.5 + (S.volume / 100) * 0.5);
|
|
31
|
-
stroke('hsla(' + hue + ',' + sat + '%,' + lum + '%,' + alpha + ')');
|
|
32
|
-
strokeWeight(lerp(3, 1, t) * (1 + (S.aggression / 100) * 2));
|
|
33
|
-
|
|
34
|
-
beginShape();
|
|
35
|
-
const points = Math.floor(64 + (S.aggression / 100) * 64);
|
|
36
|
-
|
|
37
|
-
for (let j = 0; j <= points; j++) {
|
|
38
|
-
const angle = (j / points) * PI * 2;
|
|
39
|
-
|
|
40
|
-
const wobble = noise(
|
|
41
|
-
cos(angle) * 3 + i * 0.5 + shapeSeed * 0.001,
|
|
42
|
-
sin(angle) * 3 + i * 0.5
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
const bassWobble = sin(angle * (2 + Math.floor((S.bass / 100) * 6))) * (S.bass / 100) * 0.15;
|
|
46
|
-
const trebleWobble = sin(angle * (8 + Math.floor((S.treble / 100) * 12))) * (S.treble / 100) * 0.08;
|
|
47
|
-
|
|
48
|
-
const r = radius * (1 + (wobble - 0.5) * 0.3 * (S.aggression / 100) + bassWobble + trebleWobble);
|
|
49
|
-
|
|
50
|
-
const x = cx + cos(angle) * r;
|
|
51
|
-
const y = cy + sin(angle) * r;
|
|
52
|
-
|
|
53
|
-
vertex(x, y);
|
|
54
|
-
}
|
|
55
|
-
endShape(CLOSE);
|
|
56
|
-
|
|
57
|
-
if (i % 3 === 0) {
|
|
58
|
-
const fillAlpha = alpha * 0.1;
|
|
59
|
-
fill('hsla(' + hue + ',' + sat + '%,' + lum + '%,' + fillAlpha + ')');
|
|
60
|
-
beginShape();
|
|
61
|
-
for (let j = 0; j <= points; j++) {
|
|
62
|
-
const angle = (j / points) * PI * 2;
|
|
63
|
-
const wobble = noise(cos(angle) * 3 + i * 0.5 + shapeSeed * 0.001, sin(angle) * 3 + i * 0.5);
|
|
64
|
-
const bodyR = radius * (1 + (wobble - 0.5) * 0.3 * (S.aggression / 100));
|
|
65
|
-
vertex(cx + cos(angle) * bodyR, cy + sin(angle) * bodyR);
|
|
66
|
-
}
|
|
67
|
-
endShape(CLOSE);
|
|
68
|
-
noFill();
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const numNodes = Math.floor(12 + (S.rhythmicity / 100) * 20);
|
|
73
|
-
for (let i = 0; i < numNodes; i++) {
|
|
74
|
-
const angle = (i / numNodes) * PI * 2 + shapeSeed * 0.001;
|
|
75
|
-
const dist = maxR * (0.3 + noise(i * 0.1, shapeSeed * 0.001) * 0.6);
|
|
76
|
-
|
|
77
|
-
const x = cx + cos(angle) * dist;
|
|
78
|
-
const y = cy + sin(angle) * dist;
|
|
79
|
-
|
|
80
|
-
const nodeSize = lerp(2, 8, S.volume / 100) * (1 + (S.bass / 100) * 2);
|
|
81
|
-
const hue = ((((S.hue / 100) + i * 0.05 + (S.treble / 100) * 0.3) % 1)) * 360;
|
|
82
|
-
|
|
83
|
-
fill('hsla(' + hue + ',70%,' + lerp(40, 70, S.brightness / 100) + '%,' + lerp(0.3, 0.7, S.harmonicity / 100) + ')');
|
|
84
|
-
noStroke();
|
|
85
|
-
ellipse(x, y, nodeSize * 2, nodeSize * 2);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
`;
|
|
89
|
-
export default RESONANT_SOUND_BODIES_SKETCH;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rings.d.ts","sourceRoot":"","sources":["../../../../soundart-sketches/rings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,YAAY,u2FA+ExB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flow Grid Rings - SoundArt Style as Code Mode Sketch
|
|
3
|
-
*
|
|
4
|
-
* This is the first SoundArt style converted to a Code Mode sketch.
|
|
5
|
-
* It uses S.* globals (sound snapshot) instead of direct sound data.
|
|
6
|
-
*
|
|
7
|
-
* Original: client/src/pages/soundart/engine/styles_impl.ts - drawFlowGridRings
|
|
8
|
-
*/
|
|
9
|
-
export const RINGS_SKETCH = `
|
|
10
|
-
// Flow Grid Rings - SoundArt Style
|
|
11
|
-
// Uses S.* sound globals and standard p5-like functions
|
|
12
|
-
|
|
13
|
-
function setup() {
|
|
14
|
-
// Set background based on mode (rgb derived from sound, black, or white)
|
|
15
|
-
const bgMode = typeof backgroundMode !== 'undefined' ? backgroundMode : 'rgb';
|
|
16
|
-
|
|
17
|
-
if (bgMode === 'white') {
|
|
18
|
-
background(245, 245, 245);
|
|
19
|
-
} else if (bgMode === 'black') {
|
|
20
|
-
background(10, 10, 10);
|
|
21
|
-
} else {
|
|
22
|
-
// Deterministic RGB background derived from sound snapshot
|
|
23
|
-
// Previously used clock time, now uses sound parameters for reproducibility
|
|
24
|
-
const r = Math.floor((S.brightness / 100) * 255);
|
|
25
|
-
const g = Math.floor((S.rhythmicity / 100) * 255);
|
|
26
|
-
const b = Math.floor((S.harmonicity / 100) * 255);
|
|
27
|
-
background(r, g, b);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Grid dimensions based on sound volume
|
|
31
|
-
const cols = Math.floor(map(S.volume, 0, 100, 2, 32));
|
|
32
|
-
const rows = Math.floor(cols * 1.5);
|
|
33
|
-
const margin = map(S.length, 0, 100, width * 0.05, width * 0.1);
|
|
34
|
-
const innerW = width - margin * 2;
|
|
35
|
-
const innerH = height - margin * 2;
|
|
36
|
-
const cellW = innerW / cols;
|
|
37
|
-
const cellH = innerH / rows;
|
|
38
|
-
const gap = Math.min(cellW, cellH) * 0.25;
|
|
39
|
-
const maxRadius = (Math.min(cellW, cellH) - gap) / 2;
|
|
40
|
-
|
|
41
|
-
// Palette Harmony based on sound
|
|
42
|
-
const mainHue = (S.brightness * 3.6) % 360;
|
|
43
|
-
const hueShift = map(S.harmonicity, 0, 100, 20, 60);
|
|
44
|
-
const sat = map(S.treble, 0, 100, 60, 90);
|
|
45
|
-
const bri = map(S.bass, 0, 100, 70, 95);
|
|
46
|
-
|
|
47
|
-
// Generate palette
|
|
48
|
-
const palette = [
|
|
49
|
-
hslColor(mainHue, sat, bri),
|
|
50
|
-
hslColor((mainHue + hueShift) % 360, sat - 10, bri + 5),
|
|
51
|
-
hslColor((mainHue - hueShift + 360) % 360, sat - 10, bri + 5),
|
|
52
|
-
hslColor((mainHue + 180) % 360, sat - 20, bri - 10),
|
|
53
|
-
hslColor((mainHue + 120) % 360, sat, bri - 5),
|
|
54
|
-
hslColor((mainHue + 240) % 360, sat, bri - 5),
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
// Flow field parameters
|
|
58
|
-
const noiseScale = 0.15;
|
|
59
|
-
const noiseStrength = map(S.aggression, 0, 100, 0.5, 4.0);
|
|
60
|
-
const jitter = map(S.rhythmicity, 0, 100, 0, 0.15);
|
|
61
|
-
const ringBias = map(S.attack, 0, 100, 0.85, 1.15);
|
|
62
|
-
|
|
63
|
-
noStroke();
|
|
64
|
-
|
|
65
|
-
// Render Grid
|
|
66
|
-
for (let gx = 0; gx < cols; gx++) {
|
|
67
|
-
for (let gy = 0; gy < rows; gy++) {
|
|
68
|
-
const cx = margin + gx * cellW + cellW / 2 + (random() - 0.5) * jitter * cellW;
|
|
69
|
-
const cy = margin + gy * cellH + cellH / 2 + (random() - 0.5) * jitter * cellH;
|
|
70
|
-
|
|
71
|
-
const n = noise(gx * noiseScale, gy * noiseScale);
|
|
72
|
-
const angle = n * PI * 2 * noiseStrength;
|
|
73
|
-
const rings = Math.max(1, Math.floor(map(sin(angle), -1, 1, 1, 6)));
|
|
74
|
-
const step = (maxRadius / rings) * ringBias * 0.9;
|
|
75
|
-
|
|
76
|
-
for (let i = rings; i > 0; i--) {
|
|
77
|
-
fill(palette[(rings - i) % palette.length]);
|
|
78
|
-
ellipse(cx, cy, i * step * 2, i * step * 2);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Helper function for HSL colors
|
|
85
|
-
function hslColor(h, s, l) {
|
|
86
|
-
return 'hsl(' + h + ',' + s + '%,' + l + '%)';
|
|
87
|
-
}
|
|
88
|
-
`;
|
|
89
|
-
export default RINGS_SKETCH;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"squares.d.ts","sourceRoot":"","sources":["../../../../soundart-sketches/squares.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,0kDAkD1B,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export const SQUARES_SKETCH = `
|
|
2
|
-
function setup() {
|
|
3
|
-
const bgMode = typeof backgroundMode !== 'undefined' ? backgroundMode : 'rgb';
|
|
4
|
-
if (bgMode === 'white') background(245, 245, 245);
|
|
5
|
-
else if (bgMode === 'black') background(10, 10, 10);
|
|
6
|
-
else {
|
|
7
|
-
const r = Math.floor((S.brightness / 100) * 255);
|
|
8
|
-
const g = Math.floor((S.rhythmicity / 100) * 255);
|
|
9
|
-
const b = Math.floor((S.harmonicity / 100) * 255);
|
|
10
|
-
background(r, g, b);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const numSquares = Math.floor(map(S.length, 0, 100, 40, 300));
|
|
14
|
-
let size = Math.min(width, height) * 0.9;
|
|
15
|
-
const shrinkFactor = map(S.dynamicRange, 0, 100, 0.92, 1.08);
|
|
16
|
-
const rotationStep = map(S.aggression, 0, 100, 0.01, 0.07);
|
|
17
|
-
const strokeMin = map(S.volume, 0, 100, 1.0, 6.0);
|
|
18
|
-
const strokeMax = map(S.bass, 0, 100, 2.0, 8.0);
|
|
19
|
-
|
|
20
|
-
const colors = [];
|
|
21
|
-
for (let i = 0; i < 5; i++) {
|
|
22
|
-
const baseHue = (S.hue + i * 60 + random() * 20) % 360;
|
|
23
|
-
const sat = constrain(map(S.treble, 0, 100, 60, 95), 50, 100);
|
|
24
|
-
const bri = constrain(map(S.brightness, 0, 100, 40, 85), 30, 90);
|
|
25
|
-
colors.push(hslColor(baseHue, sat, bri));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
noFill();
|
|
29
|
-
translate(width / 2, height / 2);
|
|
30
|
-
|
|
31
|
-
let angle = 0;
|
|
32
|
-
for (let i = 0; i < numSquares; i++) {
|
|
33
|
-
const strokeW = strokeMin + (i / numSquares) * (strokeMax - strokeMin);
|
|
34
|
-
strokeWeight(strokeW);
|
|
35
|
-
stroke(colors[i % colors.length]);
|
|
36
|
-
|
|
37
|
-
push();
|
|
38
|
-
rotate(angle);
|
|
39
|
-
rect(-size / 2, -size / 2, size, size);
|
|
40
|
-
pop();
|
|
41
|
-
|
|
42
|
-
angle += rotationStep;
|
|
43
|
-
size *= shrinkFactor;
|
|
44
|
-
if (size < 4) break;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function hslColor(h, s, l) {
|
|
49
|
-
return 'hsl(' + h + ',' + s + '%,' + l + '%)';
|
|
50
|
-
}
|
|
51
|
-
`;
|
|
52
|
-
export default SQUARES_SKETCH;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"waveStripes.d.ts","sourceRoot":"","sources":["../../../../soundart-sketches/waveStripes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,6vDA0C/B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export const WAVE_STRIPES_SKETCH = `
|
|
2
|
-
function setup() {
|
|
3
|
-
const bgMode = typeof backgroundMode !== 'undefined' ? backgroundMode : 'rgb';
|
|
4
|
-
if (bgMode === 'white') background(245, 245, 245);
|
|
5
|
-
else if (bgMode === 'black') background(10, 10, 10);
|
|
6
|
-
else {
|
|
7
|
-
const r = Math.floor((S.brightness / 100) * 255);
|
|
8
|
-
const g = Math.floor((S.rhythmicity / 100) * 255);
|
|
9
|
-
const b = Math.floor((S.harmonicity / 100) * 255);
|
|
10
|
-
background(r, g, b);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const numLines = Math.floor(map(S.length, 0, 100, 5, 100));
|
|
14
|
-
const amp = map(S.volume, 0, 100, 0.012, 0.09);
|
|
15
|
-
const lineNoise = map(S.harmonicity, 0, 100, 0.1, 0.8);
|
|
16
|
-
const freqNoise = map(S.aggression, 0, 100, 0.004, 0.02);
|
|
17
|
-
const waveFreq = map(S.rhythmicity, 0, 100, 0.0003, 0.003);
|
|
18
|
-
const strokeW = map(S.bass, 0, 100, 2, 6.0);
|
|
19
|
-
const vividBoost = constrain(map(S.brightness, 0, 100, 0.6, 1.2), 0.6, 1.4);
|
|
20
|
-
|
|
21
|
-
noFill();
|
|
22
|
-
strokeWeight(strokeW);
|
|
23
|
-
|
|
24
|
-
for (let j = 0; j < numLines; j++) {
|
|
25
|
-
const yBase = map(j, 0, numLines - 1, 0.05 * height, 0.95 * height);
|
|
26
|
-
const lineTreble = constrain(S.treble + noise(j, 99) * 20 - 10, 0, 100);
|
|
27
|
-
const hue = ((map(lineTreble, 60, 100, 0, 360) + map(S.attack, 0, 100, 0, 120) + noise(j, 100) * 20 - 10) % 360 + 360) % 360;
|
|
28
|
-
|
|
29
|
-
stroke('hsl(' + hue + ',85%,' + constrain(vividBoost * 55, 40, 70) + '%)');
|
|
30
|
-
|
|
31
|
-
beginShape();
|
|
32
|
-
const pointSpacing = constrain(map(S.harmonicity, 0, 100, 20, 4), 4, 20);
|
|
33
|
-
for (let i = 0; i <= width; i += pointSpacing) {
|
|
34
|
-
const shimmer = sin(i * 0.05 + j * 0.1) * 0.05;
|
|
35
|
-
const offsetY = sin(i * waveFreq + j * 0.2 + shimmer) * amp * height;
|
|
36
|
-
const localNoiseVal = (noise(i * freqNoise, j * lineNoise) - 0.5) * amp * height;
|
|
37
|
-
const y = yBase + offsetY + localNoiseVal;
|
|
38
|
-
vertex(i, y);
|
|
39
|
-
}
|
|
40
|
-
endShape();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
`;
|
|
44
|
-
export default WAVE_STRIPES_SKETCH;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static-engine.d.ts","sourceRoot":"","sources":["../../../static-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAgB,MAAM,SAAS,CAAC;AAkDtE,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CA6Hf"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NexArt Code Mode Runtime SDK - Static Engine
|
|
3
|
-
* Protocol: v1.2.0 (Phase 3) — HARD ENFORCEMENT
|
|
4
|
-
*
|
|
5
|
-
* Static mode renderer: executes setup() only, captures single PNG.
|
|
6
|
-
* Does NOT execute draw() - per NexArt Execution Specification v1.
|
|
7
|
-
*
|
|
8
|
-
* Determinism Guarantee:
|
|
9
|
-
* Same code + same seed + same VARs = identical PNG output
|
|
10
|
-
*
|
|
11
|
-
* Security:
|
|
12
|
-
* All external entropy sources are blocked at runtime via execution sandbox.
|
|
13
|
-
*
|
|
14
|
-
* Oracle Support:
|
|
15
|
-
* When returnImageData is true, returns raw ImageData for determinism hashing.
|
|
16
|
-
* Works in both browser (HTMLCanvasElement) and Node (canvas package) environments.
|
|
17
|
-
*/
|
|
18
|
-
import { DEFAULT_CONFIG } from './types';
|
|
19
|
-
import { createP5Runtime, injectTimeVariables, injectProtocolVariables } from './p5-runtime';
|
|
20
|
-
import { FORBIDDEN_APIS, createSafeMath } from './execution-sandbox';
|
|
21
|
-
let nodeCanvasModule = null;
|
|
22
|
-
async function getNodeCanvas() {
|
|
23
|
-
if (nodeCanvasModule)
|
|
24
|
-
return nodeCanvasModule;
|
|
25
|
-
if (typeof window === 'undefined') {
|
|
26
|
-
try {
|
|
27
|
-
const { createRequire } = await import('module');
|
|
28
|
-
const require = createRequire(import.meta.url);
|
|
29
|
-
nodeCanvasModule = require('canvas');
|
|
30
|
-
return nodeCanvasModule;
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Create a runtime canvas that works in both browser and Node environments.
|
|
40
|
-
* Browser: uses HTMLCanvasElement
|
|
41
|
-
* Node/Headless: uses `canvas` npm package
|
|
42
|
-
*/
|
|
43
|
-
async function createRuntimeCanvas(width, height) {
|
|
44
|
-
// Browser environment
|
|
45
|
-
if (typeof document !== 'undefined' && typeof document.createElement === 'function') {
|
|
46
|
-
const canvas = document.createElement('canvas');
|
|
47
|
-
canvas.width = width;
|
|
48
|
-
canvas.height = height;
|
|
49
|
-
return canvas;
|
|
50
|
-
}
|
|
51
|
-
// Node / headless environment (oracle, CI)
|
|
52
|
-
const nodeCanvas = await getNodeCanvas();
|
|
53
|
-
if (nodeCanvas && nodeCanvas.createCanvas) {
|
|
54
|
-
return nodeCanvas.createCanvas(width, height);
|
|
55
|
-
}
|
|
56
|
-
throw new Error('[Code Mode Protocol Error] Headless canvas unavailable. ' +
|
|
57
|
-
'Install `canvas` for oracle execution.');
|
|
58
|
-
}
|
|
59
|
-
export async function runStaticMode(config, options) {
|
|
60
|
-
const { code, seed, vars, onPreview, onProgress, onComplete, onError, returnImageData } = options;
|
|
61
|
-
const width = config.width ?? DEFAULT_CONFIG.width;
|
|
62
|
-
const height = config.height ?? DEFAULT_CONFIG.height;
|
|
63
|
-
try {
|
|
64
|
-
onProgress?.({
|
|
65
|
-
phase: 'setup',
|
|
66
|
-
percent: 0,
|
|
67
|
-
message: 'Initializing canvas...',
|
|
68
|
-
});
|
|
69
|
-
// Create runtime canvas (browser or Node)
|
|
70
|
-
const canvas = await createRuntimeCanvas(width, height);
|
|
71
|
-
// Create p5 runtime with optional seed for determinism
|
|
72
|
-
const p = createP5Runtime(canvas, width, height, { seed });
|
|
73
|
-
// Inject time variables (static = frame 0, t = 0, totalFrames = 1)
|
|
74
|
-
injectTimeVariables(p, {
|
|
75
|
-
frameCount: 0,
|
|
76
|
-
t: 0,
|
|
77
|
-
time: 0,
|
|
78
|
-
tGlobal: 0,
|
|
79
|
-
totalFrames: 1, // Static mode has 1 frame
|
|
80
|
-
});
|
|
81
|
-
// Inject protocol variables (VAR[0..9])
|
|
82
|
-
injectProtocolVariables(p, vars);
|
|
83
|
-
onProgress?.({
|
|
84
|
-
phase: 'setup',
|
|
85
|
-
percent: 10,
|
|
86
|
-
message: 'Parsing code...',
|
|
87
|
-
});
|
|
88
|
-
// Extract setup() function only - draw() is NOT executed in Static Mode
|
|
89
|
-
const setupMatch = code.match(/function\s+setup\s*\(\s*\)\s*\{([\s\S]*?)\}(?=\s*function|\s*$)/);
|
|
90
|
-
const setupCode = setupMatch ? setupMatch[1].trim() : code;
|
|
91
|
-
// Validate - no forbidden patterns
|
|
92
|
-
const forbiddenPatterns = ['setTimeout', 'setInterval', 'requestAnimationFrame'];
|
|
93
|
-
for (const pattern of forbiddenPatterns) {
|
|
94
|
-
if (code.includes(pattern)) {
|
|
95
|
-
throw new Error(`Forbidden async timing function: ${pattern}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
onProgress?.({
|
|
99
|
-
phase: 'rendering',
|
|
100
|
-
percent: 30,
|
|
101
|
-
message: 'Executing setup()...',
|
|
102
|
-
});
|
|
103
|
-
// Create sandboxed execution context
|
|
104
|
-
// All forbidden APIs are injected as parameters to override globals
|
|
105
|
-
const safeMath = createSafeMath();
|
|
106
|
-
const forbiddenKeys = Object.keys(FORBIDDEN_APIS);
|
|
107
|
-
// Create wrapped setup function with p5 context, VAR, and blocked globals
|
|
108
|
-
const wrappedSetup = new Function('p', 'frameCount', 't', 'time', 'tGlobal', 'VAR', 'Math', ...forbiddenKeys, `with(p) { ${setupCode} }`);
|
|
109
|
-
// Execute setup() only with sandboxed context
|
|
110
|
-
const forbiddenValues = forbiddenKeys.map(k => FORBIDDEN_APIS[k]);
|
|
111
|
-
wrappedSetup(p, 0, 0, 0, 0, p.VAR, safeMath, ...forbiddenValues);
|
|
112
|
-
// Provide preview callback
|
|
113
|
-
onPreview?.(canvas);
|
|
114
|
-
onProgress?.({
|
|
115
|
-
phase: 'encoding',
|
|
116
|
-
percent: 70,
|
|
117
|
-
message: returnImageData ? 'Capturing ImageData...' : 'Capturing PNG...',
|
|
118
|
-
});
|
|
119
|
-
// Get 2D context for pixel access
|
|
120
|
-
const ctx = canvas.getContext('2d');
|
|
121
|
-
if (!ctx) {
|
|
122
|
-
throw new Error('Failed to acquire 2D context');
|
|
123
|
-
}
|
|
124
|
-
// Always capture pixel data first
|
|
125
|
-
const imageData = ctx.getImageData(0, 0, width, height);
|
|
126
|
-
// ORACLE / NODE PATH — MUST NOT TOUCH toBlob
|
|
127
|
-
if (returnImageData) {
|
|
128
|
-
onProgress?.({
|
|
129
|
-
phase: 'complete',
|
|
130
|
-
percent: 100,
|
|
131
|
-
message: 'Complete',
|
|
132
|
-
});
|
|
133
|
-
onComplete({
|
|
134
|
-
type: 'image',
|
|
135
|
-
imageData,
|
|
136
|
-
});
|
|
137
|
-
return; // Early return - never touch toBlob in oracle mode
|
|
138
|
-
}
|
|
139
|
-
// BROWSER / UI PATH ONLY
|
|
140
|
-
const blob = await new Promise((resolve, reject) => {
|
|
141
|
-
canvas.toBlob((b) => b ? resolve(b) : reject(new Error('Failed to capture PNG')), 'image/png');
|
|
142
|
-
});
|
|
143
|
-
onProgress?.({
|
|
144
|
-
phase: 'complete',
|
|
145
|
-
percent: 100,
|
|
146
|
-
message: 'Complete',
|
|
147
|
-
});
|
|
148
|
-
onComplete({
|
|
149
|
-
type: 'image',
|
|
150
|
-
blob,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
155
|
-
onError?.(err);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;CACZ,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;CACtB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,EAAE,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAChG;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,iBAE1B,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;CAOjB,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC;IACT,aAAa,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KAChC,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE;QACZ,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NexArt Code Mode Runtime SDK - Types
|
|
3
|
-
* See version.ts for SDK version (single source of truth)
|
|
4
|
-
*
|
|
5
|
-
* Type definitions for the Code Mode runtime engine.
|
|
6
|
-
* This is the canonical type surface for @nexart/codemode-sdk.
|
|
7
|
-
*/
|
|
8
|
-
import { PROTOCOL_VERSION, PROTOCOL_PHASE } from './version';
|
|
9
|
-
/**
|
|
10
|
-
* Protocol Constants
|
|
11
|
-
* These define the locked protocol identity.
|
|
12
|
-
* Imports from version.ts (single source of truth).
|
|
13
|
-
*/
|
|
14
|
-
export const PROTOCOL_IDENTITY = {
|
|
15
|
-
protocol: 'nexart',
|
|
16
|
-
engine: 'codemode',
|
|
17
|
-
protocolVersion: PROTOCOL_VERSION,
|
|
18
|
-
phase: PROTOCOL_PHASE,
|
|
19
|
-
deterministic: true,
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Default protocol variables (all zeros)
|
|
23
|
-
*/
|
|
24
|
-
export const DEFAULT_VARS = {
|
|
25
|
-
VAR: Object.freeze([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
26
|
-
};
|
|
27
|
-
export const DEFAULT_CONFIG = {
|
|
28
|
-
width: 1950,
|
|
29
|
-
height: 2400,
|
|
30
|
-
duration: 2,
|
|
31
|
-
fps: 30,
|
|
32
|
-
minDuration: 1,
|
|
33
|
-
maxDuration: 4,
|
|
34
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oDAAoD;AACpD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,8EAA8E;AAC9E,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,0DAA0D;AAC1D,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,0CAA0C;AAC1C,eAAO,MAAM,cAAc,6BAAoD,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @nexart/codemode-sdk — Single Source of Truth for Version Constants
|
|
3
|
-
*
|
|
4
|
-
* All version exports across the SDK MUST import from this module.
|
|
5
|
-
* This prevents version drift between package.json, runtime exports, and documentation.
|
|
6
|
-
*
|
|
7
|
-
* To update: Change values here and run `npm run build`.
|
|
8
|
-
* See package.json for the canonical npm version.
|
|
9
|
-
*/
|
|
10
|
-
/** SDK version - must match package.json version */
|
|
11
|
-
export const SDK_VERSION = '1.8.3';
|
|
12
|
-
/** Protocol version - defines runtime semantics and determinism guarantees */
|
|
13
|
-
export const PROTOCOL_VERSION = '1.2.0';
|
|
14
|
-
/** Protocol phase - phase 3 = stable, production-ready */
|
|
15
|
-
export const PROTOCOL_PHASE = 3;
|
|
16
|
-
/** Combined version string for display */
|
|
17
|
-
export const VERSION_STRING = `v${SDK_VERSION} (Protocol v${PROTOCOL_VERSION})`;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"soundSnapshot.d.ts","sourceRoot":"","sources":["../../../../shared/soundSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IAGf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IAGf,WAAW,EAAE,MAAM,CAAC;IAGpB,OAAO,EAAE,MAAM,CAAC;IAGhB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IAGf,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IAGV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,aAAa,CAmBxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE,aAAa,EAAE,EACxB,QAAQ,GAAE,MAAY,EACtB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,CAsEf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAEpF"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SoundSnapshot - Canonical sound data interface for Code Mode integration
|
|
3
|
-
*
|
|
4
|
-
* This is the single source of truth for sound-derived parameters.
|
|
5
|
-
* All values are normalized to 0-100 range for consistency.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* - Sound analysis produces SoundSnapshot
|
|
9
|
-
* - Code Mode receives it as read-only S.* globals
|
|
10
|
-
* - SoundArt styles become Code Mode sketches using S.*
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Create an empty/default SoundSnapshot with neutral values
|
|
14
|
-
*/
|
|
15
|
-
export function createEmptySoundSnapshot() {
|
|
16
|
-
return {
|
|
17
|
-
volume: 50,
|
|
18
|
-
amplitude: 50,
|
|
19
|
-
dynamicRange: 25,
|
|
20
|
-
brightness: 50,
|
|
21
|
-
bass: 30,
|
|
22
|
-
mid: 40,
|
|
23
|
-
treble: 30,
|
|
24
|
-
harmonicity: 50,
|
|
25
|
-
aggression: 30,
|
|
26
|
-
attack: 50,
|
|
27
|
-
rhythmicity: 40,
|
|
28
|
-
silence: 0,
|
|
29
|
-
hue: 50,
|
|
30
|
-
chroma: 50,
|
|
31
|
-
length: 50,
|
|
32
|
-
t: 0,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Clamp a value to 0-100 range
|
|
37
|
-
*/
|
|
38
|
-
export function clampPercent(value) {
|
|
39
|
-
return Math.max(0, Math.min(100, value));
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Convert a 0-1 normalized value to 0-100 percentage
|
|
43
|
-
*/
|
|
44
|
-
export function toPercent(value) {
|
|
45
|
-
return clampPercent(value * 100);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Create a SoundSnapshot from SoundFeatures (analysis output)
|
|
49
|
-
*
|
|
50
|
-
* @param sound - Raw sound features from analysis
|
|
51
|
-
* @param frames - Frame features array
|
|
52
|
-
* @param windowMs - Time window to average (default 800ms for recent snapshot)
|
|
53
|
-
* @param frameIndex - Current frame index for loop mode
|
|
54
|
-
* @param totalFrames - Total frames for loop mode
|
|
55
|
-
*/
|
|
56
|
-
export function createSoundSnapshot(sound, frames, windowMs = 800, frameIndex, totalFrames) {
|
|
57
|
-
const framesArr = frames || sound.frames || [];
|
|
58
|
-
const bands = {
|
|
59
|
-
bass: sound.bands?.bass ?? 0.3,
|
|
60
|
-
lowMid: sound.bands?.lowMid ?? 0.25,
|
|
61
|
-
highMid: sound.bands?.highMid ?? 0.25,
|
|
62
|
-
treble: sound.bands?.treble ?? 0.2
|
|
63
|
-
};
|
|
64
|
-
// Get recent frames within window
|
|
65
|
-
const now = framesArr.length > 0
|
|
66
|
-
? framesArr[framesArr.length - 1].t1 * 1000
|
|
67
|
-
: 0;
|
|
68
|
-
const windowStart = now - windowMs;
|
|
69
|
-
const recentFrames = framesArr.filter(f => f.t1 * 1000 >= windowStart);
|
|
70
|
-
const useFrames = recentFrames.length > 0 ? recentFrames : framesArr;
|
|
71
|
-
// Helper to extract and average frame values
|
|
72
|
-
const getFrameAvg = (key, def) => {
|
|
73
|
-
if (useFrames.length === 0)
|
|
74
|
-
return def;
|
|
75
|
-
const values = useFrames.map(f => f[key] ?? def);
|
|
76
|
-
return values.reduce((a, b) => a + b, 0) / values.length;
|
|
77
|
-
};
|
|
78
|
-
const getFrameSpan = (key, def) => {
|
|
79
|
-
if (useFrames.length < 2)
|
|
80
|
-
return 0;
|
|
81
|
-
const values = useFrames.map(f => f[key] ?? def);
|
|
82
|
-
return Math.max(...values) - Math.min(...values);
|
|
83
|
-
};
|
|
84
|
-
// Extract averaged values
|
|
85
|
-
const rmsNow = getFrameAvg('rms', sound.rms ?? 0);
|
|
86
|
-
const ampNow = getFrameAvg('amplitude', sound.rms ?? 0);
|
|
87
|
-
const attNow = getFrameAvg('attack', 0.5);
|
|
88
|
-
const harmNow = getFrameAvg('harmonicity', 0.5);
|
|
89
|
-
const aggrNow = getFrameAvg('aggression', 0.5);
|
|
90
|
-
const rhNow = getFrameAvg('rhythmicity', 0.4);
|
|
91
|
-
const silNow = getFrameAvg('silence', 0);
|
|
92
|
-
const dynNow = getFrameSpan('rms', sound.rms ?? 0);
|
|
93
|
-
const centNow = getFrameAvg('centroid', sound.centroid ?? 0.5);
|
|
94
|
-
// Apply perceptual scaling for loudness
|
|
95
|
-
const amplifiedRms = Math.pow(rmsNow, 0.33);
|
|
96
|
-
const amplifiedAmp = Math.pow(ampNow, 0.4);
|
|
97
|
-
// Calculate normalized time
|
|
98
|
-
const t = frameIndex !== undefined && totalFrames !== undefined
|
|
99
|
-
? frameIndex / Math.max(1, totalFrames)
|
|
100
|
-
: (framesArr.length > 0 ? 1 : 0);
|
|
101
|
-
return {
|
|
102
|
-
volume: toPercent(amplifiedRms),
|
|
103
|
-
amplitude: toPercent(amplifiedAmp),
|
|
104
|
-
dynamicRange: toPercent(dynNow),
|
|
105
|
-
brightness: toPercent(centNow),
|
|
106
|
-
bass: toPercent(bands.bass),
|
|
107
|
-
mid: toPercent((bands.lowMid + bands.highMid) / 2),
|
|
108
|
-
treble: toPercent(bands.treble),
|
|
109
|
-
harmonicity: toPercent(harmNow),
|
|
110
|
-
aggression: toPercent(aggrNow),
|
|
111
|
-
attack: toPercent(attNow),
|
|
112
|
-
rhythmicity: toPercent(rhNow),
|
|
113
|
-
silence: toPercent(silNow),
|
|
114
|
-
hue: toPercent(centNow * 0.75 + aggrNow * 0.25),
|
|
115
|
-
chroma: toPercent(Math.min(1, Math.sqrt((bands.bass + bands.treble) / 2))),
|
|
116
|
-
length: Math.min(100, (sound.durationSec ?? 0) * 10),
|
|
117
|
-
t,
|
|
118
|
-
frame: frameIndex,
|
|
119
|
-
totalFrames,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Freeze a SoundSnapshot to make it immutable
|
|
124
|
-
* This is used when injecting into Code Mode to prevent modification
|
|
125
|
-
*/
|
|
126
|
-
export function freezeSoundSnapshot(snapshot) {
|
|
127
|
-
return Object.freeze({ ...snapshot });
|
|
128
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|