spessasynth_lib 0.0.1
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/.idea/modules.xml +8 -0
- package/.idea/spessasynth_lib.iml +12 -0
- package/.idea/vcs.xml +6 -0
- package/copy_version.sh +38 -0
- package/index.js +73 -0
- package/package/@types/externals/stbvorbis_sync/stbvorbis_sync.min.d.ts +1 -0
- package/package/@types/index.d.ts +34 -0
- package/package/@types/midi_handler/midi_handler.d.ts +39 -0
- package/package/@types/midi_handler/web_midi_link.d.ts +12 -0
- package/package/@types/midi_parser/midi_data.d.ts +95 -0
- package/package/@types/midi_parser/midi_editor.d.ts +45 -0
- package/package/@types/midi_parser/midi_loader.d.ts +100 -0
- package/package/@types/midi_parser/midi_message.d.ts +154 -0
- package/package/@types/midi_parser/midi_writer.d.ts +6 -0
- package/package/@types/midi_parser/rmidi_writer.d.ts +9 -0
- package/package/@types/midi_parser/used_keys_loaded.d.ts +7 -0
- package/package/@types/sequencer/sequencer.d.ts +180 -0
- package/package/@types/sequencer/worklet_sequencer/sequencer_message.d.ts +28 -0
- package/package/@types/soundfont/read/generators.d.ts +98 -0
- package/package/@types/soundfont/read/instruments.d.ts +50 -0
- package/package/@types/soundfont/read/modulators.d.ts +73 -0
- package/package/@types/soundfont/read/presets.d.ts +87 -0
- package/package/@types/soundfont/read/riff_chunk.d.ts +31 -0
- package/package/@types/soundfont/read/samples.d.ts +134 -0
- package/package/@types/soundfont/read/zones.d.ts +141 -0
- package/package/@types/soundfont/soundfont.d.ts +76 -0
- package/package/@types/soundfont/write/ibag.d.ts +6 -0
- package/package/@types/soundfont/write/igen.d.ts +6 -0
- package/package/@types/soundfont/write/imod.d.ts +6 -0
- package/package/@types/soundfont/write/inst.d.ts +6 -0
- package/package/@types/soundfont/write/pbag.d.ts +6 -0
- package/package/@types/soundfont/write/pgen.d.ts +6 -0
- package/package/@types/soundfont/write/phdr.d.ts +6 -0
- package/package/@types/soundfont/write/pmod.d.ts +6 -0
- package/package/@types/soundfont/write/sdta.d.ts +11 -0
- package/package/@types/soundfont/write/shdr.d.ts +8 -0
- package/package/@types/soundfont/write/soundfont_trimmer.d.ts +6 -0
- package/package/@types/soundfont/write/write.d.ts +21 -0
- package/package/@types/synthetizer/audio_effects/effects_config.d.ts +29 -0
- package/package/@types/synthetizer/audio_effects/fancy_chorus.d.ts +93 -0
- package/package/@types/synthetizer/audio_effects/reverb.d.ts +7 -0
- package/package/@types/synthetizer/synth_event_handler.d.ts +161 -0
- package/package/@types/synthetizer/synthetizer.d.ts +294 -0
- package/package/@types/synthetizer/worklet_system/message_protocol/worklet_message.d.ts +89 -0
- package/package/@types/synthetizer/worklet_system/worklet_utilities/worklet_processor_channel.d.ts +134 -0
- package/package/@types/synthetizer/worklet_url.d.ts +5 -0
- package/package/@types/utils/buffer_to_wav.d.ts +8 -0
- package/package/@types/utils/byte_functions/big_endian.d.ts +13 -0
- package/package/@types/utils/byte_functions/little_endian.d.ts +35 -0
- package/package/@types/utils/byte_functions/string.d.ts +22 -0
- package/package/@types/utils/byte_functions/variable_length_quantity.d.ts +12 -0
- package/package/@types/utils/indexed_array.d.ts +21 -0
- package/package/@types/utils/loggin.d.ts +26 -0
- package/package/@types/utils/other.d.ts +32 -0
- package/package/LICENSE +26 -0
- package/package/README.md +84 -0
- package/package/externals/NOTICE +9 -0
- package/package/externals/libvorbis/@types/OggVorbisEncoder.d.ts +34 -0
- package/package/externals/libvorbis/OggVorbisEncoder.min.js +1 -0
- package/package/externals/stbvorbis_sync/@types/stbvorbis_sync.d.ts +12 -0
- package/package/externals/stbvorbis_sync/LICENSE +202 -0
- package/package/externals/stbvorbis_sync/stbvorbis_sync.min.js +1 -0
- package/package/index.js +73 -0
- package/package/midi_handler/README.md +3 -0
- package/package/midi_handler/midi_handler.js +118 -0
- package/package/midi_handler/web_midi_link.js +41 -0
- package/package/midi_parser/README.md +3 -0
- package/package/midi_parser/midi_data.js +121 -0
- package/package/midi_parser/midi_editor.js +557 -0
- package/package/midi_parser/midi_loader.js +502 -0
- package/package/midi_parser/midi_message.js +234 -0
- package/package/midi_parser/midi_writer.js +95 -0
- package/package/midi_parser/rmidi_writer.js +271 -0
- package/package/midi_parser/used_keys_loaded.js +172 -0
- package/package/package.json +43 -0
- package/package/sequencer/README.md +23 -0
- package/package/sequencer/sequencer.js +439 -0
- package/package/sequencer/worklet_sequencer/events.js +92 -0
- package/package/sequencer/worklet_sequencer/play.js +309 -0
- package/package/sequencer/worklet_sequencer/process_event.js +167 -0
- package/package/sequencer/worklet_sequencer/process_tick.js +85 -0
- package/package/sequencer/worklet_sequencer/sequencer_message.js +39 -0
- package/package/sequencer/worklet_sequencer/song_control.js +193 -0
- package/package/sequencer/worklet_sequencer/worklet_sequencer.js +218 -0
- package/package/soundfont/README.md +8 -0
- package/package/soundfont/read/generators.js +212 -0
- package/package/soundfont/read/instruments.js +125 -0
- package/package/soundfont/read/modulators.js +249 -0
- package/package/soundfont/read/presets.js +300 -0
- package/package/soundfont/read/riff_chunk.js +81 -0
- package/package/soundfont/read/samples.js +398 -0
- package/package/soundfont/read/zones.js +310 -0
- package/package/soundfont/soundfont.js +357 -0
- package/package/soundfont/write/ibag.js +39 -0
- package/package/soundfont/write/igen.js +75 -0
- package/package/soundfont/write/imod.js +46 -0
- package/package/soundfont/write/inst.js +34 -0
- package/package/soundfont/write/pbag.js +39 -0
- package/package/soundfont/write/pgen.js +77 -0
- package/package/soundfont/write/phdr.js +42 -0
- package/package/soundfont/write/pmod.js +46 -0
- package/package/soundfont/write/sdta.js +72 -0
- package/package/soundfont/write/shdr.js +54 -0
- package/package/soundfont/write/soundfont_trimmer.js +169 -0
- package/package/soundfont/write/write.js +180 -0
- package/package/synthetizer/README.md +6 -0
- package/package/synthetizer/audio_effects/effects_config.js +21 -0
- package/package/synthetizer/audio_effects/fancy_chorus.js +120 -0
- package/package/synthetizer/audio_effects/impulse_response_2.flac +0 -0
- package/package/synthetizer/audio_effects/reverb.js +24 -0
- package/package/synthetizer/synth_event_handler.js +156 -0
- package/package/synthetizer/synthetizer.js +766 -0
- package/package/synthetizer/worklet_processor.min.js +13 -0
- package/package/synthetizer/worklet_system/README.md +6 -0
- package/package/synthetizer/worklet_system/main_processor.js +363 -0
- package/package/synthetizer/worklet_system/message_protocol/handle_message.js +197 -0
- package/package/synthetizer/worklet_system/message_protocol/message_sending.js +74 -0
- package/package/synthetizer/worklet_system/message_protocol/worklet_message.js +121 -0
- package/package/synthetizer/worklet_system/minify_processor.sh +4 -0
- package/package/synthetizer/worklet_system/worklet_methods/controller_control.js +230 -0
- package/package/synthetizer/worklet_system/worklet_methods/data_entry.js +277 -0
- package/package/synthetizer/worklet_system/worklet_methods/note_off.js +109 -0
- package/package/synthetizer/worklet_system/worklet_methods/note_on.js +91 -0
- package/package/synthetizer/worklet_system/worklet_methods/program_control.js +183 -0
- package/package/synthetizer/worklet_system/worklet_methods/reset_controllers.js +177 -0
- package/package/synthetizer/worklet_system/worklet_methods/snapshot.js +129 -0
- package/package/synthetizer/worklet_system/worklet_methods/system_exclusive.js +272 -0
- package/package/synthetizer/worklet_system/worklet_methods/tuning_control.js +195 -0
- package/package/synthetizer/worklet_system/worklet_methods/vibrato_control.js +29 -0
- package/package/synthetizer/worklet_system/worklet_methods/voice_control.js +233 -0
- package/package/synthetizer/worklet_system/worklet_processor.js +9 -0
- package/package/synthetizer/worklet_system/worklet_utilities/lfo.js +23 -0
- package/package/synthetizer/worklet_system/worklet_utilities/lowpass_filter.js +130 -0
- package/package/synthetizer/worklet_system/worklet_utilities/modulation_envelope.js +73 -0
- package/package/synthetizer/worklet_system/worklet_utilities/modulator_curves.js +86 -0
- package/package/synthetizer/worklet_system/worklet_utilities/stereo_panner.js +81 -0
- package/package/synthetizer/worklet_system/worklet_utilities/unit_converter.js +66 -0
- package/package/synthetizer/worklet_system/worklet_utilities/volume_envelope.js +265 -0
- package/package/synthetizer/worklet_system/worklet_utilities/wavetable_oscillator.js +83 -0
- package/package/synthetizer/worklet_system/worklet_utilities/worklet_modulator.js +234 -0
- package/package/synthetizer/worklet_system/worklet_utilities/worklet_processor_channel.js +116 -0
- package/package/synthetizer/worklet_system/worklet_utilities/worklet_voice.js +272 -0
- package/package/synthetizer/worklet_url.js +5 -0
- package/package/utils/README.md +4 -0
- package/package/utils/buffer_to_wav.js +101 -0
- package/package/utils/byte_functions/big_endian.js +28 -0
- package/package/utils/byte_functions/little_endian.js +74 -0
- package/package/utils/byte_functions/string.js +97 -0
- package/package/utils/byte_functions/variable_length_quantity.js +37 -0
- package/package/utils/encode_vorbis.js +30 -0
- package/package/utils/indexed_array.js +41 -0
- package/package/utils/loggin.js +79 -0
- package/package/utils/other.js +54 -0
- package/package.json +43 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sequencer.js
|
|
3
|
+
* purpose: plays back the midi file decoded by midi_loader.js, including support for multi-channel midis (adding channels when more than 1 midi port is detected)
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @typedef MidFile {Object}
|
|
7
|
+
* @property {ArrayBuffer} binary - the binary data of the file.
|
|
8
|
+
* @property {string|undefined} altName - the alternative name for the file
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {MIDI|MidFile} MIDIFile
|
|
12
|
+
*/
|
|
13
|
+
export class Sequencer {
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new Midi sequencer for playing back MIDI files
|
|
16
|
+
* @param midiBinaries {MIDIFile[]} List of the buffers of the MIDI files
|
|
17
|
+
* @param synth {Synthetizer} synth to send events to
|
|
18
|
+
*/
|
|
19
|
+
constructor(midiBinaries: MIDIFile[], synth: Synthetizer);
|
|
20
|
+
ignoreEvents: boolean;
|
|
21
|
+
synth: Synthetizer;
|
|
22
|
+
highResTimeOffset: number;
|
|
23
|
+
/**
|
|
24
|
+
* Absolute playback startTime, bases on the synth's time
|
|
25
|
+
* @type {number}
|
|
26
|
+
*/
|
|
27
|
+
absoluteStartTime: number;
|
|
28
|
+
/**
|
|
29
|
+
* @type {function(MIDI)}
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
private _getMIDIResolve;
|
|
33
|
+
/**
|
|
34
|
+
* Controls the playback's rate
|
|
35
|
+
* @type {number}
|
|
36
|
+
*/
|
|
37
|
+
_playbackRate: number;
|
|
38
|
+
songIndex: number;
|
|
39
|
+
_loop: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Indicates whether the sequencer has finished playing a sequence
|
|
42
|
+
* @type {boolean}
|
|
43
|
+
*/
|
|
44
|
+
isFinished: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* The current sequence's length, in seconds
|
|
47
|
+
* @type {number}
|
|
48
|
+
*/
|
|
49
|
+
duration: number;
|
|
50
|
+
resetMIDIOut(): void;
|
|
51
|
+
set loop(value: boolean);
|
|
52
|
+
get loop(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* @param messageType {WorkletSequencerMessageType}
|
|
55
|
+
* @param messageData {any}
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
private _sendMessage;
|
|
59
|
+
/**
|
|
60
|
+
* Executes when MIDI parsing has an error.
|
|
61
|
+
* @type {function(string)}
|
|
62
|
+
*/
|
|
63
|
+
onError: (arg0: string) => any;
|
|
64
|
+
/**
|
|
65
|
+
* @param {WorkletSequencerReturnMessageType} messageType
|
|
66
|
+
* @param {any} messageData
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
private _handleMessage;
|
|
70
|
+
/**
|
|
71
|
+
* The sequence's data, except for the track data.
|
|
72
|
+
* @type {MidiData}
|
|
73
|
+
*/
|
|
74
|
+
midiData: MidiData;
|
|
75
|
+
pausedTime: number;
|
|
76
|
+
/**
|
|
77
|
+
* @param value {number}
|
|
78
|
+
*/
|
|
79
|
+
set playbackRate(value: number);
|
|
80
|
+
/**
|
|
81
|
+
* @returns {number}
|
|
82
|
+
*/
|
|
83
|
+
get playbackRate(): number;
|
|
84
|
+
/**
|
|
85
|
+
* Adds a new event that gets called when the song changes
|
|
86
|
+
* @param callback {function(MidiData)}
|
|
87
|
+
* @param id {string} must be unique
|
|
88
|
+
*/
|
|
89
|
+
addOnSongChangeEvent(callback: (arg0: MidiData) => any, id: string): void;
|
|
90
|
+
/**
|
|
91
|
+
* Adds a new event that gets called when the time changes
|
|
92
|
+
* @param callback {function(number)} the new time, in seconds
|
|
93
|
+
* @param id {string} must be unique
|
|
94
|
+
*/
|
|
95
|
+
addOnTimeChangeEvent(callback: (arg0: number) => any, id: string): void;
|
|
96
|
+
/**
|
|
97
|
+
* @returns {Promise<MIDI>}
|
|
98
|
+
*/
|
|
99
|
+
getMIDI(): Promise<MIDI>;
|
|
100
|
+
/**
|
|
101
|
+
* @param midiBuffers {MIDIFile[]}
|
|
102
|
+
*/
|
|
103
|
+
loadNewSongList(midiBuffers: MIDIFile[]): void;
|
|
104
|
+
songsAmount: number;
|
|
105
|
+
nextSong(): void;
|
|
106
|
+
previousSong(): void;
|
|
107
|
+
set currentTime(time: number);
|
|
108
|
+
/**
|
|
109
|
+
* @returns {number} Current playback time, in seconds
|
|
110
|
+
*/
|
|
111
|
+
get currentTime(): number;
|
|
112
|
+
/**
|
|
113
|
+
* @param time
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
private _recalculateStartTime;
|
|
117
|
+
/**
|
|
118
|
+
* Use for visualization as it's not affected by the audioContext stutter
|
|
119
|
+
* @returns {number}
|
|
120
|
+
*/
|
|
121
|
+
get currentHighResolutionTime(): number;
|
|
122
|
+
/**
|
|
123
|
+
* @param output {MIDIOutput}
|
|
124
|
+
*/
|
|
125
|
+
connectMidiOutput(output: MIDIOutput): void;
|
|
126
|
+
MIDIout: MIDIOutput;
|
|
127
|
+
/**
|
|
128
|
+
* Pauses the playback
|
|
129
|
+
*/
|
|
130
|
+
pause(): void;
|
|
131
|
+
unpause(): void;
|
|
132
|
+
/**
|
|
133
|
+
* true if paused, false if playing or stopped
|
|
134
|
+
* @returns {boolean}
|
|
135
|
+
*/
|
|
136
|
+
get paused(): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Starts the playback
|
|
139
|
+
* @param resetTime {boolean} If true, time is set to 0s
|
|
140
|
+
*/
|
|
141
|
+
play(resetTime?: boolean): void;
|
|
142
|
+
/**
|
|
143
|
+
* Stops the playback
|
|
144
|
+
*/
|
|
145
|
+
stop(): void;
|
|
146
|
+
/**
|
|
147
|
+
* @type {Object<string, function(MidiData)>}
|
|
148
|
+
* @private
|
|
149
|
+
*/
|
|
150
|
+
private onSongChange;
|
|
151
|
+
/**
|
|
152
|
+
* Fires on text event
|
|
153
|
+
* @param data {Uint8Array} the data text
|
|
154
|
+
* @param type {number} the status byte of the message (the meta status byte)
|
|
155
|
+
*/
|
|
156
|
+
onTextEvent: any;
|
|
157
|
+
/**
|
|
158
|
+
* Fires when CurrentTime changes
|
|
159
|
+
* @type {Object<string, function(number)>} the time that was changed to
|
|
160
|
+
* @private
|
|
161
|
+
*/
|
|
162
|
+
private onTimeChange;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* {Object}
|
|
166
|
+
*/
|
|
167
|
+
export type MidFile = {
|
|
168
|
+
/**
|
|
169
|
+
* - the binary data of the file.
|
|
170
|
+
*/
|
|
171
|
+
binary: ArrayBuffer;
|
|
172
|
+
/**
|
|
173
|
+
* - the alternative name for the file
|
|
174
|
+
*/
|
|
175
|
+
altName: string | undefined;
|
|
176
|
+
};
|
|
177
|
+
export type MIDIFile = MIDI | MidFile;
|
|
178
|
+
import { Synthetizer } from '../synthetizer/synthetizer.js';
|
|
179
|
+
import { MidiData } from '../midi_parser/midi_data.js';
|
|
180
|
+
import { MIDI } from '../midi_parser/midi_loader.js';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* *
|
|
3
|
+
*/
|
|
4
|
+
export type WorkletSequencerMessageType = number;
|
|
5
|
+
export namespace WorkletSequencerMessageType {
|
|
6
|
+
let loadNewSongList: number;
|
|
7
|
+
let pause: number;
|
|
8
|
+
let stop: number;
|
|
9
|
+
let play: number;
|
|
10
|
+
let setTime: number;
|
|
11
|
+
let changeMIDIMessageSending: number;
|
|
12
|
+
let setPlaybackRate: number;
|
|
13
|
+
let setLoop: number;
|
|
14
|
+
let changeSong: number;
|
|
15
|
+
let getMIDI: number;
|
|
16
|
+
}
|
|
17
|
+
export type WorkletSequencerReturnMessageType = number;
|
|
18
|
+
export namespace WorkletSequencerReturnMessageType {
|
|
19
|
+
export let midiEvent: number;
|
|
20
|
+
export let songChange: number;
|
|
21
|
+
export let textEvent: number;
|
|
22
|
+
export let timeChange: number;
|
|
23
|
+
let pause_1: number;
|
|
24
|
+
export { pause_1 as pause };
|
|
25
|
+
let getMIDI_1: number;
|
|
26
|
+
export { getMIDI_1 as getMIDI };
|
|
27
|
+
export let midiError: number;
|
|
28
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param generatorType {number}
|
|
3
|
+
* @param presetGens {Generator[]}
|
|
4
|
+
* @param instrumentGens {Generator[]}
|
|
5
|
+
*/
|
|
6
|
+
export function addAndClampGenerator(generatorType: number, presetGens: Generator[], instrumentGens: Generator[]): number;
|
|
7
|
+
/**
|
|
8
|
+
* Reads the generator read
|
|
9
|
+
* @param generatorChunk {RiffChunk}
|
|
10
|
+
* @returns {Generator[]}
|
|
11
|
+
*/
|
|
12
|
+
export function readGenerators(generatorChunk: RiffChunk): Generator[];
|
|
13
|
+
export type generatorTypes = number;
|
|
14
|
+
export namespace generatorTypes {
|
|
15
|
+
let startAddrsOffset: number;
|
|
16
|
+
let endAddrOffset: number;
|
|
17
|
+
let startloopAddrsOffset: number;
|
|
18
|
+
let endloopAddrsOffset: number;
|
|
19
|
+
let startAddrsCoarseOffset: number;
|
|
20
|
+
let modLfoToPitch: number;
|
|
21
|
+
let vibLfoToPitch: number;
|
|
22
|
+
let modEnvToPitch: number;
|
|
23
|
+
let initialFilterFc: number;
|
|
24
|
+
let initialFilterQ: number;
|
|
25
|
+
let modLfoToFilterFc: number;
|
|
26
|
+
let modEnvToFilterFc: number;
|
|
27
|
+
let endAddrsCoarseOffset: number;
|
|
28
|
+
let modLfoToVolume: number;
|
|
29
|
+
let unused1: number;
|
|
30
|
+
let chorusEffectsSend: number;
|
|
31
|
+
let reverbEffectsSend: number;
|
|
32
|
+
let pan: number;
|
|
33
|
+
let unused2: number;
|
|
34
|
+
let unused3: number;
|
|
35
|
+
let unused4: number;
|
|
36
|
+
let delayModLFO: number;
|
|
37
|
+
let freqModLFO: number;
|
|
38
|
+
let delayVibLFO: number;
|
|
39
|
+
let freqVibLFO: number;
|
|
40
|
+
let delayModEnv: number;
|
|
41
|
+
let attackModEnv: number;
|
|
42
|
+
let holdModEnv: number;
|
|
43
|
+
let decayModEnv: number;
|
|
44
|
+
let sustainModEnv: number;
|
|
45
|
+
let releaseModEnv: number;
|
|
46
|
+
let keyNumToModEnvHold: number;
|
|
47
|
+
let keyNumToModEnvDecay: number;
|
|
48
|
+
let delayVolEnv: number;
|
|
49
|
+
let attackVolEnv: number;
|
|
50
|
+
let holdVolEnv: number;
|
|
51
|
+
let decayVolEnv: number;
|
|
52
|
+
let sustainVolEnv: number;
|
|
53
|
+
let releaseVolEnv: number;
|
|
54
|
+
let keyNumToVolEnvHold: number;
|
|
55
|
+
let keyNumToVolEnvDecay: number;
|
|
56
|
+
let instrument: number;
|
|
57
|
+
let reserved1: number;
|
|
58
|
+
let keyRange: number;
|
|
59
|
+
let velRange: number;
|
|
60
|
+
let startloopAddrsCoarseOffset: number;
|
|
61
|
+
let keyNum: number;
|
|
62
|
+
let velocity: number;
|
|
63
|
+
let initialAttenuation: number;
|
|
64
|
+
let reserved2: number;
|
|
65
|
+
let endloopAddrsCoarseOffset: number;
|
|
66
|
+
let coarseTune: number;
|
|
67
|
+
let fineTune: number;
|
|
68
|
+
let sampleID: number;
|
|
69
|
+
let sampleModes: number;
|
|
70
|
+
let reserved3: number;
|
|
71
|
+
let scaleTuning: number;
|
|
72
|
+
let exclusiveClass: number;
|
|
73
|
+
let overridingRootKey: number;
|
|
74
|
+
let unused5: number;
|
|
75
|
+
let endOper: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @type {{min: number, max: number, def: number}[]}
|
|
79
|
+
*/
|
|
80
|
+
export const generatorLimits: {
|
|
81
|
+
min: number;
|
|
82
|
+
max: number;
|
|
83
|
+
def: number;
|
|
84
|
+
}[];
|
|
85
|
+
export class Generator {
|
|
86
|
+
/**
|
|
87
|
+
* Creates a generator
|
|
88
|
+
* @param dataArray {IndexedByteArray}
|
|
89
|
+
*/
|
|
90
|
+
constructor(dataArray: IndexedByteArray);
|
|
91
|
+
/**
|
|
92
|
+
* @type {generatorTypes}
|
|
93
|
+
**/
|
|
94
|
+
generatorType: generatorTypes;
|
|
95
|
+
generatorValue: number;
|
|
96
|
+
}
|
|
97
|
+
import { RiffChunk } from './riff_chunk.js';
|
|
98
|
+
import { IndexedByteArray } from '../../utils/indexed_array.js';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the instruments
|
|
3
|
+
* @param instrumentChunk {RiffChunk}
|
|
4
|
+
* @param instrumentZones {InstrumentZone[]}
|
|
5
|
+
* @returns {Instrument[]}
|
|
6
|
+
*/
|
|
7
|
+
export function readInstruments(instrumentChunk: RiffChunk, instrumentZones: InstrumentZone[]): Instrument[];
|
|
8
|
+
/**
|
|
9
|
+
* instrument.js
|
|
10
|
+
* purpose: parses soundfont instrument and stores them as a class
|
|
11
|
+
*/
|
|
12
|
+
export class Instrument {
|
|
13
|
+
/**
|
|
14
|
+
* Creates an instrument
|
|
15
|
+
* @param instrumentChunk {RiffChunk}
|
|
16
|
+
*/
|
|
17
|
+
constructor(instrumentChunk: RiffChunk);
|
|
18
|
+
instrumentName: string;
|
|
19
|
+
instrumentZoneIndex: number;
|
|
20
|
+
instrumentZonesAmount: number;
|
|
21
|
+
/**
|
|
22
|
+
* @type {InstrumentZone[]}
|
|
23
|
+
*/
|
|
24
|
+
instrumentZones: InstrumentZone[];
|
|
25
|
+
_useCount: number;
|
|
26
|
+
addUseCount(): void;
|
|
27
|
+
removeUseCount(): void;
|
|
28
|
+
/**
|
|
29
|
+
* @returns {number}
|
|
30
|
+
*/
|
|
31
|
+
get useCount(): number;
|
|
32
|
+
deleteInstrument(): void;
|
|
33
|
+
/**
|
|
34
|
+
* @param index {number}
|
|
35
|
+
* @returns {boolean} is the zone has been deleted
|
|
36
|
+
*/
|
|
37
|
+
safeDeleteZone(index: number): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* @param index {number}
|
|
40
|
+
*/
|
|
41
|
+
deleteZone(index: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Loads all the instrument zones, given the amount
|
|
44
|
+
* @param amount {number}
|
|
45
|
+
* @param zones {InstrumentZone[]}
|
|
46
|
+
*/
|
|
47
|
+
getInstrumentZones(amount: number, zones: InstrumentZone[]): void;
|
|
48
|
+
}
|
|
49
|
+
import { RiffChunk } from "./riff_chunk.js";
|
|
50
|
+
import { InstrumentZone } from "./zones.js";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the modulator read
|
|
3
|
+
* @param modulatorChunk {RiffChunk}
|
|
4
|
+
* @returns {Modulator[]}
|
|
5
|
+
*/
|
|
6
|
+
export function readModulators(modulatorChunk: RiffChunk): Modulator[];
|
|
7
|
+
export namespace modulatorSources {
|
|
8
|
+
let noController: number;
|
|
9
|
+
let noteOnVelocity: number;
|
|
10
|
+
let noteOnKeyNum: number;
|
|
11
|
+
let polyPressure: number;
|
|
12
|
+
let channelPressure: number;
|
|
13
|
+
let pitchWheel: number;
|
|
14
|
+
let pitchWheelRange: number;
|
|
15
|
+
let link: number;
|
|
16
|
+
}
|
|
17
|
+
export namespace modulatorCurveTypes {
|
|
18
|
+
export let linear: number;
|
|
19
|
+
export let concave: number;
|
|
20
|
+
export let convex: number;
|
|
21
|
+
let _switch: number;
|
|
22
|
+
export { _switch as switch };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* type, polarity, direction
|
|
27
|
+
* @type {Float32Array[][][]}
|
|
28
|
+
*/
|
|
29
|
+
export const precomputedTransforms: Float32Array[][][];
|
|
30
|
+
export class Modulator {
|
|
31
|
+
/**
|
|
32
|
+
* Creates a modulator
|
|
33
|
+
* @param dataArray {IndexedByteArray|{srcEnum: number, secSrcEnum: number, dest:number, amt: number, transform: number}}
|
|
34
|
+
*/
|
|
35
|
+
constructor(dataArray: IndexedByteArray | {
|
|
36
|
+
srcEnum: number;
|
|
37
|
+
secSrcEnum: number;
|
|
38
|
+
dest: number;
|
|
39
|
+
amt: number;
|
|
40
|
+
transform: number;
|
|
41
|
+
});
|
|
42
|
+
modulatorSource: any;
|
|
43
|
+
/**
|
|
44
|
+
* @type {generatorTypes}
|
|
45
|
+
*/
|
|
46
|
+
modulatorDestination: generatorTypes;
|
|
47
|
+
modulationSecondarySrc: any;
|
|
48
|
+
transformAmount: any;
|
|
49
|
+
transformType: any;
|
|
50
|
+
sourcePolarity: number;
|
|
51
|
+
sourceDirection: number;
|
|
52
|
+
sourceUsesCC: number;
|
|
53
|
+
sourceIndex: number;
|
|
54
|
+
sourceCurveType: number;
|
|
55
|
+
secSrcPolarity: number;
|
|
56
|
+
secSrcDirection: number;
|
|
57
|
+
secSrcUsesCC: number;
|
|
58
|
+
secSrcIndex: number;
|
|
59
|
+
secSrcCurveType: number;
|
|
60
|
+
/**
|
|
61
|
+
* Sums transform and creates a NEW modulator
|
|
62
|
+
* @param modulator {Modulator}
|
|
63
|
+
* @returns {Modulator}
|
|
64
|
+
*/
|
|
65
|
+
sumTransform(modulator: Modulator): Modulator;
|
|
66
|
+
/**
|
|
67
|
+
* @returns {string}
|
|
68
|
+
*/
|
|
69
|
+
debugString(): string;
|
|
70
|
+
}
|
|
71
|
+
export const defaultModulators: Modulator[];
|
|
72
|
+
import { generatorTypes } from './generators.js';
|
|
73
|
+
import { IndexedByteArray } from '../../utils/indexed_array.js';
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the presets
|
|
3
|
+
* @param presetChunk {RiffChunk}
|
|
4
|
+
* @param presetZones {PresetZone[]}
|
|
5
|
+
* @returns {Preset[]}
|
|
6
|
+
*/
|
|
7
|
+
export function readPresets(presetChunk: RiffChunk, presetZones: PresetZone[]): Preset[];
|
|
8
|
+
/**
|
|
9
|
+
* parses soundfont presets, also includes function for getting the generators and samples from midi note and velocity
|
|
10
|
+
*/
|
|
11
|
+
export class Preset {
|
|
12
|
+
/**
|
|
13
|
+
* Creates a preset
|
|
14
|
+
* @param presetChunk {RiffChunk}
|
|
15
|
+
*/
|
|
16
|
+
constructor(presetChunk: RiffChunk);
|
|
17
|
+
presetName: string;
|
|
18
|
+
program: number;
|
|
19
|
+
bank: number;
|
|
20
|
+
presetZoneStartIndex: number;
|
|
21
|
+
presetZonesAmount: number;
|
|
22
|
+
/**
|
|
23
|
+
* @type {PresetZone[]}
|
|
24
|
+
*/
|
|
25
|
+
presetZones: PresetZone[];
|
|
26
|
+
/**
|
|
27
|
+
* Stores already found getSamplesAndGenerators for reuse
|
|
28
|
+
* @type {SampleAndGenerators[][][]}
|
|
29
|
+
*/
|
|
30
|
+
foundSamplesAndGenerators: {
|
|
31
|
+
instrumentGenerators: Generator[];
|
|
32
|
+
presetGenerators: Generator[];
|
|
33
|
+
modulators: Modulator[];
|
|
34
|
+
sample: Sample;
|
|
35
|
+
sampleID: number;
|
|
36
|
+
}[][][];
|
|
37
|
+
library: number;
|
|
38
|
+
genre: number;
|
|
39
|
+
morphology: number;
|
|
40
|
+
/**
|
|
41
|
+
* Loads all the preset zones, given the amount
|
|
42
|
+
* @param amount {number}
|
|
43
|
+
* @param zones {PresetZone[]}
|
|
44
|
+
*/
|
|
45
|
+
getPresetZones(amount: number, zones: PresetZone[]): void;
|
|
46
|
+
deletePreset(): void;
|
|
47
|
+
/**
|
|
48
|
+
* @param index {number}
|
|
49
|
+
*/
|
|
50
|
+
deleteZone(index: number): void;
|
|
51
|
+
/**
|
|
52
|
+
* Preloads all samples (async)
|
|
53
|
+
*/
|
|
54
|
+
preload(keyMin: any, keyMax: any): void;
|
|
55
|
+
/**
|
|
56
|
+
* Preloads a specific key/velocity combo
|
|
57
|
+
* @param key {number}
|
|
58
|
+
* @param velocity {number}
|
|
59
|
+
*/
|
|
60
|
+
preloadSpecific(key: number, velocity: number): void;
|
|
61
|
+
/**
|
|
62
|
+
* @typedef {{
|
|
63
|
+
* instrumentGenerators: Generator[],
|
|
64
|
+
* presetGenerators: Generator[],
|
|
65
|
+
* modulators: Modulator[],
|
|
66
|
+
* sample: Sample,
|
|
67
|
+
* sampleID: number,
|
|
68
|
+
* }} SampleAndGenerators
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Returns generatorTranslator and generators for given note
|
|
72
|
+
* @param midiNote {number}
|
|
73
|
+
* @param velocity {number}
|
|
74
|
+
* @returns {SampleAndGenerators[]}
|
|
75
|
+
*/
|
|
76
|
+
getSamplesAndGenerators(midiNote: number, velocity: number): {
|
|
77
|
+
instrumentGenerators: Generator[];
|
|
78
|
+
presetGenerators: Generator[];
|
|
79
|
+
modulators: Modulator[];
|
|
80
|
+
sample: Sample;
|
|
81
|
+
sampleID: number;
|
|
82
|
+
}[];
|
|
83
|
+
}
|
|
84
|
+
import { RiffChunk } from "./riff_chunk.js";
|
|
85
|
+
import { PresetZone } from "./zones.js";
|
|
86
|
+
import { Generator } from './generators.js';
|
|
87
|
+
import { Sample } from "./samples.js";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param dataArray {IndexedByteArray}
|
|
3
|
+
* @param readData {boolean}
|
|
4
|
+
* @param forceShift {boolean}
|
|
5
|
+
* @returns {RiffChunk}
|
|
6
|
+
*/
|
|
7
|
+
export function readRIFFChunk(dataArray: IndexedByteArray, readData?: boolean, forceShift?: boolean): RiffChunk;
|
|
8
|
+
/**
|
|
9
|
+
* @param chunk {RiffChunk}
|
|
10
|
+
* @param prepend {IndexedByteArray}
|
|
11
|
+
* @returns {IndexedByteArray}
|
|
12
|
+
*/
|
|
13
|
+
export function writeRIFFChunk(chunk: RiffChunk, prepend?: IndexedByteArray): IndexedByteArray;
|
|
14
|
+
/**
|
|
15
|
+
* riff_chunk.js
|
|
16
|
+
* reads a riff read and stores it as a class
|
|
17
|
+
*/
|
|
18
|
+
export class RiffChunk {
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new riff read
|
|
21
|
+
* @constructor
|
|
22
|
+
* @param header {string}
|
|
23
|
+
* @param size {number}
|
|
24
|
+
* @param data {IndexedByteArray}
|
|
25
|
+
*/
|
|
26
|
+
constructor(header: string, size: number, data: IndexedByteArray);
|
|
27
|
+
header: string;
|
|
28
|
+
size: number;
|
|
29
|
+
chunkData: IndexedByteArray;
|
|
30
|
+
}
|
|
31
|
+
import { IndexedByteArray } from '../../utils/indexed_array.js';
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the generatorTranslator from the shdr read
|
|
3
|
+
* @param sampleHeadersChunk {RiffChunk}
|
|
4
|
+
* @param smplChunkData {IndexedByteArray}
|
|
5
|
+
* @returns {Sample[]}
|
|
6
|
+
*/
|
|
7
|
+
export function readSamples(sampleHeadersChunk: RiffChunk, smplChunkData: IndexedByteArray): Sample[];
|
|
8
|
+
/**
|
|
9
|
+
* samples.js
|
|
10
|
+
* purpose: parses soundfont samples, resamples if needed.
|
|
11
|
+
* loads sample data, handles async loading of sf3 compressed samples
|
|
12
|
+
*/
|
|
13
|
+
export class BasicSample {
|
|
14
|
+
/**
|
|
15
|
+
* The basic representation of a soundfont sample
|
|
16
|
+
* @param sampleName {string}
|
|
17
|
+
* @param sampleRate {number}
|
|
18
|
+
* @param samplePitch {number}
|
|
19
|
+
* @param samplePitchCorrection {number}
|
|
20
|
+
* @param sampleLink {number}
|
|
21
|
+
* @param sampleType {number}
|
|
22
|
+
* @param loopStart {number} relative to sample start
|
|
23
|
+
* @param loopEnd {number} relative to sample start
|
|
24
|
+
*/
|
|
25
|
+
constructor(sampleName: string, sampleRate: number, samplePitch: number, samplePitchCorrection: number, sampleLink: number, sampleType: number, loopStart: number, loopEnd: number);
|
|
26
|
+
/**
|
|
27
|
+
* Sample's name
|
|
28
|
+
* @type {string}
|
|
29
|
+
*/
|
|
30
|
+
sampleName: string;
|
|
31
|
+
/**
|
|
32
|
+
* Sample rate in Hz
|
|
33
|
+
* @type {number}
|
|
34
|
+
*/
|
|
35
|
+
sampleRate: number;
|
|
36
|
+
/**
|
|
37
|
+
* Original pitch of the sample as a MIDI note number
|
|
38
|
+
* @type {number}
|
|
39
|
+
*/
|
|
40
|
+
samplePitch: number;
|
|
41
|
+
/**
|
|
42
|
+
* Pitch correction, in cents. Can be negative
|
|
43
|
+
* @type {number}
|
|
44
|
+
*/
|
|
45
|
+
samplePitchCorrection: number;
|
|
46
|
+
/**
|
|
47
|
+
* Sample link, currently unused.
|
|
48
|
+
* @type {number}
|
|
49
|
+
*/
|
|
50
|
+
sampleLink: number;
|
|
51
|
+
/**
|
|
52
|
+
* Type of the sample, an enum
|
|
53
|
+
* @type {number}
|
|
54
|
+
*/
|
|
55
|
+
sampleType: number;
|
|
56
|
+
/**
|
|
57
|
+
* Relative to start of the sample, bytes
|
|
58
|
+
* @type {number}
|
|
59
|
+
*/
|
|
60
|
+
sampleLoopStartIndex: number;
|
|
61
|
+
/**
|
|
62
|
+
* Relative to start of the sample, in bytes
|
|
63
|
+
* @type {number}
|
|
64
|
+
*/
|
|
65
|
+
sampleLoopEndIndex: number;
|
|
66
|
+
/**
|
|
67
|
+
* Indicates if the sample is compressed
|
|
68
|
+
* @type {boolean}
|
|
69
|
+
*/
|
|
70
|
+
isCompressed: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* The compressed sample data if it was compressed by spessasynth
|
|
73
|
+
* @type {Uint8Array}
|
|
74
|
+
*/
|
|
75
|
+
compressedData: Uint8Array;
|
|
76
|
+
/**
|
|
77
|
+
* @returns {Uint8Array|IndexedByteArray}
|
|
78
|
+
*/
|
|
79
|
+
getRawData(): Uint8Array | IndexedByteArray;
|
|
80
|
+
/**
|
|
81
|
+
* @param quality {number}
|
|
82
|
+
* @param encodeVorbis {EncodeVorbisFunction}
|
|
83
|
+
*/
|
|
84
|
+
compressSample(quality: number, encodeVorbis: EncodeVorbisFunction): void;
|
|
85
|
+
/**
|
|
86
|
+
* @returns {Float32Array}
|
|
87
|
+
*/
|
|
88
|
+
getAudioData(): Float32Array;
|
|
89
|
+
}
|
|
90
|
+
export class Sample extends BasicSample {
|
|
91
|
+
/**
|
|
92
|
+
* Creates a sample
|
|
93
|
+
* @param sampleName {string}
|
|
94
|
+
* @param sampleStartIndex {number}
|
|
95
|
+
* @param sampleEndIndex {number}
|
|
96
|
+
* @param sampleLoopStartIndex {number}
|
|
97
|
+
* @param sampleLoopEndIndex {number}
|
|
98
|
+
* @param sampleRate {number}
|
|
99
|
+
* @param samplePitch {number}
|
|
100
|
+
* @param samplePitchCorrection {number}
|
|
101
|
+
* @param sampleLink {number}
|
|
102
|
+
* @param sampleType {number}
|
|
103
|
+
* @param smplArr {IndexedByteArray}
|
|
104
|
+
* @param sampleIndex {number} initial sample index when loading the sfont
|
|
105
|
+
*/
|
|
106
|
+
constructor(sampleName: string, sampleStartIndex: number, sampleEndIndex: number, sampleLoopStartIndex: number, sampleLoopEndIndex: number, sampleRate: number, samplePitch: number, samplePitchCorrection: number, sampleLink: number, sampleType: number, smplArr: IndexedByteArray, sampleIndex: number);
|
|
107
|
+
sampleStartIndex: number;
|
|
108
|
+
sampleEndIndex: number;
|
|
109
|
+
isSampleLoaded: boolean;
|
|
110
|
+
sampleID: number;
|
|
111
|
+
useCount: number;
|
|
112
|
+
sampleLength: number;
|
|
113
|
+
sampleDataArray: IndexedByteArray;
|
|
114
|
+
sampleData: Float32Array;
|
|
115
|
+
/**
|
|
116
|
+
* Get raw data, whether it's compressed or not as we simply write it to the file
|
|
117
|
+
* @return {Uint8Array}
|
|
118
|
+
*/
|
|
119
|
+
getRawData(): Uint8Array;
|
|
120
|
+
/**
|
|
121
|
+
* Decode binary vorbis into a float32 pcm
|
|
122
|
+
*/
|
|
123
|
+
decodeVorbis(): void;
|
|
124
|
+
/**
|
|
125
|
+
* @returns {Float32Array}
|
|
126
|
+
*/
|
|
127
|
+
loadUncompressedData(): Float32Array;
|
|
128
|
+
/**
|
|
129
|
+
* @returns {Float32Array}
|
|
130
|
+
*/
|
|
131
|
+
loadBufferData(): Float32Array;
|
|
132
|
+
}
|
|
133
|
+
import { RiffChunk } from "./riff_chunk.js";
|
|
134
|
+
import { IndexedByteArray } from "../../utils/indexed_array.js";
|