Пример #1
0
 /**
  * {@inheritdoc}
  */
 public function read()
 {
     $chunkID = BinaryReader::read($this->resource, 'a*', 4);
     if ($chunkID !== 'RIFF') {
         return false;
     }
     $this->riff->setChunkID($chunkID);
     $this->riff->setChunkSize(BinaryReader::read($this->resource, 'V', 4));
     $this->riff->setFormat(BinaryReader::read($this->resource, 'a*', 4));
     $this->fmt->setSubchunk1ID(BinaryReader::read($this->resource, 'a*', 4));
     $this->fmt->setSubchunk1Size(BinaryReader::read($this->resource, 'V', 4));
     $this->fmt->setAudioFormat(BinaryReader::read($this->resource, 'v', 2));
     $this->fmt->setNumChannels(BinaryReader::read($this->resource, 'v', 2));
     $this->fmt->setSampleRate(BinaryReader::read($this->resource, 'V', 4));
     $this->fmt->setByteRate(BinaryReader::read($this->resource, 'V', 4));
     $this->fmt->setBlockAlign(BinaryReader::read($this->resource, 'v', 2));
     $this->fmt->setBitsPerSample(BinaryReader::read($this->resource, 'v', 2));
     $this->fmt->setExtraParamSize(0);
     $this->fmt->setExtraParams(null);
     if ($this->fmt->getAudioFormat() != 1) {
         $this->fmt->setExtraParamSize(BinaryReader::read($this->resource, 'v', 2));
         $this->fmt->setExtraParams(BinaryReader::read($this->resource, 'a*', $this->fmt->getExtraParamSize()));
     }
     $this->data->setSubchunk2ID(BinaryReader::read($this->resource, 'a*', 4));
     $this->data->setSubchunk2Size(BinaryReader::read($this->resource, 'V', 4));
     switch ($this->fmt->getAudioFormat()) {
         case 1:
             $this->fmt->setAudioFormat('PCM');
             break;
         case 2:
             $this->fmt->setAudioFormat('Microsoft ADPCM');
             break;
         case 6:
             $this->fmt->setAudioFormat('ITU G.711 a-law');
             break;
         case 7:
             $this->fmt->setAudioFormat('ITU G.711 µ-law');
             break;
         case 17:
             $this->fmt->setAudioFormat('IMA ADPCM');
             break;
         case 20:
             $this->fmt->setAudioFormat('ITU G.723 ADPCM (Yamaha)');
             break;
         case 49:
             $this->fmt->setAudioFormat('GSM 6.10');
             break;
         case 64:
             $this->fmt->setAudioFormat('ITU G.721 ADPCM');
             break;
         case 80:
             $this->fmt->setAudioFormat('MPEG');
             break;
         case 65536:
             $this->fmt->setAudioFormat('Experimental');
             break;
     }
     return $this;
 }
 /**
  * @param int $width
  * @param int $height
  */
 public function run($width = self::WIDTH_DEFAULT, $height = self::HEIGHT_DEFAULT)
 {
     if (PHP_SAPI !== 'cli') {
         throw new \RuntimeException('Only cli');
     }
     $this->wavReader->read();
     $wavInfo = '';
     if ($fmt = $this->wavReader->getFmt()) {
         $wavInfo = vsprintf("AudioFormat: %s\tNumChannels: %s\tSampleRate: %s\tBitsPerSample:%s", [$fmt->getAudioFormat(), $fmt->getNumChannels(), $fmt->getSampleRate(), $fmt->getBitsPerSample()]);
     }
     $fourier = new FFT($this->dim);
     $peak = 2147483648;
     // pow(256, 4) / 2;
     $half = $this->dim / 2;
     // optimize cycle
     while (true) {
         $function = [];
         for ($dimCounter = 0; $dimCounter < $this->dim; ++$dimCounter) {
             $function[] = BinaryReader::read($this->resource, 'V', 4) / $peak;
         }
         $FFT = $fourier->fft($function);
         $absFFT = $fourier->getAbsFFT($FFT);
         $display = [];
         // clear terminal
         $this->render->renderLine("c");
         // Wav information
         $this->render->renderLine($wavInfo);
         // Build matrix
         // Scale only height
         //
         // ^            ^
         // |  *         |  *
         // | * *   to   | ***
         // |*   *       |*****
         // +------>     +------->
         for ($y = 0; $y < $height; ++$y) {
             for ($x = 0; $x < $half; ++$x) {
                 // scale by height
                 $value = (int) $absFFT[$x] / (max($absFFT) + 1.0E-5) * $height;
                 $display[$y][$x] = false;
                 for ($m = 0; $m <= $value; ++$m) {
                     $display[$m][$x] = true;
                 }
             }
         }
         // TODO: Width scale
         $this->render->render($display, $height, $half);
     }
 }