SequenceMgr.js 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231
  1. /*
  2. SEQUENCE GROUPING MANAGEMENT MODULE
  3. this module builds a representation of a sequence in values using containers
  4. It allows to create groups of keys, a group being a cue and one key per layer.
  5. In a group, all keys sync their time on cue's time, only value can be modified
  6. The sequence with grouping can then be exported and reloaded.
  7. The module checks periodicaly if timeline sequence structure (cues, layers and keys) and
  8. module values structure are in sync. If out of sync, you may either rebuild values structure
  9. from sequence or rebuild sequence from values
  10. */
  11. var syncRatems = 100;
  12. var syncDelta = 0.;
  13. var doSync = false ;
  14. var inibValuesChanged = false ;
  15. var doSyncKeysCues = false ;
  16. var saveFile = script.addFileParameter("auto save sequence","");
  17. var saveRatems = 30;
  18. var saveDelta = 0.;
  19. var debug = true;
  20. var debugFile;
  21. var parametersPath = local.getChild("parameters") ;
  22. var sequence = '' ;
  23. var sequencePath = local.getChild("parameters").sequence ;
  24. var file ;
  25. var filePath = local.parameters.sequenceFile ;
  26. var newGroupLayers = local.values.newGroup.layers ;
  27. // var groups = local.getChild("values").groups ;
  28. var cues = local.getChild("values").keys.cues ;
  29. // var cuesList = []; //holds cues containers reference
  30. var layers = local.getChild("values").keys.layers ;
  31. // var layerList = {}; //holds layer container as object with reference and an array of keys containers references
  32. var rebuildValues = script.addTrigger("rebuild values", "adds a key at current cursor position" );
  33. var refreshKeys = script.addTrigger("refresh keys", "truc");
  34. var TrigprintKeys = script.addTrigger("printKeys","truc");
  35. var clearSeq = script.addTrigger("clear Sequence","truc");
  36. var UIposGet = script.addTrigger("get UIPos", "");
  37. var viewZoom = script.addFloatParameter("View Zoom", "", 0.5, 0., 1.); //part of sequence time to show
  38. var viewFollowCursor = script.addBoolParameter("follow Cursor", "", false);
  39. var followCursor = false ;
  40. var followZoom = 0.5 ;
  41. var followRatems = 1.;
  42. var followDelta = 0.;
  43. var prevKey = script.addTrigger("prev Key", "");
  44. var nextKey = script.addTrigger("next Key", "");
  45. var layerHeight = script.addFloatParameter("layer height", "", 70., 10., 150.); //part of sequence time to show
  46. // var sequence_structure = { params: {},
  47. // groups:{},
  48. // keys:{
  49. // cues:{},
  50. // layers:{}
  51. // }
  52. // };
  53. //WAS tl_groups
  54. /*group0 : { inCue : {pan : "key", tilt : "key", zoom : "key", dim : "key", focus : "key"},
  55. outCue : {pan : "key", tilt : "key", zoom : "key", dim : "key", focus : "key"}
  56. }*/
  57. ///////////////////// SCRIPT FUNCTIONS //////////////////////////////
  58. function init() {
  59. script.log("LOADED SEQUENCE GROUPING MANAGEMENT MODULE ");
  60. //adapt update rate
  61. updateSyncRate();
  62. updateSynchronize();
  63. // script.log(root.sequences.truc.viewStartTime.get();)
  64. saveFile.set("sequence_autosave.json");
  65. saveFile.setAttribute("readonly", true);
  66. //importSequenceFile(saveFile);
  67. // var audioLayer = root.sequences.truc.layers.audio ;
  68. // var newClip = audioLayer.clips.addItem();
  69. // newClip.filePath.set("/home/titi/work/media/Sons/Mono/Aaaah.wav");
  70. // newClip.setName("testAudio");
  71. // newClip.startTime.set(12);
  72. printMethodsAndProperties(root.sequences.keys.layers.pan);
  73. // script.log(local.getChild("values").groups.group0.cue.get());
  74. //test if a sequence is already choosen else refresh and unlock sequence enum
  75. sequence = local.getChild("parameters").sequence.getKey();
  76. // var sequenceIndex = local.getChild("parameters").sequence.get();
  77. // script.log(sequenceIndex + " " + sequence);
  78. if(sequence == ""){refreshSequenceEnum();}
  79. else{
  80. sequencePath.removeOptions();
  81. sequencePath.addOption(sequence,0);
  82. sequencePath.setAttribute("readonly", true);
  83. }
  84. sequence = local.getChild("parameters").sequence.getKey();
  85. seq_readZoomValue();
  86. }
  87. function scriptParameterChanged(param){
  88. if (param.is(TrigprintKeys) ){printKeys();}
  89. else if(param.is(viewZoom)) {
  90. script.log("view zoom changed");
  91. followZoom = param.get();
  92. }
  93. if (param.is(viewFollowCursor)){
  94. script.log("follow cursor " + (param.get() ? "ON" : "OFF"));
  95. followCursor = param.get();
  96. }
  97. else if(param.is(rebuildValues)){struct_updateValuesFromSeq();}
  98. else if (param.is(layerHeight)){seq_setLayerHeight();}
  99. else if (param.is(prevKey)){seq_prevNextCue(0);}
  100. else if (param.is(nextKey)){seq_prevNextCue(1);}
  101. else if (param.is(refreshKeys)){
  102. script.log("refreshKeys");
  103. refreshKeysList();
  104. }
  105. else {script.log("scriptparamchanged" + param.name);}
  106. }
  107. function update(deltaTime){
  108. if(sequence!=""){
  109. // script.log(doSync);
  110. if(doSync){
  111. syncDelta += deltaTime ;
  112. // script.log(doSync);
  113. if (syncDelta >= syncRatems){
  114. syncDelta = 0. ;
  115. var autosave = struct_updateValuesFromSeq();
  116. if(autosave){exportSequenceFile(saveFile);}
  117. }
  118. }
  119. saveDelta += deltaTime ;
  120. if (saveDelta >= saveRatems){
  121. saveDelta = 0. ;
  122. exportSequenceFile(saveFile);
  123. script.log("sequence autosave");
  124. }
  125. followDelta += deltaTime ;
  126. if(followCursor && (followDelta>followRatems)){
  127. followDelta = 0. ;
  128. seq_followCursor() ;
  129. }
  130. }
  131. else{script.log("no sequence selected");}
  132. }
  133. /////////////////////////// HELPERS /////////////////////////////////
  134. function printMethodsAndProperties(obj){
  135. script.log(" ");
  136. // var name = obj.getControlAddress() == undefined ? "object" : obj.getControlAddress();
  137. var name = "object";
  138. script.log(" METHODS OF " + name);
  139. var methods = util.getObjectMethods(obj);
  140. for(var i=0 ; i<methods.length ; i++){
  141. script.log(" "+ methods[i]);
  142. }
  143. script.log(" PARAMETERS OF " + name);
  144. var props = util.getObjectProperties(obj, true, false);
  145. for(var i=0 ; i<props.length ; i++){
  146. script.log(" "+ props[i]);
  147. }
  148. script.log(" OBJECTS OF " + name);
  149. var props = util.getObjectProperties(obj, false, true);
  150. for(var i=0 ; i<props.length ; i++){
  151. script.log(" "+ props[i]);
  152. }
  153. }
  154. function printKeys(){
  155. var seq = root.sequences.sequence.layers.mapping.automation.getItems() ;
  156. if(seq.length){
  157. for(var i=0; i<seq.length; i++){
  158. script.log (">> "+seq[i].name + " " + seq[i].position.get() + " " + seq[i].listSize.get() );
  159. }
  160. }
  161. else{script.log("nothing to print");}
  162. }
  163. /////////////////////// PARAMETERS FUNCTIONS ///////////////////////
  164. // Module callback
  165. function moduleParameterChanged(param){
  166. parametersPath = local.getChild("parameters") ;
  167. script.log("received module param :" + param.name);
  168. if (param.is(parametersPath.importExport.sequenceFile)) {}
  169. else if (param.is(parametersPath.importExport.importSequence)){importSequenceFile(parametersPath.importExport.sequenceFile);}
  170. else if (param.is(parametersPath.importExport.exportSequence)) {
  171. exportSequenceFile(parametersPath.importExport.sequenceFile);
  172. exportSequenceFile(saveFile);
  173. }
  174. else if (param.is(parametersPath.synchronize)){updateSynchronize();}
  175. else if (param.is(parametersPath.syncRate)){updateSyncRate();}
  176. else if (param.is(parametersPath.monitorKeysCues)){monitorKeysCues();}
  177. else if (param.is(parametersPath.clearSequence)){seq_clearSequence();}
  178. else if (param.is(parametersPath.reorderSequence)){seq_reorderSequence();}
  179. else if (param.is(parametersPath.changeSequence)){refreshSequenceEnum();}
  180. else if (param.is(parametersPath.sequence)){
  181. sequence = sequencePath.getKey();
  182. if(sequence!=""){
  183. script.log("watching "+ sequence);
  184. local.parameters.sequence.setAttribute("readonly",true);
  185. }
  186. }
  187. else{script.log("received module param :" + param.name);}
  188. }
  189. function updateSynchronize(){
  190. // var parametersPath = local.getChild("parameters") ;
  191. doSync = parametersPath.synchronize.get();
  192. script.log(doSync ? "sync ON" : "sync OFF" );
  193. }
  194. function updateSyncRate(){
  195. // var parametersPath = local.getChild("parameters") ;
  196. syncRatems = parametersPath.syncRate.get() / 1000.;
  197. script.log("new sync rate : " + syncRatems);
  198. // script.setUpdateRate(syncRatems);
  199. }
  200. function monitorKeysCues(){
  201. // var parametersPath = local.getChild("parameters") ;
  202. doSyncKeysCues = parametersPath.monitorKeysCues.get() ;
  203. script.log(doSyncKeysCues ? "syncKeys ON" : "syncKeys OFF" );
  204. // script.setUpdateRate(syncRatems);
  205. }
  206. //refresh Enum
  207. function refreshSequenceEnum(){
  208. script.log("refresh list of sequences");
  209. local.parameters.sequence.setAttribute("readonly",false);
  210. if(root.sequences.getItems().length){
  211. local.parameters.sequence.removeOptions();
  212. local.parameters.sequence.addOption("", 0);
  213. for(var i=0 ; i<root.sequences.getItems().length ; i++ ){
  214. local.parameters.sequence.addOption(root.sequences.getItems()[i].name,i+1);
  215. }
  216. }
  217. }
  218. function importSequenceFile(loadFile){
  219. script.setExecutionTimeOut(60);
  220. doSync = false ;
  221. script.log("loading file "+loadFile.get());
  222. loadData = loadFile.readFile(true);
  223. //load parameters
  224. var parameters = local.getChild("parameters");
  225. parameters.syncRate.set(loadData.parameters['Sync Rate']);
  226. parameters.synchronize.set(loadData.parameters['Synchronize']);
  227. parameters.monitorKeysCues.set(loadData.parameters['monitorKeysCues']);
  228. sequence = loadData.parameters.Sequence;
  229. if(true){
  230. parameters.sequence.removeOptions();
  231. parameters.sequence.addOption(sequence,0);
  232. parameters.sequence.setAttribute("readonly", true);
  233. // script.log(parameters.synchronize.get());
  234. //
  235. //check if Sequence already exists in sequences manager, else create it
  236. var tl_sequence = root.sequences.getItemWithName(sequence) ;
  237. if(tl_sequence == undefined){
  238. tl_sequence = root.sequences.addItem();
  239. tl_sequence.setName(sequence);
  240. }
  241. script.log(tl_sequence.name);
  242. //recreate cues
  243. tl_sequence.cues.removeAll();
  244. var cuesList = util.getObjectProperties(loadData.values.keys['cues'], false, true);
  245. script.log("create cues : "+ cuesList.length);
  246. if(cuesList.length){
  247. for(var i=0; i<cuesList.length; i++){
  248. var cue = tl_sequence.cues.addItem();
  249. cue.setName(cuesList[i]);
  250. cue.time.set(loadData.values.keys.cues[cuesList[i]]);
  251. script.log("created cue "+ cuesList[i]);
  252. }
  253. }
  254. //recreate layers and keys
  255. tl_sequence.layers.removeAll();
  256. printMethodsAndProperties(loadData.values.keys['layers']);
  257. var layersList = util.getObjectProperties(loadData.values.keys['layers'], true, false);
  258. script.log("create layers : "+ layersList.length);
  259. if(layersList.length){
  260. for(var i=0; i<layersList.length; i++ ){
  261. var layerType = loadData.values.keys.layers[layersList[i]].type ;
  262. var layer = tl_sequence.layers.addItem(layerType);
  263. script.log("create layer : ("+ layerType+") "+layersList[i]);
  264. layer.setName(layersList[i]);
  265. var keysList = util.getObjectProperties(loadData.values.keys.layers[layersList[i]], true, false);
  266. script.log("create keys : "+ keysList.length);
  267. if(keysList.length){
  268. if (layerType != "Audio"){
  269. for(var j=0; j<keysList.length; j++){
  270. var key = layer.automation.addItem();
  271. key.setName(keysList[j]);
  272. key.value.set(loadData.values.keys.layers[layersList[i]][keysList[j]].value);
  273. key.position.set(loadData.values.keys.layers[layersList[i]][keysList[j]].time);
  274. }
  275. layer.automation.reorderItems();
  276. }
  277. else {
  278. for(var j=0; j<keysList.length; j++){
  279. var clip = layer.clips.addItem();
  280. clip.setName(keysList[j]);
  281. clip.filePath.set(loadData.values.keys.layers[layersList[i]][keysList[j]].filePath);
  282. clip.startTime.set(loadData.values.keys.layers[layersList[i]][keysList[j]].startTime);
  283. }
  284. }
  285. }
  286. }
  287. }
  288. //recreate groups
  289. var groupList = util.getObjectProperties(loadData.values.groups, true, false);
  290. if(groupList.length){
  291. for(var i=0; i<groupList.length; i++){
  292. var group = local.getChild("Values").groups.addContainer(groupList[i]);
  293. var groupLayers = util.getObjectProperties(loadData.values.groups[groupList[i]], true, false);
  294. var cue = group.addFloatParameter("cue", "", 0., 0.);
  295. group.setName(groupList[i]);
  296. cue.set(loadData.values.groups[groupList[i]].time);
  297. if(loadData.values.groups[groupList[i]].timeOut!=undefined){
  298. var cueOut = group.addFloatParameter("cueOut", "", 0., 0.);
  299. cueOut.set(loadData.values.groups[groupList[i]].timeOut);
  300. }
  301. var groupKeysList = util.getObjectProperties(loadData.values.groups[groupList[i]].groupKeys, true, false);
  302. if (groupKeysList.length){
  303. var keysContainer = group.addContainer("keys");
  304. keysContainer.setCollapsed(true);
  305. var keysContainerOut ;
  306. if(loadData.values.groups[groupList[i]].timeOut!=undefined){
  307. keysContainerOut = group.addContainer("keysOut");
  308. }
  309. for (var j=0; j<groupKeysList.length; j++){
  310. group.addFloatParameter(groupKeysList[j], "", 0., 0., 1.);
  311. keysContainer.addStringParameter(groupKeysList[j], "", loadData.values.groups[groupList[i]]['groupKeys'][groupKeysList[j]]['key']);
  312. if(loadData.values.groups[groupList[i]].timeOut!=undefined){
  313. keysContainerOut.addStringParameter(groupKeysList[j], "", loadData.values.groups[groupList[i]]['groupKeys'][groupKeysList[j]]['key']+"o");
  314. }
  315. }
  316. }
  317. }
  318. }
  319. // script.log(layersList[0]);
  320. // updateSynchronize() ;
  321. }
  322. doSync = true;
  323. script.setExecutionTimeOut(5);
  324. }
  325. function exportSequenceFile(fileObj){
  326. script.log("exporting file");
  327. var exportData = {parameters:{}, values:{groups:{}, keys:{cues:{}, layers:{}}}};
  328. //collect parameters
  329. var parameters = local.getChild("parameters");
  330. exportData.parameters["Sequence"] = parameters.sequence.getKey();
  331. exportData.parameters["Synchronize"] = parameters.synchronize.get();
  332. exportData.parameters["Sync Rate"] = parameters.syncRate.get();
  333. exportData.parameters["monitorKeysCues"] = parameters.monitorKeysCues.get();
  334. //collect values
  335. var values = local.getChild("values");
  336. //groups
  337. var groups = values.groups;
  338. var groupsList=util.getObjectProperties(groups, true, false);
  339. if(groupsList.length){
  340. for(var i=0; i<groupsList.length; i++){
  341. var exportGroup = exportData.values.groups[groupsList[i]] = {cue:"", time:0., groupKeys:{}};
  342. var currentGroup = groups.getChild(groupsList[i]);
  343. exportGroup.cue = currentGroup.name;
  344. exportGroup.time = currentGroup.cue.get();
  345. var isInOut = currentGroup.getChild("keysOut") ;
  346. if(isInOut){
  347. exportGroup.cueOut = currentGroup.name+"o";
  348. exportGroup.timeOut = currentGroup.cueOut.get();
  349. }
  350. var currentGroupLayers = util.getObjectProperties(currentGroup.keys, true, false);
  351. if (currentGroupLayers.length){
  352. for(var j=0; j<currentGroupLayers.length; j++){
  353. // script.log(groupsList[i]+ " "+ currentGroupLayers[j]);
  354. exportGroup.groupKeys[currentGroupLayers[j]] = {key:"", value:0};
  355. exportGroup.groupKeys[currentGroupLayers[j]].value = currentGroup.getChild(currentGroupLayers[j]).get();
  356. exportGroup.groupKeys[currentGroupLayers[j]].key = currentGroup.keys.getChild(currentGroupLayers[j]).get();
  357. }
  358. }
  359. }
  360. }
  361. // var cues = values.keys.cues;
  362. // var cuesList=util.getObjectProperties(cues, true, false);
  363. // if(cuesList.length){
  364. // for(var i=0; i<cuesList.length; i++){
  365. // var exportCue = exportData.values.keys.cues[cuesList[i]] = {cue:"", time:0.};
  366. // exportCue.cue = cuesList[i];
  367. // exportCue.time = cues.getChild(cuesList[i]).time.get();
  368. // }
  369. // }
  370. // var layers = values.keys.layers;
  371. // var layersList=util.getObjectProperties(layers, true, false);
  372. // if(layersList.length){
  373. // for(var i=0; i<layersList.length; i++){
  374. // var exportLayer = exportData.values.keys.layers[layersList[i]] = {};
  375. // var currentLayer = layers.getChild(layersList[i]);
  376. // var currentLayersKeys = util.getObjectProperties(currentLayer, true, false);
  377. // exportLayer["type"] = values.keys.layerTypes.getChild(layersList[i]).get();
  378. // if (currentLayersKeys.length){
  379. // for(var j=0; j<currentLayersKeys.length; j++){
  380. // if (exportLayer["type"]!= "Audio"){
  381. // if(currentLayersKeys[j]!="type"){
  382. // // script.log(currentLayersKeys[j]);
  383. // // script.log(groupsList[i]+ " "+ currentGroupLayers[j]);
  384. // exportLayer[currentLayersKeys[j]] = {key:"", value:0., time:0.};
  385. // exportLayer[currentLayersKeys[j]].value = currentLayer.getChild(currentLayersKeys[j]).value.get();
  386. // exportLayer[currentLayersKeys[j]].key = currentLayer.getChild(currentLayersKeys[j]).name;
  387. // exportLayer[currentLayersKeys[j]].time = currentLayer.getChild(currentLayersKeys[j]).time.get();
  388. // }
  389. // }
  390. // else {
  391. // exportLayer[currentLayersKeys[j]] = {clip:"", filePath:0., startTime:0.};
  392. // exportLayer[currentLayersKeys[j]].filePath = currentLayer.getChild(currentLayersKeys[j]).filePath.get();
  393. // exportLayer[currentLayersKeys[j]].clip = currentLayer.getChild(currentLayersKeys[j]).name;
  394. // exportLayer[currentLayersKeys[j]].startTime = currentLayer.getChild(currentLayersKeys[j]).startTime.get();
  395. // }
  396. // }
  397. // }
  398. // }
  399. // }
  400. //export cues and layers from tl
  401. var tl_seq = root.sequences.getItemWithName(sequence);
  402. var tl_cues = tl_seq.cues.getItems();
  403. if (tl_cues.length){
  404. for(var i=0; i<tl_cues.length; i++){
  405. exportData.values.keys.cues[tl_cues[i].name] = tl_cues[i].time.get();
  406. }
  407. }
  408. var tl_layers = tl_seq.layers.getItems();
  409. if (tl_layers.length){
  410. for(var i=0; i<tl_layers.length; i++){
  411. exportData.values.keys.layers[tl_layers[i].name] = {type:tl_layers[i].getType()};
  412. if(tl_layers[i].getType()=="Mapping"){
  413. var keys = tl_layers[i].automation.getItems();
  414. if(keys.length){
  415. for(var j=0; j<keys.length; j++){
  416. exportData.values.keys.layers[tl_layers[i].name][keys[j].name] = {value: keys[j].value.get(), time:keys[j].position.get()};
  417. }
  418. }
  419. }
  420. else if(tl_layers[i].getType()=="Audio"){
  421. var keys = tl_layers[i].clips.getItems();
  422. if(keys.length){
  423. for(var j=0; j<keys.length; j++){
  424. exportData.values.keys.layers[tl_layers[i].name][keys[j].name] = {filePath: keys[j].filePath.get(), startTime:keys[j].startTime.get()};
  425. }
  426. }
  427. }
  428. }
  429. }
  430. // exportData.groups
  431. fileObj.writeFile(JSON.stringify(exportData), true);
  432. }
  433. /////////////////////// VALUES FUNCTIONS ///////////////////////
  434. /* Values hold all keys, presented in group containers
  435. a nogroup container shows keys that are not grouped
  436. */
  437. // Value callback
  438. function moduleValueChanged(value){
  439. if(!inibValuesChanged){
  440. doSync = false;
  441. //script.log(value.getParent().name);
  442. //here add actions for values that are also auto-updated, (groupKey values, times ets
  443. // they will prevent auto update while manipulated manually
  444. doSync = true;
  445. }
  446. if (value.is(local.values.newGroup.create)){createNewGroup();}
  447. if (value.is(local.values.newGroup.createInOut)){createNewGroup(1);}
  448. // script.log(value.getParent().name);
  449. // if(value.getParent().name = "cue"){script.log("changed");}
  450. // if (value.name == "addGroup"){createNewGroup();}
  451. }
  452. function struct_rebuildValues(){
  453. //build cues if needed
  454. var tl_cues = tl_seq.cues.getItems();
  455. cues = local.getChild("values").keys.cues ;
  456. var cuesList = util.getObjectProperties(cues, true, false);
  457. // script.log("cueList : " +cuesList.length);
  458. // script.log("tl List : " +tl_cues.length);
  459. if (cuesList.length != tl_cues.length){
  460. var delta = cuesList.length-tl_cues.length;
  461. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  462. delta = Math.abs(delta);
  463. script.log("cues "+ delta + (addRemove ? " up" : " down"));
  464. for(var i=0; i<delta; i++){
  465. // script.log(i);
  466. if(addRemove){
  467. var newCue = cues.addContainer("newCue"+i);
  468. newCue.addFloatParameter("time", "position in time", 0., 0.);
  469. newCue.setCollapsed(true);
  470. }
  471. else {
  472. // script.log(util.getObjectProperties(cues, true, false)[0]);
  473. cues.removeContainer(util.getObjectProperties(cues, true, false)[i]);
  474. }
  475. // cuesList = ;
  476. }
  477. hasUpdated = true;
  478. }
  479. //update cues
  480. cues = local.getChild("values").keys.cues ;
  481. var cuesList = util.getObjectProperties(cues, true, false);
  482. if(tl_cues.length){
  483. for (var i=0; i<tl_cues.length; i++){
  484. var currentCue = cues.getChild(cuesList[i]);
  485. currentCue.setName(tl_cues[i].name);
  486. currentCue.time.set(tl_cues[i].time.get());
  487. }
  488. }
  489. //build layers if needed
  490. var layersChanged = false ;
  491. var tl_layers = tl_seq.layers.getItems();
  492. var layers = local.getChild("values").keys.layers ;
  493. var layersList = util.getObjectProperties(layers, true, false);
  494. if (layersList.length != tl_layers.length){
  495. layersChanged = true ;
  496. var delta = layersList.length-tl_layers.length;
  497. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  498. delta = Math.abs(delta);
  499. script.log("layers "+ delta + (addRemove ? " up" : " down"));
  500. for(var i=0; i<delta; i++){
  501. // script.log(i);
  502. if(addRemove){
  503. var newLayer = layers.addContainer("newLayer"+i);
  504. // newLayer.addFloatParameter("time", "position in time", 0., 0.);
  505. local.getChild("values").keys.layerTypes.addStringParameter("newLayer"+i, "", "");
  506. newLayer.setCollapsed(true);
  507. local.getChild("values").newGroup.layers.addFloatParameter("newLayer"+i, "value for this layer at group creation", 0., 0., 1.);
  508. // if (tl_layers[i].getType()!="Audio"){
  509. // local.getChild("values").newGroup.layers.addFloatParameter("newLayer"+i, "value for this layer at group creation", 0., 0., 1.);
  510. // }
  511. }
  512. else {
  513. // script.log(util.getObjectProperties(layers, true, false)[0]);
  514. layers.removeContainer(util.getObjectProperties(layers, true, false)[i]);
  515. local.getChild("values").newGroup.layers.removeParameter(util.getObjectProperties(layers, true, false)[i]);
  516. local.getChild("values").newGroup.layers.setCollapsed(true);
  517. local.getChild("values").newGroup.layers.setCollapsed(false);
  518. local.getChild("values").keys.layerTypes.removeParameter(util.getObjectProperties(layers, true, false)[i]);
  519. local.getChild("values").keys.layerTypes.setCollapsed(true);
  520. local.getChild("values").keys.layerTypes.setCollapsed(false);
  521. }
  522. // cuesList = ;
  523. }
  524. hasUpdated = true;
  525. }
  526. //update layers value if there was a change in structure
  527. if(layersChanged){
  528. layers = local.getChild("values").keys.layers ;
  529. var layerList = util.getObjectProperties(layers, true, false);
  530. layerTypes = local.getChild("values").keys.layerTypes ;
  531. var layerTypeList = util.getObjectProperties(layerTypes, true, false);
  532. var template = local.getChild("values").newGroup.layers;
  533. var layerTemplate = util.getObjectProperties(template, true, false);
  534. if(tl_layers.length){
  535. var layer_offset = 0 ;
  536. for (var i=0; i<tl_layers.length; i++){
  537. var currentLayer = layers.getChild(layerList[i]);
  538. // currentLayer.getChild("type").set(tl_layers[i].getType());
  539. currentLayer.setName(tl_layers[i].name);
  540. var currentLayerType = layerTypes.getChild(layerTypeList[i]);
  541. currentLayerType.setName(tl_layers[i].name);
  542. currentLayerType.set(tl_layers[i].getType());
  543. var currentTemplate = template.getChild(layerTemplate[i]) ;
  544. if (tl_layers[i].getType()=="Audio"){layer_offset+=1;}
  545. currentTemplate.setName(tl_layers[i+layer_offset].name);
  546. }
  547. }
  548. }
  549. //build keys if needed
  550. layers = local.getChild("values").keys.layers ;
  551. layersList = util.getObjectProperties(layers, true, false);
  552. if(layersList.length){
  553. for(var layerIndex=0; layerIndex<layersList.length; layerIndex++){
  554. // script.log(layersList[layerIndex]);
  555. var currentLayer = layers.getChild(layersList[layerIndex]);
  556. var keyList = util.getObjectProperties(currentLayer, true, false);
  557. var tl_lay = tl_seq.layers.getItemWithName(layersList[layerIndex]);
  558. var tl_keys;
  559. //test keys for automation layers
  560. if(tl_lay.automation!=undefined){
  561. tl_keys = tl_lay.automation.getItems();
  562. //rebuild key structure for currentLayer
  563. if (keyList.length != tl_keys.length){
  564. var delta = keyList.length-tl_keys.length;
  565. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  566. delta = Math.abs(delta);
  567. script.log("keys "+ delta + (addRemove ? " up" : " down"));
  568. for(var i=0; i<delta; i++){
  569. // script.log(i);
  570. if(addRemove){
  571. var newKey = currentLayer.addContainer("newkey"+i);
  572. newKey.addFloatParameter("time", "position in time", 0., 0.);
  573. newKey.addFloatParameter("value", "vertical value", 0., 0.);
  574. newKey.setCollapsed(true);
  575. }
  576. else {
  577. // script.log(util.getObjectProperties(currentLayer, true, false)[0]);
  578. currentLayer.removeContainer(util.getObjectProperties(currentLayer, true, false)[i]);
  579. }
  580. }
  581. hasUpdated = true;
  582. }
  583. }
  584. //test clips for audio layer
  585. var tl_clips ;
  586. if(tl_lay.clips!=undefined){
  587. tl_clips = tl_lay.clips.getItems();
  588. //rebuild key structure for currentLayer, "keyList" holds clips
  589. if (keyList.length != tl_clips.length){
  590. var delta = keyList.length-tl_clips.length;
  591. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  592. delta = Math.abs(delta);
  593. script.log("clips "+ delta + (addRemove ? " up" : " down"));
  594. for(var i=0; i<delta; i++){
  595. // script.log(i);
  596. if(addRemove){
  597. var newClip = currentLayer.addContainer("newclip"+i);
  598. newClip.addFileParameter("File Path", "sound file");
  599. newClip.addFloatParameter("start Time", "", 0., 0.);
  600. newClip.setCollapsed(true);
  601. }
  602. else {
  603. // script.log(util.getObjectProperties(currentLayer, true, false)[0]);
  604. currentLayer.removeContainer(util.getObjectProperties(currentLayer, true, false)[i]);
  605. }
  606. }
  607. hasUpdated = true;
  608. }
  609. }
  610. currentLayer = layers.getChild(layersList[layerIndex]);
  611. keyList = util.getObjectProperties(currentLayer, true, false);
  612. //update values for currentLayer
  613. if(tl_keys.length){
  614. for(var i=0; i<tl_keys.length; i++){
  615. var currentKey = currentLayer.getChild(keyList[i]);
  616. currentKey.setName(tl_keys[i].name);
  617. currentKey.time.set(tl_keys[i].position.get());
  618. currentKey.value.set(tl_keys[i].value.get());
  619. }
  620. }
  621. if(tl_clips.length){
  622. for(var i=0; i<tl_clips.length; i++){
  623. var currentKey = currentLayer.getChild(keyList[i]);
  624. currentKey.setName(tl_clips[i].name);
  625. currentKey.filePath.set(tl_clips[i].filePath.get());
  626. currentKey.startTime.set(tl_clips[i].startTime.get());
  627. }
  628. }
  629. }
  630. }
  631. }
  632. function struct_rebuildGroupLayers(){
  633. var groupsUpdated = false;
  634. var tl_layers = tl_seq.layers.getItems();
  635. layers = local.getChild("values").newGroup.layers ;
  636. var layersList = util.getObjectProperties(layers, true, false);
  637. if (layersList.length != tl_layers.length){
  638. groupsUpdated = true;
  639. var delta = layersList.length-tl_layers.length;
  640. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  641. delta = Math.abs(delta);
  642. script.log("Group layers "+ delta + (addRemove ? " up" : " down"));
  643. for(var i=0; i<delta; i++){
  644. // script.log(i);
  645. if(addRemove){
  646. local.getChild("values").newGroup.layers.addFloatParameter("newLayer"+i, "value for this layer at group creation", 0., 0., 1.);
  647. }
  648. else {
  649. local.getChild("values").newGroup.layers.removeParameter(util.getObjectProperties(layers, true, false)[i]);
  650. local.getChild("values").newGroup.layers.setCollapsed(true);
  651. local.getChild("values").newGroup.layers.setCollapsed(false);
  652. }
  653. // cuesList = ;
  654. }
  655. }
  656. var template = local.getChild("values").newGroup.layers;
  657. var layerTemplate = util.getObjectProperties(template, true, false);
  658. if (groupsUpdated){
  659. if(tl_layers.length){
  660. for (var i=0; i<tl_layers.length; i++){
  661. var currentTemplate = template.getChild(layerTemplate[i]) ;
  662. currentTemplate.setName(tl_layers[i].name);
  663. }
  664. }
  665. }
  666. }
  667. //rebuild values.keys structure from sequence
  668. function struct_updateValuesFromSeq(){
  669. inibValuesChanged = true;
  670. var hasUpdated = false ;
  671. var tl_seq = root.sequences.getItemWithName(sequence);
  672. if(tl_seq.name!="undefined"){
  673. //Sync values structure
  674. if(doSyncKeysCues) {struct_rebuildValues();}
  675. else{struct_rebuildGroupLayers();}
  676. //Groups management
  677. tl_seq = root.sequences.getItemWithName(sequence);
  678. var groups = local.getChild("values").groups ;
  679. var groupList = util.getObjectProperties(groups, true, false);
  680. // printMethodsAndProperties(tl_seq.cues.getItemWithName("group0"));
  681. if(groupList.length){
  682. for (var i = 0; i<groupList.length; i++){
  683. //check if cue exist, else remove group
  684. // script.log(groupList[i]);
  685. //v1, remove cue doesn't remove group keys
  686. // var groupCue = tl_seq.cues.getItemWithName(groupList[i]);
  687. // if(groupCue.name==undefined){
  688. // script.log("cue " + groupList[i] + "not found, removing group (keys survive this)");
  689. // groups.removeContainer(groupList[i]);
  690. // hasUpdated = true;
  691. // break;
  692. // }
  693. //check if group has out
  694. var isInOut = groups.getChild(groupList[i]).getChild("keysOut") ;
  695. //v2, remove cue removes group keys
  696. var groupCue = tl_seq.cues.getItemWithName(groupList[i]);
  697. if(groupCue.name==undefined){
  698. script.log("cue " + groupList[i] + "not found, removing keys and group");
  699. if(isInOut){tl_seq.cues.removeItem(groupList[i]+"o");}
  700. var groupToRemove = groups.getChild(groupList[i]);
  701. var groupToRemoveKeyslist = util.getObjectProperties(groupToRemove.keys, true, false);
  702. for(var removeKeyIndex = 0; removeKeyIndex< groupToRemoveKeyslist.length; removeKeyIndex++) {
  703. var tl_removeLayer = tl_seq.layers.getItemWithName( groupToRemoveKeyslist[removeKeyIndex]) ;
  704. var tl_removeKey = tl_removeLayer.automation.getItemWithName(groupToRemove.keys.getChild( groupToRemoveKeyslist[removeKeyIndex]).get());
  705. // script.log(tl_removeKey.name);
  706. tl_removeLayer.automation.removeItem(tl_removeKey);
  707. var tl_removeKeyOut ;
  708. if(isInOut) {
  709. tl_removeKeyOut = tl_removeLayer.automation.getItemWithName(groupToRemove.keys.getChild( groupToRemoveKeyslist[removeKeyIndex]).get()+"o");
  710. tl_removeLayer.automation.removeItem(tl_removeKeyOut);
  711. }
  712. }
  713. groups.removeContainer(groupList[i]);
  714. hasUpdated = true;
  715. break;
  716. }
  717. //else check at key level
  718. else {
  719. groups = local.getChild("values").groups ;
  720. groupList = util.getObjectProperties(groups, true, false);
  721. var currentGroup = groups.getChild(groupList[i]);
  722. var currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  723. //update cue time
  724. var groupTime = groupCue.time.get();
  725. currentGroup.cue.set(groupTime);
  726. var groupCueOut;
  727. var groupTimeOut ;
  728. if(isInOut){
  729. groupCueOut = tl_seq.cues.getItemWithName(groupList[i]+"o");
  730. groupTimeOut = groupCueOut.time.get();
  731. currentGroup.cueOut.set(groupTimeOut);
  732. }
  733. if (currentGroupLayers.length){
  734. // script.log(currentGroupLayers.length);
  735. for(var j=0; j<currentGroupLayers.length; j++){
  736. // script.log("in loop" + j);
  737. groups = local.getChild("values").groups ;
  738. groupList = util.getObjectProperties(groups, true, false);
  739. currentGroup = groups.getChild(groupList[i]);
  740. currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  741. var tl_layer = tl_seq.layers.getItemWithName(currentGroupLayers[j]);
  742. var keyName = currentGroup.keys.getChild(tl_layer.name).get();
  743. // script.log(tl_layer.name + " " +tl_layer.automation.getItemWithName(keyName).name);
  744. //if key dosn't exist anymore, remove it from group
  745. // if(tl_layer.automation.getItemWithName(keyName).name == undefined){
  746. // groups = local.getChild("values").groups ;
  747. // groupList = util.getObjectProperties(groups, true, false);
  748. // currentGroup = groups.getChild(groupList[i]);
  749. // currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  750. // tl_layer = tl_seq.layers.getItemWithName(currentGroupLayers[j]);
  751. // keyName = currentGroup.keys.getChild(tl_layer.name).get();
  752. // script.log("should remove" + currentGroup.name + " " + currentGroupLayers[j]);
  753. // currentGroup.keys.removeParameter(currentGroupLayers[j]);
  754. // currentGroup.removeParameter(currentGroupLayers[j]);
  755. // currentGroup.setCollapsed(true);
  756. // currentGroup.setCollapsed(false);
  757. // hasUpdated = true;
  758. // }
  759. //if key exists, update value from tl and update time from group cue
  760. if(tl_layer.automation.getItemWithName(keyName).name != undefined){
  761. //apply groupTime
  762. var tl_key = tl_layer.automation.getItemWithName(keyName);
  763. tl_key.position.set(groupTime);
  764. //get tl value
  765. var keyValue = tl_key.value.get();
  766. var currentKey = currentGroup.getChild(tl_layer.name);
  767. // script.log(tl_layer.name + " " +keyName+" " + keyValue);
  768. // script.log(currentKey.name + " " +keyName+" " + keyValue);
  769. currentKey.set(keyValue);
  770. // script.log(currentKey.get());
  771. if(isInOut){
  772. var tl_keyOut = tl_layer.automation.getItemWithName(keyName+"o");
  773. tl_keyOut.position.set(groupTimeOut);
  774. //set keyOut value to keyIn value
  775. tl_keyOut.value.set(keyValue);
  776. }
  777. }
  778. }
  779. }
  780. // //if cue doesn't exist, remove whole group
  781. // if(tl_layers.length){
  782. // for (var j=0; j<tl_layers.length; j++){
  783. // if(!tl_layers[j].automation.getItemWithName(groupList[i])){
  784. // script.log("key " + groupList[i] + "not found, removing group (keys survive this)");
  785. // groups.removeContainer(groupList[i]);}
  786. // hasUpdated = true;
  787. // }
  788. // }
  789. //update group values
  790. }
  791. }
  792. }
  793. inibValuesChanged = false;
  794. return hasUpdated;
  795. }
  796. }
  797. // function rebuildValuesStructure() {
  798. // script.log("updating values structure");
  799. // //empty current structure
  800. // // local.values.removeAll();
  801. // local.getChild("Values").removeContainer("newGroup");
  802. // local.getChild("Values").removeContainer("groups");
  803. // local.getChild("Values").removeContainer("ungrouped");
  804. // //rebuild containers
  805. // var ng_cont = local.values.addContainer("New group");
  806. // var g_cont = local.values.addContainer("groups");
  807. // var ug_cont = local.values.addContainer("ungrouped");
  808. // // rebuild new group
  809. // ng_cont.addTrigger("add group", "adds a new group at cursor time with below values");
  810. // ng_cont.addFloatParameter("group time", "time position where the group will be created ", 0., 0.);
  811. // var layer_cont = ng_cont.addContainer("layers values");
  812. // var layers = util.getObjectProperties(sequence_structure.keys.layers) ;
  813. // for (var i=0; i<layers.length; i++){
  814. // //add a float value in each layer for group creation
  815. // layer_cont.addFloatParameter(layers[i], "", 0., 0., 1.);
  816. // ug_cont.addContainer(layers[i]);
  817. // }
  818. // //rebuild keys grouped/ungrouped
  819. // //first create group containers in groups
  820. // // //then create layer containers in ungrouped
  821. // // var layer_cont = ug_cont.addContainer("layers values");
  822. // }
  823. /////////////////////// TIMELINE FUNCTIONS ///////////////////////
  824. function seq_clearSequence(){
  825. var seq = root.sequences.getItemWithName(sequence) ;
  826. script.log("clearing all keys and cues of sequence : "+seq.name);
  827. seq.cues.removeAll();
  828. var layers = seq.layers.getItems();
  829. if(layers.length){
  830. for (var i = 0; i<layers.length; i++){
  831. if(layers[i].automation){layers[i].automation.removeAll();}
  832. if(layers[i].clips){layers[i].clips.removeAll();}
  833. }
  834. }
  835. //clear all groups
  836. var groups = local.getChild("values").groups;
  837. var groupsList = util.getObjectProperties(groups, true, false);
  838. if (groupsList.length){
  839. for(var i=0; i<groupsList.length; i++){
  840. groups.removeContainer(groupsList[i]);
  841. }
  842. }
  843. }
  844. function seq_reorderSequence(){
  845. var seq = root.sequences.getItemWithName(sequence) ;
  846. script.log("reordering sequence : "+seq.name);
  847. var layers = seq.layers.getItems();
  848. if(layers.length){
  849. for (var i = 0; i<layers.length; i++){
  850. if(layers[i].automation){layers[i].automation.reorderItems();}
  851. if(layers[i].clips){layers[i].clips.reorderItems();}
  852. }
  853. }
  854. }
  855. //use Values structure to rebuild the sequence
  856. function seq_buildSeqFromValues(){}
  857. //use file to rebuild sequence
  858. function seq_buildSeqFromFile(){}
  859. function seq_MoveCurrentTime(deltaSeconds){
  860. var tl_seq = root.sequences.getItemWithName(sequence);
  861. var currentTime = tl_seq.currentTime.get();
  862. tl_seq.currentTime.set(currentTime + deltaSeconds);
  863. }
  864. function createNewGroup(isInOut){
  865. doSync = false ;
  866. script.log("create new group");
  867. //create a cue and a key in each layer at cursor position in selected sequence
  868. var groups = local.getChild("values").groups;
  869. var groupsList = util.getObjectProperties(groups, true, false);
  870. // printMethodsAndProperties(groupsList);
  871. // var index = groupsList.length == undefined ? 0 : groupsList.length;
  872. var currentGroup;
  873. var tl_seq = root.sequences.getItemWithName(sequence);
  874. var tl_layers = tl_seq.layers.getItems();
  875. script.log(groupList.length);
  876. //Get current sequence time position and create cue at this position, with group name
  877. var currentTime = tl_seq.currentTime.get() ;
  878. // var currentTime = local.values.newGroup.groupTime.get();
  879. // script.log(currentTime);
  880. var newCue = tl_seq.cues.addItem();
  881. newCue.time.set(currentTime);
  882. //test for holes in the sequence to rename the cue
  883. for (var i=0; i<=groupsList.length+1; i++){
  884. if(tl_seq.cues.getChild(i)==undefined){
  885. newCue.setName(i);
  886. currentGroup = groups.addContainer(i);
  887. currentGroup.setCollapsed(true);
  888. script.log("create new group: "+i);
  889. break;
  890. }
  891. }
  892. currentGroup.addFloatParameter("cue", "cue of the group", currentTime, 0.);
  893. var keysContainer = currentGroup.addContainer("keys");
  894. var keysOutContainer = 0 ;
  895. if (isInOut){
  896. var newCueOut = tl_seq.cues.addItem();
  897. newCueOut.time.set(currentTime+5);
  898. newCueOut.setName(currentGroup.name+"o");
  899. currentGroup.addFloatParameter("cueOut", "cue out of the group", currentTime + 5., 0.);
  900. keysOutContainer = currentGroup.addContainer("keysOut");
  901. keysOutContainer.setCollapsed(true);
  902. }
  903. keysContainer.setCollapsed(true);
  904. tl_seq = root.sequences.getItemWithName(sequence);
  905. tl_layers = tl_seq.layers.getItems();
  906. // var struc_layers = util.getObjectProperties(sequence_structure.keys.layers);
  907. if(tl_layers.length){
  908. for(var i=0;i<tl_layers.length; i++ ){
  909. if(tl_layers[i].automation!=undefined){//only for mapping layers
  910. // script.log(sequence_structure.keys.layers[layers[i].name]);
  911. var newKeyValue = local.getChild("values").newGroup.layers.getChild(tl_layers[i].name).get();
  912. script.log(newKeyValue);
  913. var newKey = tl_layers[i].automation.addItem();
  914. newKey.position.set(currentTime);
  915. newKey.setName(currentGroup.name);
  916. // script.log(currentGroup.name); //local.getChild("values").newGroup.layers.getChild().name
  917. newKey.value.set(newKeyValue);
  918. // newKey.value.set(Math.random());
  919. keysContainer.addStringParameter(tl_layers[i].name, "",currentGroup.name );
  920. currentGroup.addFloatParameter(tl_layers[i].name,tl_layers[i].name+" value" , currentGroup.name, 0., 1.);
  921. // newKey.addStringParameter("group", "key is part of this group","mongroupe");
  922. if (isInOut){
  923. var newKeyOut = tl_layers[i].automation.addItem();
  924. newKeyOut.position.set(currentTime+5.);
  925. newKeyOut.setName(currentGroup.name+"o");
  926. newKeyOut.value.set(newKeyValue);
  927. // newKey.value.set(Math.random());
  928. keysOutContainer.addStringParameter(tl_layers[i].name, "",currentGroup.name+"o" );
  929. }
  930. tl_layers[i].automation.reorderItems();
  931. }
  932. }
  933. }
  934. doSync = true ;
  935. // seq = seq.getItems();
  936. }
  937. function seq_followCursor(){
  938. var tl_seq = root.sequences.getItemWithName(sequence);
  939. var tl_cursor = tl_seq.currentTime.get();
  940. var tl_totalTime = tl_seq.totalTime.get() ;
  941. var tl_startTime = tl_seq.viewStartTime.get();
  942. var tl_endTime = tl_seq.viewEndTime.get();
  943. //first check current viewTime and modify followZoom accordingly
  944. followZoom = (tl_startTime - tl_endTime) / tl_totalTime;
  945. // if(viewZoom.get()!=followZoom && tl_startTime && (tl_endTime != tl_totalTime) ) {viewZoom.set(followZoom);script.log(viewZoom);}
  946. //then update view position
  947. followZoom = viewZoom.get();
  948. var viewTime = followZoom * tl_totalTime ;
  949. var startTime = tl_cursor - viewTime/2. ;
  950. var endTime = tl_cursor + viewTime/2. ;
  951. tl_seq.viewStartTime.set(startTime);
  952. tl_seq.viewEndTime.set(endTime);
  953. }
  954. function seq_readZoomValue(){
  955. var tl_seq = root.sequences.getItemWithName(sequence);
  956. if(tl_seq != undefined){
  957. var tl_totalTime = tl_seq.totalTime.get() ;
  958. var tl_startTime = tl_seq.viewStartTime.get();
  959. var tl_endTime = tl_seq.viewEndTime.get();
  960. followZoom = (tl_startTime - tl_endTime) / tl_totalTime;
  961. return followZoom ;
  962. }
  963. }
  964. function seq_setLayerHeight(){
  965. if(sequence!=""){
  966. var tl_seq = root.sequences.getItemWithName(sequence);
  967. var tl_layers = tl_seq.layers.getItems() ;
  968. if(tl_layers.length){
  969. var height = layerHeight.get();
  970. for(var i=0; i< tl_layers.length ; i++){
  971. tl_layers[i].uiHeight.set(height);
  972. }
  973. }
  974. }
  975. }
  976. function seq_prevNextCue(prevNext){
  977. //use first layer keys to navigate
  978. if(sequence!=""){
  979. var tl_seq = root.sequences.getItemWithName(sequence);
  980. var tl_layer = tl_seq.layers.getItems()[0].automation;
  981. var tl_currentTime = tl_seq.currentTime.get() ;
  982. var currentKey = tl_layer.getKeyAtPosition(tl_currentTime);
  983. script.log(currentKey.name);
  984. var moveToKey ;
  985. if(prevNext){ moveToKey = tl_layer.getItemAfter(currentKey);}
  986. else{moveToKey = tl_layer.getItemBefore(currentKey);}
  987. //if there is a key go there, else go to currentkey
  988. if(moveToKey!=undefined){tl_seq.currentTime.set(moveToKey.position.get());}
  989. else{tl_seq.currentTime.set(currentKey.position.get());}
  990. }
  991. }