Hi community !
With my breath controller, when I blow softly in my instrument, I kind of hear a lot of “granular” midi soup. It’s quite similar with pitch bend. It’s like if I can hear the continuous midi messages. On some VST, I can introduce a lag on these CC, like the pitch bend on Respiro from Imoxplus, or one value that I can choose on Diva from u-he. It smooths the value and removes perfectly any sound of “midi grain” but it’s limited as I can’t choose several parameters on which doing that.
Would it be possible to reproduce the same behaviour in a GP script?
What?! You can hear MIDI? There nothing to hear in MIDI messages. What do you mean?
I have to admit that I don’t understand much of what you are trying to explain. Could you please try to explain it a little differently, perhaps more clearly?
Ok, I know, it seems curious but it’s the only explanation I have. I don’t hear the midi itself, but the result of the rushing of midi messages, I’ll do a recording soon.
Good idea ! What makes me tell it comes from the midi messages is that the breath CC rate can be changed on my instrument and that I can hear these midi noises clearer when I set the breath on the minimum rate 63Hz. At the maximum 1000Hz, it’s thinner but still here
Here I made some test: I gently blow without tongue attack, like several short crescendo:
With this preset it’s not so audible, but on some others, when I’m really searching the purity of the sound, it’s annoying to finish a decrescendo with all this noise.
The same sound but with a 20db boost at 70Hz. Can you hear it?
The same as precedent but with the Breath CC message rate set to 125Hz in place of 500hz.
What I’m sure about is that the LAG modificator in DIVA vst solves the problem:
In the Manual, the definition of LAG is:“Slows down all changes in the mod source, e.g. makes square waves round”
I have the same kind of noise on pitch bend. It’s like if you can hear the increment although the scale is based on 127.
I’m also sure that the VST Respiro can solve that by adding a Smooth up and Smooth down time on the pitch bend. For exemple, with “10ms of smooth”: I can’t hear the noise anymore.
In the Respiro manual, this option is described as “You can adjust the speed for bend pitch changes using smooth up and smooth down. So, that small pitch errors due to unintended bite or lip movement on the wind controller can be reduced.”
And what are we supposed to hear or not hear? What is the correct sound? 125Hz is already really a lot of MIDI CC message and 500MHz is crazy. Do you really need these rates ? Isn’t it this two much for some VST synths?
If I understand well you hear what you call « noise » added to Diva and Respiro when using your breath controller? Could you ever use your breath controller with these VST without « noise » before?
I don’t know what’s really corresponding to 125Hz, but it’s the minimum. in the manual of my wind controller, it’s written that high breath rate (the maximum is 1000Hz) is particularly useful to explore special blowing technic like flutter-tongue.
To get back on my issue, I’ve recorded a little video so I can explain better. I found a typical preset on which the noise is more audible. Control A = breath. And I used to map it on the filter so the sound is morphed with the breath.
Any idea why this noise is tamed by this lag function? Any possibilities to reproduce that with a GP script?
Maybe it’s 2 different problems but I hear the same kind of “increments” noise with this pitch bend example in another VST. And same, with the smooth function, it disappears.
Hi I know exactly what your talking about because im also an EWI player.
your hearing the stepping of the breath control on either the filter or the pitch bend. Since the resolution of midi is fairly low 127 steps unless smoothed by the synth your will hear the “steps” of the parameters changing in an unpleasant way.
FOr me the solution has been finding synths that implement some smoothing. Sometimes it’s most notable with cc2 but less with aftertouch. Sometimes the problem can be overcome by routing the sound through a filter that has better smoothing capabilities. I use Surge and Pigments for this with Omnisphere for instance. I don’t see any widgets in Gig performer for this issue. I think it’s better to find synths that have some degree of smoothing in them. ones I like are Pigments lush2 zebralette 2 Surge Kontakt and some of the made for wind controller synths.
A simple MIDI control is 0-127 (fairly coarse) but I suspect what would be more appropriate, to first determine if the filter in the VST’s or hardware you are using supports 14 bit MIDI numbers (coarse/fine) controls. In this way you could then smooth the operation of the filter with a script from the coarse only input.
Smoothing could be applied to a single 7 bit value but if you are already hearing the 1 bit changes it will not do a lot to improve things.
If I get chance I will have a look over the weekend.
Hello @seamus and @Spav !
Thanks a lot for your answers, It’s apparently an issue that midi wind instrument players are concerned with ! I barely learned the existence of 14 bit Midi. What I understand is that breath controllers deserve a higher number of “steps” than 127.
I’ll invite Aodyo, my instrument maker and Rudy from Respiro to look at this matter.
As Respiro is a dedicated wind instrument VST, I wouldn’t be surprised that the breath curve already integrate smoothing.
This is the answer from Rudy, the mastermind of the VST Respiro:
Respiro is using internal smoothing to remove the midi stepping (0-127) effect on sounds. Some sounds are more sensitive to steps this is because the way the underlaying design of the sound.
Respiro does also offer hi-res breath input… this helps to remove the steps…
With Respiro you can also “slow down” the attack of breath pressure and this should also remove the impact of midi stepping.
Respiro allows you to adjust the shape of the breath curve. Changing the shape of this curve will interpolate (map) the incoming breath CC to a new internal value and making the sound respond faster or slower… you can also create S shapes
The manufacturer of the wind-controller has to deal with several challenges
finding the optimal zero-point of the breath sensor
dealing with drifting of the zero-point due to temperature
dealing with noise signal (small spikes) on the breath sensor
selecting the appropriate ADC convertor to translate the analog signal of the breath sensor to digital input… most go for 10bit ADC this means that the firmware has to translate the pressure input from 0-1024 to 0-127. When using 12bit ADC then the signal is more sensitive but the noise range is also increasing.
implementing the correct ramp-up/down of the breath cc using a good smoother code - I see in your example that the sylphyo creates steps of 5 when blowing soft…that might create auditable impact on sensitive synths. I think there are ways to adjust the breath curve on the sylphyo… give it a try…
synchronise other CC’s that depend on breath pressure. Some wind-controllers can send AT CC07 CC11 and CC02 at the same time… it is important that the firmware of the wind-controller ensures that these produce the same value otherwise this can confuse synths.
Maybe try to connect the Sylphyo directly instead of via the link… this way you are sure you do get the fastest input…
Here is a scriptlet that may be what you are looking for. It provides an exponential output from the incoming MIDI CC message. Using the defaults will allow this to just be inserted into the midi input chain to the VST.
var
delay ("Delay/Lag") : Subrange Parameter 0..127 = 0;
cc_input ("Input from CC#") : Subrange Parameter 0..127 = 2 // Breath controller input
cc_coarse ("Output coarse CC#") : Subrange Parameter 0..127 = 2 // Breath controller coarse
cc_fine ("Output fine CC#") : Subrange Parameter 0..127 = 0 // Breath controller fine
filter : double = 0.0
ratio : double = 0.0
target : integer = 0
Initialization
SetInfoMessage("Delay/Lag a CC message from an input CC message to an output CC message. " +
"The output message can be a MIDI 7 or 14 bit value defined as coarse and fine messages. " +
"For 7 bit only messages, the fine output should be set to zero." )
SetDisplayMessage("Delay/Lag v1.00 - @Spav")
// Set the filter ratio
ratio = (128.0 - delay) / 128.0
SetTimersRunning(true)
End
// Called when a parameter value has changed
On ParameterValueChanged matching delay
ratio = (128.0 - delay) / 128.0
//Print("Ratio " + ratio)
End
//Called when a CC message is received
On ControlChangeEvent(m : ControlChangeMessage)
// Check the CC input is the assigned one
If cc_input <> 0 and cc_input == GetCCNumber(m) then
target = GetCCValue(m)
target = target + (target << 7)
//Print("Target " + target)
End
End
// Run Delay/Lag Processing
var lastF : integer = -1
lastMs : double = 0
On TimerTick(ms : double)
var f : integer
if ms > (lastMs + 1.0) then
lastMs = ms
filter = filter - (filter * ratio)
if filter < 0 then
filter = 0
end
filter = filter + (IntToFloat(target) * ratio)
f = Round(filter)
if lastF <> target then
// Only send midi messages when the value changes
if lastF <> f then
if cc_fine <> 0 then
SendNow(MakeControlChangeMessage(cc_fine,(f and 0x7F)))
end
if (cc_coarse <> 0) and (lastF >> 7) <> (f >> 7) then
SendNow(MakeControlChangeMessage(cc_coarse,(f >> 7)))
end
lastF = f
end
end
//Print("Input "+ms)
end
End
To use this, add a scriptlet to the rackspace and load the script above.
The plugin has four parameters, they should be fairly self explanatory. The default values are already defined for MIDI breath controllers. The output can be sent to other CC# pairs.
This is the test rackspace I used. From the knob widgets you can set the four parameters of the scriplet. The slider allows me to send test data. Practically just the delay widget should be the only one required.
I added a switch to the test to apply a change of 5 to mimic a small step change the monitor output shows the intervening steps being applied. However the filtering is limited to the On TickTimer callback, this seems to be 100mS on my PC.
I haven’t tested it. Did someone test with an ewi? I use pigments or surge xt with audio in for synths that don’t have the right feel (response/lag etc)
Looking at the filter frequencies in the comment above I am guessing the Hz figures refer to the internal filter on the control signal. If this is the case without a filter in the VST, the script above will give the same effect as a 5Hz internal filter. I have built a rough VST version in Plug Data that is running at 500Hz, but it is a little CPU heavy and uses up to 50% of the available MIDI bandwidth, but I suspect this version will work as you expect and a fully compiled version may be a little lighter on the CPU.
Excellent example it to as very easy to understand the meaning of your post. I’m also an Akai EWI Solo, and Yamaha Wx7 player. Your post has been very helpful.
Thank you