Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/SynthLab
diff options
context:
space:
mode:
authorOli <olivier.beloanger@umontreal.ca>2007-07-30 05:04:21 (GMT)
committer Oli <olivier.beloanger@umontreal.ca>2007-07-30 05:04:21 (GMT)
commita422f5df140f489ff34c4d0e78d2f51831035f9e (patch)
tree5936ab032bbf2758aba96770abfbd96d47eb818d /SynthLab
parentbe105b3d5d1893698350a7c05d852324ca94ec1e (diff)
SynthLab new interface
Diffstat (limited to 'SynthLab')
-rwxr-xr-xSynthLab/SynthLabConstants.py35
-rw-r--r--SynthLab/SynthLabParametersWindow.py61
-rw-r--r--SynthLab/SynthLabWindow.py389
-rwxr-xr-xSynthLab/SynthObjectsParameters.py2
4 files changed, 317 insertions, 170 deletions
diff --git a/SynthLab/SynthLabConstants.py b/SynthLab/SynthLabConstants.py
index e0ab44b..550e8ef 100755
--- a/SynthLab/SynthLabConstants.py
+++ b/SynthLab/SynthLabConstants.py
@@ -1,7 +1,7 @@
class SynthLabConstants:
PIC_SIZE = 80
- HALF_SIZE = PIC_SIZE // 2
+ HALF_SIZE = PIC_SIZE // 2
GT_CONTROL_OUTPUT = 0
GT_CONTROL_INPUT = 1
@@ -9,7 +9,7 @@ class SynthLabConstants:
GT_SOUND_INPUT = 3
# GATE_POINT[ojecttype][gatetype][gatenum] = (x,y)
# relative to object center
- GATE_POINT = [ [ [ (0,34) ] ],
+ GATE_POINT = [ [ [ (0,34) ] ],
[ [], [ (-25,-35),(-9,-35),(8,-35),(25,-35) ], [ (0,35) ] ],
[ [], [ (35,-20),(35,-7),(35,7),(35,20) ], [ (0,34) ], [ (0,-34) ] ],
[ [], [], [], [ (0,-35) ] ] ]
@@ -17,7 +17,7 @@ class SynthLabConstants:
# gate locations relative to object center
GATE_MAP = [ [ [ [-6,28,6,40] ] ],
[ [], [[-31,-40,-18,-28], [-16,-40,-3,-28], [2,-40,15,-28], [19,-40,32,-28]], [[-6,28,7,40]] ],
- [ [], [[28,-26,40,-13], [28,-13,40,0], [28,0,40,13], [28,13,40,26]], [[-6,28,7,40]], [[-6,-40,7,-28]] ],
+ [ [], [[28,-26,40,-13], [28,-13,40,0], [28,0,40,13], [28,13,40,26]], [[-6,28,7,40]], [[-6,-40,7,-28]] ],
[ [], [], [], [[-6,-40,7,-28]] ] ]
# insert wire locations into map
GATE_OFFSET = 7
@@ -33,10 +33,19 @@ class SynthLabConstants:
elif y > HALF_SIZE-GATE_OFFSET: y = HALF_SIZE
m.append( ( x, y ) )
- INIT_LOCATIONS = [ [480,700], [560,700], [640,700], [720, 700], [100,700], [180,700], [260,700], [340, 700], [860,700], [940,700], [1020,700], [1100, 700], [600, 595]]
+ OBJ_Y_LOC = 710
+# INIT_LOCATIONS = [ [330,OBJ_Y_LOC], [405,OBJ_Y_LOC], [480,OBJ_Y_LOC], [555, OBJ_Y_LOC], [15,OBJ_Y_LOC], [90,OBJ_Y_LOC],
+# [170,OBJ_Y_LOC], [250, OBJ_Y_LOC], [635,OBJ_Y_LOC], [710,OBJ_Y_LOC], [785,OBJ_Y_LOC], [860, OBJ_Y_LOC],
+# [600, 625]]
+ INIT_LOCATIONS = [ [450,OBJ_Y_LOC], [450,OBJ_Y_LOC], [450,OBJ_Y_LOC],
+ [450, OBJ_Y_LOC], [225,OBJ_Y_LOC], [225,OBJ_Y_LOC],
+ [225,OBJ_Y_LOC], [225, OBJ_Y_LOC], [675,OBJ_Y_LOC],
+ [675,OBJ_Y_LOC], [675,OBJ_Y_LOC], [675, OBJ_Y_LOC],
+ [450, 625]]
- FLOAT = [.01, False]
- INTEGER = [1, 1]
+ FLOAT1 = [.1, 1]
+ FLOAT = [.01, 2]
+ INTEGER = [1, 0]
# s1 s2 s3 s4 s1min s1max s2min s2max s3min s3max s4min s4max [s1step s1digits] [s2step s2digits] [s3step s3digits]
TYPES = { 'lfo': [.5, 1, 0, 0, 0, 1, 0, 20, 0, 5, 0, 1, FLOAT, FLOAT, INTEGER],
@@ -48,16 +57,16 @@ class SynthLabConstants:
'buzz': [1, 30, .85, 1, 0, 2, 0, 40, 0, 1, 0, 2, FLOAT, INTEGER, FLOAT],
'vco': [1, 1, .2, 1, 0, 2, 0, 2, 0, .5, 0, 2, FLOAT, INTEGER, FLOAT],
'pluck': [1, 5000, 0, 1, 0, 2, 100, 8000, 0, 8, 0, 2, FLOAT, INTEGER, FLOAT],
- 'noise': [0, 3000, 4000, 1, 0, 2, 0, 8000, 0, 6000, 0, 2, INTEGER, FLOAT, FLOAT],
- 'sample': [1, 5, 5000, 1, 0, 2, 0, 99, 100, 8000, 0, 2, FLOAT, INTEGER, FLOAT],
+ 'noise': [0, 3000, 4000, 1, 0, 2, 0, 8000, 0, 6000, 0, 2, INTEGER, INTEGER,INTEGER],
+ 'sample': [1, 5, 5000, 1, 0, 2, 0, 99, 100, 8000, 0, 2, FLOAT, INTEGER, INTEGER],
'voice': [1, 3, 5, 1, 0, 2, 0, 8, 1, 10, 0, 2, FLOAT, INTEGER, FLOAT],
'grain': [1, 4, 1, 1, 0, 2, 0, 99, 0, 1, 0, 2, FLOAT, INTEGER, FLOAT],
'addSynth': [1, .005, 5, 1, 0, 2, 0, 20, 0, 9, 0, 2, FLOAT, FLOAT, INTEGER],
- 'wguide': [100, 3000, .8, 1, 0, 200, 100, 5000, 0, 1, 0, 2, FLOAT, FLOAT, FLOAT],
- 'distort': [800, .7, .7, 1, 0, 1000, 0, 1, 0, 1, 0, 2, FLOAT, FLOAT, FLOAT],
- 'filter': [1000, .6, 0, 1, 200, 5000, 0, 1, 0, 2, 0, 2, FLOAT, FLOAT, INTEGER],
- 'ring': [500, 1, 0, 1, 0, 1000, 0, 1, 0, 5, 0, 2, FLOAT, FLOAT, INTEGER],
- 'reverb': [1.5, 3000, .5, 1, 0, 4, 100, 7000, 0, 1, 0, 2, FLOAT, FLOAT, FLOAT],
+ 'wguide': [100, 3000, .8, 1, 0, 200, 100, 5000, 0, 1, 0, 2, FLOAT1, INTEGER, FLOAT],
+ 'distort': [800, .7, .7, 1, 0, 1000, 0, 1, 0, 1, 0, 2, INTEGER, FLOAT, FLOAT],
+ 'filter': [1000, .6, 0, 1, 200, 5000, 0, 1, 0, 2, 0, 2, INTEGER, FLOAT, INTEGER],
+ 'ring': [500, 1, 0, 1, 0, 1000, 0, 1, 0, 5, 0, 2, INTEGER, FLOAT, INTEGER],
+ 'reverb': [1.5, 3000, .5, 1, 0, 4, 100, 7000, 0, 1, 0, 2, FLOAT, INTEGER, FLOAT],
'harmon': [1.25, .04, .5, 1, 0, 2, 0, 1, 0, 1, 0, 2, FLOAT, FLOAT, FLOAT],
'eq4band': [1., 1., 1., 1., 0, 2, 0, 2, 0, 2, 0, 2, FLOAT, FLOAT, FLOAT],
'chorus': [.5, 1., 5., .5, 0, 3, 0, 10, 0, 30, 0, 1, FLOAT, FLOAT, FLOAT]}
diff --git a/SynthLab/SynthLabParametersWindow.py b/SynthLab/SynthLabParametersWindow.py
index 4d7b8d3..51c82d3 100644
--- a/SynthLab/SynthLabParametersWindow.py
+++ b/SynthLab/SynthLabParametersWindow.py
@@ -5,7 +5,6 @@ import gobject
import Config
from Util.ThemeWidgets import *
from SynthLab.SynthLabConstants import SynthLabConstants
-from SynthLab.Parameter import Parameter
from Util.Trackpad import Trackpad
from Util.CSoundClient import new_csound_client
@@ -36,7 +35,6 @@ class SynthLabParametersWindow( gtk.Window ):
self.playNoteFunction = playNoteFunction
self.trackpad = Trackpad( self )
self.playingPitch = []
- self.parameterOpen = 0
self.clockStart = 0
self.slider1Val = ''
self.slider2Val = ''
@@ -44,7 +42,7 @@ class SynthLabParametersWindow( gtk.Window ):
self.slider4Val = ''
self.tooltips = gtk.Tooltips()
- self.sample_names = [name for i in range( len( Config.INSTRUMENTS ) ) for name in Config.INSTRUMENTS.keys() if Config.INSTRUMENTS[ name ].instrumentId == i ]
+ self.sample_names = [name for i in range( len( Config.INSTRUMENTS ) ) for name in Config.INSTRUMENTS.keys() if Config.INSTRUMENTS[ name ].instrumentId == i ]
types = SynthLabConstants.CHOOSE_TYPE[self.objectType]
types2 = SynthLabConstants.CHOOSE_TYPE2[self.objectType]
typesLabelList = Tooltips.SYNTHTYPES[self.objectType]
@@ -88,8 +86,7 @@ class SynthLabParametersWindow( gtk.Window ):
self.p1Adjust = gtk.Adjustment(slider1Init, slider1Min, slider1Max, slider1Step, slider1Step, 0)
self.p1Adjust.connect("value-changed", self.sendTables, 1)
self.slider1 = ImageVScale(Config.TAM_TAM_ROOT + '/Resources/Images/sliderbutred.png', self.p1Adjust, 7, snap = slider1Snap)
- self.slider1.connect("button-press-event", self.showParameter, 1)
- self.slider1.connect("button-release-event", self.hideParameter)
+ self.slider1.connect("button-release-event", self.handleSliderRelease)
self.slider1.set_inverted(True)
self.slider1.set_size_request(50, 200)
self.sliderBox.pack_start(self.slider1, True, False)
@@ -97,8 +94,7 @@ class SynthLabParametersWindow( gtk.Window ):
self.p2Adjust = gtk.Adjustment(slider2Init, slider2Min, slider2Max, slider2Step, slider2Step, 0)
self.p2Adjust.connect("value-changed", self.sendTables, 2)
self.slider2 = ImageVScale(Config.TAM_TAM_ROOT + '/Resources/Images/sliderbutred.png', self.p2Adjust, 7, snap = slider2Snap)
- self.slider2.connect("button-press-event", self.showParameter, 2)
- self.slider2.connect("button-release-event", self.hideParameter)
+ self.slider2.connect("button-release-event", self.handleSliderRelease)
self.slider2.set_inverted(True)
self.slider2.set_size_request(50, 200)
self.sliderBox.pack_start(self.slider2, True, False)
@@ -106,8 +102,7 @@ class SynthLabParametersWindow( gtk.Window ):
self.p3Adjust = gtk.Adjustment(slider3Init, slider3Min, slider3Max, slider3Step, slider3Step, 0)
self.p3Adjust.connect("value-changed", self.sendTables, 3)
self.slider3 = ImageVScale(Config.TAM_TAM_ROOT + '/Resources/Images/sliderbutred.png', self.p3Adjust, 7, snap = slider3Snap)
- self.slider3.connect("button-press-event", self.showParameter, 3)
- self.slider3.connect("button-release-event", self.hideParameter)
+ self.slider3.connect("button-release-event", self.handleSliderRelease)
self.slider3.set_inverted(True)
self.slider3.set_size_request(50, 200)
self.sliderBox.pack_start(self.slider3, True, False)
@@ -115,14 +110,13 @@ class SynthLabParametersWindow( gtk.Window ):
self.p4Adjust = gtk.Adjustment(slider4Init, slider4Min, slider4Max, .01, .01, 0)
self.p4Adjust.connect("value-changed", self.sendTables, 4)
self.slider4 = ImageVScale(Config.TAM_TAM_ROOT + '/Resources/Images/sliderbutred.png', self.p4Adjust, 7)
- self.slider4.connect("button-press-event", self.showParameter, 4)
- self.slider4.connect("button-release-event", self.hideParameter)
+ self.slider4.connect("button-release-event", self.handleSliderRelease)
self.slider4.set_digits(2)
self.slider4.set_value_pos(2)
self.slider4.set_inverted(True)
self.slider4.set_size_request(50, 200)
self.sliderBox.pack_start(self.slider4, True, False)
-
+
self.sendTables(self.p1Adjust, 1)
self.tooltipsUpdate()
@@ -138,7 +132,7 @@ class SynthLabParametersWindow( gtk.Window ):
def onFocusIn(self, event, data=None):
csnd = new_csound_client()
csnd.connect(True)
-
+
def destroy( self, data=None ):
self.hide()
@@ -150,7 +144,7 @@ class SynthLabParametersWindow( gtk.Window ):
if midiPitch not in self.playingPitch:
self.playingPitch.append( midiPitch )
self.playNoteFunction( midiPitch, 0 )
-
+
def onKeyRelease( self, widget, event ):
key = event.hardware_keycode
if key not in Config.KEY_MAP:
@@ -190,38 +184,19 @@ class SynthLabParametersWindow( gtk.Window ):
self.p2Adjust.set_all(slider2Init, slider2Min, slider2Max, slider2Step, slider2Step, 0)
self.p3Adjust.set_all(slider3Init, slider3Min, slider3Max, slider3Step, slider3Step, 0)
self.p4Adjust.set_all(slider4Init, slider4Min, slider4Max, 0.01, 0.01, 0)
-
+
self.tooltipsUpdate()
-
- def showParameter( self, widget, value=None, data=None ):
- if not self.parameterOpen:
- self.parameter = Parameter(self.recallSliderValue(data))
- self.parameterOpen = 1
-
- def hideParameter( self, widget, data=None ):
- if self.parameterOpen and not self.clockStart:
- self.windowCloseDelay = gobject.timeout_add(300, self.closeParameterWindow)
- self.clockStart = 1
+
+ def handleSliderRelease( self, widget, data=None ):
self.tooltipsUpdate()
if self.instanceID != 12:
self.writeTables( self.synthObjectsParameters.types, self.synthObjectsParameters.controlsParameters, self.synthObjectsParameters.sourcesParameters, self.synthObjectsParameters.fxsParameters )
- def closeParameterWindow( self ):
- if self.parameterOpen:
- self.parameter.hide()
- self.parameterOpen = 0
- gobject.source_remove( self.windowCloseDelay )
- self.clockStart = 0
- return True
-
- def parameterUpdate( self, data ):
- if self.parameterOpen:
- self.parameter.update(self.recallSliderValue(data))
def tooltipsUpdate( self ):
selectedType = SynthLabConstants.CHOOSE_TYPE[self.objectType][self.choosenType]
self.tooltips.set_tip(self.slider1, Tooltips.SYNTHPARA[selectedType][0] + ': ' + self.recallSliderValue(1))
self.tooltips.set_tip(self.slider2, Tooltips.SYNTHPARA[selectedType][1] + ': ' + self.recallSliderValue(2))
- self.tooltips.set_tip(self.slider3, Tooltips.SYNTHPARA[selectedType][2] + ': ' + self.recallSliderValue(3))
+ self.tooltips.set_tip(self.slider3, Tooltips.SYNTHPARA[selectedType][2] + ': ' + self.recallSliderValue(3))
self.tooltips.set_tip(self.slider4, Tooltips.SYNTHPARA[selectedType][3] + ': ' + self.recallSliderValue(4))
def typeCallback( self, widget, choosenType ):
@@ -234,21 +209,21 @@ class SynthLabParametersWindow( gtk.Window ):
self.writeTables( self.synthObjectsParameters.types, self.synthObjectsParameters.controlsParameters, self.synthObjectsParameters.sourcesParameters, self.synthObjectsParameters.fxsParameters )
def recallSliderValue( self, num ):
- if num == 1:
+ if num == 1:
if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.NOISE:
return Tooltips.NOISE_TYPES[int(self.slider1Val)]
else:
return '%.2f' % self.slider1Val
- if num == 2:
+ if num == 2:
if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.VCO:
return Tooltips.VCO_WAVEFORMS[int(self.slider2Val)]
- elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.SAMPLE or Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.GRAIN:
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.SAMPLE or Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.GRAIN:
return self.sample_names[int(self.slider2Val)]
elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.VOICE:
return Tooltips.VOWEL_TYPES[int(self.slider2Val)]
else:
return '%.2f' % self.slider2Val
- if num == 3:
+ if num == 3:
if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.LFO:
return Tooltips.LFO_WAVEFORMS[int(self.slider3Val)]
elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.TRACKPADX:
@@ -283,8 +258,6 @@ class SynthLabParametersWindow( gtk.Window ):
else:
for i in range(4):
self.synthObjectsParameters.setOutputParameter(i, sliderListValue[i])
-
- self.parameterUpdate(data)
def initRadioButton( self, labelList, labelList2, typesLabel, methodCallback, box, active ):
for i in range( len( labelList ) ):
@@ -297,5 +270,3 @@ class SynthLabParametersWindow( gtk.Window ):
button.connect( "toggled", methodCallback, i )
self.tooltips.set_tip(button, typesLabel[i])
box.pack_start( button, False, False, 5 )
-
-
diff --git a/SynthLab/SynthLabWindow.py b/SynthLab/SynthLabWindow.py
index e238939..e8e8dfc 100644
--- a/SynthLab/SynthLabWindow.py
+++ b/SynthLab/SynthLabWindow.py
@@ -10,13 +10,14 @@ import shelve
from gettext import gettext as _
import os
+from sugar.graphics.toolcombobox import ToolComboBox
+from sugar.graphics.combobox import ComboBox
+
import Config
from Util.ThemeWidgets import *
from Util.CSoundClient import new_csound_client
-from SynthLab.SynthLabParametersWindow import SynthLabParametersWindow
from SynthLab.SynthObjectsParameters import SynthObjectsParameters
from SynthLab.SynthLabConstants import SynthLabConstants
-from SynthLab.Parameter import Parameter
from SynthLab.SynthLabToolbars import mainToolbar
from SynthLab.SynthLabToolbars import presetToolbar
from Util.Trackpad import Trackpad
@@ -50,6 +51,10 @@ class SynthLabWindow(SubActivity):
self.recordWait = 0
self.recCount = 0
self.duration = 2
+ self.new = True
+ self.viewType = ''
+ self.viewParam = ''
+ self.curSlider = 1
self.durString = '%.2f' % self.duration
self.playingPitch = []
self.journalCalled = True
@@ -78,8 +83,6 @@ class SynthLabWindow(SubActivity):
self.lineWidthMUL2 = self.lineWidth*2
self.lineWidthMUL4 = self.lineWidth*4
self.lineWidthMUL4SQ = self.lineWidthMUL4*self.lineWidthMUL4
- self.pix = 10
- self.parameterOpen = 0
self.clockStart = 0
self.sample_names = [name for i in range( len( Config.INSTRUMENTS ) ) for name in Config.INSTRUMENTS.keys() if Config.INSTRUMENTS[ name ].instrumentId == i ]
self.tooltips = gtk.Tooltips()
@@ -109,29 +112,129 @@ class SynthLabWindow(SubActivity):
if as_window:
self.set_position( gtk.WIN_POS_CENTER_ON_PARENT )
self.set_title("Synth Lab")
- self.mainBox = gtk.VBox()
+ self.mainBox = gtk.HBox()
self.subBox = gtk.HBox()
- self.drawingBox = RoundVBox( 10, Config.INST_BCK_COLOR, Config.PANEL_BCK_COLOR )
+ self.drawingBox = RoundVBox( 10, Config.PANEL_COLOR, Config.PANEL_COLOR )
self.drawingBox.set_border_width(Config.PANEL_SPACING)
- self.presetBox = RoundVBox( 10, Config.PANEL_COLOR, Config.PANEL_BCK_COLOR )
- self.presetBox.set_border_width(Config.PANEL_SPACING)
- self.presetBox.set_size_request(100, 790)
+ self.infoBox = RoundVBox( 10, Config.TOOLBAR_BCK_COLOR, Config.TOOLBAR_BCK_COLOR )
+ self.infoBox.set_border_width(Config.PANEL_SPACING)
+ self.infoBox.set_size_request(300, 750)
self.subBox.pack_start(self.drawingBox, True, True)
- #self.subBox.pack_start(self.presetBox, True, True)
+ self.subBox.pack_start(self.infoBox, True, True)
self.mainBox.pack_start(self.subBox)
- self.commandBox = gtk.HBox()
-
- self.sliderBox = RoundHBox( 10, Config.PANEL_COLOR, Config.PANEL_BCK_COLOR )
- self.sliderBox.set_border_width(Config.PANEL_SPACING)
- self.commandBox.pack_start(self.sliderBox)
- self.buttonBox = RoundHBox( 10, Config.PANEL_COLOR, Config.PANEL_BCK_COLOR )
- self.buttonBox.set_border_width(Config.PANEL_SPACING)
- self.commandBox.pack_start(self.buttonBox)
- #self.mainBox.pack_start(self.commandBox)
- self.drawingAreaWidth = 1200
+ menuBox = gtk.HBox()
+ self.objComboBox = ComboBox()
+ self.objComboBox.append_item(0, 'adsr', Config.IMAGE_ROOT + '/adsr.png')
+ self.objComboBox.set_active(0)
+ self.objComboBox.connect('changed', self.changeObject)
+ comboMenu = ToolComboBox(self.objComboBox)
+ menuBox.pack_start(comboMenu)
+ self.infoBox.pack_start(menuBox, False, False, 5)
+
+ slidersBox = gtk.HBox()
+
+ #fake values
+ self.instanceID = 12 # object number
+ self.objectType = self.instanceID / 4 #(control, source, fx, output)
+ self.choosenType = 0 # self.synthObjectsParameters.types[self.instanceID] module as an index
+ selectedType = SynthLabConstants.CHOOSE_TYPE[self.objectType][self.choosenType] #module as a string
+
+ slider1Min = SynthLabConstants.TYPES[selectedType][4]
+ slider1Max = SynthLabConstants.TYPES[selectedType][5]
+ slider2Min = SynthLabConstants.TYPES[selectedType][6]
+ slider2Max = SynthLabConstants.TYPES[selectedType][7]
+ slider3Min = SynthLabConstants.TYPES[selectedType][8]
+ slider3Max = SynthLabConstants.TYPES[selectedType][9]
+ slider4Min = SynthLabConstants.TYPES[selectedType][10]
+ slider4Max = SynthLabConstants.TYPES[selectedType][11]
+
+ slider1Step = SynthLabConstants.TYPES[selectedType][12][0]
+ slider1Snap = SynthLabConstants.TYPES[selectedType][12][1]
+ slider2Step = SynthLabConstants.TYPES[selectedType][13][0]
+ slider2Snap = SynthLabConstants.TYPES[selectedType][13][1]
+ slider3Step = SynthLabConstants.TYPES[selectedType][14][0]
+ slider3Snap = SynthLabConstants.TYPES[selectedType][14][1]
+
+ parametersTable = self.synthObjectsParameters.choiceParamsSet[self.objectType]
+ tablePos = (self.instanceID % 4)*4
+ slider1Init = parametersTable[tablePos]
+ slider2Init = parametersTable[tablePos+1]
+ slider3Init = parametersTable[tablePos+2]
+ slider4Init = parametersTable[tablePos+3]
+
+ sliderTextColor = gtk.gdk.color_parse(Config.WHITE_COLOR)
+
+ self.p1Adjust = gtk.Adjustment(slider1Init, slider1Min, slider1Max, slider1Step, slider1Step, 0)
+ self.p1Adjust.connect("value-changed", self.sendTables, 1)
+ self.slider1 = gtk.VScale(self.p1Adjust)
+ self.slider1.connect("button-release-event", self.handleSliderRelease)
+ self.slider1.set_digits(slider1Snap)
+ self.slider1.set_inverted(True)
+ self.slider1.set_size_request(55, 300)
+ self.slider1.modify_fg(gtk.STATE_NORMAL, sliderTextColor)
+ slidersBox.pack_start(self.slider1, True, False)
+
+ self.p2Adjust = gtk.Adjustment(slider2Init, slider2Min, slider2Max, slider2Step, slider2Step, 0)
+ self.p2Adjust.connect("value-changed", self.sendTables, 2)
+ self.slider2 = gtk.VScale(self.p2Adjust)
+ self.slider2.connect("button-release-event", self.handleSliderRelease)
+ self.slider2.set_digits(slider2Snap)
+ self.slider2.set_inverted(True)
+ self.slider2.set_size_request(55, 300)
+ self.slider2.modify_fg(gtk.STATE_NORMAL, sliderTextColor)
+ slidersBox.pack_start(self.slider2, True, False)
+
+ self.p3Adjust = gtk.Adjustment(slider3Init, slider3Min, slider3Max, slider3Step, slider3Step, 0)
+ self.p3Adjust.connect("value-changed", self.sendTables, 3)
+ self.slider3 = gtk.VScale(self.p3Adjust)
+ self.slider3.connect("button-release-event", self.handleSliderRelease)
+ self.slider3.set_digits(slider3Snap)
+ self.slider3.set_inverted(True)
+ self.slider3.set_size_request(55, 300)
+ self.slider3.modify_fg(gtk.STATE_NORMAL, sliderTextColor)
+ slidersBox.pack_start(self.slider3, True, False)
+
+ self.p4Adjust = gtk.Adjustment(slider4Init, slider4Min, slider4Max, .01, .01, 0)
+ self.p4Adjust.connect("value-changed", self.sendTables, 4)
+ self.slider4 = gtk.VScale(self.p4Adjust)
+ self.slider4.connect("button-release-event", self.handleSliderRelease)
+ self.slider4.set_digits(2)
+ self.slider4.set_inverted(True)
+ self.slider4.set_size_request(55, 300)
+ self.slider4.modify_fg(gtk.STATE_NORMAL, sliderTextColor)
+ slidersBox.pack_start(self.slider4, True, False)
+
+ self.infoBox.pack_start(slidersBox, False, False, 5)
+
+ self.infoText = 'Please think about how things would work when we have collaborative work on a piece, and someone wants to add a mic sound (or Synth). This clashes with our current idea of having instruments be like individual computer-level resources... its not clear whose computer it should be on, who has read/write perms on the file, etc.'
+ textBox = gtk.HBox()
+ textScroller = gtk.ScrolledWindow()
+ textScroller.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ textScroller.set_size_request(270, 310)
+ self.textBuf = gtk.TextBuffer(None)
+ self.textBuf.set_text(self.infoText)
+ self.textViewer = gtk.TextView(self.textBuf)
+ self.textViewer.set_wrap_mode(gtk.WRAP_WORD)
+ self.textViewer.set_editable(False)
+ self.textViewer.set_overwrite(True)
+ self.textViewer.set_cursor_visible(False)
+ self.textViewer.set_left_margin(10)
+ self.textViewer.set_right_margin(10)
+ self.textViewer.set_justification(gtk.JUSTIFY_LEFT)
+ textScroller.add(self.textViewer)
+ textBox.pack_start(textScroller, False, False, 10)
+ self.infoBox.pack_start(textBox, False, False, 5)
+
+ self.infoLabel = gtk.Label()
+ self.infoBox.pack_end(self.infoLabel, False, False, 20)
+ textColor = gtk.gdk.color_parse(Config.WHITE_COLOR)
+ self.infoLabel.modify_fg(gtk.STATE_NORMAL, textColor)
+
+
+ self.drawingAreaWidth = 900
self.drawingAreaHeight = 750
- self.separatorY = 640
+ self.separatorY = 660
self.clearMask = gtk.gdk.Rectangle(0,0,self.drawingAreaWidth,self.drawingAreaHeight)
@@ -148,9 +251,9 @@ class SynthLabWindow(SubActivity):
self.drawingArea = gtk.DrawingArea()
self.drawingArea.set_size_request( self.drawingAreaWidth, self.drawingAreaHeight )
- self.col = gtk.gdk.color_parse(Config.INST_BCK_COLOR)
+ self.col = gtk.gdk.color_parse(Config.PANEL_COLOR)
colormap = self.drawingArea.get_colormap()
- self.bgColor = colormap.alloc_color( Config.INST_BCK_COLOR, True, True )
+ self.bgColor = colormap.alloc_color( Config.PANEL_COLOR, True, True )
self.lineColor = colormap.alloc_color( Config.SL_LINE_COLOR, True, True )
self.overWireColor = colormap.alloc_color( Config.SL_OVER_WIRE_COLOR, True, True )
self.overGateColor = colormap.alloc_color( Config.SL_OVER_GATE_COLOR, True, True )
@@ -165,60 +268,159 @@ class SynthLabWindow(SubActivity):
self.drawingArea.connect( "motion-notify-event", self.handleMotion )
self.drawingArea.connect("expose-event", self.draw)
self.drawingBox.pack_start(self.drawingArea, False, False, 5)
- self.presets = self.initRadioButton(SynthLabConstants.PRESET, self.presetCallback, self.presetBox)
- self.durLabel = gtk.Image()
- self.durLabel.set_from_file(Config.IMAGE_ROOT + 'dur2.png')
- self.durAdjust = gtk.Adjustment(2, .5, 10, .01, .01, 0)
- self.durAdjust.connect("value-changed", self.handleDuration)
- self.durationSlider = ImageHScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderbutviolet.png", self.durAdjust, 7 )
- self.durationSlider.connect("button-press-event", self.showParameter)
- self.durationSlider.connect("button-release-event", self.hideParameter)
- self.durationSlider.set_size_request(440, 30)
- self.sliderBox.pack_start(self.durationSlider, True, True, 5)
- self.sliderBox.pack_start(self.durLabel, False, padding=10)
-
-# for i in [1,2,3,4,5,6]:
-# recordButton = ImageToggleButton(Config.IMAGE_ROOT + 'synthRecord' + str(i) + '.png', Config.IMAGE_ROOT + 'synthRecord' + str(i) + 'Down.png', Config.IMAGE_ROOT + 'synthRecord' + str(i) + 'Over.png')
-# recordButton.connect("clicked", self.recordSound, i)
-# self.buttonBox.pack_start(recordButton, False, False, 2)
-# self.tooltips.set_tip(recordButton, Tooltips.SL_RECORDBUTTONS[i-1])
-
-# saveButton = ImageButton(Config.IMAGE_ROOT + 'save.png')
-# saveButton.connect("clicked", self.handleSave, None)
-# self.buttonBox.pack_start(saveButton, False, False, 2)
-
-# loadButton = ImageButton(Config.IMAGE_ROOT + 'load.png')
-# loadButton.connect("clicked", self.handleLoad, None)
-# self.buttonBox.pack_start(loadButton, False, False, 2)
-
-# resetButton = ImageButton(Config.IMAGE_ROOT + 'reset.png')
-# resetButton.connect("clicked", self.handleReset, None)
-# self.buttonBox.pack_start(resetButton, False, False, 2)
-
-# closeButton = ImageButton(Config.IMAGE_ROOT + 'close.png')
-# closeButton.connect("clicked", self.handleClose, None)
-# self.buttonBox.pack_start(closeButton, False, False, 2)
-
-# self.tooltips.set_tip(saveButton, Tooltips.SAVE)
-# self.tooltips.set_tip(loadButton, Tooltips.LOAD)
-# self.tooltips.set_tip(resetButton, Tooltips.RESET)
-# self.tooltips.set_tip(closeButton, Tooltips.CLOSE)
-# self.tooltips.set_tip(self.durationSlider, Tooltips.SOUNDDUR + ': ' + self.durString)
tempFile = 'synthTemp'
if tempFile in os.listdir(Config.PREF_DIR):
self.handleLoadTemp()
else:
- self.presetCallback(self.presets,1)
+ self.presetCallback(None,1)
self.add(self.mainBox)
self.show_all()
def onDestroy(self):
pass
+ def select(self, i):
+ if i == self.instanceID:
+ return
+ self.new = False
+ self.instanceID = i
+ if self.instanceID / 4 != self.objectType:
+ self.objectType = self.instanceID / 4
+ self.objComboBox.remove_all()
+ for obj in SynthLabConstants.CHOOSE_TYPE[self.objectType]:
+ self.objComboBox.append_item(SynthLabConstants.CHOOSE_TYPE[self.objectType].index(obj), obj, Config.IMAGE_ROOT + '/' + obj + '.png')
+
+ oldChoosen = self.choosenType
+ if self.instanceID != 12:
+ self.choosenType = self.synthObjectsParameters.types[self.instanceID]
+ else:
+ self.choosenType = 0
+ self.objComboBox.set_active(self.choosenType)
+ if self.choosenType == oldChoosen:
+ self.changeObject(self.objComboBox)
+ else:
+ self.updateViewer()
+
+ def changeObject(self, widget):
+ self.choosenType = widget.props.value
+ self.resize()
+ self.synthObjectsParameters.setType(self.instanceID, self.choosenType)
+ self.writeTables( self.synthObjectsParameters.types, self.synthObjectsParameters.controlsParameters,
+ self.synthObjectsParameters.sourcesParameters, self.synthObjectsParameters.fxsParameters )
+ self.updateViewer()
+
+ def updateViewer(self):
+ self.viewType = Tooltips.SYNTHTYPES[self.objectType][self.choosenType]
+ selectedType = SynthLabConstants.CHOOSE_TYPE[self.objectType][self.choosenType]
+ self.viewParam = Tooltips.SYNTHPARA[selectedType][self.curSlider-1] + ': ' + self.recallSliderValue(self.curSlider)
+ self.infoText = self.viewType + '\n\n' + self.viewParam
+ self.textBuf.set_text(self.infoText)
+
+ def recallSliderValue( self, num ):
+ if num == 1:
+ if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.NOISE:
+ return Tooltips.NOISE_TYPES[int(self.slider1Val)]
+ else:
+ return '%.2f' % self.slider1Val
+ if num == 2:
+ if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.VCO:
+ return Tooltips.VCO_WAVEFORMS[int(self.slider2Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.SAMPLE or Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.GRAIN:
+ return self.sample_names[int(self.slider2Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.VOICE:
+ return Tooltips.VOWEL_TYPES[int(self.slider2Val)]
+ else:
+ return '%.2f' % self.slider2Val
+ if num == 3:
+ if Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.LFO:
+ return Tooltips.LFO_WAVEFORMS[int(self.slider3Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.TRACKPADX:
+ return Tooltips.SCALING_TYPES[int(self.slider3Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.TRACKPADY:
+ return Tooltips.SCALING_TYPES[int(self.slider3Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.FILTER:
+ return Tooltips.FILTER_TYPES[int(self.slider3Val)]
+ elif Tooltips.SYNTHTYPES[self.objectType][self.choosenType] == Tooltips.RINGMOD:
+ return Tooltips.LFO_WAVEFORMS[int(self.slider3Val)]
+ else:
+ return '%.2f' % self.slider3Val
+ if num == 4: return '%.2f' % self.slider4Val
+
+ def resize( self ):
+ selectedType = SynthLabConstants.CHOOSE_TYPE[self.objectType][self.choosenType]
+ if self.new:
+ slider1Init = SynthLabConstants.TYPES[selectedType][0]
+ slider2Init = SynthLabConstants.TYPES[selectedType][1]
+ slider3Init = SynthLabConstants.TYPES[selectedType][2]
+ slider4Init = SynthLabConstants.TYPES[selectedType][3]
+ else:
+ parametersTable = self.synthObjectsParameters.choiceParamsSet[self.objectType]
+ tablePos = (self.instanceID % 4)*4
+ slider1Init = parametersTable[tablePos]
+ slider2Init = parametersTable[tablePos+1]
+ slider3Init = parametersTable[tablePos+2]
+ slider4Init = parametersTable[tablePos+3]
+
+ slider1Min = SynthLabConstants.TYPES[selectedType][4]
+ slider1Max = SynthLabConstants.TYPES[selectedType][5]
+ slider2Min = SynthLabConstants.TYPES[selectedType][6]
+ slider2Max = SynthLabConstants.TYPES[selectedType][7]
+ slider3Min = SynthLabConstants.TYPES[selectedType][8]
+ slider3Max = SynthLabConstants.TYPES[selectedType][9]
+ slider4Min = SynthLabConstants.TYPES[selectedType][10]
+ slider4Max = SynthLabConstants.TYPES[selectedType][11]
+
+ slider1Step = SynthLabConstants.TYPES[selectedType][12][0]
+ slider1Snap = SynthLabConstants.TYPES[selectedType][12][1]
+ slider2Step = SynthLabConstants.TYPES[selectedType][13][0]
+ slider2Snap = SynthLabConstants.TYPES[selectedType][13][1]
+ slider3Step = SynthLabConstants.TYPES[selectedType][14][0]
+ slider3Snap = SynthLabConstants.TYPES[selectedType][14][1]
+
+ self.p1Adjust.set_all(slider1Init, slider1Min, slider1Max, slider1Step, slider1Step, 0)
+ self.p2Adjust.set_all(slider2Init, slider2Min, slider2Max, slider2Step, slider2Step, 0)
+ self.p3Adjust.set_all(slider3Init, slider3Min, slider3Max, slider3Step, slider3Step, 0)
+ self.p4Adjust.set_all(slider4Init, slider4Min, slider4Max, 0.01, 0.01, 0)
+
+ self.slider1.set_digits(slider1Snap)
+ self.slider2.set_digits(slider2Snap)
+ self.slider3.set_digits(slider3Snap)
+
+ self.new = True
+
+ def sendTables( self, widget, data ):
+ self.curSlider = data
+ self.slider1Val = self.p1Adjust.value
+ self.slider2Val = self.p2Adjust.value
+ self.slider3Val = self.p3Adjust.value
+ self.slider4Val = self.p4Adjust.value
+ if self.instanceID != 12:
+ self.synthObjectsParameters.setType(self.instanceID, self.choosenType)
+ sliderListValue = [ self.p1Adjust.value, self.p2Adjust.value, self.p3Adjust.value, self.p4Adjust.value ]
+ if self.objectType == 0:
+ for i in range(4):
+ self.synthObjectsParameters.setControlParameter((self.instanceID % 4)*4+i, sliderListValue[i])
+ elif self.objectType == 1:
+ for i in range(4):
+ self.synthObjectsParameters.setSourceParameter((self.instanceID % 4)*4+i, sliderListValue[i])
+ elif self.objectType == 2:
+ for i in range(4):
+ self.synthObjectsParameters.setFxParameter((self.instanceID % 4)*4+i, sliderListValue[i])
+ else:
+ for i in range(4):
+ self.synthObjectsParameters.setOutputParameter(i, sliderListValue[i])
+ self.updateViewer()
+
+ def handleSliderRelease(self, widget, data=None):
+ if self.instanceID != 12:
+ self.writeTables( self.synthObjectsParameters.types, self.synthObjectsParameters.controlsParameters,
+ self.synthObjectsParameters.sourcesParameters, self.synthObjectsParameters.fxsParameters )
+
+
def onKeyPress(self,widget,event):
key = event.hardware_keycode
- #temporary binding
+ #temporary binding for saving preset
if key == 50:
self.handleSave(None, None)
@@ -256,33 +458,9 @@ class SynthLabWindow(SubActivity):
def handleDuration( self, adjustment ):
self.duration = adjustment.value
- self.durString = '%.2f' % self.duration
- img = int((self.duration - .5) * .5 + 1)
- self.parameterUpdate(self.durString)
- self.tooltips.set_tip(self.durationSlider, Tooltips.SOUNDDUR + ': ' + self.durString)
-
- def showParameter( self, widget, data=None ):
- if not self.parameterOpen:
- self.parameter = Parameter(self.durString)
- self.parameterOpen = 1
-
- def hideParameter( self, widget, data=None ):
- if self.parameterOpen and not self.clockStart:
- self.windowCloseDelay = gobject.timeout_add(500, self.closeParameterWindow)
- self.clockStart = 1
-
- def closeParameterWindow( self ):
- if self.parameterOpen:
- self.parameter.hide()
- self.parameterOpen = 0
- gobject.source_remove( self.windowCloseDelay )
- self.clockStart = 0
- self.tooltips.set_tip(self.durationSlider, Tooltips.SOUNDDUR + ': ' + self.durString)
- return True
- def parameterUpdate( self, durString ):
- if self.parameterOpen:
- self.parameter.update(durString)
+ def parameterUpdate( self, string ):
+ self.infoLabel.set_text(string)
def playNote( self, midiPitch, table ):
cpsPitch = 261.626*pow(1.0594633, midiPitch-36)
@@ -295,8 +473,6 @@ class SynthLabWindow(SubActivity):
if self.journalCalled:
self.set_mode('quit')
return
- if self.instanceOpen:
- self.synthLabParametersWindow.destroy()
self.set_mode('welcome')
if as_window:
self.set_keep_above(False)
@@ -312,7 +488,7 @@ class SynthLabWindow(SubActivity):
for i in range(self.objectCount):
self.updateBounds( i )
self.duration = 2
- self.durAdjust.set_value(self.duration)
+ self._mainToolbar.durationSliderAdj.set_value(self.duration)
self.connections = []
self.synthObjectsParameters.__init__()
self.writeTables( self.synthObjectsParameters.types, self.synthObjectsParameters.controlsParameters, self.synthObjectsParameters.sourcesParameters, self.synthObjectsParameters.fxsParameters )
@@ -371,7 +547,10 @@ class SynthLabWindow(SubActivity):
if self.action == "draw-wire":
self.doneWire()
if i != self.objectCount-1:
+ #self.select( i )
self.startDragObject( i )
+ #else:
+ #self.select( i )
return
if self.action == "draw-wire": # didn't hit anything
self.doneWire()
@@ -379,15 +558,11 @@ class SynthLabWindow(SubActivity):
# check if we clicked a wire
i = self.wireUnderLoc( event.x, event.y )
if i >= 0: self.deleteWire( i )
-
- elif event.button == 3:
+ if event.button == 3:
for i in range(self.objectCount):
if self.bounds[i][0] < event.x < self.bounds[i][2] and self.bounds[i][1] < event.y < self.bounds[i][3]:
- if self.instanceOpen:
- self.synthLabParametersWindow.destroy()
- self.synthLabParametersWindow = SynthLabParametersWindow( i, self.synthObjectsParameters, self.writeTables, self.playNote )
- self.instanceOpen = 1
-
+ self.select( i )
+
def handleMotion( self, widget, event ):
if event.is_hint:
@@ -425,16 +600,10 @@ class SynthLabWindow(SubActivity):
self.highlightGate( i, gate )
else:
self.highlightGate( None )
- if self.parameterOpen:
- self.parameter.hide()
- self.parameterOpen = 0
self.highlightWire( None )
return
# didn't find a gate
self.highlightGate( None )
- if self.parameterOpen:
- self.parameter.hide()
- self.parameterOpen = 0
# check for wires
i = self.wireUnderLoc( event.x, event.y )
if i >= 0: self.highlightWire( i )
@@ -523,6 +692,8 @@ class SynthLabWindow(SubActivity):
# pass in obj = None to clear
def highlightGate( self, obj, gate = None, reject = False ):
+ if obj == None:
+ self.parameterUpdate('')
if self.overGateObj != obj or self.overGate != gate or self.overGateReject != reject:
if self.overGate != None:
self.invalidate_rect( self.overGateLoc[0], self.overGateLoc[1], self.overGateSize, self.overGateSize )
@@ -539,11 +710,7 @@ class SynthLabWindow(SubActivity):
choosen = SynthLabConstants.CHOOSE_TYPE[obj/4][self.typesTable[obj]]
str = Tooltips.SYNTHTYPES[obj/4][self.typesTable[obj]] + ': ' + Tooltips.SYNTHPARA[choosen][gate[1]]
if gate[0] == 1:
- if self.parameterOpen:
- self.parameterUpdate( str )
- else:
- self.parameter = Parameter( str )
- self.parameterOpen = 1
+ self.parameterUpdate( str )
def startDragObject( self, i ):
self.dragObject = i
diff --git a/SynthLab/SynthObjectsParameters.py b/SynthLab/SynthObjectsParameters.py
index 42ea6c3..7a9b8f3 100755
--- a/SynthLab/SynthObjectsParameters.py
+++ b/SynthLab/SynthObjectsParameters.py
@@ -2,7 +2,7 @@ class SynthObjectsParameters:
def __init__( self ):
self.types = [0,0,0,0,0,0,0,0,0,0,0,0]
- self.controlsParameters = [.5,1,0,0,5,1,0,0,5,1,0,0,5,1,0,0]
+ self.controlsParameters = [.5,1,0,0,.5,1,0,0,.5,1,0,0,.5,1,0,0]
self.sourcesParameters = [1,.5,5,1,1,.5,5,1,1,.5,5,1,1,.5,5,1]
self.fxsParameters = [100,3000,.8,1,100,3000,.8,1,100,3000,.8,1,100,3000,.8,1]
self.outputParameters = [.01, .05, .9, .05]