Skip to content
Snippets Groups Projects
Commit 87fb4a89 authored by rswindell's avatar rswindell
Browse files

Adhere to temp settings.

parent 09f89ab5
No related branches found
No related tags found
No related merge requests found
...@@ -33,6 +33,8 @@ var note_start=0; ...@@ -33,6 +33,8 @@ var note_start=0;
var note_on; var note_on;
var note; var note;
var last_delta=0; var last_delta=0;
var tempo=500; /* msec/quarter-note (120 bbp) */
var ticks_per_qnote=500;
function readVar(file) function readVar(file)
{ {
...@@ -51,6 +53,11 @@ function readVar(file) ...@@ -51,6 +53,11 @@ function readVar(file)
return val; return val;
} }
function ticks_per_msec()
{
return(tempo/ticks_per_qnote);
}
for(i=0;i<argc;i++) { for(i=0;i<argc;i++) {
switch(argv[i]) { switch(argv[i]) {
case "-d": case "-d":
...@@ -73,7 +80,7 @@ if(!filename) { ...@@ -73,7 +80,7 @@ if(!filename) {
if(!file_exists(filename)) if(!file_exists(filename))
filename=system.exec_dir + filename; filename=system.exec_dir + filename;
file = new File(filename); file = new File(filename, true /* shareable */);
if(!file.open("rb")) { if(!file.open("rb")) {
alert("error " + file.error + " opening " + filename); alert("error " + file.error + " opening " + filename);
...@@ -104,7 +111,8 @@ while(!file.eof && !js.terminated) { ...@@ -104,7 +111,8 @@ while(!file.eof && !js.terminated) {
fmat = file.readBin(2); fmat = file.readBin(2);
ntrks = file.readBin(2); ntrks = file.readBin(2);
division = file.readBin(2); division = file.readBin(2);
if(!(division&0x8000))
ticks_per_qnote=division;
if(debug) { if(debug) {
writeln("\tformat: " + fmat); writeln("\tformat: " + fmat);
writeln("\tntrks: " + ntrks); writeln("\tntrks: " + ntrks);
...@@ -172,13 +180,14 @@ while(!file.eof && !js.terminated) { ...@@ -172,13 +180,14 @@ while(!file.eof && !js.terminated) {
track_tempo |= file.readBin(1)<<8; track_tempo |= file.readBin(1)<<8;
track_tempo |= file.readBin(1); track_tempo |= file.readBin(1);
writeln("Tempo: " + track_tempo); writeln("Tempo: " + track_tempo);
temp = track_tempo/1000; /* Convert from usec to msec */
break; break;
case EVENT_TYPE_TIME_SIGNATURE: case EVENT_TYPE_TIME_SIGNATURE:
nn=file.readBin(1); nn=file.readBin(1);
dd=file.readBin(1); dd=file.readBin(1);
cc=file.readBin(1); cc=file.readBin(1);
bb=file.readBin(1); bb=file.readBin(1);
writeln("Time Singature: " + format("%u/%u",nn,Math.pow(2,dd))); writeln("Time Sigature: " + format("%u/%u",nn,Math.pow(2,dd)));
break; break;
default: default:
while(file.position < end_of_event) { while(file.position < end_of_event) {
...@@ -194,29 +203,36 @@ while(!file.eof && !js.terminated) { ...@@ -194,29 +203,36 @@ while(!file.eof && !js.terminated) {
switch(status&0xf0) { switch(status&0xf0) {
case EVENT_TYPE_NOTE_ON: case EVENT_TYPE_NOTE_ON:
note_start=delta; note_start=delta;
note_on=note=file.readBin(1); note=file.readBin(1);
velocity=file.readBin(1); velocity=file.readBin(1);
writeln("\t\tnote on: " + note + " velocity: " + velocity); if(note_on)
break;
writeln("\t\tnote on: " + note);
if(delta) if(delta)
sleep(delta); sleep(delta*ticks_per_msec());
note_on=note;
break; break;
case EVENT_TYPE_NOTE_OFF: case EVENT_TYPE_NOTE_OFF:
note=file.readBin(1); note=file.readBin(1);
velocity=file.readBin(1); velocity=file.readBin(1);
writeln("\t\tnote off: " + note + " velocity: " + velocity); writeln("\t\tnote off: " + note);
if(note!=note_on) if(note!=note_on)
alert("NOTE OFF/ON MISMATCH"); break;
if(delta) { if(delta) {
freq=523.50/32.0; /* Low 'C' */ freq=523.50/32.0; /* Low 'C' */
freq*=Math.pow(2,note/12); freq*=Math.pow(2,note/12);
writeln("\t\tPlaying " + Math.floor(freq) + " for " + delta); writeln("\t\tPlaying " + Math.floor(freq) + " for " + delta);
beep(freq,delta); beep(freq,delta*ticks_per_msec());
} }
note_on=0;
break; break;
} }
} else if(status&0x80) }
/*
else if(status&0x80)
writeln("Ignoring message for channel: " + format("%02X",status&0x0f)); writeln("Ignoring message for channel: " + format("%02X",status&0x0f));
*/
} while(!file.eof && !js.terminated && file.position < end_of_track); } while(!file.eof && !js.terminated && file.position < end_of_track);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment