Ignore notes outside of velocity range of currently loaded samples within a sampler
-
Hey guys,
Is there a way to get the velocity range in use for the samples currently loaded within a sampler?I am trying to ignore midi notes with velocities that do not have samples loaded inside a sampler.
For example: Sampler has C1 samples for velocity range 30-127, but note C1 with velocity 10 gets played- ignore this note.Is it possible to accomplish this programmatically, or do I have to specify the range to be ignored?
-
@gorangrooves Yes you can check the properties of individual samples.
First you need to get a selection of samples, you then iterate through it and check the properties you're interested in.
-
@d-healey Thanks, Dave. I am a bit lost. I understand the basic concept but am having trouble actually implementing it.
Any chance you could give me some practical examples, please? -
HiseSnippet 1318.3oc4XEtaaaCDlxNpq1qqcsn+X+Y.BA6GNCcF1sooCXnnN1wo0nwIFQYA8eELRz1DghTfhJqdC4kYOA6QXOR8MX6HkTrjspQhQW6FlgQrt69tiGOd7tSYjT3QhhDRjUsSlERPV2w1cFWMs2TLkiFrGx5KrUSo7IntyBwQQDejkU0WpEZUaCj4y6eQWLCy8HyYgPmJndjCnAT0bti57ZJisO1mbBMHG5s6LvSv6IXhXvQpZ2BEh8NGOgbHVCqhMx5V88oJgzUgUjH.SWg+L2ohegmf+TZD8LFQSzF4BFJgMp2TJyeT1lLBgrrGMeKWMYK+P6gTe5U7mu0+Zi.m4ZjOFXUYUtT6afKYkyk1HwktusqmjFplKQ6Oeo8.thHGigPcdWIAKpx81vtm.PvUMCvmS1WBDWoQicZ05QNve15mpWGB2QJmKvRGWbPHiHa67bGyAeyIDUJuFalIbSsN0obFkSbFGy8TTA2Qv6FqTBda8hJErFdhfPAGV9GAllES1p9uUuFcrSiTpZ.YMlvCybhHLRhUd9UtPSOIAhktYhZrYyuWux0pAeGKjNMhbn74pBFzXwTSxgjEvZQ5cPiTa1beJyjEYLS1ZqvR0RHS90UKKOXB2+C.sO2OOvPpxa5RPGo4lGFSHBcK0ANHSxhv6WhKbPB+Eg9F8kqRAajrrkwPJ5Gx5FYKE3FJ7WUrCDWbUdMYVI1G3lG1TZYvdEcAXLwoDVIVC3VzZkA6UzLXWVG9dIjRmcaAf0KK2swloY0atUyHMeStcOLicFTTpwhI8fAycg3PghbDugIwu9k0cVTz3wkJK0V56bkIVWsTtJEaviCNiHyesSCDJmTrF0std0n7RBK4.J3C3T0QgjT58ELecsG8yKWQCkFWgm94A6gUXcQtTd.tPhTQ0ti0djKftDIk7pYuGI5bkHzfM8v.bYkQ5cSKHlD7QTesBomDn2Ak0sNEVsY5G9c3gH7EjA7QRBbBpqPRiFJB.6gk.DqJnkq3B05E9wLrpXC.cmtTAPDuPUWckUdDUMKemvaPWgVqrqv00EuusoDS49XkR7Q3r3eBeLsW5WY2e7Xn77bGbC68ey51375u7eaxx+.aWEzDI.FXI8ZuwGpam0i4iwXLgW6wXfDPl.66R+0bv9yNcigXjrH2+niYo1MPDyKrVod9wjPn4HbLmSma243ieoTDGtnVu+EljhSjPEK8ra4DbDm.wZU98XOoHJZLrcL1JJunQwxI5X0bNGStfHiJx6v3.37lyIrH8EPK889Hc6.E0aHVIouKOZypz5Dr4LFlsyP2dA5Gu.8SVfd6Ene5Bz6r.8ylSmDPGhC0YF5YKWuhjfAFggsbNjcoStx3IbJV9HGzRFC7VeFlL8iSMnOikIKL7bsLezklLf1Ev0Ofi1Ge.zdYLNlox3VrTvPAWDNUvodES1gj2ISHx79doancUJ3t1bNOrywvXp3nb2V+tNG.iOikEuCeihE27WjnzyquwNwccz0ub9ua6sp+uo81pBQ2Ms4liY96+EdFdGaSIXGcGyOkt2whXEz8KqCjMzlxEZM6Qx2rphtAXBcKMs1IbgW5yP7WvmTgsy5roE1NSHxKyTv9I8Yy.uVUIIu+jdJLFzyjkOEMBF.P6RP2mOIdY.1SJdqWxKKn80aa3.dI27eXol8PMsSaj4EH.8ra0rEJ.5w7VOOcR9O.srJWmGuF57j0PmsWCcd5ZnyNqgNOaMz4GWoN5166FqDAIE8.Fi5mjXY0+pDqpn+FIILZsA
-
@d-healey Oh, man. Going to try it now!
Thank you so much!
-
@d-healey I've played around with it and what seems to be happening is that the attributes (hiVel and loVel) are only getting pulled from the lowest velocity samples in a sampler. So, if the very bottom sample is from 1-4, but the whole sampler uses the range from 1-100, it gets a value of 1 for loVel and a value of 4 for hiVel.
What am I missing here?
-
@gorangrooves You need to fetch the min and max values over the loop, looks like your just using the last item in the loop.
local loVel = 127; local hiVel = 0; for(s in selection) { loVel = Math.min(loVel, s.get(Sampler.LoVel); hiVel = Math.max(hiVel, s.get(Sampler.HiVel); }
-
@Christoph-Hart Thank you.
I am still not managing to make it work. The script you provided here is not executing. I get an error on the Math.min line:Line 7, column 49: Found ';' when expecting ','
If I make the change as suggested in the error message, I get a different error msg:
Line 8, column 5: Too many arguments in API call Math.min(). Expected: 2
That's the line with Math.max.
Here is the script that I am trying to execute inside a sampler's MIDI processor, combing what you gave me.
EDIT: This is the edited, fully functional script for anyone else who may need it. 🥰
onInit var selection = Sampler.createSelection(".*"); var loVel = 127; var hiVel = 0; for(s in selection) { loVel = Math.min(loVel, s.get(Sampler.LoVel)); hiVel = Math.max(hiVel, s.get(Sampler.HiVel)); } onNoteOn function onNoteOn() { local number = Message.getNoteNumber(); local velocity = Message.getVelocity(); if (!Sampler.isNoteNumberMapped(number) || velocity<loVel) Message.ignoreEvent(true); else if (!Sampler.isNoteNumberMapped(number) || velocity>hiVel) Message.ignoreEvent(true); }
BTW, the objective here is to not allow notes outside of the sampler to change round robin groups of the sampler. That way, each sampler operates its own round robin. It would be nice if there were a simple switch for this :)
I can make it work by specifying the velocity value range to ignore, but having a universal script that works in all samplers will be much easier.Any help is much appreciated. Thank you.
-
@gorangrooves I just forgot the
)
at the end of those lines. -
@Christoph-Hart
Thank you. Time to put it to test.
-
@Christoph-Hart @d-healey Thank you so much for your help, guys. The script I posted (and edited) above is 100% functional and will make a wonderful improvement to my plugins, hence everyone else who uses them.