ScreenTranspose, first draft
This commit is contained in:
parent
a1c4a34ef0
commit
7df3312f84
19 changed files with 229 additions and 67 deletions
|
|
@ -55,6 +55,8 @@ kotlin {
|
||||||
implementation(libs.koin.compose.viewmodel.navigation)
|
implementation(libs.koin.compose.viewmodel.navigation)
|
||||||
implementation(libs.bundles.voyager)
|
implementation(libs.bundles.voyager)
|
||||||
implementation(libs.cafe.voyager.koin)
|
implementation(libs.cafe.voyager.koin)
|
||||||
|
implementation(libs.androidx.material.icons.extended)
|
||||||
|
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
commonTest.dependencies {
|
||||||
implementation(libs.kotlin.test)
|
implementation(libs.kotlin.test)
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -2,6 +2,14 @@
|
||||||
"themeMode": "DARK",
|
"themeMode": "DARK",
|
||||||
"fontSize": 18.5,
|
"fontSize": 18.5,
|
||||||
"playlist": [
|
"playlist": [
|
||||||
|
"assets://ffpm-428.txt",
|
||||||
|
"assets://ffpm-449.txt",
|
||||||
|
"assets://ffpm-489.txt",
|
||||||
|
"assets://ffpm-21.txt",
|
||||||
|
"assets://ffpm-179.txt",
|
||||||
|
"assets://ff-33.txt",
|
||||||
|
"assets://ffpm-297.txt",
|
||||||
|
"assets://ffpm-33.txt",
|
||||||
"assets://ffpm-444-2.txt",
|
"assets://ffpm-444-2.txt",
|
||||||
"assets://ffpm-760.txt",
|
"assets://ffpm-760.txt",
|
||||||
"assets://ews-456.txt",
|
"assets://ews-456.txt",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
M0:|c:Bb|m:4/4|r:12.13.14.15|t:FFPM 179 Ny Fanahy Masina Efa Tonga Tokoa|a:G. Ramiarison 1919- (Faha 100 taonan'ny IEB)|h:G. Ramiarison 1919-
|
||||||
|
U0:z0:62444444 844(444)/4 6244(44)44 4444 (444)/4 62422 (444)4 62422 (444)/4 6244 (222)244 42244Cz4
|
||||||
|
N1:#s,ssFsdmmrdrrm--/sddtll-sdmmrdr--/srDrfmr--smRmsfm--/#t,dssfff--fmmrfrdtd
|
||||||
|
N2:#r,mmrmmsssssss--/mmmsff-smssFFsFs/sfmfssstlssFstls--/ssssssltlssflfmrm
|
||||||
|
N3:#s,ddlssddtdttd--/ddsltdtddddldtdr/ttTtrdtrdtd6--/mmdrttdrtddlllsss
|
||||||
|
N4:#d,d7rmssdsm/d6rmdddrrslt/s7--s#r,d6sm/d,dmsss--sd,mfrfssd,
|
||||||
|
Y1:Ny Fanahy Masina\ efa tonga tokoa./Mba homba ny mpitory ny Teny mahasoa./Koa mitsangana izao ande\ha ry mahery fo/Hatramin’ny faran’ny tany torio ny Teny soa.
|
||||||
|
Y2:Vo_asaron’ny\ aizim-pito Ny Nosinao;/Ny ody sy ny sampy no notompoiny tao;/Ny fahazarana koa, nangeja mafy tokoa,/Kanefa tonga ny mazava: Resy ny aizina\ ao.
|
||||||
|
Y3:Ry fana\hy voatafy hery ny Tompo\ anie/Ka efa miandry\ ana_o, injay miteny hoe:/«Angony, eny antsoy, Hanatona avokoa/Ny firenena eran-tany ho mpianatro tokoa ».
|
||||||
|
Y4:Tompo ti_a ô, ekeko ny antsonao;/Hafoiko ny hareko, ny tenako izao,/Ho vavolombelona, hijoro, hanafika,/Hitory sy hamafy ko_a: Tafio ny herinao.
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
M0:|c:F|m:4/4|r:8|t:FFPM 21 Derao Andriamanitra|a:Johanesa, Ambato, 1880 eo ho eo 1914|h:P. Nilsen Lund, (?) 1842-1914
|
||||||
|
U0:zC:(22) 44yyC/(22)44yyC/(22) 44yyC/4 yy44C/(22)44yyC/444yyC/(22)44yyC/4yy44C/ (22)4(22)(22)(22)yy4/4yy44C
|
||||||
|
N1:drmmmrmfs/drmmmsfmr/drmmmrmsl/lsmdrmrd/rmffmmrrd/rmlssFFs/drmmmrmsl/lsmdrmrd/rmf-4r-slsfm/sllsfmrd
|
||||||
|
N2:#s,d-dddtdrm/dtdrddrdt/d-ddssddd/d6td/t-ds'ssSSl/tdmrrddt/d-ddssddd/d6td/tdr-4t-ddttd/rdddrdtd
|
||||||
|
N3:mfs7/mfsSllsss/mfssdrdmf/fssmlsfm/s-frddmmm/ssd'ttlls/mfssdrdmf/fssmlsfm/s-s-4s-s5/rmfslsfm
|
||||||
|
N4:#f,d-dms'f'mrd/mrdtlltds/d-dddtlsf/fmslfssd/s-ltddttl/sdlrrr,r,s/d-dddtlsf/fm,slfssd/zzzsltrs'f'ms'rs'dtlfmfssd
|
||||||
|
Y1:Derao Andri_amanitra,/Ry vazan-tany efatra,/Fa Izy no mamindra fo/Ka mety manome ny zo,/Naniraka ny Zanany,/Hanavotra ny olony/Ny sandriny tsy toha re,/Fa manan-kery lehibe./Mala_3za ny Anarany,/Fa lehibe ny asany.
|
||||||
|
Y2:Ny zavatra rehetra e,/Ny ranomasin-dehibe,/Ire_o tendrombohitra,/Ny saha feno ahitra,/Ny hazo sy ny vorona/Ny vato sy ny zavona,/Ny voninkazo manitra,/Ny endriky ny lanitra/Dia sa_3my tsy mijanona/Midera ny Mpamorona.
|
||||||
|
Y3:Ry olona navotana,/Mba mitsangàna faingana,/Ka miderà ny Tomponao,/Izay nanavotra anao,/Fa he, ny voninahiny/Manerana ny taniny./Tendre_o ny valihanao/Ka miventesa hira vao:/Ry vo_3avonjy ô, derao/Ny Ray Mpamorona anao!
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
M0:|c:Ab|m:6/4|r:7.6.7.6.8.7.8.8.|t:FFPM 297 Ry Havanay Malala|a:V. Rasamoelina|h:G.C. Stebbins 1846-1945
|
||||||
|
U0:zK:48484C8/48484K/48484C8/48484(C444)/4444444448z44444444448z4/624444624444624624Kz4/4444444448z44444444448z4/4444448484C(84)K
|
||||||
|
N1:#s,ssmfmmr/ssrmrd/dldflsm/mmrlrr-3/m-3Rmd-3d-3tdl-3/s-3dms'-3mdr-6/m-3Rmd-3d-3tdl-3/s-3dmrltsd-3
|
||||||
|
N2:#r,mmslsss/fffsfm/mfllfms/sF4s-3/s-3Fsm-3l-3Slf-3/m-3sdm'-3ddtttllFs/s-3Fsm-3l-3Slf-3/m-3msf4mfrm
|
||||||
|
N3:#s,d6t/t5d/d7/d5t-3/d4-zs4ldff-zd4/d4-zd4-zsssFfrt/d4-zs4ldff-zd4/d4-dtrrtdlSs
|
||||||
|
N4:#d,d5ss/s5d/df4dd/dr4sfmr/d4-zd4f4-zf4/d4-z#dd4-zr3#d,r3s/d4-zd4f4-zf4/s4-s5d-3
|
||||||
|
Y1:Ry havanay malala!/Manolo-tena\ izao./Fotoana mahafaly/Iraisan-tsika\ anio;/Fa_4ly ‘zahay_4ma\n_4dray anao_4/Hia_4ra-mano\m_4po ny Ray,_7/Je_4so anie_4ha\n_4dray anao!_4/Mba_4ho sakai_zany_tokoa.
|
||||||
|
Y2:Hajao ny fanekena,/Adidinao efao./Ataovy tsy terena/Izay andraikitrao./Je_4reo Jeso_4ka_4matokia,_4/Fa_4Izy no_4hiahy\ anao._7/Ka_4mandrosoa_4sy_4mifalia,_4/Ha_4nefa\ izay anjaranao.
|
||||||
|
O1:3,4:50:Faly 'zahay_3mandray anao, faly 'zahay_3mandray anao/Faly 'zahay_3mandray anao_3Hiara-manompo ny Ray/Jeso anie_3Handray anao, Jeso anie_3handray anao/Mba ho sakai_zany tokoa.
|
||||||
|
O2:3,4:50:Jereo Jeso_3Ka matokia, Jereo Jeso_3Ka matokia/Jereo Jeso_3Ka matokia_3Fa Izy no hiahy\ anao./Ka mandrosoa_3sy mifalia, Ka mandrosoa_3sy mifalia/Hanefa\ izay _anjaranao anja
|
||||||
|
O1:3:137:tokoa
|
||||||
|
02:3:137:ranao
|
||||||
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
M0:|c:A|m:4/4|r:7.7.7.6.D|t:FFPM 33 - Tompo ô, Tsy Takatray|a:J. Rakotonirainy, 1926-|h:J.Rakotonirainy, 1926-
|
||||||
|
U0:z0:444444(44)/4444448/4444444/44444(4444)/444444(44)/4444448/4444444/44444G
|
||||||
|
N1:#l,mdfdmrd-/dtdrdls/dtdrmfs/mrdtls,---/mdfdmrd-/dtdrdls/dtdrmfs/fmdmrd
|
||||||
|
N2:#m,dsdsdtsT/lSlllfm/ssstddd/dtssFs---/dsdsdtsT/lSltlfm/ssstddd/ddsdts
|
||||||
|
N3:#t,smlmsfm-/d7/dtdrmlm/ssmrdr---/smlmsfm-/d7/dtdrmlm/lsmsfm
|
||||||
|
N4:#d,d4ssd-/f6d/mrmsd'lm/dt,drrsfmr/d4ssd-/f6d/mrmsd'lm/fssss,d
|
||||||
|
Y1:Tompo ô, tsy takatray/Ny hasoan’ny antranao;/Zava-mahagaga\ anay/Ny fiti_avanao./He, mpanota izahay/Nefa haso_avinao;/Avotr’aina azonay;/Misaotra no atao.
|
||||||
|
Y2:Tompo ô, Mpanjakanay/Fatratra ny herinao/Ts’isy zavatra izay/Ma\hasakana Anao!/Nefa mora fo Hianao/Fa mandefitra\ aminay,/Ko_a dia misaotra\ Anao/Fa afaka izahay.
|
||||||
|
Y3:Tompo Andriamanitray,/Avy izahay izao/Raiso ny fi_ainanay;/Anao, ka anjakao./Tompo ô, tsy takatray/Ny hasoan’ny antranao;/Zava-mahagaga\ anay/Ny fiti_avanao.
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
M0:|c:G|m:2/4|r:P.M|t:FFPM 428 Reko izao ry Tompo|a:Rasoamahenina 1905-1986|h:Ranoason D. 1940-
|
||||||
|
U0:z0:yy4yyy(42)z11tt4(22)yy6z11 22222222 (22)22626262yy6z116262 222262 22222222 (22)y8
|
||||||
|
N1:s#s,mmdssSldfrmdd #l,sFl'smdlltdmrlr sm--dd--dfmrfm #t,sllllmmrdr smdddfmrfm s,l,tdrmsdfm-rrd
|
||||||
|
N2:#s,sdddssSldltdssdtrdtslltldtlt zzddz-ssTldlrdrdlll ddtlttds sTldtrdslsltdtlld-tt s
|
||||||
|
N3:mssmmmmfmrssmmmRfmsm mmsFFFFszzsmz-mmmdmrs ssmDDmFFFFsrsm mmdmrssmfrmfsrmrslsfm
|
||||||
|
N4:#r,dddddddfsltd-d d6 llmr4szzddzzd,d,sfslt dtllllr4stddd dsfsltdmfsltdtlfs-ssd
|
||||||
|
Y1:Reko i\zao ry Tompo izany antsonao,/Mi_antso izany mpanompo mba ho irakao!${R=}Inty, inty, inty aho Jeso/Inty, inty, iraho ho aho Jeso/Ekeko re ny\ ho miaramilanao/Ho vonona hanao ny sitrakao, ka iraho!
|
||||||
|
Y2:O di_ovy Tompo izany molotro/Ka ny fo madio hanompo no atolotro!
|
||||||
|
Y3:Tsy hande\ha irery fa hiaraka\ Aminao/Ka dia mba ome_o ny hery sy Fanahinao!
|
||||||
|
Y4:Reko i\zao ny toky hoe: «Momba a\hy Ianao »/Ry Jesosy Tompo sy Zoky, vonona aho izao!
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
M0:|c:Eb|m:3/4|r:6.6.8.6.5.5.7.6.|t:FFPM 449 'Njay reko Tompo ô|a:L. Hartsough 1828-1919 Nad. J. Andrianaivoravelona 1877-1961|h:L. Hartsough 1828-1919
|
||||||
|
U0:z8:(22) 6222 8/4 6222 8/4 6222 22$Q4/4 6222 8z4/ 6222 C/ 6222 C/6222 22$Q4/4 6222 8
|
||||||
|
N1:dmsmrdd/drflsm/sd'tlslsm/drdmrd/d'tlsl/smrdr/slmrdrm/drdmrd
|
||||||
|
N2:#t,d-mdtdd/dtrfmd/mmsfmfmd/dts,dtd/mmfmf/mdtdt/dddtdtd/dtsdtd
|
||||||
|
N3:#rmsdsssm/msldds/sssdddds/msmsfm/ssddd/dssms/mfssmss/msmsfm
|
||||||
|
N4:#s,d-d5/dssddd/d8/ds4d/d5/ddsss/d7/ds4d
|
||||||
|
Y1:‘Njay reko Tompo ô!/‘Njay re ny fe_onao/Mi_antso ahy Hi_anao/hankany Kalvary;${R=}Tompo lehibe!/Raiso aho e;/Mba sasao ny ranao soa/Izay tao Kalvary.
|
||||||
|
Y2:Malemy aho e,/Ka mitaraina hoe:/Vonjeo ny aiko Tompo ô!/Vonjeo ny olonao:/Tompo lehibe!
|
||||||
|
Y3:Ny fi_adanam-po/Mandresy ny manjo;/Esorinao ny tahotro,/Ry Tompo ô vonjeo:
|
||||||
|
Y4:Mpanota tsy mandà,/Ry Tompo! mamelà;/Ny fahotako lehibe/Ifonako tokoa:
|
||||||
|
Y5:Ny foko tsy madio/Mba diovinao, anio;/Maloto aho, Tompo ô!/Sasao ho voadio:
|
||||||
|
Y6:Ny foko no sasao,/Ka diovinao izao;/Ny fahotako marobe/Levony avokoa:
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
M0:|c:Ab|m:4/4|r:P.M|t:FFPM 489 Tena sambatra sy maha-te-ho tia|a:J. Rakotonirainy 1926-|h:Charles H. Gabriel 1856-1932
|
||||||
|
U0:z0:222244 222244/ 2222442222(44)/222244222244/22224422228/2222y22 222244/222222(22)2222224/2222y2222224$Q4/22224422228
|
||||||
|
N1:#s,ssdrmmmfrmds/drmfs'mfmrdr-/ssdrmmmfrmds/ltdfmdtdrmd/s'----fmrdrmdls/sttrrff-/sddmm#t,ss/s----fmrdrmssf/dtdfmdtdrmd
|
||||||
|
N2:#r,mmmfssslfsmm/sfs7Fsf/mmmfssslfsmm/fslls7/d----ssfmfsmfm/rssttttsmssdddd/d----ssfmfsTTl/lSlls7
|
||||||
|
N3:#t,d8ttdd.dtdrmdrdrrt-/d8ttdd/d5mrmfsm/mfsf(mr)(d-)d6/trrffrrtdmmssmm/mfsf(mr)d8/d5mrmfsm
|
||||||
|
N4:#d,d6s4d2/#m,msd6tls-/#d,d6s4dd/f4s6d/#ddrmrd-(d-)#d,d6/s7-#m,d7/drm'rd-dd#d,dddmff/f4s6d
|
||||||
|
Y1:Tena sambatra sy maha-te ho ti_a/I\zany masina, madio fisainana/Fa mi_ara-dalana, mifankati_a/Amin’Andriamanitra Fi_ainana.${R=}Ma_5sina toko_a re ny Tompo./Tianay mba ho masina/Saina tena sy fana\hy/Ka_5fi_ainan-danitra toko_a/No santarin’izay mino sy manoa.
|
||||||
|
Y2:Indro, mampahery, mahatoky ko_a/Ra\ha mahitsy ny fijery, soa ny fo;/Fa ny fo madio sy masina toko_a:/Paradisa\ an-tany, feno zava-tsoa.
|
||||||
|
Y3:Ko_a halaviro ny fitaoman-dratsy,/Ny fisaikazana tsy mba masina;/Fa ny tia ny Tompo, dia\ olon-tsoa mitafy/Fahadiovan’ny Fanahy Masina.
|
||||||
|
Y4:Mi_araha lalana\ amin’i Jesosy/Fa ny fahavalo ta-hamotraka;/Mijoroa, reseo ny toetra mampihosi\na/Ao anaty loto sy ny fotaka.
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
package mg.dot.feufaro
|
|
||||||
|
|
||||||
object CommonTools {
|
|
||||||
//companion object {
|
|
||||||
fun tonalityToNumber(tonality: String) : Int {
|
|
||||||
val result: Map<String, Int> = mapOf(
|
|
||||||
"C" to 1,
|
|
||||||
"C#" to 2, "Db" to 2,
|
|
||||||
"D" to 3,
|
|
||||||
"D#" to 4, "Eb" to 4,
|
|
||||||
"E" to 5,
|
|
||||||
"F" to 6,
|
|
||||||
"F#" to 7, "Gb" to 7,
|
|
||||||
"G" to 8,
|
|
||||||
"G#" to 9, "Ab" to 9,
|
|
||||||
"A" to 10,
|
|
||||||
"A#" to 11, "Bb" to 11,
|
|
||||||
"B" to 12
|
|
||||||
)
|
|
||||||
if (result.containsKey(tonality)) {
|
|
||||||
return result[tonality]!!
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
fun numberToTonality(number: Int): String {
|
|
||||||
val result: Array<String> = arrayOf("", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B")
|
|
||||||
return if (number in 1..12) {
|
|
||||||
result[number]
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -111,6 +111,7 @@ object ScreenSolfa : Screen {
|
||||||
)
|
)
|
||||||
Text(text = measureString)
|
Text(text = measureString)
|
||||||
Text(text = "Stanza: $stanza")
|
Text(text = "Stanza: $stanza")
|
||||||
|
ScreenTranspose.Content()
|
||||||
}
|
}
|
||||||
LazyVerticalGridTUO(
|
LazyVerticalGridTUO(
|
||||||
gridTUOData,
|
gridTUOData,
|
||||||
|
|
@ -123,8 +124,8 @@ object ScreenSolfa : Screen {
|
||||||
|
|
||||||
solfaScreenModel.loadNextInPlaylist()
|
solfaScreenModel.loadNextInPlaylist()
|
||||||
}, modifier = Modifier.height(40.dp)) {
|
}, modifier = Modifier.height(40.dp)) {
|
||||||
val debugData: String by sharedScreenModel.data.collectAsState()
|
val nextLabel: String by sharedScreenModel.nextLabel.collectAsState()
|
||||||
Text(debugData)
|
Text(nextLabel)
|
||||||
}
|
}
|
||||||
FlowRow(
|
FlowRow(
|
||||||
modifier = Modifier.fillMaxWidth()
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
package mg.dot.feufaro
|
||||||
|
|
||||||
|
import SharedScreenModel
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.WindowInsets
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.safeDrawing
|
||||||
|
import androidx.compose.foundation.layout.windowInsetsPadding
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import cafe.adriel.voyager.core.screen.Screen
|
||||||
|
import java.io.ObjectStreamException
|
||||||
|
import androidx.compose.foundation.layout.FlowRow
|
||||||
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import cafe.adriel.voyager.koin.koinScreenModel
|
||||||
|
import mg.dot.feufaro.solfa.Transpose
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import mg.dot.feufaro.solfa.TimeUnitObject
|
||||||
|
|
||||||
|
|
||||||
|
object ScreenTranspose : Screen {
|
||||||
|
@Composable
|
||||||
|
override fun Content() {
|
||||||
|
FlowRow(
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
.windowInsetsPadding(WindowInsets.safeDrawing)
|
||||||
|
.padding(start = 8.dp, end = 8.dp, top = 8.dp),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(4.dp)
|
||||||
|
) {
|
||||||
|
val sharedScreenModel = koinScreenModel<SharedScreenModel>()
|
||||||
|
val originalKey by sharedScreenModel.songKey.collectAsState()
|
||||||
|
val transposeTo by sharedScreenModel.transposeTo.collectAsState()
|
||||||
|
val transposeAsIf by sharedScreenModel.transposeAsIf.collectAsState()
|
||||||
|
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
|
||||||
|
Text("Original Key: $originalKey")
|
||||||
|
}
|
||||||
|
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
|
||||||
|
Text("Transpose to key: $transposeTo")
|
||||||
|
}
|
||||||
|
Transpose.chooseKey { it ->
|
||||||
|
sharedScreenModel.setTransposeTo(it)
|
||||||
|
TimeUnitObject.changeTransposeTo(it)
|
||||||
|
}
|
||||||
|
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
|
||||||
|
Text("Transpose as if key was : $transposeAsIf")
|
||||||
|
}
|
||||||
|
Transpose.chooseKey { it ->
|
||||||
|
sharedScreenModel.setTransposeAsIf(it)
|
||||||
|
TimeUnitObject.changeTransposeAsIf(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Throws(ObjectStreamException::class) // C'est une méthode de sérialisation Java, donc l'exception est nécessaire
|
||||||
|
private fun readResolve(): Any {
|
||||||
|
return this // Toujours retourner l'instance unique de ce singleton
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import mg.dot.feufaro.FileRepository
|
||||||
import mg.dot.feufaro.DisplayConfigManager // Importez DisplayConfigManager
|
import mg.dot.feufaro.DisplayConfigManager // Importez DisplayConfigManager
|
||||||
import mg.dot.feufaro.musicXML.MusicXML
|
import mg.dot.feufaro.musicXML.MusicXML
|
||||||
import mg.dot.feufaro.solfa.Solfa
|
import mg.dot.feufaro.solfa.Solfa
|
||||||
|
import mg.dot.feufaro.solfa.TimeUnitObject
|
||||||
import mg.dot.feufaro.viewmodel.SolfaScreenModel
|
import mg.dot.feufaro.viewmodel.SolfaScreenModel
|
||||||
import org.koin.dsl.module
|
import org.koin.dsl.module
|
||||||
import org.koin.core.module.dsl.singleOf
|
import org.koin.core.module.dsl.singleOf
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import mg.dot.feufaro.FileRepository
|
import mg.dot.feufaro.FileRepository
|
||||||
import mg.dot.feufaro.CommonTools
|
|
||||||
|
|
||||||
class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository: FileRepository) {
|
class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository: FileRepository) {
|
||||||
private val T: MutableList<PTemplate> = mutableListOf()
|
private val T: MutableList<PTemplate> = mutableListOf()
|
||||||
|
|
@ -388,32 +387,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
|
||||||
val tonality = line.uppercaseFirstMeta()
|
val tonality = line.uppercaseFirstMeta()
|
||||||
meta["C"] = tonality
|
meta["C"] = tonality
|
||||||
sharedScreenModel.setSongKey(tonality)
|
sharedScreenModel.setSongKey(tonality)
|
||||||
val keyOrigin = CommonTools.tonalityToNumber(tonality)
|
sharedScreenModel.setTransposeAsIf(tonality)
|
||||||
val transposeTo = getOpt("transposeto")
|
|
||||||
val transposeAsIf = getOpt("transposeasif")
|
|
||||||
val keyDest = if (transposeTo != "") {
|
|
||||||
CommonTools.tonalityToNumber(transposeTo)
|
|
||||||
} else {
|
|
||||||
keyOrigin
|
|
||||||
}
|
|
||||||
val keyAsIf = if (transposeAsIf != "") {
|
|
||||||
if (transposeAsIf.toIntOrNull() != null) {
|
|
||||||
keyOrigin + transposeAsIf.toInt()
|
|
||||||
} else {
|
|
||||||
CommonTools.tonalityToNumber(transposeAsIf)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
keyOrigin
|
|
||||||
}
|
|
||||||
if (!meta.containsKey("transposeValue")) {
|
|
||||||
meta["transposeValue"] = (keyDest - keyAsIf).toString()
|
|
||||||
}
|
|
||||||
if (keyAsIf != keyOrigin) {
|
|
||||||
meta["C"] = CommonTools.numberToTonality(keyAsIf)
|
|
||||||
}
|
|
||||||
if (keyDest != keyOrigin) {
|
|
||||||
meta["C"] += " (" + CommonTools.numberToTonality(keyDest) + ")"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ import androidx.compose.ui.text.style.BaselineShift
|
||||||
import androidx.compose.ui.text.withStyle
|
import androidx.compose.ui.text.withStyle
|
||||||
|
|
||||||
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
|
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
|
||||||
|
val FEUFAROO_KEY_CHANGE_COLOR = Color.Blue
|
||||||
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
var mutableNoteVersion: Int by mutableStateOf(0)
|
var mutableNoteVersion: Int by mutableStateOf(0)
|
||||||
private var lyrics: MutableList<POneStanzaLyrics> = mutableListOf()
|
private var lyrics: MutableList<POneStanzaLyrics> = mutableListOf()
|
||||||
|
|
@ -71,6 +72,14 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
lastHairPinStart = -1
|
lastHairPinStart = -1
|
||||||
lastHairPinSymbol = null
|
lastHairPinSymbol = null
|
||||||
}
|
}
|
||||||
|
var transposeAsIf: String = ""
|
||||||
|
var transposeTo: String = ""
|
||||||
|
fun changeTransposeAsIf(asIf: String) {
|
||||||
|
transposeAsIf = asIf
|
||||||
|
}
|
||||||
|
fun changeTransposeTo(to: String) {
|
||||||
|
transposeTo = to
|
||||||
|
}
|
||||||
}
|
}
|
||||||
init {
|
init {
|
||||||
nbBlock++
|
nbBlock++
|
||||||
|
|
@ -164,7 +173,9 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
|
||||||
} else {
|
} else {
|
||||||
transposeOldKey = prevTUO?.transposeOldKey ?: "Bb"
|
transposeOldKey = prevTUO?.transposeOldKey ?: "Bb"
|
||||||
"" }
|
"" }
|
||||||
|
if (pTemplate.template == "z") {
|
||||||
|
return "$separatorBefore\n$separatorBefore\n$separatorBefore\n$separatorBefore"
|
||||||
|
}
|
||||||
val retour = tuNotes.drop(1).joinToString (separator = "\n"){
|
val retour = tuNotes.drop(1).joinToString (separator = "\n"){
|
||||||
separatorBefore + markersBefore + it.toString(transposeFrom, transposeTo).replace(Regex("[\\(\\)\\[\\]]"), "")
|
separatorBefore + markersBefore + it.toString(transposeFrom, transposeTo).replace(Regex("[\\(\\)\\[\\]]"), "")
|
||||||
}
|
}
|
||||||
|
|
@ -365,7 +376,7 @@ fun TimeUnitComposable(
|
||||||
fontSize = 10.sp,
|
fontSize = 10.sp,
|
||||||
baselineShift = BaselineShift.Superscript,
|
baselineShift = BaselineShift.Superscript,
|
||||||
//fontStyle = FontStyle.Italic,
|
//fontStyle = FontStyle.Italic,
|
||||||
color = Color.Blue
|
color = FEUFAROO_KEY_CHANGE_COLOR
|
||||||
)) {
|
)) {
|
||||||
append(text+" ")
|
append(text+" ")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,23 @@
|
||||||
package mg.dot.feufaro.solfa
|
package mg.dot.feufaro.solfa
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api // Nécessaire pour ExposedDropdownMenuBox
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.ArrowDropDown
|
||||||
|
import androidx.compose.material3.DropdownMenu
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.material3.DropdownMenuItem
|
||||||
|
import androidx.compose.material3.IconButton
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
||||||
class Transpose {
|
class Transpose {
|
||||||
companion object {
|
companion object {
|
||||||
val noteToNumber = listOf("d", "di", "r", "ri", "m", "f", "fi", "s", "si", "l", "ta", "t")
|
val noteToNumber = listOf("d", "di", "r", "ri", "m", "f", "fi", "s", "si", "l", "ta", "t")
|
||||||
|
|
@ -38,5 +56,37 @@ class Transpose {
|
||||||
.replace(",", "₁")
|
.replace(",", "₁")
|
||||||
.replace("'", "¹") + regexFound.groupValues[3]
|
.replace("'", "¹") + regexFound.groupValues[3]
|
||||||
}
|
}
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class) // Ajoutez cette annotation pour utiliser ExposedDropdownMenuBox
|
||||||
|
@Composable
|
||||||
|
fun chooseKey(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
label: String = "Choose a key",
|
||||||
|
menuItemData: List<String> = keyToNumber,
|
||||||
|
onOptionSelected: (String) -> Unit
|
||||||
|
) {
|
||||||
|
var expanded by remember { mutableStateOf(false) }
|
||||||
|
Box(
|
||||||
|
modifier = modifier
|
||||||
|
.padding(0.dp)
|
||||||
|
) {
|
||||||
|
IconButton(onClick = {expanded = !expanded}) {
|
||||||
|
Icon(Icons.Default.ArrowDropDown, contentDescription = label)
|
||||||
|
}
|
||||||
|
DropdownMenu(
|
||||||
|
expanded = expanded,
|
||||||
|
onDismissRequest = { expanded = false}
|
||||||
|
) {
|
||||||
|
menuItemData.forEach { option ->
|
||||||
|
DropdownMenuItem(
|
||||||
|
text = { Text(option)},
|
||||||
|
onClick = {
|
||||||
|
onOptionSelected(option)
|
||||||
|
expanded = false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,8 +6,8 @@ import kotlinx.coroutines.flow.asStateFlow
|
||||||
import mg.dot.feufaro.solfa.TimeUnitObject
|
import mg.dot.feufaro.solfa.TimeUnitObject
|
||||||
|
|
||||||
class SharedScreenModel() : ScreenModel {
|
class SharedScreenModel() : ScreenModel {
|
||||||
private val _data = MutableStateFlow<String>("Next ...")
|
private val _nextLabel = MutableStateFlow<String>("Next ...")
|
||||||
val data: StateFlow<String> = _data.asStateFlow()
|
val nextLabel: StateFlow<String> = _nextLabel.asStateFlow()
|
||||||
private val _measure = MutableStateFlow<String>("")
|
private val _measure = MutableStateFlow<String>("")
|
||||||
val measure: StateFlow<String> = _measure.asStateFlow()
|
val measure: StateFlow<String> = _measure.asStateFlow()
|
||||||
private val _songTitle = MutableStateFlow<String>("")
|
private val _songTitle = MutableStateFlow<String>("")
|
||||||
|
|
@ -16,6 +16,10 @@ class SharedScreenModel() : ScreenModel {
|
||||||
val stanza: StateFlow<Int> = _stanza.asStateFlow()
|
val stanza: StateFlow<Int> = _stanza.asStateFlow()
|
||||||
private val _songKey = MutableStateFlow<String>("")
|
private val _songKey = MutableStateFlow<String>("")
|
||||||
val songKey: StateFlow<String> = _songKey.asStateFlow()
|
val songKey: StateFlow<String> = _songKey.asStateFlow()
|
||||||
|
private val _transposeTo = MutableStateFlow("")
|
||||||
|
val transposeTo: StateFlow<String> = _transposeTo.asStateFlow()
|
||||||
|
private val _transposeAsIf = MutableStateFlow("")
|
||||||
|
val transposeAsIf: StateFlow<String> = _transposeAsIf.asStateFlow()
|
||||||
private val _songAuthor = MutableStateFlow<String>("")
|
private val _songAuthor = MutableStateFlow<String>("")
|
||||||
val songAuthor: StateFlow<String> = _songAuthor.asStateFlow()
|
val songAuthor: StateFlow<String> = _songAuthor.asStateFlow()
|
||||||
private val _songComposer = MutableStateFlow<String>("")
|
private val _songComposer = MutableStateFlow<String>("")
|
||||||
|
|
@ -37,7 +41,7 @@ class SharedScreenModel() : ScreenModel {
|
||||||
val hasMarker: StateFlow<Boolean> = _hasMarker.asStateFlow()
|
val hasMarker: StateFlow<Boolean> = _hasMarker.asStateFlow()
|
||||||
|
|
||||||
fun appendData(otherData: String) {
|
fun appendData(otherData: String) {
|
||||||
_data.value += otherData
|
_nextLabel.value += otherData
|
||||||
}
|
}
|
||||||
fun reset() {
|
fun reset() {
|
||||||
tempTimeUnitObjectList.clear()
|
tempTimeUnitObjectList.clear()
|
||||||
|
|
@ -67,6 +71,12 @@ class SharedScreenModel() : ScreenModel {
|
||||||
fun setSongKey(theSongKey: String) {
|
fun setSongKey(theSongKey: String) {
|
||||||
_songKey.value = theSongKey
|
_songKey.value = theSongKey
|
||||||
}
|
}
|
||||||
|
fun setTransposeTo(key: String) {
|
||||||
|
_transposeTo.value = key
|
||||||
|
}
|
||||||
|
fun setTransposeAsIf(key: String) {
|
||||||
|
_transposeAsIf.value = key
|
||||||
|
}
|
||||||
fun setSongAuthor(theSongAuthor: String) {
|
fun setSongAuthor(theSongAuthor: String) {
|
||||||
_songAuthor.value = theSongAuthor
|
_songAuthor.value = theSongAuthor
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ material3 = "1.3.2"
|
||||||
voyager = "1.1.0-beta03"
|
voyager = "1.1.0-beta03"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
|
||||||
cafe-voyager-koin = { module = "cafe.adriel.voyager:voyager-koin" }
|
cafe-voyager-koin = { module = "cafe.adriel.voyager:voyager-koin" }
|
||||||
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }
|
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }
|
||||||
koin-compose-viewmodel-navigation = { module = "io.insert-koin:koin-compose-viewmodel-navigation", version.ref = "koin" }
|
koin-compose-viewmodel-navigation = { module = "io.insert-koin:koin-compose-viewmodel-navigation", version.ref = "koin" }
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue