Skip to content

Commit

Permalink
Merge pull request #27 from kilmc/add-parallel-modes
Browse files Browse the repository at this point in the history
[feat] Add parallel modes
  • Loading branch information
kilmc authored Nov 4, 2023
2 parents 9a1fa7e + 0a2b410 commit 6caf579
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/strange-squids-pretend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@kilmc/music-fns": minor
---

Add parallel modes to key
64 changes: 64 additions & 0 deletions src/public/getKey/getKey.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,68 @@ describe('makeKey', () => {
expect(chordNumeralsResult).toStrictEqual(chordNumerals);
}
);

it('gets relative modes', () => {
expect(getKey('C major')?.relativeModes).toStrictEqual([
'C major',
'D dorian',
'E phrygian',
'F lydian',
'G mixolydian',
'A minor',
'B locrian',
]);

expect(getKey('C melodic minor')?.relativeModes).toStrictEqual([
'C melodic minor',
'D dorian flat 2',
'Eb lydian augmented',
'F lydian dominant',
'G mixolydian flat 6',
'A aeolian flat 2',
'B super locrian',
]);

expect(getKey('C melodic minor')?.relativeModes).toStrictEqual([
'C melodic minor',
'D dorian flat 2',
'Eb lydian augmented',
'F lydian dominant',
'G mixolydian flat 6',
'A aeolian flat 2',
'B super locrian',
]);
});

it('gets parallel modes', () => {
expect(getKey('C major')?.parallelModes).toStrictEqual([
'C major',
'C dorian',
'C phrygian',
'C lydian',
'C mixolydian',
'C minor',
'C locrian',
]);

expect(getKey('C melodic minor')?.parallelModes).toStrictEqual([
'C melodic minor',
'C dorian flat 2',
'C lydian augmented',
'C lydian dominant',
'C mixolydian flat 6',
'C aeolian flat 2',
'C super locrian',
]);

expect(getKey('C melodic minor')?.parallelModes).toStrictEqual([
'C melodic minor',
'C dorian flat 2',
'C lydian augmented',
'C lydian dominant',
'C mixolydian flat 6',
'C aeolian flat 2',
'C super locrian',
]);
});
});
4 changes: 4 additions & 0 deletions src/public/getKey/getKey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ModeRoot } from '../../consts/keys.js';
import { Note } from '../../consts/notes.js';
import { ScaleType } from '../../consts/scales.js';
import { Chord } from '../getChord/getChord.js';
import { getParallelModeNames } from '../getScale/getParallelModeNames.js';
import { getRelativeModeNames } from '../getScale/getRelativeModeNames.js';
import { getScale } from '../getScale/getScale.js';
import { getKeyChords } from './getKeyChords.js';
Expand All @@ -13,6 +14,7 @@ export type Key = {
notes: Note[];
chords: Chord[];
relativeModes?: string[];
parallelModes?: string[];
modeOf?: ModeRoot;
};

Expand All @@ -24,6 +26,7 @@ export const getKey = (input: string): Key | undefined => {
if (chords === undefined) return undefined;

const relativeModes = getRelativeModeNames(scale);
const parallelModes = getParallelModeNames(scale);

return {
name: scale.name,
Expand All @@ -33,5 +36,6 @@ export const getKey = (input: string): Key | undefined => {
chords: chords,
modeOf: scale.modeOf,
relativeModes,
parallelModes,
};
};
10 changes: 10 additions & 0 deletions src/public/getScale/getParallelModeNames.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { modalScaleDefinitions } from '../../consts/scales.js';
import { Scale } from './getScale.js';

export const getParallelModeNames = (scale: Scale) => {
if (scale.modeOf === undefined) return undefined;

return modalScaleDefinitions[scale.modeOf].map(
(mode) => `${scale.root} ${mode.name}`
);
};

0 comments on commit 6caf579

Please sign in to comment.