function extractGenerator($gen, $looptime) { global $sf; $genOper = $gen['sfGenOper']; if ($genOper === 41) { // instrument $instIdx = $gen['Amount']; $inst = $sf->pdtaMap['inst'][$instIdx]; extractInstrument($inst, $looptime); } else { if ($genOper === 53) { // sampleID $sampleIdx = $gen['Amount']; $sample = $sf->pdtaMap['shdr'][$sampleIdx]; echo IO_SoundFont_Sample::string($sample) . PHP_EOL; // $name = $sample['SampleName']; $sampleRate = $sample['SampleRate']; $start = $sample['Start']; $end = $sample['End']; $data = $sf->sfbk['sdta']['smpl']->data; if (is_null($looptime)) { $sampleData = substr($data, $start * 2, ($end - $start + 1) * 2); } else { $startLoop = $sample['StartLoop']; $endLoop = $sample['EndLoop']; $loopCount = $looptime * $sampleRate / ($endLoop - $startLoop); $loopCount = ceil($loopCount); // round up $sampleData = substr($data, $start * 2, ($startLoop - $start) * 2); $sampleData .= str_repeat(substr($data, $startLoop * 2, ($endLoop - $startLoop) * 2), $loopCount); $sampleData .= substr($data, $endLoop * 2, ($end - $endLoop + 1) * 2); } $nChannel = 1; // 1:monoral, 2:stereo $sampleBits = 16; // 8 or 16 $waveData = makeWaveData($sampleData, $nChannel, $sampleBits, $sampleRate); file_put_contents($name . ".wav", $waveData); } } }
function generatorTree($gen, $indentLevel) { $indentSpace = str_repeat(" ", $indentLevel); echo $indentSpace . IO_SoundFont_Generator::string($gen) . PHP_EOL; $genOper = $gen['sfGenOper']; if ($genOper === 41) { // instrument $instIdx = $gen['Amount']; $inst = $this->pdtaMap['inst'][$instIdx]; $this->instrumentTree($inst, $indentLevel + 1); } else { if ($genOper === 53) { // sampleID $sampleIdx = $gen['Amount']; $sample = $this->pdtaMap['shdr'][$sampleIdx]; echo $indentSpace . IO_SoundFont_Sample::string($sample) . PHP_EOL; } } }