It's such a fabulous tool as the generated images can be used for effects like glass/ice displacements, cheap water-like effects, but you can also generate terrains from it or just cool visual effects that benefit from random patterns. The core property to me is that it feels very organic/natural.
This was such a common tool in Flash AS3 back in the days to create stunning effects, games and such. I'm not active in building visual stuff like that anymore but I bet it's still very common in this field, because why not?
https://post-processing.tresjs.org/guide/pmndrs/ascii
https://forum.babylonjs.com/t/ascii-shader-using-glsl-postpr...
https://threejs.org/examples/?q=ascii#webgl_effects_ascii
https://codesandbox.io/p/sandbox/ascii-postprocessing-n628p8...
https://hg.sr.ht/~oofoe/shademacs/browse/sdf.el?rev=tip
(shade 10 2 (lambda (x y) x)) ; Horizontal ramp.
;; @ # & % * = + : - ·
;; @ # & % * = + : - ·Was an initial experiment with Claude Code, but kind of a cool result that's pretty close to what I want.
and the code: https://github.com/kristopolous/ascsee
I just updated it so it compiles on modern systems.
I also found the original version if you like being an archaeologist: https://9ol.es/tmp/gol.c
https://github.com/pj4533/asciidelic https://asciidelic.com
I should go back and add mobile support, maybe fullscreen support.
For example, if you only want the dash, set the dot and dash to 0.0. Then set 1.1 for the plus, ring, and cross characters.
browsh https://caidan.dev/portfolio/ascii_clouds/The infamous MCGA/"VGA" mode 13h had pixels with an aspect ratio 6:5, while 320 x 240 Mode X was square (1:1).
I still remember the unchained offset calculation for the memory offset for pixel memory access before the era of U and V pipes and many optimizing compiler passes:
unsigned short offset = (((y << 2) + y) << 6) + x;
unsigned char far *ptr = (unsigned char far*)MK_FP(0xA000, offset);
// IIRC: #define MK_FP(seg, off) ((void far *)((unsigned long)(seg) << 16 | (unsigned long)(off))) // far pointers != linear address
In real-mode (linear): 0xa0000 + (320 * y) + xMany of us have that mode 13h stuff memorised too, including the 0x3c8 and 0x3c9 palette registers etc. And since 320x200 bytes is less than 65536 you don't need to do any segment stuff to access the full frame buffer.