Listening, triggering, and responding to an unpredictable and changing world of sounds and each other.
// Dependencies: KF and Ouroboros quarks
(
KF.audioDir = Ouroboros.audioDir;
KF.start(
doWhenBooted: {
// initialize
fork{
var maxSize = 4;
var count = 0;
var scrambleClasses = true;
var scrambleMBs = false;
var mbs = if(scrambleMBs, {
KF.mb.scramble;
},{
KF.mb;
});
~mbPool = [
MBContainer.new(OuMBAngelDust),
MBContainer.new(OuMBBodyPerc),
MBContainer.new(OuMBBubbles),
MBContainer.new(OuMBCeramics),
MBContainer.new(OuMBCrackle),
MBContainer.new(OuMBPianoRun),
MBContainer.new(OuMBXyloStretch),
MBContainer.new(MBAngel),
MBContainer.new(MBBd, [\db, 0]),
// MBContainer.new(MBBeeShuffle),
MBContainer.new(MBBreathulator, [\db, -4]),
MBContainer.new(MBCellulator, [\db, -8]),
MBContainer.new(MBDidgGranulated),
MBContainer.new(MBEarthulator),
MBContainer.new(MBFlutterSpeak),
MBContainer.new(MBFmFb),
// MBContainer.new(MBGremlins),
MBContainer.new(MBGrowly),
MBContainer.new(MBHighMetals, [\db, 16]),
MBContainer.new(MBKlang),
MBContainer.new(MBPapertearGranulated),
// MBContainer.new(MBScreamsFromHell, [\db, -12]),
MBContainer.new(MBScreamsFromHellLow, [\db, -6]),
MBContainer.new(MBStormThunderShuffle),
MBContainer.new(MBStormulator),
MBContainer.new(MBTreePerculator),
MBContainer.new(MBTrumpetulator),
MBContainer.new(MBVemKan, [\db, 20]),
MBContainer.new(MBWalkGravel),
MBContainer.new(MBWindWhistle, [\db, -6]),
MBContainer.new(MBWindy),
];
if(scrambleClasses, {
~mbPool = ~mbPool.scramble;
});
~mbContainers = List.new(maxSize);
mbs.reverse.pairsDo({|mbID1, mbID2|
if(~mbContainers[count].isNil, {
~mbContainers.add(~mbPool[count].createInstance);
});
~mbContainers[count].play(mbID1);
~mbContainers[count].play(mbID2);
count = count + 1;
});
Tdef(\cycleMBs, {
loop{
mbs.pairsDo{|mbID1, mbID2|
var waitTime;
// TODO: how to make all mbs do the same sound at some point in time?
// Possible solution is to make these conditional:
~mbContainers.pop.free;
~mbContainers.addFirst(~mbPool[count.mod(~mbPool.size)].createInstance);
~mbContainers[0].play(mbID1);
~mbContainers[0].play(mbID2);
count = count + 1;
waitTime = rand(1.0).lincurve(0.0, 1.0, 5, 30, -3);
waitTime.wait;
};
}
}).play;
}
}
)
)
(
Tdef(\cycleMBs).stop;
~mbContainers.do(_.free);
~mbPool.do(_.free);
)