nodejs-audio-visualizer 5.0.0 → 5.1.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
@@ -12,7 +12,7 @@ const config = {
12
12
  // OR use a video as background (optional):
13
13
  // video: {
14
14
  // path: 'media/background.mp4', // Supports MP4, MOV, AVI, MKV. Loops automatically if shorter than audio.
15
- // autoEdit: true, // Optional. Detects scene cuts and advances between them on each beat so the background edits with the music; omit or false for one continuous play-through from the start.
15
+ // autoEdit: true, // Optional. Detects scene cuts and advances between them on the detected BPM beat grid about every 2–4 beats so the background edits with the music; omit or false for one continuous play-through from the start. When enabled, a brief camera shake every second beat decays over about one-third of a beat.
16
16
  // },
17
17
  audio: {
18
18
  path: 'media/audio.wav', // Supports MP3 and WAV audio
package/dist/audio.d.ts CHANGED
@@ -5,6 +5,7 @@ export declare const correctPeaks: (spectrums: number[], peaks: number[]) => num
5
5
  export declare const createSpectrumsProcessor: (sampleRate: number, skipFramesCount: number) => (parseAudioData: () => number[]) => number[];
6
6
  export declare const bufferToUInt8: (buffer: Buffer, start: number, end: number) => number[];
7
7
  export declare const normalizeAudioData: (PCMData: number[]) => number[];
8
+ export declare const pcmU8ToFloatSamples: (buffer: Buffer) => number[];
8
9
  export declare const spawnFfmpegAudioReader: (filename: string, format: string) => import("child_process").ChildProcessWithoutNullStreams;
9
10
  export declare const createAudioBuffer: (filename: string, format: string) => Promise<{
10
11
  audioBuffer: Buffer;
package/dist/audio.js CHANGED
@@ -90,6 +90,14 @@ exports.bufferToUInt8 = function (buffer, start, end) {
90
90
  exports.normalizeAudioData = function (PCMData) {
91
91
  return PCMData.map(function (num) { return (num - 128) / 128; });
92
92
  };
93
+ exports.pcmU8ToFloatSamples = function (buffer) {
94
+ var n = buffer.length;
95
+ var samples = new Array(n);
96
+ for (var i = 0; i < n; i++) {
97
+ samples[i] = (buffer[i] - 128) / 128;
98
+ }
99
+ return samples;
100
+ };
93
101
  exports.spawnFfmpegAudioReader = function (filename, format) {
94
102
  if (!ffmpeg_static_1.default) {
95
103
  throw new Error('ffmpeg path not found');
package/dist/audio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
package/dist/beats.d.ts CHANGED
@@ -16,4 +16,24 @@ export interface BeatDetectorOptions {
16
16
  /** How many low-frequency spectrum bands contribute to energy (sub-bass + bass) */
17
17
  bassEndIndex?: number;
18
18
  }
19
+ export interface TempoEstimate {
20
+ bpm: number;
21
+ periodFrames: number;
22
+ phaseFrame: number;
23
+ /** Beat times in seconds from the start of the analyzed audio. */
24
+ beatsSec?: number[];
25
+ }
26
+ export declare const MIN_TEMPO_BPM = 70;
27
+ export declare const MAX_TEMPO_BPM = 180;
28
+ export declare const PREFERRED_TEMPO_BPM_MIN = 90;
29
+ export declare const PREFERRED_TEMPO_BPM_MAX = 160;
30
+ export declare const DEFAULT_BASS_END_INDEX = 8;
31
+ /** Longest PCM window passed to music-tempo (seconds), taken from the start of the audio. */
32
+ export declare const MAX_TEMPO_ANALYSIS_SECONDS = 90;
33
+ export declare const frameBassEnergy: (spectrum: number[], bassEndIndex?: number) => number;
19
34
  export declare const createBeatDetector: (fps: number, options?: BeatDetectorOptions | undefined) => (spectrum: number[]) => BeatInfo;
35
+ export declare const estimateTempo: (samples: ArrayLike<number>, sampleRate: number, fps: number) => TempoEstimate | null;
36
+ export declare const shiftTempoPhase: (tempo: TempoEstimate, startFrame: number) => TempoEstimate;
37
+ /** Beat-grid phase for a later audio window, using in-window beat times when available. */
38
+ export declare const tempoForWindow: (tempo: TempoEstimate, startFrame: number, fps: number, windowFrames?: number | undefined, localOnsetFrames?: number[] | undefined) => TempoEstimate;
39
+ export declare const beatGridFrameIndices: (tempo: Pick<TempoEstimate, "periodFrames" | "phaseFrame">, totalFrames: number, stride?: number) => number[];
package/dist/beats.js CHANGED
@@ -1,18 +1,53 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ var music_tempo_1 = __importDefault(require("music-tempo"));
18
+ exports.MIN_TEMPO_BPM = 70;
19
+ exports.MAX_TEMPO_BPM = 180;
20
+ exports.PREFERRED_TEMPO_BPM_MIN = 90;
21
+ exports.PREFERRED_TEMPO_BPM_MAX = 160;
22
+ exports.DEFAULT_BASS_END_INDEX = 8;
23
+ /** Longest PCM window passed to music-tempo (seconds), taken from the start of the audio. */
24
+ exports.MAX_TEMPO_ANALYSIS_SECONDS = 90;
25
+ var TEMPO_TIME_STEP = 0.01;
26
+ exports.frameBassEnergy = function (spectrum, bassEndIndex) {
27
+ if (bassEndIndex === void 0) { bassEndIndex = exports.DEFAULT_BASS_END_INDEX; }
28
+ var end = Math.min(bassEndIndex, spectrum.length);
29
+ if (end <= 0) {
30
+ return 0;
31
+ }
32
+ var sum = 0;
33
+ for (var i = 0; i < end; i++) {
34
+ var v = spectrum[i];
35
+ sum += v * v;
36
+ }
37
+ return sum / end;
38
+ };
3
39
  exports.createBeatDetector = function (fps, options) {
4
40
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
5
41
  var historySize = (_b = (_a = options) === null || _a === void 0 ? void 0 : _a.historySize, (_b !== null && _b !== void 0 ? _b : Math.round(fps * 1.5)));
6
42
  var thresholdMultiplier = (_d = (_c = options) === null || _c === void 0 ? void 0 : _c.thresholdMultiplier, (_d !== null && _d !== void 0 ? _d : 1.4));
7
43
  var decayRate = (_f = (_e = options) === null || _e === void 0 ? void 0 : _e.decayRate, (_f !== null && _f !== void 0 ? _f : 0.85));
8
44
  var cooldownFrames = (_h = (_g = options) === null || _g === void 0 ? void 0 : _g.cooldownFrames, (_h !== null && _h !== void 0 ? _h : Math.round(fps * 0.15)));
9
- var bassEndIndex = (_k = (_j = options) === null || _j === void 0 ? void 0 : _j.bassEndIndex, (_k !== null && _k !== void 0 ? _k : 8));
45
+ var bassEndIndex = (_k = (_j = options) === null || _j === void 0 ? void 0 : _j.bassEndIndex, (_k !== null && _k !== void 0 ? _k : exports.DEFAULT_BASS_END_INDEX));
10
46
  var energyHistory = [];
11
47
  var framesSinceLastBeat = cooldownFrames;
12
48
  var decayingIntensity = 0;
13
49
  return function (spectrum) {
14
- var bassSpectrum = spectrum.slice(0, Math.min(bassEndIndex, spectrum.length));
15
- var energy = bassSpectrum.reduce(function (sum, val) { return sum + val * val; }, 0) / bassSpectrum.length;
50
+ var energy = exports.frameBassEnergy(spectrum, bassEndIndex);
16
51
  energyHistory.push(energy);
17
52
  if (energyHistory.length > historySize) {
18
53
  energyHistory.shift();
@@ -41,4 +76,146 @@ exports.createBeatDetector = function (fps, options) {
41
76
  };
42
77
  };
43
78
  };
79
+ var foldTempoBpm = function (bpm) {
80
+ var folded = bpm;
81
+ while (folded > exports.MAX_TEMPO_BPM && folded / 2 >= exports.MIN_TEMPO_BPM) {
82
+ folded /= 2;
83
+ }
84
+ while (folded < exports.MIN_TEMPO_BPM && folded * 2 <= exports.MAX_TEMPO_BPM) {
85
+ folded *= 2;
86
+ }
87
+ return folded;
88
+ };
89
+ var samplesToArray = function (samples, maxLength) {
90
+ var n = Math.min(samples.length, maxLength);
91
+ if (Array.isArray(samples) && n === samples.length) {
92
+ return samples;
93
+ }
94
+ var audioData = new Array(n);
95
+ for (var i = 0; i < n; i++) {
96
+ audioData[i] = samples[i];
97
+ }
98
+ return audioData;
99
+ };
100
+ var wrapIntoPeriod = function (value, period) {
101
+ if (!(period > 0) || !isFinite(value)) {
102
+ return 0;
103
+ }
104
+ var wrapped = value - period * Math.floor(value / period);
105
+ if (wrapped < 0) {
106
+ wrapped += period;
107
+ }
108
+ if (wrapped >= period) {
109
+ wrapped = 0;
110
+ }
111
+ return wrapped;
112
+ };
113
+ var circularMeanPhase = function (frames, period) {
114
+ if (!(period > 0) || frames.length === 0) {
115
+ return 0;
116
+ }
117
+ var sinSum = 0;
118
+ var cosSum = 0;
119
+ for (var _i = 0, frames_1 = frames; _i < frames_1.length; _i++) {
120
+ var frame = frames_1[_i];
121
+ var angle = (2 * Math.PI * frame) / period;
122
+ sinSum += Math.sin(angle);
123
+ cosSum += Math.cos(angle);
124
+ }
125
+ var phase = Math.atan2(sinSum, cosSum) * period / (2 * Math.PI);
126
+ return wrapIntoPeriod(phase, period);
127
+ };
128
+ exports.estimateTempo = function (samples, sampleRate, fps) {
129
+ var _a;
130
+ if (!samples || samples.length === 0 || !(sampleRate > 0) || !(fps > 0)) {
131
+ return null;
132
+ }
133
+ var maxSamples = Math.max(1, Math.floor(sampleRate * exports.MAX_TEMPO_ANALYSIS_SECONDS));
134
+ var audioData = samplesToArray(samples, maxSamples);
135
+ var hopSize = Math.max(1, Math.round(sampleRate * TEMPO_TIME_STEP));
136
+ try {
137
+ var mt = new music_tempo_1.default(audioData, {
138
+ hopSize: hopSize,
139
+ timeStep: TEMPO_TIME_STEP,
140
+ minBeatInterval: 60 / exports.MAX_TEMPO_BPM,
141
+ maxBeatInterval: 60 / exports.MIN_TEMPO_BPM,
142
+ });
143
+ var beatInterval = Number(mt.beatInterval);
144
+ var bpm = Number(mt.tempo);
145
+ if (!(bpm > 0) && beatInterval > 0) {
146
+ bpm = 60 / beatInterval;
147
+ }
148
+ if (!(bpm > 0)) {
149
+ return null;
150
+ }
151
+ bpm = foldTempoBpm(bpm);
152
+ if (bpm < exports.MIN_TEMPO_BPM * 0.9 || bpm > exports.MAX_TEMPO_BPM * 1.1) {
153
+ return null;
154
+ }
155
+ var periodFrames = fps * 60 / bpm;
156
+ var beatsSec = (_a = mt.beats, (_a !== null && _a !== void 0 ? _a : []))
157
+ .map(function (t) { return Number(t); })
158
+ .filter(function (t) { return t >= 0 && isFinite(t); });
159
+ var beatFrames = beatsSec.map(function (t) { return t * fps; });
160
+ var phaseFrame = beatFrames.length > 0
161
+ ? wrapIntoPeriod(circularMeanPhase(beatFrames, periodFrames), periodFrames)
162
+ : 0;
163
+ return __assign({ bpm: Math.round(bpm), periodFrames: periodFrames,
164
+ phaseFrame: phaseFrame }, (beatsSec.length > 0 ? { beatsSec: beatsSec } : {}));
165
+ }
166
+ catch (_b) {
167
+ return null;
168
+ }
169
+ };
170
+ exports.shiftTempoPhase = function (tempo, startFrame) {
171
+ var period = tempo.periodFrames;
172
+ if (!(period > 0) || startFrame === 0) {
173
+ return tempo;
174
+ }
175
+ return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(tempo.phaseFrame - startFrame, period) });
176
+ };
177
+ /** Beat-grid phase for a later audio window, using in-window beat times when available. */
178
+ exports.tempoForWindow = function (tempo, startFrame, fps, windowFrames, localOnsetFrames) {
179
+ var _a;
180
+ var period = tempo.periodFrames;
181
+ if (!(period > 0) || !(fps > 0)) {
182
+ return tempo;
183
+ }
184
+ var startSec = startFrame / fps;
185
+ var endSec = windowFrames != null && windowFrames >= 0
186
+ ? (startFrame + windowFrames) / fps
187
+ : Number.POSITIVE_INFINITY;
188
+ var inWindow = (_a = tempo.beatsSec, (_a !== null && _a !== void 0 ? _a : [])).filter(function (t) { return t >= startSec && t < endSec; });
189
+ if (inWindow.length > 0) {
190
+ var localFrames = inWindow.map(function (t) { return (t - startSec) * fps; });
191
+ return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(circularMeanPhase(localFrames, period), period) });
192
+ }
193
+ var onsets = ((localOnsetFrames !== null && localOnsetFrames !== void 0 ? localOnsetFrames : [])).filter(function (frame) {
194
+ return frame > 0 && (windowFrames == null || frame < windowFrames);
195
+ });
196
+ if (onsets.length > 0) {
197
+ return __assign(__assign({}, tempo), { phaseFrame: wrapIntoPeriod(circularMeanPhase(onsets, period), period) });
198
+ }
199
+ return exports.shiftTempoPhase(tempo, startFrame);
200
+ };
201
+ exports.beatGridFrameIndices = function (tempo, totalFrames, stride) {
202
+ if (stride === void 0) { stride = 1; }
203
+ var period = tempo.periodFrames;
204
+ var step = Math.max(1, Math.round(stride));
205
+ if (!(period > 0) || totalFrames <= 1) {
206
+ return [];
207
+ }
208
+ var frames = [];
209
+ var nStart = tempo.phaseFrame > 0 ? 0 : 1;
210
+ for (var n = nStart;; n += step) {
211
+ var frame = Math.round(tempo.phaseFrame + n * period);
212
+ if (frame >= totalFrames) {
213
+ break;
214
+ }
215
+ if (frame > 0) {
216
+ frames.push(frame);
217
+ }
218
+ }
219
+ return frames;
220
+ };
44
221
  //# sourceMappingURL=beats.js.map
package/dist/beats.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"beats.js","sourceRoot":"","sources":["../src/beats.ts"],"names":[],"mappings":";;AAoBa,QAAA,kBAAkB,GAAG,UAAC,GAAW,EAAE,OAA6B;;IAC3E,IAAM,WAAW,eAAG,OAAO,0CAAE,WAAW,uCAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,EAAA,CAAC;IAClE,IAAM,mBAAmB,eAAG,OAAO,0CAAE,mBAAmB,uCAAI,GAAG,EAAA,CAAC;IAChE,IAAM,SAAS,eAAG,OAAO,0CAAE,SAAS,uCAAI,IAAI,EAAA,CAAC;IAC7C,IAAM,cAAc,eAAG,OAAO,0CAAE,cAAc,uCAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAA,CAAC;IACzE,IAAM,YAAY,eAAG,OAAO,0CAAE,YAAY,uCAAI,CAAC,EAAA,CAAC;IAEhD,IAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,mBAAmB,GAAG,cAAc,CAAC;IACzC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,OAAO,UAAC,QAAkB;QACxB,IAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,IAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG,IAAK,OAAA,GAAG,GAAG,GAAG,GAAG,GAAG,EAAf,CAAe,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QAE3F,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,aAAa,CAAC,MAAM,GAAG,WAAW,EAAE;YACtC,aAAa,CAAC,KAAK,EAAE,CAAC;SACvB;QAED,IAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,CAAC,IAAK,OAAA,GAAG,GAAG,CAAC,EAAP,CAAO,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;QACtF,IAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,CAAC,IAAK,OAAA,GAAG,GAAG,SAAA,CAAC,CAAC,GAAG,SAAS,CAAC,EAAI,CAAC,CAAA,EAA1B,CAA0B,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;QACxG,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,mBAAmB,CAAC;QAE3D,mBAAmB,EAAE,CAAC;QAEtB,IAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAC7E,IAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,IAAI,gBAAgB,CAAC;QAChE,IAAM,cAAc,GAAG,mBAAmB,IAAI,cAAc,CAAC;QAC7D,IAAM,MAAM,GAAG,gBAAgB,IAAI,cAAc,CAAC;QAElD,IAAI,MAAM,EAAE;YACV,mBAAmB,GAAG,CAAC,CAAC;YACxB,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;SACzE;aAAM;YACL,iBAAiB,IAAI,SAAS,CAAC;SAChC;QAED,OAAO;YACL,MAAM,QAAA;YACN,SAAS,EAAE,iBAAiB;YAC5B,MAAM,QAAA;YACN,SAAS,WAAA;SACV,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"beats.js","sourceRoot":"","sources":["../src/beats.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ export interface HighlightRun {
14
14
  highlightFrames: number;
15
15
  spectrums: number[][];
16
16
  beatFrameIndices: number[];
17
+ beatIntensities: number[];
17
18
  audioSegment: HighlightAudioSegment;
18
19
  }
19
20
  /**
@@ -25,6 +26,7 @@ export declare function computeHighlightSlice(fps: number, totalFrames: number,
25
26
  highlightFrames: number;
26
27
  spectrums: number[][];
27
28
  beatFrameIndices: number[];
29
+ beatIntensities: number[];
28
30
  audioSeekSeconds: number;
29
31
  audioDurationSeconds: number;
30
32
  audioSegments: HighlightAudioSegment[];
package/dist/highlight.js CHANGED
@@ -42,16 +42,17 @@ exports.HIGHLIGHT_DURATION_SEC = 15;
42
42
  function buildHighlightRun(fps, seg, spectrums, beatEvents) {
43
43
  var startFrame = seg.startFrame, highlightFrames = seg.highlightFrames;
44
44
  var spectrumsSlice = spectrums.slice(startFrame, startFrame + highlightFrames);
45
- var beatFrameIndices = beatEvents
46
- .map(function (b) { return b.frameIndex; })
47
- .filter(function (i) { return i >= startFrame && i < startFrame + highlightFrames; })
48
- .map(function (i) { return i - startFrame; })
49
- .sort(function (a, b) { return a - b; });
45
+ var beatsInWindow = beatEvents
46
+ .filter(function (b) { return b.frameIndex >= startFrame && b.frameIndex < startFrame + highlightFrames; })
47
+ .sort(function (a, b) { return a.frameIndex - b.frameIndex; });
48
+ var beatFrameIndices = beatsInWindow.map(function (b) { return b.frameIndex - startFrame; });
49
+ var beatIntensities = beatsInWindow.map(function (b) { return b.intensity; });
50
50
  return {
51
51
  startFrame: startFrame,
52
52
  highlightFrames: highlightFrames,
53
53
  spectrums: spectrumsSlice,
54
54
  beatFrameIndices: beatFrameIndices,
55
+ beatIntensities: beatIntensities,
55
56
  audioSegment: {
56
57
  seekSeconds: startFrame / fps,
57
58
  durationSeconds: highlightFrames / fps,
@@ -221,9 +222,9 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
221
222
  if (segmentCount === void 0) { segmentCount = 1; }
222
223
  var _a, _b, _c;
223
224
  return __awaiter(this, void 0, void 0, function () {
224
- var highlightFramesTarget, audioSegments_1, fullSeg, highlightFrames, energies, excludeRanges, rawSegments, n, k, startFrame, runs, slicedSpectrums, beatFrameIndices, outOffset, _i, rawSegments_1, seg, chunk, _d, beatEvents_1, b, i, totalHighlightFrames, audioSegments, first;
225
- return __generator(this, function (_e) {
226
- switch (_e.label) {
225
+ var highlightFramesTarget, audioSegments_1, fullSeg, fullRun, highlightFrames, energies, excludeRanges, rawSegments, n, k, startFrame, runs, slicedSpectrums, beatFrameIndices, beatIntensities, outOffset, _loop_1, _i, rawSegments_1, seg, totalHighlightFrames, audioSegments, first;
226
+ return __generator(this, function (_d) {
227
+ switch (_d.label) {
227
228
  case 0:
228
229
  highlightFramesTarget = Math.ceil(exports.HIGHLIGHT_DURATION_SEC * fps);
229
230
  if (totalFrames <= 0) {
@@ -232,6 +233,7 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
232
233
  highlightFrames: 0,
233
234
  spectrums: [],
234
235
  beatFrameIndices: [],
236
+ beatIntensities: [],
235
237
  audioSeekSeconds: 0,
236
238
  audioDurationSeconds: 0,
237
239
  audioSegments: [],
@@ -246,37 +248,39 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
246
248
  },
247
249
  ];
248
250
  fullSeg = { startFrame: 0, highlightFrames: totalFrames };
251
+ fullRun = buildHighlightRun(fps, fullSeg, spectrums, beatEvents);
249
252
  return [2 /*return*/, {
250
253
  startFrame: 0,
251
254
  highlightFrames: totalFrames,
252
255
  spectrums: spectrums.slice(),
253
- beatFrameIndices: beatEvents.map(function (b) { return b.frameIndex; }).sort(function (a, b) { return a - b; }),
256
+ beatFrameIndices: fullRun.beatFrameIndices,
257
+ beatIntensities: fullRun.beatIntensities,
254
258
  audioSeekSeconds: 0,
255
259
  audioDurationSeconds: totalFrames / fps,
256
260
  audioSegments: audioSegments_1,
257
- runs: [buildHighlightRun(fps, fullSeg, spectrums, beatEvents)],
261
+ runs: [fullRun],
258
262
  }];
259
263
  }
260
264
  highlightFrames = highlightFramesTarget;
261
265
  return [4 /*yield*/, buildFrameEnergies(spectrums, totalFrames)];
262
266
  case 1:
263
- energies = _e.sent();
267
+ energies = _d.sent();
264
268
  excludeRanges = [];
265
269
  rawSegments = [];
266
270
  n = Math.max(1, Math.floor(segmentCount));
267
271
  k = 0;
268
- _e.label = 2;
272
+ _d.label = 2;
269
273
  case 2:
270
274
  if (!(k < n)) return [3 /*break*/, 5];
271
275
  return [4 /*yield*/, findBestHighlightStart(energies, totalFrames, highlightFrames, excludeRanges)];
272
276
  case 3:
273
- startFrame = _e.sent();
277
+ startFrame = _d.sent();
274
278
  if (startFrame === null) {
275
279
  return [3 /*break*/, 5];
276
280
  }
277
281
  rawSegments.push({ startFrame: startFrame, highlightFrames: highlightFrames });
278
282
  excludeRanges.push({ start: startFrame, endExclusive: startFrame + highlightFrames });
279
- _e.label = 4;
283
+ _d.label = 4;
280
284
  case 4:
281
285
  k++;
282
286
  return [3 /*break*/, 2];
@@ -287,21 +291,25 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
287
291
  });
