1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
; Splits the current chord/note to several others of the same pitch. Their sum equals the original duration. Will create tuplets if necessary
; So far only (assuming quarter) 8th, 8th-triplet, 16th, 16-fifthlet, 16th-sextlet, 16th-Seventhlet, 32th and 32th-ninthlet
; TODO: What about if someone tries to divide too small? The score will get broken.
(define* (SplitChord #:optional (howmany #f))
(define (split-divide)
(duration::ChangeNoteDurationInTicks (/ (duration::GetBaseDurationInTicks) 2) (d-GetDots)))
(if (Note?) ; DuplicateChord only works ON notes, not in the appending position.
(begin
(if (not howmany)
(begin
(set! howmany (d-GetUserInput "Split in how many notes?" "Enter the number of notes to split into:" "2" ) )
(if howmany (set! howmany (string->number howmany)) #f))) ; If the user pressed "Abort" or Esc howmany will be #f which must be caught here
(case howmany
((1) #t) ; Already original duration in one note.
((2) (begin ;8th
(split-divide)
(d-DuplicateChord)
(d-MoveCursorRight)
#t))
((3) (if (= 1 (d-GetDots))
(begin
(d-RemoveDot)
(d-Diminish)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
#t)
(begin ;8th-triplet
(d-StartTriplet)
(split-divide)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
(d-EndTuplet)
#t)))
((4) (begin ;16th
(split-divide)
(split-divide)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
#t))
((5) (begin ;16-fifthlet
(split-divide)
(split-divide)
(d-StartTriplet)
(d-MoveCursorLeft)
(d-SetTuplet "4/5")
(d-MoveCursorRight)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
(d-EndTuplet)
#t))
((6) (begin ;16th-sextlet,
(split-divide)
(split-divide)
(d-StartTriplet)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
(d-EndTuplet)
#t))
((7) (begin ;16-Seventhlet
(split-divide)
(split-divide)
(d-StartTriplet)
(d-MoveCursorLeft)
(d-SetTuplet "4/7")
(d-MoveCursorRight)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
(d-EndTuplet)
#t))
((8) (begin ;32th
(split-divide)
(split-divide)
(split-divide)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
#t))
((9) (begin ;32th-ninthlet
(split-divide)
(split-divide)
(split-divide)
(d-StartTriplet)
(d-MoveCursorLeft)
(d-SetTuplet "8/9")
(d-MoveCursorRight)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-DuplicateChord)
(d-MoveCursorRight)
(d-EndTuplet)
#t))
(else #f); out of range
))
#f ; it was no note
))
|