import yaml from 'json-to-pretty-yaml'; import groove from './tests/grooveisinthecode.js'; import { writeFile } from 'fs/promises'; const doc = { bpm: groove.BPM, rowsperbeat: 4, score: { length: groove.patterns[0].length, rowsperpattern: groove.patternsize, tracks: groove.instrumentPatternLists.map(track => { const patterns = track.map(patternIndex => groove.patterns[patternIndex]); const order = track.map((patternIndex, ndx) => ndx); return { numvoices: 1, order, patterns } }) }, patch: [] } const addInstrument = (name, strdef) => { const units = strdef.split('\n') .map(opline => { console.log(opline); const opcode_params = opline.replace(/\s\s+/,'\t').split(/[\t]/); const opcode = opcode_params[0]; const params = opcode_params[1].split(','); const parameters = {}; params.forEach(param => { console.log(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; } }); return { "type": { "GO4K_ENV": "envelope" }[opcode], parameters } }); 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));