040 MB Machine
Published on: 2023-11-22
Description
Listening, triggering, and responding to an unpredictable and changing world of sounds and each other.
Source Code
// 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); )