@audiofab-io/fv1-core 0.2.2 → 0.4.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.
Files changed (133) hide show
  1. package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -0
  2. package/blocks/control/constant.atl +36 -0
  3. package/blocks/control/entropy_lfo.atl +74 -0
  4. package/blocks/control/envelope.atl +121 -0
  5. package/blocks/control/invert.atl +33 -0
  6. package/blocks/control/pot.atl +150 -0
  7. package/blocks/control/power.atl +77 -0
  8. package/blocks/control/ramp_lfo.atl +122 -0
  9. package/blocks/control/scale_offset.atl +84 -0
  10. package/blocks/control/sincos_lfo.atl +126 -0
  11. package/blocks/control/smoother.atl +48 -0
  12. package/blocks/control/tremolizer.atl +55 -0
  13. package/blocks/effects/delay/micro_stutter.atl +77 -0
  14. package/blocks/effects/delay/mn3011.atl +281 -0
  15. package/blocks/effects/delay/simple_delay.atl +96 -0
  16. package/blocks/effects/delay/triple_tap_delay.atl +176 -0
  17. package/blocks/effects/lo-fi/bit_mangler.atl +74 -0
  18. package/blocks/effects/lo-fi/chiptune.atl +311 -0
  19. package/blocks/effects/lo-fi/tape_degrade.atl +181 -0
  20. package/blocks/effects/modulation/chorus.atl +141 -0
  21. package/blocks/effects/modulation/chorus_4voice.atl +188 -0
  22. package/blocks/effects/modulation/flanger.atl +184 -0
  23. package/blocks/effects/modulation/guitar_synth.atl +350 -0
  24. package/blocks/effects/modulation/harmonic_trem.atl +129 -0
  25. package/blocks/effects/modulation/organ_synth.atl +326 -0
  26. package/blocks/effects/modulation/phaser.atl +300 -0
  27. package/blocks/effects/pitch/octave_up_down.atl +80 -0
  28. package/blocks/effects/pitch/pitch_offset.atl +149 -0
  29. package/blocks/effects/pitch/pitch_offset_dual.atl +197 -0
  30. package/blocks/effects/pitch/pitch_shift.atl +115 -0
  31. package/blocks/effects/pitch/sub_octave.atl +100 -0
  32. package/blocks/effects/reverb/ducking_reverb.atl +145 -0
  33. package/blocks/effects/reverb/min_reverb.atl +132 -0
  34. package/blocks/effects/reverb/plate_reverb.atl +344 -0
  35. package/blocks/effects/reverb/room_reverb.atl +293 -0
  36. package/blocks/effects/reverb/smear.atl +90 -0
  37. package/blocks/effects/reverb/spring_reverb.atl +353 -0
  38. package/blocks/filter/1p_high_pass.atl +63 -0
  39. package/blocks/filter/1p_low_pass.atl +59 -0
  40. package/blocks/filter/auto_wah.atl +207 -0
  41. package/blocks/filter/bbd_loss.atl +79 -0
  42. package/blocks/filter/shelving_high_pass.atl +76 -0
  43. package/blocks/filter/shelving_low_pass.atl +76 -0
  44. package/blocks/filter/svf_2p.atl +116 -0
  45. package/blocks/gain_mix/crossfade.atl +93 -0
  46. package/blocks/gain_mix/crossfade2.atl +86 -0
  47. package/blocks/gain_mix/crossfade3.atl +71 -0
  48. package/blocks/gain_mix/gainboost.atl +54 -0
  49. package/blocks/gain_mix/mixer2.atl +76 -0
  50. package/blocks/gain_mix/mixer3.atl +109 -0
  51. package/blocks/gain_mix/mixer4.atl +152 -0
  52. package/blocks/gain_mix/volume.atl +51 -0
  53. package/blocks/io/adc.atl +53 -0
  54. package/blocks/io/dac.atl +61 -0
  55. package/blocks/other/stickynote.atl +24 -0
  56. package/blocks/other/tone_gen_adjustable.atl +137 -0
  57. package/blocks/other/tone_gen_fixed.atl +109 -0
  58. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts +13 -0
  59. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts.map +1 -0
  60. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js +44 -0
  61. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js.map +1 -0
  62. package/dist/blockDiagram/blocks/BlockRegistry.d.ts +48 -0
  63. package/dist/blockDiagram/blocks/BlockRegistry.d.ts.map +1 -0
  64. package/dist/blockDiagram/blocks/BlockRegistry.js +109 -0
  65. package/dist/blockDiagram/blocks/BlockRegistry.js.map +1 -0
  66. package/dist/blockDiagram/blocks/TemplateBlock.d.ts +20 -0
  67. package/dist/blockDiagram/blocks/TemplateBlock.d.ts.map +1 -0
  68. package/dist/blockDiagram/blocks/TemplateBlock.js +82 -0
  69. package/dist/blockDiagram/blocks/TemplateBlock.js.map +1 -0
  70. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts +248 -0
  71. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts.map +1 -0
  72. package/dist/blockDiagram/blocks/base/BaseBlock.js +402 -0
  73. package/dist/blockDiagram/blocks/base/BaseBlock.js.map +1 -0
  74. package/dist/blockDiagram/builtinBlocks.d.ts +9 -0
  75. package/dist/blockDiagram/builtinBlocks.d.ts.map +1 -0
  76. package/dist/blockDiagram/builtinBlocks.js +4912 -0
  77. package/dist/blockDiagram/builtinBlocks.js.map +1 -0
  78. package/dist/blockDiagram/compiler/BlockTemplate.d.ts +37 -0
  79. package/dist/blockDiagram/compiler/BlockTemplate.d.ts.map +1 -0
  80. package/dist/blockDiagram/compiler/BlockTemplate.js +860 -0
  81. package/dist/blockDiagram/compiler/BlockTemplate.js.map +1 -0
  82. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts +75 -0
  83. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts.map +1 -0
  84. package/dist/blockDiagram/compiler/CodeOptimizer.js +443 -0
  85. package/dist/blockDiagram/compiler/CodeOptimizer.js.map +1 -0
  86. package/dist/blockDiagram/compiler/GraphCompiler.d.ts +63 -0
  87. package/dist/blockDiagram/compiler/GraphCompiler.d.ts.map +1 -0
  88. package/dist/blockDiagram/compiler/GraphCompiler.js +656 -0
  89. package/dist/blockDiagram/compiler/GraphCompiler.js.map +1 -0
  90. package/dist/blockDiagram/compiler/TopologicalSort.d.ts +63 -0
  91. package/dist/blockDiagram/compiler/TopologicalSort.d.ts.map +1 -0
  92. package/dist/blockDiagram/compiler/TopologicalSort.js +268 -0
  93. package/dist/blockDiagram/compiler/TopologicalSort.js.map +1 -0
  94. package/dist/blockDiagram/index.d.ts +30 -0
  95. package/dist/blockDiagram/index.d.ts.map +1 -0
  96. package/dist/blockDiagram/index.js +29 -0
  97. package/dist/blockDiagram/index.js.map +1 -0
  98. package/dist/blockDiagram/types/Block.d.ts +178 -0
  99. package/dist/blockDiagram/types/Block.d.ts.map +1 -0
  100. package/dist/blockDiagram/types/Block.js +5 -0
  101. package/dist/blockDiagram/types/Block.js.map +1 -0
  102. package/dist/blockDiagram/types/CodeGenContext.d.ts +235 -0
  103. package/dist/blockDiagram/types/CodeGenContext.d.ts.map +1 -0
  104. package/dist/blockDiagram/types/CodeGenContext.js +554 -0
  105. package/dist/blockDiagram/types/CodeGenContext.js.map +1 -0
  106. package/dist/blockDiagram/types/Connection.d.ts +17 -0
  107. package/dist/blockDiagram/types/Connection.d.ts.map +1 -0
  108. package/dist/blockDiagram/types/Connection.js +5 -0
  109. package/dist/blockDiagram/types/Connection.js.map +1 -0
  110. package/dist/blockDiagram/types/Graph.d.ts +28 -0
  111. package/dist/blockDiagram/types/Graph.d.ts.map +1 -0
  112. package/dist/blockDiagram/types/Graph.js +24 -0
  113. package/dist/blockDiagram/types/Graph.js.map +1 -0
  114. package/dist/blockDiagram/types/IR.d.ts +79 -0
  115. package/dist/blockDiagram/types/IR.d.ts.map +1 -0
  116. package/dist/blockDiagram/types/IR.js +6 -0
  117. package/dist/blockDiagram/types/IR.js.map +1 -0
  118. package/dist/blockDiagram/utils/SpinCADConverter.d.ts +17 -0
  119. package/dist/blockDiagram/utils/SpinCADConverter.d.ts.map +1 -0
  120. package/dist/blockDiagram/utils/SpinCADConverter.js +307 -0
  121. package/dist/blockDiagram/utils/SpinCADConverter.js.map +1 -0
  122. package/dist/effect/compileEffect.d.ts +51 -0
  123. package/dist/effect/compileEffect.d.ts.map +1 -0
  124. package/dist/effect/compileEffect.js +133 -0
  125. package/dist/effect/compileEffect.js.map +1 -0
  126. package/dist/index.d.ts +2 -0
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/simulator/FV1Simulator.d.ts.map +1 -1
  131. package/dist/simulator/FV1Simulator.js +7 -4
  132. package/dist/simulator/FV1Simulator.js.map +1 -1
  133. package/package.json +17 -5
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Core types for the new Semantic Intermediate Representation (IR)
3
+ * and Declarative Block Templates.
4
+ */
5
+ export type IRSection = 'init' | 'input' | 'main' | 'output' | 'header';
6
+ export interface IRNode {
7
+ op: string;
8
+ args: any[];
9
+ section: IRSection;
10
+ comment?: string;
11
+ }
12
+ export interface BlockPortDefinition {
13
+ id: string;
14
+ name: string;
15
+ type: 'audio' | 'control';
16
+ required?: boolean;
17
+ /** For control inputs: the parameter ID that backs this CV (used by @cv macro). */
18
+ parameter?: string;
19
+ description?: string;
20
+ }
21
+ export interface BlockTemplateDefinition {
22
+ type: string;
23
+ category: string;
24
+ subcategory?: string;
25
+ name: string;
26
+ description: string;
27
+ color?: string;
28
+ width?: number;
29
+ height?: number;
30
+ inputs: BlockPortDefinition[];
31
+ outputs: BlockPortDefinition[];
32
+ parameters: BlockParameterDefinition[];
33
+ /** Internal state registers (not exposed as ports). */
34
+ registers?: string[];
35
+ /** Internal delay memory. */
36
+ memories?: Array<{
37
+ id: string;
38
+ size: number | string;
39
+ }>;
40
+ /** Optional template for the block label in the UI. */
41
+ labelTemplate?: string;
42
+ /** The ATL template string. */
43
+ template: string;
44
+ /** Raw ATL source retained by the registry parser; not emitted by hand-authored JSON defs. */
45
+ _rawAtl?: string;
46
+ }
47
+ export interface BlockParameterDefinition {
48
+ id: string;
49
+ name: string;
50
+ type: 'number' | 'select' | 'boolean' | 'string';
51
+ default: any;
52
+ min?: number;
53
+ max?: number;
54
+ step?: number;
55
+ options?: Array<{
56
+ label: string;
57
+ value: any;
58
+ }>;
59
+ description?: string;
60
+ /**
61
+ * Value conversion applied at code-gen time. The built-in names are
62
+ * recognized by the compiler; strings outside this list are accepted
63
+ * for forward compatibility (custom conversions defined by new ATL blocks).
64
+ */
65
+ conversion?: string;
66
+ displayUnit?: string;
67
+ displayMin?: number;
68
+ displayMax?: number;
69
+ displayDecimals?: number;
70
+ /** TypeScript expression for custom conversion. */
71
+ eval?: string;
72
+ /** Conditional visibility expression (evaluated by the editor UI). */
73
+ visibleIf?: string;
74
+ /** If true, the parameter editor uses a multi-line text field. */
75
+ multiline?: boolean;
76
+ /** Optional UI label template for this parameter's value display. */
77
+ labelTemplate?: string;
78
+ }
79
+ //# sourceMappingURL=IR.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IR.d.ts","sourceRoot":"","sources":["../../../src/blockDiagram/types/IR.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,OAAO,EAAE,GAAG,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core types for the new Semantic Intermediate Representation (IR)
3
+ * and Declarative Block Templates.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=IR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IR.js","sourceRoot":"","sources":["../../../src/blockDiagram/types/IR.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SpinCADConverter
3
+ * Parses .spincad files and generates JSON or ATL (Frontmatter) block definitions.
4
+ */
5
+ import { BlockTemplateDefinition } from '../types/IR.js';
6
+ export declare class SpinCADConverter {
7
+ /**
8
+ * Convert a SpinCAD template string to an ATL BlockTemplateDefinition
9
+ * Metadata is extracted from @ directives.
10
+ */
11
+ static convert(content: string, typeOverride?: string, sourceFile?: string): BlockTemplateDefinition;
12
+ /**
13
+ * Format a definition as an ATL file with JSON frontmatter
14
+ */
15
+ static toATL(definition: BlockTemplateDefinition): string;
16
+ }
17
+ //# sourceMappingURL=SpinCADConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpinCADConverter.d.ts","sourceRoot":"","sources":["../../../src/blockDiagram/utils/SpinCADConverter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,qBAAa,gBAAgB;IACzB;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,uBAAuB;IA4RpG;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM;CAO5D"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * SpinCADConverter
3
+ * Parses .spincad files and generates JSON or ATL (Frontmatter) block definitions.
4
+ */
5
+ export class SpinCADConverter {
6
+ /**
7
+ * Convert a SpinCAD template string to an ATL BlockTemplateDefinition
8
+ * Metadata is extracted from @ directives.
9
+ */
10
+ static convert(content, typeOverride, sourceFile) {
11
+ const lines = content.split('\n');
12
+ const definition = {
13
+ type: typeOverride || '',
14
+ category: 'SpinCAD',
15
+ name: '',
16
+ description: '',
17
+ inputs: [],
18
+ outputs: [],
19
+ parameters: [],
20
+ template: ''
21
+ };
22
+ const headerLines = [];
23
+ if (sourceFile) {
24
+ headerLines.push(`@comment "Generated from spincad source file ${sourceFile}"`);
25
+ }
26
+ const bodyLines = [];
27
+ const managedRegs = [];
28
+ const managedMemories = [];
29
+ const managedEqus = [];
30
+ for (let line of lines) {
31
+ const trimmed = line.trim();
32
+ if (!trimmed)
33
+ continue;
34
+ if (trimmed.startsWith('@')) {
35
+ const parts = trimmed.match(/[^\s"']+|"([^"]*)"|'([^']*)'/g)?.map(m => m.replace(/^["']|["']$/g, '')) || [];
36
+ if (parts.length === 0)
37
+ continue;
38
+ const directive = parts[0].substring(1);
39
+ switch (directive) {
40
+ case 'name':
41
+ definition.name = parts.slice(1).join(' ');
42
+ if (!typeOverride) {
43
+ definition.type = definition.name.toLowerCase()
44
+ .replace(/[^a-z0-9]+/g, '_')
45
+ .replace(/^_+|_+$/g, '');
46
+ }
47
+ break;
48
+ case 'color':
49
+ definition.color = parts[1].replace(/"/g, '').replace('0x', '#');
50
+ break;
51
+ case 'audioInput':
52
+ definition.inputs.push({
53
+ id: parts[1],
54
+ name: parts[2] || parts[1],
55
+ type: 'audio'
56
+ });
57
+ break;
58
+ case 'audioOutput':
59
+ case 'controlOutput':
60
+ definition.outputs.push({
61
+ id: parts[1],
62
+ name: parts[2] || parts[1],
63
+ type: directive === 'audioOutput' ? 'audio' : 'control'
64
+ });
65
+ break;
66
+ case 'controlInput':
67
+ definition.inputs.push({
68
+ id: parts[1],
69
+ name: parts[2] || parts[1],
70
+ type: 'control'
71
+ });
72
+ break;
73
+ case 'sliderLabel': {
74
+ let min = parseFloat(parts[3]);
75
+ let max = parseFloat(parts[4]);
76
+ let def = parseFloat(parts[5]);
77
+ const conversionType = parts[8];
78
+ // SpinCAD supplies parameters in native samples (0 to 32768).
79
+ // FV-1 VSCode interprets `LENGTHTOTIME` on sliders via milliseconds and reconverts them.
80
+ // We scale the UI limits on these custom blocks to match this expectation.
81
+ if (conversionType === 'LENGTHTOTIME') {
82
+ const Fs = 32768;
83
+ min = Math.round((min / Fs) * 1000);
84
+ max = Math.round((max / Fs) * 1000);
85
+ def = Math.round((def / Fs) * 1000);
86
+ }
87
+ definition.parameters.push({
88
+ id: parts[1],
89
+ name: (parts[2] || '').replace(/'/g, ''),
90
+ type: 'number',
91
+ min: min,
92
+ max: max,
93
+ default: def,
94
+ conversion: conversionType
95
+ });
96
+ break;
97
+ }
98
+ case 'comboBox':
99
+ definition.parameters.push({
100
+ id: parts[1],
101
+ name: parts[1],
102
+ type: 'select',
103
+ default: 0,
104
+ options: parts.slice(2).map((o, idx) => ({ label: o.replace(/'/g, ''), value: idx }))
105
+ });
106
+ break;
107
+ case 'isPinConnected':
108
+ bodyLines.push(`@if pinConnected(${parts[1]})`);
109
+ break;
110
+ case 'isEqualTo':
111
+ bodyLines.push(`@if ${parts[1]} == ${parts[2]}`);
112
+ break;
113
+ case 'else':
114
+ bodyLines.push('@else');
115
+ break;
116
+ case 'endif':
117
+ bodyLines.push('@endif');
118
+ break;
119
+ case 'setOutputPin':
120
+ // Legacy directive, ignore
121
+ break;
122
+ case 'equ':
123
+ const eqId = parts[1];
124
+ const eqVal = parts[2];
125
+ const isPinEq = definition.inputs.some(i => i.id === eqId) || definition.outputs.some(o => o.id === eqId);
126
+ if (!isPinEq) {
127
+ if (eqVal && eqVal.toLowerCase().startsWith('reg')) {
128
+ managedRegs.push(eqId);
129
+ }
130
+ else {
131
+ headerLines.push(`${directive}\t${parts.slice(1).join('\t')}`);
132
+ }
133
+ }
134
+ break;
135
+ case 'mem':
136
+ const mId = parts[1];
137
+ const sizePart = parts[2];
138
+ const mSize = isNaN(Number(sizePart)) ? sizePart : parseInt(sizePart);
139
+ managedMemories.push({ id: mId, size: mSize });
140
+ break;
141
+ case 'getDelayScaleControl':
142
+ // @getDelayScaleControl tap1Ratio delayLength delayOffset
143
+ // -> sof ${tap1Ratio}, 0
144
+ // -> sof ${delayLength} / 32768, (${mem.delayl} + 1) / 32768
145
+ const baseOffsetExpr = managedMemories.length > 0 ? `(\${mem.${managedMemories[0].id}} + 1)` : `\${${parts[3]}}`;
146
+ bodyLines.push(`sof\t\${${parts[1]}}, 0`);
147
+ bodyLines.push(`sof\t\${${parts[2]}} / 32768, ${baseOffsetExpr} / 32768`);
148
+ break;
149
+ case 'getSamplesFromRatio':
150
+ // @getSamplesFromRatio ratio tap1Ratio delayLength
151
+ // Emits a constant calculation into the assembler
152
+ // SpinCAD internally tracks this for GUI mapping. For ATL, we can just defer it
153
+ // by creating an inline equation. i.e `equ ratio tap1Ratio * delayLength`
154
+ // (The FV-1 assembler will precalculate constant arithmetic if it has values)
155
+ managedEqus.push(parts[1]);
156
+ bodyLines.push(`equ\t${parts[1]}\t\${${parts[2]}} * \${${parts[3]}}`);
157
+ break;
158
+ case 'minusDouble':
159
+ case 'multiplyDouble':
160
+ case 'plusDouble':
161
+ case 'multiplyInt':
162
+ case 'divideDouble':
163
+ case 'divideInt':
164
+ managedEqus.push(parts[1]);
165
+ headerLines.push(trimmed);
166
+ break;
167
+ case 'getBaseAddress':
168
+ managedEqus.push('delayOffset');
169
+ bodyLines.push('equ\tdelayOffset\t-1');
170
+ break;
171
+ case 'readChorusTap': {
172
+ // @readChorusTap lfoSel 0 tap1Center delayLength delayOffset
173
+ const lfo = parts[1];
174
+ const instance = parts[2];
175
+ const center = parts[3];
176
+ const depth = parts[4];
177
+ const offset = parts[5];
178
+ let lfoName = `SIN${instance}`;
179
+ if (instance === '2')
180
+ lfoName = 'COS0';
181
+ if (instance === '3')
182
+ lfoName = 'COS1';
183
+ bodyLines.push(`cho\trda,\t${lfoName},\tREG | COMPC,\t\${${offset}}`);
184
+ bodyLines.push(`cho\trda,\t${lfoName},\t0,\t\${${offset}} + 1`);
185
+ break;
186
+ }
187
+ default:
188
+ // Keep other directives.
189
+ bodyLines.push(trimmed);
190
+ }
191
+ }
192
+ else {
193
+ // Assembly line
194
+ const trimmedLine = line.trim();
195
+ const lineParts = trimmedLine.split(/[,\s\t]+/);
196
+ const op = lineParts[0].toLowerCase();
197
+ if (op === 'equ') {
198
+ const eqId = lineParts[1];
199
+ const eqVal = lineParts[2];
200
+ const isPinEq = definition.inputs.some(i => i.id === eqId) || definition.outputs.some(o => o.id === eqId);
201
+ if (!isPinEq) {
202
+ if (eqVal && eqVal.toLowerCase().startsWith('reg')) {
203
+ managedRegs.push(eqId);
204
+ }
205
+ else {
206
+ headerLines.push(line);
207
+ }
208
+ }
209
+ }
210
+ else if (op === 'mem') {
211
+ const memId = lineParts[1];
212
+ const sizeStr = lineParts[2];
213
+ const memSize = isNaN(Number(sizeStr)) ? sizeStr : parseInt(sizeStr);
214
+ managedMemories.push({ id: memId, size: memSize });
215
+ }
216
+ else if (lineParts[0].toLowerCase() === 'offset') {
217
+ // "offset ratio 1" => "equ offset ratio" + something?
218
+ // In MN3011a, it simply assigns the variable 'ratio' to 'ratio + 1' ?
219
+ // Or it allocates an offset. "offset ratio 1" means ratio is an offset of 1?
220
+ // Actually, looking at the code, it probably means "equ offset ratio_1" or "offset" is a type.
221
+ // Let's replace it with a valid equ to assign a constant or let it be redefined later.
222
+ managedEqus.push(lineParts[1]);
223
+ bodyLines.push(`equ\t${lineParts[1]}\t${lineParts[2] || '0'}`);
224
+ }
225
+ else if (op === 'bool' || op === 'int') {
226
+ // Ignore metadata declarations that ended up in the body
227
+ }
228
+ else {
229
+ bodyLines.push(line);
230
+ }
231
+ }
232
+ }
233
+ if (managedRegs.length > 0)
234
+ definition.registers = managedRegs;
235
+ if (managedMemories.length > 0)
236
+ definition.memories = managedMemories;
237
+ const templateLines = [];
238
+ if (headerLines.length > 0) {
239
+ const filteredHeaders = headerLines.filter(line => {
240
+ const parts = line.trim().split(/\s+/);
241
+ if (parts[0].toLowerCase() === 'equ' || parts[0].toLowerCase() === '@equ') {
242
+ const eqId = parts[1];
243
+ if (definition.parameters.some(p => p.id === eqId)) {
244
+ return false;
245
+ }
246
+ }
247
+ return true;
248
+ });
249
+ if (filteredHeaders.length > 0) {
250
+ templateLines.push('@section header');
251
+ templateLines.push(...filteredHeaders);
252
+ templateLines.push('');
253
+ }
254
+ }
255
+ if (bodyLines.length > 0) {
256
+ if (headerLines.length > 0) {
257
+ templateLines.push('@section main');
258
+ }
259
+ templateLines.push(...bodyLines);
260
+ }
261
+ // Variable substitution pass: Replace raw IDs with ${type.id} tokens
262
+ const ids = {
263
+ input: definition.inputs.map(i => i.id),
264
+ output: definition.outputs.map(o => o.id),
265
+ param: definition.parameters.map(p => p.id),
266
+ local: managedRegs,
267
+ memories: managedMemories.map(m => m.id)
268
+ };
269
+ let processedTemplate = templateLines.join('\n');
270
+ // Replace whole words only to avoid partial matches
271
+ // Handle +/- suffixes by inserting a space
272
+ const replaceToken = (id, target) => {
273
+ const regex = new RegExp(`\\b${id}\\b(?![^\\{]*\\})`, 'gi');
274
+ processedTemplate = processedTemplate.replace(regex, (match, offset, string) => {
275
+ const nextChar = string[offset + match.length];
276
+ if (nextChar === '+' || nextChar === '-') {
277
+ return target + ' ';
278
+ }
279
+ return target;
280
+ });
281
+ };
282
+ for (const id of ids.input)
283
+ replaceToken(id, `\${input.${id}}`);
284
+ for (const id of ids.output)
285
+ replaceToken(id, `\${output.${id}}`);
286
+ for (const id of ids.param)
287
+ replaceToken(id, `\${${id}}`);
288
+ for (const id of ids.local)
289
+ replaceToken(id, `\${reg.${id}}`);
290
+ for (const id of ids.memories)
291
+ replaceToken(id, `\${mem.${id}}`);
292
+ for (const id of managedEqus)
293
+ replaceToken(id, `\${local.${id}}`);
294
+ definition.template = processedTemplate;
295
+ return definition;
296
+ }
297
+ /**
298
+ * Format a definition as an ATL file with JSON frontmatter
299
+ */
300
+ static toATL(definition) {
301
+ const metadata = { ...definition };
302
+ const template = metadata.template;
303
+ delete metadata.template;
304
+ return `---\n${JSON.stringify(metadata, null, 2)}\n---\n${template}`;
305
+ }
306
+ }
307
+ //# sourceMappingURL=SpinCADConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpinCADConverter.js","sourceRoot":"","sources":["../../../src/blockDiagram/utils/SpinCADConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Unified compile entry: given an effect source in one of three formats,
3
+ * return a 512-byte FV-1 program binary ready to write to EEPROM.
4
+ *
5
+ * Supported inputs:
6
+ * - 'spn' SpinAsm source text
7
+ * - 'hex' Intel HEX, optionally a single slot selected via `slot`
8
+ * - 'spndiagram' JSON block-diagram document
9
+ *
10
+ * The spndiagram path uses a BlockRegistry. If none is supplied, a fresh
11
+ * registry is created and loaded with BUILTIN_BLOCKS.
12
+ */
13
+ import { FV1AssemblerProblem } from '../assembler/FV1Assembler.js';
14
+ import { BlockRegistry } from '../blockDiagram/blocks/BlockRegistry.js';
15
+ import { BlockGraph } from '../blockDiagram/types/Graph.js';
16
+ /** FV-1 program size in bytes (128 instructions × 4 bytes). */
17
+ export declare const PROGRAM_SIZE_BYTES = 512;
18
+ export type EffectFormat = 'spn' | 'hex' | 'spndiagram';
19
+ export type EffectSource = {
20
+ format: 'spn';
21
+ source: string;
22
+ } | {
23
+ format: 'hex';
24
+ source: string;
25
+ slot?: number;
26
+ } | {
27
+ format: 'spndiagram';
28
+ source: string | BlockGraph;
29
+ };
30
+ export interface CompileEffectOptions {
31
+ /** Block registry for spndiagram sources. Defaults to one preloaded with BUILTIN_BLOCKS. */
32
+ registry?: BlockRegistry;
33
+ /** FV-1 assembler options passed through when assembling SPN or diagram output. */
34
+ fv1AsmMemBug?: boolean;
35
+ clampReals?: boolean;
36
+ }
37
+ export interface CompileEffectResult {
38
+ binary: Uint8Array;
39
+ /** Generated SpinAsm source (always present for 'spn' and 'spndiagram'; undefined for 'hex'). */
40
+ assembly?: string;
41
+ problems?: FV1AssemblerProblem[];
42
+ warnings?: string[];
43
+ }
44
+ /** Detect format from a filename's extension. Throws on unknown extensions. */
45
+ export declare function formatFromFilename(filename: string): EffectFormat;
46
+ /**
47
+ * Compile any supported effect source into a 512-byte FV-1 program binary.
48
+ * Throws if the source can't be compiled (syntax errors, invalid graph, etc).
49
+ */
50
+ export declare function compileEffect(src: EffectSource, options?: CompileEffectOptions): CompileEffectResult;
51
+ //# sourceMappingURL=compileEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileEffect.d.ts","sourceRoot":"","sources":["../../src/effect/compileEffect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,YAAY,CAAC;AAExD,MAAM,MAAM,YAAY,GAClB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACjC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAMjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CASxG"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Unified compile entry: given an effect source in one of three formats,
3
+ * return a 512-byte FV-1 program binary ready to write to EEPROM.
4
+ *
5
+ * Supported inputs:
6
+ * - 'spn' SpinAsm source text
7
+ * - 'hex' Intel HEX, optionally a single slot selected via `slot`
8
+ * - 'spndiagram' JSON block-diagram document
9
+ *
10
+ * The spndiagram path uses a BlockRegistry. If none is supplied, a fresh
11
+ * registry is created and loaded with BUILTIN_BLOCKS.
12
+ */
13
+ import { FV1Assembler } from '../assembler/FV1Assembler.js';
14
+ import { IntelHexParser } from '../hex/IntelHexParser.js';
15
+ import { BlockRegistry } from '../blockDiagram/blocks/BlockRegistry.js';
16
+ import { BUILTIN_BLOCKS } from '../blockDiagram/builtinBlocks.js';
17
+ import { GraphCompiler } from '../blockDiagram/compiler/GraphCompiler.js';
18
+ /** FV-1 program size in bytes (128 instructions × 4 bytes). */
19
+ export const PROGRAM_SIZE_BYTES = 512;
20
+ /** Detect format from a filename's extension. Throws on unknown extensions. */
21
+ export function formatFromFilename(filename) {
22
+ const lower = filename.toLowerCase();
23
+ if (lower.endsWith('.spn'))
24
+ return 'spn';
25
+ if (lower.endsWith('.hex'))
26
+ return 'hex';
27
+ if (lower.endsWith('.spndiagram'))
28
+ return 'spndiagram';
29
+ throw new Error(`Unknown effect file extension: ${filename}`);
30
+ }
31
+ /**
32
+ * Compile any supported effect source into a 512-byte FV-1 program binary.
33
+ * Throws if the source can't be compiled (syntax errors, invalid graph, etc).
34
+ */
35
+ export function compileEffect(src, options = {}) {
36
+ switch (src.format) {
37
+ case 'spn':
38
+ return compileSpn(src.source, options);
39
+ case 'hex':
40
+ return compileHex(src.source, src.slot);
41
+ case 'spndiagram':
42
+ return compileDiagram(src.source, options);
43
+ }
44
+ }
45
+ function compileSpn(source, options) {
46
+ const assembler = new FV1Assembler({
47
+ fv1AsmMemBug: options.fv1AsmMemBug,
48
+ clampReals: options.clampReals,
49
+ });
50
+ const result = assembler.assemble(source);
51
+ const fatal = result.problems.filter(p => p.isfatal);
52
+ if (fatal.length > 0) {
53
+ const summary = fatal.map(p => `line ${p.line}: ${p.message}`).join('; ');
54
+ throw new Error(`SPN assembly failed: ${summary}`);
55
+ }
56
+ const binary = padToProgramSize(FV1Assembler.toUint8Array(result.machineCode));
57
+ return {
58
+ binary,
59
+ assembly: source,
60
+ problems: result.problems,
61
+ };
62
+ }
63
+ function compileHex(source, slot) {
64
+ const full = IntelHexParser.parse(source);
65
+ // When no slot is specified, auto-detect: find the first 512-byte window that
66
+ // isn't entirely 0xFF (i.e. actually contains a program). This lets a .hex
67
+ // file built for slot N on an original pedal be written to any slot on the
68
+ // target pedal — the source slot and destination slot are decoupled.
69
+ const resolvedSlot = slot ?? autoDetectHexSlot(full);
70
+ if (resolvedSlot < 0 || resolvedSlot > 7) {
71
+ throw new Error(`HEX slot out of range: ${resolvedSlot} (valid: 0-7)`);
72
+ }
73
+ const offset = resolvedSlot * PROGRAM_SIZE_BYTES;
74
+ if (full.length <= offset) {
75
+ throw new Error(`HEX file does not contain slot ${resolvedSlot} (length ${full.length} bytes)`);
76
+ }
77
+ const end = offset + PROGRAM_SIZE_BYTES;
78
+ const binary = padToProgramSize(full.subarray(offset, Math.min(end, full.length)));
79
+ return { binary };
80
+ }
81
+ function autoDetectHexSlot(full) {
82
+ for (let slot = 0; slot < 8; slot++) {
83
+ const offset = slot * PROGRAM_SIZE_BYTES;
84
+ if (offset >= full.length)
85
+ break;
86
+ const end = Math.min(offset + PROGRAM_SIZE_BYTES, full.length);
87
+ for (let i = offset; i < end; i++) {
88
+ if (full[i] !== 0xFF)
89
+ return slot;
90
+ }
91
+ }
92
+ return 0;
93
+ }
94
+ function compileDiagram(source, options) {
95
+ const graph = typeof source === 'string' ? JSON.parse(source) : source;
96
+ const registry = options.registry ?? createDefaultRegistry();
97
+ const compiler = new GraphCompiler(registry);
98
+ const compileResult = compiler.compile(graph, {
99
+ regCount: 32,
100
+ progSize: 128,
101
+ delaySize: 32768,
102
+ fv1AsmMemBug: options.fv1AsmMemBug,
103
+ clampReals: options.clampReals,
104
+ });
105
+ if (!compileResult.success || !compileResult.assembly) {
106
+ const msg = (compileResult.errors ?? ['unknown graph compile error']).join('; ');
107
+ throw new Error(`Diagram compile failed: ${msg}`);
108
+ }
109
+ // Feed the generated assembly through the normal SPN path to produce the binary.
110
+ const asmResult = compileSpn(compileResult.assembly, options);
111
+ return {
112
+ binary: asmResult.binary,
113
+ assembly: compileResult.assembly,
114
+ problems: asmResult.problems,
115
+ warnings: compileResult.warnings,
116
+ };
117
+ }
118
+ function padToProgramSize(data) {
119
+ if (data.length === PROGRAM_SIZE_BYTES)
120
+ return data;
121
+ const out = new Uint8Array(PROGRAM_SIZE_BYTES);
122
+ out.set(data.subarray(0, Math.min(data.length, PROGRAM_SIZE_BYTES)));
123
+ return out;
124
+ }
125
+ let defaultRegistry;
126
+ function createDefaultRegistry() {
127
+ if (!defaultRegistry) {
128
+ defaultRegistry = new BlockRegistry();
129
+ defaultRegistry.loadManifest(BUILTIN_BLOCKS);
130
+ }
131
+ return defaultRegistry;
132
+ }
133
+ //# sourceMappingURL=compileEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileEffect.js","sourceRoot":"","sources":["../../src/effect/compileEffect.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,4 +9,6 @@ export type { AlgToken, Expr, Statement } from './assembler/AlgebraicCompiler.js
9
9
  export { FV1Simulator } from './simulator/FV1Simulator.js';
10
10
  export { IntelHexParser } from './hex/IntelHexParser.js';
11
11
  export type { HexRecord } from './hex/IntelHexParser.js';
12
+ export { compileEffect, formatFromFilename, PROGRAM_SIZE_BYTES, } from './effect/compileEffect.js';
13
+ export type { EffectFormat, EffectSource, CompileEffectOptions, CompileEffectResult, } from './effect/compileEffect.js';
12
14
  //# sourceMappingURL=index.d.ts.map