From 1298263629dc43b2a6a2a3f18a7a779189b66738 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Sun, 12 Apr 2020 19:20:00 +0100 Subject: [PATCH] Whitelist and blacklist chords by inversion type Add checkboxes to support various chord positions. --- .../sandbox/chord-drill-sergeant/src/Main.elm | 42 ++++++++++++++- .../chord-drill-sergeant/src/Theory.elm | 52 +++++++++++++++---- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/website/sandbox/chord-drill-sergeant/src/Main.elm b/website/sandbox/chord-drill-sergeant/src/Main.elm index 5ccc4d303..f551d11e0 100644 --- a/website/sandbox/chord-drill-sergeant/src/Main.elm +++ b/website/sandbox/chord-drill-sergeant/src/Main.elm @@ -24,6 +24,7 @@ type alias Model = { enable : Bool , inspectChord : Bool } + , whitelistedInversions : List Theory.ChordInversion } @@ -36,6 +37,7 @@ type Msg | DecreaseTempo | SetTempo String | ToggleInspectChord + | ToggleInversion Theory.ChordInversion tempoStep : Int @@ -71,7 +73,8 @@ init = ( firstNote, lastNote ) = ( Theory.C3, Theory.C5 ) in - { whitelistedChords = Theory.allChords firstNote lastNote + { whitelistedChords = Theory.allChords firstNote lastNote Theory.allInversions + , whitelistedInversions = Theory.allInversions , selectedChord = cmajor , isPaused = True , tempo = 60 @@ -147,6 +150,22 @@ update msg model = , Cmd.none ) + ToggleInversion inversion -> + let + inversions = + if List.member inversion model.whitelistedInversions then + List.filter ((/=) inversion) model.whitelistedInversions + + else + inversion :: model.whitelistedInversions + in + ( { model + | whitelistedInversions = inversions + , whitelistedChords = Theory.allChords model.firstNote model.lastNote inversions + } + , Cmd.none + ) + SetTempo tempo -> ( { model | tempo = @@ -178,6 +197,26 @@ debugger = ] +inversionCheckboxes : List Theory.ChordInversion -> Html Msg +inversionCheckboxes inversions = + ul [] + (Theory.allInversions + |> List.map + (\inversion -> + li [] + [ label [] [ text (Theory.inversionName inversion) ] + , input + [ type_ + "checkbox" + , onClick (ToggleInversion inversion) + , checked (List.member inversion inversions) + ] + [] + ] + ) + ) + + view : Model -> Html Msg view model = case Theory.notesForChord model.selectedChord of @@ -198,6 +237,7 @@ view model = , handleDecrease = DecreaseTempo , handleInput = SetTempo } + , inversionCheckboxes model.whitelistedInversions , playPause model , if model.debug.enable then debugger diff --git a/website/sandbox/chord-drill-sergeant/src/Theory.elm b/website/sandbox/chord-drill-sergeant/src/Theory.elm index 4dc4c3e51..b24082299 100644 --- a/website/sandbox/chord-drill-sergeant/src/Theory.elm +++ b/website/sandbox/chord-drill-sergeant/src/Theory.elm @@ -269,6 +269,21 @@ noteInCentralOctave noteClass = B4 +{-| Return the human-readable version of a chord inversion. +-} +inversionName : ChordInversion -> String +inversionName inversion = + case inversion of + Root -> + "Root" + + First -> + "First" + + Second -> + "Second" + + {-| Return the note that is one half step away from `note` in the direction, `dir`. In the case of stepping up or down from the end of the piano, this returns a @@ -750,24 +765,43 @@ notesFromRange start end = |> List.Extra.takeWhile ((/=) end) +{-| Return a list of all of the chord inversions about which we know. +-} +allInversions : List ChordInversion +allInversions = + [ Root, First, Second ] + + +{-| Return a list of all of the chord types about which we know. +-} +allChordTypes : List ChordType +allChordTypes = + [ Major + , Major7 + , MajorDominant7 + , Minor + , MinorMajor7 + , MinorDominant7 + , Augmented + , AugmentedDominant7 + , Diminished + , DiminishedDominant7 + , DiminishedMajor7 + ] + + {-| Return a list of all of the chords that we know about. Only create chords from the range of notes delimited by the range `start` and `end`. -} -allChords : Note -> Note -> List Chord -allChords start end = +allChords : Note -> Note -> List ChordInversion -> List Chord +allChords start end chordInversions = let notes = notesFromRange start end chordTypes = - [ Major - ] - - chordInversions = - [ Root - , First - ] + allChordTypes in notes |> List.Extra.andThen