Compare commits
2 Commits
628ed099fc
...
d876da7e11
Author | SHA1 | Date |
---|---|---|
Nico | d876da7e11 | |
Nico | d23350ebcb |
|
@ -47,11 +47,9 @@ a song row is 4 bytes. Each byte is a pattern number, with the first byte being
|
|||
|
||||
## Patterns
|
||||
|
||||
Patterns contain a short containing the size of the pattern in bytes, and 0x10 lines of note data. Patterns are ordered sequentially in the file and there can be up to 255 patterns in a file.
|
||||
Patterns contain 0x10 lines of note data. Patterns are ordered sequentially in the file and there can be up to 255 patterns in a file.
|
||||
|
||||
### Pattern lines
|
||||
|
||||
A pattern line consists of either 1 or 3 bytes, depending on if the most significant bit of the first byte is high. The 7 remaining bits of the first byte are the note value, with the MSB being set if the line contains an effect and not otherwise. If the line contains an effect, the next two bytes contain an effect and a parameter for that effect. No note is represented by the byte 00. 0x7f represents a note off/note stop.
|
||||
A pattern line consists of 3 bytes. The first byte contains a note and the next two bytes contain an effect and a parameter for that effect. No note is represented by the byte 00. 0xff represents a note off/note stop. No effect is also represented by 00.
|
||||
|
||||
### Effects
|
||||
|
||||
|
|
135
player.tal
135
player.tal
|
@ -26,6 +26,10 @@
|
|||
@kalama
|
||||
&module $2 ( pointer to start of module file )
|
||||
&loopflags $1 ( if different channels are set to loop )
|
||||
&instruments $2 ( address that instruments start at )
|
||||
&tick $1
|
||||
&line $1
|
||||
&speed $1
|
||||
|
||||
( program )
|
||||
|
||||
|
@ -36,48 +40,67 @@
|
|||
#0fc5 .System/g DEO2
|
||||
#0f25 .System/b DEO2
|
||||
|
||||
;module .kalama/module STZ2
|
||||
;module ;k-init-module JSR2
|
||||
|
||||
#00 #00 ;k-load-instrument JSR2
|
||||
|
||||
;on-frame/run .Screen/vector DEO2
|
||||
#00 #00 ;k-load-instrument/run JSR2
|
||||
#3c .Audio0/pitch DEO
|
||||
BRK
|
||||
|
||||
@on-frame ( -> )
|
||||
&run
|
||||
;k-tick/run JSR2
|
||||
BRK
|
||||
|
||||
@k-tick
|
||||
&run
|
||||
.kalama/tick LDZ #01 ADD DUP
|
||||
.kalama/speed LDZ EQU ,&play JCN
|
||||
.kalama/tick STZ
|
||||
RTN
|
||||
&play
|
||||
#ff .kalama/tick STZ
|
||||
.kalama/line LDZ #01 ADD DUP
|
||||
DUP #00 SWP #0003 MUL2
|
||||
#00 ;k-get-pattern/run JSR2 ADD2 ;k-play-line/run JSR2
|
||||
#0f EQU ,&next JCN
|
||||
.kalama/line STZ
|
||||
RTN
|
||||
&next
|
||||
( TODO next pattern )
|
||||
#ff .kalama/line STZ
|
||||
RTN
|
||||
|
||||
( initialises kalama with module data )
|
||||
@k-init-module ( addr* -- )
|
||||
&run
|
||||
DUP2 .kalama/module STZ2 ( store module address )
|
||||
DUP2 LDA #0f AND .kalama/speed STZ ( set speed )
|
||||
#0001 ADD2 LDA ( get pattern count byte )
|
||||
;k-get-pattern/run JSR2 ( get the "pattern" that is 1 over the pattern index numbers. This is the first byte of the instruments )
|
||||
.kalama/instruments STZ2
|
||||
#ff .kalama/tick STZ
|
||||
#ff .kalama/line STZ
|
||||
|
||||
RTN
|
||||
|
||||
( gets the memory address of the given pattern in loaded module )
|
||||
@k-get-pattern ( number -- addr* )
|
||||
&run
|
||||
STH ( stash pattern number to return stack for loop counter later )
|
||||
.kalama/module LDZ2 ( get module start address )
|
||||
#00 SWP #0030 MUL2
|
||||
.kalama/module LDZ2
|
||||
#0003 ADD2 ( skip header )
|
||||
DUP2 LDA2 ( load pattern table length )
|
||||
#0002 ADD2 ( skip pattern table length byte )
|
||||
ADD2 ( and skip the pattern table )
|
||||
( we are now at the size byte of pattern 00 )
|
||||
|
||||
&loop
|
||||
STHrk #00 EQU ,&end JCN
|
||||
STHr #01 SUB STH ( decrement counter )
|
||||
DUP2 LDA #00 SWP ( load length byte and convert to short )
|
||||
#0001 ADD2 ( jump over length byte )
|
||||
ADD2 ( jump to next pattern )
|
||||
,&loop JMP
|
||||
&end
|
||||
POPr
|
||||
DUP2 LDA2 ADD2 ( skip song table body )
|
||||
#0002 ADD2 ( skip song table size short )
|
||||
ADD2
|
||||
|
||||
RTN
|
||||
|
||||
( gets the memory address of the given instrument in loaded module )
|
||||
@k-get-instrument ( number -- addr* )
|
||||
&run
|
||||
STH ( store instrument number for later )
|
||||
.kalama/module LDZ2 ( get module start address )
|
||||
#0001 ADD2 LDA ( get pattern count byte )
|
||||
;k-get-pattern/run JSR2 ( get that "pattern". This is 1 over the number of patterns, so this spits us out at the first byte after all the patterns which is the first byte of the first instrument )
|
||||
( TODO don't recalculate this every time )
|
||||
|
||||
.kalama/instruments LDZ2
|
||||
( we are now at the size byte of instrument 00, the start of instrument memory )
|
||||
&loop
|
||||
STHrk #00 EQU ,&end JCN
|
||||
|
@ -91,6 +114,16 @@ RTN
|
|||
POPr
|
||||
RTN
|
||||
|
||||
@k-play-line ( *l -- )
|
||||
&run
|
||||
LDA DUP
|
||||
#00 EQU ,&rest JCN
|
||||
.Audio0/pitch DEO ( TODO use correct channel, effects )
|
||||
RTN
|
||||
&rest
|
||||
POP
|
||||
RTN
|
||||
|
||||
( loads instrument with number into specified audio channel, 0-indexed )
|
||||
@k-load-instrument ( number channel -- )
|
||||
&run
|
||||
|
@ -148,39 +181,49 @@ RTN
|
|||
RTN
|
||||
|
||||
@module
|
||||
|
||||
84 02 02 ( file header - speed 8, loop on, 2 patterns, 2 instruments )
|
||||
88 02 02 ( file header - speed 8, loop on, 2 patterns, 2 instruments )
|
||||
0008 ( size )
|
||||
00 00 ff ff
|
||||
00 01 ff ff ( song table, 2 rows )
|
||||
( pattern 00 )
|
||||
12 ( size byte )
|
||||
3c 02 00 ( C-3 I00 )
|
||||
ff bc
|
||||
ff bc
|
||||
ff bc
|
||||
ff bc
|
||||
ff bc
|
||||
ff bc
|
||||
ff bc
|
||||
ff
|
||||
00 00 00
|
||||
ff 00 00
|
||||
00 00 00
|
||||
3c 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
3c 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
3c 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
00 00 00
|
||||
( pattern 01 )
|
||||
14 ( size byte )
|
||||
ff
|
||||
ff 00 00
|
||||
3c 02 00 ( C-3 I00 )
|
||||
ff be
|
||||
ff be
|
||||
ff
|
||||
3e 01 66 ( D-3 V66 )
|
||||
ff be
|
||||
ff be
|
||||
ff be
|
||||
ff be
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
ff 00 00
|
||||
3c 00 00
|
||||
( instrument 00 )
|
||||
0002 ( sample length )
|
||||
ff ( volume )
|
||||
80 ( flags - loop sample )
|
||||
10f0 ( ADSR )
|
||||
00f0 ( ADSR )
|
||||
ff 00 ( square wave sample data )
|
||||
( instrument 01, unused )
|
||||
0008 ( sample length )
|
||||
|
|
Reference in New Issue