/* JavaScript MIDI API 
MIDI utilities en algemene functies en constanten voor communicatie met MIDIapplet
S.Sanders juli 2005 / sept 2009
*/

/* Check Java en soundbank:	*/

function checkJavaSoundbank(){
	/* deze functie onload draaien	*/
	var java_installed = false;
	var soundbank_installed = false;
	
	if (navigator.javaEnabled()) {
		java_installed = true;
	}
	/* andere manier:	*/
	for (x = 0; x < navigator.plugins.length; x++) {
		if (navigator.plugins[x].name.indexOf('Java(TM)') != -1) {
			java_installed = true;
			break;
		}
	}
	/* soundbank geladen?	*/
	var instruments = "";
	try{
		instruments = document.MidiApplet.getLoadedInstruments();
	}
	catch(err){
		//alert("Error: " + err.description);
	}
	soundbank_installed = instruments.length? true:false;
	
	var str = java_installed? "":"Geen Java geinstalleerd?";
	str += soundbank_installed? "":"Geen Java soundbank geinstalleerd?";
	
	if(str.length){
		alert(str);
	}
}

function addLoadEvent(func) { 
	var oldonload = window.onload; 
	if (typeof window.onload != 'function') { 
		window.onload = func; 
	}
	else{
		window.onload = function(){ 
			if (oldonload){
				oldonload();
			} 
			func();
		};
	}
}

addLoadEvent(checkJavaSoundbank);

/* Globals	----------------------------------------------*/

var _midiRandomTranspose = new Array(); 				/* boolean flag per kanaal	*/
	for(i=0;i<16;i++){_midiRandomTranspose[i] = false;}	/* initialiseren	*/

/* End globals	-----------------------------------*/
/* Start utility functies -------------------------*/

function setRandomTranspose(channel,on){
	/* boolean flags per kanaal bepalen of random transpose moet of niet	*/
	_midiRandomTranspose[channel] = on;
}

function getRandomTranspose(channel){
	/* kijk of op een kanaal de random transpose aan staat en bereken nieuwe transpose	*/
	return(_midiRandomTranspose[parseInt(channel,10)]?Math.randomBetween(-6,6):0);
}

/* *********************************************************************	*/

function setMidiTranspose(channel,number){
	document.MidiApplet.setMidiTranspose(parseInt(channel,10),parseInt(number,10));
}

function getMidiTranspose(channel){
	return(document.MidiApplet.getMidiTranspose(parseInt(channel,10)));
}

function setMidiOctave(channel,number){
	document.MidiApplet.setMidiOctave(parseInt(channel,10),parseInt(number,10));
}

function getMidiOctave(channel){
	return(document.MidiApplet.getMidiOctave(parseInt(channel,10)));
}

function setMessage(command,channel,data1,data2){ /* 4 integers ruwe MIDI data	*/
    document.MidiApplet.setMessage(command,channel,data1,data2);
}

function startNote(){	/* variabel aantal argumenten, integers	*/
	for(var i=0;i<arguments.length;i++){
	    document.MidiApplet.startNote(arguments[i]);
	}
}

function stopNote(note){	/* variabel aantal argumenten, integers	*/
	for(var i=0;i<arguments.length;i++){
	    document.MidiApplet.stopNote(arguments[i]);
	}
}

function startNotes(notesStr){	/* meerdere notes in string: comma separated 	*/
    document.MidiApplet.startNotes(notesStr)
}

function stopNotes(notesStr){	/* meerdere notes in string: comma separated 	*/
    document.MidiApplet.stopNotes(notesStr)
}

function playNote(note,duration){ 	/* 2 integers	*/
	document.MidiApplet.playNote(note);
}

function playNotes(notesStr,duration){ 	/* eerste argument notes in string	*/
	document.MidiApplet.playNotes(notesStr,duration);
}

function playDelayNote(duration,delay,note){
    document.MidiApplet.playNote(note,duration,delay);
}

function setInstrument(channel,number){
	document.MidiApplet.setInstrument(parseInt(channel,10),parseInt(number,10));
}

function setMidiChannel(number){
	document.MidiApplet.setChannel(parseInt(number,10));
}

var mCh = 0;
function getMidiChannel(){
	mCh = document.MidiApplet.getChannel();
	return(document.MidiApplet.getChannel());
}

function sendMidiMessage(str){
	/* string met comma separated values, hex of decimaal	*/
	var arr = str.split(",");
	for(var i=0;i<arr.length;i++){
		arr[i] = (arr[i].indexOf("0x") == 0)? parseInt(arr[i],16):parseInt(arr[i],10);
	}
	document.MidiApplet.setMessage(arr[0],arr[1],arr[2],arr[3]);
}

function playMidi(){
	/* speelt SMF af, werkt niet ivm security van Java...	*/
    document.MidiApplet.playMidi("zelda.mid")
}

function stopMidi(){
	/* stopt afspelen SMF	*/
    document.MidiApplet.stopMidi()
}

