nodeskini 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3010 @@
1
+ "use hiphop"
2
+ "use hopscript"
3
+
4
+ require.lang = "hopscript";
5
+ var english = true;
6
+ var debug1 = true;
7
+
8
+ /**************************************
9
+
10
+ Octobre 2020
11
+
12
+ Dans ce fichier HipHop.js est décrit commme
13
+ une extension de JavaScript. Il ne s'agit donc
14
+ pas d'un générateur indépendant de JavaScript.
15
+
16
+ © Copyright 2019-2021, B. Petit-Heidelein
17
+
18
+ ****************************************/
19
+
20
+ /*****************************
21
+ Essai d'automate local mais pas
22
+ utile dans notre cas où l'automate est sur le serveur
23
+ *****************************/
24
+ /*const hh = require("hiphop");
25
+
26
+ hiphop module automate(in display, out toto){
27
+ loop{
28
+ await (display.now);
29
+ emit toto();
30
+ }
31
+ }
32
+
33
+ var HipHopMachine = new hh.ReactiveMachine(automate, "automate");
34
+
35
+ function runHH(){
36
+ HipHopMachine.react("display");
37
+ }
38
+ exports.runHH = runHH;
39
+
40
+ HipHopMachine.addEventListener("toto", function(evt) {
41
+ console.log("toto from HipHop");
42
+ });*/
43
+
44
+ /**************************
45
+
46
+ FONCTIONS
47
+
48
+ ***************************/
49
+ function entierAleatoire(min, max){
50
+ return Math.floor(Math.random() * (max - min + 1)) + min;
51
+ }
52
+
53
+ function isInList(val, liste){
54
+ for( var i=0; i < liste.length; i++){
55
+ if( liste[i] === val) return true;
56
+ }
57
+ return false;
58
+ }
59
+
60
+ /******************************************************************************
61
+
62
+ Créer une liste d'au maximum index éléments àa partir d'une liste de départ
63
+
64
+ *******************************************************************************/
65
+ function createRandomListe(index, liste){
66
+ // Protection sur une erreur de saisie du nombre de réservoirs
67
+ if(index > liste.length){
68
+ index = liste.length;
69
+ }
70
+ var premierAlea = entierAleatoire(1, index);
71
+ var deuxiemeAlea;
72
+ var listeResultat = [];
73
+ //console.log("premierAlea:", premierAlea);
74
+
75
+ for( var i=0; i < premierAlea; i++){
76
+ deuxiemeAlea = Math.floor(Math.random() * Math.floor(liste.length));
77
+ if(listeResultat.length === 0){
78
+ listeResultat.push(liste[deuxiemeAlea]);
79
+ }else{
80
+ while(true){
81
+ if(isInList(liste[deuxiemeAlea], listeResultat)){
82
+ deuxiemeAlea = Math.floor(Math.random() * Math.floor(liste.length));
83
+ continue;
84
+ }else{
85
+ listeResultat.push(liste[deuxiemeAlea]);
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ //console.log("deuxiemeAlea:",deuxiemeAlea, " el :", uneListe[deuxiemeAlea]);
91
+ }
92
+ return listeResultat;
93
+ }
94
+
95
+ /**************************
96
+
97
+ Les blocks HH
98
+
99
+ ***************************/
100
+
101
+ Blockly.defineBlocksWithJsonArray([
102
+ {
103
+ "type": "emit",
104
+ "message0": "emit signal %1",
105
+ "args0": [
106
+ {
107
+ "type": "input_value",
108
+ "name": "SIGNAL"
109
+ }
110
+ ],
111
+ "previousStatement": null,
112
+ "nextStatement": null,
113
+ "colour": 20,
114
+ "tooltip": "Emit",
115
+ "helpUrl": ""
116
+ }
117
+ ]);
118
+
119
+ Blockly.JavaScript['emit'] = function(block) {
120
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
121
+
122
+ // Ceci n'est pas beau, mais on utilise des mécanismes pour la génération de code JS
123
+ // Nous allons retouver ce travail de filtrage assez souvent.
124
+ // Dans le cas du développement d'un générteur propore à HH, ce sera au pire inutile
125
+ // mais ne devrait pas poser de problème.
126
+ let value = value_signal.replace(/\'|\(|\)/g, "");
127
+
128
+ var code = 'emit '+ value + '();\n';
129
+ return code;
130
+ };
131
+
132
+ Blockly.defineBlocksWithJsonArray([
133
+ {
134
+ "type": "sustain",
135
+ "message0": "sustain %1",
136
+ "args0": [
137
+ {
138
+ "type": "input_value",
139
+ "name": "SIGNAL"
140
+ }
141
+ ],
142
+ "previousStatement": null,
143
+ "nextStatement": null,
144
+ "colour": 20,
145
+ "tooltip": "sustain",
146
+ "helpUrl": ""
147
+ }
148
+ ]);
149
+
150
+ Blockly.JavaScript['sustain'] = function(block) {
151
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
152
+
153
+ // Ceci n'est pas beau, mais on utilise des mécanismes pour la génération de code JS
154
+ // Nous allons retouver ce travail de filtrage assez souvent.
155
+ // Dans le cas du développement d'un générteur propore à HH, ce sera au pire inutile
156
+ // mais ne devrait pas poser de problème.
157
+ let value = value_signal.replace(/\'|\(|\)/g, "");
158
+
159
+ var code = 'sustain '+ value + '();\n';
160
+ return code;
161
+ };
162
+
163
+ Blockly.defineBlocksWithJsonArray([
164
+ {
165
+ "type": "emit_value",
166
+ "message0": "emit signal %1 with value %2",
167
+ "args0": [
168
+ {
169
+ "type": "input_value",
170
+ "name": "SIGNAL",
171
+ "check": "String"
172
+ },
173
+ {
174
+ "type": "field_number",
175
+ "name": "Signal_Value",
176
+ "value": 0
177
+ }
178
+ ],
179
+ "previousStatement": null,
180
+ "nextStatement": null,
181
+ "colour": 20,
182
+ "tooltip": "Emit",
183
+ "helpUrl": ""
184
+ }
185
+ ]);
186
+
187
+ Blockly.JavaScript['emit_value'] = function(block) {
188
+ var number_signal_value = block.getFieldValue('Signal_Value');
189
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
190
+
191
+ let value = value_signal.replace(/\'|\(|\)/g, "");
192
+ var code = 'emit '+ value + '(' + number_signal_value + ');\n';
193
+ return code;
194
+ };
195
+
196
+ Blockly.defineBlocksWithJsonArray([
197
+ {
198
+ "type": "await_immediate",
199
+ "message0": "await immediate %1 ",
200
+ "args0": [
201
+ {
202
+ "type": "input_value",
203
+ "name": "SIGNAL",
204
+ "check": "String"
205
+ }
206
+ ],
207
+ "previousStatement": null,
208
+ "nextStatement": null,
209
+ "colour": 15,
210
+ "tooltip": "await",
211
+ "helpUrl": ""
212
+ }
213
+ ]);
214
+
215
+ Blockly.JavaScript['await_immediate'] = function(block) {
216
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
217
+
218
+ let value = value_signal.replace(/\'/g, "");
219
+ var code = 'await immediate (' + value + '.now);\n';
220
+ return code;
221
+ };
222
+
223
+ Blockly.defineBlocksWithJsonArray([
224
+ {
225
+ "type": "wait_for",
226
+ "message0": "wait for %1 signal %2",
227
+ "args0": [
228
+ {
229
+ "type": "field_number",
230
+ "name": "TIMES",
231
+ "value": 1,
232
+ "check": "Number"
233
+ },
234
+ {
235
+ "type": "input_value",
236
+ "name": "SIGNAL",
237
+ "check": "String"
238
+ }
239
+ ],
240
+ "previousStatement": null,
241
+ "nextStatement": null,
242
+ "colour": 20,
243
+ "tooltip": "await",
244
+ "helpUrl": ""
245
+ }
246
+ ]);
247
+
248
+ Blockly.JavaScript['wait_for'] = function(block) {
249
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
250
+ let value = value_signal.replace(/\'/g, "");
251
+ let times = block.getFieldValue('TIMES');
252
+ var code = 'await count (' + times + "," + value + '.now);\n';
253
+ return code;
254
+ };
255
+
256
+ Blockly.defineBlocksWithJsonArray([
257
+ {
258
+ "type": "wait_for_signal_in_group",
259
+ "message0": "wait for %1 pattern(s) in group %2",
260
+ "args0": [
261
+ {
262
+ "type": "field_number",
263
+ "name": "TIMES",
264
+ "value": 1,
265
+ "check": "Number"
266
+ },
267
+ {
268
+ "type": "input_value",
269
+ "name": "SIGNAL",
270
+ "check": "String"
271
+ }
272
+ ],
273
+ "previousStatement": null,
274
+ "nextStatement": null,
275
+ "colour": 20,
276
+ "tooltip": "await",
277
+ "helpUrl": ""
278
+ }
279
+ ]);
280
+
281
+ Blockly.JavaScript['wait_for_signal_in_group'] = function(block) {
282
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
283
+ let value = value_signal.replace(/\'/g, "");
284
+ let times = block.getFieldValue('TIMES');
285
+ var code = 'await count (' + times + "," + value + 'IN.now);\n';
286
+ return code;
287
+ };
288
+
289
+ /*Blockly.defineBlocksWithJsonArray([
290
+ {
291
+ "type": "await",
292
+ "message0": "await %1",
293
+ "args0": [
294
+ {
295
+ "type": "input_statement",
296
+ "name": "SIGNAL",
297
+ "check": "String"
298
+ }
299
+ ],
300
+ "previousStatement": null,
301
+ "nextStatement": "String",
302
+ "colour": 230,
303
+ "tooltip": "",
304
+ "helpUrl": ""
305
+ }
306
+ ]);
307
+
308
+ Blockly.JavaScript['await'] = function(block) {
309
+ //var value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
310
+ var value_signal = Blockly.JavaScript.statementToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
311
+ let value = value_signal.replace(/\'/g, "");
312
+ var code = 'await ' + value + ';\n';
313
+ return code;
314
+ };
315
+ */
316
+ Blockly.defineBlocksWithJsonArray([
317
+ {
318
+ "type": "await",
319
+ "message0": "wait with condition for signal %1 ",
320
+ "args0": [
321
+ {
322
+ "type": "input_value",
323
+ "name": "AWAIT0",
324
+ "check": "Boolean"
325
+ }
326
+ ],
327
+ "previousStatement": null,
328
+ "nextStatement": null,
329
+ "colour": 20,
330
+ "helpUrl": ""
331
+ }
332
+ ]);
333
+
334
+ Blockly.JavaScript['await'] = function(block) {
335
+ var n = 0;
336
+ var code = '', conditionCode;
337
+ if (Blockly.JavaScript.STATEMENT_PREFIX) {
338
+ // Automatic prefix insertion is switched off for this block. Add manually.
339
+ code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
340
+ block);
341
+ }
342
+ //do {
343
+ conditionCode = Blockly.JavaScript.valueToCode(block, 'AWAIT' + n,
344
+ Blockly.JavaScript.ORDER_NONE) || 'false';
345
+
346
+ // Pas terrible mais c'est la syntaxe HH, count met des paranthèses
347
+ // donc il n'en faut pas ici si count est dans la ligne
348
+ if( conditionCode.includes("count") || conditionCode.includes("immediate")){
349
+ code += 'await ' + conditionCode + ';';
350
+ }else{
351
+ code += 'await (' + conditionCode + ');';
352
+ }
353
+ return code + '\n';
354
+ };
355
+
356
+ Blockly.defineBlocksWithJsonArray([
357
+ {
358
+ "type": "await_pattern",
359
+ "message0": "wait for pattern (string) %1",
360
+ "args0": [
361
+ {
362
+ "type": "input_value",
363
+ "name": "message",
364
+ "check": "String"
365
+ }
366
+ ],
367
+ "previousStatement": null,
368
+ "nextStatement": null,
369
+ "colour": 160,
370
+ "tooltip": "await_pattern",
371
+ "helpUrl": ""
372
+ }
373
+ ]);
374
+
375
+ Blockly.JavaScript['await_pattern'] = function(block) {
376
+ var value = Blockly.JavaScript.valueToCode(block, 'message', Blockly.JavaScript.ORDER_ATOMIC);
377
+ var code = "await (patternSignal.now && (patternSignal.nowval[1] === " + value + "));\n"
378
+ return code;
379
+ };
380
+
381
+ Blockly.defineBlocksWithJsonArray([
382
+ {
383
+ "type": "fork_body",
384
+ "message0": "fork %1 par %2",
385
+ "args0": [
386
+ {
387
+ "type": "input_statement",
388
+ "name": "fork"
389
+ },
390
+ {
391
+ "type": "input_statement",
392
+ "name": "par"
393
+ }
394
+ ],
395
+ "previousStatement": null,
396
+ "nextStatement": null,
397
+ "colour": 230,
398
+ "tooltip": "fork",
399
+ "helpUrl": ""
400
+ }
401
+ ]);
402
+
403
+ Blockly.JavaScript['fork_body'] = function(block) {
404
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'fork');
405
+ console.log("statements fork :\n", statements_name);
406
+ var statements_name2 = Blockly.JavaScript.statementToCode(block, 'par');
407
+ console.log("statements par :\n", statements_name2);
408
+
409
+ var code = 'fork{\n' + statements_name + '}par{\n' + statements_name2 + '}\n';
410
+ return code;
411
+ };
412
+
413
+ Blockly.defineBlocksWithJsonArray([
414
+ {
415
+ "type": "par_body",
416
+ "message0": "par %1",
417
+ "args0": [
418
+ {
419
+ "type": "input_statement",
420
+ "name": "NAME"
421
+ }
422
+ ],
423
+ "previousStatement": null,
424
+ "nextStatement": null,
425
+ "colour": 230,
426
+ "tooltip": "par",
427
+ "helpUrl": ""
428
+ }
429
+ ]);
430
+
431
+ Blockly.JavaScript['par_body'] = function(block) {
432
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
433
+ console.log("statements body:\n", statements_name);
434
+ var code = 'par{\n' + statements_name + '}\n';
435
+ return code;
436
+ };
437
+
438
+ Blockly.defineBlocksWithJsonArray([
439
+ {
440
+ "type": "random_body",
441
+ "message0": "Choose randomly a block among %1 blocks %2 block 1 %3 block 2 %4",
442
+ "args0": [
443
+ {
444
+ "type": "field_number",
445
+ "name": "VALUE",
446
+ "value": 2,
447
+ "check": "Number"
448
+ },
449
+ {
450
+ "type": "input_dummy"
451
+ },
452
+ {
453
+ "type": "input_statement",
454
+ "name": "fork"
455
+ },
456
+ {
457
+ "type": "input_statement",
458
+ "name": "par"
459
+ }
460
+ ],
461
+ "previousStatement": null,
462
+ "nextStatement": null,
463
+ "colour": 230,
464
+ "tooltip": "fork",
465
+ "helpUrl": ""
466
+ }
467
+ ]);
468
+
469
+ Blockly.JavaScript['random_body'] = function(block) {
470
+ let randomValue = block.getFieldValue('VALUE');
471
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'fork');
472
+ var statements_name2 = Blockly.JavaScript.statementToCode(block, 'par');
473
+
474
+ var code = "hop{ aleaRandomBlock281289 = Math.floor(Math.random() * Math.floor(" + randomValue + ")) + 1;}"
475
+
476
+ code += `
477
+ if ( aleaRandomBlock281289 === 1 ){
478
+ ` + statements_name + `
479
+ }else if( aleaRandomBlock281289 === 2 ){
480
+ ` + statements_name2 + `
481
+ }`;
482
+ return code;
483
+ };
484
+
485
+ Blockly.defineBlocksWithJsonArray([
486
+ {
487
+ "type": "random_block",
488
+ "message0": "random block %1 %2 %3",
489
+ "args0": [
490
+ {
491
+ "type": "field_number",
492
+ "name": "VALUE",
493
+ "value": 3,
494
+ "check": "Number"
495
+ },
496
+ {
497
+ "type": "input_dummy"
498
+ },
499
+ {
500
+ "type": "input_statement",
501
+ "name": "NAME"
502
+ }
503
+ ],
504
+ "previousStatement": null,
505
+ "nextStatement": null,
506
+ "colour": 230,
507
+ "tooltip": "par",
508
+ "helpUrl": ""
509
+ }
510
+ ]);
511
+
512
+ Blockly.JavaScript['random_block'] = function(block) {
513
+ let blocValue = block.getFieldValue('VALUE');
514
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
515
+ console.log("statements body:\n", statements_name);
516
+
517
+ var code = "";
518
+ code += `
519
+ if ( aleaRandomBlock281289 === `+ blocValue + `){
520
+ ` + statements_name + `
521
+ }
522
+ `
523
+ return code;
524
+ };
525
+
526
+
527
+ Blockly.defineBlocksWithJsonArray([
528
+ {
529
+ "type": "seq_body",
530
+ "message0": "seq %1",
531
+ "args0": [
532
+ {
533
+ "type": "input_statement",
534
+ "name": "NAME"
535
+ }
536
+ ],
537
+ "previousStatement": null,
538
+ "nextStatement": null,
539
+ "colour": 180,
540
+ "tooltip": "seq",
541
+ "helpUrl": ""
542
+ }
543
+ ]);
544
+
545
+ Blockly.JavaScript['seq_body'] = function(block) {
546
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
547
+ console.log("statements seq:\n", statements_name);
548
+ var code = '{\n' + statements_name + '\n}';
549
+ return code;
550
+ };
551
+
552
+ Blockly.defineBlocksWithJsonArray([
553
+ {
554
+ "type": "declare_signal",
555
+ "message0": "create signal %1",
556
+ "args0": [
557
+ {
558
+ "type": "input_value",
559
+ "name": "signal",
560
+ "check": "String"
561
+ }
562
+ ],
563
+ "previousStatement": null,
564
+ "nextStatement": null,
565
+ "colour": 20,
566
+ "tooltip": "signal",
567
+ "helpUrl": ""
568
+ }
569
+ ]);
570
+
571
+ Blockly.JavaScript['declare_signal'] = function(block) {
572
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
573
+ let value = value_signal.replace(/\'/g, "");
574
+ var code = 'signal ' + value + ';\n';
575
+ return code;
576
+ };
577
+
578
+ Blockly.defineBlocksWithJsonArray([
579
+ {
580
+ "type": "refer_signals",
581
+ "message0": "create signal %1 in module",
582
+ "args0": [
583
+ {
584
+ "type": "input_value",
585
+ "name": "signal",
586
+ "check": "String"
587
+ }
588
+ ],
589
+ "previousStatement": null,
590
+ "nextStatement": null,
591
+ "colour": 20,
592
+ "tooltip": "signal",
593
+ "helpUrl": ""
594
+ }
595
+ ]);
596
+
597
+ Blockly.JavaScript['refer_signals'] = function(block) {
598
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
599
+ let value = value_signal.replace(/\'/g, "");
600
+ var code = value + ',' ;
601
+ return code;
602
+ };
603
+
604
+ Blockly.defineBlocksWithJsonArray([
605
+ {
606
+ "type": "count_signal",
607
+ "message0": "count %1 %2",
608
+ "args0": [
609
+ {
610
+ "type": "field_number",
611
+ "name": "count",
612
+ "value": 1
613
+ },
614
+ {
615
+ "type": "input_value",
616
+ "name": "signal",
617
+ "check": "String"
618
+ }
619
+ ],
620
+ "inputsInline": false,
621
+ //"previousStatement": null,
622
+ //"nextStatement": null,
623
+ "output": null,
624
+ "colour": 15,
625
+ "tooltip": "signal",
626
+ "helpUrl": ""
627
+ }
628
+ ]);
629
+
630
+ Blockly.JavaScript['count_signal'] = function(block) {
631
+ var number_count = block.getFieldValue('count');
632
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
633
+ // On récupère un block "text" de Blockly avec des "" à supprimer
634
+ let value = value_signal.replace(/\(|\)|\'/g, "");
635
+ var code = ' count ('+ number_count + ',' + value + ')';
636
+ //return code;
637
+ return [code, Blockly.JavaScript.ORDER_NONE];
638
+ };
639
+
640
+ Blockly.defineBlocksWithJsonArray([
641
+ {
642
+ "type": "now",
643
+ "message0": "now %1",
644
+ "args0": [
645
+ {
646
+ "type": "input_value",
647
+ "name": "signal",
648
+ "check": "String"
649
+ }
650
+ ],
651
+ "inputsInline": false,
652
+ "output": null,
653
+ "colour": 15,
654
+ "tooltip": "",
655
+ "helpUrl": ""
656
+ }
657
+ ]);
658
+
659
+ Blockly.JavaScript['now'] = function(block) {
660
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
661
+ var code = value_signal.replace(/\'/g, "") + ".now";
662
+ // TODO: Change ORDER_NONE to the correct strength.
663
+ return [code, Blockly.JavaScript.ORDER_NONE];
664
+ };
665
+
666
+ Blockly.defineBlocksWithJsonArray([
667
+ {
668
+ "type": "immediate",
669
+ "message0": "immediate %1",
670
+ "args0": [
671
+ {
672
+ "type": "input_value",
673
+ "name": "signal",
674
+ "check": "String"
675
+ }
676
+ ],
677
+ "inputsInline": false,
678
+ "output": null,
679
+ "colour": 15,
680
+ "tooltip": "",
681
+ "helpUrl": ""
682
+ }
683
+ ]);
684
+
685
+ Blockly.JavaScript['immediate'] = function(block) {
686
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
687
+ var code = 'immediate ' + value_signal.replace(/\'/g, "");
688
+ // TODO: Change ORDER_NONE to the correct strength.
689
+ return [code, Blockly.JavaScript.ORDER_NONE];
690
+ };
691
+
692
+
693
+ Blockly.defineBlocksWithJsonArray([
694
+ {
695
+ "type": "nowval",
696
+ "message0": "nowval %1",
697
+ "args0": [
698
+ {
699
+ "type": "input_value",
700
+ "name": "signal",
701
+ "check": "String"
702
+ }
703
+ ],
704
+ "inputsInline": false,
705
+ "output": null,
706
+ "colour": 15,
707
+ "tooltip": "",
708
+ "helpUrl": ""
709
+ }
710
+ ]);
711
+
712
+ Blockly.JavaScript['nowval'] = function(block) {
713
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
714
+ var code = value_signal.replace(/\'/g, "") + ".nowval";
715
+ // TODO: Change ORDER_NONE to the correct strength.
716
+ return [code, Blockly.JavaScript.ORDER_NONE];
717
+ };
718
+
719
+ Blockly.defineBlocksWithJsonArray([
720
+ {
721
+ "type": "moduleHH",
722
+ "message0": "signal %1 mod %2",
723
+ "args0": [
724
+ {
725
+ "type": "input_statement",
726
+ "name": "SIGNAL",
727
+ "check": "String"
728
+ },
729
+ {
730
+ "type": "input_statement",
731
+ "name": "NAME"
732
+ }
733
+ ],
734
+ "previousStatement": null,
735
+ "nextStatement": null,
736
+ "colour": 160,
737
+ "tooltip": "module",
738
+ "helpUrl": ""
739
+ }
740
+ ]);
741
+
742
+ Blockly.JavaScript['moduleHH'] = function(block) {
743
+ // Traitement des signaux en paramètre
744
+ var statements_name1 = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
745
+ let value = statements_name1.replace(/\'/g, "").replace(/signal/g, "").replace(/;/g, ",");
746
+ var statements_name2 = Blockly.JavaScript.statementToCode(block, 'NAME');
747
+
748
+ var code = `
749
+ 'use strict'
750
+ "use hopscript"
751
+ 'use hiphop'
752
+
753
+ exports.hh = hiphop module (` + value + ') {\n'
754
+ code += statements_name2;
755
+ code += '}';
756
+ return code;
757
+ };
758
+
759
+ Blockly.defineBlocksWithJsonArray([
760
+ {
761
+ "type": "submoduleHH",
762
+ "message0": "name %1 signal %2 submod %3",
763
+ "args0": [
764
+ {
765
+ "type": "input_value",
766
+ "name": "MOD_NAME",
767
+ "check": "String"
768
+ },
769
+ {
770
+ "type": "input_statement",
771
+ "name": "SIGNAL",
772
+ "check": "String"
773
+ },
774
+ {
775
+ "type": "input_statement",
776
+ "name": "NAME"
777
+ }
778
+ ],
779
+ "previousStatement": null,
780
+ "nextStatement": null,
781
+ "colour": 300,
782
+ "tooltip": "module",
783
+ "helpUrl": ""
784
+ }
785
+ ]);
786
+
787
+ Blockly.JavaScript['submoduleHH'] = function(block) {
788
+ var value_name = Blockly.JavaScript.valueToCode(block, 'MOD_NAME', Blockly.JavaScript.ORDER_ATOMIC)
789
+ let mod_name = value_name.replace(/\'/g, "");
790
+
791
+ // Traitement des signaux en paramètre
792
+ var statements_name1 = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
793
+ let value = statements_name1.replace(/\'/g, "").replace(/signal/g, "").replace(/;/g, ",");
794
+
795
+ var statements_name2 = Blockly.JavaScript.statementToCode(block, 'NAME');
796
+
797
+ var code = '\n' + mod_name + ' = hiphop module(' + value + ' stopReservoir,'
798
+ code +=' tick, abletonON, setTimerDivision, resetMatriceDesPossibles, in patternSignal,';
799
+ code +=' resetMatriceDesPossibles, in midiSignal, out cleanChoiceList, out patternListLength,';
800
+ code +=' out setComputeScoreClass, out setComputeScorePolicy)\n';
801
+ code += "implements ${opus4Int.creationInterfaces(par.groupesDesSons[trajet])}{\n";
802
+ code += statements_name2;
803
+ code += '\n}';
804
+
805
+ return code;
806
+ };
807
+
808
+
809
+ Blockly.defineBlocksWithJsonArray([
810
+ {
811
+ "type": "orchestration",
812
+ "message0": "Orch. %1 %2 Mod. %3 Body %4 ",
813
+ "args0": [
814
+ {
815
+ "type": "field_number",
816
+ "name": "trajet",
817
+ "value": 1,
818
+ "check": "Number"
819
+ },
820
+ {
821
+ "type": "input_dummy"
822
+ },
823
+ {
824
+ "type": "input_statement",
825
+ "name": "MODULES"
826
+ },
827
+ {
828
+ "type": "input_statement",
829
+ "name": "NAME"
830
+ }
831
+ ],
832
+ //"previousStatement": null,
833
+ //"nextStatement": null,
834
+ "colour": 240,
835
+ "tooltip": "",
836
+ "helpUrl": ""
837
+ }
838
+ ]);
839
+
840
+ Blockly.JavaScript['orchestration'] = function(block) {
841
+ var number_trajet = block.getFieldValue('trajet');
842
+
843
+ var statements_modules = Blockly.JavaScript.statementToCode(block, 'MODULES');
844
+
845
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
846
+
847
+ var code = `
848
+ 'use strict'
849
+ "use hopscript"
850
+ 'use hiphop'
851
+
852
+ var par = require('../logosParametres');
853
+ var ableton = require('../controleAbleton');
854
+ var oscMidiLocal = require("../logosOSCandMidiLocal.js");
855
+ var gcs = require("./groupeClientsSons.js");
856
+ var orch = require("./orchestration.js", "hiphop");
857
+ const opus4Int = require("./automateInt.js");
858
+ var hh = require("hiphop");
859
+
860
+ var CCChannel = 1;
861
+ var CCTempo = 100;
862
+ var tempoMax = 160;// Valeur fixée dans DAW
863
+ var tempoMin = 40; // Valeur fixée dans DAW
864
+ var trajet = ` + number_trajet + `-1;
865
+ var tempoGlobal = 60;
866
+ var aleaRandomBlock281289 = 0;
867
+ var transposeValue = 0;
868
+
869
+ function setTempo(value){
870
+ if ( value > tempoMax || value < tempoMin) {
871
+ console.log("ERR: Tempo set out of range:", value, "Should be between:", tempoMin, "and", tempoMax);
872
+ return;
873
+ }
874
+ var tempo = Math.round(127/(tempoMax - tempoMin) * (value - tempoMin));
875
+ //console.log("--- Set tempo:", value);
876
+ tempoGlobal = value;
877
+ oscMidiLocal.controlChange(par.busMidiAbleton, CCChannel, CCTempo, tempo);
878
+ }
879
+
880
+ var countInverseBougeTempo = 10;
881
+ var bougeTempoRythme = 2;
882
+ var bougeTempoValue = 2;
883
+
884
+ var bougeTempo = hiphop module (tick, abortBougeTempo)
885
+ implements ` + "$" + `{opus4Int.creationInterfaces(par.groupesDesSons[trajet])}{
886
+ signal inverseTempo;
887
+ abort (abortBougeTempo.now){
888
+ loop{
889
+ fork {
890
+ every count (countInverseBougeTempo, tick.now) {
891
+ emit inverseTempo();
892
+ }
893
+ }par{
894
+ loop{
895
+ abort(inverseTempo.now){
896
+ every count (bougeTempoRythme, tick.now) {
897
+ hop{
898
+ tempoGlobal += bougeTempoValue;
899
+ setTempo(tempoGlobal);
900
+ }
901
+ }
902
+ }
903
+ abort(inverseTempo.now){
904
+ every count (bougeTempoRythme, tick.now) {
905
+ hop{
906
+ tempoGlobal -= bougeTempoValue;
907
+ setTempo(tempoGlobal);
908
+ }
909
+ }
910
+ }
911
+ }
912
+ }
913
+ }
914
+ }
915
+ }
916
+
917
+ `;
918
+
919
+ code += "\n" + statements_modules + "\n";
920
+
921
+ code += "var trajetModule" + number_trajet + `= hiphop module (in start, stop, tick, abletonON,
922
+ setTimerDivision, resetMatriceDesPossibles, in patternSignal, in midiSignal, in emptyQueueSignal,
923
+ out cleanChoiceList, out patternListLength, out setComputeScoreClass, out setComputeScorePolicy)` +
924
+ "\n implements ${opus4Int.creationInterfaces(par.groupesDesSons[" + (number_trajet-1) + "])}" +
925
+ `{
926
+ signal temps=0, size, stopReservoir, abortBougeTempo;
927
+ emit setTimerDivision(1);
928
+ loop{
929
+ abort(stop.now){
930
+ await immediate (start.now);
931
+ hop{console.log("-- Démarrage automate des possibles");}
932
+ fork{
933
+ every immediate (tick.now){
934
+ emit temps(temps.preval + 1);
935
+ hop{gcs.setTickOnControler(temps.nowval);}
936
+ }
937
+ }par{
938
+ ` + statements_name + `
939
+ }
940
+ }
941
+ emit resetMatriceDesPossibles();
942
+ hop{ ableton.cleanQueues();}
943
+ emit temps(0);
944
+ yield;
945
+ }
946
+ }
947
+ exports.trajetModule` + number_trajet + "= trajetModule" + number_trajet + ";";
948
+ return code;
949
+
950
+ };
951
+
952
+ Blockly.defineBlocksWithJsonArray([
953
+ {
954
+ "type": "tank",
955
+ "message0": "tank on group %1 %2",
956
+ "args0": [
957
+ {
958
+ "type": "field_number",
959
+ "name": "groupeClient",
960
+ "value": 255,
961
+ "check": "Number"
962
+ },
963
+ {
964
+ "type": "input_statement",
965
+ "name": "SIGNAL",
966
+ }
967
+ ],
968
+ "previousStatement": null,
969
+ "nextStatement": null,
970
+ "colour": 300,
971
+ "tooltip": "module",
972
+ "helpUrl": ""
973
+ }
974
+ ]);
975
+
976
+ Blockly.JavaScript['tank'] = function(block) {
977
+ let number_groupeClient = block.getFieldValue('groupeClient');
978
+ let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
979
+ let value = statements_name.replace(/;/g, "").split('=');
980
+
981
+ let code = '';
982
+ code = "\n" + value[0] + "= hiphop module(tick,stopReservoir)\n"
983
+ code += "implements ${opus4Int.creationInterfaces(par.groupesDesSons[trajet])}{";
984
+ code += " ${orch.makeReservoir( " + number_groupeClient + ",\n";
985
+ code += value[1];
986
+ code += " )};"
987
+ code += '\n}';
988
+ return code;
989
+ };
990
+
991
+ Blockly.defineBlocksWithJsonArray([
992
+ {
993
+ "type": "random_tank",
994
+ "message0": "run randomly max %1 tank(s) in %2 during %3 ticks",
995
+ "args0": [
996
+ {
997
+ "type": "field_number",
998
+ "name": "number_of_tanks",
999
+ "value": 2,
1000
+ "check": "Number"
1001
+ },
1002
+ {
1003
+ "type": "input_value",
1004
+ "name": "TANKS",
1005
+ },
1006
+ {
1007
+ "type": "field_number",
1008
+ "name": "number_of_ticks",
1009
+ "value": 1,
1010
+ "check": "Number"
1011
+ },
1012
+
1013
+ ],
1014
+ "previousStatement": null,
1015
+ "nextStatement": null,
1016
+ "colour": 300,
1017
+ "tooltip": "module",
1018
+ "helpUrl": ""
1019
+ }
1020
+ ]);
1021
+
1022
+ Blockly.JavaScript['random_tank'] = function(block) {
1023
+ let number_of_tanks = block.getFieldValue('number_of_tanks');
1024
+ let times = block.getFieldValue('number_of_ticks');
1025
+ //let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
1026
+
1027
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'TANKS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1028
+ let value = statements_name.replace(/;\n/g, ""); //.split('=');
1029
+
1030
+ // Parsing nécessaire pour pouvoir utiliser des variables dans la liste
1031
+ // et pas des chaines de caractère
1032
+ let listeStrings = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1033
+ var listTanks = createRandomListe(number_of_tanks,listeStrings);
1034
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
1035
+
1036
+ let code = "signal stop" + varRandom + ";\n";
1037
+ code += "trap" + varRandom + ":{ \n"
1038
+ code += `hop{console.log("--- RESERVOIRS SELECTIONNES AUTOMATIQUEMENT: ` + listTanks + `");}`;
1039
+ code += `
1040
+ fork{
1041
+ `+ "run ${" + listTanks[0] + `}(..., stopReservoir as stop` + varRandom + `);
1042
+ }`;
1043
+
1044
+ for(var i=1; i < listTanks.length; i++){
1045
+ code += `
1046
+ par{
1047
+ `+ "run ${" + listTanks[i] + `}(..., stopReservoir as stop` + varRandom + `);
1048
+ }
1049
+ `
1050
+ }
1051
+ code += "par{\n";
1052
+ code += " await count (" + times + "," + "tick.now);\n";
1053
+ code += " emit stop" + varRandom + "();\n";
1054
+ code += " break trap" + varRandom + ";\n";
1055
+ code += " }\n";
1056
+ code += "}\n";
1057
+ code += "yield;\n";
1058
+ return code;
1059
+ };
1060
+
1061
+ Blockly.defineBlocksWithJsonArray([
1062
+ {
1063
+ "type": "random_group",
1064
+ "message0": "set randomly max %1 group(s) in %2 for users %3 during %4 ticks",
1065
+ "args0": [
1066
+ {
1067
+ "type": "field_number",
1068
+ "name": "number_of_groups",
1069
+ "value": 2,
1070
+ "check": "Number"
1071
+ },
1072
+ {
1073
+ "type": "input_value",
1074
+ "name": "GROUPS",
1075
+ },
1076
+ {
1077
+ "type": "field_number",
1078
+ "name": "user_group",
1079
+ "value": 255,
1080
+ "check": "Number"
1081
+ },
1082
+ {
1083
+ "type": "field_number",
1084
+ "name": "number_of_ticks",
1085
+ "value": 1,
1086
+ "check": "Number"
1087
+ }
1088
+ ],
1089
+ "previousStatement": null,
1090
+ "nextStatement": null,
1091
+ "colour": 270,
1092
+ "tooltip": "module",
1093
+ "helpUrl": ""
1094
+ }
1095
+ ]);
1096
+
1097
+ Blockly.JavaScript['random_group'] = function(block) {
1098
+ let number_of_groups = block.getFieldValue('number_of_groups');
1099
+ let user_group = block.getFieldValue('user_group');
1100
+ let times = block.getFieldValue('number_of_ticks');
1101
+ //let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
1102
+
1103
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1104
+ let value = statements_name.replace(/;\n/g, ""); //.split('=');
1105
+
1106
+ // Parsing nécessaire pour pouvoir utiliser des variables dans la liste
1107
+ // et pas des chaines de caractère
1108
+ let listeStrings = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1109
+ // Créer une liste à la compilation, en live il faut générer du code à la volée.
1110
+ // C'est en principe possible.
1111
+ var listGroups = createRandomListe(number_of_groups, listeStrings);
1112
+
1113
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
1114
+
1115
+ let code = "trap" + varRandom + ":{ \n"
1116
+ code += `hop{console.log("--- GROUPES SELECTIONNES AUTOMATIQUEMENT: ` + listGroups + `");}`;
1117
+ code += `
1118
+ fork{`;
1119
+ for(var i=0; i < listGroups.length; i++){
1120
+ code += `
1121
+ emit ` + listGroups[i] + `OUT([true, ` + user_group + `]);
1122
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", true); };`;
1123
+ }
1124
+ code += "\n}par{\n";
1125
+ code += " await count (" + times + "," + "tick.now);\n";
1126
+ for(var i=0; i < listGroups.length; i++){
1127
+ code += `emit ` + listGroups[i] + `OUT([false, ` + user_group + `]);
1128
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", false); };`;
1129
+ }
1130
+ code += "\n break trap" + varRandom + ";\n";
1131
+ code += " }\n";
1132
+ code += "}\n";
1133
+ code += "yield;\n";
1134
+ return code;
1135
+ };
1136
+
1137
+ Blockly.defineBlocksWithJsonArray([
1138
+ {
1139
+ "type": "set_group_during_ticks",
1140
+ "message0": "set group(s) %1 for users %2 during %3 ticks",
1141
+ "args0": [
1142
+ {
1143
+ "type": "input_value",
1144
+ "name": "GROUPS",
1145
+ },
1146
+ {
1147
+ "type": "field_number",
1148
+ "name": "user_group",
1149
+ "value": 255,
1150
+ "check": "Number"
1151
+ },
1152
+ {
1153
+ "type": "field_number",
1154
+ "name": "number_of_ticks",
1155
+ "value": 1,
1156
+ "check": "Number"
1157
+ }
1158
+ ],
1159
+ "previousStatement": null,
1160
+ "nextStatement": null,
1161
+ "colour": 270,
1162
+ "tooltip": "module",
1163
+ "helpUrl": ""
1164
+ }
1165
+ ]);
1166
+
1167
+ Blockly.JavaScript['set_group_during_ticks'] = function(block) {
1168
+ let user_group = block.getFieldValue('user_group');
1169
+ let times = block.getFieldValue('number_of_ticks');
1170
+ //let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
1171
+
1172
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1173
+ let value = statements_name.replace(/;\n/g, ""); //.split('=');
1174
+
1175
+ // Parsing nécessaire pour pouvoir utiliser des variables dans la liste
1176
+ // et pas des chaines de caractères
1177
+ let listGroups = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1178
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
1179
+
1180
+ let code = "trap" + varRandom + ":{ \n"
1181
+ code += `hop{console.log("--- SET GROUPS : ` + listGroups + `");}`;
1182
+ code += `
1183
+ fork{`;
1184
+ for(var i=0; i < listGroups.length; i++){
1185
+ code += `
1186
+ emit ` + listGroups[i] + `OUT([true, ` + user_group + `]);
1187
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", true); };`;
1188
+ }
1189
+ code += "\n}par{\n";
1190
+ code += " await count (" + times + "," + "tick.now);\n";
1191
+ for(var i=0; i < listGroups.length; i++){
1192
+ code += `emit ` + listGroups[i] + `OUT([false, ` + user_group + `]);
1193
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", false); };
1194
+ `;
1195
+ }
1196
+ code += "\n break trap" + varRandom + ";\n";
1197
+ code += " }\n";
1198
+ code += "}\n";
1199
+ code += "yield;\n";
1200
+ return code;
1201
+ };
1202
+
1203
+ Blockly.defineBlocksWithJsonArray([
1204
+ {
1205
+ "type": "set_groups_during_patterns",
1206
+ "message0": "set group(s) %1 for users %2 during %3 patterns in group(s) %4",
1207
+ "args0": [
1208
+ {
1209
+ "type": "input_value",
1210
+ "name": "GROUPS",
1211
+ },
1212
+ {
1213
+ "type": "field_number",
1214
+ "name": "user_group",
1215
+ "value": 255,
1216
+ "check": "Number"
1217
+ },
1218
+ {
1219
+ "type": "field_number",
1220
+ "name": "number_of_patterns",
1221
+ "value": 1,
1222
+ "check": "Number"
1223
+ },
1224
+ {
1225
+ "type": "input_value",
1226
+ "name": "IN_GROUPS",
1227
+ }
1228
+ ],
1229
+ "previousStatement": null,
1230
+ "nextStatement": null,
1231
+ "colour": 270,
1232
+ "tooltip": "module",
1233
+ "helpUrl": ""
1234
+ }
1235
+ ]);
1236
+
1237
+ Blockly.JavaScript['set_groups_during_patterns'] = function(block) {
1238
+ let user_group = block.getFieldValue('user_group');
1239
+ let number_of_patterns = block.getFieldValue('number_of_patterns');
1240
+ //let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
1241
+
1242
+ let groups = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1243
+ let value = groups.replace(/;\n/g, "");
1244
+ // Parsing nécessaire pour pouvoir utiliser des variables dans la liste
1245
+ // et pas des chaines de caractères
1246
+ let listGroups = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1247
+
1248
+ let in_groups = Blockly.JavaScript.valueToCode(block, 'IN_GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1249
+ let in_value = in_groups.replace(/;\n/g, "");
1250
+ let in_listGroups = in_value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1251
+
1252
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
1253
+
1254
+ let code = "trap" + varRandom + ":{ \n"
1255
+ code += `hop{console.log("--- SET GROUPS DURING PATTERNS : ` + listGroups + `");}`;
1256
+ code += `
1257
+ fork{`;
1258
+ for(var i=0; i < listGroups.length; i++){
1259
+ code += `
1260
+ emit ` + listGroups[i] + `OUT([true, ` + user_group + `]);
1261
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", true); };`;
1262
+ }
1263
+ code += "\n}par{\n";
1264
+ code += " await count (" + number_of_patterns + "," + in_listGroups[0] + "IN.now";
1265
+
1266
+ for(var i=1; i < in_listGroups.length; i++){
1267
+ code += "|| " + in_listGroups[i] + "IN.now"
1268
+ }
1269
+ code += ");\n";
1270
+
1271
+ for(var i=0; i < listGroups.length; i++){
1272
+ code += `
1273
+ emit ` + listGroups[i] + `OUT([false, ` + user_group + `]);
1274
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", false); };
1275
+ `;
1276
+ }
1277
+ code += "\n break trap" + varRandom + ";\n";
1278
+ code += " }\n";
1279
+ code += "}\n";
1280
+ code += "yield;\n";
1281
+ return code;
1282
+ };
1283
+
1284
+ //set_groups_waiting_for_patterns, set_groups_during_patterns_in_groups
1285
+ Blockly.defineBlocksWithJsonArray([
1286
+ {
1287
+ "type": "set_groups_waiting_for_patterns",
1288
+ "message0": "set group(s) %1 for users %2 waiting for patterns %3",
1289
+ "args0": [
1290
+ {
1291
+ "type": "input_value",
1292
+ "name": "GROUPS",
1293
+ },
1294
+ {
1295
+ "type": "field_number",
1296
+ "name": "user_group",
1297
+ "value": 255,
1298
+ "check": "Number"
1299
+ },
1300
+ {
1301
+ "type": "input_value",
1302
+ "name": "IN_PATTERNS_LIST",
1303
+ },
1304
+ ],
1305
+ "previousStatement": null,
1306
+ "nextStatement": null,
1307
+ "colour": 270,
1308
+ "tooltip": "module",
1309
+ "helpUrl": ""
1310
+ }
1311
+ ]);
1312
+
1313
+ Blockly.JavaScript['set_groups_waiting_for_patterns'] = function(block) {
1314
+ let user_group = block.getFieldValue('user_group');
1315
+ let number_of_patterns = block.getFieldValue('number_of_patterns');
1316
+ //let statements_name = Blockly.JavaScript.statementToCode(block, 'SIGNAL');
1317
+
1318
+ let groups = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1319
+ let value = groups.replace(/;\n/g, "");
1320
+ // Parsing nécessaire pour pouvoir utiliser des variables dans la liste
1321
+ // et pas des chaines de caractères
1322
+ let listGroups = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1323
+
1324
+ let in_patterns_list = Blockly.JavaScript.valueToCode(block, 'IN_PATTERNS_LIST', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1325
+ let in_value = in_patterns_list.replace(/;\n/g, "");
1326
+ in_patterns_list = in_value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1327
+
1328
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
1329
+
1330
+ let code = "trap" + varRandom + ":{ \n"
1331
+ code += `hop{console.log("--- SET GROUPS WAITING FOR PATTERNS : ` + listGroups + `");}`;
1332
+ code += `
1333
+ fork{`;
1334
+ for(var i=0; i < listGroups.length; i++){
1335
+ code += `
1336
+ emit ` + listGroups[i] + `OUT([true, ` + user_group + `]);
1337
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", true); };`;
1338
+ }
1339
+ code += "\n}par{";
1340
+ code += " await (patternSignal.now && (patternSignal.nowval[1] === " + in_patterns_list[0] + "));\n"
1341
+
1342
+ for(var i=1; i < in_patterns_list.length; i++){
1343
+ code += " }par{"
1344
+ code += "await (patternSignal.now && (patternSignal.nowval[1] === " + in_patterns_list[i] + "));\n"
1345
+ }
1346
+ code += "}\n";
1347
+
1348
+ for(var i=0; i < listGroups.length; i++){
1349
+ code += `emit ` + listGroups[i] + `OUT([false, ` + user_group + `]);
1350
+ hop{ gcs.informSelecteurOnMenuChange(` + user_group + `," ` + listGroups[i] + `", false); };
1351
+ `;
1352
+ }
1353
+ code += "\n break trap" + varRandom + ";\n";
1354
+ code += "}\n";
1355
+ code += "yield;\n";
1356
+ return code;
1357
+ };
1358
+
1359
+ Blockly.defineBlocksWithJsonArray([
1360
+ {
1361
+ "type": "reset_orchestration",
1362
+ "message0": "reset orchestration",
1363
+ "previousStatement": null,
1364
+ "nextStatement": null,
1365
+ "colour": 330,
1366
+ "tooltip": "break",
1367
+ "helpUrl": ""
1368
+ }
1369
+ ]);
1370
+
1371
+ Blockly.JavaScript['reset_orchestration'] = function(block) {
1372
+ var code = 'emit resetMatriceDesPossibles();\n';
1373
+ return code;
1374
+ };
1375
+
1376
+ Blockly.defineBlocksWithJsonArray([
1377
+ {
1378
+ "type": "cleanqueues",
1379
+ "message0": "clean all instruments",
1380
+ "previousStatement": null,
1381
+ "nextStatement": null,
1382
+ "colour": 180,
1383
+ "tooltip": "break",
1384
+ "helpUrl": ""
1385
+ }
1386
+ ]);
1387
+
1388
+ Blockly.JavaScript['cleanqueues'] = function(block) {
1389
+ var code = 'hop{ ableton.cleanQueues();}\n';
1390
+ code += "emit cleanChoiceList(255);\n";
1391
+ return code;
1392
+ };
1393
+
1394
+ Blockly.defineBlocksWithJsonArray([
1395
+ {
1396
+ "type": "stopTanks",
1397
+ "message0": "stop all tanks",
1398
+ "previousStatement": null,
1399
+ "nextStatement": null,
1400
+ "colour": 300,
1401
+ "tooltip": "break",
1402
+ "helpUrl": ""
1403
+ }
1404
+ ]);
1405
+
1406
+ Blockly.JavaScript['stopTanks'] = function(block) {
1407
+ var code = 'emit stopReservoir();\n';
1408
+ return code;
1409
+ };
1410
+
1411
+ Blockly.defineBlocksWithJsonArray([
1412
+ {
1413
+ "type": "cleanOneQueue",
1414
+ "message0": "clean instrument %1",
1415
+ "args0": [
1416
+ {
1417
+ "type": "field_number",
1418
+ "name": "number",
1419
+ "value": 1,
1420
+ "check": "Number"
1421
+ }
1422
+ ],
1423
+ "previousStatement": null,
1424
+ "nextStatement": null,
1425
+ "colour": 180,
1426
+ "tooltip": "",
1427
+ "helpUrl": ""
1428
+ }
1429
+ ]);
1430
+ Blockly.JavaScript['cleanOneQueue'] = function(block) {
1431
+ var number = block.getFieldValue('number');
1432
+ var code = `hop{ableton.cleanQueue(` + number + ");}\n";
1433
+ return code;
1434
+ };
1435
+
1436
+ Blockly.defineBlocksWithJsonArray([
1437
+ {
1438
+ "type": "pauseQueues",
1439
+ "message0": "pause all instruments",
1440
+ "previousStatement": null,
1441
+ "nextStatement": null,
1442
+ "colour": 180,
1443
+ "tooltip": "break",
1444
+ "helpUrl": ""
1445
+ }
1446
+ ]);
1447
+
1448
+ Blockly.JavaScript['pauseQueues'] = function(block) {
1449
+ var code = 'hop{ ableton.pauseQueues();}\n';
1450
+ return code;
1451
+ };
1452
+
1453
+ Blockly.defineBlocksWithJsonArray([
1454
+ {
1455
+ "type": "pauseOneQueue",
1456
+ "message0": "pause instrument %1",
1457
+ "args0": [
1458
+ {
1459
+ "type": "field_number",
1460
+ "name": "number",
1461
+ "value": 1,
1462
+ "check": "Number"
1463
+ }
1464
+ ],
1465
+ "previousStatement": null,
1466
+ "nextStatement": null,
1467
+ "colour": 180,
1468
+ "tooltip": "",
1469
+ "helpUrl": ""
1470
+ }
1471
+ ]);
1472
+ Blockly.JavaScript['pauseOneQueue'] = function(block) {
1473
+ var number = block.getFieldValue('number');
1474
+ var code = `hop{ableton.pauseQueue(` + number + ");}\n";
1475
+ return code;
1476
+ };
1477
+
1478
+ Blockly.defineBlocksWithJsonArray([
1479
+ {
1480
+ "type": "resumeQueues",
1481
+ "message0": "resume all instruments",
1482
+ "previousStatement": null,
1483
+ "nextStatement": null,
1484
+ "colour": 180,
1485
+ "tooltip": "break",
1486
+ "helpUrl": ""
1487
+ }
1488
+ ]);
1489
+
1490
+ Blockly.JavaScript['resumeQueues'] = function(block) {
1491
+ var code = 'hop{ ableton.resumeQueues();}\n';
1492
+ return code;
1493
+ };
1494
+
1495
+ Blockly.defineBlocksWithJsonArray([
1496
+ {
1497
+ "type": "resumeOneQueue",
1498
+ "message0": "resume instrument %1",
1499
+ "args0": [
1500
+ {
1501
+ "type": "field_number",
1502
+ "name": "number",
1503
+ "value": 1,
1504
+ "check": "Number"
1505
+ }
1506
+ ],
1507
+ "previousStatement": null,
1508
+ "nextStatement": null,
1509
+ "colour": 180,
1510
+ "tooltip": "",
1511
+ "helpUrl": ""
1512
+ }
1513
+ ]);
1514
+ Blockly.JavaScript['resumeOneQueue'] = function(block) {
1515
+ var number = block.getFieldValue('number');
1516
+ var code = `hop{ableton.resumeQueue(` + number + ");}\n";
1517
+ return code;
1518
+ };
1519
+
1520
+ Blockly.defineBlocksWithJsonArray([
1521
+ {
1522
+ "type": "waitForEmptyQueue",
1523
+ "message0": "wait until instrument %1 is empty",
1524
+ "args0": [
1525
+ {
1526
+ "type": "field_number",
1527
+ "name": "number",
1528
+ "value": 1,
1529
+ "check": "Number"
1530
+ }
1531
+ ],
1532
+ "previousStatement": null,
1533
+ "nextStatement": null,
1534
+ "colour": 180,
1535
+ "tooltip": "",
1536
+ "helpUrl": ""
1537
+ }
1538
+ ]);
1539
+ Blockly.JavaScript['waitForEmptyQueue'] = function(block) {
1540
+ var number = block.getFieldValue('number');
1541
+ var code = `await (emptyQueueSignal.now && emptyQueueSignal.nowval ==` + number + ");\n";
1542
+ return code;
1543
+ };
1544
+
1545
+ Blockly.defineBlocksWithJsonArray([
1546
+ {
1547
+ "type": "putPatternInQueue",
1548
+ "message0": "put pattern %1 in instrument",
1549
+ "args0": [
1550
+ {
1551
+ "type": "input_value",
1552
+ "name": "message",
1553
+ "check": "String"
1554
+ }
1555
+ ],
1556
+ "previousStatement": null,
1557
+ "nextStatement": null,
1558
+ "colour": 180,
1559
+ "tooltip": "putPatternInQueue",
1560
+ "helpUrl": ""
1561
+ }
1562
+ ]);
1563
+
1564
+ Blockly.JavaScript['putPatternInQueue'] = function(block) {
1565
+ var value = Blockly.JavaScript.valueToCode(block, 'message', Blockly.JavaScript.ORDER_ATOMIC);
1566
+ var code = "hop{ableton.putPatternInQueue(" + value + ");}\n"
1567
+ return code;
1568
+ };
1569
+
1570
+ Blockly.defineBlocksWithJsonArray([
1571
+ {
1572
+ "type": "set_group",
1573
+ "message0": "set group(s) %1 %2",
1574
+ "args0": [
1575
+ {
1576
+ "type": "field_number",
1577
+ "name": "groupe",
1578
+ "value": 255,
1579
+ "check": "Number"
1580
+ },
1581
+ {
1582
+ "type": "input_value",
1583
+ "name": "GROUPS",
1584
+ }
1585
+ ],
1586
+ "previousStatement": null,
1587
+ "nextStatement": null,
1588
+ "colour": 270,
1589
+ "tooltip": "Emit",
1590
+ "helpUrl": ""
1591
+ }
1592
+ ]);
1593
+
1594
+ Blockly.JavaScript['set_group'] = function(block) {
1595
+ let groupeClient = block.getFieldValue('groupe');
1596
+
1597
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1598
+ let value = statements_name.replace(/;\n/g, "");
1599
+ let listGroupes = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1600
+
1601
+ var code = "";
1602
+ for(var i=0; i < listGroupes.length; i++){
1603
+ code += "emit " + listGroupes[i] + "OUT([true, " + groupeClient + "]);\n";
1604
+ code += "hop{ gcs.informSelecteurOnMenuChange(" + groupeClient + ",\"" + listGroupes[i] + "\", true); }\n";
1605
+ }
1606
+ code += "yield;\n";
1607
+ return code;
1608
+ };
1609
+
1610
+ Blockly.defineBlocksWithJsonArray([
1611
+ {
1612
+ "type": "unset_group",
1613
+ "message0": "unset group(s) %1 %2",
1614
+ "args0": [
1615
+ {
1616
+ "type": "field_number",
1617
+ "name": "groupe",
1618
+ "value": 255,
1619
+ "check": "Number"
1620
+ },
1621
+ {
1622
+ "type": "input_value",
1623
+ "name": "GROUPS"
1624
+ }
1625
+ ],
1626
+ "previousStatement": null,
1627
+ "nextStatement": null,
1628
+ "colour": 270,
1629
+ "tooltip": "",
1630
+ "helpUrl": ""
1631
+ }
1632
+ ]);
1633
+
1634
+ Blockly.JavaScript['unset_group'] = function(block) {
1635
+ let groupeClient = block.getFieldValue('groupe');
1636
+
1637
+ let value_signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1638
+
1639
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1640
+ let value = statements_name.replace(/;\n/g, "");
1641
+ let listGroupes = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1642
+
1643
+ var code = "";
1644
+ for(var i=0; i < listGroupes.length; i++){
1645
+ code += "emit " + listGroupes[i] + "OUT([false, " + groupeClient + "]);\n";
1646
+ code += "hop{ gcs.informSelecteurOnMenuChange(" + groupeClient + ",\"" + listGroupes[i] + "\", false); }\n";
1647
+ }
1648
+ code += "yield;\n";
1649
+ return code;
1650
+ };
1651
+
1652
+ Blockly.defineBlocksWithJsonArray([
1653
+ {
1654
+ "type": "run_module",
1655
+ "message0": "run %1",
1656
+ "args0": [
1657
+ {
1658
+ "type": "input_value",
1659
+ "name": "module",
1660
+ "check": "String"
1661
+ }
1662
+ ],
1663
+ "previousStatement": null,
1664
+ "nextStatement": null,
1665
+ "colour": 300,
1666
+ "tooltip": "module",
1667
+ "helpUrl": ""
1668
+ }
1669
+ ]);
1670
+
1671
+ Blockly.JavaScript['run_module'] = function(block) {
1672
+ var value_module = Blockly.JavaScript.valueToCode(block, 'module', Blockly.JavaScript.ORDER_ATOMIC);
1673
+ let value = value_module.replace(/\'/g, "");
1674
+ var code = 'run ${' + value + '}(...);\n';
1675
+ return code;
1676
+ };
1677
+
1678
+ Blockly.defineBlocksWithJsonArray([
1679
+ {
1680
+ "type": "run_tank",
1681
+ "message0": "run tank(s) %1",
1682
+ "args0": [
1683
+ {
1684
+ "type": "input_value",
1685
+ "name": "TANKS",
1686
+ }
1687
+ ],
1688
+ "previousStatement": null,
1689
+ "nextStatement": null,
1690
+ "colour": 300,
1691
+ "tooltip": "module",
1692
+ "helpUrl": ""
1693
+ }
1694
+ ]);
1695
+
1696
+ Blockly.JavaScript['run_tank'] = function(block) {
1697
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'TANKS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1698
+ let value = statements_name.replace(/;\n/g, ""); //.split('=');
1699
+ let listTanks = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
1700
+ var code = "";
1701
+ for(var i=0; i < listTanks.length; i++){
1702
+ code += "run ${" + listTanks[i] + "}(...);\n";
1703
+ }
1704
+ code += "yield;\n";
1705
+ return code;
1706
+ };
1707
+
1708
+ Blockly.defineBlocksWithJsonArray([
1709
+ {
1710
+ "type": "loop_body",
1711
+ "message0": "loop %1",
1712
+ "args0": [
1713
+ {
1714
+ "type": "input_statement",
1715
+ "name": "NAME"
1716
+ }
1717
+ ],
1718
+ "previousStatement": null,
1719
+ "nextStatement": null,
1720
+ "colour": 250,
1721
+ "tooltip": "loop",
1722
+ "helpUrl": ""
1723
+ }
1724
+ ]);
1725
+
1726
+ Blockly.JavaScript['loop_body'] = function(block) {
1727
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
1728
+ console.log("statements loop:\n", statements_name);
1729
+ var code = 'loop {\n' + statements_name + '}\n';
1730
+ return code;
1731
+ };
1732
+
1733
+ Blockly.defineBlocksWithJsonArray([
1734
+ {
1735
+ "type": "yield",
1736
+ "lastDummyAlign0": "CENTRE",
1737
+ "message0": "yield",
1738
+ "previousStatement": null,
1739
+ "nextStatement": null,
1740
+ "colour": 230,
1741
+ "tooltip": "yield",
1742
+ "helpUrl": "yield"
1743
+ }
1744
+ ]);
1745
+
1746
+ Blockly.JavaScript['yield'] = function(block) {
1747
+ var code = 'yield;\n';
1748
+ return code;
1749
+ };
1750
+
1751
+ Blockly.defineBlocksWithJsonArray([
1752
+ {
1753
+ "type": "every",
1754
+ "message0": "every %1",
1755
+ "args0": [
1756
+ {
1757
+ "type": "input_value",
1758
+ "name": "EVERY0",
1759
+ "check": "Any"
1760
+ }
1761
+ ],
1762
+ "message1": "do %1",
1763
+ "args1": [
1764
+ {
1765
+ "type": "input_statement",
1766
+ "name": "DO0"
1767
+ }
1768
+ ],
1769
+ "previousStatement": null,
1770
+ "nextStatement": null,
1771
+ "style": "logic_blocks",
1772
+ "helpUrl": ""
1773
+ }
1774
+ ]);
1775
+
1776
+ Blockly.JavaScript['every'] = function(block) {
1777
+ var n = 0;
1778
+ var code = '', branchCode, conditionCode;
1779
+ if (Blockly.JavaScript.STATEMENT_PREFIX) {
1780
+ // Automatic prefix insertion is switched off for this block. Add manually.
1781
+ code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
1782
+ block);
1783
+ }
1784
+
1785
+ conditionCode = Blockly.JavaScript.valueToCode(block, 'EVERY' + n,
1786
+ Blockly.JavaScript.ORDER_NONE) || 'false';
1787
+ branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
1788
+ if (Blockly.JavaScript.STATEMENT_SUFFIX) {
1789
+ branchCode = Blockly.JavaScript.prefixLines(
1790
+ Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
1791
+ block), Blockly.JavaScript.INDENT) + branchCode;
1792
+ }
1793
+
1794
+ // Pas terrible mais c'est la syntaxe HH, count met des paranthèses
1795
+ // donc il n'en faut pas ici si count est dans la ligne
1796
+ if( conditionCode.includes("count") || conditionCode.includes("immediate") ){
1797
+ code += 'every ' + conditionCode + ' {\n' + branchCode + '}\n';
1798
+ }else{
1799
+ code += 'every (' + conditionCode + ') {\n' + branchCode + '}\n';
1800
+ }
1801
+ return code + '\n';
1802
+ };
1803
+
1804
+ Blockly.defineBlocksWithJsonArray([
1805
+ {
1806
+ "type": "abort",
1807
+ "message0": "abort %1",
1808
+ "args0": [
1809
+ {
1810
+ "type": "input_value",
1811
+ "name": "ABORT0",
1812
+ "check": "Boolean"
1813
+ }
1814
+ ],
1815
+ "message1": "do %1",
1816
+ "args1": [
1817
+ {
1818
+ "type": "input_statement",
1819
+ "name": "DO0"
1820
+ }
1821
+ ],
1822
+ "previousStatement": null,
1823
+ "nextStatement": null,
1824
+ "style": "logic_blocks",
1825
+ "helpUrl": ""
1826
+ }
1827
+ ]);
1828
+
1829
+ Blockly.JavaScript['abort'] = function(block) {
1830
+ var n = 0;
1831
+ var code = '', branchCode, conditionCode;
1832
+ if (Blockly.JavaScript.STATEMENT_PREFIX) {
1833
+ // Automatic prefix insertion is switched off for this block. Add manually.
1834
+ code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
1835
+ block);
1836
+ }
1837
+ conditionCode = Blockly.JavaScript.valueToCode(block, 'ABORT' + n,
1838
+ Blockly.JavaScript.ORDER_NONE) || 'false';
1839
+ branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
1840
+ if (Blockly.JavaScript.STATEMENT_SUFFIX) {
1841
+ branchCode = Blockly.JavaScript.prefixLines(
1842
+ Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
1843
+ block), Blockly.JavaScript.INDENT) + branchCode;
1844
+ }
1845
+
1846
+ // Pas terrible mais c'est la syntaxe HH, count met des paranthèses
1847
+ // donc il n'en faut pas ici si count est dans la ligne
1848
+ if( conditionCode.includes("count") || conditionCode.includes("immediate") ){
1849
+ code += 'abort ' + conditionCode + ' {\n' + branchCode + '}\n';
1850
+ }else{
1851
+ code += 'abort (' + conditionCode + ') {\n' + branchCode + '}\n';
1852
+ }
1853
+ return code + '\n';
1854
+ };
1855
+
1856
+ Blockly.defineBlocksWithJsonArray([
1857
+ {
1858
+ "type": "suspend",
1859
+ "message0": "suspend %1",
1860
+ "args0": [
1861
+ {
1862
+ "type": "input_value",
1863
+ "name": "SUSPEND0",
1864
+ "check": "Boolean"
1865
+ }
1866
+ ],
1867
+ "message1": "do %1",
1868
+ "args1": [
1869
+ {
1870
+ "type": "input_statement",
1871
+ "name": "DO0"
1872
+ }
1873
+ ],
1874
+ "previousStatement": null,
1875
+ "nextStatement": null,
1876
+ "style": "logic_blocks",
1877
+ "helpUrl": ""
1878
+ }
1879
+ ]);
1880
+
1881
+ Blockly.JavaScript['suspend'] = function(block) {
1882
+ var n = 0;
1883
+ var code = '', branchCode, conditionCode;
1884
+ if (Blockly.JavaScript.STATEMENT_PREFIX) {
1885
+ // Automatic prefix insertion is switched off for this block. Add manually.
1886
+ code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
1887
+ block);
1888
+ }
1889
+ conditionCode = Blockly.JavaScript.valueToCode(block, 'SUSPEND' + n,
1890
+ Blockly.JavaScript.ORDER_NONE) || 'false';
1891
+ branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
1892
+ if (Blockly.JavaScript.STATEMENT_SUFFIX) {
1893
+ branchCode = Blockly.JavaScript.prefixLines(
1894
+ Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
1895
+ block), Blockly.JavaScript.INDENT) + branchCode;
1896
+ }
1897
+ // Pas terrible mais c'est la syntaxe HH, count met des paranthèses
1898
+ // donc il n'en faut pas ici si count est dans la ligne
1899
+ if( conditionCode.includes("count") || conditionCode.includes("immediate") ){
1900
+ code += 'suspend ' + conditionCode + ' {\n' + branchCode + '}\n';
1901
+ }else{
1902
+ code += 'suspend (' + conditionCode + ') {\n' + branchCode + '}\n';
1903
+ }
1904
+ return code + '\n';
1905
+ };
1906
+
1907
+ Blockly.defineBlocksWithJsonArray([
1908
+ {
1909
+ "type": "trap",
1910
+ "message0": "trap %1 do %2",
1911
+ "args0": [
1912
+ {
1913
+ "type": "input_value",
1914
+ "name": "TRAP_NAME",
1915
+ "check": "String"
1916
+ },
1917
+ {
1918
+ "type": "input_statement",
1919
+ "name": "BODY"
1920
+ }
1921
+ ],
1922
+ "previousStatement": null,
1923
+ "nextStatement": null,
1924
+ "colour": 270,
1925
+ "tooltip": "trap",
1926
+ "helpUrl": ""
1927
+ }
1928
+ ]);
1929
+
1930
+ Blockly.JavaScript['trap'] = function(block) {
1931
+ var value_name = Blockly.JavaScript.valueToCode(block, 'TRAP_NAME', Blockly.JavaScript.ORDER_ATOMIC)
1932
+ let trap_name = value_name.replace(/\'/g, "");
1933
+ var statements = Blockly.JavaScript.statementToCode(block, 'BODY');
1934
+ var code = "\n" + trap_name + ':' + '{\n'
1935
+ code += statements;
1936
+ code += '}\n';
1937
+ return code;
1938
+ };
1939
+
1940
+ Blockly.defineBlocksWithJsonArray([
1941
+ {
1942
+ "type": "break",
1943
+ "message0": "break %1",
1944
+ "args0": [
1945
+ {
1946
+ "type": "input_value",
1947
+ "name": "TRAP_NAME"
1948
+ }
1949
+ ],
1950
+ "previousStatement": null,
1951
+ "nextStatement": null,
1952
+ "colour": 270,
1953
+ "tooltip": "break",
1954
+ "helpUrl": ""
1955
+ }
1956
+ ]);
1957
+
1958
+ Blockly.JavaScript['break'] = function(block) {
1959
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'TRAP_NAME', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
1960
+ let value = value_signal.replace(/\'/g, "");
1961
+ var code = 'break '+ value + ';\n';
1962
+ return code;
1963
+ };
1964
+
1965
+ Blockly.defineBlocksWithJsonArray([
1966
+ {
1967
+ "type": "removeSceneScore",
1968
+ "message0": "remove scene %1 in score",
1969
+ "args0": [
1970
+ {
1971
+ "type": "field_number",
1972
+ "name": "number",
1973
+ "value": 1,
1974
+ "check": "Number"
1975
+ }
1976
+ ],
1977
+ "previousStatement": null,
1978
+ "nextStatement": null,
1979
+ "colour": 230,
1980
+ "tooltip": "",
1981
+ "helpUrl": ""
1982
+ }
1983
+ ]);
1984
+
1985
+ Blockly.JavaScript['removeSceneScore'] = function(block) {
1986
+ var number = block.getFieldValue('number');
1987
+ var code = `hop {hop.broadcast('removeSceneScore',` + number + ");}\n";
1988
+ return code;
1989
+ };
1990
+
1991
+ Blockly.defineBlocksWithJsonArray([
1992
+ {
1993
+ "type": "addSceneScore",
1994
+ "message0": "add scene score %1",
1995
+ "args0": [
1996
+ {
1997
+ "type": "field_number",
1998
+ "name": "number",
1999
+ "value": 1,
2000
+ "check": "Number"
2001
+ }
2002
+ ],
2003
+ "previousStatement": null,
2004
+ "nextStatement": null,
2005
+ "colour": 230,
2006
+ "tooltip": "",
2007
+ "helpUrl": ""
2008
+ }
2009
+ ]);
2010
+
2011
+ Blockly.JavaScript['addSceneScore'] = function(block) {
2012
+ var number = block.getFieldValue('number');
2013
+ var code = `hop{hop.broadcast('addSceneScore',` + number + ");}\n";
2014
+ return code;
2015
+ };
2016
+
2017
+ Blockly.defineBlocksWithJsonArray([
2018
+ {
2019
+ "type": "refreshSceneScore",
2020
+ "message0": "refresh scene score",
2021
+ "previousStatement": null,
2022
+ "nextStatement": null,
2023
+ "colour": 230,
2024
+ "tooltip": "",
2025
+ "helpUrl": ""
2026
+ }
2027
+ ]);
2028
+
2029
+ Blockly.JavaScript['refreshSceneScore'] = function(block) {
2030
+ var code = `hop {hop.broadcast('refreshSceneScore');}
2031
+ `;
2032
+ return code;
2033
+ };
2034
+
2035
+ Blockly.defineBlocksWithJsonArray([
2036
+ {
2037
+ "type": "alertInfoScoreON",
2038
+ "message0": "display message in score %1 ",
2039
+ "args0": [
2040
+ {
2041
+ "type": "input_value",
2042
+ "name": "message",
2043
+ "check": "String"
2044
+ }
2045
+ ],
2046
+ "previousStatement": null,
2047
+ "nextStatement": null,
2048
+ "colour": 230,
2049
+ "tooltip": "alertInfoScoreON",
2050
+ "helpUrl": ""
2051
+ }
2052
+ ]);
2053
+
2054
+ Blockly.JavaScript['alertInfoScoreON'] = function(block) {
2055
+ var value = Blockly.JavaScript.valueToCode(block, 'message', Blockly.JavaScript.ORDER_ATOMIC);
2056
+ var code = `hop {hop.broadcast('alertInfoScoreON',` + value + ");}\n"
2057
+ return code;
2058
+ };
2059
+
2060
+ Blockly.defineBlocksWithJsonArray([
2061
+ {
2062
+ "type": "alertInfoScoreOFF",
2063
+ "message0": "remove message in score",
2064
+ "previousStatement": null,
2065
+ "nextStatement": null,
2066
+ "colour": 230,
2067
+ "tooltip": "",
2068
+ "helpUrl": ""
2069
+ }
2070
+ ]);
2071
+
2072
+ Blockly.JavaScript['alertInfoScoreOFF'] = function(block) {
2073
+ var code = `hop {hop.broadcast('alertInfoScoreOFF');}
2074
+ `;
2075
+ return code;
2076
+ };
2077
+
2078
+ Blockly.defineBlocksWithJsonArray([
2079
+ {
2080
+ "type": "logic_operationHH",
2081
+ "message0": "logic signals %1 %2 %3",
2082
+ "args0": [
2083
+ {
2084
+ "type": "input_value",
2085
+ "name": "A",
2086
+ "check": "String"
2087
+ },
2088
+ {
2089
+ "type": "field_dropdown",
2090
+ "name": "OP",
2091
+ "options": [
2092
+ ["%{BKY_LOGIC_OPERATION_AND}", "AND"],
2093
+ ["%{BKY_LOGIC_OPERATION_OR}", "OR"]
2094
+ ]
2095
+ },
2096
+ {
2097
+ "type": "input_value",
2098
+ "name": "B",
2099
+ "check": "String"
2100
+ }
2101
+ ],
2102
+ "inputsInline": true,
2103
+ "output": null,
2104
+ //"style": "logic_blocks",
2105
+ "colour": 15,
2106
+ "helpUrl": "%{BKY_LOGIC_OPERATION_HELPURL}",
2107
+ "extensions": ["logic_op_tooltip"]
2108
+ }
2109
+ ]);
2110
+
2111
+ Blockly.JavaScript['logic_operationHH'] = function(block) {
2112
+ // Operations 'and', 'or'.
2113
+ var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||';
2114
+ var order = (operator == '&&') ? Blockly.JavaScript.ORDER_NONE :
2115
+ Blockly.JavaScript.ORDER_NONE;
2116
+ var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order);
2117
+ var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order);
2118
+ if (!argument0 && !argument1) {
2119
+ // If there are no arguments, then the return value is false.
2120
+ argument0 = 'false';
2121
+ argument1 = 'false';
2122
+ } else {
2123
+ // Single missing arguments have no effect on the return value.
2124
+ var defaultArgument = (operator == '&&') ? 'true' : 'false';
2125
+ if (!argument0) {
2126
+ argument0 = defaultArgument;
2127
+ }
2128
+ if (!argument1) {
2129
+ argument1 = defaultArgument;
2130
+ }
2131
+ }
2132
+ var code = "(" + argument0 + ' ' + operator + ' ' + argument1 + ")";
2133
+ return [code, order];
2134
+ };
2135
+
2136
+ /*********************
2137
+
2138
+ Production de JS
2139
+
2140
+ **********************/
2141
+ Blockly.defineBlocksWithJsonArray([
2142
+ {
2143
+ "type": "JS_statement",
2144
+ "message0": "JS %1",
2145
+ "args0": [
2146
+ {
2147
+ "type": "input_statement",
2148
+ "name": "NAME"
2149
+ }
2150
+ ],
2151
+ "previousStatement": null,
2152
+ "nextStatement": null,
2153
+ "colour": 230,
2154
+ "tooltip": "",
2155
+ "helpUrl": ""
2156
+ }
2157
+ ]);
2158
+
2159
+ Blockly.JavaScript['JS_statement'] = function(block) {
2160
+ var statements_name = Blockly.JavaScript.statementToCode(block, 'NAME');
2161
+ //let value = value_signal.replace(/\'/g, "");
2162
+ var code = 'hop{\n' + statements_name + '}\n';
2163
+ return code;
2164
+ };
2165
+
2166
+ Blockly.defineBlocksWithJsonArray([
2167
+ {
2168
+ "type": "print_serveur",
2169
+ "message0": "print %1",
2170
+ "args0": [
2171
+ {
2172
+ "type": "input_value",
2173
+ "name": "signal",
2174
+ "check": "String"
2175
+ }
2176
+ ],
2177
+ "previousStatement": null,
2178
+ "nextStatement": null,
2179
+ "colour": 160,
2180
+ "tooltip": "print_serveur",
2181
+ "helpUrl": ""
2182
+ }
2183
+ ]);
2184
+
2185
+ Blockly.JavaScript['print_serveur'] = function(block) {
2186
+ var value_signal = Blockly.JavaScript.valueToCode(block, 'signal', Blockly.JavaScript.ORDER_ATOMIC);
2187
+ var code = 'hop {console.log(' + value_signal + ');}\n';
2188
+ return code;
2189
+ };
2190
+
2191
+ Blockly.defineBlocksWithJsonArray([
2192
+ {
2193
+ "type": "exec_serveur",
2194
+ "message0": "exec %1",
2195
+ "args0": [
2196
+ {
2197
+ "type": "input_value",
2198
+ "name": "statements",
2199
+ "check": "String"
2200
+ }
2201
+ ],
2202
+ "previousStatement": null,
2203
+ "nextStatement": null,
2204
+ "colour": 160,
2205
+ "tooltip": "exec_serveur",
2206
+ "helpUrl": ""
2207
+ }
2208
+ ]);
2209
+
2210
+ Blockly.JavaScript['exec_serveur'] = function(block) {
2211
+ var value = Blockly.JavaScript.valueToCode(block, 'statements', Blockly.JavaScript.ORDER_ATOMIC);
2212
+ var code = value.replace(/\'/g, "");
2213
+ code += '\n';
2214
+ return code;
2215
+ };
2216
+
2217
+
2218
+ Blockly.defineBlocksWithJsonArray([
2219
+ {
2220
+ "type": "set_tempo",
2221
+ "message0": "tempo %1",
2222
+ "args0": [
2223
+ {
2224
+ "type": "field_number",
2225
+ "name": "tempo",
2226
+ "value": 60,
2227
+ "check": "Number"
2228
+ }
2229
+ ],
2230
+ "previousStatement": null,
2231
+ "nextStatement": null,
2232
+ "colour": 330,
2233
+ "tooltip": "",
2234
+ "helpUrl": ""
2235
+ }
2236
+ ]);
2237
+
2238
+ Blockly.JavaScript['set_tempo'] = function(block) {
2239
+ var number_tempo = block.getFieldValue('tempo');
2240
+ var value_name = Blockly.JavaScript.valueToCode(block, 'NAME', Blockly.JavaScript.ORDER_ATOMIC);
2241
+ var code = 'hop{ setTempo(' + number_tempo + '); }\n';
2242
+ return code;
2243
+ };
2244
+
2245
+ Blockly.defineBlocksWithJsonArray([
2246
+ {
2247
+ "type": "set_timer_division",
2248
+ "message0": "set %1 pulse(s) for a tick",
2249
+ "args0": [
2250
+ {
2251
+ "type": "field_number",
2252
+ "name": "timer",
2253
+ "value": 1,
2254
+ "check": "Number"
2255
+ }
2256
+ ],
2257
+ "previousStatement": null,
2258
+ "nextStatement": null,
2259
+ "colour": 330,
2260
+ "tooltip": "",
2261
+ "helpUrl": ""
2262
+ }
2263
+ ]);
2264
+
2265
+ Blockly.JavaScript['set_timer_division'] = function(block) {
2266
+ var number_timer = block.getFieldValue('timer');
2267
+ //var value_name = Blockly.JavaScript.valueToCode(block, 'NAME', Blockly.JavaScript.ORDER_ATOMIC);
2268
+ var code = 'emit setTimerDivision(' + number_timer + ');\n';
2269
+ return code;
2270
+ };
2271
+
2272
+ Blockly.defineBlocksWithJsonArray([
2273
+ {
2274
+ "type": "tempo_parameters",
2275
+ "message0": "tempo ch. %1 CC %2 Max %3 Min %4 ",
2276
+ "args0": [
2277
+ {
2278
+ "type": "field_number",
2279
+ "name": "channelTempo",
2280
+ "value": 1,
2281
+ "check": "Number"
2282
+ },
2283
+ {
2284
+ "type": "field_number",
2285
+ "name": "CCTempo",
2286
+ "value": 100,
2287
+ "check": "Number"
2288
+ },
2289
+ {
2290
+ "type": "field_number",
2291
+ "name": "MaxTempo",
2292
+ "value": 160,
2293
+ "check": "Number"
2294
+ },
2295
+ {
2296
+ "type": "field_number",
2297
+ "name": "MinTempo",
2298
+ "value": 40,
2299
+ "check": "Number"
2300
+ }
2301
+ ],
2302
+ "previousStatement": null,
2303
+ "nextStatement": null,
2304
+ "colour": 330,
2305
+ "tooltip": "",
2306
+ "helpUrl": ""
2307
+ }
2308
+ ]);
2309
+
2310
+ Blockly.JavaScript['tempo_parameters'] = function(block) {
2311
+ var number_channel = block.getFieldValue('channelTempo');
2312
+ var number_CC = block.getFieldValue('CCTempo');
2313
+ var number_Max = block.getFieldValue('MaxTempo');
2314
+ var number_Min = block.getFieldValue('MinTempo');
2315
+ var code = `hop{
2316
+ CCChannel= ` + number_channel + `;
2317
+ CCTempo = ` + number_CC + `;
2318
+ tempoMax = ` + number_Max + `;
2319
+ tempoMin = ` + number_Min + `;
2320
+ }
2321
+ `;
2322
+ return code;
2323
+ };
2324
+
2325
+ Blockly.defineBlocksWithJsonArray([
2326
+ {
2327
+ "type": "send_midi_cc",
2328
+ "message0": "sendCC ch. %1 CC %2 val. %3 ",
2329
+ "args0": [
2330
+ /* {
2331
+ "type": "field_number",
2332
+ "name": "busMidi",
2333
+ "value": 6,
2334
+ "check": "Number"
2335
+ },*/
2336
+ {
2337
+ "type": "field_number",
2338
+ "name": "channelMidi",
2339
+ "value": 1,
2340
+ "check": "Number"
2341
+ },
2342
+ {
2343
+ "type": "field_number",
2344
+ "name": "CCMidi",
2345
+ "value": 0,
2346
+ "check": "Number"
2347
+ },
2348
+ {
2349
+ "type": "field_number",
2350
+ "name": "valueMidi",
2351
+ "value": 0,
2352
+ "check": "Number"
2353
+ }
2354
+ ],
2355
+ "previousStatement": null,
2356
+ "nextStatement": null,
2357
+ "colour": 330,
2358
+ "tooltip": "",
2359
+ "helpUrl": ""
2360
+ }
2361
+ ]);
2362
+
2363
+ Blockly.JavaScript['send_midi_cc'] = function(block) {
2364
+ //var number_bus = block.getFieldValue('busMidi');
2365
+ var number_channel = block.getFieldValue('channelMidi');
2366
+ var number_CC = block.getFieldValue('CCMidi');
2367
+ var number_value = block.getFieldValue('valueMidi');
2368
+ var code = "hop{\n";
2369
+ code += " oscMidiLocal.controlChange( par.busMidiAbleton,";
2370
+ code += number_channel + ",";
2371
+ code += number_CC + ",";
2372
+ code += number_value + ");\n"
2373
+ code += "}\n";
2374
+ return code;
2375
+ };
2376
+
2377
+ // Spécifique à l'outil chromatique d'Ableton
2378
+ Blockly.defineBlocksWithJsonArray([
2379
+ {
2380
+ "type": "transpose",
2381
+ "message0": "transpose ch. %1 CC Transpose Instr. %2 val. %3",
2382
+ "args0": [
2383
+ {
2384
+ "type": "field_number",
2385
+ "name": "channelMidi",
2386
+ "value": 0,
2387
+ "check": "Number"
2388
+ },
2389
+ {
2390
+ "type": "field_number",
2391
+ "name": "CCInstr",
2392
+ "value": 16,
2393
+ "check": "Number"
2394
+ },
2395
+ {
2396
+ "type": "field_number",
2397
+ "name": "valeur",
2398
+ "value": 1,
2399
+ "check": "Number"
2400
+ }
2401
+ ],
2402
+ "previousStatement": null,
2403
+ "nextStatement": null,
2404
+ "colour": 330,
2405
+ "tooltip": "",
2406
+ "helpUrl": ""
2407
+ }
2408
+ ]);
2409
+
2410
+ Blockly.JavaScript['transpose'] = function(block) {
2411
+ var number_channel = block.getFieldValue('channelMidi');
2412
+ var number_CC = block.getFieldValue('CCInstr');
2413
+ var number_valeur = block.getFieldValue('valeur');
2414
+
2415
+ var code = "hop{\n";
2416
+ code += " transposeValue +=" + number_valeur + ";\n"
2417
+ code += " oscMidiLocal.controlChange(par.busMidiAbleton, " + number_channel + "," + number_CC + ", Math.round(1.763 * transposeValue + 63.5));\n";
2418
+ code += "}\n";
2419
+ return code;
2420
+ };
2421
+
2422
+ Blockly.defineBlocksWithJsonArray([
2423
+ {
2424
+ "type": "reset_transpose",
2425
+ "message0": "reset transposition ch. %1 CC Transpose Instr. %2",
2426
+ "args0": [
2427
+ {
2428
+ "type": "field_number",
2429
+ "name": "channelMidi",
2430
+ "value": 0,
2431
+ "check": "Number"
2432
+ },
2433
+ {
2434
+ "type": "field_number",
2435
+ "name": "CCInstr",
2436
+ "value": 16,
2437
+ "check": "Number"
2438
+ }
2439
+ ],
2440
+ "previousStatement": null,
2441
+ "nextStatement": null,
2442
+ "colour": 330,
2443
+ "tooltip": "",
2444
+ "helpUrl": ""
2445
+ }
2446
+ ]);
2447
+
2448
+ Blockly.JavaScript['reset_transpose'] = function(block) {
2449
+ var number_channel = block.getFieldValue('channelMidi');
2450
+ var number_CC = block.getFieldValue('CCInstr');
2451
+
2452
+ var code = "hop{\n";
2453
+ code += " transposeValue = 0;\n"
2454
+ code += " oscMidiLocal.controlChange(par.busMidiAbleton, " + number_channel + "," + number_CC + ", 64 );\n";
2455
+ code += "}\n";
2456
+ return code;
2457
+ };
2458
+
2459
+ Blockly.defineBlocksWithJsonArray([
2460
+ {
2461
+ "type": "patternListLength",
2462
+ "message0": "set pattern list length to %1 for group %2",
2463
+ "args0": [
2464
+ {
2465
+ "type": "field_number",
2466
+ "name": "valeur",
2467
+ "value": 3,
2468
+ "check": "Number"
2469
+ },
2470
+ {
2471
+ "type": "field_number",
2472
+ "name": "groupe",
2473
+ "value": 255,
2474
+ "check": "Number"
2475
+ }
2476
+ ],
2477
+ "previousStatement": null,
2478
+ "nextStatement": null,
2479
+ "colour": 120,
2480
+ "tooltip": "",
2481
+ "helpUrl": ""
2482
+ }
2483
+ ]);
2484
+
2485
+ Blockly.JavaScript['patternListLength'] = function(block) {
2486
+ var number_valeur = block.getFieldValue('valeur');
2487
+ var number_groupe = block.getFieldValue('groupe');
2488
+ var code = "emit patternListLength([" + number_valeur + "," + number_groupe + "]);\n"
2489
+ return code;
2490
+ };
2491
+
2492
+ Blockly.defineBlocksWithJsonArray([
2493
+ {
2494
+ "type": "cleanChoiceList",
2495
+ "message0": "clean choice list for group %1",
2496
+ "args0": [
2497
+ {
2498
+ "type": "field_number",
2499
+ "name": "groupe",
2500
+ "value": 255,
2501
+ "check": "Number"
2502
+ }
2503
+ ],
2504
+ "previousStatement": null,
2505
+ "nextStatement": null,
2506
+ "colour": 120,
2507
+ "tooltip": "",
2508
+ "helpUrl": ""
2509
+ }
2510
+ ]);
2511
+
2512
+ Blockly.JavaScript['cleanChoiceList'] = function(block) {
2513
+ var number_groupe = block.getFieldValue('groupe');
2514
+
2515
+ var code = "hop{ hop.broadcast('cleanChoiceList', " + number_groupe + ");}";
2516
+
2517
+ //La version avec signal n'est pas indispensable et n'apporte rien en blockly
2518
+ //var code = "emit cleanChoiceList(" + number_groupe + ");\n"
2519
+ return code;
2520
+ };
2521
+
2522
+ Blockly.defineBlocksWithJsonArray([
2523
+ {
2524
+ "type": "bestScore",
2525
+ "lastDummyAlign0": "CENTRE",
2526
+ "message0": "display best score during %1 ticks",
2527
+ "args0": [
2528
+ {
2529
+ "type": "field_number",
2530
+ "name": "ticks",
2531
+ "value": 2,
2532
+ "check": "Number"
2533
+ }
2534
+ ],
2535
+ "previousStatement": null,
2536
+ "nextStatement": null,
2537
+ "colour": 120,
2538
+ "tooltip": "",
2539
+ "helpUrl": ""
2540
+ }
2541
+ ]);
2542
+
2543
+ Blockly.JavaScript['bestScore'] = function(block) {
2544
+ var number_ticks = block.getFieldValue('ticks');
2545
+ if(english){
2546
+ var code = `
2547
+ hop {hop.broadcast('alertInfoScoreON', " N°1 " + gcs.getWinnerPseudo(0) + " with " + gcs.getWinnerScore(0) + " ");}
2548
+ `;
2549
+ }else{
2550
+ var code = `
2551
+ hop {hop.broadcast('alertInfoScoreON', " N°1 " + gcs.getWinnerPseudo(0) + " avec " + gcs.getWinnerScore(0) + " ");}
2552
+ `;
2553
+ }
2554
+ code += `await count(` + number_ticks + `, tick.now);
2555
+ hop {hop.broadcast('alertInfoScoreOFF');}
2556
+ `;
2557
+ return code;
2558
+ };
2559
+
2560
+ Blockly.defineBlocksWithJsonArray([
2561
+ {
2562
+ "type": "totalGameScore",
2563
+ "lastDummyAlign0": "CENTRE",
2564
+ "message0": "display total game score during %1 ticks",
2565
+ "args0": [
2566
+ {
2567
+ "type": "field_number",
2568
+ "name": "ticks",
2569
+ "value": 2,
2570
+ "check": "Number"
2571
+ }
2572
+ ],
2573
+ "previousStatement": null,
2574
+ "nextStatement": null,
2575
+ "colour": 120,
2576
+ "tooltip": "",
2577
+ "helpUrl": ""
2578
+ }
2579
+ ]);
2580
+
2581
+ Blockly.JavaScript['totalGameScore'] = function(block) {
2582
+ var number_ticks = block.getFieldValue('ticks');
2583
+ if(english){
2584
+ var code = `
2585
+ hop {hop.broadcast('alertInfoScoreON', " Total score for all " + gcs.getTotalGameScore() + " ");}
2586
+ `;
2587
+ }else{
2588
+ var code = `
2589
+ hop {hop.broadcast('alertInfoScoreON', " Total des points " + gcs.getTotalGameScore() + " ");}
2590
+ `;
2591
+ }
2592
+ code += `
2593
+ await count(` + number_ticks + `, tick.now);
2594
+ hop {hop.broadcast('alertInfoScoreOFF');}
2595
+ `;
2596
+ return code;
2597
+ };
2598
+
2599
+ Blockly.defineBlocksWithJsonArray([
2600
+ {
2601
+ "type": "displayScore",
2602
+ "lastDummyAlign0": "CENTRE",
2603
+ "message0": "display score of rank %1 during %2 ticks",
2604
+ "args0": [
2605
+ {
2606
+ "type": "field_number",
2607
+ "name": "rank",
2608
+ "value": 1,
2609
+ "check": "Number"
2610
+ },
2611
+ {
2612
+ "type": "field_number",
2613
+ "name": "ticks",
2614
+ "value": 2,
2615
+ "check": "Number"
2616
+ }
2617
+ ],
2618
+ "previousStatement": null,
2619
+ "nextStatement": null,
2620
+ "colour": 120,
2621
+ "tooltip": "",
2622
+ "helpUrl": ""
2623
+ }
2624
+ ]);
2625
+
2626
+ Blockly.JavaScript['displayScore'] = function(block) {
2627
+ var value_rank = block.getFieldValue('rank');
2628
+ value_rank--;
2629
+ var code = '';
2630
+
2631
+ if( value_rank < 0 ){
2632
+ value_rank = 0;
2633
+ code += ` hop{ console.log("WARN: hiphop_blocks.js: displayScore : rank from 1, not 0"); }
2634
+ `;
2635
+ }
2636
+
2637
+ var number_ticks = block.getFieldValue('ticks');
2638
+ code += `
2639
+ hop {
2640
+ var pseudoLoc = gcs.getWinnerPseudo(` + value_rank + `);
2641
+ if ( pseudoLoc !== ''){`;
2642
+ if(english){
2643
+ code += `hop.broadcast('alertInfoScoreON', " N° " + ` + (value_rank + 1) + ` + " " + pseudoLoc + " with " + gcs.getWinnerScore(`+ value_rank + `) + " ");`;
2644
+ }else{
2645
+ code += `hop.broadcast('alertInfoScoreON', " N° " + ` + (value_rank + 1) + ` + " " + pseudoLoc + " avec " + gcs.getWinnerScore(`+ value_rank + `) + " ");`;
2646
+ }
2647
+ code += `
2648
+ }else{
2649
+ console.log("WARN: hiphop_blocks.js: displayScore : no score for the rank ` + value_rank + `");
2650
+ }
2651
+ }
2652
+ await count(` + number_ticks + `, tick.now);
2653
+ hop {hop.broadcast('alertInfoScoreOFF');}
2654
+ `;
2655
+ return code;
2656
+ };
2657
+
2658
+ Blockly.defineBlocksWithJsonArray([
2659
+ {
2660
+ "type": "displayScoreGroup",
2661
+ "lastDummyAlign0": "CENTRE",
2662
+ "message0": "display group score of rank %1 during %2 ticks",
2663
+ "args0": [
2664
+ {
2665
+ "type": "field_number",
2666
+ "name": "rank",
2667
+ "value": 1,
2668
+ "check": "Number"
2669
+ },
2670
+ {
2671
+ "type": "field_number",
2672
+ "name": "ticks",
2673
+ "value": 2,
2674
+ "check": "Number"
2675
+ }
2676
+ ],
2677
+ "previousStatement": null,
2678
+ "nextStatement": null,
2679
+ "colour": 120,
2680
+ "tooltip": "",
2681
+ "helpUrl": ""
2682
+ }
2683
+ ]);
2684
+
2685
+ Blockly.JavaScript['displayScoreGroup'] = function(block) {
2686
+ var value_rank = block.getFieldValue('rank');
2687
+ value_rank--;
2688
+ var code = '';
2689
+
2690
+ if( value_rank < 0 ){
2691
+ value_rank = 0;
2692
+ code += ` hop{ console.log("WARN: hiphop_blocks.js: displayScoreGroup : rank from 1, not 0"); }
2693
+ `;
2694
+ }
2695
+
2696
+ var number_ticks = block.getFieldValue('ticks');
2697
+ if(english){
2698
+ code += `
2699
+ hop {
2700
+ hop.broadcast('alertInfoScoreON', " Skini group N° " + ` + (value_rank + 1) + ` + " with " + gcs.getGroupScore(`+ value_rank + `) + " ");
2701
+ }`;
2702
+ }else{
2703
+ code += `
2704
+ hop {
2705
+ hop.broadcast('alertInfoScoreON', " Groupe Skini N° " + ` + (value_rank + 1) + ` + " avec " + gcs.getGroupScore(`+ value_rank + `) + " ");
2706
+ }`;
2707
+ }
2708
+ code += `
2709
+ await count(` + number_ticks + `, tick.now);
2710
+ hop {hop.broadcast('alertInfoScoreOFF');}
2711
+ `;
2712
+ return code;
2713
+ };
2714
+
2715
+
2716
+ Blockly.defineBlocksWithJsonArray([
2717
+ {
2718
+ "type": "set_score_policy",
2719
+ "message0": "set scoring policy %1 ",
2720
+ "args0": [
2721
+ {
2722
+ "type": "field_number",
2723
+ "name": "policy",
2724
+ "value": 1,
2725
+ "check": "Number"
2726
+ }
2727
+ ],
2728
+ "previousStatement": null,
2729
+ "nextStatement": null,
2730
+ "colour": 120,
2731
+ "tooltip": "",
2732
+ "helpUrl": ""
2733
+ }
2734
+ ]);
2735
+
2736
+ Blockly.JavaScript['set_score_policy'] = function(block) {
2737
+ var number_policy = block.getFieldValue('policy');
2738
+ var code = 'emit setComputeScorePolicy(' + number_policy + ');\n';
2739
+ return code;
2740
+ };
2741
+
2742
+ Blockly.defineBlocksWithJsonArray([
2743
+ {
2744
+ "type": "set_score_class",
2745
+ "message0": "set scoring class %1 ",
2746
+ "args0": [
2747
+ {
2748
+ "type": "field_number",
2749
+ "name": "class",
2750
+ "value": 1,
2751
+ "check": "Number"
2752
+ }
2753
+ ],
2754
+ "previousStatement": null,
2755
+ "nextStatement": null,
2756
+ "colour": 120,
2757
+ "tooltip": "",
2758
+ "helpUrl": ""
2759
+ }
2760
+ ]);
2761
+
2762
+ Blockly.JavaScript['set_score_class'] = function(block) {
2763
+ var number_class = block.getFieldValue('class');
2764
+ var code = 'emit setComputeScoreClass(' + number_class + ');\n';
2765
+ return code;
2766
+ };
2767
+
2768
+ Blockly.defineBlocksWithJsonArray([
2769
+ {
2770
+ "type": "open_tank",
2771
+ "message0": "run tank(s) %1 during %2 ticks",
2772
+ "args0": [
2773
+ {
2774
+ "type": "input_value",
2775
+ "name": "TANKS",
2776
+ },
2777
+ {
2778
+ "type": "field_number",
2779
+ "name": "TIMES",
2780
+ "value": 1,
2781
+ "check": "Number"
2782
+ }
2783
+ ],
2784
+ "inputsInline": true,
2785
+ "previousStatement": null,
2786
+ "nextStatement": null,
2787
+ "colour": 300,
2788
+ "tooltip": "",
2789
+ "helpUrl": ""
2790
+ }
2791
+ ]);
2792
+
2793
+ Blockly.JavaScript['open_tank'] = function(block) {
2794
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'TANKS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
2795
+ let value = statements_name.replace(/;\n/g, "");
2796
+ let listTanks = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
2797
+
2798
+ let times = block.getFieldValue('TIMES');
2799
+ let signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
2800
+
2801
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
2802
+
2803
+ //let code = 'hop{console.log: (\" open_tank: tank \",' + tank + ",\" time:\", " + times + ",\" signal\", " + signal + ");}\n" ;
2804
+ let code = "signal stop" + varRandom + ";\n";
2805
+ code += "trap" + varRandom + ":{ \n"
2806
+ code += " fork{\n";
2807
+ for(var i=0; i < listTanks.length; i++){
2808
+ code += "run ${" + listTanks[i] + "}(..., stopReservoir as stop" + varRandom + ");\n";
2809
+ }
2810
+ code += " }par{\n"
2811
+ code += " await count (" + times + ", tick.now);\n"
2812
+ code += " emit stop" + varRandom + "();\n"
2813
+ code += " break trap" + varRandom + ";\n" ;
2814
+ code += " }\n";
2815
+ code += "}\n";
2816
+ code += "yield;\n";
2817
+ return code;
2818
+ };
2819
+
2820
+ Blockly.defineBlocksWithJsonArray([
2821
+ {
2822
+ "type": "run_tank_during_patterns_in_groups",
2823
+ "message0": "run tank(s) %1 during %2 patterns in group(s) %3",
2824
+ "args0": [
2825
+ {
2826
+ "type": "input_value",
2827
+ "name": "TANKS",
2828
+ },
2829
+ {
2830
+ "type": "field_number",
2831
+ "name": "number_of_patterns",
2832
+ "value": 1,
2833
+ "check": "Number"
2834
+ },
2835
+ {
2836
+ "type": "input_value",
2837
+ "name": "IN_GROUPS",
2838
+ }
2839
+ ],
2840
+ "inputsInline": true,
2841
+ "previousStatement": null,
2842
+ "nextStatement": null,
2843
+ "colour": 300,
2844
+ "tooltip": "",
2845
+ "helpUrl": ""
2846
+ }
2847
+ ]);
2848
+
2849
+ Blockly.JavaScript['run_tank_during_patterns_in_groups'] = function(block) {
2850
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'TANKS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
2851
+ let value = statements_name.replace(/;\n/g, "");
2852
+ let listTanks = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
2853
+
2854
+ let number_of_patterns = block.getFieldValue('number_of_patterns');
2855
+
2856
+ let in_groups = Blockly.JavaScript.valueToCode(block, 'IN_GROUPS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
2857
+ let in_value = in_groups.replace(/;\n/g, "");
2858
+ let in_listGroups = in_value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
2859
+
2860
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
2861
+
2862
+ //let code = 'hop{console.log: (\" open_tank: tank \",' + tank + ",\" time:\", " + times + ",\" signal\", " + signal + ");}\n" ;
2863
+ let code = "signal stop" + varRandom + ";\n";
2864
+ code += "trap" + varRandom + ":{ \n"
2865
+ code += " fork{\n";
2866
+ for(var i=0; i < listTanks.length; i++){
2867
+ code += "run ${" + listTanks[i] + "}(..., stopReservoir as stop" + varRandom + ");\n";
2868
+ }
2869
+ code += " }par{\n"
2870
+ code += " await count (" + number_of_patterns + "," + in_listGroups[0] + "IN.now";
2871
+
2872
+ for(var i=1; i < in_listGroups.length; i++){
2873
+ code += "|| " + in_listGroups[i] + "IN.now"
2874
+ }
2875
+ code += ");\n";
2876
+ code += " emit stop" + varRandom + "();\n"
2877
+ code += " break trap" + varRandom + ";\n";
2878
+ code += " }\n";
2879
+ code += "}\n";
2880
+ code += "yield;\n";
2881
+ return code;
2882
+ };
2883
+
2884
+ Blockly.defineBlocksWithJsonArray([
2885
+ {
2886
+ "type": "run_tank_waiting_for_patterns",
2887
+ "message0": "run tank(s) %1 waiting for pattern(s) %2",
2888
+ "args0": [
2889
+ {
2890
+ "type": "input_value",
2891
+ "name": "TANKS"
2892
+ },
2893
+ {
2894
+ "type": "input_value",
2895
+ "name": "IN_PATTERNS_LIST",
2896
+ }
2897
+ ],
2898
+ "inputsInline": true,
2899
+ "previousStatement": null,
2900
+ "nextStatement": null,
2901
+ "colour": 300,
2902
+ "tooltip": "",
2903
+ "helpUrl": ""
2904
+ }
2905
+ ]);
2906
+
2907
+ Blockly.JavaScript['run_tank_waiting_for_patterns'] = function(block) {
2908
+ let statements_name = Blockly.JavaScript.valueToCode(block, 'TANKS', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
2909
+ let value = statements_name.replace(/;\n/g, "");
2910
+ let listTanks = value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
2911
+
2912
+ let in_patterns_list = Blockly.JavaScript.valueToCode(block, 'IN_PATTERNS_LIST', Blockly.JavaScript.ORDER_ATOMIC) || '\'\'';
2913
+ let in_value = in_patterns_list.replace(/;\n/g, "");
2914
+ in_patterns_list = in_value.replace(/\[/, "").replace(/\]/, "").replace(/ /g, "").split(',');
2915
+
2916
+ var varRandom = Math.floor((Math.random() * 1000000) + 1 );
2917
+
2918
+ //let code = 'hop{console.log: (\" open_tank: tank \",' + tank + ",\" time:\", " + times + ",\" signal\", " + signal + ");}\n" ;
2919
+ let code = "signal stop" + varRandom + ";\n";
2920
+ code += "trap" + varRandom + ":{ \n"
2921
+ code += " fork{\n";
2922
+ for(var i=0; i < listTanks.length; i++){
2923
+ code += "run ${" + listTanks[i] + "}(..., stopReservoir as stop" + varRandom + ");\n";
2924
+ }
2925
+ code += " }par{\n"
2926
+ code += " await (patternSignal.now && (patternSignal.nowval[1] === " + in_patterns_list[0] + "));\n"
2927
+ for(var i=1; i < in_patterns_list.length; i++){
2928
+ code += " }par{"
2929
+ code += "await (patternSignal.now && (patternSignal.nowval[1] === " + in_patterns_list[i] + "));\n"
2930
+ }
2931
+ code += "}\n";
2932
+ code += " emit stop" + varRandom + "();\n"
2933
+ code += " break trap" + varRandom + ";\n";
2934
+ code += "}\n";
2935
+ code += "yield;\n";
2936
+ return code;
2937
+ };
2938
+
2939
+ Blockly.defineBlocksWithJsonArray([
2940
+ {
2941
+ "type": "move_tempo",
2942
+ "message0": "bounce tempo of %1, every %2 and during %4 : signal %3 ",
2943
+ "args0": [
2944
+ {
2945
+ "type": "field_number",
2946
+ "name": "VALUE",
2947
+ "value": 1,
2948
+ "check": "Number"
2949
+ },
2950
+ {
2951
+ "type": "field_number",
2952
+ "name": "EVERY",
2953
+ "value": 1,
2954
+ "check": "Number"
2955
+ },
2956
+ {
2957
+ "type": "input_value",
2958
+ "name": "SIGNAL",
2959
+ "check": "String"
2960
+ },
2961
+ {
2962
+ "type": "field_number",
2963
+ "name": "LIMIT",
2964
+ "value": 1,
2965
+ "check": "Number"
2966
+ }
2967
+ ],
2968
+ "inputsInline": true,
2969
+ "previousStatement": null,
2970
+ "nextStatement": null,
2971
+ "colour": 330,
2972
+ "tooltip": "",
2973
+ "helpUrl": ""
2974
+ }
2975
+ ]);
2976
+
2977
+ Blockly.JavaScript['move_tempo'] = function(block) {
2978
+ let value = block.getFieldValue('VALUE');
2979
+ let every = block.getFieldValue('EVERY');
2980
+ let signal = Blockly.JavaScript.valueToCode(block, 'SIGNAL', Blockly.JavaScript.ORDER_ATOMIC);
2981
+ let limit = block.getFieldValue('LIMIT');
2982
+
2983
+ //let code = 'hop{console.log: (\" move_tempo: \",' + value + ",\" every:\", " + every + ",\" signal\", " + signal + ");}\n" ;
2984
+ let code = `hop{
2985
+ countInverseBougeTempo = ` + limit + `;
2986
+ bougeTempoRythme = ` + every +`;
2987
+ bougeTempoValue = `+ value + `;
2988
+ }
2989
+ `
2990
+ code += "run ${bougeTempo}(..., tick as " + signal + ");\n"
2991
+ return code;
2992
+ };
2993
+
2994
+ Blockly.defineBlocksWithJsonArray([
2995
+ {
2996
+ "type": "abort_move_tempo",
2997
+ "lastDummyAlign0": "CENTRE",
2998
+ "message0": "stop move tempo",
2999
+ "previousStatement": null,
3000
+ "nextStatement": null,
3001
+ "colour": 330,
3002
+ "tooltip": "",
3003
+ "helpUrl": ""
3004
+ }
3005
+ ]);
3006
+
3007
+ Blockly.JavaScript['abort_move_tempo'] = function(block) {
3008
+ var code = 'emit abortBougeTempo();\n';
3009
+ return code;
3010
+ };