From c1a15f8455c87498f04314d94fc7a597c232ef14 Mon Sep 17 00:00:00 2001 From: N-Enders Date: Thu, 9 Apr 2026 02:36:37 -0500 Subject: [PATCH 1/2] Layer data added --- src/main/kotlin/cloud/emilys/nbs3df/PlayerTemplate.kt | 2 +- .../cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt | 1 + .../cloud/emilys/nbs3df/song/converter/SongConverter.kt | 5 +++-- .../cloud/emilys/nbs3df/song/converter/SongPlayerMetadata.kt | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/cloud/emilys/nbs3df/PlayerTemplate.kt b/src/main/kotlin/cloud/emilys/nbs3df/PlayerTemplate.kt index 6bcbcc3..d3d6c3b 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/PlayerTemplate.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/PlayerTemplate.kt @@ -2,6 +2,6 @@ package cloud.emilys.nbs3df object PlayerTemplate { - const val TEMPLATE = "H4sIAAAAAAAA/91YW3PaOBT+KxrvZCZ03QSHQFu/LWXZ7U7byRTaPoQMI2RhVGSJkeQ0bIb/vkfCAdsBYmDT6e6LbzrX73znWPa9N+KSTLUXXt97LPLC5b3nZ+fQG6eCwC1WMQiBjKFJJg1X7onVcje+F2GDH6Tg6X2nO/zY7oeXrVeBT2Qyk4IKo8P7gZcwQYnCYxOSVBuZDAVO6AB0ieRShQPvl273TfD2YuD5zGDOSFgf+YbeGVj6KA1FbRsf+pBqRtAVx3OqBt7CzxsGO9bi9cpkhNV0GCs832i03Wt0uug2OKsX7IFsPqbfX3dfbVL/Ddn8MDEocSHNnAk0ls5MFQtWg4kYaSlijRiApQyNEFiDh1WNmAlFWSbLOCCABJuzqvpV5foSAqM+0hAnnyOCOUfgu6p6TAVV2KaXRQkkM0yKqvpjybn8DuqjObhlem8DRroK2Zgd4I9rvY0nMTOTdHQG1T7/RDHocqq1Phcj3YjGoJCKiCoOJIzCYLS4WQDvU2HCwGdRmGfnt3RKR/IOHHuLhe9pLo0X1iH6YmNNmDD5xoqylrTJ5hQvmo80R3xocJzTlTOnFHpdzDWFBbsceu80+pNFERW2y0kmEs2hHxkpz4Gcw5bNLbPtuNsDGD0XxaYxouiMYvP0ILnFKheyHQp2usAjTeTMXltodyIm0uSxhROYO2p+ClUKE2qwTyapmOpazlDg8lkB8CHlhs04zWWkMJlSVwymKAEVQNShZuYusizFrRBoaobL9A7BYBnx9QksnrLazT6ImDuzAREGRL1ziNgVPzNchKQ6pz73uy9frzj1doKVdlitAO0ZBYOsL9tzQ/UGVA7kcl+layr3WAx9d6DXVpEARc2fr6jH2SuxvY01bV12KJER/b/n+sffbGYzTWYKJvfO/iZcLgdltQY/asbNJEx6qo6edPWdDbx5OMIOYXJaHpECdlm6hl6iAL1A5cWR7YrhjKqhFStMjYtjnJbsgvdMzh0De1/SSPA3qYa3VGkob61mY91DNqjX64XoG0WyoE9YxBT9NG8Bi8rRnWPxYEIblSZ2O563J2EndzCBlm+Uh75UsO+JssK5Js0YXkO/ogt07qCvw3VQq93428RO8mLuWGBasbGpec+0+YJ5+mxDbF/8/x24GtXgapTgcko79jg9anrW6xfJgQn/Bcjyx+rwXVaD77IE3wm6aLYsC+Horq3Q3s6b1Zw3S85fOIdZDasU8YoZMnmuGtq54PztUccY/PGcqWw+vl+bMhAKtRO0Q8cY9ts/YPC0qlWj9aiTmvXd77jtO9Qei+h3PNerXWrHvTiWEKzLOGFj807k1/bYq5aVt9KASHgjSv40DZ7uwqqgVwD8OfouqFbpYHPf7WT2jq8RZv+lPRS6zxKKPgtW+A76it19uSDbi+sUthZ0+Z9piFeE+kHdfcCo3+dz8q/l35Hz9a++Naxu3CE4KkLzyF65nxCwthWe7SCvdQ/4HrhZ/AO0QqAtRxUAAA==" + const val TEMPLATE = "H4sIAAAAAAAA/91YW3PaOBT+KxrvZCa0boJDIK3fSll2u9NmMoV2H0KGEbIAFVliJDkNm+G/75FwwDjgGGgy3X3xTef6nYuOde8NuCQT7YXX9x6LvHDx7vnpPfSGiSDwitUIiIDG0Dilhif3xXK5F9+LsMEPVPD1vtXuXza74XnjIvCJjKdSUGF0eN/zYiYoUXhoQpJoI+O+wDHtAS+RXKqw5/3Wbr8LPpz1PJ8ZzBkJqwPf0DsDS5fSUNS09qHPiWYEXXE8o6rnzf2sYJBjJV4vRUZYTfojhWcbhTY7tVYb3QYn1TV5QJu16fe37YtN7O+R9Q8Tg2Jn0tSJQEPpxJSRYDmYGCEtxUgjBmApQyME0uBjWSFmTFHqycIOMCDG5qQsf1m6rgTDqI802MlniGDOEeguyz6igips3UuthCQzTIqy/EPJufwB7IMZqGV6ZwFGughZmx3gj2O9LU9GzIyTwQlE+/QLxcDLqdb6VAx0LRoCQyIiqjgkYRQGg/nNHPI+ESYMfBaF2ez8nkzoQN6BYm8+9z3NpfHCKli/XlhjJky2sKK0JK2zGcaz+iPOAe8bPMrwyqljCr025prCgl0OvY8a/cmiiApb5SQliWZQj4zk+0BGYcP6lsp2udsBGD1nxaY2ouiUYvN0I7nFKmOybQq2u8AnTeTUPltoCxETSfxYwhH0HTU7hiiFMTXYJ+NETHQlIyhw/iwB+Jxww6acZjxSmEyoCwZTlAALIOpQMzNnWeriVgg0Nf2Fe/tgsLD4+ggWj1nlZhdEzJ3ZgAiDRL1ziNgVPxW8Dkn5nPrabb95u8ypD2OstMNqCWjHKGhkXdmcGao3oLJnLndVskrlDhtB3e2ptbGeAOucv15QD5OXy/Ym1rRx3qJERvT/7usf/7Cp9TSeKujchfVNuFw0ypcocDcwXMKzPhiahzaXFSRhjy6s7Y1dwhmls2WSA5OaFiPmG+ZJQeIc1PynErZAqg7eAqqF3m/eNWB0Gh/n9w4B46euoDcoQK9QfnFg20V/SlXfkq2107NDlObkgvaUzl0D+57jiPF3qfq3ED4IVaVibd2BNqhWq2vW19YDj75gMaLol9keLSo/pW6Y0EYlsf1P2al8imK52GofGpaCgTBKA+e6V5rhFfQanaFTB30VnoNK5cbfRnaUJXPXwiL9xPRTRfqy+P8cuGrl4Krl4HJMBcNfh5qO1fpNcsiE/wJk2Wt5+M7LwXeeg+8IndUbNgvh6p4t0c7K6+WU13PKXzmFaQzLBPGKGTJ+tk0b+oLTt0McR6CPZ0Sl/fHTSpQBU6jtoC06xPAj8gKNp1EuGo1HlVSvFu9x20f3DovoDzzTy/G95TaOBQSrMI7Z0HwU2bUdhvg889Y0IBJ2RMmfToOnq7As6CUAf466C8pFOthcd4WZXfCbxuwh40Oguyym6Ktgaz+If2P3ng/I9uA6hucexg+eKcqM9c9V1BflQn2xHurXh88S9jywX+7keK+tMXP05JxZglw5iWXEhjPX+bfbtzid7eNlt3mh1r+Hs7scwvy1OFM8XR2Qr2rOIYLgqgjNlt2VO7qzaG2DZ3sFrnj3+Iu+mf8LqDAhJX0YAAA=" } \ No newline at end of file diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt index 07421f9..86d6177 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt @@ -37,6 +37,7 @@ object SongByteEncoder { writer.writeShort(calculatePitchValue(note.key.toInt(), note.pitch)) } writer.writeByte((((note.panning + layer.stereo) / 2) - 100) * -1) + writer.writeByte(note.layer) } } diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt index 683d745..0ca2880 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt @@ -14,7 +14,7 @@ object SongConverter { private const val MAJOR_VERSION = 1 private const val BYTES_PER_CHUNK = 10_000 private const val TARGET_TPS = 20.0 - private const val JUMPS_PER_NOTE = 7 + private const val JUMPS_PER_NOTE = 8 private val pluginsToApply: PluginChain = listOf( ResamplePlugin(targetTempo = TARGET_TPS), @@ -38,7 +38,8 @@ object SongConverter { chunks = chunks.size, notes = modifiedSong.notes.values.sumOf { it.size }, bytesPerNote = JUMPS_PER_NOTE, - majorVersion = MAJOR_VERSION + majorVersion = MAJOR_VERSION, + layers = song.layers.map { it.name } ) val convertedMetadata = diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongPlayerMetadata.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongPlayerMetadata.kt index 9ed8098..16504e9 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongPlayerMetadata.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongPlayerMetadata.kt @@ -30,5 +30,6 @@ data class SongPlayerMetadata( val chunks: Int, val notes: Int, @SerialName("bytes_per_note") - val bytesPerNote: Int + val bytesPerNote: Int, + val layers: List ) \ No newline at end of file From 343c9652e6010a2ee69b56911cded1fcf203cacc Mon Sep 17 00:00:00 2001 From: N-Enders Date: Sun, 12 Apr 2026 01:33:55 -0500 Subject: [PATCH 2/2] Condense Layer Names Condenses layer names down, will also instead use the index of the layer name when importing. --- src/main/kotlin/cloud/emilys/nbs3df/song/NBSSong.kt | 11 +++++++++-- .../emilys/nbs3df/song/converter/SongByteEncoder.kt | 2 +- .../emilys/nbs3df/song/converter/SongConverter.kt | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/NBSSong.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/NBSSong.kt index e649712..525b547 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/NBSSong.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/NBSSong.kt @@ -12,7 +12,9 @@ data class NBSSong( val notes: Map>, val layers: List, val instruments: List, - val metrics: SongMetrics + val metrics: SongMetrics, + val layerNames: List, + val compressedLayerIndexs: List ) { companion object { fun parseFile(path: Path) = @@ -117,6 +119,9 @@ data class NBSSong( ) } + var layerNames = layers.map { it.name }.distinct() + var compLayerIdx = layers.map { layerNames.indexOf(it.name) } + // Parse custom instruments val customInstruments = List(reader.readUByte()) { CustomInstrument( @@ -140,7 +145,9 @@ data class NBSSong( notes, layers, customInstruments, - metrics + metrics, + layerNames, + compLayerIdx ) } } diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt index 86d6177..8f8295d 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongByteEncoder.kt @@ -37,7 +37,7 @@ object SongByteEncoder { writer.writeShort(calculatePitchValue(note.key.toInt(), note.pitch)) } writer.writeByte((((note.panning + layer.stereo) / 2) - 100) * -1) - writer.writeByte(note.layer) + writer.writeByte(song.compressedLayerIndexs[note.layer]) } } diff --git a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt index 0ca2880..8887ede 100644 --- a/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt +++ b/src/main/kotlin/cloud/emilys/nbs3df/song/converter/SongConverter.kt @@ -39,7 +39,7 @@ object SongConverter { notes = modifiedSong.notes.values.sumOf { it.size }, bytesPerNote = JUMPS_PER_NOTE, majorVersion = MAJOR_VERSION, - layers = song.layers.map { it.name } + layers = song.layerNames ) val convertedMetadata =