Soundfont Editing for Wind Controllers

I know, – dry, bland title. I promise that the next one will be back to my usual, moderately witty appellations.

If you have followed my recording exploits, gentle reader, then you know about my continual search for more controlled expression of my instruments. The most detailed post so far is Control Freak, which documented using drawn-in continuous controller curves to modify the volume of the instrument. As mentioned in a later post, I did purchase the Yamaha WX-5 for this very purpose. I’ve been pleased with the results.

As background, let’s take a quick look at how I use my WX. My favorite instrument is Garritan’s Jazz and Big Band library. It responds natively to CC#2 (breath control), which makes playing it a lot of fun. I’ve been practicing the WX-5 mostly using the JABB library, playing along to tracks that I programmed into Band-in-a-Box. I especially like playing the various woodwinds in the library. I can enter a basic song in BIAB in about 5 minutes, choose an appropriate accompaniment, and I’m off. Certainly not ready for prime time, but boy does it make practicing more fun.

Another fun application is my Minimoog emulator, the freeware program Minimogue VA, which can learn any midi controller for any function. I map CC#2 to sustain level in the ADSR envelope and filter cutoff. Great fun and control.

Still, I need a wider variety of sounds for my recordings, especially ethnic and pre-baroque instruments. For this, I turn to soundfonts. If you are new to this blog, a soundfont is the proprietary format created by Emu and the Soundblaster folks to load custom sounds into their sound card. There are also a few software synths that will play back soundfonts, the most popular being Synthfont and sfz. Now, for all the myriad soundfonts available free on the Internet, they aren’t often  (try never) programmed to respond to breath control. I have recently gained some experience in soundfont programming in my quest to create a sampled djembe, and thought I would give it a shot.

There are two primary editors for soundfonts – Vienna, offered by Creative Technologies (the ones who wrote the spec and sell the soundblaster cards), and Viena, by the gent who wrote Synthfont. Both have their strengths, but Viena is still in beta, and the aspect of soundfont programming that I needed for this excersize is still a bit buggy. As a result, all my editing was done with the Vienna soundfont editor. I had some existing soundfonts that I downloaded and wanted them to respond to breath control.

I started with research, but I can’t believe how little there is on the web about soundfont programming. No one on any forums will engage me about the subject, and there are essentially two documents, the main one written over 10 (yes, TEN) years ago by a guy who doesn’t even use soundfonts anymore. That article is here, and another more recent web page is here. Neither article covers the very important subject of “modulators.”

Modulators, in Soundfont parlance, are the real-time controls of the sound. You can map any MIDI CC to any of about 20 parameters, including all the functions of the volume and filter envelopes. I finally figured it out, based mostly on the very brief and somewhat enigmatic material presented in the Vienna help file. Some day, if I get this all figured out, I need to publish a “Complete Guide to Soundfont Programming.”

Start by loading your soundfont into Vienna, and drill down on the Soundfont tree until you get to the instrument you want to edit and select “Global Zone.” Directly beneath the Soundfont tree is the modulator section. I resize the various panes (by dragging them around), until I can see everything I want to see. It should look something like this:

When all was said and done, I made two changes to the soundfont to get them to respond properly to breath control. First, I mapped CC#2 to the sustain level of the ADSR volume envelope. There are only two options to change – the shape of the curve and the amount. In soundfonts, and this is important, volume changes are all ATTENUATION, this means a reduction in volume. Therefore, as can be seen in the screenshot above, you need to assign a descending curve to the Primary Mapper.

I also played around a lot with the amount of modulation, and found that a surprisingly small 35.0 dB attenuation produced satisfactory results.

The next modulator is accompanied by some divergence of opinion. Key on Velocity is the primary method of controlling the volume of individual notes with a typical keyboard controller (unless you’re using Garritan products – more on that in a moment). The WX-5 can be set to send velocity based on breath pressure, or just send a value of 100 for every note. The standard thinking for wind controllers is leave it to that standard value of 100 (out of 127), and let the breath control (CC#2) do ALL your volume control.

That’s fine for many, maybe most, applications. However, the Garritan libraries are set up so that velocity does not control volume (at least for sustaining instruments), but rather the strength of the attack, and volume is controlled by CC#1 and 2 (mod wheel and breath control, respectively). This allows for intense, soft playing, or mellow, loud playing. For that reason, I don’t want to be switching my WX-5 back and forth between the two modes depending on which synth I’m playing. Also, the dip switch for making the change is a pain to switch.

So, it was incumbent upon me to make the patches respond appropriately to velocity. Here’s a Vienna screen shot of that modulator:

Again, the modulator is “Initial ATTENUATION”, so more modulator means less volume. Thus the descending curve again. Also, it doesn’t take much to make this controller have a significant effect, so 25 dB is plenty.

So far I’ve programmed two instruments with these modifications – an English Horn and an Oboe, both for a current piece I’m working on. I’ve played in both parts on the WX-5, and while the CC#2 data looks like a mountain range, the results are quite pleasing to the ear. I even left in some of the less dramatic clams in my playing to add to the realism.

Now that you know this, I challenge you to reprogram some of your own favorite soundfonts and play up a storm with your wind synth.

Production Diary, Soundfont Editing ,

6 responses to Soundfont Editing for Wind Controllers


  1. Nate

    Great info
    THanks for the contribution

  2. Jud

    Thanks for your effort here!

  3. ProDigit

    Do you think the program Awave studio could help you here a bit?

  4. Maybe, but I’ve moved to the sfz format from sf2 because I couldn’t find a soundfont player that would respond to the modulators. Thanks for reading!

  5. Martin

    Rob,

    thank you for this valuable information.
    I am currently struggling with the same topic, but in a slightly different configuration. I have a an older yamaha breath controller (WX11). I am using it together with an ipad/iphone as a tone generator. Pretty impressive so far. And nice to have a synth in your pocket.
    I have come across a layered saxophone soundfont. I would like to switch of velocity dependend attenuation as you have suggested, but it is driving me crazy. You are explaining quite well, but still it does not work for me.
    Do you have a sample of sound font that you have adapted to the use with WX5? Maybe then it is easier to understand. The IOS sample players I use are Thumbjamb (very easy to adjust to breath control, but does not allow importing sf2 or sfz) and Bismark bs-16i (very cool multitimbral sample player. Hello from Germany.

    • Rob

      Martin, thanks for taking the time to respond. As I mentioned in an earlier comment, I have switched from sf2 to sfz. It seems that I could get the soundfont to respond to modulators when I was playing it in the editor, but in all the of soundfont players that I used for actually recording the music they never worked! I’m not familiar with sfz players for iPad, but if you’re still curious then I can look into some sfzs when I get home tonight.

Leave a Reply

Your email address will not be published. Required fields are marked *