diff --git a/static/ast-parser.js b/static/ast-parser.js index d1457b8..4bbf867 100644 --- a/static/ast-parser.js +++ b/static/ast-parser.js @@ -181,6 +181,7 @@ function buildInstrument(node) { volumes: null, timbre: null, fmModulations: [], + amModulations: [], rawChildren: [], }; @@ -201,6 +202,9 @@ function buildInstrument(node) { case 'FM.modulation': instr.fmModulations.push({ ...child.props }); break; + case 'AM.modulation': + instr.amModulations.push({ ...child.props }); + break; default: instr.rawChildren.push(buildGeneric(child)); } @@ -253,6 +257,7 @@ function buildBasicProperties(node) { A: null, S: null, R: null, oscillator: null, fmModulations: [], + amModulations: [], rawChildren: [], }; @@ -271,6 +276,11 @@ function buildBasicProperties(node) { const envChild = child.children.find(c => c.slot === 'shape'); if (envChild) fm.shape = buildShape(envChild); bp.fmModulations.push(fm); + } else if (child.parentSlot === 'AM' && child.slot === 'modulation') { + const am = { ...child.props }; + const envChild = child.children.find(c => c.slot === 'shape'); + if (envChild) am.shape = buildShape(envChild); + bp.amModulations.push(am); } else { bp.rawChildren.push(buildGeneric(child)); } diff --git a/static/exporter.js b/static/exporter.js index aecbec1..9940bd5 100644 --- a/static/exporter.js +++ b/static/exporter.js @@ -47,6 +47,7 @@ function basicPropLines(bp) { const r = serializeShape(bp.R); if (r) lines.push(`R: "${r}"`); for (const fm of (bp.fmModulations ?? [])) lines.push(`FM: "${serializeFm(fm)}"`); + for (const am of (bp.amModulations ?? [])) lines.push(`AM: "${serializeFm(am)}"`); return lines; } @@ -76,6 +77,7 @@ function variationLines(v) { const timbre = serializeShape(v.timbre); if (timbre) lines.push(`TIMBRE: "${timbre}"`); for (const fm of (v.fmModulations ?? [])) lines.push(`FM: "${serializeFm(fm)}"`); + for (const am of (v.amModulations ?? [])) lines.push(`AM: "${serializeFm(am)}"`); for (const sv of (v.subvariations ?? [])) lines.push(...variationLines(sv)); return lines; } @@ -89,7 +91,8 @@ function variationLines(v) { function instrCharacterLines(instr) { const variations = instr.variations ?? []; const hasRootProps = instr.basicProperties || instr.volumes || instr.timbre || - (instr.fmModulations ?? []).length > 0; + (instr.fmModulations ?? []).length > 0 || + (instr.amModulations ?? []).length > 0; const syntheticRoot = hasRootProps ? { basicProperties: instr.basicProperties, @@ -98,6 +101,7 @@ function instrCharacterLines(instr) { volumes: instr.volumes, timbre: instr.timbre, fmModulations: instr.fmModulations ?? [], + amModulations: instr.amModulations ?? [], } : null;