then try this variant.
(
w = Window.new("A Slider");
a = Slider.new(w, Rect(40, 10, 300, 30));
w.front
);
(
Tdef(\sliderPlayer).set(\dur, nil);
Tdef(\sliderPlayer, {|envir|
var durs, idurs, startTime, i, v;
var updateRate = 0.05; // ‘resolution’
inf.do{
if(envir.dur.isArray and:{envir.dur != durs}, {
{a.knobColor = Color.green}.defer; //optional
durs = envir.dur;
idurs = [0] ++ durs.integrate;
startTime = Main.elapsedTime;
while({
(v = Main.elapsedTime - startTime) < idurs.last
}, {
i = idurs.indexOfGreaterThan(v) - 1;
{a.value = v - idurs[i] / durs[i]}.defer;
updateRate.wait;
});
{a.value = 1.0; a.knobColor = Color.red}.defer; //optional
});
updateRate.wait;
};
}).play;
)
Tdef(\sliderPlayer).set(\dur, [10, 2, 3])
Tdef(\sliderPlayer).set(\dur, [3, 2, 1]) //if executed before the above finishes, this will queue
_f
16 juli 2021 kl. 11:27 skrev marcin pietruszewski via scsynth <noreply@m.scsynth.org>:
| marcin_pietruszewski
July 16 |
These are great @jamshark70 and @redFrik.
I have one more question. Why is ‘dur’ an array? Essentially, I would like to be able to set a new value using Tdef.set method. I have tried substituting durs with envir.dur, but it doesn’t work:
Tdef(\sliderPlayer).set(\dur, [10, 2, 3])
(
Tdef(\sliderPlayer, {|envir|
var durs = envir.dur;
var updateRate = 0.05; // ‘resolution’
var idurs = [0] ++ durs.integrate;
var startTime = Main.elapsedTime;
inf.do{
var v = Main.elapsedTime - startTime % idurs.last;
var i = idurs.indexOfGreaterThan(v);
{a.value = v - idurs[i-1] / durs[i-1]}.defer;
updateRate.wait;
};
}).play;
)
Ideally I would like to be able to set one value, wait for cycle to complete and then use it for new cycle and so on.
Thanks for your help
m
#|
fredrikolofsson.com musicalfieldsforever.com