nodeskini 1.0.0

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.
Files changed (215) hide show
  1. package/README.md +31 -0
  2. package/client/archive/bundle.js +11528 -0
  3. package/client/archive/golem.html +60 -0
  4. package/client/archive/golemClient.js +595 -0
  5. package/client/archive/golembundle.js +11634 -0
  6. package/client/archive/sequencer.html +43 -0
  7. package/client/archive/sequenceurClient.js +815 -0
  8. package/client/archive/stylegolem.css +158 -0
  9. package/client/archive/stylesequenceur.css +204 -0
  10. package/client/clientListe/Sortable-master/.circleci/config.yml +33 -0
  11. package/client/clientListe/Sortable-master/.editorconfig +15 -0
  12. package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/bug-report.md +73 -0
  13. package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/custom-template.md +48 -0
  14. package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/feature-request.md +41 -0
  15. package/client/clientListe/Sortable-master/.jshintrc +25 -0
  16. package/client/clientListe/Sortable-master/.testcaferc.json +7 -0
  17. package/client/clientListe/Sortable-master/CONTRIBUTING.md +26 -0
  18. package/client/clientListe/Sortable-master/LICENSE +21 -0
  19. package/client/clientListe/Sortable-master/README.md +813 -0
  20. package/client/clientListe/Sortable-master/Sortable.js +3709 -0
  21. package/client/clientListe/Sortable-master/Sortable.min.js +2 -0
  22. package/client/clientListe/Sortable-master/Sortable.min.old.js +2 -0
  23. package/client/clientListe/Sortable-master/Sortable.min.old.old.js +2 -0
  24. package/client/clientListe/Sortable-master/babel.config.js +27 -0
  25. package/client/clientListe/Sortable-master/bower.json +30 -0
  26. package/client/clientListe/Sortable-master/entry/entry-complete.js +8 -0
  27. package/client/clientListe/Sortable-master/entry/entry-core.js +19 -0
  28. package/client/clientListe/Sortable-master/entry/entry-defaults.js +19 -0
  29. package/client/clientListe/Sortable-master/index.html +460 -0
  30. package/client/clientListe/Sortable-master/modular/sortable.complete.esm.js +3701 -0
  31. package/client/clientListe/Sortable-master/modular/sortable.core.esm.js +3698 -0
  32. package/client/clientListe/Sortable-master/modular/sortable.esm.js +3699 -0
  33. package/client/clientListe/Sortable-master/package-lock.json +5704 -0
  34. package/client/clientListe/Sortable-master/package.json +56 -0
  35. package/client/clientListe/Sortable-master/plugins/AutoScroll/AutoScroll.js +270 -0
  36. package/client/clientListe/Sortable-master/plugins/AutoScroll/README.md +80 -0
  37. package/client/clientListe/Sortable-master/plugins/AutoScroll/index.js +1 -0
  38. package/client/clientListe/Sortable-master/plugins/MultiDrag/MultiDrag.js +617 -0
  39. package/client/clientListe/Sortable-master/plugins/MultiDrag/README.md +96 -0
  40. package/client/clientListe/Sortable-master/plugins/MultiDrag/index.js +1 -0
  41. package/client/clientListe/Sortable-master/plugins/OnSpill/OnSpill.js +79 -0
  42. package/client/clientListe/Sortable-master/plugins/OnSpill/README.md +60 -0
  43. package/client/clientListe/Sortable-master/plugins/OnSpill/index.js +1 -0
  44. package/client/clientListe/Sortable-master/plugins/README.md +178 -0
  45. package/client/clientListe/Sortable-master/plugins/Swap/README.md +55 -0
  46. package/client/clientListe/Sortable-master/plugins/Swap/Swap.js +90 -0
  47. package/client/clientListe/Sortable-master/plugins/Swap/index.js +1 -0
  48. package/client/clientListe/Sortable-master/scripts/banner.js +8 -0
  49. package/client/clientListe/Sortable-master/scripts/build.js +17 -0
  50. package/client/clientListe/Sortable-master/scripts/esm-build.js +28 -0
  51. package/client/clientListe/Sortable-master/scripts/minify.js +11 -0
  52. package/client/clientListe/Sortable-master/scripts/test-compat.js +30 -0
  53. package/client/clientListe/Sortable-master/scripts/test.js +21 -0
  54. package/client/clientListe/Sortable-master/scripts/umd-build.js +15 -0
  55. package/client/clientListe/Sortable-master/src/Animation.js +175 -0
  56. package/client/clientListe/Sortable-master/src/BrowserInfo.js +12 -0
  57. package/client/clientListe/Sortable-master/src/EventDispatcher.js +57 -0
  58. package/client/clientListe/Sortable-master/src/PluginManager.js +87 -0
  59. package/client/clientListe/Sortable-master/src/Sortable.js +1971 -0
  60. package/client/clientListe/Sortable-master/src/utils.js +556 -0
  61. package/client/clientListe/Sortable-master/st/app.js +224 -0
  62. package/client/clientListe/Sortable-master/st/iframe/frame.html +32 -0
  63. package/client/clientListe/Sortable-master/st/iframe/index.html +49 -0
  64. package/client/clientListe/Sortable-master/st/logo.png +0 -0
  65. package/client/clientListe/Sortable-master/st/og-image.png +0 -0
  66. package/client/clientListe/Sortable-master/st/prettify/prettify.css +1 -0
  67. package/client/clientListe/Sortable-master/st/prettify/prettify.js +46 -0
  68. package/client/clientListe/Sortable-master/st/prettify/run_prettify.js +64 -0
  69. package/client/clientListe/Sortable-master/st/saucelabs.svg +1 -0
  70. package/client/clientListe/Sortable-master/st/theme.css +254 -0
  71. package/client/clientListe/Sortable-master/tests/Sortable.compat.test.js +39 -0
  72. package/client/clientListe/Sortable-master/tests/Sortable.test.js +386 -0
  73. package/client/clientListe/Sortable-master/tests/dual-list.html +34 -0
  74. package/client/clientListe/Sortable-master/tests/empty-list.html +30 -0
  75. package/client/clientListe/Sortable-master/tests/filter.html +27 -0
  76. package/client/clientListe/Sortable-master/tests/handles.html +27 -0
  77. package/client/clientListe/Sortable-master/tests/nested.html +67 -0
  78. package/client/clientListe/Sortable-master/tests/single-list.html +25 -0
  79. package/client/clientListe/Sortable-master/tests/style.css +18 -0
  80. package/client/clientListe/clientListe.html +148 -0
  81. package/client/clientListe/clientListe.js +1508 -0
  82. package/client/clientListe/clientListebundle.js +13164 -0
  83. package/client/clientListe/images/poubelle.png +0 -0
  84. package/client/clientListe/images/start.png +0 -0
  85. package/client/clientListe/images/stop.png +0 -0
  86. package/client/clientListe/images/submit.png +0 -0
  87. package/client/clientListe/sortable-theme-bootstrap.css +90 -0
  88. package/client/configurateur/configReact.js +273 -0
  89. package/client/configurateur/configReactbundle.js +295 -0
  90. package/client/configurateur/configurateur.css +95 -0
  91. package/client/configurateur/configurateur.html +48 -0
  92. package/client/configurateur/lib/jexcel.css +755 -0
  93. package/client/configurateur/lib/jexcel.js +14970 -0
  94. package/client/configurateur/lib/jsuites.css +2801 -0
  95. package/client/configurateur/lib/jsuites.js +11822 -0
  96. package/client/configurateur/lib/react-dom.production.min.js +239 -0
  97. package/client/configurateur/lib/react.production.min.js +32 -0
  98. package/client/configurateur/src/configReact.js +247 -0
  99. package/client/controleur/clientcontroleur.js +536 -0
  100. package/client/controleur/clientcontroleur.test.js +282 -0
  101. package/client/controleur/controleur.html +51 -0
  102. package/client/controleur/controleurbundle.js +565 -0
  103. package/client/controleur/stylecontroleur.css +236 -0
  104. package/client/controleurHH/controleurHH.html +71 -0
  105. package/client/controleurHH/controleurHH.js +252 -0
  106. package/client/controleurHH/styles/index.css +320 -0
  107. package/client/controleurHH/styles/material.css +11552 -0
  108. package/client/parametrage/paramReact.js +473 -0
  109. package/client/parametrage/paramReactbundle.js +500 -0
  110. package/client/parametrage/parametrage.css +111 -0
  111. package/client/parametrage/parametrage.html +163 -0
  112. package/client/parametrage/src/paramReact.js +459 -0
  113. package/client/score/hash.js +83 -0
  114. package/client/score/p5.min.js +3 -0
  115. package/client/score/parto1.js +1171 -0
  116. package/client/score/parto1bundle.js +1181 -0
  117. package/client/score/processing.min.js +431 -0
  118. package/client/score/score.html +15 -0
  119. package/client/score/score.js +34 -0
  120. package/client/simulateurListe/simulateurFork.js +750 -0
  121. package/client/simulateurListe/simulateurFork.mjs +681 -0
  122. package/client/simulateurListe/simulateurForkSansReorg.js +569 -0
  123. package/client/simulateurListe/simulateurListe.js +628 -0
  124. package/myReact/archive/Nodeemitvaluedlocal1.hh.js +52 -0
  125. package/myReact/archive/abort-parNode.js +79 -0
  126. package/myReact/archive/abroNode.js +169 -0
  127. package/myReact/archive/abroNode2.js +80 -0
  128. package/myReact/archive/atom.compile.hh.js +51 -0
  129. package/myReact/archive/await-countNode.js +67 -0
  130. package/myReact/archive/await-nowvalNode.js +44 -0
  131. package/myReact/archive/callHH.js +96 -0
  132. package/myReact/archive/emit-if2.hh.compiled.js +113 -0
  133. package/myReact/archive/every1Node.js +35 -0
  134. package/myReact/archive/if-runNode.js +74 -0
  135. package/myReact/archive/if1Node.js +43 -0
  136. package/myReact/archive/makeawait.js +0 -0
  137. package/myReact/archive/myReact.old.js +684 -0
  138. package/myReact/archive/orchestration.js +281 -0
  139. package/myReact/archive/orchestration1.js +132 -0
  140. package/myReact/archive/orchestration1.xml +465 -0
  141. package/myReact/archive/orchestration2.js +161 -0
  142. package/myReact/archive/orchestrationHH.mano.js +280 -0
  143. package/myReact/archive/orchestrationHHTest.js +428 -0
  144. package/myReact/archive/orchestrationHHTest.xml +234 -0
  145. package/myReact/archive/orchestrationHHTestRun.js +104 -0
  146. package/myReact/archive/orchestrationHHTestRun.xml +34 -0
  147. package/myReact/archive/orchestrationTest0.js +178 -0
  148. package/myReact/archive/orchestrationTest1.js +181 -0
  149. package/myReact/archive/orchestrationTest2.js +281 -0
  150. package/myReact/archive/run3pointsNode.js +59 -0
  151. package/myReact/archive/runNode.js +123 -0
  152. package/myReact/archive/runNode2.js +91 -0
  153. package/myReact/archive/testAwait1.js +141 -0
  154. package/myReact/archive/testAwait1.xml +86 -0
  155. package/myReact/archive/testEvery1.js +122 -0
  156. package/myReact/archive/testEvery1.xml +79 -0
  157. package/myReact/archive/testHH1.js +135 -0
  158. package/myReact/archive/testHH1.xml +86 -0
  159. package/myReact/archive/testHH1revu.js +104 -0
  160. package/myReact/archive/testHH2.js +122 -0
  161. package/myReact/archive/testHH2.xml +79 -0
  162. package/myReact/archive/testHH3.js +130 -0
  163. package/myReact/archive/testHH3.xml +86 -0
  164. package/myReact/archive/testHHabort.js +121 -0
  165. package/myReact/archive/testHHabort.xml +83 -0
  166. package/myReact/archive/testMakeawait.js +202 -0
  167. package/myReact/archive/testRun1.js +168 -0
  168. package/myReact/archive/testRun1.xml +142 -0
  169. package/myReact/archive/titi.js +28 -0
  170. package/myReact/archive/titi.xml +110 -0
  171. package/myReact/archive/toto.js +73 -0
  172. package/myReact/archive/toto.xml +198 -0
  173. package/myReact/archive/trap-await-parallelNode.js +123 -0
  174. package/myReact/inutiles/hiver2022.xml +804 -0
  175. package/myReact/inutiles/hopeNode.xml +459 -0
  176. package/myReact/inutiles/mars2022.xml +871 -0
  177. package/myReact/inutiles/mystique1.xml +318 -0
  178. package/myReact/inutiles/mystiqueOSC.xml +277 -0
  179. package/myReact/inutiles/opus5Node.xml +1271 -0
  180. package/myReact/inutiles/opus5NodeLinux.xml +1241 -0
  181. package/myReact/inutiles/orchestrationHH.xml +541 -0
  182. package/myReact/inutiles/orchestrationHH2.xml +547 -0
  183. package/myReact/inutiles/testHH.xml +95 -0
  184. package/myReact/inutiles/trouveLaPercuTenor.xml +349 -0
  185. package/myReact/myReact.js +744 -0
  186. package/myReact/myReact.min.js +1 -0
  187. package/myReact/orchestrationHH.js +311 -0
  188. package/myReact/orchestrationHH.mjs +436 -0
  189. package/myReact/orchestrationHH.mjs.map +1 -0
  190. package/package.json +46 -0
  191. package/serveur/OSCandMidi.mjs +361 -0
  192. package/serveur/computeScore.mjs +415 -0
  193. package/serveur/controleDAW.mjs +1149 -0
  194. package/serveur/defaultSession.csv +2 -0
  195. package/serveur/defaultSkiniParametres.js +119 -0
  196. package/serveur/gameOSC.mjs +96 -0
  197. package/serveur/groupeClientsSons.mjs +1014 -0
  198. package/serveur/ipConfig.json +24 -0
  199. package/serveur/ipConfig127.json +19 -0
  200. package/serveur/ipConfig75.json +17 -0
  201. package/serveur/ipConfigBH.json +19 -0
  202. package/serveur/ipConfigLocal.json +19 -0
  203. package/serveur/midiConfig.json +26 -0
  204. package/serveur/midiConfigBH.json +26 -0
  205. package/serveur/midiConfigVoid.json +3 -0
  206. package/serveur/midimix.mjs +570 -0
  207. package/serveur/saveParam.mjs +159 -0
  208. package/serveur/skiniParametres.good.js +132 -0
  209. package/serveur/skiniParametres.js +106 -0
  210. package/serveur/utilsHHSkini.hh.js +64 -0
  211. package/serveur/utilsSkini.mjs +137 -0
  212. package/serveur/websocketServer.mjs +2052 -0
  213. package/serveur/workerInterfaceZ.mjs +327 -0
  214. package/serveur/workerSynchro.mjs +49 -0
  215. package/skini.mjs +141 -0
