(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)" ) ;;;;;;;;;;;;;;;;;;;;;;;;;;