uxnería: experiments with uxn programming
Go to file
sejo 32007e85b6 corrected for 2022 assemblers 2022-05-09 15:54:37 -05:00
media lines animation sprite 2021-09-21 11:51:20 -05:00
projects corrected for 2022 assemblers 2022-05-09 15:54:37 -05:00
roms corrected for 2022 assemblers 2022-05-09 15:54:37 -05:00
sketches brought calculadora from other sketch folder 2021-07-13 12:12:20 -05:00
README.md added TODOs 2021-09-02 16:36:34 -05:00



experiments with uxn programming.


  • update projects to latest uxntal syntax
  • create folder for the uxn tutorial examples


  • nibble dice tracker
  • darena

nibble dice tracker

nibble-dice-tracker.tal a 3-channel music tracker based on the nibble dice described by maleza.

uxn nibble dice tracker - demo video

nibble dice tracker - info page


the interface consists in 3 sections, one for each audio channel/device.

each section consists in 2 columns. the right column of a section has an indicator for the position of the "beat", and its state (playing or not).

each column consists in 8 bytes.

a byte consists in 2 contiguous nibble dice: the one at the left is the high nibble, and the one at the right is the low nibble.

the bytes in a section map to the following aspects of the tracker and audio device:

  • period ( 1 byte ) - how many frames have to happen to trigger a beat.
    • if 0, the device is off
  • pattern ( 8 bits ) - each bit indicates if a note has to be played or not in that beat
    • bit 0 (least significant bit) corresponds to beat 0, bit 1 to beat 1, and so on.
  • beatcount ( 2 nibbles ) - definition of the beat count behavior
    • low nibble: how many beats happen in a cycle. if 0, there are no beats.
    • high nibble: beat offset; starting value for the beat count.
    • e.g. if high nibble is 2, and low nibble is 4, the beat count will repeat as 2, 3, 4, 5
  • adsr ( 2 bytes ) - envelope values, as described by the audio device reference
  • volume ( 2 nibbles ) - left and right volume values, as described by the audio device reference
  • sample ( 2 nibbles and 1 byte ) - definition of the sample to be used
    • high nibble: index of sample to use:
      • 0: saw
      • 1: main (program code)
      • 2: piano
      • 3: triangular
    • low nibble + byte: length of the sample to use
  • melody ( 8 bytes ) - midi notes corresponding to beats 0 to 7, from top to bottom.


  • Arrow key up, or k : move cursor to previous byte
  • Arrow key down, or j: move cursor to next byte
  • Arrow key left, or h: move cursor to previous nibble
  • Arrow key right, or l: move cursor to next nibble
  • Ctrl or +: increment nibble
  • Alt or -: decrement nibble
  • 0 to 9 and a to f: assign value to nibble

nibble dice references

possible improvements

  • midi output?
  • automatically center interface on screen (done!)
  • keys for setting the value of a nibble? (done!)


darena.tal an open-ended game of rocks and sand.

darena info page

possible "improvements"

  • add an "official" pulling option (you can pull rocks right now, but in a hacky way)
  • save rocks state (position and color) to file
  • optimize the use of memory for rock colors, using one bit per rock instead of one byte
  • optimize for 256x192 screensize


ready-assembled projects:

  • nibble-dice-tracker.rom
  • darena.rom


  • nibble.tal: small demo drawing all the nibble dice
  • audio-prototype0.tal: first iteration of sequencer / tracker with nibble dice. the dice are used to read/write into memory:
    • you can manipulate the dice in order to change pulse period (1 byte), pitch (1 byte), adsr values (2 bytes), volume (1 byte), "bang" sequencing (?) (1 byte); to toggle a melody sequencer (1 bit), and/or modify the melody (8 bytes), and even the super low-res wave shape (8 bytes), for two audio devices (3 columns for the first one, 3 columns for the second one)
  • calculadora.tal: experiment for an 8-bit rpn calculator, from before there was a console/vector available. for the moment it uses the keyboard input


  • nibble-dice.chr is the spritesheet for the nibble dice. it has them in an 8x8 pixels version, and in 16x16.

drawn using nasu


sejo - cc0: dedicated to the public domain