import { AlterationEnum, DiatonicNoteEnum } from "../constants.js";
export type IScale = any;
export type DegreeBuilder = {
    function: string;
    callable: IntervalBuilder;
};
export interface ScaleBuilder {
    (tonic: Note, degreeBuilders: Array<DegreeBuilder>): Array<DegreeBuilder>;
}
export type Semitones = {
    special: {
        up: number;
        down: number;
    };
    normal: {
        up: number;
        down: number;
    };
};
export interface IReference extends Note {
    frequency: number;
}
export interface IScaleBuilder {
    tonic: Note;
    scaleSchema: any;
    tonicRepetition: boolean;
    withoutTonicRepetition: () => IScaleBuilder;
    scale: () => IScale;
}
export interface INotePosition extends Note {
    degree: number;
    frequency: number;
    function: string;
    order: number;
    position: number;
}
export interface Interval {
    direction?: "up" | "down";
    compound: boolean;
    halfsteps: number;
    quality?: string;
    type: string;
}
export interface Note {
    name: DiatonicNoteEnum;
    alteration: AlterationEnum;
    octave: number;
}
export interface IScaleDegree extends Note {
    degree: number;
    function: string;
    order: number;
}
export interface IMusicalString extends Note {
    frequency: number;
}
export interface ReferenceUsedInStringStore extends Note {
    tuning: number;
}
export interface Alteration {
    name: string;
    visual: AlterationEnum.flat | AlterationEnum.sharp | AlterationEnum.natural | AlterationEnum.doubleFlat | AlterationEnum.doubleSharp;
}
export type IntervalBuilder = (note: Note, direction: "up" | "down") => Note;
export interface StringInstumentPreset {
    strings: Array<IMusicalString>;
    stringLimits: Array<StringLimits>;
}
export interface StringLimits {
    string: IMusicalString;
    limits: {
        upper: Note;
        lower: Note;
    };
}
