source: main/trunk/model-sites-dev/respooled/collect/popup-video-respooled/js/game-on.js@ 29980

Last change on this file since 29980 was 29980, checked in by davidb, 9 years ago

Further changes as a result of preparing the final submission of the DLfM workshop paper

  • Property svn:executable set to *
File size: 12.4 KB
Line 
1"use strict";
2
3var goDocStorage = null;
4
5var goPaper = null;
6var go_top_level_group = null;;
7
8var go_paper_x_dim = 920;
9var go_paper_y_dim = 445;
10
11var gameOnCurrentTimeXPos = 0;
12var gameOnCurrentTimelineRect = null;
13
14var num_midi_pitches = 128;
15
16var group_x_scale;
17var group_y_scale;
18var group_rotate;
19var group_x_trans;
20var group_y_trans;
21
22function updateGameOnCurrentTimeline()
23{
24 gameOnCurrentTimeXPos = (mediaPlayer.currentTime / mediaPlayer.duration) * go_paper_x_dim;
25
26 var gameOnCurrentTimeYPos = (mediaPlayer.currentTime / mediaPlayer.duration) * go_paper_y_dim;
27 //console.log("*** x pos = " + gameOnCurrentTimeXPos);
28
29 gameOnCurrentTimelineRect.attr({x: gameOnCurrentTimeXPos});
30
31 if (gs.xsltParams.interface_name == "respooled") {
32 //go_top_level_group.translate(group_x_scale*go_paper_y_dim, go_paper_y_dim+(gameOnCurrentTimeYPos * group_x_scale * Math.abs(group_y_scale)));
33 go_top_level_group.translate(group_x_trans, go_paper_y_dim+(gameOnCurrentTimeYPos * group_x_scale * Math.abs(group_y_scale)));
34 }
35
36}
37
38function getDocStorage(docOID)
39{
40 var docStorage = null;
41
42 if (hasLocalStorage) {
43
44 if (goDocStorage == null) {
45 var docStorageStr = localStorage.getItem(docOID);
46 //console.log("***docStorageStr = " + docStorageStr);
47
48 //var docStorage = (docStorageStr != null) ? eval("("+docStorageStr+")") : {palTracks:{}, popTracks:{}};
49 docStorage = eval("("+docStorageStr+")") || {palTracks:{}, popTracks:{}};
50 goDocStorage = docStorage;
51 }
52 else {
53 docStorage = goDocStorage;
54 }
55 }
56
57 return docStorage;
58}
59
60function getActiveTrackLayers(opt_field)
61{
62 var field = opt_field || "name";
63
64 var palActiveLayers = [];
65 $('#palForm input:checked').each(function() {
66 palActiveLayers.push(this[field]);
67 });
68
69 return palActiveLayers;
70}
71
72function populatePalList(docStorage)
73{
74 // populate pal List
75 if (hasLocalStorage) {
76
77 var palTracks = docStorage.palTracks || {};
78
79 //console.log("*** palTracks = " + JSON.stringify(palTracks));
80 var palListKeys = Object.keys(palTracks).sort();
81
82 for (var i=0; i<palListKeys.length; i++) {
83 var key = palListKeys[i];
84 var track = palTracks[key];
85 var name = key;
86 var cb_name = name.replace(/[ -]/g,"");
87 var cb_value = name;
88
89 var opt_checked = (i==0) ? ' checked="checked"' : "";
90
91 $('#palList').append('<div id="pal'+cb_name+'"><input type="checkbox" '
92 + '" name="'+cb_name+'" value="' + cb_value + '"'
93 + opt_checked + '>'
94 + name + '</div>');
95 }
96 }
97 else {
98 // Put in some fake data for now
99 $('#palList').append('<input type="checkbox" id="palPianoHero" name="PianoHero" value="Piano Hero" checked="checked"/>Piano Hero<br />');
100 $('#palList').append('<input type="checkbox" id="palDrumbeatHero" name="DrumbeatHero" value="Drum-beat Hero" />Drum-beat Hero<br />');
101 }
102}
103
104
105function computeMidiStats(track)
106{
107 var min_midi_pitch = num_midi_pitches-1;
108 var max_midi_pitch = 0;
109
110 var track_chromatic_durations = [];
111 for (var i=0; i<12; i++) {
112 track_chromatic_durations[i] = 0;
113 }
114
115
116 // Process each block within the track
117 for (var b=0; b<track.length; b++) {
118 var track_block = track[b];
119 //var base_ctime = track_block.baseCTime;
120 var block_events = track_block.events;
121
122 var block_chromatic_durations = [];
123 for (var i=0; i<12; i++) {
124 block_chromatic_durations[i] = 0;
125 }
126
127 for (var ne=0; ne<block_events.length; ne++) {
128 var midi_pitch = block_events[ne].midiPitch;
129
130 if (midi_pitch < min_midi_pitch) {
131 min_midi_pitch = midi_pitch;
132 }
133 if (midi_pitch > max_midi_pitch) {
134 max_midi_pitch = midi_pitch;
135 }
136
137 var chromatic_pitch = midi_pitch % 12;
138 var chromatic_duration = block_events[ne].duration;
139 block_chromatic_durations[chromatic_pitch] += chromatic_duration;
140
141 track_chromatic_durations[chromatic_pitch] += chromatic_duration;
142 }
143
144 if (!("_computedKey" in track_block)) {
145 var strongest_profile = khKeyDetection(block_chromatic_durations);
146 track_block._computedKey = strongest_profile;
147 console.log("***### key prediction: " + strongest_profile);
148 }
149
150 }
151
152 if (!("_computedKey" in track)) {
153 var strongest_profile = khKeyDetection(track_chromatic_durations);
154 track._computedKey = strongest_profile;
155 }
156
157 return { "max_midi_pitch": max_midi_pitch, "min_midi_pitch": min_midi_pitch};
158}
159
160
161function displayActiveTrackLayers(docStorage)
162{
163 console.log("displayActiveTrackLayers()");
164
165 goPaper.clear();
166
167 // Clear takes out any previous group element, so need to be regenerated
168 go_top_level_group = new goPaper.group("gameOnPaper",[]);
169
170 if (hasLocalStorage) {
171
172 // 'palTracks' have the form:
173 // palTracks[save_name] = [ { name: "my recording 1", baseCTime: 123.3, events: [ .... ] } ]
174
175 var palTracks = docStorage.palTracks || {};
176
177 var total_duration = mediaPlayer.duration;
178 //console.log("*** total duration = " + total_duration);
179
180 var atl = getActiveTrackLayers("value");
181 //console.log("*** atl = " + JSON.stringify(atl));
182
183 var min_midi_pitch = num_midi_pitches-1;
184 var max_midi_pitch = 0;
185
186 for (var i=0; i<atl.length; i++) {
187 var storage_name = atl[i];
188 var track = palTracks[storage_name];
189
190 if (track != null) {
191
192 var midi_stats = computeMidiStats(track);
193 console.log("*** midi stats = " + JSON.stringify(midi_stats));
194
195 if (midi_stats.min_midi_pitch < min_midi_pitch) {
196 min_midi_pitch = midi_stats.min_midi_pitch;
197 }
198 if (midi_stats.max_midi_pitch > max_midi_pitch) {
199 max_midi_pitch = midi_stats.max_midi_pitch;
200 }
201
202 }
203 }
204 //console.log("*** max pitch = " + max_midi_pitch + ", min pitch = " + min_midi_pitch);
205
206 var raw_midi_range = max_midi_pitch - min_midi_pitch + 1;
207 var midi_range = Math.max(4,raw_midi_range);
208
209 //console.log("*** midi_range = " + midi_range);
210
211 var midi_y_dim_spacing = go_paper_y_dim / midi_range;
212
213
214 for (var i=0; i<atl.length; i++) {
215 var storage_name = atl[i];
216 var track = palTracks[storage_name];
217
218 if (track != null) {
219
220 for (var b=0; b<track.length; b++) {
221
222 var track_block = track[b];
223 var base_ctime = track_block.baseCTime;
224
225 var track_fill = track_block.fill;
226 var track_fillbackground = track_block.fillBackground;
227
228 var block_events = track_block.events;
229
230 var block_min_midi_pitch = num_midi_pitches-1;
231 var block_max_midi_pitch = 0;
232
233 var block_events_len = block_events.length;
234 for (var ne=0; ne<block_events_len; ne++) {
235
236 var note_event = block_events[ne];
237 var midi_pitch = note_event.midiPitch;
238
239 var startPercTime = (base_ctime + note_event.startCurrentTime)/total_duration;
240 var rx_org = startPercTime * go_paper_x_dim;
241 var ry_org = go_paper_y_dim - ((note_event.midiPitch - min_midi_pitch) * midi_y_dim_spacing) - midi_y_dim_spacing;
242
243 var rx_dim = (note_event.duration/1000)/total_duration * go_paper_x_dim;
244 var ry_dim = midi_y_dim_spacing;
245
246 var rect = goPaper.rect(rx_org,ry_org,rx_dim,ry_dim-0.2);
247 //rect.attr({stroke:"none", strokeWidth:0.2, fill:"#2E52A4"});
248 //rect.attr({stroke:"black",fill:"#2E52A4"});
249 var fill = note_event.fill || track_fill || "#2E52A4";
250 rect.attr({"stroke":"black","stroke-width":0.25, "fill":fill});
251 go_top_level_group.push(rect);
252
253 if (midi_pitch < block_min_midi_pitch) {
254 block_min_midi_pitch = midi_pitch;
255 }
256 if (midi_pitch > block_max_midi_pitch) {
257 block_max_midi_pitch = midi_pitch;
258 }
259 }
260
261 var block_midi_range = block_max_midi_pitch - block_min_midi_pitch + 1;
262
263 var last_event = block_events[block_events_len-1];
264 var last_note_off = last_event.midiNoteOff;
265 var block_duration = (base_ctime + last_note_off)/1000.0
266;
267 var block_x_org = (base_ctime/total_duration) * go_paper_x_dim;
268 var block_x_dim = (block_duration/total_duration) * go_paper_x_dim;
269
270 var block_y_org = go_paper_y_dim - ((block_max_midi_pitch - min_midi_pitch) * midi_y_dim_spacing) - midi_y_dim_spacing;
271 var block_y_dim = midi_y_dim_spacing * (block_midi_range);
272
273 if (gs.xsltParams.interface_name != "respooled") {
274 var block_rect = goPaper.rect(block_x_org-1,block_y_org-1,block_x_dim+2,block_y_dim+2); // fudge factor!
275 var fillbackground = track_fillbackground || "rgba(46, 82, 164, 0.5)";
276 block_rect.attr({"stroke":"none", "stroke-width":0, "fill":fillbackground});
277
278 var block_tip = track_block.name;
279
280 if ("_computedKey" in track_block) {
281
282 var computedKey = track_block._computedKey;
283 var key = computedKey.key;
284 block_tip += " , Key: " + key;
285
286 if ("score" in computedKey) {
287 var perc = 100*computedKey.score;
288 block_tip += " with " + perc.toFixed(1) + "% confidence rating";
289 }
290 }
291
292 block_rect.attr({ "title": block_tip});
293
294 go_top_level_group.push(block_rect);
295 }
296
297 }
298 }
299 }
300 }
301
302 gameOnCurrentTimelineRect = goPaper.rect(-2,0,1,go_paper_y_dim);
303 gameOnCurrentTimelineRect.attr({fill: "red", stroke: "red"});
304 go_top_level_group.push(gameOnCurrentTimelineRect);
305
306 go_top_level_group.scale(group_x_scale,group_y_scale);
307 go_top_level_group.rotate(group_rotate,0,0);
308 //go_top_level_group.translate(group_x_scale*go_paper_y_dim,go_paper_y_dim);
309 go_top_level_group.translate(group_x_trans,group_y_trans);
310}
311
312function initGameOn()
313{
314 console.log("initGameOn()");
315
316 if (gs.xsltParams.interface_name == "respooled") {
317 group_x_scale = 2.0;
318 group_y_scale = -5.0;
319 group_rotate = 90.0;
320
321 group_x_trans = 15 + group_x_scale * go_paper_y_dim;
322 group_y_trans = go_paper_y_dim;
323 }
324 else {
325 group_x_scale = 1.0;
326 group_y_scale = 1.0;
327 group_rotate = 0.0;
328
329 group_x_trans = 0.0;
330 group_y_trans = 0.0;
331 }
332
333 goDocStorage = getDocStorage(gs.cgiParams.d);
334
335 //var gmp_x_dim = $('#gameOnPaper').width();
336 //var gmp_y_dim = $('#gameOnPaper').height();
337
338 //console.log("*** gmp_x_dim = " + gmp_x_dim);
339 //console.log("*** gmp_y_dim = " + gmp_y_dim);
340
341
342 //var goPaper = Raphael("gameOnPaper",gmp_x_dim,gmp_y_dim);
343 goPaper = Raphael("gameOnPaper",go_paper_x_dim,go_paper_y_dim);
344 goPaper.canvas.style.backgroundColor = '#FFFFFF';
345
346
347 console.log("Browser supports LocalStorage: " + hasLocalStorage);
348
349 populatePalList(goDocStorage);
350 displayActiveTrackLayers(goDocStorage);
351}
352
353
354function palDeleteConfirmed()
355{
356 //var palActiveLayers = $('input[type=checkbox]:checked', '#palForm');
357
358 var palActiveLayersID = getActiveTrackLayers("name");
359 var palActiveLayersValue = getActiveTrackLayers("value");
360
361 var palTracks = goDocStorage.palTracks || {};
362
363 for (var i=0; i<palActiveLayersID.length; i++) {
364 var id = palActiveLayersID[i];
365 $('#pal'+id).remove();
366
367 var value = palActiveLayersValue[i];
368 delete palTracks[value];
369 }
370}
371
372
373function palDelete()
374{
375 $('#delete-recording-popup').dialog('open');
376
377 return false; // no need to process the event any further
378}
379
380function palDisplay()
381{
382 displayActiveTrackLayers(goDocStorage);
383
384 return false; // no need to process the event any further
385}
386
387function palSave()
388{
389 var palTracks = goDocStorage.palTracks || {};
390
391 var json_edit_str = trackEditor.getSession().getValue();
392 console.log("**** json edit str = " + json_edit_str);
393
394 var json_edit = eval("("+json_edit_str+")");
395
396 for (var key in json_edit){
397 if (json_edit.hasOwnProperty(key)) {
398 //console.log("*** key = " + key);
399 var val = json_edit[key];
400 console.log("**** Saving under key[ " + key + "]: " + JSON.stringify(val));
401 palTracks[key] = val;
402 }
403 }
404
405 if (hasLocalStorage) {
406 var docOID = gs.cgiParams.d;
407 console.log("Saving in Browser localStorage track data for '" + docOID + "'");
408 localStorage.setItem(docOID,JSON.stringify(goDocStorage));
409 }
410}
411
412function palEdit()
413{
414 var palTracks = goDocStorage.palTracks || {};
415
416 var palActiveLayers = getActiveTrackLayers("value");
417
418 var edit_json = {};
419
420 for (var i=0; i<palActiveLayers.length; i++) {
421 var track_name = palActiveLayers[i];
422 edit_json[track_name] = palTracks[track_name];
423 }
424
425 trackEditor.setValue(JSON.stringify(edit_json,null,'\t'));
426 trackEditor.clearSelection();
427
428 $('#edit-recording-popup').dialog('open');
429
430 return false; // no need to process the event any further
431}
432
Note: See TracBrowser for help on using the repository browser.