<?php
//
// SyxDump version 0.1-pre3 
//
// 03-25-2006
//
// Display the content of .syx dumps for Motif ES in a human readable form, allowing text search 
// and diff between two files.
// Author: Julien
//
// You may do whatever you want with this script. 
// May it be useful to you. 
// BTW, why not starting by improving it? :)
//
// 05 Apr 2006 – Brad Weber
// Added effects parameters for "Delay", "Early Reflection", "Karaoke", "Flanger", "Phaser",
// "Modulation", "Distortion", "Dynamic", "Pitch Change", "WAH", "Lo-Fi", "Tech", and "Misc"
// effects types
//
// 08-03-2006 - Julien
// Update the Mix Parts to display the content of the Plugin Boards Parts
//

	$voice_categories = array("--", "Ap", "Kb", "Or", "Gt", "Ba", "St", "Br", "Rp", 
								"Ld", "Pd", "Sc", "Cp", "Dr", "Se", "Me", "Co");
								
	$voice_sub_categories = array(
									"--" => array("--", "--", "--", "--"),
									"Ap" => array("--", "A Piano", "E.Grand", "Other"),
									"Kb" => array("--", "E.Piano", "Clavi", "Other"),
									"Or" => array("--", "Elec.", "Pipe", "Other"),
									"Gt" => array("--", "A.Gtr", "E.Gtr", "Pluck"),
									"Ba" => array("--", "A.Bass", "E.Bass", "Synth"),
									"St" => array("--", "Solo", "Ensembl", "Synth"),
									"Br" => array("--", "Solo", "Section", "Synth"),
									"Rp" => array("--", "Sax/Rd", "Pipe", "Other"),
									"Ld" => array("--", "Hard", "Soft", "--"),
									"Pd" => array("--", "Bright", "Soft", "Choir"),
									"Sc" => array("--", "Hard", "Soft", "--"),
									"Cp" => array("--", "Mallet", "Bell", "Percuss"),
									"Dr" => array("--", "Drums", "Percuss", "--"),
									"Se" => array("--", "Synth", "Natural", "--"),
									"Me" => array("--", "Motion", "Hit", "--"),
									"Co" => array("--", "Split", "Seq", "--")
								);

	$controller_set_src = array(0 => "PB", 1 => "MW", 3 => "AT", 4 => "FC", 
								5 => "FS", 6 => "RB", 7 => "BC", 8 => "AS1",
								9 => "AS2", 12 => "FC2");

	$filter_types = array(0 => "LPF24D", 1 => "LPF24A", 2 => "LPF18", 3 => "LPF18S",
								4 => "LPF12", 5 => "LPF6", 6 => "HPF24D", 7 => "HPF12",
								8 => "BPF12D", 10 => "BPFw", 11 => "BPF6", 12 => "BEF12",
								13 => "BEF6", 14 => "Dual LPF", 15 => "Dual HPF", 
								16 => "Dual BPF", 17 => "Dual BEF", 19 => "LPF12+BPF6",
								21 => "Thru");

	$controller_destinations = array("Off", "Voice Volume", "Reverb Send", "Chorus Send", 
									"Insertion Effect A Parameter 1", "Insertion Effect A Parameter 2",
									"Insertion Effect A Parameter 3", "Insertion Effect A Parameter 4",
									"Insertion Effect A Parameter 5", "Insertion Effect A Parameter 6",
									"Insertion Effect A Parameter 7", "Insertion Effect A Parameter 8",
									"Insertion Effect A Parameter 9", "Insertion Effect A Parameter 10",
									"Insertion Effect A Parameter 11", "Insertion Effect A Parameter 12",
									"Insertion Effect A Parameter 13", "Insertion Effect A Parameter 14",
									"Insertion Effect A Parameter 15", "Insertion Effect A Parameter 16",
									"Insertion Effect B Parameter 1", "Insertion Effect B Parameter 2",
									"Insertion Effect B Parameter 3", "Insertion Effect B Parameter 4",
									"Insertion Effect B Parameter 5", "Insertion Effect B Parameter 6",
									"Insertion Effect B Parameter 7", "Insertion Effect B Parameter 8",
									"Insertion Effect B Parameter 9", "Insertion Effect B Parameter 10",
									"Insertion Effect B Parameter 11", "Insertion Effect B Parameter 12",
									"Insertion Effect B Parameter 13", "Insertion Effect B Parameter 14",
									"Insertion Effect B Parameter 15", "Insertion Effect B Parameter 16",
									"Common LFO Speed",
									"Common LFO Depth 1", "Common LFO Depth 2", "Common LFO Depth 3",
									"Portamento Time", "Element Level", "Element Pan", "Element Key On Delay",
									"Element LFO Speed", "Element LFO Pitch Modulation Depth", 
									"Element LFO Amplitude Modulation Depth", "Element LFO Filter Modulation Depth",
									"Element Pitch Coarse", "Element Pitch Fine", "Element Pitch EG Depth",
									"Element Pitch EG Hold Time", "Element Pitch EG Attack Time",
									"Element Pitch EG Decay 1 Time", "Element Pitch EG Decay 2 Time", 
									"Element Pitch EG Release Time", "Element Ampliture EG Attack Time",
									"Element Ampliture EG Decay 1 Time", "Element Ampliture EG Decay 2 Time",
									"Element Ampliture EG Release Time", "Element Filter EG Depth",
									"Element Filter EG Hold Time", "Element Filter EG Attack Time",
									"Element Filter EG Decay 1 Time", "Element Filter EG Decay 2 Time",
									"Element Filter EG Release Time", "Element Filter Cutoff Frequency", 
									"Element Filter Resonance", "Element HPF Cutoff Frequency"
								);

	$eq_types = array("EQ L/H", "P.EQ", "Boost6", "Boost12", "Boost18", "Thru");

	$lfo_waves = array("Saw", "Tri", "Squ");
	
	$lfo_phase_offsets = array("+0", "+90", "+120", "+180", "+240", "+270");
	
	$note_names = array("C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B");
	
	// Convert a BYTE program number (0..127) to the Yamaha form A01..H16
	function yam_program($program_number) {
		$prog_letter = chr(ord('A') + floor($program_number/16));
		$prog_number = sprintf("%02d", ($program_number%16)+1);
		return $prog_letter . $prog_number;
	}	

	function which($index, $the_array, $base=0) {
		if (!is_array($the_array))
			return "!!!NOT AN ARRAY!!!";
		$res = $the_array[$base+$index];
		if (!isset($res))
			return "!!!OUT OF RANGE!!!";
		return $the_array[$base+$index];
	}

	function hexbyte($byte) {
		return sprintf("%02Xh", $byte);
	}
	
	function decword($byte1, $byte2) {
		return ((($byte2 & 0x7F) << 1) + ($byte1 << 8)) >> 1;
	}
	
	function on_off($v) {
		return $v ? "On" : "Off";
	}

	function off($v, $off_value=0, $txt_off="Off") {
		if ($v == $off_value)
			return $txt_off;
		return $v;
	}

	function note($n) {
		global $note_names;
		
		$octave = floor($n/12) - 2;
		return $note_names[$n%12] . $octave;
	}
	
	function pan($n) {
		if ($n == 64)
			return "Center";
		if ($n < 64)
			return "L" . (64 - $n);
		
		return "R" . ($n - 64);
	}
	
	function dump_raw_data($prefix, $ofs, $nb) {
		global $show_raw_data, $dump, $data;
		
		if (!$show_raw_data)
			return;
			
		$dump .= "$prefix = {";
		for ($i=0; $i<$nb; $i++)
			$dump .= sprintf("%02X", ($data[$ofs+$i]));
		$dump .= "}\n";
	}
	
	function effect($prefix, $ofs) {
		global $dump, $data;
		
		$msb = $data[$ofs];
		$lsb = $data[$ofs+1];
		
		$params = array();
		for ($i=1; $i<=16; $i++) 
			$params[$i] = decword($data[$ofs+$i*2], $data[$ofs+$i*2+1]);
		
		$type = "Unknown";
		$tmp = "";
		
		if ($msb == 0) {
			$type = "Off/Thru";
		}
		else if ($msb == 0x01) { // REVERB
			$tmp .= "$prefix Reverb Time = " . $params[1] . "\n";
			$tmp .= "$prefix Diffusion = " . $params[2] . "\n";
			$tmp .= "$prefix Initial Delay = " . $params[3] . "\n";
			$tmp .= "$prefix HPF Cutoff Frequency = " . $params[4] . "\n";
			$tmp .= "$prefix LPF Cutoff Frequency = " . $params[5] . "\n";
			if (in_array($lsb, array(0x00, 0x01, 0x10, 0x11, 0x12, 0x20, 0x21, 0x30, 0x02, 0x13, 0x31))) {
				$tmp .= "$prefix Reverb Delay = " . $params[11] . "\n";
				$tmp .= "$prefix Density = " . $params[12] . "\n";
				$tmp .= "$prefix ER / Rev Balance = " . $params[13] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[14] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[15] . "\n";
			}
			else if (in_array($lsb, array(0x40, 0x41, 0x42, 0x43))) {
				$tmp .= "$prefix Width = " . $params[6] . "\n";
				$tmp .= "$prefix Height = " . $params[7] . "\n";
				$tmp .= "$prefix Depth = " . $params[8] . "\n";
				$tmp .= "$prefix Wall Vary = " . $params[9] . "\n";
				$tmp .= "$prefix Reverb Delay = " . $params[11] . "\n";
				$tmp .= "$prefix Density = " . $params[12] . "\n";
				$tmp .= "$prefix ER / Rev Balance = " . $params[13] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[14] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[15] . "\n";
			}
			else {
				$tmp .= "$prefix Room Size = " . $params[6] . "\n";
				$tmp .= "$prefix High Ratio = " . $params[7] . "\n";
				$tmp .= "$prefix Low Ratio = " . $params[8] . "\n";
				$tmp .= "$prefix Decay = " . $params[9] . "\n";
			}
			$type = which($lsb, array(0x00 => "Hall 1",
						  0x01 => "Hall 2", 0x10 => "Room 1", 0x11 => "Room 2", 0x12 => "Room 3",
						  0x20 => "Stage 1", 0x21 => "Stage 2", 0x30 => "Plate", 0x40 => "White Room",
						  0x41 => "Tunnel", 0x42 => "Basement", 0x43 => "Canyon", 0x02 => "R3 Hall",
						  0x13 => "R3 Room", 0x31 => "R3 Plate", 0x08 => "Large Hall", 0x09 => "Medium Hall", 
						  0x18 => "Warm Room", 0x19 => "Woody Room", 0x38 => "Rich Plate"));
		}
		else if ($msb == 0x02) { // DELAY
			if ($lsb == 0x00) { // Delay L,C,R
				$tmp .= "$prefix Delay Time L = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time C = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Time C = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Time = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
				$tmp .= "$prefix Delay Level C = " . $params[6] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[7] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x10) { // Delay L,R
				$tmp .= "$prefix Delay Time L = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time R = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Time 1 = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Time 2 = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[6] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x18) { // Delay L,R (Stereo) 
				$tmp .= "$prefix Delay Time L = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time R = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Time L = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Time R = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[6] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x20) { // Echo
				$tmp .= "$prefix Delay Time L1 = " . $params[1] . "\n";
				$tmp .= "$prefix Feedback Level L = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Time R1 = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Level R = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[5] . "\n";
				$tmp .= "$prefix Delay Time L2 = " . $params[6] . "\n";
				$tmp .= "$prefix Delay Time R2 = " . $params[7] . "\n";
				$tmp .= "$prefix Delay Level 2 = " . $params[8] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x30) { // Cross Delay
				$tmp .= "$prefix Delay Time L>R = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time R>L = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Input Select = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[5] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if (in_array($lsb, array(0x40, 0x48))) { // Control Delay (Mono), Control Delay (Stereo)
				$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Transition Rate = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[4] . "\n";
				$tmp .= "$prefix Delay Time Offset = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Control Type  = " . $params[11] . "\n";
			}
			else if (in_array($lsb, array(0x50, 0x58))) { // Tempo Delay (Mono), Tempo Delay (Stereo)
				$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[3] . "\n";
				$tmp .= "$prefix L/R Diffusion = " . $params[4] . "\n";
				$tmp .= "$prefix Lag = " . $params[5] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else { // Tempo Cross Delay
				$tmp .= "$prefix Delay Time L>R = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time R>L = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Input Select = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback High Dump = " . $params[5] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "Delay L,C,R",
						  0x10 => "Delay L,R",
						  0x18 => "Delay L,R St",
						  0x20 => "Echo",
						  0x30 => "Cross Delay",
						  0x40 => "Ctrl Delay 1",
						  0x48 => "Ctrl Delay 2",
						  0x50 => "TempDelay 1",
						  0x58 => "TempDelay 2",
						  0x60 => "TempCrosDly"));
		}
		else if ($msb == 0x03) { // EARLY REFLECTION
			$tmp .= "$prefix Type = " . $params[1] . "\n";
			$tmp .= "$prefix Room Size = " . $params[2] . "\n";
			$tmp .= "$prefix Diffusion = " . $params[3] . "\n";
			$tmp .= "$prefix Initial Delay = " . $params[4] . "\n";
			$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
			$tmp .= "$prefix HPF Cutoff Frequency = " . $params[6] . "\n";
			$tmp .= "$prefix LPF Cutoff Frequency = " . $params[7] . "\n";
			$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			$tmp .= "$prefix Liveness = " . $params[11] . "\n";
			$tmp .= "$prefix Density = " . $params[12] . "\n";
			$tmp .= "$prefix Feedback High Damp = " . $params[13] . "\n";
			$type = which($lsb, array(0x00 => "Early Ref 1",
						  0x01 => "Early Ref 2",
						  0x10 => "Gate Reverb",
						  0x20 => "Reverse Gate"));
		}
		else if ($msb == 0x04) { // KARAOKE
			$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
			$tmp .= "$prefix Feedback Level = " . $params[2] . "\n";
			$tmp .= "$prefix HPF Cutoff Frequency = " . $params[3] . "\n";
			$tmp .= "$prefix LPF Cutoff Frequency = " . $params[4] . "\n";
			$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			$tmp .= "$prefix Density = " . $params[11] . "\n";
			$type = which($lsb, array(0x00 => "Karaoke 1",
						  0x01 => "Karaoke 2",
						  0x02 => "Karaoke 3"));
		}
		else if ($msb == 0x05) { // CHORUS
			if (in_array($lsb, array(0x00, 0x01, 0x02, 0x08, 0x09, 0x10, 0x11, 0x12, 0x18))) { // Chorus
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Delay Offset = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix Input Mode = " . $params[15] . "\n";
			}
			else if ($lsb == 0x20) { // Symphonic
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Offset = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
			}
			else { // Ensemble
				$tmp .= "$prefix Detune = " . $params[1] . "\n";
				$tmp .= "$prefix Initial Delay Lch = " . $params[2] . "\n";
				$tmp .= "$prefix Initial Delay Rch = " . $params[3] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[14] . "\n";
			}
			$type = which($lsb, array(0x00 => "Chorus 1",
						  0x01 => "Chorus 2",
						  0x02 => "Chorus 3",
						  0x08 => "Chorus 4",
						  0x09 => "Chorus 5",
						  0x10 => "Celeste 1",
						  0x11 => "Celeste 2",
						  0x12 => "Celeste 3",
						  0x18 => "Celeste 4",
						  0x20 => "Symphonic",
						  0x30 => "Ensemble"));
		}
		else if ($msb == 0x06) { // FLANGER
			if (in_array($lsb, array(0x00, 0x01, 0x08))) { // Flanger1 - 3
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Delay Offset = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix LFO Phase Difference = " . $params[15] . "\n";
			}
			else if ($lsb == 0x10) { // V-Flanger
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix LFO Wave = " . $params[3] . "\n";
				$tmp .= "$prefix Delay Offset = " . $params[4] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix Modulation Phase = " . $params[14] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[15] . "\n";
				$tmp .= "$prefix Analog Feel = " . $params[16] . "\n";
			}
			else if (in_array($lsb, array(0x20, 0x21, 0x22))) { // Vintage Flanger 1 - 3
				$tmp .= "$prefix Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Manual = " . $params[2] . "\n";
				$tmp .= "$prefix Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback = " . $params[4] . "\n";
				$tmp .= "$prefix Type = " . $params[5] . "\n";
				$tmp .= "$prefix Spread = " . $params[6] . "\n";
				$tmp .= "$prefix Mix = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x50) { // Tempo Flanger
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Delay Offset = " . $params[4] . "\n";
				$tmp .= "$prefix LFO Phase Reset = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix LFO Phase Difference = " . $params[15] . "\n";
			}
			else { // Dynamic Flanger
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Attack Time = " . $params[4] . "\n";
				$tmp .= "$prefix Release Time = " . $params[5] . "\n";
				$tmp .= "$prefix Release Curve = " . $params[6] . "\n";
				$tmp .= "$prefix Direction = " . $params[7] . "\n";
				$tmp .= "$prefix Dyna Threshold Level = " . $params[8] . "\n";
				$tmp .= "$prefix Dyna Level Offset = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "Flanger 1",
						  0x01 => "Flanger 2", 
						  0x08 => "Flanger 3", 
						  0x10 => "V-Flanger", 
						  0x20 => "VntgFlanger1",
						  0x21 => "VntgFlanger2",
						  0x22 => "VntgFlanger3",
						  0x50 => "TempoFlanger",
						  0x60 => "DynamFlanger"));
		}
		else if ($msb == 0x07) { // PHASER
			if ($lsb == 0x00) { // Phaser 1
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Phase Shift Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Level = " . $params[10] . "\n";
				$tmp .= "$prefix Stage = " . $params[11] . "\n";
				$tmp .= "$prefix Diffusion = " . $params[12] . "\n";
			}
			else if ($lsb == 0x08) { // Phaser 2
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Phase Shift Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Stage = " . $params[11] . "\n";
				$tmp .= "$prefix LFO Phase Difference = " . $params[13] . "\n";
			}
			else if (in_array($lsb, array(0x20, 0x21))) { // Vintage Stereo Phaser 1 - 2 
				$tmp .= "$prefix Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Manual = " . $params[2] . "\n";
				$tmp .= "$prefix Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback = " . $params[4] . "\n";
				$tmp .= "$prefix Stage = " . $params[5] . "\n";
				$tmp .= "$prefix Mode = " . $params[6] . "\n";
				$tmp .= "$prefix Color = " . $params[7] . "\n";
				$tmp .= "$prefix Spread = " . $params[8] . "\n";
			}
			else if (in_array($lsb, array(0x30, 0x31))) { // Vintage Mono Phaser 1 - 2 
				$tmp .= "$prefix Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Manual = " . $params[2] . "\n";
				$tmp .= "$prefix Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback = " . $params[4] . "\n";
				$tmp .= "$prefix Stage = " . $params[5] . "\n";
				$tmp .= "$prefix Mode = " . $params[6] . "\n";
				$tmp .= "$prefix Color = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x50) { // Tempo Phaser
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Phase Shift Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[4] . "\n";
				$tmp .= "$prefix LFO Reset = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Stage = " . $params[11] . "\n";
				$tmp .= "$prefix LFO Phase Difference = " . $params[13] . "\n";
			}
			else { // Dynamic Phaser
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Dyna Level Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[3] . "\n";
				$tmp .= "$prefix Attack Time = " . $params[4] . "\n";
				$tmp .= "$prefix Release Time = " . $params[5] . "\n";
				$tmp .= "$prefix Release Curve = " . $params[6] . "\n";
				$tmp .= "$prefix Direction = " . $params[7] . "\n";
				$tmp .= "$prefix Dyna Threshold Level = " . $params[8] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "Phaser 1",
						  0x08 => "Phaser 2",
						  0x20 => "VntgPhsr1 St",
						  0x21 => "VntgPhsr2 St ",
						  0x30 => "VntgPhsr1 Mn",
						  0x31 => "VntgPhsr2 Mn",
						  0x50 => "TempoPhaser",
						  0x60 => "DynamPhaser"));
		}
		else if ($msb == 0x08) { // MODULATION
			if ($lsb == 0x00) { // Tremolo
				$tmp .= "$prefix LFO SPeed = " . $params[1] . "\n";
				$tmp .= "$prefix AM Depth = " . $params[2] . "\n";
				$tmp .= "$prefix PM Depth = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix LFO Phase Difference = " . $params[14] . "\n";
				$tmp .= "$prefix Input Mode = " . $params[15] . "\n";
			}
			else if ($lsb == 0x10) { // Auto Pan
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix L/R Depth = " . $params[2] . "\n";
				$tmp .= "$prefix F/R Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Pan Direction = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
			}
			else if ($lsb == 0x11) { // Auto Pan2
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix L/R Depth = " . $params[2] . "\n";
				$tmp .= "$prefix F/R Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Pan Direction = " . $params[4] . "\n";
				$tmp .= "$prefix LFO Wave = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
				$tmp .= "$prefix Input Mode = " . $params[15] . "\n";
			}
			else if ($lsb == 0x50) { // Rotary Speaker 1
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[13] . "\n";
			}
			else if (in_array($lsb, array(0x51, 0x52))) { // Distortion+Rotary Speaker1, OverDrive+Rotary Speaker1  
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dist. Drive = " . $params[14] . "\n";
				$tmp .= "$prefix Dist. LPF Cutoff Freq. = " . $params[15] . "\n";
				$tmp .= "$prefix Dist. Output Level = " . $params[16] . "\n";
			}
			else if ($lsb == 0x53) { // Amp Simulator + Rotary Speaker 1
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix AMP Type = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix AMP Drive = " . $params[14] . "\n";
				$tmp .= "$prefix AMP LPF Cutoff Freq. = " . $params[15] . "\n";
				$tmp .= "$prefix AMP Output Level = " . $params[16] . "\n";
			}
			else if ($lsb == 0x60) { // 2 Way Rotary Speaker
				$tmp .= "$prefix Rotor Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Drive Low = " . $params[2] . "\n";
				$tmp .= "$prefix Drive High = " . $params[3] . "\n";
				$tmp .= "$prefix Low / High Balance = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Divide Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix Mic L-R Angle = " . $params[12] . "\n";
			}
			else if (in_array($lsb, array(0x61, 0x62))) { // Distortion+2Way Rotary Speaker, OverDrive+2Way Rotary Speaker1  
				$tmp .= "$prefix Rotor Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Drive Low = " . $params[2] . "\n";
				$tmp .= "$prefix Drive High = " . $params[3] . "\n";
				$tmp .= "$prefix Low / High Balance = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Divide Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix Mic L-R Angle = " . $params[12] . "\n";
				$tmp .= "$prefix Dist. Drive = " . $params[14] . "\n";
				$tmp .= "$prefix Dist. LPF Cutoff Freq = " . $params[15] . "\n";
				$tmp .= "$prefix Dist. Output Level = " . $params[16] . "\n";
			}
			else if ($lsb == 0x63) { // Amp Simulator + 2Way Rotary Speaker
				$tmp .= "$prefix Rotor Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Drive Low = " . $params[2] . "\n";
				$tmp .= "$prefix Drive High = " . $params[3] . "\n";
				$tmp .= "$prefix Low / High Balance = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Divide Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix Mic L-R Angle = " . $params[12] . "\n";
				$tmp .= "$prefix AMP Type = " . $params[13] . "\n";
				$tmp .= "$prefix AMP Drive = " . $params[14] . "\n";
				$tmp .= "$prefix AMP LPF Cutoff Freq = " . $params[15] . "\n";
				$tmp .= "$prefix AMP Output Level = " . $params[16] . "\n";
			}
			else { // Dual Rotary Speaker 1 - 3
				$tmp .= "$prefix Rotor Speed Slow = " . $params[1] . "\n";
				$tmp .= "$prefix Horn Speed Slow = " . $params[2] . "\n";
				$tmp .= "$prefix Rotor Speed Fast = " . $params[3] . "\n";
				$tmp .= "$prefix Horn Speed Fast = " . $params[4] . "\n";
				$tmp .= "$prefix Slow-Fast Time of R = " . $params[5] . "\n";
				$tmp .= "$prefix Slow-Fast Time of H = " . $params[6] . "\n";
				$tmp .= "$prefix Drive Low = " . $params[7] . "\n";
				$tmp .= "$prefix Drive Hig = " . $params[8] . "\n";
				$tmp .= "$prefix Low / High Balance = " . $params[9] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[14] . "\n";
				$tmp .= "$prefix  = " . $params[15] . "\n";
				$tmp .= "$prefix  = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "Tremolo",
						  0x10 => "Auto Pan",
						  0x11 => "Auto Pan2",
						  0x50 => "Rotary Sp1",
						  0x51 => "Dist+RotSp1",
						  0x52 => "ODrv+RotSp1",
						  0x53 => "Amp+RotSp1",
						  0x50 => "Rotary Sp2",
						  0x51 => "Dist+RotSp2",
						  0x52 => "ODrv+RotSp2",
						  0x53 => "Amp+RotSp2",
						  0x70 => "Dual RotSp1",
						  0x71 => "Dual RotSp2",
						  0x72 => "Dual RotSp3"));
		}
		else if ($msb == 0x09) { // DISTORTION
			if (in_array($lsb, array(0x00, 0x20))) { // Distortion, Overdrive 
				$tmp .= "$prefix Drive = " . $params[1] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[3] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[4] . "\n";
				$tmp .= "$prefix Output Level = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[8] . "\n";
				$tmp .= "$prefix EQ Width = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Edge = " . $params[11] . "\n";
			}
			else if ($lsb == 0x01) { // Comp Distortion
				$tmp .= "$prefix Drive = " . $params[1] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[3] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[4] . "\n";
				$tmp .= "$prefix Output Level = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[8] . "\n";
				$tmp .= "$prefix EQ Width = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Edge = " . $params[11] . "\n";
				$tmp .= "$prefix Attack = " . $params[1] . "\n";
				$tmp .= "$prefix Release = " . $params[1] . "\n";
				$tmp .= "$prefix Threshold = " . $params[1] . "\n";
				$tmp .= "$prefix Ratio = " . $params[1] . "\n";
			}
			else if ($lsb == 0x10) { // V-Distortion
				$tmp .= "$prefix Over Drive = " . $params[1] . "\n";
				$tmp .= "$prefix Device = " . $params[2] . "\n";
				$tmp .= "$prefix Speaker Type = " . $params[3] . "\n";
				$tmp .= "$prefix Presence = " . $params[4] . "\n";
				$tmp .= "$prefix Output Level = " . $params[5] . "\n";
				$tmp .= "$prefix Delay Time L = " . $params[6] . "\n";
				$tmp .= "$prefix Delay Time R = " . $params[7] . "\n";
				$tmp .= "$prefix Feedback Time = " . $params[8] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Delay Mix = " . $params[11] . "\n";
				$tmp .= "$prefix Feedback High Damp = " . $params[12] . "\n";
			}
			else if ($lsb == 0x30) { // Amp Simulator
				$tmp .= "$prefix Drive = " . $params[1] . "\n";
				$tmp .= "$prefix AMP Type = " . $params[2] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[3] . "\n";
				$tmp .= "$prefix Output Level = " . $params[4] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Edge = " . $params[11] . "\n";
			}
			else if ($lsb == 0x31) { // Amp Simulator2
				$tmp .= "$prefix Drive = " . $params[1] . "\n";
				$tmp .= "$prefix AMP Type = " . $params[2] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[3] . "\n";
				$tmp .= "$prefix Output Level = " . $params[4] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else { // Dist+Delay, Overdrive+Delay 
				$tmp .= "$prefix Delay Time L = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Time R = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Feedback Time = " . $params[3] . "\n";
				$tmp .= "$prefix Delay Feedback Level = " . $params[4] . "\n";
				$tmp .= "$prefix Delay Mix = " . $params[5] . "\n";
				$tmp .= "$prefix Dist Drive = " . $params[6] . "\n";
				$tmp .= "$prefix Dist Output Level = " . $params[7] . "\n";
				$tmp .= "$prefix Dist EQ Low Gain = " . $params[8] . "\n";
				$tmp .= "$prefix Dist EQ Mid Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			$type = which($lsb, array(0x00 => "Distortion",
						  0x01 => "Comp+Dist",
						  0x10 => "V-Distortion",
						  0x20 => "Overdrive",
						  0x30 => "AmpSimulator",
						  0x31 => "AmpSim 2",
						  0x40 => "Dist+Delay",
						  0x41 => "Odrv+Delay"));
		}
		else if ($msb == 0x0A) { // DYNAMIC
			if ($lsb == 0x00) { // Compressor
				$tmp .= "$prefix Attack = " . $params[1] . "\n";
				$tmp .= "$prefix Release = " . $params[2] . "\n";
				$tmp .= "$prefix Threshold = " . $params[3] . "\n";
				$tmp .= "$prefix Ratio = " . $params[4] . "\n";
				$tmp .= "$prefix Output Level = " . $params[5] . "\n";
			}
			else if ($lsb == 0x20) { // Noise Gate
				$tmp .= "$prefix Attack = " . $params[1] . "\n";
				$tmp .= "$prefix Release = " . $params[2] . "\n";
				$tmp .= "$prefix Threshold = " . $params[3] . "\n";
				$tmp .= "$prefix Output Level = " . $params[4] . "\n";
			}
			else if (in_array($lsb, array(0x40, 0x41))) { // Comp+Dist+Delay, Comp+Odrv+Delay 
				$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Feedback Level = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Mix = " . $params[3] . "\n";
				$tmp .= "$prefix Dist. Drive = " . $params[4] . "\n";
				$tmp .= "$prefix Dist. Output Level = " . $params[5] . "\n";
				$tmp .= "$prefix Dist. EQ Low Gain = " . $params[6] . "\n";
				$tmp .= "$prefix Dist. EQ Mid Gain = " . $params[7] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Comp. Attack = " . $params[11] . "\n";
				$tmp .= "$prefix Comp. Release = " . $params[12] . "\n";
				$tmp .= "$prefix Comp. Threshold = " . $params[13] . "\n";
				$tmp .= "$prefix Comp. Ratio = " . $params[14] . "\n";
			}
			else if ($lsb == 0x50) { // Multi Band Comp 1
				$tmp .= "$prefix Type = " . $params[1] . "\n";
				$tmp .= "$prefix Threshold Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Low Gain Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Mid Gain Offset = " . $params[4] . "\n";
				$tmp .= "$prefix High Gain Offset = " . $params[5] . "\n";
			}
			else { // Multi Band Comp 2
				$tmp .= "$prefix Low Attack = " . $params[1] . "\n";
				$tmp .= "$prefix Low Release = " . $params[2] . "\n";
				$tmp .= "$prefix Low Threshold = " . $params[3] . "\n";
				$tmp .= "$prefix Low Ratio = " . $params[4] . "\n";
				$tmp .= "$prefix Low Gain = " . $params[5] . "\n";
				$tmp .= "$prefix Mid Attack = " . $params[6] . "\n";
				$tmp .= "$prefix Mid Release = " . $params[7] . "\n";
				$tmp .= "$prefix Mid Threshold = " . $params[8] . "\n";
				$tmp .= "$prefix Mid Ratio = " . $params[9] . "\n";
				$tmp .= "$prefix Mid Gain = " . $params[10] . "\n";
				$tmp .= "$prefix High Attack = " . $params[11] . "\n";
				$tmp .= "$prefix High Release = " . $params[12] . "\n";
				$tmp .= "$prefix High Threshold = " . $params[13] . "\n";
				$tmp .= "$prefix High Ratio = " . $params[14] . "\n";
				$tmp .= "$prefix High Gain = " . $params[15] . "\n";
				$tmp .= "$prefix Divide Freq = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "Compressor",
						  0x20 => "Noise Gate",
						  0x40 => "Cmp+Dist+Dly",
						  0x41 => "Cmp+Odrv+Dly",
						  0x50 => "MltBndComp 1",
						  0x51 => "MltBndComp 2"));
		}
		else if ($msb == 0x0B) { //PITCH CHANGE;
			$tmp .= "$prefix Pitch = " . $params[1] . "\n";
			$tmp .= "$prefix Initial Delay = " . $params[2] . "\n";
			$tmp .= "$prefix Fine1 = " . $params[3] . "\n";
			$tmp .= "$prefix Fine2 = " . $params[4] . "\n";
			$tmp .= "$prefix Feedback Level = " . $params[5] . "\n";
			$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			$tmp .= "$prefix PAN1 = " . $params[11] . "\n";
			$tmp .= "$prefix Output Level1 = " . $params[12] . "\n";
			$tmp .= "$prefix PAN2 = " . $params[13] . "\n";
			$tmp .= "$prefix Output Level2 = " . $params[14] . "\n";
			$type = which($lsb, array(0x00 => "PitChange1",
						  0x01 => "PitchChange2"));
		}
		else if ($msb == 0x0C) { // WAH
			if ($lsb == 0x00) { // Auto WAH
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Cutoff Frequency Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Resonance = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else if (in_array($lsb, array(0x01, 0x02))) { // Auto WAH + Distortion, Auto WAH + Overdrive 
				$tmp .= "$prefix LFO Speed = " . $params[1] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Cutoff Frequency Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Resonance = " . $params[4] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Drive = " . $params[11] . "\n";
				$tmp .= "$prefix Dist Low Gain = " . $params[12] . "\n";
				$tmp .= "$prefix Dist Mid Gain = " . $params[13] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[14] . "\n";
				$tmp .= "$prefix Output Level = " . $params[15] . "\n";
			}
			else if (in_array($lsb, array(0x21, 0x22))) { // Vintage Auto WAH 1-2 
				$tmp .= "$prefix Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Bottom = " . $params[2] . "\n";
				$tmp .= "$prefix Top = " . $params[3] . "\n";
				$tmp .= "$prefix Resonance Offset = " . $params[4] . "\n";
				$tmp .= "$prefix LFO Wave = " . $params[5] . "\n";
				$tmp .= "$prefix Type = " . $params[6] . "\n";
				$tmp .= "$prefix OverDrive = " . $params[7] . "\n";
				$tmp .= "$prefix Output = " . $params[8] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x10) { // Touch WAH
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Cutoff Frequency Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Resonance = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Bqalance = " . $params[10] . "\n";
			}
			else if (in_array($lsb, array(0x11, 0x12))) { // Touch WAH+Distortion, Touch WAH+OverDrive 
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Cutoff Frequency Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Resonance = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Bqalance = " . $params[10] . "\n";
				$tmp .= "$prefix Drive = " . $params[11] . "\n";
				$tmp .= "$prefix Dist Low Gain = " . $params[12] . "\n";
				$tmp .= "$prefix Dist Mid Gain = " . $params[13] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[14] . "\n";
				$tmp .= "$prefix Output Level = " . $params[15] . "\n";
			}
			else if (in_array($lsb, array(0x30, 0x31))) { // Vintage Touch WAH 1-2 
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Bottom = " . $params[2] . "\n";
				$tmp .= "$prefix Top = " . $params[3] . "\n";
				$tmp .= "$prefix Resonance Offset = " . $params[4] . "\n";
				$tmp .= "$prefix Direction = " . $params[5] . "\n";
				$tmp .= "$prefix Type = " . $params[6] . "\n";
				$tmp .= "$prefix Overdrive = " . $params[7] . "\n";
				$tmp .= "$prefix Output = " . $params[8] . "\n";
				$tmp .= "$prefix Attack Offset = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else { // WAH+Dist+Delay, WAH+Overdrive+Delay 
				$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
				$tmp .= "$prefix Delay Feedback Level = " . $params[2] . "\n";
				$tmp .= "$prefix Delay Mix = " . $params[3] . "\n";
				$tmp .= "$prefix Dist Drive = " . $params[4] . "\n";
				$tmp .= "$prefix Dist Output Level = " . $params[5] . "\n";
				$tmp .= "$prefix Dist EQ Low Gain = " . $params[6] . "\n";
				$tmp .= "$prefix Dist EQ Mid Gain = " . $params[7] . "\n";
				$tmp .= "$prefix Dry / Wet Balance Time = " . $params[10] . "\n";
				$tmp .= "$prefix Wah Sensitivity = " . $params[11] . "\n";
				$tmp .= "$prefix Wah Cutoff Frequency = " . $params[12] . "\n";
				$tmp .= "$prefix Wah Resonance = " . $params[13] . "\n";
				$tmp .= "$prefix Wah Release = " . $params[14] . "\n";
			}
			$type = which($lsb, array(0x00 => "Auto Wah",
						  0x01 => "A.Wah+Dist",
						  0x02 => "A.Wah+Odrv",
						  0x20 => "Vntg A.Wah1",
						  0x21 => "Vntg A.Wah2",
						  0x10 => "Touch Wah",
						  0x11 => "T.Wah+Dist",
						  0x12 => "T.Wah+Odrv",
						  0x30 => "Vntg T.Wah1",
						  0x31 => "Vntg T.Wah2",
						  0x40 => "Wah+Dist+Dly",
						  0x41 => "Wah+Odrv+Dly"));
		}
		else if ($msb == 0x0D) { // LO-FI
			if ($lsb == 0x00) { // Lo-Fi
				$tmp .= "$prefix Sampling Freq Control = " . $params[1] . "\n";
				$tmp .= "$prefix Word Length = " . $params[2] . "\n";
				$tmp .= "$prefix Output Gain = " . $params[3] . "\n";
				$tmp .= "$prefix Pre-LPF Cutoff Frequency = " . $params[4] . "\n";
				$tmp .= "$prefix Filter Type = " . $params[5] . "\n";
				$tmp .= "$prefix Pre-LPF Resonance = " . $params[6] . "\n";
				$tmp .= "$prefix Bit Assign = " . $params[7] . "\n";
				$tmp .= "$prefix Emphasis = " . $params[8] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Input Mode = " . $params[15] . "\n";
			}
			else if ($lsb == 0x10) { // Low Resoltuion
				$tmp .= "$prefix Mod Depth = " . $params[1] . "\n";
				$tmp .= "$prefix Mod Delay Offset = " . $params[2] . "\n";
				$tmp .= "$prefix Mod Feedback = " . $params[3] . "\n";
				$tmp .= "$prefix Resolution = " . $params[4] . "\n";
				$tmp .= "$prefix Mod Mix Balance = " . $params[5] . "\n";
				$tmp .= "$prefix Phase Inverse R = " . $params[6] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else if ($lsb == 0x20) { // Noisy
				$tmp .= "$prefix Mod Depth = " . $params[1] . "\n";
				$tmp .= "$prefix Mod Speed = " . $params[2] . "\n";
				$tmp .= "$prefix Mod Feedback = " . $params[3] . "\n";
				$tmp .= "$prefix Mod Mix Balance = " . $params[4] . "\n";
				$tmp .= "$prefix Drive = " . $params[5] . "\n";
				$tmp .= "$prefix AM Speed = " . $params[6] . "\n";
				$tmp .= "$prefix AM Depth = " . $params[7] . "\n";
				$tmp .= "$prefix LPF Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix LPF Resonance = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Frequency = " . $params[11] . "\n";
				$tmp .= "$prefix EQ Gain = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Width = " . $params[13] . "\n";
			}
			else if ($lsb == 0x30) { // Attack Lo-Fi
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix Resolution = " . $params[2] . "\n";
				$tmp .= "$prefix Peak Frequency = " . $params[3] . "\n";
				$tmp .= "$prefix LPF Frequency = " . $params[4] . "\n";
				$tmp .= "$prefix Flanger Speed = " . $params[5] . "\n";
				$tmp .= "$prefix Flanger LFO Wave = " . $params[6] . "\n";
				$tmp .= "$prefix Flanger Depth = " . $params[7] . "\n";
				$tmp .= "$prefix Flg Depth Ofst R = " . $params[8] . "\n";
				$tmp .= "$prefix Flg Mix Balance = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Flanger Delay = " . $params[11] . "\n";
				$tmp .= "$prefix Flg Delay Ofst R = " . $params[12] . "\n";
				$tmp .= "$prefix Flanger Feedback = " . $params[13] . "\n";
				$tmp .= "$prefix Flanger FB Offset R = " . $params[14] . "\n";
				$tmp .= "$prefix Flanger FB HiDamp = " . $params[15] . "\n";
				$tmp .= "$prefix FB HiDamp Ofst R = " . $params[16] . "\n";
			}
			else { // Digital Turntable
				$tmp .= "$prefix Click Density = " . $params[1] . "\n";
				$tmp .= "$prefix Click Level = " . $params[2] . "\n";
				$tmp .= "$prefix Noise Tone = " . $params[3] . "\n";
				$tmp .= "$prefix Noise Mod Speed = " . $params[4] . "\n";
				$tmp .= "$prefix Noise Mod Depth = " . $params[5] . "\n";
				$tmp .= "$prefix Dry Send to Noise = " . $params[6] . "\n";
				$tmp .= "$prefix Noise LPF Freq = " . $params[7] . "\n";
				$tmp .= "$prefix Noise LPF Q = " . $params[8] . "\n";
				$tmp .= "$prefix Noise Level = " . $params[9] . "\n";
				$tmp .= "$prefix Dry Level = " . $params[11] . "\n";
				$tmp .= "$prefix Dry LPF Frequency = " . $params[12] . "\n";
			}
			$type = which($lsb, array(0x00 => "Lo-Fi",
						  0x10 => "LoResolution",
						  0x20 => "Noisy",
						  0x30 => "Attack LoFi",
						  0x50 => "D.Turntable"));
		}
		else if ($msb == 0x0E) { // TECH
			if ($lsb == 0x00) { // Digital Scratch
				$tmp .= "$prefix Input Level = " . $params[1] . "\n";
				$tmp .= "$prefix Initial Delay = " . $params[2] . "\n";
				$tmp .= "$prefix Scratch Speed = " . $params[3] . "\n";
				$tmp .= "$prefix Scratch Depth = " . $params[4] . "\n";
				$tmp .= "$prefix Auto Pan Speed = " . $params[5] . "\n";
				$tmp .= "$prefix Auto Pan Depth = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Gain = " . $params[8] . "\n";
				$tmp .= "$prefix EQ Width = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix HPF Frequency = " . $params[11] . "\n";
			}
			else if ($lsb == 0x10) { // Auto Synth
				$tmp .= "$prefix Mod Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Mod Wave Type = " . $params[2] . "\n";
				$tmp .= "$prefix Mod Depth = " . $params[3] . "\n";
				$tmp .= "$prefix Mod Depth Ofst R = " . $params[4] . "\n";
				$tmp .= "$prefix HPF Frequency = " . $params[5] . "\n";
				$tmp .= "$prefix LPF Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix Delay Time = " . $params[7] . "\n";
				$tmp .= "$prefix Delay TIme Ofst R = " . $params[8] . "\n";
				$tmp .= "$prefix Delay Level = " . $params[9] . "\n";
				$tmp .= "$prefix Dry Mix Level = " . $params[10] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[11] . "\n";
				$tmp .= "$prefix FB Level Ofst R = " . $params[12] . "\n";
				$tmp .= "$prefix AM Speed = " . $params[13] . "\n";
				$tmp .= "$prefix AM Wave = " . $params[14] . "\n";
				$tmp .= "$prefix AM Depth = " . $params[15] . "\n";
				$tmp .= "$prefix AM Inverse R = " . $params[16] . "\n";
			}
			else if ($lsb == 0x20) { // Tech Modulation
				$tmp .= "$prefix Mod Speed = " . $params[1] . "\n";
				$tmp .= "$prefix Mod Depth = " . $params[2] . "\n";
				$tmp .= "$prefix Mod Gain = " . $params[3] . "\n";
				$tmp .= "$prefix Mod Mix Balance = " . $params[4] . "\n";
				$tmp .= "$prefix Pre Mod HPF Freq = " . $params[5] . "\n";
				$tmp .= "$prefix Mod LPF Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix Mod LPF Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix Delay Time = " . $params[8] . "\n";
				$tmp .= "$prefix Delay Time Ofst R = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Feedback Level = " . $params[11] . "\n";
				$tmp .= "$prefix FB Level Ofst R = " . $params[12] . "\n";
				$tmp .= "$prefix Feedback Hi Damp = " . $params[13] . "\n";
				$tmp .= "$prefix FB Hi Damp Ofst R = " . $params[14] . "\n";
			}
			else if ($lsb == 0x30) { // Jump
				$tmp .= "$prefix Depth = " . $params[1] . "\n";
				$tmp .= "$prefix Speed = " . $params[2] . "\n";
				$tmp .= "$prefix Direction = " . $params[3] . "\n";
				$tmp .= "$prefix Type = " . $params[4] . "\n";
				$tmp .= "$prefix Jump Wave Type = " . $params[5] . "\n";
				$tmp .= "$prefix Resolution = " . $params[6] . "\n";
				$tmp .= "$prefix HPF Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix LPF Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else if ($lsb == 0x40) { // Isolator
				$tmp .= "$prefix On/Off SW = " . $params[1] . "\n";
				$tmp .= "$prefix Low Level = " . $params[2] . "\n";
				$tmp .= "$prefix Mid Level = " . $params[3] . "\n";
				$tmp .= "$prefix High Level = " . $params[4] . "\n";
				$tmp .= "$prefix Low Mute = " . $params[5] . "\n";
				$tmp .= "$prefix Mid Mute = " . $params[6] . "\n";
				$tmp .= "$prefix High Mute = " . $params[7] . "\n";
			}
			else { // Slice
				$tmp .= "$prefix Divide Type = " . $params[1] . "\n";
				$tmp .= "$prefix Gate Time = " . $params[2] . "\n";
				$tmp .= "$prefix Pan AEG Type = " . $params[3] . "\n";
				$tmp .= "$prefix Pan AEG Min Level = " . $params[4] . "\n";
				$tmp .= "$prefix Pan Depth = " . $params[5] . "\n";
				$tmp .= "$prefix Divide Min Level = " . $params[6] . "\n";
				$tmp .= "$prefix Pan Type = " . $params[7] . "\n";
				$tmp .= "$prefix Drive = " . $params[8] . "\n";
				$tmp .= "$prefix AEG Phase = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix Set SLice Tempo = " . $params[12] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "D.Scratch",
						  0x10 => "Auto Synth",
						  0x20 => "Tech Mod",
						  0x30 => "Jump",
						  0x40 => "Isolator",
						  0x50 => "Slice"));
		}
		else if ($msb == 0x0F) { // MISC
			if ($lsb == 0x00) { // 3-Band EQ
				$tmp .= "$prefix EQ Low Gain = " . $params[1] . "\n";
				$tmp .= "$prefix EQ Mid Frequency = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Mid Gain = " . $params[3] . "\n";
				$tmp .= "$prefix EQ Mid Width = " . $params[4] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix Input Mode = " . $params[15] . "\n";
			}
			else if ($lsb == 0x01) { // 2-Band EQ
				$tmp .= "$prefix EQ Low Frequency = " . $params[1] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[2] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[3] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[4] . "\n";
			}
			else if ($lsb == 0x10) { // Harmonic Enahancer
				$tmp .= "$prefix HPF Cutoff Frequency = " . $params[1] . "\n";
				$tmp .= "$prefix Drive = " . $params[2] . "\n";
				$tmp .= "$prefix Mix Level = " . $params[3] . "\n";
			}
			else if ($lsb == 0x20) { // Voice Canceler
				$tmp .= "$prefix Low Adjust = " . $params[11] . "\n";
				$tmp .= "$prefix High Adjust = " . $params[12] . "\n";
			}
			else if ($lsb == 0x30) { // Ambience
				$tmp .= "$prefix Delay Time = " . $params[1] . "\n";
				$tmp .= "$prefix Wet Output Phase = " . $params[2] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[8] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else if ($lsb == 0x40) { // Talking Modulation
				$tmp .= "$prefix Vowel = " . $params[1] . "\n";
				$tmp .= "$prefix Move Speed = " . $params[2] . "\n";
				$tmp .= "$prefix Drive = " . $params[3] . "\n";
				$tmp .= "$prefix Output Level = " . $params[4] . "\n";
			}
			else if ($lsb == 0x50) { // Beat Change
				$tmp .= "$prefix BeatChange = " . $params[1] . "\n";
				$tmp .= "$prefix Beat Range = " . $params[2] . "\n";
				$tmp .= "$prefix Pitch Change = " . $params[3] . "\n";
				$tmp .= "$prefix Pitch Range = " . $params[4] . "\n";
				$tmp .= "$prefix Accuracy Type = " . $params[5] . "\n";
				$tmp .= "$prefix EQ Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix EQ Gain = " . $params[7] . "\n";
				$tmp .= "$prefix EQ Width = " . $params[8] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
			}
			else if ($lsb == 0x70) { // Ring Modulator
				$tmp .= "$prefix Carrier Freq Coarse = " . $params[1] . "\n";
				$tmp .= "$prefix Carrier Freq Fine = " . $params[2] . "\n";
				$tmp .= "$prefix LFO Wave = " . $params[3] . "\n";
				$tmp .= "$prefix LFO Depth = " . $params[4] . "\n";
				$tmp .= "$prefix LFO Speed = " . $params[5] . "\n";
				$tmp .= "$prefix HPF Cutoff Frequency = " . $params[6] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[7] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else if ($lsb == 0x71) { // Dynamic Ring Modulator
				$tmp .= "$prefix Sensitivity = " . $params[1] . "\n";
				$tmp .= "$prefix HPF Cutoff Frequency = " . $params[2] . "\n";
				$tmp .= "$prefix LPF Cutoff Frequency = " . $params[3] . "\n";
				$tmp .= "$prefix Attack Time = " . $params[4] . "\n";
				$tmp .= "$prefix Release Time = " . $params[5] . "\n";
				$tmp .= "$prefix Release Curve = " . $params[6] . "\n";
				$tmp .= "$prefix Direction = " . $params[7] . "\n";
				$tmp .= "$prefix Dyna Threshold Level = " . $params[8] . "\n";
				$tmp .= "$prefix Dyna Level Offset = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			else { // Dynamic Filter
				$tmp .= "$prefix Filter Type = " . $params[1] . "\n";
				$tmp .= "$prefix Sensitivity = " . $params[2] . "\n";
				$tmp .= "$prefix Dyna Level Offset = " . $params[3] . "\n";
				$tmp .= "$prefix Resonance = " . $params[4] . "\n";
				$tmp .= "$prefix Attack Time = " . $params[5] . "\n";
				$tmp .= "$prefix Release Time = " . $params[6] . "\n";
				$tmp .= "$prefix Release Curve = " . $params[7] . "\n";
				$tmp .= "$prefix Direction = " . $params[8] . "\n";
				$tmp .= "$prefix Dyna Threshold Level = " . $params[9] . "\n";
				$tmp .= "$prefix Dry / Wet Balance = " . $params[10] . "\n";
				$tmp .= "$prefix EQ Low Frequency = " . $params[13] . "\n";
				$tmp .= "$prefix EQ Low Gain = " . $params[14] . "\n";
				$tmp .= "$prefix EQ High Frequency = " . $params[15] . "\n";
				$tmp .= "$prefix EQ High Gain = " . $params[16] . "\n";
			}
			$type = which($lsb, array(0x00 => "3 Band EQ",
						  0x01 => "2 Band EQ",
						  0x10 => "Enhancer",
						  0x20 => "Voice Cancel",
						  0x30 => "Ambience",
						  0x40 => "Talking Mod",
						  0x50 => "Beat Change",
						  0x70 => "Ring Mod",
						  0x71 => "DynamicRingMod",
						  0x78 => "Dynamic Filter"));
		}
		
		$dump .= "$prefix Type = $type\n";
		$dump .= $tmp;
		if ($tmp == "" && $msb != 0) {
			$dump .= "$prefix Raw Data = {";
			for ($i=2; $i<0x22; $i++)
				$dump .= sprintf("%02X", ($data[$ofs+$i]));
			$dump .= "}\n";
		}
	}

	// Poor man's diff function, in replacement of xdiff_string_diff() which may not be available everywhere
	// Returns an array of differences
	function diff($s1, $s2) {
		$res = array();
		
		$lines1 = explode("\n", $s1);
		$lines2 = explode("\n", $s2);
		
		for ($i=0; $i<count($lines1) && $i<count($lines2); $i++) {
			if ($lines1[$i] == $lines2[$i]) 
				continue;
			$d = "< " . $lines1[$i] . "\n--\n> " . $lines2[$i] . "\n";
			array_push($res, $d);
		}
		
		// Both inputs are supposed to have the same amount of lines, but...
		while ($i<count($lines1))
			array_push($res, "< " . $lines1[$i++] . "\n");
				
		while ($i<count($lines2))
			array_push($res, "> " . $lines2[$i++] . "\n");
		
		return $res;
	}

	///////////////////////////////////

	$inputs = array();
	$outputs = array();
	$data = array();

	// Check wether we're running on a HTTP server
	if (isset($_SERVER["HTTP_HOST"])) {
		$show_bulk_headers = true;
		// header("Content-Type: text/plain");
		
		if ($_GET["show_code"]) {
			header("Content-Type: text/php");
			readfile($_SERVER["SCRIPT_FILENAME"]);
			exit;
		}
		
		$hexinput1 = $_POST["hexinput1"];
		$decinput1 = array();
		$sz = $_FILES["bininput1"]["size"];
		if ($sz) { // Use the uploaded file instead
			$tmp_fd = fopen($_FILES["bininput1"]["tmp_name"], "rb");
			$bininput1 = fread($tmp_fd, $sz);
			for ($i=0; $i < $sz; $i++)
				array_push($decinput1, ord($bininput1[$i]));
			fclose($tmp_fd);
		}
		else {
			$byte = "";
			for ($i=0; $i<strlen($hexinput1); $i++) {
				$c = $hexinput1[$i];
				if (ctype_xdigit($c)) {
					$byte .= $c;
					if (strlen($byte) == 2) {
						array_push($decinput1, hexdec($byte));
						$byte = "";
					}
				}
			}
		}
		array_push($inputs, $decinput1);
		
		$hexinput2 = $_POST["hexinput2"];
		$decinput2 = array();
		$sz = $_FILES["bininput2"]["size"];
		if ($sz) {
			$tmp_fd = fopen($_FILES["bininput2"]["tmp_name"], "rb");
			$bininput2 = fread($tmp_fd, $sz);
			for ($i=0; $i < $sz; $i++)
				array_push($decinput2, ord($bininput2[$i]));
			fclose($tmp_fd);
		}
		else {
			$byte = "";
			for ($i=0; $i<strlen($hexinput2); $i++) {
				$c = $hexinput2[$i];
				if (ctype_xdigit($c)) {
					$byte .= $c;
					if (strlen($byte) == 2) {
						array_push($decinput2, hexdec($byte));
						$byte = "";
					}
				}
			}
		}
		if (count($decinput2))
			array_push($inputs, $decinput2);
	}
	else { // Standalone command-line invocation
		$show_addresses = false;
		$show_byte_count = false;
		$show_bulk_headers = true;
		$show_raw_data = false;
		$show_irrelevant_parameters = false;
		
		@list($cmd, $fname) = $argv;
		
		if ($fname == "") 
			die("Usage: $cmd <file.syx>\n");
			
		$fd = fopen($fname, "rb");
		if (!$fd)
			die("Couldn't open file $fname\n");
			
		$sz = filesize($fname);
		$chars = fread($fd, $sz);
		
		// Convert characters to integer values
		$decinput = array();
		for ($i=0; $i<strlen($chars); $i++) {
			$decinput[$i] = ord($chars[$i]);
		}
		array_push($inputs, $decinput);
	}
	
	for ($input_pos = 0; $input_pos<count($inputs); $input_pos++) {
		$data = $inputs[$input_pos];
	
		$dump = "";
		
		for ($ofs = 0; $ofs < count($data);) {
			$b = ($data[$ofs]);
			if (($data[$ofs]) != 0xF0) {
				echo "data[" . sprintf("%02X", $ofs) . "]=" . sprintf("%02X", ($data[$ofs])) . "\n";
				die("Error: 'F0' expected (SysEx)\n");
			}
				
			if (($data[++$ofs]) != 0x43) 
				die("Error: '43' expected (Yamaha)\n");
			
			$b = ($data[++$ofs]);
			if (($b & 0xF0) == 0x00) { // Bulk Dump!!!
				if (($data[++$ofs]) != 0x7F) 
					die("Error: '7F' expected (Model ID)\n");
				
				if (($data[++$ofs]) != 0x00) 
					die("Error: '00' expected (Model ID)\n");
			
				$bulk_dump_byte_count_1 = ($data[++$ofs]);
				$bulk_dump_byte_count_2 = ($data[++$ofs]);
				$bulk_dump_address_high = ($data[++$ofs]);
				$bulk_dump_address_mid = ($data[++$ofs]);
				$bulk_dump_address_low = ($data[++$ofs]);
		
				if ($show_byte_count) 
					$dump .= sprintf("%02X%02X:", 
								$bulk_dump_byte_count_1,
								$bulk_dump_byte_count_2);
					
				if ($show_addresses)
					$dump .= sprintf("%02X%02X%02X:", 
								$bulk_dump_address_high, 
								$bulk_dump_address_mid, 
								$bulk_dump_address_low);
								
				if ($show_byte_count || $show_addresses)
					$dump .= "\n";
								
				if ($bulk_dump_byte_count_1) 
					die("Tiens, bulk_dump_byte_count_1 != 0\n");
				
				$byte_count = $bulk_dump_byte_count_2;
					
				// Shortcut to data : $d[$ofs] same as in the manual
				$d = array();
				for ($i=0; $i < $byte_count; $i++) 
					$d[$i+$bulk_dump_address_low] = $data[$ofs+$i+1];
					
				// Here we go
				if ($bulk_dump_address_high == 0x00) {	// SYSTEM
					$prefix = "SYSTEM";
					if ($bulk_dump_address_mid == 0x00) {
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x10) {
						$prefix .= "PLUG-IN BOARD NATIVE SYSTEM";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x20) {
						$prefix .= "MASTER EQ";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x21) {
						$prefix .= "MASTER EFFECT";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x22) {
						$prefix .= "MASTER EFFECT KNOB SETTING";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
				}
				else if ($bulk_dump_address_high == 0x0E || $bulk_dump_address_high == 0x0F) { // BULK HEADER/FOOTER
					$what = $bulk_dump_address_high == 0x0E ? "Header" : "Footer";
					if ($show_bulk_headers) {
						$dump .= "Bulk $what / ";
						switch ($bulk_dump_address_mid) {
							case 0x00:
								$dump .= "Normal Voice PRE1 " . yam_program($bulk_dump_address_low);
								break;
							case 0x01:
								$dump .= "Normal Voice PRE2 " . yam_program($bulk_dump_address_low);
								break;
							case 0x02:
								$dump .= "Normal Voice PRE3 " . yam_program($bulk_dump_address_low);
								break;
							case 0x03:
								$dump .= "Normal Voice PRE4 " . yam_program($bulk_dump_address_low);
								break;
							case 0x04:
								$dump .= "Normal Voice PRE5 " . yam_program($bulk_dump_address_low);
								break;
							case 0x05:
								$dump .= "Normal Voice PRE6 " . yam_program($bulk_dump_address_low);
								break;
							case 0x06:
								$dump .= "Normal Voice GM " . yam_program($bulk_dump_address_low);
								break;
							case 0x08:
								$dump .= "Normal Voice USER1 " . yam_program($bulk_dump_address_low);
								break;
							case 0x09:
								$dump .= "Normal Voice USER2 " . yam_program($bulk_dump_address_low);
								break;
							case 0x0F: 
								$dump .= "Normal Voice Edit Buffer"; 
								break;
							case 0x18:
								$dump .= "Plug-in Voice PLG1 " . yam_program($bulk_dump_address_low);
								break;
							case 0x19:
								$dump .= "Plug-in Voice PLG2 " . yam_program($bulk_dump_address_low);
								break;
							case 0x1A:
								$dump .= "Plug-in Voice PLG3 " . yam_program($bulk_dump_address_low);
								break;
							case 0x1F: 
								$dump .= "Plug-in Voice Edit Buffer"; 
								break;
							case 0x20:
								$dump .= "Drum Voice PRE " . yam_program($bulk_dump_address_low);
								break;
							case 0x21:
								$dump .= "Drum Voice GM";
								break;
							case 0x28:
								$dump .= "Drum Voice USER " . yam_program($bulk_dump_address_low);
								break;
							case 0x2F: 
								$dump .= "Drum Voice Edit Buffer"; 
								break;
							case 0x40:
								$dump .= "Performance INT " . yam_program($bulk_dump_address_low);
								break;
							case 0x4F: 
								$dump .= "Performance Edit Buffer"; 
								break;
							case 0x5F:
								$dump .= "Multi Edit Buffer";
								break;
							case 0x70:
								$dump .= "Master INT " . yam_program($bulk_dump_address_low);
								break;
							case 0x7F:
								$dump .= "Master Edit Buffer";
								break;
						}
						$dump .= "\n";
					}
				}
				else if ($bulk_dump_address_high == 0x30) { // PERFORMANCE
					$prefix = "PERFORMANCE ";
					if ($bulk_dump_address_mid == 0x00) { // PERFORMANCE COMMON
						$prefix .= "COMMON";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x01) {
						$prefix .= "REVERB";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x02) {
						$prefix .= "CHORUS";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x03) {
						$prefix .= "INSERTION A";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x04) {
						$prefix .= "INSERTION B";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x10) {
						$prefix .= "MASTER EQ";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x11) {
						$prefix .= "MASTER EFFECT";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x20) {
						$prefix .= "NATIVE";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else {
						$prefix .= "???";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
				}
				else if ($bulk_dump_address_high == 0x31 || $bulk_dump_address_high == 0x34) { // PERFORMANCE PARTS
					$prefix = "PERFORMANCE ";
					if ($bulk_dump_address_mid >= 0x00 && $bulk_dump_address_mid <= 0x03) {
						$prefix .= "PART" . ($bulk_dump_address_mid + 1);
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid >= 0x60 && $bulk_dump_address_mid <= 0x62) {
						$prefix .= "PLUGIN PART" . ($bulk_dump_address_mid - 0x60 + 1);
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid >= 0x40 && $bulk_dump_address_mid <= 0x44) {
						$prefix .= "AD PART" . ($bulk_dump_address_mid - 0x40 + 1);
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
				}
				else if ($bulk_dump_address_high == 0x32) { // MASTER ZONE
					$prefix = "MASTER ZONE " . ($bulk_dump_address_mid+1);
					dump_raw_data($prefix, $ofs+1, $byte_count);
					$dump .= "$prefix Transmit Channel = " . ($d[0x00] & 0x0F) . "\n";
					$dump .= "$prefix MIDI = " . on_off($d[0x00] & 8) . "\n";
					$dump .= "$prefix TG Switch = " . on_off($d[0x00] & 16) . "\n";
					$dump .= "$prefix Transpose (Octave) = " . ($d[0x01] - 0x3D - 3) . "\n"; 
					$dump .= "$prefix Transpose (Semitone) = " . ($d[0x02] - 0x35 - 11) . "\n"; 
					$dump .= "$prefix Note Limit Low = " . note($d[0x03]) . "\n";
					$dump .= "$prefix Note Limit High = " . note($d[0x04]) . "\n";
					$dump .= "$prefix Transmit Bank Select for TG = " . on_off($d[0x05] & 1) . "\n";
					$dump .= "$prefix Transmit Program Change for TG = " . on_off($d[0x05] & 2) . "\n";
					$dump .= "$prefix Transmit RB = " . on_off($d[0x05] & 4) . "\n";
					$dump .= "$prefix MIDI Volume = " . $d[0x07] . "\n";
					$dump .= "$prefix MIDI Pan = " . pan($d[0x08]) . "\n";
					$dump .= "$prefix MIDI Bank MSB = " . hexbyte($d[0x09]) . "\n";
					$dump .= "$prefix MIDI Program Number = " . yam_program($d[0x0B]) . "\n";
					$dump .= "$prefix Transmit Volume/Expression = " . on_off($d[0x0C] & 1) . "\n";
					$dump .= "$prefix Transmit Pan = " . on_off($d[0x0C] & 2) . "\n";
					$dump .= "$prefix Transmit Sustain = " . on_off($d[0x0C] & 4) . "\n";
					$dump .= "$prefix Transmit Bank Select for MIDI = " . on_off($d[0x0C] & 8) . "\n";
					$dump .= "$prefix Transmit Program Change for MIDI = " . on_off($d[0x0C] & 16) . "\n";
					$dump .= "$prefix Transmit AT = " . on_off($d[0x0C] & 32) . "\n";
					$dump .= "$prefix Transmit PB = " . on_off($d[0x0C] & 64) . "\n";
					$dump .= "$prefix Transmit FC2 = " . on_off($d[0x0D] & 1) . "\n";
					$dump .= "$prefix Transmit FS = " . on_off($d[0x0D] & 2) . "\n";
					$dump .= "$prefix Transmit FC1 = " . on_off($d[0x0D] & 4) . "\n";
					$dump .= "$prefix Transmit BC = " . on_off($d[0x0D] & 8) . "\n";
					$dump .= "$prefix Transmit MW = " . on_off($d[0x0D] & 16) . "\n";
					$dump .= "$prefix Transmit Assignable Slider = " . on_off($d[0x0D] & 32) . "\n";
					$dump .= "$prefix Transmit Assignable Knob = " . on_off($d[0x0D] & 64) . "\n";
					$dump .= "$prefix Control Slider Control Number = " . off($d[0x0E]) . "\n";
					$dump .= "$prefix Control Knob Control Number = " . off($d[0x0F]) . "\n";
				}
				else if ($bulk_dump_address_high == 0x33) { // MASTER COMMON
					$prefix = "MASTER COMMON";
					dump_raw_data($prefix, $ofs+1, $byte_count);
					$master_name = "";
					for ($i=0; $i<10; $i++)
						$master_name .= chr($d[$i]);
					$dump .= "$prefix Name = \"$master_name\"\n";
					$dump .= "$prefix Mode Change = " . which($d[0x0D], array("Voice", "Performance", "Pattern", "Song")). "\n";
					$dump .= "$prefix Bank MSB for Voice/Perf Mode = " . hexbyte($d[0x0E]) . "\n";
					$dump .= "$prefix Bank LSB for Voice/Perf Mode = " . hexbyte($d[0x0F]) . "\n";
					$dump .= "$prefix Program Number = " . yam_program($d[0x10]) . "\n";
					$dump .= "$prefix Zone on/off = " . on_off($d[0x11]) . "\n";
					$dump .= "$prefix Knob/Slider Function Select = ";
					$dump .= which($d[0x12], array("Pan&Send", "Tone", "Assign", "MeqOffset/PartEQ", "MasterEffect", "ARP FX", "Zone")) . "\n";
				}
				else if ($bulk_dump_address_high == 0x36) { // MIX COMMON
					if ($bulk_dump_address_mid == 0x00) {
						$prefix = "MIX COMMON";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix ARP Midi Out Switch = " . on_off($d[0x11]) . "\n";
						$dump .= "$prefix ARP Midi Out Channel = " . off($d[0x12]+1, 0x11, "kbd-ch") . "\n";
						$dump .= "$prefix ARP Type = " . decword($d[0x14], $d[0x15]) . "\n"; // TODO
						$dump .= "$prefix ARP Switch = " . on_off($d[0x16]) . "\n";
						$dump .= "$prefix ARP Hold = " . which($d[0x17], array("sync-off", "off", "on")) . "\n";
						$dump .= "$prefix ARP Unit Multiplay = ";
						$dump .= which($d[0x18], array("50%", "66%", "75%", "100%", "133%", "150%", "200%")) . "\n";
						$dump .= "$prefix ARP Note Limit Low = " . note($d[0x19]) . "\n";
						$dump .= "$prefix ARP Note Limit High = " . note($d[0x1A]) . "\n";
						$dump .= "$prefix ARP Velocity Limit Low = " . $d[0x1B] . "\n";
						$dump .= "$prefix ARP Velocity Limit High = " . $d[0x1C] . "\n";
						$dump .= "$prefix ARP Key Mode = ";
						$dump .= which($d[0x1D], array("sort", "thru", "direct", "sort+direct", "thru+direct")) . "\n";
						$dump .= "$prefix Arp Vel Mode = " . which($d[0x1E], array("original", "thru")) . "\n";
						$dump .= "$prefix Arp Change Timing = " . which($d[0x1F], array("realtime", "measure")) . "\n";
						$dump .= "$prefix Arp Quantize Value = ";
						$dump .= which($d[0x20], array("32th", "16th Triplet", "16th", "8th Triplet", "8th", "4th Triplet", "4th")) . "\n";
						$dump .= "$prefix Arp Quantize Strength = " . $d[0x21] . "%\n";
						$dump .= "$prefix Arp Velocity Rate = " . decword($d[0x22], $d[0x23]) . "%\n";
						$dump .= "$prefix Arp Gate Time Rate = " . decword($d[0x24], $d[0x25]) . "%\n";
						$dump .= "$prefix Arp Swing = " . (decword($d[0x26], $d[0x27])-128) . "\n";
						$dump .= "$prefix Arp SF1 Assign Type = " . off(decword($d[0x2A], $d[0x2B]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF2 Assign Type = " . off(decword($d[0x2C], $d[0x2D]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF3 Assign Type = " . off(decword($d[0x2E], $d[0x2F]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF4 Assign Type = " . off(decword($d[0x30], $d[0x31]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF5 Assign Type = " . off(decword($d[0x32], $d[0x33]), 16383, "No Type") . "\n";
						$dump .= "$prefix Knob Function Select = ";
						$dump .= which($d[0x34], array("Pan&Send", "Tone", "Assign", "MeqOffset", "MasterEffect", "ArpFX")) . "\n";
						
						$dump .= "$prefix Knob A = " . ($d[0x3E]-64) . "\n";
						$dump .= "$prefix Knob B = " . ($d[0x3F]-64) . "\n";
						$dump .= "$prefix EQ Low Gain = " . ($d[0x41]-64) . "\n";
						$dump .= "$prefix EQ Low Mid Gain = " . ($d[0x42]-64) . "\n";
						$dump .= "$prefix EQ High Mid Gain = " . ($d[0x43]-64) . "\n";
						$dump .= "$prefix EQ High Gain = " . ($d[0x44]-64) . "\n";
						$dump .= "$prefix Assign 1 = " . ($d[0x45]-64) . "\n";
						$dump .= "$prefix Assign 2 = " . ($d[0x46]-64) . "\n";
						
						$dump .= "$prefix Assign 1 Control Number = " . off($d[0x58]) . "\n";
						$dump .= "$prefix Assign 2 Control Number = " . off($d[0x59]) . "\n";
						$dump .= "$prefix BC Control Number = " . off($d[0x5A]) . "\n";
						$dump .= "$prefix FC2 Control Number = " . off($d[0x5B]) . "\n";
						$dump .= "$prefix FC1 Control Number = " . off($d[0x5C]) . "\n";
						
						$dump .= "$prefix RB Mode = " . which($d[0x5D], array("Hold", "Reset")) . "\n";
						$dump .= "$prefix RB Control Number = " . off($d[0x5E]) . "\n";
						$dump .= "$prefix Analog Insertion Connect Type = " . which($d[0x5F], array("A->B", "B->A")) . "\n";
						$dump .= "$prefix Insertion Part1 Sw = " . on_off($d[0x63] & 1) . "\n";
						$dump .= "$prefix Insertion Part2 Sw = " . on_off($d[0x63] & 2) . "\n";
						$dump .= "$prefix Insertion Part3 Sw = " . on_off($d[0x63] & 4) . "\n";
						$dump .= "$prefix Insertion Part4 Sw = " . on_off($d[0x63] & 8) . "\n";
						$dump .= "$prefix Insertion Part5 Sw = " . on_off($d[0x63] & 16) . "\n";
						$dump .= "$prefix Insertion Part6 Sw = " . on_off($d[0x63] & 32) . "\n";
						$dump .= "$prefix Insertion Part7 Sw = " . on_off($d[0x63] & 64) . "\n";
						$dump .= "$prefix Insertion Part8 Sw = " . on_off($d[0x62] & 1) . "\n";
						$dump .= "$prefix Insertion Part9 Sw = " . on_off($d[0x62] & 2) . "\n";
						$dump .= "$prefix Insertion Part10 Sw = " . on_off($d[0x62] & 4) . "\n";
						$dump .= "$prefix Insertion Part11 Sw = " . on_off($d[0x62] & 8) . "\n";
						$dump .= "$prefix Insertion Part12 Sw = " . on_off($d[0x62] & 16) . "\n";
						$dump .= "$prefix Insertion Part13 Sw = " . on_off($d[0x62] & 32) . "\n";
						$dump .= "$prefix Insertion Part14 Sw = " . on_off($d[0x62] & 64) . "\n";
						$dump .= "$prefix Insertion Part15 Sw = " . on_off($d[0x61] & 1) . "\n";
						$dump .= "$prefix Insertion Part16 Sw = " . on_off($d[0x61] & 2) . "\n";
						$dump .= "$prefix Insertion PBPart1 Sw = " . on_off($d[0x61] & 4) . "\n";
						$dump .= "$prefix Insertion PBPart2 Sw = " . on_off($d[0x61] & 8) . "\n";
						$dump .= "$prefix Insertion PBPart3 Sw = " . on_off($d[0x61] & 16) . "\n";
						$dump .= "$prefix Insertion Analog Part Sw = " . on_off($d[0x61] & 32) . "\n";
						$dump .= "$prefix InsEff Plugin Part = ";
						$dump .= which($d[64], array(0 => "Part1", 1 => "Part2", 2 => "Part3", 3 => "Part4",
															4 => "Part5", 5 => "Part6", 6 => "Part7", 7 => "Part8",
															8 => "Part9", 9 => "Part10", 10 => "Part11", 11 => "Part12",
															12 => "Part13", 13 => "Part14", 14 => "Part15", 
															15 => "Part16", 64 => "PartAD", 97 => "PBPart2",
															98 => "PBPart3", 127 => "Off"));
						$dump .= "\n";
					}
					else if ($bulk_dump_address_mid == 0x01) {
						$prefix = "MIX REVERB";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
						$dump .= "$prefix Return = " . $d[0x22] . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x23]) . "\n";
					}
					else if ($bulk_dump_address_mid == 0x02) {
						$prefix = "MIX CHORUS";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
						$dump .= "$prefix Return = " . $d[0x22] . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x23]) . "\n";
						$dump .= "$prefix Send To Reverb = " . $d[0x24] . "\n";
					}
					else if ($bulk_dump_address_mid == 0x03) {
						$prefix = "MIX INSERTION A";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
					}
					else if ($bulk_dump_address_mid == 0x04) {
						$prefix = "MIX INSERTION B";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
					}
					else if ($bulk_dump_address_mid == 0x10) {
						$prefix = "MIX MASTER EQ";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x11) {
						$prefix = "MIX MASTER EFFECT";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
					else if ($bulk_dump_address_mid == 0x20) {
						$prefix = "MIX NATIVE";
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
				}
				else if ($bulk_dump_address_high == 0x37) {	// MIX PART
					if ($bulk_dump_address_mid <= 0x0F 
						|| $bulk_dump_address_mid == 0x60 
						|| $bulk_dump_address_mid == 0x61 
						|| $bulk_dump_address_mid == 0x62) 
					{
						$prefix = "MIX PART";
						$is_plg_part = ($bulk_dump_address_mid == 0x60 || $bulk_dump_address_mid == 0x61 || $bulk_dump_address_mid == 0x62);
						if ($bulk_dump_address_mid <= 0x0F)
							$prefix .= ($bulk_dump_address_mid+1);
						else 
							$prefix .= " PLG" . ($bulk_dump_address_mid-0x5F);
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$cur_ofs = $ofs+1; // Saute le CRC
						$bank_select_msb = ($data[$cur_ofs]);
						$bank_select_lsb = ($data[$cur_ofs+1]);
						$program_number = ($data[$cur_ofs+2]);
						$receive_channel = ($data[$cur_ofs+3]);
						$bank = "???";
						$track = "OFF";
						if ($bank_select_msb == 0) 
							$bank = "GM";
						else if ($bank_select_msb == 127)
							$bank = "GMDR";
						else if ($bank_select_msb == 63) {
							$bank = which($bank_select_lsb, array(0 => "PRE1", 1 => "PRE2", 2 => "PRE3", 3 => "PRE4",
																	4 => "PRE5", 5 => "PRE6", 8 => "USR1", 9 => "USR2",
																	32 => "PDR", 40 => "UDR", 50 => "SMPL", 60 => "MIXV",
																	24 => "PLGUSR1", 25 => "PLGUSR2", 26 => "PLGUSR3",
																	70 => "PLGPRE1(1)", 71 => "PLGPRE2(1)", 72 => "PLGPRE3(1)",
																	73 => "PLGPRE1(2)", 74 => "PLGPRE2(2)", 75 => "PLGPRE3(2)",
																	76 => "PLGPRE1(3)", 77 => "PLGPRE2(3)", 78 => "PLGPRE3(3)"));
						}
						else {
								$bank = sprintf("%03d/%03d", $bank_select_msb, $bank_select_lsb);							
						}
						if ($receive_channel != 0x7F)
							$track = $receive_channel + 1;
						$program = yam_program($program_number);
						$part = $bulk_dump_address_mid + 1;
						$dump .= "$prefix Voice (Bank/Program <Receive Channel>) = $bank/$program <";
						$dump .= off($track, 0x7F) . ">\n";
						$dump .= "$prefix Part mode = " . which($d[0x04], array("Mono", "Poly")) . "\n";
						$dump .= "$prefix Velocity Limit Low = " . $d[0x05] . "\n";
						$dump .= "$prefix Velocity Limit High = " . $d[0x06] . "\n";
						$dump .= "$prefix Note Limit Low = " . note($d[0x07]) . "\n";
						$dump .= "$prefix Note Limit High = " . note($d[0x08]) . "\n";
						$dump .= "$prefix Pitch Bend Range Upper = " . ($d[0x09]-48-0x10) . "\n";
						$dump .= "$prefix Pitch Bend Range Lower = " . ($d[0x0A]-48-0x10) . "\n";
						$dump .= "$prefix Velocity Sense Depth = " . $d[0x0B] . "\n";
						$dump .= "$prefix Velocity Sense Offset = " . $d[0x0C] . "\n";
						$dump .= "$prefix Volume = " . $d[0x0D] . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x0E]) . "\n";
						$dump .= "$prefix Detune = " . decword($d[0x10], $d[0x11]) . "\n"; // Does anyone understand the manual about this one ?
						$dump .= "$prefix Reverb Send = " . $d[0x12] . "\n";
						$dump .= "$prefix Chorus Send = " . $d[0x13] . "\n";
						$dump .= "$prefix Dry Level =  " . $d[0x15] . "\n";
						$dump .= "$prefix Note Shift = " . ($d[0x16]-24-0x28) . " semitones\n";
						$dump .= "$prefix Filter Cutoff Frequency = " . ($d[0x17]-64) . "\n";
						$dump .= "$prefix Filter Resonance/Width = " . ($d[0x18]-64) . "\n";
						$dump .= "$prefix Portamento Switch = " . on_off($d[0x1A]) . "\n";
						$dump .= "$prefix Portamento Time = " . $d[0x1B] . "\n";
						$dump .= "$prefix Portamento Mode = " . which($d[0x1C], array("Fingered", "Fulltime")) . "\n";
						$dump .= "$prefix Output Select = ";
						$dump .= which($d[0x1E], array(0 => "L&R", 8 => "asnL&R", 9 => "asn1&2", 10 => "asn3&4", 
														11 => "asn5&6", 12 => "asn7&8", 13 => "asn9&10", 
														14 => "asn11&12", 15 => "asn13&14", 64 => "asnL", 65 => "asnR",
														66 => "asn1", 67 => "asn2", 68 => "asn3", 69 => "asn4", 
														70 => "asn5", 71 => "asn6", 72 => "asn7", 73 => "asn8",
														74 => "asn9", 75 => "asn10", 76 => "asn11", 77 => "asn12",
														78 => "asn13", 79 => "asn14", 127 => "drum (or L&R)"));
						$dump .= "\n";
						$dump .= "$prefix Receive Controller Arpeggio Sw = " . on_off($d[0x1F] & 2) . "\n";
						$dump .= "$prefix Receive Controller Control Change = " . on_off($d[0x1F] & 4) . "\n";
						$dump .= "$prefix Receive Controller Bank Select = " . on_off($d[0x1F] & 8) . "\n";
						$dump .= "$prefix Receive Controller Program Change = " . on_off($d[0x1F] & 16) . "\n";
						$dump .= "$prefix Receive Controller AT = " . on_off($d[0x1F] & 32) . "\n";
						$dump .= "$prefix Receive Controller PB = " . on_off($d[0x1F] & 64) . "\n";
						$dump .= "$prefix Receive Controller Volume/Expression = " . on_off($d[0x20] & 1) . "\n";
						$dump .= "$prefix Receive Controller Pan = " . on_off($d[0x20] & 2) . "\n";
						$dump .= "$prefix Receive Controller Sustain/Sostenuto = " . on_off($d[0x20] & 8) . "\n";
						$dump .= "$prefix Receive Controller MW = " . on_off($d[0x20] & 32) . "\n";
						$dump .= "$prefix Receive Controller FC2 = " . on_off($d[0x21] & 1) . "\n";
						$dump .= "$prefix Receive Controller FS = " . on_off($d[0x21] & 2) . "\n";
						$dump .= "$prefix Receive Controller FC1 = " . on_off($d[0x21] & 4) . "\n";
						$dump .= "$prefix Receive Controller BC = " . on_off($d[0x21] & 8) . "\n";
						$dump .= "$prefix Receive Controller Knob1 = " . on_off($d[0x21] & 16) . "\n";
						$dump .= "$prefix Receive Controller Knob2 = " . on_off($d[0x21] & 32) . "\n";
						$dump .= "$prefix Receive Controller RB = " . on_off($d[0x21] & 64) . "\n";
						
						$dump .= "$prefix AEG Decay2 Level (EG Sustain Level) = " . ($d[0x22]-64) . "\n";
						$dump .= "$prefix AEG Attack Time (EG Attack Time) = " . ($d[0x23]-64) . "\n";
						$dump .= "$prefix Voice Pan on/off = " . on_off($d[0x24]) . "\n";
						$dump .= "$prefix AEG Decay2 Time (EG Decay Time) = " . ($d[0x25]-64) . "\n";
						$dump .= "$prefix AEG Release Time (EG Release Time) = " . ($d[0x26]-64) . "\n";
						$dump .= "$prefix FEG Decay2 Level (EG Sustain Level) = " . ($d[0x27]-64) . "\n";
						$dump .= "$prefix FEG Attack Time (EG Attack Time) = " . ($d[0x28]-64) . "\n";
						$dump .= "$prefix FEG Decay2 Time (EG Decay Time) = " . ($d[0x2A]-64) . "\n";
						$dump .= "$prefix FEG Release Time (EG Release Time) = " . ($d[0x2B]-64) . "\n";
						$dump .= "$prefix FEG Depth = " . ($d[0x2C]-64) . "\n";
						$dump .= "$prefix Low Frequency = " . decword($d[0x2E], $d[0x2F]) . "\n";
						$dump .= "$prefix Low Gain = " . ($d[0x30]-32-0x20) . "\n";
						$dump .= "$prefix Mid Frequency = " . decword($d[0x32], $d[0x33]) . "\n";
						$dump .= "$prefix Mid Gain = " . ($d[0x34]-32-0x20) . "\n";
						$dump .= "$prefix Mid Resonance = " . $d[0x35] . "\n";
						$dump .= "$prefix High Frequency = " . decword($d[0x36], $d[0x37]) . "\n";
						$dump .= "$prefix High Gain = " . ($d[0x38]-32-0x20) . "\n";
					}
					else  {
						$prefix = "MULTI PLUGIN BOARD PART" . ($bulk_dump_address_mid-0x10+1);
						dump_raw_data($prefix, $ofs+1, $byte_count);
					}
				}
				else if ($bulk_dump_address_high == 0x38) { // MIX AD PART (Same as in Perf ?)
					$prefix = "AD PART" . ($bulk_dump_address_mid-0x40+1);
					dump_raw_data($prefix, $ofs+1, $byte_count);
				}
				else if ($bulk_dump_address_high == 0x40 || $bulk_dump_address_high == 0x46) { // VOICE)
					if ($bulk_dump_address_high == 0x40)
						$voice_type = "Normal";
					else if ($bulk_dump_address_high == 0x46)
						$voice_type = "Drum";
					$prefix = strtoupper($voice_type) . " VOICE COMMON";
					
					if ($bulk_dump_address_mid == 0x70) { // Extra 
						$prefix .= " EXTRA";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$voice_name = "";
						for ($i=0; $i<10; $i++)
							$voice_name .= chr($d[$i]);
						$cat = $voice_categories[$d[0x0C]];
						$sub_cat = $voice_sub_categories[$cat][$d[0x0D]]; // Nice one :)
						$dump .= "$prefix Voice Name = \"$voice_name\"\n";
						$dump .= "$prefix Voice Category (Main) = $cat\n";
						$dump .= "$prefix Voice Category (Sub) = $sub_cat\n";
						$dump .= "$prefix Arp Type = " . decword($d[0x14], $d[0x15]) . "\n"; // TODO
						$dump .= "$prefix Arp Switch = " . on_off($d[0x16]) . "\n";
						$dump .= "$prefix Arp Hold = " . which($d[0x17], array("sync-off", "off", "on")) . "\n";
						$dump .= "$prefix Arp Unit Multiplay = ";
						$dump .= which($d[0x18], array("50%", "66%", "75%", "100%", "133%", "150%", "200%")) . "\n";
						$dump .= "$prefix Arp Note Limit Low = " . note($d[0x19]) . "\n";
						$dump .= "$prefix Arp Note Limit High = " . note($d[0x1A]) . "\n";
						$dump .= "$prefix Arp Velocity Limit Low = " . $d[0x1B] . "\n";
						$dump .= "$prefix Arp Velocity Limit High = " . $d[0x1C] . "\n";
						$dump .= "$prefix Arp Key Mode = ";
						$dump .= which($d[0x1D], array("sort", "thru", "direct", "sort+direct", "thru+direct")) . "\n";
						$dump .= "$prefix Arp Vel Mode = " . which($d[0x1E], array("original", "thru")) . "\n";
						$dump .= "$prefix Arp Change Timing = " . which($d[0x1F], array("realtime", "measure")) . "\n";
						$dump .= "$prefix Arp Quantize Value = ";
						$dump .= which($d[0x20], array("32th", "16th Triplet", "16th", "8th Triplet", "8th", "4th Triplet", "4th")) . "\n";
						$dump .= "$prefix Arp Quantize Strength = " . $d[0x21] . "%\n";
						$dump .= "$prefix Arp Velocity Rate = " . decword($d[0x22], $d[0x23]) . "%\n";
						$dump .= "$prefix Arp Gate Time Rate = " . decword($d[0x24], $d[0x25]) . "%\n";
						$dump .= "$prefix Arp Swing = " . (decword($d[0x26], $d[0x27])-128) . "\n";
						$dump .= "$prefix Arp Tempo = " . decword($d[0x28], $d[0x29]) . "\n";
						$dump .= "$prefix Arp SF1 Assign Type = " . off(decword($d[0x2A], $d[0x2B]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF2 Assign Type = " . off(decword($d[0x2C], $d[0x2D]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF3 Assign Type = " . off(decword($d[0x2E], $d[0x2F]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF4 Assign Type = " . off(decword($d[0x30], $d[0x31]), 16383, "No Type") . "\n";
						$dump .= "$prefix Arp SF5 Assign Type = " . off(decword($d[0x32], $d[0x33]), 16383, "No Type") . "\n";
						$dump .= "$prefix Knob Function Select = ";
						$dump .= which($d[0x34], array("Pan&Send", "Tone", "Assign", "MeqOffset", "MasterEffect", "ArpFX")) . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x35]) . "\n";
						$dump .= "$prefix QED Decay Time = " . ($d[0x37]-64) . "\n";
						$dump .= "$prefix QED Sustain Level = " . ($d[0x38]-64) . "\n";
						$dump .= "$prefix QED FEG Attack Time = " . ($d[0x39]-64) . "\n";
						$dump .= "$prefix QED FEG Decay Time = " . ($d[0x3A]-64) . "\n";
						$dump .= "$prefix QED FEG Release Time = " . ($d[0x3B]-64) . "\n";
						$dump .= "$prefix QED FEG Depth = " . ($d[0x3D]-64) . "\n";
						$dump .= "$prefix KnobA = " . ($d[0x3E]-64) . "\n";
						$dump .= "$prefix KnobB = " . ($d[0x3F]-64) . "\n";
						$dump .= "$prefix EQ Low Gain = " . ($d[0x41]-64) . "\n";
						$dump .= "$prefix EQ Low Mid Gain = " . ($d[0x42]-64) . "\n";
						$dump .= "$prefix EQ High Mid Gain = " . ($d[0x43]-64) . "\n";
						$dump .= "$prefix EQ High Gain = " . ($d[0x44]-64) . "\n";
						$dump .= "$prefix Assign1 = " . ($d[0x45]-64) . "\n";
						$dump .= "$prefix Assign2 = " . ($d[0x46]-64) . "\n";
						$dump .= "$prefix Cutoff Frequency = " .($d[0x47]-64) . "\n";
						$dump .= "$prefix Resonance = " . ($d[0x48]-64) . "\n";						
						$dump .= "$prefix Attack Time = " . ($d[0x49]-64) . "\n";
						$dump .= "$prefix Release Time = " . ($d[0x4A]-64) . "\n";
					}
					else if ($bulk_dump_address_mid == 0x00) { // Common1 or Common2
						if ($bulk_dump_address_low == 0x00) { // Common1
							$prefix .= " COMMON1";
							dump_raw_data($prefix, $ofs+1, $byte_count);
							if ($voice_type == "Normal") {
								$dump .= "$prefix Volume = " . ($d[0x01]) . "\n";
								$dump .= "$prefix Same Note Number Key On Assign = "; 
								$dump .= which($d[0x02], array("Single", "Multi")) . "\n";
								$dump .= "$prefix QED Mono/Poly Mode = ";
								$dump .= which($d[0x03], array("Mono", "Poly")) . "\n";
								$dump .= "$prefix Micro Tuning Scale = ";
								$dump .= which($d[0x04], 
											array(
													"Equal", "PureMajor", "PureMinor", "Werckmeist", "Kirnberger", "Vallot&Yng",
													"1/4 Shift", "1/4 Ton", "1/8 Tone", "Indian", "Arabic 1", "Arabic 2",
													"Arabic 3"
											));
								$dump .= "\n";
								$dump .= "$prefix QED Pitch Bend Range Upper = " . ($d[0x05] - 64) . "\n";
								$dump .= "$prefix QED Pitch Bend Range Lower = " . ($d[0x06] - 64) . "\n";
								$dump .= "$prefix QED Portamento Mode = ";
								$dump .= which($d[0x07], array("Fingered", "Fulltime")) . "\n";
								$dump .= "$prefix QED Portamento Switch = " . on_off($d[0x08]) . "\n";
								$dump .= "$prefix QED Portamento Time = " . $d[0x09] . "\n";
								$dump .= "$prefix Portamento Time Mode = ";
								$dump .= which($d[0x0A], array("rate1", "time1", "rate2", "time2")) . "\n";
								$dump .= "$prefix Reverb Send = " . $d[0x0B] . "\n";
								$dump .= "$prefix Chorus Send = " . $d[0x0C] . "\n";
								$dump .= "$prefix Micro Tuning Root = ";
								$dump .= which($d[0x0F], array("C", "D", "E", "F", "G", "A", "B", "C")) . "\n";
								$dump .= "$prefix Legato Slope = " . $d[0x10] . "\n";							
							}
							else if ($voice_type == "Drum") {
								$dump .= "$prefix QED Pitch Bend Range Upper = " . ($d[0x02] - 64) . "\n";
								$dump .= "$prefix QED Pitch Bend Range Lower = " . ($d[0x03] - 64) . "\n";
								$dump .= "$prefix Reverb Send = " . $d[0x04] . "\n";
								$dump .= "$prefix Chorus Send = " . $d[0x05] . "\n";
							}
						}
						else if ($bulk_dump_address_low == 0x40) { // Common 2
							$prefix .= " COMMON2";
							dump_raw_data($prefix, $ofs+1, $byte_count);
							$dump .= "$prefix Insertion Connect Type = ";
							$dump .= which($d[0x40], array("Parallel", "A->B", "B->A")) . "\n";
						}
					}
					else if ($bulk_dump_address_mid == 0x01) { // Reverb
						$prefix .= " REVERB";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
						$dump .= "$prefix Return = " . $d[0x22] . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x23]) . "\n";
					}
					else if ($bulk_dump_address_mid == 0x02) { // Chorus
						$prefix .= " CHORUS";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
						$dump .= "$prefix Return = " . $d[0x22] . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x23]) . "\n";
						$dump .= "$prefix Send Chorus To Reverb = " . $d[0x24] . "\n";
					}
					else if ($bulk_dump_address_mid == 0x03) { // Insertion A
						$prefix .= " INSERTION A";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
					}
					else if ($bulk_dump_address_mid == 0x04) { // Insertion B
						$prefix .= " INSERTION B";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						effect($prefix, $ofs+1);
					}
					else if ($bulk_dump_address_mid == 0x05) { // Controllers
						$prefix .= " CONTROLLER";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						for ($i=0; $i<6; $i++) {
							$new_prefix = "$prefix SET " . ($i+1);
							$base = $i*5;
							$dump .= "$new_prefix Source = " . $controller_set_src[$d[$base]] . ", ";
							$dump .= "Dest = " . $controller_destinations[decword($d[$base+1], $d[$base+2])] . ", ";
							$dump .= "Depth = " . ($d[$base+3]-64) . "\n";
						}
					}
					else if ($bulk_dump_address_mid == 0x06) { // LFO
						$prefix .= " LFO";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Phase = ";
						$dump .= which($d[0x00], array(0, 90, 120, 180, 240, 270)) . "\n";
						$dump .= "$prefix Wave = ";
						$dump .= which($d[0x01], array("tri", "tri+", "sawup", "sawdwn", "squ1/4", "squ1/3", "squ",
														"squ2/3", "squ3/4", "trpzd", "S/H1", "S/H2", "user")) . "\n";
						$dump .= "$prefix Speed = " . $d[0x02] . "\n";
						$dump .= "$prefix Tempo Speed = ";
						$dump .= which($d[0x03], array(5=>"16th", "8th/3", "16th.", "8th", "4th/3", "8th.", "4th", "2th/3", "4th.", 
														"2nd", "Whole/3", "2nd.", "4thX4", "4thX5", "4thX6", "4thX7", "4thX8"));
						$dump .= "\n";
						$dump .= "$prefix Tempo Sync = " . on_off($d[0x04]) . "\n";
						$dump .= "$prefix Delay Time = " . $d[0x05] . "\n";
						$dump .= "$prefix Fade In Time = " . $d[0x06] . "\n";
						$dump .= "$prefix Hold Time = " . $d[0x07] . "\n";
						$dump .= "$prefix Fade Out Time = " . $d[0x08] . "\n";
						$dump .= "$prefix Key On Reset = " . which($d[0x09], array("off", "each-on", "1st-on")) . "\n";
						$dump .= "$prefix Box1 Destination = " . which($d[0x0A], array("AMD", "PMD", "FMD", "RESO", "PAN", "ELEMENT LFO SPEED")) . "\n";
						$dump .= "$prefix Box1 Depth = " . $d[0x0B] . "\n";
						$dump .= "$prefix Box2 Destination = " . which($d[0x0D], array("AMD", "PMD", "FMD", "RESO", "PAN", "ELEMENT LFO SPEED")) . "\n";
						$dump .= "$prefix Box2 Depth = " . $d[0x0E] . "\n";
						$dump .= "$prefix Box3 Destination = " . which($d[0x10], array("AMD", "PMD", "FMD", "RESO", "PAN", "ELEMENT LFO SPEED")) . "\n";
						$dump .= "$prefix Box3 Depth = " . $d[0x11] . "\n";
						$dump .= "$prefix User Wave Total Step = " . which($d[0x13], array(2, 3, 4, 6, 8, 12, 16)) . "\n";
						$dump .= "$prefix User Wave Slope = " . which($d[0x14], array("Off", "Up", "Down", "Up&Down")) . "\n";
						$dump .= "$prefix User Wave Step Values = {";
						for ($i=0; $i<16; $i++) 
							$dump .= sprintf("%02X", $d[0x15+$i]);
						$dump .= "}\n";
						$dump .= "$prefix Random Speed Depth = " . $d[0x25] . "\n";
					}
				}
				else if ($bulk_dump_address_high == 0x41) { // VOICE ELEMENT OSCILLATOR
					$prefix = "VOICE EL" . ($bulk_dump_address_mid+1);
					if ($bulk_dump_address_low == 0x00) {
						$prefix .= " OSCILLATOR";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Element Assign = " . on_off($d[0x00]) . "\n";
						$dump .= "$prefix Wave Select = " . which($d[0x01], array("Preset", "User Wave")) . "\n";
						$dump .= "$prefix Wave Number = " . decword($d[0x03], $d[0x04]) . "\n";
						$dump .= "$prefix Pan = " . pan($d[0x08]) . "\n";
						$dump .= "$prefix Random Pan Depth = " . $d[0x09] . "\n";
						$dump .= "$prefix Alternate Pan Depth = " . pan($d[0x0A]) . "\n";
						$dump .= "$prefix Scaling Pan Depth = " . ($d[0x0B]-64) . "\n";
						$dump .= "$prefix Note Limit Low = " . note($d[0x0C]) . "\n";
						$dump .= "$prefix Note Limit High = " . note($d[0x0D]) . "\n";
						$dump .= "$prefix Velocity Limit Low = " . $d[0x0E] . "\n";
						$dump .= "$prefix Velocity Limit High = " . $d[0x0F] . "\n";
						$dump .= "$prefix Velocity Crossfade = " . $d[0x10] . "\n";
						$dump .= "$prefix Key On Delay = " . $d[0x11] . "\n";
						$dump .= "$prefix Key On Delay Tempo Sync = " . on_off($d[0x12]) . "\n";
						$dump .= "$prefix Insertion Effect Switch = " . which($d[0x16], array("thru", "insA", "insB")) . "\n";
						$dump .= "$prefix Control Box1 Sw = " . on_off($d[0x19] & 1) . "\n";
						$dump .= "$prefix Control Box2 Sw = " . on_off($d[0x19] & 2) . "\n";
						$dump .= "$prefix Control Box3 Sw = " . on_off($d[0x19] & 4) . "\n";
						$dump .= "$prefix Control Box4 Sw = " . on_off($d[0x19] & 8) . "\n";
						$dump .= "$prefix Control Box5 Sw = " . on_off($d[0x19] & 16) . "\n";
						$dump .= "$prefix Control Box6 Sw = " . on_off($d[0x19] & 32) . "\n";
						$dump .= "$prefix LFO Box1 Sw = " . on_off($d[0x1B] & 1) . "\n";
						$dump .= "$prefix LFO Box2 Sw = " . on_off($d[0x1B] & 2) . "\n";
						$dump .= "$prefix LFO Box3 Sw = " . on_off($d[0x1B] & 4) . "\n";
						$dump .= "$prefix Key On Delay Tempo = ";
						$dump .= which($d[0x1C], array(5 => "4thX4", "4thX5", "4thX6", "4thX7", "4thX8", "16th", "8th/3",
														"16th.", "8th", "4th/3", "8th.", "4th", "2th/3", "4th.", "2nd",
														"Whole/3", "2nd.", "4thX4", "4thX5", "4thX6", "4thX7", "4thX8"));
						$dump .= "\n";
					}
					else if ($bulk_dump_address_low == 0x20) { // VOICE ELEMENT AMPLITUDE
						$prefix .= " AMPLITUDE";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Element Level = " . $d[0x20] . "\n";
						$dump .= "$prefix Level Velocity Sensitivity = " . ($d[0x21]-64) . "\n";
						$dump .= "$prefix Level Sens Velocity Curve = " . $d[0x22] . "\n";
						$dump .= "$prefix AEG Attack Time = " . $d[0x24] . "\n";
						$dump .= "$prefix AEG Decay1 Time = " . $d[0x25] . "\n";
						$dump .= "$prefix AEG Decay2 Time = " . $d[0x26] . "\n";
						$dump .= "$prefix AEG Release Time = " . $d[0x27] . "\n";
						$dump .= "$prefix AEG Init Level = " . $d[0x28] . "\n";
						$dump .= "$prefix AEG Attack Level = " . $d[0x29] . "\n";
						$dump .= "$prefix AEG Decay1 Level = " . $d[0x2A] . "\n";
						$dump .= "$prefix AEG Decay2 Level = " . $d[0x2B] . "\n";
						$dump .= "$prefix AEG Time Velocity Segment = " . which($d[0x2D], array("ATK", "ATK+DCY", "DCY", "ATL+RLS", "ALL")) . "\n";
						$dump .= "$prefix AEG Time Velocity Sensitivity = " . ($d[0x2E]-64) . "\n";
						$dump .= "$prefix Level Key Follow Sensitivity = " . $d[0x2F] . "\n"; // TODO
						$dump .= "$prefix Level Scaling Break Point 1 = " . note($d[0x30]) . "\n";
						$dump .= "$prefix Level Scaling Break Point 2 = " . note($d[0x31]) . "\n";
						$dump .= "$prefix Level Scaling Break Point 3 = " . note($d[0x32]) . "\n";
						$dump .= "$prefix Level Scaling Break Point 4 = " . note($d[0x33]) . "\n";
						$dump .= "$prefix Level Scaling Offset 1 = " . (decword($d[0x34], $d[0x35])-128) . "\n";
						$dump .= "$prefix Level Scaling Offset 2 = " . (decword($d[0x36], $d[0x37])-128) . "\n";
						$dump .= "$prefix Level Scaling Offset 3 = " . (decword($d[0x38], $d[0x39])-128) . "\n";
						$dump .= "$prefix Level Scaling Offset 4 = " . (decword($d[0x3A], $d[0x3B])-128) . "\n";
						$dump .= "$prefix AEG Time Key Follow Sensitivity = " . ($d[0x3C]-64) . "\n";
						$dump .= "$prefix AEG Time Key Follow Center Note = " . note($d[0x3D]) . "\n";
					}
				}
				else if ($bulk_dump_address_high == 0x42) { // VOICE ELEMENT PITCH
					$prefix = "VOICE EL" . ($bulk_dump_address_mid+1) . " PITCH";
					dump_raw_data($prefix, $ofs+1, $byte_count);
					$dump .= "$prefix Coarse Tune = " . ($d[0x00] - 48 - 0x10) . "\n";
					$dump .= "$prefix Fine Tune = " . ($d[0x01]-64) . "\n";
					$dump .= "$prefix Velocity -> Pitch Sensitivity = " . ($d[0x02]-64) . "\n";
					$dump .= "$prefix Random Pitch Depth = " . $d[0x04] . "\n";
					$dump .= "$prefix PEG Hold Time = " . $d[0x05] . "\n";
					$dump .= "$prefix PEG Attack Time = " . $d[0x06] . "\n";
					$dump .= "$prefix PEG Decay1 Time = " . $d[0x07] . "\n";
					$dump .= "$prefix PEG Decay2 Time = " . $d[0x08] . "\n";
					$dump .= "$prefix PEG Release Time = " . $d[0x09] . "\n";
					$dump .= "$prefix PEG Hold Level = " . (decword($d[0x0A], $d[0x0B])-128) . "\n";
					$dump .= "$prefix PEG Attack Level = " . (decword($d[0x0C], $d[0x0D])-128) . "\n";
					$dump .= "$prefix PEG Decay1 Level = " . (decword($d[0x0E], $d[0x0F])-128) . "\n";
					$dump .= "$prefix PEG Decay2 Level = " . (decword($d[0x10], $d[0x11])-128) . "\n";
					$dump .= "$prefix PEG Release Level = " . (decword($d[0x12], $d[0x13])-128) . "\n";
					$dump .= "$prefix PEG Depth = " . ($d[0x14]-64) . "\n";
					$dump .= "$prefix PEG Time Velocity Segment = " . which($d[0x15], array("ATK", "ATK+DCY", "DCY", "ATL+RLS", "ALL")) . "\n";
					$dump .= "$prefix PEG Time Velocity Sensitivity = " . ($d[0x16]-64) . "\n";
					$dump .= "$prefix PEG Level Velocity Sensitivity = " . ($d[0x17]-64) . "\n";
					$dump .= "$prefix PEG Level Sens Velocity Curve = " . $d[0x18] . "\n";
					$dump .= "$prefix Pitch Key Follow Sensitivity = " . $d[0x19] . "\n";
					$dump .= "$prefix Pitch Key Follow Center Note = " . note($d[0x1A]) . "\n";
					$dump .= "$prefix PEG Time Key Follow Sensitivity = " . ($d[0x1B]-64) . "\n";
					$dump .= "$prefix PEG Time Key Follow Center Note = " . note($d[0x1C]) . "\n";
					$dump .= "$prefix Pitch Fine Scaling Sensitivity = " . ($d[0x1D]-64) . "\n";
				}
				else if ($bulk_dump_address_high == 0x43) { // VOICE ELEMENT FILTER
					$prefix = "VOICE EL" . ($bulk_dump_address_mid+1) . " FILTER";
					dump_raw_data($prefix, $ofs+1, $byte_count);
					$dump .= "$prefix Type = " . $filter_types[$d[0x00]] . "\n";
					$dump .= "$prefix Cutoff Frequency = " . decword($d[0x01], $d[0x02]) . "\n";
					$dump .= "$prefix Cutoff Velocity Sensitivity = " . ($d[0x03]-64) . "\n";
					$dump .= "$prefix Resonance/Width/Band = " . $d[0x05] . "\n";
					$dump .= "$prefix Resonance Velocity Sensitivity = " . ($d[0x06]-64) . "\n";
					$dump .= "$prefix HPF Cutoff Frequency = " . decword($d[0x07], $d[0x08]) . "\n";
					$dump .= "$prefix Distance = " . decword($d[0x0A], $d[0x0B]) . "\n";
					$dump .= "$prefix Gain = " . decword($d[0x0C], $d[0x0D]) . "\n";
					$dump .= "$prefix FEG Hold Time = " . $d[0x0E] . "\n";
					$dump .= "$prefix FEG Attack Time = " . $d[0x0F] . "\n";
					$dump .= "$prefix FEG Decay1 Time = " . $d[0x10] . "\n";
					$dump .= "$prefix FEG Decay2 Time = " . $d[0x11] . "\n";
					$dump .= "$prefix FEG Release Time = " . $d[0x12] . "\n";
					$dump .= "$prefix FEG Hold Level = " . (decword($d[0x13], $d[0x14])-128) . "\n";
					$dump .= "$prefix FEG Attack Level = " . (decword($d[0x15], $d[0x16])-128) . "\n";
					$dump .= "$prefix FEG Decay1 Level = " . (decword($d[0x17], $d[0x18])-128) . "\n";
					$dump .= "$prefix FEG Decay2 Level = " . (decword($d[0x19], $d[0x1A])-128) . "\n";
					$dump .= "$prefix FEG Release Level = " . (decword($d[0x1B], $d[0x1C])-128) . "\n";
					$dump .= "$prefix FEG Depth = " . ($d[0x1D]-64) . "\n";
					$dump .= "$prefix FEG Time Velocity Segment = " . which($d[0x1E], array("ATK", "ATK+DCY", "DCY", "ATL+RLS", "ALL")) . "\n";
					$dump .= "$prefix FEG Time Velocity Sensitivity = " . ($d[0x1F]-64) . "\n";
					$dump .= "$prefix FEG Level Velocity Sensitivity = " . ($d[0x20]-64) . "\n";
					$dump .= "$prefix FEG Level Velocity Curve = " . $d[0x21] . "\n";
					$dump .= "$prefix FEG Cutoff Key Follow Sensitivity = " . $d[0x22] . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Break Point 1 = " . note($d[0x23]) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Break Point 2 = " . note($d[0x24]) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Break Point 3 = " . note($d[0x25]) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Break Point 4 = " . note($d[0x26]) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Offset 1 = " . (decword($d[0x27], $d[0x28])-128) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Offset 2 = " . (decword($d[0x29], $d[0x2A])-128) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Offset 3 = " . (decword($d[0x2B], $d[0x2C])-128) . "\n";
					$dump .= "$prefix FEG Cutoff Scaling Offset 4 = " . (decword($d[0x2D], $d[0x2E])-128) . "\n";
					$dump .= "$prefix HPF Cutoff Key Follow Sensitivity = " . $d[0x2F] . "\n";
					$dump .= "$prefix FEG Time Key Follow Sensitivity = " . ($d[0x30]-64) . "\n";
					$dump .= "$prefix FEG Time Key Follow Center Note = " . note($d[0x31]) . "\n";
				}
				else if ($bulk_dump_address_high == 0x44) { // VOICE ELEMENT 
					if ($bulk_dump_address_low == 0x00) {
						$prefix = "VOICE EL" . ($bulk_dump_address_mid+1) . " EQ";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Type = " . $eq_types[$d[0x00]] . "\n";
						$dump .= "$prefix Resonance = " . ($d[0x01]) . "\n";
						$dump .= "$prefix 1 Frequency = " . decword($d[0x02], $d[0x03]) . "\n";
						$dump .= "$prefix 1 Gain = " . ($d[0x04]-32-0x20) . "\n";
						$dump .= "$prefix 2 Frequency = " . decword($d[0x05], $d[0x06]) . "\n";
						$dump .= "$prefix 2 Gain = " . ($d[0x07]-32-0x20) . "\n";
					}
					else if ($bulk_dump_address_low == 0x40) {
						$prefix = "VOICE EL" . ($bulk_dump_address_mid+1) . " LFO1";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Wave = " . $lfo_waves[$d[0x40]] . "\n";
						$dump .= "$prefix Key On Sync = " . on_off($d[0x41]) . "\n";
						$dump .= "$prefix Key On Delay Time = " . $d[0x42] . "\n";
						$dump .= "$prefix Speed = " . $d[0x43] . "\n";
						$dump .= "$prefix AMod Depth = " . $d[0x44] . "\n";
						$dump .= "$prefix PMod Depth = " . $d[0x45] . "\n";
						$dump .= "$prefix FMod Depth = " . $d[0x46] . "\n";
						$dump .= "$prefix Fade In Time = " . $d[0x47] . "\n";
					}
					else if ($bulk_dump_address_low == 0x50) {
						$prefix = "VOICE EL" . ($bulk_dump_address_mid+1) . " LFO2 COMMON";
						dump_raw_data($prefix, $ofs+1, $byte_count);
						$dump .= "$prefix Phase Offset  = " . $lfo_phase_offsets[$d[0x50]] . "\n";
						$dump .= "$prefix Box1 Depth Ratio = " . $d[0x51] . "\n";
						$dump .= "$prefix Box2 Depth Ratio = " . $d[0x52] . "\n";
						$dump .= "$prefix Box3 Depth Ratio = " . $d[0x53] . "\n";
					}
				}
			
				$ofs += $byte_count;
				$crc = ($data[++$ofs]);
			}
			else if (($b & 0xF0) == 10) { // Native Parameter Change
				$dump .= "Native Parameter Change\n";
			}
			else if (($b & 0xF0) == 20) { // Dump Request
				$dump .= "Dump Request\n";
			}
			else if (($b & 0xF0) == 30) { // Parameter Request
				$dump .= "Parameter Request\n";
			}
			else {
				$dump .= "Autre chose!!!\n";
			}
			
			if (($data[++$ofs]) != 0xF7) {
				echo "Error: 'F7' expected (SysEx End) at offset $ofs (" . sprintf("%02Xh", $ofs) . ")\n";
				break;
			}

			$ofs++;
		}
		
		array_push($outputs, $dump);
		
		if (!isset($_SERVER["HTTP_HOST"])) {
			fclose($fd);
		}
	}
	
	if (isset($_SERVER["HTTP_HOST"])) {
		echo "<pre>\n";
		$lines = array();
		if (count($outputs) == 1) { // Normal mode
			$lines = explode("\n", $outputs[0]);
		}
		else if (count($outputs) == 2) { // Diff mode
			$diffs = diff($outputs[0], $outputs[1]);
			if (!count($diffs))
				echo "No differences found";
			else  
				$lines = $diffs;			
		}
		// Pass the output thru the filter
		foreach ($lines as $ln) {
			if (strlen(trim($_POST["filter"]))) {
				if (strpos($ln, trim($_POST["filter"])) === false)
					continue;
			}
			echo htmlentities($ln) . "\n";
		}
		echo "</pre>\n";
	}
	else {
		foreach ($outputs as $o) {
			echo $o;
		}
	}	
?>