I’ve created a tool that converts EXS24/SFZ instruments to Tonverk’s multi-sample format (.elmulti) and wanted to share it with you.
It runs on Mac, Windows, and Linux - anywhere python3 and ffmpeg are available.
Since elmulti supports sample loops with crossfade, instruments created with Logic Pro’s Auto Sampler can be loaded directly into Tonverk!
Tonverk operates at 48kHz, so using the -R flag to resample will give you better results.
The -O flag fine-tunes Loop-Start/End points to avoid discontinuities in the waveform.
Please check the README for other options and limitations.
The repository also includes reverse-engineered .elmulti format specifications.
Hi, thanks so much for the utility!
I just tried the tool, but I get the “FAILED TO LOAD INSTRUMENT MULTIPLAYER SAMPLE ERROR” error, even though I can hear the preview in the multiplayer instruments list.
I can’t figure out why; everything seems fine.
For the conversion, I ran the suggested command: python3 elmconv.py MyInstrument.exs output/ -R -O, which ran successfully without errors.
Please note that the essential version of FFMPEG doesn’t work; you need to download the full version.
For this test, I used a JV1010 sf2 with 144 sounds, which I converted to sfz with ConvertWithMoss and finally to elmulti with your tool.
hello thanks for the tool it’s seems to be another invaluable tool to take advantage of the many tonverk perks.
note that there’s actually a regression in the latest os 1.2.0 that prevent loading some files and the playback of some files previously loaded with a project started on 1.10 from my side ; i created a support ticket to elektron and uploaded all my files ( samples + project + diagnoctic file created on tonverk) and i’m waiting for their answer. so it may be not the app that’s malfunctionning
Thank you for trying the tool and for your detailed report!
Regarding the FFMPEG essential version issue - that’s very helpful information.
I’ve added a note about this to the README in v1.0.1.
I’ve experienced similar issues in my testing where some converted files didn’t
work correctly on Tonverk, even though the WAV files themselves appeared correct
in Wavelab. This could be due to unknown Tonverk behavior, edge cases in my tool
(especially with large instruments like 144 samples), or possibly the regression
issue in Tonverk OS 1.2.0 mentioned in this thread.
If you happen to have the converted files handy (.elmulti and a few WAV samples),
feel free to share them here or on GitHub - it might help identify the cause:
I have already deleted the original ones, but I reconverted this one that I am attaching, from the sfz file that I used in the first instance anyway.
As an improvement suggestion: since there is still no way to catalog them or assign a tag or distinguish them from the factory or directly sampled ones, it would be handy to be able to rename the processed files with a prefix like “JV1010 - Agogo”, if we take into consideration the attached example.
In any case, from what I heard in the preview, aside from the loading error, the loop points also seem correct. I don’t hear any problems, except for the possibility of loading them into the track
Thanks irro94 for the bug report and for sharing Agogo!
I’ve identified and fixed the issue in v1.0.2. The problem was caused by some SF2→SFZ converters outputting end values using exclusive convention (end=sample_count) instead of SFZ’s inclusive specification (end=sample_count-1). This caused Tonverk to fail loading due to out-of-bounds sample positions.
Fix details:
trim-end: Now automatically omitted when out of bounds (file uses full length anyway)
loop-end: Clamped to valid range with warning message
To update, run git pull in yourelmconv directory, or download the latest release:
Regarding your suggestion about prefixing filenames (e.g., “JV1010 - Agogo”): that’s a great idea for organizing converted instruments! I’ll consider adding a --prefix option in a future update.
Thanks again for taking the time to report this issue and providing the test files - your feedback helped make elmconv better for everyone!
I just converted about 400 multisamples from various SF2 to SFZ, and everything seems perfect so far. No errors, it loads correctly!
I’ll test the results thoroughly later, but for now, I’m really happy.
Thanks again @Asatamax for this fantastic tool.
To cover the naming issue for now, if you use ConvertWithMoss, there’s a function that allows you to include the prefix with the source file name. With Bulk File Rename, I inserted the suffix I wanted, thus achieving what I suggested above. The only drawback is that if the file name contains the patch name, it will be repeated twice. For me, this isn’t essential and doesn’t seem to bother Tonverk.
Thanks for the suggestion! --prefix is now available in v1.0.3+
CLI only at the moment – no GUI planned yet, but I’m open to contributions if someone wants to build one! Basic usage is:
python3 elmconv.py input.exs output/
Woaw, this is clearly everything I’ve wanted for months. I have a ton of Sample From Mars SFZ files just waiting to be converted. However, I absolutely don’t understand anything since I’m not a programmer at all lol. Is there any interface/UI/software planned to allow noobs like me to use your software? At the very least, a video tutorial?
first of all, thank you for doing this.
i wanted to give you the following feedback:
i have converted 2 autosampled(logicEXS) pianoVSTs with the non GUIversion. after i found out how to install homebrew, ffmpeg and python it actually worked without problems and it also loaded fine on the TV.
but when i play it on the TV what happens is, that on some notes it plays back not normally but very silently, maybe the sample doesnt trigger at the very beginning so the attack is missing - that would be my guess from the sound, could be volume or something else. the feeling is that its randomly skipping notes.
i’ve also tried the GUIversion now, same result.
it definitely happens while converting with this tool, the EXS in logic is fine, and when i convert with the EXS2SFZ-App this is not a problem (but with that i still have the 41khzAIF-SFZ file and not the native 48khz-elmulti of course)
hope this helps,
happy tonverk to you!
I’ll need the EXS file to investigate this issue - could you share it here or via DM? Without it, I can’t determine what’s causing the problem.
One thing to note: Tonverk doesn’t support multi-samples with multiple layers triggering simultaneously. If your instrument uses velocity layers or round-robin samples that play together, that could explain the behavior you’re experiencing.
While converting Samples From MARS libraries, I noticed many instruments sample every note chromatically, which is inefficient for Tonverk. In practice, thinning out samples doesn’t significantly affect the sound quality.
So I’ve added a sample thinning feature that lets you reduce sample count by keeping every Nth pitch:
# Thin samples: keep 1 of every 3 (chromatic → C, D#, F#, A)
python3 elmconv.py MyInstrument.exs output/ --thin 3
# Preview thinning without converting
python3 elmconv.py MyInstrument.exs output/ --thin-preview 3
# Thin with safety limit (max 6 semitone interval)
python3 elmconv.py MyInstrument.exs output/ --thin 3 --thin-max-interval 6
This feature is also available in the GUI version
If you’re using an older version, please download the latest one.
Just finished testing your 1.1 and it works great!
One thing I would wish for is that, at least in windows, I get a DOS-window up for every sample processed and it gets closed fast. But during the conversion you can get 50 windows opening and closing and rendering your computer unavailable during conversion.
The first version this morning was kind of buggy (windows execute spam+very long)+ Sample cant be charged well 1/2. But your last version is just perfect. I’m making right now a pack with SFZ/Emulti i can find. I will share it.