From 7691fb981cc18b5a284a8f2ea236bf1cd89527fa Mon Sep 17 00:00:00 2001 From: Hasinjato Date: Thu, 15 Oct 2026 16:18:07 +0300 Subject: [PATCH] Put voices volumes & Add blank on tick 0 - Export midi --- .../mg/dot/feufaro/midi/MidiWriterforEXport.kt | 10 +++++++--- .../kotlin/mg/dot/feufaro/solfa/Solfa.kt | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/midi/MidiWriterforEXport.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/midi/MidiWriterforEXport.kt index c48ed1b..67b6aca 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/midi/MidiWriterforEXport.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/midi/MidiWriterforEXport.kt @@ -173,7 +173,9 @@ class MidiWriterforEXport constructor(private val fileRepository: FileRepositor markers: List = emptyList(), initialBpm: Float = 120.0f, voiceInstruments: Map = mapOf(1 to 0, 2 to 0, 3 to 0, 4 to 0), - initialKey: String = "C" + voiceVolumes: Map = mapOf(1 to 127, 2 to 127, 3 to 127, 4 to 127), + initialKey: String = "C", + initialOffsetTicks: Long = 480L ) { val (effectivePitches, effectiveMarkers) = expandDaCapoAndSegno(pitches, markers) val lastTick = 0 @@ -184,7 +186,10 @@ class MidiWriterforEXport constructor(private val fileRepository: FileRepositor voiceInstruments.forEach { (voiceIndex, programNumber) -> setProgramChange(voiceNumber = voiceIndex, instrumentProgram = programNumber, tickPosition = 0L) } - + voiceVolumes.forEach { (voiceIndex, volumeValue) -> + addControlChange(voiceNumber = voiceIndex, controller = 7, value = volumeValue, tickPosition = 0L) + } + var timeOffset = initialOffsetTicks val nuanceMap = mutableMapOf() val fermataTicks = mutableSetOf() val textMetaMap = mutableMapOf>() @@ -253,7 +258,6 @@ class MidiWriterforEXport constructor(private val fileRepository: FileRepositor - var timeOffset = 0L val holdDuration = 480L *3 // 480L:2noire *2:3noir *4:ronde if (pendingHairpinStartTick != null && pendingHairpinType != null) { diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt index fc5e4c9..54ce7cc 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Solfa.kt @@ -302,8 +302,9 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository val midiWriter = MidiWriterforEXport(fileRepository) val totalGridsInStanza = currentTuoList.size - var currentTickOffset = 0L - var currentGridOffset = 0 + val initialBlankTicks = 60L // un noire + var currentTickOffset = initialBlankTicks + var currentGridOffset = (initialBlankTicks / 60).toInt() for (stanza in 1..nbStanzas) { attachLyricsToPitches(tuoList = currentTuoList, stanzaNumber = stanza) @@ -371,6 +372,15 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository 3 to prefs.getInt("voice_instrument", 0), 4 to prefs.getInt("voice_instrument", 0), ) + val voicesVols = prefs.getString("voices_volumes", "127,127,127,127") + val volumesArray = voicesVols.split(",") + + val voiceVolumes = mapOf( + 1 to (volumesArray.getOrNull(0)?.toFloatOrNull()?.toInt()?.coerceIn(0, 127) ?: 127), + 2 to (volumesArray.getOrNull(1)?.toFloatOrNull()?.toInt()?.coerceIn(0, 127) ?: 127), + 3 to (volumesArray.getOrNull(2)?.toFloatOrNull()?.toInt()?.coerceIn(0, 127) ?: 127), + 4 to (volumesArray.getOrNull(3)?.toFloatOrNull()?.toInt()?.coerceIn(0, 127) ?: 127) + ) val originalKey = sharedScreenModel.songKey.value val transposedKey = Transpose.transposeKey(baseKey = originalKey, interval = transpI) val initialSongBpm = meta["p"]?.toFloatOrNull() ?: bpm @@ -380,6 +390,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository loopedMarkers, initialBpm = initialSongBpm, instruments, + voiceVolumes = voiceVolumes, initialKey = transposedKey ) midiWriter.save(outputPath)