// 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;
}
