function _makeDigest($pwd, $nonce, $timestamp) { $txt = sha1($nonce . $timestamp . $pwd); $digest = base64_encode(_hex2bin($txt)); return $digest; }
function _getMsgStr($line) { $msg = explode(' ', $line); switch ($msg[1]) { case 'PrCh': // 0x0C eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // prog return chr(0xc0 + $ch - 1) . chr($p); break; case 'On': // 0x09 eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // note eval("\$" . $msg[4] . ';'); // vel return chr(0x90 + $ch - 1) . chr($n) . chr($v); break; case 'Off': // 0x08 eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // note eval("\$" . $msg[4] . ';'); // vel return chr(0x80 + $ch - 1) . chr($n) . chr($v); break; case 'PoPr': // 0x0A = PolyPressure eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // note eval("\$" . $msg[4] . ';'); // val return chr(0xa0 + $ch - 1) . chr($n) . chr($v); break; case 'Par': // 0x0B = ControllerChange eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // controller eval("\$" . $msg[4] . ';'); // val return chr(0xb0 + $ch - 1) . chr($c) . chr($v); break; case 'ChPr': // 0x0D = ChannelPressure eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // val return chr(0xd0 + $ch - 1) . chr($v); break; case 'Pb': // 0x0E = PitchBend eval("\$" . $msg[2] . ';'); // chan eval("\$" . $msg[3] . ';'); // val (2 Bytes!) $a = $v & 0x7f; // Bits 0..6 $b = $v >> 7 & 0x7f; // Bits 7..13 return chr(0xe0 + $ch - 1) . chr($a) . chr($b); break; // META EVENTS // META EVENTS case 'Seqnr': // 0x00 = sequence_number $num = chr($msg[2]); if ($msg[2] > 255) { _err("code broken around Seqnr event"); } return "ÿ{$num}"; break; case 'Meta': $type = $msg[2]; switch ($type) { case 'Text': //0x01: // Meta Text //0x01: // Meta Text case 'Copyright': //0x02: // Meta Copyright //0x02: // Meta Copyright case 'TrkName': //0x03: // Meta TrackName ???SeqName??? //0x03: // Meta TrackName ???SeqName??? case 'InstrName': //0x04: // Meta InstrumentName //0x04: // Meta InstrumentName case 'Lyric': //0x05: // Meta Lyrics //0x05: // Meta Lyrics case 'Marker': //0x06: // Meta Marker //0x06: // Meta Marker case 'Cue': //0x07: // Meta Cue $texttypes = array('Text', 'Copyright', 'TrkName', 'InstrName', 'Lyric', 'Marker', 'Cue'); $byte = chr(array_search($type, $texttypes) + 1); $start = strpos($line, '"') + 1; $end = strrpos($line, '"'); $txt = substr($line, $start, $end - $start); // MM: Todo: Len could also be more than one Byte (variable length; see. "Sequence/Track name specification) $len = chr(strlen($txt)); if ($len > 127) { _err("code broken (write varLen-Meta)"); } return "ÿ{$byte}{$len}{$txt}"; break; case 'TrkEnd': //0x2F return "ÿ/"; break; case '0x20': // 0x20 = ChannelPrefix $v = chr($msg[3]); return "ÿ {$v}"; break; case '0x21': // 0x21 = ChannelPrefixOrPort $v = chr($msg[3]); return "ÿ!{$v}"; break; default: _err("unknown meta event: {$type}"); exit; } break; case 'Tempo': // 0x51 $tempo = _getBytes((int) $msg[2], 3); return "ÿQ{$tempo}"; break; case 'SMPTE': // 0x54 = SMPTE offset $h = chr($msg[2]); $m = chr($msg[3]); $s = chr($msg[4]); $f = chr($msg[5]); $fh = chr($msg[6]); return "ÿT{$h}{$m}{$s}{$f}{$fh}"; break; case 'TimeSig': // 0x58 $zt = explode('/', $msg[2]); $z = chr($zt[0]); $t = chr(log($zt[1]) / log(2)); $mc = chr($msg[3]); $c = chr($msg[4]); return "ÿX{$z}{$t}{$mc}{$c}"; break; case 'KeySig': // 0x59 $vz = chr($msg[2]); $g = chr($msg[3] == 'major' ? 0 : 1); return "ÿY{$vz}{$g}"; break; case 'SeqSpec': // 0x7F = Sequencer specific data (Bs: 0 SeqSpec 00 00 41) $cnt = count($msg) - 2; $data = ''; for ($i = 0; $i < $cnt; $i++) { $data .= _hex2bin($msg[$i + 2]); } // MM: ToDo: Len >127 has to be variable length-encoded !!! $len = chr(strlen($data)); if ($len > 127) { _err('code broken (write varLen-Meta)'); } return "ÿ{$len}{$data}"; break; case 'SysEx': // 0xF0 = SysEx $start = strpos($line, 'f0'); $end = strrpos($line, 'f7'); $data = substr($line, $start + 3, $end - $start - 1); $data = _hex2bin(str_replace(' ', '', $data)); $len = chr(strlen($data)); return "ð{$len}" . $data; break; default: _err('unknown event: ' . $msg[1]); exit; } }