sf2-json 1.0.3 → 1.0.5
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/package.json +1 -1
- package/src/sf2-json.js +27 -40
package/package.json
CHANGED
package/src/sf2-json.js
CHANGED
|
@@ -17,6 +17,7 @@ const require = createRequire(import.meta.url);
|
|
|
17
17
|
const ffmpegPath = require('ffmpeg-static');
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
const MAX_NORMALIZE_FACTOR = 1.5;
|
|
20
21
|
const RESAMPLE_RATE = 48000;
|
|
21
22
|
|
|
22
23
|
const GM_CATEGORIES = [
|
|
@@ -62,7 +63,7 @@ const GM_INSTRUMENTS = [
|
|
|
62
63
|
];
|
|
63
64
|
|
|
64
65
|
|
|
65
|
-
function encodeOpus(wavBuffer, bitrate =
|
|
66
|
+
function encodeOpus(wavBuffer, bitrate = 96, sampleRate = 32000) {
|
|
66
67
|
const result = spawnSync(ffmpegPath, [
|
|
67
68
|
'-hide_banner',
|
|
68
69
|
'-loglevel', 'error',
|
|
@@ -128,7 +129,7 @@ function normalizeBuffer(buffer, targetPeak = 0.9) {
|
|
|
128
129
|
}
|
|
129
130
|
if (peak === 0) return buffer;
|
|
130
131
|
const targetPeakInt = targetPeak * 32767;
|
|
131
|
-
const factor = Math.min(targetPeakInt / peak,
|
|
132
|
+
const factor = Math.min(targetPeakInt / peak, MAX_NORMALIZE_FACTOR);
|
|
132
133
|
if (factor <= 1.0) return buffer;
|
|
133
134
|
for (let i = 0; i < samples.length; i++) {
|
|
134
135
|
samples[i] = Math.round(samples[i] * factor);
|
|
@@ -221,44 +222,30 @@ function extractZones(soundFont, parsed, presetHeaderIndex) {
|
|
|
221
222
|
|
|
222
223
|
|
|
223
224
|
async function buildZone(generators, sampleHeader, sample) {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const audioBase64 = mp3Buffer.toString('base64');
|
|
249
|
-
|
|
250
|
-
return {
|
|
251
|
-
originalPitch: midi * 100,
|
|
252
|
-
keyRangeLow: generators.keyRange?.lo ?? 0,
|
|
253
|
-
keyRangeHigh: generators.keyRange?.hi ?? 127,
|
|
254
|
-
loopStart,
|
|
255
|
-
loopEnd,
|
|
256
|
-
coarseTune: generators.coarseTune ?? 0,
|
|
257
|
-
fineTune,
|
|
258
|
-
sampleRate,
|
|
259
|
-
ahdsr: ahdsr,
|
|
260
|
-
file: audioBase64,
|
|
261
|
-
};
|
|
225
|
+
const { originalPitch, pitchCorrection, loopStart, loopEnd } = sampleHeader;
|
|
226
|
+
|
|
227
|
+
const rootKey = (generators.overridingRootKey !== undefined && generators.overridingRootKey !== 255)
|
|
228
|
+
? generators.overridingRootKey
|
|
229
|
+
: originalPitch;
|
|
230
|
+
|
|
231
|
+
const coarseTuneCents = (generators.coarseTune ?? 0) * 100;
|
|
232
|
+
const fineTuneCents = (generators.fineTune ?? 0) + (pitchCorrection ?? 0);
|
|
233
|
+
const totalPitchOffset = coarseTuneCents + fineTuneCents;
|
|
234
|
+
const calculatedPitch = (rootKey * 100) + totalPitchOffset;
|
|
235
|
+
|
|
236
|
+
const wavBuffer = buildWavBuffer(sample);
|
|
237
|
+
const mp3Buffer = encodeOpus(wavBuffer, 96, RESAMPLE_RATE);
|
|
238
|
+
|
|
239
|
+
return {
|
|
240
|
+
originalPitch: calculatedPitch,
|
|
241
|
+
keyRangeLow: generators.keyRange?.lo ?? 0,
|
|
242
|
+
keyRangeHigh: generators.keyRange?.hi ?? 127,
|
|
243
|
+
loopStart,
|
|
244
|
+
loopEnd,
|
|
245
|
+
sampleRate: sampleHeader.sampleRate,
|
|
246
|
+
ahdsr: true,
|
|
247
|
+
file: mp3Buffer.toString('base64'),
|
|
248
|
+
};
|
|
262
249
|
}
|
|
263
250
|
|
|
264
251
|
|