From 37b5c3b1bc8682b4a6e4c402a4d3e9798653fc08 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sun, 7 Mar 2021 17:40:05 +0100 Subject: [PATCH] Add importer support in plugins --- plugins/editor/src/editor/Editor.cpp | 9 +++++++++ plugins/lv2/sfizz.cpp | 21 ++++++++++++++++++++- plugins/vst/SfizzVstProcessor.cpp | 15 +++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index 71ae9d20..9a6568c5 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -1069,6 +1069,15 @@ void Editor::Impl::chooseSfzFile() fs->setTitle("Load SFZ file"); fs->setDefaultExtension(CFileExtension("SFZ", "sfz")); + // also add extensions of importable files + fs->addFileExtension(CFileExtension("WAV", "wav")); + fs->addFileExtension(CFileExtension("FLAC", "flac")); + fs->addFileExtension(CFileExtension("OGG", "ogg")); + fs->addFileExtension(CFileExtension("MP3", "mp3")); + fs->addFileExtension(CFileExtension("AIF", "aif")); + fs->addFileExtension(CFileExtension("AIFF", "aiff")); + fs->addFileExtension(CFileExtension("AIFC", "aifc")); + std::string initialDir = getFileChooserInitialDir(currentSfzFile_); if (!initialDir.empty()) fs->setInitialDirectory(initialDir.c_str()); diff --git a/plugins/lv2/sfizz.cpp b/plugins/lv2/sfizz.cpp index 01ab0224..16084aa5 100644 --- a/plugins/lv2/sfizz.cpp +++ b/plugins/lv2/sfizz.cpp @@ -34,6 +34,8 @@ #include "sfizz_lv2.h" +#include "plugin/ForeignInstrument.h" + #include #include #include @@ -1173,6 +1175,8 @@ sfizz_lv2_update_file_info(sfizz_plugin_t* self, const char *file_path) static bool sfizz_lv2_load_file(sfizz_plugin_t *self, const char *file_path) { + bool status; + char buf[MAX_PATH_SIZE]; if (file_path[0] == '\0') { @@ -1180,7 +1184,22 @@ sfizz_lv2_load_file(sfizz_plugin_t *self, const char *file_path) file_path = buf; } - bool status = sfizz_load_file(self->synth, file_path); + // bool status = sfizz_load_file(self->synth, file_path); + + /// + const sfz::InstrumentFormatRegistry& formatRegistry = sfz::InstrumentFormatRegistry::getInstance(); + const sfz::InstrumentFormat* format = formatRegistry.getMatchingFormat(file_path); + + if (!format) + status = sfizz_load_file(self->synth, file_path); + else { + auto importer = format->createImporter(); + std::string virtual_path = std::string(file_path) + ".sfz"; + std::string sfz_text = importer->convertToSfz(file_path); + status = sfizz_load_string(self->synth, virtual_path.c_str(), sfz_text.c_str()); + } + + /// sfizz_lv2_update_file_info(self, file_path); return status; } diff --git a/plugins/vst/SfizzVstProcessor.cpp b/plugins/vst/SfizzVstProcessor.cpp index d2d308f3..3701d13f 100644 --- a/plugins/vst/SfizzVstProcessor.cpp +++ b/plugins/vst/SfizzVstProcessor.cpp @@ -9,6 +9,7 @@ #include "SfizzVstState.h" #include "SfizzVstParameters.h" #include "SfizzFileScan.h" +#include "plugin/ForeignInstrument.h" #include "base/source/fstreamer.h" #include "pluginterfaces/vst/ivstevents.h" #include "pluginterfaces/vst/ivstparameterchanges.h" @@ -621,8 +622,18 @@ void SfizzVstProcessor::receiveMessage(int delay, const char* path, const char* void SfizzVstProcessor::loadSfzFileOrDefault(sfz::Sfizz& synth, const std::string& filePath) { - if (!filePath.empty()) - synth.loadSfzFile(filePath); + if (!filePath.empty()) { + const sfz::InstrumentFormatRegistry& formatRegistry = sfz::InstrumentFormatRegistry::getInstance(); + const sfz::InstrumentFormat* format = formatRegistry.getMatchingFormat(filePath); + if (!format) + synth.loadSfzFile(filePath); + else { + auto importer = format->createImporter(); + std::string virtualPath = filePath + ".sfz"; + std::string sfzText = importer->convertToSfz(filePath); + synth.loadSfzString(virtualPath, sfzText); + } + } else synth.loadSfzString("default.sfz", defaultSfzText); }