forked from jbeuckm/Ctrlr-Lexicon-MPX100
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lexicon-MPX100.panel
5198 lines (5197 loc) · 532 KB
/
Lexicon-MPX100.panel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<panel name="Lexicon MPX100" panelShowDialogs="1" panelMessageTime="10000"
panelAuthorName="Joe Beuckman" panelAuthorEmail="[email protected]"
panelAuthorUrl="" panelAuthorDesc="" panelVersionMajor="1" panelVersionMinor="0"
panelVersionName="Hell-O-Kitty" panelVendor="" panelDevice="Lexicon MPX100"
panelMidiSnapshotAfterLoad="0" panelMidiSnapshotAfterProgramChange="0"
panelMidiSnapshotDelay="10" panelMidiSnapshotShowProgress="0"
panelMidiInputChannelDevice="1" panelMidiInputDevice="-- None"
panelMidiControllerChannelDevice="1" panelMidiControllerDevice="-- None"
panelMidiOutputChannelDevice="1" panelMidiOutputDevice="Unitor8/AMT8 Port 1"
panelMidiInputFromHost="0" panelMidiInputChannelHost="1" panelMidiOutputToHost="0"
panelMidiOutputChannelHost="1" panelMidiThruH2H="0" panelMidiThruH2HChannelize="0"
panelMidiThruH2D="0" panelMidiThruH2DChannelize="0" panelMidiThruD2D="0"
panelMidiThruD2DChannelize="0" panelMidiThruD2H="0" panelMidiThruD2HChannelize="0"
panelMidiRealtimeIgnore="1" panelMidiInputThreadPriority="7"
panelMidiProgram="0" panelMidiBankLsb="0" panelMidiBankMsb="0"
panelMidiSendProgramChangeOnLoad="0" panelMidiProgramCalloutOnprogramChange="0"
panelMidiMatchCacheSize="32" panelMidiGlobalDelay="0" panelMidiPauseOut="0"
panelMidiPauseIn="0" panelOSCEnabled="0" panelOSCPort="-1" panelOSCProtocol="0"
luaPanelMidiChannelChanged="-- None" luaPanelMidiReceived="-- None"
luaPanelMidiMultiReceived="-- None" luaPanelLoaded="-- None"
luaPanelBeforeLoad="-- None" luaPanelSaved="-- None" luaPanelResourcesLoaded="-- None"
luaPanelProgramChanged="-- None" luaPanelGlobalChanged="-- None"
luaPanelMessageHandler="-- None" luaPanelModulatorValueChanged="-- None"
luaPanelSaveState="-- None" luaPanelRestoreState="-- None" luaPanelMidiSnapshotPost="-- None"
luaPanelMidiSnapshotPre="-- None" luaAudioProcessBlock="-- None"
luaPanelOSCReceived="-- None" panelFilePath="/Users/joebeuckman/Documents/Ctrlr-Lexicon-MPX100/Lexicon-MPX100.panel"
panelUID="8.4eEwU408NPC" panelInstanceUID="9nsQ" panelInstanceManufacturerID="zldV"
panelModulatorListColumns="<TABLELAYOUT sortedCol="0" sortForwards="1"><COLUMN id="612" visible="1" width="128"/><COLUMN id="1" visible="0" width="87"/><COLUMN id="611" visible="0" width="86"/><COLUMN id="613" visible="1" width="133"/><COLUMN id="128" visible="0" width="68"/><COLUMN id="135" visible="0" width="89"/><COLUMN id="555" visible="0" width="81"/><COLUMN id="552" visible="0" width="104"/><COLUMN id="556" visible="0" width="107"/><COLUMN id="18" visible="1" width="278"/><COLUMN id="19" visible="1" width="161"/><COLUMN id="15" visible="0" width="179"/><COLUMN id="14" visible="1" width="101"/><COLUMN id="125" visible="1" width="190"/><COLUMN id="537" visible="0" width="127"/><COLUMN id="151" visible="1" width="187"/><COLUMN id="210" visible="1" width="161"/><COLUMN id="211" visible="0" width="96"/><COLUMN id="212" visible="0" width="104"/><COLUMN id="278" visible="0" width="196"/><COLUMN id="279" visible="0" width="161"/><COLUMN id="280" visible="0" width="110"/><COLUMN id="189" visible="1" width="135"/><COLUMN id="188" visible="1" width="64"/><COLUMN id="194" visible="1" width="64"/></TABLELAYOUT>"
panelModulatorListCsvDelimiter="," panelModulatorListXmlRoot="ctrlrModulatorList"
panelModulatorListXmlModulator="ctrlrModulator" panelModulatorListSortOption="62"
panelGlobalVariables="0:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1:-1"
panelResources="-- None" panelPropertyDisplayIDs="1" ctrlrMenuItemBackgroundColour="ffffffff"
ctrlrMenuItemTextColour="ff000000" ctrlrMenuItemHighlightedTextColour="ffffffff"
ctrlrMenuItemHighlightColour="ff4364ff" ctrlrMenuItemFont="<Sans-Serif>;18;0;0;0;0;1;3"
ctrlrMenuItemSeparatorColour="44000000" ctrlrMenuItemHeaderColour="ff000000"
ctrlrMenuBarBackgroundColour1="fff7f7f7" ctrlrMenuBarBackgroundColour2="ffcccccc"
ctrlrMenuBarTextColour="ff000000" ctrlrMenuBarHighlightedTextColour="ffffffff"
ctrlrMenuBarHighlightColour="ff4364ff" ctrlrMenuBarFont="<Sans-Serif>;18;0;0;0;0;1;3"
ctrlrUseEditorWrapper="0" panelIndex="1" uiPanelModulatorListViewTree="0">
<uiWindowManager>
<uiChildWindow uiChildWindowName="LayerEditor" uiChildWindowState="560 262 800 500">
<uiChildWindowContentState/>
</uiChildWindow>
<uiChildWindow uiChildWindowName="LuaMethodEditor" uiChildWindowState="229 413 1346 551">
<uiChildWindowContentState luaMethodEditor="<?xml version="1.0" encoding="UTF-8"?> <CLOSED id="LUA" scrollPos="0"/> ;a48067f267294330819c285d3c00e4c8"/>
</uiChildWindow>
<uiChildWindow uiChildWindowName="LuaConsole" uiChildWindowState="137 659 800 500">
<uiChildWindowContentState/>
</uiChildWindow>
<uiChildWindow uiChildWindowName="ModulatorList" uiChildWindowState="872 431 1626 500">
<uiChildWindowContentState/>
</uiChildWindow>
</uiWindowManager>
<midiLibrary uuid="549f7bade15f4db9afa4e8ee0061022b" luaTransInfo="-- None"
midiLibraryParameterIndexProperty="modulatorCustomIndex" midiLibraryMidiProgramChangeControl="0"
midiLibrarySendSnapAfterPChg="0" midiLibraryDefaultBankName="New Bank - %H:%M:%S"
midiLibraryDefaultProgramName="New Program - %H:%M:%S" midiLibraryDefaultSnapshotName="Snapshot - %H:%M:%S"
midiLibraryCustomRequests="">
<midiLibrarySnapshots name="Snapshots"/>
<midiLibraryFirmware name="Firmware"/>
<midiLibraryEditBuffer name="Edit buffer"/>
<midiLibraryTransactions name="Transactions"/>
</midiLibrary>
<luaManager>
<luaManagerMethods>
<luaMethodGroup name="Built-In" uuid="32ef152259ee4406ae36a65c89106e45">
<luaMethod luaMethodName="table_dump" luaMethodCode="-- @1.1 -- -- Print table contents -- function table_dump(table) 	for key,value in ipairs(table) do 		_DBG ("KEY= ["..key.."]") 		if (type(value) == "table") then 			table_dump(value) 		elseif (type(value) == "nil") then 			_DBG (" = NIL") 		else 			what (value) 		end 	end end"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000001"
luaMethodValid="1"/>
<luaMethod luaMethodName="what" luaMethodCode="-- @1.1 -- -- Print methods for an object -- function what(o) 	info = class_info(o) 	if info ~= nil then 		ret = "Object type [" .. info.name .. "]\n-----------------------------------------------------------------\n\n".."Members:\n" 		if info.name == "table" then 			table_dump(o) 		end 		for k, v in pairs(info.methods) do 			ret = ret .. string.format ("\t%30s:\t%5s\n", k, type(v)) 		end 		ret = ret .. "\n\nAttributes:\n" 		for k, v in pairs(info.attributes) do 			ret = ret .. string.format ("\t%30s:\t%5s\n", k, type(v)) 		end 		ret = ret .. "\n-----------------------------------------------------------------" 	end 	console (ret) 	return ret end"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000002"
luaMethodValid="1"/>
<luaMethod luaMethodName="how" luaMethodCode="-- @1.1 -- -- Print all available classes -- function how() 	ret = "Available classes:\n" 	ret = ret .. "\n-----------------------------------------------------------------" 	for i,v in ipairs(class_names()) do 		ret = ret .. "\t".. v .. "\n" 	end 	ret = ret .. "\n-----------------------------------------------------------------" 	console (J(ret)) 	return ret end"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000003"
luaMethodValid="1"/>
<luaMethod luaMethodName="json4lua" luaMethodCode="----------------------------------------------------------------------------- -- JSON4Lua: JSON encoding / decoding support for the Lua language. -- json Module. -- Author: Craig Mason-Jones -- Homepage: http://json.luaforge.net/ -- Version: 0.9.40 -- This module is released under the MIT License (MIT). -- Please see LICENCE.txt for details. -- -- USAGE: -- This module exposes two functions: -- encode(o) -- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string. -- decode(json_string) -- Returns a Lua object populated with the data encoded in the JSON string json_string. -- -- REQUIREMENTS: -- compat-5.1 if using Lua 5.0 -- -- CHANGELOG -- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix). -- Fixed Lua 5.1 compatibility issues. -- 		Introduced json.null to have null values in associative arrays. -- encode() performance improvement (more than 50%) through table.concat rather than .. -- Introduced decode ability to ignore /**/ comments in the JSON string. -- 0.9.10 Fix to array encoding / decoding to correctly manage nil/null values in arrays. ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- Imports and dependencies ----------------------------------------------------------------------------- local math = require('math') local string = require("string") local table = require("table") local base = _G ----------------------------------------------------------------------------- -- Module declaration ----------------------------------------------------------------------------- module("json") -- Public functions -- Private functions local decode_scanArray local decode_scanComment local decode_scanConstant local decode_scanNumber local decode_scanObject local decode_scanString local decode_scanWhitespace local encodeString local isArray local isEncodable ----------------------------------------------------------------------------- -- PUBLIC FUNCTIONS ----------------------------------------------------------------------------- --- Encodes an arbitrary Lua object / variable. -- @param v The Lua object / variable to be JSON encoded. -- @return String containing the JSON encoding in internal Lua string format (i.e. not unicode) function encode (v) -- Handle nil values if v==nil then return "null" end local vtype = base.type(v) -- Handle strings if vtype=='string' then return '"' .. encodeString(v) .. '"'	 -- Need to handle encoding in string end -- Handle booleans if vtype=='number' or vtype=='boolean' then return base.tostring(v) end -- Handle tables if vtype=='table' then local rval = {} -- Consider arrays separately local bArray, maxCount = isArray(v) if bArray then for i = 1,maxCount do table.insert(rval, encode(v[i])) end else	-- An object, not an array for i,j in base.pairs(v) do if isEncodable(i) and isEncodable(j) then table.insert(rval, '"' .. encodeString(i) .. '":' .. encode(j)) end end end if bArray then return '[' .. table.concat(rval,',') ..']' else return '{' .. table.concat(rval,',') .. '}' end end -- Handle null values if vtype=='function' and v==null then return 'null' end base.assert(false,'encode attempt to encode unsupported type ' .. vtype .. ':' .. base.tostring(v)) end --- Decodes a JSON string and returns the decoded value as a Lua data structure / value. -- @param s The string to scan. -- @param [startPos] Optional starting position where the JSON string is located. Defaults to 1. -- @param Lua object, number The object that was scanned, as a Lua table / string / number / boolean or nil, -- and the position of the first character after -- the scanned JSON object. function decode(s, startPos) startPos = startPos and startPos or 1 startPos = decode_scanWhitespace(s,startPos) base.assert(startPos<=string.len(s), 'Unterminated JSON encoded object found at position in [' .. s .. ']') local curChar = string.sub(s,startPos,startPos) -- Object if curChar=='{' then return decode_scanObject(s,startPos) end -- Array if curChar=='[' then return decode_scanArray(s,startPos) end -- Number if string.find("+-0123456789.e", curChar, 1, true) then return decode_scanNumber(s,startPos) end -- String if curChar==[["]] or curChar==[[']] then return decode_scanString(s,startPos) end if string.sub(s,startPos,startPos+1)=='/*' then return decode(s, decode_scanComment(s,startPos)) end -- Otherwise, it must be a constant return decode_scanConstant(s,startPos) end --- The null function allows one to specify a null value in an associative array (which is otherwise -- discarded if you set the value with 'nil' in Lua. Simply set t = { first=json.null } function null() return null -- so json.null() will also return null ;-) end ----------------------------------------------------------------------------- -- Internal, PRIVATE functions. -- Following a Python-like convention, I have prefixed all these 'PRIVATE' -- functions with an underscore. ----------------------------------------------------------------------------- --- Scans an array from JSON into a Lua object -- startPos begins at the start of the array. -- Returns the array and the next starting position -- @param s The string being scanned. -- @param startPos The starting position for the scan. -- @return table, int The scanned array as a table, and the position of the next character to scan. function decode_scanArray(s,startPos) local array = {}	-- The return value local stringLen = string.len(s) base.assert(string.sub(s,startPos,startPos)=='[','decode_scanArray called but array does not start at position ' .. startPos .. ' in string:\n'..s ) startPos = startPos + 1 -- Infinite loop for array elements repeat startPos = decode_scanWhitespace(s,startPos) base.assert(startPos<=stringLen,'JSON String ended unexpectedly scanning array.') local curChar = string.sub(s,startPos,startPos) if (curChar==']') then return array, startPos+1 end if (curChar==',') then startPos = decode_scanWhitespace(s,startPos+1) end base.assert(startPos<=stringLen, 'JSON String ended unexpectedly scanning array.') object, startPos = decode(s,startPos) table.insert(array,object) until false end --- Scans a comment and discards the comment. -- Returns the position of the next character following the comment. -- @param string s The JSON string to scan. -- @param int startPos The starting position of the comment function decode_scanComment(s, startPos) base.assert( string.sub(s,startPos,startPos+1)=='/*', "decode_scanComment called but comment does not start at position " .. startPos) local endPos = string.find(s,'*/',startPos+2) base.assert(endPos~=nil, "Unterminated comment in string at " .. startPos) return endPos+2 end --- Scans for given constants: true, false or null -- Returns the appropriate Lua type, and the position of the next character to read. -- @param s The string being scanned. -- @param startPos The position in the string at which to start scanning. -- @return object, int The object (true, false or nil) and the position at which the next character should be -- scanned. function decode_scanConstant(s, startPos) local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } local constNames = {"true","false","null"} for i,k in base.pairs(constNames) do --print ("[" .. string.sub(s,startPos, startPos + string.len(k) -1) .."]", k) if string.sub(s,startPos, startPos + string.len(k) -1 )==k then return consts[k], startPos + string.len(k) end end base.assert(nil, 'Failed to scan constant from string ' .. s .. ' at starting position ' .. startPos) end --- Scans a number from the JSON encoded string. -- (in fact, also is able to scan numeric +- eqns, which is not -- in the JSON spec.) -- Returns the number, and the position of the next character -- after the number. -- @param s The string being scanned. -- @param startPos The position at which to start scanning. -- @return number, int The extracted number and the position of the next character to scan. function decode_scanNumber(s,startPos) local endPos = startPos+1 local stringLen = string.len(s) local acceptableChars = "+-0123456789.e" while (string.find(acceptableChars, string.sub(s,endPos,endPos), 1, true) 	and endPos<=stringLen 	) do endPos = endPos + 1 end local stringValue = 'return ' .. string.sub(s,startPos, endPos-1) local stringEval = base.loadstring(stringValue) base.assert(stringEval, 'Failed to scan number [ ' .. stringValue .. '] in JSON string at position ' .. startPos .. ' : ' .. endPos) return stringEval(), endPos end --- Scans a JSON object into a Lua object. -- startPos begins at the start of the object. -- Returns the object and the next starting position. -- @param s The string being scanned. -- @param startPos The starting position of the scan. -- @return table, int The scanned object as a table and the position of the next character to scan. function decode_scanObject(s,startPos) local object = {} local stringLen = string.len(s) local key, value base.assert(string.sub(s,startPos,startPos)=='{','decode_scanObject called but object does not start at position ' .. startPos .. ' in string:\n' .. s) startPos = startPos + 1 repeat startPos = decode_scanWhitespace(s,startPos) base.assert(startPos<=stringLen, 'JSON string ended unexpectedly while scanning object.') local curChar = string.sub(s,startPos,startPos) if (curChar=='}') then return object,startPos+1 end if (curChar==',') then startPos = decode_scanWhitespace(s,startPos+1) end base.assert(startPos<=stringLen, 'JSON string ended unexpectedly scanning object.') -- Scan the key key, startPos = decode(s,startPos) base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) startPos = decode_scanWhitespace(s,startPos) base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) base.assert(string.sub(s,startPos,startPos)==':','JSON object key-value assignment mal-formed at ' .. startPos) startPos = decode_scanWhitespace(s,startPos+1) base.assert(startPos<=stringLen, 'JSON string ended unexpectedly searching for value of key ' .. key) value, startPos = decode(s,startPos) object[key]=value until false	-- infinite loop while key-value pairs are found end -- START SoniEx2 -- Initialize some things used by decode_scanString -- You know, for efficiency local escapeSequences = { ["\\t"] = "\t", ["\\f"] = "\f", ["\\r"] = "\r", ["\\n"] = "\n", ["\\b"] = "\b" } base.setmetatable(escapeSequences, {__index = function(t,k) -- skip "\" aka strip escape return string.sub(k,2) end}) -- END SoniEx2 --- Scans a JSON string from the opening inverted comma or single quote to the -- end of the string. -- Returns the string extracted as a Lua string, -- and the position of the next non-string character -- (after the closing inverted comma or single quote). -- @param s The string being scanned. -- @param startPos The starting position of the scan. -- @return string, int The extracted string as a Lua string, and the next character to parse. function decode_scanString(s,startPos) base.assert(startPos, 'decode_scanString(..) called without start position') local startChar = string.sub(s,startPos,startPos) -- START SoniEx2 -- PS: I don't think single quotes are valid JSON base.assert(startChar == [["]] or startChar == [[']],'decode_scanString called for a non-string') --base.assert(startPos, "String decoding failed: missing closing " .. startChar .. " for string at position " .. oldStart) local t = {} local i,j = startPos,startPos while string.find(s, startChar, j+1) ~= j+1 do local oldj = j i,j = string.find(s, "\\.", j+1) local x,y = string.find(s, startChar, oldj+1) if not i or x < i then base.print(s, startPos, string.sub(s,startPos,oldj)) i,j = x,y-1 if not x then base.print(s, startPos, string.sub(s,startPos,oldj)) end end table.insert(t, string.sub(s, oldj+1, i-1)) if string.sub(s, i, j) == "\\u" then local a = string.sub(s,j+1,j+4) j = j + 4 local n = base.tonumber(a, 16) base.assert(n, "String decoding failed: bad Unicode escape " .. a .. " at position " .. i .. " : " .. j) -- math.floor(x/2^y) == lazy right shift -- a % 2^b == bitwise_and(a, (2^b)-1) -- 64 = 2^6 -- 4096 = 2^12 (or 2^6 * 2^6) local x if n < 0x80 then x = string.char(n % 0x80) elseif n < 0x800 then -- [110x xxxx] [10xx xxxx] x = string.char(0xC0 + (math.floor(n/64) % 0x20), 0x80 + (n % 0x40)) else -- [1110 xxxx] [10xx xxxx] [10xx xxxx] x = string.char(0xE0 + (math.floor(n/4096) % 0x10), 0x80 + (math.floor(n/64) % 0x40), 0x80 + (n % 0x40)) end table.insert(t, x) else table.insert(t, escapeSequences[string.sub(s, i, j)]) end end table.insert(t,string.sub(j, j+1)) base.assert(string.find(s, startChar, j+1), "String decoding failed: missing closing " .. startChar .. " at position " .. j .. "(for string at position " .. startPos .. ")") return table.concat(t,""), j+2 -- END SoniEx2 end --- Scans a JSON string skipping all whitespace from the current start position. -- Returns the position of the first non-whitespace character, or nil if the whole end of string is reached. -- @param s The string being scanned -- @param startPos The starting position where we should begin removing whitespace. -- @return int The first position where non-whitespace was encountered, or string.len(s)+1 if the end of string -- was reached. function decode_scanWhitespace(s,startPos) local whitespace=" \n\r\t" local stringLen = string.len(s) while ( string.find(whitespace, string.sub(s,startPos,startPos), 1, true) and startPos <= stringLen) do startPos = startPos + 1 end return startPos end --- Encodes a string to be JSON-compatible. -- This just involves back-quoting inverted commas, back-quotes and newlines, I think ;-) -- @param s The string to return as a JSON encoded (i.e. backquoted string) -- @return The string appropriately escaped. local escapeList = { ['"'] = '\\"', ['\\'] = '\\\\', ['/'] = '\\/', ['\b'] = '\\b', ['\f'] = '\\f', ['\n'] = '\\n', ['\r'] = '\\r', ['\t'] = '\\t' } function encodeString(s) return s:gsub(".", function(c) return escapeList[c] end) -- SoniEx2: 5.0 compat end -- Determines whether the given Lua type is an array or a table / dictionary. -- We consider any table an array if it has indexes 1..n for its n items, and no -- other data in the table. -- I think this method is currently a little 'flaky', but can't think of a good way around it yet... -- @param t The table to evaluate as an array -- @return boolean, number True if the table can be represented as an array, false otherwise. If true, -- the second returned value is the maximum -- number of indexed elements in the array. function isArray(t) -- Next we count all the elements, ensuring that any non-indexed elements are not-encodable -- (with the possible exception of 'n') local maxIndex = 0 for k,v in base.pairs(t) do if (base.type(k)=='number' and math.floor(k)==k and 1<=k) then	-- k,v is an indexed pair if (not isEncodable(v)) then return false end	-- All array elements must be encodable maxIndex = math.max(maxIndex,k) else if (k=='n') then if v ~= table.getn(t) then return false end -- False if n does not hold the number of elements else -- Else of (k=='n') if isEncodable(v) then return false end end -- End of (k~='n') end -- End of k,v not an indexed pair end -- End of loop across all pairs return true, maxIndex end --- Determines whether the given Lua object / table / variable can be JSON encoded. The only -- types that are JSON encodable are: string, boolean, number, nil, table and json.null. -- In this implementation, all other types are ignored. -- @param o The object to examine. -- @return boolean True if the object should be JSON encoded, false if it should be ignored. function isEncodable(o) local t = base.type(o) return (t=='string' or t=='boolean' or t=='number' or t=='nil' or t=='table') or (t=='function' and o==null) end"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000004"
luaMethodValid="1"/>
<luaMethod luaMethodName="debugger.lua" luaMethodCode="--{{{ history --15/03/06 DCN Created based on RemDebug --28/04/06 DCN Update for Lua 5.1 --01/06/06 DCN Fix command argument parsing -- Add step/over N facility -- Add trace lines facility --05/06/06 DCN Add trace call/return facility --06/06/06 DCN Make it behave when stepping through the creation of a coroutine --06/06/06 DCN Integrate the simple debugger into the main one --07/06/06 DCN Provide facility to step into coroutines --13/06/06 DCN Fix bug that caused the function environment to get corrupted with the global one --14/06/06 DCN Allow 'sloppy' file names when setting breakpoints --04/08/06 DCN Allow for no space after command name --11/08/06 DCN Use io.write not print --30/08/06 DCN Allow access to array elements in 'dump' --10/10/06 DCN Default to breakfile for all commands that require a filename and give '-' --06/12/06 DCN Allow for punctuation characters in DUMP variable names --03/01/07 DCN Add pause on/off facility --19/06/07 DCN Allow for duff commands being typed in the debugger (thanks to [email protected]) -- Allow for case sensitive file systems (thanks to [email protected]) --04/08/09 DCN Add optional line count param to pause --05/08/09 DCN Reset the debug hook in Pause() even if we think we're started --30/09/09 DCN Re-jig to not use co-routines (makes debugging co-routines awkward) --01/10/09 DCN Add ability to break on reaching any line in a file --24/07/13 TWW Added code for emulating setfenv/getfenv in Lua 5.2 as per -- http://lua-users.org/lists/lua-l/2010-06/msg00313.html --25/07/13 TWW Copied Alex Parrill's fix for errors when tracing back across a C frame -- (https://github.com/ColonelThirtyTwo/clidebugger, 26/01/12) --25/07/13 DCN Allow for windows and unix file name conventions in has_breakpoint --26/07/13 DCN Allow for \ being interpreted as an escape inside a [] pattern in 5.2 --}}} --{{{ description --A simple command line debug system for Lua written by Dave Nichols of --Match-IT Limited. Its public domain software. Do with it as you wish. --This debugger was inspired by: -- RemDebug 1.0 Beta -- Copyright Kepler Project 2005 (http://www.keplerproject.org/remdebug) --Usage: -- require('debugger') --load the debug library -- pause(message) --start/resume a debug session --An assert() failure will also invoke the debugger. --}}} local IsWindows = string.find(string.lower(os.getenv('OS') or ''),'^windows') local coro_debugger local events = { BREAK = 1, WATCH = 2, STEP = 3, SET = 4 } breakpoints = {} local watches = {} local step_into = false local step_over = false local step_lines = 0 local step_level = {main=0} local stack_level = {main=0} local trace_level = {main=0} local trace_calls = false local trace_returns = false local trace_lines = false local ret_file, ret_line, ret_name local current_thread = 'main' local started = false local pause_off = false local _g = _G local cocreate, cowrap = coroutine.create, coroutine.wrap local pausemsg = 'pause' --{{{ make Lua 5.2 compatible if not setfenv then -- Lua 5.2 --[[ As far as I can see, the only missing detail of these functions (except for occasional bugs) to achieve 100% compatibility is the case of 'getfenv' over a function that does not have an _ENV variable (that is, it uses no globals). We could use a weak table to keep the environments of these functions when set by setfenv, but that still misses the case of a function without _ENV that was not subjected to setfenv. -- Roberto ]]-- setfenv = setfenv or function(f, t) f = (type(f) == 'function' and f or debug.getinfo(f + 1, 'f').func) local name local up = 0 repeat up = up + 1 name = debug.getupvalue(f, up) until name == '_ENV' or name == nil if name then debug.upvaluejoin(f, up, function() return name end, 1) -- use unique upvalue debug.setupvalue(f, up, t) end end getfenv = getfenv or function(f) f = (type(f) == 'function' and f or debug.getinfo(f + 1, 'f').func) local name, val local up = 0 repeat up = up + 1 name, val = debug.getupvalue(f, up) until name == '_ENV' or name == nil return val end end --}}} --{{{ local hints -- command help --The format in here is name=summary|description local hints = { pause = [[ pause(msg[,lines][,force]) -- start/resume a debugger session| This can only be used in your code or from the console as a means to start/resume a debug session. If msg is given that is shown when the session starts/resumes. Useful to give a context if you've instrumented your code with pause() statements. If lines is given, the script pauses after that many lines, else it pauses immediately. If force is true, the pause function is honoured even if poff has been used. This is useful when in an interactive console session to regain debugger control. ]], poff = [[ poff -- turn off pause() command| This causes all pause() commands to be ignored. This is useful if you have instrumented your code in a busy loop and want to continue normal execution with no further interruption. ]], pon = [[ pon -- turn on pause() command| This re-instates honouring the pause() commands you may have instrumented your code with. ]], setb = [[ setb [line file] -- set a breakpoint to line/file|, line 0 means 'any' If file is omitted or is "-" the breakpoint is set at the file for the currently set level (see "set"). Execution pauses when this line is about to be executed and the debugger session is re-activated. The file can be given as the fully qualified name, partially qualified or just the file name. E.g. if file is set as "myfile.lua", then whenever execution reaches any file that ends with "myfile.lua" it will pause. If no extension is given, any extension will do. If the line is given as 0, then reaching any line in the file will do. ]], delb = [[ delb [line file] -- removes a breakpoint| If file is omitted or is "-" the breakpoint is removed for the file of the currently set level (see "set"). ]], delallb = [[ delallb -- removes all breakpoints| ]], setw = [[ setw <exp> -- adds a new watch expression| The expression is evaluated before each line is executed. If the expression yields true then execution is paused and the debugger session re-activated. The expression is executed in the context of the line about to be executed. ]], delw = [[ delw <index> -- removes the watch expression at index| The index is that returned when the watch expression was set by setw. ]], delallw = [[ delallw -- removes all watch expressions| ]], run = [[ run -- run until next breakpoint or watch expression| ]], step = [[ step [N] -- run next N lines, stepping into function calls| If N is omitted, use 1. ]], over = [[ over [N] -- run next N lines, stepping over function calls| If N is omitted, use 1. ]], out = [[ out [N] -- run lines until stepped out of N functions| If N is omitted, use 1. If you are inside a function, using "out 1" will run until you return from that function to the caller. ]], gotoo = [[ gotoo [line file] -- step to line in file| This is equivalent to 'setb line file', followed by 'run', followed by 'delb line file'. ]], listb = [[ listb -- lists breakpoints| ]], listw = [[ listw -- lists watch expressions| ]], set = [[ set [level] -- set context to stack level, omitted=show| If level is omitted it just prints the current level set. This sets the current context to the level given. This affects the context used for several other functions (e.g. vars). The possible levels are those shown by trace. ]], vars = [[ vars [depth] -- list context locals to depth, omitted=1| If depth is omitted then uses 1. Use a depth of 0 for the maximum. Lists all non-nil local variables and all non-nil upvalues in the currently set context. For variables that are tables, lists all fields to the given depth. ]], fenv = [[ fenv [depth] -- list context function env to depth, omitted=1| If depth is omitted then uses 1. Use a depth of 0 for the maximum. Lists all function environment variables in the currently set context. For variables that are tables, lists all fields to the given depth. ]], glob = [[ glob [depth] -- list globals to depth, omitted=1| If depth is omitted then uses 1. Use a depth of 0 for the maximum. Lists all global variables. For variables that are tables, lists all fields to the given depth. ]], ups = [[ ups -- list all the upvalue names| These names will also be in the "vars" list unless their value is nil. This provides a means to identify which vars are upvalues and which are locals. If a name is both an upvalue and a local, the local value takes precedance. ]], locs = [[ locs -- list all the locals names| These names will also be in the "vars" list unless their value is nil. This provides a means to identify which vars are upvalues and which are locals. If a name is both an upvalue and a local, the local value takes precedance. ]], dump = [[ dump <var> [depth] -- dump all fields of variable to depth| If depth is omitted then uses 1. Use a depth of 0 for the maximum. Prints the value of <var> in the currently set context level. If <var> is a table, lists all fields to the given depth. <var> can be just a name, or name.field or name.# to any depth, e.g. t.1.f accesses field 'f' in array element 1 in table 't'. Can also be called from a script as dump(var,depth). ]], tron = [[ tron [crl] -- turn trace on for (c)alls, (r)etuns, (l)lines| If no parameter is given then tracing is turned off. When tracing is turned on a line is printed to the console for each debug 'event' selected. c=function calls, r=function returns, l=lines. ]], trace = [[ trace -- dumps a stack trace| Format is [level] = file,line,name The level is a candidate for use by the 'set' command. ]], info = [[ info -- dumps the complete debug info captured| Only useful as a diagnostic aid for the debugger itself. This information can be HUGE as it dumps all variables to the maximum depth, so be careful. ]], show = [[ show line file X Y -- show X lines before and Y after line in file| If line is omitted or is '-' then the current set context line is used. If file is omitted or is '-' then the current set context file is used. If file is not fully qualified and cannot be opened as specified, then a search for the file in the package[path] is performed using the usual "require" searching rules. If no file extension is given, .lua is used. Prints the lines from the source file around the given line. ]], exit = [[ exit -- exits debugger, re-start it using pause()| ]], help = [[ help [command] -- show this list or help for command| ]], ["<statement>"] = [[ <statement> -- execute a statement in the current context| The statement can be anything that is legal in the context, including assignments. Such assignments affect the context and will be in force immediately. Any results returned are printed. Use '=' as a short-hand for 'return', e.g. "=func(arg)" will call 'func' with 'arg' and print the results, and "=var" will just print the value of 'var'. ]], what = [[ what <func> -- show where <func> is defined (if known)| ]], } --}}} --{{{ Local function to get table size local function tsize(t) local count=0 for k,v in pairs(t) do count = count + 1 end return count end ---}}} ---{{{ Global utility function to set breakpoints, used inside Ctrlr function setBreakpoint(line, file, shouldBeSet) if not breakpoints[line] then breakpoints[line] = {} end if shouldBeSet then breakpoints[line][file] = true else breakpoints[line] = nil end end ---}}} --{{{ local function getinfo(level,field) --like debug.getinfo but copes with no activation record at the given level --and knows how to get 'field'. 'field' can be the name of any of the --activation record fields or any of the 'what' names or nil for everything. --only valid when using the stack level to get info, not a function name. local function getinfo(level,field) level = level + 1 --to get to the same relative level as the caller if not field then return debug.getinfo(level) end local what if field == 'name' or field == 'namewhat' then what = 'n' elseif field == 'what' or field == 'source' or field == 'linedefined' or field == 'lastlinedefined' or field == 'short_src' then what = 'S' elseif field == 'currentline' then what = 'l' elseif field == 'nups' then what = 'u' elseif field == 'func' then what = 'f' else return debug.getinfo(level,field) end local ar = debug.getinfo(level,what) if ar then return ar[field] else return nil end end --}}} --{{{ local function indented( level, ... ) local function indented( level, ... ) ctrlrDebugger:write( string.format ("%s%s\n", string.rep(' ',level), table.concat({...}) )) end --}}} --{{{ local function dumpval( level, name, value, limit ) local dumpvisited local function dumpval( level, name, value, limit ) local index if type(name) == 'number' then index = string.format("%q,",name) elseif type(name) == 'string' and (name == '__VARSLEVEL__' or name == '__ENVIRONMENT__' or name == '__GLOBALS__' or name == '__UPVALUES__' or name == '__LOCALS__') then --ignore these, they are debugger generated return elseif type(name) == 'string' and string.find(name,'^[_%a][_.%w]*$') then index = string.format ("%q: ", name); else index = string.format ("%q,", tostring(name)) end if type(value) == 'table' then if dumpvisited[value] then indented (level, index, string.format("%q", dumpvisited[value])) else dumpvisited[value] = string.format ("\"table\": \"%d\",", tsize (value)) if (limit or 0) > 0 and level+1 >= limit then indented (level, index, string.format ("{%s", string.gsub(dumpvisited[value], ",", "},"))) else indented (level, index, "{\n", dumpvisited[value]) for n,v in pairs(value) do dumpval (level+1, n, v, limit) end indented (level, "}") end end else if type(value) == 'string' then indented (level, index, string.format("{\"string\": %q}",value), ',') end if type(value) == 'userdata' then info = class_info (value) indented (level, index, string.format ("{\"userdata\": %q}", info.name) , ',') end if type(value) == 'number' then indented (level, index, string.format ("{\"number\": %q}",tostring(value)), ',') end end end --}}} --{{{ local function dumpvar( value, limit, name ) local function dumpvar( value, limit, name ) ctrlrDebugger:write ("\n::start dumpvar\n") dumpvisited = {} dumpval( 0, name or tostring(value), value, limit ) ctrlrDebugger:write ("::end\n") end --}}} --{{{ local function show(file,line,before,after) --show +/-N lines of a file around line M local function show(file,line,before,after) line = tonumber(line or 1) before = tonumber(before or 10) after = tonumber(after or before) if not string.find(file,'%.') then file = file..'.lua' end local f = io.open(file,'r') if not f then --{{{ try to find the file in the path -- -- looks for a file in the package path -- local path = package.path or LUA_PATH or '' for c in string.gmatch (path, "[^;]+") do local c = string.gsub (c, "%?%.lua", file) f = io.open (c,'r') if f then break end end --}}} if not f then ctrlrDebugger:write('Cannot find '..file..'\n') return end end local i = 0 for l in f:lines() do i = i + 1 if i >= (line-before) then if i > (line+after) then break end if i == line then ctrlrDebugger:write(i..'***\t'..l..'\n') else ctrlrDebugger:write(i..'\t'..l..'\n') end end end f:close() end --}}} --{{{ local function tracestack(l) local function gi( i ) return function() i=i+1 return debug.getinfo(i),i end end local function gl( level, j ) return function() j=j+1 return debug.getlocal( level, j ) end end local function gu( func, k ) return function() k=k+1 return debug.getupvalue( func, k ) end end local traceinfo local function tracestack(l) local l = l + 1 --NB: +1 to get level relative to caller traceinfo = {} traceinfo.pausemsg = pausemsg for ar,i in gi(l) do table.insert( traceinfo, ar ) if ar.what ~= 'C' then local names = {} local values = {} for n,v in gl(i,0) do if string.sub(n,1,1) ~= '(' then --ignore internal control variables table.insert( names, n ) table.insert( values, v ) end end if #names > 0 then ar.lnames = names ar.lvalues = values end end if ar.func then local names = {} local values = {} for n,v in gu(ar.func,0) do if string.sub(n,1,1) ~= '(' then --ignore internal control variables table.insert( names, n ) table.insert( values, v ) end end if #names > 0 then ar.unames = names ar.uvalues = values end end end end --}}} --{{{ local function trace() local function trace(set) ctrlrDebugger:write ("\n::start trace\n") local mark for level,ar in ipairs(traceinfo) do if level == set then mark = '***' else mark = '' end ctrlrDebugger:write('['..level..']'..mark..'\t'..(ar.name or ar.what)..' in '..ar.short_src..':'..ar.currentline..'\n') end ctrlrDebugger:write ("::end\n") end --}}} --{{{ local function info() local function info() dumpvar( traceinfo, 0, 'traceinfo' ) end --}}} --{{{ local function set_breakpoint(file, line, once) local function set_breakpoint(file, line, once) if not breakpoints[line] then breakpoints[line] = {} end if once then breakpoints[line][file] = 1 else breakpoints[line][file] = true end end --}}} --{{{ local function remove_breakpoint(file, line) local function remove_breakpoint(file, line) if breakpoints[line] then breakpoints[line][file] = nil end end --}}} --{{{ local function has_breakpoint(file, line) --allow for 'sloppy' file names --search for file and all variations walking up its directory hierachy --ditto for the file with no extension --a breakpoint can be permenant or once only, if once only its removed --after detection here, these are used for temporary breakpoints in the --debugger loop when executing the 'gotoo' command --a breakpoint on line 0 of a file means any line in that file local function has_breakpoint(file, line) local isLine = breakpoints[line] local isZero = breakpoints[0] if not isLine and not isZero then return false end local noext = string.gsub(file,"(%..-)$",'',1) if noext == file then noext = nil end while file do if isLine and isLine[file] then if isLine[file] == 1 then isLine[file] = nil end return true end if isZero and isZero[file] then if isZero[file] == 1 then isZero[file] = nil end return true end if IsWindows then file = string.match(file,"[:/\\](.+)$") else file = string.match(file,"[:/](.+)$") end end while noext do if isLine and isLine[noext] then if isLine[noext] == 1 then isLine[noext] = nil end return true end if isZero and isZero[noext] then if isZero[noext] == 1 then isZero[noext] = nil end return true end if IsWindows then noext = string.match(noext,"[:/\\](.+)$") else noext = string.match(noext,"[:/](.+)$") end end return false end --}}} --{{{ local function capture_vars(ref,level,line) local function capture_vars(ref,level,line) --get vars, file and line for the given level relative to debug_hook offset by ref local lvl = ref + level --NB: This includes an offset of +1 for the call to here --{{{ capture variables local ar = debug.getinfo(lvl, "f") if not ar then return {},'?',0 end local vars = {__UPVALUES__={}, __LOCALS__={}} local i local func = ar.func if func then i = 1 while true do local name, value = debug.getupvalue(func, i) if not name then break end if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables vars[name] = value vars.__UPVALUES__[i] = name end i = i + 1 end vars.__ENVIRONMENT__ = getfenv(func) end vars.__GLOBALS__ = getfenv(0) i = 1 while true do local name, value = debug.getlocal(lvl, i) if not name then break end if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables vars[name] = value vars.__LOCALS__[i] = name end i = i + 1 end vars.__VARSLEVEL__ = level if func then --NB: Do not do this until finished filling the vars table setmetatable(vars, { __index = getfenv(func), __newindex = getfenv(func) }) end --NB: Do not read or write the vars table anymore else the metatable functions will get invoked! --}}} local file = getinfo(lvl, "source") if string.find(file, "@") == 1 then file = string.sub(file, 2) end if IsWindows then file = string.lower(file) end if not line then line = getinfo(lvl, "currentline") end return vars,file,line end --}}} --{{{ local function restore_vars(ref,vars) local function restore_vars(ref,vars) if type(vars) ~= 'table' then return end local level = vars.__VARSLEVEL__ --NB: This level is relative to debug_hook offset by ref if not level then return end level = level + ref --NB: This includes an offset of +1 for the call to here local i local written_vars = {} i = 1 while true do local name, value = debug.getlocal(level, i) if not name then break end if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables debug.setlocal(level, i, vars[name]) written_vars[name] = true end i = i + 1 end local ar = debug.getinfo(level, "f") if not ar then return end local func = ar.func if func then i = 1 while true do local name, value = debug.getupvalue(func, i) if not name then break end if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables if not written_vars[name] then debug.setupvalue(func, i, vars[name]) end written_vars[name] = true end i = i + 1 end end end --}}} --{{{ local function trace_event(event, line, level) local function print_trace(level,depth,event,file,line,name) --NB: level here is relative to the caller of trace_event, so offset by 2 to get to there level = level + 2 local file = file or getinfo(level,'short_src') local line = line or getinfo(level,'currentline') local name = name or getinfo(level,'name') local prefix = '' if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end ctrlrDebugger:write(prefix.. string.format('%08.2f:%02i.',os.clock(),depth).. string.rep('.',depth%32).. (file or '')..' ('..(line or '')..') '.. (name or '').. ' ('..event..')\n') end local function trace_event(event, line, level) if event == 'return' and trace_returns then --note the line info for later ret_file = getinfo(level+1,'short_src') ret_line = getinfo(level+1,'currentline') ret_name = getinfo(level+1,'name') end if event ~= 'line' then return end local slevel = stack_level[current_thread] local tlevel = trace_level[current_thread] if trace_calls and slevel > tlevel then --we are now in the function called, so look back 1 level further to find the calling file and line print_trace(level+1,slevel-1,'c',nil,nil,getinfo(level+1,'name')) end if trace_returns and slevel < tlevel then print_trace(level,slevel,'r',ret_file,ret_line,ret_name) end if trace_lines then print_trace(level,slevel,'l') end trace_level[current_thread] = stack_level[current_thread] end --}}} --{{{ local function report(ev, vars, file, line, idx_watch) local function report(ev, vars, file, line, idx_watch) local vars = vars or {} local file = file or '?' local line = line or 0 local prefix = '' if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end if ev == events.STEP then ctrlrDebugger:write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')\n') elseif ev == events.BREAK then ctrlrDebugger:write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..') (breakpoint)\n') elseif ev == events.WATCH then ctrlrDebugger:write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')'.." (watch expression "..idx_watch.. ": ["..watches[idx_watch].exp.."])\n") elseif ev == events.SET then --do nothing else ctrlrDebugger:write(prefix.."Error in application: "..file.." line "..line.."\n") end if ev ~= events.SET then if pausemsg and pausemsg ~= '' then ctrlrDebugger:write('Message: '..pausemsg..'\n') end pausemsg = '' end return vars, file, line end --}}} --{{{ local function debugger_loop(ev, vars, file, line, idx_watch) local function debugger_loop(ev, vars, file, line, idx_watch) local eval_env = vars or {} local breakfile = file or '?' local breakline = line or 0 local command, args --{{{ local function getargs(spec) --get command arguments according to the given spec from the args string --the spec has a single character for each argument, arguments are separated --by white space, the spec characters can be one of: -- F for a filename (defaults to breakfile if - given in args) -- L for a line number (defaults to breakline if - given in args) -- N for a number -- V for a variable name -- S for a string local function getargs(spec) local res={} local char,arg local ptr=1 for i=1,string.len(spec) do char = string.sub(spec,i,i) if char == 'F' then _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) if not arg or arg == '' then arg = '-' end if arg == '-' then arg = breakfile end elseif char == 'L' then _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) if not arg or arg == '' then arg = '-' end if arg == '-' then arg = breakline end arg = tonumber(arg) or 0 elseif char == 'N' then _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) if not arg or arg == '' then arg = '0' end arg = tonumber(arg) or 0 elseif char == 'V' then _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) if not arg or arg == '' then arg = '' end elseif char == 'S' then _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) if not arg or arg == '' then arg = '' end else arg = '' end table.insert(res,arg or '') end return unpack(res) end --}}} while true do -- io.write("[DEBUG]> ") ctrlrDebugger:write("[DEBUG]> ") -- local line = io.read("*line") local line = ctrlrDebugger:read() if line == nil then ctrlrDebugger:write('\n'); line = 'exit' end if string.find(line, "^[a-z]+") then command = string.sub(line, string.find(line, "^[a-z]+")) args = string.gsub(line,"^[a-z]+%s*",'',1) --strip command off line else command = '' end if command == "setb" then --{{{ set breakpoint local line, filename = getargs('LF') if filename ~= '' and line ~= '' then set_breakpoint(filename,line) ctrlrDebugger:write("Breakpoint set in file "..filename..' line '..line..'\n') else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "delb" then --{{{ delete breakpoint local line, filename = getargs('LF') if filename ~= '' and line ~= '' then remove_breakpoint(filename, line) ctrlrDebugger:write("Breakpoint deleted from file "..filename..' line '..line.."\n") else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "delallb" then --{{{ delete all breakpoints breakpoints = {} ctrlrDebugger:write('All breakpoints deleted\n') --}}} elseif command == "listb" then --{{{ list breakpoints for i, v in pairs(breakpoints) do for ii, vv in pairs(v) do ctrlrDebugger:write("Break at: "..i..' in '..ii..'\n') end end --}}} elseif command == "setw" then --{{{ set watch expression if args and args ~= '' then local func = loadstring("return(" .. args .. ")") local newidx = #watches + 1 watches[newidx] = {func = func, exp = args} ctrlrDebugger:write("Set watch exp no. " .. newidx..'\n') else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "delw" then --{{{ delete watch expression local index = tonumber(args) if index then watches[index] = nil ctrlrDebugger:write("Watch expression deleted\n") else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "delallw" then --{{{ delete all watch expressions watches = {} ctrlrDebugger:write('All watch expressions deleted\n') --}}} elseif command == "listw" then --{{{ list watch expressions for i, v in pairs(watches) do ctrlrDebugger:write("Watch exp. " .. i .. ": " .. v.exp..'\n') end --}}} elseif command == "run" then --{{{ run until breakpoint step_into = false step_over = false return 'cont' --}}} elseif command == "step" then --{{{ step N lines (into functions) local N = tonumber(args) or 1 step_over = false step_into = true step_lines = tonumber(N or 1) return 'cont' --}}} elseif command == "over" then --{{{ step N lines (over functions) local N = tonumber(args) or 1 step_into = false step_over = true step_lines = tonumber(N or 1) step_level[current_thread] = stack_level[current_thread] return 'cont' --}}} elseif command == "out" then --{{{ step N lines (out of functions) local N = tonumber(args) or 1 step_into = false step_over = true step_lines = 1 step_level[current_thread] = stack_level[current_thread] - tonumber(N or 1) return 'cont' --}}} elseif command == "gotoo" then --{{{ step until reach line local line, filename = getargs('LF') if line ~= '' then step_over = false step_into = false if has_breakpoint(filename,line) then return 'cont' else set_breakpoint(filename,line,true) return 'cont' end else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "set" then --{{{ set/show context level local level = args if level and level == '' then level = nil end if level then return level end --}}} elseif command == "vars" then --{{{ list context variables local depth = args if depth and depth == '' then depth = nil end depth = tonumber(depth) or 1 dumpvar(eval_env, depth+1, 'variables') --}}} elseif command == "glob" then --{{{ list global variables local depth = args if depth and depth == '' then depth = nil end depth = tonumber(depth) or 1 dumpvar(eval_env.__GLOBALS__,depth+1,'globals') --}}} elseif command == "fenv" then --{{{ list function environment variables local depth = args if depth and depth == '' then depth = nil end depth = tonumber(depth) or 1 dumpvar(eval_env.__ENVIRONMENT__,depth+1,'environment') --}}} elseif command == "ups" then --{{{ list upvalue names dumpvar(eval_env.__UPVALUES__,2,'upvalues') --}}} elseif command == "locs" then --{{{ list locals names dumpvar(eval_env.__LOCALS__,2,'upvalues') --}}} elseif command == "what" then --{{{ show where a function is defined if args and args ~= '' then local v = eval_env local n = nil for w in string.gmatch(args,"[%w_]+") do v = v[w] if n then n = n..'.'..w else n = w end if not v then break end end if type(v) == 'function' then local def = debug.getinfo(v,'S') if def then ctrlrDebugger:write(def.what..' in '..def.short_src..' '..def.linedefined..'..'..def.lastlinedefined..'\n') else ctrlrDebugger:write('Cannot get info for '..v..'\n') end else ctrlrDebugger:write(v..' is not a function\n') end else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "dump" then --{{{ dump a variable local name, depth = getargs('VN') if name ~= '' then if depth == '' or depth == 0 then depth = nil end depth = tonumber(depth or 1) local v = eval_env local n = nil for w in string.gmatch(name,"[^%.]+") do --get everything between dots if tonumber(w) then v = v[tonumber(w)] else v = v[w] end if n then n = n..'.'..w else n = w end if not v then break end end dumpvar(v,depth+1,n) else ctrlrDebugger:write("Bad request\n") end --}}} elseif command == "show" then --{{{ show file around a line or the current breakpoint local line, file, before, after = getargs('LFNN') if before == 0 then before = 10 end if after == 0 then after = before end if file ~= '' and file ~= "=stdin" then show(file,line,before,after) else ctrlrDebugger:write('Nothing to show\n') end --}}} elseif command == "poff" then --{{{ turn pause command off pause_off = true --}}} elseif command == "pon" then --{{{ turn pause command on pause_off = false --}}} elseif command == "tron" then --{{{ turn tracing on/off local option = getargs('S') trace_calls = false trace_returns = false trace_lines = false if string.find(option,'c') then trace_calls = true end if string.find(option,'r') then trace_returns = true end if string.find(option,'l') then trace_lines = true end --}}} elseif command == "trace" then --{{{ dump a stack trace trace(eval_env.__VARSLEVEL__) --}}} elseif command == "info" then --{{{ dump all debug info captured info() --}}} elseif command == "pause" then --{{{ not allowed in here ctrlrDebugger:write('pause() should only be used in the script you are debugging\n') --}}} elseif command == "help" then --{{{ help local command = getargs('S') if command ~= '' and hints[command] then ctrlrDebugger:write(hints[command]..'\n') else for _,v in pairs(hints) do local _,_,h = string.find(v,"(.+)|") ctrlrDebugger:write(h..'\n') end end --}}} elseif command == "exit" then --{{{ exit debugger return 'stop' --}}} elseif line ~= '' then --{{{ just execute whatever it is in the current context --map line starting with "=..." to "return ..." if string.sub(line,1,1) == '=' then line = string.gsub(line,'=','return ',1) end local ok, func = pcall(loadstring,line) if func == nil then [email protected] ctrlrDebugger:write("Compile error: "..line..'\n') elseif not ok then ctrlrDebugger:write("Compile error: "..func..'\n') else setfenv(func, eval_env) local res = {pcall(func)} if res[1] then if res[2] then table.remove(res,1) for _,v in ipairs(res) do ctrlrDebugger:write(tostring(v)) ctrlrDebugger:write('\t') end ctrlrDebugger:write('\n') end --update in the context return 0 else ctrlrDebugger:write("Run error: "..res[2]..'\n') end end --}}} end end end --}}} --{{{ local function debug_hook(event, line, level, thread) local function debug_hook(event, line, level, thread) if not started then debug.sethook(); coro_debugger = nil; return end current_thread = thread or 'main' local level = level or 2 trace_event(event,line,level) if event == "call" then stack_level[current_thread] = stack_level[current_thread] + 1 elseif event == "return" then stack_level[current_thread] = stack_level[current_thread] - 1 if stack_level[current_thread] < 0 then stack_level[current_thread] = 0 end else local vars,file,line = capture_vars(level,1,line) local stop, ev, idx = false, events.STEP, 0 while true do for index, value in pairs(watches) do setfenv(value.func, vars) local status, res = pcall(value.func) if status and res then ev, idx = events.WATCH, index stop = true break end end if stop then break end if (step_into) or (step_over and (stack_level[current_thread] <= step_level[current_thread] or stack_level[current_thread] == 0)) then step_lines = step_lines - 1 if step_lines < 1 then ev, idx = events.STEP, 0 break end end if has_breakpoint(file, line) then ev, idx = events.BREAK, 0 break end return end if not coro_debugger then ctrlrDebugger:write("Lua Debugger\n") vars, file, line = report(ev, vars, file, line, idx) ctrlrDebugger:write("Type 'help' for commands\n") coro_debugger = true else vars, file, line = report(ev, vars, file, line, idx) end tracestack(level) local last_next = 1 local next = 'ask' local silent = false while true do if next == 'ask' then next = debugger_loop(ev, vars, file, line, idx) elseif next == 'cont' then return elseif next == 'stop' then started = false debug.sethook() coro_debugger = nil return elseif tonumber(next) then --get vars for given level or last level next = tonumber(next) if next == 0 then silent = true; next = last_next else silent = false end last_next = next restore_vars(level,vars) vars, file, line = capture_vars(level,next) if not silent then if vars and vars.__VARSLEVEL__ then ctrlrDebugger:write('Level: '..vars.__VARSLEVEL__..'\n') else ctrlrDebugger:write('No level set\n') end end ev = events.SET next = 'ask' else ctrlrDebugger:write('Unknown command from debugger_loop: '..tostring(next)..'\n') ctrlrDebugger:write('Stopping debugger\n') next = 'stop' end end end end --}}} --{{{ coroutine.create --This function overrides the built-in for the purposes of propagating --the debug hook settings from the creator into the created coroutine. _G.coroutine.create = function(f) local thread local hook, mask, count = debug.gethook() if hook then local function thread_hook(event,line) hook(event,line,3,thread) end thread = cocreate(function(...) stack_level[thread] = 0 trace_level[thread] = 0 step_level [thread] = 0 debug.sethook(thread_hook,mask,count) return f(...) end) return thread else return cocreate(f) end end --}}} --{{{ coroutine.wrap --This function overrides the built-in for the purposes of propagating --the debug hook settings from the creator into the created coroutine. _G.coroutine.wrap = function(f) local thread local hook, mask, count = debug.gethook() if hook then local function thread_hook(event,line) hook(event,line,3,thread) end thread = cowrap(function(...) stack_level[thread] = 0 trace_level[thread] = 0 step_level [thread] = 0 debug.sethook(thread_hook,mask,count) return f(...) end) return thread else return cowrap(f) end end --}}} --{{{ function pause(x,l,f) -- -- Starts/resumes a debug session -- function pause(x,l,f) if not f and pause_off then return end --being told to ignore pauses pausemsg = x or 'pause' local lines local src = getinfo(2,'short_src') if l then lines = l --being told when to stop elseif src == "stdin" then lines = 1 --if in a console session, stop now else lines = 2 --if in a script, stop when get out of pause() end if started then --we'll stop now 'cos the existing debug hook will grab us step_lines = lines step_into = true debug.sethook(debug_hook, "crl") --reset it in case some external agent fiddled with it else --set to stop when get out of pause() trace_level[current_thread] = 0 step_level [current_thread] = 0 stack_level[current_thread] = 1 step_lines = lines step_into = true started = true debug.sethook(debug_hook, "crl") --NB: this will cause an immediate entry to the debugger_loop end end --}}} --{{{ function dump(v,depth) --shows the value of the given variable, only really useful --when the variable is a table --see dump debug command hints for full semantics function dump(v,depth) dumpvar(v,(depth or 1)+1,tostring(v)) end --}}} --{{{ function debug.traceback(x) local _traceback = debug.traceback --note original function --override standard function debug.traceback = function(x) local assertmsg = _traceback(x) --do original function pause(x) --let user have a look at stuff return assertmsg --carry on end _TRACEBACK = debug.traceback --Lua 5.0 function --}}}"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000005"
luaMethodValid="1"/>
<luaMethod luaMethodName="inspect" luaMethodCode="function getInspect() local inspect ={ _VERSION = 'inspect.lua 3.0.0', _URL = 'http://github.com/kikito/inspect.lua', _DESCRIPTION = 'human-readable representations of tables', _LICENSE = [[ MIT LICENSE Copyright (c) 2013 Enrique García Cota Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ]] } inspect.KEY = setmetatable({}, {__tostring = function() return 'inspect.KEY' end}) inspect.METATABLE = setmetatable({}, {__tostring = function() return 'inspect.METATABLE' end}) -- Apostrophizes the string if it has quotes, but not aphostrophes -- Otherwise, it returns a regular quoted string local function smartQuote(str) if str:match('"') and not str:match("'") then return "'" .. str .. "'" end return '"' .. str:gsub('"', '\\"') .. '"' end local controlCharsTranslation = { ["\a"] = "\\a", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t", ["\v"] = "\\v" } local function escape(str) local result = str:gsub("\\", "\\\\"):gsub("(%c)", controlCharsTranslation) return result end local function isIdentifier(str) return type(str) == 'string' and str:match( "^[_%a][_%a%d]*$" ) end local function isSequenceKey(k, length) return type(k) == 'number' and 1 <= k and k <= length and math.floor(k) == k end local defaultTypeOrders = { ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4, ['function'] = 5, ['userdata'] = 6, ['thread'] = 7 } local function sortKeys(a, b) local ta, tb = type(a), type(b) -- strings and numbers are sorted numerically/alphabetically if ta == tb and (ta == 'string' or ta == 'number') then return a < b end local dta, dtb = defaultTypeOrders[ta], defaultTypeOrders[tb] -- Two default types are compared according to the defaultTypeOrders table if dta and dtb then return defaultTypeOrders[ta] < defaultTypeOrders[tb] elseif dta then return true -- default types before custom ones elseif dtb then return false -- custom types after default ones end -- custom types are sorted out alphabetically return ta < tb end local function getNonSequentialKeys(t) local keys, length = {}, #t for k,_ in pairs(t) do if not isSequenceKey(k, length) then table.insert(keys, k) end end table.sort(keys, sortKeys) return keys end local function getToStringResultSafely(t, mt) local __tostring = type(mt) == 'table' and rawget(mt, '__tostring') local str, ok if type(__tostring) == 'function' then ok, str = pcall(__tostring, t) str = ok and str or 'error: ' .. tostring(str) end if type(str) == 'string' and #str > 0 then return str end end local maxIdsMetaTable = { __index = function(self, typeName) rawset(self, typeName, 0) return 0 end } local idsMetaTable = { __index = function (self, typeName) local col = setmetatable({}, {__mode = "kv"}) rawset(self, typeName, col) return col end } local function countTableAppearances(t, tableAppearances) tableAppearances = tableAppearances or setmetatable({}, {__mode = "k"}) if type(t) == 'table' then if not tableAppearances[t] then tableAppearances[t] = 1 for k,v in pairs(t) do countTableAppearances(k, tableAppearances) countTableAppearances(v, tableAppearances) end countTableAppearances(getmetatable(t), tableAppearances) else tableAppearances[t] = tableAppearances[t] + 1 end end return tableAppearances end local copySequence = function(s) local copy, len = {}, #s for i=1, len do copy[i] = s[i] end return copy, len end local function makePath(path, ...) local keys = {...} local newPath, len = copySequence(path) for i=1, #keys do newPath[len + i] = keys[i] end return newPath end local function processRecursive(process, item, path) if item == nil then return nil end local processed = process(item, path) if type(processed) == 'table' then local processedCopy = {} local processedKey for k,v in pairs(processed) do processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY)) if processedKey ~= nil then processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey)) end end local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE)) setmetatable(processedCopy, mt) processed = processedCopy end return processed end ------------------------------------------------------------------- local Inspector = {} local Inspector_mt = {__index = Inspector} function Inspector:puts(...) local args = {...} local buffer = self.buffer local len = #buffer for i=1, #args do len = len + 1 buffer[len] = tostring(args[i]) end end function Inspector:down(f) self.level = self.level + 1 f() self.level = self.level - 1 end function Inspector:tabify() self:puts(self.newline, string.rep(self.indent, self.level)) end function Inspector:alreadyVisited(v) return self.ids[type(v)][v] ~= nil end function Inspector:getId(v) local tv = type(v) local id = self.ids[tv][v] if not id then id = self.maxIds[tv] + 1 self.maxIds[tv] = id self.ids[tv][v] = id end return id end function Inspector:putKey(k) if isIdentifier(k) then return self:puts(k) end self:puts("[") self:putValue(k) self:puts("]") end function Inspector:putTable(t) if t == inspect.KEY or t == inspect.METATABLE then self:puts(tostring(t)) elseif self:alreadyVisited(t) then self:puts('<table ', self:getId(t), '>') elseif self.level >= self.depth then self:puts('{...}') else if self.tableAppearances[t] > 1 then self:puts('<', self:getId(t), '>') end local nonSequentialKeys = getNonSequentialKeys(t) local length = #t local mt = getmetatable(t) local toStringResult = getToStringResultSafely(t, mt) self:puts('{') self:down(function() if toStringResult then self:puts(' -- ', escape(toStringResult)) if length >= 1 then self:tabify() end end local count = 0 for i=1, length do if count > 0 then self:puts(',') end self:puts(' ') self:putValue(t[i]) count = count + 1 end for _,k in ipairs(nonSequentialKeys) do if count > 0 then self:puts(',') end self:tabify() self:putKey(k) self:puts(' = ') self:putValue(t[k]) count = count + 1 end if mt then if count > 0 then self:puts(',') end self:tabify() self:puts('<metatable> = ') self:putValue(mt) end end) if #nonSequentialKeys > 0 or mt then -- result is multi-lined. Justify closing } self:tabify() elseif length > 0 then -- array tables have one extra space before closing } self:puts(' ') end self:puts('}') end end function Inspector:putValue(v) local tv = type(v) if tv == 'string' then self:puts(smartQuote(escape(v))) elseif tv == 'number' or tv == 'boolean' or tv == 'nil' then self:puts(tostring(v)) elseif tv == 'table' then self:putTable(v) else self:puts('<',tv,' ',self:getId(v),'>') end end ------------------------------------------------------------------- function inspect.inspect(root, options) options = options or {} local depth = options.depth or math.huge local newline = options.newline or '\n' local indent = options.indent or ' ' local process = options.process if process then root = processRecursive(process, root, {}) end local inspector = setmetatable({ depth = depth, buffer = {}, level = 0, ids = setmetatable({}, idsMetaTable), maxIds = setmetatable({}, maxIdsMetaTable), newline = newline, indent = indent, tableAppearances = countTableAppearances(root) }, Inspector_mt) inspector:putValue(root) return table.concat(inspector.buffer) end setmetatable(inspect, { __call = function(_, ...) return inspect.inspect(...) end }) return inspect end inspect = getInspect()"
luaMethodLinkedProperty="" luaMethodSource="0" uuid="00000000000000000000000000000006"
luaMethodValid="1"/>
</luaMethodGroup>
<luaMethod luaMethodName="modulatorChanged" luaMethodCode=" deviceCode = 'F0 06 0E 00 01' modulatorChanged = function(--[[ CtrlrModulator --]] modulator, --[[ number --]] value) 	numBytes = tonumber(modulator:getProperty("modulatorCustomIndexGroup")) 	paramValue = nybblize(value, numBytes) 	modulatorCustomIndex = tostring(modulator:getProperty("modulatorCustomIndex")) 	paramAddress = processParamAddress(modulatorCustomIndex) 	msg = table.concat({deviceCode, nybblize(numBytes, 2), paramValue, paramAddress, 'F7'}, ' ') 	panel:sendMidiMessageNow(CtrlrMidiMessage(msg)) end nybblize = function(data, numBytes) 	numNybbles = numBytes * 2 	bigData = BigInteger(data) 	bytes = {} 	for i=0,numNybbles-1 do 		byte = bigData:getBitRangeAsInt(4*i,4) 		table.insert(bytes, string.format('%.2x', byte)) 	end 	return table.concat(bytes, ' ') end processParamAddress = function(hextetString) 	hextets = {} 	for hextet in hextetString:gmatch("%w+") do 		table.insert(hextets, tonumber(hextet, 16)) 	end 	local paramAddress = {} 	for i,hextet in ipairs(hextets) do 		nybbles = nybblize(hextet, 2) 		table.insert(paramAddress, nybbles) 	end 	return table.concat(paramAddress, ' ') end "
luaMethodLinkedProperty="uiTabsCurrentTabChanged" luaMethodSource="0"
uuid="a48067f267294330819c285d3c00e4c8" luaMethodValid="1"/>
</luaManagerMethods>
</luaManager>
<panelResources>
<resource resourceHash="-5794669400535306100" resourceLoadedTime="1492977383977"
resourceSize="560043" resourceFile="Black Plastic small 01.png"
resourceSourceFile="/Users/joebeuckman/Documents/Ctrlr-Lexicon-MPX100/Black Plastic small 01.png"
resourceName="Black Plastic small 01" resourceType="Image"/>
<resource resourceHash="6979323601321623058" resourceLoadedTime="1492977383985"
resourceSize="15315" resourceFile="logo.png" resourceSourceFile="/Users/joebeuckman/Documents/Ctrlr-Lexicon-MPX100/logo.png"
resourceName="logo" resourceType="Image"/>
</panelResources>
<uiPanelEditor uiPanelCanvasRectangle="0 0 644 546" uiPanelSnapSize="8" uiPanelBackgroundColour="ff000000"
uiPanelBackgroundColour1="ff000000" uiPanelBackgroundColour2="ff5577dd"
uiPanelBackgroundGradientType="1" uiPanelImageResource="-- None"
uiPanelEditMode="1" uiPanelViewPortSize="615" uiPanelPropertiesSize="608"
uiPanelLock="0" uiPanelDisabledOnEdit="0" uiPanelMenuBarVisible="1"
uiPanelMenuBarHideOnExport="0" uiPanelWidth="400" uiPanelHeight="400"
name="Lexicon MPX100" uiPanelImageAlpha="255" uiPanelImageLayout="64"
uiPanelSnapActive="1" uiPanelPropertiesOnRight="0" luaPanelPaintBackground="-- None"
luaPanelResized="-- None" luaPanelFileDragDropHandler="-- None"
luaPanelFileDragEnterHandler="-- None" luaPanelFileDragExitHandler="-- None"
uiPanelInvisibleComponentAlpha="0.5" uiPanelTooltipBackgroundColour="0xffeeeebb"
uiPanelTooltipOutlineColour="0xff000000" uiPanelTooltipColour="0xff000000"
uiPanelTooltipCornerRound="1" uiPanelTooltipPlacement="2" uiPanelTooltipFont="<Sans-Serif>;15;1;0;0;0;1;3"
uiPanelZoom="1">
<uiPanelCanvasLayer uiPanelCanvasLayerName="New layer" uiPanelCanvasLayerUid="641a7ab2ebc6010000622de2947f0000"
uiPanelCanvasLayerColour="0x000000" uiPanelCanvasLayerVisibility="1"
uiPanelCanvasLayerIndex="0"/>
</uiPanelEditor>
<modulator modulatorCustomIndex="0002 0000 0009" modulatorCustomIndexGroup="01"
modulatorIsStatic="1" name="algorithm" modulatorVstExported="0"
modulatorValue="0">
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="0"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="ffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="algorithm"
componentMouseCursor="2" componentGroupName="" componentGroupped="0"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="0.5" componentEffectColour="0"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiTabsCurrentTabChanged="modulatorChanged"
uiTabsDepth="30" uiTabsOutlineThickness="7" uiTabsFrontTabOutline="8"
uiTabsTabOutline="22" uiTabsIndentThickness="0" uiTabsOrientation="0"
uiTabsFrontTabFont="<Sans-Serif>;15;1;0;1;0;0;3" uiTabsTabFont="<Sans-Serif>;15;0;0;0;0;1;3"
uiTabsOutlineGlobalColour="ffffff" uiTabsOutlineGlobalBackgroundColour="0"
uiTabsOutlineTabColour="ff5577dd" uiTabsTextTabColour="0xff909090"
uiTabsFrontTabOutlineColour="ff5577dd" uiTabsFrontTabTextColour="5577dd"
uiTabsAddTab="0" uiTabsRemoveTab="0" componentRectangle="16 56 669 490"
uiType="uiTabs" componentLayerUid="641a7ab2ebc6010000622de2947f0000"
uiTabsCurrentTab="4">
<uiTabsTab uiTabsTabIndex="0" uiTabsTabName="Plate" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="104" uiTabsTabName="Chamber" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="148" uiTabsTabName="Inverse" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="3" uiTabsTabName="Ambiance" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="4" uiTabsTabName="DX1" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="5" uiTabsTabName="DX2" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="6" uiTabsTabName="DX3" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="7" uiTabsTabName="DX4" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
<uiTabsTab uiTabsTabIndex="8" uiTabsTabName="DX5" uiTabsTabContentBackgroundColour="0"
uiTabsTabBackgroundColour="0" uiTabsTabBackgroundImage="-- None"
uiTabsTabBackgroundImageLayout="36" uiTabsTabBackgroundImageAlpha="255"/>
</component>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="9" vstIndex="2974" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0001 0000" modulatorCustomName=""
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="BasMult" modulatorMin="0"
modulatorValue="9">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="BasMult"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="9" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiSliderTrackCornerSize="5" uiSliderThumbCornerSize="3"
uiSliderThumbWidth="0" uiSliderThumbHeight="0" uiSliderThumbFlatOnLeft="0"
uiSliderThumbFlatOnRight="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnBottom="0"
uiSliderRotaryOutlineColour="0xff0000ff" uiSliderRotaryFillColour="0xff0000ff"
uiSliderThumbColour="0xffff0000" uiSliderTrackColour="0xff0f0f0f"
uiSliderIncDecButtonColour="0xff0000ff" uiSliderIncDecTextColour="0xffffffff"
uiType="uiImageSlider" componentRectangle="8 16 64 64" componentLayerUid="641a7ab2ebc6010000622de2947f0000"
componentTabName="algorithm" componentTabId="1"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="112" vstIndex="2983" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0000" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Duration" modulatorMin="0"
modulatorValue="103">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Duration"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="112" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" componentTabId="2" componentTabName="algorithm"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentRectangle="24 16 64 64"
uiType="uiImageSlider" uiSliderIncDecTextColour="0xffffffff"
uiSliderIncDecButtonColour="0xff0000ff" uiSliderTrackColour="0xff0f0f0f"
uiSliderThumbColour="0xffff0000" uiSliderRotaryFillColour="0xff0000ff"
uiSliderRotaryOutlineColour="0xff0000ff" uiSliderThumbFlatOnBottom="0"
uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0" uiSliderThumbFlatOnLeft="0"
uiSliderThumbHeight="0" uiSliderThumbWidth="0" uiSliderThumbCornerSize="3"
uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="31" vstIndex="2984" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0001" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="LowSlope" modulatorMin="0"
modulatorValue="28">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="LowSlope"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="31" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="344 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="31" vstIndex="2985" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0002" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="HighSlope" modulatorMin="0"
modulatorValue="31">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="HighSlope"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="31" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="408 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="60" vstIndex="2986" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0003" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="BassXover" modulatorMin="0"
modulatorValue="49">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="BassXover"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="60" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="280 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="60" vstIndex="2987" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0004" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Rt HC" modulatorMin="0"
modulatorValue="0">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Rt HC"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="60" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="152 224 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="599" vstIndex="2988" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0005" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="PreDelay" modulatorMin="0"
modulatorValue="0">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="PreDelay"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="599" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="152 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="25" vstIndex="2989" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0006" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="RefLvlV" modulatorMin="0"
modulatorValue="18">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RefLvlL"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="25" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="88 88 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="500" vstIndex="2990" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0007" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="RefDelayL" modulatorMin="0"
modulatorValue="181">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RefDelayL"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="500" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="24 88 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="25" vstIndex="2991" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0008" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="RefLvlR" modulatorMin="0"
modulatorValue="15">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RefLvlR"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="25" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="88 152 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="500" vstIndex="2992" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 0009" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="RefDelayR" modulatorMin="0"
modulatorValue="293">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RefDelayR"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="500" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="24 152 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="100" vstIndex="2993" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 000a" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Diffusion" modulatorMin="0"
modulatorValue="100">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Diffusion"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="100" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="88 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="255" vstIndex="2994" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 000b" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Shape" modulatorMin="0"
modulatorValue="255">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Shape"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="255" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="24 224 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="255" vstIndex="2995" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 000c" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Spread" modulatorMin="0"
modulatorValue="255">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Spread"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="255" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="216 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="60" vstIndex="2996" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 000d" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Hi Cut Out"
modulatorMin="0" modulatorValue="60">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="Hi Cut Out"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="60" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="88 224 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="25" vstIndex="2997" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0002 000e" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="RvbLevel" modulatorMin="0"
modulatorValue="25">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RvbLevel"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="25" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="216 224 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="2" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="63" vstIndex="2998" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0003 0000" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Ambience" modulatorMin="0"
modulatorValue="63">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="DecayTime"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="63" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" uiType="uiImageSlider" componentRectangle="24 16 64 64"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentTabName="algorithm"
componentTabId="3" uiSliderIncDecTextColour="0xffffffff" uiSliderIncDecButtonColour="0xff0000ff"
uiSliderTrackColour="0xff0f0f0f" uiSliderThumbColour="0xffff0000"
uiSliderRotaryFillColour="0xff0000ff" uiSliderRotaryOutlineColour="0xff0000ff"
uiSliderThumbFlatOnBottom="0" uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0"
uiSliderThumbFlatOnLeft="0" uiSliderThumbHeight="0" uiSliderThumbWidth="0"
uiSliderThumbCornerSize="3" uiSliderTrackCornerSize="5"/>
</modulator>
<modulator modulatorVstExported="1" modulatorMax="60" vstIndex="2999" modulatorIsStatic="0"
modulatorGlobalVariable="-1" modulatorMuteOnStart="0" modulatorMute="0"
modulatorExcludeFromSnapshot="0" modulatorValueExpression="modulatorValue"
modulatorValueExpressionReverse="midiValue" modulatorControllerExpression="value"
luaModulatorGetValueForMIDI="-- None" luaModulatorGetValueFromMIDI="-- None"
modulatorLinkedToPanelProperty="-- None" modulatorLinkedToModulatorProperty="-- None"
modulatorLinkedToModulator="-- None" modulatorLinkedToModulatorSource="1"
modulatorLinkedToComponent="Modulator" modulatorBaseValue="0"
modulatorCustomIndex="0003 0004 0003 0001" modulatorCustomName="Duration"
modulatorCustomIndexGroup="02" modulatorCustomNameGroup="" modulatorVstNameFormat="%n"
luaModulatorValueChange="modulatorChanged" name="Ambience-1"
modulatorMin="0" modulatorValue="60">
<midi midiMessageType="9" midiMessageChannelOverride="0" midiMessageChannel="1"
midiMessageCtrlrNumber="1" midiMessageCtrlrValue="0" midiMessageMultiList=""
midiMessageSysExFormula=""/>
<component componentLabelPosition="top" componentLabelJustification="centred"
componentLabelHeight="14" componentLabelWidth="0" componentLabelVisible="1"
componentLabelAlwaysOnTop="1" componentSentBack="0" componentLabelColour="0xffffffff"
componentLabelFont="<Sans-Serif>;12;0;0;0;0;1;3" componentVisibleName="RtHC"
componentMouseCursor="2" componentGroupName="" componentGroupped="1"
componentSnapSize="0" componentIsLocked="0" componentDisabled="0"
componentRadioGroupId="0" componentRadioGroupNotifyMidi="1" componentVisibility="1"
componentEffect="0" componentEffectRadius="1" componentEffectColour="0xff000000"
componentEffectOffsetX="0" componentEffectOffsetY="0" componentExcludedFromLabelDisplay="0"
componentValueDecimalPlaces="0" componentLuaMouseMoved="-- None"
componentLuaMouseDown="-- None" componentLuaMouseDrag="-- None"
componentLuaMouseDoubleClick="-- None" uiSliderStyle="RotaryVerticalDrag"
uiImageSliderResource="Black Plastic small 01" resourceImageWidth="80"
resourceImageHeight="80" resourceImagePaintMode="36" resourceImageOrientation="1"
uiSliderMin="0" uiSliderMax="60" uiSliderInterval="1" uiSliderDoubleClickEnabled="1"
uiSliderDoubleClickValue="0" uiSliderValuePosition="4" uiSliderValueHeight="12"
uiSliderValueWidth="64" uiSliderValueTextColour="ffffffff" uiSliderValueBgColour="0x00000000"
uiSliderValueFont="<Sans-Serif>;12;0;0;0;0;1;3" uiSliderValueTextJustification="centred"
uiSliderValueHighlightColour="0xff0000ff" uiSliderValueOutlineColour="0x00000000"
uiSliderVelocitySensitivity="1" uiSliderVelocityThreshold="1"
uiSliderVelocityOffset="0" uiSliderVelocityMode="0" uiSliderVelocityModeKeyTrigger="1"
uiSliderSpringMode="0" uiSliderSpringValue="0" uiSliderMouseWheelInterval="1"
uiSliderPopupBubble="0" componentTabId="3" componentTabName="algorithm"
componentLayerUid="641a7ab2ebc6010000622de2947f0000" componentRectangle="152 16 64 64"
uiType="uiImageSlider" uiSliderIncDecTextColour="0xffffffff"
uiSliderIncDecButtonColour="0xff0000ff" uiSliderTrackColour="0xff0f0f0f"
uiSliderThumbColour="0xffff0000" uiSliderRotaryFillColour="0xff0000ff"
uiSliderRotaryOutlineColour="0xff0000ff" uiSliderThumbFlatOnBottom="0"
uiSliderThumbFlatOnTop="0" uiSliderThumbFlatOnRight="0" uiSliderThumbFlatOnLeft="0"
uiSliderThumbHeight="0" uiSliderThumbWidth="0" uiSliderThumbCornerSize="3"