For my Thesis, and Sound In Space assignment #2, I am testing how users react when their movements, or how they move with others, impact ‘voices’ in a composition. I’m trying to suss out the proper number of people per voice and the number of voices for my “interactive dance floor.”
Technical setup: Touchdesigner
I created a ‘track control’ component for touchdesigner. The component has a number of options.
- What is the volume level for ‘off’ and on? This allows users to feel their presence impacting the voice when entering the space.
- Does it control a ‘rack’ device? This allows it to control parameters on instruments and effects
- if so, how many parameters (macros) does it control?
- Does it control clips by switching between them? This allows musical patterns to be changed by the ‘dance amount’
class trackController: """ trackController description: controls one voice in ableton in - dance amount in - isPresent """ def __init__(self, ownerComp): # The component to which this extension is attached self.ownerComp = ownerComp #does this launch clips? self.ClipLauncher = False #does this control racks? self.RackController = False #td ableton track object for volume and clips self.Track = op('abletonTrack1') #clip launcher, initalize it as off self.clipControl = op('abletonClipSelector') self.clipControl.allowCooking = False #rack component for macro control, initalize it as off self.rack = op('abletonRack1') self.rack.allowCooking = False #number of macros self.MacroCount = 2 #store the track id that will be controlled self.TrackNumber = 0 #set the default min/max volumes self.minVol = .1 self.maxVol = .85 #create a custom menu for controlling this TrackController self.MakeMenu() def InitRack(self): ''' select the appropriate rack device in ableton assumes that its the first device in the chain is called every time the TrackID parameter is changed ''' self.rack.par.Device = 1 self.rack.par.Chain1 = 0 return def MakeMenu(self): ''' create custom properties on the comp for controlling the track ''' o = self.ownerComp #reset the custom pars o.destroyCustomPars() #add page for custom parameters p = o.appendCustomPage("Track Options") #make par for which track to control m = p.appendMenu("Track") #set its menu labels to match the ableton track's labels m.menuSource = "op('./abletonTrack1').par.Track" #add value for number of macros c = p.appendInt("Macrocount") # cuz it returns a tuple #set the range of the custom par 'macrocount' c.normMax = 8 c.normMin = 0 #set the default value c.normVal = 1 #c.clampMax = True #c.clampMin = True #add value for presence volumes v = p.appendFloat("Maxvol"); v.normVal = self.maxVol v = p.appendFloat("Minvol"); v.normVal = self.minVol #add toggles to enable/disable clip launcher or rack controller p.appendToggle("Rackcontroller") p.appendToggle("Clipcontroller") def toggleComp(self,comp): ''' turns a component on or off returns its latest state ''' c = not (comp.allowCooking) comp.allowCooking = c print(c) return c def ToggleRackControl(self): ''' toggles rack component ''' self.RackController = self.toggleComp(self.rack) def ToggleClipControl(self): ''' toggles clip component ''' self.ClipLauncher = self.toggleComp(self.clipControl)
Technical setup: Ableton
In order for a composition in ableton to be controllable. It needs a few things.
- TDAbleton needs a master component on the master track in ableton
- Any track that has rack components must have them encapsulated in a TDInstrument component
- Any clip that is longer than 1/2 a bar and will be switched between needs the ‘Legato’ setting enabled in the clip launching preferences
Still in progress. Need two more voices, plus considering adding in a drum voice when all voices are fully active to give a reward for collectively moving.