# ex1D05.py # More Linear Triangular Units from moduleCsound import * tags(1) header(ksmps=32) # --- globals add(""" ;****SEQUENCE OF UNITS AS ARRAY****/ giSequence[] array 0, 1.2, 1.4, 2.2, 2.4, 3.2, 3.6 giSeqIndx = 0 ;startindex """) # --- user opcodes add(""" ;****UDO DEFINITIONS**** opcode linrnd_low, i, iii ;linear random with precedence of lower values iMin, iMax, iMaxCount xin ;set counter and initial (absurd) result iCount = 0 iRnd = iMax ;loop and reset iRnd until iCount == iMaxCount do iUniRnd random iMin, iMax iRnd = iUniRnd < iRnd ? iUniRnd : iRnd iCount += 1 enduntil xout iRnd endop opcode linrnd_high, i, iii ;linear random with precedence of higher values iMin, iMax, iMaxCount xin ;set counter and initial (absurd) result iCount = 0 iRnd = iMin ;loop and reset iRnd until iCount == iMaxCount do iUniRnd random iMin, iMax iRnd = iUniRnd > iRnd ? iUniRnd : iRnd iCount += 1 enduntil xout iRnd endop opcode trirnd, i, iii iMin, iMax, iMaxCount xin ;set a counter and accumulator iCount = 0 iAccum = 0 ;perform loop and accumulate until iCount == iMaxCount do iUniRnd random iMin, iMax iAccum += iUniRnd iCount += 1 enduntil ;get the mean and output iRnd = iAccum / iMaxCount xout iRnd endop """) # --- INSTRUMENTS add(r""" ;****ONE INSTRUMENT TO PERFORM ALL DISTRIBUTIONS**** ;0 = uniform, 1 = linrnd_low, 2 = linrnd_high, 3 = trirnd ;the fractional part denotes the number of units, e.g. ;3.4 = triangular distribution with four sub-units instr notes ;how many notes to be played iHowMany = p4 ;by which distribution with how many units iWhich = giSequence[giSeqIndx] iDistrib = int(iWhich) iUnits = round(frac(iWhich) * 10) ;set min and max duration iMinDur = .1 iMaxDur = 2 ;set min and max pitch iMinPch = 36 iMaxPch = 84 ;trigger as many instances of instr play as needed iThisNote = 0 iStart = 0 iPrint = 1 ;for each note to be played until iThisNote == iHowMany do ;calculate iMidiPch and iDur depending on type if iDistrib == 0 then printf_i "%s", iPrint, "... uniform distribution:\n" printf_i "%s", iPrint, "EQUAL LIKELIHOOD OF ALL PITCHES AND DURATIONS\n" iMidiPch random iMinPch, iMaxPch ;midi note iDur random iMinDur, iMaxDur ;duration elseif iDistrib == 1 then printf_i "... linear low distribution with %d units:\n", iPrint, iUnits printf_i "%s", iPrint, "LOWER NOTES AND LONGER DURATIONS PREFERRED\n" iMidiPch linrnd_low iMinPch, iMaxPch, iUnits iDur linrnd_high iMinDur, iMaxDur, iUnits elseif iDistrib == 2 then printf_i "... linear high distribution with %d units:\n", iPrint, iUnits printf_i "%s", iPrint, "HIGHER NOTES AND SHORTER DURATIONS PREFERRED\n" iMidiPch linrnd_high iMinPch, iMaxPch, iUnits iDur linrnd_low iMinDur, iMaxDur, iUnits else printf_i "... triangular distribution with %d units:\n", iPrint, iUnits printf_i "%s", iPrint, "MEDIUM NOTES AND DURATIONS PREFERRED\n" iMidiPch trirnd iMinPch, iMaxPch, iUnits iDur trirnd iMinDur, iMaxDur, iUnits endif ;call subinstrument to play note event_i "i", "play", iStart, iDur, int(iMidiPch) ;increase start tim and counter iStart += iDur iThisNote += 1 ;avoid continuous printing iPrint = 0 enduntil ;reset the duration of this instr to make all events happen p3 = iStart + 2 ;increase index for sequence giSeqIndx += 1 ;call instr again if sequence has not been ended if giSeqIndx < lenarray(giSequence) then event_i "i", "notes", p3, 1, iHowMany ;or exit else event_i "i", "exit", p3, 1 endif endin ;****INSTRUMENTS TO PLAY THE SOUNDS AND EXIT CSOUND**** instr play ;increase duration in random range iDur random p3, p3*1.5 p3 = iDur ;get midi note and convert to frequency iMidiNote = p4 iFreq cpsmidinn iMidiNote ;generate note with karplus-strong algorithm aPluck pluck .2, iFreq, iFreq, 0, 1 aPluck linen aPluck, 0, p3, p3 ;filter aFilter mode aPluck, iFreq, .1 ;mix aPluck and aFilter according to MidiNote ;(high notes will be filtered more) aMix ntrpol aPluck, aFilter, iMidiNote, 36, 84 ;panning also according to MidiNote ;(low = left, high = right) iPan = (iMidiNote-36) / 48 aL, aR pan2 aMix, iPan outs aL, aR endin instr exit exitnow endin """) tags(2) # --- score add(""" i "notes" 0 1 23 ;set number of notes per instr here e 99999 ;make possible to perform long (exit will be automatically) """) tags(3) writeRun(__file__)
Tuesday, July 11, 2017
ex1D05. More Linear Triangular Units
Subscribe to:
Post Comments (Atom)
-
Amplitudes should follow the dB scale and change via the log function. # ex1C01.py # dB vs linear from moduleCsound import * tag...
-
# ex1D09.py # Random Walk from moduleCsound import * tags( 1 ) header(ksmps =32 ) # --- globals add( r""" seed 1...
-
# ex2C03.py # Midi All In from moduleCsound import * add(startSyn) add(startOpt) add( "-+rtmidi=virtual -Ma -odac" ) add(...
No comments:
Post a Comment