我可以在Pbind中发送被解释为midinote或degree的值吗?

时间:2013-09-15 19:03:24

标签: supercollider

我不确定SuperCollider是否可以在棍棒上传送卫星,但我真的希望能够在我的Pbind中指定与midinote或{的解释方式相同的值{1}}:即自动转换为频率。

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

Pbind

...如果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 - 类型值转换为实际频率。我知道我可以使用degreefoo.midicps - 类型值转换为频率,但是有一个类似的便利函数可以将midinote - 类型值转换为频率(可能也使用当前的degreescale值?

1 个答案:

答案 0 :(得分: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
}

事件是一个关联数组,那些〜变量也可以用作数组的键(有希望在某一时刻变得清晰。也可以通过以下方式访问Pbind中的事件)使用Pfunc。假设我们想要计算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
)