public function closestDown($step = 'C', $alter = 0, $allowEqual = true) {
        if (count(func_get_args()) == 1 && $step instanceof Pitch && $step->isHeightless()) {
            $alter = $step->alter;
            $step = $step->step;
        }
        $base = new Pitch($step, $alter, 20);
        for ($i=0; $i<25; $i++) {
            $base->transpose(-12, $alter);
            if ($this->isHigherThan($base)) {
                return $base;
            }
            if ($allowEqual && $base->isEnharmonic($this)) {
                return $base;
            }
        }
        // this may happen if the pitch is really high or low
        return null;
    }