On Dienstag, 19. Mai 2020 10:19:28 CEST rosea.grammostola wrote:
> If you edit a sfz file and load the edited file, LinuxSampler still acts
> on the previous version of the file it seems. Which is a quite
> frustrating workflow.

How exactly do you load the file? If the file is explicitly loaded on a 
sampler part by file name AND the file is not already used on another sampler 
part then the sampler should really load the latest file version.

Things are different if you have multiple samplers parts which are using the 
file, in this case the sampler detects that the file is already in use on 
another part and simply uses the one that's already loaded instead of loading 
the file again from disk.

The sampler might also behave like that if the file is not directly loaded, 
but instead indirectly by MIDI program change and MIDI instrument map. In this 
case it depends how the load strategy was defined in the instrument map's 
entry by you (e.g. "on demand", "on demand hold", "persistent") and of course 
as well whether the instrument is used on another part.

But you are right, that even in such cases (if the file is already loaded and 
in use), the sampler should check if there's a new version on disk (e.g. by 
comparing the file's mod time). That lacking detection is probably due to my 
personal preference of just using the gig engine, in which case Gigedit would 
be used for any instrument modifications; Gigedit always informs the sampler 
explicitly in real-time that certain parts of the file (and which parts 
exactly) had been changed and that the sampler should reload these parts.

> Same for the database update wait time. I've to restart Linuxsampler and
> Fantasia every time I update the database. :-\

Yes, that's currently definitely the case. The sampler currently does not 
automatically refresh the instruments DB automatically on external changes to 
files.

The sad truth is, there's currently no one actively taking care about the 
sampler's sfz engine. And that situation persists for several years now.

I am personally just using the gig engine and hence my entire focus is on this 
part of the sampler. I basically only handle odd fixes on sfz engine side. The 
only new features on sfz side usually appear these days if they are added to 
the common code shared by all 3 engines (gig, sfz, sf2) in which case they 
"popup for free" in all other engines.

On Montag, 18. Mai 2020 12:11:28 CEST rosea.grammostola wrote:
> Hi,
> 
> I've two sfz files. Both with a default_path. In the first Linuxsampler
> is totally okay with the file. In the second it says:
> 
> 
> Scheduling
> '/home/debian/linuxaudio/SFZ/kicks_pljones_D/bop/kd14_bop_snare_off_cls-D.sf
> z' (Index=0) to be loaded in background (if not loaded yet).
> Loading sfz instrument
> ('/home/debian/linuxaudio/SFZ/kicks_pljones_D/bop/kd14_bop_snare_off_cls-D.s
> fz',0)...OK Caching initial samples...sfz::Engine error: Failed to load
> instrument, cause:
> /home/debian/linuxaudio/SFZ/kicks_pljones_D/bop/~/linuxaudio/NDK/samples/kic
> ks/kd14bop/snare_off/cls/kd14bop_cls_001.wav: Can't get sample info: System
> error : No such file or directory.
> 
> 
> It seems to search for a relative path, even if default_path is set.

If there's really a problem in detecting relative vs absolute path here, then 
it should be easy to fix. The relevant code that handles this is exclusively 
in src/engines/sfz/sfz.cpp and there are just 2 small code sections which 
handle this:

1. [line 1414]

        else if (token == "<control>")
        {
            _current_section = CONTROL;
            default_path = "";
            octave_offset = 0;
            note_offset = 0;
        }


2. [line 1480]

        // sample definition
        if ("sample" == key)
        {
            // handle built-in sample types ...
            if (value == "*silence") {
                pCurDef->sample = value;
                return;
            } else if (value.length() >= 1 && value[0] == '*') {
                std::cerr << "Unknown or unsupported built-in sample type '" 
<< value << "'!" << std::endl;
                return;
            }

            // handle external samples ...
            std::string path = default_path + value;
            #ifndef WIN32
            for (int i = 0; i < path.length(); i++) if (path[i] == '\\') 
path[i] = '/';
            bool absolute = path[0] == '/';
            #else
            bool absolute = path[0] == '/' || path[0] == '\\' ||
                (path.length() >= 2 && isalpha(path[0]) && path[1] == ':');
            #endif
            if (!absolute) path = currentDir + 
LinuxSampler::File::DirSeparator + path;
            if(pCurDef) pCurDef->sample = path;
            return;
        }

        // control header directives
        else if ("default_path" == key)
        {
            switch (_current_section)
            {
            case CONTROL:
                default_path = value;
                break;
            default:
                ; // noop
            }
            return;
        }

So you can easily add debug messages to find out what's going on.

CU
Christian




_______________________________________________
Linuxsampler-devel mailing list
Linuxsampler-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxsampler-devel

Reply via email to