288
292
  slicedSpectrums = [];
289
293
  beatFrameIndices = [];
294
+ beatIntensities = [];
290
295
  outOffset = 0;
291
- for (_i = 0, rawSegments_1 = rawSegments; _i < rawSegments_1.length; _i++) {
292
- seg = rawSegments_1[_i];
293
- chunk = spectrums.slice(seg.startFrame, seg.startFrame + seg.highlightFrames);
296
+ _loop_1 = function (seg) {
297
+ var chunk = spectrums.slice(seg.startFrame, seg.startFrame + seg.highlightFrames);
294
298
  slicedSpectrums.push.apply(slicedSpectrums, chunk);
295
- for (_d = 0, beatEvents_1 = beatEvents; _d < beatEvents_1.length; _d++) {
296
- b = beatEvents_1[_d];
297
- i = b.frameIndex;
298
- if (i >= seg.startFrame && i < seg.startFrame + seg.highlightFrames) {
299
- beatFrameIndices.push(i - seg.startFrame + outOffset);
300
- }
299
+ var beatsInSeg = beatEvents
300
+ .filter(function (b) { return b.frameIndex >= seg.startFrame && b.frameIndex < seg.startFrame + seg.highlightFrames; })
301
+ .sort(function (a, b) { return a.frameIndex - b.frameIndex; });
302
+ for (var _i = 0, beatsInSeg_1 = beatsInSeg; _i < beatsInSeg_1.length; _i++) {
303
+ var b = beatsInSeg_1[_i];
304
+ beatFrameIndices.push(b.frameIndex - seg.startFrame + outOffset);
305
+ beatIntensities.push(b.intensity);
301
306
  }
302
307
  outOffset += seg.highlightFrames;
308
+ };
309
+ for (_i = 0, rawSegments_1 = rawSegments; _i < rawSegments_1.length; _i++) {
310
+ seg = rawSegments_1[_i];
311
+ _loop_1(seg);
303
312
  }
304
- beatFrameIndices.sort(function (a, b) { return a - b; });
305
313
  totalHighlightFrames = slicedSpectrums.length;
306
314
  audioSegments = rawSegments.map(function (seg) { return ({
307
315
  seekSeconds: seg.startFrame / fps,
@@ -313,6 +321,7 @@ function computeHighlightSlice(fps, totalFrames, spectrums, beatEvents, segmentC
313
321
  highlightFrames: totalHighlightFrames,
314
322
  spectrums: slicedSpectrums,
315
323
  beatFrameIndices: beatFrameIndices,
324
+ beatIntensities: beatIntensities,
316
325
  audioSeekSeconds: first.seekSeconds,
317
326
  audioDurationSeconds: first.durationSeconds,
318
327
  audioSegments: audioSegments,
@@ -1 +1 @@
1
- {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"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"}
package/dist/image.d.ts CHANGED
@@ -76,4 +76,17 @@ export declare const invertColor: (color: Color) => {
76
76
  green: number;
77
77
  blue: number;
78
78
  };
79
+ /** Pixel shift strength for the cut frame and the frames after it. */
80
+ export declare const CUT_SHAKE_AMPLITUDE_BY_OFFSET: readonly [14, 9, 5, 3, 1];
81
+ export declare const CUT_SHAKE_PEAK_AMPLITUDE = 14;
82
+ export declare const MIN_CUT_SHAKE_FRAMES = 3;
83
+ export declare const SHAKE_DURATION_BEAT_FRACTION: number;
84
+ /** Camera shake fires on every Nth beat of the tempo grid (half a bar of 4/4). */
85
+ export declare const CAMERA_SHAKE_EVERY_BEATS = 2;
86
+ export declare const buildCutShakeAmplitudes: (periodFrames: number) => number[];
87
+ export declare const getCutShakeOffset: (frameIndex: number, cutFrames: ReadonlySet<number>, amplitudes?: readonly number[]) => {
88
+ x: number;
89
+ y: number;
90
+ };
91
+ export declare const applyCameraShake: (imageDstBuffer: EncodedBmp, width: number, height: number, offsetX: number, offsetY: number) => void;
79
92
  export {};
package/dist/image.js CHANGED
@@ -450,6 +450,86 @@ exports.getVideoFrameColor = function (bgrBuffer, width, height) {
450
450
  exports.invertColor = function (color) {
451
451
  return ({ red: 255 - color.red, green: 255 - color.green, blue: 255 - color.blue });
452
452
  };
453
+ /** Pixel shift strength for the cut frame and the frames after it. */
454
+ exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET = [14, 9, 5, 3, 1];
455
+ exports.CUT_SHAKE_PEAK_AMPLITUDE = 14;
456
+ exports.MIN_CUT_SHAKE_FRAMES = 3;
457
+ exports.SHAKE_DURATION_BEAT_FRACTION = 1 / 3;
458
+ /** Camera shake fires on every Nth beat of the tempo grid (half a bar of 4/4). */
459
+ exports.CAMERA_SHAKE_EVERY_BEATS = 2;
460
+ exports.buildCutShakeAmplitudes = function (periodFrames) {
461
+ if (!(periodFrames > 0)) {
462
+ return Array.from(exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET);
463
+ }
464
+ var frameCount = Math.max(exports.MIN_CUT_SHAKE_FRAMES, Math.round(periodFrames * exports.SHAKE_DURATION_BEAT_FRACTION));
465
+ if (frameCount === 1) {
466
+ return [exports.CUT_SHAKE_PEAK_AMPLITUDE];
467
+ }
468
+ var decayTo = 1 / exports.CUT_SHAKE_PEAK_AMPLITUDE;
469
+ var amplitudes = [];
470
+ for (var i = 0; i < frameCount; i++) {
471
+ var t = i / (frameCount - 1);
472
+ amplitudes.push(Math.max(1, Math.round(exports.CUT_SHAKE_PEAK_AMPLITUDE * Math.pow(decayTo, t))));
473
+ }
474
+ return amplitudes;
475
+ };
476
+ var clampInt = function (value, min, max) {
477
+ if (value < min) {
478
+ return min;
479
+ }
480
+ if (value > max) {
481
+ return max;
482
+ }
483
+ return value;
484
+ };
485
+ exports.getCutShakeOffset = function (frameIndex, cutFrames, amplitudes) {
486
+ if (amplitudes === void 0) { amplitudes = exports.CUT_SHAKE_AMPLITUDE_BY_OFFSET; }
487
+ if (amplitudes.length === 0) {
488
+ return { x: 0, y: 0 };
489
+ }
490
+ var framesAfterCut = -1;
491
+ var originCut = -1;
492
+ for (var offset = 0; offset < amplitudes.length; offset++) {
493
+ var cut = frameIndex - offset;
494
+ if (cutFrames.has(cut) && (framesAfterCut === -1 || offset < framesAfterCut)) {
495
+ framesAfterCut = offset;
496
+ originCut = cut;
497
+ }
498
+ }
499
+ if (framesAfterCut === -1) {
500
+ return { x: 0, y: 0 };
501
+ }
502
+ var amplitude = amplitudes[framesAfterCut];
503
+ var angle = originCut * 2.399 + framesAfterCut * 2.1;
504
+ return {
505
+ x: Math.round(Math.cos(angle) * amplitude),
506
+ y: Math.round(Math.sin(angle) * amplitude),
507
+ };
508
+ };
509
+ exports.applyCameraShake = function (imageDstBuffer, width, height, offsetX, offsetY) {
510
+ var ox = Math.round(offsetX);
511
+ var oy = Math.round(offsetY);
512
+ if (ox === 0 && oy === 0) {
513
+ return;
514
+ }
515
+ var shiftPos = imageDstBuffer.shiftPos, rowBytes = imageDstBuffer.rowBytes, data = imageDstBuffer.data;
516
+ var pixelBytes = height * rowBytes;
517
+ var sourcePixels = Buffer.allocUnsafe(pixelBytes);
518
+ data.copy(sourcePixels, 0, shiftPos, shiftPos + pixelBytes);
519
+ for (var y = 0; y < height; y++) {
520
+ var srcY = clampInt(y - oy, 0, height - 1);
521
+ var dstRow = shiftPos + y * rowBytes;
522
+ var srcRow = srcY * rowBytes;
523
+ for (var x = 0; x < width; x++) {
524
+ var srcX = clampInt(x - ox, 0, width - 1);
525
+ var dstIndex = dstRow + x * 3;
526
+ var srcIndex = srcRow + srcX * 3;
527
+ data[dstIndex] = sourcePixels[srcIndex];
528
+ data[dstIndex + 1] = sourcePixels[srcIndex + 1];
529
+ data[dstIndex + 2] = sourcePixels[srcIndex + 2];
530
+ }
531
+ }
532
+ };
453
533
  var hexToRgb = function (hex) {
454
534
  var red = parseInt(hex.substring(1, 3), 16);
455
535
  var green = parseInt(hex.substring(3, 5), 16);