function parse($sfdata) { $reader = new IO_Bit(); $reader->input($sfdata); $length = strlen($sfdata); $id = $reader->getData(4); // 'RIFF' if ($id !== 'RIFF') { throw new IO_SoundFont_Exception("non RIFF fourcc"); } $size = $reader->getUI32LE(); if ($length !== $size + 8) { fputs(STDERR, "parse: illegal length({$length}) and RIFF size({$size})\n"); } $id = $reader->getData(4); // 'sfbk' if ($id !== 'sfbk') { throw new IO_SoundFont_Exception("non sfbk fourcc"); } $info = $this->parseChunkLIST($reader); $sdta = $this->parseChunkLIST($reader); $pdta = $this->parseChunkLIST($reader); $this->sfbk = array('INFO' => $info, 'sdta' => $sdta, 'pdta' => $pdta); return true; }
function parse($swfdata) { $reader = new IO_Bit(); $reader->input($swfdata); $this->_swfdata = $swfdata; /* SWF Header */ $this->_headers['Signature'] = $reader->getData(3); $this->_headers['Version'] = $reader->getUI8(); $this->_headers['FileLength'] = $reader->getUI32LE(); if ($this->_headers['Signature'][0] == 'C') { // CWS の場合、FileLength の後ろが zlib 圧縮されている $uncompressed_data = gzuncompress(substr($swfdata, 8)); if ($uncompressed_data === false) { return false; } list($byte_offset, $dummy) = $reader->getOffset(); $reader->setOffset(0, 0); $swfdata = $reader->getData($byte_offset) . $uncompressed_data; $reader = new IO_Bit(); $reader->input($swfdata); $this->_swfdata = $swfdata; $reader->setOffset($byte_offset, 0); } /* SWF Movie Header */ $this->_headers['FrameSize'] = IO_SWF_Type_RECT::parse($reader); $reader->byteAlign(); $this->_headers['FrameRate'] = $reader->getUI16LE(); $this->_headers['FrameCount'] = $reader->getUI16LE(); list($this->_header_size, $dummy) = $reader->getOffset(); /* SWF Tags */ while (true) { $swfInfo = array('Version' => $this->_headers['Version']); $tag = new IO_SWF_Tag($swfInfo); $tag->parse($reader); $this->_tags[] = $tag; if ($tag->code == 0) { // END Tag break; } } return true; }
function parse($smafdata) { $reader = new IO_Bit(); $reader->input($smafdata); $this->headers['ID'] = $reader->getData(4); $size = $reader->getUI32BE(4); $this->headers['Size'] = $size; while ($reader->hasNextData(8)) { $this->chunks = $this->parseDataChunks($reader); } }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); if ($tagCode != 8) { // ! JPEGTable $this->_CharacterID = $reader->getUI16LE(); } if ($tagCode == 35) { // DefgineBitsJPEG3 $alphaDataOffset = $reader->getUI32LE(); $this->_AlphaDataOffset = $alphaDataOffset; } if ($tagCode != 35) { // ! DefgineBitsJPEG3 $this->_JPEGData = $reader->getDataUntil(false); } else { $this->_JPEGData = $reader->getData($alphaDataOffset); $this->_ZlibBitmapAlphaData = $reader->getDataUntil(false); } }
function parseChunkData() { if (isset($this->detail)) { return; } $detailData = array(); $id = $this->id; $reader = new IO_Bit(); $reader->input($this->data); $this->data = null; // XXX switch ($id) { // INFO sub-chunks case 'ifil': $detailData['sfVersionMajor'] = $reader->getUI16LE(); $detailData['sfVersionMinor'] = $reader->getUI16LE(); break; case 'INAM': $detailData['sfName'] = $this->data; // String break; case 'isng': $detailData['sfEngine'] = $this->data; // String break; case 'IENG': $detailData['sfEngineers'] = $this->data; // String break; case 'ISFT': $detailData['sfTools'] = $this->data; // String break; case 'ICMT': $detailData['Comments'] = $this->data; // String break; case 'ICOP': $detailData['Copyright'] = $this->data; // String break; // sdta sub-chunks // sdta sub-chunks case 'smpl': $detailData['Samples'] = $this->data; // String break; // pdta sub-chunks // pdta sub-chunks case 'phdr': $detailData = array(); while ($reader->hasNextData()) { $preset = array(); $presetName = explode("", $reader->getData(20)); $preset['PresetName'] = $presetName[0]; $preset['Preset'] = $reader->getUI16LE(); $preset['Bank'] = $reader->getUI16LE(); $preset['PresetBagNdx'] = $reader->getUI16LE(); $preset['Library'] = $reader->getUI32LE(); $preset['Genre'] = $reader->getUI32LE(); $preset['MorphologyGenre'] = $reader->getUI32LE(); $detailData[] = $preset; } break; case 'pbag': $detailData = array(); while ($reader->hasNextData()) { $presetBag = array(); $presetBag['GenNdx'] = $reader->getUI16LE(); $presetBag['ModNdx'] = $reader->getUI16LE(); $detailData[] = $presetBag; } break; case 'pmod': case 'imod': $detailData = array(); while ($reader->hasNextData()) { $sfMod = array(); $sfMod['sfModSrcOper'] = IO_SoundFont_Modulator::parse($reader); $sfMod['sfModDestOper'] = $reader->getUI16LE(); $sfMod['modAmount'] = $reader->getSI16LE(); $sfMod['sfModAmtSrcOper'] = IO_SoundFont_Modulator::parse($reader); $sfMod['sfModTransOper'] = $reader->getUI16LE(); $detailData[] = $sfMod; } break; case 'pgen': case 'igen': $detailData = array(); while ($reader->hasNextData()) { $detailData[] = IO_SoundFont_Generator::parse($reader); } break; case 'inst': $detailData = array(); while ($reader->hasNextData()) { $sfInst = array(); $InstName = explode("", $reader->getData(20)); $sfInst['InstName'] = $InstName[0]; $sfInst['InstBagNdx'] = $reader->getSI16LE(); $detailData[] = $sfInst; } break; case 'ibag': $detailData = array(); while ($reader->hasNextData()) { $presetBag = array(); $presetBag['GenNdx'] = $reader->getUI16LE(); $presetBag['ModNdx'] = $reader->getUI16LE(); $detailData[] = $presetBag; } break; case 'shdr': $detailData = array(); while ($reader->hasNextData()) { $sfSample = array(); $SampleName = explode("", $reader->getData(20)); $sfSample['SampleName'] = $SampleName[0]; $sfSample['Start'] = $reader->getUI32LE(); $sfSample['End'] = $reader->getUI32LE(); $sfSample['StartLoop'] = $reader->getUI32LE(); $sfSample['EndLoop'] = $reader->getUI32LE(); $sfSample['SampleRate'] = $reader->getUI32LE(); $sfSample['OriginalPitch'] = $reader->getUI8(); $sfSample['PitchCorrection'] = $reader->getSI8(); $sfSample['SampleLink'] = $reader->getUI16LE(); $sfSample['SampleType'] = $reader->getUI16LE(); $detailData[] = $sfSample; } break; default: return; // nothing to do break; } $this->detail = $detailData; }
function _splitChunk($eoiFinish = true, $sosScan = true) { $bitin = new IO_Bit(); $bitin->input($this->_jpegdata); while ($bitin->hasNextData()) { $marker1 = $bitin->getUI8(); if ($marker1 != 0xff) { fprintf(STDERR, "dumpChunk: marker1=0x%02X", $marker1); return false; } $marker2 = $bitin->getUI8(); switch ($marker2) { case 0xd8: // SOI (Start of Image) $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null); continue; case 0xd9: // EOI (End of Image) $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null); if ($eoiFinish) { break 2; // while break; } continue; case 0xda: // SOS if ($sosScan === false) { $remainData = $bitin->getDataUntil(false); $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $remainData, 'length' => null); break 2; // while break; } case 0xd0: case 0xd1: case 0xd2: case 0xd3: // RST // RST case 0xd4: case 0xd5: case 0xd6: case 0xd7: // RST list($chunk_data_offset, $dummy) = $bitin->getOffset(); while (true) { $next_marker1 = $bitin->getUI8(); if ($next_marker1 != 0xff) { continue; } $next_marker2 = $bitin->getUI8(); if ($next_marker2 == 0x0) { continue; } $bitin->incrementOffset(-2, 0); // back from next marker list($next_chunk_offset, $dummy) = $bitin->getOffset(); $length = $next_chunk_offset - $chunk_data_offset; $bitin->setOffset($chunk_data_offset, 0); $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length), 'length' => null); break; } break; default: $length = $bitin->getUI16BE(); $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length - 2), 'length' => $length); continue; } } }
function parse($mfidata) { $reader = new IO_Bit(); $reader->input($mfidata); // Header Part $identifier = $reader->getData(4); if ($identifier != 'melo') { throw new Exception('Identifer($identifier) is not melo'); } $this->headers['Identifier'] = $identifier; $fileLength = $reader->getUI32BE(); $realFileLength = strlen($mfidata); if ($fileLength != $realFileLength - 8) { throw new Exception("FileLength({$fileLength}) is not real FileLength({$realFileLength}) - 8"); } $this->headers['FileLength'] = $fileLength; $offsetToTrack = $reader->getUI16BE(); $this->headers['OffsetToTrack'] = $offsetToTrack; $this->headers['DataTypeMajor'] = $reader->getUI8(); $this->headers['DataTypeMinor'] = $reader->getUI8(); $this->headers['NumberOfTrack'] = $reader->getUI8(); // Data Information Part $reader_di = new IO_Bit(); $reader_di->input($reader->getData($offsetToTrack - 3)); $note_message_length_info = 0; while ($reader_di->hasNextData(6)) { $info = array(); $identifer = $reader_di->getData(4); $length = $reader_di->getUI16BE(); $info['Identifer'] = $identifer; $info['Length'] = $length; switch ($identifer) { case 'titl': case 'copy': case 'prot': case 'date': $data = $reader_di->getData($length); break; case 'sorc': $data = $reader_di->getUI8($length); break; case 'note': case 'exst': $data = $reader_di->getUI16BE($length); if ($identifer == 'note') { $note_message_length_info = $data; } break; case 'vers': $data = $reader_di->getUI32BE($length); break; } $info['Data'] = $data; $this->datainfos[] = $info; } // Track Part while ($reader->hasNextData(8)) { $track = array(); $track['Identifer'] = $reader->getData(4); $length = $reader->getUI32BE(); $track['Length'] = $length; $reader_ev = new IO_Bit(); $reader_ev->input($reader->getData($length)); $track['Events'] = array(); while ($reader_ev->hasNextData(3)) { $event = array(); $event['DeltaTime'] = $reader_ev->getUI8(); $statusInfo = $reader_ev->getUI8(); $event['StatusInfo'] = $statusInfo; switch ($statusInfo) { default: $event['Data'] = $reader_ev->getUI8(); if ($note_message_length_info == 1) { // MFi2 $event['Data2'] = $reader_ev->getUI8(); } break; case 0xff: $statusInfo2 = $reader_ev->getUI8(); $event['StatusInfo2'] = $statusInfo2; switch ($statusInfo2) { default: $event['Data'] = $reader_ev->getUI8(); break; case 0xf0: case 0xf1: case 0xff: $length = $reader_ev->getUI16BE(); $event['Length'] = $length; $event['Data'] = $reader_ev->getData($length); break; } } $track['Events'][] = $event; } $this->tracks[] = $track; } }