diff options
author | Nat <natcl@hotmail.com> | 2007-08-24 21:52:12 (GMT) |
---|---|---|
committer | Nat <natcl@hotmail.com> | 2007-08-24 21:52:12 (GMT) |
commit | f511350c9d931c302af21e224acf2a02d53e398c (patch) | |
tree | ee30711a47904efc87a5e71fa069bfcd34228f34 | |
parent | 0a17516c9b283e1048dd6d7988cc5aac98cd769d (diff) | |
parent | 6a209f15052e84430279a5fa66c2d661513c067f (diff) |
Merge branch 'master' of git+ssh://natcl@dev.laptop.org/git/projects/tamtam
-rw-r--r-- | Edit/EditToolbars.py | 6 | ||||
-rw-r--r-- | Edit/MainWindow.py | 176 | ||||
-rwxr-xr-x | Generation/Drunk.py | 2 | ||||
-rwxr-xr-x | Generation/GenerationConstants.py | 7 | ||||
-rw-r--r-- | Generation/GenerationPitch.py | 38 | ||||
-rwxr-xr-x | Generation/Generator.py | 23 |
6 files changed, 66 insertions, 186 deletions
diff --git a/Edit/EditToolbars.py b/Edit/EditToolbars.py index 9d25f51..abd425d 100644 --- a/Edit/EditToolbars.py +++ b/Edit/EditToolbars.py @@ -584,7 +584,7 @@ class generationPalette(Palette): self.parametersChanged() def handleMode( self, widget, data = None ): - self.pattern = widget.props.value + self.pattern = [widget.props.value for x in range(4)] self.parametersChanged() def getGenerationParameters( self ): @@ -618,7 +618,7 @@ class generationPalette(Palette): ############ generate a preview melody ##############s def previewGenerator(self, parameters): makeRythm = GenerationRythm() - makePitch = GenerationPitch(parameters.pattern) + makePitch = GenerationPitch() 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] beat = self.edit.noteDB.pages[self.edit.tuneInterface.getSelectedIds()[0]].beats @@ -626,7 +626,7 @@ class generationPalette(Palette): trackNotes = [] rythmSequence = makeRythm.celluleRythmSequence(parameters, barLength) - pitchSequence = makePitch.drunkPitchSequence(len(rythmSequence),parameters, table_pitch) + pitchSequence = makePitch.drunkPitchSequence(len(rythmSequence),parameters, table_pitch, 0) gainSequence = self.makeGainSequence(rythmSequence) durationSequence = self.makeDurationSequence(rythmSequence, parameters, table_duration, barLength) diff --git a/Edit/MainWindow.py b/Edit/MainWindow.py index c4f30d2..bdf38f2 100644 --- a/Edit/MainWindow.py +++ b/Edit/MainWindow.py @@ -57,6 +57,10 @@ class MainWindow( SubActivity ): self.scale = GenerationConstants.DEFAULT_SCALE + # META ALGO: [section, variation or not, nPages] A B A C + # TODO: Different parameters sets for each tracks + self.tuneForm = [[0, False, 4], [1, False, 4], [0, True, 4], [2, False, 2]] + def init_data( ): TP.ProfileBegin("init_data") self._data = {} @@ -411,12 +415,9 @@ class MainWindow( SubActivity ): self.audioRecordState = False def createNewTune( self, widget, data=None ): - if random.choice([0,1]): - self.createNewTune1() - else: - self.createNewTune2() + self.createNewTune3() - def createNewTune1( self ): + def createNewTune3( self ): if self.playing == True: self.handleStop() @@ -440,135 +441,42 @@ class MainWindow( SubActivity ): initTempo = random.randint(60, 132) self._data['tempo'] = initTempo - #self.GUI["2tempoAdjustment"].set_value(self._data['tempo']) - - param = self.chooseGenParams() - - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - self.tuneInterface.selectPages( self.noteDB.getTune() ) - self.displayPage( self.noteDB.getTune()[0] ) - self.generateMode = 'page' - self.generate( GenerationParameters( density = param[0], rythmRegularity = param[1], step = param[2], pitchRegularity = param[3], articule = param[4], silence = param[5], pattern = param[6], scale = param[7]) ) - - orch = self.newOrchestra() - - instrumentsIds = [] - for inst in orch: - instrumentsIds.append(inst.instrumentId) - - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - param = self.chooseGenParams() - - self.tuneInterface.selectPages( self.noteDB.getTune()[4:] ) - self.displayPage( self.noteDB.getTune()[4] ) - self.generateMode = 'page' - self.generate( GenerationParameters( density = param[0], rythmRegularity = param[1], step = param[2], pitchRegularity = param[3], articule = param[4], silence = param[5], pattern = param[6], scale = param[7]) ) - - self.tuneInterface.selectPages( self.noteDB.getTune() ) - self.displayPage( self.noteDB.getTune()[0] ) - - def createNewTune2( self ): - - if self.playing == True: - self.handleStop() - - self.tuneInterface.selectPages( self.noteDB.getTune() ) - - beats = random.randint(3,8) - stream = [] - for page in self.noteDB.getTune(): - stream += [ page, beats ] - if len(stream): - self.noteDB.updatePages( [ PARAMETER.PAGE_BEATS, len(stream)//2 ] + stream ) - - orch = self.newOrchestra() - instrumentsIds = [] - for inst in orch: - instrumentsIds.append(inst.instrumentId) - - self.pageDelete( -1, instruments = instrumentsIds ) - - initTempo = random.randint(60, 132) - self._data['tempo'] = initTempo - #self.GUI["2tempoAdjustment"].set_value(self._data['tempo']) + formsUsed = [] + for section in self.tuneForm: + if section[0] not in formsUsed: + param = self.chooseGenParams() + self.tuneInterface.selectPages( self.noteDB.getTune() ) + if not formsUsed: + for i in range(section[2]-1): + self.pageAdd(instruments = instrumentsIds) + else: + for i in range(section[2]): + self.pageAdd(instruments = instrumentsIds) + formsUsed.append(section[0]) - param = self.chooseGenParams() + self.tuneInterface.selectPages( self.noteDB.getTune()[-section[2]:] ) + self.generateMode = 'page' + self.generate( GenerationParameters( density = param[0], rythmRegularity = param[1], step = param[2], pitchRegularity = param[3], articule = param[4], silence = param[5], pattern = param[6], scale = param[7]), section[2] ) + else: + pageOffset = 0 + pageIds = [] + firstPos = [i[0] for i in self.tuneForm].index(section[0]) + if firstPos == 0: + pageOffset = 0 + else: + for i in range(firstPos): + pageOffset += self.tuneForm[i][2] + for i in range(section[2]): + pageIds.append(self.noteDB.getTune()[pageOffset + i]) + after = self.noteDB.getTune()[-1] + self.displayPage( self.noteDB.getTune()[pageOffset] ) + self.tuneInterface.selectPages(self.noteDB.getTune()) + self.pageDuplicate(-1, pageIds) - self.pageAdd(instruments = instrumentsIds) self.tuneInterface.selectPages( self.noteDB.getTune() ) self.displayPage( self.noteDB.getTune()[0] ) - self.generateMode = 'page' - self.generate( GenerationParameters( density = param[0], rythmRegularity = param[1], step = param[2], pitchRegularity = param[3], articule = param[4], silence = param[5], pattern = param[6], scale = param[7]) ) - - if param[0] < 0.5: - densRange = .9 - param[0] - densStep = densRange / 4. - densDir = 1 - else: - densRange = param[0] - 0.1 - densStep = densRange / 4. - densDir = -1 - - if param[1] < 0.5: - rytRange = .95 - param[1] - rytStep = rytRange / 4. - rytDir = 1 - else: - rytRange = param[1] - 0.25 - rytStep = rytRange / 4. - rytDir = -1 - - if param[2] < 0.5: - stepRange = .95 - param[2] - stepStep = stepRange / 4. - stepDir = 1 - else: - stepRange = param[2] - 0.05 - stepStep = stepRange / 4. - stepDir = -1 - - if param[3] < 0.5: - pitRange = .9 - param[3] - pitStep = pitRange / 4. - pitDir = 1 - else: - pitRange = param[3] - 0.1 - pitStep = pitRange / 4. - pitDir = -1 - - if param[4] < 0.5: - durRange = .9 - param[4] - durStep = durRange / 4. - durDir = 1 - else: - durRange = param[4] - 0.45 - durStep = durRange / 4. - durDir = -1 - - for i in [1,2,3,4]: - self.pageAdd(instruments = instrumentsIds) - self.pageAdd(instruments = instrumentsIds) - - self.tuneInterface.selectPages( self.noteDB.getTune()[i*2:] ) - #self.displayPage( self.noteDB.getTune()[i*2] ) - self.generate( GenerationParameters( - density = param[0], - rythmRegularity = param[1]+(rytStep*i*rytDir), - step = param[2]+(stepStep*i*stepDir), - pitchRegularity = param[3]+(pitStep*i*pitDir), - articule = param[4], - silence = param[5], - pattern = param[6], - scale = param[7]) ) - self.tuneInterface.selectPages( self.noteDB.getTune() ) - self.displayPage( self.noteDB.getTune()[0] ) def newOrchestra(self): stringsPickup = [] @@ -599,8 +507,8 @@ class MainWindow( SubActivity ): pitReg = GenerationConstants.PITCH_REGU_BANK[choose] dur = GenerationConstants.DURATION_BANK[choose] silence = GenerationConstants.SILENCE_BANK[choose] - pattern = GenerationConstants.PATTERN_BANK[choose] - scale = GenerationConstants.SCALE_BANK[choose] + pattern = [random.choice([0,1,1,2,3,3]) for x in range(4)] + scale = random.randint(0,6) return [density, rytReg, step, pitReg, dur, silence, pattern, scale] def onActivate( self, arg ): @@ -1062,7 +970,7 @@ class MainWindow( SubActivity ): # generation functions #----------------------------------- - def recompose( self, algo, params): + def recompose( self, algo, params, nPagesCycle = 4): if self.generateMode == "track": if self.trackSelected == [ 0 for i in range(Config.NUMBER_OF_TRACKS) ]: newtracks = set(range(Config.NUMBER_OF_TRACKS)) @@ -1094,7 +1002,7 @@ class MainWindow( SubActivity ): beatsOfPages, newtracks, newpages, - dict) + dict, nPagesCycle) # filter & fix input ...WTF!? for track in dict: @@ -1122,8 +1030,8 @@ class MainWindow( SubActivity ): stream += [-1] self.noteDB.addNotes( stream ) - def generate( self, params ): - self.recompose( generator1, params) + def generate( self, params, nPagesCycle = 4 ): + self.recompose( generator1, params, nPagesCycle) #======================================================= # Clipboard Functions diff --git a/Generation/Drunk.py b/Generation/Drunk.py index 0c32e1f..1bc3bbb 100755 --- a/Generation/Drunk.py +++ b/Generation/Drunk.py @@ -54,7 +54,7 @@ class DroneAndJump( Drunk ): Drunk.__init__( self, minValue, maxValue, trackLength=None ) self.minValue = min(minValue, maxValue) self.maxValue = max(minValue, maxValue) - self.beforeLastValue = self.minValue #random.randint( self.minValue, self.maxValue ) + self.beforeLastValue = random.randint( self.minValue, self.maxValue ) #self.minValue self.lastValue = self.beforeLastValue + 1 def getNextValue( self, maxStepSize, maxValue ): diff --git a/Generation/GenerationConstants.py b/Generation/GenerationConstants.py index 13cd44f..29dd28b 100755 --- a/Generation/GenerationConstants.py +++ b/Generation/GenerationConstants.py @@ -31,13 +31,12 @@ class GenerationConstants: # Default parameters for algorithmic generation - RYTHM_DENSITY_BANK = [.25, .88, .92, 1, .25] + RYTHM_DENSITY_BANK = [.25, .88, .72, 1, .25] RYTHM_REGU_BANK = [.75, .8, .85, .4, .5] PITCH_REGU_BANK = [.5, .8, 0, .85, .9] PITCH_STEP_BANK = [.5, .3, 1, .22, .85] DURATION_BANK = [.8, 1, .8, 1, 1] - SILENCE_BANK = [.2, .5, .25, .35, .12] - PATTERN_BANK = [0, 3, 1, 0, 3] + SILENCE_BANK = [.2, .5, .25, .55, .12] SCALE_BANK = [MAJOR, NATURAL_MINOR, LYDIEN, HARMONIC_MINOR, MYXOLYDIEN] chooseDefault = random.randint(0,4) @@ -47,7 +46,7 @@ class GenerationConstants: DEFAULT_STEP = PITCH_STEP_BANK[chooseDefault] DEFAULT_DURATION = DURATION_BANK[chooseDefault] DEFAULT_SILENCE = SILENCE_BANK[chooseDefault] - DEFAULT_PATTERN = PATTERN_BANK[chooseDefault] + DEFAULT_PATTERN = [random.randint(0,3) for x in range(4)] DEFAULT_SCALE = SCALE_BANK[chooseDefault] DEFAULT_RYTHM_METHOD = 0 diff --git a/Generation/GenerationPitch.py b/Generation/GenerationPitch.py index 2c9f999..4aeb7e9 100644 --- a/Generation/GenerationPitch.py +++ b/Generation/GenerationPitch.py @@ -5,36 +5,22 @@ import Config from Generation.GenerationConstants import GenerationConstants class GenerationPitch: - def __init__( self, pattern ): + def __init__( self ): MIN = 0 MAX = 14 - if pattern == 0: - self.pitchMethod = Drunk.Drunk( MIN, MAX ) - elif pattern == 1: - self.pitchMethod = Drunk.DroneAndJump( MIN, MAX ) - elif pattern == 2: - self.pitchMethod = Drunk.Repeter( MIN, MAX ) - elif pattern == 3: - self.pitchMethod = Drunk.Loopseg( MIN, MAX ) + self.drunkMethod = Drunk.Drunk( MIN, MAX ) + self.droneMethod = Drunk.DroneAndJump( MIN, MAX ) + self.repeatMethod = Drunk.Repeter( MIN, MAX ) + self.loopMethod = Drunk.Loopseg( MIN, MAX ) + self.methodList = [self.drunkMethod, self.droneMethod, self.repeatMethod, self.loopMethod] -# self.harmonicDrunk = Drunk.Drunk( MIN, MAX ) -# self.harmonicDroneAndJump = Drunk.DroneAndJump( MIN, MAX ) -# self.harmonicRepeter = Drunk.Repeter( MIN, MAX ) -# self.harmonicLoopseg = Drunk.Loopseg( MIN, MAX ) - -# def harmonicChooseMethod( self, pattern ): -# if pattern == 0: return self.harmonicDrunk -# elif pattern == 1: return self.harmonicDroneAndJump -# elif pattern == 2: return self.harmonicRepeter -# elif pattern == 3: return self.harmonicLoopseg - - def drunkPitchSequence(self, length, parameters, table_pitch): + def drunkPitchSequence(self, length, parameters, table_pitch, trackId): pitchSequence = [] append = pitchSequence.append numberOfPitch = int( ( 1 - (parameters.pitchRegularity*.8) ) * 10 + 1 ) step = -(int(parameters.step * 10)) max = len(table_pitch)-1 - nextValue = self.pitchMethod.getNextValue + nextValue = self.methodList[parameters.pattern[trackId]].getNextValue tonique = GenerationConstants.DEFAULT_TONIQUE for i in range(numberOfPitch): append((table_pitch[nextValue(step, max)]) + tonique) @@ -52,11 +38,3 @@ class GenerationPitch: for i in range(length): append(drumPitch[ rand( 0, max ) ] ) return pitchSequence - -# def harmonicPitchSequence( self, rythmSequence, parameters, table_pitch, harmonicSequence ): -# pitchSequence = [] -# pitchMethod = self.harmonicChooseMethod( parameters.pattern ) -# for onset in rythmSequence: -# beat = int( onset / Config.TICKS_PER_BEAT ) -# pitchSequence.append( ( table_pitch[ harmonicSequence[ beat ] [ pitchMethod.getNextValue(3, ( len( harmonicSequence[ beat ]) - 1) ) ]] ) + GenerationConstants.DEFAULT_TONIQUE ) -# return pitchSequence diff --git a/Generation/Generator.py b/Generation/Generator.py index f12ef26..bb3c7b8 100755 --- a/Generation/Generator.py +++ b/Generation/Generator.py @@ -41,11 +41,12 @@ def generator1( nbeats, # map [ pageId : beats ] trackIds, # list of trackIds to generate pageIds, # list of pageIds to generate - trackDictionary # map [ trackId : [ pageId : events ] ] + trackDictionary, # map [ trackId : [ pageId : events ] ] + nPagesCycle = 4 # META ALGO number of pages in a section ): makeRythm = GenerationRythm() - makePitch = GenerationPitch(parameters.pattern) + makePitch = GenerationPitch() def makeGainSequence( onsetList ): gainSequence = [] @@ -81,7 +82,7 @@ def generator1( append( ( barLength - onsetList[0] ) * proba( table_duration )) return durationSequence - def pageGenerate( parameters, trackId, pageId, trackOfNotes, drumPitch = None ): + def pageGenerate(parameters, trackId, pageId, trackOfNotes, drumPitch = None): trackNotes = trackOfNotes @@ -92,8 +93,7 @@ def generator1( else: currentInstrument = instrument[pageId][trackId] rythmSequence = makeRythm.celluleRythmSequence(parameters, barLength, currentInstrument) - pitchSequence = makePitch.drunkPitchSequence(len(rythmSequence),parameters, table_pitch) - makePitch.pitchMethod.__init__(5, 12) + pitchSequence = makePitch.drunkPitchSequence(len(rythmSequence),parameters, table_pitch, trackId) gainSequence = makeGainSequence(rythmSequence) durationSequence = makeDurationSequence(rythmSequence, parameters, table_duration, barLength, currentInstrument) @@ -138,14 +138,14 @@ def generator1( for pageId in pageIds: barLength = Config.TICKS_PER_BEAT * nbeats[ pageId ] trackOfNotes = [] - pageCycle = selectedPageCount % 4 # this should be fix in the meta algo + pageCycle = selectedPageCount % nPagesCycle if instrument[pageId][trackId][0:4] == 'drum': - if pageCycle in [1,2] and nbeats[pageId] == nbeats[lastPageId]: + if pageCycle not in [0,nPagesCycle-1] and nbeats[pageId] == nbeats[lastPageId]: trackDictionary[trackId][pageId] = [] for n in trackDictionary[trackId][lastPageId]: trackDictionary[trackId][pageId].append(n.clone()) - elif pageCycle == 3 and nbeats[pageId] == nbeats[lastPageId]: + elif pageCycle == (nPagesCycle-1) and nbeats[pageId] == nbeats[lastPageId]: for n in trackDictionary[trackId][lastPageId]: trackOfNotes.append(n.clone()) trackOnsets = [n.onset for n in trackOfNotes] @@ -162,11 +162,6 @@ def generator1( pageGenerate( parameters, trackId, pageId, trackOfNotes, drumPitch ) else: - if (selectedPageCount % 2) == 0 or random.randint(0, 5) < 2 or selectedPageCount == 0 or nbeats[pageId] != nbeats[lastPageId]: - pageGenerate( parameters, trackId, pageId, trackOfNotes, drumPitch = None ) - else: - trackDictionary[trackId][pageId] = [] - for n in trackDictionary[trackId][lastPageId]: - trackDictionary[trackId][pageId].append(n.clone()) + pageGenerate( parameters, trackId, pageId, trackOfNotes, drumPitch = None ) selectedPageCount += 1 lastPageId = pageId |