Compare commits

...

2 Commits

Author SHA1 Message Date
Nico d876da7e11 single-pattern playback working 2022-01-10 08:14:13 +00:00
Nico d23350ebcb make instrument lookup not super bad 2022-01-09 17:28:15 +00:00
2 changed files with 91 additions and 50 deletions

View File

@ -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

View File

@ -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 )