Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <CsoundSynthesizer>
- <CsOptions>
- -odac
- </CsOptions>
- <CsInstruments>
- ; Initialize the global variables.
- ksmps = 128
- sr = 44100
- 0dbfs = 1
- ;nchnls = 8
- nchnls = 2
- ;===================================================================================================================
- ; krate fluidsynth preset selection
- opcode fluidProgramSelect_k, 0, kkkkk
- keng, kchn, ksf2, kbnk, kpre xin
- igoto skipInit
- doInit:
- fluidProgramSelect i(keng), i(kchn), i(ksf2), i(kbnk), i(kpre)
- reinit doInit
- rireturn
- skipInit:
- endop
- ;===================================================================================================================
- giMelodyEngine fluidEngine
- giMultiEngine fluidEngine
- giChordEngine fluidEngine
- giTexturalEngine fluidEngine
- gkFull = 0
- gkDryProbabilityArrayMelody[] init 100
- gkDryProbabilityArrayMulti[] init 100
- gkDryProbabilityArrayChord[] init 100
- gkDelayProbabilityArrayMelody[] init 100
- gkDelayProbabilityArrayMulti[] init 100
- gkDelayProbabilityArrayChord[] init 100
- gkArpProbabilityArrayMelody[] init 100
- gkArpProbabilityArrayMulti[] init 100
- gkArpProbabilityArrayChord[] init 100
- gkQuantizeProbabilityArrayMelody[] init 100
- gkQuantizeProbabilityArrayMulti[] init 100
- gkQuantizeProbabilityArrayChord[] init 100
- gkFinalPassthroughProbabilityArray[] init 100
- gkHalfArray[] init 2
- gkHalfDiffArray[] init 2
- gkThirdArray[] init 3
- gkThirdDiffArray[] init 3
- gkQuarterArray[] init 4
- gkQuarterDiffArray[] init 4
- gkEighthArray[] init 8
- gkEighthDiffArray[] init 8
- gkTwelthArray[] init 12
- gkTwelthDiffArray[] init 12
- gkSixteenthArray[] init 16
- gkSixteenthDiffArray[] init 16
- gkThirtysecondArray[] init 32
- gkThirtysecondDiffArray[] init 32
- gaLeft = 0
- gaRight = 0
- gaSummed = 0
- gaConvolvedL = 0
- gaConvolvedR = 0
- gaOutputL init 0
- gaOutputR init 0
- gaOutOne init 0
- gaOutTwo init 0
- gaOutThree init 0
- gaOutFour init 0
- gaOutFive init 0
- gaOutSix init 0
- gaOutSeven init 0
- gaOutEight init 0
- massign 1, -1
- ;===================================================================================================================
- instr Initialise
- giMelodySoundfont fluidLoad "/Users/haysholladay/KALIDE_DEMO/AudioEngine/KALIDE_nano_banks2lighter.sf2", giMelodyEngine, 1
- giMultiSoundfont fluidLoad "/Users/haysholladay/KALIDE_DEMO/AudioEngine/KALIDE_nano_banks2lighter.sf2", giMultiEngine, 1
- giChordSoundfont fluidLoad "/Users/haysholladay/KALIDE_DEMO/AudioEngine/KALIDE_nano_banks2lighter.sf2", giChordEngine, 1
- giTexturalSoundfont fluidLoad "/Users/haysholladay/KALIDE_DEMO/AudioEngine/textures.sf2", giTexturalEngine, 1
- fluidProgramSelect giMelodyEngine, 1, giMelodySoundfont, 0, 0
- fluidProgramSelect giMultiEngine, 1, giMultiSoundfont, 0, 0
- fluidProgramSelect giChordEngine, 1, giChordSoundfont, 0, 0
- fluidProgramSelect giTexturalEngine, 1, giTexturalSoundfont, 0, 0
- kCounter init 0
- fillProbs:
- if(kCounter < 50) then
- kVal = 1
- else
- kVal = 0
- endif
- gkDryProbabilityArrayMelody[kCounter] = kVal
- gkDryProbabilityArrayMulti[kCounter] = kVal
- gkDryProbabilityArrayChord[kCounter] = kVal
- gkDelayProbabilityArrayMelody[kCounter] = kVal
- gkDelayProbabilityArrayMulti[kCounter] = kVal
- gkDelayProbabilityArrayChord[kCounter] = kVal
- gkArpProbabilityArrayMelody[kCounter] = kVal
- gkArpProbabilityArrayMulti[kCounter] = kVal
- gkArpProbabilityArrayChord[kCounter] = kVal
- gkQuantizeProbabilityArrayMelody[kCounter] = kVal
- gkQuantizeProbabilityArrayMulti[kCounter] = kVal
- gkQuantizeProbabilityArrayChord[kCounter] = kVal
- loop_lt kCounter, 1, 99, fillProbs
- kCounter = 0
- fillFinal:
- gkFinalPassthroughProbabilityArray[kCounter] = 1
- loop_lt kCounter, 1, 99, fillFinal
- iPos init 0
- kBpm = chnget:k("bpm")
- gkBeatLen = 60/kBpm
- gkFull = gkBeatLen
- gkHalfArray[0] = 0
- gkHalfArray[1] = gkBeatLen / 2
- kCounter = 0
- fillThird:
- gkThirdArray[kCounter] = (gkBeatLen / 3) * kCounter
- loop_lt kCounter, 1, 2, fillThird
- kCounter = 0
- fillQuarter:
- gkQuarterArray[kCounter] = (gkBeatLen / 4) * kCounter
- loop_lt kCounter, 1, 3, fillQuarter
- kCounter = 0
- fillEighth:
- gkEighthArray[kCounter] = (gkBeatLen / 8) * kCounter
- loop_lt kCounter, 1, 7, fillEighth
- kCounter = 0
- fillTwelth:
- gkTwelthArray[kCounter] = (gkBeatLen / 12) * kCounter
- loop_lt kCounter, 1, 11, fillTwelth
- kCounter = 0
- fillSixteenth:
- gkSixteenthArray[kCounter] = (gkBeatLen / 16) * kCounter
- loop_lt kCounter, 1, 15, fillSixteenth
- kCounter = 0
- fillThirtysecond:
- gkThirtysecondArray[kCounter] = (gkBeatLen / 32) * kCounter
- loop_lt kCounter, 1, 31, fillThirtysecond
- turnon "DelayLeft"
- turnon "DelayRight"
- turnon "MelodyPresetSelector"
- turnon "MelodyCycleListener"
- turnon "MultiPresetSelector"
- turnon "MultiCycleListener"
- turnon "ChordPresetSelector"
- turnon "ChordCycleListener"
- turnon "TexturalPresetSelector"
- turnon "FluidListener"
- turnon "DryProbabilityListener"
- turnon "DelayProbabilityListener"
- turnon "ArpProbabilityListener"
- turnon "QuantizeProbabilityListener"
- turnon "ConvolutionListener"
- turnon "FinalProbabilityListener"
- turnon "TexturePlayer"
- turnon "TextureListener"
- turnon "SignalOutput"
- Sdefault = "/Users/haysholladay/KALIDE_DEMO/AudioEngine/IRs/ir8_gym.wav"
- SdefaultScore sprintfk {{i9999 0 -1 "%s"}}, Sdefault
- scoreline SdefaultScore, 1
- turnoff
- endin
- ;=====================================================================================================================
- instr MelodyPresetSelector
- if((changed:k(chnget:k("melodyBankIndex")) == 1) || (changed:k(chnget:k("melodyPresetIndex")) == 1)) then
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), chnget:k("melodyPresetIndex") - 1
- ;event "i", "MelSelectInit", 0, 1, chnget:k("melodyBankIndex") - 1, chnget:k("melodyPresetIndex") - 1
- endif
- endin
- /*instr MelSelectInit
- iBank = p4
- iPre = p5
- fluidProgramSelect giMelodyEngine, 1, giMelodySoundfont, iBank, iPre
- endin*/
- ;===================================================================================================================
- instr MultiPresetSelector
- if((changed:k(chnget:k("multiBankIndex")) == 1) || (changed:k(chnget:k("multiPresetIndex")) == 1)) then
- fluidProgramSelect_k k(giMultiEngine), k(1), k(giMultiSoundfont), chnget:k("multiBankIndex"), chnget:k("multiPresetIndex") - 1
- ;event "i", "MulSelectInit", 0, 1, chnget:k("multiBankIndex") - 1, chnget:k("multiPresetIndex") - 1
- endif
- endin
- /*instr MulSelectInit
- iBank = p4
- iPre = p5
- fluidProgramSelect giMultiEngine, 2, giMultiSoundfont, iBank, iPre
- endin*/
- ;===================================================================================================================
- instr ChordPresetSelector
- if((changed:k(chnget:k("chordBankIndex")) == 1) || (changed:k(chnget:k("chordPresetIndex")) == 1)) then
- fluidProgramSelect_k k(giChordEngine), k(1), k(giChordSoundfont), chnget:k("chordBankIndex"), chnget:k("chordPresetIndex") - 1
- endif
- endin
- ;===================================================================================================================
- instr TexturalPresetSelector
- if(changed:k(chnget:k("texturePreset")) == 1) then
- fluidProgramSelect_k k(giTexturalEngine), k(1), k(giTexturalSoundfont), k(0), chnget:k("texturePreset") - 1
- endif
- endin
- ;===================================================================================================================
- instr ConvolutionListener
- kCounter init 1
- if(changed(chnget:S("convolutionSelector")) == 1) then
- Sconvolution = chnget:S("convolutionSelector")
- kDelimiter strindexk Sconvolution, "."
- kStrLen strlenk Sconvolution
- Sextension strsubk Sconvolution, kDelimiter + 1, kStrLen
- kExtensionComparison strcmpk Sextension, "wav"
- kComparison strcmpk Sconvolution, {{}}
- if((kComparison != 0) && (kExtensionComparison == 0)) then
- SkillInstance sprintfk {{i-9999 0 0.1 "%s"}}, Sconvolution
- scoreline SkillInstance, kCounter
- SconvolutionTrigger sprintfk {{i9999 0 -1 "%s"}}, Sconvolution
- scoreline SconvolutionTrigger, kCounter
- endif
- kCounter += 1
- endif
- endin
- ;===================================================================================================================
- instr MelodyCycleListener
- kCounter init 0
- kCurrentPreset init 0
- if(changed:k(chnget:k("melodyCycle")) == 1) then
- if(chnget:k("melodyCycle") == 1) then
- kCounter = 0
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), (kCurrentPreset + kCounter) % 12
- endif
- endif
- if chnget:k("melodyCycle") == 2 then
- ;printk2 kCurrentPreset
- if(metro(1/chnget:k("melodyCycleDuration")) == 1) then
- kMode = chnget:k("melodyCycleMode")
- if(changed:k(chnget:k("melodyCycleMode")) == 1) then
- kCounter = 0
- endif
- kCurrentPreset = (chnget:k("melodyPresetIndex") + kCounter) % 12
- if(kMode == 1) then
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), kCurrentPreset
- kCounter += 1
- elseif(kMode == 2) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 11 - kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), kCurrentPreset
- kCounter -= 1
- elseif(kMode == 3) then
- kCurrentPreset = chnget:k("melodyPresetIndex") + kCounter
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), kCurrentPreset
- kCounter += 2
- elseif(kMode == 4) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 12 - kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("melodyBankIndex"), kCurrentPreset
- kCounter -= 2
- endif
- endif
- endif
- endin
- ;===================================================================================================================
- instr MultiCycleListener
- kCounter init 0
- kCurrentPreset init 0
- if(changed:k(chnget:k("multiCycle")) == 1) then
- if(chnget:k("multiCycle") == 1) then
- kCounter = 0
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("multiBankIndex"), (kCurrentPreset + kCounter) % 12
- endif
- endif
- if chnget:k("multiCycle") == 2 then
- ;printk2 kCurrentPreset
- if(metro(1/chnget:k("multiCycleDuration")) == 1) then
- kMode = chnget:k("multiCycleMode")
- if(changed:k(chnget:k("multiCycleMode")) == 1) then
- kCounter = 0
- endif
- kCurrentPreset = (chnget:k("multiPresetIndex") + kCounter) % 12
- if(kMode == 1) then
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("multiBankIndex"), kCurrentPreset
- kCounter += 1
- elseif(kMode == 2) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 11 + kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("multiBankIndex"), kCurrentPreset
- kCounter -= 1
- elseif(kMode == 3) then
- kCurrentPreset = chnget:k("multiPresetIndex") + kCounter
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("multiBankIndex"), kCurrentPreset
- kCounter += 2
- elseif(kMode == 4) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 11 + kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("multiBankIndex"), kCurrentPreset
- kCounter -= 2
- endif
- endif
- endif
- endin
- ;===================================================================================================================
- instr ChordCycleListener
- kCounter init 0
- kCurrentPreset init 0
- if(changed:k(chnget:k("chordCycle")) == 1) then
- if(chnget:k("chordCycle") == 1) then
- kCounter = 0
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("chordBankIndex"), (kCurrentPreset + kCounter) % 12
- endif
- endif
- if chnget:k("chordCycle") == 2 then
- ;printk2 kCurrentPreset
- if(metro(1/chnget:k("chordCycleDuration")) == 1) then
- kMode = chnget:k("chordCycleMode")
- if(changed:k(chnget:k("chordCycleMode")) == 1) then
- kCounter = 0
- endif
- kCurrentPreset = (chnget:k("chordPresetIndex") + kCounter) % 12
- if(kMode == 1) then
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("chordBankIndex"), kCurrentPreset
- kCounter += 1
- elseif(kMode == 2) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 11 + kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("chordBankIndex"), kCurrentPreset
- kCounter -= 1
- elseif(kMode == 3) then
- kCurrentPreset = chnget:k("chordPresetIndex") + kCounter
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("chordBankIndex"), kCurrentPreset
- kCounter += 2
- elseif(kMode == 4) then
- if(kCurrentPreset < 0) then
- kCurrentPreset = 11 + kCurrentPreset
- endif
- fluidProgramSelect_k k(giMelodyEngine), k(1), k(giMelodySoundfont), chnget:k("chordBankIndex"), kCurrentPreset
- kCounter -= 2
- endif
- endif
- endif
- endin
- ;===================================================================================================================
- instr DryProbabilityListener
- if(changed:k(chnget:k("dryProbabilityMelody")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryProbabilityMelody")
- fillMelodyArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDryProbabilityArrayMelody[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMelodyArray
- endif
- if(changed:k(chnget:k("dryProbabilityMulti")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryProbabilityMulti")
- fillMultiArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDryProbabilityArrayMulti[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMultiArray
- endif
- if(changed:k(chnget:k("dryProbabilityChord")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryProbabilityChord")
- fillChordArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDryProbabilityArrayChord[kCounter] = kState
- loop_lt kCounter, 1, 99, fillChordArray
- endif
- endin
- ;===================================================================================================================
- instr DelayProbabilityListener
- if(changed:k(chnget:k("delayProbabilityMelody")) == 1) then
- kCounter = 0
- kValue = chnget:k("delayProbabilityMelody")
- fillMelodyArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDelayProbabilityArrayMelody[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMelodyArray
- endif
- if(changed:k(chnget:k("delayProbabilityMulti")) == 1) then
- kCounter = 0
- kValue = chnget:k("delayProbabilityMulti")
- fillMultiArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDelayProbabilityArrayMulti[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMultiArray
- endif
- if(changed:k(chnget:k("delayProbabilityChord")) == 1) then
- kCounter = 0
- kValue = chnget:k("delayProbabilityChord")
- fillChordArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkDelayProbabilityArrayChord[kCounter] = kState
- loop_lt kCounter, 1, 99, fillChordArray
- endif
- endin
- ;===================================================================================================================
- instr ArpProbabilityListener
- if(changed:k(chnget:k("arpProbabilityMelody")) == 1) then
- kCounter = 0
- kValue = chnget:k("arpProbabilityMelody")
- fillMelodyArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkArpProbabilityArrayMelody[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMelodyArray
- endif
- if(changed:k(chnget:k("arpProbabilityMulti")) == 1) then
- kCounter = 0
- kValue = chnget:k("arpProbabilityMulti")
- fillMultiArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkArpProbabilityArrayMulti[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMultiArray
- endif
- if(changed:k(chnget:k("arpProbabilityChord")) == 1) then
- kCounter = 0
- kValue = chnget:k("arpProbabilityChord")
- fillChordArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkArpProbabilityArrayChord[kCounter] = kState
- loop_lt kCounter, 1, 99, fillChordArray
- endif
- endin
- ;===================================================================================================================
- instr QuantizeProbabilityListener
- if(changed:k(chnget:k("dryQuantizeProbabilityMelody")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryQuantizeProbabilityMelody")
- fillMelodyArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkQuantizeProbabilityArrayMelody[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMelodyArray
- endif
- if(changed:k(chnget:k("dryQuantizeProbabilityMulti")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryQuantizeProbabilityMulti")
- fillMultiArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkQuantizeProbabilityArrayMulti[kCounter] = kState
- loop_lt kCounter, 1, 99, fillMultiArray
- endif
- if(changed:k(chnget:k("dryQuantizeProbabilityChord")) == 1) then
- kCounter = 0
- kValue = chnget:k("dryQuantizeProbabilityChord")
- fillChordArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkQuantizeProbabilityArrayChord[kCounter] = kState
- loop_lt kCounter, 1, 99, fillChordArray
- endif
- endin
- ;===================================================================================================================
- instr FinalProbabilityListener
- if(changed:k(chnget:k("finalProbability")) == 1) then
- kCounter = 0
- kValue = chnget:k("finalProbability")
- fillFinalArray:
- if(kCounter < kValue) then
- kState = 1
- else
- kState = 0
- endif
- gkFinalPassthroughProbabilityArray[kCounter] = kState
- loop_lt kCounter, 1, 99, fillFinalArray
- endif
- endin
- ;===================================================================================================================
- instr 1
- kSoundfontChoice = p7
- kSlowdownAmt = chnget:k("slowdownAmt")
- if(kSlowdownAmt == 11) then
- kSlowdownAmt = 1
- else
- kSlowdownAmt /= 10
- kSlowdownAmt += 1
- endif
- kVelocity = p6
- ;kVelocity = 100
- kOctaveAdd = chnget:k("octaveAdder")
- if(chnget:k("minVelocity") > kVelocity) then
- kVelocityCheck = 0
- else
- kVelocityCheck = 1
- endif
- kLength = p3
- if(chnget:k("minLength") > kLength) then
- kLengthCheck = 0
- else
- kLengthCheck = 1
- endif
- if(p7 == 3) then
- ;event "i", "TexturePlayer", 3, p3, p4, p6, p7
- printk2 100
- elseif((kVelocityCheck == 1) && (kLengthCheck == 1)) then
- kRandom random 1, 100
- if(p7 == 0) then
- kBool = gkDryProbabilityArrayMelody[int(kRandom)]
- kMin = chnget:k("dryMinMelody")
- kMax = chnget:k("dryMaxMelody")
- elseif(p7 == 1) then
- kBool = gkDryProbabilityArrayMulti[int(kRandom)]
- kMin = chnget:k("dryMinMulti")
- kMax = chnget:k("dryMaxMulti")
- elseif(p7 == 2) then
- kBool = gkDryProbabilityArrayChord[int(kRandom)]
- kMin = chnget:k("dryMinChord")
- kMax = chnget:k("dryMaxChord")
- endif
- kStartTime = p2 * kSlowdownAmt
- kCurrentTime times
- kStartTime -= kCurrentTime
- kNote = p4
- if(kBool == 1) then
- if((kNote > kMin) && (kNote < kMax)) then
- event "i", "DryHandler", kStartTime, kLength * kSlowdownAmt, kNote, p5, kVelocity, p7
- endif
- if(kOctaveAdd != 0) then
- event "i", "DryHandler", kStartTime, kLength * kSlowdownAmt, kNote + 12 * kOctaveAdd, p5, kVelocity, p7
- endif
- endif
- kRandom random 1, 100
- if(p7 == 0) then
- kBool = gkDelayProbabilityArrayMelody[int(kRandom)]
- kMin = chnget:k("delayMinMelody")
- kMax = chnget:k("delayMaxMelody")
- elseif(p7 == 1) then
- kBool = gkDelayProbabilityArrayMulti[int(kRandom)]
- kMin = chnget:k("delayMinMulti")
- kMax = chnget:k("delayMaxMulti")
- elseif(p7 == 2) then
- kBool = gkDelayProbabilityArrayChord[int(kRandom)]
- kMin = chnget:k("delayMinChord")
- kMax = chnget:k("delayMaxChord")
- endif
- if(kBool == 1) then
- if((kNote > kMin) && (kNote < kMax)) then
- event "i", "DelayHandler", kStartTime, kLength * kSlowdownAmt, kNote, p5, kVelocity, p7
- endif
- if(kOctaveAdd != 0) then
- event "i", "DelayHandler", kStartTime, kLength * kSlowdownAmt, kNote + 12 * kOctaveAdd, p5, kVelocity, p7
- endif
- endif
- kRandom random 1, 100
- if(p7 == 0) then
- kBool = gkArpProbabilityArrayMelody[int(kRandom)]
- kMin = chnget:k("arpMinMelody")
- kMax = chnget:k("arpMaxMelody")
- elseif(p7 == 1) then
- kBool = gkArpProbabilityArrayMulti[int(kRandom)]
- kMin = chnget:k("arpMinMulti")
- kMax = chnget:k("arpMaxMulti")
- elseif(p7 == 2) then
- kBool = gkArpProbabilityArrayChord[int(kRandom)]
- kMin = chnget:k("arpMinChord")
- kMax = chnget:k("arpMaxChord")
- endif
- if(kBool == 1) then
- if((kMin < kNote) && (kMax > kNote)) then
- event "i", "ArpHandler", kStartTime, kLength * kSlowdownAmt, kNote, p5, kVelocity, p7
- endif
- if(kOctaveAdd != 0) then
- event "i", "ArpHandler", kStartTime, kLength * kSlowdownAmt, kNote + 12 * kOctaveAdd, kVelocity, p7
- endif
- endif
- endif
- turnoff
- endin
- ;===================================================================================================================
- instr DryHandler
- kSoundfontChoice = p7
- kBeatLength = 60/p5
- kRandom random 1, 100
- if(p7 == 0) then
- kTimeShift = chnget:k("dryTimeShiftMelody")
- kInterval = chnget:k("dryQuantizeStepMelody")
- kExtension = chnget:k("dryNoteExtensionMelody")
- kBool = gkQuantizeProbabilityArrayMelody[int(kRandom)]
- kVelocityScaler = chnget:k("dryVelocityMelody")
- elseif(p7 == 1) then
- kTimeShift = chnget:k("dryTimeShiftMulti")
- kInterval = chnget:k("dryQuantizeStepMulti")
- kExtension = chnget:k("dryNoteExtensionMulti")
- kBool = gkQuantizeProbabilityArrayMulti[int(kRandom)]
- kVelocityScaler = chnget:k("dryVelocityMulti")
- elseif(p7 == 2) then
- kTimeShift = chnget:k("dryTimeShiftChord")
- kInterval = chnget:k("dryQuantizeStepChord")
- kExtension = chnget:k("dryNoteExtensionChord")
- kBool = gkQuantizeProbabilityArrayChord[int(kRandom)]
- kVelocityScaler = chnget:k("dryVelocityChord")
- endif
- if(kBool == 1) then
- kDelta = p2/kBeatLength
- kDelta -= int(kDelta)
- if(kInterval == 0) then
- kQuantized = kDelta
- elseif(kInterval == 1) then
- kIndex = 0
- halfDiffs:
- gkHalfDiffArray[kIndex] = kDelta - gkHalfArray[kIndex]
- loop_lt kIndex, 1, 1, halfDiffs
- kQuantized minarray gkHalfDiffArray
- elseif(kInterval == 2) then
- kIndex = 0
- thirdDiffs:
- gkThirdDiffArray[kIndex] = kDelta - gkThirdArray[kIndex]
- loop_lt kIndex, 1, 2, thirdDiffs
- kQuantized minarray gkThirdDiffArray
- elseif(kInterval == 3) then
- kIndex = 0
- quarterDiffs:
- gkQuarterDiffArray[kIndex] = kDelta - gkQuarterArray[kIndex]
- loop_lt kIndex, 1, 3, quarterDiffs
- kQuantized minarray gkQuarterDiffArray
- elseif(kInterval == 4) then
- kIndex = 0
- eighthDiffs:
- gkEighthDiffArray[kIndex] = kDelta - gkEighthArray[kIndex]
- loop_lt kIndex, 1, 7, eighthDiffs
- kQuantized minarray gkEighthDiffArray
- elseif(kInterval == 5) then
- kIndex = 0
- twelthDiffs:
- gkTwelthDiffArray[kIndex] = kDelta - gkTwelthArray[kIndex]
- loop_lt kIndex, 1, 11, twelthDiffs
- kQuantized minarray gkTwelthDiffArray
- elseif(kInterval == 6) then
- kIndex = 0
- sixteenthDiffs:
- gkSixteenthDiffArray[kIndex] = kDelta - gkSixteenthArray[kIndex]
- loop_lt kIndex, 1, 15, sixteenthDiffs
- kQuantized minarray gkSixteenthDiffArray
- elseif(kInterval == 7) then
- kIndex = 0
- thirtysecondDiffs:
- gkThirtysecondDiffArray[kIndex] = kDelta - gkThirtysecondArray[kIndex]
- loop_lt kIndex, 1, 31, thirtysecondDiffs
- endif
- endif
- kPercent = p3/100
- kPercent *= kExtension
- kNoteLength = p3 + kPercent
- kVelocity = p6 * 127
- kVelocity -= kVelocityScaler
- kVelocity /= 127
- if(kBool == 1) then
- event "i", "FluidPlayer", 3 + kTimeShift + kQuantized, kNoteLength, p4, kVelocity, p7
- else
- event "i", "FluidPlayer", 3 + kTimeShift, kNoteLength, p4, kVelocity, p7
- endif
- turnoff
- endin
- ;===================================================================================================================
- instr DelayHandler
- kSoundfontChoice = p7
- kBpm = p5
- if(p7 == 0) then
- kInterval = chnget:k("delayIntervalMelody")
- kRepeats = chnget:k("delayRepeatsMelody")
- kPitch = chnget:k("delayPitchMelody")
- kTimeShift = chnget:k("delayTimeShiftMelody")
- kExtension = chnget:k("delayExtensionMelody")
- kVelocityScaler = chnget:k("delayVelocityMelody")
- elseif(p7 == 1) then
- kInterval = chnget:k("delayIntervalMulti")
- kRepeats = chnget:k("delayRepeatsMulti")
- kPitch = chnget:k("delayPitchMulti")
- kTimeShift = chnget:k("delayTimeShiftMulti")
- kExtension = chnget:k("delayExtensionMulti")
- kVelocityScaler = chnget:k("delayVelocityMulti")
- elseif(p7 == 2) then
- kInterval = chnget:k("delayIntervalChord")
- kRepeats = chnget:k("delayRepeatsChord")
- kPitch = chnget:k("delayPitchChord")
- kTimeShift = chnget:k("delayTimeShiftChord")
- kExtension = chnget:k("delayExtensionChord")
- kVelocityScaler = chnget:k("delayVelocityChord")
- endif
- if(kInterval == 1) then
- kInterval = 1
- elseif(kInterval == 2) then
- kInterval = 1/2
- elseif(kInterval == 3) then
- kInterval = 1/3
- elseif(kInterval == 4) then
- kInterval = 1/4
- elseif(kInterval == 5) then
- kInterval = 1/8
- elseif(kInterval == 6) then
- kInterval = 1/12
- elseif(kInterval == 7) then
- kInterval = 1/16
- elseif(kInterval == 8) then
- kInterval = 1/32
- endif
- kBaseVelocity = p6 * 127
- kBaseVelocity -= kVelocityScaler
- kBaseVelocity /= 127
- kCounter = 0
- ;Assuming 4/4
- kBeatLen = 60/kBpm
- kPercent = kBeatLen * kInterval
- kPercent /= 100
- kPercent *= kExtension
- kDelayVelocity = 1
- playRepeats:
- kNote = p4
- kRepeater = kCounter + 1
- kNoteInterval = kInterval * kRepeater
- kDelayVelocity -= 0.1
- kStartTime = kNoteInterval * kBeatLen
- kStartTime += kTimeShift
- kDuration = kBeatLen * kInterval
- kDuration += kExtension
- ;printk2 kStartTime
- event "i", "FluidPlayer", kStartTime, kDuration, kNote + kPitch, kDelayVelocity * kBaseVelocity, p7
- loop_lt kCounter, 1, kRepeats - 1, playRepeats
- turnoff
- endin
- ;===================================================================================================================
- instr ArpHandler
- kSoundfontChoice = p7
- if(p7 == 0) then
- kInterval = chnget:k("arpIntervalMelody")
- kMode = chnget:k("arpModeMelody")
- kNoteLen = chnget:k("arpNoteLenMelody")
- kMaxOctave = chnget:k("arpOctaveMelody")
- kTimeShift = chnget:k("arpTimeShiftMelody")
- kVelocityScaler = chnget:k("arpVelocityMelody")
- elseif(p7 == 1) then
- kInterval = chnget:k("arpIntervalMulti")
- kMode = chnget:k("arpModeMulti")
- kNoteLen = chnget:k("arpNoteLenMulti")
- kMaxOctave = chnget:k("arpOctaveMulti")
- kTimeShift = chnget:k("arpTimeShiftMulti")
- kVelocityScaler = chnget:k("arpVelocityMulti")
- elseif(p7 == 2) then
- kInterval = chnget:k("arpIntervalChord")
- kMode = chnget:k("arpModeChord")
- kNoteLen = chnget:k("arpNoteLenChord")
- kMaxOctave = chnget:k("arpOctaveChord")
- kTimeShift = chnget:k("arpTimeShiftChord")
- kVelocityScaler = chnget:k("arpVelocityChord")
- endif
- if(kInterval == 1) then
- kInterval = 4
- elseif(kInterval == 2) then
- kInterval = 2
- elseif(kInterval == 3) then
- kInterval = 1
- elseif(kInterval == 4) then
- kInterval = 1/2
- elseif(kInterval == 5) then
- kInterval = 1/3
- elseif(kInterval == 6) then
- kInterval = 1/4
- elseif(kInterval == 7) then
- kInterval = 1/8
- elseif(kInterval == 8) then
- kInterval = 1/12
- elseif(kInterval == 9) then
- kInterval = 1/16
- else
- kInterval = 1/32
- endif
- kMode -= 1
- kBpm = p5
- kVelocity = p6 * 127
- kVelocity -= kVelocityScaler
- kVelocity /= 127
- ; Assuming 4/4
- ; TODO: IMPLEMENT DIFFERENT TIME SIGNATURES
- kBarLen = (60 / kBpm) * 4
- kRate = kBarLen * kInterval
- kUpDownCounter init 0
- kCounter init 0
- kDownCounter init 3
- kGlobalCounter = kMaxOctave * 2
- if(metro(1/kRate) == 1) then
- if(kCounter > kMaxOctave) then
- kCounter = 0
- endif
- if(kDownCounter == 0) then
- kDownCounter = 4
- endif
- if(kUpDownCounter == kGlobalCounter) then
- kUpDownCounter = 0
- endif
- if(kMode == 0) then
- if(kUpDownCounter < kMaxOctave) then
- if(kMaxOctave == 0) then
- kNote = p4
- else
- kNote = p4 + 12 * kCounter
- endif
- else
- if(kMaxOctave == 0) then
- kNote = p4
- else
- kNote = p4 + 12 * kDownCounter
- endif
- endif
- elseif(kMode == 1) then
- if(kMaxOctave == 0) then
- kNote = p4
- else
- kNote = p4 + 12 * kCounter
- endif
- elseif(kMode == 2) then
- if(kMaxOctave == 0) then
- kNote = p4 + 12 * kDownCounter
- endif
- endif
- kCounter += 1
- kDownCounter = kDownCounter - 1
- kDuration = p3 * kRate
- kDuration *= kNoteLen
- event "i", "FluidPlayer", 3 + kTimeShift, kDuration, kNote, kVelocity, p7
- endif
- endin
- ;===================================================================================================================
- instr FluidPlayer
- kSoundfontChoice = p6
- ;printk2 kSoundfontChoice
- if(kSoundfontChoice == 0) then
- kMin = chnget:k("globalMinMelody")
- kMax = chnget:k("globalMaxMelody")
- iOctave = chnget("globalOctaveMelody")
- elseif(kSoundfontChoice == 1) then
- kMin = chnget:k("globalMinMulti")
- kMax = chnget:k("globalMaxMulti")
- iOctave = chnget("globalOctaveMulti")
- elseif(kSoundfontChoice == 2) then
- kMin = chnget:k("globalMinChord")
- kMax = chnget:k("globalMaxChord")
- iOctave = chnget("globalOctaveChord")
- endif
- iVelocity = p5 * 127
- if(iVelocity > 100) then
- iVelocity = 100
- endif
- if((p4 > kMin) && (p4 < kMax)) then
- kRandom random 0, 99
- SlogLine sprintfk {{Playing on engine %d}}, kSoundfontChoice
- ;puts SlogLine, p4
- ;if(gkFinalPassthroughProbabilityArray[int(kRandom)] == 1) then
- if(p6 == 0) then
- fluidNote giMelodyEngine, 1, p4 + 12 * chnget("globalOctaveMelody"), p5 * 127
- elseif(p6 == 1) then
- Slog sprintfk {{Code Reached %d}}, kSoundfontChoice
- ;puts Slog, iNote
- fluidNote giMultiEngine, 1, p4 + 12 * chnget("globalOctaveMulti"), p5 * 127
- elseif(p6 == 2) then
- fluidNote giChordEngine, 1, p4 + 12 * chnget("globalOctaveChord"), p5 * 127
- endif
- ;endif
- endif
- turnoff
- endin
- ;===================================================================================================================
- gkCounter = 0
- instr TexturePlayer
- if(metro(1/10) == 1) then
- Slog sprintfk {{Texture triggered %d}}, 1
- puts Slog, gkCounter
- kNote random 10, 70
- gkCounter += 1
- event "i", "TextureScheduler", 0, 10, kNote
- endif
- endin
- instr TextureScheduler
- fluidNote giTexturalEngine, 1, p4, 127*0.4
- turnoff
- endin
- instr TextureListener
- aTextureL, aTextureR fluidOut giTexturalEngine
- aTextureL clfilt aTextureL, chnget:k("textureLPCut"), 0, 2
- aTextureR clfilt aTextureR, chnget:k("textureLPCut"), 0, 2
- aTextureL clfilt aTextureL, chnget:k("textureHPCut"), 1, 2
- aTextureR clfilt aTextureR, chnget:k("textureHPCut"), 1, 2
- if(chnget:k("texturePan") < 0) then
- aTextureR *= 1 - abs(chnget:k("texturePan"))
- elseif(chnget:k("texturePan") > 0) then
- aTextureL *= 1 - chnget:k("texturePan")
- endif
- gaOutFive += aTextureL
- gaOutSix += aTextureR
- endin
- ;=====================================================================================================================
- instr FluidListener
- kMelodyVolume = chnget:k("channelVolumeMelody")
- kMultiVolume = chnget:k("channelVolumeMulti")
- kChordVolume = chnget:k("channelVolumeChord")
- kMelodyLPCut = chnget:k("channelLPMelody")
- kMultiLPCut = chnget:k("channelLPMulti")
- kChordLPCut = chnget:k("channelLPChord")
- kMelodyHPCut = chnget:k("channelToneMelody")
- kMultiHPCut = chnget:k("channelToneMulti")
- kChordHPCut = chnget:k("channelToneChord")
- kTexturalLPCut = chnget:k("textureLPCut")
- kTexturalHPCut = chnget:k("textureHPCut")
- kPanMelody = chnget:k("channelPanMelody")
- kPanMulti = chnget:k("channelPanMulti")
- kPanChord = chnget:k("channelPanChord")
- kPanTexture = chnget:k("texturePan")
- if(20 > kMelodyLPCut) then
- kMelodyLPCut = 20
- endif
- if(20 > kMultiLPCut) then
- kMultiLPCut = 20
- endif
- if(20 > kChordLPCut) then
- kChordLPCut = 20
- endif
- if(20 > kTexturalLPCut) then
- kTexturalLPCut = 20
- endif
- aLeftMelody, aRightMelody fluidOut giMelodyEngine
- aLeftMulti, aRightMulti fluidOut giMultiEngine
- ;aLeftMulti = 0
- ;aRightMulti = 0
- aLeftChord, aRightChord fluidOut giChordEngine
- aLeftTexture, aRightTexture fluidOut giTexturalEngine
- aLeftMelody clfilt aLeftMelody, kMelodyLPCut, 0, 2
- aRightMelody clfilt aRightMelody, kMelodyLPCut, 0, 2
- aLeftMelody clfilt aLeftMelody, kMelodyHPCut, 1, 2
- aRightMelody clfilt aRightMelody, kMelodyHPCut, 1, 2
- aLeftMulti clfilt aLeftMulti, kMultiLPCut, 0, 2
- aRightMulti clfilt aRightMulti, kMultiLPCut, 0, 2
- aLeftMulti clfilt aLeftMulti, kMultiHPCut, 1, 2
- aRightMulti clfilt aRightMulti, kMultiHPCut, 1, 2
- aLeftChord clfilt aLeftChord, kChordLPCut, 0, 2
- aRightChord clfilt aRightChord, kChordLPCut, 0, 2
- aLeftChord clfilt aLeftChord, kChordHPCut, 1, 2
- aRightChord clfilt aRightChord, kChordHPCut, 1, 2
- if(kPanMelody < 0) then
- aRightMelody *= (1 - abs(kPanMelody))
- elseif(kPanMelody > 0) then
- aLeftMelody *= (1 - kPanMelody)
- endif
- if(kPanMulti < 0) then
- aRightMulti *= (1 - abs(kPanMulti))
- elseif(kPanMulti > 0) then
- aLeftMulti *= (1 - kPanMulti)
- endif
- if(kPanChord < 0) then
- aRightChord *= (1 - abs(kPanChord))
- elseif(kPanChord > 0) then
- aLeftChord *= (1 - kPanChord)
- endif
- aLeftMelody *= kMelodyVolume
- aRightMelody *= kMelodyVolume
- aLeftMulti *= kMultiVolume
- aRightMulti *= kMultiVolume
- aLeftChord *= kChordVolume
- aRightChord *= kChordVolume
- ; BREAKOUT 3/4
- gaOutThree += (aLeftMelody * 0.5) + (aLeftMulti * 0.5)
- gaOutFour += (aRightMelody * 0.5) + (aRightMulti * 0.5)
- ; BREAKOUT 5/6
- gaOutFive += (aLeftChord * 0.5)
- gaOutSix += (aRightChord * 0.5)
- gaLeft += (aLeftMelody * 1/3) + (aLeftMulti * 1/3) + (aLeftChord * 1/3)
- gaRight += (aRightMelody * 1/3) + (aRightMulti * 1/3) + (aRightChord * 1/3)
- gaSummed += gaLeft + gaRight
- endin
- ;===================================================================================================================
- instr 9999
- kLPCut = chnget:k("convolutionLP")
- kHPCut = chnget:k("convolutionHP")
- kDryWet = chnget:k("convolutionDryWet")
- kInverseDryWet = 1 - kDryWet
- kCounter init 1
- Sdisplay = p4
- aConvolvedL, aConvolvedR pconvolve gaSummed, p4, 2048
- aConvolvedL clfilt aConvolvedL, kLPCut, 0, 2
- aConvolvedR clfilt aConvolvedR, kLPCut, 0, 2
- aConvolvedL clfilt aConvolvedL, kHPCut, 1, 2
- aConvolvedR clfilt aConvolvedR, kHPCut, 1, 2
- aConvolvedL *= kDryWet
- aConvolvedR *= kDryWet
- aConvolvedL *= 0.2
- aConvolvedR *= 0.2
- gaLeft *= kInverseDryWet
- gaRight *= kInverseDryWet
- gaLeft *= 1.3
- gaRight *= 1.3
- aCombinedL = aConvolvedL + gaLeft
- aCombinedR = aConvolvedR + gaRight
- gaConvolvedL += aCombinedL
- gaConvolvedR += aCombinedR
- ;BREAKOUT 7/8
- gaOutSeven += aConvolvedL
- gaOutEight += aConvolvedR
- kCounter += 1
- gaSummed = 0
- gaLeft = 0
- gaRight = 0
- endin
- ;===================================================================================================================
- instr DelayLeft
- kTime1 = chnget:k("delayTimeLeft1")
- kTime2 = chnget:k("delayTimeLeft2")
- kTime3 = chnget:k("delayTimeLeft3")
- kPitchShift = chnget:k("delayPitchShift")
- kDryWet = chnget:k("delayDryWet")
- kInverseDryWet = 1 - kDryWet
- kFeedback = chnget:k("delayFeedbackL")
- kLPCut1 = chnget:k("delayLPCut1")
- kLPCut2 = chnget:k("delayLPCut2")
- kLPCut3 = chnget:k("delayLPCut3")
- kHPCut1 = chnget:k("delayHPCut1")
- kHPCut2 = chnget:k("delayHPCut2")
- kHPCut3 = chnget:k("delayHPCut3")
- aBufOut delayr 5
- aTapOne deltap3 kTime1
- aTapOne clfilt aTapOne, kLPCut1, 0, 8
- aTapOne clfilt aTapOne, kHPCut1, 1, 8
- aTapTwo deltap3 kTime2
- aTapTwo clfilt aTapTwo, kLPCut2, 0, 8
- aTapTwo clfilt aTapTwo, kHPCut2, 1, 8
- aTapThree deltap3 kTime3
- aTapThree clfilt aTapThree, kLPCut3, 0, 8
- aTapThree clfilt aTapThree, kHPCut3, 1, 8
- aCombined = (aTapOne + aTapTwo + aTapThree) * kFeedback
- aSignal = aCombined
- delayw (aSignal + gaConvolvedL) * kFeedback
- aSignal *= kDryWet
- gaConvolvedL *= kInverseDryWet
- gaOutputL = aSignal + gaConvolvedL
- gaOutOne = gaOutputL
- endin
- ;===================================================================================================================
- instr DelayRight
- kTime1 = chnget:k("delayTimeRight1")
- kTime2 = chnget:k("delayTimeRight2")
- kTime3 = chnget:k("delayTimeRight3")
- kPitchShift = chnget:k("delayPitchShift")
- kDryWet = chnget:k("delayDryWet")
- kInverseDryWet = 1 - kDryWet
- kFeedback = chnget:k("delayFeedbackR")
- kLPCut1 = chnget:k("delayLPCut1")
- kLPCut2 = chnget:k("delayLPCut2")
- kLPCut3 = chnget:k("delayLPCut2")
- kHPCut1 = chnget:k("delayHPCut1")
- kHPCut2 = chnget:k("delayHPCut2")
- kHPCut3 = chnget:k("delayHPCut3")
- aBufOut delayr 5
- aTapOne deltap3 kTime1
- aTapOne clfilt aTapOne, kLPCut1, 0, 2
- aTapOne clfilt aTapOne, kHPCut1, 1, 2
- aTapTwo deltap3 kTime2
- aTapTwo clfilt aTapTwo, kLPCut2, 0, 2
- aTapTwo clfilt aTapTwo, kHPCut2, 1, 2
- aTapThree deltap3 kTime3
- aTapThree clfilt aTapThree, kLPCut3, 0, 2
- aTapThree clfilt aTapThree, kHPCut3, 1, 2
- aCombined = (aTapOne + aTapTwo + aTapThree) * kFeedback
- aSignal = aCombined
- delayw (aSignal + gaConvolvedR) * kFeedback
- aSignal *= kDryWet
- gaConvolvedR *= kInverseDryWet
- gaOutputR = aSignal + gaConvolvedR
- gaOutTwo = gaOutputR
- endin
- ;===================================================================================================================
- instr SignalOutput
- ;outo gaOutOne*4, gaOutTwo*4 ;gaOutThree*8, gaOutFour*8, gaOutFive*8, gaOutSix*8, gaOutSeven*8, gaOutEight*8
- outs gaOutOne*4, gaOutTwo*4
- gaConvolvedL = 0
- gaConvolvedR = 0
- gaOutOne = 0
- gaOutTwo = 0
- gaOutThree = 0
- gaOutFour = 0
- gaOutFive = 0
- gaOutSix = 0
- gaOutSeven = 0
- gaOutEight = 0
- endin
- ;===================================================================================================================
- </CsInstruments>
- <CsScore>
- f0 z
- ;starts instrument 1 and runs it for a week
- i"Initialise" 0 [60*60*24*7]
- </CsScore>
- </CsoundSynthesizer>
- ;LINES TO CHANGE FOR NEW SOUNDFONT: (Obviously the visuals in the UI section, but more importantly...
- ; lines 319, 320 and 321 to the path to the soundfont
- ; from lines 498 to 629, every time the number 90 appears its talking about the number of presets in the soundfont.
- ; SO also change this number to the amount of presets present in the file!
- ; IN THE UI, the new 3 comboboxes are: Enabled/Disabled, Mode and duration in seconds (We can add more durations v easily, if I'm asleep and you want more,
- ; add them incrementally (so say in items, you'd add "11", "12", "13" etc in the brackets.
- ; Bear in mind that these work sequentially at the moment (if the second item was 100 it would still read the value as 2 because it's the selection it's based
- ; on not the value), I can work around this tomorrow but for now I think this is okay!
- /* OUTPUT CONTROLS:::::
- MAIN: 1/2
- MELODY + MULTI: 3/4
- CHORD + TEXTURES: 5/6
- CONV: 7/8
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement