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

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

Completed version of Krumhansl's algorithm. Plus adding in of About bar. Plus tidy up of the 'by xxx' template

  • Property svn:executable set to *
File size: 9.3 KB
Line 
1"use strict";
2
3var goDocStorage = null;
4
5var goPaper = null;
6
7var go_paper_x_dim = 920;
8var go_paper_y_dim = 445;
9
10var gameOnCurrentTimeXPos = 0;
11var gameOnCurrentTimelineRect = null;
12
13var num_midi_pitches = 128;
14
15
16function updateGameOnCurrentTimeline()
17{
18 gameOnCurrentTimeXPos = (mediaPlayer.currentTime / mediaPlayer.duration) * go_paper_x_dim;
19 //console.log("*** x pos = " + gameOnCurrentTimeXPos);
20
21 gameOnCurrentTimelineRect.attr({x: gameOnCurrentTimeXPos});
22}
23
24function getDocStorage(docOID)
25{
26 var docStorage = null;
27
28 if (hasLocalStorage) {
29
30 if (goDocStorage == null) {
31 var docStorageStr = localStorage.getItem(docOID);
32 //console.log("***docStorageStr = " + docStorageStr);
33
34 //var docStorage = (docStorageStr != null) ? eval("("+docStorageStr+")") : {palTracks:{}, popTracks:{}};
35 docStorage = eval("("+docStorageStr+")") || {palTracks:{}, popTracks:{}};
36 goDocStorage = docStorage;
37 }
38 else {
39 docStorage = goDocStorage;
40 }
41 }
42
43 return docStorage;
44}
45
46function getActiveTrackLayers(opt_field)
47{
48 var field = opt_field || "name";
49
50 var palActiveLayers = [];
51 $('#palForm input:checked').each(function() {
52 palActiveLayers.push(this[field]);
53 });
54
55 return palActiveLayers;
56}
57
58function populatePalList(docStorage)
59{
60 // populate pal List
61 if (hasLocalStorage) {
62
63 var palTracks = docStorage.palTracks || {};
64
65 //console.log("*** palTracks = " + JSON.stringify(palTracks));
66 var palListKeys = Object.keys(palTracks).sort();
67
68 for (var i=0; i<palListKeys.length; i++) {
69 var key = palListKeys[i];
70 var track = palTracks[key];
71 var name = key;
72 var cb_name = name.replace(/[ -]/g,"");
73 var cb_value = name;
74
75 var opt_checked = (i==0) ? ' checked="checked"' : "";
76
77 $('#palList').append('<div id="pal'+cb_name+'"><input type="checkbox" '
78 + '" name="'+cb_name+'" value="' + cb_value + '"'
79 + opt_checked + '>'
80 + name + '</div>');
81 }
82 }
83 else {
84 // Put in some fake data for now
85 $('#palList').append('<input type="checkbox" id="palPianoHero" name="PianoHero" value="Piano Hero" checked="checked"/>Piano Hero<br />');
86 $('#palList').append('<input type="checkbox" id="palDrumbeatHero" name="DrumbeatHero" value="Drum-beat Hero" />Drum-beat Hero<br />');
87 }
88}
89
90
91function computeMidiStats(track)
92{
93 var min_midi_pitch = num_midi_pitches-1;
94 var max_midi_pitch = 0;
95
96 var track_chromatic_durations = [];
97 for (var i=0; i<12; i++) {
98 track_chromatic_durations[i] = 0;
99 }
100
101 // Process each block within the track
102 for (var b=0; b<track.length; b++) {
103 var track_block = track[b];
104 //var base_ctime = track_block.baseCTime;
105 var block_events = track_block.events;
106
107 var block_chromatic_durations = [];
108 for (var i=0; i<12; i++) {
109 block_chromatic_durations[i] = 0;
110 }
111
112 for (var ne=0; ne<block_events.length; ne++) {
113 var midi_pitch = block_events[ne].midiPitch;
114
115 if (midi_pitch < min_midi_pitch) {
116 min_midi_pitch = midi_pitch;
117 }
118 if (midi_pitch > max_midi_pitch) {
119 max_midi_pitch = midi_pitch;
120 }
121
122 var chromatic_pitch = midi_pitch % 12;
123 var chromatic_duration = block_events[ne].duration;
124 block_chromatic_durations[chromatic_pitch] += chromatic_duration;
125
126 track_chromatic_durations[chromatic_pitch] += chromatic_duration;
127 }
128
129 if (!("_computedKey" in track_block)) {
130 var strongest_profile = khKeyDetection(block_chromatic_durations);
131 track_block._computedKey = strongest_profile;
132 console.log("***### key prediction: " + strongest_profile);
133 }
134
135 }
136
137 if (!("_computedKey" in track)) {
138 var strongest_profile = khKeyDetection(track_chromatic_durations);
139 track._computedKey = strongest_profile;
140 }
141
142 return { "max_midi_pitch": max_midi_pitch, "min_midi_pitch": min_midi_pitch};
143}
144
145
146function displayActiveTrackLayers(docStorage)
147{
148 console.log("displayActiveTrackLayers()");
149
150 goPaper.clear();
151
152 if (hasLocalStorage) {
153
154 // 'palTracks' have the form:
155 // palTracks[save_name] = [ { name: "my recording 1", baseCTime: 123.3, events: [ .... ] } ]
156
157 var palTracks = docStorage.palTracks || {};
158
159 var total_duration = mediaPlayer.duration;
160 //console.log("*** total duration = " + total_duration);
161
162 var atl = getActiveTrackLayers("value");
163 //console.log("*** atl = " + JSON.stringify(atl));
164
165 var min_midi_pitch = num_midi_pitches-1;
166 var max_midi_pitch = 0;
167
168 for (var i=0; i<atl.length; i++) {
169 var storage_name = atl[i];
170 var track = palTracks[storage_name];
171
172 if (track != null) {
173
174
175 var midi_stats = computeMidiStats(track);
176
177 if (midi_stats.min_midi_pitch < min_midi_pitch) {
178 min_midi_pitch = midi_stats.min_midi_pitch;
179 }
180 if (midi_stats.max_midi_pitch > max_midi_pitch) {
181 max_midi_pitch = midi_stats.max_midi_pitch;
182 }
183
184
185 // calculate range of midi pitches present
186/*
187 for (var b=0; b<track.length; b++) {
188 var track_block = track[b];
189 var base_ctime = track_block.baseCTime;
190 var block_events = track_block.events;
191
192 for (var ne=0; ne<block_events.length; ne++) {
193 var midi_pitch = block_events[ne].midiPitch;
194 if (midi_pitch < min_midi_pitch) {
195 min_midi_pitch = midi_pitch;
196 }
197 if (midi_pitch > max_midi_pitch) {
198 max_midi_pitch = midi_pitch;
199 }
200 }
201 }
202*/
203
204 }
205 }
206 //console.log("*** max pitch = " + max_midi_pitch + ", min pitch = " + min_midi_pitch);
207
208 var raw_midi_range = max_midi_pitch - min_midi_pitch;
209 var midi_range = Math.max(4,raw_midi_range);
210
211 var midi_y_dim_spacing = go_paper_y_dim / midi_range;
212
213 for (var i=0; i<atl.length; i++) {
214 var storage_name = atl[i];
215 var track = palTracks[storage_name];
216
217 if (track != null) {
218
219 for (var b=0; b<track.length; b++) {
220
221 var track_block = track[b];
222 var base_ctime = track_block.baseCTime;
223
224 var block_events = track_block.events;
225
226 for (var ne=0; ne<block_events.length; ne++) {
227
228 var note_event = block_events[ne];
229
230 var startPercTime = (base_ctime + note_event.startCurrentTime)/total_duration;
231 var rx_org = startPercTime * go_paper_x_dim;
232 var ry_org = go_paper_y_dim - ((note_event.midiPitch - min_midi_pitch) * midi_y_dim_spacing);
233
234 var rx_dim = (note_event.duration/1000)/total_duration * go_paper_x_dim;
235 var ry_dim = midi_y_dim_spacing;
236
237 var rect = goPaper.rect(rx_org,ry_org,rx_dim,ry_dim);
238 rect.attr({stroke:"black",fill:"#2E52A4"});
239 }
240 }
241 }
242 }
243 }
244
245 gameOnCurrentTimelineRect = goPaper.rect(-2,0,1,go_paper_y_dim);
246 gameOnCurrentTimelineRect.attr({fill: "red", stroke: "red"});
247}
248
249function initGameOn()
250{
251 console.log("initGameOn()");
252
253 goDocStorage = getDocStorage(gs.cgiParams.d);
254
255 //var gmp_x_dim = $('#gameOnPaper').width();
256 //var gmp_y_dim = $('#gameOnPaper').height();
257
258 //console.log("*** gmp_x_dim = " + gmp_x_dim);
259 //console.log("*** gmp_y_dim = " + gmp_y_dim);
260
261
262 //var goPaper = Raphael("gameOnPaper",gmp_x_dim,gmp_y_dim);
263 goPaper = Raphael("gameOnPaper",go_paper_x_dim,go_paper_y_dim);
264 goPaper.canvas.style.backgroundColor = '#FFFFFF';
265
266 console.log("Browser supports LocalStorage: " + hasLocalStorage);
267
268 populatePalList(goDocStorage);
269 displayActiveTrackLayers(goDocStorage);
270}
271
272
273function palDeleteConfirmed()
274{
275 //var palActiveLayers = $('input[type=checkbox]:checked', '#palForm');
276
277 var palActiveLayersID = getActiveTrackLayers("name");
278 var palActiveLayersValue = getActiveTrackLayers("value");
279
280 var palTracks = goDocStorage.palTracks || {};
281
282 for (var i=0; i<palActiveLayersID.length; i++) {
283 var id = palActiveLayersID[i];
284 $('#pal'+id).remove();
285
286 var value = palActiveLayersValue[i];
287 delete palTracks[value];
288 }
289}
290
291
292function palDelete()
293{
294 $('#delete-recording-popup').dialog('open');
295
296 return false; // no need to process the event any further
297}
298
299function palDisplay()
300{
301 displayActiveTrackLayers(goDocStorage);
302
303 return false; // no need to process the event any further
304}
305
306function palSave()
307{
308 var palTracks = goDocStorage.palTracks || {};
309
310 var json_edit_str = trackEditor.getSession().getValue();
311 console.log("**** json edit str = " + json_edit_str);
312
313 var json_edit = eval("("+json_edit_str+")");
314
315 for (var key in json_edit){
316 if (json_edit.hasOwnProperty(key)) {
317 //console.log("*** key = " + key);
318 var val = json_edit[key];
319 console.log("**** Saving under key[ " + key + "]: " + JSON.stringify(val));
320 palTracks[key] = val;
321 }
322 }
323
324 if (hasLocalStorage) {
325 var docOID = gs.cgiParams.d;
326 console.log("Saving in Browser localStorage track data for '" + docOID + "'");
327 localStorage.setItem(docOID,JSON.stringify(goDocStorage));
328 }
329}
330
331function palEdit()
332{
333 var palTracks = goDocStorage.palTracks || {};
334
335 var palActiveLayers = getActiveTrackLayers("value");
336
337 var edit_json = {};
338
339 for (var i=0; i<palActiveLayers.length; i++) {
340 var track_name = palActiveLayers[i];
341 edit_json[track_name] = palTracks[track_name];
342 }
343
344 trackEditor.setValue(JSON.stringify(edit_json,null,'\t'));
345 trackEditor.clearSelection();
346
347 $('#edit-recording-popup').dialog('open');
348
349 return false; // no need to process the event any further
350}
351
Note: See TracBrowser for help on using the repository browser.