mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-09-24 11:18:22 +02:00
Update doc
This commit is contained in:
parent
ce07e6af9e
commit
4fe81d0ba1
143
doc/TXTP.md
143
doc/TXTP.md
@ -5,29 +5,73 @@ TXTP is a text file with commands, to improve support for games using audio in c
|
|||||||
Simply create a file named `(filename).txtp`, and inside write the commands described below.
|
Simply create a file named `(filename).txtp`, and inside write the commands described below.
|
||||||
|
|
||||||
|
|
||||||
## TXTP features
|
## TXTP FEATURES
|
||||||
|
|
||||||
### Play separate intro + loop files together as a single track
|
### Play separate intro + loop files together as a single track
|
||||||
- __Ratchet & Clank (PS2)__: _bgm01.txtp_
|
Some games clumsily loop audio by using multiple full file "segments":
|
||||||
|
|
||||||
|
__Ratchet & Clank (PS2)__: _bgm01.txtp_
|
||||||
```
|
```
|
||||||
# define several files to play as one (there is no limit)
|
# define 2 or more segments to play as one
|
||||||
BGM01_BEGIN.VAG
|
BGM01_BEGIN.VAG
|
||||||
BGM01_LOOPED.VAG
|
BGM01_LOOPED.VAG
|
||||||
|
|
||||||
# multi-files must define loops
|
# segments must define loops
|
||||||
loop_start_segment = 2 # 2nd file start
|
loop_start_segment = 2 # 2nd file start
|
||||||
loop_end_segment = 2 # optional, default is last
|
loop_end_segment = 2 # optional, default is last
|
||||||
|
```
|
||||||
|
Channel number must be equal, mixing sample rates is ok (uses first).
|
||||||
|
|
||||||
#channel number must be equal, mixing sample rates is ok (uses first)
|
If your loop segment has proper loops you want to keep, you can use:
|
||||||
|
```
|
||||||
|
BGM_SUMMON_0001_01-Intro.hca
|
||||||
|
BGM_SUMMON_0001_01-Intro2.hca
|
||||||
|
BGM_SUMMON_0001_01.hca
|
||||||
|
|
||||||
|
loop_start_segment = 3
|
||||||
|
loop_mode = keep # loops in 3rd file's loop_start to 3rd file's loop_end
|
||||||
|
```
|
||||||
|
```
|
||||||
|
bgm_intro.adx
|
||||||
|
bgm_main.adx
|
||||||
|
bgm_main2.adx
|
||||||
|
|
||||||
|
loop_start_segment = 2
|
||||||
|
loop_end_segment = 3
|
||||||
|
loop_mode = keep # loops in 2nd file's loop_start to 3rd file's loop_end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Multilayered songs
|
||||||
|
TXTP "layers" play songs with channels/parts divided into files as one (for example main melody + vocal track).
|
||||||
|
|
||||||
|
__Nier Automata__: _BGM_0_012_song2.txtp_
|
||||||
|
```
|
||||||
|
# mix dynamic sections (2ch * 2)
|
||||||
|
BGM_0_012_04.wem
|
||||||
|
BGM_0_012_07.wem
|
||||||
|
|
||||||
|
mode = layers
|
||||||
|
```
|
||||||
|
|
||||||
|
__Life is Strange__: _BIK_E1_6A_DialEnd.txtp_
|
||||||
|
```
|
||||||
|
# bik multichannel isn't autodetectable so must mix manually (1ch * 3)
|
||||||
|
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#1
|
||||||
|
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#2
|
||||||
|
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#3
|
||||||
|
|
||||||
|
mode = layers
|
||||||
|
```
|
||||||
|
Note that the number of channels is the sum of all layers, so three 2ch layers play as a 6ch file.
|
||||||
|
|
||||||
|
|
||||||
### Minifiles for bank formats without splitters
|
### Minifiles for bank formats without splitters
|
||||||
- __Super Robot Taisen OG Saga - Masou Kishin III - Pride of Justice (Vita)__: _bgm_12.txtp_
|
__Super Robot Taisen OG Saga - Masou Kishin III - Pride of Justice (Vita)__: _bgm_12.txtp_
|
||||||
```
|
```
|
||||||
# select subsong 12
|
# select subsong 12
|
||||||
bigfiles/bgm.sxd2#12 #relative paths are ok too for TXTP
|
bigfiles/bgm.sxd2#12 #relative paths are ok too for TXTP
|
||||||
|
|
||||||
#bigfiles/bgm.sxd2#s12 # "sN" is al alt for subsong
|
#bigfiles/bgm.sxd2#s12 # "sN" is alt for subsong
|
||||||
|
|
||||||
# single files loop normally by default
|
# single files loop normally by default
|
||||||
# if loop segment is defined it forces a full loop (0..num_samples)
|
# if loop segment is defined it forces a full loop (0..num_samples)
|
||||||
@ -35,7 +79,7 @@ bigfiles/bgm.sxd2#12 #relative paths are ok too for TXTP
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Play segmented subsongs as one
|
### Play segmented subsongs as one
|
||||||
- __Prince of Persia Sands of Time__: _song_01.txtp_
|
__Prince of Persia Sands of Time__: _song_01.txtp_
|
||||||
```
|
```
|
||||||
# can use ranges ~ to avoid so much C&P
|
# can use ranges ~ to avoid so much C&P
|
||||||
amb_fx.sb0#254
|
amb_fx.sb0#254
|
||||||
@ -48,13 +92,13 @@ loop_start_segment = 3
|
|||||||
|
|
||||||
|
|
||||||
### Channel mask for channel subsongs/layers
|
### Channel mask for channel subsongs/layers
|
||||||
- __Final Fantasy XIII-2__: _music_Home_01.ps3.txtp_
|
__Final Fantasy XIII-2__: _music_Home_01.ps3.txtp_
|
||||||
```
|
```
|
||||||
#plays channels 1 and 2 = 1st subsong
|
#plays channels 1 and 2 = 1st subsong
|
||||||
music_Home.ps3.scd#c1,2
|
music_Home.ps3.scd#c1,2
|
||||||
```
|
```
|
||||||
|
|
||||||
- __Final Fantasy XIII-2__: _music_Home_02.ps3.txtp_
|
__Final Fantasy XIII-2__: _music_Home_02.ps3.txtp_
|
||||||
```
|
```
|
||||||
#plays channels 3 and 4 = 2nd subsong
|
#plays channels 3 and 4 = 2nd subsong
|
||||||
music_Home.ps3.scd#c3,4
|
music_Home.ps3.scd#c3,4
|
||||||
@ -63,48 +107,10 @@ music_Home.ps3.scd#c3,4
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Multilayered songs
|
|
||||||
|
|
||||||
TXTP "layers" play songs with channels/parts divided into files as one.
|
|
||||||
|
|
||||||
- __Nier Automata__: _BGM_0_012_song2.txtp_
|
|
||||||
```
|
|
||||||
# mix dynamic sections (2ch * 2)
|
|
||||||
BGM_0_012_04.wem
|
|
||||||
BGM_0_012_07.wem
|
|
||||||
|
|
||||||
mode = layers
|
|
||||||
```
|
|
||||||
|
|
||||||
- __Life is Strange__: _BIK_E1_6A_DialEnd.txtp_
|
|
||||||
```
|
|
||||||
# bik multichannel isn't autodetectable so must mix manually (1ch * 3)
|
|
||||||
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#1
|
|
||||||
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#2
|
|
||||||
BIK_E1_6A_DialEnd_00000000.audio.multi.bik#3
|
|
||||||
|
|
||||||
mode = layers
|
|
||||||
```
|
|
||||||
Note that the number of channels is the sum of all layers, so three 2ch layers play as a 6ch file.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Channel swapping/mapping
|
|
||||||
TXTP can swap channels for custom channel mappings. It does "swapping" rather than simpler "mapping" since vgmstream can't read a format's mappings or guess which channel is which. Format is:
|
|
||||||
```
|
|
||||||
#ch1 = first
|
|
||||||
file1.ext#m2-3 # "FL BL FR BR" to "FL FR BL BR"
|
|
||||||
|
|
||||||
#do note the order specified affects swapping
|
|
||||||
file2.ext#m2-3,4-5,4-6 # ogg "FL CN FR BL BR SB" to wav "FL FR CN SB BL BR"
|
|
||||||
```
|
|
||||||
Note that channel masking applies after mappings.
|
|
||||||
|
|
||||||
|
|
||||||
### Custom play settings
|
### Custom play settings
|
||||||
Those setting should override player's defaults if set (except "loop forever"). They are equivalent to some test.exe options.
|
Those setting should override player's defaults if set (except "loop forever"). They are equivalent to some test.exe options.
|
||||||
|
|
||||||
- __God Hand (PS2)__: _boss2_3ningumi_ver6.txtp_ (each line is a separate TXTP)
|
__God Hand (PS2)__: _boss2_3ningumi_ver6.txtp_ (each line is a separate TXTP)
|
||||||
```
|
```
|
||||||
# set number of loops
|
# set number of loops
|
||||||
boss2_3ningumi_ver6.adx#l3
|
boss2_3ningumi_ver6.adx#l3
|
||||||
@ -136,6 +142,19 @@ boss2_3ningumi_ver6.adx#l1.5#d1#f5
|
|||||||
For segments and layers the first file defines looping options.
|
For segments and layers the first file defines looping options.
|
||||||
|
|
||||||
|
|
||||||
|
### Force sample rate
|
||||||
|
A few games set a sample rate value in the header but actually play with other (applying some of pitch or just forcing it)
|
||||||
|
|
||||||
|
__Super Paper Mario (Wii)__
|
||||||
|
```
|
||||||
|
btl_koopa1_44k_lp.brstm#h22050 #in hz
|
||||||
|
```
|
||||||
|
__Patapon (PSP)__
|
||||||
|
```
|
||||||
|
ptp_btl_bgm_voice.sgd#s1#h11050
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### Force plugin extensions
|
### Force plugin extensions
|
||||||
vgmstream supports a few common extensions that confuse plugins, like .wav/ogg/aac/opus/etc, so for them those extensions are disabled and are expected to be renamed to .lwav/logg/laac/lopus/etc. TXTP can make plugins play those disabled extensions, since it calls files directly by filename.
|
vgmstream supports a few common extensions that confuse plugins, like .wav/ogg/aac/opus/etc, so for them those extensions are disabled and are expected to be renamed to .lwav/logg/laac/lopus/etc. TXTP can make plugins play those disabled extensions, since it calls files directly by filename.
|
||||||
|
|
||||||
@ -175,7 +194,7 @@ commands = #s12
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## TXTP parsing issues
|
## TXTP PARSING ISSUES
|
||||||
*Commands* can be chained, but must not be separated by a space (everything after space may be ignored):
|
*Commands* can be chained, but must not be separated by a space (everything after space may be ignored):
|
||||||
```
|
```
|
||||||
bgm bank.sxd2#s12#c1,2 #spaces + comment after commands is ignored
|
bgm bank.sxd2#s12#c1,2 #spaces + comment after commands is ignored
|
||||||
@ -193,34 +212,14 @@ loop_start_segment = 1 #spaces surrounding value are ignored
|
|||||||
```
|
```
|
||||||
```
|
```
|
||||||
bgm.sxd2
|
bgm.sxd2
|
||||||
config = #s12#c1,2 #must not have spaces once value starts until end
|
commands = #s12#c1,2 #must not have spaces once value starts until end
|
||||||
```
|
```
|
||||||
The parser is very simplistic and fairly lax, though may be erratic with edge cases or behave unexpectedly due to unforeseen use-cases and bugs. As filenames may contain spaces or #, certain name patterns could fool it too. Keep in mind this while making .txtp files.
|
The parser is very simplistic and fairly lax, though may be erratic with edge cases or behave unexpectedly due to unforeseen use-cases and bugs. As filenames may contain spaces or #, certain name patterns could fool it too. Keep in mind this while making .txtp files.
|
||||||
|
|
||||||
|
|
||||||
## Mini TXTP
|
## MINI-TXTP
|
||||||
|
|
||||||
To simplify TXTP creation, if the .txtp is empty (0 bytes) its filename is used directly as a command. Note that extension is also included (since vgmstream needs a full filename).
|
To simplify TXTP creation, if the .txtp is empty (0 bytes) its filename is used directly as a command. Note that extension is also included (since vgmstream needs a full filename).
|
||||||
- _bgm.sxd2#12.txtp_: plays subsong 12
|
- _bgm.sxd2#12.txtp_: plays subsong 12
|
||||||
- _Ryoshima Coast 1 & 2.aix#c1,2.txtp_: channel mask
|
- _Ryoshima Coast 1 & 2.aix#c1,2.txtp_: channel mask
|
||||||
- _boss2_3ningumi_ver6.adx#l2#F.txtp_: loop twice then play song end file normally
|
- _boss2_3ningumi_ver6.adx#l2#F.txtp_: loop twice then play song end file normally
|
||||||
- etc
|
- etc
|
||||||
|
|
||||||
|
|
||||||
## Other examples
|
|
||||||
|
|
||||||
_Join "segments" (intro+body):_
|
|
||||||
```
|
|
||||||
#files must have same number of channels
|
|
||||||
Song001_intro.ogg
|
|
||||||
Song001_body.ogg
|
|
||||||
loop_start_segment = 2
|
|
||||||
```
|
|
||||||
|
|
||||||
_Join "layers" (ex. main+vocals):_
|
|
||||||
```
|
|
||||||
#files must have same number of samples
|
|
||||||
Song001_main.ogg
|
|
||||||
Song001_vocals.ogg
|
|
||||||
mode = layers
|
|
||||||
```
|
|
||||||
|
Loading…
Reference in New Issue
Block a user