CLI PHP script that outputs files based on vocals part information in Rock Band MIDI files.
1 #!php
2 <?php
3
4 error_reporting(E_ALL);
5 require('./classes/midi.class.php');
6
7
8 function processFile($file, $options) {
9 $midi = new Midi();
10 $midi->importMid($file);
11 $track = $midi->getTrack(0);
12 // Find track name so we can rename output file
13 foreach ($track as $msgStr){
14 $msg = explode(' ',$msgStr);
15 if ($msg[1]=='Meta'&&$msg[2]=='TrkName') {
16 $newname = substr($msgStr,strpos($msgStr,'"')+1,-1);
17 if ($options['verbose']) echo "$file -> $newname\n";
18 }
19 }
20 if (!isset($newname)) {
21 echo "No Track 0 Meta TrkName for $file - is it a Rock Band MIDI?\n"; exit(1);
22 }
23 $midi->soloTrack(4); // delete all non-vocal tracks, leaving track 1
24 $midi->newTrack(); // add a track for percussion (returns wrong number, but I know it's track 2)
25 $ch = 'ch=4'; // mostly channel 4 is used, overwrite with what we find later
26 $lyrics = array(); $notes = array();
27 $slides = array(); $slide = false;
28 $notelist = $midi->getNoteList();
29 foreach ($notelist as $k=>$v) {
30 $notelist[$k] = substr($v,0,1); // remove octave number
31 if (strlen($v)==3) $notelist[$k] .= '#'; // # looks a bit like a talky, but I don't like s for sharp
32 }
33 $mc = $midi->getMsgCount(1);
34 for ($i=0; $i<$mc; $i++) {
35 $msg = explode(' ',$midi->getMsg(1,$i));
36 if ($msg[1]=='Meta') {
37 if ($msg[2]=='Text' && substr($msg[3],1,1)=='[') {
38 // Delete all Meta Text that starts with '[',
39 // it breaks many MIDI parsers and we're not interested in it
40 $midi->deleteMsg(1,$i);
41 $i--;
42 $mc--;
43 } else if ($msg[2]=='Text' || $msg[2]=='Lyric') {
44 $l = substr($msg[3],1,-1);
45 $lyrics[] = $l;
46 if ($l=='+') {
47 $slide = count($lyrics)-1;
48 }
49 }
50 } else if ($msg[1]=='On'){
51 $ch = $msg[2];
52 $n = substr($msg[3],2)+0;
53 if ($n<36 || $n>95) { // not a musical note
54 $midi->deleteMsg(1,$i);
55 $i--;
56 $mc--;
57 if ($n==96) {
58 $msg[2]='ch=10'; // MIDI percussion channel
59 $msg[3]=$options['midi_percussion'];
60 $midi->addMsg(2, implode(' ',$msg));
61 } else if (($n==105 || $n==106) &&
62 $msg[4]=='v=0' && (count($lyrics)==0 ||
63 substr($lyrics[count($lyrics)-1],-1,1)!="\n")) {
64 // Ignore Player 1/2 info, just start a new phrase here
65 $lyrics[] = "\n";
66 $notes[] = "\n";
67 }
68 } else if (substr($msg[4],2) > 0) { // musical note on
69 $msg[4]=='v=127';
70 $midi->tracks[1][$i] = implode(' ',$msg);
71 $notes[] = $n;
72 } else { // musical note off
73 $lastofftime = $msg[0]+0;
74 $lastoffnote = $n;
75 }
76 }
77 if ($options['enable_slides'] && $slide && count($notes)-1 >= $slide) {
78 $slides[] = array($lastofftime, $lastoffnote, $msg[0], $notes[$slide]);
79 $slide = false;
80 }
81 }
82
83
84 if ($options['enable_txt']) {
85 $txtl =''; $txtn=''; $txt='';
86 foreach ($lyrics as $k=>$l) {
87 if ($l!="\n") {
88 $mod = substr($l,-1,1);
89 if ($mod=='#' || $mod=='^' || $mod=='*') {
90 // Known talkie part.
91 // Show modifier symbol in place of note instead of in lyric.
92 $l = substr($l,0,-1);
93 $n = $mod;
94 if (substr($l,-1,1)!='-') {
95 $l .= ' ';
96 }
97 } else {
98 // Leave unknown symbols like = and % in lyric for now
99 if ($mod != '-') {
100 $l = $l.' ';
101 }
102 $n = $notelist[$notes[$k]];
103 }
104
105 if (strlen($l) > strlen($n)+1) {
106 $txtn .= str_pad($n,strlen($l),' ');
107 $txtl .= $l;
108 } else {
109 $txtn .= $n.' ';
110 $txtl .= str_pad($l,strlen($n)+1,' ');
111 }
112 } else {
113 $txt .= $txtn."\r\n".$txtl."\r\n\r\n";
114 $txtl =''; $txtn='';
115 }
116 }
117 $write = fopen($newname.'.txt', 'w');
118 fwrite($write, $txt);
119 fclose($write);
120 }
121 if ($options['enable_midi'] || $options['enable_midixml']) {
122 if ($options['enable_slides']) {
123 foreach ($slides as $g) {
124 $x0 = $g[0]; $y0 = $g[1];
125 $x1 = $g[2]; $y1 = $g[3];
126 if ($options['slide_type']=='glissando') {
127 $dx = $x1-$x0;
128 $dy = $y1-$y0;
129 if ($dx>0) {
130 $m = $dy/$dx;
131 $b = $y0-$m*$x0;
132 $lastnote = $y0;
133 $midi->insertMsg(1, "$x0 On $ch n=$y0 v=127");
134 while ($x0 != $x1) {
135 $x0++;
136 $y0 = round($m*$x0 + $b);
137 if (($m>0 && $y0 > $lastnote) || ($m<0 && $y0 < $lastnote)) {
138 $midi->insertMsg(1, ($x0-1+1)." On $ch n=$lastnote v=0");
139 $midi->insertMsg(1, "$x0 On $ch n=$y0 v=127");
140 $lastnote=$y0;
141 }
142 }
143 $midi->insertMsg(1, "$x1 On $ch n=$lastnote v=0");
144 }
145 } else if ($options['slide_type']=='portamento') {
146 $midi->insertMsg(1, "$x0 Par $ch c=65 v=127"); // portamento: on
147 $t = $x1-$x0; // almost certainly wrong calculation since 0 is the "slowest rate"
148 $midi->insertMsg(1, "$x0 Par $ch c=5 v=".(($t >> 7) & 0x7f)); // portamento time MSB
149 $midi->insertMsg(1, "$x0 Par $ch c=37 v=".($t & 0x7f)); // portamento time LSB
150 $midi->insertMsg(1, "$x0 On $ch n=$y0 v=127");
151 $midi->insertMsg(1, "$x1 On $ch n=$y0 v=0");
152 $midi->insertMsg(1, "$x0 On $ch n=$y1 v=127");
153 $midi->insertMsg(1, "$x1 On $ch n=$y1 v=0");
154 $midi->insertMsg(1, "$x0 Par $ch c=65 v=0"); // portamento: off
155 } else if ($options['slide_type']=='pitchbend') {
156 $midi->insertMsg(1, "$x0 On $ch n=$y0 v=127");
157 $midi->insertMsg(1, "$x1 On $ch n=$y0 v=0");
158 // TODO lots of carefully timed pitch bend instructions (these are very wrong)
159 /* 0x2000 is center position
160 * 0x0000 is two semitones down
161 * 0x3fff is two semitones up
162 */
163 $t = $x1-$x0;
164 for ($i=0; $i<$t; $i+=8) {
165 $midi->insertMsg(1, $i+$x0." Pb $ch v=".round(0x2000+0x1fff*($i/$t)));
166 }
167 $midi->insertMsg(1, "$x1 Pb $ch v=2000");
168 // TODO maybe combine with glissando? similar functionality needed for bigger intervals
169 }
170 }
171 }
172 $midi->insertMsg(1, "0 PrCh $ch ".$options['midi_instrument']);
173 if ($options['enable_midi']) {
174 $midi->saveMidFile($newname.'.mid');
175 }
176 if ($options['enable_midixml']) {
177 $write = fopen($newname.'.xml', 'w');
178 fwrite($write, $midi->getXml());
179 fclose($write);
180 }
181 }
182 }
183
184 function help($arg0) {
185 echo "Usage: $arg0 [OPTION]... [--files] [FILE]...\n";
186 ?>
187 Output files based on vocals part information in Rock Band MIDI files. Files are
188 created in the current directory and named based on information found in the
189 input file (for example, wontgetfooled_short.mid).
190
191 MIDI OPTIONS
192 --disable-midi don't output a standard MIDI file
193 --enable-midi do output a standard MIDI file (default)
194 --enable-midixml do output a MIDI XML file
195 --disable-midixml don't output a MIDI XML file (default)
196 --enable-slides add slides to the MIDI file where the game would have
197 diagonal note tubes (default)
198 --disable-slides don't add slides to the MIDI file where the game would
199 have diagonal note tubes
200 --slide-type=TYPE one of:
201 glissando (play every note in between) (default)
202 portamento (broken)
203 pitchbend (broken)
204 --midi-instrument=P MIDI instrument number between 1 and 128 for normal
205 notes (default is 81 Lead 1 (square), try 19 Rock Organ)
206 --midi_percussion=N MIDI percussion note between 0 and 127 for percussion
207 section (default is 39 Hand Clap, try 54 Tambourine or
208 56 Cowbell)
209
210 TEXT FILE OPTIONS
211 --enable-txt output a text file (default)
212 --disable-txt don't output a text file
213
214 OTHER OPTIONS
215 --verbose do show some file info while processing (default)
216 --quiet don't show some file info while processing
217 --help show this help
218 --files the remainder of the paramaters are input filenames
219 (optional, not normally needed)
220 <?php
221 exit(0);
222 }
223
224 function processArguments($argv) {
225 //default options:
226 $options['enable_midi'] = true;
227 $options['enable_txt'] = true;
228 $options['enable_midixml'] = false;
229 $options['midi_instrument'] = 'p=80'; // 80=Lead 1 (square), 18=Rock Organ
230 $options['midi_percussion'] = 'n=39'; // 39=hand clap, 54=tambourine, 56=cowbell)
231 $options['enable_slides'] = true;
232 $options['slide_type'] = 'glissando';
233 $options['verbose'] = true;
234
235 $processingOptions = true;
236 if (count($argv)==1) help($argv[0]);
237 $args = array_slice($argv,1);
238 foreach ($args as $arg) {
239 if ($processingOptions) {
240 if (substr($arg,0,1)=='-') {
241 if ($arg=='--disable-midi') {
242 $options['enable_midi'] = false;
243 } else if ($arg=='--enable-midi') {
244 $options['enable_midi'] = true;
245 } else if ($arg=='--disable-txt') {
246 $options['enable_txt'] = false;
247 } else if ($arg=='--enable-txt') {
248 $options['enable_txt'] = true;
249 } else if ($arg=='--disable-midixml') {
250 $options['enable_midixml'] = false;
251 } else if ($arg=='--enable-midixml') {
252 $options['enable_midixml'] = true;
253 } else if ($arg=='--enable-slides') {
254 $options['enable_slides'] = false;
255 } else if ($arg=='--disable-slides') {
256 $options['enable_slides'] = true;
257 } else if ($arg=='--verbose') {
258 $options['verbose'] = true;
259 } else if ($arg=='--quiet') {
260 $options['verbose'] = false;
261 } else if (substr($arg,0,13)=='--slide-type=') {
262 $options['slide_type'] = substr($arg,13);
263 } else if (substr($arg,0,18)=='--midi-instrument=') {
264 $p = substr($arg,18)-1;
265 if ($p>=1 && $p<=128) {
266 $options['midi_instrument'] = "p=$p";
267 } else {
268 echo "MIDI instrument should be between 1 and 128.\n"; exit(1);
269 }
270 } else if (substr($arg,0,18)=='--midi-percussion=') {
271 $n = substr($arg,18);
272 if ($n>=0 && $n<=127) {
273 $options['percussion'] = "n=$n";
274 } else {
275 echo "MIDI percussion note should be between 0 and 127.\n"; exit(1);
276 }
277 } else if ($arg=='--help') {
278 help($argv[0]);
279 } else if ($arg=='--files') {
280 $processingOptions = false;
281 }
282 } else {
283 $processingOptions = false;
284 processFile($arg, $options);
285 }
286 } else {
287 processFile($arg, $options);
288 }
289 }
290 }
291
292
293
294
295
296
297
298 // Main entry
299
300
301 processArguments($argv);
302 ?>
Greasemonkey script, prerelease version Adds a field to show the gold star cutoffs for (some) solo instruments on Scorehero: RockBand.
1 // ==UserScript==
2 // @name ScoreHero - Gold Star Cutoffs - Solo Instruments
3 // @version 1.2
4 // @description Adds a field to show the gold star cutoffs for all solo instruments on Scorehero: RockBand.
5 // @include http://rockband.scorehero.com/manage_scores.php?*
6 // @include http://rockband.scorehero.com/scores.php?*
7 // @author based on original code of Jason MacLean
8 // @author modified by qirex
9 // @author modified by GuestWednesday
10 // @author maintained by de1337ed
11 // ==/UserScript==
12
13 // Replace all non numeric characters with empty strings
14 function removeNonNumbers(strValue) {
15 return strValue.replace(/[^0-9]/g,'');
16 }
17
18 // Format an integer with commas
19 function addCommas(nStr)
20 {
21 nStr += '';
22 x = nStr.split('.');
23 x1 = x[0];
24 x2 = x.length > 1 ? '.' + x[1] : '';
25 var rgx = /(\d+)(\d{3})/;
26 while (rgx.test(x1)) {
27 x1 = x1.replace(rgx, '$1' + ',' + '$2');
28 }
29 return x1 + x2;
30 }
31
32 var searchString = document.location.search;
33 // strip off the leading '?'
34 searchString = searchString.substring(1);
35 var nvPairs = searchString.split("&");
36 for (i = 0; i < nvPairs.length; i++)
37 {
38 var nvPair = nvPairs[i].split("=");
39 if (nvPair[0]=='group'){
40 var group = nvPair[1];
41 } else if (nvPair[0]=='diff'){
42 var diff = nvPair[1];
43 } else if (nvPair[0]=='size'){
44 var size = nvPair[1];
45 } else if (nvPair[0]=='platform'){
46 var platform = nvPair[1];
47 }
48 }
49
50 // Exit if difficulty isn't expert
51 if (diff!=4) return;
52
53 var songs = [
54 "Blitzkrieg Bop",
55 "In Bloom",
56 "Say it Ain't So",
57 "Maps",
58 "Paranoid",
59 "Creep",
60 "Learn to Fly",
61 "I Think I'm Paranoid",
62 "Pleasure (Pleasure)",
63 "Go With the Flow",
64 "(Don't Fear) The Reaper",
65 "Here It Goes Again",
66 "Epic",
67 "Time We Had",
68 "Orange Crush",
69 "Black Hole Sun",
70 "Dani California",
71 "29 Fingers",
72 "Should I Stay or Should I Go",
73 "Sabotage",
74 "Celebrity Skin",
75 "Vasoline",
76 "Nightmare",
77 "The Hand That Feeds",
78 "Ballroom Blitz",
79 "Wave of Mutilation",
80 "Main Offender",
81 "Brainpower",
82 "Cherub Rock",
83 "Wanted Dead or Alive",
84 "When You Were Young",
85 "Dead on Arrival",
86 "Detroit Rock City",
87 "Outside",
88 "Reptilia",
89 "Enter Sandman",
90 "Are You Gonna Be My Girl",
91 "Electric Version",
92 "Flirtin' With Disaster",
93 "Blood Doll",
94 "Next To You",
95 "Green Grass and High Tides",
96 "Gimme Shelter",
97 "Mississippi Queen",
98 "Train Kept a Rollin'",
99 "Seven",
100 "Won't Get Fooled Again",
101 "Welcome Home",
102 "Suffragette City",
103 "Day Late, Dollar Short",
104 "Highway Star",
105 "Tom Sawyer",
106 "Run to the Hills",
107 "Foreplay/Long Time",
108 "I Get By",
109 "I'm So Sick",
110 "Timmy & the Lords of the Underworld",
111 "Can't Let Go",
112 "...And Justice For All",
113 "3's & 7's",
114 "Action",
115 "All the Small Things",
116 "Attack",
117 "Bang a Gong",
118 "Beethoven's C***",
119 "Blackened",
120 "Blinded By Fear",
121 "Brass In Pocket",
122 "Buddy Holly",
123 "Calling Dr. Love",
124 "Can't Stand Losing You",
125 "Casey Jones",
126 "Cherry Bomb",
127 "China Cat Sunflower",
128 "Complete Control",
129 "Crushcrushcrush",
130 "D.O.A.",
131 "Die, All Right!",
132 "Dirty Little Secret",
133 "Don't Look Back in Anger",
134 "El Scorcho",
135 "Ever Fallen in Love",
136 "Fortunate Son",
137 "Franklin's Tower",
138 "Gimme Three Steps",
139 "Hard To Handle",
140 "Heroes",
141 "Hitch a Ride",
142 "I Fought the Law",
143 "I Need A Miracle",
144 "Interstate Love Song",
145 "Joker & The Thief",
146 "Juke Box Hero",
147 "Last Train to Clarksville",
148 "Limelight",
149 "Little Sister",
150 "Live Forever",
151 "March Of The Pigs",
152 "Moonage Daydream",
153 "More Than a Feeling",
154 "Move Along",
155 "My Iron Lung",
156 "My Sharona",
157 "N.I.B.",
158 "Peace of Mind",
159 "Queen Bitch",
160 "Ride the Lightning",
161 "Roam",
162 "Rock & Roll Band",
163 "Rock Rebellion",
164 "Rockaway Beach",
165 "Roxanne",
166 "Sex Type Thing",
167 "Shake",
168 "Shockwave",
169 "Sick, Sick, Sick",
170 "Siva",
171 "Smokin",
172 "Something About You",
173 "Song With a Mission",
174 "Sprode",
175 "Sugar Magnolia",
176 "Sweet Leaf",
177 "Synchronicity II",
178 "Teenage Lobotomy",
179 "Ten Speed (Of God's Blood And Burial)",
180 "The Collector",
181 "The Kill",
182 "The Number of the Beast",
183 "The Perfect Drug",
184 "Thrasher",
185 "Truckin",
186 "Truth Hits Everybody",
187 "War Pigs",
188 "We Care A Lot",
189 "Why Do You Love Me",
190 "Wonderwall",
191 "Working Man"
192 ];
193 if (platform==1 || platform==2 || platform==3) { // could have separate PS2 (platform=1) scores
194 if (size==1) {
195 if (group==1) {
196 // list all cutoffs in same order as songs, see group==4 for full example
197 cutoffs = [106358, 187135, 84650, 50924, 101551];
198 } else if (group==2) {
199 // list all cutoffs in same order as songs, see group==4 for full example
200 cutoffs = [71322, 161968, 73780, 72457, 114200];
201 } else if (group==3) {
202 // list all cutoffs in same order as songs, see group==4 for full example
203 cutoffs = [90050, 111525, 134800, 141650, 123675];
204 } else if (group==4) {
205 cutoffs = [
206 131040, // Blitzkrieg Bop
207 243360, // In Bloom
208 148080, // Say it Ain't So
209 132805, // Maps
210 107640, // Paranoid
211 173160, // Creep
212 215280, // Learn to Fly
213 168480, // I Think I'm Paranoid
214 127430, // Pleasure (Pleasure)
215 145080, // Go With the Flow
216 184925, // (Don't Fear) The Reaper
217 215280, // Here It Goes Again
218 253610, // Epic
219 112320, // Time We Had
220 141470, // Orange Crush
221 229320, // Black Hole Sun
222 219225, // Dani California
223 111015, // 29 Fingers
224 170730, // Should I Stay or Should I Go
225 135720, // Sabotage
226 201240, // Celebrity Skin
227 121680, // Vasoline
228 113640, // Nightmare
229 187200, // The Hand That Feeds
230 272400, // Ballroom Blitz
231 70200, // Wave of Mutilation
232 91795, // Main Offender
233 102960, // Brainpower
234 159120, // Cherub Rock
235 145080, // Wanted Dead or Alive
236 159120, // When You Were Young
237 210420, // Dead on Arrival
238 154330, // Detroit Rock City
239 212545, // Outside
240 191825, // Reptilia
241 182520, // Enter Sandman
242 179480, // Are You Gonna Be My Girl
243 163800, // Electric Version
244 190215, // Flirtin' With Disaster
245 168480, // Blood Doll
246 219960, // Next To You
247 140000, // Green Grass and High Tides
248 191270, // Gimme Shelter
249 91240, // Mississippi Queen
250 222530, // Train Kept a Rollin'
251 290160, // Seven
252 260945, // Won't Get Fooled Again
253 276120, // Welcome Home
254 252720, // Suffragette City
255 186395, // Day Late, Dollar Short
256 280525, // Highway Star
257 160455, // Tom Sawyer
258 177840, // Run to the Hills
259 252485, // Foreplay/Long Time
260 249110, // I Get By
261 121680, // I'm So Sick
262 131040, // Timmy & the Lords of the Underworld
263 131040, // Can't Let Go
264 226880, // ...And Justice For All
265 150275, // 3's & 7's
266 177840, // Action
267 152580, // All the Small Things
268 219960, // Attack
269 182520, // Bang a Gong
270 210600, // Beethoven's C***
271 218725, // Blackened
272 107640, // Blinded By Fear
273 145080, // Brass In Pocket
274 163800, // Buddy Holly
275 155260, // Calling Dr. Love
276 201240, // Can't Stand Losing You
277 213600, // Casey Jones
278 154440, // Cherry Bomb
279 165175, // China Cat Sunflower
280 201240, // Complete Control
281 257400, // Crushcrushcrush
282 157815, // D.O.A.
283 149760, // Die, All Right!
284 196560, // Dirty Little Secret
285 222835, // Don't Look Back in Anger
286 215280, // El Scorcho
287 140400, // Ever Fallen in Love
288 131040, // Fortunate Son
289 214350, // Franklin's Tower
290 205785, // Gimme Three Steps
291 210420, // Hard To Handle
292 177840, // Heroes
293 174440, // Hitch a Ride
294 154400, // I Fought the Law
295 200310, // I Need A Miracle
296 113695, // Interstate Love Song
297 155260, // Joker & The Thief
298 177410, // Juke Box Hero
299 205115, // Last Train to Clarksville
300 156385, // Limelight
301 135720, // Little Sister
302 218475, // Live Forever
303 107640, // March Of The Pigs
304 163455, // Moonage Daydream
305 137985, // More Than a Feeling
306 205920, // Move Along
307 187200, // My Iron Lung
308 171510, // My Sharona
309 181050, // N.I.B.
310 202450, // Peace of Mind
311 201240, // Queen Bitch
312 179730, // Ride the Lightning
313 203865, // Roam
314 182035, // Rock & Roll Band
315 182520, // Rock Rebellion
316 187200, // Rockaway Beach
317 107640, // Roxanne
318 182520, // Sex Type Thing
319 268510, // Shake
320 137915, // Shockwave
321 168480, // Sick, Sick, Sick
322 123000, // Siva
323 162315, // Smokin
324 168480, // Something About You
325 186090, // Song With a Mission
326 210600, // Sprode
327 217280, // Sugar Magnolia
328 203060, // Sweet Leaf
329 191325, // Synchronicity II
330 102960, // Teenage Lobotomy
331 165245, // Ten Speed (Of God's Blood And Burial)
332 154440, // The Collector
333 154440, // The Kill
334 185605, // The Number of the Beast
335 215280, // The Perfect Drug
336 126360, // Thrasher
337 243360, // Truckin
338 190950, // Truth Hits Everybody
339 134820, // War Pigs
340 191880, // We Care A Lot
341 238680, // Why Do You Love Me
342 172355, // Wonderwall
343 184495 // Working Man
344 ];
345 } else return;
346 } else if (size==4) {
347 // full band scores would go here instead of return
348 return;
349 } else return;
350 } else return;
351
352 if (document.URL.substr(30,17)=='manage_scores.php') {
353 scoreCol = 7; songCol = 5;
354 } else if (document.URL.substr(30,10)=='scores.php') {
355 scoreCol = 5; songCol = 3;
356 } else return;
357
358 var trs = document.getElementsByTagName('tr');
359 for(i = 0; i < trs.length; i++)
360 {
361 tds = trs[i].getElementsByTagName('td');
362 if (tds.length > scoreCol) {
363 song = songs.indexOf(tds[songCol].textContent);
364 if (song!=-1) {
365 scoreCell = tds[scoreCol];
366 score = removeNonNumbers(scoreCell.textContent);
367 if(score < cutoffs[song]) {
368 var difference = cutoffs[song] - score;
369 scoreCell.innerHTML += '<br/><font color="#CD7F32" style="font-size: 10px">' + addCommas(cutoffs[song]) + '</font> <font color="red" style="font-size:8px">(' + addCommas(difference) + ')</font>';
370 } else {
371 // Uncomment the following to show the cutoff in green even if you've already beaten it (for debugging etc)
372 //scoreCell.innerHTML += '<br/><font color="green" style="font-size: 10px">' + addCommas(cutoffs[song]) + '</font>';
373 }
374 }
375 }
376 }
Pages : 1