Set Sampler Volume
-
Hey,
i want to use multiple samplers and set their volumes through knobs.
It tried it like thisinline function onVolumeSliderControl(component, value) { reg x = Synth.getSampler("Top"); x.setAttribute(0,!value); reg x = Synth.getSampler("Bottom"); x.setAttribute(0,!value); reg x = Synth.getSampler("Room"); x.setAttribute(0,!value); }; Content.getComponent("VolumeSlider").setControlCallback(onVolumeSliderControl);
but the result is weird and seems not to work.
any idia?
-
-
You can't declare
reg
variables inside a inline function. Uselocal
. -
You can't declare a variable twice.
-
Create the references to the modules in the
onInit
callback. You are creating three references including a full tree search for every slider movement which is terrible performance. Even worse, if you automate it, you'll end up with drop outs. -
Don't use magic numbers (
0
as parameter index). UseTop.Gain
for this, there's no performance overhead and the code gets 100x more clear and sustainable - if I decide that I add another parameter before the Gain parameter, it will break your code, theTop.Gain
would then automatically point to1
. I admit it's highly unlikely that I do this, especially for the first parameter of the most generic module, but it's good practice. -
If you want to control the volume of a sampler with a knob, use a Simple Gain module. You will get a decibel range and much smoother movements. The
Gain
parameter of a sound generator is not smoothed for performance reasons (you can end up with dozens of sound generators which in 99% of all cases have a static volume).
I can't say what range you are using in theVolumeSlider
, but if you use a Simple Gain module and set themode
to"Decibel"
, it should work. -
Try to avoid repeating code. Use an array for the sampler references.
Add three Simple Gain modules to the samplers, rename them accordingly and try this code:
// Use an array with the references const var Gainers = []; Gainers.push(Synth.getEffect("TopGain")); Gainers.push(Synth.getEffect("BottomGain")); Gainers.push(Synth.getEffect("RoomGain")); inline function onVolumeSliderControl(component, value) { for(g in Gainers) g.setAttribute(g.Gain, value); }; Content.getComponent("VolumeSlider").setControlCallback(onVolumeSliderControl);
This is the HISE Snippet containing a full example:
HiseSnippet 1514.3oc6aEsaaaCEkJNrs1qsnsnOrG1CBAa.NXco1oosaHXnt1ooKX0MFwocaXXnfQh1lnRjBTTo0aneHaeEaXOs25Wv9.1WQ+C1tjRJltyKwZMqqIP5gBwK4k7v68xKuGE2dRgGMNVHQNU2cbDE4bdb+wb0nNiHLNZqMPNWD2kDqnR2TQsGGQhio9HGmJ2WKvo5hHyyqtSaR.g6QmHBgdrf4Qe.KjolHMp0WxBB1j3S2kEZM50Zskmf2QDHR.7TA2.EQ7dJYH8gD8vV.ibv2ymoDx9JhhFibVrsveb+QhmwSG+iYwr8Bn5FMQ8gIJU7lh.eMh0ui5LhE32KeeGiPNms2DqPkTqvUwcY9rCjOwZbISGtSzv1d3rvgAul+KgmiE7VLEdWF22SxhTS5Qis2CuEGbTCHfKvFVoiEsvWr.ti.FAWsRH4ozMkPiCzn9sZz3Zt2rQikW+B0tPsqec2GEScIbWhTRF69LlZjqZD0URGPkTvKGWCbVwJ28IRWcf.UF694te62sdsrVqDkDOptIZZkgT08FLf5opuzthH8.VZ4kOpQ1VnThv4bv6HrFZMFO.Fr6fDtmhI3tB9iEAIgz9ALepTaEjhf5dhvHAGrGWC1EAIzkq8C0bgmABY8gtLd99ZYiT8yvUhop6pTR1dIJZ8gqnGQt1qW6EvRmahAr0Ie9quj8xuzx5YICDcHAA6Ag40mIDWdcqsvCEJ5175ZTVs1Kp858LXvr5JahBnxY0q9.n7PTqNOIbOpzx9nGGDGNcf9Ylu.cuTSi0.E7s3L01Qzr1SNJzbFGEPY1V8ghL.BCUYNRbwriDolODyWKx1hhLaA6bSnGs0FDEIe1fIFVrHpTwz6ImMn6C4tROvUEuAM9oJQjYrYdUjSs4cseNj5x4Wgkbr9ktvKgB+r40isGM.EZmJ8adYH441PER.G0m88F3+S+n942tSbxfAL8Dic8aC566GP6IhYZO3DcW8kn+d9CHKlvOIfnlN0lNXNqC8bXmCQmmfCy8X678EHeWiYlualN44DtWF2io7FMa7tvLvK3m+uFuY2dbAbZVoIfcQ7le8w6UEGET9fTnbEbekjRfnqg8IgQPZ.CdvXHM7a26x6IoABhedTb5vdYq1PTLUNszetkYotanHgO0ZksE1gFQIptomfN.d6ry8khjnWWqWcGSbxtRHIKXEr6XaNEL4J6IoiTDGO.1Nl4J1tqdIxgZak0JR2GtcXZYOLIDb6bNMHVeT2ADYlpF6RL9yOBu5ZqL8y9aC+yfOV+5m0wzNUklEWkUKtJ2n3prVwU4lEWkaUbUtcgTIMZpKIZl0Vdt4q1RP8dDvaac1sMan0TqkLchUqgdP3lA3Vq1QTS3Y9enj0i+T3u423TY9f6QTUc0bL1moca2iuOjpBjjdMyFzAjj.0ARsAYWAWDMRvYdSmW.JPb3PpzF5yb+.kRBoklH4ps1gFPIwVI19vVO.JBkHmNcWgLEMmeSwg4tdebJbc0o5cOcTnPkS8EJbjt7yd.weSz+8ygRUbFUsCoNADZCZ.YJa2Ww7UirJks0LpjvoxwUr6hycPfF3mbBZuB1XXOIAXii+jCfuDFt29c.3tiHQA0k1k.2YnYyAEP1GJZ1iZWF4B5RSSa2P2VCn9TtuoweBOYc1LulScmMy6bdMI.OVScKtvNTpdG2+cdrojOWM2iSy9Nu7oB1aYua9pENUnbcQiF5tA.Sjfo9fAYeb.nvVTrwoFpKFcQskCj0mrOMsfhT77OxcpKyK+aJnySiWu.jLOGN8K3cJhmYqe4OZUxyrjmYIOyRdlk7LK4YVxy7Mmm44wS9C8UR0rjpYIUyRplkTMKoZVDplmAq+8ebZ5On4veujnYIQyRhlkDMKIZVRzrjn4w.QyZ37ejnkzLKoYVRyrjlYIMyRZlq+1YSGR7jhm3k9qVWu0OmQBf.t4+cKUwc0scal+6TW6rBg5behmm9VzOAbWyViUKrF2nvZrVg03lEViaUXMtcg03SODMzjJtahRDll7Dg9K7T9lS.
-
-
Thanks alot!
That helps me out :) -
@Christoph-Hart Can we use the Property Editor to control the output of a sampler's volume?
I think I have the settings correct for my knob, but it only brings the sampler volume to -100dB and then does nothing. -
@dustbro You should use a simple gain plugin to avoid nasty noises when changing volume. If you really need to change the volume of a container directly you need to set your knob's min and max to 0 and 1. There is a function (one of the Engine ones) that can convert this value to a dB value if you need to display it anywhere.
-
@d-healey Thanks man! I was trying to avoid adding too many modules in this instrument... but that's definitely the easies route.
-
@Christoph-Hart said in Set Sampler Volume:
-
You can't declare
reg
variables inside a inline function. Uselocal
. -
You can't declare a variable twice.
-
Create the references to the modules in the
onInit
callback. You are creating three references including a full tree search for every slider movement which is terrible performance. Even worse, if you automate it, you'll end up with drop outs. -
Don't use magic numbers (
0
as parameter index). UseTop.Gain
for this, there's no performance overhead and the code gets 100x more clear and sustainable - if I decide that I add another parameter before the Gain parameter, it will break your code, theTop.Gain
would then automatically point to1
. I admit it's highly unlikely that I do this, especially for the first parameter of the most generic module, but it's good practice. -
If you want to control the volume of a sampler with a knob, use a Simple Gain module. You will get a decibel range and much smoother movements. The
Gain
parameter of a sound generator is not smoothed for performance reasons (you can end up with dozens of sound generators which in 99% of all cases have a static volume).
I can't say what range you are using in theVolumeSlider
, but if you use a Simple Gain module and set themode
to"Decibel"
, it should work. -
Try to avoid repeating code. Use an array for the sampler references.
Add three Simple Gain modules to the samplers, rename them accordingly and try this code:
// Use an array with the references const var Gainers = []; Gainers.push(Synth.getEffect("TopGain")); Gainers.push(Synth.getEffect("BottomGain")); Gainers.push(Synth.getEffect("RoomGain")); inline function onVolumeSliderControl(component, value) { for(g in Gainers) g.setAttribute(g.Gain, value); }; Content.getComponent("VolumeSlider").setControlCallback(onVolumeSliderControl);
This is the HISE Snippet containing a full example:
HiseSnippet 1514.3oc6aEsaaaCEkJNrs1qsnsnOrG1CBAa.NXco1oosaHXnt1ooKX0MFwocaXXnfQh1lnRjBTTo0aneHaeEaXOs25Wv9.1WQ+C1tjRJltyKwZMqqIP5gBwK4k7v68xKuGE2dRgGMNVHQNU2cbDE4bdb+wb0nNiHLNZqMPNWD2kDqnR2TQsGGQhio9HGmJ2WKvo5hHyyqtSaR.g6QmHBgdrf4Qe.KjolHMp0WxBB1j3S2kEZM50Zskmf2QDHR.7TA2.EQ7dJYH8gD8vV.ibv2ymoDx9JhhFibVrsveb+QhmwSG+iYwr8Bn5FMQ8gIJU7lh.eMh0ui5LhE32KeeGiPNms2DqPkTqvUwcY9rCjOwZbISGtSzv1d3rvgAul+KgmiE7VLEdWF22SxhTS5Qis2CuEGbTCHfKvFVoiEsvWr.ti.FAWsRH4ozMkPiCzn9sZz3Zt2rQikW+B0tPsqec2GEScIbWhTRF69LlZjqZD0URGPkTvKGWCbVwJ28IRWcf.UF694te62sdsrVqDkDOptIZZkgT08FLf5opuzthH8.VZ4kOpQ1VnThv4bv6HrFZMFO.Fr6fDtmhI3tB9iEAIgz9ALepTaEjhf5dhvHAGrGWC1EAIzkq8C0bgmABY8gtLd99ZYiT8yvUhop6pTR1dIJZ8gqnGQt1qW6EvRmahAr0Ie9quj8xuzx5YICDcHAA6Ag40mIDWdcqsvCEJ5175ZTVs1Kp858LXvr5JahBnxY0q9.n7PTqNOIbOpzx9nGGDGNcf9Ylu.cuTSi0.E7s3L01Qzr1SNJzbFGEPY1V8ghL.BCUYNRbwriDolODyWKx1hhLaA6bSnGs0FDEIe1fIFVrHpTwz6ImMn6C4tROvUEuAM9oJQjYrYdUjSs4cseNj5x4Wgkbr9ktvKgB+r40isGM.EZmJ8adYH441PER.G0m88F3+S+n942tSbxfAL8Dic8aC566GP6IhYZO3DcW8kn+d9CHKlvOIfnlN0lNXNqC8bXmCQmmfCy8X678EHeWiYlualN44DtWF2io7FMa7tvLvK3m+uFuY2dbAbZVoIfcQ7le8w6UEGET9fTnbEbekjRfnqg8IgQPZ.CdvXHM7a26x6IoABhedTb5vdYq1PTLUNszetkYotanHgO0ZksE1gFQIptomfN.d6ry8khjnWWqWcGSbxtRHIKXEr6XaNEL4J6IoiTDGO.1Nl4J1tqdIxgZak0JR2GtcXZYOLIDb6bNMHVeT2ADYlpF6RL9yOBu5ZqL8y9aC+yfOV+5m0wzNUklEWkUKtJ2n3prVwU4lEWkaUbUtcgTIMZpKIZl0Vdt4q1RP8dDvaac1sMan0TqkLchUqgdP3lA3Vq1QTS3Y9enj0i+T3u423TY9f6QTUc0bL1moca2iuOjpBjjdMyFzAjj.0ARsAYWAWDMRvYdSmW.JPb3PpzF5yb+.kRBoklH4ps1gFPIwVI19vVO.JBkHmNcWgLEMmeSwg4tdebJbc0o5cOcTnPkS8EJbjt7yd.weSz+8ygRUbFUsCoNADZCZ.YJa2Ww7UirJks0LpjvoxwUr6hycPfF3mbBZuB1XXOIAXii+jCfuDFt29c.3tiHQA0k1k.2YnYyAEP1GJZ1iZWF4B5RSSa2P2VCn9TtuoweBOYc1LulScmMy6bdMI.OVScKtvNTpdG2+cdrojOWM2iSy9Nu7oB1aYua9pENUnbcQiF5tA.Sjfo9fAYeb.nvVTrwoFpKFcQskCj0mrOMsfhT77OxcpKyK+aJnySiWu.jLOGN8K3cJhmYqe4OZUxyrjmYIOyRdlk7LK4YVxy7Mmm44wS9C8UR0rjpYIUyRplkTMKoZVDplmAq+8ebZ5On4veujnYIQyRhlkDMKIZVRzrjn4w.QyZ37ejnkzLKoYVRyrjlYIMyRZlq+1YSGR7jhm3k9qVWu0OmQBf.t4+cKUwc0scal+6TW6rBg5behmm9VzOAbWyViUKrF2nvZrVg03lEViaUXMtcg03SODMzjJtahRDll7Dg9K7T9lS.
Hi all,
If i want to control for example Only "TopGain", shouldnt it work if i changeg.setAttribute(g.Gain, value);
tog.setAttribute(g[0].Gain, value);
?Thanks!
-
-
@ten7kur No. g only exists within the for loop. You'd need to reference the
Gainers
array directly, no loop required. -
@d-healey said in Set Sampler Volume:
You'd need to reference the Gainers array directly, no loop required.
mhm.Gotcha! Thanks!
Im trying to slim my script down(for performance reasons). So a direct reference wouldnt make much difference in my current script state. (i think).
Will post a new thread.