0

我不确定 SuperCollider 是否可以在棍子上提供卫星,但我真的希望能够在 my 中指定以与orPbind相同的方式解释的值:即自动转换为频率。midinotedegree

所以,这样的一个摘录Pbind,它产生了一个 TB-303 风格的幻灯片,从一个频率到另一个频率:

b = Pbind(*[
    out: 0,
    instrument: \acid,
    stepsPerOctave: 19,
    scale: [0, 3, 5, 8, 11, 14, 17],
    octave: 3,
    degree: Pseq([0, \, 3, 3, 4, 4, 9, 4, 4]),
    prevFreq: Pseq([\, \, 0, 3, 3, 4, 4, 9, 4]),
    dur: Pseq([0.4, 0.4, 0.1, 0.1, 0.1, 0.1, 0.2, 0.1, 0.1]),
]);

...如果prevFreq以与degree.

在没有某种自动转换的情况下,我假设我需要在合成器本身内进行某种计算,以便将我的值从degree-type 值转换为实际频率。我知道我可以foo.midicps用来将midinote-type 值转换为频率,但是是否有类似的便利函数可以将degree-type 值转换为频率(大概也使用当前scaleoctave值)?

4

1 回答 1

1

如果您查看 Event 的帮助文件,您可以看到它如何根据程度和规模计算频率:

note: #{    // note is the note in halftone steps from the root
    (~degree + ~mtranspose).degreeToKey(~scale, ~stepsPerOctave);
}
midinote: #{    // midinote is the midinote (continuous intermediate values)
    ((~note.value + ~gtranspose + ~root) / ~stepsPerOctave + ~octave) * 12.0;
}
freq: #{
    (~midinote.value + ~ctranspose).midicps * ~harmonic;
}
detunedFreq: #{    // finally sent as "freq" to the synth as a parameter, if given
    ~freq.value + ~detune
}

Event 是一个关联数组,这些 ~ 变量也可以用作数组的键(希望稍后会变得清晰。也可以通过使用 Pfunc 访问 Pbind 中的事件。假设我们想要计算 Pbind 的当前频率:

b = Pbind(*[
    out: 0,
    instrument: \default,
    stepsPerOctave: 19,
    scale: [0, 3, 5, 8, 11, 14, 17],
    octave: 3,
    degree: Pseq([0, \, 3, 3, 4, 4, 9, 4, 4]),
    dur: Pseq([0.4, 0.4, 0.1, 0.1, 0.1, 0.1, 0.2, 0.1, 0.1]),
    foo: Pfunc({|evt|
        var note, midinote, freq, detuned, result;
        note = (evt[\degree] + evt[\mtranspose]).degreeToKey(evt[\scale], evt[\stepsPerOctave]);
        midinote = ((note + evt[\gtranspose] + evt[\root]) / evt[\stepsPerOctave] + evt[\octave]) * 12.0;
        freq =  (midinote + evt[\ctranspose]).midicps * evt[\harmonic];
        detuned = freq + evt[\detune];
        detuned.postln;
    })
]).play

note、midinote、freq 和 detuned freq 的计算与我们在事件帮助文件中看到的计算相同。因此,此 Pbind 现在将打印出您当前正在播放的频率。

你真正想要的是你之前演奏的频率,我们可以从你之前的度数数组中计算出来。或者我们可以只跟踪变量中的先前频率。这将更容易跟踪!

(

var prev;

b = Pbind(*[
    out: 0,
    instrument: \default,
    stepsPerOctave: 19,
    scale: [0, 3, 5, 8, 11, 14, 17],
    octave: 3,
    degree: Pseq([0, \rest, 3, 3, 4, 4, 9, 4, 4]),
    dur: Pseq([0.4, 0.4, 0.1, 0.1, 0.1, 0.1, 0.2, 0.1, 0.1]),
    prevFreq: Pfunc({|evt|
        var note, midinote, freq, detuned, result;

        if (evt[\degree] == \rest, { detuned = \rest} , {
            note = (evt[\degree] + evt[\mtranspose]).degreeToKey(evt[\scale], evt[\stepsPerOctave]);
            midinote = ((note + evt[\gtranspose] + evt[\root]) / evt[\stepsPerOctave] + evt[\octave]) * 12.0;
            freq =  (midinote + evt[\ctranspose]).midicps * evt[\harmonic];
            detuned = freq + evt[\detune];
        });

        //detuned.postln;

        if (prev.isNil(), { 
            result = \rest;
            } , 
            {
                result = prev;
        });

        prev = detuned

    })
]).play
)
于 2014-06-02T20:32:41.440 回答