Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Edit/EditToolbars.py6
-rw-r--r--Edit/MainWindow.py176
-rwxr-xr-xGeneration/Drunk.py2
-rwxr-xr-xGeneration/GenerationConstants.py7
-rw-r--r--Generation/GenerationPitch.py38
-rwxr-xr-xGeneration/Generator.py23
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