@dg-kit/waveforms 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/README.md +15 -0
- package/dist/basic.d.ts +4 -0
- package/dist/basic.d.ts.map +1 -0
- package/dist/basic.js +104 -0
- package/dist/basic.js.map +1 -0
- package/dist/design.d.ts +40 -0
- package/dist/design.d.ts.map +1 -0
- package/dist/design.js +76 -0
- package/dist/design.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/pulse.d.ts +20 -0
- package/dist/pulse.d.ts.map +1 -0
- package/dist/pulse.js +150 -0
- package/dist/pulse.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# @dg-kit/waveforms
|
|
2
|
+
|
|
3
|
+
Runtime-agnostic waveform helpers for DG-Lab Coyote.
|
|
4
|
+
|
|
5
|
+
## What's inside
|
|
6
|
+
|
|
7
|
+
- **`createBasicWaveformLibrary()`** — six built-in waveforms (`breath`, `tide`, `pulse_low`, `pulse_mid`, `pulse_high`, `tap`) implementing the `WaveformLibrary` interface.
|
|
8
|
+
- **`compileWaveformDesign(segments)`** — takes a list of `ramp` / `hold` / `pulse` / `silence` segments and produces a `WaveFrame[]` on a 25 ms grid. Used by the `design_wave` LLM tool.
|
|
9
|
+
- **`parsePulseText(content)`** — parses a single `.pulse` file (DG-Lab's "Dungeonlab+pulse:" text format) and returns frames + the embedded display name.
|
|
10
|
+
|
|
11
|
+
This package has zero browser/Node-only dependencies. Storage (IndexedDB on the web, JSON file on Node) lives in consumer-specific packages — this one only deals with the in-memory shape.
|
|
12
|
+
|
|
13
|
+
## Frame grid
|
|
14
|
+
|
|
15
|
+
Every `WaveFrame` represents 25 ms. The Coyote 3.0 protocol packs four frames into each 100 ms BLE write; the Coyote 2.0 protocol consumes one frame per 100 ms tick (with precision loss). Designing on a 25 ms grid keeps the data lossless and lets the protocol layer pick the right packing.
|
package/dist/basic.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAmGxE,wBAAgB,0BAA0B,IAAI,eAAe,CAE5D;AAED,wBAAgB,oBAAoB,IAAI,kBAAkB,EAAE,CAE3D"}
|
package/dist/basic.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
const BUILTIN_WAVEFORMS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'breath',
|
|
4
|
+
name: '呼吸',
|
|
5
|
+
description: '渐强渐弱,最温柔的铺垫波形',
|
|
6
|
+
frames: [
|
|
7
|
+
[10, 0],
|
|
8
|
+
[10, 20],
|
|
9
|
+
[10, 40],
|
|
10
|
+
[10, 60],
|
|
11
|
+
[10, 80],
|
|
12
|
+
[10, 100],
|
|
13
|
+
[10, 100],
|
|
14
|
+
[10, 100],
|
|
15
|
+
[10, 0],
|
|
16
|
+
[10, 0],
|
|
17
|
+
[10, 0],
|
|
18
|
+
[10, 0],
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'tide',
|
|
23
|
+
name: '潮汐',
|
|
24
|
+
description: '波浪般起伏的慢节奏',
|
|
25
|
+
frames: [
|
|
26
|
+
[10, 0],
|
|
27
|
+
[11, 16],
|
|
28
|
+
[13, 33],
|
|
29
|
+
[14, 50],
|
|
30
|
+
[16, 66],
|
|
31
|
+
[18, 83],
|
|
32
|
+
[19, 100],
|
|
33
|
+
[21, 92],
|
|
34
|
+
[22, 84],
|
|
35
|
+
[24, 76],
|
|
36
|
+
[26, 68],
|
|
37
|
+
[26, 0],
|
|
38
|
+
[27, 16],
|
|
39
|
+
[29, 33],
|
|
40
|
+
[30, 50],
|
|
41
|
+
[32, 66],
|
|
42
|
+
[34, 83],
|
|
43
|
+
[35, 100],
|
|
44
|
+
[37, 92],
|
|
45
|
+
[38, 84],
|
|
46
|
+
[40, 76],
|
|
47
|
+
[42, 68],
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: 'pulse_low',
|
|
52
|
+
name: '低脉冲',
|
|
53
|
+
description: '轻柔的规律节奏',
|
|
54
|
+
frames: Array.from({ length: 10 }, () => [10, 30]),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'pulse_mid',
|
|
58
|
+
name: '中脉冲',
|
|
59
|
+
description: '中等强度的规律节奏',
|
|
60
|
+
frames: Array.from({ length: 10 }, () => [10, 60]),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'pulse_high',
|
|
64
|
+
name: '高脉冲',
|
|
65
|
+
description: '强烈的规律节奏',
|
|
66
|
+
frames: Array.from({ length: 10 }, () => [10, 100]),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: 'tap',
|
|
70
|
+
name: '敲击',
|
|
71
|
+
description: '带节奏停顿的点触感',
|
|
72
|
+
frames: [
|
|
73
|
+
[10, 100],
|
|
74
|
+
[10, 0],
|
|
75
|
+
[10, 0],
|
|
76
|
+
[10, 100],
|
|
77
|
+
[10, 0],
|
|
78
|
+
[10, 0],
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
class BasicWaveformLibrary {
|
|
83
|
+
byId = new Map(BUILTIN_WAVEFORMS.map((waveform) => [waveform.id, cloneWaveform(waveform)]));
|
|
84
|
+
async getById(id) {
|
|
85
|
+
const waveform = this.byId.get(id);
|
|
86
|
+
return waveform ? cloneWaveform(waveform) : null;
|
|
87
|
+
}
|
|
88
|
+
async list() {
|
|
89
|
+
return [...this.byId.values()].map(cloneWaveform);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function createBasicWaveformLibrary() {
|
|
93
|
+
return new BasicWaveformLibrary();
|
|
94
|
+
}
|
|
95
|
+
export function listBuiltinWaveforms() {
|
|
96
|
+
return BUILTIN_WAVEFORMS.map(cloneWaveform);
|
|
97
|
+
}
|
|
98
|
+
function cloneWaveform(waveform) {
|
|
99
|
+
return {
|
|
100
|
+
...waveform,
|
|
101
|
+
frames: waveform.frames.map((frame) => [frame[0], frame[1]]),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=basic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic.js","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"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"}
|
package/dist/design.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { WaveFrame } from '@dg-kit/core';
|
|
2
|
+
export type DesignSegment = RampSegment | HoldSegment | PulseSegment | SilenceSegment;
|
|
3
|
+
export interface RampSegment {
|
|
4
|
+
type: 'ramp';
|
|
5
|
+
/** Start intensity, 0-100. */
|
|
6
|
+
from: number;
|
|
7
|
+
/** End intensity, 0-100. */
|
|
8
|
+
to: number;
|
|
9
|
+
/** Total segment duration in milliseconds; rounded to 25 ms frame grid. */
|
|
10
|
+
durationMs: number;
|
|
11
|
+
/** Pulse-frequency value in ms (10-1000). Default 100. */
|
|
12
|
+
frequencyMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface HoldSegment {
|
|
15
|
+
type: 'hold';
|
|
16
|
+
intensity: number;
|
|
17
|
+
durationMs: number;
|
|
18
|
+
frequencyMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface PulseSegment {
|
|
21
|
+
type: 'pulse';
|
|
22
|
+
intensity: number;
|
|
23
|
+
/** On phase in milliseconds; rounded to 25 ms grid. */
|
|
24
|
+
onMs: number;
|
|
25
|
+
/** Off phase in milliseconds; rounded to 25 ms grid. */
|
|
26
|
+
offMs: number;
|
|
27
|
+
/** Number of on/off cycles. */
|
|
28
|
+
count: number;
|
|
29
|
+
frequencyMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface SilenceSegment {
|
|
32
|
+
type: 'silence';
|
|
33
|
+
durationMs: number;
|
|
34
|
+
}
|
|
35
|
+
export interface CompiledDesign {
|
|
36
|
+
frames: WaveFrame[];
|
|
37
|
+
totalDurationMs: number;
|
|
38
|
+
}
|
|
39
|
+
export declare function compileWaveformDesign(segments: DesignSegment[]): CompiledDesign;
|
|
40
|
+
//# sourceMappingURL=design.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.d.ts","sourceRoot":"","sources":["../src/design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAgED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,cAAc,CAe/E"}
|
package/dist/design.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const FRAME_GRID_MS = 25;
|
|
2
|
+
const DEFAULT_FREQUENCY_MS = 100;
|
|
3
|
+
const MIN_FREQUENCY_MS = 10;
|
|
4
|
+
const MAX_FREQUENCY_MS = 1000;
|
|
5
|
+
const TOTAL_DURATION_LIMIT_MS = 30_000;
|
|
6
|
+
function clampIntensity(value) {
|
|
7
|
+
return Math.max(0, Math.min(100, Math.round(value)));
|
|
8
|
+
}
|
|
9
|
+
function clampFrequency(value) {
|
|
10
|
+
const v = typeof value === 'number' && Number.isFinite(value) ? value : DEFAULT_FREQUENCY_MS;
|
|
11
|
+
return Math.max(MIN_FREQUENCY_MS, Math.min(MAX_FREQUENCY_MS, Math.round(v)));
|
|
12
|
+
}
|
|
13
|
+
function frameCount(durationMs) {
|
|
14
|
+
return Math.max(1, Math.round(durationMs / FRAME_GRID_MS));
|
|
15
|
+
}
|
|
16
|
+
function compileSegment(segment) {
|
|
17
|
+
switch (segment.type) {
|
|
18
|
+
case 'ramp': {
|
|
19
|
+
const freq = clampFrequency(segment.frequencyMs);
|
|
20
|
+
const count = frameCount(segment.durationMs);
|
|
21
|
+
const from = clampIntensity(segment.from);
|
|
22
|
+
const to = clampIntensity(segment.to);
|
|
23
|
+
const frames = [];
|
|
24
|
+
for (let i = 0; i < count; i += 1) {
|
|
25
|
+
const t = count === 1 ? 1 : i / (count - 1);
|
|
26
|
+
const intensity = clampIntensity(from + (to - from) * t);
|
|
27
|
+
frames.push([freq, intensity]);
|
|
28
|
+
}
|
|
29
|
+
return frames;
|
|
30
|
+
}
|
|
31
|
+
case 'hold': {
|
|
32
|
+
const freq = clampFrequency(segment.frequencyMs);
|
|
33
|
+
const count = frameCount(segment.durationMs);
|
|
34
|
+
const intensity = clampIntensity(segment.intensity);
|
|
35
|
+
return Array.from({ length: count }, () => [freq, intensity]);
|
|
36
|
+
}
|
|
37
|
+
case 'pulse': {
|
|
38
|
+
const freq = clampFrequency(segment.frequencyMs);
|
|
39
|
+
const intensity = clampIntensity(segment.intensity);
|
|
40
|
+
const onCount = frameCount(segment.onMs);
|
|
41
|
+
const offCount = frameCount(segment.offMs);
|
|
42
|
+
const cycles = Math.max(1, Math.round(segment.count));
|
|
43
|
+
const frames = [];
|
|
44
|
+
for (let cycle = 0; cycle < cycles; cycle += 1) {
|
|
45
|
+
for (let i = 0; i < onCount; i += 1)
|
|
46
|
+
frames.push([freq, intensity]);
|
|
47
|
+
for (let i = 0; i < offCount; i += 1)
|
|
48
|
+
frames.push([freq, 0]);
|
|
49
|
+
}
|
|
50
|
+
return frames;
|
|
51
|
+
}
|
|
52
|
+
case 'silence': {
|
|
53
|
+
const count = frameCount(segment.durationMs);
|
|
54
|
+
// Frequency value is irrelevant when intensity is 0; pick the default to
|
|
55
|
+
// avoid surprising downstream encoders that special-case 0 frequency.
|
|
56
|
+
return Array.from({ length: count }, () => [DEFAULT_FREQUENCY_MS, 0]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function compileWaveformDesign(segments) {
|
|
61
|
+
if (segments.length === 0) {
|
|
62
|
+
throw new Error('设计波形需要至少一个段落');
|
|
63
|
+
}
|
|
64
|
+
const frames = [];
|
|
65
|
+
for (const segment of segments) {
|
|
66
|
+
for (const frame of compileSegment(segment)) {
|
|
67
|
+
frames.push(frame);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const totalDurationMs = frames.length * FRAME_GRID_MS;
|
|
71
|
+
if (totalDurationMs > TOTAL_DURATION_LIMIT_MS) {
|
|
72
|
+
throw new Error(`波形总时长 ${totalDurationMs}ms 超过上限 ${TOTAL_DURATION_LIMIT_MS}ms`);
|
|
73
|
+
}
|
|
74
|
+
return { frames, totalDurationMs };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../src/design.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createBasicWaveformLibrary, listBuiltinWaveforms } from './basic.js';
|
|
2
|
+
export { compileWaveformDesign, type CompiledDesign, type DesignSegment, type HoldSegment, type PulseSegment, type RampSegment, type SilenceSegment, } from './design.js';
|
|
3
|
+
export { encodeFreq, parsePulseText, pulseToWaveformDefinition, type ParsedPulse, } from './pulse.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,cAAc,EACd,yBAAyB,EACzB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,qBAAqB,GAOtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,cAAc,EACd,yBAAyB,GAE1B,MAAM,YAAY,CAAC"}
|
package/dist/pulse.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WaveFrame } from '@dg-kit/core';
|
|
2
|
+
export declare function encodeFreq(value: number): number;
|
|
3
|
+
export interface ParsedPulse {
|
|
4
|
+
/** Embedded waveform name from the file (the part before "="); empty if missing. */
|
|
5
|
+
name: string;
|
|
6
|
+
frames: WaveFrame[];
|
|
7
|
+
}
|
|
8
|
+
export declare function parsePulseText(data: string): ParsedPulse;
|
|
9
|
+
/**
|
|
10
|
+
* Convenience helper: turn a parsed pulse + filename into a `WaveformDefinition`
|
|
11
|
+
* with a stable-but-unique id. Used by importers (browser file input, Node fs).
|
|
12
|
+
*/
|
|
13
|
+
export declare function pulseToWaveformDefinition(fileName: string, parsed: ParsedPulse, options?: {
|
|
14
|
+
idPrefix?: string;
|
|
15
|
+
}): {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
frames: WaveFrame[];
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=pulse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pulse.d.ts","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAyB9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAcD,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgHxD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAanD"}
|
package/dist/pulse.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for DG-Lab's `.pulse` text format ("Dungeonlab+pulse:..."). Each file
|
|
3
|
+
* encodes one waveform with up to 10 sections; we expand them into a flat
|
|
4
|
+
* `WaveFrame[]` on the 25 ms grid.
|
|
5
|
+
*
|
|
6
|
+
* Pure function — no DOM, no Node-only APIs. Use from any runtime.
|
|
7
|
+
*/
|
|
8
|
+
const FREQ_DATASET = [
|
|
9
|
+
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
|
|
10
|
+
];
|
|
11
|
+
const DURATION_DATASET = [1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 40, 50, 60];
|
|
12
|
+
function freqFromIndex(index) {
|
|
13
|
+
const clamped = Math.max(0, Math.min(FREQ_DATASET.length - 1, Math.floor(index)));
|
|
14
|
+
return FREQ_DATASET[clamped] ?? 10;
|
|
15
|
+
}
|
|
16
|
+
function durationFromIndex(index) {
|
|
17
|
+
const clamped = Math.max(0, Math.min(DURATION_DATASET.length - 1, Math.floor(index)));
|
|
18
|
+
return DURATION_DATASET[clamped] ?? 1;
|
|
19
|
+
}
|
|
20
|
+
export function encodeFreq(value) {
|
|
21
|
+
let output;
|
|
22
|
+
if (value >= 10 && value <= 100)
|
|
23
|
+
output = value;
|
|
24
|
+
else if (value > 100 && value <= 600)
|
|
25
|
+
output = (value - 100) / 5 + 100;
|
|
26
|
+
else if (value > 600 && value <= 1000)
|
|
27
|
+
output = (value - 600) / 10 + 200;
|
|
28
|
+
else if (value < 10)
|
|
29
|
+
output = 10;
|
|
30
|
+
else
|
|
31
|
+
output = 240;
|
|
32
|
+
return Math.max(10, Math.min(240, Math.round(output)));
|
|
33
|
+
}
|
|
34
|
+
export function parsePulseText(data) {
|
|
35
|
+
const trimmed = data.trim();
|
|
36
|
+
if (!/^Dungeonlab\+pulse:/i.test(trimmed)) {
|
|
37
|
+
throw new Error("脉冲格式无效,必须以 'Dungeonlab+pulse:' 开头");
|
|
38
|
+
}
|
|
39
|
+
const cleanData = trimmed.replace(/^Dungeonlab\+pulse:/i, '');
|
|
40
|
+
const sectionParts = cleanData.split('+section+');
|
|
41
|
+
if (sectionParts.length === 0 || !sectionParts[0]) {
|
|
42
|
+
throw new Error('脉冲数据无效,未找到任何分段');
|
|
43
|
+
}
|
|
44
|
+
const firstPart = sectionParts[0];
|
|
45
|
+
const equalIndex = firstPart.indexOf('=');
|
|
46
|
+
if (equalIndex === -1) {
|
|
47
|
+
throw new Error("脉冲格式无效,缺少 '=' 分隔符");
|
|
48
|
+
}
|
|
49
|
+
const embeddedName = firstPart.substring(0, equalIndex).trim();
|
|
50
|
+
const sections = [];
|
|
51
|
+
const firstSectionData = firstPart.substring(equalIndex + 1);
|
|
52
|
+
const allSectionData = [firstSectionData, ...sectionParts.slice(1)];
|
|
53
|
+
for (let index = 0; index < allSectionData.length && index < 10; index++) {
|
|
54
|
+
const sectionData = allSectionData[index];
|
|
55
|
+
if (!sectionData)
|
|
56
|
+
continue;
|
|
57
|
+
const slashIndex = sectionData.indexOf('/');
|
|
58
|
+
if (slashIndex === -1) {
|
|
59
|
+
throw new Error(`第 ${index + 1} 段缺少 '/' 分隔符`);
|
|
60
|
+
}
|
|
61
|
+
const headerPart = sectionData.substring(0, slashIndex);
|
|
62
|
+
const shapePart = sectionData.substring(slashIndex + 1);
|
|
63
|
+
const headerValues = headerPart.split(',');
|
|
64
|
+
const freqRange1Index = Number(headerValues[0]) || 0;
|
|
65
|
+
const freqRange2Index = Number(headerValues[1]) || 0;
|
|
66
|
+
const durationIndex = Number(headerValues[2]) || 0;
|
|
67
|
+
const freqMode = Number(headerValues[3]) || 1;
|
|
68
|
+
const enabled = headerValues[4] !== '0';
|
|
69
|
+
const shapePoints = [];
|
|
70
|
+
for (const item of shapePart.split(',')) {
|
|
71
|
+
if (!item)
|
|
72
|
+
continue;
|
|
73
|
+
const [strengthStr] = item.split('-');
|
|
74
|
+
const strength = Math.round(Number(strengthStr) || 0);
|
|
75
|
+
shapePoints.push({ strength: Math.max(0, Math.min(100, strength)) });
|
|
76
|
+
}
|
|
77
|
+
if (shapePoints.length < 2) {
|
|
78
|
+
throw new Error(`第 ${index + 1} 段至少需要 2 个形状点`);
|
|
79
|
+
}
|
|
80
|
+
if (enabled) {
|
|
81
|
+
sections.push({
|
|
82
|
+
frequencyMode: freqMode,
|
|
83
|
+
shape: shapePoints,
|
|
84
|
+
startFrequency: freqFromIndex(freqRange1Index),
|
|
85
|
+
endFrequency: freqFromIndex(freqRange2Index),
|
|
86
|
+
duration: durationFromIndex(durationIndex),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (sections.length === 0) {
|
|
91
|
+
throw new Error('脉冲数据无效,没有启用的分段');
|
|
92
|
+
}
|
|
93
|
+
const frames = [];
|
|
94
|
+
for (const section of sections) {
|
|
95
|
+
const shapeCount = section.shape.length;
|
|
96
|
+
const pulseElementDuration = shapeCount;
|
|
97
|
+
const sectionDuration = section.duration;
|
|
98
|
+
const { startFrequency, endFrequency, frequencyMode } = section;
|
|
99
|
+
const pulseElementCount = Math.max(1, Math.ceil(sectionDuration / pulseElementDuration));
|
|
100
|
+
const actualDuration = pulseElementCount * pulseElementDuration;
|
|
101
|
+
for (let elementIndex = 0; elementIndex < pulseElementCount; elementIndex++) {
|
|
102
|
+
for (let shapeIndex = 0; shapeIndex < shapeCount; shapeIndex++) {
|
|
103
|
+
const strength = section.shape[shapeIndex]?.strength ?? 0;
|
|
104
|
+
const currentTime = elementIndex * pulseElementDuration + shapeIndex;
|
|
105
|
+
const sectionProgress = currentTime / actualDuration;
|
|
106
|
+
const elementProgress = shapeIndex / shapeCount;
|
|
107
|
+
let rawFreq;
|
|
108
|
+
switch (frequencyMode) {
|
|
109
|
+
case 2:
|
|
110
|
+
rawFreq = startFrequency + (endFrequency - startFrequency) * sectionProgress;
|
|
111
|
+
break;
|
|
112
|
+
case 3:
|
|
113
|
+
rawFreq = startFrequency + (endFrequency - startFrequency) * elementProgress;
|
|
114
|
+
break;
|
|
115
|
+
case 4: {
|
|
116
|
+
const progress = pulseElementCount > 1 ? elementIndex / (pulseElementCount - 1) : 0;
|
|
117
|
+
rawFreq = startFrequency + (endFrequency - startFrequency) * progress;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
rawFreq = startFrequency;
|
|
122
|
+
}
|
|
123
|
+
frames.push([encodeFreq(rawFreq), Math.max(0, Math.min(100, Math.round(strength)))]);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (frames.length === 0) {
|
|
128
|
+
throw new Error('解析后的波形为空');
|
|
129
|
+
}
|
|
130
|
+
return { name: embeddedName, frames };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Convenience helper: turn a parsed pulse + filename into a `WaveformDefinition`
|
|
134
|
+
* with a stable-but-unique id. Used by importers (browser file input, Node fs).
|
|
135
|
+
*/
|
|
136
|
+
export function pulseToWaveformDefinition(fileName, parsed, options = {}) {
|
|
137
|
+
const fallbackName = fileName.replace(/\.(pulse|zip)$/i, '');
|
|
138
|
+
const displayName = parsed.name || fallbackName;
|
|
139
|
+
const idSeed = displayName
|
|
140
|
+
.toLowerCase()
|
|
141
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
142
|
+
.replace(/^-|-$/g, '');
|
|
143
|
+
const prefix = options.idPrefix ?? 'custom';
|
|
144
|
+
return {
|
|
145
|
+
id: `${prefix}-${idSeed || 'wave'}-${Date.now().toString(36)}`,
|
|
146
|
+
name: displayName,
|
|
147
|
+
frames: parsed.frames,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=pulse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pulse.js","sourceRoot":"","sources":["../src/pulse.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dg-kit/waveforms",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Built-in waveforms, design compiler, and .pulse parser for DG-Lab Coyote",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "0xNullAI",
|
|
7
|
+
"homepage": "https://github.com/0xNullAI/DG-Kit/tree/main/packages/waveforms",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/0xNullAI/DG-Kit.git",
|
|
11
|
+
"directory": "packages/waveforms"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./src/index.ts",
|
|
15
|
+
"types": "./src/index.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./src/index.ts",
|
|
19
|
+
"import": "./src/index.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public",
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@dg-kit/core": "0.1.0"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsc -p tsconfig.json",
|
|
42
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"dg-lab",
|
|
46
|
+
"coyote",
|
|
47
|
+
"waveform"
|
|
48
|
+
]
|
|
49
|
+
}
|