private function drawBlocks($freqs)
{
$steps = 7;
$resolution = $this->rows * $steps;
$max = max($freqs);
$blocks = [];
for ($row = 1; $row <= $this->rows; $row++) {
$blocks[$row] = [];
foreach ($freqs as &$freq) {
if (null === $freq || 0 === $freq) {
$blocks[$row][] = ' ';
continue;
}
$scale = 1 / $max * $freq;
$value = $resolution * $scale;
$lowerLimit = $resolution - $steps * $row;
$upperLimit = $lowerLimit + $steps;
if ($value >= $lowerLimit && $value < $upperLimit) {
$blockIndex = $value % $steps;
$blocks[$row][] = $this->blocks[$blockIndex];
} elseif ($value < $lowerLimit) {
$blocks[$row][] = ' ';
} else {
$blocks[$row][] = $this->blocks[7];
}
}
}
$output = [];
foreach ($blocks as $blockRow) {
$output[] = implode('', $blockRow);
}
$output = implode(sprintf("[%sD[1B", count($blocks[1])), $output);
$this->output->write($output);
}