1

SuperCollider: 制御レート変数をスカラー値にダウンサンプリングするにはどうすればよいですか?

たとえば、~delay という名前のスカラー グローバルがあり、いくつかの関数がその値を気にします。彼らはそれがスカラーであると仮定しています。コントロールレート変数を介して変更するために、その変数にエンベロープジェネレーターを設定したかったのです。または、MouseX.kr を使用します。MouseX.kr の単一の値をスカラー値に変換できれば幸いです。

コードをリファクタリングして k-rate グローバルを許可できないため、制御レート変数から単一の値をサンプリングまたはダウンサンプリングする必要があるとします。

私はこれを行うことはできません:

    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

0

多くの調査の後、私は 1 つの解決策を思いつきました: コントロール バスを使用して値を取得します。関数を入力 (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;

このソリューションがどれほど慣用的なものなのか、それが適切なのか、それともうまく機能するのかはわかりません。

このソリューションの問題点の 1 つは、pf が隠されているため、停止できないことです。

1 つの代替方法は、拡張ディレクトリにクラスを作成する 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 に答える