function allNotesOff(){
	/* actieve kanaal handhaven	*/
	var currentChannel = getMidiChannel(); /*  bewaren!	*/
	for(var i=0;i<16;i++){setMessage(CONTROL,i,ALL_NOTES_OFF,0);}
	setMidiChannel(currentChannel);
}
function resetMidiApplet(){
	allNotesOff();
	for(i=0;i<16;i++){_midiRandomTranspose[i] = false;}
	document.MidiApplet.reset();
}

function midiReset(){
	/* all notes off, channel op 0, reset transpose en octave	*/
	allNotesOff();
	document.MidiApplet.reset();
	for(var i=0;i<16;i++){setRandomTranspose(i, false);}
}

/* Nieuwe methods:	*/

Array.prototype.copy = function copy(){/* kopieer method toevoegen aan alle arrays	*/
	/* is, gek genoeg, geen standaard functie???	*/
  var t = new Array();
  for (var i=0; i<this.length; i++){t[i] = this[i];}
  return t;
}	

Math.randomBetween = function(a,b){
	/* maak een random getal van min a en max b	*/
	return (a + Math.floor(Math.random()*(b-a+1)));
}

/* End utility functies -------------------------*/

/* Constanten	*/
/* "hash table" met GM-instrumenten voor bijv. oproep onder naam ipv nummer	*/
var _midiInstruments = new Array();
var n=0;
_midiInstruments["piano"] 				= n++;
_midiInstruments["bright piano"] 		= n++;
_midiInstruments["electric grand"] 		= n++;
_midiInstruments["honky tonk piano"] 	= n++;
_midiInstruments["electric piano 1"] 	= n++;
_midiInstruments["electric piano 2"] 	= n++;
_midiInstruments["harpsichord"] 		= n++;
_midiInstruments["clavinet"] 			= n++;
_midiInstruments["celesta"] 			= n++;
_midiInstruments["glockenspiel"] 		= n++;
_midiInstruments["music box"] 			= n++;
_midiInstruments["vibraphone"] 			= n++;
_midiInstruments["marimba"] 			= n++;
_midiInstruments["xylophone"] 			= n++;
_midiInstruments["tubular bell"] 		= n++;
_midiInstruments["dulcimer"] 			= n++;
_midiInstruments["hammond organ"] 		= n++;
_midiInstruments["perc organ"] 			= n++;
_midiInstruments["rock organ"] 			= n++;
_midiInstruments["church organ"] 		= n++;
_midiInstruments["reed organ"] 			= n++;
_midiInstruments["accordion"]			= n++;
_midiInstruments["harmonica"]			= n++;
_midiInstruments["tango accordion"]		= n++;
_midiInstruments["nylon string guitar"]	= n++;
_midiInstruments["steel string guitar"]	= n++;
_midiInstruments["jazz electric guitar"]= n++;
_midiInstruments["clean guitar"]		= n++;
_midiInstruments["muted guitar"]		= n++;
_midiInstruments["overdrive guitar"]	= n++;
_midiInstruments["distortion guitar"]	= n++;
_midiInstruments["guitar harmonics"]	= n++;
_midiInstruments["acoustic bass"]		= n++;
_midiInstruments["fingered bass"]		= n++;
_midiInstruments["picked bass"]			= n++;
_midiInstruments["fretless bass"]		= n++;
_midiInstruments["slap bass 1"]			= n++;
_midiInstruments["slap bass 2"]			= n++;
_midiInstruments["synth bass 1"]		= n++;
_midiInstruments["synth bass 2"]		= n++;
_midiInstruments["violin"]				= n++;
_midiInstruments["viola"]				= n++;
_midiInstruments["cello"]				= n++;
_midiInstruments["contrabass"]			= n++;
_midiInstruments["tremolo strings"]		= n++;
_midiInstruments["Pizzicato strings"]	= n++;
_midiInstruments["harp"]				= n++;
_midiInstruments["timpani"]				= n++;
_midiInstruments["strings"]				= n++;
_midiInstruments["slow strings"]		= n++;
_midiInstruments["synth strings 1"]		= n++;
_midiInstruments["synth strings 2"]		= n++;
_midiInstruments["choir aahs"]			= n++;
_midiInstruments["choir oohs"]			= n++;
_midiInstruments["synvox"]				= n++;
_midiInstruments["orchestra hit"]		= n++;
_midiInstruments["trumpet"]				= n++;
_midiInstruments["trombone"]			= n++;
_midiInstruments["tuba"]				= n++;
_midiInstruments["muted trumpet"]		= n++;
_midiInstruments["french horn"]			= n++;
_midiInstruments["brass 1"]				= n++;
_midiInstruments["synth brass 1"]		= n++;
_midiInstruments["synth brass 2"]		= n++;
_midiInstruments["soprano sax"]			= n++;
_midiInstruments["alto sax"]			= n++;
_midiInstruments["tenor sax"]			= n++;
_midiInstruments["baritone sax"]		= n++;
_midiInstruments["oboe"]				= n++;
_midiInstruments["english horn"]		= n++;
_midiInstruments["bassoon"]				= n++;
_midiInstruments["clarinet"]			= n++;
_midiInstruments["piccolo"]				= n++;
_midiInstruments["flute"]				= n++;
_midiInstruments["recorder"]			= n++;
_midiInstruments["pan flute"]			= n++;
_midiInstruments["bottle blow"]			= n++;
_midiInstruments["shakuhachi"]			= n++;
_midiInstruments["whistle"]				= n++;
_midiInstruments["ocarina"]				= n++;
_midiInstruments["square wave"]			= n++;
_midiInstruments["saw wave"]			= n++;
_midiInstruments["synth calliope"]		= n++;
_midiInstruments["chiffer lead"]		= n++;
_midiInstruments["charang"]				= n++;
_midiInstruments["solo vox"]			= n++;
_midiInstruments["5th saw wave"]		= n++;
_midiInstruments["bass & lead"]			= n++;
_midiInstruments["fantasia"]			= n++;
_midiInstruments["warm pad"]			= n++;
_midiInstruments["polysynth"]			= n++;
_midiInstruments["space voice"]			= n++;
_midiInstruments["bowed glass"]			= n++;
_midiInstruments["metal pad"]			= n++;
_midiInstruments["halo pad"]			= n++;
_midiInstruments["sweep pad"]			= n++;
_midiInstruments["ice Rain"]			= n++;
_midiInstruments["soundtrack"]			= n++;
_midiInstruments["crystal"]				= n++;
_midiInstruments["atmosphere"]			= n++;
_midiInstruments["brightness"]			= n++;
_midiInstruments["goblin"]				= n++;
_midiInstruments["echo drops"]			= n++;
_midiInstruments["star theme"]			= n++;
_midiInstruments["sitar"]				= n++;
_midiInstruments["banjo"]				= n++;
_midiInstruments["shamisen"]			= n++;
_midiInstruments["koto"]				= n++;
_midiInstruments["kalimba"]				= n++;
_midiInstruments["bag pipe"]			= n++;
_midiInstruments["fiddle"]				= n++;
_midiInstruments["shannai"]				= n++;
_midiInstruments["tinkle bell"]			= n++;
_midiInstruments["agogo"]				= n++;
_midiInstruments["steel drums"]			= n++;
_midiInstruments["woodblock"]			= n++;
_midiInstruments["taiko"]				= n++;
_midiInstruments["melodic tom 1"]		= n++;
_midiInstruments["synth drum"]			= n++;
_midiInstruments["reverse cymbal"]		= n++;
_midiInstruments["guitar fretnoise"]	= n++;
_midiInstruments["breath noise"]		= n++;
_midiInstruments["seashore"]			= n++;
_midiInstruments["bird"]				= n++;
_midiInstruments["telephone 1"]			= n++;
_midiInstruments["helicopter"]			= n++;
_midiInstruments["applause"]			= n++;
_midiInstruments["gun shot"]			= n++;