@@ -0,0 +1,815 @@
1
+ function info() {
2
+ console.log("INFO TROIS");
3
+ }
4
+
5
+
6
+ //******************
7
+ var $=require('jquery');
8
+ $('#test').text('browserify working');
9
+
10
+ var port;
11
+ var ws;
12
+ var wsProcessing;
13
+
14
+ var par = require('../serveur/logosParametres');
15
+ //var oscMidi = require('../serveur/logosOSCandMidiLocal');
16
+
17
+ var id = Math.floor((Math.random() * 1000000) + 1 ); // Pour identifier le client
18
+ var src = -1;
19
+ var pseudo;
20
+ var debug = true;
21
+
22
+ // Résolutions en tick: le tick est la durée en ms séparant deux événements du séquenceur. Elle sera définie par le tempo.
23
+ // Le tick minimum est défini par le PPCM entre une triple croche en mode binaire et ternaire (on ne va pas plus loin que la
24
+ // triple croche comme définition sur le Pad).
25
+ // La passage d'un décompte entre ternaire et binaire et nécessaire pour les triolets et les rythmes ternaires (6/8, 9/8 etc.)
26
+ // Deux croches = un triolet de 3 croches
27
+ //
28
+ const tripleCrocheTR = 2;
29
+ const tripleCrocheR = 3;
30
+ const doubleCrocheTR = 4;
31
+ const doubleCrocheR = 6;
32
+ const crocheTR = 8;
33
+ const crocheR = 12;
34
+ const noireTR = 16;
35
+ const noireR = 24;
36
+ const blancheTR = 32;
37
+ const blancheR = 48;
38
+ const rondeTR = 64;
39
+ const rondeR = 96;
40
+
41
+ // Pour initialisation mais en fait fournis par le serveur **************
42
+
43
+ // DONNEES D'INTERACTION DU SEQUENCEUR A MODIFIER POUR TESTER
44
+ var tempsMesure = 4; // Partie haute de la mesure, nombre de temps dans la mesure
45
+ var divisionMesure = noireR; // Partie basse de la mesure
46
+ var nbeDeMesures = 1;
47
+ var tempo = 60; // à la minute
48
+ var canalMidi = 1;
49
+
50
+ // Durée du tick selon le tempo et la mesure, avec le tempo définie selon une division de la mesure à la minute.
51
+ // C'est la façon classique de faire.
52
+ // ex: 24 ticks = 1 x noire, si noire = 90 => 90 noires / min => une noire toutes les 60/90 sec
53
+ // soit un tick toutes les (60/90) / 24 sec => (60/90)/24 * 1000 ms => tick = 27,7 ms
54
+
55
+ var dureeDuTick = ( (60 / tempo ) / divisionMesure ) * 1000 ; // Exprimé ici en millisecondes
56
+
57
+ // FIN de ce qui est fourni par le serveur **************
58
+
59
+ // Tableau pour le sequenceur, voir si c'est le serveur ou le client qui va définir ce paramètre.
60
+ // ça peut dépendre du niveau d'expertise du client.
61
+ var sequence = new Array( nbeDeMesures * tempsMesure * divisionMesure );
62
+
63
+ var AudioContext = window.AudioContext || window.webkitAudioContext;
64
+ var audioCtx = new AudioContext();
65
+
66
+ // Mécanisme de syncho
67
+ var datePing = 0;
68
+ var datePong = 0;
69
+ var latencePing = 0;
70
+
71
+ var datePingProcessing = 0;
72
+ var datePongProcessing = 0;
73
+ var latencePingProcessing;
74
+
75
+
76
+ var matricePad;
77
+ // La résolution du Pad correspond à la durée en ticks qui sépare deux boutons.
78
+ // ELle permet entre autre de gérer le passage binaire <-> ternaire.
79
+ // Elle est nécessaire pour ajouter des notes dans la séquence.
80
+
81
+ // DONNEES D'INTERACTION DU PAD A MODIFIER POUR TESTER
82
+ var resolutionPad = doubleCrocheR;
83
+ var nbeLignesPad = 88;
84
+
85
+ var nbeColonesPad = nbeDeMesures * tempsMesure * divisionMesure / resolutionPad;
86
+
87
+ // Player
88
+ var player;
89
+ var compteurPlayer = 0;
90
+ var finPlayer = nbeDeMesures * tempsMesure * divisionMesure; //sequence.length;
91
+ var compteurColone = 0;
92
+ var coloneVerteEnCours = 0;
93
+ //var listenMachine;
94
+
95
+ console.log("Taille Séquenceur:", finPlayer , "Durée du Tick: ", dureeDuTick);
96
+
97
+
98
+ var bleu = "#008CBA";
99
+ var rouge = '#CF1919';
100
+ var vert = "#4CAF50";
101
+ var marron = '#666633';
102
+ var violet = '#797bbf';
103
+ var orange = '#b3712d';
104
+
105
+ // Autres déclarations
106
+
107
+ var msg = { // On met des valeurs pas defaut, mais ce n'est pas nécessaire.
108
+ type: "configuration",
109
+ text: "ECRAN_NOIR" ,
110
+ pseudo: "Anonyme",
111
+ value: 0,
112
+ };
113
+
114
+ Number.prototype.mod = function(n) {
115
+ var m = (( this % n) + n) % n;
116
+ return m < 0 ? m + Math.abs(n) : m;
117
+ };
118
+
119
+ function Note(code, vel, duree, index, id) {
120
+ this.codeMidi = code;
121
+ this.velocite = vel;
122
+ this.duree = duree;
123
+ this.index = index;
124
+ }
125
+
126
+ navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate;
127
+
128
+ //service sequenceur();
129
+ //service sequenceurPing();
130
+
131
+ //********** Gestion des sequences **********************
132
+
133
+ function creationSequences(nbeDeMesures, tempsMesure, divisionMesure) {
134
+ sequence = new Array(nbeDeMesures * tempsMesure * divisionMesure );
135
+ }
136
+
137
+ function putNoteInSequence(index, note) {
138
+
139
+ // Si pas encore de note on met le Note On en donnant la vélocité
140
+ if ( sequence[index] == undefined ) {
141
+ sequence[index] = new Array();
142
+ }
143
+ sequence[index].push(note);
144
+
145
+ // On place le Note OFF en mettant une vélocité à 0
146
+ var noteOFF = new Note(note.codeMidi, 0, 0);
147
+ index += (note.duree -1) % finPlayer; // Attention sur la duree qui n'est pas un index
148
+ if ( sequence[index] == undefined ) {
149
+ sequence[index] = new Array();
150
+ }
151
+ sequence[index].push(noteOFF);
152
+ }
153
+
154
+ function getNoteInSequence(index, noteMidi) {
155
+
156
+ if ( sequence[index] == undefined ) { // Pb
157
+ return -1;
158
+ }
159
+ for ( var i=0; i < sequence[index].length; i++) {
160
+ if ( sequence[index][i].codeMidi == noteMidi) {
161
+ return sequence[index][i];
162
+ }
163
+ }
164
+ }
165
+
166
+ function removeNoteInSequence(index, note) {
167
+
168
+ if ( note == undefined ) {
169
+ if (debug) console.log("removeNoteInSequence:note:undefined");
170
+ return -1;
171
+ }
172
+
173
+ if ( sequence[index] == undefined ) {
174
+ return -1;
175
+ }
176
+ else {
177
+ // Avec Websocket
178
+ msg.type = "midiNoteOn";
179
+ msg.bus = par.busMidiFM8;
180
+ msg.canal = canalMidi;
181
+ msg.codeMidi = note.codeMidi;
182
+ msg.velocite = 0;
183
+ datePing = msg.date = audioCtx.currentTime;
184
+ ws.send(JSON.stringify(msg));
185
+
186
+ //oscMidi.sendNoteOn( par.busMidiFM8, canalMidi, note.codeMidi, 0 ).post();
187
+
188
+ var seqLocal = sequence[index + note.duree -1 ]; // Pointe sur le Note Off
189
+ removeNoteInArray(seqLocal, note);
190
+ var seqLocal = sequence[index]; // Pointe sur la note
191
+ removeNoteInArray(seqLocal, note);
192
+ }
193
+ }
194
+
195
+ function removeNoteInArray(groupeNote, note) {
196
+ if ( groupeNote == undefined ) {
197
+ if (debug) console.log("removeNoteInArray:groupeNote:undefined");
198
+ return -1;
199
+ }
200
+
201
+ for ( var i=0; i < groupeNote.length; i++) {
202
+ if ( groupeNote[i].codeMidi == note.codeMidi) {
203
+ groupeNote.splice(i,1); // On enlève la note
204
+ }
205
+ }
206
+ return 0;
207
+ }
208
+
209
+
210
+ //******** Gestion des start et stop
211
+ var playing = false;
212
+ var playingStatus = false;
213
+
214
+ function startPlayerMidi(){
215
+ noteTime = audioCtx.currentTime; // Il faut remettre ce compteur à jour pour démarrer le calage
216
+ // On divise la durée du tick pour s'approcher de l'horloge Webaudio.
217
+ tickTime = audioCtx.currentTime; // On initialise tickTime
218
+ player = setInterval(function() { playerMidi(); }, dureeDuTick / 10); // 10
219
+ }
220
+
221
+ function stopPlayerMidi() {
222
+ console.log("stopPlayerMidi");
223
+ clearInterval(player);
224
+ }
225
+
226
+ function startSequenceur() {
227
+ document.getElementById( "buttonStart").style.display = "none";
228
+ document.getElementById( "buttonStop").style.display = "inline";
229
+ playing = true;
230
+ }
231
+ window.startSequenceur = startSequenceur;
232
+
233
+ function stopSequenceur() {
234
+ document.getElementById( "buttonStart").style.display = "inline";
235
+ document.getElementById( "buttonStop").style.display = "none";
236
+ playing = false;
237
+ }
238
+ window.stopSequenceur = stopSequenceur;
239
+
240
+ function synchroSequenceur() {
241
+ if ( playing != playingStatus) {
242
+ if (playing) {
243
+ startPlayerMidi();
244
+ console.log("START", playing, playingStatus);
245
+ }
246
+ else {
247
+ stopPlayerMidi();
248
+ console.log("STOP", playing, playingStatus);
249
+ }
250
+ playingStatus = playing;
251
+ }
252
+ }
253
+ exports.synchroSequenceur = synchroSequenceur;
254
+
255
+ /*//For Safari audioContext is disabled until there's a user click
256
+ if(audioContext.state === 'suspended'){
257
+ audioContext.resume();
258
+ };*/
259
+
260
+ // playerMidi Joue la séquence Midi et allume le Pad en conséquence. Appelé à chaque tick.
261
+
262
+ var nbeColonesPadPrecedent = nbeColonesPad; // Etat initial
263
+ var coloneVerteEnCoursPrecedent = 0;
264
+ var tickTime;
265
+
266
+ function playerMidi() {
267
+ // L'idée est d'appeler playerMidi avec setInterval à une fréquence
268
+ // supérieure à celle mesurée avec audioCtx.currentTime de Webaudio
269
+ // on peut ainsi avoir une meilleurs précision sur la mesure tu temps
270
+ if ( audioCtx.currentTime < tickTime ) { // C'est trop tôt on ne fait rien
271
+ return;
272
+ }
273
+ tickTime += dureeDuTick / 1000; // Exprimée en seconde pour l'horloge Webaudio et pas ms comme setInterval
274
+ //console.log("TICK:", tickTime);
275
+
276
+ // Pour le midi
277
+ if ( sequence[compteurPlayer] != undefined ) {
278
+ if ( sequence[compteurPlayer].length != 0 ) {
279
+ if (debug) console.log(sequence[compteurPlayer], compteurPlayer);
280
+ for (var i=0; i < sequence[compteurPlayer].length; i++) {
281
+ var noteEnCours = sequence[compteurPlayer][i];
282
+ // Pour test avec FM8
283
+
284
+ // Avec Websocket
285
+ msg.type = "midiNoteOn";
286
+ msg.idClient = id;
287
+ msg.bus = par.busMidiFM8;
288
+ msg.canal = canalMidi;
289
+ msg.codeMidi = noteEnCours.codeMidi;
290
+ msg.velocite = noteEnCours.velocite;
291
+ msg.duree = noteEnCours.duree;
292
+ msg.index = compteurPlayer;
293
+ //ws.send(JSON.stringify(msg)); // Envoi vers serveur HOP
294
+
295
+ // On en profile pour faire un ping
296
+ datePing = msg.date = audioCtx.currentTime;
297
+
298
+ // Envoi sur serveur Processing
299
+ wsProcessing.send(JSON.stringify(msg));
300
+
301
+ //if ( noteEnCours.velocite != 0 ) audioInit.play(); // Test client
302
+ //Test Manuel
303
+ //wsDeTest.send(audioCtx.currentTime * 1000);
304
+ // Avec service Hop
305
+ //oscMidi.sendNoteOn( par.busMidiFM8, canalMidi, noteEnCours.codeMidi, noteEnCours.velocite ).post();
306
+ }
307
+ }
308
+ }
309
+
310
+ compteurPlayer++;
311
+ compteurPlayer %= finPlayer;
312
+
313
+ // Affichage des colonnes
314
+ coloneVerteEnCours = Math.floor(compteurPlayer / resolutionPad);
315
+ if ( coloneVerteEnCours != coloneVerteEnCoursPrecedent ) {
316
+ coloneVerteEnCoursPrecedent = coloneVerteEnCours;
317
+ if ( coloneVerteEnCours == 0 ) { // On est au début du Pad
318
+ setTimeout( function() {
319
+ coloneVerte(0); // On met la premiere colone en vert
320
+ coloneGrise(nbeColonesPad -1); // La précédente colone était la dernière du Pad
321
+ }, latencePing / 2 );
322
+ } else {
323
+ setTimeout( function() {
324
+ coloneGrise(coloneVerteEnCours -1);
325
+ coloneVerte(coloneVerteEnCours);
326
+ }, latencePing / 2 );
327
+ }
328
+ }
329
+ }
330
+
331
+ // ********** Gestion du PAD **********************************
332
+
333
+ function pushNoteInMatricePad(ligne, colone, note) {
334
+ if ( matricePad[ligne][colone] == undefined ) {
335
+ matricePad[ligne][colone] = new Array();
336
+ }
337
+ matricePad[ligne][colone].push(note);
338
+
339
+ var bouton = getButonByAttributes(ligne, colone);
340
+ if ( bouton == undefined ) {
341
+ console.log("pushNoteInMatricePad:undefined", ligne, colone);
342
+ return;
343
+ }
344
+ bouton.setAttribute("class", "padBoutonBleu");
345
+ }
346
+
347
+ function removeNotesInMatricePad(ligne, colone, index) {
348
+
349
+ // Protection
350
+ if ( matricePad[ligne][colone] == undefined ) {
351
+ console.log("removeNotesInMatricePad:undefined", ligne, colone);
352
+ return -1;
353
+ }
354
+ // Supression dans le séquenceur des notes référencées dans (ligne, colone)
355
+ // de la matricePad.
356
+ var notesASupprimer = matricePad[ligne][colone];
357
+ for ( var i=0; i < notesASupprimer.length; i++ ) {
358
+ removeNoteInSequence(notesASupprimer[i].index, notesASupprimer[i]);
359
+ }
360
+
361
+ // Supression de l'élément de la matrice
362
+ if ( matricePad[ligne][colone] == undefined ) {
363
+ return -1;
364
+ }
365
+ matricePad[ligne][colone].splice(0);
366
+
367
+ // Changement d'affichage sur le Pad
368
+ var bouton = getButonByAttributes(ligne, colone);
369
+ if ( bouton == undefined ) {
370
+ console.log("removeNotesInMatricePad:undefined", ligne, colone);
371
+ return;
372
+ }
373
+ bouton.setAttribute("class", "padBouton");
374
+ }
375
+
376
+ function getButonByAttributes(ligne, colone) {
377
+ // Syntaxe trés difficile à trouver
378
+ var critere = "[data-ligne ='" + ligne + "']" + "[data-colone ='" + colone + "']";
379
+ // Retourne une liste
380
+ var boutons = document.querySelectorAll(critere);
381
+ //console.log("getButonByAttributes",boutons);
382
+
383
+ // Il n'y a qu'un bouton on prend donc le premier element de la liste.
384
+ return boutons[0];
385
+ }
386
+
387
+ noteString = ["C-", "Db", "D-", "Eb", "E-", "F-", "Gb", "G-", "Ab", "A-", "Bb", "B-" ];
388
+
389
+ function midiToNote (noteNum) {
390
+ var octv;
391
+ var nt;
392
+ octv = (noteNum / 12)-2;
393
+ nt = noteString[noteNum % 12];
394
+ return nt + Math.floor(octv) + " ";
395
+ }
396
+
397
+ function creationPad(ligneFin, colones){
398
+
399
+ var place = document.getElementById("listBoutonsSons");
400
+ var compteurBouton = 0;
401
+
402
+ // On vide le PAD
403
+ while (place.firstChild) {
404
+ place.removeChild(place.firstChild);
405
+ }
406
+
407
+ for(var i = ligneFin -1 ; i >= 0 ;i--) {
408
+ var em = document.createElement("a");
409
+ em.setAttribute("class", "texteNote");
410
+ place.appendChild(em);
411
+ em.innerHTML = midiToNote(i);
412
+
413
+ for(var j=0;j< colones ;j++){
414
+ var bouton = document.createElement("button");
415
+ bouton.id = "padBouton" + compteurBouton;
416
+ compteurBouton++;
417
+ bouton.dataset.ligne = i;
418
+ bouton.dataset.colone = j;
419
+
420
+ bouton.setAttribute("class", "padBouton");
421
+ bouton.addEventListener("click", function(event) { clickPadBouton(this.id); });
422
+ place.appendChild(bouton);
423
+ }
424
+ var el = document.createElement("br");
425
+ place.appendChild(el);
426
+ }
427
+
428
+ // Modifier l'affichage des boutons en fonction du séquenceur
429
+ updateMatricePad(ligneFin, colones, resolutionPad);
430
+ }
431
+
432
+ function initMatricePad(ligneFin, colones) {
433
+ // Créer la matrice vide
434
+ matricePad = new Array();
435
+ for (var i = 0; i < ligneFin; i++) {
436
+ matricePad[i] = [];
437
+ for ( var j=0; j < colones; j++ ) {
438
+ matricePad[i][j] = [];
439
+ }
440
+ }
441
+ }
442
+
443
+ function updateMatricePad(ligneFin, colones, resolution) {
444
+ var lignePad = 0;
445
+ var colonePad = 0;
446
+
447
+ // Remise a 0 de la matrice;
448
+ initMatricePad(ligneFin, colones);
449
+
450
+ // Remplie la matrice avec la sequence
451
+ // C'est utilisé quand on change de résolution pour la saisie des notes.
452
+ for ( var i=0; i < sequence.length; i ++ ) {
453
+
454
+ colonePad = Math.floor(i / resolution); // Assignation de la note à la colone juste avant.
455
+
456
+ if( sequence[i] != undefined ) {
457
+ for (var j=0; j < sequence[i].length; j++) {
458
+
459
+ var noteEnCours = sequence[i][j];
460
+ lignePad = noteEnCours.codeMidi;
461
+
462
+ //console.log("updateMatricePad:sequence[]", sequence[i][j], lignePad, colonePad );
463
+ if ( noteEnCours.duree != 0 ) // Quand on n'est pas sur le NotOFF
464
+ pushNoteInMatricePad(lignePad, colonePad, noteEnCours);
465
+ }
466
+ }
467
+ }
468
+ //console.log("updateMatricePad:MATRICE PAD", matricePad);
469
+ }
470
+ exports.updateMatricePad = updateMatricePad;
471
+
472
+ function changeResolutionPad(resolution, monId) {
473
+ var nbeColones = nbeDeMesures * tempsMesure * divisionMesure / resolution;
474
+ nbeColonesPad = nbeColones;
475
+ resolutionPad = resolution; // A mettre ailleurs peut-etre.
476
+ creationPad(nbeLignesPad, nbeColones);
477
+ console.log("changeResolutionPad:", nbeLignesPad, nbeColones, resolution);
478
+ updateMatricePad(nbeLignesPad, nbeColones, resolution);
479
+
480
+ // Un peu bourin, je sais
481
+ var elements = document.getElementsByClassName("buttonResolution");
482
+ for ( var i=0; i< elements.length; i++) {
483
+ elements[i].style.backgroundColor = "#666633";
484
+ }
485
+ if (monId != undefined) monId.style.backgroundColor = "#CF1919"; // Rouge
486
+ }
487
+ window.changeResolutionPad = changeResolutionPad;
488
+
489
+ function coloneVerte(colone) {
490
+ var id = parseInt(colone);
491
+ for(var i=0; i < nbeLignesPad; i++){
492
+ //console.log("ID", "padBouton" + id.toString());
493
+ var bouton = document.getElementById("padBouton" + id.toString());
494
+ if ( bouton == undefined ) {
495
+ console.log("coloneVerte:undefined", colone);
496
+ return;
497
+ }
498
+
499
+ if ( bouton.getAttribute("class") != "padBoutonBleu") {
500
+ bouton.setAttribute("class", "padBoutonVert");
501
+ }
502
+ id +=nbeColonesPad;
503
+ }
504
+ }
505
+
506
+ function coloneGrise(colone) {
507
+ var id = parseInt(colone);
508
+ for(var i=0; i < nbeLignesPad; i++){
509
+ //console.log("ID", "padBouton" + id.toString());
510
+ var bouton = document.getElementById("padBouton" + id.toString());
511
+ if ( bouton == undefined ) {
512
+ console.log("coloneGrise:undefined", colone);
513
+ return;
514
+ }
515
+
516
+ if ( bouton.getAttribute("class") != "padBoutonBleu") {
517
+ bouton.setAttribute("class", "padBouton");
518
+ }
519
+ id +=nbeColonesPad;
520
+ }
521
+ }
522
+
523
+ // A faire:
524
+ // Quand on clique un bouton (X,Y), si pas d'objet dans la matrice, on crée la note dans la séquence,
525
+ // on la déclare dans la matrice, et on change l'affichage.
526
+ // S'il y a un objet dans la matrice en (X,Y) on détruit la note dans la séquence, on supprime la note de
527
+ // la matrice, on change l'affichage.
528
+
529
+ function clickPadBouton(padBouton) {
530
+ var bouton = document.getElementById( padBouton );
531
+ if (debug) console.log("LIGNE COLONE", bouton.dataset.ligne, bouton.dataset.colone);
532
+ var index = resolutionPad * parseInt(bouton.dataset.colone);
533
+ var noteMidi = parseInt(bouton.dataset.ligne);
534
+
535
+ // A FAIRE: Ajouter ici la gestion des vélocités avec plusieurs clicks en intensifiant
536
+ // la couleur.
537
+
538
+ if ( bouton.getAttribute("class") == "padBoutonBleu") { // Désactivation de la note
539
+ bouton.setAttribute("class", "padBouton");
540
+
541
+ //var noteASupprimer = getNoteInSequence(index, noteMidi);
542
+ //removeNoteInSequence(index, noteASupprimer);
543
+
544
+ // Supprime aussi les notes dans séquence
545
+ removeNotesInMatricePad(bouton.dataset.ligne, bouton.dataset.colone);
546
+
547
+ } else { // Activation de la note
548
+ bouton.setAttribute("class", "padBoutonBleu");
549
+ var duree = resolutionPad;
550
+ var note = new Note(noteMidi, 124, resolutionPad, index);
551
+ putNoteInSequence(index, note);
552
+ pushNoteInMatricePad(bouton.dataset.ligne, bouton.dataset.colone, note);
553
+ }
554
+ //console.log("clickPadBouton:MATRICE PAD", matricePad);
555
+
556
+ }
557
+ exports.clickPadBouton = clickPadBouton;
558
+
559
+ //****** Autres interfaces **********************
560
+
561
+ function vibration(duree) {
562
+ if (navigator.vibrate == undefined ) return;
563
+ if ('vibrate' in navigator) {
564
+ navigator.vibrate(duree);
565
+ }
566
+ }
567
+
568
+ var audioInit = new Audio();
569
+
570
+ //var srcInit = getSoundFile.resource("../sounds/tick.mp3");
571
+
572
+ // Pour flasher le smartphone
573
+ function bg() {
574
+ document.body.className = "inplay";
575
+ setTimeout( function() { document.body.className = "black-again" }, 10 );
576
+ }
577
+ exports.bg = bg
578
+
579
+ //****** Lancement des opérations et fermeture *********
580
+
581
+ function initialisation() {
582
+ //audioInit.src = srcInit;
583
+ //audioInit.play();
584
+ //audioInit.pause();
585
+
586
+ // Pour la gestion de la reconnexion si le serveur est tombé et relancé.
587
+ // Si on n'a pas de pseudo en local on suit la procédure de demande d'un pseudo
588
+ // Si on a déjà un pseudo on ne demande rien .
589
+ // La gestion du status du client est dangereuse car c'est document.getElementById("monPseudo").value;
590
+ // qui donne l'état. Ce sera à revoir.
591
+
592
+ if (debug) console.log("PSEUDO clientsequenceur.js:", pseudo);
593
+ if (pseudo === undefined) { // Cas de la première fois que l'on appelle le service sequenceur(pseudo)
594
+ var x = document.getElementById("monPseudo").value;
595
+ if ( x === "" || x === "Votre pseudo" ) { // Cas du OK sans saisie
596
+ document.getElementById("MessageDuServeur").textContent = "Entrez un pseudo";
597
+ return;
598
+ } else {
599
+ pseudo = x;
600
+ }
601
+ }
602
+ msg.pseudo = pseudo;
603
+
604
+ initWSSocket( port );
605
+
606
+ // Attention: si on envoie un message ici sur la websocket immédiatament après la reconnexion.
607
+ // Il se peut que la socket ne soit pas encore prête. Il y a des choses à faire avec readyState.
608
+
609
+ document.getElementById( "monPseudo" ).style.display = "none";
610
+ document.getElementById( "leBoutonPseudo" ).style.display = "none";
611
+ document.getElementById("MessageDuServeur").style.display = "inline";
612
+
613
+ // Attention block et pas inline pour les div
614
+ el = document.getElementById( "listBoutonsSons" );
615
+ el.style.display = "block";
616
+
617
+ // Création du pad et des sequences
618
+ creationPad( nbeLignesPad, nbeColonesPad);
619
+ creationSequences(nbeDeMesures, tempsMesure, divisionMesure);
620
+
621
+ el = document.getElementById( "buttonStart" );
622
+ el.style.display = "inline";
623
+
624
+ var elements = document.getElementsByClassName("buttonResolution");
625
+ for ( var i=0; i< elements.length; i++) {
626
+ elements[i].style.display = "inline";
627
+ }
628
+
629
+ /*console.log("BINAIRE", sequenceBinaire);
630
+ console.log("TERNAIRE", sequenceTernaire);*/
631
+ //initServerListener();
632
+ }
633
+ window.initialisation = initialisation;
634
+
635
+ // Pas encore utilisé tel que en Node
636
+ function init(port, p, unPseudo) {
637
+ //hh = require("hiphop");
638
+ par = p;
639
+ pseudo = unPseudo;
640
+ //listenMachine = makeListenMachine();
641
+ initWSSocket( port );
642
+ initialisation();
643
+ }
644
+ exports.init = init;
645
+
646
+ // Gestion de la fermeture du browser
647
+ window.onbeforeunload = function () {
648
+ msg.type = "closeSpectateur";
649
+ msg.text = "DISCONNECT_SPECTATEUR";
650
+ msg.pseudo = pseudo;
651
+ ws.send(JSON.stringify(msg));
652
+ ws.close();
653
+ }
654
+ //************ WEBSOCKET et listener BROADCAST ******************************
655
+
656
+
657
+
658
+ function initWSSocket(port) { // Attention port pas utilisé ici pour le moment
659
+
660
+ // POUR COMMUNICATION DIRECTE AVEC PROCESSING **************
661
+ var timeProcessing;
662
+
663
+ //wsProcessing = new WebSocket( "ws://" + par.serverIPAddress + ":" + "8025" + "/processing" );
664
+ wsProcessing = new WebSocket("ws://192.168.1.7:8035/processing");
665
+
666
+ wsProcessing.onmessage = function( event ) {
667
+ var msgRecu = JSON.parse(event.data);
668
+ //console.log( "Client: received [%s]", event.data );
669
+ switch(msgRecu.type) {
670
+ case "message":
671
+ if (debug) console.log(msgRecu.text);
672
+ /*var element = document.getElementById("MessageDuServeur");
673
+ element.innerHTML = msgRecu.text;*/
674
+ break;
675
+
676
+ case "ping":
677
+ if (debug) console.log("Reçu ping de PROCESSING" );
678
+ var msgPong = {
679
+ idClient: id,
680
+ type: "pong",
681
+ value: audioCtx.currentTime
682
+ };
683
+ wsProcessing.send(JSON.stringify(msgPong));
684
+ break;
685
+
686
+ case "pong":
687
+ datePongProcessing = audioCtx.currentTime;
688
+ console.log("Time reçu de Processing: ", msgRecu.time, "temps local: ", datePongProcessing );
689
+ timeProcessing = msgRecu.time;
690
+
691
+ latencePingProcessing = datePongProcessing - datePingProcessing;
692
+ if (debug) console.log("Reçu pong de Processing, latence: ", latencePingProcessing);
693
+ break;
694
+
695
+ case "synchroProcessing":
696
+ console.log("Reçu synchro de Processing");
697
+ synchroSequenceur();
698
+ //listenMachine.inputAndReact("synchro");
699
+ break;
700
+
701
+ default: if (debug) console.log("Le Client reçoit un message inconnu de Processing", msgRecu.time );
702
+ }
703
+ };
704
+
705
+ wsProcessing.onopen = function( event ) {
706
+ if (debug) console.log("wsProcessing.onopen." );
707
+ msg.type = "startSpectateur";
708
+ msg.idClient = id;
709
+ wsProcessing.send(JSON.stringify(msg)); // Sur le serveur Processing
710
+ };
711
+
712
+ wsProcessing.onerror = function (event) {
713
+ if (debug) console.log( "clientsequenceur.js : received error on WS Processing", event );
714
+ }
715
+
716
+ // POUR COMMUNICATION AVEC NODE **************************
717
+ //ws = new WebSocket( "ws://" + par.serverIPAddress + ":" + port + "/hop/serv", [ "bar", "foo" ] );
718
+ ws = new WebSocket('ws://localhost:8383'); // NODE JS
719
+
720
+ //if (debug) console.log("clientsequenceur.js WS: ", "ws://" + par.serverIPAddress + ":" + port + "/hop/serv" );
721
+ ws.onopen = function( event ) {
722
+ msg.type = "startSpectateur";
723
+ msg.text = "client";
724
+ msg.idClient = id;
725
+ msg.date = audioCtx.currentTime;
726
+ ws.send(JSON.stringify(msg));
727
+ };
728
+
729
+ //Traitement de la Réception sur le client
730
+ ws.onmessage = function( event ) {
731
+ var msgRecu = JSON.parse(event.data);
732
+ //console.log( "Client: received [%s]", event.data );
733
+ switch(msgRecu.type) {
734
+ case "message":
735
+ if (debug) console.log(msgRecu.text);
736
+ /*var element = document.getElementById("MessageDuServeur");
737
+ element.innerHTML = msgRecu.text;*/
738
+ break;
739
+
740
+ case "pong":
741
+ datePong = audioCtx.currentTime;
742
+ latencePing = datePong - datePing;
743
+ console.log("Latence sur Ping", latencePing );
744
+ break;
745
+
746
+ case "ping":
747
+ var msgPong = {
748
+ type: "pong",
749
+ value: audioCtx.currentTime
750
+ };
751
+ console.log("recu Ping");
752
+ ws.send(JSON.stringify(msgPong));
753
+ break;
754
+
755
+ case "setConfigSequenceur": // On doit tout réinitialiser ici
756
+ console.log("setConfigSequenceur", msgRecu );
757
+ tempsMesure = msgRecu.tempsMesure;
758
+ divisionMesure = msgRecu.divisionMesure;
759
+ nbeDeMesures = msgRecu.nbeDeMesures;
760
+ tempo = msgRecu.tempo;
761
+ canalMidi = msgRecu.canalMidi;
762
+ dureeDuTick = msgRecu.dureeDuTick;
763
+
764
+ sequence = new Array( nbeDeMesures * tempsMesure * divisionMesure );
765
+ finPlayer = sequence.length;
766
+
767
+ nbeColonesPad = nbeDeMesures * tempsMesure * divisionMesure / resolutionPad;
768
+ changeResolutionPad(resolutionPad);
769
+
770
+ document.getElementById("MessageDuServeur").textContent = " Nbe mesure: " + nbeDeMesures + " - tempo: " + tempo + " - " + tempsMesure + "/" + ( 96 / divisionMesure) ;
771
+
772
+ break;
773
+ default: if (debug) console.log("Le Client reçoit un message inconnu", msgRecu );
774
+ }
775
+ };
776
+
777
+ ws.onerror = function (event) {
778
+ if (debug) console.log( "clientsequenceur.js : received error on WS", ws.socket, " ", event );
779
+ }
780
+
781
+ // Mécanisme de reconnexion automatique si le serveur est tombé.
782
+ // Le service sequenceurPing permet de vérifier le présence du serveur
783
+ ws.onclose = function( event ) {
784
+
785
+ /*
786
+ (function loop() {
787
+ sequenceurPing()
788
+ .post()
789
+ .then(function(){ // Si serveur présent
790
+ document.location=sequenceur(pseudo);
791
+ },
792
+ function(){ // Si serveur absent
793
+ if (debug) console.log( "reconnecting..." );
794
+ setTimeout( loop, 2000 );
795
+ } );
796
+ })();
797
+ */
798
+ }
799
+ }
800
+
801
+ /**** C'est du hop, revoir le broadcast en node.js
802
+ function initServerListener() {
803
+ server.addEventListener('synchroTempo', function( event ) {
804
+ if (debug) console.log("Reçu Broadcast: tempo", event.value );
805
+ tempo = event.value; // Variable globale
806
+ setTimeout( function () {
807
+ synchroSequenceur(); // Enclenche un réaction de l'atomate start/stop en fonction de la latence
808
+ }, latencePing / 2 );
809
+ });
810
+ }
811
+
812
+ */
813
+
814
+
815
+