[JW Lua] Enharmonic Flip Bit

Robert Patterson robert at robertgpatterson.com
Wed Mar 1 17:37:54 CET 2023


The short answer is that the 0x04 bit by itself does not do much. You also
have to transpose the note by Finale's "default enharmonic flip" amount. I
have worked out how to enharmonic flip and have it unlink. It requires the
following steps (with the part in edit focus):

   - Set the 0x04 bit and save the FCNoteheadMod.
   - Transpose the FCNote enharmonically by Finale's default enharmonic
   flip. (Any other transposition remains linked to the score.) I have added a
   function to do this to the transposition library in the Lua-scripts repo,
   but it isn't merged yet. There's a lot of non-trivial support code already
   written in the transposition library, which is why I haven't added a
   function to the PDK Framework. (It would be a ballooning project.)
   - (Optional but recommended) rebuild metrics (outside eachentrysaved
   loop) and set entry.StemUp = entry:CalcStemUp().

To relink (with the part in edit focus):

   - Reset the 0x04 bit and then delete the FCNoteheadMod (but save the
   reference to it).
   - Call the new (in 0.66) function note:MatchSpellingToScore(). You could
   write your own version of it in Lua, but this seemed like a useful function
   to add to the PDK Framework and easy to add.
   - Put the score in edit focus and resave (as new) the FCNoteheadMod.
   - Rebuild metrics as before and adjust the stem bits.

There could be an improvement to this to check if there are no other mods
in the FCNoteheadMod and skip re-saving it, but this is safe and easy. I
have a longer-term goal to add __FCBaseData::Relink to the framework, which
you could use instead, but it won't be in 0.66.

Here is the code I'm using (requires RGP Lua 0.66):

local transpose = require('library.transposition')

for entry in eachentrysaved(finenv.Region()) do
    for note in each(entry) do
        local note_mod = finale.FCNoteheadMod()
        note_mod:SetNoteEntry(entry)
        note_mod:LoadAt(note)
        note_mod.EnharmonicFlip = not note_mod.EnharmonicFlip
        if note_mod.EnharmonicFlip then
            note_mod:SaveAt(note)
            transpose.enharmonic_transpose_default(note)
        else
            note_mod:DeleteData()
            note:MatchSpellingToScore()
            local score = finale.FCPart(finale.PARTID_SCORE)
            score:SwitchTo()
            note_mod:SaveAt(note)
            score:SwitchBack()
        end
    end
end

finale.FCEntryMetrics.MarkMetricsForRebuild()
for entry in eachentrysaved(finenv.Region()) do
    entry.StemUp = entry:CalcStemUp()
end


On Wed, Mar 1, 2023 at 10:03 AM Jan Angermüller <jan at angermueller.com>
wrote:

