Script or Plugin to imitate Yamaha chord finger styles

Since we share a midi-keyboard with mini pc running gig performer in the band with different musicians, the “non-native keyboarders” would like to have it easy. Therefore, I am desperately searching for a way to simulate the Yamaha chord fingering styles. All plugins I could find only allow one key to chord translation…

Here is the wishlist (Lessons Home Page):

Single Finger

The simplest method is to use the single-finger approach. This is the SINGLE FINGER type. Using the single-finger method, you can easily play all major, minor, seventh, and minor seventh chords:

  • In this mode, you need only press a single key, the “root” value of the chord, as described above to trigger any major chord.
  • For a minor chord, you press two keys at once, the root key and a black key to the left of that root. For example, to signal the Em chord, you would press simultaneously the Eb1 (the first black key to the left of the E key) key and the E1 key .
  • For the seventh chord, simultaneously press the root key and a white key to its left. (E7 would be signaled by pressing simultaneously D1 and E1.)
  • For a minor seventh chord, simultaneously press the root key and both a white and black key to its left. (Em7 would require pressing D1 and Eb1 and E1 all at the same time.)

The Single-Finger method does not enable you to play a C major seventh (CM7) or C augmented (C+) or C major sixth (C6) or C diminished (Cdim) or C ninth (C9) chords. The single-finger method would work for very simple songs, but could not be used to play more modern tunes using fancier chords.

Fingered

In this mode, you play the individual notes of the chord in your left hand. At least three notes are needed to trigger a chord. For a C major chord, you would play C + E + G, pressing all three notes down at the same time. You do not have to play the chord with the root of the chord, in this case, a “C”, on the bottom. You could also signal the C major chord by playing different “inversions” of that chord, for example, E-G-C (the root of the chord is on top) or G-C-E (the root of the chord is in the middle). A C major seventh chord consists of the four notes C-E-G-B. You could signal a CM7 by playing those four notes in any inversion. (C-E-G-B, E-G-B-C, G-B-C-E, or B-C-E-G).

Multi Finger

The MULTI FINGER type automatically detects SINGLE FINGER or FINGERED chords, so you can use either type of fingering without having to switch fingering modes. I find this type, which is the default setting from the factory, cumbersome. If you try to finger a chord of 3 or more notes, but don’t hit all the keys at exactly the same time, any stray keystroke gets immediately interpreted as a single-finger chord and the accompaniment switches to that chord, which produces an undesirable accompaniment sound.

Any ideas?

1 Like

Take a teacher :wink:

Just kidding…

Maybe this could be a solution:

2 Likes

I really like to play my chords myself. :innocent:

Me too. Already recommended but was refused due to various “reasons”. So let’s focus on technical solutions as Yamaha also did with their keys :slight_smile:

As far as I could see, the Captain plugins also only allow one key to chord. Currently I am working with midiChordz from the plzMidi collection, but this also allows only one key to chord, unfortunately.

Maybe a solution could be scripting:
For example press C3 and in plzMidi you map it to a C major.
You press C3 and C#3 at the same time and now scripting plays C2 where you map a C minor.
You press C3 and B2 at the same time and now cripting plays C1 where you map a C major 7

The script is a little bit tricky but I could imagine that works.

@David-san our scripting magician: What do you think about?

Hum :sleeping: hmmm… hey, you just woke me up :stuck_out_tongue_closed_eyes:
I have got an algorithm in mind: let’s say you play C3, then Eb3 and G3 and you would get something close to a C minor? :thinking:

What if I would press B2 and C3, should I get a B minor? Or also a C major 7? :face_with_monocle:

Seriously, I really would learn the chords which is not that dificult I think. But if one prefer to learn only GPScript, perhaps that the lower key should be the “root” of the chord, the second higher key should stand for minor, the third one for 7th, and so on.

But you should perhaps accept a small (almost unnoticeable) delay for the GPScript to analyze what should be played. Programming this is perhaps not that immediate.

The first played not would decide.

