wtfx by Irrlicht Project [web]
********************************************************************************
wtfx - wavetable player with fx
by utz 02'2016 * www.irrlichtproject.de
********************************************************************************
==================================== ABOUT =====================================
wtfx is a two-channel beeper with almost distortion-free wavetable playback. It
can be used to create complex sound effects, thanks to it's table-based fx
system. The sound is mixed at 17.5 KHz, and there are 4 volume levels per
channel. Channel volumes are asynchronous, with channel 2 being slightly louder
than channel 1. Tempo can be controlled per step.
The player is provided in source format only, to be assembled with pasmo.
================================== COMPOSING ===================================
There is currently no editor available for this player, and it is too complex to
simulate via an XM template. So unfortunately the only possibility to make music
with it is by hand-coding all the data in asm. For reference, an example note
table has been included.
You can also configure a few things in main.asm. To disable looping, uncomment
line 39. If you want more fine-grained speed control, replace both nops in line
114 and 115 with "dec b". If you don't want to use any effects, comment out
lines 84, 280-288, and 292-487, and omit the fx pointers in the pattern data.
================================== WAVETABLES ==================================
All used wavetables must be linked in 'samples.asm'. The wavetables themselves
must be exactly 256 bytes long, and may only use the following values:
0x00 - silence
0x88 - 25% volume
0xcc - 50% volume
0xee - 75% volume
0xff - 100% volume
More complex waveforms may fail to play properly.
See /samples for some examples.
You can also create wavetables with the included wav2smp.pl utility, using
headerless unsigned 8-bit wav samples as input. The syntax is as follows:
wav2smp.pl <volume> <infile> [<outfile>]
where volume is a value between 1 and 4.
============================== MUSIC DATA FORMAT ===============================
wtfx music data is split into three sections: song sequence, patterns, and fx
tables.
The song sequence must come first in music.asm. It consists of a list of
pointers to patterns, according to the order in which they are to be played. It
must contain a label named "loop", the position of which defines the loop point
to which the player will jump after it has finished playing the song. The song
sequence is terminated with 0x0000. The shortest possible sequence is therefore
loop
dw pattern0
dw 0
After the song sequence, there should be one or more patterns of note data.
These are organized in rows of 6 words. The order is as follows:
1. tempo * 256 + flags (always 0, reserved for further use)
2. 16-bit note value channel 1
3. pointer to wavetable channel 1
4. 16-bit note value channel 2
5. pointer to wavetable channel 2
6. pointer to fx table
Patterns must be terminated with 0x40.
Last but not least, some fx tables are needed. These consist of one or more
commands, which are in turn followed by 0-4 word or byte length arguments.
The following commands are available:
command arguments function
tExecNone none do not execute any fx on this row
tExecStop none stop wavetable execution for this row
tExecLoop loop pointer jump to an arbitrary point in the current
or another fx table. Additionally, execute
the next command at the loop point.
tf1 note value ch1 change note of ch1 to the given value
tf1s1 note value ch1, change ch1 note and wavetable to the given
hi-byte of wavetab ch1 values
tf1s1f2 note value ch1, change both notes and wavetable ch1 to the
hi-byte of wavetab ch1, given values
note value ch2
tf1s1s2 note value ch1, change note value ch1 and both wavetables
hi-byte of wavetab ch1,
hi-byte of wavetab ch2
tf1f2 note value ch1, change both note values
note value ch2
tf1f2s2 note value ch1, change both note values and wavetable ch2
note value ch2,
hi-byte of wavetab ch2
tf1s2 note value ch1, change ch1 note and ch2 wavetable to the
hi-byte of wavetab ch2 given values
tf1s1f2s2 note value ch1, change all notes and wavetables pointers
note value ch2, to the given values
hi-byte of wavetab ch1, ATTN: order of arguments is changed here!
hi-byte of wavetab ch2
ts1 hi-byte of wavetab ch1 change wavetable ch1 to the given value
ts1f2 hi-byte of wavetab ch1, change wavetable ch1 and note value ch2 to
note value ch2 the given values
ts1f2s2 note value ch2, change both wavetable pointers and the
hi-byte of wavetab ch1, note value of ch2
hi-byte of wavetab ch2 ATTN: order of arguments is changed here!
ts1s2 hi-byte of wavetab ch1, change both wavetable pointers
hi-byte of wavetab ch2
tf2 note value ch2 change note of ch2 to the given value
tf2s2 note value ch2, change ch2 note and wavetable to the given
hi-byte of wavetab ch2 values
ts2 hi-byte of wavetab ch2 change wavetable ch2 to the given value
The order in which the patterns and fx tables are provided has no importance.
See 'music.asm' for more details.
================================================================================
[ back to the prod ]