/* Constants: STATUSBYTES:						*/

/*	Channel info:	*/
NOTE_OFF 	= 0x80;		/* + kanaalnr	*/
NOTE_ON 	= 0x90;
P_AFTERT 	= 0xA0;
CONTROL 	= 0xB0;
PROG_CH 	= 0xC0;
CH_AFTERT 	= 0xD0;
PITCH_B 	= 0xE0;

/* System common info:	*/
SYSEX_ON 	= 0xF0;
MIDI_TIME 	= 0xF1;
SONGPOINT 	= 0xF2;
SONGSELECT 	= 0xF3;
TUNE_REQ 	= 0xF6;
SYSEX_OFF 	= 0xF7;

/* System real time info	*/
TIMECLOCK 	= 0xF8;
START 		= 0xFA;
CONTINUE 	= 0xFB;
STOP 		= 0xFC;
ACT_SENS 	= 0xFE;
SYS_RES 	= 0xFF;

/* Controllers (data_1)	*/
BANK_CHANGE_MSB = 0x00;		/* 0 - 127 (7F)	*/
MODULATION 	= 0x01;
BREATH 		= 0x02;
FOOT 		= 0x04;
PORTATIME 	= 0x05;
MAIN_VOL 	= 0x07;
PANORAMA 	= 0x0A;
EXPRESSION 	= 0x0B;
BANK_CHANGE_LSB = 0x20;
SUSTAIN 	= 0x40;			/* 0 of 127	(7F)*/
PORTA 		= 0x41;
SOSTENUTO 	= 0x42;
SOFT_PEDAL 	= 0x43;
REVERB 		= 0x5B;
CHORUS 		= 0x5D;
DATA_INC 	= 0x60;			/* 7F	*/
DATA_DEC 	= 0x61			/* 7F	*/
RESET_CONTROL = 0x79;
LOCAL 		= 0x7A;			/* 0 of 127	*/
ALL_NOTES_OFF = 0x7B;		/* 0	*/
OMNI_OFF 	= 0x7C;			/* 0	*/
OMNI_ON 	= 0x7D;			/* 0	*/
MONO_ON 	= 0x7E;			/* 0 - aantal kanalen	*/
POLY_ON 	= 0x7F;			/* 0	*/

/* EOF	*/
