From 4802e10dfc98a6283081cd59bda95e6caa13dafe Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 24 Apr 2026 12:12:51 +0900 Subject: [PATCH] better tracker font, IT eff for Taud --- .gitignore | 2 ++ TAUD_NOTE_EFFECTS.md | 12 +++++++++++- assets/disk0/tvdos/bin/taut.js | 12 +++++++----- assets/disk0/tvdos/bin/tautfont.kra | 4 ++-- assets/disk0/tvdos/bin/tautfont_high.chr | Bin 1920 -> 1920 bytes assets/disk0/tvdos/bin/tautfont_low.chr | Bin 1920 -> 1920 bytes .../src/net/torvald/tsvm/rom/FontROM7x14.png | Bin 3330 -> 3324 bytes 7 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index e03e791..6a5633b 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,5 @@ assets/disk0/*.mov assets/diskMediabin/* video_encoder/* + +assets/disk0/tvdos/bin/tautfont.png diff --git a/TAUD_NOTE_EFFECTS.md b/TAUD_NOTE_EFFECTS.md index bbf9402..fcb8a88 100644 --- a/TAUD_NOTE_EFFECTS.md +++ b/TAUD_NOTE_EFFECTS.md @@ -487,7 +487,7 @@ A tempo slide's memory slot is separate from the set-tempo path and is private t **Plain.** Sets the global mix bus volume (0..$FF). $00 is silence; $FF is full. The default is $80. -**Compatibility.** ST3's global volume is 0..$40; convert with `taud_v = st3_v × 4`, clamped at $FF. On export, `st3_v = taud_v >> 2`, clamped at $40. +**Compatibility.** ST3's global volume is 0..$40; convert with `taud_v = st3_v × 4`, clamped at $FF. On export, `st3_v = taud_v >> 2`, clamped at $40. IT's global volume is 0..$80; convert with `taud_v = it_v × 2`, clamped at $FF. **Implementation.** Write the high byte to `global_volume` on the row the command appears. The low byte is reserved. ST3's `kST3NoMutedChannels` rule applies: V on a muted channel is ignored by ST3; for strict-compatible playback Taud follows suit, but new Taud compositions should avoid muting channels that carry global effects. @@ -517,6 +517,16 @@ Peak at maximum settings: $7F × $FF >> 9 = $3F — the full panning range. Retr --- +## X $xx00 — Set Panning + +**Plain.** **Unimplemented**. On IT, sets the panning position of the current channel, $00 being full-left and $FF being full-right. + +**Compatibility.** Convert directly into panning effect `0.$xx`, rounded down to nearest 6-bit value. + +**Implementation.** Not applicable. + +--- + # The S subcommand family S is a multiplexing opcode; the **high nibble of the high byte** selects the sub-effect, and the remainder is the sub-argument. diff --git a/assets/disk0/tvdos/bin/taut.js b/assets/disk0/tvdos/bin/taut.js index 43a571f..63a6b49 100644 --- a/assets/disk0/tvdos/bin/taut.js +++ b/assets/disk0/tvdos/bin/taut.js @@ -70,7 +70,7 @@ middot:MIDDOT } const fxNames = { -A:"Set tick speed", +A:"Tick speed", B:"Jump to order", C:"Break pattern", D:"Volume slide", @@ -89,8 +89,8 @@ R:"Tremolo", T:"Tempo", V:"Global volume", S:"Special", -S1:"Glissando ctrl", -S2:"Sample finetune", +S1:"Gliss. ctrl", +S2:"Sample tune", S3:"Vibrato LFO", S4:"Tremolo LFO", S8:"Channel pan", @@ -629,18 +629,20 @@ function drawVoiceDetail() { const effop = ptnDat[5] const effarg = ptnDat[6] | (ptnDat[7] << 8) + // TODO draw cumulative internal status in the very time play cursor is on + con.move(6,1) print(`Pitch $${note.hex04()}\tInst $${inst.hex02()}\tVolEff ${voleffop}.$${voleffarg.hex02()}\t`+ `PanEff ${paneffop}.$${paneffarg.hex02()}`) con.move(7,1) let fx = effop.toString(36).toUpperCase() if (fx == '0') { - print(`Fx`+' '.repeat(32)) + print(`\u00F8`+' '.repeat(32)) } else { if (fx == 'S') fx += (effarg >>> 12).hex1() let fxName = fxNames[fx] - print(`Fx ${fxName} $${effarg.hex04()} `) + print(`\u00F8 ${fxName}\t$${effarg.hex04()} `) } } diff --git a/assets/disk0/tvdos/bin/tautfont.kra b/assets/disk0/tvdos/bin/tautfont.kra index 71ae4c8..5c0ca3c 100644 --- a/assets/disk0/tvdos/bin/tautfont.kra +++ b/assets/disk0/tvdos/bin/tautfont.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e1118e0700290985c61bfb7b45ec46190c3ad1511362d619582195a000c9be3f -size 89431 +oid sha256:949811c18c96b615e96982bb4386437b3b4725ccefdd9d28a8e9dde4777cdf92 +size 89865 diff --git a/assets/disk0/tvdos/bin/tautfont_high.chr b/assets/disk0/tvdos/bin/tautfont_high.chr index 36eb13d6744b206da37b0fab881c0af8f8f4acc6..5547d462da7757a3a77c8a78c3b49c8a0a816ae1 100644 GIT binary patch delta 46 ucmZqRZ{XjM!z7pt2K5YJP@9~rwz-x`l!ewz-x`lw~ptlhEWPY$y$Ndo diff --git a/assets/disk0/tvdos/bin/tautfont_low.chr b/assets/disk0/tvdos/bin/tautfont_low.chr index 61191802bd13f9171bcb463740efc5e20d927ae8..d03fe8195ec030e11f992e7c2426459749ac088e 100644 GIT binary patch delta 29 hcmZqRZ{XjsjEN~NZSxAIwTv8fX<$&dIhIA4833A@3Gx5{ delta 29 hcmZqRZ{XjsjEO0)Z1W1HwTv7#X<%TpIhIA48331?35Eaw diff --git a/tsvm_core/src/net/torvald/tsvm/rom/FontROM7x14.png b/tsvm_core/src/net/torvald/tsvm/rom/FontROM7x14.png index 2cafa42b73d8b3005aed357dd16c8d9d028e73d0..15f017155e641a79a47131270f494a3c204c096f 100644 GIT binary patch delta 3299 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