Another WIP DSL experiment to represent music elements. Work with Notes to create Chords and then use those same Chords to create Progressions.
- Working enharmonics.
- Extension methods to work with strings as notes.
- Useful rendering of notes.
- Harmony
- Chord creation
- Triads.
- Tetrachords (subject to model changes, partial support).
- Add chords.
- Power chords.
- Suspended chords.
- Partial extension support.
- Progressions
- Generic list-like implementation.
- Quick default methods to create common progressions.
- Chord creation
package org.aranadedoros.chordal
import chords.*
import dsl.*
import dsl.Notes.{A, D, E, G}
import extensions.Ninth
import notes.{dim, major, note, pow, Note}
import scala.language.postfixOps
//on progress, subject to changes
val C = Note("C")
val chord1 =
chord {
root(C)
quality(MajorTriad)
withExtensions(Ninth)
}
println(chord1)
val chord2 =
chord {
root("D".note)
sus(Sus4)
}
println(chord2)
val chord3 =
chord {
root(E)
}
println(chord3)
val dMajor: Triad =
D major
println(dMajor)
val eMajorWithBassOnG: SlashChord =
E.major / G
println(eMajorWithBassOnG)
val g5: PowerChord =
G pow
println(g5.name)
val adim7 =
A.dim withSeventh (MinorSeventh)
println(adim7)C9
Dsus4
E5
(D,F#,A)
(E,G#,B)/G
G5
(A,C,Eb,G)val C = Note("C")
val D = Note("D")
val Eb = Note("Eb")
val cMajor = Triad.major(C)
val dMinor = Triad.minor(D)
val ebDim = Triad.diminished(Eb)
println(cMajor.name) // "C"
println(dMinor.name) // "Dm"
println(ebDim.name) // "E°"
println(cMajor.asNotes) // List(C, E, G)
println(dMinor.asNotes) // List(D, F, A)
val csus2 = cMajor.sus2
val csus4 = cMajor.sus4
println(csus2.name) // "C D"
println(csus2.asNotes) // List(C, D, G)
println(csus4.asNotes) // List(C, F, G)
val cAdd9 = cMajor.add9
val cAdd6 = cMajor.add6
println(cAdd9.name) // "Cadd9"
println(cAdd9.asNotes) // List(C, E, G, D)
println(cAdd6.asNotes) // List(C, E, G, A)
val c5 = cMajor.toPowerChord
println(c5.name) // "(C5)"
println(c5.asNotes) // List(C, G)
val cMaj7 = cMajor.withSeventh(MajorSeventh)
val d7 = dMinor.withSeventh(MinorSeventh)
println(cMaj7.name) // "Cmaj7"
println(cMaj7.asNotes) // List(C, E, G, B)
println(d7.name) // "Dm7"
println(d7.asNotes) // List(D, F, A, C)
val cMaj9 =
cMajor
.withSeventh(MajorSeventh)
.addExtension(Ninth)
println(cMaj9.name) // "Cmaj79"
println(cMaj9.asNotes) // List(C, E, G, B, D)
val key = Triad.major("C".note)
val ii = Triad.minor("D".note)
val V = Triad.major("G".note)
val I = Triad.major("C".note)
val ii7 = ii.withSeventh(MinorSeventh)
val V7 = V.withSeventh(MinorSeventh)
val Imaj7 = I.withSeventh(MajorSeventh)
println(List(ii7, V7, Imaj7).map(_.name))C
Dm
Eb°
(C,E,G)
(D,F,A)
Csus2
(C,D,G)
(C,F,G)
Cadd9
(C,E,G,D)
(C,E,G,A)
C5
(C,G)
Cmaj7
(C,E,G,B)
Dm7
(D,F,A,C)
Cmaj79
(C,E,G,B,D)
List(Dm7, G7, Cmaj7)- Improve syntax to read like english.
- Fix naming issues (fixed for the currently supported types).
- Print chord intervalic formulas.
- Model tetrachords better.