Add support for "m:X/X" measure on MarkersPopup & fix! ffpm213 lyrics

This commit is contained in:
Hasinjato 2026-09-08 11:37:33 +03:00
parent 5b493e5b4e
commit d9f8f715ff
4 changed files with 27 additions and 4 deletions

View file

@ -4,6 +4,6 @@ N1:#m ssllsltdd/ m'rdrsltd/ dtltdtlls/ dtdltdrd/ mmfflsffm/ ssdlswss/ sssstwrrd/
N2:mmfffwffm/ sfmrfwfm/ ssf3wf3/ mfsssltd'/ ddrrfmrrd/ ssmrfwfm/ mmfflsffm/ ssd'lswss N2:mmfffwffm/ sfmrfwfm/ ssf3wf3/ mfsssltd'/ ddrrfmrrd/ ssmrfwfm/ mmfflsffm/ ssd'lswss
N3:#s dtltdtlls/ dtdltdrd/ dddsswlrs/ ssddrmfm/ ssllsltdd/ mrdrsltd/ ssttrwttd/ mmdrdmfm N3:#s dtltdtlls/ dtdltdrd/ dddsswlrs/ ssddrmfm/ ssllsltdd/ mrdrsltd/ ssttrwttd/ mmdrdmfm
N4:#t, d5wd3/ d'slfswsd / mmfmrwdtt/ drmfswsd'/ d5wd3/ d'tlfswsd'ddrrswsll/ d't'lfswsd N4:#t, d5wd3/ d'slfswsd / mmfmrwdtt/ drmfswsd'/ d5wd3/ d'tlfswsd'ddrrswsll/ d't'lfswsd
Y1:Ry fana\hy mangetaheta/Mila fitsaharana:/Aza kivy, mahareta,/Sentonao hifarana!/Fa ny tenin'i Jehovah,/Soa mangarangarana;/Loharano tsy mi_ova,/Ao no hasambarana. Y1:Ry fana\hy mangetaheta/Mila fitsaharana:/Aza kivy, mahareta,/Sentonao hifarana!/Fa ny tenin'i Jehova\h,/Soa mangarangarana;/Loharano tsy mi_ova,/Ao no hasambarana.
Y2:Ry tontolo mila vonjy,/Te ho afa-patotra,/Ao ny tenin'ny Mpamonjy/Dia Kristy Mpanavotra!/Teny velona sy mamy,/Feno fananarana;/Ho torina eran-tany,/Fa fampihavanana. Y2:Ry tontolo mila vonjy,/Te ho afa-patotra,/Ao ny tenin'ny Mpamonjy/Dia Kristy Mpanavotra!/Teny velona sy mamy,/Feno fananarana;/Ho torina eran-tany,/Fa fampihavanana.
Y3:Ry Mpanjakan'ny mpanjaka!/Ao, tendreo ny lelako/Mba hitory sy hizaka,/Hampandre ny havako,/Dia tahio ny teny reny/Tsy ho very hasina,/Ka hamo_a zato heny/Ny Baiboly Masina./ Y3:Ry Mpanjakan'ny mpanjaka!/Ao, tendreo ny lelako/Mba hitory sy hizaka,/Hampandre ny havako,/Dia tahio ny teny reny/Tsy ho very hasina,/Ka hamo_a zato heny/Ny Baiboly Masina./

View file

@ -22,9 +22,9 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.compose.ui.window.Popup import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.window.PopupProperties
import mg.dot.feufaro.viewmodel.measureOptions
data class Marker( data class Marker(
val abbr: String, val abbr: String,
@ -138,6 +138,14 @@ private val markerGroups = listOf(
markers = listOf( markers = listOf(
Marker("Dô dia", "Modulation", canEditValue = true, defaultValue = "C", options = Transpose.keyToNumber) Marker("Dô dia", "Modulation", canEditValue = true, defaultValue = "C", options = Transpose.keyToNumber)
) )
),
MarkerGroup(
title = "Mesure",
markers = listOf(
Marker("m:", measureOptions.firstOrNull { it.first == "4/4" } ?.second ?: "", canEditValue = true, defaultValue = "4/4", options = measureOptions.map { it.first })
)
) )
) )

