Samplers as round robins?
-
Try a MidiChannelFilter in each processor and then
Message.setChannel(roundRobinIndex)
in your top script. -
@Christoph-Hart I'll try that, thanks!
-
@d-healey said in Samplers as round robins?:
So let's say each sampler has 5 round robin groups. Do you want all of the samplers to play group 1 then 2 then 3, etc. at the same time. Or do you want sampler 1 group 1 followed by sampler 2 group 1, etc. or do you want sampler 1 group1, sampler 1 group 2... etc? :)
I was thinking:
Sampler 1, group 1
Sampler 2, group 1
Sampler 3, group 1Sampler 1, group 2
Sampler 2, group 2And so on :)
-
@tomekslesicki I think Christoph's solution should do what you want then.
-
Yupp, there you go:
HiseSnippet 2243.3oc6ZstaabbEdoj1VS1HmlKnn+bpPABoMkrnTZafUcsroDMHpksfnxETCCiQ6NjbpVNy1YmUJLF9EnOO8AouB8MHuAseyL6xcoLsDCSbJhiHzO3dlyYluy84rhGpjArjDoxqR0iGGy7p7d98FKzCaOjxEdc2yqxM8OflnYJhizCGGSSRXgdUpr7iLDpTcEO6mu89OjFQEArBRddegjGvdLeDWWP8vc+q7nnNzP1w7Qk39S2safTzVFISAdV1eSuXZvozArmPMrsjuWkew9gbsT0SS0rDuJq7PY33dCkmKb7+E7D9IQLyCs75gMxQtiLJzfXCUu1C4QgGlq2IddU9kGVXEV1YE9X+C3g7IzKrF+Z6BjBIJaOprzkAuVWM71bVvqRI3shCdefeu.EOVWrhAaeTF0Bz0ZJ34V0ao+464em6PNdHOgbRpVKEjyg+f.auVIiH5gLxIrgzy3vOb2UqAdWm7zmbW6BIbAiLfIXJJTzDmjmvHAiChXg4L2oycITrP9pwQzwrPBiFLjngOe0Z3vRzjynJx9BJrIj6QZiymIzaLfoaKGEKE3g5q4VdsF6rZM6t+HE8DBknX8YJFB1HZoEXGzcutj97HDolTd6yHg8+Y1.ay1Okus9ZcrrzZsFMWsFYVetbA2ZQEb60Z77cdCRZzVtHxXs6mJBzb3kNoMromfTh5YtplPCiRYMVs1KcaCrONGt05mq579DtNgH622wUe.APRjyPiBLzeiDlNOlo9uys86T6UF337DFFZ6N9IvYBvx7R25VtnK7GkDR0TRhVkFnSUvcMjpIATgIrHEGhAMtyOAATbw.BULlbJWDB.CPhkGQsp+4b8PqqlcFhLbxzcOBMgLjlLjbJa7FNhYKIHRUHpag.DbPvDzj3LMBBUoniwlmE63DfK355MlXtaZVRXE0vSN4DR4CINMYHjgBzFKiw2vNRCAzUHBE5qv4gRbbmlXzuIpvkg9NXGhYJq1ahxULZBN7lPMbYUBolfXIMAajhmeBHel72SQneLO3TGt4J7HODoXIQPlyMJ0XYpE5DA6bmfFuD.vstyp0DnZaBp7xH6aPY2PTNK3zxwXnjVZTnwCxDxzACaZOWylZbrF8ejDtZD2YncNEI0ajocEIlG7fu5E85921GYls15y1orxaBfLgTPAPHzj3eXaM9HNMhm4TLntH304UmDl.2KSInQWHBLCHFM040mNIyFEXjHKq3kE6u0FoXIL0Yr54vuQoL3R4QHEiCMaycHbxedhthmt8sKkt8xoy9MGvy3O2TqZ8VMIohPVe.tvmuyD1dk8au5hVKa5FL7IVMe.GNNWjWd4QqMvZfJNx4Jb7MYmrQ9lcsoS5tgEUitfpYLFgl5MkLqyP648qG9rMg1eOx5sZL8Zu70KS53M+v2YVLzxvfETyXYW94NSQ+UE14Y4UQnemznnIAylOnVXhDkEMULU5iUor58oQIlplyzScj8Xc9ImGBlmRdMm9rmojRwgnXijmwRJ7j8UxQt9wHmdCxU3pPkoo7T+P3hldqtZ+z5sdi9.qm5Bqd0dh1TwmnQ4MT5kq+N4Rbsyr2l3KYnDHZBgrDS6GVwUIBFREBVTh08Xu3Bp3BtSGcBSU9BFFxOUzNmcj69776p7Xl9SRx5fftd8Qk7wWrenY6w8rHwJI5tNxpHkq6tgsfzzGhqMa1gXP7QGgBqol5cqVSwFPTptn1wWaK.ky5jvAo3I1cqdCSI8pYaA2J.ph7MLkjbB0zZNheps1fZLJDiRE3nMLRFHkgNIApGnniFgUah1QjyKrm11fBaAHbAH6YPgJSibRlYemXPqFICPs5.f4LzeaSDSUG28l3bb4L.D4dpGygiHOGx5ijBHzT1PawposgMIGfKiggKLWOKi45MZRBLF2p4gPw3FI55NZ47at.jaSxVvAw1la.CPnLcDsfAeCAmvuBzRGY7OfSjBkqe2l7WtGYKjAU0lKTxmUCg+Wze0ue8hK5UXrlVOQl97nlWp93xzLockfP1U9hXJSXSspW.glA4l8JYBV24my6QjyHlnY5QlpMeiLE3lUnDiRQWjn7zXV1nf4Q44TZ4MwNVloB8pLUq5LC1JH85yo4kM+hYhsL1AqZ67Z2LaxrGZG2xiiwwtgu69zdVCR4on897t6gZD46C1RbL3tfZtw.UYO1YXjZ2bfU82ikbpVFa4MalIXSu5S8qKOj93xO385iahgdkgoQlI9JOIrY7+rEfudpQM6ZvcBWOtrh8cX73Mm6o2mW39A9Gx0ACmMdWZF3E1+213M6kMrp+986yBzEfcE+Ne0h9lEVLnbSGT9U98vUGrisZAxuw9L4KomwHOJep+VWxKA5eOuuDn349k.8z.MN9iUTQRrLYpMtGaD+XDzmTl3mmv5nX+iiLd4xzaKopYtz2d+NPImoL8nnIsMb4A1B3Yqs6+4a9W2uxxeOeaOy7kQsxaqWF0xyWHyU7Bnxfz66m0xv8lLrnope1KRYZXr7bCiVWJLJUec42T80dQbLwusR266mcCimXa7LixrywlTyeTLCHWoun7d6NOxeCi76KBunzat6OdUY+gwuWMGi83ihifNcFKBMkrX7CQWn9zzHcN0oi.NPJjwCkBdP4LKLGjhOX.SUF6yTgdf1b2lBJe7tGwhXzxUB9869XjASUvNwVPaQq42VbY9qequCtDSUMx6FcGW9mmcGORlpwbMGPQfJttjOJjzCMkBX42sFzprjovj64MMO65JIBsO7ewmrEaYdtR1hsxWbQ6.u0O66.6BAutC7L6.u0OE5.OecPujNvdee5.68tcG3sttC70cfutC7auNvaecG3q6.+l6.u8OE5.ei+u1A9c7Yf295NvW2A95NvyQG3eLNiQz.k7EY+roLwx2vRA5sv9aKrp+AlmIsxqR46u4Fa5MBsVdQPfwbuNrOyVlsV.Y1dAj4SW.Y9CKfL+wEPl+zBHymcoxX5p+fTsz8i+BNzCNbe6+VrJUb+KrrQ8d+Ozll5wE
The problem when implementing this is that you need to take care of the note offs. I've written a helper "class" that lets you push and pop any kind of value using the event id as hash key so it will also work with overlapping notes.
EDIT: Fixed the MIDI channel filter settings so that it actually works :)
-
Awesome, thanks!
-
Ok, this works great but there's one thing I'd like to implement, and that is MPE. Would it be possible for the three samplers to still support that even with the filter rr script?
-
Yeah, you're right, this won't work with MPE then, as it needs the channel info from the original event.
However I just thought of a much more simple solution: just use the MidiMuter module:
HiseSnippet 1154.3oc6Y01SiaDDdcBtsI8f1q8TU+nKpefHnnD35KRHDuDHmh5EHBycsRmNcZwdRxJr20c8ZJnS2+w9Sg+As650I1F7A4bKm3tl7AD6yNy5mY1YlGGk9blCDFx3HiZGeQ.fLdfo8ETwn1ivDJp6dHiEL6gCE.2RCs6EA3vPvEYXT8IJ.iZygh+b4V6h8vTGHEBgdNi3.Ok3SDon829WIddcvtvwD+LV+3s65vnsYdrHIepZ1DEfcNEODN.qLqhIx3S12kHXbaAV.gRa1k4dg8H1eR01+bRH4DOPsnExVdPZXT6QDO29ii0PDx3S6mF4U0Q9iL6QbISvSy.eY7FVodjMGXTIOklKGkZ81nTGlmq5.dKzyHC8lSSuGZZ6vIAhzcTb6qSPSYWqbzSuKpRmJlxbanv5LL2xORdeFZso0KhuqWcHHxE5KsnZYOkUsVrwJyW2pfO2pqqUdWWewFubih8c95bXnEm2k5BmKCglanQupcChnNBBiZwnGvDvgzkZT+0Zy7XNXOKxjCPiVu1.IG7k3I4mFZ7Wmd19qFBhcDBN4DoEK0bkI7361TedKubiMhM+MZuz+MwpkWdirnjAKMIL1L4YtpGPGJF0H8YlMRq+l5WKtFLPEX0qck8ZynBNyyC3EtspwieSNtDMx+DfuhrdwKBlXnrZLe4d8oqbWV6I.pHigLZWJQbX.jz5N9ZZLRKzj.LqQowUVz3vo.yRgtdOFpslSx+6Yc2CKvp1tDLocA.WPTQnwdvYxYX5lvZl6AgmJXAxoXWqCUNmf4F4gE4GdnlRlrgLEmq6rq5oERDWjcJ56vDklENQoUQQ6TR2GZ1mHbFULeqT.ekYs6Z9lLeddy8GL.bDojcNyN+dYGFWNprflJetoMgBwiwhIx2Du152vmAVOAn.WkTacCZk+0zpUFL0ZkG5HjO9i4XZX.KL2AaC9jiYTUFIE7YgPGN7GGotkyh2lg4Et0ka0QFjE5iMVDwiKW1wmEQE4JOp9uTfrn6Di4tqzuqNcz6VzrqNtNYhjVLSdP557UGWMIUZVjNUynRxPPoohX1rPx6JrajPHarItJHxPJiCIPwC6ydiilhy3KLGPN2VD4bpZdcXAGx6sQkUmt98a4xq1XNZS7C7f8omAdR8fXN9URAfA3HOwXz72i8XTVvHFk3jsE3HP9JCCGB7rbuv.R9xExW4ME4QaeD3A3rsye+1OU1Fh4x7DTxbw6Pg7Mce8slZ5ZoFMY8wgDW0+eJwcDKRPnC6gkEpmiLLOHx2Vpr3.RlPofm7AYZTQMdQutoZsVZg5Fu3ukeR1rkZsQxlsFuYYkQW6dhL5kaMSF89mL5ZyjQ+nPFcsYxnyjQmIid2Iit98kuM51eXKi179hLZy+KkQW+C.YzjialL5MHit9LYzYxnyjQmBYz2GOCerCm8JG8PKUs7mEiHiaZ7unYMydp0VsFOkxzr4pMQ9xoxuxwQkt+AY9oXeVqD9rdI74wkvmerD97SkvmetD97K2nOJAwchDLecqnDn+9w+1PFF6SwxJ43pdz+.fJy6PD
You don't need to take care of the note off events here because that will be handled by the module itself (as long as you enable Fix Stuck Notes).
-
Nice! Now one last thing - what if I want to have 6 samplers playing in each RR cycle?
So:
RR1: Sampler1, Sampler2, Sampler3,Sampler4,Sampler5,Sampler6
RR2: Sampler7,Sampler8,Sampler9,Sampler10,Sampler11,Sampler12
RR3: Sampler13,Sampler14,Sampler15,Sampler16,Sampler17,Sampler18I was able to achieve that with the filters and I'm sure it's doable with the logic here but I always sucked at maths ;-)
-
@tomekslesicki You can put them in 3 containers
-
Nice idea! Can I put the samplers into containers without copy-paste? It changes names of the modulators and I have quite a few of them...
-
This post is deleted! -
Ok, I've tried to make this like that:
On init:
const var muters_a = [ Synth.getMidiProcessor("MidiMuter1"),Synth.getMidiProcessor("MidiMuter2"),Synth.getMidiProcessor("MidiMuter3"),Synth.getMidiProcessor("MidiMuter4"),Synth.getMidiProcessor("MidiMuter5"),Synth.getMidiProcessor("MidiMuter6") ]; const var muters_b = [ Synth.getMidiProcessor("MidiMuter7"),Synth.getMidiProcessor("MidiMuter8"),Synth.getMidiProcessor("MidiMuter9"),Synth.getMidiProcessor("MidiMuter10"),Synth.getMidiProcessor("MidiMuter11"),Synth.getMidiProcessor("MidiMuter12") ]; const var muters_c = [ Synth.getMidiProcessor("MidiMuter13"),Synth.getMidiProcessor("MidiMuter14"),Synth.getMidiProcessor("MidiMuter15"),Synth.getMidiProcessor("MidiMuter16"),Synth.getMidiProcessor("MidiMuter17"),Synth.getMidiProcessor("MidiMuter18") ]; const var muters = [ [muters_a], [muters_b], [muters_c] ]; reg rrIndex = 0;
And note on:
function onNoteOn() { local index = 0; for(m in muters) { m.setAttribute(0, rrIndex != index++); } rrIndex++; if(rrIndex == muters.length) rrIndex = 0; }
But I'm getting this error:
onNoteOn() - Line 7, column 26: Unknown function 'setAttribute' {Q3ljbGVTY3JpcHR8b25Ob3RlT24oKXwxMDN8N3wyNg==}
-
You're wrapping the muterX arrays into an array again, so it doesn't reach the actual modules.
Try
const var muters = [ muters_a, muters_b, muters_c ];
-
Oh and the onNoteOn callback is also wrong. You need a nested for loop (and make sure you don't increment the index in the most inner loop, but in the outer loop so it reflects the actual RR index.
-
@Christoph-Hart I think I understood half of this sentence :D
-
If you had a bit of time to help me out so this, I'd be really grateful :-)
-
HiseSnippet 1326.3oc6a99SabCFG+tDtokrBacqZZuzCsWPTYzDHjMoJD+H.UQqAhHz1IUUUYtyIwh6ry74ieHT+eb+ov+AaO9tK4t.GPVZSEk47hn3G+X6u9w1Oe7cBZI31Deetvvrvgm2mXX9Hq1myj8p2CSYFM11vbNqlXeIQfhLs048w99DGCSy7uPYvrvLFgetb8svtXlMIwjgwq4TaxKodTYh0Va7GTW2cwNjCodo7t5FMr4r5bWd.nm7VkM5isOF2krGV4VNKCyuZGGpjKZKwRhug4LawcNucO9orH+eM0mdjKQUnhQanihLuK20QoXkUi58ntNsFLu8MLLK1JIJjOJJ7DqlTG5P6IQiuKrBTRKRGOLycaxqRZ4UNS4UNK4YlRdyDIuGa01VP6KSpQoseH1Zh5pLh7hp0HWm7VPb1WhNAKPdAvZqOZMzaea3B+RcIxQl6KLupXSkaUluzhn6zqpyW5cKNaQTFet6gX4wZHV8iYHVYrFhZvP7trGhYKJHcQBQClC4LHxU94QVupecBX1RJmg3r83Rx9rEJU7hH2b41XWDcXGDYsXgNfF5ioBnp3UlRQUcQR2q7wS4fxwRI1uXTE3sjOQtoTJnGAczBkWbnh+40hF4ROeXC9PRaS90ydFpI+DBR1i.MvVP7HLXmsZF0iHHHNHSI5T3rL5nTdPbP0PR3jsOXCxbfcP7NH4o7jdNb3e5Sim1wCdz2whbXkQeS6rvv38ZwQlkbIrtxdoh.oWRJ9ghWaAnSG0JPwBWot5blTvccIhLqVkjRbaMbAVf2QDwhv4I2.xPGgSqilNn3MmNHc1J3roDBiobjyZvnx86SFVNZ+z.KkMFNASaJYdk1Z3zIC2RLc8bPF0izD7qW0XarDqRKEaC7qOQHopYn41jSf78QIoJXsMw+XIuOjw+ZYvf7nbm.WrbzjqJhRbEPHdjrWMTilOUddZhyGcF2r.BiqberUKpztW15MWF5EhZSa8Fyul0ZmNcH1xDwNi0t+4mVX0cIk4hjx2X0lxHg4aCExOFVF8FLjY4EDFQnBpUtk6U72i68J5O12qXeaIL7GJvL+9b+Q531DO5gblJhjX7U9jcEj+5.0pbZ604XQlUc456BSxLaSarLPDtcYSOd.SNx1i7i8Zx+g62Lyz59M4GusL2wcZxOXexP1anRdTR4Q2cb0fT9wKHcaY0LyEmDDbUFpl4huK0VARIbvl5nLQ6x3BRrovj8oW7LFi93as5POqsLv9XU9Z+q1IWt9muTkeZV7JLPisod8cI6vNg3B7fPM98..nCNvUNv5nqiM4Ld+dbF0NcT7.BbiktcIhzZOyIDb2F3wCRr7jMNf3RvoON+Ka7R3XHV.wIxDFKpL9whaa85mrhjKRkZB8v.wk++mHtC3ARJqaSLrQ8LCSq8B7ZCjEaBnDFi3BCjkYNU9fnxkUkiPKLmvB+C7ItxJpxlwUVYPkSJFc46IXzKWWiQu+gQW9K.LJP.0Xz6.itrFipwnZL5zCitx8kmFcCMF89GFcEMF8AAFcEMFUiQ0XzoGFsp9k5pwn2HFsp9k59f.iVUiQ0XTMFc5gQWU+Rc0XzaDitp9oQePfQWUiQ0XTMFc5gQqoeotYgQm7i2ewiNqoQmOHPm0znSM5TiNGCz4miwvCaK3u2NJokZu7WGZAl2rv+MdJX0TUFUYPVJKqxKU1vCxJ+daaU39Wg3S1sY4InMqLAso5DzlUmf1TaBZyuMAs42u01n.haFH4dQGEACs1I7OxeSycXXXmb3tdi+EfGr3z6
Interesting part:
const var muters = [[Synth.getMidiProcessor("MidiMuter1"), Synth.getMidiProcessor("MidiMuter4")], [Synth.getMidiProcessor("MidiMuter2"), Synth.getMidiProcessor("MidiMuter5")], [Synth.getMidiProcessor("MidiMuter3"), Synth.getMidiProcessor("MidiMuter6")]] reg rrIndex = 0; function onNoteOn() { local index = 0; for(pair in muters) { for(m in pair) { m.setAttribute(0, rrIndex != index); } // Move the incrementation here or it will be incremented 6 times instead of three index++; } rrIndex++; if(rrIndex == muters.length) rrIndex = 0; }
This should be adaptable to your setup without too many hurdles...
-
Thanks! It adapted perfectly :-)
-
This post is deleted!