From 2d3f1095a25e9c88c07dcb7ff304b434affd12db Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Fri, 1 Jan 2021 00:33:44 -0800 Subject: [PATCH] Move winamp-eqf into the monorepo (#1054) * Move winamp-eqf into the monorepo * [winamp-eqf] Upgrade Jest --- packages/winamp-eqf/README.md | 82 ++++ .../__snapshots__/index.test.js.snap | 443 ++++++++++++++++++ packages/winamp-eqf/constants.js | 20 + packages/winamp-eqf/creator.js | 35 ++ packages/winamp-eqf/index.js | 7 + packages/winamp-eqf/index.test.js | 96 ++++ packages/winamp-eqf/package.json | 31 ++ packages/winamp-eqf/parser.js | 41 ++ packages/winamp-eqf/sample_data/max.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/midline.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/min.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/myEq.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/preampMax.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/preampMin.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/random.EQF | Bin 0 -> 299 bytes packages/winamp-eqf/sample_data/winamp.q1 | Bin 0 -> 4587 bytes .../winamp-eqf/sample_data/winamp_sample.q1 | Bin 0 -> 1103 bytes yarn.lock | 11 +- 18 files changed, 761 insertions(+), 5 deletions(-) create mode 100644 packages/winamp-eqf/README.md create mode 100644 packages/winamp-eqf/__snapshots__/index.test.js.snap create mode 100644 packages/winamp-eqf/constants.js create mode 100644 packages/winamp-eqf/creator.js create mode 100644 packages/winamp-eqf/index.js create mode 100644 packages/winamp-eqf/index.test.js create mode 100644 packages/winamp-eqf/package.json create mode 100644 packages/winamp-eqf/parser.js create mode 100644 packages/winamp-eqf/sample_data/max.EQF create mode 100644 packages/winamp-eqf/sample_data/midline.EQF create mode 100644 packages/winamp-eqf/sample_data/min.EQF create mode 100644 packages/winamp-eqf/sample_data/myEq.EQF create mode 100644 packages/winamp-eqf/sample_data/preampMax.EQF create mode 100644 packages/winamp-eqf/sample_data/preampMin.EQF create mode 100644 packages/winamp-eqf/sample_data/random.EQF create mode 100644 packages/winamp-eqf/sample_data/winamp.q1 create mode 100644 packages/winamp-eqf/sample_data/winamp_sample.q1 diff --git a/packages/winamp-eqf/README.md b/packages/winamp-eqf/README.md new file mode 100644 index 00000000..cc0121bb --- /dev/null +++ b/packages/winamp-eqf/README.md @@ -0,0 +1,82 @@ +# Winamp Equalizer Preset Parser + +Winamp allows you to save your equalizser settings to `.eqf` file. This package allows you to parse these files. + +## Installation + + npm install --save winamp-eqf + +## Ussage + + import {parser, creator} from 'winamp-eqf'; + + // ... Get your .eqf or .q1 file as an ArrayBuffer + const eqf = parser(eqfArrayBuffer); + + const eqfArrayBuffer = creator(eqf); + +## API + +### `parser(ArrayBuffer)` + +#### Return value + +```JavaScript +{ + "presets": [ + { + "name": "Entry1", + "preamp": 33, // 1-64 + "hz60": 64, // 1-64 + "hz170": 64, // ... + "hz310": 64, + "hz600": 64, + "hz1000": 64, + "hz3000": 64, + "hz6000": 64, + "hz12000": 64, + "hz14000": 64, + "hz16000": 64, + }, + // Some files, such as winamp.q1, may contain multiple preset objects. + ], + "type": "Winamp EQ library file v1.1", +} +``` + +### `creator(eqfObject)` + +#### Return Value: `ArrayBuffer` + +`eqfObject` is an object with the same shape as that returned by `parser()`. + + + +## Source Material + +Starting with this spec found here: : + +> I've taken a look at some EQF files that I made for the purpose. The format is apparently very simple: +> The file is 299 bytes long. +> +> It starts with a text header, which in my case, is 37 bytes long. It is, in double-quotish notation — note the control-Z character: +> +> Winamp EQ library file v1.1\cZ!--Entry1 +> +> Next is a block of null bytes ("\0") up till the next, final part. +> The real data is stored in the last 11 bytes of the file: the last byte is for the general volume, the 10 bytes before that are for each of the 10 EQ controls, in ascending order: the first of these 10 for the deepest bass, the last one (right in front of the volume byte) is for the highest treble. +> The values are 0x20 in neutral position, and are reversed in value: 0x00 is maximum, 0x3F is minimum. So there are 31 positions below, and 31 32 levels above neutral. + +Additionally, I got some info from [Darren Owen](https://twitter.com/The_DoctorO) via Twitter: + + + +> Not that i'm aware off as sadly documentation of things was never great. Looking at the link vs files in a hex editor it seems mostly right. + +> The current 1.1 format should be fine as I don't believe the format has changed for a very long time :) + +And then via direct message: + +> Will do it here as I can type a bit more, but the only obvious thing wrong with the link is the signature assumption as it's not guaranteed to be 'entry1' As you can have multiple eq blocks in a file. + +> If you've looked at winamp.q1 you should see multiple presets in that file which follow one after each other so the file signature (winamp.q1 or a specific *.eqf file) is "Winamp EQ library file v1.1\x1A!--" (pulled that out from the disassembler) it's then a 257 byte buffer (256 + null character to terminate correctly) then the 10 byte block relating to the eq sliders (need to double-check the range base) followed by the 1 byte for the preamp slider then if there's more presets in the file, they follow on immediately after with the name block looking at the preamp slider, -12dB = 0x3F, 0dB = 0x1F, 12dB = 0 (so a 0-63 range) that seems to be the same for the other sliders (and matches 1:1 with the sdk details) and I think that's it :) in the winamp.q1 file, the 'default' entry is either a flat preset or what's been saved after customisation (in-case you're wanting to mirror the native behaviour via the preset -> save -> default action) \ No newline at end of file diff --git a/packages/winamp-eqf/__snapshots__/index.test.js.snap b/packages/winamp-eqf/__snapshots__/index.test.js.snap new file mode 100644 index 00000000..c34189c5 --- /dev/null +++ b/packages/winamp-eqf/__snapshots__/index.test.js.snap @@ -0,0 +1,443 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`parser can parse max.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 64, + "hz12000": 64, + "hz14000": 64, + "hz16000": 64, + "hz170": 64, + "hz3000": 64, + "hz310": 64, + "hz60": 64, + "hz600": 64, + "hz6000": 64, + "name": "Entry1", + "preamp": 33, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse midline.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 33, + "hz310": 33, + "hz60": 33, + "hz600": 33, + "hz6000": 33, + "name": "Entry1", + "preamp": 33, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse min.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 1, + "hz12000": 1, + "hz14000": 1, + "hz16000": 1, + "hz170": 1, + "hz3000": 1, + "hz310": 1, + "hz60": 1, + "hz600": 1, + "hz6000": 1, + "name": "Entry1", + "preamp": 33, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse preampMax.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 33, + "hz310": 33, + "hz60": 33, + "hz600": 33, + "hz6000": 33, + "name": "Entry1", + "preamp": 64, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse preampMin.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 33, + "hz310": 33, + "hz60": 33, + "hz600": 33, + "hz6000": 33, + "name": "Entry1", + "preamp": 1, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse random.EQF 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 15, + "hz14000": 47, + "hz16000": 33, + "hz170": 35, + "hz3000": 48, + "hz310": 1, + "hz60": 64, + "hz600": 33, + "hz6000": 33, + "name": "Entry1", + "preamp": 55, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse winamp.q1 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 20, + "hz14000": 20, + "hz16000": 16, + "hz170": 33, + "hz3000": 33, + "hz310": 33, + "hz60": 33, + "hz600": 33, + "hz6000": 20, + "name": "Classical", + "preamp": 33, + }, + Object { + "hz1000": 42, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 42, + "hz310": 38, + "hz60": 33, + "hz600": 42, + "hz6000": 38, + "name": "Club", + "preamp": 33, + }, + Object { + "hz1000": 32, + "hz12000": 20, + "hz14000": 32, + "hz16000": 32, + "hz170": 44, + "hz3000": 22, + "hz310": 36, + "hz60": 48, + "hz600": 32, + "hz6000": 20, + "name": "Dance", + "preamp": 33, + }, + Object { + "hz1000": 28, + "hz12000": 48, + "hz14000": 53, + "hz16000": 56, + "hz170": 50, + "hz3000": 35, + "hz310": 41, + "hz60": 40, + "hz600": 26, + "hz6000": 40, + "name": "Laptop speakers/headphones", + "preamp": 33, + }, + Object { + "hz1000": 33, + "hz12000": 24, + "hz14000": 33, + "hz16000": 33, + "hz170": 49, + "hz3000": 24, + "hz310": 42, + "hz60": 49, + "hz600": 42, + "hz6000": 24, + "name": "Large hall", + "preamp": 33, + }, + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 44, + "hz16000": 44, + "hz170": 44, + "hz3000": 33, + "hz310": 33, + "hz60": 44, + "hz600": 33, + "hz6000": 33, + "name": "Party", + "preamp": 33, + }, + Object { + "hz1000": 41, + "hz12000": 28, + "hz14000": 29, + "hz16000": 29, + "hz170": 40, + "hz3000": 30, + "hz310": 44, + "hz60": 29, + "hz600": 45, + "hz6000": 28, + "name": "Pop", + "preamp": 33, + }, + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 43, + "hz310": 31, + "hz60": 33, + "hz600": 22, + "hz6000": 43, + "name": "Reggae", + "preamp": 33, + }, + Object { + "hz1000": 26, + "hz12000": 50, + "hz14000": 50, + "hz16000": 50, + "hz170": 40, + "hz3000": 39, + "hz310": 23, + "hz60": 45, + "hz600": 19, + "hz6000": 47, + "name": "Rock", + "preamp": 33, + }, + Object { + "hz1000": 30, + "hz12000": 48, + "hz14000": 50, + "hz16000": 52, + "hz170": 35, + "hz3000": 39, + "hz310": 30, + "hz60": 40, + "hz600": 28, + "hz6000": 46, + "name": "Soft", + "preamp": 33, + }, + Object { + "hz1000": 39, + "hz12000": 48, + "hz14000": 50, + "hz16000": 48, + "hz170": 24, + "hz3000": 42, + "hz310": 25, + "hz60": 28, + "hz600": 31, + "hz6000": 47, + "name": "Ska", + "preamp": 33, + }, + Object { + "hz1000": 35, + "hz12000": 15, + "hz14000": 14, + "hz16000": 14, + "hz170": 48, + "hz3000": 25, + "hz310": 48, + "hz60": 48, + "hz600": 42, + "hz6000": 18, + "name": "Full Bass", + "preamp": 33, + }, + Object { + "hz1000": 25, + "hz12000": 31, + "hz14000": 37, + "hz16000": 47, + "hz170": 39, + "hz3000": 23, + "hz310": 36, + "hz60": 39, + "hz600": 31, + "hz6000": 26, + "name": "Soft Rock", + "preamp": 33, + }, + Object { + "hz1000": 37, + "hz12000": 58, + "hz14000": 58, + "hz16000": 60, + "hz170": 16, + "hz3000": 50, + "hz310": 16, + "hz60": 16, + "hz600": 25, + "hz6000": 58, + "name": "Full Treble", + "preamp": 33, + }, + Object { + "hz1000": 24, + "hz12000": 50, + "hz14000": 52, + "hz16000": 52, + "hz170": 42, + "hz3000": 35, + "hz310": 33, + "hz60": 44, + "hz600": 20, + "hz6000": 46, + "name": "Full Bass & Treble", + "preamp": 33, + }, + Object { + "hz1000": 42, + "hz12000": 37, + "hz14000": 37, + "hz16000": 36, + "hz170": 33, + "hz3000": 42, + "hz310": 39, + "hz60": 24, + "hz600": 41, + "hz6000": 39, + "name": "Live", + "preamp": 33, + }, + Object { + "hz1000": 24, + "hz12000": 48, + "hz14000": 48, + "hz16000": 47, + "hz170": 42, + "hz3000": 33, + "hz310": 33, + "hz60": 45, + "hz600": 23, + "hz6000": 45, + "name": "Techno", + "preamp": 33, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; + +exports[`parser can parse winamp_sample.q1 1`] = ` +Object { + "presets": Array [ + Object { + "hz1000": 33, + "hz12000": 33, + "hz14000": 33, + "hz16000": 33, + "hz170": 33, + "hz3000": 33, + "hz310": 33, + "hz60": 33, + "hz600": 33, + "hz6000": 33, + "name": "Normal", + "preamp": 33, + }, + Object { + "hz1000": 15, + "hz12000": 42, + "hz14000": 47, + "hz16000": 52, + "hz170": 47, + "hz3000": 16, + "hz310": 31, + "hz60": 52, + "hz600": 21, + "hz6000": 28, + "name": "Clear", + "preamp": 33, + }, + Object { + "hz1000": 18, + "hz12000": 48, + "hz14000": 48, + "hz16000": 42, + "hz170": 28, + "hz3000": 25, + "hz310": 21, + "hz60": 40, + "hz600": 16, + "hz6000": 40, + "name": "Alex", + "preamp": 33, + }, + Object { + "hz1000": 26, + "hz12000": 56, + "hz14000": 56, + "hz16000": 51, + "hz170": 46, + "hz3000": 37, + "hz310": 40, + "hz60": 50, + "hz600": 26, + "hz6000": 47, + "name": "Tare", + "preamp": 33, + }, + ], + "type": "Winamp EQ library file v1.1", +} +`; diff --git a/packages/winamp-eqf/constants.js b/packages/winamp-eqf/constants.js new file mode 100644 index 00000000..fca62458 --- /dev/null +++ b/packages/winamp-eqf/constants.js @@ -0,0 +1,20 @@ +var PRESET_VALUES = [ + "hz60", + "hz170", + "hz310", + "hz600", + "hz1000", + "hz3000", + "hz6000", + "hz12000", + "hz14000", + "hz16000", + "preamp" +]; + +var HEADER = "Winamp EQ library file v1.1"; + +module.exports = { + PRESET_VALUES: PRESET_VALUES, + HEADER: HEADER +}; diff --git a/packages/winamp-eqf/creator.js b/packages/winamp-eqf/creator.js new file mode 100644 index 00000000..8ca351fd --- /dev/null +++ b/packages/winamp-eqf/creator.js @@ -0,0 +1,35 @@ +var CONSTANTS = require("./constants"); + +var FILL_SIZE = 4; +var PRESET_LENGTH = 257; + +function creator(data) { + var buffer = []; + for (var i = 0; i < CONSTANTS.HEADER.length; i++) { + buffer.push(CONSTANTS.HEADER.charCodeAt(i)); + } + buffer.push(26); // + var ending = "!--"; + for (var i = 0; i < ending.length; i++) { + buffer.push(ending.charCodeAt(i)); + } + if (!data.presets) { + throw new Error("Eqf data is missing presets"); + } + data.presets.forEach(function(preset) { + var k = 0; + for (; k < preset.name.length; k++) { + buffer.push(preset.name.charCodeAt(k)); + } + for (; k < PRESET_LENGTH; k++) { + buffer.push(0); + } + + CONSTANTS.PRESET_VALUES.forEach(function(valueName) { + buffer.push(64 - preset[valueName]); // Adjust for inverse values + }); + }); + return new Uint8Array(buffer).buffer; +} + +module.exports = creator; diff --git a/packages/winamp-eqf/index.js b/packages/winamp-eqf/index.js new file mode 100644 index 00000000..8146dabb --- /dev/null +++ b/packages/winamp-eqf/index.js @@ -0,0 +1,7 @@ +var parser = require("./parser"); +var creator = require("./creator"); + +module.exports = { + parser: parser, + creator: creator +}; diff --git a/packages/winamp-eqf/index.test.js b/packages/winamp-eqf/index.test.js new file mode 100644 index 00000000..15530afa --- /dev/null +++ b/packages/winamp-eqf/index.test.js @@ -0,0 +1,96 @@ +const { join } = require("path"); +const { readFileSync } = require("fs"); +const { parser, creator } = require("./"); +var bufferToArrayBuffer = require("buffer-to-arraybuffer"); + +// TODO: Abstract this into its own library. +expect.extend({ + arrayBufferToEqual(received, argument) { + if (received.byteLength !== argument.byteLength) { + return { + message: `ArrayBuffers do not match. Expected length ${received.byteLength} but got ${argument.byteLenth}`, + pass: false + }; + } + const a = new Uint8Array(received); + const b = new Uint8Array(argument); + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return { + message: `ArrayBuffers do not match. Expected ${a[i]} to equal ${b[ + i + ]} at index ${i}`, + pass: false + }; + } + } + return { + message: `ArrayBuffers are equal.`, + pass: true + }; + } +}); + +const fixtures = [ + // All bands max, preamp mid + "max.EQF", + // All bands min, preamp mid + "min.EQF", + // All bands mid, preamp mid + "midline.EQF", + // All bands mid, preamp max + "preampMax.EQF", + // All bands mid, preamp min + "preampMin.EQF", + "random.EQF", + "winamp_sample.q1", + "winamp.q1" +]; + +describe("parser", () => { + fixtures.forEach(fileName => { + const buffer = readFileSync(join("sample_data", fileName)); + const arrayBuffer = bufferToArrayBuffer(buffer); + it(`can parse ${fileName}`, () => { + const data = parser(arrayBuffer); + expect(data).toMatchSnapshot(); + }); + }); +}); + +describe("creator", () => { + fixtures.forEach(fileName => { + const buffer = readFileSync(join("sample_data", fileName)); + const arrayBuffer = bufferToArrayBuffer(buffer); + const data = parser(arrayBuffer); + it(`can create and parse ${fileName}`, () => { + expect(parser(creator(data))).toEqual(data); + }); + }); +}); + +const eqfFixtures = [ + // All bands max, preamp mid + "max.EQF", + // All bands min, preamp mid + "min.EQF", + // All bands mid, preamp mid + "midline.EQF", + // All bands mid, preamp max + "preampMax.EQF", + // All bands mid, preamp min + "preampMin.EQF", + "random.EQF" +]; + +describe("creator", () => { + eqfFixtures.forEach(fileName => { + const buffer = readFileSync(join("sample_data", fileName)); + const arrayBuffer = bufferToArrayBuffer(buffer); + const data = parser(arrayBuffer); + it(`can create ${fileName}`, () => { + data.type = "foo"; + expect(creator(data)).arrayBufferToEqual(arrayBuffer); + }); + }); +}); diff --git a/packages/winamp-eqf/package.json b/packages/winamp-eqf/package.json new file mode 100644 index 00000000..654cfa0c --- /dev/null +++ b/packages/winamp-eqf/package.json @@ -0,0 +1,31 @@ +{ + "name": "winamp-eqf", + "version": "1.0.0", + "description": "Parse and create Winamp .EQF files which describe equalizer settings", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/captbaritone/webamp.git", + "directory": "packages/winamp-eqf" + }, + "bugs": { + "url": "https://github.com/captbaritone/webamp/issues" + }, + "homepage": "https://github.com/captbaritone/webamp/tree/master/packages/winamp-eqf", + "scripts": { + "test": "jest", + "tdd": "jest --watch" + }, + "keywords": [ + "winamp", + "equalizer", + "parse", + "create" + ], + "author": "Jordan Eldgredge", + "license": "ISC", + "devDependencies": { + "buffer-to-arraybuffer": "0.0.4", + "jest": "24.9.0" + } +} diff --git a/packages/winamp-eqf/parser.js b/packages/winamp-eqf/parser.js new file mode 100644 index 00000000..2a5eb4e5 --- /dev/null +++ b/packages/winamp-eqf/parser.js @@ -0,0 +1,41 @@ +var CONSTANTS = require("./constants"); + +function parser(arrayBuffer) { + var data = {}; + var i = 0; + var arr = new Int8Array(arrayBuffer); + // Parse header + data.type = String.fromCharCode.apply( + null, + arr.slice(i, CONSTANTS.HEADER.length) + ); + if (data.type !== CONSTANTS.HEADER) { + throw new Error("Invalid .eqf file."); + } + i += CONSTANTS.HEADER.length; + // Skip "!--" + i += 4; + // Get the presets + data.presets = []; + while (i < arr.length) { + var preset = {}; + // Get the name + var nameStart = i; + var nameEnd = nameStart + 257; // Str is fixed length + // Str is null terminated + while (arr[i] !== 0 && i <= nameEnd) { + i++; + } + preset.name = String.fromCharCode.apply(null, arr.slice(nameStart, i)); + i = nameEnd; // Skip over any unused bytes + + // Get the levels + CONSTANTS.PRESET_VALUES.forEach(function(valueName) { + preset[valueName] = 64 - arr[i++]; // Adjust for inverse values + }); + data.presets.push(preset); + } + return data; +} + +module.exports = parser; diff --git a/packages/winamp-eqf/sample_data/max.EQF b/packages/winamp-eqf/sample_data/max.EQF new file mode 100644 index 0000000000000000000000000000000000000000..803ff2f84759ecb23a4f39bf41cf5536274fff2d GIT binary patch literal 299 xcmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7zGRr@&GJf3>5$X literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/midline.EQF b/packages/winamp-eqf/sample_data/midline.EQF new file mode 100644 index 0000000000000000000000000000000000000000..d4f6066a917d6b85aeaa75d230117a838a823077 GIT binary patch literal 299 xcmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7`Z?m0RS{U4NCw3 literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/min.EQF b/packages/winamp-eqf/sample_data/min.EQF new file mode 100644 index 0000000000000000000000000000000000000000..ff94d99878b27c841a4e672144bc4913d56edb73 GIT binary patch literal 299 ycmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7`eb64&(tmUJi=@ literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/myEq.EQF b/packages/winamp-eqf/sample_data/myEq.EQF new file mode 100644 index 0000000000000000000000000000000000000000..6635f938257c9e6102c8f71a8e6e37ef0cea2ee6 GIT binary patch literal 299 zcmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7{Nf+ULFD%05jGN AD*ylh literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/preampMax.EQF b/packages/winamp-eqf/sample_data/preampMax.EQF new file mode 100644 index 0000000000000000000000000000000000000000..9c3f7e79d8e215ed34f530105c15a45dd0ba7ad7 GIT binary patch literal 299 ycmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7`Z?m4j2G59}O%3 literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/preampMin.EQF b/packages/winamp-eqf/sample_data/preampMin.EQF new file mode 100644 index 0000000000000000000000000000000000000000..5b60dc5efd57cb14e90111dc4111f5b34e5049b9 GIT binary patch literal 299 ycmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7`Z?m4(tImUJYvi literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/random.EQF b/packages/winamp-eqf/sample_data/random.EQF new file mode 100644 index 0000000000000000000000000000000000000000..c70df4d8f7e68f913bbf3f713771b9f8346ddf1a GIT binary patch literal 299 zcmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))pgA)DXKJN7{Nf+US3{6-cV4U F696-#4JiNs literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/winamp.q1 b/packages/winamp-eqf/sample_data/winamp.q1 new file mode 100644 index 0000000000000000000000000000000000000000..9b10b19bdac857473ad63c137ed476d264260780 GIT binary patch literal 4587 zcmd^>J8u&~5P(NuSx8vt^CM@UAKJBjvCq-@2?b?Dz(tfI#F1#ASljCdK76OUi(?}p zL4ia;ppBF=NE9^G&`{7JB!s9C6-oh03TP=XyLJLUVprOmozcx`^=W2yZVpD|u8ptX zz~-Rk5NC?J1C!!$tz1iFN~JZExbC1$OaM44?}d-{R4|wCj8B-fwW-y4%H&erJMc9g z{h7^X9@FpLo>e#QO|0=#9e@bDb}0<4yoce%Xsn@0q=^dh%=nfdTFdA5jof{*X> zSUiUNspjpU_x>#sj=O{_EhG4oyjUh%js`R(8b*WVvkyfL#KzU%&C;UBQQ zddT!RJMgvtrUReXM__+xi~;xs7nh8&(?@1+GWi6}mth!Hv}W$KKx`HXMNtx*$Tc!* zQxG^WU45{N*`jm9+zBQsQh*2YPDVEpLarxo}#=_}Q+$W|9 zVzLMZ6$RguSY0|TO$Z%R?yNC zPmV3CJp_?iMB>F#UJXf-gql{@6PiUloz=2xSe62)IV2!73r#O%R3#)!GHUFYCcet% za1iuOm1S8;7s|DIeO@DY-ZTVdp{l7&p_tDkLyNrFc4*6_AmrRxtyT+3$?y03{?`c3 z<5MJJ&EQc58G1S_1p;VeFs8u!g{Ulaq{b9QO(s)lo3{HS3&dp+QBYAw5m^qQzr)*C AzW@LL literal 0 HcmV?d00001 diff --git a/packages/winamp-eqf/sample_data/winamp_sample.q1 b/packages/winamp-eqf/sample_data/winamp_sample.q1 new file mode 100644 index 0000000000000000000000000000000000000000..c591b74cef309535398762ccbefcf4a97cd29ef2 GIT binary patch literal 1103 zcmWH~%uCEIP;d=Y$jMA9N-U~WNXyJgRVXvmGn7)))%D9S%1z8+VDM&PU~o7h#PGt< zk)ex8nxT!6f#E+8FaW_8ptu-N90Xia(-KQ_N*HFdGHOqpb0Z3*7Q_}l=_%YzgH!IlF;3~Su3l+SX!Ql4?)W;sag1e(}=p!@+KMm7Va4(J4iIY6}_05Tf{ zPHewgE)HfP#6Vn-n7~1h+CGM_VqeQ;fvg|gePF)8`aXsiKywajUn^%gEX2U1@}pcK z^m{qTe_!Phz&R&1u?VPR#D)crprW>+fr^+QkGx|}Y6UPTMs8S0sAwDLsY?h5h{=Z} V7Nw5pu;3GtP*al@