spessasynth_core 3.26.25 → 3.26.27
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/midi/xmf_loader.js +1 -1
- package/src/soundfont/basic_soundfont/basic_sample.js +11 -18
- package/src/soundfont/basic_soundfont/basic_soundbank.js +0 -1
- package/src/soundfont/basic_soundfont/write_sf2/shdr.js +8 -2
- package/src/soundfont/dls/dls_sample.js +3 -4
- package/src/soundfont/read_sf2/samples.js +9 -1
- package/src/utils/indexed_array.js +1 -1
package/package.json
CHANGED
package/src/midi/xmf_loader.js
CHANGED
|
@@ -66,8 +66,8 @@ export class BasicSample
|
|
|
66
66
|
linkedSample;
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
|
-
* The type of the sample
|
|
70
|
-
* @type {sampleTypes
|
|
69
|
+
* The type of the sample
|
|
70
|
+
* @type {sampleTypes}
|
|
71
71
|
*/
|
|
72
72
|
sampleType;
|
|
73
73
|
|
|
@@ -84,7 +84,7 @@ export class BasicSample
|
|
|
84
84
|
sampleLoopEndIndex;
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
|
-
* Indicates if the sample is compressed
|
|
87
|
+
* Indicates if the sample is compressed using vorbis SF3
|
|
88
88
|
* @type {boolean}
|
|
89
89
|
*/
|
|
90
90
|
isCompressed;
|
|
@@ -132,7 +132,7 @@ export class BasicSample
|
|
|
132
132
|
this.samplePitchCorrection = samplePitchCorrection;
|
|
133
133
|
this.sampleLoopStartIndex = loopStart;
|
|
134
134
|
this.sampleLoopEndIndex = loopEnd;
|
|
135
|
-
this.
|
|
135
|
+
this.sampleType = sampleType;
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/**
|
|
@@ -141,10 +141,9 @@ export class BasicSample
|
|
|
141
141
|
*/
|
|
142
142
|
get isLinked()
|
|
143
143
|
{
|
|
144
|
-
return
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this.sampleType === sampleTypes.linkedSample);
|
|
144
|
+
return this.sampleType === sampleTypes.rightSample ||
|
|
145
|
+
this.sampleType === sampleTypes.leftSample ||
|
|
146
|
+
this.sampleType === sampleTypes.linkedSample;
|
|
148
147
|
}
|
|
149
148
|
|
|
150
149
|
/**
|
|
@@ -229,8 +228,6 @@ export class BasicSample
|
|
|
229
228
|
setSampleType(type)
|
|
230
229
|
{
|
|
231
230
|
this.sampleType = type;
|
|
232
|
-
// https://github.com/FluidSynth/fluidsynth/wiki/SoundFont3Format
|
|
233
|
-
this.isCompressed = (type & 0x10) > 0;
|
|
234
231
|
if (!this.isLinked)
|
|
235
232
|
{
|
|
236
233
|
// unlink the other sample
|
|
@@ -242,9 +239,9 @@ export class BasicSample
|
|
|
242
239
|
|
|
243
240
|
this.linkedSample = undefined;
|
|
244
241
|
}
|
|
245
|
-
if ((type & 0x8000) > 0
|
|
242
|
+
if ((type & 0x8000) > 0)
|
|
246
243
|
{
|
|
247
|
-
throw new Error("ROM samples
|
|
244
|
+
throw new Error("ROM samples are not supported.");
|
|
248
245
|
}
|
|
249
246
|
|
|
250
247
|
}
|
|
@@ -261,15 +258,11 @@ export class BasicSample
|
|
|
261
258
|
// noinspection JSUnusedGlobalSymbols
|
|
262
259
|
/**
|
|
263
260
|
* Links a stereo sample
|
|
264
|
-
* @param sample {BasicSample}
|
|
265
|
-
* @param type {sampleTypes}
|
|
261
|
+
* @param sample {BasicSample} the sample to link to
|
|
262
|
+
* @param type {sampleTypes} either left, right or linked
|
|
266
263
|
*/
|
|
267
264
|
setLinkedSample(sample, type)
|
|
268
265
|
{
|
|
269
|
-
if (this.isCompressed)
|
|
270
|
-
{
|
|
271
|
-
throw new Error("Cannot link a compressed sample.");
|
|
272
|
-
}
|
|
273
266
|
this.linkedSample = sample;
|
|
274
267
|
sample.linkedSample = this;
|
|
275
268
|
if (type === sampleTypes.leftSample)
|
|
@@ -2,6 +2,7 @@ import { IndexedByteArray } from "../../../utils/indexed_array.js";
|
|
|
2
2
|
import { writeStringAsBytes } from "../../../utils/byte_functions/string.js";
|
|
3
3
|
import { writeDword, writeWord } from "../../../utils/byte_functions/little_endian.js";
|
|
4
4
|
import { RiffChunk, writeRIFFChunk } from "../riff_chunk.js";
|
|
5
|
+
import { SF3_BIT_FLIT } from "../../read_sf2/samples.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* @this {BasicSoundBank}
|
|
@@ -42,8 +43,13 @@ export function getSHDR(smplStartOffsets, smplEndOffsets)
|
|
|
42
43
|
// sample link
|
|
43
44
|
const sampleLinkIndex = this.samples.indexOf(sample.linkedSample);
|
|
44
45
|
writeWord(shdrData, Math.max(0, sampleLinkIndex));
|
|
45
|
-
// sample type:
|
|
46
|
-
|
|
46
|
+
// sample type: add byte if compressed
|
|
47
|
+
let type = sample.sampleType;
|
|
48
|
+
if (sample.isCompressed)
|
|
49
|
+
{
|
|
50
|
+
type |= SF3_BIT_FLIT;
|
|
51
|
+
}
|
|
52
|
+
writeWord(shdrData, type);
|
|
47
53
|
});
|
|
48
54
|
|
|
49
55
|
// write EOS and zero everything else
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BasicSample } from "../basic_soundfont/basic_sample.js";
|
|
1
|
+
import { BasicSample, sampleTypes } from "../basic_soundfont/basic_sample.js";
|
|
2
2
|
|
|
3
3
|
export class DLSSample extends BasicSample
|
|
4
4
|
{
|
|
@@ -38,12 +38,11 @@ export class DLSSample extends BasicSample
|
|
|
38
38
|
rate,
|
|
39
39
|
pitch,
|
|
40
40
|
pitchCorrection,
|
|
41
|
-
|
|
42
|
-
1,
|
|
41
|
+
sampleTypes.monoSample,
|
|
43
42
|
loopStart,
|
|
44
43
|
loopEnd
|
|
45
44
|
);
|
|
46
|
-
this.
|
|
45
|
+
this.setAudioData(data);
|
|
47
46
|
this.sampleDbAttenuation = sampleDbAttenuation;
|
|
48
47
|
}
|
|
49
48
|
|
|
@@ -6,6 +6,8 @@ import { SpessaSynthWarn } from "../../utils/loggin.js";
|
|
|
6
6
|
import { readBytesAsString } from "../../utils/byte_functions/string.js";
|
|
7
7
|
import { BasicSample } from "../basic_soundfont/basic_sample.js";
|
|
8
8
|
|
|
9
|
+
export const SF3_BIT_FLIT = 0x10;
|
|
10
|
+
|
|
9
11
|
export class SoundFontSample extends BasicSample
|
|
10
12
|
{
|
|
11
13
|
/**
|
|
@@ -47,6 +49,11 @@ export class SoundFontSample extends BasicSample
|
|
|
47
49
|
isDataRaw
|
|
48
50
|
)
|
|
49
51
|
{
|
|
52
|
+
// read sf3
|
|
53
|
+
// https://github.com/FluidSynth/fluidsynth/wiki/SoundFont3Format
|
|
54
|
+
const compressed = (sampleType & SF3_BIT_FLIT) > 0;
|
|
55
|
+
// remove the compression flag
|
|
56
|
+
sampleType &= ~SF3_BIT_FLIT;
|
|
50
57
|
super(
|
|
51
58
|
sampleName,
|
|
52
59
|
sampleRate,
|
|
@@ -56,6 +63,7 @@ export class SoundFontSample extends BasicSample
|
|
|
56
63
|
sampleLoopStartIndex - (sampleStartIndex / 2),
|
|
57
64
|
sampleLoopEndIndex - (sampleStartIndex / 2)
|
|
58
65
|
);
|
|
66
|
+
this.isCompressed = compressed;
|
|
59
67
|
this.sampleName = sampleName;
|
|
60
68
|
// in bytes
|
|
61
69
|
this.sampleStartIndex = sampleStartIndex;
|
|
@@ -82,7 +90,7 @@ export class SoundFontSample extends BasicSample
|
|
|
82
90
|
*/
|
|
83
91
|
getLinkedSample(samplesArray)
|
|
84
92
|
{
|
|
85
|
-
if (this.
|
|
93
|
+
if (this.linkedSample || !this.isLinked)
|
|
86
94
|
{
|
|
87
95
|
return;
|
|
88
96
|
}
|