My Projects

This page is meant as a listing for some general projects, mostly programming related, which I've been working on. As some of these things become more complete they'll likely make their way to dedicated pages, and maybe even to the navigation bar!


Music Collage

This is a sort of experimental project I've been working on with my brother, focused on using unique collages of icons as a way of exploring new music. I'm quite happy with how it turned out aesthetically, and though I would like to spend some time refactoring the code, it certainly gets the job done as is. Click here to try it out, and please let us know what you think!

On the technical side, this was my first real foray in Web Assembly, and frankly it was still much easier to write the required C code for this project than it was to write the Javascript (what a wreck of a language...). I definitely plan to make more use of WASM in the future, but hopefuly not using Emcripten or C++. With the Memory64 feature soon making its way into browsers, I hope to write my future WASM projects in Jai or Odin.


Jai Modules

Jai Dyncall

Dyncall is a C library for performing dynamic function calls where the target function and its paramter types are not known at compile-time. This is particularly useful for building a foreign function interface between languages, using the C ABI as a common bridge. For example, I used this library to develop a custom scripting language in Jai which I use in the game I am building.

This module provides Dyncall bindings for the Jai programming language with additional wrappers to augment the base functionality through use of reflection. You can read more about the module here.

Lead Sheets

Lead Sheets is a small scripting language that is designed to be multi-purpose and extensible. It offers somewhat unique metaprogramming facilites through directives which can view and manipulate AST both at parse-time and in the typechecking phase. I have used the same basic language to implement a declarative data format, as well as a user console and level scripting system for the game I am building.

Currently, the language executes only through an AST tree-walker. In the future I plan to implement a bytecode VM to allow scripts to run more efficiently while still allowing for runtime-reflection.

Below is a small little program running in Web Assembly (compiled from Jai code) showing the scripting language in action. You can view and modify the script and recompile it to alter the resulting visualization. You can also try the demo in full-screen here.

Data Packer

My data packer module will automatically serialize and deserialize binary data using a Jai type info structure. When data is deserialized, the data packer can also leverage my complementary Jai-Convert module to remap the file data into internal data structures. This remapping facility makes the binary data robust to changes in a program's internal data structures across time.

If you're familiar with protobuffs, this module is somewhat similar in concept. However, whereas protobuffs is intended for use as an interchange format, my data packer is geared primarily towards data storage. In the futue, I plan to add additional features such as compile-time tracking of data structures, building a sort of "type library" that will allow users to view the changes in their program's data structures over time.

HTML Templater

This whole website is generated using an html templating engine which I've also built in Jai. The template files contain Jai code blocks which allows the user to embed variables into the generated HTML or use flowd control constructs to stamp out blocks of HTML. Using Jai's metaprogramming facilities, it was quite easy to set up a build process which would preload the template files and turn those templates into rendering functions for each page. These templates can then call one another (optionally, with parameters) which makes it very easy to build reusable web components.

This is still a work in progress, but the plan is to eventually tie this into an HTTP server to create a full framework for server-side rendering in Jai.


GON Parsers

GON is, put simply, JSON without the BS. It's easier to read and edit, saving you time and energy. Go read about it here.

sample_object {
    file_name: test.gon,
    number:    35.35,
    string:    "this is a string",
    array:     [ 1 [ 2.1, 2.2 ] 3 ]
    nested_object: {
        number: 53.53,
        string: "another string"
    }
}

Game Development

I occasionally find the time to work on game development. If you want to see my current and previous projects, click here.