(define Major "c e g")
(define Minor "c ees g")
;TODO test out referecing ChordPossibilities
;(define ChordPossibilities '("Major" "Minor"))
;TODO remove these lists
(define major '(0 4 7))
(define minor '(0 3 7))
;;;;
(define HighestNote 80)
(define LowestNote 55)
(define MajorMinor::ChordLowestNote 60)
;TODO make just ""
(define MajorMinor::ChordQuality "Major")
(define MajorMinor::score 0)
;TODO MajorMinor:: before all procedures and varaibles
(if (not (defined? 'Transpose::init))
(begin
(d-LoadCommand "/MainMenu/EditMenu/Transpose/SetTransposeIntervalFromNote")
(d-InitializeScript "SetTransposeIntervalFromNote")))
(define (lilyname->midikey lilyname)
(let (
(naturual_notenum '(0 2 4 5 7 9 11))
(accidental 0)
(octave 48)
(notename 0)
(notenum 0)
(loop 0))
(set! notename
(lambda (char)
(modulo (- (char->integer char) 99) 7)))
(set! loop
(lambda (x)
(if (< x (string-length lilyname))
(begin
(if (= x 0) (set! notename (notename (string-ref lilyname x))))
(if (> x 0)
(begin
(if (equal? #\i (string-ref lilyname x))
(set! accidental (+ accidental 1)))
(if (equal? #\e (string-ref lilyname x))
(set! accidental (- accidental 1)))
(if (equal? #\' (string-ref lilyname x))
(set! octave (+ octave 12)))
(if (equal? #\, (string-ref lilyname x))
(set! octave (- octave 12)))))
(loop (+ 1 x)))
);end of if
)
);end of loop
(loop 0)
(set! notenum (list-ref naturual_notenum notename))
(+ (+ octave notenum) accidental)
);end of let
)
(define (midinum->lilyname num)
(let ( (octave 0)
(notename "")
(OctaveString "")
(sharplist '("c" "cis" "d" "dis" "e" "f" "fis" "g" "gis" "a" "ais" "b"))
)
(set! octave (- (quotient num 12) 4))
(set! notename (list-ref sharplist (remainder num 12)))
(if (> octave 0)
(set! OctaveString (string-pad "" (abs octave) #\'))
(set! OctaveString (string-pad "" (abs octave) #\,)))
(string-append notename OctaveString)
))
;TODO put this in an init.scm
(let ((time (gettimeofday)))
(set! *random-state*
(seed->random-state (+ (car time)
(cdr time)))))
(define (MajorMinor::PlayChord note)
(PlayNote (number->string (+ MajorMinor::ChordLowestNote note)) 1000))
(define (MajorMinor::GetRandom)
(set! MajorMinor::ChordLowestNote (random HighestNote))
(if (> LowestNote MajorMinor::ChordLowestNote)
(MajorMinor::GetRandom)
))
(define (MajorMinor::GetChordQuality)
;TODO make this cycle over more than two chords
(MajorMinor::GetRandom)
(if (= 0 (random 2))
(set! MajorMinor::ChordQuality "Minor")
(set! MajorMinor::ChordQuality "Major")))
(define (MajorMinor::Play)
;TODO argument interval list
(if (string=? MajorMinor::ChordQuality "Major")
(map MajorMinor::PlayChord major)
(map MajorMinor::PlayChord minor)
))
;;;;;
(define (MajorMinor::showscore)
(d-DirectivePut-score-display "MajorMinor::GameScore" (string-append "Score: " (number->string MajorMinor::score))))
(define (MajorMinor::OfferChord)
(MajorMinor::showscore)
(MajorMinor::GetChordQuality)
(MajorMinor::Play)
)
(define (MajorMinor::go)
(MajorMinor::OfferChord)
)
(define (GetIntervalString lilynote_list)
(let (
(SetOctave 0))
(set! SetOctave
(lambda (lilystring)
(- (lilyname->midikey lilystring) 48)))
(map SetOctave lilynote_list)
))
(define (MajorMinor::TransposeChord lilyname)
(set! Transpose::Note lilyname)
(Transpose::SetTransposeInterval Transpose::Note)
(Transpose::TransposeNote)
)
(define (PlaceNotes)
;TODO Possible take list as argument
; Enable Transpose
(d-CursorToNote "c")
(d-Insert2)
(if (string=? MajorMinor::ChordQuality "Major")
(d-ChangeChordNotes Major)
(d-ChangeChordNotes Minor))
(MajorMinor::TransposeChord (midinum->lilyname MajorMinor::ChordLowestNote))
)
;;;;;;;;; callback when user chooses a chord
(define (MajorMinor::chordchosen chord)
(PlaceNotes)
(let gotoEnd () (if (d-NextObject) (gotoEnd)))
(if (string=? MajorMinor::ChordQuality chord)
(begin
(set! MajorMinor::score (+ MajorMinor::score 1))
;(EducationGames::PlaceAnswerStatus "CheckMark")
)
(begin
(set! MajorMinor::score (- MajorMinor::score 1))
;(EducationGames::PlaceAnswerStatus "CrossSign")
))
(MajorMinor::OfferChord))
;;;;gui buttons
(CreateButton "MajorMinor::GameScore" "Click to start")
(d-SetDirectiveTagActionScript "MajorMinor::GameScore" "(MajorMinor::go)")
(define (MajorMinor::createbuttons note)
(CreateButton (string-append "MajorMinor::" note) (string-append " " note ""))
(d-SetDirectiveTagActionScript (string-append "MajorMinor::" note) (string-append "(MajorMinor::chordchosen \"" note "\")")))
;TODO if possible autogen these from list
(MajorMinor::createbuttons "Major")
(MajorMinor::createbuttons "Minor")
(CreateButton "MajorMinor::replay" "Re-Play")
(d-SetDirectiveTagActionScript "MajorMinor::replay" "(MajorMinor::Play)" )
;;;;;;;;;;;;;;;;;;;;;;;;;;