1

在 SuperCollider 中:如何将控制率变量下采样为标量值?

例如,我有一个名为 ~delay 的标量全局变量,一些函数关心该值。他们假设它是一个标量。我想在该变量上设置一个包络生成器,以便通过控制速率变量对其进行更改。或者使用 MouseX.kr,如果我可以将 MouseX.kr 的单个值转换为标量值,我会很高兴。

假设我无法重构代码以允许全局 k 速率,因此我需要从控制速率变量中采样或下采样单个值。

我不能这样做:

    MouseX.kr(1, 4, 1).rand.wait;

但我会很高兴:

    downSample(MouseX.kr(1, 4, 1)).rand.wait;

或者

    ~mousex = MouseX.kr(1, 4, 1)
    ...
    downSample(~mousex).rand.wait
4

2 回答 2

1

这是经典的SuperCollider语言与服务器问题。您想在语言端计算中使用 MouseX(它表示服务器对鼠标位置的了解)。(“为什么要分裂?为什么语言不能使用同一个对象知道它?” - 好吧,想象这两个进程在不同的机器上运行 - 不同的老鼠......)

要获得语言中的鼠标位置,最好使用以下之一:

 Platform.getMouseCoords  // SC up to 3.6
 GUI.cursorPosition // SC recent versions

如果您确定要使用该语言的服务器数据,那么您自己关于通过总线发送的答案是一种方法。最近版本的 SuperCollider 有方法

 Bus.getSynchronous
 Bus.setSynchronous

它依赖于语言和服务器之间新的“共享内存接口”。如果两者在同一台机器上,那么这可能是一种很好的方法,可以避免异步请求信息的延迟。

于 2013-04-15T15:13:48.053 回答
0

经过大量研究,我想出了一个解决方案:使用控制总线来获取值。我们将一个函数作为输入 (f),然后将其播放到总线上。

然后,我们通过调用总线上的 get 方法并提供允许我们从抛出的函数中提取值的函数来从该总线读取数据。

    ~mkscalarfun = {
        arg f={ 0 };
        var last = 0.0;
        var mbus = Bus.control(s, 1);   
        var pf = f.play(s,mbus);
        var scalarf = {
            mbus.get({|v| last = v;});
            last;
        };
        scalarf; // This is a function
    };
    // Create a closure that includes the bus
    ~mousescalarf = ~mkscalarfun.({ MouseX.kr(1,  4, 1); });
    ~mousescalarf.();
    ~mousescalarf.().rand.wait;

我不确定这个解决方案有多惯用,或者它是否合适,或者它的性能如何。

此解决方案的一个问题是 pf 是隐藏的,因此您无法阻止它。

一种替代方法是使用 OO 解决方案,在扩展目录中创建一个类:

    MakeScalarKR {
        var last;
        var mbus;
        var pf;
        var f;
        *new { arg sbase,f;
            ^super.new.init(sbase,f)
        }
        init { 
            arg sbase,myf;
            f = myf;
            last = 0.0;
            mbus = Bus.control(sbase, 1);   
            pf = f.play(sbase, mbus);
        }
        v {
            mbus.get({|x| last=x;});
            ^last
        }
        free {
            pf.free
        }
    }

然后你可以像这样调用这个类:

    ~mkr = MakeScalarKR(s,{ MouseX.kr(10,400,1) });
    ~mkr.v()
于 2013-04-15T06:14:32.787 回答