MTS-ESP Tuning Tool by Oddsound and Aphex Twin

Look forward to trying it out! :alien:

Hope @Elektron is listening!

Elektron,
Please implement this single line of code into our lovely hardware/overbridge.

I’ll give you a kiss if you do :slight_smile:

1 Like

For someone who’s always been interested in micro tuning - then spent one afternoon looking at Scalia and realised how out of their depth they are - do you get the sense that this will be a good way to get into making micro tonal music?

Is this your app? Sounds pretty good!

1 Like

Yes! Thank you. I’m very proud of it.

3 Likes

Oli from ODDSound here. This is really awesome news, big thanks! LION is great fun, I’ve been tuning it with MPE and it works nicely but to have native MTS-ESP support will be perfect. Drop us an email when the update is live and we’ll make sure it is added to the list of MTS-ESP compatible synths on our site.

3 Likes

The Moog documentation says that the Matriarch will accept all MTS SysEx formats, so it should work nicely with our MIDI Client plug-in, even for dynamic retuning with single note messages. There is a Matriarch preset included with it.

True there is little support for MTS SysEx in plug-ins, which is why we introduced MTS-ESP…it’s like a software counterpart to MTS SysEx. Our hope is that as time goes on more developers will implement it and to this end we’ve kept the implementation cost as low as possible. But for everything else we are limited to pitch bend retuning, be it mono or poly if possible. At least this can now be globally controlled though!

3 Likes

MTS SysEx support in the A4 would be a great place to start…I would really love to see that.

1 Like

Do you require the user to set the effected plugin’s pitch bend range, or do you detect that yourself or rely on it being set to that plugin’s default? I’m asking because I normally set the pitch bend range to 1 semitone to make my algorithm work, but when I set Kontakt’s pitch bend range to 1 semitone (for example, for Brass Solo), the tuning is incorrect. If I leave Kontakt set at 2 semitones and cut my pitch bend in half, then the tunings are correct, so I suspect Kontakt’s pitch bend range setting isn’t exact enough for pitch bend retuning. Has anyoneused MTS-ESP with Kontakt?

Unfortunately we can’t detect a plug-in’s pitch bend range, it’s not really possible with any of the plug-in APIs, although would be nice! As a user you need to make sure the “Synth” pitch bend range in the MIDI Client matches the bend range in whatever you are retuning. You can set the range to whatever you like, just make sure it’s the same. If tuning sounds incorrect it may be because the bend range is not large enough to retune a note by the required amount. To counter this, set Retune Type to “Note+PB” in the MIDI Client, so that it uses a combination of note adjustment and pitch bend for retuning.

Kontak acoustic instrument samples’ pitch bend range defaults to 2 as far as I know. Can I ask you to do a quick experiment? Set a Kontakt instrument’s pitch bend range to 1, then see if MTS-ESP retunes it properly. If not, then that would verify that Kontakt’s “1 st” pitch bend range setting isn’t exactly 1 step.

Could also be something to do with the particular Kontakt script and sample set you’re using.

Here’s a little test…I resampled a 440Hz sine wave into Kontakt and mapped it with with root key A3. I set the pitch bend range in Kontakt to 1 semitone. As I advised in my post above I set the “Synth” bend range in the MIDI Client to match that in Kontakt and also set Retune Type to “Note+PB” (did you try these steps yet?). I loaded 7EDO in MTS-ESP Master and checked the retuning, you can see it lining up in the screenshot, Kontakt on the left.

1 Like

Thanks. I mentioned that I’m writing my own sequencer to implement microtuning, but I forgot that was in this other thread. I wrote it for my synth modules that support MTS, then I wanted to quickly try implementing the pitch bend trick for other synths and plugins. My implementation is tested with Spectrasonics Omnisphere and Trilian when I set a patch’s pitch bend range to 1 semitone, but for some reason setting the pitch bend range in Kontakt doesn’t produce the right frequencies. For Kontakt, I must halve the amount of pitch bend I send rather than halve Kontakt’s pitch bend range. I would expect those two methods to be equivalent, so I must have a bug.

I wouldn’t ask you, but MTS-ESP is open source. I’ve had a look at your code. Mine’s in Ruby, but I can see that figuring out what you’re doing in C is going to be rather a pain because I need a more “for dummies” style of code documentation, so I asked you instead. For example, I can’t even find the routine MTS_NoteToFrequency, which I’d really like to get a look at.

So it sounds like you want your sequencer to grab tuning data from MTS-ESP, i.e. to have it work as a client in the MTS-ESP system. There are two files you need for this, libMTSClient.h and libMTSClient.cpp. libMTSClient.h contains the function definitions and commented instructions on how to use them…that is where you’ll find the “dummies guide”, plus of course there’s the GitHub readme (GitHub - ODDSound/MTS-ESP: A simple but versatile C/C++ library for adding microtuning support to audio and MIDI plugins.). If you need any further info then I think I’ll need some more specifically focused questions. The function definitions are all in libMTSClient.cpp, that is where you will find the implementation of MTS_NoteToFrequency() and all other functions declared in libMTSClient.h. In reality you shouldn’t really need to go looking at them, unless you’re curious…or…are you planning on writing a Ruby port of the MTS-ESP Client API? Should be possible, Fiddle would be a help in that: GitHub - ruby/fiddle: A libffi wrapper for Ruby..

1 Like

No. I’ve already implemented MTS real-time retuning in my own sequencer. I was just curious to see how you do it compared to what I do. For example, I retune blocks of 16 notes at a time, creating and freeing up blocks as the sequencer plays so that the full 10+ octaves remain simultaneously available all the time. The 128 MIDI semitones cover about 320 notes in 31-EDO, so you have to dynamically allocate the re-tuning locations. I wonder how you do it.

Pitch bend has been an afterthought for me. Easy enough, but it’s weird that Kontakt won’t tune correctly unless I accept its default pitch bend range of 2. With Spectrasonics, Omnisphere and Trilian let me adjust pitch bend range, and then I have to compensate in my code. Keyscape doesn’t respond to pitch bend at all, so that’s also weird.

1 Like

MTS-ESP uses a single global tuning table of 128 frequencies. Dynamic tuning is up to a plug-in developer to implement and then they can update that frequency table accordingly, so that all connected clients will automatically follow along. That said, MTS-ESP does provide support for multi-channel mappings. Think of this as a table of up to 2048 frequencies, although with the concern that it requires a client to supply a MIDI channel when querying retuning for a given note. Some plug-ins may not be able to do this, so there always needs to be a table of 128 frequencies to fall back on in this case.

That’s quite a cool and inventive solution for getting more notes out of MIDI btw!

So you do bulk tuning dumps, not real-time?