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

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

Boxing now drawn around blocks of recorded track

  • Property svn:executable set to *
File size: 11.7 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 block_events = track_block.events;
226
227 var block_min_midi_pitch = num_midi_pitches-1;
228 var block_max_midi_pitch = 0;
229
230 var block_events_len = block_events.length;
231 for (var ne=0; ne<block_events_len; ne++) {
232
233 var note_event = block_events[ne];
234 var midi_pitch = note_event.midiPitch;
235
236 var startPercTime = (base_ctime + note_event.startCurrentTime)/total_duration;
237 var rx_org = startPercTime * go_paper_x_dim;
238 var ry_org = go_paper_y_dim - ((note_event.midiPitch - min_midi_pitch) * midi_y_dim_spacing) - midi_y_dim_spacing;
239
240 var rx_dim = (note_event.duration/1000)/total_duration * go_paper_x_dim;
241 var ry_dim = midi_y_dim_spacing;
242
243 var rect = goPaper.rect(rx_org,ry_org,rx_dim,ry_dim-0.2);
244 //rect.attr({stroke:"none", strokeWidth:0.2, fill:"#2E52A4"});
245 //rect.attr({stroke:"black",fill:"#2E52A4"});
246 rect.attr({"stroke":"black","stroke-width":0.25, "fill":"#2E52A4"});
247 go_top_level_group.push(rect);
248
249 if (midi_pitch < block_min_midi_pitch) {
250 block_min_midi_pitch = midi_pitch;
251 }
252 if (midi_pitch > block_max_midi_pitch) {
253 block_max_midi_pitch = midi_pitch;
254 }
255 }
256
257 var block_midi_range = block_max_midi_pitch - block_min_midi_pitch + 1;
258
259 var last_event = block_events[block_events_len-1];
260 var last_note_off = last_event.midiNoteOff;
261 var block_duration = (base_ctime + last_note_off)/1000.0;
262
263 var block_x_org = (base_ctime/total_duration) * go_paper_x_dim;
264 var block_x_dim = (block_duration/total_duration) * go_paper_x_dim;
265
266 var block_y_org = go_paper_y_dim - ((block_max_midi_pitch - min_midi_pitch) * midi_y_dim_spacing) - midi_y_dim_spacing;
267 var block_y_dim = midi_y_dim_spacing * (block_midi_range);
268
269 var block_rect = goPaper.rect(block_x_org-1,block_y_org-1,block_x_dim+2,block_y_dim+2); // fudge factor!
270 block_rect.attr({"stroke":"none", "stroke-width":0, "fill":"rgba(46, 82, 164, 0.5)"});
271 go_top_level_group.push(block_rect);
272
273 }
274 }
275 }
276 }
277
278 gameOnCurrentTimelineRect = goPaper.rect(-2,0,1,go_paper_y_dim);
279 gameOnCurrentTimelineRect.attr({fill: "red", stroke: "red"});
280 go_top_level_group.push(gameOnCurrentTimelineRect);
281
282 go_top_level_group.scale(group_x_scale,group_y_scale);
283 go_top_level_group.rotate(group_rotate,0,0);
284 //go_top_level_group.translate(group_x_scale*go_paper_y_dim,go_paper_y_dim);
285 go_top_level_group.translate(group_x_trans,group_y_trans);
286}
287
288function initGameOn()
289{
290 console.log("initGameOn()");
291
292 if (gs.xsltParams.interface_name == "respooled") {
293 group_x_scale = 2.0;
294 group_y_scale = -5.0;
295 group_rotate = 90.0;
296
297 group_x_trans = 15 + group_x_scale * go_paper_y_dim;
298 group_y_trans = go_paper_y_dim;
299 }
300 else {
301 group_x_scale = 1.0;
302 group_y_scale = 1.0;
303 group_rotate = 0.0;
304
305 group_x_trans = 0.0;
306 group_y_trans = 0.0;
307 }
308
309 goDocStorage = getDocStorage(gs.cgiParams.d);
310
311 //var gmp_x_dim = $('#gameOnPaper').width();
312 //var gmp_y_dim = $('#gameOnPaper').height();
313
314 //console.log("*** gmp_x_dim = " + gmp_x_dim);
315 //console.log("*** gmp_y_dim = " + gmp_y_dim);
316
317
318 //var goPaper = Raphael("gameOnPaper",gmp_x_dim,gmp_y_dim);
319 goPaper = Raphael("gameOnPaper",go_paper_x_dim,go_paper_y_dim);
320 goPaper.canvas.style.backgroundColor = '#FFFFFF';
321
322
323 console.log("Browser supports LocalStorage: " + hasLocalStorage);
324
325 populatePalList(goDocStorage);
326 displayActiveTrackLayers(goDocStorage);
327}
328
329
330function palDeleteConfirmed()
331{
332 //var palActiveLayers = $('input[type=checkbox]:checked', '#palForm');
333
334 var palActiveLayersID = getActiveTrackLayers("name");
335 var palActiveLayersValue = getActiveTrackLayers("value");
336
337 var palTracks = goDocStorage.palTracks || {};
338
339 for (var i=0; i<palActiveLayersID.length; i++) {
340 var id = palActiveLayersID[i];
341 $('#pal'+id).remove();
342
343 var value = palActiveLayersValue[i];
344 delete palTracks[value];
345 }
346}
347
348
349function palDelete()
350{
351 $('#delete-recording-popup').dialog('open');
352
353 return false; // no need to process the event any further
354}
355
356function palDisplay()
357{
358 displayActiveTrackLayers(goDocStorage);
359
360 return false; // no need to process the event any further
361}
362
363function palSave()
364{
365 var palTracks = goDocStorage.palTracks || {};
366
367 var json_edit_str = trackEditor.getSession().getValue();
368 console.log("**** json edit str = " + json_edit_str);
369
370 var json_edit = eval("("+json_edit_str+")");
371
372 for (var key in json_edit){
373 if (json_edit.hasOwnProperty(key)) {
374 //console.log("*** key = " + key);
375 var val = json_edit[key];
376 console.log("**** Saving under key[ " + key + "]: " + JSON.stringify(val));
377 palTracks[key] = val;
378 }
379 }
380
381 if (hasLocalStorage) {
382 var docOID = gs.cgiParams.d;
383 console.log("Saving in Browser localStorage track data for '" + docOID + "'");
384 localStorage.setItem(docOID,JSON.stringify(goDocStorage));
385 }
386}
387
388function palEdit()
389{
390 var palTracks = goDocStorage.palTracks || {};
391
392 var palActiveLayers = getActiveTrackLayers("value");
393
394 var edit_json = {};
395
396 for (var i=0; i<palActiveLayers.length; i++) {
397 var track_name = palActiveLayers[i];
398 edit_json[track_name] = palTracks[track_name];
399 }
400
401 trackEditor.setValue(JSON.stringify(edit_json,null,'\t'));
402 trackEditor.clearSelection();
403
404 $('#edit-recording-popup').dialog('open');
405
406 return false; // no need to process the event any further
407}
408
Note: See TracBrowser for help on using the repository browser.