When you play to notes together, what would be the first note played? (there will always be one)

There would be a timer necessary.
Play note, wait some time if there is a 2nd note.
Then decide what to play and clear both notes from the remembered cache
When there is no 2nd note within a time frame => play Major

But a then end:
C3 is mapped to C major
C2 is mapped to C minor
and C1 is mapped to C major 7

Would that be a solution @scientit ?

Or make an individual mapping for each song, so your collegues only have to play the white keys or even better the black keys :wink:

That’s the idea I had in mind, yes. Strum a chord and measure the timing between the notes, this would be the maxium time allowed to analyse the notes. In arrangers keyboard there is also a small delay (at least on the one I know).

From my point of view, determining a first note via timer is not needed. Look at the rules in section “Single Finger”. It seems that always the highest note played is considered the root note, let’s call it X.

Then you define two constant arrays, one containing note values of all white keys and one of note values of all black keys. Let’s call the second and the third note played, which are contained in one of these arrays, Y and Z.

Major:
If (only) X is pressed -> trigger X Major keys

Minor:
If X and Y is pressed AND Y is in array black keys AND Y is less than three semitones under X -> trigger X Minor keys

Major Seventh:
If X and Y is pressed AND Y is in array white keys AND Y is less than three semitones under X -> trigger X Maj-7 keys

Minor Seventh:
X,Y, Z pressed … rest too long to type here, just combine Major Seventh and Minor :smiley:

Does that make sense? This may be pretty close to how Yamaha implemented this.
Is this doable in GScript? That’s also why I asked whether there is already a plugin to do this :smiley:

Sure, but in scripting you get a callback for each note.
So when to detect that 2 or more keys are pressed at the “same” time.

Imagine you press C3 and a short time later C#3…
Should the C Major be played or not?

No, in this specific case C Major should be played first and be replaced by C# Major once C#3 is pressed.

While C3 is pressed?

What to do when you want to switch from Major to C Minor without retriggering C and G?
Sounds all very complicated.
I would map the keys to specific chords and the “Keyboard” has to remember which chord to play with which key.

No, my bad. Was just editing my answer but you were faster :smiley:
In the case a second note on appears it should be checked whether this matches one of the rules that I’ve mentioned above. Else it should default to C#

Is it possible to store Note on messages in an array and remove them on note off? With this you could always check the amount of simultaneously pressed notes.

Edit: I will definitely think about the single note to chord binding as an alternative.

With the note_tracker in scripting is possible to remember played notes.

If you play two notes which will be interpreted as a chord to be played, if you don’t use a timer than one of these two notes will be played just before the chord, which is not what I would expect.
Furthermore, if you play the three notes of a chord, the first note played will first be played as it is, then with the second note played the corresponding “two fingers” chord will be played, and finally stopped when the third notes that forms the chord will be analyzed.
Well there are several way of implementing this kind of function, but I am not sure I could come to the result I would expect without any timer.

I expect that the fellow musicians are not keyboard players (like me) and are comfortable playing legato pads. Correct?

Then it will be possible to press a modifier first and then the root when it matters.

I think if you designate the bottom octave as the modifier, that never sounds by itself, you can use it’s NoteOn message to set a global variable playMinor = True etc.

Then when the NoteOn message of the intended root note comes, these global variables are used to define the third, fifth and seventh. Remember the notes that were played, because there is a big chance that before the root is released the state of the modifier has been changed.

Summary

By choice: you can release the modifier as soon as the chord sounds, or you define Eb1 as minor E1 as major and keep the last one that was pressed. In the latter case you can set up the next chord, while the current one is still sounding.

When the NoteOff of the root comes, all notes in the chord are switched off. In the mean time the modifier has been selected and we’re ready for the next root.

I’m working on something similar, but it only allows triads from a predefined key/mode combination. I’ll share it when it works reliably. The advantage is that by setting the key and the mode, you already define the relationships between any root and their 3rd, 5th and 7th and you can use the modifier to select whether or not the chord has a 7th, or as in my project, which inversion to play.