KeyChange
This commit is contained in:
parent
c4cb836bd5
commit
a1c4a34ef0
9 changed files with 128 additions and 8 deletions
|
|
@ -2,7 +2,8 @@
|
||||||
"themeMode": "DARK",
|
"themeMode": "DARK",
|
||||||
"fontSize": 18.5,
|
"fontSize": 18.5,
|
||||||
"playlist": [
|
"playlist": [
|
||||||
"assets://ff-33.txt",
|
"assets://ffpm-444-2.txt",
|
||||||
|
"assets://ffpm-760.txt",
|
||||||
"assets://ews-456.txt",
|
"assets://ews-456.txt",
|
||||||
"assets://ews-1.txt",
|
"assets://ews-1.txt",
|
||||||
"assets://ews-2.txt",
|
"assets://ews-2.txt",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
M0:|c:Bb|m:6/4|t:FFPM 444 Ry Raiko Feno Antra|a:R. Baron 1847-1907|h:|r:7.6.7.6.D.
|
||||||
|
U0:zK:4 8484 C8/4 8484 (C8)/4 8484 C8/4 84(44)4 K/${c:F}4 8484 C8/4 84(44)4 K/4 8484 C8/4 8484 K/${c:Bb}4 8484 C8/4 8484 (C8)/4 8484 C8/4 84(44)4 K
|
||||||
|
N1:#m,ssslssm/sddrrm'r/rddttld/lsdtltd/#dssslssm/ssrrdrm/ssslssm/ssfmrd/#m,ssslssm/sddrrm'r/rddttld/lsdtltd
|
||||||
|
N2:#d,mmmfmmd/msssss-/fmmSSll/fmsf-fm/#l,d7/dtttltd/mmmfmmd/mmrdtd/#d,mmmfmmd/ms5-/fmmSSll/fmsf-fm
|
||||||
|
N3:#s,dddddds/dddttdt/tdmmrdd/ddmr-rd/mmmfmm#rs/mrss-ss/sddddds/ssssfm/#s,d6s/dddttdt/tdmmrdd/ddmr-rd
|
||||||
|
N4:#d,d7/dmmssd's/sllmmff/fsss-sd/#s,d7/dsss-sd/d7/dssssd/#d,d7/dmmssds/sllmmff/fsss-sd
|
||||||
|
Y1:Ry Raiko feno antra!/Inty ny zanakao,/Ny foko dia mahantra/Ra\ha lavitra\ aminao;/Fa tany karankaina/Izao tontolo\ izao/Ka reraka ny aina/Mihataka\ aminao.${R=}Ry Raiko feno antra!/Inty ny zanakao,/Ny foko dia mahantra/Ra\ha lavitra\ aminao.
|
||||||
|
Y2:Nivezivezy aho/Nikaro-java-tsoa,/Izay rehetra hita/Nandramana\ avokoa;/Nandany taona maro/Nanaran-tsitrapo,/Kanefa tsy nahazo/Izay mahafa-po./Ry Raiko feno antra!
|
||||||
|
Y3:Mamitaka mihitsy/Izao tontolo\ izao,/Ny mamy dia mangidy,/I\zay tena soa tsy ao;/Koa aza mba\ adalainy/Intsony re, ny fo!/Andeha mba ho hendry/Hatramin’ny anio./Ry Raiko feno antra!
|
||||||
|
Y4:Ry Jeso, Mofon’aina/Sy ranon’aina koa/Hianao no mahatony/Izay filan’ny fo;/Hianao no mahavoky/Hianao no manome/Izay irin’ny foko,/Dia hasambaram-be/Ry Raiko feno antra!
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
M0:|c:A|m:6/4|t:FFPM 760 Aza Mba Manadino|a:J. Richardson 1844-1922|h:(Old. St. Co., p. 71)|r:P.M.
|
||||||
|
U0:z0:444(44)4 C84 8484 K/4 84(44)4 C84 8484 K/4 8484 C84 8484 Kz4/ 444(44)4 C84 8484 Kz4/ ${p}4448z4 ${f}4448z4 /${ff}44484 8484 8484 O
|
||||||
|
N1:#s,m4-rdldsdmdr/rmmm-rdldtdmrd/drrrmfrrsmdmr/m4-rdldtdmrd/r4m4/fffmml's'frtdmrd
|
||||||
|
N2:#f,sssd-tlfls5/sssd-tlfls5/dtttdrttd4t/sssd-tlfls5/s8/d8ls5
|
||||||
|
N3:#t,d4-d8t/tddd-d3frmsfm/ms12/d4-d3frmsfm/t4d4/d5fslfrmsfm
|
||||||
|
N4:#d,d4rmfffmmdms/sdddrmfffs4d'/d's7mmmds/d4rmfffs4d/s4d4/l3ssfmffs4d
|
||||||
|
Y1:Aza mba manadino ny ray sy reninao;/Fa izy no nitaiza sy nanasoa anao;/Ka na\ aiza na\ aiza\ aleha an-tany lavitra,/Aza mba manadino ny ray sy reninao;/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny ray sy reninay.
|
||||||
|
Y2:Aza mba manadino ny tanindrazanao,/Tsarovy ny tanàna i\zay nahabe anao;/Fadio izay tsy mety fanaony fahizay,/Aza mba manadino/Ny tanindrazanao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny tanindrazanay.
|
||||||
|
Y3:Aza mba manadino ireo mpitondra\ anao,/Araho ny lalàna mba hi_adananao:/Ka na\ aiza na\ aiza\ aleha an-tany lavitra,/Aza mba manadino/Ireo mpitondra\ anao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Izay mpitondra\ anay.
|
||||||
|
Y4:Aza mba manadino ny fivavahanao,/Ataovy isan’andro mba hamonjena\ anao;/Mpitondra, ray sy reny ny tany, tena koa,/Aza mba manadino ny fivavahanao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny fivavahanay.
|
||||||
|
|
@ -71,6 +71,7 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
|
||||||
'[' -> toggleInSquareParen(voiceNumber, true, x)
|
'[' -> toggleInSquareParen(voiceNumber, true, x)
|
||||||
')' -> toggleInRoundParen(voiceNumber, false, x)
|
')' -> toggleInRoundParen(voiceNumber, false, x)
|
||||||
']' -> toggleInSquareParen(voiceNumber, false, x)
|
']' -> toggleInSquareParen(voiceNumber, false, x)
|
||||||
|
'>' -> {}
|
||||||
else -> {
|
else -> {
|
||||||
x++
|
x++
|
||||||
finalText += it
|
finalText += it
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,27 @@ class PTemplate (val template: String, val separatorAfter: String, private val m
|
||||||
return markers.contains(marker)
|
return markers.contains(marker)
|
||||||
}
|
}
|
||||||
fun markerToString(): String {
|
fun markerToString(): String {
|
||||||
if (markers.size == 0) {
|
if (markers.isEmpty()) {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
return markers.joinToString(separator = "") {
|
return markers.joinToString(separator = "") {
|
||||||
it.replace(Regex("^\\$\\{([a-z]:)?(.*)\\}"), "$2")
|
it.replace(Regex("^\\$\\{([abd-z]:)?(.*)\\}"), "$2")
|
||||||
.replace("\$Q", "\uD834\uDD10")
|
.replace("\$Q", "\uD834\uDD10")
|
||||||
.replace(Regex("^[<=>]$"), "")
|
.replace(Regex("^[<=>]$"), "")
|
||||||
.replace($$"$T", "")
|
.replace($$"$T", "")
|
||||||
|
.replace(Regex("^c:(.*)"), "Do dia $1")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fun hasKeyChange(): String {
|
||||||
|
var returnFun = ""
|
||||||
|
markers.map {
|
||||||
|
val regexFound = Regex("^\\$\\{c:(..?)\\}").find(it)
|
||||||
|
if (regexFound != null) {
|
||||||
|
returnFun = regexFound.groupValues[1]
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
return returnFun
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -18,11 +18,12 @@ class ParseULine (var line: String, var measure: Int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun parsed() : String {
|
fun parsed() : String {
|
||||||
val matchResult = Regex("^z([048C]):(.+)$").find(line)
|
val matchResult = Regex("^z([048CK]):(.+)$").find(line)
|
||||||
if (matchResult != null) {
|
if (matchResult != null) {
|
||||||
val capturedChar = matchResult.groups[1]!!.value
|
val capturedChar = matchResult.groups[1]!!.value
|
||||||
cursorX = when (capturedChar) {
|
cursorX = when (capturedChar) {
|
||||||
"C" -> 12
|
"C" -> 12
|
||||||
|
"K" -> 20
|
||||||
else -> capturedChar.toInt()
|
else -> capturedChar.toInt()
|
||||||
}
|
}
|
||||||
line = matchResult.groups[2]!!.value
|
line = matchResult.groups[2]!!.value
|
||||||
|
|
@ -84,6 +85,9 @@ class ParseULine (var line: String, var measure: Int) {
|
||||||
charX = it
|
charX = it
|
||||||
}
|
}
|
||||||
'W' -> repeat(8) { parseUStage2('4')}
|
'W' -> repeat(8) { parseUStage2('4')}
|
||||||
|
'S' -> repeat(7) { parseUStage2('4')}
|
||||||
|
'O' -> repeat(6) { parseUStage2('4')}
|
||||||
|
'K' -> repeat(5) { parseUStage2('4')}
|
||||||
'G' -> repeat(4) { parseUStage2('4') }
|
'G' -> repeat(4) { parseUStage2('4') }
|
||||||
'C' -> repeat(3) { parseUStage2('4') }
|
'C' -> repeat(3) { parseUStage2('4') }
|
||||||
'8' -> repeat(2) { parseUStage2('4') }
|
'8' -> repeat(2) { parseUStage2('4') }
|
||||||
|
|
|
||||||
|
|
@ -32,13 +32,16 @@ class TUNote (private val detailNote: MutableList<Note> = mutableListOf()){
|
||||||
}
|
}
|
||||||
fun annotate(voiceNumber: Int) {
|
fun annotate(voiceNumber: Int) {
|
||||||
val annotatedTUO = AnnotatedTUO(this.toString(), voiceNumber)
|
val annotatedTUO = AnnotatedTUO(this.toString(), voiceNumber)
|
||||||
annotations = if (annotatedTUO.underlineSpec.size > 0) {
|
annotations = if (annotatedTUO.underlineSpec.isNotEmpty()) {
|
||||||
annotatedTUO
|
annotatedTUO
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
override fun toString() : String {
|
override fun toString() : String {
|
||||||
|
return toString("", "")
|
||||||
|
}
|
||||||
|
fun toString(fromKey: String = "", toKey: String = "") : String {
|
||||||
var result = detailNote.joinToString (separator = ""){ it.toString() }
|
var result = detailNote.joinToString (separator = ""){ it.toString() }
|
||||||
.replace(Regex("\\. *,-$"), "")
|
.replace(Regex("\\. *,-$"), "")
|
||||||
.replace(Regex(",-$"), "")
|
.replace(Regex(",-$"), "")
|
||||||
|
|
@ -57,6 +60,9 @@ class TUNote (private val detailNote: MutableList<Note> = mutableListOf()){
|
||||||
.replace("-", "―")
|
.replace("-", "―")
|
||||||
.replace(".", "\u2022")
|
.replace(".", "\u2022")
|
||||||
.replace("z", "")
|
.replace("z", "")
|
||||||
|
if ((fromKey != "") && (toKey != "")) {
|
||||||
|
result = ">" + Transpose.transpose(result, fromKey, toKey) + ">" + result
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -36,6 +36,10 @@ import mg.dot.feufaro.data.GridTUOData
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import androidx.compose.ui.geometry.Size
|
import androidx.compose.ui.geometry.Size
|
||||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||||
|
import androidx.compose.ui.text.SpanStyle
|
||||||
|
import androidx.compose.ui.text.buildAnnotatedString
|
||||||
|
import androidx.compose.ui.text.style.BaselineShift
|
||||||
|
import androidx.compose.ui.text.withStyle
|
||||||
|
|
||||||
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
|
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
|
||||||
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
|
|
@ -46,6 +50,9 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
val numBlock: Int
|
val numBlock: Int
|
||||||
var markerBefore: String = ""
|
var markerBefore: String = ""
|
||||||
private var annotated : Boolean
|
private var annotated : Boolean
|
||||||
|
var transposeNewKey: String = ""
|
||||||
|
var transposeOldKey: String = ""
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
var nbBlock: Int = 0
|
var nbBlock: Int = 0
|
||||||
var sep1: String = ""
|
var sep1: String = ""
|
||||||
|
|
@ -150,9 +157,18 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
val markersBefore = ""//pTemplate.template.replace(Regex("[a-yA-Y\\(\\[].*"), "")
|
val markersBefore = ""//pTemplate.template.replace(Regex("[a-yA-Y\\(\\[].*"), "")
|
||||||
return tuNotes.drop(1).joinToString (separator = "\n"){
|
val transposeFrom = pTemplate.hasKeyChange()
|
||||||
separatorBefore + markersBefore + it.toString().replace(Regex("[\\(\\)\\[\\]]"), "")
|
val transposeTo = if (transposeFrom != "") {
|
||||||
|
transposeOldKey = transposeFrom
|
||||||
|
prevTUO?.transposeOldKey ?: "Bb"
|
||||||
|
} else {
|
||||||
|
transposeOldKey = prevTUO?.transposeOldKey ?: "Bb"
|
||||||
|
"" }
|
||||||
|
|
||||||
|
val retour = tuNotes.drop(1).joinToString (separator = "\n"){
|
||||||
|
separatorBefore + markersBefore + it.toString(transposeFrom, transposeTo).replace(Regex("[\\(\\)\\[\\]]"), "")
|
||||||
}
|
}
|
||||||
|
return retour
|
||||||
}
|
}
|
||||||
fun annotate() {
|
fun annotate() {
|
||||||
// We must annotate once, because, annotations can be called asynchronously after first filling
|
// We must annotate once, because, annotations can be called asynchronously after first filling
|
||||||
|
|
@ -339,8 +355,26 @@ fun TimeUnitComposable(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
){
|
){
|
||||||
|
val annotatedText = buildAnnotatedString {
|
||||||
|
multiLineText.split(">").mapIndexed { index, text ->
|
||||||
|
if (index %2 == 0) {
|
||||||
|
append(text)
|
||||||
|
} else {
|
||||||
|
withStyle(
|
||||||
|
style = SpanStyle(
|
||||||
|
fontSize = 10.sp,
|
||||||
|
baselineShift = BaselineShift.Superscript,
|
||||||
|
//fontStyle = FontStyle.Italic,
|
||||||
|
color = Color.Blue
|
||||||
|
)) {
|
||||||
|
append(text+" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Text(
|
Text(
|
||||||
text = multiLineText + mutableNoteVersionX,
|
text = annotatedText,
|
||||||
onTextLayout = { result ->
|
onTextLayout = { result ->
|
||||||
textLayoutResult = result
|
textLayoutResult = result
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package mg.dot.feufaro.solfa
|
||||||
|
|
||||||
|
class Transpose {
|
||||||
|
companion object {
|
||||||
|
val noteToNumber = listOf("d", "di", "r", "ri", "m", "f", "fi", "s", "si", "l", "ta", "t")
|
||||||
|
val keyToNumber = listOf("C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" )
|
||||||
|
fun transpose(note: String, fromKey: String, toKey: String): String {
|
||||||
|
val regexFound = Regex("^([drmfslt][ia]?)([¹²³₁₂₃]?)(.*)").find(note)
|
||||||
|
if (regexFound == null) {
|
||||||
|
return note
|
||||||
|
}
|
||||||
|
val noteNaked = regexFound.groupValues[1]
|
||||||
|
val noteNum = noteToNumber.indexOf(noteNaked)
|
||||||
|
val oldKey = keyToNumber.indexOf(fromKey)
|
||||||
|
val newKey = keyToNumber.indexOf(toKey)
|
||||||
|
var newNoteNum = noteNum - newKey + oldKey
|
||||||
|
var suffix = ""
|
||||||
|
val noteSize = noteToNumber.size
|
||||||
|
if (newNoteNum < 0) {
|
||||||
|
newNoteNum += noteSize
|
||||||
|
suffix = ","
|
||||||
|
}
|
||||||
|
if (newNoteNum >= noteSize) {
|
||||||
|
newNoteNum -= noteSize
|
||||||
|
suffix = "'"
|
||||||
|
}
|
||||||
|
val newNote = noteToNumber[newNoteNum] + regexFound.groupValues[2] + suffix
|
||||||
|
return newNote.replace("¹,", "")
|
||||||
|
.replace("¹'", "²")
|
||||||
|
.replace("²,", "¹")
|
||||||
|
.replace("²'", "³")
|
||||||
|
.replace("³,", "²")
|
||||||
|
.replace("₁'", "")
|
||||||
|
.replace("₁,", "₂")
|
||||||
|
.replace("₂'", "₁")
|
||||||
|
.replace("₂,", "₃")
|
||||||
|
.replace("₃'", "₂")
|
||||||
|
.replace(",", "₁")
|
||||||
|
.replace("'", "¹") + regexFound.groupValues[3]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue