nodejs-audio-visualizer 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,6 +18,8 @@ const config = {
18
18
  spectrum: { // Audio spectrum configuration. Optional.
19
19
  width: 0.3, // 30% of background image width. Default value: 40%. Also you can use absolute values. For example, value 300 for 300 pixels width.
20
20
  height: 0.15, // 15% of background image height. Default value: 10%. Also you can use absolute values. For example, value 300 for 300 pixels height.
21
+ x: 'center', // Available values: 'left', 'center', right'. Also you can use absolute number values. For example, value 300 for 300 pixels x.
22
+ y: 'bottom', // Available values: 'top', 'middle', bottom'. Also you can use absolute number values. For example, value 300 for 300 pixels y.
21
23
  color: '#cccc99' // Default value: inverted color of background image
22
24
  }
23
25
  },
package/dist/config.d.ts CHANGED
@@ -3,6 +3,8 @@ export declare const defaults: {
3
3
  fps: number;
4
4
  spectrumWidth: number;
5
5
  spectrumHeight: number;
6
+ spectrumX: string;
7
+ spectrumY: string;
6
8
  };
7
9
  export declare const getAudioFilePath: (config: Config) => string;
8
10
  export declare const getBackgroundImagePath: (config: Config) => string;
@@ -10,6 +12,8 @@ export declare const getOutVideoPath: (config: Config) => string;
10
12
  export declare const getFPS: (config: Config) => number;
11
13
  export declare const getSpectrumWidthAbsolute: (config: Config, backgroundImageWidth: number) => number;
12
14
  export declare const getSpectrumHeightAbsolute: (config: Config, backgroundImageHeight: number) => number;
15
+ export declare const getSpectrumXAbsolute: (config: Config, spectrumWidth: number, backgroundImageWidth: number) => number;
16
+ export declare const getSpectrumYAbsolute: (config: Config, spectrumHeight: number, backgroundImageHeight: number) => number;
13
17
  export declare const getSpectrumColor: (config: Config) => string | import("./image").Color | undefined;
14
18
  export declare const getFfmpeg_cfr: (config: Config) => string | undefined;
15
19
  export declare const getFfmpeg_preset: (config: Config) => string | undefined;
package/dist/config.js CHANGED
@@ -7,8 +7,18 @@ var path_1 = __importDefault(require("path"));
7
7
  exports.defaults = {
8
8
  fps: 60,
9
9
  spectrumWidth: 0.4,
10
- spectrumHeight: 0.1
10
+ spectrumHeight: 0.1,
11
+ spectrumX: 'center',
12
+ spectrumY: 'top'
11
13
  };
14
+ var postitionAliases = [
15
+ { name: 'left', value: 0 },
16
+ { name: 'center', value: 0.5 },
17
+ { name: 'right', value: 1 },
18
+ { name: 'top', value: 0 },
19
+ { name: 'middle', value: 0.5 },
20
+ { name: 'bottom', value: 1 },
21
+ ];
12
22
  var checkIsInt = function (num) {
13
23
  return num % 1 === 0;
14
24
  };
@@ -48,6 +58,70 @@ exports.getSpectrumHeightAbsolute = function (config, backgroundImageHeight) {
48
58
  }
49
59
  return backgroundImageHeight * spectrumHeight;
50
60
  };
