Replies: 17 comments 3 replies
-
|
I think this would be very useful. |
Beta Was this translation helpful? Give feedback.
-
|
@rpatters1 I agree this would be useful in principle. but how do you imagine mappings to codepoints in the optional range should be defined, given that it's intended for discretionary mappings? I'm also not quite clear on what a boolean would solve in this case. Nor do I understand the reasoning for using a catchall codepoint, but avoiding that shouldn't be controversial from a SMuFL point of view. |
Beta Was this translation helpful? Give feedback.
-
|
I don't feel strongly about an optional boolean, but I do think it should be possible to map legacy codepoints to the optional range of codepoints. Consider that MakeMusic was using their files to map Maestro to Finale Maestro, Broadway to Finale Broadway, etc. The optional range would be quite an important feature of these mappings. Beyond that, it seems as though many optional-range glyphs and their names are shared, specifically, between Bravura and Finale Maestro. So even though the optional range is supposedly discretionary, there does appear to be some level of ad hoc cooperation going on. (Although, I could be mistaken.) |
Beta Was this translation helpful? Give feedback.
-
|
One thought I had is perhaps to specify the font for the optional mapping. That is, rather than just an |
Beta Was this translation helpful? Give feedback.
-
|
I should add that it appears that all of the MakeMusic fonts use the same set of optional glyphs, though of course not all of them are available in every font. |
Beta Was this translation helpful? Give feedback.
-
|
Defining a schema is probably a necessary first step in this process. |
Beta Was this translation helpful? Give feedback.
-
|
Having thought about the Finale files, I feel that those mappings are backwards. They map SMuFL glyphnames to legacy codepoints. But what I think would be more useful is a mapping from legacy codepoints to glyphnames and (optionally) SMuFL codepoints. Here is a strawman schema: {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SMuFL Legacy Font Mapping",
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"glyphname": {
"type": "string"
},
"codepoint": {
"type": "string",
"pattern": "^U\\+[0-9A-Fa-f]{4,6}$"
},
"description": {
"type": "string"
},
"optionalSource": {
"type": "string"
}
},
"required": ["glyphname"],
"additionalProperties": false
},
"propertyNames": {
"pattern": "^(0x)?[0-9A-Fa-f]+$"
}
}Things to consider:
FWIW: there is a great deal of overlap between the Finale set and the Bravura set of optional glyphs. |
Beta Was this translation helpful? Give feedback.
-
|
To me the mapping of SMuFL names to legacy codepoints makes the most sence, given that each legacy codepoint can translate to several different SMuFL codepoints. This has the added benefit of providing more descriptive mappings than doing it the other way around. If I understand your proposal correctly, this would also take care of your second point, providing simple 1-to-1 key-value (or legacy-smufl) pairs. I'm not totally clear on the reason for an outer Would it be better to provide codepoints as integers rather than strings? If not, I think regular unicode scalar notation, like what SMuFL already uses (e.g., Defining an explicit |
Beta Was this translation helpful? Give feedback.
-
|
I would be happy to present the legacy codepoint keys as either integers or U+. The only reason I did not propose U+ in the first place is that most of these legacy fonts are not Unicode and their codepoints are not U codes. So my preference would integer. To be useful to me, this needs to support the Finale optional glyphs. These are defined in a file distributed inside the macOS Finale.app bundle called Beyond this, however, if Finale is any example, many SMuFL fonts (all of the Finale ones) are redesigns of legacy fonts that contain the same glyphs recoded as SMuFL. To be useful generally, this mapping file should be able to specify a specific SMuFL font it maps to. Perhaps instead of I make no claim to be an expert on the semantics of json schemas. I cobbled that together merely as a starting point for discussion. I thought {
"0x41": {
"glyphname": "noteheadBlack",
"codepoint": "U+E0A4",
"description": "Black notehead"
},
"0x42": {
"glyphname": "noteheadHalf"
}
}If there's a better way, I would welcome the opportunity to learn it. |
Beta Was this translation helpful? Give feedback.
-
|
I would be fine with
My goal is a schema specifying a layout as below (I've switched to decimal integer keys): {
"65": {
"glyphname": "noteheadBlack",
"codepoint": "U+E0A4",
"description": "Black notehead"
},
"66": {
"glyphname": "noteheadHalf"
}
}I don't see an There is a "codepoint" key inside the |
Beta Was this translation helpful? Give feedback.
-
|
Actually, thinking further about |
Beta Was this translation helpful? Give feedback.
-
If you are adamant about mapping legacy codepoints to SMuFL glyph names rather than the other way around, I think you have to allow for each codepoint to map to an array of multiple names, since each legacy glyph can apply to multiple codepoints in SMuFL. In my view, however, this seems to make for an needlessly complicated structure. It's much simpler to just map each possible SMuFL glyph name to the appropriate legacy codepoint, especially since you then don't have to convert the type of the source codepoint or add an additional If annotating the codepoint as a string value, I personally think we should use Unicode scalar notation, as long as this is what SMuFL itself uses. Providing codepoints as integer strings doesn't make that much sense to me, and kind of solidifies the need for my preferred mapping of glyph names to legacy codepoints.
There seems to be a misunderstanding here. As far as I understand it, Property names, however, is intended to validate property names using a specified schema, e.g.: {
"type": "object",
"propertyNames": {
"pattern": "^[a-z_][a-z0-9_]*$"
}
} |
Beta Was this translation helpful? Give feedback.
-
|
I misunderstood your comment about the mapping direction, thinking you were in agreement that legacy codepoints should map to smufl glyphnames. If we map from glyphnames (which is how Finale is already doing it), I don't see how this improves the many-to-1 situation. I would argue it makes it worse. (I already suggested we might well need arrays rather than single values for glyphs and smufl points in the from-legacy design.) I am curious to know the use case you imagine where mapping glyphnames to legacy codepoints is preferable. I am imagining use cases that are exporting legacy files to modern programs, and that use case is much better off with mapping from legacy codepoints. I can make it work either way, though. |
Beta Was this translation helpful? Give feedback.
-
|
Programmatically I don't seem much difference whether you map glyph names to codepoints or the other way around, so I'm myself curious why you think this is so much better). I have the following reasons for preferring a glyph-name-to-codepoint mapping:
|
Beta Was this translation helpful? Give feedback.
-
|
I think we may be talking past each other, so let me lay out the situation from my perspective. Prior ArtThe prior art for this that I know of is the MakeMusic-supplied legacy font mappings. These are indeed keyed by glyphname, as you suggested. In theory this would allow more than one glyph name to map to the same legacy codepoint. However, in practice, not a single one of the legacy mappings from Finale does this. They are all exactly 1-to-1 mappings. (Usually only a subset of legacy codepoints are mapped, which is fine.) Constraints on the Prior ArtThe Finale files were constrained in that many of the glyphs in legacy Maestro (for example) could not be directly mapped to standard glyphnames. Because the SMuFL standard (correctly in my view) discarded glyphs that were combinations of other glyphs, many of the combo-glyphs in Maestro ended up mapped to glyphs in the optional range that kept the combo. This no doubt made Finale's transition to SMuFL much smoother. RequirementsAn absolute requirement of this mapping, for me, is that it provide a definitive answer to the question, "What glyphname (or sequence of glyphnames, see below) should I substitute for this legacy codepoint?" The current Finale mappings answer this question, because they are always strictly 1-to-1. However, in general a mapping from glyphname to legacy codepoint does not answer the question definitively, so it would introduce a lot of complexity were I to try to use it. Complexity is what I'm trying to get rid of. In addition, it would be nice if the new design removed the constraint on the prior art mentioned above. It would allow more mappings to stay in the standard codepoint range. Proposed High-Level Design
|
Beta Was this translation helpful? Give feedback.
-
|
I see your point, and I agree that codepoint-to-glyph mappings fit better with the use case you're outlining. |
Beta Was this translation helpful? Give feedback.
-
|
Two-cents from working with mnx and other JSON schemas -- consider implementing w3c-cg/mnx#428 (comment fields). And/or some sort of free-format optional "explanation" format, for notating things like "anchor point is on the bottom right of glyph, not bottom left as SMuFL expects". Come to think of it, consider implementing optional anchor point x and y shifts. (blank = unknown not 0?). Or something like w3c-cg/mnx#429 so that people can add that later. Please put in the schema a version number as number or string -- we may make mistakes that require revision -- and a |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
I have begun to think about how to map legacy font glyphs to SMuFL and back. Recent versions of Finale have provided mappings as json files for legacy Finale fonts as follows.
<legacyfontname>.jsoncodepoint,legacyCodepoint,description, and optionallynameIsMakeMusic.Here are some example entries. From
Broadway Copyist Text.json:And from
Engraver Time.json:I'm guessing
nameIsMakeMusicindicates that the glyph name was assigned by MakeMusic for an optional glyph. However, other fonts (in particular Bravura) also seem to use some of these names.It seems MakeMusic may have changed their approach mid-stride, because the second example shows a different approach for optional glyphs. The glyph name is correct and useful, but the
codepointis a catchall value that is useless (U+FFFD).I would like to see a collection of legacy font mappings hosted here. Since so many legacy fonts are already using this format, I think it makes a good starting point. However, I think we need to define exactly how to handle mappings to codepoints in the optional range 0xF400-0xFFFF. I personally like adding a boolean, though it should be more generic, such as
optional. And I really dislike mapping to a catchall codepoint. That adds a lot of overhead to any consuming program.This conversation started over at mnx.
Beta Was this translation helpful? Give feedback.
All reactions