Esempio n. 1
0
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);
        }
    }
}
Esempio n. 2
0
 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;
         }
     }
 }