35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { VibePreset } from '../vibes';
|
|
import {
|
|
GardenAudioChord,
|
|
gardenAudioConfig,
|
|
GardenAudioVibeProfile,
|
|
} from './garden-audio-config';
|
|
|
|
export const getVibeProfile = (vibe: VibePreset): GardenAudioVibeProfile => vibe.audio;
|
|
|
|
export const getChordIntervals = (
|
|
chord: GardenAudioChord,
|
|
openVoicing: boolean
|
|
): Array<number> => {
|
|
if (openVoicing) {
|
|
return chord.quality === 'major'
|
|
? gardenAudioConfig.generativePiano.chordVoicings.majorOpen
|
|
: gardenAudioConfig.generativePiano.chordVoicings.minorOpen;
|
|
}
|
|
|
|
return chord.quality === 'major'
|
|
? gardenAudioConfig.generativePiano.chordVoicings.majorClosed
|
|
: gardenAudioConfig.generativePiano.chordVoicings.minorClosed;
|
|
};
|
|
|
|
export const degreeToSemitone = (
|
|
profile: GardenAudioVibeProfile,
|
|
degree: number
|
|
): number => {
|
|
const scaleIndex =
|
|
((degree % profile.scale.length) + profile.scale.length) % profile.scale.length;
|
|
const octave = Math.floor(degree / profile.scale.length);
|
|
return (
|
|
profile.scale[scaleIndex] + octave * gardenAudioConfig.piano.pitchSemitonesPerOctave
|
|
);
|
|
};
|