From 3bbe9367b77f3910b9f98c889c40171e84837841 Mon Sep 17 00:00:00 2001 From: Hasinjato Date: Mon, 20 Jul 2026 14:32:08 +0300 Subject: [PATCH] Support "DSFin" marker on MidiPlayer - android --- .../kotlin/mg/dot/feufaro/midi/MidiPlayer.kt | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/midi/MidiPlayer.kt b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/midi/MidiPlayer.kt index 36fc437..b50b9ab 100644 --- a/composeApp/src/androidMain/kotlin/mg/dot/feufaro/midi/MidiPlayer.kt +++ b/composeApp/src/androidMain/kotlin/mg/dot/feufaro/midi/MidiPlayer.kt @@ -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, - targetGrid = last_grid, - isFarany = true, - faranyActive = false - )) - println("Farany mémorisé à $ci") + navigationSteps.add( + NavigationStep( + marker, + ci, + targetGrid = last_grid, + 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++ } } }