|
Post by John Tennison on Jun 27, 2018 21:40:30 GMT
Oops, I was totally wrong about the module only transposing by a major third. Once I understood how you mapped CCs onto the Channel Strip transposer, I see now that the full range of plus or minus semi-tones was available.
The reason I had been adding 4 to the value of the generated CC is that I originally had been using the module to convert an incoming Note on to a CC6 RPN message for coarse. I had wanted an incoming C3 note to no transposition, so I had to add 4 to its value, else C3 would have been mapped to a transposition that was 4 semi-tones too low.
What I need is a Stream Byter code that will except incoming Note-ons, such that an incoming C3 will generate no transposition; and each semi-tone above C3 will correspond to the exact number of semi-tones of tranpoation; while each semi-tone below C3 will correspond to the exact amount of negative transposition.
Having the Channel strip respond in this way would be more consistent with the way many hardware manufacturer (Roland for example) specify transposition when transposijnf a keyboard from its front panel.
It would be welcome of the Channel strip were updated to allow more than plus or minus 24 semitones of transposition, as there are some times when I need to play in the uppermost octave of a keyboard and want the keys I press to play notes in the lower register of the keyboard.
But for now, having Stream Byter code that functions in the way I described above would be helpuful. So the code would basically need to map the 49-note 4 octave range (with middle C in the center) of MIDI Note-ons to the 49 transposition values of the MIDIFire's Channel strip. For now, any Note-ons outside this range could be ignored and blocked. Note offs should be blocked.
For future updates, it would be great to be able to control the Channel strip transposer directly with Note-on commands.
Thanks again for your help with this.
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jun 28, 2018 5:00:39 GMT
Let me give this some thought and get back to you on this. Unfortunately I have a bunch of stuff to do today for a deadline as well as suffering a maintenance power outage here all day so my time is limited.
Regards, Nic.
|
|
|
Post by John Tennison on Jun 28, 2018 6:22:15 GMT
Nic,
No problem. I appreciate any help as your schedule allows.
My sense is that to work with the Channel strip transposer in its current form, I need a Stream Byter module with a lookup table for incoming note-on events between from C1 through C5 inclusively. The module would map each of these 49 possible note-ons to a specific CC 19 value. That is, there would be 49 non-continuous CC values in the lookup table. (I can empirically determine which specific 49 CC are needed to cover the entire range of plus or minus 24 semitones of transposition. That is, if you could construct a Stream Byter module with the lookup table with 49 possible values for the outgoing CC, I would be happy to figure out and substitute the correct 49 values needed into the table.)
I imagine this module would be a welcome addition to the MIDIFire scene club, as some users find transposition more intuitive when it's conceptulized up or down relative to middle C (C3).
|
|
|
Post by John Tennison on Jun 29, 2018 13:07:47 GMT
Dear Nic,
I have empirically determined 49 CC hexidecimal values that Note-Ons need to be mapped onto (using a lookup table) such that the note range from C1 to C5 can control the transposer in the Channel strip.
These 49 values are:
01 03 06 09 0B 0E 11 13 16 19 1B 1E 21 23 26 29 2B 2E 30 33 36 38 3B 3E 3F 41 44 47 49 4C 4F 51 54 56 59 5C 5E 61 64 66 69 6C 6E 71 74 76 79 7C 7E
(Hopefully I did not make any transcription errors in these values, but if so, it will be readily apparent and easy to correct.)
Having had more time to immerse myself more in the behavior of the Channel Strip, it seems that the Channel strip doesn't respond to a newly sent transpose value until all notes are released. Is this correct? If so, I can see how this is musically useful and also is a straightforward way of preventing stuck notes. However, it seems that even if I channelize incoming keyboard notes into two different zones with 2 different MIDI channels, a held note in one zone seems to prevent a transposition command from being responded to into the other zone. This can be musically desirable, but sometimes I want to hold a note or chord in one zone while transposing the other zone. I have been able to overcome this problem by using 2 physically different keyboards, but if the Channel strip transposer had the option of recognizing channelized zones from the same keyboard as independent such that a held note in one zone did not prevent a transposition command from being responded to in the other zone, this would be a very desirable option.
Thanks again for any help you can lend in these matters.
Warm regards, John
|
|
|
Post by John Tennison on Jun 30, 2018 4:37:35 GMT
Nic,
I just wanted to provide some updated information regarding the Dynamic Transposer module. For me, not having to release all notes before transposition occurs is a more flexible and desirable way of dynamically transposing. Consequently, using the Dynamic Transposer module is normally a more desirable process than remotely controlling the transposer in the Channel Strip.
Consequenlty, I have been trying to run some diagnostic "stress" tests using a simplified scene with the original Dynanic Transposer and the altered version with the line removes that you had suggested.
If I have not mapped more than 1 MIDI note to the same MIDI note, then the Dynamic Transposer is VERY robust, in that I can play LOTS of notes while at the same time quickly sending many tranpose commands at the same time and never get a stuck note.
However, in both the original and altered version of the Dynanamic Transposer, I will get stuck notes if I play 2 or more keys rapidly that have been to the same pitch.
In the most simple example, I first used Channel Strip to map C3 to D3 while keeping D3 mapped to D3.
While using the original Dynamic Transposer (DT) set to zero transpotion, I could play a C3 and D3 key and as expected, the DT module would generated two D3 notes ons followed by two D3 note offs when I released the keys. And of course, this is what my Roland digital piano needed to see to stop sounding.
However, if I send a CC19 to tranpose the DT module by -1 and then play the C3 and D3 keys, the DT module generates two D flat note ons, as wanted. However, when I release the keys, rather than send out two D flat note off as needed, the DT generates one D flat 3 note off and one D3 note off. Consequently, one of the D flat 3 notes gets stuck.
It seems that to fix this problem, another variable needs to be incorporated into the DT. Specifically, it seems that in addition to storing the Delta for each MIDI note number, there needs to be a variable for each MIDI note number that keeps a dynamic running tally of how many currently-sounding instances of a particular note on of a given delta are sounding.
For example, let's say I create a note remapping where I have mapped C3 to D3 and where I have mapped E3 to D3. So I now have 3 keys (C3, D3, ans E3) to all play the pitch normally associated with D3.
If I have the DT set for -1 transposition, and If I simultaneously play the keys of C3, D3, and E3, DT will generate three D flat 3 note ons, but DT needs to have a new variable that will come equal 3 as a result of three of the same MIDI note ons being received. Let's call this new variable "I" for "instances That is, in this case, DT would have seen 3 instances of D3 note ons (before any D3 note offs had occured), and would make I equal 3 for D3, and of course, also store the currently activw delta of -1 for D3.
If I release any one of the three keys I was playing , the DT would need to send out a note off for D flat 3, and would would need to reduce the Instances variable to 2 for D3, which would allow DT to know that there are still two other active instances of D3 (with Delta of -1) that will need note offs sent when the remaining two keys are released. When I released the C3 and D3 keys, the instances variable would need to go to zero.
Through this method, It would seem that DT can keep track of the appropriate number of note offs (instances variable) to send out.
Of course, the instances variable will need to be dynamic. For example, if I had replayed E3 before releasing the C3 and D3, the instances variable for D3 would have changed back to three. That is, the instances variable needs to be able to dynamically increase or decrease such I always equals the number of active note ons for a given MIDI note number.
I hope I have not made this more complicated than it needs to be, but if this approach can maintain the robustness of the Dynamic Transposer module in situations such as I have described, I would be most MOST appreciative.
Nic, thank you for any expertise you can lend in realizing the functionality described above. I believe the DT module functionality described above can be a VERY useful module for many people.
With deep appreciation,
John Tennison (AKA Nonjohn)
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 2, 2018 9:28:27 GMT
Sorry for being AWOL; I took a couple of days away from the computer (mostly) after the pressure of getting a new app release out.
I will digest what you write above and it looks like I just need to worry about making some tweaks to the DT code to handle multiple notes of the same value. I will work on this today.
Regards, Nic.
|
|
|
Post by nonjohn on Jul 2, 2018 13:22:10 GMT
Nic,
No problem about being away for a few days. Your dedication and support of your products is beyond anything I have ever witnessed, so I am sympathetic of your taking AWOL days whenever you like. ;-)
A little more information that might be diagnostically helpful:
When I had tried removing the line
ASS IM1 = 0
I was still getting stuck notes but under slightly different conditions.
That is, I could play 2 or 3 D3 note-ons and then release them without getting stuck notes, but if I play legato trills on two D3 note-ons, while sending multiple transpose commands via CC19, I will still get stuck notes after removing the line above.
I also get an interesting artifact in this situation if I keep on playing the legato trill after stuck notes occur: Somehow, the pressing of each key mapped to D3 will eventually result in a note on and note off being sent out in close succession even though the key has not been released. That is, even though I am still play legato (not completely release one key before playing the next one), the notes become staccato. I have no idea what's happening in his situation, but I thought it might be diagnostically helpful to know about this.
I will try to stay logged on and make all future posts as "Nonjohn" rather my actual name of John Tennison.
As always, thanks for your excellent products,
Nonjohn (AKA John Tennison)
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 2, 2018 13:35:42 GMT
So here is the fundamental of why it probably isn't going to work...
You're mapping two notes A and B to A before the DT.
If you hold down A and B, when you release either of them, then an A note off will be received. But we have no way of knowing whether it was the A or B key that was released.
Let me think about a way around this; maybe we need a second Stream Byter getting the raw controller events and being able to communicate with the DT via global variables.
I will get back to you.
Regards, Nic.
|
|
|
Post by nonjohn on Jul 2, 2018 13:55:39 GMT
That makes sense, but even if the receiving module doesn't know which note to apply the incoming note off to, as long as it applies it to any of the sounding notes, such when all notes are eventually released, there are no hung notes, it would still be musically useful to me.
I am using a Roland FP-30 as the receiving sound generator in my tests, and it seems to do ok.
I will have to check, but it might be that, when there are multiple note ons of the same Note played from another controller keyboard, the Roland is simply applying the first note-off to the earliest-played instance of that given note-on. Even if so, if still produces musically satisfactory results.
-John
|
|
|
Post by nonjohn on Jul 2, 2018 14:09:30 GMT
I have just determined that, for simultaneous instances of 2 or more of the same note-ons, Roland seems to automatically apply a subsequent incoming note-off to the note on that had been played with the lowest MIDI note-on velocity.
This is a psycho-acoustically reasonable solution which is musically satisfying,
-John
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 2, 2018 14:09:44 GMT
So, what if we put a new module after it that simply counted note ons/offs and when there were no more notes being held according to the count, then it sends an all notes off message?
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 2, 2018 14:16:09 GMT
Like:
# nonjohn hold counter IF LOAD ASS I0 = 0 END
9X XX 00 = 8X IF MT == 90 MAT I0 = I0 + 1 END IF MT == 80 MAT I0 = I0 - 1 IF I0 == 0 MAT I1 = B0 + MC SND I1 7B 00 END END
Regards, Nic.
|
|
|
Post by nonjohn on Jul 2, 2018 14:24:08 GMT
The Roland might be doing something a little more complex than on,y looking at Note on velocities. It seems to be looking at the current amplitude envelopes of all simultaneously sound note ons. It then seems to apply the incoming note-off to the instance of the note on which is at the lowest volume in its amplitude envelope.
Regardles of the algorithm that roland might be using, it seems that as long as long as all note ons for the same note number are eventually followed by the name amount of note-offs for that same MIDI note number, no stuck notes will result.
-John
|
|
|
Post by nonjohn on Jul 2, 2018 14:27:25 GMT
I will try your suggested post DT code as soon as possible. I have to be at my place of work right now, but will give it a try as soon as I get home.
Thanks, John
|
|
nic
Soapbox Supremo
Troublemaker
Press any key to continue
Posts: 2,011
|
Post by nic on Jul 2, 2018 14:29:25 GMT
No problem! It's a workaround, but it might just do the trick for your situation.
Regards, Nic.
|
|