From dae8520e3f311378f595882224d10901a3911bf3 Mon Sep 17 00:00:00 2001 From: Peter Salomonsen Date: Sat, 18 Mar 2023 09:58:51 +0100 Subject: [PATCH] export song with correct start/len --- convert.js | 1276 +++++++++++++++++++++++++++++------- groove.wasm | Bin 2383 -> 3153 bytes groove.wat | 504 +++++++++++++- tests/groove.yaml | 1594 +++++++++++++++++++++++---------------------- testwasm.mjs | 2 +- 5 files changed, 2355 insertions(+), 1021 deletions(-) diff --git a/convert.js b/convert.js index 56df157..b52f9ac 100644 --- a/convert.js +++ b/convert.js @@ -8,10 +8,10 @@ const doc = { score: { length: groove.instrumentPatternLists[0].length, rowsperpattern: groove.patternsize, - tracks: groove.instrumentPatternLists.map(track => { + tracks: groove.instrumentPatternLists.slice(0, 7).map(track => { const patternMap = {}; track.forEach(patternIndex => { - patternMap[`${patternIndex}`] = groove.patterns[patternIndex]; + patternMap[`${patternIndex}`] = groove.patterns[patternIndex-1]; }); const patternIndices = Object.keys(patternMap); const patterns = patternIndices.map(patternIndex => patternMap[`${patternIndex}`]); @@ -25,224 +25,1060 @@ const doc = { } }) }, - patch: [] + patch: [ + { + "numvoices": 1, + "units": [ + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 48, + "gain": 16, + "lfo": 0, + "phase": 0, + "shape": 63, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 126, + "detune": 78, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 59, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "noise", + "parameters": { + "gain": 6, + "shape": 64, + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 128, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "envelope", + "parameters": { + "attack": 50, + "decay": 64, + "gain": 96, + "release": 64, + "stereo": 1, + "sustain": 64 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 32, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "delay", + "parameters": { + "damp": 64, + "dry": 64, + "feedback": 64, + "notetracking": 0, + "pregain": 64, + "stereo": 1 + }, + "varargs": [ + 9187, + 9187 + ] + }, + { + "type": "outaux", + "parameters": { + "auxgain": 128, + "outgain": 0, + "stereo": 1 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "envelope", + "parameters": { + "attack": 48, + "decay": 63, + "gain": 128, + "release": 64, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 112, + "stereo": 0 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 0, + "detune": 64, + "gain": 128, + "looplength": 1486, + "loopstart": 2536, + "phase": 64, + "samplestart": 250849, + "shape": 64, + "stereo": 0, + "transpose": 64, + "type": 1, + "unison": 0 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 0 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 16, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 0 + } + }, + { + "type": "filter", + "id": 1, + "parameters": { + "bandpass": 0, + "frequency": 22, + "highpass": 0, + "lowpass": 1, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 0 + } + }, + { + "type": "pan", + "parameters": { + "panning": 64, + "stereo": 0 + } + }, + { + "type": "out", + "parameters": { + "gain": 128, + "stereo": 1 + } + }, + { + "parameters": {} + }, + { + "type": "envelope", + "parameters": { + "attack": 0, + "decay": 64, + "gain": 128, + "release": 0, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 32, + "stereo": 0 + } + }, + { + "type": "send", + "parameters": { + "amount": 79, + "port": 0, + "sendpop": 1, + "stereo": 0, + "target": 1 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 48, + "gain": 16, + "lfo": 0, + "phase": 0, + "shape": 63, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 126, + "detune": 78, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 59, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "noise", + "parameters": { + "gain": 6, + "shape": 64, + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 128, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "envelope", + "parameters": { + "attack": 50, + "decay": 64, + "gain": 96, + "release": 64, + "stereo": 1, + "sustain": 64 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 32, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "delay", + "parameters": { + "damp": 64, + "dry": 64, + "feedback": 64, + "notetracking": 0, + "pregain": 64, + "stereo": 1 + }, + "varargs": [ + 9187, + 9187 + ] + }, + { + "type": "outaux", + "parameters": { + "auxgain": 128, + "outgain": 0, + "stereo": 1 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 48, + "gain": 16, + "lfo": 0, + "phase": 0, + "shape": 63, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 126, + "detune": 78, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 59, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "noise", + "parameters": { + "gain": 6, + "shape": 64, + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 128, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "envelope", + "parameters": { + "attack": 50, + "decay": 64, + "gain": 96, + "release": 64, + "stereo": 1, + "sustain": 64 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 32, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "delay", + "parameters": { + "damp": 64, + "dry": 64, + "feedback": 64, + "notetracking": 0, + "pregain": 64, + "stereo": 1 + }, + "varargs": [ + 9187, + 9187 + ] + }, + { + "type": "outaux", + "parameters": { + "auxgain": 128, + "outgain": 0, + "stereo": 1 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 48, + "gain": 16, + "lfo": 0, + "phase": 0, + "shape": 63, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 126, + "detune": 78, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "oscillator", + "parameters": { + "color": 2, + "detune": 59, + "gain": 16, + "phase": 0, + "shape": 64, + "stereo": 1, + "transpose": 64, + "type": 1, + "unison": 3 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "noise", + "parameters": { + "gain": 6, + "shape": 64, + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 128, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "envelope", + "parameters": { + "attack": 50, + "decay": 64, + "gain": 96, + "release": 64, + "stereo": 1, + "sustain": 64 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 1 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 32, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 1 + } + }, + { + "type": "delay", + "parameters": { + "damp": 64, + "dry": 64, + "feedback": 64, + "notetracking": 0, + "pregain": 64, + "stereo": 1 + }, + "varargs": [ + 9187, + 9187 + ] + }, + { + "type": "outaux", + "parameters": { + "auxgain": 128, + "outgain": 0, + "stereo": 1 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "envelope", + "parameters": { + "attack": 36, + "decay": 69, + "gain": 128, + "release": 32, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 112, + "stereo": 0 + } + }, + { + "type": "oscillator", + "id": 1, + "parameters": { + "color": 128, + "detune": 64, + "gain": 128, + "looplength": 1, + "phase": 0, + "shape": 64, + "stereo": 0, + "transpose": 64, + "type": 0 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 0 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 14, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 0 + } + }, + { + "type": "push", + "parameters": { + "stereo": 0 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 16, + "highpass": 0, + "lowpass": 1, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 0 + } + }, + { + "type": "delay", + "parameters": { + "count": 8, + "damp": 64, + "delay": 1, + "dry": 0, + "feedback": 96, + "notetracking": 0, + "pregain": 32, + "stereo": 0 + }, + "varargs": [ + 1116, + 1188, + 1276, + 1356, + 1422, + 1492, + 1556, + 1618 + ] + }, + { + "type": "addp", + "parameters": { + "stereo": 0 + } + }, + { + "type": "pan", + "parameters": { + "panning": 64, + "stereo": 0 + } + }, + { + "type": "out", + "parameters": { + "gain": 64, + "stereo": 1 + } + }, + { + "parameters": {} + }, + { + "type": "envelope", + "parameters": { + "attack": 0, + "decay": 70, + "gain": 128, + "release": 70, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 5, + "stereo": 0 + } + }, + { + "type": "send", + "parameters": { + "amount": 101, + "port": 0, + "sendpop": 1, + "stereo": 0, + "target": 1 + } + }, + { + "parameters": {} + }, + { + "type": "envelope", + "parameters": { + "attack": 48, + "decay": 58, + "gain": 128, + "release": 0, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 64, + "stereo": 0 + } + }, + { + "type": "send", + "parameters": { + "amount": 32, + "port": 5, + "sendpop": 1, + "stereo": 0, + "target": 1, + "unit": 0, + "voice": 0 + } + } + ] + }, + { + "numvoices": 1, + "units": [ + { + "type": "envelope", + "parameters": { + "attack": 32, + "decay": 60, + "gain": 128, + "release": 0, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "oscillator", + "id": 1, + "parameters": { + "color": 64, + "detune": 64, + "gain": 128, + "phase": 0, + "shape": 64, + "stereo": 0, + "transpose": 64, + "type": 1 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 0 + } + }, + { + "parameters": {} + }, + { + "type": "envelope", + "parameters": { + "attack": 32, + "decay": 64, + "gain": 64, + "release": 66, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 32, + "stereo": 0 + } + }, + { + "type": "noise", + "parameters": { + "gain": 64, + "shape": 64, + "stereo": 0 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 0 + } + }, + { + "type": "filter", + "parameters": { + "bandpass": 0, + "frequency": 106, + "highpass": 1, + "lowpass": 0, + "negbandpass": 0, + "neghighpass": 0, + "resonance": 128, + "stereo": 0 + } + }, + { + "type": "addp", + "parameters": { + "stereo": 0 + } + }, + { + "parameters": {} + }, + { + "type": "distort", + "parameters": { + "drive": 112, + "stereo": 0 + } + }, + { + "type": "delay", + "parameters": { + "count": 8, + "damp": 0, + "delay": 1, + "dry": 128, + "feedback": 40, + "notetracking": 0, + "pregain": 24, + "stereo": 0 + }, + "varargs": [ + 1116, + 1188, + 1276, + 1356, + 1422, + 1492, + 1556, + 1618 + ] + }, + { + "type": "compressor", + "parameters": { + "attack": 51, + "invgain": 64, + "ratio": 112, + "release": 49, + "stereo": 0, + "threshold": 64 + } + }, + { + "type": "mulp", + "parameters": { + "stereo": 0 + } + }, + { + "parameters": {} + }, + { + "type": "pan", + "parameters": { + "panning": 68, + "stereo": 0 + } + }, + { + "type": "outaux", + "parameters": { + "auxgain": 0, + "outgain": 64, + "stereo": 1 + } + }, + { + "parameters": {} + }, + { + "type": "envelope", + "parameters": { + "attack": 0, + "decay": 60, + "gain": 128, + "release": 0, + "stereo": 0, + "sustain": 0 + } + }, + { + "type": "distort", + "parameters": { + "drive": 5, + "stereo": 0 + } + }, + { + "type": "send", + "parameters": { + "amount": 90, + "port": 0, + "sendpop": 1, + "stereo": 0, + "target": 1, + "unit": 0, + "voice": 0 + } + } + ] + } + ] } -const addInstrument = (name, strdef) => { - const units = strdef.split('\n') - .map(opline => { - const opcode_params = opline.replace(/\s\s+/,'\t').split(/[\t]/); - const opcode = opcode_params[0]; - const params = opcode_params[1].split(','); - const parameters = { - stereo: 1 - }; - params.forEach(param => { - const paramParts = param.split('('); - const paramName = paramParts[0]; - const paramValue = paramParts[1].substr(0, paramParts[1].length - 1); - switch(paramName) { - case 'ATTAC': - parameters['attack'] = parseInt(paramValue); - break; - case 'DECAY': - parameters['decay'] = parseInt(paramValue); - break; - case 'SUSTAIN': - parameters['sustain'] = parseInt(paramValue); - break; - case 'RELEASE': - parameters['release'] = parseInt(paramValue); - break; - case 'GAIN': - parameters['gain'] = parseInt(paramValue); - break; - case 'GAIN': - parameters['gain'] = parseInt(paramValue); - break; - case 'FLAGS': - if (opcode == 'GO4K_VCO') { - parameters['type'] = 0; - } - break; - } - }); - return { - "type": { - "GO4K_ENV": "envelope", - "GO4K_OUT": "out", - "GO4K_VCO": "oscillator" - }[opcode], - parameters - } - }).filter(unit => unit.type ?? false); - doc.patch.push({numvoices: 1, units}); -}; - -const addInstrumentGroup = () => { }; -const setGlobalParamDefs = () => { }; - -addInstrument('lead1', `GO4K_ENV ATTAC(24),DECAY(70),SUSTAIN(32),RELEASE(64),GAIN(60) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(64),FLAGS(NOISE) -GO4K_DST DRIVE(64), SNHFREQ(0), FLAGS(0) -GO4K_VCO TRANSPOSE(16),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) -GO4K_FOP OP(FOP_ADDP) -GO4K_FST AMOUNT(40),DEST(10*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FST AMOUNT(58),DEST(10*MAX_UNIT_SLOTS+5+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(128),FLAGS(SINE) -GO4K_VCO TRANSPOSE(83),DETUNE(64),PHASE(64),GATES(85),COLOR(90),SHAPE(64),GAIN(48),FLAGS(SINE) -GO4K_VCF FREQUENCY(77),RESONANCE(24),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_PUSH) -GO4K_VCF FREQUENCY(32),RESONANCE(128),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_XCH) -GO4K_VCF FREQUENCY(96),RESONANCE(128),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_MULP) -GO4K_DLL PREGAIN(64),DRY(100),FEEDBACK(70),DAMP(64),FREQUENCY(56),DEPTH(48),DELAY(17),COUNT(2) -GO4K_PAN PANNING(36) -GO4K_OUT GAIN(65),AUXSEND(80)`); -addInstrument('bass', `GO4K_ENV ATTAC(32),DECAY(70),SUSTAIN(60),RELEASE(75),GAIN(32) -GO4K_FST AMOUNT(120),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(32),GATES(85),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) -GO4K_VCO TRANSPOSE(76),DETUNE(72),PHASE(32),GATES(85),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) -GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(90),GAIN(128),FLAGS(SINE|LFO) -GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_MULP) -GO4K_VCF FREQUENCY(18),RESONANCE(64),VCFTYPE(PEAK) -GO4K_VCF FREQUENCY(32),RESONANCE(48),VCFTYPE(LOWPASS) -GO4K_DST DRIVE(88), SNHFREQ(128), FLAGS(0) -GO4K_PAN PANNING(80) -GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) ; ERROR -GO4K_FOP OP(FOP_XCH) -GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(18),COUNT(1) ; ERROR -GO4K_FOP OP(FOP_XCH) -GO4K_OUT GAIN(18), AUXSEND(10)`); - -const pad = (panning) => `GO4K_ENV ATTAC(32),DECAY(70),SUSTAIN(80),RELEASE(70),GAIN(80) -GO4K_VCO TRANSPOSE(16),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(120),FLAGS(TRISAW|LFO) -GO4K_FST AMOUNT(80),DEST(13*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FST AMOUNT(48),DEST(9*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FST AMOUNT(58),DEST(9*MAX_UNIT_SLOTS+5+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(0),GATES(85),COLOR(30),SHAPE(64),GAIN(128),FLAGS(TRISAW) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(32),GATES(85),COLOR(90),SHAPE(64),GAIN(64),FLAGS(TRISAW) -GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(85),COLOR(64),SHAPE(64),GAIN(8),FLAGS(NOISE) -GO4K_VCF FREQUENCY(105),RESONANCE(20),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_PUSH) -GO4K_VCF FREQUENCY(14),RESONANCE(128),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_XCH) -GO4K_VCF FREQUENCY(70),RESONANCE(128),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_MULP) -GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(11),COUNT(1) -GO4K_PAN PANNING(${panning}) -GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(11),COUNT(1) -GO4K_OUT GAIN(32), AUXSEND(64)`; - -addInstrument('pad1', pad(30)); -addInstrument('pad2', pad(60)); -addInstrument('pad3', pad(100)); -addInstrumentGroup('pads', ['pad1', 'pad2', 'pad3']); -addInstrument('kick', `GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(96),RELEASE(64),GAIN(90) -GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_ENV ATTAC(0),DECAY(70),SUSTAIN(0),RELEASE(0),GAIN(100) -GO4K_DST DRIVE(32), SNHFREQ(128), FLAGS(0) -GO4K_FST AMOUNT(80),DEST(6*MAX_UNIT_SLOTS+1+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(46),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(48),FLAGS(TRISAW) -GO4K_FOP OP(FOP_MULP) -GO4K_FOP OP(FOP_LOADNOTE) -GO4K_FOP OP(FOP_MULP) -GO4K_PAN PANNING(40) -GO4K_OUT GAIN(12), AUXSEND(1)`); -addInstrument('snare', `GO4K_ENV ATTAC(0),DECAY(72),SUSTAIN(0),RELEASE(72),GAIN(25) -GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_ENV ATTAC(0),DECAY(56),SUSTAIN(0),RELEASE(0),GAIN(128) -GO4K_FST AMOUNT(108),DEST(6*MAX_UNIT_SLOTS+1+FST_SET) -GO4K_FST AMOUNT(72),DEST(7*MAX_UNIT_SLOTS+1+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(16),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(32),GAIN(64),FLAGS(SINE) -GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(80),GAIN(64),FLAGS(SINE) -GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(10),GAIN(64),FLAGS(NOISE) -GO4K_VCF FREQUENCY(96),RESONANCE(128),VCFTYPE(LOWPASS) -GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(16),FLAGS(NOISE) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_MULP) -GO4K_VCF FREQUENCY(22),RESONANCE(32),VCFTYPE(HIGHPASS) -GO4K_FOP OP(FOP_LOADNOTE) -GO4K_FOP OP(FOP_MULP) -GO4K_PAN PANNING(56) -GO4K_OUT GAIN(4), AUXSEND(2) -GO4K_FLD AMOUNT(100) -GO4K_FST AMOUNT(64),DEST(6*MAX_UNIT_SLOTS+1+FST_SET) -GO4K_FST AMOUNT(64),DEST(7*MAX_UNIT_SLOTS+1+FST_SET) -GO4K_FOP OP(FOP_POP)`); - -addInstrumentGroup('drums', ['kick', 'snare']); -addInstrument('drivelead', `GO4K_ENV ATTAC(32),DECAY(64),SUSTAIN(90),RELEASE(48),GAIN(35) -GO4K_VCO TRANSPOSE(76),DETUNE(70),PHASE(0),GATES(127),COLOR(10),SHAPE(110),GAIN(128),FLAGS(PULSE) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(64),GATES(127),COLOR(20),SHAPE(20),GAIN(128),FLAGS(PULSE) -GO4K_VCO TRANSPOSE(76),DETUNE(58),PHASE(128),GATES(127),COLOR(30),SHAPE(110),GAIN(128),FLAGS(PULSE) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_ADDP) -GO4K_FOP OP(FOP_MULP) -GO4K_VCO TRANSPOSE(48),DETUNE(64),PHASE(64),GATES(0x80),COLOR(127),SHAPE(64),GAIN(50),FLAGS(SINE|LFO) -GO4K_FST AMOUNT(104),DEST(10*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCF FREQUENCY(94),RESONANCE(120),VCFTYPE(LOWPASS) -GO4K_DLL PREGAIN(64),DRY(100),FEEDBACK(70),DAMP(64),FREQUENCY(56),DEPTH(48),DELAY(17),COUNT(2) -GO4K_PAN PANNING(50) -GO4K_DLL PREGAIN(64),DRY(100),FEEDBACK(70),DAMP(64),FREQUENCY(56),DEPTH(48),DELAY(16),COUNT(1) -GO4K_OUT GAIN(10),AUXSEND(52)`); - -addInstrument('hihat', `GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(15),RELEASE(32),GAIN(100) -GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(85),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) -GO4K_FOP OP(FOP_MULP) -GO4K_VCF FREQUENCY(128),RESONANCE(128),VCFTYPE(BANDPASS) -GO4K_FOP OP(FOP_LOADNOTE) -GO4K_FOP OP(FOP_MULP) -GO4K_PAN PANNING(56) -GO4K_OUT GAIN(44), AUXSEND(0)`); -addInstrument('squarelead', `GO4K_ENV ATTAC(0),DECAY(70),SUSTAIN(0),RELEASE(70),GAIN(64) -GO4K_ENV ATTAC(0),DECAY(80),SUSTAIN(0),RELEASE(80),GAIN(128) -GO4K_FST AMOUNT(96),DEST(18*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FST AMOUNT(96),DEST(19*MAX_UNIT_SLOTS+4+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_FOP OP(FOP_PUSH) -GO4K_VCO TRANSPOSE(72),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) -GO4K_FOP OP(FOP_ADDP) -GO4K_FST AMOUNT(32),DEST(13*MAX_UNIT_SLOTS+5+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(96),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) -GO4K_FST AMOUNT(80),DEST(15*MAX_UNIT_SLOTS+2+FST_SET) -GO4K_FOP OP(FOP_POP) -GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(PULSE) -GO4K_VCO TRANSPOSE(88),DETUNE(64),PHASE(0),GATES(85),COLOR(100),SHAPE(64),GAIN(128),FLAGS(TRISAW) -GO4K_FOP OP(FOP_ADDP) -GO4K_VCF FREQUENCY(82),RESONANCE(96),VCFTYPE(LOWPASS) -GO4K_VCF FREQUENCY(64),RESONANCE(96),VCFTYPE(LOWPASS) -GO4K_FOP OP(FOP_MULP) -GO4K_DLL PREGAIN(64),DRY(100),FEEDBACK(70),DAMP(64),FREQUENCY(56),DEPTH(48),DELAY(17),COUNT(2) -GO4K_PAN PANNING(64) -GO4K_DLL PREGAIN(64),DRY(100),FEEDBACK(70),DAMP(64),FREQUENCY(56),DEPTH(48),DELAY(18),COUNT(2) -GO4K_OUT GAIN(16), AUXSEND(32)`); - -setGlobalParamDefs(`GO4K_ACC ACCTYPE(AUX) -GO4K_DLL PREGAIN(55),DRY(70),FEEDBACK(100),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(0),COUNT(8) -GO4K_FOP OP(FOP_XCH) -GO4K_DLL PREGAIN(55),DRY(70),FEEDBACK(100),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(8),COUNT(8) -GO4K_FOP OP(FOP_XCH) -GO4K_ACC ACCTYPE(OUTPUT) -GO4K_FOP OP(FOP_ADDP2) -GO4K_OUT GAIN(128), AUXSEND(0)`); - await writeFile('tests/groove.yaml', yaml.stringify(doc)); \ No newline at end of file diff --git a/groove.wasm b/groove.wasm index 06f3320884a36750c01bee044cc70683d69b270e..41f95de120a7fd215804158bfbd713de0bc8fe9e 100644 GIT binary patch literal 3153 zcmb7G&2J<}6@Ra)`eUZXGv$f1G2VE$db$;D97QpU6f7`1-D|wr1d^3FhA#t(l8n8? z)<$qL(})8LtOA;82e@$v99B6X@&{y-8z(q$gB+qLe?vF~Ex%VYws%3Gq7 z{oY4Co4#}7IujAEw|96R|4|iB53LilPDcJE25tJZS<1wif&DZt*D?cRW>t^qj z7cY{6;Ks|}C#46O*4jjIk|fytWUw5Srm14pGKTl57a67xRs3}~=8Ej6omedDc9?&8 zQ`<3B^)bEkvs8Gp$)e%wiui_J;62^tS9LGtR%?l=V%vSFb7t|ug$Gt#|KYRUrS`9S zSwgv8Q?LuvSW8alwlbr_S_fHWb_<(ZPa9B*$+IWhrCdEum?|C>%Kn&1mlYL}E?pZm z0ryW`aP__^RCUJ|BvV=?MXRcBrG<7j?^M6Dk81k7CVZx&Lio#pO=Qy~H$qIFR5u^H zxUi(_dBP_VQ>1umfH3Q>OG>@srAU za9;@=V(34%;+K9B9$F~Wew4w@YI&5AhmX4hC1?DWIU4ISXY7_yj*UhI=Qxf=1woyE zFkpi?WD2ha0Og_jdh)a>bMktW;Z&EtwM9gmjW=t`Pc~HD_C_QKua~n%nF2O5%5;YT z2D=`3UL=b0RB#n(o)(n10IF!^t?dP6JAek9WJ(v|NnA9UO|gqb05<+ljYc#YcdUUg zi`+U5+M)S2SPV=>Zq;RAe$I-=(IGGym&H~>3kU9a@2iO2C zc%i2dy~kRO^&yX4TB*H^fhrc1Q0rM_BSu~T!RbbllN--Z@K2K6>h4{AP?^14kJeOY zfE-OSo#O#?L9O8vPz`W2p(szaD;4}XaU2^XpPgJ+w`w;kG@MXUN2*dNpo*T6D%M`Z z=kZXsH;v5cH0*6;X+xzhTJe#K1+=H_0d2!7cCRA}U(PT8Hy6v_b*59GQb3R&V+mIiPxMrjasI48h1j}Y1*m)Ou-FiH>3PPYDV z`}UU_=eO3sdwyf`&>^H?D;v*p@g)F^YLiTeB!wh}v*>Po3gszQxU#sk>8m1_5O1TGNuI%cbeH9JR<+H= zw64{`S?Q5@&_E?oXk^&e+l$9I!kN;FPEb^D0N#I#@wZNz+1?tuFgl8djYQ?dv#vOP z=N*wF+t3cHV97or+Jg+U=MV>v{iRgu;ndSFaP)L?)Zh=O55ar;*J0^(2_IULi;xiX z2&!O?<}TcBfjergeKTQ*?e7yHxozMCCfEq07tX=tm{U7fA_;>)Kr` z%W}up4x}WedVNS`y)R5zdsn+Nby?PujM`s&=~L|U$xr;`n#DGG!A5mim)+XAy7aVD zsvbmF=t>>EaJ5 literal 2383 zcmb_dOK%)S5U%R(*&T2D(cU=VIIkYhC`ue6Sv~|uGRbsSUW`LzA2{WLc?q$xNunS? zLe}mD3B==IZ$R7-LLlXYlplcM#+d^L5aK6rhXY^r?%HcG2PA5zx~8h@@l|z?O)uQv zVj|-C+6K32Lv3&K_6EyB@gsFJNt z8s1XG_w^`m>M?#pkEc8`GQt$t>d~=@+8@=aD&@5~1?MP@wd8bO3#L`ntb;9>+eIy} zd0K>1g*1AirZ>C zubx*%s)g7~PUjV6fHR~A%I+lX78YlvrwN5dF1L8wJcTLt4>*Ht{3(rH(*_G>|Gwq2S5jGN3921|k5 zq@-JV;MGnnB^}Wtph@qY+-ZFE@ZnQkcdRl0;@QQl1mP|2PX@8h_Ts2#mM%F2)s=jj8K-raf7#kcAusPpZoaqAOYp*ZvejX5+H z5RU64+UDl*9!YW}D~ENsT;11~B5>gE5gqD>hx>^R zG{baG9>{&__p^Y0&K&Ib{E4n0%avum(%=B3H+f~1F|*$8$|}(s<^~4cSh&*o^45GFJv!wP eVxg>2IpKR*JLMB7(JX15);mWy?`LpHh5rI52MNOf diff --git a/groove.wat b/groove.wat index 7bd058d..d63e01d 100644 --- a/groove.wat +++ b/groove.wat @@ -18,7 +18,7 @@ ;;------------------------------------------------------------------------------ ;; The one and only memory ;;------------------------------------------------------------------------------ -(memory (export "m") 261) +(memory (export "m") 357) ;;------------------------------------------------------------------------------ ;; Globals. Putting all with same initialization value should compress most @@ -26,6 +26,7 @@ (global $WRK (mut i32) (i32.const 0)) (global $COM (mut i32) (i32.const 0)) (global $VAL (mut i32) (i32.const 0)) +(global $delayWRK (mut i32) (i32.const 0)) (global $globaltick (mut i32) (i32.const 0)) (global $row (mut i32) (i32.const 0)) (global $pattern (mut i32) (i32.const 0)) @@ -33,11 +34,11 @@ (global $voice (mut i32) (i32.const 0)) (global $voicesRemain (mut i32) (i32.const 0)) (global $randseed (mut i32) (i32.const 1)) -(global $sp (mut i32) (i32.const 1408)) -(global $outputBufPtr (mut i32) (i32.const 132736)) +(global $sp (mut i32) (i32.const 1280)) +(global $outputBufPtr (mut i32) (i32.const 6424448)) ;; TODO: only export start and length with certain compiler options; in demo use, they can be hard coded ;; in the intro -(global $outputStart (export "s") i32 (i32.const 132736)) +(global $outputStart (export "s") i32 (i32.const 6424448)) (global $outputLength (export "l") i32 (i32.const 16932864)) (global $output16bit (export "t") i32 (i32.const 0)) @@ -88,15 +89,16 @@ (call $su_update_voices) (global.set $sample (i32.const 0)) loop $sample_loop - (global.set $COM (i32.const 736)) - (global.set $VAL (i32.const 802)) - (global.set $WRK (i32.const 1600)) - (global.set $voice (i32.const 1600)) - (global.set $voicesRemain (i32.const 10)) + (global.set $COM (i32.const 504)) + (global.set $VAL (i32.const 609)) + (global.set $WRK (i32.const 1472)) + (global.set $voice (i32.const 1472)) + (global.set $voicesRemain (i32.const 7)) + (global.set $delayWRK (i32.const 132608)) (call $su_run_vm) - (i64.store (global.get $outputBufPtr) (i64.load (i32.const 1568))) ;; load the sample from left & right channels as one 64bit int and store it in the address pointed by outputBufPtr + (i64.store (global.get $outputBufPtr) (i64.load (i32.const 1440))) ;; load the sample from left & right channels as one 64bit int and store it in the address pointed by outputBufPtr (global.set $outputBufPtr (i32.add (global.get $outputBufPtr) (i32.const 8))) ;; advance outputbufptr - (i64.store (i32.const 1568) (i64.const 0)) ;; clear the left and right ports + (i64.store (i32.const 1440) (i64.const 0)) ;; clear the left and right ports (global.set $sample (i32.add (global.get $sample) (i32.const 1))) (global.set $globaltick (i32.add (global.get $globaltick) (i32.const 1))) (br_if $sample_loop (i32.lt_s (global.get $sample) (i32.const 5512))) @@ -110,11 +112,11 @@ ) ;; the simple implementation of update_voices: each track has exactly one voice (func $su_update_voices (local $si i32) (local $di i32) (local $tracksRemaining i32) (local $note i32) - (local.set $tracksRemaining (i32.const 10)) + (local.set $tracksRemaining (i32.const 7)) (local.set $si (global.get $pattern)) - (local.set $di (i32.const 1600)) + (local.set $di (i32.const 1472)) loop $track_loop - (i32.load8_u offset=496 (local.get $si)) + (i32.load8_u offset=336 (local.get $si)) (i32.mul (i32.const 16)) (i32.add (global.get $row)) (i32.load8_u offset=0) @@ -144,9 +146,9 @@ (local.set $paramNum (i32.const 0)) (local.set $paramX4 (i32.const 0)) loop $transform_values_loop - (if (i32.lt_u (local.get $paramNum) (i32.load8_u offset=1107 (local.get $opcode)))(then ;;(i32.ge (local.get $paramNum) (i32.load8_u (local.get $opcode))) /*TODO: offset to transformvalues + (if (i32.lt_u (local.get $paramNum) (i32.load8_u offset=918 (local.get $opcode)))(then ;;(i32.ge (local.get $paramNum) (i32.load8_u (local.get $opcode))) /*TODO: offset to transformvalues (local.set $WRKplusparam (i32.add (global.get $WRK) (local.get $paramX4))) - (f32.store offset=1408 + (f32.store offset=1280 (local.get $paramX4) (f32.add (f32.mul @@ -173,7 +175,331 @@ br $vm_loop end ) +;;------------------------------------------------------------------------------- +;; ADDP opcode: add the two top most signals on the stack and pop +;;------------------------------------------------------------------------------- +;; Mono: a b -> a+b +;; Stereo: a b c d -> a+c b+d +;;------------------------------------------------------------------------------- +(func $su_op_addp (param $stereo i32) + (if (local.get $stereo) (then + call $pop ;; a + call $pop ;; b a + call $swap ;; a b + call $pop ;; c a b + f32.add ;; c+a b + call $swap ;; b c+a + call $pop ;; d b c+a + f32.add ;; d+b c+a + call $push ;; c+a + call $push + )(else + (call $push (f32.add (call $pop) (call $pop))) + )) +) +;;------------------------------------------------------------------------------- +;; MULP opcode: multiply the two top most signals on the stack and pop +;;------------------------------------------------------------------------------- +;; Mono: a b -> a*b +;; Stereo: a b c d -> a*c b*d +;;------------------------------------------------------------------------------- +(func $su_op_mulp (param $stereo i32) + (if (local.get $stereo) (then + call $pop ;; a + call $pop ;; b a + call $swap ;; a b + call $pop ;; c a b + f32.mul ;; c*a b + call $swap ;; b c*a + call $pop ;; d b c*a + f32.mul ;; d*b c*a + call $push ;; c*a + call $push + )(else + (call $push (f32.mul (call $pop) (call $pop))) + )) +) + +;;------------------------------------------------------------------------------- +;; PUSH opcode: push the topmost signal on the stack +;;------------------------------------------------------------------------------- +;; Mono: a -> a a +;; Stereo: a b -> a b a b +;;------------------------------------------------------------------------------- +(func $su_op_push (param $stereo i32) + (call $push (call $peek)) +) + +;;------------------------------------------------------------------------------- +;; XCH opcode: exchange the signals on the stack +;;------------------------------------------------------------------------------- +;; Mono: a b -> b a +;; stereo: a b c d -> c d a b +;;------------------------------------------------------------------------------- +(func $su_op_xch (param $stereo i32) + call $pop + call $pop + call $swap + call $push + call $push +) + + +;;------------------------------------------------------------------------------- +;; DISTORT opcode: apply distortion on the signal +;;------------------------------------------------------------------------------- +;; Mono: x -> x*a/(1-a+(2*a-1)*abs(x)) where x is clamped first +;; Stereo: l r -> l*a/(1-a+(2*a-1)*abs(l)) r*a/(1-a+(2*a-1)*abs(r)) +;;------------------------------------------------------------------------------- +(func $su_op_distort (param $stereo i32) + (call $pop) + (call $waveshaper (call $input (i32.const 0))) + (call $push) +) + +;;------------------------------------------------------------------------------- +;; FILTER opcode: perform low/high/band-pass/notch etc. filtering on the signal +;;------------------------------------------------------------------------------- +;; Mono: x -> filtered(x) +;; Stereo: l r -> filtered(l) filtered(r) +;;------------------------------------------------------------------------------- +(func $su_op_filter (param $stereo i32) (local $flags i32) (local $freq f32) (local $high f32) (local $low f32) (local $band f32) (local $retval f32) + (call $stereoHelper (local.get $stereo) (i32.const 4)) + (if (local.get $stereo)(then + ;; This is hacky: rewind the $VAL one byte backwards as the right channel already + ;; scanned it once. Find a way to avoid rewind + (global.set $VAL (i32.sub (global.get $VAL) (i32.const 1))) + )) + (local.set $flags (call $scanValueByte)) + (local.set $freq (f32.mul + (call $input (i32.const 0)) + (call $input (i32.const 0)) + )) + (local.set $low ;; l' = f2*b + l + (f32.add ;; f2*b+l + (f32.mul ;; f2*b + (local.tee $band (f32.load offset=4 (global.get $WRK))) ;; b + (local.get $freq) ;; f2 + ) + (f32.load (global.get $WRK)) ;; l + ) + ) + (local.set $high ;; h' = x - l' - r*b + (f32.sub ;; x - l' - r*b + (f32.sub ;; x - l' + (call $pop) ;; x (signal) + (local.get $low) ;; l' + ) + (f32.mul ;; r*b + (call $input (i32.const 1)) ;; r + (local.get $band) ;; b + ) + ) + ) + (local.set $band ;; b' = f2 * h' + b + (f32.add ;; f2 * h' + b + (f32.mul ;; f2 * h' + (local.get $freq) ;; f2 + (local.get $high) ;; h' + ) + (local.get $band) ;; b + ) + ) + (local.set $retval (f32.const 0)) + (if (i32.and (local.get $flags) (i32.const 0x40)) (then + (local.set $retval (f32.add (local.get $retval) (local.get $low))) + )) + (if (i32.and (local.get $flags) (i32.const 0x10)) (then + (local.set $retval (f32.add (local.get $retval) (local.get $high))) + )) + (f32.store (global.get $WRK) (local.get $low)) + (f32.store offset=4 (global.get $WRK) (local.get $band)) + (call $push (local.get $retval)) +) +;;------------------------------------------------------------------------------- +;; PAN opcode: pan the signal +;;------------------------------------------------------------------------------- +;; Mono: s -> s*(1-p) s*p +;; Stereo: l r -> l*(1-p) r*p +;; +;; where p is the panning in [0,1] range +;;------------------------------------------------------------------------------- +(func $su_op_pan (param $stereo i32) + (call $peek) ;; F: s P: s + (f32.mul + (call $input (i32.const 0)) + (call $pop) + ) ;; F: P: p*s s + (call $push) ;; F: p*s P: s + (call $peek) ;; F: p*s P: p*s s + f32.sub ;; F: p*s P: s-p*s + (call $push) ;; F: (1-p)*s p*s +) + +;;------------------------------------------------------------------------------- +;; DELAY opcode: adds delay effect to the signal +;;------------------------------------------------------------------------------- +;; Mono: perform delay on ST0, using delaycount delaylines starting +;; at delayindex from the delaytable +;; Stereo: perform delay on ST1, using delaycount delaylines starting +;; at delayindex + delaycount from the delaytable (so the right delays +;; can be different) +;;------------------------------------------------------------------------------- +(func $su_op_delay (param $stereo i32) (local $delayIndex i32) (local $delayCount i32) (local $output f32) (local $s f32) (local $filtstate f32) (local $delayCountStash i32) + (local.set $delayIndex (i32.mul (call $scanValueByte) (i32.const 2))) + (local.set $delayCountStash (call $scanValueByte)) + (if (local.get $stereo)(then + (call $su_op_xch (i32.const 0)) + )) + loop $stereoLoop + (local.set $delayCount (local.get $delayCountStash)) + (local.set $output (f32.mul + (call $input (i32.const 1)) + (call $peek) + )) + loop $delayLoop + (local.tee $s (f32.load offset=12 + (i32.add ;; delayWRK + ((globalTick-delaytimes[delayIndex])&65535)*4 + (i32.mul ;; ((globalTick-delaytimes[delayIndex])&65535)*4 + (i32.and ;; (globalTick-delaytimes[delayIndex])&65535 + (i32.sub ;; globalTick-delaytimes[delayIndex] + (global.get $globaltick) + (i32.load16_u + offset=899 + (local.get $delayIndex) + ) + ) + (i32.const 65535) + ) + (i32.const 4) + ) + (global.get $delayWRK) + ) + )) + (local.set $output (f32.add (local.get $output))) + (f32.store + (global.get $delayWRK) + (local.tee $filtstate + (f32.add + (f32.mul + (f32.sub + (f32.load (global.get $delayWRK)) + (local.get $s) + ) + (call $input (i32.const 3)) + ) + (local.get $s) + ) + ) + ) + (f32.store offset=12 + (i32.add ;; delayWRK + globalTick*4 + (i32.mul ;; globalTick)&65535)*4 + (i32.and ;; globalTick&65535 + (global.get $globaltick) + (i32.const 65535) + ) + (i32.const 4) + ) + (global.get $delayWRK) + ) + (f32.add + (f32.mul + (call $input (i32.const 2)) + (local.get $filtstate) + ) + (f32.mul + (f32.mul + (call $input (i32.const 0)) + (call $input (i32.const 0)) + ) + (call $peek) + ) + ) + ) + (global.set $delayWRK (i32.add (global.get $delayWRK) (i32.const 262156))) + (local.set $delayIndex (i32.add (local.get $delayIndex) (i32.const 2))) + (br_if $delayLoop (i32.gt_s (local.tee $delayCount (i32.sub (local.get $delayCount) (i32.const 2))) (i32.const 0))) + end + (f32.store offset=4 + (global.get $delayWRK) + (local.tee $filtstate + (f32.add + (local.get $output) + (f32.sub + (f32.mul + (f32.const 0.99609375) + (f32.load offset=4 (global.get $delayWRK)) + ) + (f32.load offset=8 (global.get $delayWRK)) + ) + ) + ) + ) + (f32.store offset=8 + (global.get $delayWRK) + (local.get $output) + ) + (drop (call $pop)) + (call $push (local.get $filtstate)) + (call $su_op_xch (i32.const 0)) + (br_if $stereoLoop (i32.eqz (local.tee $stereo (i32.eqz (local.get $stereo))))) + end + (call $su_op_xch (i32.const 0)) +) + +;;------------------------------------------------------------------------------- +;; COMPRES opcode: push compressor gain to stack +;;------------------------------------------------------------------------------- +;; Mono: push g on stack, where g is a suitable gain for the signal +;; you can either MULP to compress the signal or SEND it to a GAIN +;; somewhere else for compressor side-chaining. +;; Stereo: push g g on stack, where g is calculated using l^2 + r^2 +;;------------------------------------------------------------------------------- +(func $su_op_compressor (param $stereo i32) (local $x2 f32) (local $level f32) (local $t2 f32) + (local.tee $x2 (f32.mul + (call $peek) + (call $peek) + )) + (local.tee $level (f32.load (global.get $WRK))) + f32.lt + call $nonLinearMap ;; $nonlinearMap(x^2 $threshold, note the local.tees + (call $push + (call $pow ;; (t^2/l)^(r/2) + (f32.div ;; t^2/l + (local.get $t2) + (local.get $level) + ) + (f32.mul ;; r/2 + (call $input (i32.const 4)) ;; r + (f32.const 0.5) ;; 0.5 + ) + ) + ) + )(else + (call $push (f32.const 1)) ;; unity gain if we are below threshold + )) + (call $push (f32.div ;; apply post-gain ("make up gain") + (call $pop) + (call $input (i32.const 2)) + )) + (f32.store (global.get $WRK) (local.get $level)) ;; save the updated levels +) @@ -219,6 +545,28 @@ )) ) +;;------------------------------------------------------------------------------- +;; NOISE opcode: creates noise +;;------------------------------------------------------------------------------- +;; Mono: push a random value [-1,1] value on stack +;; Stereo: push two (different) random values on stack +;;------------------------------------------------------------------------------- +(func $su_op_noise (param $stereo i32) + (if (local.get $stereo) (then + (call $su_op_noise (i32.const 0)) + )) + (global.set $randseed (i32.mul (global.get $randseed) (i32.const 16007))) + (f32.mul + (call $waveshaper + ;; Note: in x86 code, the constant looks like a positive integer, but has actually the MSB set i.e. is considered negative by the FPU. This tripped me big time. + (f32.div (f32.convert_i32_s (global.get $randseed)) (f32.const -2147483648)) + (call $input (i32.const 0)) + ) + (call $input (i32.const 1)) + ) + (call $push) +) + ;;------------------------------------------------------------------------------- ;; OSCILLAT opcode: oscillator, the heart of the synth ;;------------------------------------------------------------------------------- @@ -226,9 +574,15 @@ ;; Stereo: push l r on stack, where l has opposite detune compared to r ;;------------------------------------------------------------------------------- (func $su_op_oscillator (param $stereo i32) (local $flags i32) (local $detune f32) (local $phase f32) (local $color f32) (local $amplitude f32) + (local $unison i32) (local $WRK_stash i32) (local $detune_stash f32) (local.set $flags (call $scanValueByte)) (local.set $detune (call $inputSigned (i32.const 1))) loop $stereoLoop + (local.set $unison (i32.add (i32.and (local.get $flags) (i32.const 3)) (i32.const 1))) + (local.set $WRK_stash (global.get $WRK)) + (local.set $detune_stash (local.get $detune)) + (call $push (f32.const 0)) + loop $unisonLoop (f32.store ;; update phase (global.get $WRK) (local.tee $phase @@ -264,10 +618,31 @@ (if (i32.and (local.get $flags) (i32.const 0x40)) (then (local.set $amplitude (call $oscillator_sine (local.get $phase) (local.get $color))) )) + (if (i32.and (local.get $flags) (i32.const 0x20)) (then + (local.set $amplitude (call $oscillator_trisaw (local.get $phase) (local.get $color))) + )) (call $waveshaper (local.get $amplitude) (call $input (i32.const 4))) (call $push (f32.mul (call $input (i32.const 5)) )) + (call $push (f32.add (call $pop) (call $pop))) + (if (local.tee $unison (i32.sub (local.get $unison) (i32.const 1)))(then + (f32.store offset=1288 (i32.const 0) + (f32.add + (call $input (i32.const 2)) + (f32.const 0.08333333) ;; 1/12, add small phase shift so all oscillators don't start in phase + ) + ) + (global.set $WRK (i32.add (global.get $WRK) (i32.const 8))) ;; WARNING: this is a bug. WRK should be nonvolatile, but we are changing it. It does not cause immediate problems but modulations will be off. + (local.set $detune (f32.neg (f32.mul + (local.get $detune) ;; each unison oscillator has a detune with flipped sign and halved amount... this creates detunes that concentrate around the fundamental + (f32.const 0.5) + ))) + br $unisonLoop + )) + end + (global.set $WRK (local.get $WRK_stash)) + (local.set $detune (local.get $detune_stash)) (local.set $detune (f32.neg (local.get $detune))) ;; flip the detune for secon round (global.set $WRK (i32.add (global.get $WRK) (i32.const 4))) ;; WARNING: this is a bug. WRK should be nonvolatile, but we are changing it. It does not cause immediate problems but modulations will be off. (br_if $stereoLoop (i32.eqz (local.tee $stereo (i32.eqz (local.get $stereo))))) @@ -287,16 +662,90 @@ ) ) +(func $oscillator_trisaw (param $phase f32) (param $color f32) (result f32) + (if (f32.ge (local.get $phase) (local.get $color)) (then + (local.set $phase (f32.sub (f32.const 1) (local.get $phase))) + (local.set $color (f32.sub (f32.const 1) (local.get $color))) + )) + (f32.div (local.get $phase) (local.get $color)) + (f32.mul (f32.const 2)) + (f32.sub (f32.const 1)) +) + +;;------------------------------------------------------------------------------- +;; OUTAUX opcode: outputs to main and aux1 outputs and pops the signal +;;------------------------------------------------------------------------------- +;; Mono: add outgain*ST0 to main left port and auxgain*ST0 to aux1 left +;; Stereo: also add outgain*ST1 to main right port and auxgain*ST1 to aux1 right +;;------------------------------------------------------------------------------- +(func $su_op_outaux (param $stereo i32) (local $addr i32) + (local.set $addr (i32.const 1440)) + loop $stereoLoop + (f32.store ;; send + (local.get $addr) + (f32.add + (f32.mul + (call $peek) + (call $input (i32.const 0)) + ) + (f32.load (local.get $addr)) + ) + ) + (f32.store offset=8 + (local.get $addr) + (f32.add + (f32.mul + (call $pop) + (call $input (i32.const 1)) + ) + (f32.load offset=8 (local.get $addr)) + ) + ) + (local.set $addr (i32.add (local.get $addr) (i32.const 4))) + (br_if $stereoLoop (i32.eqz (local.tee $stereo (i32.eqz (local.get $stereo))))) + end +) + +;;------------------------------------------------------------------------------- +;; SEND opcode: adds the signal to a port +;;------------------------------------------------------------------------------- +;; Mono: adds signal to a memory address, defined by a word in VAL stream +;; Stereo: also add right signal to the following address +;;------------------------------------------------------------------------------- +(func $su_op_send (param $stereo i32) (local $address i32) (local $scaledAddress i32) + (local.set $address (i32.add (call $scanValueByte) (i32.shl (call $scanValueByte) (i32.const 8)))) + (if (i32.eqz (i32.and (local.get $address) (i32.const 8)))(then + (call $push (call $peek)) + )) + (local.set $scaledAddress (i32.add (i32.mul (i32.and (local.get $address) (i32.const 0x7FF7)) (i32.const 4)) + (select + (i32.const 1408) + (global.get $voice) + (i32.and (local.get $address)(i32.const 0x8000)) + ) + )) + (f32.store offset=32 + (local.get $scaledAddress) + (f32.add + (f32.load offset=32 (local.get $scaledAddress)) + (f32.mul + (call $inputSigned (i32.const 0)) + (call $pop) + ) + ) + ) +) + ;;------------------------------------------------------------------------------- ;; OUT opcode: outputs and pops the signal ;;------------------------------------------------------------------------------- ;; Stereo: add ST0 to left out and ST1 to right out, then pop ;;------------------------------------------------------------------------------- (func $su_op_out (param $stereo i32) (local $ptr i32) - (local.set $ptr (i32.const 1568)) ;; synth.left + (local.set $ptr (i32.const 1440)) ;; synth.left (f32.store (local.get $ptr) (f32.add (f32.mul @@ -306,7 +755,7 @@ (f32.load (local.get $ptr)) ) ) - (local.set $ptr (i32.const 1572)) ;; synth.right, note that ATM does not seem to support mono ocpode at all + (local.set $ptr (i32.const 1444)) ;; synth.right, note that ATM does not seem to support mono ocpode at all (f32.store (local.get $ptr) (f32.add (f32.mul @@ -325,7 +774,7 @@ ;; The transformed values start at 512 (TODO: change magic constants somehow) ;;------------------------------------------------------------------------------- (func $input (param $inputNumber i32) (result f32) - (f32.load offset=1408 (i32.mul (local.get $inputNumber) (i32.const 4))) + (f32.load offset=1280 (i32.mul (local.get $inputNumber) (i32.const 4))) ) ;;------------------------------------------------------------------------------- @@ -402,17 +851,28 @@ ;; The opcode table jump table. This is constructed to only include the opcodes ;; that are used so that the jump table is as small as possible. ;;------------------------------------------------------------------------------- -(table 4 funcref) +(table 15 funcref) (elem (i32.const 1) ;; start the indices at 1, as 0 is reserved for advance - $su_op_envelope $su_op_oscillator + $su_op_addp + $su_op_noise + $su_op_filter + $su_op_envelope + $su_op_mulp + $su_op_delay + $su_op_outaux + $su_op_distort + $su_op_pan $su_op_out + $su_op_send + $su_op_push + $su_op_compressor ) ;; All data is collected into a byte buffer and emitted at once -(data (i32.const 0) "\4f\01\2b\01\4f\01\2b\01\4f\01\2b\01\4f\01\2b\01\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\4a\01\48\01\00\00\43\01\01\00\45\01\01\00\3e\01\1f\01\00\2b\01\00\2b\01\1f\01\00\00\00\00\00\00\1d\01\00\29\01\00\29\01\1d\01\00\00\00\00\00\00\00\00\00\00\4f\01\00\00\00\00\00\00\4f\00\00\00\41\01\00\45\01\00\46\01\01\01\01\01\01\01\01\00\41\01\00\41\01\01\3c\01\01\01\01\01\01\01\01\00\4f\01\2b\01\4f\01\2b\01\28\01\2b\01\4f\01\2b\01\4f\01\2b\01\14\01\2b\01\4f\01\2b\01\4f\01\2b\01\40\00\00\00\40\00\00\00\40\00\00\00\40\00\00\00\3e\01\00\41\01\00\41\01\01\01\01\01\01\01\01\00\45\01\00\3c\01\01\40\01\01\01\01\01\01\01\01\00\45\01\00\3e\01\00\3e\01\01\01\01\01\01\01\01\00\3c\01\00\45\01\01\43\01\01\01\01\01\01\01\01\00\4a\01\48\01\00\00\43\01\01\00\45\01\01\01\3e\01\1f\01\00\2b\01\00\2b\01\1f\01\01\01\01\01\01\00\1a\01\00\26\01\00\26\01\1a\01\00\00\00\00\00\00\00\00\00\00\4f\01\00\00\00\00\00\32\4f\00\00\1e\1a\01\00\26\01\00\26\01\1a\01\01\01\01\01\01\00\00\00\39\01\3e\01\39\45\01\39\43\01\41\00\40\00\4d\01\48\4a\01\01\48\01\01\01\01\01\01\00\48\4a\00\00\4f\01\01\00\4f\01\01\01\01\01\4d\01\4a\00\4d\01\00\4f\01\01\4d\01\01\01\4c\01\4a\01\48\01\18\01\00\24\01\00\24\01\18\01\01\01\01\01\01\00\3e\01\39\01\3e\01\39\45\01\39\43\01\41\01\40\00\3e\01\01\01\00\00\00\00\00\00\00\00\00\00\00\43\45\01\01\01\48\01\45\01\01\01\01\00\00\00\00\00\18\01\00\24\01\00\24\01\18\01\00\00\00\00\00\00\1d\01\00\29\01\00\29\01\1d\01\01\01\01\01\01\00\00\00\00\00\42\01\00\00\00\00\00\00\4f\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\02\03\04\05\02\03\04\05\06\07\08\09\06\07\08\09\02\03\04\05\02\03\04\05\0a\0a\0a\0a\0a\0a\0a\0a\0b\0c\0b\0c\0b\0c\0b\0c\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0d\0e\0d\0e\0d\0e\0d\0e\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0f\10\0f\10\0f\10\0f\10\0a\0a\0a\0a\0a\0a\0a\0a\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\0a\0a\0a\0a\12\12\12\13\12\12\12\14\12\12\12\14\12\12\12\12\12\12\12\12\0a\0a\0a\0a\0a\0a\0a\0a\15\16\17\18\15\16\17\18\19\1a\1b\01\19\1a\1b\01\1c\1c\1c\1c\1c\1c\1c\1c\1c\1c\1d\1e\1c\1c\1d\1e\1c\1c\1c\1c\1c\1c\1c\1c\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\03\05\05\05\05\07\00\03\05\05\05\07\00\03\05\05\05\05\07\00\03\05\05\05\05\07\00\03\05\05\05\05\07\00\03\03\05\07\00\03\03\05\05\05\05\07\00\03\05\05\05\05\07\00\03\05\07\00\03\03\05\05\05\05\07\00\18\46\20\40\3c\00\00\00\00\00\40\40\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\30\40\41\20\46\3c\4b\20\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\80\40\12\20\46\50\46\50\00\00\00\00\00\78\40\00\00\00\00\00\80\40\00\00\00\00\00\40\40\00\00\00\00\00\08\40\20\20\46\50\46\50\00\00\00\00\00\78\40\00\00\00\00\00\80\40\00\00\00\00\00\40\40\00\00\00\00\00\08\40\20\20\46\50\46\50\00\00\00\00\00\78\40\00\00\00\00\00\80\40\00\00\00\00\00\40\40\00\00\00\00\00\08\40\20\00\40\60\40\5a\00\46\00\00\64\00\00\00\00\00\30\40\0c\00\48\00\48\19\00\38\00\00\80\00\00\00\00\00\40\40\00\00\00\00\00\40\40\00\00\00\00\00\40\40\00\00\00\00\00\10\40\04\20\40\5a\30\23\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\32\40\0a\00\40\0f\20\64\00\00\00\00\00\80\40\2c\00\46\00\46\40\00\50\00\50\80\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\80\40\00\00\00\00\00\80\40\10\05\06\01") +(data (i32.const 0) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\4a\01\48\01\00\00\43\01\01\00\45\01\01\01\3e\01\1a\01\00\26\01\00\26\01\1a\01\00\00\00\00\00\00\18\01\00\24\01\00\24\01\18\01\00\00\00\00\00\00\1f\01\00\2b\01\00\2b\01\1f\01\00\00\00\00\00\00\1d\01\00\29\01\00\29\01\1d\01\00\00\00\00\00\00\1a\01\00\26\01\00\26\01\1a\01\01\01\01\01\01\00\18\01\00\24\01\00\24\01\18\01\01\01\01\01\01\00\1f\01\00\2b\01\00\2b\01\1f\01\01\01\01\01\01\00\1d\01\00\29\01\00\29\01\1d\01\01\01\01\01\01\00\4a\01\48\01\00\00\43\01\01\00\45\01\01\00\3e\01\41\01\00\45\01\00\46\01\01\01\01\01\01\01\01\00\41\01\00\41\01\01\3c\01\01\01\01\01\01\01\01\00\3e\01\00\41\01\00\41\01\01\01\01\01\01\01\01\00\45\01\00\3c\01\01\40\01\01\01\01\01\01\01\01\00\45\01\00\3e\01\00\3e\01\01\01\01\01\01\01\01\00\3c\01\00\45\01\01\43\01\01\01\01\01\01\01\01\00\40\00\00\00\40\00\00\00\40\00\00\00\40\00\00\00\00\00\00\00\4f\01\00\00\00\00\00\00\4f\00\00\00\00\00\00\00\4f\01\00\00\00\00\00\32\4f\00\00\1e\00\00\00\00\42\01\00\00\00\00\00\00\4f\00\00\00\0a\0a\0a\0a\0a\0a\0a\0a\01\0a\0a\0a\01\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0a\02\03\04\05\02\03\04\05\06\07\08\09\06\07\08\09\02\03\04\05\02\03\04\05\00\00\00\00\00\00\00\00\0b\0c\0b\0c\0b\0c\0b\0c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0d\0e\0d\0e\0d\0e\0d\0e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0f\10\0f\10\0f\10\0f\10\00\00\00\00\00\00\00\00\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\00\00\00\00\12\12\12\13\12\12\12\14\12\12\12\14\12\12\12\12\12\12\12\12\03\03\05\03\05\07\09\05\0b\0d\09\0f\11\00\0a\12\02\0c\08\08\14\17\0a\12\18\00\03\03\05\03\05\07\09\05\0b\0d\09\0f\11\00\03\03\05\03\05\07\09\05\0b\0d\09\0f\11\00\03\03\05\03\05\07\09\05\0b\0d\09\0f\11\00\0a\12\02\0c\08\1a\08\0e\04\14\17\0a\12\18\0a\12\18\00\0a\02\0c\0a\12\06\0c\08\04\12\0e\1c\0c\14\11\0a\12\18\00\40\30\00\02\3f\10\23\40\4e\00\7e\40\10\23\40\3b\00\02\40\10\23\40\06\80\80\10\32\40\40\40\60\20\80\10\40\40\40\40\00\01\00\80\30\3f\00\40\80\70\40\40\40\00\40\80\20\10\80\10\16\80\40\40\80\00\40\00\00\80\20\4f\68\00\40\30\00\02\3f\10\23\40\4e\00\7e\40\10\23\40\3b\00\02\40\10\23\40\06\80\80\10\32\40\40\40\60\20\80\10\40\40\40\40\00\01\00\80\40\30\00\02\3f\10\23\40\4e\00\7e\40\10\23\40\3b\00\02\40\10\23\40\06\80\80\10\32\40\40\40\60\20\80\10\40\40\40\40\00\01\00\80\40\30\00\02\3f\10\23\40\4e\00\7e\40\10\23\40\3b\00\02\40\10\23\40\06\80\80\10\32\40\40\40\60\20\80\10\40\40\40\40\00\01\00\80\24\45\00\20\80\70\40\40\00\80\40\80\40\0e\80\10\10\80\40\20\00\60\40\02\0f\40\40\00\46\00\46\80\05\65\48\94\30\3a\00\00\80\40\20\4d\94\20\3c\00\00\80\40\40\00\40\40\80\20\20\40\00\42\40\20\40\40\6a\80\10\70\18\80\28\00\02\0f\33\31\40\40\70\44\40\00\00\3c\00\00\80\05\5a\38\98\e3\23\e3\23\5c\04\a4\04\fc\04\4c\05\8e\05\d4\05\14\06\52\06\06\00\02\02\05\00\04\02\01\01\01\01\00\05") ;;(data (i32.const 8388610) "\52\49\46\46\b2\eb\0c\20\57\41\56\45\66\6d\74\20\12\20\20\20\03\20\02\20\44\ac\20\20\20\62\05\20\08\20\20\20\20\20\66\61\63\74\04\20\20\20\e0\3a\03\20\64\61\74\61\80\eb\0c\20") diff --git a/tests/groove.yaml b/tests/groove.yaml index 6adc92b..47e57bb 100644 --- a/tests/groove.yaml +++ b/tests/groove.yaml @@ -32,39 +32,39 @@ score: - 0 patterns: - - - 79 + - 74 - 1 - - 43 + - 72 - 1 - - 79 + - 0 + - 0 + - 67 - 1 - - 43 - 1 - - 79 + - 0 + - 69 - 1 - - 43 - 1 - - 79 - - 1 - - 43 + - 0 + - 62 - 1 - + - 74 + - 1 + - 72 - 1 - 0 - 0 + - 67 + - 1 + - 1 - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + - 69 + - 1 + - 1 + - 1 + - 62 + - 1 - numvoices: 1 order: - 0 @@ -93,22 +93,39 @@ score: - 3 patterns: - - - 74 + - 26 - 1 - - 72 + - 0 + - 38 + - 1 + - 0 + - 38 + - 1 + - 26 - 1 - 0 - 0 - - 67 - - 1 + - 0 + - 0 + - 0 + - 0 + - + - 24 - 1 - 0 - - 69 - - 1 + - 36 - 1 - 0 - - 62 + - 36 - 1 + - 24 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - - 31 - 1 @@ -144,22 +161,101 @@ score: - 0 - 0 - - - 0 - - 0 - - 0 - - 0 - - 79 + - 26 - 1 - 0 + - 38 + - 1 - 0 + - 38 + - 1 + - 26 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 - 0 + - + - 24 + - 1 - 0 + - 36 + - 1 - 0 + - 36 + - 1 + - 24 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 - 0 - - 79 + - + - 31 + - 1 - 0 + - 43 + - 1 - 0 + - 43 + - 1 + - 31 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 - 0 + - + - 29 + - 1 + - 0 + - 41 + - 1 + - 0 + - 41 + - 1 + - 29 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 0 + - numvoices: 1 + order: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - 2 + - 1 + - 2 + - 1 + - 2 + - 1 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + patterns: + - null - - 65 - 1 @@ -194,40 +290,6 @@ score: - 1 - 1 - 0 - - - - 79 - - 1 - - 43 - - 1 - - 79 - - 1 - - 43 - - 1 - - 40 - - 1 - - 43 - - 1 - - 79 - - 1 - - 43 - - 1 - - - - 79 - - 1 - - 43 - - 1 - - 20 - - 1 - - 43 - - 1 - - 79 - - 1 - - 43 - - 1 - - 79 - - 1 - - 43 - - 1 - numvoices: 1 order: - 0 @@ -255,23 +317,7 @@ score: - 0 - 0 patterns: - - - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 + - null - - 62 - 1 @@ -333,23 +379,7 @@ score: - 0 - 0 patterns: - - - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 + - null - - 69 - 1 @@ -394,14 +424,14 @@ score: - 0 - 0 - 0 - - 1 - - 2 - - 1 - - 2 - - 1 - - 2 - - 1 - - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - 0 - 0 - 0 @@ -428,84 +458,6 @@ score: - 0 - 0 - 0 - - - - 74 - - 1 - - 72 - - 1 - - 0 - - 0 - - 67 - - 1 - - 1 - - 0 - - 69 - - 1 - - 1 - - 1 - - 62 - - 1 - - - - 31 - - 1 - - 0 - - 43 - - 1 - - 0 - - 43 - - 1 - - 31 - - 1 - - 1 - - 1 - - 1 - - 1 - - 1 - - 0 - - numvoices: 1 - order: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - patterns: - - - - 26 - - 1 - - 0 - - 38 - - 1 - - 0 - - 38 - - 1 - - 26 - - 1 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - numvoices: 1 order: - 0 @@ -533,20 +485,21 @@ score: - 1 - 1 patterns: + - null - - - 64 - 0 - 0 - 0 - - 64 + - 0 + - 79 + - 1 - 0 - 0 - 0 - - 64 - 0 - 0 - 0 - - 64 + - 79 - 0 - 0 - 0 @@ -567,265 +520,6 @@ score: - 0 - 0 - 30 - - - - 26 - - 1 - - 0 - - 38 - - 1 - - 0 - - 38 - - 1 - - 26 - - 1 - - 1 - - 1 - - 1 - - 1 - - 1 - - 0 - - - - 0 - - 0 - - 57 - - 1 - - 62 - - 1 - - 57 - - 69 - - 1 - - 57 - - 67 - - 1 - - 65 - - 0 - - 64 - - 0 - - numvoices: 1 - order: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 1 - - 2 - - 3 - - 4 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 5 - - 6 - - 7 - - 8 - patterns: - - - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - - - 77 - - 1 - - 72 - - 74 - - 1 - - 1 - - 72 - - 1 - - 1 - - 1 - - 1 - - 1 - - 1 - - 0 - - 72 - - 74 - - - - 0 - - 0 - - 79 - - 1 - - 1 - - 0 - - 79 - - 1 - - 1 - - 1 - - 1 - - 1 - - 77 - - 1 - - 74 - - 0 - - - - 77 - - 1 - - 0 - - 79 - - 1 - - 1 - - 77 - - 1 - - 1 - - 1 - - 76 - - 1 - - 74 - - 1 - - 72 - - 1 - - - - 24 - - 1 - - 0 - - 36 - - 1 - - 0 - - 36 - - 1 - - 24 - - 1 - - 1 - - 1 - - 1 - - 1 - - 1 - - 0 - - - - 62 - - 1 - - 57 - - 1 - - 62 - - 1 - - 57 - - 69 - - 1 - - 57 - - 67 - - 1 - - 65 - - 1 - - 64 - - 0 - - - - 62 - - 1 - - 1 - - 1 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 67 - - - - 69 - - 1 - - 1 - - 1 - - 72 - - 1 - - 69 - - 1 - - 1 - - 1 - - 1 - - 0 - - 0 - - 0 - - 0 - - 0 - - null - - numvoices: 1 - order: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 1 - - 2 - - 0 - - 0 - - 1 - - 2 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - patterns: - - - - 24 - - 1 - - 0 - - 36 - - 1 - - 0 - - 36 - - 1 - - 24 - - 1 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - - - 29 - - 1 - - 0 - - 41 - - 1 - - 0 - - 41 - - 1 - - 29 - - 1 - - 1 - - 1 - - 1 - - 1 - - 1 - - 0 - - 0 - 0 @@ -843,377 +537,721 @@ score: - 0 - 0 - 0 - - numvoices: 1 - order: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - patterns: - - - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 - - 64 - - 0 - - 0 - - 0 patch: - numvoices: 1 units: - - type: "envelope" - parameters: - stereo: 1 - attack: 24 - decay: 70 - sustain: 32 - release: 64 - gain: 60 - type: "oscillator" parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 48 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 65 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 32 - decay: 70 - sustain: 60 - release: 75 - gain: 32 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 18 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 32 - decay: 70 - sustain: 80 - release: 70 - gain: 80 - - type: "oscillator" - parameters: - stereo: 1 - gain: 120 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 8 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 32 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 32 - decay: 70 - sustain: 80 - release: 70 - gain: 80 - - type: "oscillator" - parameters: - stereo: 1 - gain: 120 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 8 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 32 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 32 - decay: 70 - sustain: 80 - release: 70 - gain: 80 - - type: "oscillator" - parameters: - stereo: 1 - gain: 120 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 8 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 32 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 0 - decay: 64 - sustain: 96 - release: 64 - gain: 90 - - type: "envelope" - parameters: - stereo: 1 - attack: 0 - decay: 70 - sustain: 0 - release: 0 - gain: 100 - - type: "oscillator" - parameters: - stereo: 1 - gain: 48 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 12 - - numvoices: 1 - units: - - type: "envelope" - parameters: - stereo: 1 - attack: 0 - decay: 72 - sustain: 0 - release: 72 - gain: 25 - - type: "envelope" - parameters: - stereo: 1 - attack: 0 - decay: 56 - sustain: 0 - release: 0 - gain: 128 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 - gain: 64 - type: 0 - - type: "oscillator" - parameters: - stereo: 1 + color: 2 + detune: 48 gain: 16 - type: 0 - - type: "out" + lfo: 0 + phase: 0 + shape: 63 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "oscillator" + parameters: + color: 126 + detune: 78 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "oscillator" + parameters: + color: 2 + detune: 59 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "noise" + parameters: + gain: 6 + shape: 64 + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 128 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "addp" parameters: stereo: 1 - gain: 4 - - numvoices: 1 - units: - type: "envelope" parameters: - stereo: 1 - attack: 32 + attack: 50 decay: 64 - sustain: 90 - release: 48 - gain: 35 - - type: "oscillator" + gain: 96 + release: 64 + stereo: 1 + sustain: 64 + - type: "mulp" parameters: stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + - type: "filter" parameters: + bandpass: 0 + frequency: 32 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + - type: "delay" parameters: + damp: 64 + dry: 64 + feedback: 64 + notetracking: 0 + pregain: 64 stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + varargs: + - 9187 + - 9187 + - type: "outaux" parameters: + auxgain: 128 + outgain: 0 stereo: 1 - gain: 50 - type: 0 - - type: "out" - parameters: - stereo: 1 - gain: 10 - numvoices: 1 units: - type: "envelope" parameters: + attack: 48 + decay: 63 + gain: 128 + release: 64 + stereo: 0 + sustain: 0 + - type: "distort" + parameters: + drive: 112 + stereo: 0 + - type: "oscillator" + parameters: + color: 0 + detune: 64 + gain: 128 + looplength: 1486 + loopstart: 2536 + phase: 64 + samplestart: 250849 + shape: 64 + stereo: 0 + transpose: 64 + type: 1 + unison: 0 + - type: "mulp" + parameters: + stereo: 0 + - type: "filter" + parameters: + bandpass: 0 + frequency: 16 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 0 + - type: "filter" + id: 1 + parameters: + bandpass: 0 + frequency: 22 + highpass: 0 + lowpass: 1 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 0 + - type: "pan" + parameters: + panning: 64 + stereo: 0 + - type: "out" + parameters: + gain: 128 stereo: 1 + - parameters: {} + - type: "envelope" + parameters: attack: 0 decay: 64 - sustain: 15 + gain: 128 + release: 0 + stereo: 0 + sustain: 0 + - type: "distort" + parameters: + drive: 32 + stereo: 0 + - type: "send" + parameters: + amount: 79 + port: 0 + sendpop: 1 + stereo: 0 + target: 1 + - numvoices: 1 + units: + - type: "oscillator" + parameters: + color: 2 + detune: 48 + gain: 16 + lfo: 0 + phase: 0 + shape: 63 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "oscillator" + parameters: + color: 126 + detune: 78 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "oscillator" + parameters: + color: 2 + detune: 59 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "noise" + parameters: + gain: 6 + shape: 64 + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 128 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "addp" + parameters: + stereo: 1 + - type: "envelope" + parameters: + attack: 50 + decay: 64 + gain: 96 + release: 64 + stereo: 1 + sustain: 64 + - type: "mulp" + parameters: + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 32 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "delay" + parameters: + damp: 64 + dry: 64 + feedback: 64 + notetracking: 0 + pregain: 64 + stereo: 1 + varargs: + - 9187 + - 9187 + - type: "outaux" + parameters: + auxgain: 128 + outgain: 0 + stereo: 1 + - numvoices: 1 + units: + - type: "oscillator" + parameters: + color: 2 + detune: 48 + gain: 16 + lfo: 0 + phase: 0 + shape: 63 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "oscillator" + parameters: + color: 126 + detune: 78 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "oscillator" + parameters: + color: 2 + detune: 59 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "noise" + parameters: + gain: 6 + shape: 64 + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 128 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "addp" + parameters: + stereo: 1 + - type: "envelope" + parameters: + attack: 50 + decay: 64 + gain: 96 + release: 64 + stereo: 1 + sustain: 64 + - type: "mulp" + parameters: + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 32 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "delay" + parameters: + damp: 64 + dry: 64 + feedback: 64 + notetracking: 0 + pregain: 64 + stereo: 1 + varargs: + - 9187 + - 9187 + - type: "outaux" + parameters: + auxgain: 128 + outgain: 0 + stereo: 1 + - numvoices: 1 + units: + - type: "oscillator" + parameters: + color: 2 + detune: 48 + gain: 16 + lfo: 0 + phase: 0 + shape: 63 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "oscillator" + parameters: + color: 126 + detune: 78 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "oscillator" + parameters: + color: 2 + detune: 59 + gain: 16 + phase: 0 + shape: 64 + stereo: 1 + transpose: 64 + type: 1 + unison: 3 + - type: "addp" + parameters: + stereo: 1 + - type: "noise" + parameters: + gain: 6 + shape: 64 + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 128 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "addp" + parameters: + stereo: 1 + - type: "envelope" + parameters: + attack: 50 + decay: 64 + gain: 96 + release: 64 + stereo: 1 + sustain: 64 + - type: "mulp" + parameters: + stereo: 1 + - type: "filter" + parameters: + bandpass: 0 + frequency: 32 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 1 + - type: "delay" + parameters: + damp: 64 + dry: 64 + feedback: 64 + notetracking: 0 + pregain: 64 + stereo: 1 + varargs: + - 9187 + - 9187 + - type: "outaux" + parameters: + auxgain: 128 + outgain: 0 + stereo: 1 + - numvoices: 1 + units: + - type: "envelope" + parameters: + attack: 36 + decay: 69 + gain: 128 release: 32 - gain: 100 - - type: "oscillator" + stereo: 0 + sustain: 0 + - type: "distort" parameters: - stereo: 1 + drive: 112 + stereo: 0 + - type: "oscillator" + id: 1 + parameters: + color: 128 + detune: 64 gain: 128 + looplength: 1 + phase: 0 + shape: 64 + stereo: 0 + transpose: 64 type: 0 + - type: "mulp" + parameters: + stereo: 0 + - type: "filter" + parameters: + bandpass: 0 + frequency: 14 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 0 + - type: "push" + parameters: + stereo: 0 + - type: "filter" + parameters: + bandpass: 0 + frequency: 16 + highpass: 0 + lowpass: 1 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 0 + - type: "delay" + parameters: + count: 8 + damp: 64 + delay: 1 + dry: 0 + feedback: 96 + notetracking: 0 + pregain: 32 + stereo: 0 + varargs: + - 1116 + - 1188 + - 1276 + - 1356 + - 1422 + - 1492 + - 1556 + - 1618 + - type: "addp" + parameters: + stereo: 0 + - type: "pan" + parameters: + panning: 64 + stereo: 0 - type: "out" parameters: + gain: 64 stereo: 1 - gain: 44 + - parameters: {} + - type: "envelope" + parameters: + attack: 0 + decay: 70 + gain: 128 + release: 70 + stereo: 0 + sustain: 0 + - type: "distort" + parameters: + drive: 5 + stereo: 0 + - type: "send" + parameters: + amount: 101 + port: 0 + sendpop: 1 + stereo: 0 + target: 1 + - parameters: {} + - type: "envelope" + parameters: + attack: 48 + decay: 58 + gain: 128 + release: 0 + stereo: 0 + sustain: 0 + - type: "distort" + parameters: + drive: 64 + stereo: 0 + - type: "send" + parameters: + amount: 32 + port: 5 + sendpop: 1 + stereo: 0 + target: 1 + unit: 0 + voice: 0 - numvoices: 1 units: - type: "envelope" parameters: - stereo: 1 - attack: 0 - decay: 70 + attack: 32 + decay: 60 + gain: 128 + release: 0 + stereo: 0 sustain: 0 - release: 70 - gain: 64 + - type: "oscillator" + id: 1 + parameters: + color: 64 + detune: 64 + gain: 128 + phase: 0 + shape: 64 + stereo: 0 + transpose: 64 + type: 1 + - type: "mulp" + parameters: + stereo: 0 + - parameters: {} - type: "envelope" parameters: - stereo: 1 - attack: 0 - decay: 80 + attack: 32 + decay: 64 + gain: 64 + release: 66 + stereo: 0 sustain: 0 - release: 80 - gain: 128 - - type: "oscillator" + - type: "distort" parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + drive: 32 + stereo: 0 + - type: "noise" parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + gain: 64 + shape: 64 + stereo: 0 + - type: "mulp" parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "oscillator" + stereo: 0 + - type: "filter" parameters: - stereo: 1 - gain: 128 - type: 0 - - type: "out" + bandpass: 0 + frequency: 106 + highpass: 1 + lowpass: 0 + negbandpass: 0 + neghighpass: 0 + resonance: 128 + stereo: 0 + - type: "addp" parameters: + stereo: 0 + - parameters: {} + - type: "distort" + parameters: + drive: 112 + stereo: 0 + - type: "delay" + parameters: + count: 8 + damp: 0 + delay: 1 + dry: 128 + feedback: 40 + notetracking: 0 + pregain: 24 + stereo: 0 + varargs: + - 1116 + - 1188 + - 1276 + - 1356 + - 1422 + - 1492 + - 1556 + - 1618 + - type: "compressor" + parameters: + attack: 51 + invgain: 64 + ratio: 112 + release: 49 + stereo: 0 + threshold: 64 + - type: "mulp" + parameters: + stereo: 0 + - parameters: {} + - type: "pan" + parameters: + panning: 68 + stereo: 0 + - type: "outaux" + parameters: + auxgain: 0 + outgain: 64 stereo: 1 - gain: 16 + - parameters: {} + - type: "envelope" + parameters: + attack: 0 + decay: 60 + gain: 128 + release: 0 + stereo: 0 + sustain: 0 + - type: "distort" + parameters: + drive: 5 + stereo: 0 + - type: "send" + parameters: + amount: 90 + port: 0 + sendpop: 1 + stereo: 0 + target: 1 + unit: 0 + voice: 0 diff --git a/testwasm.mjs b/testwasm.mjs index c01aa7e..7a6f476 100644 --- a/testwasm.mjs +++ b/testwasm.mjs @@ -12,4 +12,4 @@ const mod = await WebAssembly.instantiate(wasm, { const mem = mod.instance.exports.m; -await writeFile('test.raw', new Uint8Array(mem.buffer)); \ No newline at end of file +await writeFile('test.raw', new Uint8Array(mem.buffer,mod.instance.exports.s,mod.instance.exports.l)); \ No newline at end of file