> Did you get feedback from MakeMusic on how it works?
> Was it only the 4? Or were more bits involved?
>
> Jan
>
> Am 23.02.2023 um 14:57 schrieb Jan Angermüller:
>
> Thank you! This helps indeed.
>
> Am 23.02.2023 um 14:49 schrieb Robert Patterson:
>
> That 4 value appears to be the enharmonic flip bit, which is not
> documented in the PDK. I have sent a message to Makemusic to get
> clarification on how it works. Once I hear back, I will add it to the PDK
> Framework and Lua.
>
> The 13 is a custom font id. However, 13 is the font ID for Finale Music,
> so it's the same as the default font. Furthermore, since the
> "UseCustomFont" option is false, the custom font id is ignored anyway. The
> 13s appear to be cruft in the file.
>
> You may encounter this situation with any Special Tools modification that
> is unlinkable, including FCNoteheadMods. It will appear to have all default
> values in the score but is modified in one or more parts. There is no way
> to determine this except to compare in all parts that contain the staff.
>
> You may know that my Mass Copy plugin has a "Relink" option. Relinking is
> not directly supported in the PDK. The way my plugin works is that it makes
> a copy of the values it wants to relink to, deletes the item entirely and
> then re-adds it in the score with the copied values.
>
> If you delete seemingly empty note details in the score, you are removing
> unlinked values from the parts and relinking them to the score.
>
> I hope this helps.
>
> On Thu, Feb 23, 2023 at 3:06 AM Jan Angermüller <jan at angermueller.com>
> wrote:
>
>> Robert,
>>
>> I have recently had a document that included seemingly "empty"
>> FCNoteheadMods.
>> I.e. all options from the NoteheadMod dialog were set to the default
>> value.
>>
>> So I deleted it with nh:DeleteData(), because I thought it was an
>> unnecessary/corrupt FCNoteheadMod.
>> This lead to a problem:
>> When you do the CreateRawDataDump and list the 11th value, it may include
>> a "4", and 13th value may include a "13".
>>
>> local nu=nh:CreateRawDataDump()
>> print(nu:GetItemAt(10).Int)
>>
>> If this returns 4, then the "Enharmonic" bit is activated. Otherwise it
>> returns 0.
>> If you delete the FCNoteheadMod in this case, the enharmonic flip
>> disappears.
>> nu:GetItemAt(12).Int sometimes returns "13". I didn't find out what this
>> is.
>>
>> As Perfect Layout wants to delete corrupt/empty FCNoteheadMods by
>> default, it's difficult to find out when looking at the score only:
>> If the enharmonic flip is only in a linked part and you load the
>> FCNoteheadMod in the score, you won't recognize that there may be a flip in
>> a part.
>> Or in other words: if you analyze the DataDump in the score, it looks
>> like the FCNoteheadMod doesn't make sense, because all values are set to 0
>> (except the 100 resize value).
>>
>> My questions:
>> - Maybe you could add the GetEnharmonic() to FCNoteheadMod?
>> - Maybe you know what the 13 is?
>> - Do you know if there is a simple way to decide when looking at the
>> FCNoteheadMod in the score whether this is a "false/empty" FCNoteheadMod or
>> if this is actually an unlinked FCNoteheadMod?
>> According to my documentation there have been situations (maybe in
>> corrupt documents?) where false/empty FCNoteheadMods should be deleted.
>> Until now I did when all values where set to the default values in the
>> score. And I don't want to switch through all parts at that point, if
>> possible.
>>
>> Here is a test script for the attached document:
>> local reg=finale.FCMusicRegion()
>> reg:SetFullDocument()
>> local parts=finale.FCParts()
>> parts:LoadAll()
>> for p in each(parts) do
>>     p:SwitchTo()
>>     for e in eachentry(reg) do
>>         if e.NoteDetailFlag then
>>             local nhmods=e:CreateNoteheadMods()
>>             for nh in each(nhmods) do
>>                 local nu=nh:CreateRawDataDump()
>>                 if nu then
>>
>> print(p.ID,e.Measure,e.MeasurePos,nu:GetItemAt(10).Int,nu:GetItemAt(12).Int)
>>                 end
>>             end
>>         end
>>     end
>>     p:SwitchBack()
>> end
>>
>> Running [Unnamed Script] ======>
>> 0 1 0 0 0  --> Score: Measure 1, Pos 0, all default values (=0)
>> 0 1 2048 0 0
>> 0 2 0 0 13  -->  13 is set
>> 0 3 2560 4 13  --> 4 and 13 is set
>> 9 1 0 4 0   --> 4 is set
>> 9 1 2048 4 0   --> 4 is set
>> 9 2 0 4 13   --> 4 and 13 is set
>> 9 3 2560 0 13   --> 13 is set
>> <======= [Unnamed Script] succeeded (Processing time: 0.000 s).
>>
>> Four notes have enharmonic flips and two also have the "13" value.
>> Three notes have the "4" in the linked part, one note has it in the score.
>>
>> Jan
>>
>>
>>
>> _______________________________________________
>> JWLua mailing list
>> JWLua at jwmusic.nu
>> http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>>
>
> _______________________________________________
> JWLua mailing listJWLua at jwmusic.nuhttp://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>
>
> --
> Jan Angermüller
> Orchideenstieg 13
> 22297 Hamburg
> Tel. 040 - 28 94 84 82
> Mobil 0173 - 99 33 904www.elbsound.studio
>
>
> _______________________________________________
> JWLua mailing listJWLua at jwmusic.nuhttp://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>
>
> --
> Jan Angermüller
> Orchideenstieg 13
> 22297 Hamburg
> Tel. 040 - 28 94 84 82
> Mobil 0173 - 99 33 904www.elbsound.studio
>
> _______________________________________________
> JWLua mailing list
> JWLua at jwmusic.nu
> http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://jwmusic.nu/pipermail/jwlua_jwmusic.nu/attachments/20230301/fd142f82/attachment.htm>


More information about the JWLua mailing list