039 MB Machine

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);
)