Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Generation/Generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'Generation/Generator.py')
-rwxr-xr-xGeneration/Generator.py243
1 files changed, 243 insertions, 0 deletions
diff --git a/Generation/Generator.py b/Generation/Generator.py
new file mode 100755
index 0000000..447f24c
--- /dev/null
+++ b/Generation/Generator.py
@@ -0,0 +1,243 @@
+import random
+import math
+
+import Utils
+import Drunk
+
+import Config
+from Util.CSoundNote import CSoundNote
+from Generation.VariationPitch import *
+from Generation.VariationRythm import *
+from Generation.GenerationConstants import GenerationConstants
+from Generation.GenerationRythm import GenerationRythm
+from Generation.GenerationPitch import GenerationPitch
+
+class GenerationParameters:
+ def __init__( self,
+ density = GenerationConstants.DEFAULT_DENSITY,
+ rythmRegularity = GenerationConstants.DEFAULT_RYTHM_REGULARITY,
+ step = GenerationConstants.DEFAULT_STEP,
+ pitchRegularity = GenerationConstants.DEFAULT_PITCH_REGULARITY,
+ articule = GenerationConstants.DEFAULT_ARTICULE,
+ rythmMethod = GenerationConstants.DEFAULT_RYTHM_METHOD,
+ pitchMethod = GenerationConstants.DEFAULT_PITCH_METHOD,
+ pattern = GenerationConstants.DEFAULT_PATTERN,
+ scale = GenerationConstants.DEFAULT_SCALE ):
+ self.density = density
+ self.rythmRegularity = rythmRegularity
+ self.step = step
+ self.pitchRegularity = pitchRegularity
+ self.articule = articule
+ self.rythmMethod = rythmMethod
+ self.pitchMethod = pitchMethod
+ self.pattern = pattern
+ self.scale = scale
+
+def generator1(
+ parameters, # algorithm-specific parameters
+ volume, # [trackID: float(volume) ]
+ instrument, # [trackID: instrument]
+ tempo, # integer bpm
+ nbeats, # integer
+ trackIDs, # list of trackIDs to generate
+ pageIDs, # list of pageIDs to generate
+ trackDictionary # map [ trackID : [ pageID : events ] ]
+ ):
+
+ pitchMarkov = PitchMarkov()
+ pitchReverse = PitchReverse()
+ pitchSort = PitchSort()
+ pitchShuffle = PitchShuffle()
+
+ makePitch = GenerationPitch()
+ makeHarmonicSequence = Drunk.Drunk( 7 )
+
+ rythmShuffle = RythmShuffle( )
+ rythmReverse = RythmReverse( )
+
+ def makeGainSequence( onsetList ):
+ gainSequence = []
+ for onset in onsetList:
+ if onset == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MAX_BOUNDARY, GenerationConstants.GAIN_MAX_BOUNDARY)
+ elif ( onset % Config.TICKS_PER_BEAT) == 0:
+ gain = random.uniform(GenerationConstants.GAIN_MID_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MAX_BOUNDARY)
+ else:
+ gain = random.uniform(GenerationConstants.GAIN_MIN_BOUNDARY, GenerationConstants.GAIN_MID_MIN_BOUNDARY)
+ gainSequence.append(gain)
+ return gainSequence
+
+ def makeDurationSequence( onsetList, parameters, table_duration, barLength, currentInstrument ):
+ durationSequence = []
+ fullDurationSequence = []
+ if len( onsetList ) > 1:
+ for i in range(len(onsetList) - 1):
+ duration = (onsetList[i+1] - onsetList[i]) * Utils.prob2( table_duration )
+ if duration == (onsetList[i+1] - onsetList[i]):
+ fullDurationSequence.append(True)
+ else:
+ fullDurationSequence.append(False)
+
+ if Config.INSTRUMENTS[ currentInstrument ].soundClass == 'drum':
+ duration = GenerationConstants.DOUBLE_TICK_DUR / 2
+
+ durationSequence.append(duration)
+
+ if Config.INSTRUMENTS[ currentInstrument ].soundClass == 'drum':
+ durationSequence.append( GenerationConstants.DOUBLE_TICK_DUR / 2)
+ else:
+ durationSequence.append(( barLength - onsetList[-1]) * Utils.prob2( table_duration ))
+ fullDurationSequence.append(False)
+ elif len( onsetList ) == 1:
+ if Config.INSTRUMENTS[ currentInstrument ].soundClass == 'drum':
+ durationSequence.append( GenerationConstants.DOUBLE_TICK_DUR / 2 )
+ else:
+ durationSequence.append( ( barLength - onsetList[ 0 ] ) * Utils.prob2( table_duration ))
+ fullDurationSequence.append( False )
+ return durationSequence, fullDurationSequence
+
+ def pageGenerate( parameters, trackID, pageID, selectedPageCount, lastPageID, trackOfNotes, drumPitch = None ):
+ trackNotes = trackOfNotes
+ barLength = Config.TICKS_PER_BEAT * nbeats
+ if drumPitch:
+ currentInstrument = Config.DRUM1INSTRUMENTS[ drumPitch[ 0 ] ]
+ else:
+ drumPitch = [ 36 ]
+ currentInstrument = instrument[ trackID ]
+
+ makeRythm = GenerationRythm( currentInstrument, barLength )
+
+ table_duration = Utils.scale(parameters.articule, GenerationConstants.ARTICULATION_SCALE_MIN_MAPPING,
+ GenerationConstants.ARTICULATION_SCALE_MAX_MAPPING,
+ GenerationConstants.ARTICULATION_SCALE_STEPS)
+ table_pitch = GenerationConstants.SCALES[parameters.scale]
+
+ if Config.INSTRUMENTS[ currentInstrument ].soundClass == 'drum':
+ rythmSequence = makeRythm.drumRythmSequence(parameters)
+ pitchSequence = makePitch.drumPitchSequence(len(rythmSequence), parameters, drumPitch, table_pitch )
+ elif Config.INSTRUMENTS[ currentInstrument ].soundClass == 'melo':
+ if parameters.rythmMethod == 0:
+ rythmSequence = makeRythm.celluleRythmSequence(parameters)
+ elif parameters.rythmMethod == 1:
+ rythmSequence = makeRythm.xnoiseRythmSequence(parameters)
+ if parameters.pitchMethod == 0:
+ pitchSequence = makePitch.drunkPitchSequence(len(rythmSequence), parameters, table_pitch)
+ elif parameters.pitchMethod == 1:
+ pitchSequence = makePitch.harmonicPitchSequence( rythmSequence, parameters, table_pitch, harmonicSequence )
+ gainSequence = makeGainSequence(rythmSequence)
+ durationSequence, fullDurationSequence = makeDurationSequence(rythmSequence, parameters, table_duration, barLength, currentInstrument)
+
+ for i in range(len(rythmSequence)):
+ trackNotes.append( CSoundNote( rythmSequence[i], pitchSequence[i], gainSequence[i],
+ GenerationConstants.DEFAULT_PAN, durationSequence[i], trackID,
+ fullDurationSequence[i], instrument[ trackID ] ) )
+# del trackDictionary[ trackID ][ pageID ]
+ trackDictionary[ trackID ][ pageID ] = trackNotes
+
+##################################################################################
+ # begin generate()
+ harmonicSequence = []
+ for i in range( nbeats ):
+ harmonicSequence.append(
+ GenerationConstants.CHORDS_TABLE[ makeHarmonicSequence.getNextValue( 2, len( GenerationConstants.CHORDS_TABLE ) - 1 ) ] )
+
+ for trackID in trackIDs:
+ if instrument[ trackID ] == 'drum1kit':
+ if parameters.rythmRegularity > 0.75:
+ pitchOfStream = [ [ 24 ], [30] , [ 40 ], [ 46 ] ]
+ elif parameters.rythmRegularity > 0.5:
+ pitchOfStream = [ [ 24, 28 ], [ 30, 32 ], [ 36, 38, 40 ], [ 46, 48 ] ]
+ elif parameters.rythmRegularity > 0.25:
+ pitchOfStream = [ [ 24, 26, 28 ], [ 30, 32, 34 ], [ 38, 40 ], [ 42, 46, 48 ] ]
+ else:
+ pitchOfStream = [ [ 24, 26, 28 ], [ 30, 32, 34 ], [ 38, 40 ], [ 42, 44, 46, 48 ] ]
+ selectedPageCount = 0
+ lastPageID = 0
+ for pageID in pageIDs:
+ trackOfNotes = []
+# del trackDictionary[ trackID ][ pageID ]
+ if instrument[ trackID ] == 'drum1kit':
+ for drumPitch in pitchOfStream:
+ pageGenerate( parameters, trackID, pageID, selectedPageCount, lastPageID, trackOfNotes, drumPitch )
+ else:
+ pageGenerate( parameters, trackID, pageID, selectedPageCount, lastPageID, trackOfNotes, drumPitch = None )
+
+ selectedPageCount += 1
+ lastPageID = pageID
+
+class VariationParameters:
+ def __init__( self, sourceVariation, pitchVariation = 0, rythmVariation = 0 ):
+ self.sourceVariation = sourceVariation
+ self.pitchVariation = pitchVariation
+ self.rythmVariation = rythmVariation
+
+
+def variate(
+ parameters, # algorithm-specific parameters
+ volume, # [trackID: float(volume) ]
+ instrument, # [trackID: instrument]
+ tempo, # integer bpm
+ nbeats, # integer
+ trackIDs, # list of trackIDs to generate
+ pageIDs, # list of pageIDs to generate
+ trackDictionary # map [ trackID : [ pageID : events ] ]
+ ):
+
+ pitchMarkov = PitchMarkov()
+ pitchReverse = PitchReverse()
+ pitchSort = PitchSort()
+ pitchShuffle = PitchShuffle()
+
+ makePitch = GenerationPitch()
+ makeHarmonicSequence = Drunk.Drunk( 7 )
+ rythmShuffle = RythmShuffle( )
+ rythmReverse = RythmReverse( )
+
+ def pageVariate( parameters, trackID, pageID ):
+ tempTrackNotes = []
+ trackNotes = []
+ for note in trackDictionary[ trackID ][ parameters.sourceVariation ]:
+ tempTrackNotes.append( note.clone() )
+
+ if parameters.rythmVariation == 0:
+ for note in tempTrackNotes:
+ trackNotes.append( note.clone() )
+ if parameters.rythmVariation == 1:
+ for note in rythmReverse.getNewList( tempTrackNotes, nbeats ):
+ trackNotes.append( note.clone() )
+ if parameters.rythmVariation == 2:
+ for note in rythmShuffle.getNewList( tempTrackNotes , nbeats):
+ trackNotes.append( note.clone() )
+
+ del trackDictionary[ trackID ][ pageID ]
+ trackDictionary[ trackID ][ pageID ] = trackNotes
+
+ tempTrackNotes = []
+ trackNotes = []
+ for note in trackDictionary[ trackID ][ parameters.sourceVariation ]:
+ tempTrackNotes.append( note.clone() )
+
+ if parameters.pitchVariation == 0:
+ for note in tempTrackNotes:
+ trackNotes.append( note.clone() )
+ elif parameters.pitchVariation == 1:
+ for note in pitchMarkov.getNewList( tempTrackNotes, 1 ):
+ trackNotes.append( note.clone() )
+ elif parameters.pitchVariation == 2:
+ for note in pitchReverse.reorderPitch( tempTrackNotes ):
+ trackNotes.append( note.clone() )
+ elif parameters.pitchVariation == 3:
+ for note in pitchSort.reorderPitch( tempTrackNotes ):
+ trackNotes.append( note.clone() )
+ elif parameters.pitchVariation == 4:
+ for note in pitchShuffle.reorderPitch( tempTrackNotes ):
+ trackNotes.append( note.clone() )
+
+ del trackDictionary[ trackID ][ pageID ]
+ trackDictionary[ trackID ][ pageID ] = trackNotes
+
+ for trackID in trackIDs:
+ for pageID in pageIDs:
+ pageVariate( parameters, trackID, pageID )
+
+