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