我不确定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
- 类型值转换为实际频率。我知道我可以使用degree
将foo.midicps
- 类型值转换为频率,但是有一个类似的便利函数可以将midinote
- 类型值转换为频率(可能也使用当前的degree
和scale
值?
答案 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
)