61
+ var getSpectrumX = function (config) {
62
+ return parseNumberIfPossible((config.outVideo.spectrum && config.outVideo.spectrum.x) ||
63
+ exports.defaults.spectrumX);
64
+ };
65
+ var getSpectrumY = function (config) {
66
+ return parseNumberIfPossible((config.outVideo.spectrum && config.outVideo.spectrum.y) ||
67
+ exports.defaults.spectrumY);
68
+ };
69
+ var parseNumberIfPossible = function (value) {
70
+ var parsed = Number(value);
71
+ if (isNaN(parsed)) {
72
+ return value;
73
+ }
74
+ return parsed;
75
+ };
76
+ var parsePositionAlias = function (aliasName) {
77
+ var nameNormalized = aliasName.trim().toLowerCase();
78
+ var alias = postitionAliases.find(function (als) { return als.name === nameNormalized; });
79
+ if (!alias) {
80
+ throw new Error();
81
+ }
82
+ return alias;
83
+ };
84
+ var getValidPositionAliasValues = function () {
85
+ return postitionAliases.map(function (aliasEl) { return aliasEl.name; }).join(', ');
86
+ };
87
+ var getSpectrumAbsolutePosition = function (relativePosition, spectrumSize, backgroundImageSize) {
88
+ switch (relativePosition) {
89
+ case 0:
90
+ return 0;
91
+ case 0.5:
92
+ return relativePosition * backgroundImageSize - spectrumSize / 2;
93
+ case 1:
94
+ return relativePosition * backgroundImageSize - spectrumSize;
95
+ default:
96
+ throw new Error();
97
+ }
98
+ };
99
+ exports.getSpectrumXAbsolute = function (config, spectrumWidth, backgroundImageWidth) {
100
+ var spectrumX = getSpectrumX(config);
101
+ if (typeof spectrumX !== 'string') {
102
+ return spectrumX;
103
+ }
104
+ try {
105
+ var spectrumXParsed = parsePositionAlias(spectrumX);
106
+ return getSpectrumAbsolutePosition(spectrumXParsed.value, spectrumWidth, backgroundImageWidth);
107
+ }
108
+ catch (_a) {
109
+ throw new Error("Invalid spectrum x value: " + spectrumX + ". Valid values: " + getValidPositionAliasValues() + ".");
110
+ }
111
+ };
112
+ exports.getSpectrumYAbsolute = function (config, spectrumHeight, backgroundImageHeight) {
113
+ var spectrumY = getSpectrumY(config);
114
+ if (typeof spectrumY !== 'string') {
115
+ return spectrumY;
116
+ }
117
+ try {
118
+ var spectrumXParsed = parsePositionAlias(spectrumY);
119
+ return getSpectrumAbsolutePosition(spectrumXParsed.value, spectrumHeight, backgroundImageHeight);
120
+ }
121
+ catch (_a) {
122
+ throw new Error("Invalid spectrum y value: " + spectrumY + ". Valid values: " + getValidPositionAliasValues() + ".");
123
+ }
124
+ };
51
125
  exports.getSpectrumColor = function (config) {
52
126
  return (config.outVideo.spectrum && config.outVideo.spectrum.color);
53
127
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAAA,8CAAwB;AAGX,QAAA,QAAQ,GAAG;IACtB,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,GAAG;IAClB,cAAc,EAAE,GAAG;CACpB,CAAC;AAEF,IAAM,UAAU,GAAG,UAAC,GAAW;IAC7B,OAAA,GAAG,GAAG,CAAC,KAAK,CAAC;AAAb,CAAa,CAAC;AAEH,QAAA,gBAAgB,GAAG,UAAC,MAAc;IAC7C,OAAA,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAA/B,CAA+B,CAAC;AAErB,QAAA,sBAAsB,GAAG,UAAC,MAAc;IACnD,OAAA,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAA/B,CAA+B,CAAC;AAErB,QAAA,eAAe,GAAG,UAAC,MAAc;IAC5C,OAAA,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAlC,CAAkC,CAAC;AAExB,QAAA,MAAM,GAAG,UAAC,MAAc;IACnC,OAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,gBAAQ,CAAC,GAAG;AAAnC,CAAmC,CAAC;AAEtC,IAAM,gBAAgB,GAAG,UAAC,MAAc;IACtC,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5D,gBAAQ,CAAC,aAAa;AADtB,CACsB,CAAC;AAEZ,QAAA,wBAAwB,GAAG,UACtC,MAAc,EAAE,oBAA4B;IAE5C,IAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAM,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,eAAe,EAAE;QACnB,OAAO,aAAa,CAAC;KACtB;IACD,OAAO,oBAAoB,GAAG,aAAa,CAAC;AAC9C,CAAC,CAAC;AAEF,IAAM,iBAAiB,GAAG,UAAC,MAAc;IACvC,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC7D,gBAAQ,CAAC,cAAc;AADvB,CACuB,CAAC;AAEb,QAAA,yBAAyB,GAAG,UACvC,MAAc,EAAE,qBAA6B;IAE7C,IAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAM,eAAe,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACnD,IAAI,eAAe,EAAE;QACnB,OAAO,cAAc,CAAC;KACvB;IACD,OAAO,qBAAqB,GAAG,cAAc,CAAC;AAChD,CAAC,CAAC;AAEW,QAAA,gBAAgB,GAAG,UAAC,MAAc;IAC7C,OAAA,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AAA5D,CAA4D,CAAC;AAElD,QAAA,aAAa,GAAG,UAAC,MAAc;IAC1C,OAAA,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU;AAAzC,CAAyC,CAAC;AAE/B,QAAA,gBAAgB,GAAG,UAAC,MAAc;IAC7C,OAAA,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa;AAA5C,CAA4C,CAAC;AAElC,QAAA,yBAAyB,GAAG,UAAC,MAAc;IACtD,OAAA,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,sBAAsB;AAArD,CAAqD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/image.d.ts CHANGED
@@ -14,7 +14,7 @@ interface Size {
14
14
  height: number;
15
15
  }
16
16
  export declare const drawRect: (imageDstBuffer: BmpDecoder, position: Position, size: Size, color: Color) => void;
17
- export declare const createVisualizerFrame: (backgroundImageBuffer: BmpDecoder, spectrum: number[], size: Size, color: string | Color) => BmpDecoder;
17
+ export declare const createVisualizerFrame: (backgroundImageBuffer: BmpDecoder, spectrum: number[], size: Size, position: Position, color: string | Color) => BmpDecoder;
18
18
  export declare const convertToBmp: (filePath: string) => Promise<Buffer>;
19
19
  export declare const parseImage: (buffer: Buffer) => BmpDecoder;
20
20
  export declare const createImageBuffer: (image: BmpDecoder) => Buffer;
package/dist/image.js CHANGED
@@ -51,25 +51,26 @@ exports.drawRect = function (imageDstBuffer, position, size, color) {
51
51
  }
52
52
  }
