> On 09/11/2024 10:14 AM EDT Richard Shann <rich...@rshann.plus.com> wrote:
> 
>  
> On Wed, 2024-09-11 at 09:13 -0400, Bric wrote:
> > 
> > > On 09/11/2024 8:57 AM EDT Bric <b...@flight.us> wrote:
> > > 
> > >  
> > > > >  
> > > > 
> > > > >  You'd need to change the note's start position.  Given X%
> > > > > swing,
> > > > > you'd need to shift the start of the second eighth note in a
> > > > > pair of
> > > > > swung eighth notes, forward, in time, by (X-50)/50 of its own
> > > > > duration.  (E.g., for a swing of 63, the second note shrinks by
> > > > > (63-
> > > > > 50)/50 = 13/50, and shifts forward by that difference.
> > > > > 
> > > > > But again. First, denemo needs to identify each pair of eights
> > > > > properly,
> > > 
> > > > As you have an insight into the choosing of which pairs of eighth
> > > > notes
> > > > you would wish to swing I wonder if you would care to implement
> > > > inside
> > > > Denemo? You would need to familiarise yourself with Scheme, but
> > > > that is
> > > > not so difficult a very simple syntax, and with the procedures
> > > > available for Denemo such as d-MoveCursorLeft and d-
> > > > GetNoteDuration. I
> > > > could help with the latter, it would be a question of modifying
> > > > the
> > > > script for the command SwingStaff which you can inspect from
> > > > within
> > > > Denemo.
> > > > 
> > > 
> > > Would love to give it a go!  (and, no -- not suggesting we use "Go"
> > > :-))
> > > 
> > > I'm not too solid on Scheme but have always been fascinated with
> > > it. (Was able to do a few quick hacks in Scheme here and there)
> > > 
> > > Yeah... I've had some success writing a swing rhythm
> > > transformation. (The code did not run in real time, however -- but
> > > it probably could).  
> > > 
> > > Essentially, it first identified the swing pairs, by
> > > tracking/evaluating the start position of every note, within the
> > > measure. Not hard. Actually works for cases where there is no
> > > explicit pair(!) -- where the first note of the pair is
> > > theoretical/imaginary -- it applied the transform to the second
> > > (explicit) note of the pair, because that note's position can be
> > > computed for eligibility (without the existence of the first
> > > note).  Once the eligible note is identified, the rest should be
> > > trivial
> > > 
> > > To do the above in Denemo, it would also be easy -- if the function
> > > had the start position parameter.  Would it do the transform
> > > **ahead** of the playback? Like - prepping the data first and THEN
> > > playing back?  Or would it apply the transform in realtime, as it
> > > executes the playback?
> > 
> > Just realized that I already had the answer to that last one, i
> > guess.  The color highlighting (in blue) in the editor is evidence
> > that the function is being applied before any playback happens.
> 
> yes, SwingStaff is stepping the cursor through every object from the
> start of the staff and where it finds consecutive eighth notes
> shortening the duration of the first and lengthening the duration of
> the second to match. It's that simple.
> To make it more concrete for you here is the function that steps
> through looking for an eighth note and if it finds one going on to see
> if there is another and if there is lengthening and shortening the two
> - I've added comments:
> 
>     (define (swing)
> 
>       ;this is the code I added this morning that looks for dotted notes
>          (if (positive? (d-GetDots))          ;if dotted  
>                       (begin
>                               (NextNoteInMeasure) ; moves over the next two 
> notes before starting to look againg
>                               (NextNoteInMeasure)))
> 
>       ;this is the code that you have in SwingStaff
> 
> 
>        (if (and (equal? (d-GetNoteDuration) "8") (not (d-IsGrace))     ;if 
> it's an eighth note and not a grace note
>                 (NextNoteInMeasure)                                    ; and 
> we can move cursor to next note
>                 (equal? (d-GetNoteDuration) "8")  (not (d-IsGrace)))   ; and 
> this is also an eighth note
>         (begin                                                         ; then
>             (d-MoveCursorLeft)                                         ; go 
> back to the first eighth note
>             (d-SetDurationInTicks big)                                       
> ; make it big
> 
> ;ignore these two lines
>             (d-DirectivePut-chord-override tag (logior 
> DENEMO_OVERRIDE_GRAPHIC DENEMO_ALT_OVERRIDE))
>             (d-DirectivePut-chord-prefix tag "8") 
>                                                                        ;go on 
> to the second eighth note
>             (d-MoveCursorRight)
>             (d-SetDurationInTicks small)                               ; make 
> it small
> ;ignore
>             (d-DirectivePut-chord-override tag (logior 
> DENEMO_OVERRIDE_GRAPHIC DENEMO_ALT_OVERRIDE))
>             (d-DirectivePut-chord-prefix tag "8"))))
> 
> This procedure is called repeatedly until the end of the staff is reached. 
> That's all there is to it.
> You might want to do something simpler - write a command that adds an
> amount to the duration of the current note and takes the same amount
> off the duration of the previous note. Then as you enter notes you hit
> a key that executes that command whenever you want to swing it from the

started responding, sharing some pseudo-code -- but needed to work, so will 
need to finish later.

by the way:  messages get posted with enormous delay sometimes

my previous one surfaced on my end over an hour after I sent it.

And well after you replied to it, too -- which adds to the puzzlement

(in other words, it reached you at least 40 minutes before it echoed back to me 
on the list)


 
> last note.
> 
> Richard

Reply via email to