Advertisement
Soneek

Rewrite a BRSTM as an HPS

Apr 29th, 2016
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.85 KB | None | 0 0
  1. <?
  2.  
  3. // open a brstm in binary mode as $fp
  4.  
  5. fseek($fp, 8, SEEK_SET);
  6. $rstmSize = hexdec(bin2hex(fread($fp, 4)));
  7. fseek($fp, 16, SEEK_SET);   // Reading section offsets
  8. $rstmInfoOffset = hexdec(bin2hex(fread($fp, 4)));  
  9. $rstmInfoSize = hexdec(bin2hex(fread($fp, 4)));
  10. $rstmSeekOffset = hexdec(bin2hex(fread($fp, 4)));
  11. $rstmSeekSize = hexdec(bin2hex(fread($fp, 4)));
  12. $rstmDataOffset = hexdec(bin2hex(fread($fp, 4)));
  13. $rstmDataSize = hexdec(bin2hex(fread($fp, 4))) - 0x20;
  14. fseek($fp, 0x60, SEEK_SET);
  15. $format = hexdec(bin2hex(fread($fp, 1)));
  16. $loopFlag = hexdec(bin2hex(fread($fp, 1)));
  17. $channelCount = hexdec(bin2hex(fread($fp, 1)));
  18. $nibbleCount = $rstmDataSize / $channelCount * 2;
  19. fseek($fp, 1, SEEK_CUR);
  20. $sampleRate = hexdec(bin2hex(fread($fp, 2)));
  21. fseek($fp, 2, SEEK_CUR);
  22. $loopStart = hexdec(bin2hex(fread($fp, 4)));
  23. $loopStartNibbles = floor(($loopStart * $channelCount * 8 / 14));
  24. $sampleCount = hexdec(bin2hex(fread($fp, 4)));
  25. //$loopEndNibbles = $nibbleCount - 1;
  26. $loopEndNibbles = floor(($sampleCount * $channelCount * 8 / 14) - 1);
  27.  
  28. // fetching coefficients, initial state, and loop context
  29. fseek($fp, 0x5c, SEEK_SET);
  30. $coeffPtr1 = hexdec(bin2hex(fread($fp, 4)));
  31. fseek($fp, 0x50 + $coeffPtr1, SEEK_SET);
  32. $coeffPtr2 = hexdec(bin2hex(fread($fp, 4)));
  33. fseek($fp, 0x50 + $coeffPtr2, SEEK_SET);
  34. $coeffL =  fread($fp, 0x30);
  35. if ($channelCount == 2) {
  36.     fseek($fp, 8, SEEK_CUR);
  37.     $coeffR =  fread($fp, 0x30);
  38. }
  39. fseek($fp, 0x78, SEEK_SET);
  40. $interleave = hexdec(bin2hex(fread($fp, 4)));
  41. fseek($fp, 0x88, SEEK_SET);
  42. $interleaveShortBlock = hexdec(bin2hex(fread($fp, 4)));
  43.  
  44. if ($downloadtype == "hps") {
  45.     print(" HALPST" . pack("CNN", 0, $sampleRate, $channelCount));
  46.     $firstBlockSize = $blockSize = 0x10000;
  47.     // writing first channel
  48.     print(pack("NNNN", $blockSize, $channelCount, $nibbleCount, 2) . substr($coeffL, 0, 0x28));
  49.     if ($channelCount == 2)
  50.         print(pack("NNNN", $blockSize, $channelCount, $nibbleCount, 2) . substr($coeffR, 0, 0x28));
  51.     // Writing blocks
  52.     if ($loopFlag) {
  53.         $preLoopBlockCount = floor($loopStart/57344);
  54.         if ($loopStart < 57344) {
  55.             if ($loopStart)
  56.                 $preLoopBlockSize = $loopStart * 16/14 + 0x20;
  57.             else
  58.                 $preLoopBlockSize = 0;
  59.             $loopStartBlock = 0x80 + $preLoopBlockSize;
  60.         }
  61.         else if ($loopStart % 57344 == 0)
  62.             $preLoopBlockSize = 0;
  63.        
  64.         else {
  65.             $preLoopBlockSize = ($loopStart % 57344) * 16/14 + 0x20;
  66.         }
  67.         $loopStartBlock = 0x80 + $preLoopBlockCount * ($blockSize + 0x20) + $preLoopBlockSize;
  68.     }
  69.     else {
  70.         $preLoopBlockCount = $preLoopBlockSize = 0;
  71.         $loopStartBlock = 0xffffffff;
  72.     }
  73.     $blockCount = floor(($rstmDataSize - $loopStartNibbles - $interleaveShortBlock * 2) / 0x10000);
  74.     $lastBlockSize = ($rstmDataSize - $loopStartNibbles) % 0x10000;
  75.     $currentOffset = 0x80; 
  76.     header( 'Content-Length: ' . 0x80 + ($preLoopBlockCount + $blockCount) * ($blockSize + 0x20) + $preLoopBlockSize + 0x20 + $lastBlockSize + 0x20 );
  77.     fseek($fp, $rstmDataOffset + 0x20, SEEK_SET);
  78.     for ($i = 0; $i < $preLoopBlockCount; $i++) {
  79.         print(pack("NNN", $blockSize, $blockSize-1, $currentOffset + $blockSize + 0x20) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
  80.         $currentOffset += $blockSize + 0x20;
  81.         print(fread($fp, 0x2000));
  82.         for ($j = 0; $j < ($blockSize / 0x4000 - 1); $j++) {
  83.             fseek($fp, 0x2000, SEEK_CUR);
  84.             print(fread($fp, 0x2000));         
  85.         }
  86.         fseek($fp, -($j * 0x4000), SEEK_CUR);
  87.         print(fread($fp, 0x2000));
  88.         for ($j = 0; $j < ($blockSize / 0x4000 - 1); $j++) {
  89.             fseek($fp, 0x2000, SEEK_CUR);
  90.             print(fread($fp, 0x2000));
  91.         }      
  92.     }
  93.     // Printing block before loopStart
  94.     if ($preLoopBlockSize) {
  95.     print(pack("NNN", $preLoopBlockSize - 0x20, $preLoopBlockSize-0x21, $currentOffset + $preLoopBlockSize) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
  96.         $currentOffset += $preLoopBlockSize;
  97.         print(fread($fp, 0x2000));
  98.         for ($j = 0; $j < (($preLoopBlockSize-0x20) / 0x4000 - 1); $j++) {
  99.             fseek($fp, 0x2000, SEEK_CUR);
  100.             print(fread($fp, 0x2000));         
  101.         }
  102.         fseek($fp, -($j * 0x4000), SEEK_CUR);
  103.         print(fread($fp, 0x2000));
  104.         for ($j = 0; $j < (($preLoopBlockSize-0x20) / 0x4000 - 1); $j++) {
  105.             fseek($fp, 0x2000, SEEK_CUR);
  106.             print(fread($fp, 0x2000));
  107.         }
  108.     }
  109.     // Writing rest
  110.     for ($i = 0; $i < $blockCount; $i++) {
  111.         print(pack("NNN", $blockSize, $blockSize-1, $currentOffset + $blockSize + 0x20) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
  112.         $currentOffset += $blockSize + 0x20;
  113.         print(fread($fp, 0x2000));
  114.         fseek($fp, 0x2000, SEEK_CUR);
  115.         print(fread($fp, 0x2000));
  116.         fseek($fp, 0x2000, SEEK_CUR);
  117.         print(fread($fp, 0x2000));
  118.         fseek($fp, 0x2000, SEEK_CUR);
  119.         print(fread($fp, 0x2000));
  120.         fseek($fp, -0xc000, SEEK_CUR);
  121.         print(fread($fp, 0x2000));
  122.         fseek($fp, 0x2000, SEEK_CUR);
  123.         print(fread($fp, 0x2000));
  124.         fseek($fp, 0x2000, SEEK_CUR);
  125.         print(fread($fp, 0x2000));
  126.         fseek($fp, 0x2000, SEEK_CUR);
  127.         print(fread($fp, 0x2000));
  128.     }
  129.     // Writing last block  
  130.     print(pack("NNN", $lastBlockSize, $lastBlockSize - 1, $loopStartBlock) . substr($coeffL, 0x22, 6) . pack("n", 0) . substr($coeffR, 0x22, 6) . pack("nN", 0, 0));
  131.     $i = 0;
  132.     fseek($fp, -($lastBlockSize), SEEK_END);
  133.     if ($lastBlockSize >= 0x4000) {
  134.         print(fread($fp, 0x2000));
  135.         fseek($fp, 0x2000, SEEK_CUR);
  136.         for ($i = 0; $i < (floor($lastBlockSize / 0x4000) - 1); $i++) {
  137.             print(fread($fp, 0x2000));
  138.             fseek($fp, 0x2000, SEEK_CUR);
  139.         }
  140.     }
  141.    
  142.     print(fread($fp, $interleaveShortBlock));
  143.    
  144.     fseek($fp, -$lastBlockSize, SEEK_END);
  145.     if ($lastBlockSize >= 0x4000) {
  146.         fseek($fp, 0x2000, SEEK_CUR);  
  147.         print(fread($fp, 0x2000));
  148.         for ($i = 0; $i < (floor($lastBlockSize / 0x4000) - 1); $i++) {
  149.             fseek($fp, 0x2000, SEEK_CUR);
  150.             print(fread($fp, 0x2000));
  151.         }
  152.     }
  153.     fseek($fp, -($interleaveShortBlock), SEEK_END);
  154.     print(fread($fp, $interleaveShortBlock));
  155. }
  156.  
  157. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement