A quest for the perfect creative coding framework
Note: this article is subject to be updated as soon as I find a framework that meets my criteria! If you find anything that can be proved to be incorrect, please let me know so I can address it.
What I am looking for?
A shell friendly, text-editor agnostic framework for creating visuals that is fun and has good enough performance. Hot-reloading would be great. An interpreted language wins over compiled ones: even if it's less performant, no compilation step means it's actually easier to stay in the zone and make something creative and interesting.
What have I tried so far?
Processing
My first love. Totally loved it when I started and I knew nothing about programming, but since I started get more and more years of programming experience, especially in Python, I can no longer stand the level of verbosity that I have to go through with Java. It's just in the way of my thoughts.
Openframeworks
https://github.com/openframeworks/openFrameworks
My second long lasting love: such a vibrant community, many addons, etc.. however, code-wise it's a bit messy and I always fear that I'll get into bad C++ practices if I keep using it.
Cinder
Looks good and professional, where by professional I mean that it follows the language and makes a sane use of namespacing, and other C++ features.. C++ is a controversial language for many, and I'm not proficient enough in it to make a final judgement call over it. I personally still enjoy some aspects of it, especially if just for creative coding and if with C++11. That being said - I wish Cinder didn't require XCode and could just work via Makefiles, like Openframeworks does. Having to use XCode made me ignore it for a long time. I want to keep my dev environment consistent, I really don't want to use a dedicated IDE just for doodling around! I wish I could just use a shell + vscode/eventually vim. Some cmake support would be nice. EDITED: apparently there's some cmake support: https://libcinder.org/docs/guides/cmake/cmake.html so I will have another look. I also just discovered that a lot of the development of Cinder was contributed by people at big vfx studios like ILM, Rhythm & Hues (RIP), etc.. (https://cdm.link/2010/04/meet-cinder-free-barbarian-group-code-framework-produces-stunning-work-qa/)
Nannou
The framework I really wished I could love! As much as Rust can be an excellent idea for system level programming, and it solves some many issues that we all fought in C++ (Rust has a proper package manager!), I don't think it's a good fit for creative coding. The only guy that was able to make something interesting out of Rust is probably a genius (Alexis Andre aka MacTuiTui: https://githubuniverse.com/Nannou-creative-coding-with-Rust/) with a lot of dedicated time. My 2 cents is that it's probably amazing but it will take you years to master, and Rust safety-first mechanisms feel against a drafty/sketchy state of mind that one would undertake when doing creative coding.
ThreeJS
My third long lasting love: very nice docs, incredible amount of people out there actually using it to build amazing stuff, ease of us and fun. The main downside is that it's JavaScript - but not modern JS (threejs is still filled with callbacks instead of promises), so it can be a bit hard to follow the more modern approaches to JS development. Although I think that this has been changing recently.
Quil
Looked intriguing, and was a good reason to tap into functional programming. I had to download the Java SDK, and I went with Java 11, but I hit some issues (on macOS) with their support for Java Versions newer than 8, and judging from their repos I don't think anyone will ever solve them. Keep in mind that Java 8 has been deprecated a long time ago. I'm not a Java expert so it was easier just to move away from it for now! sad.
Love2d
This was really fun! Docs are good, and it took 5 minutes get up and running, no need to install anything. I could make something interesting and spend a good 2-4 hours with the framework without suffering any limits, and I never programmed in Lua before that. My main issue was that Lua felt a bit primitive - especially compared to Python. That's my taste, of course, but I agree with some of the comments here https://news.ycombinator.com/item?id=16404562 , especially the
Even worse is the "arrays are hashtables in disguise" concept, because even though it might appear to be elegant, it doesn't work well in practice. In the end, you have to treat arrays and hashtables differently (see, e.g., pairs() and ipairs()), because – big surprise – arrays and hashtables are very different conceptually, so you don't gain much from unifying them.
Feature matrix
This is not an entirely objective list, some of the columns are entirely based upon my experience with that specific framework. If a numeric value is present, it's in the range 0-10 (decimal), where 0 means I wouldn't recommend it to my worst enemy and 10 means I wanna marry it.
Name | Language | Compiled | Hot Reloading | Relative Performance | Dev UX |
---|---|---|---|---|---|
Processing | Java | no | kinda | 7 | 7 |
Openframeworks | C++ | yes | no | 10 | 8 |
Cinder | C++ | yes | no | 10 | 9 |
Nannou | Rust | yes | no | 9 | 6 |
threejs | JavaScript | no | w/ canvas-sketch | 9 | 9 |
p5js | JavaScript | no | can be achieved | 6 | 8 |
Love2d | Lua | no | 7 | 9 | |
Quil | Clojure | no | it should? | ? | 5 |