Skip to content

Instantly share code, notes, and snippets.

@rbnpi
Last active June 18, 2021 08:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rbnpi/89c04f794a8b1bedadde6be7a31f4afc to your computer and use it in GitHub Desktop.
Save rbnpi/89c04f794a8b1bedadde6be7a31f4afc to your computer and use it in GitHub Desktop.
Sonic Pi controller for Helm Synth with TouchOSC see article at https://rbnrpi.wordpress.com/sonic-pi-helm-synth-touchosc-combined/ and video at https://youtu.be/Ugq1XIZIt9k
#helmOSCsynthSelector.rb
#program written by Robin Newman, November 2019
#uses TouchOSC and Sonic Pi to allow easy remote selection of any factory preset for Helm Synth
#also has some test midi sequences that can be sent to Helm
#audio output from Helm fed back through Sonic Pi, and volume is controllable there.
#turn off most logging. Can enable for testing
use_osc_logging false
use_midi_logging false
use_debug false
#setup user specified values
use_osc "192.168.1.240",9000 #address and port of TouchOSC device
#choose midi port to suit. I used "iac_driver_sonicpi" (mac) or "midi_through_port-0" (RaspberryPi)
use_midi_defaults port: "iac_driver_sonicpi",channel: 1 #midi port and channel
#select ONE of the next two lines as appropriate
dirbase=(ENV['HOME']+"/Library/Audio/Presets/Helm/Factory Presets/") #path to helm presets (Mac)
#dirbase=("/home/pi/.helm/patches/Factory Presets/") #path to helm presets (Raspberry Pi)
define :getList do |type| #get patch names for a given type from their stored location
files = Dir.glob(File.join(dirbase+type, '**', '*')).select{|file| File.file?(file)}.sort
l=[]
files.each do |f|
#select one of the next two lines depending on OS used
l<< f.split("/")[9][0..-6] #strip out just filename without .helm suffix (for Mac)
#l<< f.split("/")[7][0..-6] #strip out just filename without .helm suffix (for RPi)
end
return l
end
define :getTypeList do #get list of patch types (these are folder names)
tl=[]
Dir.chdir(dirbase) do
tl= Dir.glob('*').select { |f| File.directory? f }.sort #get sorted list of folders
end
return tl
end
typeList=getTypeList #store list of patch type folders
l=[] #initialise list for patch names
limits=[] #initialise list for index max limit for each patch type
typeList.each_with_index do |type,i| #fill type lists and limits list
l[i]=getList type
limits[i]=l[i].length - 1
end
plist=[l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8]] #plist is a list of the 9 patch type lists
sleep 1 #let things settle. (maily for RPi)
define :parse_sync_address do |address| # used to retrieve data which matched wild card in synced event
v= get_event(address).to_s.split(",")[6]
if v != nil
return v[3..-2].split("/")
else
return ["error"]
end
end
#initialise volume slider position
osc "/helm/volume",0.5
osc "/helm/volScale/2/1",1 #set second switch
osc "/helm/tempo/2/1",1 #set 2nd tempo
set :type,0 #set starting type, choice and volume
set :choice,0
set :vol, 0.5
set :volScale, 3
set :tempo,60
live_loop :getVol,delay: 2 do #live loop to adjust volume. Delayed start to allow live_audio setup
use_real_time
b = sync "/osc*/helm/volume"
set :vol,b[0]
end
live_loop :getVolScale,delay: 2 do #live loop to get volScale setting
use_real_time
b = sync "/osc*/helm/volScale/*/1"
if b[0]==1.0
n=parse_sync_address("/osc*/helm/volScale/*/1")[3].to_i
set :volScale,[1,3,5,7][n-1] #select vol multiplier
end
end
live_loop :getTempo,delay: 2 do #live loop to adjust volume. Delayed start to allow live_audio setup
use_real_time
b = sync "/osc*/helm/tempo/*/1"
if b[0]==1.0
n=parse_sync_address("/osc*/helm/tempo/*/1")[3].to_i
set :tempo,[30,60,90,120][n-1] #select tempo
end
end
with_fx :level, amp: get(:vol)*get(:volScale) do |vl| #set volume level of incoming audio from Helm
set :vl,vl
live_loop :adjustV, delay: 2 do #loop checks and adjust vol every 0.5 seconds
control get(:vl),amp: get(:vol)*get(:volScale),amp_slide: 0.2
sleep 0.5
end
live_audio :helm,input: 1, stereo: true #audio in from Helm
end
define :patch do |bank=0,folder=0,patch=0| #midi code to adjust patch.
midi_cc 0,bank #always 0 in this version. Could expand to cover user bank
midi_cc 32,folder #patch folder type index
midi_pc patch #patch name index in folder
end
define :emptyLabels do #clear all patch label names
58.times do |x|
v=x.to_s
v="0"+v if x<10
osc "/helm/L"+v,""
sleep 0.01
end
end
define :populateLabels do |lab| #populate patch label names for given selected type
emptyLabels
lab.length.times do |x|
v=x.to_s
v="0"+v if x<10
osc "/helm/L"+v,lab[x]
sleep 0.01
end
end
define :setPled do |n| #light led for current choice, or none if n < 0
57.times do |x|
osc "/helm/led"+x.to_s,0
end
if n >=0
osc "/helm/led"+n.to_s,1
set :choice,n
end
end
define :setType do |n| #light type led for current selection n, then populate labels
9.times do |x|
osc "/helm/T"+x.to_s,0
end
sleep 0.1
osc "/helm/T"+n.to_s,1
set :type,n
populateLabels plist[n] if n >= 0 #ignore for negative n
setPled -1 #turn off choice led as no longer valid for current list
end
setType 0 #init starting position (arp choices)
live_loop :getType do #get osc message to update current type
use_real_time
b = sync "/osc*/helm/Tp*"
if b[0]==1.0
puts parse_sync_address("/osc*/helm/Tp*")
n= parse_sync_address("/osc*/helm/Tp*")[2][-1].to_i
puts n
setType n
end
end
live_loop :getChoice do #get osc message to update current choice
use_real_time
b = sync "/osc*/helm/p*"
if b[0]==1.0
n = parse_sync_address("/osc*/helm/p*")[2][-2..-1].to_i
#puts n
setPled n if n<= limits[get(:type)] #update led
patch 0,get(:type),get(:choice) #send new patch selection to helm
end
end
live_loop :chooseScale do #choose midi notes to use depending on selector switch
use_real_time
b = sync "/osc*/helm/selectScale/*/1"
if b[0]==1.0
n= parse_sync_address("/osc*/helm/selectScale/*/1")[3].to_i
#puts "scale on #{n}"
case n
when 1
set :sv,0.2
set :snote,:c4
doLoop 1,1 #doLoop sets up live_loop name1 to send midi notes
when 2
set :sv,0.2
set :snote,:c5
doLoop 2,2 #sets up live_loop name2
when 3
set :sv,1
set :snote,:c3
doLoop 3,1 #sets up live_loop name3
when 4
set :sv,0.5
set :snote,:c3
doLoop 4,2 #sets up live_loop name4
when 5
set :sv,2
set :snote,:c4
doLoop 5,1 #sets up live_loop name5
end
else #b[0]==0.0 so deal with stopping any deselected loop
n= parse_sync_address("/osc*/helm/selectScale/*/1")[3].to_i
#puts "scale off #{n}"
set ("kill"+n.to_s).to_sym,true #set kill switch for the selected loop
#puts "stopping loop"+n.to_s
end
end
#sets up and starts live_loop named name<n>
define :doLoop do |n,ch,vol=get(:vol)| #parameters n (for name),ch for tick or choose,vol setting
set ("kill"+n.to_s).to_sym,false #set kill flag to false
ln=("name"+n.to_s).to_sym #create loop name
live_loop ln do #start the loop
use_bpm get(:tempo) #set current tempo
nv=scale(get(:snote),:minor_pentatonic).tick if ch==1 #choose note select method depending on ch
nv=scale(get(:snote),:minor_pentatonic).choose if ch==2
midi nv,sustain: get(:sv),vel_f: vol #send midi to helm
sleep get(:sv)
#puts "loop"+n.to_s,get( ("kill"+n.to_s).to_sym)
stop if get( ("kill"+n.to_s).to_sym)==true #stop the loop if flag has changed to true
end
end
define :stopAllScales do #set all midi loop kill flags to true
5.times do |n|
osc "/helm/selectScale/"+(n+1).to_s+"/1",0 #turn all button indicators off
set ("kill"+(n+1).to_s).to_sym,true
end
end
live_loop :oscKillScales do #detect Stop Patter button pushed and stop all midi loops
use_real_time
b = sync "/osc*/helm/stopAll"
if b[0]==1.0
stopAllScales
midi_all_notes_off
end
end
live_loop :clearAll do #detect Clear All pushed
use_real_time
b= sync "/osc*/helm/clearPanel"
if b[0]==1.0
emptyLabels #clear all labels
setType -1 #clear all type leds
stopAllScales #stop any playing midi loops
midi_all_notes_off #stop any other midi notes currently playing
end
end
<?xml version="1.0" encoding="UTF-8"?><layout version="17" mode="1" orientation="horizontal"><tabpage name="aGVsbQ==" scalef="0.0" scalet="1.0" li_t="" li_c="gray" li_s="14" li_o="false" li_b="false" la_t="" la_c="gray" la_s="14" la_o="false" la_b="false" ><control name="cDU2" x="522" y="944" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="TDU2" x="521" y="944" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="cDI4" x="520" y="86" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDI5" x="522" y="117" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDMw" x="522" y="147" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDMx" x="522" y="178" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDMy" x="522" y="209" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDMz" x="522" y="239" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM0" x="522" y="270" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM1" x="522" y="301" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM2" x="522" y="331" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM3" x="522" y="362" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM4" x="522" y="393" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDM5" x="522" y="423" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQw" x="522" y="454" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQx" x="522" y="485" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDYwcDQy" x="522" y="515" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQz" x="522" y="546" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ0" x="522" y="577" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ1" x="522" y="607" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ2" x="522" y="638" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ3" x="522" y="669" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ4" x="522" y="699" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDQ5" x="522" y="730" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDUw" x="522" y="761" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDUx" x="522" y="791" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDUy" x="522" y="822" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDUz" x="522" y="852" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDU0" x="522" y="883" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDU1" x="520" y="914" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="TDI4" x="519" y="84" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDU1" x="521" y="914" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDU0" x="521" y="884" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDUz" x="521" y="853" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDUy" x="521" y="822" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDUx" x="521" y="791" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDUw" x="521" y="761" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ5" x="521" y="730" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ4" x="521" y="699" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ3" x="521" y="669" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ2" x="521" y="638" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ1" x="521" y="607" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQ0" x="521" y="577" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQz" x="521" y="546" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQy" x="521" y="515" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQx" x="521" y="484" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDQw" x="521" y="454" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM5" x="521" y="423" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM4" x="521" y="392" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM3" x="521" y="362" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM2" x="521" y="331" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM1" x="521" y="300" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDM0" x="521" y="270" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDMz" x="521" y="239" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDMy" x="521" y="208" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDMx" x="521" y="177" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDMw" x="521" y="147" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDI5" x="520" y="116" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="cDAw" x="277" y="85" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDI3" x="276" y="914" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDI2" x="276" y="883" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDI1" x="276" y="852" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDI0" x="276" y="821" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDIz" x="276" y="791" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDIy" x="276" y="760" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDIx" x="276" y="729" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDIw" x="276" y="699" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE5" x="276" y="668" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE4" x="276" y="637" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE3" x="276" y="606" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE2" x="276" y="576" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE1" x="276" y="545" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDE0" x="276" y="514" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDEz" x="276" y="484" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDEy" x="276" y="453" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDEx" x="276" y="422" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDEw" x="276" y="392" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA5" x="276" y="361" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA4" x="276" y="330" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA3" x="276" y="299" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA2" x="276" y="269" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA1" x="276" y="239" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDA0" x="276" y="207" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDAz" x="276" y="177" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDAy" x="277" y="146" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cDAx" x="277" y="115" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDE2" x="30" y="382" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDE1" x="30" y="341" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDE0" x="30" y="299" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDEz" x="30" y="258" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDEy" x="30" y="216" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDEx" x="30" y="174" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="cHVzaDEw" x="31" y="131" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHAw" x="30" y="92" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHAx" x="30" y="132" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHAy" x="30" y="174" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHAz" x="30" y="215" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHA0" x="30" y="257" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHA1" x="30" y="299" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHA2" x="30" y="340" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHA3" x="30" y="382" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VHA4" x="31" y="424" w="182" h="22" color="gray" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="VDAx" x="26" y="92" w="185" h="25" color="green" type="labelh" text="QXJw" size="14" background="true" outline="true" ></control><control name="VDAy" x="25" y="131" w="185" h="25" color="green" type="labelh" text="QmFzcw==" size="14" background="true" outline="true" ></control><control name="VDAz" x="25" y="173" w="185" h="25" color="green" type="labelh" text="Q2hpcA==" size="14" background="true" outline="true" ></control><control name="VDA0" x="25" y="215" w="185" h="25" color="green" type="labelh" text="SGFyc2g=" size="14" background="true" outline="true" ></control><control name="VDA1" x="25" y="257" w="185" h="25" color="green" type="labelh" text="S2V5cw==" size="14" background="true" outline="true" ></control><control name="VDA2" x="25" y="298" w="185" h="25" color="green" type="labelh" text="TGVhZA==" size="14" background="true" outline="true" ></control><control name="VDA3" x="25" y="340" w="185" h="25" color="green" type="labelh" text="UGFk" size="14" background="true" outline="true" ></control><control name="VDA4" x="25" y="382" w="185" h="25" color="green" type="labelh" text="UGVyY3Vzc2lvbg==" size="14" background="true" outline="true" ></control><control name="VDA5" x="25" y="424" w="185" h="25" color="green" type="labelh" text="U0ZY" size="14" background="true" outline="true" ></control><control name="TDAx" x="277" y="116" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDAy" x="277" y="148" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDAz" x="277" y="179" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA0" x="277" y="209" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA1" x="277" y="240" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA2" x="277" y="271" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA3" x="277" y="301" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA4" x="277" y="332" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDA5" x="277" y="363" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDEw" x="277" y="393" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDEx" x="277" y="424" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDEy" x="277" y="455" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDEz" x="277" y="485" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE0" x="277" y="516" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE1" x="277" y="547" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE2" x="277" y="578" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE3" x="277" y="608" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE4" x="277" y="639" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDE5" x="277" y="670" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDIw" x="277" y="700" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDIx" x="277" y="731" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDIy" x="277" y="762" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDIz" x="277" y="792" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDI1" x="277" y="854" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDI3" x="277" y="915" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDI0" x="277" y="823" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDI2" x="277" y="885" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="TDAw" x="277" y="84" w="185" h="25" color="yellow" type="labelh" text="" size="14" background="true" outline="true" ></control><control name="bGVkMQ==" x="469" y="118" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMg==" x="469" y="148" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMw==" x="469" y="179" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNA==" x="469" y="209" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNQ==" x="469" y="240" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNg==" x="469" y="271" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNw==" x="469" y="301" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkOA==" x="469" y="332" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkOQ==" x="469" y="363" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTA=" x="469" y="393" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTE=" x="469" y="424" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTI=" x="469" y="454" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTM=" x="469" y="485" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTQ=" x="469" y="516" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTU=" x="469" y="546" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTY=" x="469" y="577" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTc=" x="469" y="608" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTg=" x="469" y="638" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMTk=" x="469" y="669" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjA=" x="469" y="699" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjE=" x="469" y="730" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjI=" x="469" y="761" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjM=" x="469" y="791" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjQ=" x="469" y="822" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjU=" x="469" y="853" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjY=" x="469" y="883" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjc=" x="469" y="914" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMA==" x="467" y="87" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjk=" x="721" y="118" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzA=" x="721" y="149" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzE=" x="721" y="179" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzI=" x="721" y="210" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzM=" x="721" y="241" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzQ=" x="721" y="271" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzU=" x="721" y="302" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzY=" x="721" y="332" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzc=" x="721" y="363" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzg=" x="721" y="394" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMzk=" x="721" y="424" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDA=" x="721" y="455" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDE=" x="721" y="486" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDI=" x="721" y="516" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDM=" x="721" y="547" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDQ=" x="721" y="577" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDU=" x="721" y="608" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDY=" x="721" y="639" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDc=" x="721" y="669" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDg=" x="721" y="700" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNDk=" x="721" y="731" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTA=" x="721" y="761" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTE=" x="721" y="792" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTI=" x="721" y="822" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTM=" x="721" y="853" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTQ=" x="721" y="884" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkNTU=" x="721" y="915" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGVkMjg=" x="720" y="85" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDc=" x="226" y="380" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDA=" x="226" y="91" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDE=" x="226" y="132" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDI=" x="226" y="173" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDM=" x="226" y="215" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDQ=" x="226" y="256" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDU=" x="226" y="297" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDY=" x="226" y="339" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="VDg=" x="226" y="422" w="25" h="25" color="orange" scalef="0.0" scalet="1.0" type="led" ></control><control name="bGFiZWw2Ng==" x="212" y="53" w="311" h="26" color="yellow" type="labelh" text="SGVsbSBTeW50aCBTZWxlY3Rvcg==" size="18" background="true" outline="false" ></control><control name="bGVkNTY=" x="721" y="944" w="20" h="20" color="red" scalef="0.0" scalet="1.0" type="led" ></control><control name="dm9sdW1l" x="148" y="570" w="50" h="200" color="pink" scalef="0.0" scalet="1.0" type="faderv" response="absolute" inverted="true" centered="false" ></control><control name="c3RvcEFsbA==" x="56" y="724" w="45" h="45" color="yellow" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="c2VsZWN0U2NhbGU=" x="27" y="823" w="200" h="50" color="yellow" scalef="0.0" scalet="1.0" type="multitoggle" number_x="5" number_y="1" ex_mode="true" local_off="false" ></control><control name="Y2xlYXJQYW5lbA==" x="57" y="597" w="45" h="45" color="red" scalef="0.0" scalet="1.0" type="push" local_off="false" sp="true" sr="true" ></control><control name="bGJs" x="37" y="694" w="80" h="25" color="yellow" type="labelh" text="U3RvcCBQYXR0ZXJu" size="14" background="true" outline="false" ></control><control name="bGFiZWw2OA==" x="41" y="566" w="80" h="25" color="red" type="labelh" text="Q2xlYXIgQWxs" size="14" background="true" outline="false" ></control><control name="bGFiZWw2OQ==" x="77" y="792" w="106" h="25" color="yellow" type="labelh" text="UGF0dGVybiBTZWxlY3Q=" size="14" background="true" outline="false" ></control><control name="bGFiZWw3MA==" x="133" y="540" w="80" h="25" color="pink" type="labelh" text="Vm9sdW1l" size="14" background="true" outline="false" ></control><control name="bGFiZWw3MQ==" x="57" y="458" w="115" h="25" color="pink" type="labelh" text="Vm9sdW1lIFNjYWxl" size="14" background="true" outline="false" ></control><control name="dm9sU2NhbGU=" x="30" y="486" w="168" h="50" color="pink" scalef="0.0" scalet="1.0" type="multitoggle" number_x="4" number_y="1" ex_mode="true" local_off="false" ></control><control name="dGVtcG8=" x="26" y="917" w="200" h="50" color="red" scalef="0.0" scalet="1.0" type="multitoggle" number_x="4" number_y="1" ex_mode="true" local_off="false" ></control><control name="bGFiZWw3Mg==" x="72" y="890" w="106" h="25" color="red" type="labelh" text="VGVtcG8=" size="14" background="true" outline="false" ></control></tabpage></layout>

The file index.xml is utilised by TouchOSC.

Save the raw file (click the raw beside index.xml) as index.xml then compress or zip it and rename the resulting file helmSelector.touchosc

This file should then be opened by the free TouchOSC editor (available for Mac, PC or Linux) and sync it to the (purchased) TouchOSC app for your IOS or Android phone or tablet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment