For my live performances I want to control the global fps of my project via a fader on my MIDI controller (going from 1 to 60fps).
If I go to local/time->rate and map the frame parameter to my fader via MIDI In Map CHOP it works perfectly fine. The only problem is that, no matter if I saved the project, as soon as I close the project and open it up again, all the changes in the local/time folder are undone and I have to redo them.
How can I prevent this from happening or are there better alternative ways to achieve this effect?
My current compromise solution is a cache TOP where I mapped the step size to said MIDI fader but it doesn’t achieve the same effect since it doesn’t lower the FPS but just skips the frames inbetween the steps therefore not slowing down the actual rendering but just the refresh rate.
I couldn’t find anything about this online, so do you have any input for me?
It’s a fairly simple effect but I can’t seem to work it out by myself…
Thanks for the reply!
As I’m pretty much a beginner when it comes to the inner workings of TD, I don’t really understand what you mean.
Where do I enter this command? How do I connect it to a Midi In DAT?
before explaining that, wondering what you are trying to do. Changing the fps on runtime is a rather unusual approach - so perhaps there is a more tested solution to what you want to do.
Changing the fps during runtime will come with frame drops…
But anyway. The Midi In DAT receives incoming Midi information much like the Midi In CHOP does but in a way that it can be easier used together with the provided callbacks.
The Text DAT attached to the Midi In DAT contains a callback which is excuted everytime a new Midi message is received by the referenced device. You can check what kind of data is passed into the callback by printing out the values to the textport:
decide which midi channel is responsible for the adjustment and it could be as simple as:
def onReceiveMIDI(dat, rowIndex, message, channel, index, value, input, byteData):
if message == 'Control Change' and channel == 1 and index == 10:
if value > 0:
me.time.rate = 30
else:
me.time.rate = 60
return
Have to mention it again though - I would not recommend changing the fps during runtime. There is most likely a different way to achieve what you are after.
Aaaah thanks a lot for the thorough explanation, that really helped!
You’re the best! :3
I get what you say about it not being recommended and I’d gladly take another approach if you know one.
So the effect I want to achieve slowing down the actual speed of the render.
Imagine you have a movie file in and play around with the speed or sample rate fader.
I need that but not only limited to movie file ins but for every kind of network rendering.
most often animations are driven by some sort of value. Often people use an expression like absTime.seconds because it\s nice and quick but it makes it difficult to control the speed. You could multiply this value to reduce or increase the increments but this will result in stepping as it’s not a continous change.
Hence it\s recommended to make use of operators like the Speed CHOP, LFO CHOP, or Timer CHOP as drivers for animations - they are independent from frame rate and you have easy control over their “speed”.
Thanks for the help Markus!
Altho that approach definitely works for slowing down animation movement, I’m specifically looking for the choppy look of dropping the frame rate. So after all, as long as the stability of the program isn’t in danger, the frame drops from changing the FPS are actually desireable to me.
I’ll just try out your approach with the MIDI In DAT as soon as I have some days off and give you feedback on how stable it turns out to be.
Hey Markus,
Yeah I tried it out and now I understand what you mean. It makes the program really unstable in the lower framerates and the frame drops each time I change the value are not like I imagined.
Unfortunately so far I still don’t know of any other method to do what I want.
post an example network and we can probably figure something out.
You could make use of cache operators for example or similar - but it all depends on the effect you want to achieve.