Table of Contents

Class ProgressionReport

Namespace
Celeritas.Core.Analysis
Assembly
Celeritas.dll

Complete analysis report for a chord progression.

public sealed class ProgressionReport
Inheritance
ProgressionReport
Inherited Members

Remarks

Chord symbols that cannot be parsed are skipped (see SkippedSymbols), so all Position/index fields in this report (Chords, Cadences, Modulations, SecondaryDominants, BorrowedChords, TensionCurve) refer to the PARSED sequence, which may be shorter than the input array.

Properties

AverageMovement

Average voice movement between chords in semitones.

public float AverageMovement { get; init; }

Property Value

float

AverageTension

Average harmonic tension across the progression (0-1)

public float AverageTension { get; init; }

Property Value

float

BorrowedChords

Detected borrowed chords (modal mixture).

public IReadOnlyList<BorrowedChordInfo> BorrowedChords { get; init; }

Property Value

IReadOnlyList<BorrowedChordInfo>

Cadences

Detected cadences

public required IReadOnlyList<CadenceInfo> Cadences { get; init; }

Property Value

IReadOnlyList<CadenceInfo>

Chords

Detailed analysis of each chord

public required IReadOnlyList<ChordAnalysisDetail> Chords { get; init; }

Property Value

IReadOnlyList<ChordAnalysisDetail>

Complexity

Complexity level of the progression (0-1, higher = more complex)

public float Complexity { get; init; }

Property Value

float

HasBorrowedChords

Quick flag: any borrowed chords?

public bool HasBorrowedChords { get; }

Property Value

bool

HasModalMixture

Does progression have modal mixture/borrowed chords?

public bool HasModalMixture { get; init; }

Property Value

bool

HasSecondaryDominants

Quick flag: any secondary dominants?

public bool HasSecondaryDominants { get; }

Property Value

bool

Highlights

Notable highlights or interesting moments in the progression

public IReadOnlyList<string> Highlights { get; init; }

Property Value

IReadOnlyList<string>

Key

Detected key signature

public required KeySignature Key { get; init; }

Property Value

KeySignature

KeyConfidence

Confidence in key detection (0-1)

public required float KeyConfidence { get; init; }

Property Value

float

Modulations

Detected modulations and tonicizations

public required IReadOnlyList<ModulationInfo> Modulations { get; init; }

Property Value

IReadOnlyList<ModulationInfo>

Narrative

Overall narrative/story of the progression

public required string Narrative { get; init; }

Property Value

string

ParallelFifths

Count of parallel fifths between adjacent chords, measured on the voicing a musician would write — each chord tone led to the nearest tone of the next chord, common tones held — since a chord symbol carries no voicing of its own.

public int ParallelFifths { get; init; }

Property Value

int

Remarks

It used to be counted between the chords stacked in root position in one octave, on which every change of root between two triads is a parallel fifth: I - IV - V - I had three and was rated "Rough".

ParallelOctaves

Approximate count of parallel octaves/unisons detected between adjacent chords. An octave needs a chord to sound one pitch class twice, and a chord symbol never does — a slash bass moves the note rather than doubling it — so this is 0 for symbol input. It is ParallelFifths that carries the signal here.

public int ParallelOctaves { get; init; }

Property Value

int

Pattern

Overall progression pattern (e.g., "i - VI - iv - i - V"); a chromatic chord with no diatonic numeral appears as "?".

public required string Pattern { get; init; }

Property Value

string

QualityRating

Overall voice-leading quality rating (free-form).

public string QualityRating { get; init; }

Property Value

string

SecondaryDominants

Detected secondary dominants (tonicizations): a dominant applied to a degree other than the tonic. A dominant resolving into the tonic of Key is that key's V7 → I and is never listed here, even where the chords before it had moved to another key.

public IReadOnlyList<SecondaryDominantInfo> SecondaryDominants { get; init; }

Property Value

IReadOnlyList<SecondaryDominantInfo>

Remarks

It used to be: judged against the key the music had moved to, the closing G7 → Cm of a C minor progression whose middle passed through E flat was listed as a tonicization of C minor, and a return to C through G7 → C after a move to G as "G7 → C (I)".

SkippedSymbols

Input chord symbols that could not be parsed and were skipped, with their indices in the ORIGINAL input array. All Position fields elsewhere in the report refer to the parsed sequence (with these symbols removed).

public IReadOnlyList<(int Index, string Symbol)> SkippedSymbols { get; init; }

Property Value

IReadOnlyList<(int Index, string Symbol)>

Smoothness

Voice-leading smoothness (0-1, higher = smoother).

public float Smoothness { get; init; }

Property Value

float

Suggestions

Suggestions for improvement or resolution

public required IReadOnlyList<string> Suggestions { get; init; }

Property Value

IReadOnlyList<string>

Summary

Short human-readable summary.

public string Summary { get; init; }

Property Value

string

TensionCurve

Array of tension values for each chord (0-1, used for tension curves)

public float[]? TensionCurve { get; init; }

Property Value

float[]

UsesHarmonicMinor

Does progression use harmonic minor (raised 7th)?

public bool UsesHarmonicMinor { get; init; }

Property Value

bool

UsesMelodicMinor

Does progression use melodic minor?

public bool UsesMelodicMinor { get; init; }

Property Value

bool

Methods

Generate(string[])

Convenience factory matching the examples.

public static ProgressionReport Generate(string[] chordSymbols)

Parameters

chordSymbols string[]

Returns

ProgressionReport

Exceptions

ArgumentNullException

chordSymbols is null.

ToFormattedReport()

Generate a formatted text report

public string ToFormattedReport()

Returns

string