spessasynth_lib 3.22.1 → 3.22.3

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.
@@ -0,0 +1,42 @@
1
+ export class KeyModifierManager {
2
+ /**
3
+ * @param synth {Synthetizer}
4
+ */
5
+ constructor(synth: Synthetizer);
6
+ synth: Synthetizer;
7
+ /**
8
+ * @private
9
+ * @param type {workletKeyModifierMessageType}
10
+ * @param data {any}
11
+ */
12
+ private _sendToWorklet;
13
+ /**
14
+ * Modifies a single key
15
+ * @param channel {number} the channel affected. Usually 0-15
16
+ * @param midiNote {number} the MIDI note to change. 0-127
17
+ * @param options {{
18
+ * velocity: number|undefined,
19
+ * patch: {
20
+ * bank: number,
21
+ * program: number
22
+ * }|undefined
23
+ * }} the key's modifiers
24
+ */
25
+ addModifier(channel: number, midiNote: number, options: {
26
+ velocity: number | undefined;
27
+ patch: {
28
+ bank: number;
29
+ program: number;
30
+ } | undefined;
31
+ }): void;
32
+ /**
33
+ * Deletes a key modifier
34
+ * @param channel {number} the channel affected. Usually 0-15
35
+ * @param midiNote {number} the MIDI note to change. 0-127
36
+ */
37
+ deleteModifier(channel: number, midiNote: number): void;
38
+ /**
39
+ * Clears ALL Modifiers
40
+ */
41
+ clearModifiers(): void;
42
+ }
@@ -82,6 +82,11 @@ export class Synthetizer {
82
82
  * @type {SoundfontManager}
83
83
  */
84
84
  soundfontManager: SoundfontManager;
85
+ /**
86
+ * The synth's key modifier manager
87
+ * @type {KeyModifierManager}
88
+ */
89
+ keyModifierManager: KeyModifierManager;
85
90
  /**
86
91
  * @type {function(SynthesizerSnapshot)}
87
92
  * @private
@@ -343,4 +348,5 @@ export type StartRenderingDataConfig = {
343
348
  };
344
349
  import { EventHandler } from "./synth_event_handler.js";
345
350
  import { SoundfontManager } from "./synth_soundfont_manager.js";
351
+ import { KeyModifierManager } from "./key_modifier_manager.js";
346
352
  import { FancyChorus } from "./audio_effects/fancy_chorus.js";
@@ -29,6 +29,7 @@ export namespace workletMessageType {
29
29
  let sequencerSpecific: number;
30
30
  let requestSynthesizerSnapshot: number;
31
31
  let setLogLevel: number;
32
+ let keyModifierManager: number;
32
33
  }
33
34
  export type masterParameterType = number;
34
35
  export namespace masterParameterType {
@@ -63,6 +64,9 @@ export type WorkletMessage = {
63
64
  } | boolean | ArrayBuffer | {
64
65
  messageType: WorkletSequencerMessageType;
65
66
  messageData: any;
67
+ } | {
68
+ messageType: workletKeyModifierMessageType;
69
+ messageData: any;
66
70
  });
67
71
  };
68
72
  export type WorkletReturnMessage = {
@@ -0,0 +1,77 @@
1
+ export class KeyModifier {
2
+ /**
3
+ * @param velocity {number}
4
+ * @param bank {number}
5
+ * @param program {number}
6
+ */
7
+ constructor(velocity?: number, bank?: number, program?: number);
8
+ /**
9
+ * The new override velocity. -1 means unchanged
10
+ * @type {number}
11
+ */
12
+ velocity: number;
13
+ /**
14
+ * The patch this key uses. -1 on either means default
15
+ * @type {{bank: number, program: number}}
16
+ */
17
+ patch: {
18
+ bank: number;
19
+ program: number;
20
+ };
21
+ }
22
+ export type workletKeyModifierMessageType = number;
23
+ export namespace workletKeyModifierMessageType {
24
+ let addMapping: number;
25
+ let deleteMapping: number;
26
+ let clearMappings: number;
27
+ }
28
+ export class WorkletKeyModifierManager {
29
+ /**
30
+ * The velocity override mappings for MIDI keys
31
+ * @type {KeyModifier[][]}
32
+ * @private
33
+ */
34
+ private _keyMappings;
35
+ /**
36
+ * @param type {workletKeyModifierMessageType}
37
+ * @param data {any}
38
+ */
39
+ handleMessage(type: workletKeyModifierMessageType, data: any): void;
40
+ /**
41
+ * @param channel {number}
42
+ * @param midiNote {number}
43
+ * @param mapping {KeyModifier}
44
+ */
45
+ addMapping(channel: number, midiNote: number, mapping: KeyModifier): void;
46
+ deleteMapping(channel: any, midiNote: any): void;
47
+ clearMappings(): void;
48
+ /**
49
+ * @param mappings {KeyModifier[][]}
50
+ */
51
+ setMappings(mappings: KeyModifier[][]): void;
52
+ /**
53
+ * @returns {KeyModifier[][]}
54
+ */
55
+ getMappings(): KeyModifier[][];
56
+ /**
57
+ * @param channel {number}
58
+ * @param midiNote {number}
59
+ * @returns {number} velocity, -1 if unchanged
60
+ */
61
+ getVelocity(channel: number, midiNote: number): number;
62
+ /**
63
+ * @param channel {number}
64
+ * @param midiNote {number}
65
+ * @returns {boolean}
66
+ */
67
+ hasOverridePatch(channel: number, midiNote: number): boolean;
68
+ /**
69
+ * @param channel {number}
70
+ * @param midiNote {number}
71
+ * @returns {{bank: number, program: number}} -1 if unchanged
72
+ */
73
+ getPatch(channel: number, midiNote: number): {
74
+ bank: number;
75
+ program: number;
76
+ };
77
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spessasynth_lib",
3
- "version": "3.22.1",
3
+ "version": "3.22.3",
4
4
  "description": "MIDI and SoundFont2/DLS library with no compromises",
5
5
  "browser": "index.js",
6
6
  "types": "@types/index.d.ts",
File without changes
@@ -123,7 +123,7 @@ export function write(options = DEFAULT_WRITE_OPTIONS)
123
123
  smplStartOffsets,
124
124
  smplEndOffsets,
125
125
  options?.compress,
126
- options?.compressionQuality || 0.5,
126
+ options?.compressionQuality ?? 0.5,
127
127
  options.compressionFunction
128
128
  );