53
53
  };
54
- var drawSpectrum = function (imageDstBuffer, spectrum, size, color) {
55
- var paddingLeft = Math.trunc(imageDstBuffer.width / 2 - size.width / 2);
54
+ var drawSpectrum = function (imageDstBuffer, spectrum, size, position, color) {
56
55
  var busWidth = Math.trunc(size.width / spectrum.length);
56
+ var left = Math.trunc(position.x);
57
+ var top = Math.trunc(position.y);
57
58
  var margin = 4;
58
59
  for (var spectrumX = 0; spectrumX < spectrum.length; spectrumX++) {
59
60
  var spectrumValue = spectrum[spectrumX];
60
61
  if ((spectrumValue > 1) || (spectrumValue < 0)) {
61
62
  throw new Error('Spectrum values must be in range from 0 to 1');
62
63
  }
63
- var rectX = paddingLeft + busWidth * spectrumX;
64
+ var rectX = left + busWidth * spectrumX;
64
65
  var rectHeight = size.height * spectrumValue;
65
- exports.drawRect(imageDstBuffer, { x: rectX + margin, y: 0 }, { width: busWidth - margin / 2, height: rectHeight }, color);
66
+ exports.drawRect(imageDstBuffer, { x: rectX + margin, y: top }, { width: busWidth - margin / 2, height: rectHeight }, color);
66
67
  }
67
68
  };
68
- exports.createVisualizerFrame = function (backgroundImageBuffer, spectrum, size, color) {
69
+ exports.createVisualizerFrame = function (backgroundImageBuffer, spectrum, size, position, color) {
69
70
  var image = Object.assign({}, backgroundImageBuffer);
70
71
  image.data = Buffer.from(image.data);
71
72
  var rgbSpectrumColor = (typeof color === 'string') ? hexToRgb(color) : color;
72
- drawSpectrum(image, spectrum, size, rgbSpectrumColor);
73
+ drawSpectrum(image, spectrum, size, position, rgbSpectrumColor);
73
74
  return image;
74
75
  };
75
76
  exports.convertToBmp = function (filePath) { return __awaiter(void 0, void 0, void 0, function () {
package/dist/image.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAoD;AACpD,8CAAwB;AAkBX,QAAA,QAAQ,GAAG,UAAC,cAA0B,EAAE,QAAkB,EAAE,IAAU,EAAE,KAAY;IAC/F,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtE,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACrE,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAEtD,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1C,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3C,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;SAC1C;KACF;AACH,CAAC,CAAC;AAEF,IAAM,YAAY,GAAG,UAAC,cAA0B,EAAE,QAAkB,EAAE,IAAU,EAAE,QAAkB,EAAE,KAAY;IAChH,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnC,IAAM,MAAM,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QAChE,IAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;SACjE;QAED,IAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC1C,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QAC/C,gBAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;KACtH;AACH,CAAC,CAAC;AAEW,QAAA,qBAAqB,GAAG,UAAC,qBAAiC,EAAE,QAAkB,EAAE,IAAU,EAAE,QAAkB,EAAE,KAAqB;IAChJ,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAM,gBAAgB,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/E,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,UAAO,QAAgB;;QACjD,sBAAA,IAAI,OAAO,CAAS,UAAM,OAAO;;;;gCACjB,qBAAM,cAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAA;;4BAAjC,KAAK,GAAG,SAAyB;4BACvC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,UAAC,GAAG,EAAE,KAAK;gCACtC,OAAO,CAAC,KAAK,CAAC,CAAC;4BACjB,CAAC,CAAC,CAAC;;;;iBACJ,CAAC,EAAA;;KAAA,CAAC;AAEQ,QAAA,UAAU,GAAG,UAAC,MAAc,IAAK,OAAA,eAAM,CAAC,MAAM,CAAC,EAAd,CAAc,CAAC;AAEhD,QAAA,iBAAiB,GAAG,UAAC,KAAiB,IAAK,OAAA,eAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAlB,CAAkB,CAAC;AAE9D,QAAA,aAAa,GAAG,UAAC,KAAiB;IAC7C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACjD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAChD,IAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/C,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC/B,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;SAC/B;KACF;IAED,IAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC;QAC7B,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC;QACjC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,WAAW,CAAC;KAChC,CAAC;AACJ,CAAC,CAAC;AAEW,QAAA,WAAW,GAAG,UAAC,KAAY;IACtC,OAAA,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAA5E,CAA4E,CAAC;AAE/E,IAAM,QAAQ,GAAG,UAAC,GAAW;IAC3B,IAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,IAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/C,OAAO,EAAE,GAAG,KAAA,EAAE,KAAK,OAAA,EAAE,IAAI,MAAA,EAAE,CAAC;AAC9B,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,8 @@ export interface Config {
18
18
  spectrum?: {
19
19
  width?: number;
20
20
  height?: number;
21
+ x?: number | PositionAliasName;
22
+ y?: number | PositionAliasName;
21
23
  color?: Color | string;
22
24
  };
23
25
  };
@@ -27,4 +29,5 @@ export interface Config {
27
29
  frame_processing_delay?: number;
28
30
  };
29
31
  }
32
+ export declare type PositionAliasName = 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom';
30
33
  export declare const renderAudioVisualizer: (config: Config, onProgress?: ((progress: number) => any) | undefined, shouldStop?: (() => boolean) | undefined) => Promise<number>;
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ var sleep = function (timeout) {
62
62
  };
63
63
  exports.renderAudioVisualizer = function (config, onProgress, shouldStop) {
64
64
  return new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () {
65
- var audioFilePath, backgroundImagePath, outVideoPath, backgroundImageBmpBuffer, backgroundImage, audioReader, audioBuffer, sampleRate, FPS, spectrumWidth, spectrumHeight, spectrumColor, ffmpeg_cfr, ffmpeg_preset, frame_processing_delay, spectrumBusesCount, audioDuration, framesCount, audioDataStep, ffmpegVideoWriter, processSpectrum, _loop_1, i, state_1;
65
+ var audioFilePath, backgroundImagePath, outVideoPath, backgroundImageBmpBuffer, backgroundImage, audioReader, audioBuffer, sampleRate, FPS, spectrumWidth, spectrumHeight, spectrumX, spectrumY, spectrumColor, ffmpeg_cfr, ffmpeg_preset, frame_processing_delay, spectrumBusesCount, audioDuration, framesCount, audioDataStep, ffmpegVideoWriter, processSpectrum, _loop_1, i, state_1;
66
66
  return __generator(this, function (_a) {
67
67
  switch (_a.label) {
68
68
  case 0:
@@ -84,6 +84,8 @@ exports.renderAudioVisualizer = function (config, onProgress, shouldStop) {
84
84
  FPS = config_1.getFPS(config);
85
85
  spectrumWidth = config_1.getSpectrumWidthAbsolute(config, backgroundImage.width);
86
86
  spectrumHeight = config_1.getSpectrumHeightAbsolute(config, backgroundImage.height);
87
+ spectrumX = config_1.getSpectrumXAbsolute(config, spectrumWidth, backgroundImage.width);
88
+ spectrumY = config_1.getSpectrumYAbsolute(config, spectrumHeight, backgroundImage.height);
87
89
  spectrumColor = config_1.getSpectrumColor(config) ||
88
90
  image_1.invertColor(image_1.getImageColor(backgroundImage));
89
91
  ffmpeg_cfr = config_1.getFfmpeg_cfr(config);
@@ -105,7 +107,7 @@ exports.renderAudioVisualizer = function (config, onProgress, shouldStop) {
105
107
  return exports.PCM_FORMAT.parseFunction(audioBuffer, i * audioDataStep, i * audioDataStep + audioDataStep);
106
108
  };
107
109
  spectrum = processSpectrum(i, audioDataParser);
108
- frameImage = image_1.createVisualizerFrame(backgroundImage, spectrum, { width: spectrumWidth, height: spectrumHeight }, spectrumColor);
110
+ frameImage = image_1.createVisualizerFrame(backgroundImage, spectrum, { width: spectrumWidth, height: spectrumHeight }, { x: spectrumX, y: spectrumY }, spectrumColor);
109
111
  frameImageBuffer = image_1.createImageBuffer(frameImage);
110
112
  isFrameProcessed = ffmpegVideoWriter.stdin.write(frameImageBuffer);
111
113
  if (!!isFrameProcessed) return [3 /*break*/, 2];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodejs-audio-visualizer",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/config.ts CHANGED
@@ -1,12 +1,30 @@
1
1
  import path from 'path';
2
- import { Config } from './index';
2
+ import { Config, PositionAliasName } from './index';
3
3
 
4
4
  export const defaults = {
5
5
  fps: 60,
6
6
  spectrumWidth: 0.4,
7
- spectrumHeight: 0.1
7
+ spectrumHeight: 0.1,
8
+ spectrumX: 'center',
9
+ spectrumY: 'top'
8
10
  };
9
11
 
12
+ type RelativePositionValue = 0 | 0.5 | 1;
13
+
14
+ interface PositionAlias {
15
+ name: PositionAliasName;
16
+ value: RelativePositionValue;
17
+ }
18
+
19
+ const postitionAliases: PositionAlias[] = [
20
+ { name: 'left', value: 0 },
21
+ { name: 'center', value: 0.5 },
22
+ { name: 'right', value: 1 },
23
+ { name: 'top', value: 0 },
24
+ { name: 'middle', value: 0.5 },
25
+ { name: 'bottom', value: 1 },
26
+ ];
27
+
10
28
  const checkIsInt = (num: number) =>
11
29
  num % 1 === 0;
12
30
 
@@ -52,6 +70,99 @@ export const getSpectrumHeightAbsolute = (
52
70
  return backgroundImageHeight * spectrumHeight;
53
71
  };
54
72
 
73
+ const getSpectrumX = (config: Config) =>
74
+ parseNumberIfPossible(
75
+ (config.outVideo.spectrum && config.outVideo.spectrum.x) ||
76
+ defaults.spectrumX
77
+ );
78
+
79
+ const getSpectrumY = (config: Config) =>
80
+ parseNumberIfPossible(
81
+ (config.outVideo.spectrum && config.outVideo.spectrum.y) ||
82
+ defaults.spectrumY
83
+ );
84
+
85
+ const parseNumberIfPossible = (value: string | number) => {
86
+ const parsed = Number(value);
87
+ if (isNaN(parsed)) {
88
+ return value;
89
+ }
90
+ return parsed;
91
+ };
92
+
93
+ const parsePositionAlias = (aliasName: string): PositionAlias => {
94
+ const nameNormalized = aliasName.trim().toLowerCase();
95
+ const alias = postitionAliases.find(
96
+ als => als.name === nameNormalized
97
+ );
98
+ if (!alias) {
99
+ throw new Error();
100
+ }
101
+ return alias;
102
+ };
103
+
104
+ const getValidPositionAliasValues = () =>
105
+ postitionAliases.map(aliasEl => aliasEl.name).join(', ');
106
+
107
+ const getSpectrumAbsolutePosition = (
108
+ relativePosition: RelativePositionValue,
109
+ spectrumSize: number,
110
+ backgroundImageSize: number
111
+ ) => {
112
+ switch (relativePosition) {
113
+ case 0:
114
+ return 0;
115
+ case 0.5:
116
+ return relativePosition * backgroundImageSize - spectrumSize / 2;
117
+ case 1:
118
+ return relativePosition * backgroundImageSize - spectrumSize;
119
+ default:
120
+ throw new Error();
121
+ }
122
+ };
123
+
124
+ export const getSpectrumXAbsolute = (
125
+ config: Config,
126
+ spectrumWidth: number,
127
+ backgroundImageWidth: number
128
+ ) => {
129
+ const spectrumX = getSpectrumX(config);
130
+ if (typeof spectrumX !== 'string') {
131
+ return spectrumX;
132
+ }
133
+ try {
134
+ const spectrumXParsed = parsePositionAlias(spectrumX);
135
+ return getSpectrumAbsolutePosition(
136
+ spectrumXParsed.value,
137
+ spectrumWidth,
138
+ backgroundImageWidth
139
+ );
140
+ } catch {
141
+ throw new Error(`Invalid spectrum x value: ${spectrumX}. Valid values: ${getValidPositionAliasValues()}.`);
142
+ }
143
+ };
144
+
145
+ export const getSpectrumYAbsolute = (
146
+ config: Config,
147
+ spectrumHeight: number,
148
+ backgroundImageHeight: number
149
+ ) => {
150
+ const spectrumY = getSpectrumY(config);
151
+ if (typeof spectrumY !== 'string') {
152
+ return spectrumY;
153
+ }
154
+ try {
155
+ const spectrumXParsed = parsePositionAlias(spectrumY);
156
+ return getSpectrumAbsolutePosition(
157
+ spectrumXParsed.value,
158
+ spectrumHeight,
159
+ backgroundImageHeight
160
+ );
161
+ } catch {
162
+ throw new Error(`Invalid spectrum y value: ${spectrumY}. Valid values: ${getValidPositionAliasValues()}.`);
163
+ }
164
+ };
165
+
55
166
  export const getSpectrumColor = (config: Config) =>
56
167
  (config.outVideo.spectrum && config.outVideo.spectrum.color);
57
168
 
package/src/image.ts CHANGED
@@ -29,9 +29,10 @@ export const drawRect = (imageDstBuffer: BmpDecoder, position: Position, size: S
29
29
  }
30
30
  };
31
31
 
32
- const drawSpectrum = (imageDstBuffer: BmpDecoder, spectrum: number[], size: Size, color: Color) => {
33
- const paddingLeft = Math.trunc(imageDstBuffer.width / 2 - size.width / 2);
32
+ const drawSpectrum = (imageDstBuffer: BmpDecoder, spectrum: number[], size: Size, position: Position, color: Color) => {
34
33
  const busWidth = Math.trunc(size.width / spectrum.length);
34
+ const left = Math.trunc(position.x);
35
+ const top = Math.trunc(position.y);
35
36
  const margin = 4;
36
37
 
37
38
  for (let spectrumX = 0; spectrumX < spectrum.length; spectrumX++) {
@@ -40,17 +41,17 @@ const drawSpectrum = (imageDstBuffer: BmpDecoder, spectrum: number[], size: Size
40
41
  throw new Error('Spectrum values must be in range from 0 to 1');
41
42
  }
42
43
 
43
- const rectX = paddingLeft + busWidth * spectrumX;
44
+ const rectX = left + busWidth * spectrumX;
44
45
  const rectHeight = size.height * spectrumValue;
45
- drawRect(imageDstBuffer, { x: rectX + margin, y: 0 }, { width: busWidth - margin / 2, height: rectHeight }, color);
46
+ drawRect(imageDstBuffer, { x: rectX + margin, y: top }, { width: busWidth - margin / 2, height: rectHeight }, color);
46
47
  }
47
48
  };
48
49
 
49
- export const createVisualizerFrame = (backgroundImageBuffer: BmpDecoder, spectrum: number[], size: Size, color: Color | string) => {
50
+ export const createVisualizerFrame = (backgroundImageBuffer: BmpDecoder, spectrum: number[], size: Size, position: Position, color: Color | string) => {
50
51
  const image = Object.assign({}, backgroundImageBuffer);
51
52
  image.data = Buffer.from(image.data);
52
53
  const rgbSpectrumColor = (typeof color === 'string') ? hexToRgb(color) : color;
53
- drawSpectrum(image, spectrum, size, rgbSpectrumColor);
54
+ drawSpectrum(image, spectrum, size, position, rgbSpectrumColor);
54
55
  return image;
55
56
  };
56
57
 
package/src/index.ts CHANGED
@@ -5,6 +5,8 @@ import {
5
5
  getFPS,
6
6
  getSpectrumWidthAbsolute,
7
7
  getSpectrumHeightAbsolute,
8
+ getSpectrumXAbsolute,
9
+ getSpectrumYAbsolute,
8
10
  getSpectrumColor,
9
11
  getFfmpeg_cfr,
10
12
  getFfmpeg_preset,
@@ -34,6 +36,8 @@ export interface Config {
34
36
  spectrum?: {
35
37
  width?: number;
36
38
  height?: number;
39
+ x?: number | PositionAliasName;
40
+ y?: number | PositionAliasName;
37
41
  color?: Color | string;
38
42
  }
39
43
  };
@@ -44,6 +48,14 @@ export interface Config {
44
48
  };
45
49
  }
46
50
 
51
+ export type PositionAliasName =
52
+ 'left' |
53
+ 'center' |
54
+ 'right' |
55
+ 'top' |
56
+ 'middle' |
57
+ 'bottom';
58
+
47
59
  const sleep = (timeout: number) =>
48
60
  new Promise(resolve => setTimeout(resolve, timeout));
49
61
 
@@ -67,6 +79,10 @@ export const renderAudioVisualizer = (config: Config, onProgress?: (progress: nu
67
79
  getSpectrumWidthAbsolute(config, backgroundImage.width);
68
80
  const spectrumHeight =
69
81
  getSpectrumHeightAbsolute(config, backgroundImage.height);
82
+ const spectrumX =
83
+ getSpectrumXAbsolute(config, spectrumWidth, backgroundImage.width);
84
+ const spectrumY =
85
+ getSpectrumYAbsolute(config, spectrumHeight, backgroundImage.height);
70
86
  const spectrumColor =
71
87
  getSpectrumColor(config) ||
72
88
  invertColor(getImageColor(backgroundImage));
@@ -98,6 +114,7 @@ export const renderAudioVisualizer = (config: Config, onProgress?: (progress: nu
98
114
  backgroundImage,
99
115
  spectrum,
100
116
  { width: spectrumWidth, height: spectrumHeight },
117
+ { x: spectrumX, y: spectrumY },
101
118
  spectrumColor
102
119
  );
103
120
  const frameImageBuffer = createImageBuffer(frameImage);
@@ -9,6 +9,8 @@ import {
9
9
  getFPS,
10
10
  getSpectrumWidthAbsolute,
11
11
  getSpectrumHeightAbsolute,
12
+ getSpectrumXAbsolute,
13
+ getSpectrumYAbsolute,
12
14
  getSpectrumColor,
13
15
  getFfmpeg_cfr,
14
16
  getFfmpeg_preset,
@@ -92,6 +94,136 @@ describe('config', function() {
92
94
  expect(result3).equal(backgroundImageHeight * 0.69);
93
95
  });
94
96
 
97
+ it('getSpectrumXAbsolute', function() {
98
+ const spectrumWidth = 420;
99
+ const backgroundImageWidth = 1366;
100
+ const result1 = getSpectrumXAbsolute(
101
+ {
102
+ outVideo: {},
103
+ } as Config,
104
+ spectrumWidth,
105
+ backgroundImageWidth
106
+ );
107
+ expect(result1).equal(
108
+ 0.5 * backgroundImageWidth - spectrumWidth / 2
109
+ );
110
+
111
+ const result2 = getSpectrumXAbsolute(
112
+ {
113
+ outVideo: { spectrum: { x: 420 } }
114
+ } as Config,
115
+ spectrumWidth,
116
+ backgroundImageWidth
117
+ );
118
+ expect(result2).equal(420);
119
+
120
+ const result3 = getSpectrumXAbsolute(
121
+ {
122
+ outVideo: { spectrum: { x: 'left' } }
123
+ } as Config,
124
+ spectrumWidth,
125
+ backgroundImageWidth
126
+ );
127
+ expect(result3).equal(0);
128
+
129
+ const result4 = getSpectrumXAbsolute(
130
+ {
131
+ outVideo: { spectrum: { x: 'center' } }
132
+ } as Config,
133
+ spectrumWidth,
134
+ backgroundImageWidth
135
+ );
136
+ expect(result4).equal(
137
+ 0.5 * backgroundImageWidth - spectrumWidth / 2
138
+ );
139
+
140
+ const result5 = getSpectrumXAbsolute(
141
+ {
142
+ outVideo: { spectrum: { x: 'right' } }
143
+ } as Config,
144
+ spectrumWidth,
145
+ backgroundImageWidth
146
+ );
147
+ expect(result5).equal(
148
+ 1 * backgroundImageWidth - spectrumWidth
149
+ );
150
+
151
+ const result6 = getSpectrumXAbsolute.bind(
152
+ undefined,
153
+ {
154
+ outVideo: { spectrum: { x: 'sagewklkg' } }
155
+ } as unknown as Config,
156
+ spectrumWidth,
157
+ backgroundImageWidth
158
+ );
159
+ expect(result6).to.throw('Invalid spectrum x value: sagewklkg. Valid values: left, center, right, top, middle, bottom.');
160
+ });
161
+
162
+ it('getSpectrumYAbsolute', function() {
163
+ const spectrumHeight = 125;
164
+ const backgroundImageHeight = 768;
165
+ const result1 = getSpectrumYAbsolute(
166
+ {
167
+ outVideo: {},
168
+ } as Config,
169
+ spectrumHeight,
170
+ backgroundImageHeight
171
+ );
172
+ expect(result1).equal(
173
+ 0
174
+ );
175
+
176
+ const result2 = getSpectrumYAbsolute(
177
+ {
178
+ outVideo: { spectrum: { y: 69 } }
179
+ } as Config,
180
+ spectrumHeight,
181
+ backgroundImageHeight
182
+ );
183
+ expect(result2).equal(69);
184
+
185
+ const result3 = getSpectrumYAbsolute(
186
+ {
187
+ outVideo: { spectrum: { y: 'top' } }
188
+ } as Config,
189
+ spectrumHeight,
190
+ backgroundImageHeight
191
+ );
192
+ expect(result3).equal(0);
193
+
194
+ const result4 = getSpectrumYAbsolute(
195
+ {
196
+ outVideo: { spectrum: { y: 'middle' } }
197
+ } as Config,
198
+ spectrumHeight,
199
+ backgroundImageHeight
200
+ );
201
+ expect(result4).equal(
202
+ 0.5 * backgroundImageHeight - spectrumHeight / 2
203
+ );
204
+
205
+ const result5 = getSpectrumYAbsolute(
206
+ {
207
+ outVideo: { spectrum: { y: 'bottom' } }
208
+ } as Config,
209
+ spectrumHeight,
210
+ backgroundImageHeight
211
+ );
212
+ expect(result5).equal(
213
+ 1 * backgroundImageHeight - spectrumHeight
214
+ );
215
+
216
+ const result6 = getSpectrumYAbsolute.bind(
217
+ undefined,
218
+ {
219
+ outVideo: { spectrum: { y: 'asokosckm' } }
220
+ } as unknown as Config,
221
+ spectrumHeight,
222
+ backgroundImageHeight
223
+ );
224
+ expect(result6).to.throw('Invalid spectrum y value: asokosckm. Valid values: left, center, right, top, middle, bottom.');
225
+ });
226
+
95
227
  it('getSpectrumColor', function() {
96
228
  const result1 = getSpectrumColor({
97
229
  outVideo: {}
@@ -32,10 +32,11 @@ describe('image', function () {
32
32
  const backgroundImagePath = path.resolve('example/media/background.png');
33
33
  const backgroundImageBmpBuffer = await convertToBmp(backgroundImagePath);
34
34
  const backgroundImage = parseImage(backgroundImageBmpBuffer);
35
- const frame = await createVisualizerFrame(
35
+ const frame = createVisualizerFrame(
36
36
  backgroundImage,
37
37
  [0.5, 0, 1],
38
38
  { width: 15, height: 20 },
39
+ { x: 15, y: 0 },
39
40
  { red: 1, green: 1, blue: 1 }
40
41
  );
41
42
  expect(frame.data.toJSON().data.length).equal(1090560);