Support "DSFin" marker on MidiPlayer - android

This commit is contained in:
Hasinjato 2026-07-20 14:32:08 +03:00
parent 790ed83ddc
commit 3bbe9367b7

View file

@ -410,21 +410,41 @@ actual class FMediaPlayer actual constructor(
var lastFactor=Dynamic.MF.factor
val ritRegex = Regex("""rit\.?|ritard\.?|ritenuto\.?|ritardando""", RegexOption.IGNORE_CASE)
val rallRegex = Regex("""rall\.?|rallent\.?|rallentando""", RegexOption.IGNORE_CASE)
val dsR = Regex("""D\.?S\.?""");
val dcR = Regex("""D\.?C\.?""")
/*val dsG = Regex("""D\.?S\.?_GROUP_PART""");
val dcG = Regex("""D\.?C\.?_GROUP_PART""")*/
val finReg = Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE)
metadataList.forEach { midiMarker ->
val ci = midiMarker.gridIndex ?: 0
val dsR = Regex("""D\.?S\.?""");
val dcR = Regex("""D\.?C\.?""")
val dsG = Regex("""D\.?S\.?_GROUP_PART""");
val dcG = Regex("""D\.?C\.?_GROUP_PART""")
val finReg = Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE)
val last_grid = sharedScreenModel.getTotalGridCount()
val hairPins = sharedScreenModel.getHairPins()
val markerList = midiMarker.marker
markerList.forEach { marker ->
var i = 0
while(i < markerList.size) {
val marker = markerList[i]
val mTrim = marker.trim()
val nextMarker = markerList.getOrNull(i + 1)
val nextTrim = nextMarker?.trim() ?: ""
val isDsFin = (dsR.containsMatchIn(mTrim) && finReg.containsMatchIn(nextTrim)) ||
(dsR.containsMatchIn(nextTrim) && finReg.containsMatchIn(mTrim))
val isDcFin = (dcR.containsMatchIn(mTrim) && finReg.containsMatchIn(nextTrim)) ||
(dcR.containsMatchIn(nextTrim) && finReg.containsMatchIn(mTrim))
when {
isDsFin || isDcFin -> {
val target = if (lastSegno > 0) lastSegno else 0
navigationSteps.add(NavigationStep(
marker = "$mTrim$nextTrim",
gridIndex = ci,
targetGrid = if (isDsFin) target else 0
))
i += 2
continue
}
marker.contains("$") -> lastSegno = ci
marker.contains("\uD834\uDD10") -> {
@ -457,24 +477,12 @@ actual class FMediaPlayer actual constructor(
)
)
}
dsG.matches(mTrim) -> {
val target = if(lastSegno>0) lastSegno else 0
val indx = if((last_grid-ci)<=0) ci-1 else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=target))
}
dsR.matches(mTrim) || marker == "DSFin" -> {
dsR.matches(mTrim) -> {
navigationSteps.add(NavigationStep(marker, ci,
targetGrid = if(lastSegno>0) lastSegno else 0))
}
dcG.matches(mTrim) -> {
val indx = if((last_grid-ci)<=0) ci-1 else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=0))
println("DC_GROUP créé à $indx → 0")
}
dcR.matches(mTrim) && !marker.contains("DC_GROUP_PART") -> {
dcR.matches(mTrim) -> {
val indx = if((last_grid-ci)<=0) ci else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=0))
println("DC créé à $indx → 0")
@ -483,34 +491,25 @@ actual class FMediaPlayer actual constructor(
// ── Farany ────────────────────────────────
finReg.containsMatchIn(mTrim) -> {
val hasDcAfter = metadataList.any { m ->
val after = (m.gridIndex ?: 0) > ci
val hasMarker = m.marker.any { mk ->
val value = mk.trim()
val ok = dcG.matches(value) || dcR.matches(value)
ok
}
after && hasMarker
(m.gridIndex ?: 0) > ci && m.marker.any { mk -> dcR.containsMatchIn(mk) }
}
if (hasDcAfter) {
navigationSteps.add(NavigationStep(
marker = marker,
gridIndex = ci,
navigationSteps.add(
NavigationStep(
marker,
ci,
targetGrid = last_grid,
isFarany = true,
faranyActive = false
))
println("Farany mémorisé à $ci")
isFarany = true, faranyActive = false)
)
} else {
val verse = sharedScreenModel.stanza.value
val verses = sharedScreenModel.nbStanzas.value
println("Farany ignoré à $ci i $verse == $verses")
navigationSteps.add(
NavigationStep(
marker="${marker}_STZ",
gridIndex=ci,
isFarany = true,
faranyActive = if(verse == verses) false else true
marker = "${marker}_STZ",
gridIndex = ci,
isFarany = true, faranyActive = (verse != verses)
)
)
}
@ -553,6 +552,7 @@ actual class FMediaPlayer actual constructor(
))
}
}
i++
}
}
}