hey,
how can i create a NdefParamGui where some of the parameters like freq (freqLo and freqHi) and overlap (overlapLo and overlapHi) get an EZRanger and some others like tFreq just a normal slider. i would like to place the NdefGui with some other GUIs for modulation on a main window.
(
var multiChannelTrigger = { |numChannels, trig|
numChannels.collect{ |chan|
PulseDivider.ar(trig, numChannels, chan);
};
};
var multiChannelPhase = { |triggers, rates|
triggers.collect{ |localTrig, i|
var hasTriggered = PulseCount.ar(localTrig) > 0;
Sweep.ar(localTrig, rates[i] * hasTriggered);
};
};
var multiChannelDemand = { |triggers, demandUgen|
var demand = demandUgen;
triggers.collect{ |localTrig|
Demand.ar(localTrig, 0, demand)
};
};
var hanningWindow = { |phase|
(1 - (phase * 2pi).cos) / 2 * (phase < 1);
};
SynthDef(\simplePulsar, {
var numChannels = 5;
var tFreq, trig, triggers;
var grainFreqs, overlaps, maxOverlaps, windowRates;
var windowPhases, grainWindows, pulsaretPhases, pulsarets, sig;
tFreq = \tFreq.kr(5);
trig = Impulse.ar(tFreq);
triggers = multiChannelTrigger.(numChannels, trig);
grainFreqs = multiChannelDemand.(triggers, Dwhite(0, 1)).linexp(0, 1, \freqLo.kr(1000), \freqHi.kr(1000));
overlaps = multiChannelDemand.(triggers, Dwhite(0, 1)).linexp(0, 1, \overlapLo.kr(1), \overlapHi.kr(1));
maxOverlaps = min(overlaps, numChannels * (grainFreqs / tFreq));
windowRates = grainFreqs / maxOverlaps;
windowPhases = multiChannelPhase.(triggers, windowRates);
grainWindows = hanningWindow.(windowPhases);
pulsaretPhases = multiChannelPhase.(triggers, grainFreqs);
pulsarets = sin(pulsaretPhases * 2pi);
pulsarets = pulsarets * grainWindows;
pulsarets = PanAz.ar(2, pulsarets, 0);
sig = pulsarets.sum;
sig = sig * \amp.kr(-25.dbamp);
sig = LeakDC.ar(sig);
OffsetOut.ar(\out.kr(0), sig);
}).add;
)
~simplePulsar = ~simplePulsar ? ();
~simplePulsar[\name] = \simplePulsar;
Ndef(~simplePulsar[\name]).prime(\simplePulsar);
i have compied this from one TdefGui example and trying to make it work for my use case:
(
q = q ? ();
// some globals
q.paramRNames = [\freqRange, \durRange, \densRange, \ampRange, \panRange];
q.paramNames = [\freq, \grDur, \dens, \amp, \pan];
q.makeSynthGUI = { |q, ndef, posPoint|
var w, ezRangers;
posPoint = posPoint ? 150@600; // where to put the gui window
w = Window.new("simplePulsar",
Rect.fromPoints(posPoint, (posPoint + (400@300)))).front;
w.view.decorator_(FlowLayout(w.bounds.copy.moveTo(0, 0)));
w.view.decorator.nextLine;
// a just in time - gui for the Tdef
z = NdefParamGui(ndef, parent: w);
w.view.decorator.nextLine;
// the range sliders display the current values
ezRangers = ();
q.paramRNames.do { |name, i|
ezRangers.put(name,
EZRanger(w, 400@20, name, q.paramNames[i],
{ |sl| ndef.envir.current[name] = sl.value; },
ndef.envir.current[name], labelWidth: 70, numberWidth: 50, unitWidth: 10)
.round_([0.1, 0.00001, 0.0001, 0.0001, 0.01][i])
);
};
};
q.makeSynthGUI(Ndef(\simplePulsar))
)