I have created a simple soundfont-to-xrni conversion utility. While the new VST Grabber would fill lots of such SoundFont need, I guess this converter would be still useful for some uses.
The converter is rather a hack, far from well designed and perfect (I’m very new to both soundfont and renoise land, haven’t written any songs yet). I tried only a few sf2 files, but it looks working in general.
If any of you are interested, please give it a try. sf2xrni is at:
It is based on NAudio and NRenoiseTools (binaries are included in the project files). You’ll need .NET Framework 3.5 or Mono to run it.
Thanks guys, nice to know that it attracted some interests
Yeah, sf2xrni wouldn’t help if you have a lot of sf2 files with not too many storage space.
As for my own purpose for sf2xrni: I wanted to try out several soundfonts with renoise’s own tone selector UI, not through VST plugin (which was not very efficient as far as I tried; I have to open a program/bank selector UI, close, and then test its sound, instead of a few clicks). Converting them into .xrni was easier.
SF2 and XRNI are different in data structures. Basically sf2 has a set of instruments (unlike xrni for an instrument) and many (I’d say, too many) features than whatever Renoise supports. So, supporting SF2 in Renoise itself would require not a few works (functionality-wise and UI-wise), and I’m not sure if it is a good idea to put it to the stack of the requested features. (I also think there was the same feature idea earlier in this forum, and not many people were for that.)
Thanks atsushieno. However, when I run the program from the command line, I get the following output:
E:\Samples\sf2xrni "12.5mg GM Bank"
Unhandled Exception: System.BadImageFormatException: Could not load file or asse
mbly 'NAudio, Version=1.3.9.0, Culture=neutral, PublicKeyToken=null' or one of i
ts dependencies. An attempt was made to load a program with an incorrect format.
File name: 'NAudio, Version=1.3.9.0, Culture=neutral, PublicKeyToken=null'
at Commons.Music.Sf2Xrni.Sf2Xrni.Import(String file, String filter)
at Commons.Music.Sf2Xrni.Driver.Main(String[] args)
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\M
icrosoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure lo
gging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fus
ion!EnableLog].
What am I missing? I have all of the files included in the zip file, plus the soundfont is in the same directory, which I hoped would have made things easier on the program.
Oh, indeed. Thanks for the details. I got the same exception when running on .NET. I always ran it with mono (as I am an insider , so I didn’t notice that.
I could get sf2xrni working by recompiling the sources with .NET 3.5. I pushed the latest build on the download page, so please retry with the latest one.
This tool was written in .NET 2.x runtime era and when I had x86 machine, so I wasn’t even aware of 64bit-ness issue. NRenoiseTools has also been updated to deprecate my sources so I will have to make them up to date too.
Thanks for taking the time to fix this! I’m looking forward to trying it out, but unfortunately GitHub won’t let me download the new version you’ve compiled (it complains about an Access Denied error).
I didn’t expect really to have any issues on the machine I’m using as it’s Windows 7 32-bit, but then if they’ve been updating the libraries on you that’s bound to break something!
Hmm, I was also getting Access Denied. I’ve deleted and uploaded the archive again and confirmed the new download works. So, please retry. Sorry for inconvenience.
Thanks atsushieno! I’ve been trying the program out with a number of different soundfonts, and for the most part things seem to be going well - it’s certainly a lot quicker than converting the soundfonts manually!
I’ve come across a couple of instances where some errors have popped up. The first one is:
Unhandled Exception: System.ArgumentOutOfRangeException: startIndex cannot be la
rger than length of string.
Parameter name: startIndex
at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length,
Boolean fAlwaysCopy)
at NRenoiseTools.Instrument.Save(Stream xrniOutputStream)
at Commons.Music.Sf2Xrni.Sf2XrniStreamingConverter.OnXrniCreated(Instrument x
rni)
at Commons.Music.Sf2Xrni.Sf2Xrni.Import(String file, String filter)
at Commons.Music.Sf2Xrni.Driver.Main(String[] args)
and the second is:
Unhandled Exception: System.IO.EndOfStreamException: Unable to read beyond the e
nd of the stream.
at System.IO.__Error.EndOfFile()
at System.IO.BinaryReader.FillBuffer(Int32 numBytes)
at System.IO.BinaryReader.ReadUInt32()
at NAudio.SoundFont.SampleHeaderBuilder.Read(BinaryReader br)
at NAudio.SoundFont.RiffChunk.GetDataAsStructureArray(StructureBuilder s)
at NAudio.SoundFont.PresetsChunk..ctor(RiffChunk chunk)
at NAudio.SoundFont.SoundFont..ctor(String fileName)
at Commons.Music.Sf2Xrni.Sf2Xrni.Import(String file, String filter)
at Commons.Music.Sf2Xrni.Driver.Main(String[] args)
There is a third one I’ve experienced where sf2xrni will close whilst processing a soundfont, and that’s where illegal characters are used in the instrument/patch name (e.g. </|>) that can’t be translated into a filename. Could you add an exception handler in the program to replace those with an acceptable character such as an underscore ( _ )?
For those files, can you give me more infos, namely which soundfont did you try? Either posting here or emailing atsushieno@veritas-vos-liberabit.com would be great. They may be either bugs in sf2xrni tool, NRenoiseTool library (sf2xrni dependency) or NAudio library (this too).
Ah, didn’t notice that possibility. I’ve fixed this issue and pushed new download on github.
Ok, so for those of you who’ve been watching this thread, atsushieno has resolved a lot of the issues I was having problems with
Now the program runs, the next problem is getting Renoise to load in the XRNI files that sf2xrni has converted. At the moment I get an error in Renoise, saying:
I guess that sf2xrni will need to call a sample convertor (e.g. ffmpeg) to put the samples into the correct format. I haven’t searched, but is there a quick way to extract the samples from an XRNI file to see what format they’ve been saved in?
No worries - thanks for the update! I can confirm that the samples work in Renoise too.
One question that I thought of is that with the new Renoise Instrument format allowing for instruments with multiple layers per key, does this tool take that into account? For example, the jRhodes soundfont that I referred to earlier should have multiple velocity layers (I downloaded the 5 layered, unlooped version from learjeff.net), but so far the instrument loads into Renoise like this:
Oh, indeed. Actually I wanted this kind of usecase when I was hacking this tool for the first time, and this time I filled the missing parts that supports it. I have uploaded a new archive that contains this fix. Thanks again for the reproducible test
So here is what I get so far - using the jRhodes3 soundfont again as our test case, loading the soundfont into the sfzed soundfont editor we can see the five velocity layers for each key:
Today I dug in depth to my source, NRenoiseToools and NAudio, and found that this velocity-aware samples are available only after 2.7 - correct? NRenoiseTools supports only before 2.5 formats so it does not cover things like ‘SampleSplitMap’ element (which contains ‘VelocityStart’ and ‘VelocityEnd’ elements).
I’ll revisit sd2xrni source when NRenoiseTools supports 2.7-or-later format.