Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2025 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <memory>
26 : #include <cstring>
27 : #include <string>
28 : #include <variant>
29 :
30 : #include "dlib.h"
31 : #include "apitypes.h"
32 :
33 : #include "types/version.h"
34 :
35 : namespace muse::musesampler {
36 : struct MuseSamplerLibHandler
37 : {
38 : public:
39 0 : MuseSamplerLibHandler() = default;
40 :
41 0 : bool loadLib(const io::path_t& path)
42 : {
43 0 : m_lib = muse::loadLib(path);
44 0 : return m_lib != nullptr;
45 : }
46 :
47 0 : bool loadApi(const Version& minSupportedVersion, bool useLegacyAudition = false)
48 : {
49 0 : IF_ASSERT_FAILED(m_lib) {
50 0 : return false;
51 : }
52 :
53 0 : auto getVersionMajor = (ms_get_version_major)libFunc("ms_get_version_major");
54 0 : auto getVersionMinor = (ms_get_version_minor)libFunc("ms_get_version_minor");
55 0 : auto getVersionRevision = (ms_get_version_revision)libFunc("ms_get_version_revision");
56 0 : auto getBuildNumber = (ms_get_version_build_number)libFunc("ms_get_version_build_number");
57 :
58 : // Invalid...
59 0 : if (!getVersionMajor || !getVersionMinor || !getVersionRevision) {
60 0 : return false;
61 : }
62 :
63 0 : m_version = Version(getVersionMajor(), getVersionMinor(), getVersionRevision());
64 :
65 0 : if (getBuildNumber) {
66 0 : m_buildNumber = getBuildNumber();
67 : }
68 :
69 0 : if (m_version < minSupportedVersion) {
70 0 : LOGE() << "MuseSampler " << m_version.toString() << " is not supported (too old -- update MuseSampler); ignoring";
71 0 : return false;
72 : }
73 :
74 : // Major versions have incompatible changes; we can only support interfaces we know about
75 0 : constexpr int maximumMajorVersion = 0;
76 :
77 0 : if (m_version.major() > maximumMajorVersion) {
78 0 : LOGE() << "MuseSampler " << m_version.toString() << " is not supported (too new -- update MuseScore Studio); ignoring";
79 0 : return false;
80 : }
81 :
82 : // Check versions here; define optional functions below
83 0 : bool at_least_v_0_106 = (m_version.major() == 0 && m_version.minor() >= 106) || m_version.major() > 0;
84 :
85 0 : if (at_least_v_0_106) {
86 0 : if (auto initLibFunc = (ms_init_3)libFunc("ms_init_3")) {
87 0 : initLib = [initLibFunc]() -> std::variant<ms_InitResult, ms_Result> { return initLibFunc(); };
88 : }
89 : } else {
90 0 : if (auto initLibFunc = (ms_init_2)libFunc("ms_init_2")) {
91 0 : initLib = [initLibFunc]() -> std::variant<ms_InitResult, ms_Result> { return initLibFunc(); };
92 : }
93 : }
94 :
95 0 : deinitLib = (ms_deinit)libFunc("ms_deinit");
96 :
97 0 : getInstrumentList = (ms_get_instrument_list)libFunc("ms_get_instrument_list");
98 0 : getMatchingInstrumentList = (ms_get_matching_instrument_list)libFunc("ms_get_matching_instrument_list");
99 0 : getNextInstrument = (ms_InstrumentList_get_next)libFunc("ms_InstrumentList_get_next");
100 0 : getInstrumentId = (ms_Instrument_get_id)libFunc("ms_Instrument_get_id");
101 0 : getInstrumentName = (ms_Instrument_get_name)libFunc("ms_Instrument_get_name");
102 0 : getInstrumentCategory = (ms_Instrument_get_category)libFunc("ms_Instrument_get_category");
103 :
104 0 : getMusicXmlSoundId = (ms_Instrument_get_musicxml_sound)libFunc("ms_Instrument_get_musicxml_sound");
105 0 : getMpeSoundId = (ms_Instrument_get_mpe_sound)libFunc("ms_Instrument_get_mpe_sound");
106 :
107 0 : getPresetList = (ms_Instrument_get_preset_list)libFunc("ms_Instrument_get_preset_list");
108 0 : getNextPreset = (ms_PresetList_get_next)libFunc("ms_PresetList_get_next");
109 :
110 0 : create = (ms_MuseSampler_create)libFunc("ms_MuseSampler_create");
111 0 : destroy = (ms_MuseSampler_destroy)libFunc("ms_MuseSampler_destroy");
112 :
113 0 : if (useLegacyAudition) {
114 0 : LOGI() << "Use legacy audition (ms_MuseSampler_init)";
115 :
116 0 : auto initSamplerFunc = (ms_MuseSampler_init)libFunc("ms_MuseSampler_init");
117 0 : initSampler = [initSamplerFunc](ms_MuseSampler ms, double sample_rate, int block_size, int channel_count) {
118 0 : return initSamplerFunc(ms, sample_rate, block_size, channel_count) == ms_Result_OK;
119 0 : };
120 : } else {
121 0 : auto initSamplerFunc = (ms_MuseSampler_init_2)libFunc("ms_MuseSampler_init_2");
122 0 : initSampler = [initSamplerFunc](ms_MuseSampler ms, double sample_rate, int block_size, int channel_count) {
123 0 : return initSamplerFunc(ms, sample_rate, block_size, channel_count) == ms_Result_OK;
124 0 : };
125 : }
126 :
127 0 : addTrack = (ms_MuseSampler_add_track)libFunc("ms_MuseSampler_add_track");
128 0 : finalizeTrack = (ms_MuseSampler_finalize_track)libFunc("ms_MuseSampler_finalize_track");
129 0 : clearTrack = (ms_MuseSampler_clear_track)libFunc("ms_MuseSampler_clear_track");
130 :
131 0 : disableReverb = (ms_disable_reverb)libFunc("ms_disable_reverb");
132 0 : getReverbLevel = (ms_Instrument_get_reverb_level)libFunc("ms_Instrument_get_reverb_level");
133 :
134 0 : addDynamicsEvent = (ms_MuseSampler_add_track_dynamics_event_2)libFunc(
135 : "ms_MuseSampler_add_track_dynamics_event_2");
136 0 : addPedalEvent = (ms_MuseSampler_add_track_pedal_event_2)libFunc("ms_MuseSampler_add_track_pedal_event_2");
137 :
138 0 : auto addNoteEventFunc = (ms_MuseSampler_add_track_note_event_6)libFunc("ms_MuseSampler_add_track_note_event_6");
139 0 : addNoteEvent = [addNoteEventFunc](ms_MuseSampler ms, ms_Track track, const NoteEvent& ev, long long& event_id) {
140 0 : return addNoteEventFunc(ms, track, ev, event_id) == ms_Result_OK;
141 0 : };
142 :
143 0 : auto startAuditionNoteFunc = (ms_MuseSampler_start_audition_note_5)libFunc(
144 0 : "ms_MuseSampler_start_audition_note_5");
145 0 : startAuditionNote = [startAuditionNoteFunc](ms_MuseSampler ms, ms_Track track, ms_AuditionStartNoteEvent_5 ev) {
146 0 : return startAuditionNoteFunc(ms, track, ev) == ms_Result_OK;
147 0 : };
148 :
149 0 : isRangedArticulation = (ms_MuseSampler_is_ranged_articulation)libFunc("ms_MuseSampler_is_ranged_articulation");
150 : addTrackEventRangeStart
151 0 : = (ms_MuseSampler_add_track_event_range_start)libFunc("ms_MuseSampler_add_track_event_range_start");
152 : addTrackEventRangeEnd
153 0 : = (ms_MuseSampler_add_track_event_range_end)libFunc("ms_MuseSampler_add_track_event_range_end");
154 :
155 0 : stopAuditionNote = (ms_MuseSampler_stop_audition_note)libFunc("ms_MuseSampler_stop_audition_note");
156 :
157 0 : addSyllableEvent = (ms_MuseSampler_add_track_syllable_event_2)libFunc("ms_MuseSampler_add_track_syllable_event_2");
158 :
159 0 : getInstrumentVendorName = (ms_Instrument_get_vendor_name)libFunc("ms_Instrument_get_vendor_name");
160 0 : getInstrumentPackName = (ms_Instrument_get_pack_name)libFunc("ms_Instrument_get_pack_name");
161 0 : getInstrumentInfoJson = (ms_Instrument_get_info_json)libFunc("ms_Instrument_get_info_json");
162 0 : createPresetChange = (ms_MuseSampler_create_preset_change)libFunc("ms_MuseSampler_create_preset_change");
163 0 : addPreset = (ms_MuseSampler_add_preset)libFunc("ms_MuseSampler_add_preset");
164 0 : getTextArticulations = (ms_get_text_articulations)libFunc("ms_get_text_articulations");
165 0 : addTextArticulationEvent = (ms_MuseSampler_add_track_text_articulation_event)
166 0 : libFunc("ms_MuseSampler_add_track_text_articulation_event");
167 0 : getDrumMapping = (ms_get_drum_mapping)libFunc("ms_get_drum_mapping");
168 :
169 0 : addPitchBend = (ms_MuseSampler_add_pitch_bend)libFunc("ms_MuseSampler_add_pitch_bend");
170 0 : addVibrato = (ms_MuseSampler_add_vibrato)libFunc("ms_MuseSampler_add_vibrato");
171 :
172 0 : startOfflineMode = (ms_MuseSampler_start_offline_mode)libFunc("ms_MuseSampler_start_offline_mode");
173 0 : stopOfflineMode = (ms_MuseSampler_stop_offline_mode)libFunc("ms_MuseSampler_stop_offline_mode");
174 0 : processOffline = (ms_MuseSampler_process_offline)libFunc("ms_MuseSampler_process_offline");
175 :
176 0 : setPosition = (ms_MuseSampler_set_position)libFunc("ms_MuseSampler_set_position");
177 0 : setPlaying = (ms_MuseSampler_set_playing)libFunc("ms_MuseSampler_set_playing");
178 0 : process = (ms_MuseSampler_process)libFunc("ms_MuseSampler_process");
179 0 : allNotesOff = (ms_MuseSampler_all_notes_off)libFunc("ms_MuseSampler_all_notes_off");
180 :
181 0 : reloadAllInstruments = (ms_reload_all_instruments)libFunc("ms_reload_all_instruments");
182 0 : readyToPlay = (ms_MuseSampler_ready_to_play)libFunc("ms_MuseSampler_ready_to_play");
183 :
184 0 : setLoggingCallback = (ms_set_logging_callback)libFunc("ms_set_logging_callback");
185 0 : isOnlineInstrument = (ms_Instrument_is_online)libFunc("ms_Instrument_is_online");
186 0 : setScoreId = (ms_MuseSampler_set_score_id)libFunc("ms_MuseSampler_set_score_id");
187 0 : setAutoRenderInterval = (ms_MuseSampler_set_auto_render_interval)libFunc(
188 : "ms_MuseSampler_set_auto_render_interval");
189 0 : triggerRender = (ms_MuseSampler_trigger_render)libFunc("ms_MuseSampler_trigger_render");
190 0 : clearOnlineCache = (ms_MuseSampler_clear_online_cache)libFunc("ms_MuseSampler_clear_online_cache");
191 0 : addAuditionCCEvent = (ms_MuseSampler_add_audition_cc_event)libFunc("ms_MuseSampler_add_audition_cc_event");
192 :
193 0 : setRenderingStateChangedCallback = (ms_MuseSampler_set_rendering_state_changed_callback_2)libFunc(
194 : "ms_MuseSampler_set_rendering_state_changed_callback_2");
195 0 : getNextRenderProgressInfo = (ms_RenderProgressInfo2_get_next)libFunc("ms_RenderProgressInfo2_get_next");
196 0 : setLazyRender = (ms_MuseSampler_set_lazy_render)libFunc("ms_MuseSampler_set_lazy_render");
197 :
198 0 : if (!isValid()) {
199 0 : printApiStatus();
200 0 : return false;
201 : }
202 :
203 0 : return true;
204 : }
205 :
206 0 : bool init()
207 : {
208 0 : if (!initLib) {
209 0 : LOGE() << "Could not find ms_init";
210 0 : return false;
211 : }
212 :
213 0 : const std::variant<ms_InitResult, ms_Result> initResult = initLib();
214 0 : if (const ms_InitResult* result = std::get_if<ms_InitResult>(&initResult)) {
215 0 : if (*result != ms_InitResult_OK) {
216 0 : LOGE() << "Could not init lib, error code: " << initResultToString(*result);
217 0 : return false;
218 : }
219 0 : } else if (std::get<ms_Result>(initResult) != ms_Result_OK) {
220 0 : LOGE() << "Could not init lib";
221 0 : return false;
222 : }
223 :
224 0 : if (disableReverb) {
225 0 : if (disableReverb() != ms_Result_OK) {
226 0 : LOGW() << "Could not disable reverb";
227 : }
228 : }
229 :
230 0 : return true;
231 : }
232 :
233 0 : void deinit()
234 : {
235 0 : IF_ASSERT_FAILED(m_lib) {
236 0 : return;
237 : }
238 :
239 0 : if (deinitLib) {
240 0 : if (deinitLib() != ms_Result_OK) {
241 0 : LOGE() << "Could not deinit lib";
242 : }
243 : }
244 :
245 0 : muse::closeLib(m_lib);
246 0 : m_lib = nullptr;
247 : }
248 :
249 0 : bool isValid() const
250 : {
251 0 : return m_lib
252 0 : && initLib
253 0 : && deinitLib
254 0 : && disableReverb
255 0 : && getInstrumentList
256 0 : && getMatchingInstrumentList
257 0 : && getNextInstrument
258 0 : && getInstrumentId
259 0 : && getInstrumentName
260 0 : && getInstrumentCategory
261 0 : && getInstrumentPackName
262 0 : && getInstrumentVendorName
263 0 : && getInstrumentInfoJson
264 0 : && getMusicXmlSoundId
265 0 : && getMpeSoundId
266 0 : && getPresetList
267 0 : && getNextPreset
268 0 : && getReverbLevel
269 0 : && getTextArticulations
270 0 : && getDrumMapping
271 0 : && create
272 0 : && destroy
273 0 : && initSampler
274 0 : && addTrack
275 0 : && finalizeTrack
276 0 : && clearTrack
277 0 : && addDynamicsEvent
278 0 : && addPedalEvent
279 0 : && addNoteEvent
280 0 : && addSyllableEvent
281 0 : && addPitchBend
282 0 : && addVibrato
283 0 : && addTextArticulationEvent
284 0 : && addPreset
285 0 : && createPresetChange
286 0 : && setPosition
287 0 : && setPlaying
288 0 : && isRangedArticulation
289 0 : && addTrackEventRangeStart
290 0 : && addTrackEventRangeEnd
291 0 : && startAuditionNote
292 0 : && stopAuditionNote
293 0 : && startOfflineMode
294 0 : && stopOfflineMode
295 0 : && processOffline
296 0 : && process
297 0 : && allNotesOff
298 0 : && readyToPlay
299 0 : && setLoggingCallback
300 0 : && setRenderingStateChangedCallback
301 0 : && isOnlineInstrument
302 0 : && setScoreId
303 0 : && getNextRenderProgressInfo
304 0 : && setAutoRenderInterval
305 0 : && triggerRender
306 0 : && clearOnlineCache
307 0 : && addAuditionCCEvent
308 0 : && setLazyRender;
309 : }
310 :
311 0 : const Version& version() const
312 : {
313 0 : return m_version;
314 : }
315 :
316 0 : int buildNumber() const
317 : {
318 0 : return m_buildNumber;
319 : }
320 :
321 0 : void printApiStatus() const
322 : {
323 0 : LOGI() << "MuseSampler API status:"
324 0 : << "\n ms_init - " << static_cast<bool>(initLib)
325 0 : << "\n ms_deinit - " << reinterpret_cast<uint64_t>(deinitLib)
326 0 : << "\n ms_disable_reverb - " << reinterpret_cast<uint64_t>(disableReverb)
327 0 : << "\n ms_get_instrument_list - " << reinterpret_cast<uint64_t>(getInstrumentList)
328 0 : << "\n ms_get_matching_instrument_list - " << reinterpret_cast<uint64_t>(getMatchingInstrumentList)
329 0 : << "\n ms_get_drum_mapping - " << reinterpret_cast<uint64_t>(getDrumMapping)
330 0 : << "\n ms_InstrumentList_get_next - " << reinterpret_cast<uint64_t>(getNextInstrument)
331 0 : << "\n ms_Instrument_get_info_json - " << reinterpret_cast<uint64_t>(getInstrumentInfoJson)
332 0 : << "\n ms_Instrument_get_id - " << reinterpret_cast<uint64_t>(getInstrumentId)
333 0 : << "\n ms_Instrument_get_name - " << reinterpret_cast<uint64_t>(getInstrumentName)
334 0 : << "\n ms_Instrument_get_vendor_name - " << reinterpret_cast<uint64_t>(getInstrumentVendorName)
335 0 : << "\n ms_Instrument_get_category - " << reinterpret_cast<uint64_t>(getInstrumentCategory)
336 0 : << "\n ms_Instrument_get_pack_name - " << reinterpret_cast<uint64_t>(getInstrumentPackName)
337 0 : << "\n ms_Instrument_get_musicxml_sound - " << reinterpret_cast<uint64_t>(getMusicXmlSoundId)
338 0 : << "\n ms_Instrument_get_mpe_sound - " << reinterpret_cast<uint64_t>(getMpeSoundId)
339 0 : << "\n ms_Instrument_get_reverb_level - " << reinterpret_cast<uint64_t>(getReverbLevel)
340 0 : << "\n ms_Instrument_get_preset_list - " << reinterpret_cast<uint64_t>(getPresetList)
341 0 : << "\n ms_PresetList_get_next - " << reinterpret_cast<uint64_t>(getNextPreset)
342 0 : << "\n ms_MuseSampler_create_preset_change - " << reinterpret_cast<uint64_t>(createPresetChange)
343 0 : << "\n ms_MuseSampler_add_preset - " << reinterpret_cast<uint64_t>(addPreset)
344 0 : << "\n ms_get_text_articulations - " << reinterpret_cast<uint64_t>(getTextArticulations)
345 0 : << "\n ms_MuseSampler_add_track_text_articulation_event - " << reinterpret_cast<uint64_t>(addTextArticulationEvent)
346 0 : << "\n ms_MuseSampler_create - " << reinterpret_cast<uint64_t>(create)
347 0 : << "\n ms_MuseSampler_destroy - " << reinterpret_cast<uint64_t>(destroy)
348 0 : << "\n ms_MuseSampler_add_track - " << reinterpret_cast<uint64_t>(addTrack)
349 0 : << "\n ms_MuseSampler_clear_track - " << reinterpret_cast<uint64_t>(clearTrack)
350 0 : << "\n ms_MuseSampler_finalize_track - " << reinterpret_cast<uint64_t>(finalizeTrack)
351 0 : << "\n ms_MuseSampler_add_track_dynamics_event_2 - " << reinterpret_cast<uint64_t>(addDynamicsEvent)
352 0 : << "\n ms_MuseSampler_add_track_pedal_event_2 - " << reinterpret_cast<uint64_t>(addPedalEvent)
353 0 : << "\n ms_MuseSampler_add_pitch_bend - " << reinterpret_cast<uint64_t>(addPitchBend)
354 0 : << "\n ms_MuseSampler_stop_audition_note - " << reinterpret_cast<uint64_t>(stopAuditionNote)
355 0 : << "\n ms_MuseSampler_add_pitch_bend - " << reinterpret_cast<uint64_t>(addPitchBend)
356 0 : << "\n ms_MuseSampler_add_vibrato - " << reinterpret_cast<uint64_t>(addVibrato)
357 0 : << "\n ms_MuseSampler_is_ranged_articulation - " << reinterpret_cast<uint64_t>(isRangedArticulation)
358 0 : << "\n ms_MuseSampler_add_track_event_range_start - " << reinterpret_cast<uint64_t>(addTrackEventRangeStart)
359 0 : << "\n ms_MuseSampler_add_track_event_range_end - " << reinterpret_cast<uint64_t>(addTrackEventRangeEnd)
360 0 : << "\n ms_MuseSampler_add_audition_cc_event - " << reinterpret_cast<uint64_t>(addAuditionCCEvent)
361 0 : << "\n ms_MuseSampler_add_track_syllable_event_2 - " << reinterpret_cast<uint64_t>(addSyllableEvent)
362 0 : << "\n ms_MuseSampler_start_offline_mode - " << reinterpret_cast<uint64_t>(startOfflineMode)
363 0 : << "\n ms_MuseSampler_stop_offline_mode - " << reinterpret_cast<uint64_t>(stopOfflineMode)
364 0 : << "\n ms_MuseSampler_process_offline - " << reinterpret_cast<uint64_t>(processOffline)
365 0 : << "\n ms_MuseSampler_set_position - " << reinterpret_cast<uint64_t>(setPosition)
366 0 : << "\n ms_MuseSampler_set_playing - " << reinterpret_cast<uint64_t>(setPlaying)
367 0 : << "\n ms_MuseSampler_process - " << reinterpret_cast<uint64_t>(process)
368 0 : << "\n ms_MuseSampler_all_notes_off - " << reinterpret_cast<uint64_t>(allNotesOff)
369 0 : << "\n ms_MuseSampler_ready_to_play - " << reinterpret_cast<uint64_t>(readyToPlay)
370 0 : << "\n ms_Instrument_is_online - " << reinterpret_cast<uint64_t>(isOnlineInstrument)
371 0 : << "\n ms_MuseSampler_trigger_render - " << reinterpret_cast<uint64_t>(triggerRender)
372 0 : << "\n ms_reload_all_instruments - " << reinterpret_cast<uint64_t>(reloadAllInstruments)
373 0 : << "\n ms_set_logging_callback - " << reinterpret_cast<uint64_t>(setLoggingCallback)
374 0 : << "\n ms_MuseSampler_set_rendering_state_changed_callback_2 - " <<
375 0 : reinterpret_cast<uint64_t>(setRenderingStateChangedCallback)
376 0 : << "\n ms_MuseSampler_set_score_id - " << reinterpret_cast<uint64_t>(setScoreId)
377 0 : << "\n ms_MuseSampler_clear_online_cache - " << reinterpret_cast<uint64_t>(clearOnlineCache)
378 0 : << "\n ms_RenderProgressInfo2_get_next - " << reinterpret_cast<uint64_t>(getNextRenderProgressInfo)
379 0 : << "\n ms_MuseSampler_set_auto_render_interval - " << reinterpret_cast<uint64_t>(setAutoRenderInterval)
380 0 : << "\n ms_MuseSampler_set_lazy_render - " << reinterpret_cast<uint64_t>(setLazyRender);
381 0 : }
382 :
383 : ms_get_instrument_list getInstrumentList = nullptr;
384 : ms_get_matching_instrument_list getMatchingInstrumentList = nullptr;
385 : ms_InstrumentList_get_next getNextInstrument = nullptr;
386 : ms_Instrument_get_id getInstrumentId = nullptr;
387 : ms_Instrument_get_name getInstrumentName = nullptr;
388 : ms_Instrument_get_category getInstrumentCategory = nullptr;
389 : ms_Instrument_get_pack_name getInstrumentPackName = nullptr;
390 : ms_Instrument_get_info_json getInstrumentInfoJson = nullptr;
391 : ms_Instrument_get_vendor_name getInstrumentVendorName = nullptr;
392 : ms_Instrument_get_musicxml_sound getMusicXmlSoundId = nullptr;
393 : ms_Instrument_get_mpe_sound getMpeSoundId = nullptr;
394 : ms_Instrument_get_reverb_level getReverbLevel = nullptr;
395 :
396 : ms_Instrument_get_preset_list getPresetList = nullptr;
397 : ms_PresetList_get_next getNextPreset = nullptr;
398 : ms_MuseSampler_create_preset_change createPresetChange = nullptr;
399 : ms_MuseSampler_add_preset addPreset = nullptr;
400 : ms_get_text_articulations getTextArticulations = nullptr;
401 : ms_MuseSampler_add_track_text_articulation_event addTextArticulationEvent = nullptr;
402 : ms_get_drum_mapping getDrumMapping = nullptr;
403 :
404 : ms_MuseSampler_create create = nullptr;
405 : ms_MuseSampler_destroy destroy = nullptr;
406 :
407 : std::function<bool(ms_MuseSampler ms, double sample_rate, int block_size, int channel_count)> initSampler = nullptr;
408 :
409 : ms_MuseSampler_add_track addTrack = nullptr;
410 : ms_MuseSampler_finalize_track finalizeTrack = nullptr;
411 : ms_MuseSampler_clear_track clearTrack = nullptr;
412 :
413 : ms_MuseSampler_add_track_dynamics_event_2 addDynamicsEvent = nullptr;
414 : ms_MuseSampler_add_track_pedal_event_2 addPedalEvent = nullptr;
415 : std::function<bool(ms_MuseSampler ms, ms_Track track, const NoteEvent& ev, long long& event_id)> addNoteEvent = nullptr;
416 :
417 : ms_MuseSampler_is_ranged_articulation isRangedArticulation = nullptr;
418 : ms_MuseSampler_add_track_event_range_start addTrackEventRangeStart = nullptr;
419 : ms_MuseSampler_add_track_event_range_end addTrackEventRangeEnd = nullptr;
420 :
421 : ms_MuseSampler_add_pitch_bend addPitchBend = nullptr;
422 : ms_MuseSampler_add_vibrato addVibrato = nullptr;
423 :
424 : ms_MuseSampler_add_track_syllable_event_2 addSyllableEvent = nullptr;
425 :
426 : std::function<bool(ms_MuseSampler ms, ms_Track track, ms_AuditionStartNoteEvent_5)> startAuditionNote = nullptr;
427 : ms_MuseSampler_stop_audition_note stopAuditionNote = nullptr;
428 : ms_MuseSampler_add_audition_cc_event addAuditionCCEvent = nullptr;
429 :
430 : ms_MuseSampler_start_offline_mode startOfflineMode = nullptr;
431 : ms_MuseSampler_stop_offline_mode stopOfflineMode = nullptr;
432 : ms_MuseSampler_process_offline processOffline = nullptr;
433 :
434 : ms_MuseSampler_ready_to_play readyToPlay = nullptr;
435 :
436 : ms_MuseSampler_set_position setPosition = nullptr;
437 : ms_MuseSampler_set_playing setPlaying = nullptr;
438 : ms_MuseSampler_process process = nullptr;
439 : ms_MuseSampler_all_notes_off allNotesOff = nullptr;
440 :
441 : ms_reload_all_instruments reloadAllInstruments = nullptr;
442 :
443 : ms_set_logging_callback setLoggingCallback = nullptr;
444 : ms_MuseSampler_set_rendering_state_changed_callback_2 setRenderingStateChangedCallback = nullptr;
445 :
446 : ms_MuseSampler_set_score_id setScoreId = nullptr;
447 : ms_Instrument_is_online isOnlineInstrument = nullptr;
448 : ms_RenderProgressInfo2_get_next getNextRenderProgressInfo = nullptr;
449 : ms_MuseSampler_set_auto_render_interval setAutoRenderInterval = nullptr;
450 : ms_MuseSampler_trigger_render triggerRender = nullptr;
451 : ms_MuseSampler_clear_online_cache clearOnlineCache = nullptr;
452 : ms_MuseSampler_set_lazy_render setLazyRender = nullptr;
453 :
454 : private:
455 0 : void* libFunc(const char* funcName)
456 : {
457 0 : return muse::getLibFunc(m_lib, funcName);
458 : }
459 :
460 0 : static std::string initResultToString(ms_InitResult result)
461 : {
462 0 : switch (result) {
463 0 : case ms_InitResult_OK: return "OK";
464 0 : case ms_InitResult_ProtectionRejected: return "ProtectionRejected";
465 0 : case ms_InitResult_ConfigurationMissing: return "ConfigurationMissing";
466 0 : case ms_InitResult_ConfigurationUnreadable: return "ConfigurationUnreadable";
467 0 : case ms_InitResult_ConfigurationInvalid: return "ConfigurationInvalid";
468 0 : case ms_InitResult_InstrumentMapMissing: return "InstrumentMapMissing";
469 0 : case ms_InitResult_ReceiptMissing: return "ReceiptMissing";
470 0 : case ms_InitResult_ReceiptRejected: return "ReceiptRejected";
471 0 : case ms_InitResult_DatabaseOpenFailed: return "DatabaseOpenFailed";
472 0 : case ms_InitResult_InstrumentMapReadFailed: return "InstrumentMapReadFailed";
473 0 : case ms_InitResult_NoInstalledInstruments: return "NoInstalledInstruments";
474 0 : case ms_InitResult_NoUsableInstruments: return "NoUsableInstruments";
475 : }
476 :
477 0 : return std::to_string(static_cast<int>(result));
478 : }
479 :
480 : std::function<std::variant<ms_InitResult, ms_Result>()> initLib = nullptr;
481 : ms_deinit deinitLib = nullptr;
482 : ms_disable_reverb disableReverb = nullptr;
483 :
484 : MuseSamplerLib m_lib = nullptr;
485 : Version m_version;
486 : int m_buildNumber = -1;
487 : };
488 :
489 : using MuseSamplerLibHandlerPtr = std::shared_ptr<MuseSamplerLibHandler>;
490 : }
|