Skip to content

Commit

Permalink
refactor(interval): ♻️ consistently rename abs related variables
Browse files Browse the repository at this point in the history
Signed-off-by: Albert Mañosa <26429103+albertms10@users.noreply.github.com>
  • Loading branch information
albertms10 committed May 13, 2024
1 parent 249b075 commit 6543385
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 26 deletions.
4 changes: 2 additions & 2 deletions lib/src/interval/interval.dart
Original file line number Diff line number Diff line change
Expand Up @@ -381,10 +381,10 @@ final class Interval
T scalable, {
required int distance,
}) sync* {
final distanceAbs = distance.abs();
final absDistance = distance.abs();
yield scalable;
var last = scalable;
for (var i = 0; i < distanceAbs; i++) {
for (var i = 0; i < absDistance; i++) {
yield last =
last.transposeBy(descending(isDescending: distance.isNegative));
}
Expand Down
24 changes: 13 additions & 11 deletions lib/src/interval/size.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,22 @@ extension type const Size._(int size) implements int {

/// Map a semitones value to a value between 0 and 12.
static int _normalizeSemitones(int semitones) {
final absoluteSemitones = semitones.abs();
return absoluteSemitones == chromaticDivisions
final absSemitones = semitones.abs();

return absSemitones == chromaticDivisions
? chromaticDivisions
: absoluteSemitones % chromaticDivisions;
: absSemitones % chromaticDivisions;
}

/// Scale a given normalized Size (one of the entries in [_sizeToSemitones])
/// to the given [semitones].
factory Size._scaleToSemitones(Size normalizedSize, int semitones) {
final absoluteSemitones = semitones.abs();
if (absoluteSemitones == chromaticDivisions) {
final absSemitones = semitones.abs();
if (absSemitones == chromaticDivisions) {
return Size(normalizedSize * semitones.sign);
}

final absResult =
normalizedSize + (absoluteSemitones ~/ chromaticDivisions) * 7;
final absResult = normalizedSize + (absSemitones ~/ chromaticDivisions) * 7;

return Size(absResult * semitones.nonZeroSign);
}
Expand All @@ -101,6 +101,7 @@ extension type const Size._(int size) implements int {
.firstWhereOrNull((entry) => entry.value == normalizedSemitones)
?.key;
if (matchingSize == null) return null;

return Size._scaleToSemitones(matchingSize, semitones);
}

Expand All @@ -112,6 +113,7 @@ extension type const Size._(int size) implements int {
_sizeToSemitones.entries,
(entry) => (normalizedSemitones - entry.value).abs(),
)!;

return Size._scaleToSemitones(closest.key, semitones);
}

Expand All @@ -127,20 +129,20 @@ extension type const Size._(int size) implements int {
/// (-Size.ninth).semitones == -13
/// ```
int get semitones {
final simpleAbs = simple.abs();
final absSimple = simple.abs();
final octaveShift = chromaticDivisions * (absShift ~/ octave);
// We exclude perfect octaves (simplified as 8) from the lookup to consider
// them 0 (as if they were modulo `Size.octave`).
final size = Size(simpleAbs == octave ? 1 : simpleAbs);
final size = Size(absSimple == octave ? 1 : absSimple);

return (_sizeToSemitones[size]! + octaveShift) * sign;
}

/// The absolute [Size] value taking octave shift into account.
int get absShift {
final sizeAbs = abs();
final absSize = abs();

return sizeAbs + sizeAbs ~/ octave;
return absSize + absSize ~/ octave;
}

/// The [PerfectQuality.diminished] or [ImperfectQuality.diminished] interval
Expand Down
2 changes: 1 addition & 1 deletion test/src/interval/interval_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void main() {
});
});

group('fromSemitones()', () {
group('.fromSemitones()', () {
test('creates a new Interval from semitones', () {
expect(Interval.fromSemitones(0), Interval.P1);
expect(Interval.fromSemitones(2), Interval.M2);
Expand Down
26 changes: 14 additions & 12 deletions test/src/interval/size_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,18 +71,20 @@ void main() {
});

test(
'returns the nearest Size when no Size'
' corresponds exactly to the given semitones', () {
expect(Size.nearestFromSemitones(-4), -Size.third);
expect(Size.nearestFromSemitones(-2), -Size.second);
expect(Size.nearestFromSemitones(2), Size.second);
expect(Size.nearestFromSemitones(4), Size.third);
expect(Size.nearestFromSemitones(6), Size.fourth);
expect(Size.nearestFromSemitones(9), Size.sixth);
expect(Size.nearestFromSemitones(11), Size.seventh);
expect(Size.nearestFromSemitones(14), Size.ninth);
expect(Size.nearestFromSemitones(-20), -Size.thirteenth);
});
'returns the nearest Size when no Size'
' corresponds exactly to the given semitones',
() {
expect(Size.nearestFromSemitones(-4), -Size.third);
expect(Size.nearestFromSemitones(-2), -Size.second);
expect(Size.nearestFromSemitones(2), Size.second);
expect(Size.nearestFromSemitones(4), Size.third);
expect(Size.nearestFromSemitones(6), Size.fourth);
expect(Size.nearestFromSemitones(9), Size.sixth);
expect(Size.nearestFromSemitones(11), Size.seventh);
expect(Size.nearestFromSemitones(14), Size.ninth);
expect(Size.nearestFromSemitones(-20), -Size.thirteenth);
},
);
});

group('.perfect', () {
Expand Down

0 comments on commit 6543385

Please sign in to comment.