From c6e160cc025272df6d402383a8d04f0813a3c7f6 Mon Sep 17 00:00:00 2001 From: Nihilazo Date: Sat, 1 May 2021 20:16:24 +0100 Subject: [PATCH] initial commit --- Makefile | 6 +++ main.usm | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ readme.md | 8 ++++ rom.bin | Bin 0 -> 209 bytes 4 files changed, 126 insertions(+) create mode 100644 Makefile create mode 100644 main.usm create mode 100644 readme.md create mode 100644 rom.bin diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b32ede4 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +SRC=main.usm +run: rom.bin + uxn-emulator rom.bin + +rom.bin: $(SRC) + uxn-assembler $(SRC) rom.bin \ No newline at end of file diff --git a/main.usm b/main.usm new file mode 100644 index 0000000..166cbce --- /dev/null +++ b/main.usm @@ -0,0 +1,112 @@ +( a blank file ) + +( macros ) +%RTN { JMP2r } ( return from a subroutine ) + +( data structure access macros ) +%NOTE { NOP } ( get the note of a pattern line addr ) +%INST { #0001 ADD2 } ( get the instrument of a pattern line addr ) +%VOL { #0002 ADD2 } ( get the volume of a pattern line addr ) + +( debugging macros ) +%LOG { DUP .Console/byte DEO } ( prints a byte to the console non-destructively ) + +( constants ) +%PTN_WIDTH { #0003 } ( pattern width. a short ) +%PTN_LEN { #0010 } ( pattern length. a short ) + +( devices ) + +|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 ] +|10 @Console [ &pad $8 &char $1 &byte $1 &short $2 &string $2 ] +|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ] +|30 @Audio0 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|40 @Audio1 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|50 @Audio2 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|60 @Audio3 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|70 @Midi [ &vector $2 &channel $1 ¬e $1 &velocity $1 ] +|80 @Controller [ &vector $2 &button $1 &key $1 ] +|90 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ] +|a0 @File [ &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 ] +|b0 @DateTime [ &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ] + +( variables ) + +|0000 + +@State [ &position $2 &pattern-addr $2 &tick $1 &speed $1 ] + +( program ) + +|0100 ( -> ) + +( set a pallete ) +#0f00 .System/r DEO2 +#00f0 .System/g DEO2 +#000f .System/b DEO2 + +( speed - how many ticks we play a note every ) +#10 .State/speed POK + +;pattern .State/pattern-addr POK2 + +( display/audio init ) +;on-frame .Screen/vector DEO2 +#0180 .Audio0/adsr DEO2 +;wave .Audio0/addr DEO2 +#ff .Audio0/volume DEO +#0002 .Audio0/length DEO2 +BRK + +@on-frame ( -> ) + .State/tick PEK .State/speed PEK NEQ ,&inc JNZ ( if the tick != speed, skip to inc ) + ;on-step JSR2 ( otherwise, run the on-step routine ) + #00 .State/tick POK ( reset the tick ) + ,&end JMP ( jump to end ) + &inc + #01 .State/tick PEK ADD .State/tick POK ( tick up 1 ) + &end + BRK + +@on-step ( whenever a pattern step should be played ) + PTN_WIDTH PTN_LEN MUL2 .State/position PEK2 NEQ2 ,&continue JNZ ( if we're at the end of the pattern, reset the counter ) + #ff .Console/byte DEO + #0000 .State/position POK2 + &continue + .State/position PEK2 .State/pattern-addr PEK2 ADD2 ( put pattern line address on the stack ) + DUP2 VOL GET .Audio0/volume DEO ( ln -- ) ( put the address of the pattern line on the stack ) + NOTE GET ( get the current note ) + DUP #00 EQU ,&rest JNZ ( if the note is 00, aka empty, skip playing it ) + .Audio0/pitch DEO ( play the note ) + ,&end JMP ( jump to the end ) + + &rest POP ( if the note is a 00, jump here. POP to clean up the stack ) + &end + PTN_WIDTH .State/position PEK2 ADD2 .State/position POK2 + + RTN + +@wave [ a8 58 ] + + +( pattern format - each note has 3 bytes. Pitch, instrument, volume. patterns are 0x10 long. + an ff in the note column of the pattern will kill the existing note without starting a new one (this is the tracker "box" note) ) + +@pattern [ + 3c 00 66 + ff 00 66 + 3e 00 22 + 00 00 66 + 3c 00 88 + 00 00 66 + 3e 00 66 + 00 00 66 + 3c 00 22 + 00 00 66 + 3e 00 20 + 00 00 66 + 3c 00 66 + ff 00 66 + 3e 00 ff + 40 00 66 +] \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..05c9c60 --- /dev/null +++ b/readme.md @@ -0,0 +1,8 @@ +# kalama + +> kalama +> noun: sound, noise, voice +> verb: make noise +> trans. verb: sound, ring, play (an instrument) + +kalama is a (work in progress) tracker for the [uxn](https://wiki.xxiivv.com/site/uxn) virtual machine. It intends to allow the user a reasonably large amount of control over all the features of uxn's audio engine. It is currently in a prototyping phase, so don't expect to use it right now. diff --git a/rom.bin b/rom.bin new file mode 100644 index 0000000000000000000000000000000000000000..97e0888a5f64830164576763d5cd0213caebdad0 GIT binary patch literal 209 zcmXAhJr06E6oh904d@bn8nojX8yf@FZj`JZ!^D0o4`JyojGf2x2KdBgGBf#RqySSZ z_;8_G&{&q7Rl*meUU+0{g?BpDCkM-sz7a$`STIqt%xH4qbx+L|Gec^>QV&5aC=W!p z<1*LfT9+VtZ5VZKt3R&Rzo<@#l=GaYhBUg06>&=5-j@MkMDW-EVZcMxBTW9+c(jxM IGvgWI3yr!O?EnA( literal 0 HcmV?d00001