From 801ae0c29b95be5ba3fd253f9c8c1748a3b91fac Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 23 Jan 2023 16:55:56 +0900 Subject: [PATCH] tracker inst format update --- terranmon.txt | 8 ++++---- .../torvald/tsvm/peripheral/AudioAdapter.kt | 18 +++++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/terranmon.txt b/terranmon.txt index 0fd1594..86cb949 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -575,13 +575,13 @@ Instrument bin: Registry for 256 instruments, formatted as: Uint16 Sample Pointer Uint16 Sample length Uint16 Sampling rate at C3 - Uint16 Loop start - Uint16 Loop end - Bit16 Flags + Uint16 Play Start (usually 0 but not always) + Uint16 Loop Start (can be smaller than Play Start) + Uint16 Loop End + Bit32 Flags 0b h000 00pp h: sample pointer high bit pp: loop mode. 0-no loop, 1-loop, 2-backandforth, 3-oneshot (ignores note length unless overridden by other notes) - Bit32 Unused Bit16x24 Volume envelopes Byte 1: Volume Byte 2: Second offset from the prev point, in 3.5 Unsigned Minifloat diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt index d03c886..9bca135 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/AudioAdapter.kt @@ -480,13 +480,14 @@ class AudioAdapter(val vm: VM) : PeriBase(VM.PERITYPE_SOUND) { var samplePtr: Int, // 17-bit number var sampleLength: Int, var samplingRate: Int, + var samplePlayStart: Int, var sampleLoopStart: Int, var sampleLoopEnd: Int, // flags var loopMode: Int, var envelopes: Array // first int: volume (0..255), second int: offsets (minifloat indices) ) { - constructor() : this(0, 0, 0, 0, 0, 0, Array(24) { TaudInstVolEnv(0, ThreeFiveMiniUfloat(0)) }) + constructor() : this(0, 0, 0, 0, 0, 0, 0, Array(24) { TaudInstVolEnv(0, ThreeFiveMiniUfloat(0)) }) fun getByte(offset: Int): Byte = when (offset) { 0 -> samplePtr.toByte() @@ -498,14 +499,17 @@ class AudioAdapter(val vm: VM) : PeriBase(VM.PERITYPE_SOUND) { 4 -> samplingRate.toByte() 5 -> samplingRate.ushr(8).toByte() - 6 -> sampleLoopStart.toByte() - 7 -> sampleLoopStart.ushr(8).toByte() + 6 -> samplePlayStart.toByte() + 7 -> samplePlayStart.ushr(8).toByte() - 8 -> sampleLoopEnd.toByte() - 9 -> sampleLoopEnd.ushr(8).toByte() + 8 -> sampleLoopStart.toByte() + 9 -> sampleLoopStart.ushr(8).toByte() - 10 -> (samplePtr.ushr(16).and(1).shl(7) or loopMode.and(3)).toByte() - 11,12,13,14,15 -> -1 + 10 -> sampleLoopEnd.toByte() + 11 -> sampleLoopEnd.ushr(8).toByte() + + 12 -> (samplePtr.ushr(16).and(1).shl(7) or loopMode.and(3)).toByte() + 13,14,15 -> -1 in 16..63 step 2 -> envelopes[offset - 16].volume.toByte() in 17..63 step 2 -> envelopes[offset - 16].offset.index.toByte() else -> throw InternalError("Bad offset $offset")