UNPKG

node-serum2-preset-packager

Version:
775 lines (754 loc) 16.3 kB
# node-serum2-preset-packager Encode and decode Xfer Serum 2 `.SerumPreset` files with TypeScript. This package provides utilities and a CLI for converting between Serum 2 preset files and JSON, making it easy to inspect, modify, or generate presets programmatically. ## Features - **Unpack**: Convert `.SerumPreset` files to readable JSON. - **Pack**: Convert JSON files back to `.SerumPreset` format. - **CLI & API**: Use from the command line or integrate into your own TypeScript/Node.js projects. ## Installation ```bash # using npm npm install node-serum2-preset-packager # or using pnpm pnpm install node-serum2-preset-packager # run build scripts for dependencies @mongodb-js/zstd pnpm approve-builds ``` ## Usage ### Programmatic API ```typescript import { unpack, pack } from 'node-serum2-preset-packager' // Unpack a SerumPreset file to JSON await unpack('input.SerumPreset', 'output.json') // Pack a JSON file to SerumPreset await pack('input.json', 'output.SerumPreset') ``` ### CLI ```bash # Unpack a SerumPreset file to JSON node cli.js unpack <file.SerumPreset> <out.json> # Pack a JSON file to SerumPreset node cli.js pack <in.json> <out.SerumPreset> ``` ## Project Structure - dist/ - Distribution files - src/ - Core library code - test/ - test scripts - test/decode/ - Example .SerumPreset files - test/encode/ - Example JSON files ## Thanks Special thanks to [Kenneth Wussmann](https://github.com/KennethWussmann/serum-preset-packager) for the original Serum 2 preset packager implementation in Python, which inspired this TypeScript version. ## Serum 2 Preset Format - JSON Schema ```json { "metadata": { "fileType": "SerumPreset", "hash": "f7e5b9fc64e4a1f69aff9b8cef5bbb81", "presetAuthor": "", "presetDescription": "", "presetName": "temp1", "product": "Serum2", "productVersion": "2.0.19", "tags": ["Wavetable", "Poly"], "url": "https://xferrecords.com/", "vendor": "Xfer Records", "version": 7 }, "data": { "Arp0": { "plainParams": "default" }, "ArpClip0": { "clip": {}, "plainParams": "default" }, "ArpClip1": { "clip": {}, "plainParams": "default" }, "ArpClip10": { "clip": {}, "plainParams": "default" }, "ArpClip11": { "clip": {}, "plainParams": "default" }, "ArpClip2": { "clip": {}, "plainParams": "default" }, "ArpClip3": { "clip": {}, "plainParams": "default" }, "ArpClip4": { "clip": {}, "plainParams": "default" }, "ArpClip5": { "clip": {}, "plainParams": "default" }, "ArpClip6": { "clip": {}, "plainParams": "default" }, "ArpClip7": { "clip": {}, "plainParams": "default" }, "ArpClip8": { "clip": {}, "plainParams": "default" }, "ArpClip9": { "clip": {}, "plainParams": "default" }, "ClipPlayer": { "kUIParamPianoRollNotePreview": 1, "kUIParamPreviewClip": 0, "kUIParamSelectedClip": 0 }, "ClipPlayer0": { "plainParams": "default" }, "Env0": { "plainParams": { "kParamCurve1": 50, "kParamCurve2": 66.60000000000001, "kParamCurve3": 66.60000000000001 } }, "Env1": { "plainParams": { "kParamCurve1": 50, "kParamCurve2": 66.60000000000001, "kParamCurve3": 66.60000000000001 } }, "Env2": { "plainParams": { "kParamCurve1": 50, "kParamCurve2": 66.60000000000001, "kParamCurve3": 66.60000000000001 } }, "Env3": { "plainParams": { "kParamCurve1": 50, "kParamCurve2": 66.60000000000001, "kParamCurve3": 66.60000000000001 } }, "FXRack0": { "FX": [], "displayName": "", "plainParams": "default" }, "FXRack1": { "FX": [], "displayName": "", "plainParams": "default" }, "FXRack2": { "FX": [], "displayName": "", "plainParams": "default" }, "Filter": { "kUIParamMixOrGain": 0 }, "Global0": { "plainParams": "default" }, "GranularOsc": [ { "kUIParamDisplayXYInput": 0 }, { "kUIParamDisplayXYInput": 0 }, { "kUIParamDisplayXYInput": 0 } ], "LFO0": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO1": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO2": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO3": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO4": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO5": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO6": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO7": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO8": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFO9": { "curveData": {}, "pathData": {}, "plainParams": "default" }, "LFOPointModBus0": { "plainParams": "default" }, "LFOPointModBus1": { "plainParams": "default" }, "LFOPointModBus10": { "plainParams": "default" }, "LFOPointModBus11": { "plainParams": "default" }, "LFOPointModBus12": { "plainParams": "default" }, "LFOPointModBus13": { "plainParams": "default" }, "LFOPointModBus14": { "plainParams": "default" }, "LFOPointModBus15": { "plainParams": "default" }, "LFOPointModBus2": { "plainParams": "default" }, "LFOPointModBus3": { "plainParams": "default" }, "LFOPointModBus4": { "plainParams": "default" }, "LFOPointModBus5": { "plainParams": "default" }, "LFOPointModBus6": { "plainParams": "default" }, "LFOPointModBus7": { "plainParams": "default" }, "LFOPointModBus8": { "plainParams": "default" }, "LFOPointModBus9": { "plainParams": "default" }, "Macro0": { "plainParams": "default" }, "Macro1": { "plainParams": "default" }, "Macro2": { "plainParams": "default" }, "Macro3": { "plainParams": "default" }, "Macro4": { "plainParams": "default" }, "Macro5": { "plainParams": "default" }, "Macro6": { "plainParams": "default" }, "Macro7": { "plainParams": "default" }, "MidiClip0": { "clip": {}, "plainParams": "default" }, "MidiClip1": { "clip": {}, "plainParams": "default" }, "MidiClip10": { "clip": {}, "plainParams": "default" }, "MidiClip11": { "clip": {}, "plainParams": "default" }, "MidiClip2": { "clip": {}, "plainParams": "default" }, "MidiClip3": { "clip": {}, "plainParams": "default" }, "MidiClip4": { "clip": {}, "plainParams": "default" }, "MidiClip5": { "clip": {}, "plainParams": "default" }, "MidiClip6": { "clip": {}, "plainParams": "default" }, "MidiClip7": { "clip": {}, "plainParams": "default" }, "MidiClip8": { "clip": {}, "plainParams": "default" }, "MidiClip9": { "clip": {}, "plainParams": "default" }, "ModSlot0": { "plainParams": "default" }, "ModSlot1": { "plainParams": "default" }, "ModSlot10": { "plainParams": "default" }, "ModSlot11": { "plainParams": "default" }, "ModSlot12": { "plainParams": "default" }, "ModSlot13": { "plainParams": "default" }, "ModSlot14": { "plainParams": "default" }, "ModSlot15": { "plainParams": "default" }, "ModSlot16": { "plainParams": "default" }, "ModSlot17": { "plainParams": "default" }, "ModSlot18": { "plainParams": "default" }, "ModSlot19": { "plainParams": "default" }, "ModSlot2": { "plainParams": "default" }, "ModSlot20": { "plainParams": "default" }, "ModSlot21": { "plainParams": "default" }, "ModSlot22": { "plainParams": "default" }, "ModSlot23": { "plainParams": "default" }, "ModSlot24": { "plainParams": "default" }, "ModSlot25": { "plainParams": "default" }, "ModSlot26": { "plainParams": "default" }, "ModSlot27": { "plainParams": "default" }, "ModSlot28": { "plainParams": "default" }, "ModSlot29": { "plainParams": "default" }, "ModSlot3": { "plainParams": "default" }, "ModSlot30": { "plainParams": "default" }, "ModSlot31": { "plainParams": "default" }, "ModSlot32": { "plainParams": "default" }, "ModSlot33": { "plainParams": "default" }, "ModSlot34": { "plainParams": "default" }, "ModSlot35": { "plainParams": "default" }, "ModSlot36": { "plainParams": "default" }, "ModSlot37": { "plainParams": "default" }, "ModSlot38": { "plainParams": "default" }, "ModSlot39": { "plainParams": "default" }, "ModSlot4": { "plainParams": "default" }, "ModSlot40": { "plainParams": "default" }, "ModSlot41": { "plainParams": "default" }, "ModSlot42": { "plainParams": "default" }, "ModSlot43": { "plainParams": "default" }, "ModSlot44": { "plainParams": "default" }, "ModSlot45": { "plainParams": "default" }, "ModSlot46": { "plainParams": "default" }, "ModSlot47": { "plainParams": "default" }, "ModSlot48": { "plainParams": "default" }, "ModSlot49": { "plainParams": "default" }, "ModSlot5": { "plainParams": "default" }, "ModSlot50": { "plainParams": "default" }, "ModSlot51": { "plainParams": "default" }, "ModSlot52": { "plainParams": "default" }, "ModSlot53": { "plainParams": "default" }, "ModSlot54": { "plainParams": "default" }, "ModSlot55": { "plainParams": "default" }, "ModSlot56": { "plainParams": "default" }, "ModSlot57": { "plainParams": "default" }, "ModSlot58": { "plainParams": "default" }, "ModSlot59": { "plainParams": "default" }, "ModSlot6": { "plainParams": "default" }, "ModSlot60": { "plainParams": "default" }, "ModSlot61": { "plainParams": "default" }, "ModSlot62": { "plainParams": "default" }, "ModSlot63": { "plainParams": "default" }, "ModSlot7": { "plainParams": "default" }, "ModSlot8": { "plainParams": "default" }, "ModSlot9": { "plainParams": "default" }, "MultiSampleOsc": [ { "kUIParamMultiSampleOverviewMouseTag": 0 }, { "kUIParamMultiSampleOverviewMouseTag": 0 }, { "kUIParamMultiSampleOverviewMouseTag": 0 } ], "Osc": [ { "kUIParamAutoSyncSlicing": 0, "kUIParamShowMarkerAnimations": 0, "kUIParamZoomToStartEnd": 0 }, { "kUIParamAutoSyncSlicing": 0, "kUIParamShowMarkerAnimations": 0, "kUIParamZoomToStartEnd": 0 }, { "kUIParamAutoSyncSlicing": 0, "kUIParamShowMarkerAnimations": 0, "kUIParamZoomToStartEnd": 0 }, { "kUIParamAutoSyncSlicing": 0, "kUIParamShowMarkerAnimations": 0, "kUIParamZoomToStartEnd": 0 }, { "kUIParamAutoSyncSlicing": 0, "kUIParamShowMarkerAnimations": 0, "kUIParamZoomToStartEnd": 0 } ], "Oscillator0": { "GranularOsc0": { "plainParams": "default" }, "MultiSampleOsc0": { "plainParams": "default" }, "SampleOsc0": { "plainParams": "default" }, "SpectralOsc0": { "plainParams": "default" }, "WTOsc0": { "flex": {}, "numChannels": 1, "numFrames": 18432, "plainParams": "default", "relativePathToWT": "S2 Tables/Default Shapes.wav", "sampleRate": 44100 }, "plainParams": "default" }, "Oscillator1": { "GranularOsc1": { "plainParams": "default" }, "MultiSampleOsc1": { "plainParams": "default" }, "SampleOsc1": { "plainParams": "default" }, "SpectralOsc1": { "plainParams": "default" }, "WTOsc1": { "flex": {}, "numChannels": 1, "numFrames": 18432, "plainParams": "default", "relativePathToWT": "S2 Tables/Default Shapes.wav", "sampleRate": 44100 }, "plainParams": "default" }, "Oscillator2": { "GranularOsc2": { "plainParams": "default" }, "MultiSampleOsc2": { "plainParams": "default" }, "SampleOsc2": { "plainParams": "default" }, "SpectralOsc2": { "plainParams": "default" }, "WTOsc2": { "flex": {}, "numChannels": 1, "numFrames": 18432, "plainParams": "default", "relativePathToWT": "S2 Tables/Default Shapes.wav", "sampleRate": 44100 }, "plainParams": "default" }, "Oscillator3": { "NoiseOsc3": { "detuneFactor": 0.4758218478413068, "numChannels": 1, "numFrames": 78241, "plainParams": "default", "relativePathToNoiseSample": "Organics/AC hum1.wav", "sampleRate": 44100 }, "plainParams": "default" }, "Oscillator4": { "SubOsc4": { "plainParams": "default" }, "plainParams": "default" }, "PitchQuantizer0": { "plainParams": "default", "scale": [0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 2, 0], "scaleName": "Major" }, "RetriggerState0": { "plainParams": "default" }, "RoutingSlot0": { "plainParams": "default" }, "RoutingSlot1": { "plainParams": "default" }, "RoutingSlot2": { "plainParams": "default" }, "RoutingSlot3": { "plainParams": "default" }, "RoutingSlot4": { "plainParams": "default" }, "RoutingSlot5": { "plainParams": "default" }, "RoutingSlot6": { "plainParams": "default" }, "SerumGUI": { "kUIParamShowKeyboard": 1, "kUIParamShowMidiOut": 0 }, "SpectralOsc": [ { "kUIParamDisplayXYInput": 0, "kUIParamShowWaveformDisplay": 0 }, { "kUIParamDisplayXYInput": 0, "kUIParamShowWaveformDisplay": 0 }, { "kUIParamDisplayXYInput": 0, "kUIParamShowWaveformDisplay": 0 } ], "VoiceFilter0": { "plainParams": "default" }, "VoiceFilter1": { "plainParams": "default" }, "VoicePanel0": { "displayName": "", "plainParams": "default" }, "WTOsc": [ { "kUIParamWTOverviewMouseTag": 0 }, { "kUIParamWTOverviewMouseTag": 0 }, { "kUIParamWTOverviewMouseTag": 0 } ], "arpBankDisplayName": "", "clipBankDisplayName": "", "fileType": "SerumPreset", "lockOversampling": false, "lockTuning": false, "mpeConfig": 0, "mpeEnabled": false, "mpePitchBendRange": 48, "presetAuthor": "", "presetDescription": "", "presetName": "temp1", "product": "Serum2", "productVersion": "2.0.19", "scalars": { "note": {}, "velo": {} }, "tags": ["Wavetable", "Poly"], "url": "https://xferrecords.com/", "vendor": "Xfer Records", "version": 7 } } ```