// Scaling Variables $golden: 1.618; $minor-second: 1.067; $major-second: 1.125; $minor-third: 1.2; $major-third: 1.25; $perfect-fourth: 1.333; $augmented-fourth: 1.414; $perfect-fifth: 1.5; $minor-sixth: 1.6; $major-sixth: 1.667; $minor-seventh: 1.778; $major-seventh: 1.875; $octave: 2; $major-tenth: 2.5; $major-eleventh: 2.667; $major-twelfth: 3; $double-octave: 4;

@function modular-scale($value, $increment, $ratio) {

$v1: nth($value, 1);
$v2: nth($value, length($value));
$value: $v1;
// scale $v2 to just above $v1
@while $v2 > $v1 {
  $v2: ($v2 / $ratio); // will be off-by-1
}
@while $v2 < $v1 {
  $v2: ($v2 * $ratio); // will fix off-by-1
}
// check AFTER scaling $v2 to prevent double-counting corner-case
$double-stranded: $v2 > $v1;
@if $increment > 0 {
  @for $i from 1 through $increment {
    @if $double-stranded and ($v1 * $ratio) > $v2 {
      $value: $v2;
      $v2: ($v2 * $ratio);
    } @else {
      $v1: ($v1 * $ratio);
      $value: $v1;
    }
  }
}
@if $increment < 0 {
  // adjust $v2 to just below $v1
  @if $double-stranded {
    $v2: ($v2 / $ratio);
  }
  @for $i from $increment through -1 {
    @if $double-stranded and ($v1 / $ratio) < $v2 {
      $value: $v2;
      $v2: ($v2 / $ratio);
    } @else {
      $v1: ($v1 / $ratio);
      $value: $v1;
    }
  }
}
@return $value;

}