View file

@ -1770,7 +1770,9 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val finalLines = (prefix + cleanedBlocks.joinToString("")) val finalLines = (prefix + cleanedBlocks.joinToString(""))
.replace("2z11", "y") .replace("2z11", "y")
.replace("/", "/ ") .replace(Regex("""\$\{.*?\}|/""")) { match ->
if (match.value == "/") "/ " else match.value
}
.replace(Regex("\\s+"), " ") .replace(Regex("\\s+"), " ")
.trim() .trim()

View file

@ -531,7 +531,7 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode
val tempoRegex = Regex("""^(♩\s*=\s*\d+)""", RegexOption.IGNORE_CASE) val tempoRegex = Regex("""^(♩\s*=\s*\d+)""", RegexOption.IGNORE_CASE)
val modulaRegex = Regex("""^(D(?:ô|o)?\s*dia\s*(?:C|Db|D|Eb|E|F|Gb|G|Ab|A|Bb|B))""", RegexOption.IGNORE_CASE) val modulaRegex = Regex("""^(D(?:ô|o)?\s*dia\s*(?:C|Db|D|Eb|E|F|Gb|G|Ab|A|Bb|B))""", RegexOption.IGNORE_CASE)
val measureRegex = Regex("""^\d+\s*/\s*\d+""")
// Lexer // Lexer
while (remaining.isNotEmpty()) { while (remaining.isNotEmpty()) {
remaining = remaining.trimStart() remaining = remaining.trimStart()
@ -551,6 +551,14 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode
continue continue
} }
val measureMatch = measureRegex.find(remaining)
if (measureMatch != null) {
val cleanMeasure = measureMatch.value.replace(" ", "")
tokens.add(cleanMeasure)
remaining = remaining.substring(measureMatch.value.length)
continue
}
val matchedMarker = allStaticMarkers.find { remaining.startsWith(it, ignoreCase = true) } val matchedMarker = allStaticMarkers.find { remaining.startsWith(it, ignoreCase = true) }
if (matchedMarker != null) { if (matchedMarker != null) {
tokens.add(matchedMarker) tokens.add(matchedMarker)
@ -593,6 +601,7 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode
val isDSFin = markerText.trim().contains(Regex("""D\.?S\.?""", RegexOption.IGNORE_CASE)) && markerText.trim().contains(Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE)) val isDSFin = markerText.trim().contains(Regex("""D\.?S\.?""", RegexOption.IGNORE_CASE)) && markerText.trim().contains(Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE))
val isRit = Regex("""rit\.?|ritard\.?|ritenuto\.?|ritardando""", RegexOption.IGNORE_CASE) val isRit = Regex("""rit\.?|ritard\.?|ritenuto\.?|ritardando""", RegexOption.IGNORE_CASE)
val isRall = Regex("""rall\.?|rallent\.?|rallentando""", RegexOption.IGNORE_CASE) val isRall = Regex("""rall\.?|rallent\.?|rallentando""", RegexOption.IGNORE_CASE)
val isMeasure = markerText.trim().matches(Regex("""^(\d+/\d+)""", RegexOption.IGNORE_CASE))
var searchIndex = index + 1 var searchIndex = index + 1
var lastValidIndex = index var lastValidIndex = index
@ -633,6 +642,10 @@ class SharedScreenModel(private val fileRepository: FileRepository) : ScreenMode
currentMarker = currentMarker.copy(lastCallerMarker = targetIndex) currentMarker = currentMarker.copy(lastCallerMarker = targetIndex)
newMarkerList.add("Rallentando") newMarkerList.add("Rallentando")
} }
isMeasure -> {
newGridIndex = targetIndex
newMarkerList.add("${markerText.trim()}")
}
else -> { else -> {
newMarkerList.add(markerText) newMarkerList.add(markerText)
} }