dos33fsprogs/pt3_player/README.pt3_player

131 lines
4.0 KiB
Plaintext
Raw Normal View History

2019-05-15 16:21:39 +00:00
The PT3_player
~~~~~~~~~~~~~~
2019-05-07 00:16:45 +00:00
2019-05-15 16:21:39 +00:00
by Vince "Deater" Weaver
17 May 2019
2019-05-15 16:21:39 +00:00
http://www.deater.net/weave/vmwprod/pt3_player/
2019-05-15 16:21:39 +00:00
Plays Vortex Tracker II .pt3 files on the Apple II
2019-05-15 16:21:39 +00:00
Background
~~~~~~~~~~
Vortex Tracker is commonly used to create AY-3-8910 music for the
ZX Spectrum and Atari ST systems. A large number of great pt3 files
can be found on the internet.
There are many benefits to using .pt3 format, but until now there
was no player available for Apple II/6502. (Though some people
had been playing the files using a z80-card in their system).
Part of the challenge was the documentation for the format was
in Russian, and the only source-code available for .pt3
players were in uncommented z80 assembly or else Russian-commented
Pascal.
Why .pt3? Why not play YM5 files?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are already many projects (including one of my own) for
playing the .YM file format, which is much simpler. It is just a
series of AY-3-8910 raw-register dumps which can quickly be sent
to the Mockingboard.
The issue is uncompressed YM5 files are really huge. So you have to
do some sort of decompression on the fly, and even then you are looking
at 32k+ or more of RAM. This might be fine on an Apple IIe with
128k of RAM, but I am targetting a II+ where I don't have that much
available.
A PT3 file is a tracker format, meaning a list of notes, patterns, and
ornaments and can be played in place. Once you load the music file and
the player, no additional RAM is needed at all. It does take more CPU
than playing a YM5 file.
Using the PT3_PLAYER
~~~~~~~~~~~~~~~~~~~~
2019-05-15 19:25:18 +00:00
The pt3_player.dsk should boot automatically.
Controls:
Right/Left arrow Switch songs
Spacebar Pause playback.
M Switch from 1MHz to 1.77MHz mode
2019-05-17 17:19:04 +00:00
L Enables looping in the song
2019-05-15 19:25:18 +00:00
FUTURE FEATURES:
Key to disable visualization
Key to skip ahead/back in pattern list
2019-05-17 17:19:04 +00:00
2019-05-15 19:25:18 +00:00
ZX Compatability:
~~~~~~~~~~~~~~~~~
ZX Spectrum songs expect a 1.77MHz AY-3-8910, but the Apple II
is 1MHz so by default songs would sound lower
pitched. By default now we multiply by 9/16 to scale
things properly, but that does eat up extra CPU cycles.
You can toggle this on/off by pressing "M" when playing.
2019-05-15 19:25:18 +00:00
In theory we can create songs that expect 1MHz, but the pt3 format
has no way of indicating this.
2019-05-15 16:21:39 +00:00
Adding other files
~~~~~~~~~~~~~~~~~~
2019-05-15 16:21:39 +00:00
Unlike YM5 players which require complicated preparation of files
(with often complex, or hard-to find tools) the PT3_PLAYER can in
theory play plain .pt3 files.
To play your own files, just copy the file you want over an
existing file (using the same filename).
2019-05-15 16:21:39 +00:00
TODO: It would be great if the player was smart enough to catalog
the disk and just play all the files it finds, but that's a level
of disk manipulation I don't have time to mess with right now.
Other Future Plans
~~~~~~~~~~~~~~~~~~
The PT3 format can handle 6-channel songs (which a Mockingboard
can play). I'd like to add support for this, but it will
need some low-level changes to the code.
2019-05-15 16:21:39 +00:00
Code Optimization
~~~~~~~~~~~~~~~~~
The original working code is about 4k (not counting the pt3 file)
and has an overhead of roughly 20% when playing a song interrupt-driven
at 50Hz.
I'm keeping some stats here as I try to optimize the size and speed.
Song: "Summer of Rain"
~~~~~~~~~~~~~~~~~~~~~~
lz4 compressed
pt3 size: raw size: ym5 size: pt3.lz4:
3871 137015 7637 1793
Decoder Type size ZP use decode total CPU overhead
-------------------------------------------------------------
Original 4k(?) 22B 28.16s 171s 16%
Random Programming Reminders
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASR = CMP #$80 / ROR
signed 8-bit comparison
see http://6502.org/tutorials/compare_beyond.html#2.2
SEC ; prepare carry for SBC
SBC NUM ; A-NUM
BVC LABEL ; if V is 0, N eor V = N, otherwise N eor V = N eor 1
EOR #$80 ; A = A eor $80, and N = N eor 1
LABEL
If the N flag is 1, then A (signed) < NUM (signed) and BMI will branch
If the N flag is 0, then A (signed) >= NUM (signed) and BPL will branch