129
129
 
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,73 @@
1
+ import { workletMessageType } from "./worklet_system/message_protocol/worklet_message.js";
2
+ import { KeyModifier, workletKeyModifierMessageType } from "./worklet_system/worklet_methods/worklet_key_modifier.js";
3
+
4
+ export class KeyModifierManager
5
+ {
6
+ /**
7
+ * @param synth {Synthetizer}
8
+ */
9
+ constructor(synth)
10
+ {
11
+ this.synth = synth;
12
+ }
13
+
14
+ /**
15
+ * @private
16
+ * @param type {workletKeyModifierMessageType}
17
+ * @param data {any}
18
+ */
19
+ _sendToWorklet(type, data)
20
+ {
21
+ this.synth.post({
22
+ messageType: workletMessageType.keyModifierManager,
23
+ messageData: [
24
+ type,
25
+ data
26
+ ]
27
+ });
28
+ }
29
+
30
+ /**
31
+ * Modifies a single key
32
+ * @param channel {number} the channel affected. Usually 0-15
33
+ * @param midiNote {number} the MIDI note to change. 0-127
34
+ * @param options {{
35
+ * velocity: number|undefined,
36
+ * patch: {
37
+ * bank: number,
38
+ * program: number
39
+ * }|undefined
40
+ * }} the key's modifiers
41
+ */
42
+ addModifier(channel, midiNote, options)
43
+ {
44
+ const velocity = options?.velocity || -1;
45
+ const program = options?.patch?.program ?? -1;
46
+ const bank = options?.patch?.bank ?? -1;
47
+ this._sendToWorklet(
48
+ workletKeyModifierMessageType.addMapping,
49
+ [channel, midiNote, new KeyModifier(velocity, bank, program)]
50
+ );
51
+ }
52
+
53
+ /**
54
+ * Deletes a key modifier
55
+ * @param channel {number} the channel affected. Usually 0-15
56
+ * @param midiNote {number} the MIDI note to change. 0-127
57
+ */
58
+ deleteModifier(channel, midiNote)
59
+ {
60
+ this._sendToWorklet(
61
+ workletKeyModifierMessageType.deleteMapping,
62
+ [channel, midiNote]
63
+ );
64
+ }
65
+
66
+ /**
67
+ * Clears ALL Modifiers
68
+ */
69
+ clearModifiers()
70
+ {
71
+ this._sendToWorklet(workletKeyModifierMessageType.clearMappings, undefined);
72
+ }
73
+ }
@@ -14,6 +14,7 @@ import { SpessaSynthInfo, SpessaSynthWarn } from "../utils/loggin.js";
14
14
  import { DEFAULT_EFFECTS_CONFIG } from "./audio_effects/effects_config.js";
15
15
  import { SoundfontManager } from "./synth_soundfont_manager.js";
16
16
  import { channelConfiguration } from "./worklet_system/worklet_utilities/worklet_processor_channel.js";
17
+ import { KeyModifierManager } from "./key_modifier_manager.js";
17
18
 
18
19
 
19
20
  /**
@@ -183,6 +184,12 @@ export class Synthetizer
183
184
  */
184
185
  this.soundfontManager = new SoundfontManager(this);
185
186
 
187
+ /**
188
+ * The synth's key modifier manager
189
+ * @type {KeyModifierManager}
190
+ */
191
+ this.keyModifierManager = new KeyModifierManager(this);
192
+
186
193
  /**
187
194
  * @type {function(SynthesizerSnapshot)}
188
195
  * @private