How to pitchbend with the pitch wheel in the MIDI Helper Tool?

The whole subject of pitchbends is a little bit confusing for me. I would like to construct Song Parts in GP where a pitch bend happens in a certain Song Part. I have read that for a quarter bend you need
MSB = 80 and MSB = 0
So I tried that and in order to have gradual pitch bend I made a song part which goes from MSB = 64 which is supposed to be no pitch bend to MSB = 80 which should be a quarter pitch bend.
But somehow this isn’t working. What am I doing wrong. I got the impression that the effect I have now is that the note whichever it might be - let’s say a C - sounds directly a quarter note higher, but this is not what I am trying to achieve.

MSB = 64 is indeed the center value (no pitchbend), but I think if you want to have a lower sound you need a lower pitchbend value, not a higher one.

All of those messages will be sent almost simultaneously. I don’t think you will achieve a gradual pitchbend in this way.

2 Likes

I know that GP has a MIDI File Player where it would be relatively easy to insert a measure with a gradual pitch change, but I have a very exotic workflow/setup because I am using Guitar Pro as my “Poor man’s DAW”. Guitar Pro doesn’t send MIDI Time Clock. I use simple MIDI Note ONs on a MIDI Channel in Guitar Pro reserved for Program Changes to trigger Program Changes in GP. So maybe I would have to use the same approach to use MIDI Note ONs send them to GPs MIDI Transformer and transform the MIDI Notes into Pitch Bend Data. The problem is only that I will need a lot of single commandos to achieve a typical gradual Pitch Bend. So I wish there would be an easier way, but I guess not, because with my setup in can not sync GP with Guitar Pro. Otherwise I guess GPs internal MIDI File Player would be a better approach in order to achieve Pitch Bends or are there any magic widgets or something like that which could be helpful in such a scenario?

This is probably the kind of thing that would be better implemented with a scriptlet that could generate a range of pitchbend values over some defined time period

Does such a kind of scriptlet exist?

I had a look at the MIDI Monitor to see what happens if I have a pitch bend in the notation of Guitar Pro. Guitar Pro is sending Pitch Wheel Data as you can see in the screenshot. As VST in Guitar Pro I use for this test Falcon. The problem is that Falcon is not responding to this Pitch Wheel Data. I don’t know if there is a way to make Falcon or another Synth VST really interpreting this Pitch Wheel Data correctly so that you can hear an actual Pitch Bend. I hope this doesn’t sound to confusing.

Not really – here’s a hack I just created to show how it could be done but this should be considered a starting point — probably not usable as is – I regret I don’t have time to create a polished all-encompassing version.

PitchBendGenerator.gig (90.5 KB)

Thank you. I understand, but could you maybe explain this a little bit. How is this supposed to work?

Maybe Auto Mover can be useful here: [Gig] Auto move - timer based

1 Like

Thank you. I will have a look at this. As another option I wonder if there is a way to transform the pitch wheel input (which is generated by Guitar Pro and which doesn’t look so bad) into a real pitch bend sound within Gig Performer. This would be also useful because the other option to transform Note ONs from Guitar Pro into Pitchbend doesn’t work because the MIDI Filter doesn’t offer this. It transforms only CCs.

When I adjust in Falcon the pitch bend range from 2 semitones to 12 semitones it seems that the pitch wheel input from Guitar Pro is interpreted correctly by Falcon. I still have to verify this in a more profound way, but on the first glance it seems that I am on the right track.

Hi,
Your PitchBendGenerator.gig

const
   MinPitchBendValue : integer = 0
   MaxPitchBendValue : integer = 16383
   CenterPitch : integer = 8192

var
   StartPitch : parameter MinPitchBendValue  .. MaxPitchBendValue = CenterPitch
   StopPitch : parameter MinPitchBendValue  .. MaxPitchBendValue = CenterPitch + 100
   
   TimeInMS : parameter 10 .. 5000 = 500
   
   Trigger : parameter 0 .. 1 = 0
   
   
  r : Ramp
   
   
  lastValueSent : integer = -99999
  
function Go()
        StopOneShotRamp(r)
        TriggerOneShotRamp(r, TimeInMS , 50)

end
   
   // Called when a parameter value has changed
On ParameterValueChanged matching Trigger
    
   if Trigger > 0
      then
        Go()
        Trigger = 0
   end     
    
End

On GeneratorEndCycle(time : integer) from r
End  

// Called by function generators as time passes
On GeneratorRunning(timeX : integer, timeY : double) from r
    
   var
      newValue : integer = Round(Scale(timeX, 0, TimeInMS, StartPitch, StopPitch))
      newPitchMessage : PitchBendMessage = MakePitchBendMessage(newValue)
      
   if newValue != lastValueSent
      then
          SendNow(newPitchMessage)
          lastValueSent = newValue
   end       
    
End

How can this be altered so that when a note is played, a pitchbend happens?

Thanks!!

Just add

On NoteOnEvent(m : NoteMessage) 
    Go()    
End

to the scriptlet.

Also block unhandled messages and then connect like so

image

image

The Note that the script ends on is slightly out of tune every time it’s triggered!

Well yeah - you’re sending a sequence of pitch bends - what were you expecting?

Is there a way to have a triggered note ramp up to the expected pitch?

What is the “expected” pitch?

Well, say you want the pitch to ramp up to c4. Can a ramp start 2 or 3 octaves below that and end up on C4? (I REALLY appreciate your time. Many thanks)

Did you not look at the parameters for the scriptlet? You can set a StartPitch and a StopPitch value.

screenshot_7942

As for the note being slightly out of tune when it starts, that’s probably because the note was sent out before the pitch was reset.

Try the following instead.
Replace that On NoteOnEvent with this version

On NoteOnEvent(m : NoteMessage) 
var
    newPitchMessage : PitchBendMessage = MakePitchBendMessage(StartPitch)
    SendNow(newPitchMessage);
    SendNow(m)
    Go()    
End

Turn off the Block unhandled messages.

Then just use this connection

screenshot_7941