diff options
Diffstat (limited to 'Generation/GenerationParametersWindow.py')
-rwxr-xr-x | Generation/GenerationParametersWindow.py | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/Generation/GenerationParametersWindow.py b/Generation/GenerationParametersWindow.py new file mode 100755 index 0000000..5964566 --- /dev/null +++ b/Generation/GenerationParametersWindow.py @@ -0,0 +1,206 @@ +import pygtk +pygtk.require('2.0') +import gtk + +from Generation.Generator import GenerationParameters +from Generation.Generator import VariationParameters +from Generation.GenerationConstants import GenerationConstants + +class GenerationParametersWindow( gtk.Window ): + def __init__( self, generateFunction, variateFunction, handleCloseWindowCallback ): + gtk.Window.__init__( self, gtk.WINDOW_TOPLEVEL ) + self.rythmMethod = GenerationConstants.DEFAULT_RYTHM_METHOD + self.pitchMethod = GenerationConstants.DEFAULT_PITCH_METHOD + self.pattern = GenerationConstants.DEFAULT_PATTERN + self.scale = GenerationConstants.DEFAULT_SCALE + self.pitchVariation = GenerationConstants.DEFAULT_PITCH_VARIATION + self.rythmVariation = GenerationConstants.DEFAULT_RYTHM_VARIATION + self.generateFunction = generateFunction + self.variateFunction = variateFunction + self.sourceVariation = 0 + self.setupWindow( handleCloseWindowCallback ) + + def setupWindow( self, handleCloseWindowCallback ): + self.set_position( gtk.WIN_POS_CENTER_ON_PARENT ) + self.set_title("Algorithmic generator") + self.set_border_width(5) + self.connect( "delete_event", handleCloseWindowCallback ) + self.mainBox = gtk.VBox(False, 5) + self.generationBox = gtk.VBox(False, 2) + self.variationBox = gtk.VBox(False, 2) + self.sliderBox = gtk.VBox(False, 2) + self.labelRythmMethodBox = gtk.VBox(False, 2) + self.rythmMethodBox = gtk.HBox(False, 2) + self.labelSourceVariationBox = gtk.VBox(False, 2) + self.sourceVariationBox = gtk.HBox(False, 2) + self.labelPitchMethodBox = gtk.VBox(False, 2) + self.pitchMethodBox = gtk.HBox(False, 2) + self.labelPatternBox = gtk.VBox(False, 2) + self.patternBox = gtk.HBox(False, 2) + self.labelScaleBox = gtk.VBox(False, 2) + self.scaleBox = gtk.HBox(False, 2) + self.buttonBox = gtk.HBox(False, 2) + + self.labelPitchVariationBox = gtk.VBox(False, 2) + self.pitchVariationBox = gtk.HBox(False, 2) + self.labelRythmVariationBox = gtk.VBox(False, 2) + self.rythmVariationBox = gtk.HBox(False, 2) + + self.generationBox.pack_start( gtk.Label( "GENERATION" ), False, False, 0 ) + # Create parameters sliders box + #TODO: remove magic numbers + self.densityAdjust = self.initSlider("density", GenerationConstants.DEFAULT_DENSITY, 0, 1, 0.01, 0, 2) + self.rythmRegularityAdjust = self.initSlider("rythm regularity", GenerationConstants.DEFAULT_RYTHM_REGULARITY, 0, 1, 0.01, 0, 2) + self.pitchStepAdjust = self.initSlider("pitch max step", GenerationConstants.DEFAULT_STEP, -10, 10, 1, 2, 0) + self.pitchRegularityAdjust = self.initSlider("pitch regularity", GenerationConstants.DEFAULT_PITCH_REGULARITY, 0, 1, 0.01, 0, 2) + self.articulationAdjust = self.initSlider("stacato / legato", GenerationConstants.DEFAULT_ARTICULE, 0, 1, 0.01, 0, 2) + self.generationBox.pack_start(self.sliderBox, 5) + + # Create melodic rythm methods box + self.labelRythmMethodBox.pack_start(gtk.Label("melodic rythm generation method"), False, False, 0) + self.generationBox.pack_start(self.labelRythmMethodBox, 3) + rythmMethodType = ['Cellule', 'Xnoise' ] + self.initRadioButton( rythmMethodType, self.rythmMethodCallback, self.rythmMethodBox ) + self.generationBox.pack_start(self.rythmMethodBox, 3) + + # Create pitch generation methods box + self.labelPitchMethodBox.pack_start(gtk.Label("pitch generation method"), False, False, 0) + self.generationBox.pack_start(self.labelPitchMethodBox, 3) + pitchMethodType = [ 'melodic', 'harmonic' ] + self.initRadioButton( pitchMethodType, self.pitchMethodCallback, self.pitchMethodBox ) + self.generationBox.pack_start(self.pitchMethodBox, 3) + + # Create pitch patterns box + self.labelPatternBox.pack_start(gtk.Label("pitch pattern"), False, False, 0) + self.generationBox.pack_start(self.labelPatternBox, 3) + patternType = [ 'Drunk', 'DroneJump', 'Repeter', 'Loopseg' ] + self.initRadioButton( patternType, self.patternCallback, self.patternBox ) + self.generationBox.pack_start(self.patternBox, 3) + + # Create scales box + self.labelScaleBox.pack_start(gtk.Label("scales"), False, False, 0) + self.generationBox.pack_start(self.labelScaleBox, 3) + scalesType = [ 'Major', 'Minor H', 'Minor N', 'Phrygien' ] + self.initRadioButton( scalesType, self.scaleCallback, self.scaleBox ) + self.generationBox.pack_start(self.scaleBox, 3) + + # create generate button + generateButton = gtk.Button('Generate') + generateButton.connect("clicked", self.generate) + self.buttonBox.pack_start(generateButton) + self.generationBox.pack_start(self.buttonBox, 3) + + # create variation box + self.variationBox.pack_start( gtk.Label( "VARIATION" ), False, False, 0 ) + + # create source variation box + self.labelSourceVariationBox.pack_start(gtk.Label("pages sources"), False, False, 0) + self.variationBox.pack_start(self.labelSourceVariationBox, 3) + sourceVariationType = [ 1, 2, 3, 4, 5 ] + self.initSourceRadioButton( sourceVariationType, self.sourceVariationCallback, self.sourceVariationBox ) + self.variationBox.pack_start(self.sourceVariationBox, 3) + + # create pitch variation box + self.labelPitchVariationBox.pack_start(gtk.Label("pitch variation"), False, False, 0) + self.variationBox.pack_start(self.labelPitchVariationBox, 3) + pitchVariationType = [ 'Copy', 'Markov', 'Reverse', 'Sort', 'Shuffle' ] + self.initRadioButton( pitchVariationType, self.pitchVariationCallback, self.pitchVariationBox ) + self.variationBox.pack_start(self.pitchVariationBox, 3) + + # create rythm variation box + self.labelRythmVariationBox.pack_start(gtk.Label("rythm variation"), False, False, 0) + self.variationBox.pack_start(self.labelRythmVariationBox, 3) + rythmVariationType = [ 'Copy', 'Reverse', 'Shuffle' ] + self.initRadioButton( rythmVariationType, self.rythmVariationCallback, self.rythmVariationBox ) + self.variationBox.pack_start(self.rythmVariationBox, 3) + + # create variate button + variateButton = gtk.Button('Variate') + variateButton.connect("clicked", self.variate) + self.variationBox.pack_start(variateButton, 3) + + self.mainBox.pack_start(self.generationBox) + self.mainBox.pack_start(self.variationBox) + + self.add(self.mainBox) + + def getGenerationParameters( self ): + return GenerationParameters( self.densityAdjust.value, + self.rythmRegularityAdjust.value, + self.pitchStepAdjust.value, + self.pitchRegularityAdjust.value, + self.articulationAdjust.value, + self.rythmMethod, + self.pitchMethod, + self.pattern, + self.scale ) + + def generate(self, data=None): + self.generateFunction( self.getGenerationParameters() ) + + def getVariationParameters( self ): + return VariationParameters( self.sourceVariation, + self.pitchVariation, + self.rythmVariation ) + + def variate( self, data=None ): + self.variateFunction( self.getVariationParameters() ) + + def rythmMethodCallback( self, widget, rythmMethod ): + if widget.get_active(): + self.rythmMethod = rythmMethod + + def pitchMethodCallback( self, widget, pitchMethod ): + if widget.get_active(): + self.pitchMethod = pitchMethod + + def patternCallback( self, widget, pattern ): + if widget.get_active(): + self.pattern = pattern + + def scaleCallback( self, widget, scale ): + if widget.get_active(): + self.scale = scale + + def sourceVariationCallback( self, widget, data ): + if widget.get_active(): + self.sourceVariation = int( data ) + + def pitchVariationCallback( self, widget, data ): + if widget.get_active(): + self.pitchVariation = data + + def rythmVariationCallback( self, widget, data ): + if widget.get_active(): + self.rythmVariation = data + + def initSlider(self, label, initValue, minValue, maxValue, incStep, policy, digits): + sliderAdjust = gtk.Adjustment(initValue, minValue, maxValue, incStep, incStep, 0) + slider = gtk.HScale(sliderAdjust) + slider.set_update_policy(policy) + slider.set_digits(digits) + slider.set_value_pos(1) + slider.set_size_request(250, 25) + self.sliderBox.pack_start(gtk.Label(label), False, False, 0) + self.sliderBox.pack_start(slider) + return sliderAdjust + + def initRadioButton( self, labelList, methodCallback, box ): + for i in range( len( labelList ) ): + if i == 0: + button = gtk.RadioButton( None, labelList[ i ] ) + else: + button = gtk.RadioButton( button, labelList[ i ] ) + button.connect( "toggled", methodCallback, i ) + box.pack_start( button, True, True, 0 ) + + def initSourceRadioButton( self, labelList, methodCallback, box ): + for i in range( len( labelList ) ): + if i == 0: + button = gtk.RadioButton(None, str( labelList[ i ] ) ) + else: + button = gtk.RadioButton( button, str( labelList[ i ] ) ) + button.connect( "toggled", methodCallback, i ) + box.pack_start( button, True, True, 0 ) + if i == 0: + button.set_active(True) |