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.
- package/README.md +31 -0
- package/client/archive/bundle.js +11528 -0
- package/client/archive/golem.html +60 -0
- package/client/archive/golemClient.js +595 -0
- package/client/archive/golembundle.js +11634 -0
- package/client/archive/sequencer.html +43 -0
- package/client/archive/sequenceurClient.js +815 -0
- package/client/archive/stylegolem.css +158 -0
- package/client/archive/stylesequenceur.css +204 -0
- package/client/clientListe/Sortable-master/.circleci/config.yml +33 -0
- package/client/clientListe/Sortable-master/.editorconfig +15 -0
- package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/bug-report.md +73 -0
- package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/custom-template.md +48 -0
- package/client/clientListe/Sortable-master/.github/ISSUE_TEMPLATE/feature-request.md +41 -0
- package/client/clientListe/Sortable-master/.jshintrc +25 -0
- package/client/clientListe/Sortable-master/.testcaferc.json +7 -0
- package/client/clientListe/Sortable-master/CONTRIBUTING.md +26 -0
- package/client/clientListe/Sortable-master/LICENSE +21 -0
- package/client/clientListe/Sortable-master/README.md +813 -0
- package/client/clientListe/Sortable-master/Sortable.js +3709 -0
- package/client/clientListe/Sortable-master/Sortable.min.js +2 -0
- package/client/clientListe/Sortable-master/Sortable.min.old.js +2 -0
- package/client/clientListe/Sortable-master/Sortable.min.old.old.js +2 -0
- package/client/clientListe/Sortable-master/babel.config.js +27 -0
- package/client/clientListe/Sortable-master/bower.json +30 -0
- package/client/clientListe/Sortable-master/entry/entry-complete.js +8 -0
- package/client/clientListe/Sortable-master/entry/entry-core.js +19 -0
- package/client/clientListe/Sortable-master/entry/entry-defaults.js +19 -0
- package/client/clientListe/Sortable-master/index.html +460 -0
- package/client/clientListe/Sortable-master/modular/sortable.complete.esm.js +3701 -0
- package/client/clientListe/Sortable-master/modular/sortable.core.esm.js +3698 -0
- package/client/clientListe/Sortable-master/modular/sortable.esm.js +3699 -0
- package/client/clientListe/Sortable-master/package-lock.json +5704 -0
- package/client/clientListe/Sortable-master/package.json +56 -0
- package/client/clientListe/Sortable-master/plugins/AutoScroll/AutoScroll.js +270 -0
- package/client/clientListe/Sortable-master/plugins/AutoScroll/README.md +80 -0
- package/client/clientListe/Sortable-master/plugins/AutoScroll/index.js +1 -0
- package/client/clientListe/Sortable-master/plugins/MultiDrag/MultiDrag.js +617 -0
- package/client/clientListe/Sortable-master/plugins/MultiDrag/README.md +96 -0
- package/client/clientListe/Sortable-master/plugins/MultiDrag/index.js +1 -0
- package/client/clientListe/Sortable-master/plugins/OnSpill/OnSpill.js +79 -0
- package/client/clientListe/Sortable-master/plugins/OnSpill/README.md +60 -0
- package/client/clientListe/Sortable-master/plugins/OnSpill/index.js +1 -0
- package/client/clientListe/Sortable-master/plugins/README.md +178 -0
- package/client/clientListe/Sortable-master/plugins/Swap/README.md +55 -0
- package/client/clientListe/Sortable-master/plugins/Swap/Swap.js +90 -0
- package/client/clientListe/Sortable-master/plugins/Swap/index.js +1 -0
- package/client/clientListe/Sortable-master/scripts/banner.js +8 -0
- package/client/clientListe/Sortable-master/scripts/build.js +17 -0
- package/client/clientListe/Sortable-master/scripts/esm-build.js +28 -0
- package/client/clientListe/Sortable-master/scripts/minify.js +11 -0
- package/client/clientListe/Sortable-master/scripts/test-compat.js +30 -0
- package/client/clientListe/Sortable-master/scripts/test.js +21 -0
- package/client/clientListe/Sortable-master/scripts/umd-build.js +15 -0
- package/client/clientListe/Sortable-master/src/Animation.js +175 -0
- package/client/clientListe/Sortable-master/src/BrowserInfo.js +12 -0
- package/client/clientListe/Sortable-master/src/EventDispatcher.js +57 -0
- package/client/clientListe/Sortable-master/src/PluginManager.js +87 -0
- package/client/clientListe/Sortable-master/src/Sortable.js +1971 -0
- package/client/clientListe/Sortable-master/src/utils.js +556 -0
- package/client/clientListe/Sortable-master/st/app.js +224 -0
- package/client/clientListe/Sortable-master/st/iframe/frame.html +32 -0
- package/client/clientListe/Sortable-master/st/iframe/index.html +49 -0
- package/client/clientListe/Sortable-master/st/logo.png +0 -0
- package/client/clientListe/Sortable-master/st/og-image.png +0 -0
- package/client/clientListe/Sortable-master/st/prettify/prettify.css +1 -0
- package/client/clientListe/Sortable-master/st/prettify/prettify.js +46 -0
- package/client/clientListe/Sortable-master/st/prettify/run_prettify.js +64 -0
- package/client/clientListe/Sortable-master/st/saucelabs.svg +1 -0
- package/client/clientListe/Sortable-master/st/theme.css +254 -0
- package/client/clientListe/Sortable-master/tests/Sortable.compat.test.js +39 -0
- package/client/clientListe/Sortable-master/tests/Sortable.test.js +386 -0
- package/client/clientListe/Sortable-master/tests/dual-list.html +34 -0
- package/client/clientListe/Sortable-master/tests/empty-list.html +30 -0
- package/client/clientListe/Sortable-master/tests/filter.html +27 -0
- package/client/clientListe/Sortable-master/tests/handles.html +27 -0
- package/client/clientListe/Sortable-master/tests/nested.html +67 -0
- package/client/clientListe/Sortable-master/tests/single-list.html +25 -0
- package/client/clientListe/Sortable-master/tests/style.css +18 -0
- package/client/clientListe/clientListe.html +148 -0
- package/client/clientListe/clientListe.js +1508 -0
- package/client/clientListe/clientListebundle.js +13164 -0
- package/client/clientListe/images/poubelle.png +0 -0
- package/client/clientListe/images/start.png +0 -0
- package/client/clientListe/images/stop.png +0 -0
- package/client/clientListe/images/submit.png +0 -0
- package/client/clientListe/sortable-theme-bootstrap.css +90 -0
- package/client/configurateur/configReact.js +273 -0
- package/client/configurateur/configReactbundle.js +295 -0
- package/client/configurateur/configurateur.css +95 -0
- package/client/configurateur/configurateur.html +48 -0
- package/client/configurateur/lib/jexcel.css +755 -0
- package/client/configurateur/lib/jexcel.js +14970 -0
- package/client/configurateur/lib/jsuites.css +2801 -0
- package/client/configurateur/lib/jsuites.js +11822 -0
- package/client/configurateur/lib/react-dom.production.min.js +239 -0
- package/client/configurateur/lib/react.production.min.js +32 -0
- package/client/configurateur/src/configReact.js +247 -0
- package/client/controleur/clientcontroleur.js +536 -0
- package/client/controleur/clientcontroleur.test.js +282 -0
- package/client/controleur/controleur.html +51 -0
- package/client/controleur/controleurbundle.js +565 -0
- package/client/controleur/stylecontroleur.css +236 -0
- package/client/controleurHH/controleurHH.html +71 -0
- package/client/controleurHH/controleurHH.js +252 -0
- package/client/controleurHH/styles/index.css +320 -0
- package/client/controleurHH/styles/material.css +11552 -0
- package/client/parametrage/paramReact.js +473 -0
- package/client/parametrage/paramReactbundle.js +500 -0
- package/client/parametrage/parametrage.css +111 -0
- package/client/parametrage/parametrage.html +163 -0
- package/client/parametrage/src/paramReact.js +459 -0
- package/client/score/hash.js +83 -0
- package/client/score/p5.min.js +3 -0
- package/client/score/parto1.js +1171 -0
- package/client/score/parto1bundle.js +1181 -0
- package/client/score/processing.min.js +431 -0
- package/client/score/score.html +15 -0
- package/client/score/score.js +34 -0
- package/client/simulateurListe/simulateurFork.js +750 -0
- package/client/simulateurListe/simulateurFork.mjs +681 -0
- package/client/simulateurListe/simulateurForkSansReorg.js +569 -0
- package/client/simulateurListe/simulateurListe.js +628 -0
- package/myReact/archive/Nodeemitvaluedlocal1.hh.js +52 -0
- package/myReact/archive/abort-parNode.js +79 -0
- package/myReact/archive/abroNode.js +169 -0
- package/myReact/archive/abroNode2.js +80 -0
- package/myReact/archive/atom.compile.hh.js +51 -0
- package/myReact/archive/await-countNode.js +67 -0
- package/myReact/archive/await-nowvalNode.js +44 -0
- package/myReact/archive/callHH.js +96 -0
- package/myReact/archive/emit-if2.hh.compiled.js +113 -0
- package/myReact/archive/every1Node.js +35 -0
- package/myReact/archive/if-runNode.js +74 -0
- package/myReact/archive/if1Node.js +43 -0
- package/myReact/archive/makeawait.js +0 -0
- package/myReact/archive/myReact.old.js +684 -0
- package/myReact/archive/orchestration.js +281 -0
- package/myReact/archive/orchestration1.js +132 -0
- package/myReact/archive/orchestration1.xml +465 -0
- package/myReact/archive/orchestration2.js +161 -0
- package/myReact/archive/orchestrationHH.mano.js +280 -0
- package/myReact/archive/orchestrationHHTest.js +428 -0
- package/myReact/archive/orchestrationHHTest.xml +234 -0
- package/myReact/archive/orchestrationHHTestRun.js +104 -0
- package/myReact/archive/orchestrationHHTestRun.xml +34 -0
- package/myReact/archive/orchestrationTest0.js +178 -0
- package/myReact/archive/orchestrationTest1.js +181 -0
- package/myReact/archive/orchestrationTest2.js +281 -0
- package/myReact/archive/run3pointsNode.js +59 -0
- package/myReact/archive/runNode.js +123 -0
- package/myReact/archive/runNode2.js +91 -0
- package/myReact/archive/testAwait1.js +141 -0
- package/myReact/archive/testAwait1.xml +86 -0
- package/myReact/archive/testEvery1.js +122 -0
- package/myReact/archive/testEvery1.xml +79 -0
- package/myReact/archive/testHH1.js +135 -0
- package/myReact/archive/testHH1.xml +86 -0
- package/myReact/archive/testHH1revu.js +104 -0
- package/myReact/archive/testHH2.js +122 -0
- package/myReact/archive/testHH2.xml +79 -0
- package/myReact/archive/testHH3.js +130 -0
- package/myReact/archive/testHH3.xml +86 -0
- package/myReact/archive/testHHabort.js +121 -0
- package/myReact/archive/testHHabort.xml +83 -0
- package/myReact/archive/testMakeawait.js +202 -0
- package/myReact/archive/testRun1.js +168 -0
- package/myReact/archive/testRun1.xml +142 -0
- package/myReact/archive/titi.js +28 -0
- package/myReact/archive/titi.xml +110 -0
- package/myReact/archive/toto.js +73 -0
- package/myReact/archive/toto.xml +198 -0
- package/myReact/archive/trap-await-parallelNode.js +123 -0
- package/myReact/inutiles/hiver2022.xml +804 -0
- package/myReact/inutiles/hopeNode.xml +459 -0
- package/myReact/inutiles/mars2022.xml +871 -0
- package/myReact/inutiles/mystique1.xml +318 -0
- package/myReact/inutiles/mystiqueOSC.xml +277 -0
- package/myReact/inutiles/opus5Node.xml +1271 -0
- package/myReact/inutiles/opus5NodeLinux.xml +1241 -0
- package/myReact/inutiles/orchestrationHH.xml +541 -0
- package/myReact/inutiles/orchestrationHH2.xml +547 -0
- package/myReact/inutiles/testHH.xml +95 -0
- package/myReact/inutiles/trouveLaPercuTenor.xml +349 -0
- package/myReact/myReact.js +744 -0
- package/myReact/myReact.min.js +1 -0
- package/myReact/orchestrationHH.js +311 -0
- package/myReact/orchestrationHH.mjs +436 -0
- package/myReact/orchestrationHH.mjs.map +1 -0
- package/package.json +46 -0
- package/serveur/OSCandMidi.mjs +361 -0
- package/serveur/computeScore.mjs +415 -0
- package/serveur/controleDAW.mjs +1149 -0
- package/serveur/defaultSession.csv +2 -0
- package/serveur/defaultSkiniParametres.js +119 -0
- package/serveur/gameOSC.mjs +96 -0
- package/serveur/groupeClientsSons.mjs +1014 -0
- package/serveur/ipConfig.json +24 -0
- package/serveur/ipConfig127.json +19 -0
- package/serveur/ipConfig75.json +17 -0
- package/serveur/ipConfigBH.json +19 -0
- package/serveur/ipConfigLocal.json +19 -0
- package/serveur/midiConfig.json +26 -0
- package/serveur/midiConfigBH.json +26 -0
- package/serveur/midiConfigVoid.json +3 -0
- package/serveur/midimix.mjs +570 -0
- package/serveur/saveParam.mjs +159 -0
- package/serveur/skiniParametres.good.js +132 -0
- package/serveur/skiniParametres.js +106 -0
- package/serveur/utilsHHSkini.hh.js +64 -0
- package/serveur/utilsSkini.mjs +137 -0
- package/serveur/websocketServer.mjs +2052 -0
- package/serveur/workerInterfaceZ.mjs +327 -0
- package/serveur/workerSynchro.mjs +49 -0
- 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
|
+
|