On 10/08, Julius Smith wrote: > > Very nice! Stéphane's solution is to add the needed state in a > subclass of dsp defined in the architecture file. See the attached > simple example ttfs = "test ffunction with state".
Heh. Thanks, now I understand what you mean. This is very inconvenient and limited. And btw, this example doesn't look right. import("stdfaust.lib"); ff_smooth = ffunction(float ff_smooth(float,float),"",""); ff_init = ffunction(float ff_init(float),"",""); smoothness0 = 0.5; smoothness1 = 0.9; smoother(smoothness) = ff_smooth(smoothness) : attach(ff_init(ma.SR)); smoother0 = smoother(smoothness0); smoother1 = smoother(smoothness1); but this will not create 2 smoothers, class State has a single "float state" initialized twice in a row, and then process = 1-1' <: smoother0 , smoother1; ff_smooth() will be called twice too; the smoothness/x args are correct but again, both calls will play with the same "state". I modified tffs.dsp: smoother = FPP(smoothness, x) { // shared by all instances, this is only needed to create the // unique "$smoother" id printed below. DECL: int smoothers; INIT: smoothers = 0; // every instance has its own state/smother decl: int $smoother; float $state; init: $state = 0; $smoother = smoothers++; std::cout << "created smoother " << $smoother << std::endl; exec: $state = (1.0f - $smoothness) * $x + $smoothness * $state; std::cout << "smoother " << $smoother << ": " << $smoothness << ", x: " << $x << ", y: " << $state << std::endl; $state; }; smoothness0 = 0.5; smoothness1 = 0.9; smoother0 = smoother(smoothness0); smoother1 = smoother(smoothness1); process = 1-1' <: smoother0 , smoother1; then changed Makefile to run fpp instead of faust, and the output is created smoother 0 created smoother 1 smoother 0: 0.5, x: 1, y: 0.5 smoother 1: 0.9, x: 1, y: 0.1 smoother 0: 0.5, x: 0, y: 0.25 smoother 1: 0.9, x: 0, y: 0.09 smoother 0: 0.5, x: 0, y: 0.125 smoother 1: 0.9, x: 0, y: 0.081 smoother 0: 0.5, x: 0, y: 0.0625 smoother 1: 0.9, x: 0, y: 0.0729 smoother 0: 0.5, x: 0, y: 0.03125 smoother 1: 0.9, x: 0, y: 0.06561 smoother 0: 0.5, x: 0, y: 0.015625 smoother 1: 0.9, x: 0, y: 0.059049 smoother 0: 0.5, x: 0, y: 0.0078125 smoother 1: 0.9, x: 0, y: 0.0531441 smoother 0: 0.5, x: 0, y: 0.00390625 smoother 1: 0.9, x: 0, y: 0.0478297 which looks correct. process = 1-1' <: par(i, 10, smoother((i+1)/10)); outputs created smoother 0 created smoother 1 created smoother 2 created smoother 3 created smoother 4 created smoother 5 created smoother 6 created smoother 7 created smoother 8 created smoother 9 smoother 0: 0.1, x: 1, y: 0.9 smoother 1: 0.2, x: 1, y: 0.8 smoother 2: 0.3, x: 1, y: 0.7 smoother 3: 0.4, x: 1, y: 0.6 smoother 4: 0.5, x: 1, y: 0.5 smoother 5: 0.6, x: 1, y: 0.4 smoother 6: 0.7, x: 1, y: 0.3 smoother 7: 0.8, x: 1, y: 0.2 smoother 8: 0.9, x: 1, y: 0.1 smoother 9: 1, x: 1, y: 0 ... No need to create a subclass, no need to write the additional C++ code, etc. Oleg. _______________________________________________ Faudiostream-devel mailing list Faudiostream-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-devel