Sf2Xrni


(atsushieno) #1

Hello,

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.

Your feedback is appreciated :)


SF2 support?
(hotelsinus) #2

Interesting idea, indeed.
But i dont want to convert tonz of my SF2’s ot XRNI.

The good way is we can load SF2 or REX files to Renoise. Just like EnergyXT2 latest update can do this!


(Djeroek) #3

rex file support would mean multiple markers in the sample editor = very probable beatslicer implementation as well :drummer: +1

Never have used sountfonts, what is the benefit over normal .wavs?


(Conner_Bw) #4

Not the feature request forum?


(atsushieno) #5

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.)


(Khades) #6

i’d try to use that tool for my soundfont library, but if it would work i would be happy

thanks for tools anyway


(unaHm) #7

Is there a pre-compiled version of this tool available? I’ve tried to follow the installation instructions, but am unsure how to get it to work.


(atsushieno) #8

Yes, there is a link to “Download” dialog. The latest archive contains both .exe and README.


(unaHm) #9

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.

Thanks for your help!


(atsushieno) #10

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 :confused: so I will have to make them up to date too.


(unaHm) #11

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! :)


(atsushieno) #12

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.


(unaHm) #13

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 ( _ )?

I hope that helps!


(atsushieno) #14

Thanks for the feedback!

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.


(unaHm) #15

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 :slight_smile:

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?


(atsushieno) #16

Oops, I found that it was bad to have blindly updated NRenoiseTools.dll without any changes. I had to fix one thing to get converter working fine.

Please download 0.1.6 package. I verified the resulting samples sound fine on renoise 2.7.

Thanks for the report :)


(unaHm) #17

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 http://learjeff.net/sf/sf.html), but so far the instrument loads into Renoise like this:

I hope that helps - we’re getting close to having this tool fully functional!


(atsushieno) #18

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 :)


(unaHm) #19

No worries, and thanks for the update! :)

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:

At the moment, sf2xrni seems to be considering only the first layer that it comes across, which is good, but not a direct translation :)

I hope it’s not too much more code to assign the keyzones correctly! :)


(atsushieno) #20

Hi again,

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.