diff options
Diffstat (limited to 'Generation/GenerationRythm.py')
-rw-r--r-- | Generation/GenerationRythm.py | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/Generation/GenerationRythm.py b/Generation/GenerationRythm.py new file mode 100644 index 0000000..fef9d42 --- /dev/null +++ b/Generation/GenerationRythm.py @@ -0,0 +1,174 @@ +import Utils +import random + +import Config +from Generation.GenerationConstants import GenerationConstants + +class GenerationRythm: + def __init__( self, trackInstrument, barLength ): + self.trackInstrument = trackInstrument + self.barLength = barLength + + def celluleRythmSequence(self, parameters ): + rythmSequence = [0, ] + self.count = 0 + lastOnsetTime = 0 + + onsetValue = int( ( 1 - parameters.density ) * 8 ) + onsetDeviation = int( ( 1 - parameters.rythmRegularity ) * 4 ) + currentOnsetValue = onsetValue + ( random.randint( 0, onsetDeviation ) - ( onsetDeviation / 2 ) ) + if currentOnsetValue < 0: + currentOnsetValue == 0 + elif currentOnsetValue > 8: + currentOnsetValue == 8 + else: + currentOnsetValue = currentOnsetValue + + onsetDelta = GenerationConstants.TABLE_ONSET_VALUES[ currentOnsetValue ] + + for i in range( int( self.barLength / Config.TICKS_PER_BEAT * 8 ) ): + if self.count == 0: + currentOnsetValue = onsetValue + ( random.randint( 0, onsetDeviation ) - ( onsetDeviation / 2 ) ) + if currentOnsetValue < 0: + currentOnsetValue == 0 + elif currentOnsetValue > 8: + currentOnsetValue == 8 + else: + currentOnsetValue = currentOnsetValue + onsetDelta = GenerationConstants.TABLE_ONSET_VALUES[ currentOnsetValue ] + + self.makeCellule(onsetDelta, GenerationConstants.DOUBLE_TICK_DUR, GenerationConstants.DOUBLE_HOW_MANY) + self.makeCellule(onsetDelta, GenerationConstants.HALF_TRIPLET_TICK_DUR, GenerationConstants.HALF_TRIPLET_HOW_MANY) + self.makeCellule(onsetDelta, GenerationConstants.HOLE_TRIPLET_TICK_DUR, GenerationConstants.HOLE_TRIPLET_HOW_MANY) + + onsetTime = onsetDelta + lastOnsetTime + lastOnsetTime = onsetTime + + if onsetTime < self.barLength: + rythmSequence.append(onsetTime) + else: + break + return rythmSequence + + def xnoiseRythmSequence(self, parameters ): + rythmSequence = [] + onsetTime = None + randomParamScaler = parameters.rythmRegularity * 2 + 0.5 +# need radioButton with 0 for random choose and each generator independant + whichRandomGenerator = random.randint(0, 4) + maximumNumberOfNotes = int( (parameters.density) * GenerationConstants.MAX_NOTES_PER_BAR) + + for i in range(maximumNumberOfNotes): + while onsetTime in rythmSequence: + if whichRandomGenerator == 0: + onsetTime = random.expovariate(GenerationConstants.RANDOM_EXPO_PARAM * randomParamScaler) + elif whichRandomGenerator == 1: + onsetTime = 1 - random.expovariate(GenerationConstants.RANDOM_EXPO_PARAM * randomParamScaler) + elif whichRandomGenerator == 2: + onsetTime = random.gauss(GenerationConstants.RANDOM_GAUSS_PARAM1, + GenerationConstants.RANDOM_GAUSS_PARAM2 * (3 - randomParamScaler)) + elif whichRandomGenerator == 3: + onsetTime = random.betavariate(GenerationConstants.RANDOM_BETA_PARAM * randomParamScaler, + GenerationConstants.RANDOM_BETA_PARAM * randomParamScaler) + elif whichRandomGenerator == 4: + onsetTime = random.weibullvariate(GenerationConstants.RANDOM_WEIBULL_PARAM1, + GenerationConstants.RANDOM_WEIBULL_PARAM2 * randomParamScaler) + + onsetTime = int(onsetTime * (int(( self.barLength - 1) / GenerationConstants.DOUBLE_TICK_DUR))) * GenerationConstants.DOUBLE_TICK_DUR + + if onsetTime < 0: + onsetTime = 0 + elif onsetTime > ( self.barLength - GenerationConstants.DOUBLE_TICK_DUR): + onsetTime = ( self.barLength - GenerationConstants.DOUBLE_TICK_DUR) + else: + onsetTime = onsetTime + + rythmSequence.append(onsetTime) + + rythmSequence.sort() + return rythmSequence + + def drumRythmSequence(self, parameters ): + rythmSequence = [] + binSelection = [] + downBeats = [] + upBeats = [] + beats = [] + countDown = 0 + onsetTime = None + beatsPerPage = int( self.barLength / Config.TICKS_PER_BEAT ) + + if Config.INSTRUMENTS[ self.trackInstrument ].instrumentRegister == Config.PUNCH: + registerDensity = 0.5 + downBeatRecurence = 4 + for beat in range( beatsPerPage ): + beats.append( beat * Config.TICKS_PER_BEAT ) + for i in range( len( beats ) ): + print ( beats[ GenerationConstants.PUNCH_ACCENTS[ beatsPerPage ][ i ] ], pow( float( len( beats ) - i) / len( beats ), 1.5 ) * 100.) + downBeats.append( ( beats[ GenerationConstants.PUNCH_ACCENTS[ beatsPerPage ][ i ] ], pow( float( len( beats ) - i) / len( beats ), 1.5 ) * 100.) ) + for downBeat in downBeats: + upBeats.append( ( downBeat[ 0 ] + Config.TICKS_PER_BEAT , downBeat[ 1 ] ) ) + + if Config.INSTRUMENTS[ self.trackInstrument ].instrumentRegister == Config.LOW: + registerDensity =1.5 + downBeatRecurence = 4 + for beat in range( beatsPerPage ): + beats.append( beat * Config.TICKS_PER_BEAT ) + for i in range( len( beats ) ): + downBeats.append( ( beats[ GenerationConstants.LOW_ACCENTS[ beatsPerPage ][ i ] ], pow( float( len( beats ) - i) / len( beats ), 1.5 ) * 100.) ) + for downBeat in downBeats: + upBeats.append( ( downBeat[ 0 ] + Config.TICKS_PER_BEAT / 2 , downBeat[ 1 ] ) ) + + if Config.INSTRUMENTS[ self.trackInstrument ].instrumentRegister == Config.MID: + registerDensity = 1 + downBeatRecurence = 1 + for beat in range( beatsPerPage ): + beats.append( beat * Config.TICKS_PER_BEAT ) + beats.append( beat * Config.TICKS_PER_BEAT + ( Config.TICKS_PER_BEAT / 2 ) ) + for i in range( len( beats ) ): + downBeats.append( ( beats[ GenerationConstants.MID_ACCENTS[ beatsPerPage ][ i ] ], pow( float( len( beats ) - i) / len( beats ), 1.5 ) * 100.) ) + for downBeat in downBeats: + upBeats.append( ( downBeat[ 0 ] + Config.TICKS_PER_BEAT / 4 , downBeat[ 1 ] ) ) + + if Config.INSTRUMENTS[ self.trackInstrument ].instrumentRegister == Config.HIGH: + registerDensity = 1.5 + downBeatRecurence = 1 + for beat in range( beatsPerPage ): + beats.append( beat * Config.TICKS_PER_BEAT ) + beats.append( beat * Config.TICKS_PER_BEAT + ( Config.TICKS_PER_BEAT / 2 ) ) + for i in range( len( beats ) ): + downBeats.append( ( beats[ GenerationConstants.HIGH_ACCENTS[ beatsPerPage ][ i ] ], pow( float( len( beats ) - i) / len( beats ), 1.5 ) * 100.) ) + for downBeat in downBeats: + upBeats.append( ( downBeat[ 0 ] + Config.TICKS_PER_BEAT / 4 , downBeat[ 1 ] ) ) + + for i in range( int( parameters.density * registerDensity * len( downBeats ) ) ): + if random.randint( 0, 100 ) < ( parameters.rythmRegularity * 100 * downBeatRecurence ) and binSelection.count( 1 ) < len( downBeats ): + binSelection.append( 1 ) + else: + if binSelection.count( 0 ) < len( downBeats ): + binSelection.append( 0 ) + else: + binSelection.append( 1 ) + + countDown = binSelection.count( 1 ) + + for i in range( countDown ): + while onsetTime in rythmSequence or onsetTime == None: + onsetTime = Utils.prob2( downBeats ) + rythmSequence.append( onsetTime ) + + for i in range( len( binSelection ) - countDown ): + while onsetTime in rythmSequence or onsetTime == None: + onsetTime = Utils.prob2( upBeats ) + rythmSequence.append( onsetTime ) + + rythmSequence.sort() + return rythmSequence + + def makeCellule( self, currentDuration, targetDuration, threshold ): + threshold = threshold - 1 + if currentDuration == targetDuration: + if self.count < threshold: + self.count += 1 + else: + self.count = 0 |