Essential- choke / exclusive/ voice note groups
-
There you go (not sure what you did wrong, but the error message is indicating that your component reference didn't work).
Now imagine this being a part of the official codebase. I would have either made it 100x more generic in the first place in order to support every possible use case (what if the next user wants 3 choke targets. What if the next user wants 3 choke targets and 2 choke triggers with different decay times?) Or it would be constantly updated and most likely breaking backwards compatibility.
HiseSnippet 2115.3oc6Y8taabbD+njt5nqwNw.I.4iKbJPnPsTH0+r.DLB+uhPsjELUraQQg6p6VJtPG2k8t8jEarQ6aPeIZeNZe.5GxiR9X+V6uYui7NJQaQED6VTGhgb2a2Yl82N6Lyt6wihz9h3XcjSokOdzPgSoOzs6Hkoey9boxY+VNkti6A7XiHhk1TiQC4wwh.mRkVbOpgRKuji8y2+UM3gbkuHuIGmmpk9hGIGHM4sNr1uRFF1gGHNVNn.2aVaeespoNTm.7rnaEmgb+y3mJNjSrsfqSoeV6.oQG00vMhXmRK0PGLpae8KTo7+TYr7jPA8PUmtPQoM2QGFPHlZ0oYeYXvQim2wNNkbOJ2JrXpU3SbOPFHmzdt03iscvxknn8nzBuI3UsH7pL2vyo.5VJEc.D5fjPtYZjQKGYcH0SuRsuxHTwRynhKW+WEt208Howu+rw6By.uXg5sMdyV7usa6d8D9lbvtjame861U56jBketaWoRXiHs.4SsOydF+bAaOgRDQF02PL428ieL4i8MXzONhqhGpimRwcECjGqUjAIuwuIVzIR7GdBsHWr8lZdzL656+pNXNNSY5xMIQVuk5CzIJyTdGKN2KIyN2PkYkaXo2V4FVb9f2LfToqFgcW2t9Qxgl7dRyb2ru9LAKsuoPSVSK7utkaSMEqYVKVX9Zg7z9lxaUYkcusWg1elLvzu71UrseaO3PDaXmyiXFdzoBC6grwLimZpGLD9.JS46k188VY2hhDIO8TraxqUlz9uGMTWQp0uNwV+dWFhABe9nWqX1dsx38keIiUWwpGEA9kwLdXrlwYVMwUl6yDmKTLYOlzvdAhUXmHXC0CorWh.F8aDSqJLxhyMORFSVme6uaWq9GvwpQbRjfzQedLSnzIm1mEC+BrMGyfA7bsL.icn125myBRhjpSYl9BlRaDOVw7QumfMF8xFf0hDwhnyEk2dyU1sWhx2JmVcnk8xq38s21igOjJCYpjAmXM+G.GELnjAg37Pa6kWg8KYU2MU.6OxdkGKxCGuLPx7TdXh.r+xWxtR+qWfgUrZICB4vvZ3sr.nXenfL6lycdM.jhB8PVkUx6rf9oOvVWO7E7QwrjXg010SGwVas0XRE.fdHsNNRmvBzpuvvTBrBRbIUAhKlRSPtxzBuY+.R1LS9JSwykF7L.zUnBlrrwz85AWoAC3nQBKTGmJIOJq1YxfqnCaV+0rK5850XT6TTLFMHnpHyuZxSuJGMhvXw+Sain8aX5DyD6zseMVAdPvS0gICDjDiGr6WvK59rUqR4mtdihWgwuYn.ApHdxN3w4FtrHKep+xYZMUajMkrLEiJro4tpOewQ539HkBHkfRPyiFgzG9bxxSlXa9jynel3vviLxdReI.2HF407062scQM5yofbzoUtL14YyD6ZIxachLDGhhEI3wHuzDwGG6SIjpOYfJWv7UbjpGPq7.762hRQQPLjRrUVZ9BZnCRcLxQblO89sV4JVzgIw8KWH0yXu5UlXjek2kyg0q2kShc9MJ+04y6hzyDYt4Zl7TkNRLY4XUJ9cP5HVThwgx5gHRtub09bCCaaLdKhyDhgLJ+MHDYcE6e5nXsAkMQIhYaDnsthzggzzy6a8Vd5doyqMyNxDKyQ89XOILuGyGN5vzmGwa9NOhe51nEXTq1WIMOFFfwOmtwy3Vp3LYYrXS4SphsZmLyfs7llwwly1ZmNsVF6fUi8fQ2I6fQcCkAhHGIN7ysbsYMbrliIGf76tnlykE9iyDFmW3DcC8EVw+.2TOoKI+e9v4T9kcy1j7RJv4n4TAdiUv5WFBOtly2reKtgSGRLyn.C0PABLok3RsDmiS9mdjwkcaIhOynGBKxjCDglMYWAJcjeD+DQX171VupyE3ByktCFuQTEZfEvQha8UJsXLtav9pinijXnm6aORY9rbiZufNLYdCOulQbAX3iROrZ.63TyqSAP4csKlWLQgrWVq3kb+6CjAAghiz3xjzkLmzyuoVrQLrq7OJJdyiA7bMU6uTKNoWOIMgcYChcRA5GBCGcjR68jtzj42WqHru073FMs47tnR5vL9v6YlCoQ.Drv+rjqWyUW2q4mieZQeoJsw2NzW5g8nuTk5zWpRCRfUqRBUEBUkDpJDpJDpJITUHTURnpPnpjPUgPPfJPlJds.gh1U75.B01CDJpCBEM.WjxgdIUCMCkR5EpjzJTHoSnRvEAcfZB3.2.xDpAfILC3RHF.FbsAXbCuVfPQ6M75.B01CDJpCBEM.WaBF2zqEHTzdSuNfPs8.gh5fPQCv0Vfws7ZABEs2xqCHTaOPnnNHTz.bsMXbauVfPQ6s85.B01CDJpCBEM.WO.L9.uVfPQ6G30ADpsGHTTGDJZ.t1ALtiWKPnn8Ndc.8463X81bK8mRuN7b42jm9vJ5e8pNNezXGmL99IOm2e7bttr2qm50729QO68cm1oiU8FAqMJj+9eDWapW52aE3s9bGuUX2Vqoa2R+T.266Abuydg7KNeuU4q4cDt7XL1UNXXnns5bQHNTX1aguknGOIzLo0hf7.sROruVI8KFQ9Dw3sfJ.8YNepaLb+yxa4Sp8DAtQcwWZ7un1ijJbIaXlD+.ME27WW5LWt9L2T3ZOXG6+O9eTV78y+GkmnSL3F2GvgiJE1dXxft5jHeAPhRIBioP4EnsNSetx38Bo2Ym8g+M9j0YU54RYcVcbmuSFiAb+H8y8SuUH4K+A1Vv7VY+GQW18.5Yraa1MAIaCtvi7499jwdUXclsDqeikXiarDadikXqarDaeik3A2XI14MHA8G9TOwnGjF5gFNps8F3kJ0VQGaw5k67efiUDd.
-
@Christoph-Hart Thank you so much for the updated snippet. The script works great. The first line of code was different from I had (and what was in the original). From -1 to +1. Not something I would have figured out in 100 years. :)
If you were providing the hardcoded script in the current form, then yes, you would need a thousand variations. However, there is a much simpler and more practical way to achieve the same.
The way to achieve this (as is the case with most samplers) is to have choke/ voice groups. So, whatever elements are in group 1 (for example), they all mute one another. There is no need to specify trigger and target. Every note in a group is both the trigger and the target or every other note in the same group. So, in the case of hi-hat: open hat is not the only one being choked. A closed hat should also be stopped by open, as you can't play both at the same time in real life. However, because closed hat has such a short duration, muting it becomes unnoticeable. Especially if a decay is set. By the time decay is done, the closed hat sound is finished anyway.So, if you could create that little option, not only will you make it easier on every future drum producer using HISE, but also on yourself, as you don't have to keep on tweaking and customizing code for the same function. Makes sense? :) Take a look at how it is done in Kontakt for example. This is a standard feature on other samplers.
-
Well to be fair a open hi hat sample should not be choked by another open hi hat sample (same as ride cymbals should not kill themselves when retriggered), so this is clearly a compromise due to the choke group logic.
-
@Christoph-Hart No, I don't mean for one note to choke itself. For example, lets take A, B and C notes.
A can choke B and C
B can choke A and C
C can choke A and BBut,
A can't choke A
B can't choke B
C can't choke CSo, each note follows the polyphony of the sampler, but choke group creates monophony only between different notes. Makes sense?
-
@Christoph-Hart After doing some testing, I have discovered a little bug that needs a tweak.
When hi-hat note overlaps in duration another note of the same kind, the second note is not played. The first note is not being treated as a one-shot note. Take a look at the following examples:
- All 4 notes are short and play properly (all closed hats)
- 1st note overlaps all others and the 2nd note does not play (all closed hats)
- 1st note (closed hat) overlaps the others. 2nd note is open hat and it plays, but 3rd note (closed hat) does not
In any combination, the note immediately following the long note (a.k.a. the 2nd note) does not get played.
Can you please take a look at the script you made and revise it, so that all notes get treated as one-shots regardless of their duration?
Thank you so much!
-
@gorangrooves @Christoph-Hart
I've already noted this previously. It's currently impossible to create a drum plugin until it's sorted :( -
Here was my thread
-
@dustbro Oh, man. This is no good. This is an essential feature we can't do without. This is standard on every professional sampler.
@Christoph-Hart How quickly and what will it take to get this resolved, please? -
Alright, I‘ll ramp it up on my priority list then - I think the problem is that the system that assigns the event IDs is not supposed to accept multiple notes at the same time, but it shouldn‘t be too hard to fix this.
-
@Christoph-Hart Thank you so much. I have full confidence that you will nail it. And i promise you that it will be well worth your time. I will be releasing 15 drum instruments this year, as long as i get the first one working 100%. We are almost there!
-
-
Check the develop branch :)
-
Hey @Christoph-Hart, the hi-hat choke script you provided a while back has been working great for the regular hi-hat. I have since created an advanced version for variable hats which has several stages of open and close (tight, close, 25% open, 50%, 75%, 100% open). These are nested containers and I switch between them using CC64 controller. I have altered your original choke script to allows CC64 to choke notes. It works great.
Now, the next step where I am failing is that I am trying to add a choke script on the parent container (that contains 6 child containers) which would choke a note using another note. Basically, the same as what we achieved with your original script. However, it is not working properly. It starts working, then it fails. It gives me a number of warnings, such as:
Shank100 Script:! onNoteOn() - Line 28, column 36: Illegal operation in audio thread: String creation {U2hhbmsxMDAgU2NyaXB0fG9uTm90ZU9uKCl8NzQ0fDI4fDM2}
The line of code in question is:
Synth.addVolumeFade(eventId, decayValue, -100);
This happens for all child containers that get played once I start using the controller. This "choke by controller" script is present in 4 child containers and works great until the parent "choke by note" script is enabled. I am guessing that there is some sort of double volume fade clash, but I don't know how to go around it.
Can you help, please?
Thank you!
-
@gorangrooves Do you have a script you can share for your hi-hat implementation? Or maybe some hints on your experience? I'm updating some of my drum stuff and would like to have better compatibility with e-drum controllers.
-
@Dan-Korneff There is a built in choke group script now, will that do what you need?
-
@d-healey Good question. I'll give that a look. Thanks!!
-
@Dan-Korneff Are you referring to the regular GM hats open/close/foot or the variable hats?
My plugins utilize both for compatibility.The design I came up with for the variable hats is unique to my plugins, and they work with e-drums. The basic principle is that there are 2 notes: one for the hat tip and the other for the edge. You use CC4 to control the openness.
The way I accomplished that is by having parallel samplers: 6 for the tip and 6 for the edge. Each goes like: tightly closed/ closed/ 25% open/ 50% open/ 75% open/ 100% open. So, by operating CC4, you move between those samplers and mute notes in others that are not within a specified range.
This system is not 100% compatible with e-drums out of the box. They still need to set all of their tip to one note and all of their edge to another. I made the system that is the most practical, in my opinion, and can work with either e-drums or keyboard controllers, as well as being able to edit things easily with a mouse.
I'll gladly share the scripts with you if this is the system you want to implement.