# Gorilla Sun > A blog about making art with code. Here you can find tutorials and articles on Creative Coding, Generative Art, and Computational Design. Public Ghost content for AI and LLM tooling. This file includes a bounded export of public pages first, then recent public posts. Append `.md` to any post or page URL to get the content in Markdown (for example, `/example-post.md`). ## Pages ### About this Site URL: https://www.gorillasun.de/about/ Last updated: 2023-04-28T15:06:22.000Z Hi, I'm Ahmad, and this is the Gorilla Sun Blog. On here you'll find content that revolves around generative art, creative coding, programming, web3 stuff as well as other contemporary tech topics. Sometimes I'll also just write about other nerdy things that interest me personally. I started this blog in January 2021 and my life has revolved around it since then. The site has undergone several changes up until now, stylistic and technical ones. And it's likely that it hasn't reached it's final form yet. But that's for the sake of improvement, to make easier for me to push more content, more frequently, and at the same time make it easier for you to read my posts and navigate the site. If you find anything that needs fixing, don't hesitate to shoot me a message about it! # About me Hi, my real name is Ahmad Moussa, but on the internet I make things under the alias of Gorilla Sun. Why *Gorilla Sun*? Because it's marginally easier to pronounce than my real name and I like the ring of it. Besides that, I have a background in computer science, in which I did my bachelors and masters. Later I dabbled for a little bit in Machine Learning research, but ultimately found creative work to be much more fulfilling in comparison. My main interest nowadays is making art with computers, and exploring how different visual concepts can be brought to life with algorithm and code. I find it to be a new and exciting topic that we've only scratched the surface of. # Mission I love generative art, I love programming, I love writing and I love creating and making things. Being creative is one of the things that brings me the most joy in life. And I want to share the joy of creation with the world. One of the things that frustrated me the most while learning how to program was the lack of resources online. Sometimes it was very difficult to find meaningful explanations that helped get leeway on certain technical topics. My goal is to remedy this with topics that I find interesting, and help others find a foothold in the world of programming and creative coding. # Thanks for Reading Thanks for checking out the site! Consider signing up to the mailing list to get notified when there's new content. Best way to support the blog is by sharing my articles with your friends, or linking to them on your own social media platforms/websites. It actually helps out a lot. Another form of support is by tipping me on ko-fi. Thank you! Happy sketching and Cheers! ### ### Articles URL: https://www.gorillasun.de/articles/ Last updated: 2023-05-15T14:38:06.000Z Here you can see a list of all articles and tutorials I've written so far! ### Community URL: https://www.gorillasun.de/community/ Last updated: 2023-04-18T12:45:47.000Z _No content available._ ### Member Section URL: https://www.gorillasun.de/member-section/ Last updated: 2023-04-18T21:33:52.000Z _This page is for paying subscribers only._ ### Javascript Fundamentals URL: https://www.gorillasun.de/javascript-fundamentals/ Last updated: 2023-04-19T17:54:03.000Z Get started with programming today and build a comprehensive understanding of how Javascript works! _This page is for paying subscribers only._ ### Generative Textures URL: https://www.gorillasun.de/generative-textures/ Last updated: 2023-04-18T15:02:39.000Z _No content available._ ### All about them Grids URL: https://www.gorillasun.de/all-about-them-grids/ Last updated: 2023-04-18T15:04:36.000Z _No content available._ ### Creative Code Course URL: https://www.gorillasun.de/creative-code-course/ Last updated: 2024-07-25T19:55:19.000Z _No content available._ ## Posts ### Gorilla Newsletter 105 URL: https://www.gorillasun.de/blog/gorilla-newsletter-105/ Last updated: 2026-09-28T06:00:51.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** This is issue #105 of the Gorilla Newsletter, an online publication that sums up everything noteworthy from the past week in creative tech and AI. If it's your first time here, we've also got a Discord server where we nerd out together, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news 👇*** ## New in Creative Tech **1 —** [**Fluoddity**](https://github.com/aphid91/Fluoddity?ref=gorillasun.de): is a variation on [the classic Physarum algorithm popularized by Sage Jenson](https://cargocollective.com/sagejenson/physarum?ref=gorillasun.de), where each particle is enhanced with a tiny neural-net-like brain. And instead of following a density map, particles steer based on an underlying flow-field that indicates the direction preceding particles were moving, producing flow and liquid-like emergent forms. 0:00 /0:16 1× [Link to Post](https://x.com/OA%5Fpaperclips/status/2093445516919279867?ref=gorillasun.de) In the original Physarum model particles have sensors that sample an underlying density map, simply a grid of values, that represents a sort of pheromone intensity. Each particle then moves in the direction of the strongest reading, and then deposits back into this map, leaving its own trail for other particles to follow. In this sense the steering rule is fixed, which results in the network-like structures that are reminiscent of slime molds. In Fluoddity, instead of a steering rule, each particle gets equipped with a parameter matrix that determines its behaviour. Concretely, the steering "rule" is described through a 10x8 float32 matrix parametrizing a behavior function. The sensor values are fed into this behaviour function, and the outputs are used to accelerate and reposition the particle. So "turn toward the strongest trail" (the original Physarum rule) is just one point in a large behavior space. The function itself is a simple sum of sine waves, where the amplitudes, frequencies, and phases essentially are the mutable parameters. Changing those parameters produces smooth changes which gradually alter how the particle steers. What's intriguing is that there's also a mutation aspect to the particle's brain. In the live simulator webpage, you can click on a particle such that its "brain" becomes the blueprint for all other particles. Which changes the entire behaviour of the simulation on the fly. The simulation's been popping up in my feed over and over again, and while I first took it for another vibecoded demo, I ended up digging into it a little more after none other than Alex Mordvintsev quote tweeted one of the screenrecordings: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-18-at-22.39.04.png)](https://x.com/zzznah/status/2100905422110564492?ref=gorillasun.de) [Link to Post](https://x.com/zzznah/status/2100905422110564492?ref=gorillasun.de) I also found a sort of [blog website](https://fluoddity.observer/?ref=gorillasun.de) by Ooops all Paperclips that has a couple of posts showing off some of the different species discovered in the system so far. You can also find a simpler version of the simulation over on the ["core" github repo.](https://github.com/aphid91/Fluoddity-Core?ref=gorillasun.de) **2 —** [**Blur, Sharpen, Turing Patterns**](https://www.maximevidal.com/turing-patterns?ref=gorillasun.de): without a doubt my favourite find this week; an article by Maxime Vidal that explains how images can be transformed into Turing patterns simply by repeatedly applying blur and sharpening filters. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/canvas-2-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/b-lurrr-1.png) I ran one of my WIPs through this process. You can clearly see how the geometric structures serve as guidelines for the emergent Turing pattern. If you're not familiar with Turing Patterns, it's essentially a unique type of pattern that frequently occurs in different places throughout nature; on the hide of different animals (zebras and leopards for instance), fingerprints, and even corals. In 1952 Alan Turing published a paper titled the "Chemical Basis of Morphogenesis" that describes this phenomenon as a chemical reaction and formalizes it via an algorithmic method to recreate it, which later on caused these forms to become known as Turing Patterns. I've posted a [short video explainer](https://www.instagram.com/p/DaXwuA3Iz7a/?ref=gorillasun.de) on this topic over on Instagram a while ago if you're curious. While Turing's algo simulates the interaction of two chemicals to create the emergent patterns, Maxime's article demonstrates a different approach that morphs existing images in a Turing patterns. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-24-at-17.19.17.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-24-at-16.17.10.png) Images contain details at different sizes, from large shapes (similarly colored areas) down to fine texture (where pixels change color rapidly). If we were to represent these features as waves, large shapes would be slow, wide ripples and fine texture would be fast, narrow ones. Applying a blur wipes out the smallest details (it flattens the narrowest ripples), while sharpening intensifies the small ripples that survive the blur. So if you blur a little and sharpen a lot, the details of one particular size that survive each filtering pass, get slightly stronger every round, while everything smaller gets erased. If we repeat this enough times, the image slowly separates into light and dark bands of a single width, set by the sizes we pick for the filters. While the math involved looks quite unapproachable, Maxime's explanations make it quite clear. He also provides a demo into which you can drop your own image to turn it into a Turing-ified version. **3 —** [**Websites, Websites, Websites! (WWW!)**](https://websiteswebsiteswebsites.net/?ref=gorillasun.de): celebrates the website as an artistic medium, bringing together twenty artists for Rhizome’s 30th anniversary. > Without attempting a definitive history of Net Art, the exhibition explores thirty years of our changing relationship with the internet through browser experiences that invite experimentation, intimacy and critique. [WEBSITES WEBSITES WEBSITES!A group exhibition celebrating the website as an artistic medium. Armory Week, New York City, September 21–27, 2026\. Presented by ARTXCODE and Rhizome.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-19e49035-c390-4bb1-a41c-c3021fa870cc.png)WEBSITES WEBSITES WEBSITES!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-image-035b789c-aadc-4102-b882-b1753dd25f53.png)](https://websiteswebsiteswebsites.net/?ref=gorillasun.de) And the overview page is an absolute treat to scroll through; the 20 projects are divided into 4 tracks: anarchy, abstraction, poetic computing, and ghosts, each of which tries to capture a different internet era and its encapsulated ethos, from the 1990s up until 2026. My personal standout projects among the 20 are both from the Poetic Computing section. Nolen Royalty's Solitaire Alone Together, that puts you in a shared Windows 95 desktop view, letting you play your own session of a classic game of solitaire, but also showing the solitaire sessions of other people that are currently connected to the same website. If you haven't played Solitaire in years, it might just be the moment to get in a round. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-25-at-11.26.23.png) [Link to Page](https://solitairealonetogether.com/?ref=gorillasun.de) | [Link to Blog Post](https://eieio.games/blog/solitaire-alone-together/?ref=gorillasun.de) I also really enjoyed Maya Man's simple but effective self-portrait in website form. Her page shows an ongoing stream of real-life text messages she has exchanged, that plays into the idea of voyeurism, but still retains an aspect of anonymity because it's stripped of the recipient's information. It's worth taking a few moments and checking out the page! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-25-at-11.28.52.png) **4 —** [**Einstein Tile in 3D**](https://arxiv.org/abs/2609.19214?ref=gorillasun.de): on September 16 Ioannis Tsiokos submitted a paper to arxiv presenting the first strongly aperiodic monotile in three dimensions; essentially the 3D follow-up to the 2023 "hat" and "spectre" tiles in 2D. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-25-at-12.13.16.png)](https://arxiv.org/abs/2609.19214?ref=gorillasun.de) [Link to Paper](https://arxiv.org/abs/2609.19214?ref=gorillasun.de) | A monotile is a single shape whose copies can fill all of space with no gaps or overlaps. While the hat tile earned its name for its relatively nice aesthetic, in the 3D setting this shape earns the name of Chair44 due to its odd shape. A chair is a 2x2x2 cube with one corner cube removed, a classic name in tiling theory, with 44 indicating the 44 distinct chair positions where each one of the inward/outward pyramid bumps meet a dent of exactly matching size. The image above should make this a bit clearer. Chair44 has the special property that any tiling it forms must be non-periodic, with no translational symmetry and no infinite-cyclic symmetry. In other words, you can fill space with it, but the pattern can never repeat. Now the curious part of this paper is how Ioannis found the tile with help from OpenAI's new Astra model. He discloses this publicly, and also in the paper itself, but is apparently met with some pushback from mathematicians in the same field. Ioannis explains that while he's used an LLM to push things over the finish line, he had developed a methodology in the year before to guide the AI to make the discovery, he writes about it in a medium post: [The story of the 3D einstein — Chair44There are bones. Boring, rigid, stubborn bones. They hold us together. For a human to be its own kingdom, it needs a skeleton.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19-2fad5ec4-9a92-439a-8918-1c4c2b623d7f.png)MediumIoannis Tsiokos![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1-BOUI_A7ChmJ7kT3TxXIwag-2e26d4a4-8fbb-4311-946c-d2b0fa541c6a.png)](https://medium.com/@ioannis.tsiokos/the-story-of-the-3d-einstein-chair44-a44753bf1b5c?ref=gorillasun.de) Chaim Goodman-Strauss published a note on this matter in response, also over on arxiv, that you can read [here](https://arxiv.org/abs/2609.24779?ref=gorillasun.de). His 8-page note does three things: it credits the discovery, criticizes how it was presented, and re-proves it in a few pages. He also provides a cutout to assemble the tile from paper. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-25-at-12.37.53.png) **5 — JS13K,** [**Frank Force's Entries**](https://frankforce.com/i-made-4-games-for-js13k-2026/?ref=gorillasun.de)**, and** [**Music Generator**](https://killedbyapixel.github.io/SP13KTRA/tools/music.html?ref=gorillasun.de): Frank Force is as prolific as ever, for the JS13K competition he created four tiny games that are all as enjoyable as they are interesting. A golfing game, a racing game, a language learning game, and a quirky emoji messaging game. [I made 4 games for JS13K 2026I’ve been participating in JS13K since 2019 and this year I wanted to take it to a new level. So I didn’t make one game, I made four. Each game fits in a 13 KB zip, and each one is a to…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-kbap_logo-270x270-f007389b-43de-42b3-9c8d-16483b4839d1.png)Killed By A PixelFrank![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/ChatGPT-Image-Sep-17-2026-03_16_51-AM-6f36389b-7079-4cd3-977a-db1228eaa1a2.png)](https://frankforce.com/i-made-4-games-for-js13k-2026/?ref=gorillasun.de) While all four submissions are spectacular, SP13KTRA caught my attention in particular; it's a fully 3D game with a custom WebGL renderer, all packed into 13KB of JavaScript! 🤯 > Even at 13KB it’s a complete game with a title screen, a track select menu, mouse or keyboard controls, and your best time and placing saved for every circuit. He also built a super cool music generator for the game, so that it can generate soundtracks on the fly for each level without having to directly include the audio file (which would blow up the size of the project). Frank set up a little website where you can play around with this generator for yourself. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-24-at-17.34.10.png)](https://killedbyapixel.github.io/SP13KTRA/tools/music.html?ref=gorillasun.de) [Link to Music Generator](https://killedbyapixel.github.io/SP13KTRA/tools/music.html?ref=gorillasun.de) **6 —** [**Setting up your own dependency free development environment for GLSL**](https://davidmatthew.ie/glsl-shaders-dependency-free-development/?ref=gorillasun.de): after sending out the previous issue of the newsletter David Matthew shared a cool tutorial in the discord. It's a complte guide to setting up your own 'Shadertoy-esque' local dev environment without relying on any external dependencies: [David Matthew | How to Create a Dependency-Free Development Environment for GLSL ShadersA step-by-step guide to setting up your own local dev environment for Shadertoy-esque GLSL sketches, no dependencies needed.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-96x96-a5cd6d16-ab3b-4125-b9fd-bc217da34ba6.png)David Matthew](https://davidmatthew.ie/glsl-shaders-dependency-free-development/?ref=gorillasun.de) ## New in AI **1 —** [**TypeSafe's System One Model Jev**](https://typesafe.ai/blog/introducing-system-one-models-and-jev?ref=gorillasun.de): in a nutshell, Jev is a different kind of reasoning model that can make decisions. Unlike the plain-text LLM responses that we're used to, Jev outputs a probability score when it's asked a question in conjunction with some input text. TypeSafe call it a System One Model: > 📖 System One models are a class of AI models built to make fast, structured decisions that software can use directly. A System One model evaluates a [**state**](https://docs.typesafe.ai/concepts/state?ref=gorillasun.de) and returns typed answers and probabilities. [Introducing System One Models & Jev - TypeSafe AI BlogTypeSafe AI is an AI lab building machine-native intelligence infrastructure for automation, designed to make decisions within software. Try our first System One Model, Jev, in early access.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/aNFzSFxM4fjICmnibw7npfZjcQ-3c66cb48-fb32-43d0-919b-0a8c3d5cfe97.png)TypeSafe AI Blog![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/RtIGTDwO43jR4ZDilesXiR5znc-2e281f5b-8ef9-45ba-b81d-6208aff84b6c.jpg)](https://typesafe.ai/blog/introducing-system-one-models-and-jev?ref=gorillasun.de) So it doesn't generate text, but instead answers questions that we ask it about the state. Essentially a programmatic if statement with super powers. The following example is from their cookbook section, here's what you would feed into the model: ``` { "model": "jev-latest", "state": "Hi, I've been trying to connect my Stripe account for 3 days and it keeps failing. I'm losing sales. Please help ASAP.", "questions": { "is_urgent": { "type": "noul", "instructions": "The message conveys urgency or time-sensitivity" } } } ``` And here's what you'd get back: ``` { "is_urgent": { "type": "noul", "noul": 0.999 } } ``` "TypeSafe" gains its name from the structured output that's returned, for which there are three types right now: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-27-at-16.21.38.png) [Link to Docs](https://docs.typesafe.ai/introduction?ref=gorillasun.de) The novelty is that it can answer multiple questions about the given state in parallel, at very little extra cost. TypeSafe's claim is that they have 200x faster inference at a 400x lower cost, which is mind bogglingly impressive. In light of this new tech, folks have already taken en-masse to social media posting all sorts of wild experiments. For instance, an automated real-time trading bot, a color finder, a command line tool that understands plain text questions, and even a full programming language that's based on the fuzzy kind of if-else logic Jev enables, JevaScript: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-18-at-22.07.29.png) [Link to Post](https://x.com/southpolesteve/status/2100767781868150938?ref=gorillasun.de) The other place where this will easily fit in, is inside of agentic harnesses where it will drastically reduce the time that it takes agents to make decisions about tool calls and branching choices. [What Is Jev? A Guide to TypeSafe AI’s System One ModelWhat is Jev? Learn how TypeSafe AI’s System One model makes fast, structured decisions, where it fits in the agent loop, and how to use Jev with LangChain![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/69a17e4a429d54e956e2a763_favicon-62fb274a-28ef-4fbf-8e25-f7b90de496c7.png)LangChain BlogLangChain Accounts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/6aac8ce2e3f50ce7069ae68f_jev-harness-a-title-hero-1600x900-d76c111c-55da-42df-baca-d3d453553377.png)](https://www.langchain.com/blog/building-a-harness-with-jev?ref=gorillasun.de) We'll probably check in again in the next issue of the newsletter on how all of this has progressed. **2 —** [**Dario Amodei's call to Pace the Frontier**](https://darioamodei.com/post/we-must-pace-the-frontier?ref=gorillasun.de): Where do we start with this one? Either we're actually coming to our senses, and making steps to get this *alignment* train on track, or all of it is one big baloney sandwich we're being fed by the big AI corps. The latter seems to be the more plausible. On September 9th former Anthropic employee Jacob Coxon took to social media, with what is without a doubt the most viral tweet in tech Twitter ever. It's reached over 170M views at the time of writing. In his tweet he announces his resignation from Anthropic due to the reckless pace at which the company has been pushing forward. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-22-at-08.59.08.png) [Link to Post](https://x.com/hilbertspaess/status/2097476196791709843?ref=gorillasun.de) What's odd about the tweet is the inexplicable virality that Jacob's seemingly new account received, an account that he's actually never posted from before. Even more odd is the WSJ story that got published even before Jacob posted his tweet. Comparing the time-stamps on the two posts reveals it. Later on Jacob states in a reply that he had informed a WSJ reporter about his resignation ahead of time. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-22-at-09.30.04.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-22-at-09.38.57.png) [Link to Article](https://www.wsj.com/tech/ai/anthropic-researcher-quits-over-out-of-control-ai-fears-707b7628?ref=gorillasun.de) | [Link to Reply](https://x.com/hilbertspaess/status/2099960188702957776?ref=gorillasun.de) Strange. A few days later Dario Amodei comes out of the woodworks, likely due to how viral the entire story became, posting to Twitter again for the first time in a long while. He shares a longer article where he states his own concerns about the pace with which AI is progressing. He argues that models are already recursively self-improving, and presents the recent Hugging Face incident as a leading example of why the technology is dangerous. Without guardrails a repeat of this incident could have drastic consequences at a larger scale. A loose misaligned botnet could cause irreversible damage. [Dario Amodei — We Must Pace the Frontier![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/67f34ed1b219c58a92e819e1_dario-favicon-e8e112ed-77e2-4e17-988e-f69859eb8d1d.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/6aa5311897ee19af5d9f2cd9_og_we-must-pace-the-frontier-ed29f88e-122a-4998-8f80-c79f877841be.jpg)](https://darioamodei.com/post/we-must-pace-the-frontier?ref=gorillasun.de) His suggested solution involves third party evaluators (Embedded Evaluators) to "verify adherence to safety practices and commitments" and that "**Anthropic is unilaterally committing to this step now.**" Which actually sounds great on paper, but comes with a few caveats. He only states one of these Evaluators by name, [METR](https://metr.org/?ref=gorillasun.de), which is a privately funded nonprofit. The issue here is that Anthropic is actually deeply intertwined with METR (everyone knows everyone there). Jacob's tweet could have been a genuine act of whistleblowing meant to force Anthropic to make a statement, or it could also just have been a publicity stunt. It is also hard to tell if Amodei's article is genuine. It is clear that Anthropic, as well as OpenAI, aren't really dependent on any external approval of their actions and can simply advance at the pace that they choose to set. If you'd like to put on your own tinfoil hat, I highly recommend checking out The PrimeAgen's video that covers the entire story in a lot more detail and also elaborates on the issues with METR: **3 — Anthropic's** [**Threat Intelligence Report**](https://www.anthropic.com/threat-intelligence-report-september-2026?ref=gorillasun.de) **&** [Predictions for our Economic Future](https://www.anthropic.com/institute/econ-scenarios?ref=gorillasun.de): besides the drama Anthropic also released two informative reports, one about how bad actors have attempted to misuse their models for exploitative and criminal purposes between December 2025 and August 2026, and another one that tries to predict the economic changes that the US will undergo up till 2030 with the advancement of AI. Despite its size, the cybersecurity report is really worth flipping through if you have some time; there's a couple of really crazy and interesting stories. It's fascinating how creative some people can get when they channel their criminal energy into an endeavour. From impersonating the French police for phishing purposes, to setting up a "discount Claude" that's not actually Claude to steal login credentials, all the way to instructions for building rockets, there's a whole bunch to sift through here. It's also interesting to see how Anthropic detected these miscreants and subsequently shut down their attempts. [Countering misuse of AI: September 2026 / AnthropicCase studies from threat actors disrupted between December 2025 and August 2026 across seven areas of harm, from cyber operations to biological misuse.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-94f75750-656c-4b78-b2de-a42b82a61c7b.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/7a4426f8ffe57e7de23ff36906fb1cc3efe2a82b-1200x630-189d19c3-676e-4935-8207-9944069ccd8a.jpg)](https://www.anthropic.com/threat-intelligence-report-september-2026?ref=gorillasun.de) The economic report on the other hand speculates how AI might transform the financial future of the US. In the article they posit jobs as bundles of tasks (based on the US Department of Labor’s O\*NET taxonomy). Depending on how much AI affects each individual task we can draw a measure of how much a job changes. Some tasks get automated, some augmented (made easier), some don't change at all, and new tasks may also appear (like verifying the tasks that were handed off to AI). Tracking these changes across all tasks that make up the economy can give insight into how AI directly impacts the country's GDP. They lay out three scenarios: a modest one where AI's impact resembles the internet's, a substantial one where growth doubles, and an extreme one where the economy grows 15% a year, likely driven by self-improving AI. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-27-at-15.58.31.png) Across all three, average wages rise, but the gains go mostly to non-knowledge workers such as tradespeople and nurses. I highly enjoyed scrolling through the animated charts displayed on the page. [Scenarios for our Economic FutureThe Anthropic Economics Team models the effects of AI on the economy of 2030.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-c8799218-6129-4c69-b891-ebd5137c0456.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/2fc2aaa692554fc9976fcd333892cbb9e888e0bc-1200x630-900cc214-ad7b-4a90-8300-d4b56c94592e.png)](https://www.anthropic.com/institute/econ-scenarios?ref=gorillasun.de) **4 —** [**The paradox at the heart of AI and Science**](https://www.youtube.com/watch?v=svl%5F1upFpQo&ref=gorillasun.de): if you're not familiar, Terence Tao is widely regarded as one of the greatest living mathematicians. The Big Think Channel recently invited him to speak about his views on AI and how it has changed the scientific process in Mathematics. His opinion is that there's an inherent paradox: while AI can produce proofs that previously might have taken years to find by traditional means, the sacrifice we give for this acceleration is our understanding of the results. He likens it to climbing a mountain. You get good at climbing mountains, by climbing mountains, and not by being helicoptered straight to the top. And a prime example of this is the recent AI-generated Navier-Stokes proof that we received from OpenAI. Mathematicians have yet to make sense out of the 160 page document that their agent cluster churned out. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-27-at-15.41.43.png) [Link to Post](https://www.npr.org/2026/09/22/nx-s1-5968588/openai-navier-stokes-problem-mathematicians-learn-little?ref=gorillasun.de) Ultimately these kinds of discoveries still need to be peer reviewed, and presented in a humanly understandable manner, before they can become widely accepted and serve as stepping stones for research down the line. **5 —** [**MIT's AI and Education Report**](https://aiandeducation.mit.edu/report/?ref=gorillasun.de): in the same vein, universities are struggling with the impact AI has had on students and the learning process as a whole. A recent report from MIT presents some rough numbers: 46 percent of surveyed undergrads use LLMs daily, and 90 percent worry about their own overreliance. The number of undergrads who feel that AI makes them replaceable is greater than those who feel that it makes them capable. MIT also states that they're reluctant to fight AI by surveilling their students, with concerns that this kind of policing creates an atmosphere of mutual distrust, besides current AI detectors being unreliable. Instead, MIT intends to rebuild their education around things that AI can't really replace, such as oral exams, semester portfolios, in-person project work, and a required social component in every subject. They even float the idea of rethinking grades entirely; without a GPA to optimize, much of the incentive to cheat with AI goes away. ## New in Web Tech **1 —** [**OKPalette**](https://okpalette.color.pizza/?ref=gorillasun.de): David Aerne is back with an improved version of another wonderful color tool he's previously built. OKPalette extracts and selects colors from an input image in a meaningful manner, to produce a palette that actually reflects the image. Try it out for yourself, the UI's beautifully designed and such a joy to click through: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-26-at-13.40.01.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-26-at-13.46.11.png) [Link to OKPalette](https://okpalette.color.pizza/?ref=gorillasun.de) Earlier this year he also recorded a little guide to the tool over on YouTube, giving us a run-down of how it works: **2 —** [**The lifecycle of a sharded Postgres query**](https://planetscale.com/blog/the-lifecycle-of-a-sharded-postgres-query?ref=gorillasun.de): in database architecture, sharding means the splitting of a database's data horizontally across multiple servers, so that each one only holds a subset of the rows, a "shard", rather than a full copy of the entire database. In this kind of distributed system the lifecycle of a query becomes much more complicated than if the data all lived in one DB. While the database is much more scalable it also turns into an interesting engineering problem. How do we store rows across the different shards? How do we retrieve these rows? And what happens for more complex queries like joins?PlanetScale's article explains it all in a beautiful explainer decorated with interactive examples: [The lifecycle of a sharded Postgres query — PlanetScaleFollow a SQL query through the router, across four Postgres shards, and back.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-d41316a8-d502-494e-af3f-898c33ab81d4.png)PlanetScale![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-7b8855f0-f0d5-4935-a2da-3a9daddab9e5.png)](https://planetscale.com/blog/the-lifecycle-of-a-sharded-postgres-query?ref=gorillasun.de) Storage is relatively straightforward, each row gets a shard key (for example, its id) that we can then hash to determine which shard it lives on. Retrieval also works the same way if you already know the key. Otherwise it gets more complicated as all shards will have to be checked if we don't know where the row is located. This operation is called a scatter-gather. Joins are even more complicated, if related rows live on different shards, we have to fetch them all and assemble the result. PlanetScale's takeaway is that picking a smart shard key, one that keeps related rows together on the same shard, makes most of that complexity disappear, but my explanation strips away a lot of the details, so if you're curious about this, give it a read. **3 —** [**Tobias van Schneider's Portfolio & Blog**](https://vanschneider.com/?ref=gorillasun.de): Tobias van Schneider is a master of his craft, creating the branding and visual identity for more than a few very renowned companies and projects, including both NASA's Mars and Jupiter missions, as well as Spotify among others. He recently redesigned his blog and essay archive, a collection of insightful, beautifully written musings on design, technology and working in the field. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-22-at-14.46.32.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-26-at-12.55.58.png) [Link to Post](https://x.com/vanschneider/status/2099495874967540062?ref=gorillasun.de) | [Link to Blog](https://vanschneider.com/blog/?ref=gorillasun.de) [Tobias van Schneider — Creative DirectionI create, therefore I am. I’m Tobias van Schneider a designer born in Germany, raised in Austria & currently living and working in New York City.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/HOVS-Fav-Icon-red-65c3183c-41b3-46f0-be5a-c3444167c806.png)House of van Schneider![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/FB_photo-1dcc3831-3ad4-407e-9cad-80af4aff8f12.jpg)](https://vanschneider.com/?ref=gorillasun.de) **4 —** [**Daryl Patigas' Portfolio & Stub Generator**](https://imdaryl.com/?ref=gorillasun.de): and while we're talking about portfolios, another website that I've been coming back to almost every day over the past week, simply because it looks stellar, is Daryl Patigas' new personal page. It's still a WIP, but the load in animation on the hero section is already worth a visit: [Daryl Patigas · Founding DesignerFounding designer at Lottielab. Five years of product design, motion and launches, drawn as one sheet.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)](https://imdaryl.com/?ref=gorillasun.de) He's also built a whimsical little stub generator for all those who end up visiting his page, that you can claim and download for yourself as an image, after claiming it the page will remember your visit: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-26-at-13.43.31.png) 5 — [Function Arguments vs Function Parameters](https://x.com/ChShersh/status/2102233392406249751?ref=gorillasun.de): and to wrap up, TIL the difference in the terminology... as I've been using the two pretty much interchangeably. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-22-at-14.43.42.png) [Link to Thread](https://x.com/ChShersh/status/2102233392406249751?ref=gorillasun.de) ## Gorilla News It's been another two very busy weeks on my end! I posted a new reel to Instagram, dedicated to the iconic demoscene tunnel effect. After discovering Andre Weissflog's [Tiny Emulators](https://floooh.github.io/tiny8bit/?ref=gorillasun.de) website (highly recommend checking out that page), one of the demos caught my attention in particular: Overflow's Backtro. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-27-at-16.55.28.png) [Link to Demo](https://floooh.github.io/tiny8bit/player.html?id=backtro&ref=gorillasun.de) It's a cool texture-mapped tunnel animation, where the tiles get pulled in towards the center of the shape. Safe to say that I was quickly nerd-sniped and had to figure out how it was done. I report my findings and how to create the warped tunnel-effect in the short video: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-24-at-11.12.08.png) [Link to Post](https://www.instagram.com/p/DdY6lVvOmr1/?ref=gorillasun.de) If you've followed my socials then you'll have seen some of the WIPs I posted leading up to that post. It was an incredibly rewarding sketch to figure out! There's a lot of interesting optimizations there, particularly in my own version where it's texture-mapping an animated SDF instead of just a simple image. I can also export perfect loops, but now I realize that I also should upscale it to a larger canvas. Anyway, enjoy your tiny GIF loop 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/animation-6-.gif) I'm really happy with the reception the short videos I've posted to Instagram have gotten so far. It does take quite a bit of time to put all of it together, but it's worth the effort. My partner has been telling me for years that I should show my face more on social media and make video content, but I've always been a bit too self-conscious about it. I still find it very hard to talk directly into a camera, but with the practice I've gotten now I don't really hate my voice that much anymore. There are many more things in the pipeline, but that's the update for this week. ## Music for Coding In the last issue I shared music from Mac DeMarco's former guitarist. This week I'm going back further, to Mac DeMarco before he was known as Mac DeMarco, but rather going under the alias of Makeout Videotape, a project in collaboration with his friend Alex Calder. Between 2008 and 2011 they put out a run of records under that name, where *Ying Yang* (2010) ended up being their only full-length album, and you can already hear the beginnings of his later sound in it. If you're into fuzzy, lo-fi indie rock, this is the album for you. And that's a wrap — hope you've enjoyed this curated assortment of tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide web... more subscribers, views, and reads means more internet points, which in turn enables me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Instagram](https://www.instagram.com/gorilla%5Fsun%5Fblog/?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **It's been a tad bit inactive, but we can change that... maybe.** **If you've read this far, thanks a million!** And in case you're still hungry for more, find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ## ### Gorilla Newsletter 104 URL: https://www.gorillasun.de/blog/gorilla-newsletter-104/ Last updated: 2026-09-14T06:00:32.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** This is the **104th** issue of the Gorilla Newsletter — an online publication that sums up everything noteworthy from the past week in creative tech and AI. If it's your first time here, we've also got a Discord server where we nerd out together, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news 👇*** ## New in Creative Tech **1 —** [**From constraint models to playable puzzle games**](https://zayenz.se/blog/post/constraint-generated-puzzle-games/?ref=gorillasun.de): Constraint modeling is a method for describing problems through the conditions a solution must hold for it to qualify as a valid solution. That's a mouthful though, and an example makes this a lot easier to understand: the simple, or not so simple game of Sudoku, for instance, is such a constraint problem. A valid solution requires you to fill out a 9x9 grid such that each number only occurs once in each row, column, and 3x3 patch. Explaining the rules of the game is describing the constraints a solution needs to satisfy. And there is a whole area of research that's entirely dedicated towards this. Helmut Simonis' 2005 paper "[Sudoku as a constraint problem](https://ai.dmi.unibas.ch/%5Ffiles/teaching/fs21/ai/material/ai26-simonis-cp2005ws.pdf?ref=gorillasun.de)" hails as a canonical citation in this setting, and while others have already chewed on this NP hard problem before (in the n²×n² case), he's the first to give it a dedicated *constraint problem* treatment. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-23.18.11.png) What an absolute banger of an abstract | Find the paper [here](https://ai.dmi.unibas.ch/%5Ffiles/teaching/fs13/ki/material/ki10-sudoku-inference.pdf?ref=gorillasun.de) As far as I understand Simonis' proposed method eliminates "guessing" methods to find solutions given a partially filled sudoku grid, like search and backtracking for instance, and entirely relies on deduction steps that rule out what can be in each cell; the same way that we humanly solve sudokus "this cell can't be 7, there's already a 7 in the row." This way the major novelty of the paper was that he had built a sudoku generator with a difficulty dial, which lined up with the easy/medium/hard labels newspapers were already printing by hand at the time. Fast forward to today, Mikael Zayenz Lagerkvist makes a splash with a new paper titled "Scaling Sudoku as a Constraint Problem" (bound to be published for ModRef 2026). In his paper he expands Simonis' idea to larger grid sizes and a whole suite of other grid based puzzle games that can be treated in the same manner, such as Nonogram, Queens, Zip, Loopy, Tents, Patches, and a bunch more. You can read all about it in this applied companion blog post, where you'll also find a link to the paper: [From constraint models to playable puzzle games - zayenz.seI wanted to play some puzzles produced by my constraint-programming experiments. That small wish grew into nine games.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-24cd4c98-03fc-4a0e-a866-e649e7cb46ad.png)zayenz.seMikael Zayenz Lagerkvist![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/zip.5GbA4vz--994d8257-9853-405c-8591-643eb3278de8.jpg)](https://zayenz.se/blog/post/constraint-generated-puzzle-games/?ref=gorillasun.de) What's more is that you can try all of these games for yourself on a page he created [here](https://zayenz.se/games/?ref=gorillasun.de). Did I spend a whole bunch of time solving puzzles instead of writing this newsletter? Yes, I have. **2 —** [**Training AI to paint with Code**](https://surya.website/rling-qwen-to-paint-with-code?ref=gorillasun.de): Surya reinforcement learned a model to generate P5 code that can sketch out some beautiful outputs, making a big splash on socials in the process. His tweet showcases a few of those sketches: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-10.03.36.png) [Link to Post](https://x.com/kickingkeys/status/2091570990048276897?ref=gorillasun.de) You might already be familiar with the term "reinforcement learning" from the 2015-2019 era where it was associated with training models to play games or generate text. I was under the impression that it might be an antiquated method by now, but that's only due to me not having caught up with the research. It seems that it's very central again to training the new frontier "reasoning" models, especially agents, and teaching them to take actions and perform tasks. Reinforcement learning is essentially a training method that's based on giving rewards or penalties for the produced outcomes, and then have the model improve based on those reward signals. In Surya's case he oriented the outputs from Qwen 3.5 35B model by having another model act as a judge, comparing the generated outputs from the training run against a set of manually annotated samples. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-10.26.39.png) Surya shares a writeup that explains the process in more detail, explaining how he arrived at the final outputs. **3 —** [**Dithered QR Code Portraits**](https://www.andrewt.net/dithered-qr-codes/wtf/?ref=readtheq.com): Andrew Taylor built a QR code generator that creates stylized QR codes without altering the embedded bit message they're supposed to reveal when scanned. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-22.41.56.png) [Link to the Generator](https://www.andrewt.net/dithered-qr-codes/index.html?ref=gorillasun.de) The secret to this effect is that there's actually quite a bit of leeway in how we can change the data pattern; everything except the finder blocks in the code at least. The scanner actually just checks for the colour at the center of each square/pixel to sample it. Hence why it's possible to simply split up each pixel into an NxN mini grid and change the colour of the sub squares around the central one as we like. Add in error diffusion dithering and we get a fully customized QR code. Andrew's writeup explains this a bit more. **4 —** [**Spatial languages: writing code in 2D**](https://shukla.io/blog/2026-07/cccx.html?ref=gorillasun.de): in most cases code is just a stream of linearly sequenced symbols, that we purposefully arrange in lines for a better parsing experience. Their 2D layout usually has no relevancy, however entirely different statements would be possible when the actual 2D arrangement of glyphs mattered, as we've already seen from many an Eso-lang. Nishant Shukla introduces an interesting spatial operator that has unique properties due to its spatial arrangement: a three-argument "andFlip" operator, that spreads vertically across, in addition to going from left to right, and enables 3-arity as infix notation: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-22.58.39.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-22.59.01.png) He also provides a practical example of how this is useful through his chicken coop door controller. The automatic door should only open or close when three things are all true at once: the light sensor says it's dusk or dawn, that reading has stayed steady for five minutes (so a passing cloud doesn't count), and the door hasn't just moved. Which the 3-arity operator is a perfect fit for: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-23.01.07.png) Read Nishant's post in full over on his blog: [Spatial languages: writing code in 2DWriting code in 2D: a spatial programming language with vertical operands, quantum uncomputation puzzles, and a 3-bit adder in a single 2D expression.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-854aca35-8546-4be3-9e38-a85c35773ae9.ico)Nishant ShuklaNishant Shukla![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/coop-7899afce-9bfa-4d6d-844d-6aec2eed6c9d.jpg)](https://shukla.io/blog/2026-07/cccx.html?ref=gorillasun.de) Here's the discussion over on [Lobsters](https://lobste.rs/s/gb2xwu/spatial%5Flanguages%5Fwriting%5Fcode%5F2d?ref=gorillasun.de) that's also quite insightful. **5 —** [**Craftbot by Luka Piškorec**](https://lukapiskorec.github.io/craftbot/?model=models%2F04%5FConstruction%5FManual%5FBlender%5FPython%2Ffable%5Fv04.json&ref=gorillasun.de): is for the architecture buffs that follow this newsletter. Craftbot is an architect AI agent that constructs buildings in Blender from a design brief and reference material. Luka shared a viewer website that lets you play around with some of the constructions ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-09.57.37.png) [Link to the Craftbot Viewer](https://lukapiskorec.github.io/craftbot/?model=models%2F04%5FConstruction%5FManual%5FBlender%5FPython%2Ffable%5Fv04.json&ref=gorillasun.de) In the github repo you'll find the thirteen experiments Luka has done so far, with all prompts, code iterations, and renders included. Plus tooling to run them headlessly, a web viewer for the models, and a draft paper. [GitHub - lukapiskorec/craftbot: CraftBot is an architect AI agent. It interprets design briefs, grounds its thinking in domain knowledge through ingesting documents, images and other references, and outputs Python code that procedurally defines a building design.CraftBot is an architect AI agent. It interprets design briefs, grounds its thinking in domain knowledge through ingesting documents, images and other references, and outputs Python code that proce…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-f6f28f8b-3c3f-42da-8240-a5015d92b985.png)GitHublukapiskorec![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/craftbot-7d5f7396-b469-44ce-afb4-d311ca9f804f)](https://github.com/lukapiskorec/craftbot?ref=gorillasun.de) You might also remember Luka as the coder that brought ml5.js onchain with the fxhash Facetune Portraits project back in 2024\. I wrote about it back on the fxhash newsletter way back when. **6 —** [**The mathematical beauty of hyperbézier curves**](https://linebender.org/blog/hyperbezier/?ref=gorillasun.de): Raph Levien, aka Linebender, proposes a new family of curves, the "hyperbezier." He suggests it as a candidate to replace cubic Béziers in the 2D vector design setting. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-10.57.40.png) [Link to Post](https://linebender.org/blog/hyperbezier/?ref=gorillasun.de) A hyperbézier, instead of being defined by control points, is defined by curvature as a function of arc length (a linear term over a quadratic raised to the 1.5 power), which makes it behave much like a cubic Bézier at small angles but with smoother, more often monotonic curvature when pushed. ## New in AI At this point, I have no clue how anyone's still keeping up with everything that's happening in AI these days. If you've been MIA then there's two major headlines that you probably should know about 👇 - **OpenAI solved the Navier-Stokes millennium prize problem** - **A rogue OpenAI model hacked into HuggingFace** **1 —** [**OpenAI solves the Navier-Stokes Millennium Prize Problem**](https://openai.com/index/navier-stokes-solution/?ref=gorillasun.de): if you're not familiar, the Millennium Prize Problems are seven famously difficult unsolved mathematics problems selected by the [Clay Mathematics Institute](https://www.claymath.org/?ref=gorillasun.de) in 2000, with a $1 million prize offered for a correct solution to each. So far only one has been resolved: [Grigori Perelman](https://en.wikipedia.org/wiki/Grigori%5FPerelman?ref=gorillasun.de) proved the Poincaré Conjecture in 2003 and famously declined both the prize money and the Fields Medal. What's crazy about this OpenAI story is not actually that another one of the 7 Millennium Prize Problems has been solved, but rather the entire manner in which OpenAI managed to produce a proof, considering some of their dubious operational methods. Before we go into some of the details, their own post on all that transpired: [On the Navier–Stokes Millennium Prize ProblemWe’re sharing an AI-generated solution to the Navier–Stokes Millennium Prize Problem, including a writeup and a formal proof in Lean.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-6dfa4ae4-36c0-4012-ab1c-036ccbc9405d.png)OpenAI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/navier-stokes-og-cc026c33-f6a4-43af-b693-337a9888d171.png)](https://openai.com/index/navier-stokes-solution/?ref=gorillasun.de) On September 1st OpenAI had allegedly come to know of a rumour that another two of the millennium prize problems had been solved. It's not certain how they came to know this information, but according to their own reporting it led them to throw their newest and most capable internal model at this suite of problems. Apparently their newest model had shown "unprecedented performance" in their benchmarks compared to the newly public Astra model that only released a few days ago. Probing the model on some related and easier tasks they managed to solve an apparently simpler version of the Navier-Stokes problem, which had them decide to redirect all of their resources towards it. Their claim is that they ran 10000 concurrent agents to then finally solve the problem. Over on [github](https://github.com/openai/NavierStokesAndEuler?ref=gorillasun.de) they published a 160 page paper about their findings, as well as the lean formalized proof. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-21.34.28.png) Now the odd thing about this entire story, is that the two researchers Levent Alpöge and Tristan Buckmaster had simultaneously worked towards a solution to the Navier-Stokes problem over the past year in their own time, as a personal collaboration between them, independent from their employers. They released an official statement briefly after [OpenAI's announcement](https://x.com/OpenAI/status/2097374640582668336?ref=gorillasun.de) went out: > My work with Levent has been a purely personal collaboration, free of any institutional agreements or official involvement by either of our employers. We used several LLMs throughout: Anthropic’s Claude, OpenAI’s Codex, especially with GPT-5.6 Sol and, more recently, Astra. The latter was only used for writeups and auditing our arguments Apparently they had also resolved the same "easier" problem that OpenAI's frontier model was able to solve at the start. The issue here is that they did use assistance from LLMs to obtain their findings, including OpenAI models. The statement also includes their exchange with OpenAI, when they had contacted Levent after producing the problem's solution: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-09-at-17.19.55.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-09-at-17.20.46.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-21.49.19.png) [Link to official statement](https://cims.nyu.edu/~tristanb/statement.pdf?ref=gorillasun.de) | [Link to OpenAI Post](https://x.com/OpenAI/status/2097375276384567642?ref=gorillasun.de) It's unclear if OpenAI actually did have access to the information that he had been feeding into OpenAI's models or not, but they admit themselves that it might have been the case that their model knew something about it. Now the outrage clearly is around OpenAI's potential appropriation of the work through their training data, and accrediting the solution towards their AI model. More curiously, Levent being an Anthropic employee might have fed into OpenAI rushing towards a solution, in what seems to be an arms-race between the two companies. There's a lot more that can be said here aside from all of the drama, but it's also a disheartening realization to all mathematicians that might have dedicated significant portions of their life towards these problems. It is very likely that the rest of the other millennium problems will finally be solved by throwing large clusters of AI agents at them rather than through human effort. The value of these proofs is also questionable if we still have to verify them and gain a human understanding whether they hold or not. That said, if you're curious about getting a better overview of the actual Navier-Stokes problem, then I recommend this video from Caleb Writes Code: **2 —** [**OpenAI breaks out of test environment**](https://simonwillison.net/2026/Jul/22/openai-cyberattack/?ref=gorillasun.de#atom-everything): a few weeks prior to this OpenAI made the news with a cybersecurity incident, where one of their models managed to break out of a sandboxed environment that it was not supposed to be able to exit. Simon Willison already covers the incident in full detail over on his blog in two posts: 1. [OpenAI’s accidental cyberattack against Hugging Face is science fiction that happened](https://simonwillison.net/2026/Jul/22/openai-cyberattack/?ref=gorillasun.de) 2. [Now we have a timeline of the OpenAI accidental attack against Hugging Face](https://simonwillison.net/2026/Aug/7/openai-timeline/?ref=gorillasun.de) OpenAI then later also issued their own recount of the events: [OpenAI and Hugging Face partner to address security incident during model evaluationOpenAI and Hugging Face share early findings from a security incident during AI model evaluation, highlighting advanced cyber capabilities and lessons for defenders.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-80343a48-0f58-452f-8dbe-0bb45828a353.png)OpenAI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Hugging_Face_Security_Incident_16x9-e302b987-5c4c-439c-b009-90fe30949a6b.png)](https://openai.com/index/hugging-face-model-evaluation-security-incident/?ref=gorillasun.de) With all of these occurrences, I am more and more curious to know how OpenAI operates internally on a day to day basis. **3 —** [**Prompting erodes the creative process**](https://x.com/gorillasu/status/2095995376184483981?ref=gorillasun.de): on a much lesser scale of importance, this past week I shared some thoughts on using AI in creative coding, and how prompting erodes many parts that make it a fulfilling endeavour in the first place. It seemed to resonate with a bunch of others that led the replies to become some insightful discussions. Hence why I deemed it worthy to include here as well. Read through it if you like 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-09.34.58.png) [Link to Post](https://x.com/gorillasu/status/2095995376184483981?ref=gorillasun.de) TLDR; it's the small tasks and problems, that I come across while I'm bringing an idea to life, that spark my curiosity and make me feel like I'm discovering, learning, and growing. Experiencing these small moments of discovery are eroded in their entirety by taking the prompt shortcut, and just wishing something into existence. Making those small decisions is what shapes the entire character of the resulting work. It's what puts the "me" into the final piece. Just like each small brushstroke in a painting. I'm certain of those two things, and I'm trying my best to still approach my creative work in that manner; even when there's the constant temptation of the "easy way out" by just asking an LLM to do it for you. If you have some thoughts on this, I'd love to hear them as well. **4 —** [**Hobby programming communities are aggressively against LLM usage**](https://blog.fogus.me/llm/born-against.html?ref=gorillasun.de): on a related note, I recently learned about an incident in the chess engine programming community that sparked some hefty debates, in a github thread of all places. Given the competitive nature of this niche, and considering that there's leaderboards and rankings, some see it as quite distasteful to even try and compete with an AI generated engine. Which is an endeavour Adam Twiss has been pursuing with his Coda project. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-10-at-17.43.02.png)](https://github.com/adamtwiss/coda/issues/15?ref=gorillasun.de) [Link to GitHub Thread](https://github.com/adamtwiss/coda/issues/15?ref=gorillasun.de) The arguments against Adam's efforts is that a lot of the code ends up stemming from the contributions of others in the first place, often without it being properly referenced or credited, with the model just creating regurgitations. I think it boils down to intent and purpose, Adam does seem to make an effort to credit and reference, while also trying to use AI to discover and find new optimizations. If these efforts are genuine and are meant to contribute in a productive manner, then I also find the blind and vehement dismissal slightly ignorant, purely for a dislike of AI. I initially became aware of this thread through a short [post](https://blog.fogus.me/llm/born-against.html?ref=gorillasun.de) from Fogus that also addresses the same topic: > To me, an LLM functions best as a force multiplier, not a surrogate. In the hands of an expert who already understands a domain deeply, it could act like a lever.[1](https://blog.fogus.me/llm/born-against.html?ref=gorillasun.de#fn1) But in these niche communities, the entire exercise is in the learning. Using an LLM to generate the finished piece doesn’t make us craftsmen; it just robs us of the craft. **5 —** [**AI Design Field Guide**](https://www.aidesignfieldguide.com/?ref=gorillasun.de): is a series of interviews with industry professionals that are approaching AI in new and smart ways. I found all four chats incredibly insightful: [AI Design Field GuideLearn techniques from the designers behind OpenAI, Anthropic, Figma, Notion & more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/android-icon-192x192-181e3ae8-9801-4c89-a983-9128de5ec9b1.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/share-link-79d2c169-f321-4297-a63d-6d27b6e9538f.png)](https://www.aidesignfieldguide.com/?ref=gorillasun.de) **6 —** [**Are AI Labs PelicanMaxxing?**](https://dylancastillo.co/posts/pelicanmaxxing.html?ref=gorillasun.de): on a more lighthearted note, it's been rumored that AI Labs are Pelican Maxxing. Dylan Castillo wrote about the tongue-in-cheek benchmark started by Simon Willison — generating an SVG of a Pelican — and that it has now informally turned into a challenge for the companies training AI models, so much so that they're assumedly benchmaxxing on the task at secret. Dylan's article ends up being a meta-analysis of how different models perform: [Are AI labs pelicanmaxxing? – Dylan CastilloI generated 1,000+ SVGs across 7 frontier models to test whether AI labs are training on Simon Willison’s pelican-riding-a-bicycle benchmark.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/logo-839f28c0-8b55-447d-9b98-149023c9f627.webp)Dylan CastilloDylan Castillo![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/pelicanmaxxing-43f10b0c-877b-483b-a875-e85a4fd11166.png)](https://dylancastillo.co/posts/pelicanmaxxing.html?ref=gorillasun.de) ## New in Web Tech **1 —** [**In defense of not understanding your codebase**](https://www.seangoedecke.com/in-defense-of-not-understanding-your-codebase/?ref=gorillasun.de): how well do you actually need to understand your codebase? How well do programmers generally understand their codebases? At what size is it not possible to fully comprehend the entirety of the software anymore? Sean Goedecke tackles these questions in a recent article of his, problematics that've arguably become a lot more relevant now that AI can churn out 1000s of lines of code in just a few seconds: [In defense of not understanding your codebaseAs a software engineer, how well do you have to understand your own codebase? My guess is that people who work on small codebases with low-turnover teams (say…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-8808b392-07c3-4df7-b0b2-f9d80a39126d.png)](https://www.seangoedecke.com/in-defense-of-not-understanding-your-codebase/?ref=gorillasun.de) I would agree that the larger and more complex the project is, the more effort and dedication it takes to maintain a full mental picture of the codebase, and in many cases you'll likely only have an "intuition" of certain parts of the code, rather than a minute understanding. Which I'd wager is in many cases more than sufficient. Sean continues to argue that Peter Naur's idea of "Programming as Theory Building" is long antiquated in the context of modern software. Sean's article plopped onto my radar a few days ago through a reaction video from Theo Browne. His framing however was a lot more controversially put, causing quite a bit of outrage over on X. Theo claims that if you can understand your entire codebase, then the codebase is not that important, and that "real software is larger than what your brain can comprehend" (according to his [tweet](https://x.com/theo/status/2096854674938941448?ref=gorillasun.de)). The video itself is not as on-the-nose as the tweet, so in my opinion this ends up conflating two separate issues on purpose for the sake of ragebaiting folks. **2 —** [**Knuth-Plass line-breaking algo**](https://github.com/lyallcooper/justif?ref=gorillasun.de): Justif brings TeX's famously good typography algorithm to the web. In a live demo he showcases hyphenation, protrusion, expansion, and tracking, pitting his output against native browser justification. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/image-1.png) [Link to Demo](https://justif.lyall.co/?ref=gorillasun.de) He shares the repo publicly on a [github repo](https://github.com/lyallcooper/justif?ref=gorillasun.de) of his. **3 —** [**The point of a design system is fewer decisions**](https://www.antonsten.com/articles/the-building-was-never-the-hard-part/?ref=gorillasun.de): Anton Sten writes about the purpose of design systems, explaining that they're meant to reduce the number of decisions instead of being tools for the sake of consistency. He also addresses their newfound purposes in the agentic era, where they need to encode intent clearly so that it's easy for automated code generators to make appropriate decisions: [The point of a system is fewer decisions – Anton StenA good design system captures decisions so people and agents do not have to keep making them independently.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-66a73fc1-748e-4940-aead-de4d6ff17443.webp)Anton StenAnton Sten![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/the-building-was-never-the-hard-part-e558b2b4-075f-4b8f-bd0a-c8921d1fd7b4.webp)](https://www.antonsten.com/articles/the-building-was-never-the-hard-part/?ref=gorillasun.de) **4 —** [**Malicious take-home project**](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/?ref=gorillasun.de): Appaji reports on a malicious take-home project he encountered while applying to a too-good-to-be-true job offer, discovering that it had a payload embedded in it aimed at draining his crypto wallets. Luckily he managed to catch it before executing any of the code, and in the process putting together the interesting article that he shared over on his blog: [Appaji - Software EngineerAppaji, a Computer Science graduate from IIT Patna and former intern at Arista Networks, is a Software Engineer at Infinite Reality. Passionate about building innovative web experiences, with a strong interest in sustainable and customer-focused startups.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-31024068-991c-46c7-88e3-447e329beefd.ico)Software Engineer![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot_20260719-211017.DYnt8aCJ_Z1UUdvu-7e7ad22c-d5ce-42cd-afa3-62d49a988daa.webp)](https://citizendot.github.io/articles/fake-job-interview-git-hook-malware/?ref=gorillasun.de) More curiously is the discussion that ensued over on Hacker News; it turns out that this is not an isolated incident. Ivan Goncharov discovered through the article that he had unknowingly been hacked with the same kind of malicious take-home-project-payload a few weeks prior, only realizing it while checking the cloned repo. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-11-at-16.31.11.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=49013036&ref=gorillasun.de) **5 —** [**Visualizing Codebases**](https://githubnext.com/projects/repo-visualization/?ref=gorillasun.de): for some reason this article popped up in my feed again recently; a piece by Amelia Wattenberger from 2021 that's entirely about representing codebases in a visual manner. I believe it's more relevant than ever at this point in time: [Visualizing a CodebaseHow can we “fingerprint” a codebase to see its structure at a glance? Let’s explore ways to automatically visualize a GitHub repo, and how that could be useful.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-0cb592ab-291a-45e4-b03e-a5f2b62b9641.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/repo-visualization-9691d9b6-eec5-486f-89ae-9c7d9af16cf8.png)](https://githubnext.com/projects/repo-visualization/?ref=gorillasun.de) ## Gorilla Updates In the past months I spent quite a bunch of time archiving a lot of my work. Over the past two weeks I took some time to put together a little archive for all the long-form projects that I've released on different blockchains. Well, it's really not so little; it turned into a full archive of 18 long-form projects across 5 platforms, and includes over 5000 minted editions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-09-at-15.52.03.png) Collecting all of the editions and constructing a full database for all individual editions took a bit of figuring out, but luckily Claude is very good at writing the kinds of scripts that can easily fetch all of that info from just a link, and then additionally also construct the respective SQL queries to populate the database entries. It's important to me that all of the metadata is stored in the background so that nothing is lost over time. I have to admit, I did build this page in a bit of a panic when I realized that most of the platforms I've released my projects on have entirely vanished at this point. For example, the bitmark blockchain was sunset in 2025, which is the chain on which my 2022 Crayon Codes project "Behind the Canvas" is published on. It seems that the entire chain was properly archived ultimately, however only 5 editions of the project were transferred over to Ethereum by their owners. I guess that makes them special rarities now. The other challenging thing was handling the params projects that had different requirements. That includes fxhash params, editart, and the mentioned crayon code project, which all need a special sandbox mode that allows for the exploration of their parameters. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-09-at-15.54.08.png) As for the IPFS pinning, I still have to verify that all of that's working correctly; but for now I let Claude have at it as well and make me a pinning script deployed to the same digital ocean droplet that I'm already renting for the automated newsletter bot. Long-term I'm thinking about migrating both of those services over to an old macbook pro that I'll just run as a server from home, rather than having to pay for the digital ocean subscription. Then it could potentially also run the Postgres database that holds all of the information for that archive website. Overall, it makes me happy to see all of these projects side by side like that; I guess the real treasure from all these years are the art we made along the way. The page isn't live yet, but it'll release as part of the blog overhaul that I'm hoping to wrap up soon. Besides that I've also entered the arena once more and uploaded another reel. This time I tried to greatly improve on the time it took me to record the entire thing. It definitely didn't feel as daunting the second and third time around, and I managed to do the entire thing in a few hours, including writing the script beforehand (excluding video editing). If you're curious, check them out and maybe give them a share, it does help out a bunch: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-15.36.14.png) [Link to Post](https://www.instagram.com/p/DcBIeG8uFB1/?ref=gorillasun.de) | Go and give it a like or a share! 🫶 Lastly a note on the automated newsletter bot. I've thought about it a bunch more and I've come to the conclusion that its main value consists in being a link aggregator that's tailored to a specific niche. It's been happily chugging along over the past weeks and generally finding things that I am actually curious to read in my own time. It's made putting together this issue of the newsletter a little less stressful because I didn't have to do that much internet archeology for the past weeks. I still have to be aware of the happenstances around everything else though. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/09/Screenshot-2026-09-13-at-15.39.37.png) Check out the archive [here](https://readtheq.com/archive/?ref=gorillasun.de) and sign up to the mailing list if you're interested in those daily updates. Otherwise there's also the daily digest channel in the discord where you can also see that update there. What does that mean for the bot? It's gonna continue running for now, but I'll slim it down a lot more and just make it a list of links that are interesting with a short description line, rather than a full on paragraph. AI generated "opinion" is boring, as I don't think anyone cares for the generated slop ramblings. ## Music for Coding This past week I'm blessed to discover Peter Sagar's music. *In the Shower* (2014) is Peter Sagar's debut as Homeshake, made right after he quit touring as Mac DeMarco's guitarist. He got tired of the road and wanted to stay home in Montreal, and the record is basically that decision set to music: slow, humid, half-awake bedroom funk. Mumbled falsetto, lazy guitar playing, and rubbery bass lines all blend into a feeling of wanting to stay home, take a shower, being lazy, not wanting to go out. It's the kind of music to just lay back to and think about life while the world keeps on spinning outside: And that's a wrap — hope you've enjoyed this curated assortment of tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide web... more subscribers, views, and reads means more internet points, which in turn enables me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Instagram](https://www.instagram.com/gorilla%5Fsun%5Fblog/?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **It's been a tad bit inactive, but we can change that... maybe.** **If you've read this far, thanks a million!** And in case you're still hungry for more, find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Self-modifying Quines, new HTTP QUERY Method, and Loop Engineering URL: https://www.gorillasun.de/blog/gorilla-newsletter-103/ Last updated: 2026-08-10T16:50:43.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** This is the **103rd** issue of the Gorilla Newsletter—an online publication that sums up everything noteworthy from the past week in creative tech and AI. If it's your first time here, we've also got a Discord server where we nerd out together — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news 👇*** ## New in Creative Tech **1 —** [**The "Insert" programming language for self-modifying quines**](https://github.com/uellenberg/Insert?ref=gorillasun.de): Jonah Uellenberg created a version of Pong where each "frame" of the game is in-of-itself a C program that, when compiled and run, prints out the *next* frame. Which again is another C program that can generate the next frame, and so on. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/pong-ezgif.com-avif-to-gif-converter-1-.gif) This was Uellenberg's submission for the IOCCC 2025 (International Obfuscated C Code Competition) for which he won the Ping Pong Prize. Technically the source code for the submission is not obfuscated at all, the pong quine is generated by perfectly clean *Insert* code, that is then compiled into the quine. Uellenberg points it out himself in the [submission page](https://www.ioccc.org/2025/uellenberg/index.html?ref=gorillasun.de): > Now that all the obfuscated C fans are distracted, it’s time I let you in on what’s really going on. See, this code isn’t really obfuscated. It never was. No, it’s **compiled**. That’s right, not a single nibble desecrated by human hands, only purified in the unfeeling steel of liveness analysis, constant folding, variable reallocation, and compile-time evaluation. My basic understanding it is that the compiler secretly packs a copy of the program's source code inside of itself as editable text, with certain spots tagged as "swap this out." And when the program runs, it'll change out those tagged spots (like a counter or game state) and prints the result. There's a lot more information there about how this works if you're a C buff and want to understand it in more detail. Source code for Insert can be found over on [Github](https://github.com/uellenberg/Insert?ref=gorillasun.de). **2 —** [**ZOZO's Contact Solver**](https://github.com/st-tech/ppf-contact-solver?ref=gorillasun.de): simulating cloth and dense collisions without having objects clipping through each other is a notoriously difficult computational problem. Preventing intersections while still allowing realistic folds, wrinkles, stacking, and sliding requires collision handling that is both numerically robust and fast enough to run on complex scenes. The ZOZO contact solver can handle this nearly perfectly and was recently made public as a Blender add-on: [GitHub - st-tech/ppf-contact-solver: A contact solver for physics-based simulations involving 👚 shells, 🪵 solids, 🪢 rods, 🧱 rigid bodies and ⏳ sand.A contact solver for physics-based simulations involving 👚 shells, 🪵 solids, 🪢 rods, 🧱 rigid bodies and ⏳ sand. - st-tech/ppf-contact-solver![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-46ebfce6-06f0-43ec-88f2-ac8da9abb85f.svg)GitHubst-tech![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/2a0ee8b6-68b4-4b6f-b7c4-01bef1ab75e5-7704287c-bc22-44db-9ed4-fe2a9bc46e9b)](https://github.com/st-tech/ppf-contact-solver?ref=gorillasun.de) ZOZO is the largest fashion e-commerce company in Japan hence the requirement for such a high-grade tool. The original announcement about the Blender add-on came through on [reddit](https://www.reddit.com/r/blender/comments/1ti5bbh/a%5Fnew%5Fopensource%5Fphysics%5Fengine%5Ffor%5Fblender%5Fzozos/?ref=gorillasun.de): > Today, I'm fortunate that the company allowed me to disclose our Blender add-on, and I've also been given permission to share it here, as I thought it might be of interest to the community. The paper that the solver is based on previously already made a splash via the Two-Minute Papers channel: In a nutshell, when the gap between two surfaces gets extremely tiny, the calculations used to figure out how to move things next either barely moves them at all or overcorrects wildly, causing instability. This paper's fix is to use a "cubic" formula instead, which behaves better in that danger zone, plus a smarter way of setting how "stiff" that repulsion should be rather than needing to hand-tune a stiffness number. **3 —** [**Frank Force's Virtual Pen Plotter**](https://killedbyapixel.github.io/VirtualPlotter/?ref=gorillasun.de): is a fully functional 3D simulation of a pen plotter, that works just like a regular pen plotter. The sim lets you select different pens, stroke thickness, etc. and essentially traces out an SVG of your choosing onto the virtual paper. It even simulates the humming sound that plotters make when their rotors move the pen head along the x and y axes. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-05-at-13.22.10.png)](https://x.com/gorillasu/status/2073082739121696874?ref=gorillasun.de) [Link to Post](https://x.com/gorillasu/status/2073082739121696874?ref=gorillasun.de) It made quite a splash on socials due to its satisfying non-functionality! As always we are also treated to the source code over on GitHub: [GitHub - KilledByAPixel/VirtualPlotter: A 3D pen plotter simulator in the browser.A 3D pen plotter simulator in the browser. Contribute to KilledByAPixel/VirtualPlotter development by creating an account on GitHub.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-8405ec73-3bbe-45db-9af5-7c2b052661b1.svg)GitHubKilledByAPixel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/0722468f-0976-4938-b219-a5eadce763d9-757d560d-1a7c-4220-a962-0039efdb860c)](https://github.com/KilledByAPixel/VirtualPlotter?ref=gorillasun.de) **4 —** [**Frank Force's Tiny Retro Game**](https://killedbyapixel.github.io/TinyCode/1K/Skydreams/?ref=gorillasun.de) **&** [**js1024fun**](https://js1024.fun/?ref=gorillasun.de): this is a Frank Force fan newsletter now! My timeline was blessed again by another cool project Frank shared, his entry for the js1024fun sizecoding competition. In the tiny game you navigate a rolling ball along an endlessly winding track that's scrolling towards you. The difficult part is jumping over the occasional gaps in the track: 0:00 /0:18 1× [Link to Post](https://x.com/KilledByAPixel/status/2077086329905545295?ref=gorillasun.de) With this year's theme being "dreaming" the tiny game is a perfect fit. [The competition](https://js1024.fun/?ref=gorillasun.de) is still ongoing for another day, so you might be able to still whip up something until then if you're interested in participating: > Participants have **19 days** to create a cool **JavaScript or GLSL** program in **1024 bytes or less.** **5 —** [**Procedural Brick Tower code-along**](https://www.youtube.com/watch?v=DAMiS2PGTEE&ref=gorillasun.de): Inigo Quilez just uploaded two videos to his YouTube channel for the first time in 4 years! One of them is an educative 45 minute code-along in which he shows us how to program a realistic brick tower from scratch in GLSL, thanks to a request from a viewer: Hearing Quilez's commentary and thoughts alongside him typing out each statement line-by-line is incredibly insightful. If you're trying to improve your own shader skills this is a must watch. The other video he uploaded is another treat, it tackles the smooth-maximum function that incredibly useful for all sorts of applications — especially for smoothing out surfaces that might be composited out of different shapes: **6 —** [**Patricio Gonzalez Vivo's Weaver**](https://patriciogonzalezvivo.com/2026/weaver2/?ref=gorillasun.de): is an interactive installation piece in which two observers, in two different places and times, share a section of two overlapping night-sky maps. The region where the maps intersect shows the constellations that both people would have shared — a common sky regardless of the distance or time between them. [Weaver – A shared sky across timeWeaver is an interactive art piece by Patricio Gonzalez Vivo that merges family history, migration, and astronomy. By overlapping celestial maps from two distinct locations or eras, it visualizes the shared sky that connects us.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-8e8d9e76-1d4d-44f8-b662-ea54687446a0.png)CreativeApplications.NetJobs![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Weaver_cover-565f865d-69c5-44d3-b8c1-d4528c23ab62.jpg)](https://www.creativeapplications.net/member/weaver-a-shared-sky-across-time/?ref=gorillasun.de) Each map uses a polar projection and sits next to a rotating globe that you can drag to reposition the observer anywhere on Earth in addition to shifting the date and time. Patricio has worked on this project for several years, and shares an explainer about it over on his socials: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-15-at-11.54.48.png)](https://x.com/patriciogv/status/2077015278295138597?ref=gorillasun.de) [Link to Post](https://x.com/patriciogv/status/2077015278295138597?ref=gorillasun.de) **7 —** [**Bird Sound Generator**](https://www.instagram.com/p/DYf801IuBy4/?ref=gorillasun.de): to wrap up, one over from Instagram. I thought it was pretty genius! Aaron aka mixikid builds cool audio and music tech, and in this post of his on instagram he made a tiny bird sound generator. Simply with three control knobs it lets him recreate any kind of bird sound that you can imagine. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-05-at-13.22.29.png)](https://www.instagram.com/p/DYf801IuBy4/?ref=gorillasun.de) [Link to Post](https://www.instagram.com/p/DYf801IuBy4/?ref=gorillasun.de) I wish the video would have gone a little longer and explained a bit more how the circuit works, but he does inform about the components that he used, so if you wanted to build a similar kind of thing you'll probably be able to piece it together (potentially with the help from an LLM). ## Dotted Mind Not a sponsored segment, just a cool thing a friend of mine is launching! If you've got an iPad, and do any sort of note-taking in your day-to-day, this one's for you. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/dottedmind-beta-hero-1-1-1.jpg) Dotted Mind is a note taking app that aims to be as authentic as possible and actually *feel* like a hardcover notebook, rather than a cluttered document editor like most of what's currently out there. Many of the design choices that went into the app are inspired by how you'd actually handle an analogue notebook, not just in the page editor itself but also in how it lets you organize and group notes — while still taking full advantage of what a digital notebook can be. After having some lengthy conversations about it all, it's evident that Manuel is incredibly passionate about the app. Journaling and note-taking being a big part of his life makes this not just a piece of software, but also a sort of love letter to the practice: > A few years and many notebooks later, the limitations of hardcover notebooks became increasingly apparent. Pages ran out fast, finding older notes became cumbersome, and I couldn’t carry my notebook everywhere. Reluctantly, I gave digital journaling a chance. The apps were powerful, and the advantages were obvious. But none of them captured the simplicity, calm, and feeling of writing in a real hardcover notebook. So I decided to build my own. Sold? If you're interested, and want to see a solo-dev succeed, you can sign up to the beta over on the Dotted Mind landing page: [Dotted Mind, a calm iPad notebook for handwritingDotted Mind turns your iPad and Apple Pencil into a calm handwriting-first notebook for your loose thoughts, ideas and sketches. Join the open beta.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-512-ed892a45-d87f-4819-9a3c-a9d9e561f734.png)Dotted Mind![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-71792706-981c-4d35-9aa0-36d7b1857105.png)](https://dottedmind.app/?utm%5Fsource=gorillasun&utm%5Fmedium=newsletter&utm%5Fcampaign=beta) Otherwise you can also grab it when it launches beginning of August! ## New in AI Steve Ruiz's recent Tweet perfectly summarizes how I've been feeling about recent developments in AI: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-06-at-09.01.16.png)](https://x.com/steveruizok/status/2063885014115254452?ref=gorillasun.de) [Link to Post](https://x.com/steveruizok/status/2063885014115254452?ref=gorillasun.de) And I'm pretty sure I'm not alone with that sentiment. I'm equally optimistic, excited, and sceptical about coding agents — but most of all I feel smothered by the constant updates. I'm still trying to make coding agents *work* (literally and figuratively) for me in a way that doesn't completely erode my programming knowledge. There's a fine line between using an LLM to assist you and fully falling into vibe-coding. In recent weeks I've kept up with the leading voices in the space, in an attempt to keep a pulse on things. The more I do though, the more I get a sense that no one really knows what we're doing with AI at this point in time. There's the big unanswered questions, mainly revolving around the modality of our work with agents, such as: 1. Should we still read and/or write code at all when we use these tools? Or should we hand it all off to the agent. Some people are already happily doing this. I get it for experiments and pet projects, but what about the serious work? 2. Should I just completely ignore AI for now and carry on the way I did previously? Early on when learning to code, one of the first lessons was that brute force is almost always the wrong way to do things; if I were to just continue stubbornly practice my hard skills, I'd feel that I'm brute forcing this dilemma — which just seems wrong to me. 3. What about new people trying to ~~learn how to code~~ become software developers, how should they learn to code? It seems that this is an entirely new era of programming in general. If they have a completely different way of thinking about code, how will we maintain the system that were built in a different era. Or am I overthinking this? With all of it still actively unfolding it seems that there's no good answer to these questions. And that's just a few off the top of my head. Hence why I tried to showcase the full spectrum of perspectives and opinions on the topic with this week's selection of links — some folks are just as ambivalent as me, some projects have decided to completely reject AI for the moment, and others are all in. **1 — What is Loop Engineering?**: NeetCode has been popping up a lot more in my YouTube feed recently, and that for a good reason due to his sceptical take on most of these developments. While his takes resonating with a lot of folks for this reason, he's also been both branded as a *hater* and a *hypeman*. In a recent video of his he tackles the buzz around Loop Engineering — instead of prompting we should now build loops. *But what are loops?* Who knows! Many of the conversations omit the important details. In the video he tries to get to the bottom of it: NeetCode mocks how a lot of the current hype in AI is being marketed on a basis of FOMO — "if you're not doing this, then you're already falling behind"! More concretely though, loops are a way to squeeze more out of an agent by building a "harness" around it. Essentially wrapping it in multiple nested feedback loops instead of just running it once. A recent article by lang-chain explains this in more detail: [The Art of Loop EngineeringAgents automate real-world work, but reliable performance requires more than a good model, it requires a carefully designed harness built for specific tasks. This post explores the core agent loop, how stacking and extending loops builds more effective agents, and how to instrument each level with LangChain primitives.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/69a17e4a429d54e956e2a763_favicon-54034d36-c7e0-41d7-a509-aa3450da8428.png)LangChain BlogLangChain Accounts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/6a317b118693f5be4a8e220f_97-bba503c9-f7a7-4be7-9eb4-e320b99e1a9d.png)](https://www.langchain.com/blog/the-art-of-loop-engineering?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Their write-up explains that beyond the core loop, agents can be further improved by adding a verification loop, that incorporates some means for the agent to check their work before sending it, like a hard grading metric, or by using another agent for evaluation purposes. Additionally it also makes sense to use a "hill-climbing" loop, making the agent analyze traces from past runs to automatically improve the agent's prompts, tools, or grading criteria over time. To me this still sounds a little bit esoteric as it completely depends on the use-case you're using the agent for. I also found this interesting personal take from Armin Ronacher who's experimenting with building loops for himself: [The Coming LoopLoops, harnesses, and why even loop skeptics may end up with them.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/avatar-small-9d0c49cc-2c76-439b-8d56-2a4d0a78a834.jpg)Armin RonacherArmin Ronacher![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/2026-06-23-the-coming-loop-social-9e4e1ca6-00b5-45e9-a684-de3cd956dbe0.png)](https://lucumr.pocoo.org/2026/6/23/the-coming-loop/?ref=gorillasun.de) **2 —** [**Linus Torvalds on Vibe Coding**](https://www.youtube.com/watch?v=3NSSGt9bZag&ref=gorillasun.de): if you've ever asked your coding agent to check your repo for bugs and/or issues, you will have noticed that it simply always finds bugs and/or issues. It will never actually tell you that the code is *perfect*! Or at least good enough for its purpose. To me this is quite vexxing, because it ends up being a never-ending loop where the AI creates more work than it's solving. This same issue is currently plaguing open-source project maintainers: swaths of folks make AI generated drive-by PRs (as Linus Torvalds calls them) just for the sake of contributing, when it's impossible for the team to verify all of them due to the sheer amount. The creator of Linux talks about this here, and furthermore about how vibe coding is affecting our brains I recently also listened to [Andrew Kelley in a JetBrains interview](https://www.youtube.com/watch?v=iqddnwKF8HQ&vl=en&ref=gorillasun.de) — creator of the Zig programming language — explaining why the project has similarly adopted a zero-AI policy, flat out rejecting any AI generated slop PRs, issue, or contributions; in addition to not embracing AI tools: [The Zig project’s rationale for their firm anti-AI contribution policyZig has one of the most stringent anti-LLM policies of any major open source project: No LLMs for issues. No LLMs for pull requests. No LLMs for comments on the …![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-72eb2cd5-ff72-41e6-a21e-d806585505ec.ico)Simon Willison’s WeblogSimon Willison](https://simonwillison.net/2026/Apr/30/zig-anti-ai/?ref=gorillasun.de) Bottomline is that LLMs have infinite stamina to reason, argue, and generate things, which more often than not devolves into a wasteful loop rather than being constructive. Here's an interesting post by Andrej Karpathy that exemplifies this in a different context: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-13-at-09.16.01.png)](https://x.com/karpathy/status/2037921699824607591?ref=gorillasun.de) [Link to Post](https://x.com/karpathy/status/2037921699824607591?ref=gorillasun.de) I'm really not sure how this helps with forming an opinion — could he not have done another round of arguing in the opposite direction and have convinced himself of his original belief? **3 —** [**Andrej Karpathy on Coding with AI**](https://www.youtube.com/watch?v=kwSVtQ7dziU&ref=gorillasun.de): on that note, Karpathy has been one of the leading voices in the space for the past decade. End of may he joined Anthropic, and is without a doubt optimistically bullish on the paradigm shift— in a recent interview he explains that he's been writing less and less code: Maybe I'm just too skeptical about whenever someone's too *all in* on something? **4 —** [**LLMs and performative productivity**](https://joshcollinsworth.com/blog/productivity?ref=gorillasun.de): Josh Collinsworth write an interesting think piece in which he argues that faster output with AI tools just pushes problems downstream while eroding the on-the-job learning that builds skill. Since these tools are built to maximize engagement, not judicious use, he warns that we can't trust our own sense that it's helping unless actually measured in a meaningful way. [LLMs and performative productivityIt’s worth asking whether LLMs are actually making us more productive at all—and if so, what we might be sacrificing in return.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/2020-icon-87d91b05-7526-4836-bfc2-7a699b1699a0.svg)Josh Collinsworth![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/bullseye-342455fa-a04b-4239-9a50-a65149640467.png)](https://joshcollinsworth.com/blog/productivity?ref=gorillasun.de) My hunch that there's lots of similarity between prompting LLMs and doomscrolling through short-form video content is constantly being re-affirmed. He also touches on some other interesting points, for instance that AI is not necessarily making software better — or better software — if it's ultimately not perceived by the people that use the software: > Most of the other updates weren’t really *needed*. The changes just made me feel good, while making little to no difference on the user side of the software. **5 —** [**I love LLMs, I hate hype**](https://geohot.github.io//blog/jekyll/update/2026/07/12/i-love-llms.html?ref=gorillasun.de): and to wrap up, a based take from George Hotz. He rejects both the doom-laden "you're falling behind" hype and the sci-fi superintelligence narrative, arguing that AI is really just powerful tooling: [I love LLMs, I hate hypeI think from this blog you may misunderestimate how absolutely giddy I am about AI. I did hacking from 2007-2014, after that my whole career has been devoted to AI. I love the progress. I’m so excited for the new LLMs, self driving cars, video generation models, and coding agents. I set up a Linux box with opencode on my local GLM-5.2 last week and wow like just saying install tmux with the geohot configuration works; the Year of the Linux Desktop is finally here!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/faviconV2-86484656-09d7-4027-b12b-d91a0181dd2a)the singularity is nearerthe singularity is nearer](https://geohot.github.io//blog/jekyll/update/2026/07/12/i-love-llms.html?ref=gorillasun.de) > You have to be really careful, [they can increase cognitive fatigue](https://warpedvisions.org/blog/2025/hitting-the-wall-at-ai-speed/?ref=gorillasun.de), and all the vibe coded stuff is still slop (where’s all this new magical software that the productivity improvements should imply?). But models are useful just like find replace, stack overflow, or all the regexes I never learned how to write and now never will! ## New in Web Dev **1 —** [**First New HTTP Method in 20 Years**](https://dev.to/andresclua/http-just-got-its-first-new-method-in-20-years-heres-why-you-should-care-2h5p?ref=gorillasun.de): up until this point in time we have always misused the POST method when we were required to perform a GET request with a *body* attached. As far as I understand, we usually don't include a body with a GET not because it's forbidden, but rather because it's discouraged. Which is why some websites will simply reject such a GET or drop its body automatically, making this behaviour inconsistent. Thus the POST with a body workaround — which is semantically wrong on the other hand. Usually a POST request is not idempotent and is expected to cause some change on the server (like creating or modifying a resource). Using it for read-only searches or filtering is a mismatch between what the method promises and what you're actually doing. Hence the newly introduced QUERY method. It can fetch with a body and is idempotent. A post on Kreya explains it in a simple manner: [The new HTTP QUERY method explained | KreyaIn this blog post, we take a deep dive into the new HTTP QUERY method, explaining the history behind it as well as the advantages and disadvantages of using it.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-fdbbf819-6099-409c-ab68-beecde7c556b.ico)KreyaManuel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/default-75cd9f70-a968-4822-ad0d-9943db419fcb.png)](https://kreya.app/blog/new-http-query-method-explained/?ref=gorillasun.de) The new method is without a doubt a big deal: QUERY lets you send complex, structured query data as a request body, without URL length limits or messy encoding, while still getting the retry-safety and caching that GET gives you but POST doesn't. If you're curious, here's the full RFC spec: [RFC 10008: The HTTP QUERY Method | RFC EditorThis specification defines the QUERY method for HTTP. A QUERY requests that the request target process the enclosed content in a safe and idempotent manner and then respond with the result of that processing. This is similar to POST requests, but QUERY requests can be automatically repeated or restarted without concern for partial state changes.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/512x512-32d184da-08d1-4238-9ab2-0fbad92825cd.png)RFC EditorFielding, R., Ed.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/rfc10008-24695604-00b4-4940-8587-1777609d9b2a.png)](https://www.rfc-editor.org/info/rfc10008/?ref=gorillasun.de) **2 —** [**WebDev Challenge by CodeTV**](https://codetv.dev/series/web-dev-challenge/s3/e5-best-landing-page-gsap?ref=gorillasun.de): [CodeTV](https://codetv.dev/?ref=gorillasun.de) is reality TV for developers — created by Jason Lengstorf it's a slate of different shows and challenges that are shot and produce like actual TV. Think Hot Ones and Game Changer but for programming. I found the shows equally entertaining and educative: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-14-at-10.25.59.png) [Link to Episode](https://codetv.dev/series/leet-heat/s1/e12-aisha-vs-janessa/play?ref=gorillasun.de) You can check out an overview of all episodes over on the website. They also have an ongoing Web Dev challenge series that I think will be most relevant to point out here — in each episode a few dev teams get together and compete against each to build something specific with a certain technology. In the most recent episode they're tasked with building the most jaw-dropping landing page they can, using GSAP, Webflow, and Astro as required tools. [The Best Landing Page Ever | Web Dev Challenge Season 3Build a landing page that makes us all stop and pay attention.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-b47e1c50-fe42-461e-93bd-0f04c73f5b97.svg)CodeTV![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/web-dev-challenge-s3-c00ba86a-1246-43dc-95a6-e0d2cf7b489b.e5-gsap_3)](https://codetv.dev/series/web-dev-challenge/s3/e5-best-landing-page-gsap?ref=gorillasun.de) **3 —** [**Web Browsers on Video Game Consoles**](https://vale.rocks/posts/game-console-browsers?ref=gorillasun.de): traces the history of web browsers built into game consoles, from the early '90s up till today. Declan Chidlow lists out a comprehensive list of all consoles and details on how the browsers in them worked. [Web Browsers on Video Game ConsolesExploring cyberspace with a thumbstick.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-4d99fed8-8785-4752-82d3-842d960180c0.svg)Vale.RocksDeclan Chidlow![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/post-52c1899d-7c06-4c27-8f34-b7c29d9860f7.webp)](https://vale.rocks/posts/game-console-browsers?ref=gorillasun.de) There was a period where console browsers reached their peak, marketed as cheap internet gateways for people who didn't own computers. Browsers were then quietly dropped completely after the PS4 era, probably due to everyone already having a browser in their smartphone that's much easier to use. I can still remember discovering that my PSP had a browser in 2007 — it wasn't very useful without a wireless internet connection most of the time however. **4 —** [**Web-based cryptography is always snake oil**](https://www.devever.net/~hl/webcrypto?ref=gorillasun.de): Hugo Landau argues that the promised "end-to-end encrypted" in many a web app is broken by design. The server operator who you're supposedly protecting yourself from is the same one serving you the JavaScript that does the encrypting. If they turned hostile (or get a warrant), they could just push different code next time you load the page. He calls it a law: a cryptosystem is incoherent if its implementation comes from the same entity it's meant to secure against. [Web-based cryptography is always snake oil![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-9c44a430-1165-4979-b57f-40cd74d7ee1d.png)Hugo Landau](https://www.devever.net/~hl/webcrypto?ref=gorillasun.de) This same critique applies to Signal and WhatsApp, since both control the client and ban third-party alternatives. He argues that "E2E" on the web mostly exists as legal cover, so that companies can tell governments "sorry, we literally can't decrypt it" and dodge warrant compliance. He backs this with the Lavabit case (FBI pressured it to compromise its own encryption; it shut down instead) and FBI v. Apple (FBI tried to force a backdoored iOS build). Both show the vendor always retains the technical ability to comply. The only thing standing in the way is a legal argument, not math. **5 —** [**Hacker Fables by Sebastian Carlos**](https://sebastiancarlos.github.io/hacker-fables/?ref=gorillasun.de): pitched with the tagline "The satirical cyberpunk novella to read while your AI agent completes Jira tickets.", Hacker Fables is a parody on programmer/hacker culture, riffing on things like LeetCode and AI coding agents — highly recommend reading through it if you need a good chuckle: [Hacker FablesThe satirical cyberpunk novella to read while your AI agent completes Jira tickets.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/faviconV2-b59c56eb-8cf2-402d-8bbe-1ea4cc88cc04)Sebastian Carlos![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/hacker-fables-cover-thumb-37c49a8f-2a38-4ad0-8e21-3540aa11f402.jpeg)](https://sebastiancarlos.github.io/hacker-fables/?ref=gorillasun.de) ## Gorilla Updates It's been three weeks since the last issue of the newsletter — and I think this pace is much more sustainable than a weekly one. It gives me the necessary breathing room to naturally discover interesting articles and links to include. In the past I had always struggled with this "collecting" phase, as some weeks would simply be quieter than others. Two years ago I spent a little bit of time investigating if I could automate this part of the process for myself — at least partially — with some sort of web-crawler. Basically a script into which I dump all the sites and resources that I usually scan, to extract everything that could potentially be relevant. That was around the time when building agent loops with LangChain had just become a thing. I did end up getting something working, but it wasn't very good, so I didn't pursue it after that. It's been on my mind ever since though. Fast forward to this past week. One thing on my list was trying out Claude Code... since literally everyone and their dog won't stop talking about it. Especially now that Fable 5 is available again it seemed like the right time. My idea was to let it build that crawler for me again to see if it can whip up something useful from the get-go. I pointed it at some of the past issues of the newsletter to figure out what kind of things I usually write about, and told it to check some links I passed into it, like hackernews and reddit (among others). I was impressed by the first couple of drafts it produced, it was quite good at finding and curating an interesting assortment of links. I refrained from trying to fine-tune it, because I knew that I could easily spend a couple of hours just messing around with it. But why stop there though? I could also easily have it automatically create this digest every day and mail it out to me. So I spun up a fresh Ghost install on a digital ocean droplet + a mailgun server and voilá — automated daily digests! Long story short, here's the result — you can sign up to this automated daily digest as well if you're interested 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-12-at-20.05.50.png) You can also check out some of the digests it's already pooped out so far in [the archive section](https://readtheq.com/archive/?ref=gorillasun.de). It's a bit hit or miss, since it obviously doesn't really know what makes a good newsletter, but it's decent at collecting interesting articles and is already coming in handy to find things for this main newsletter. I will probably spend some more time fine-tuning it, but I need to think about a better strategy for it first. What would be cool is if subscribers could customize the content of the digest that they receive when signing up to it. I found a tool that already does something [similar](https://usedigest.com/?ref=gorillasun.de), albeit in a very different manner. Seeing that the last update there is from February 2025 it's probably an indication that this kind of thing doesn't have much demand though. In any case, let me know if this is interesting or not. If yes, then I'll write more about it. Right now I don't know if this can be sustained for a longer period of time; I do have to pay subscription fee for the droplet and mailgun server (aside from the api credits the script needs for the automatically generated summaries and using grok to crawl X). Maybe these costs can somehow be reduced though. On that note, there's another "big" thing I've crossed off of my bucket list: making a proper reel on instagram. It's been on my mind for a while now, and I had to overcome some mental hurdles to finally sit down and do it. Speaking into a camera, alone in your room, is very difficult. And somehow my brain isn't wired to form sentences while also simultaneously looking into a camera. It's such a joy to type these words into the editor right now, without having to use my vocal chords. At the same time, the idea of recording another reel doesn't seem as daunting anymore. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/07/Screenshot-2026-07-16-at-12.32.58.png)](https://www.instagram.com/p/DaXwuA3Iz7a/?ref=gorillasun.de) [Link to Reel](https://www.instagram.com/p/DaXwuA3Iz7a/?ref=gorillasun.de) | Follow me on instagram! The video I posted is a little educative explainer about Reaction Diffusion, a bit about the historical context, and a brief explainer of how the algo works. Kind of a compressed YouTube style video. It got 50k views and nearly 2k likes, which is an insane amount of engagement compared to what I usually get. I have a hunch that its virality has something to do with the animation itself — folks scrolling are probably intrigued by the animated blob-like patterns and then end up halting for a brief moment to watch for a few seconds, probably a positive signal that tells the algo to "send it". Anyway, I am happy with the response, and I'll keep posting these videos, even if they don't go viral. I had a blast writing a script, recording it, editing the video, and that's already enough for me. ## Music for Coding Las Luces Primeras is a musical project by Mariano Peccinetti, a visual artist, musician, composer, and multi-instrumentalist from Mendoza, Argentina. The project is described as a reference point for indie music from Cuyo (the western Argentine region) and Spanish-language neo-psychedelia, exploring a dreamlike and introspective style ranging from dream pop to garage psychedelia. Highly recommend this one and the other albums from the group, it's a really nice breather from the electronic stuff I usually listen to: And that's a wrap — hope you've enjoyed this curated assortment of tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **It's been a tad bit inactive, but we can change that... maybe.** **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 102 URL: https://www.gorillasun.de/blog/gorilla-newsletter-102/ Last updated: 2026-08-15T09:24:38.000Z **Hi everyone** 👋 **I'm back! It's been a minute since I last published a newsletter — almost a year now! And a lot's happened in the meantime, if you're curious where I've been, I published an update here.** [A Strange YearIt’s been almost exactly a year since I last posted here. A lot has happened in the meantime — I moved to a new place, I’m no longer part of fxhash, I had some gnarly health issues, and I’m slowly getting back to working on the things that I actually love doing.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-c22aa526-28ce-4627-82d9-327d577687ff.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2026-06-26-at-22.05.42-70b7e942-6c0c-485c-b41c-484d782523b5.png)](https://www.gorillasun.de/blog/a-strange-year/) **If you're just back for the news, then keep scrolling! 👇** > This is the **102nd** issue of the Gorilla Newsletter — a ~~weekly~~ (let's see if we can make it weekly again) online publication that sums up everything noteworthy in creative tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [Here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news! ✨*** ## New in Creative Tech **1 —** [**Learning Creative Coding by Stig Møller Hansen**](https://stigmollerhansen.dk/resume/learning-creative-coding/?ref=gorillasun.de): I've followed Stig for a few years now. He has built his instagram profile into an impressive catalogue of re-codes — programmed recreations of interesting and iconic visual designs. With a particular focus on posters. Here's a screenshot of his profile👇 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-15-at-13.10.34.png)](https://www.instagram.com/stigmollerhansen/?ref=gorillasun.de) [Link to instagram profile](https://www.instagram.com/stigmollerhansen/?ref=gorillasun.de) It's truly a treasure-trove of inspiration that I recommend exploring for yourself. Each recreation is accompanied by a short description that provides additional historical context around the original inspiration. I believe that Stig's intent behind each recreation is in most cases the idea of bringing to life a static design via parametrization, allowing Stig to not just recreate the original but also generate different varieties of the same design at once. While that's already an impressive body of work, Stig gets the top spot of this issue for the book he published earlier this year: **Learning Creative Coding**. [Learning Creative Coding – Stig Møller Hansen![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Pau![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover-026dd46e-c4a7-46e0-b669-4e28c52e0f63.jpg)](https://stigmollerhansen.dk/resume/learning-creative-coding/?ref=gorillasun.de) I believe the title of the book to be self-explanatory, but after reading a few chapters and skimming the rest, even if you're already experienced, it's not something to be glossed over. It's not really a technical book, far from it, it's about the process, the mindset, and many of the psychological aspects of creative coding, programming art, and design programming in general. And Stig hits some of the most important topics that it involves. > This book won’t teach you syntax. It won’t walk you through tutorials. It won’t make the learning easy. What it will do is help you understand what you’re experiencing and why it matters. I'm not fully through it yet, but I genuinely can't express how much I appreciate that the book simply starts out with the topic of frustration in creative work. It really struck a chord with me. A lot of careers probably come with their own frustrations, but I think it's a special kind when it comes to creative work. What's more is that the chapters are also color-coded with a virtue system — meaning that you can read the chapters in a different order, depending on what kind of struggle you are currently dealing with. **2 —** [**Plottimation Tool by Golan Levin**](https://golanlevin.github.io/plottimation/?ref=gorillasun.de): back in march Golan Levin released a super useful plotter animation website and library. It lets you automatically render an animated gif simply by feeding it a sheet of plotted frames — important thing is that the sheet includes little guide markers in between the individual frames. [Plottimation ToolFree web tool for animators to create looping GIFs and MP4s from photos of frame sheets, contact sheets, and sprite sheets.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/faviconV2-eff17495-dd2d-4509-9a69-321ae13c94fc)Golan Levin![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/plottimation_overview-2ef37ff3-cbaf-41aa-85e3-43a00805d29e.jpg)](https://golanlevin.github.io/plottimation/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/image.png) Golan provides a quick demo video over on YouTube that explains how the website works, but essentially you simply need to upload a photo of the sheet: As someone that's tried to create a plotted animation from simply taking individual photographs of each frame, let me tell you how pain staking it is to do so manually. **3 —** [**Patt Vira's Introduction to Shaders**](https://www.youtube.com/watch?v=q1xzpZu1KTc&ref=gorillasun.de): Patt Vira is also back from a break and released a new, highly requested, tutorial series on Shader programming. It's a wonderful intro to shaders using the WebGL context in p5\. She covers all of the basics, including GLSL syntax, setting up a shader sketch in P5, before diving into some of the default functions that GLSL ships with. I've mentioned it before, but the biggest hurdle to shader programming is that it requires you to fundamentally think differently about your code. You're now writing code that runs in parallel for each pixel, without the ability to share state between them so easily. Often a crutch I use in my regular sketching. **4 —** [**XOR's shader playground fragcoord.xyz**](https://fragcoord.xyz/explore?ref=gorillasun.de) **and** [**14 years of shader tricks**](https://x.com/XorDev/status/2021356467115462961?ref=gorillasun.de): while we're on the topic of shaders, XOR whom I've mentioned a couple of times on the newsletter for his mind-boggling size-coded shaders, has launched his own shader editor: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-24-at-10.56.42.png)](https://fragcoord.xyz/?ref=gorillasun.de) [Link to Editor](https://fragcoord.xyz/?ref=gorillasun.de) In the docs it mentions that it's inspired by the other online shader editors like ShaderToy, TwiGL, etc. now I do have to say that I like the fragcoord layout a bit more than the others, it seems to offer more features to play with code and inspect the shader code. I also came across a thread of XOR's where he recounts some of his favourite tricks that he's discovered over the course of 14 years of shader programming: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-24-at-11.01.05.png)](https://x.com/XorDev/status/2021356467115462961?ref=gorillasun.de) [Link to Post](https://x.com/XorDev/status/2021356467115462961?ref=gorillasun.de) **5 —** [**CVPR 2026 Art Gallery**](https://thecvf-art.com/archive.php?year=2026&ref=gorillasun.de): is an art exhibition that runs alongside the prestigious CVPR (Conference on Computer Vision and Pattern Recognition), one of the biggest academic AI/computer vision conferences. It's curated by Luba Elliott, a curator specializing in AI in the creative industries, and features works that use or critically address computer vision techniques like generative models, GANs, diffusion, and facial/object recognition. [2026 | CVPR ArtCVPR Art Gallery — Showcasing art and creative works exploring computer vision from the annual CVPR conference.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)CVPR Art![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/art_6a102b4c5a0d1-8a540f3a-cb6b-437e-8a4f-b3676a6f8218.jpg)](https://thecvf-art.com/archive.php?year=2026&ref=gorillasun.de) Luba Elliott also interviewed some of the participating artists for a feature article on LeRandom — highly recommend checking that [post](https://www.lerandom.art/editorial/seeing-machines-luba-elliott-on-the-2026-cvpr-art-gallery?ref=gorillasun.de) out. **6 —** [**Rhizome's 7x7**](https://rhizome.org/editorial/2026/jun/12/7-big-ideas-from-7x7/?ref=gorillasun.de): Rhizome's **Seven on Seven (7x7)** is their flagship annual art & tech conference, running since 2010\. The concept is simple but potent: it pairs seven artists with seven technologists, asking them to "make something new" and present the results at a public day-long conference. 2026's theme was loosely organized around "more-than-human" — the idea that intelligence and agency exist not just in people but in the systems, environments, and entities around us. The framing text they shared was Zoë Sofia's 2000 essay "Container Technologies," which argues for valuing sustenance, maintenance, and care over extraction and control. You can read about all 7 artists and watch their project presentations over on the rhizome website. **7 —** [**Leon Harmon's The Recognition of Faces**](https://www.mat.ucsb.edu/g.legrady/academic/courses/12s102/OrgFaceHarmon.pdf?ref=gorillasun.de): I discovered this one through [a post from Noah Bolanowski](https://x.com/Noahbolanowski/status/2063459213423104327?ref=gorillasun.de), who continues to share interesting bits and pieces about the past of computational technology. This time he shared Leon Harmon's 1971 minimal computer portraits. The Recognition of Faces investigates the minimum amount of visual information required for humans to recognize a face. He reduced a photograph to roughly 200 coarse squares using only 16 shades of gray — essentially an extreme low-resolution pixelation — and found that people could still identify it as a human face, and whose human face it actually was. The work probed how the brain fills in gaps and reconstructs coherent perception from sparse, degraded input. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-24-at-12.02.25.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/image-1.png) [Link to Post](https://x.com/Noahbolanowski/status/2063788307725643796/photo/3?ref=gorillasun.de) It's an early landmark in visual perception research, and also a precursor to ideas that would later become central to digital image compression and, much further down the line, to how neural networks "see." You can read the full 1973 text "The Recognition of Faces" [here](https://www.mat.ucsb.edu/g.legrady/academic/courses/12s102/OrgFaceHarmon.pdf?ref=gorillasun.de). ## Tech & Web Dev **1 —** [**Cheng Lou's Pretext**](https://pretextjs.dev/?ref=gorillasun.de): I don't think Cheng Lou's pretext needs an introduction, when he first announced it over on Twitter, my entire timeline consisted of browser demos destroying blocks of text, sending individual characters flying across the page, in addition to all sorts of other interesting text based experiments. If you somehow never saw that the original tweet, here it is again: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-23-at-22.14.34.png)](https://x.com/%5Fchenglou/status/2037964564072210899?ref=gorillasun.de) [Link to Thread](https://x.com/%5Fchenglou/status/2037964564072210899?ref=gorillasun.de) What's so revolutionary about this? Pretext solves the problem of calculating the height of a paragraph of line-wrapped text *without touching the DOM*. The usual way of doing this is to render the text and measure its dimensions, but this is extremely expensive. Specifically, every time you need to figure out how tall a paragraph is or where a line breaks, the DOM triggers a reflow — on mobile, a single forced reflow can block the main thread for about 10–100ms. And because it's magnitudes faster than the previous DOM rendered approach, all text now becomes fully dynamic and interactive. Which is why we saw all the crazy demos pop up at the time. I also found this cool website that aggregates a bunch of the examples here: [Pretext - Text measurement that never touches the DOM.Pretext is a high-performance, pure JavaScript/TypeScript layout library for text rendering. Zero dependencies, framework-agnostic, blazing fast.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-7ced3748-602d-41e4-a53a-b6dace81f75e.svg)Pretext.JS![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/preview-5f3caef3-8b21-41e6-8678-1a335dddddf9.png)](https://pretextjs.dev/?ref=gorillasun.de) If you want to build something cool with it yourself, here's also the [github repo](https://github.com/chenglou/pretext?ref=gorillasun.de). **2 —** [**HTML in Canvas**](https://developer.chrome.com/blog/html-in-canvas-origin-trial?ref=gorillasun.de): earlier this year the new HTML in Canvas API was released, and brought with it a whole swath of interesting demos. As the title of the feature suggests, it makes it possible to render native HTML elements inside of a canvas element, which means that you can then apply visual effects to those elements with the 2d, WebGL, and WebGPU rendering contexts. As of now it is only available in chromium based browsers though, and behind a flag. [Introducing the HTML-in-Canvas API origin trial | Blog | Chrome for DevelopersLearn about the HTML-in-Canvas origin trial in Chrome, and how it can help bring the DOM to your Canvas-driven applications.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-5e5e6452-6d75-48ac-8713-ea705263c5d3.png)Chrome for DevelopersX![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/thumbnail-a3cc9029-016c-4d8d-9e0f-0255d38ac771.png)](https://developer.chrome.com/blog/html-in-canvas-origin-trial?ref=gorillasun.de) How does this work IRL? Essentially, you can now nest HTML elements inside of a canvas tag that's marked with the `layoutsubtree` attribute (either directly or programmatically). Then with the new `ctx.drawElementImage(element, x, y)` you actually draw the elements into the canvas. Lastly, the browser also needs to know *where we drew it* so it can route clicks and hovers to the right place, which is done by attaching the style transform returned from this function to the actual element. If that's confusing, the official post above explains it much more clearly — there's also an in depth tutorial from frontendmasters here: [The Web Is Fun Again: First Experiments with HTML in CanvasAn experimental API let’s us put HTML within those opening and closing canvas tags and render it to the canvas, while remaining interactive. Lots of possibility here!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-b939b322-3f19-400b-a028-d84598a117b6.png)Amit Sheen![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/9400-25f626d3-0fa9-47f1-9d6c-45a171874852)](https://frontendmasters.com/blog/the-web-is-fun-again-first-experiments-with-html-in-canvas/?ref=gorillasun.de) If you want to see some cool demos check out this [showcase](https://www.youtube.com/watch?v=Z1VBHgTLQVc&ref=gorillasun.de). **3 —** [**Hyperblam**](https://hyperblam.how/?ref=gorillasun.de): hyperblam is an HTML based, declarative implementation of the Web Audio API. It basically lets you build interesting musical instruments simply by chaining, nesting, mixing and matching custom HTML tags — just like you would wire up different modules of a modular synth. [Hyperblam Docs HomeDocumentation for HyperBlam. Make HTML make music.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-f3fc3163-6c2d-4697-a51b-79e932a66d7d.svg)HYPERBLAM![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cardHome-4e50e850-3c36-4c9c-a32c-3d031afe2855.png)](https://hyperblam.how/?ref=gorillasun.de) Obviously you could just write the Web Audio javascript code from scratch if you wanted to build something specific, but going through some of the examples that Heydon provides, makes it obvious that this layer of abstraction does lend itself to some creative affordances. Particularly coupled with browser events, like page scroll, mouseclicks, etc. I think there's a lot there. A different approach to 0:00 /0:26 1× [Try some of the examples for yourself here.](https://hyperblam.how/examples/?ref=gorillasun.de) So the next time you want to incorporate some audio in a project of yours, consider using Hyperblam instead of the Web Audio API. As an aside, the website is also a work of art in of itself with the custom font and the hand-drawn illustrations. **4 —** [**Snake.run by Nolen Royalty**](https://eieio.games/blog/secure-massively-multiplayer-snake/?ref=gorillasun.de): with a track record for building massively multiplayer experiments, back in February Nolen Royalty built a massively multiplayer Snake game that you play entirely in your terminal by running `ssh snakes.run`. The whole thing renders server-side and then streams to your terminal as text. [snakes.run: rendering 100M pixels a second over ssh · eieio.gamessnakes.run is a massively multiplayer snake game that uses the Secure Snake Home (SSH) protocol. It can render 100M pixels a second.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-973428a6-5afb-4755-8a38-9c947fce5b85.png)eieio.games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-666cb6e7-3371-4fb4-9fb0-77b56836af26.png)](https://eieio.games/blog/secure-massively-multiplayer-snake/?ref=gorillasun.de) In his blog post, he explains how he overcomes some impressive, entirely self-imposed, engineering challenges to make it possible — including making the game aesthetically pleasing in the terminal, streaming it at a reasonable bandwidth, and making it performant enough to allow for 2500 concurrent players. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-24-at-11.42.58.png)](https://x.com/itseieio/status/2027053193654419538?ref=gorillasun.de) [Link to Post](https://x.com/itseieio/status/2027053193654419538?ref=gorillasun.de) **5 —** [**Messenger by Abeto.co**](https://messenger.abeto.co/?ref=gorillasun.de): I don't have much to say here, except that this is by far one of the most impressive websites I've ever seen. It's a full browser based game, with quests and all, where you explore a tiny spherical planet/city. What's more is that you can even see and interact with other visitors on the page that also get their own characters. [MessengerIt’s a small planet, but someone’s gotta make the deliveries.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon32-BC0QIL61-0151be6b-0fc6-4683-8cbf-ade8a0e84a19.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/social-6b68329b-6f55-42c5-b3c2-a3d1ae223956.jpg)](https://messenger.abeto.co/?ref=gorillasun.de) ## AI Corner Coming back to compiling this newsletter, this section has only increased in relevancy. Considering the tech landscape, I'd argue it's probably the most important one at this point. Will I change the order of the newsletter though? I would still like to keep the focus of this newsletter on human x code creativity — if something happens to use AI in the process then I'll still include it in the lead section, while this one is reserved for the discourse around AI as a whole. A few years ago this part felt more of a "Hey, look, here's something cool happening in AI", now I feel that I should engage a lot more in the discourse overall. Especially seeing with how disruptive AI has been across many disciplines and fields. **1 —** [**LLMs are eroding my sotware engineering career**](https://human-in-the-loop.bearblog.dev/llms-are-eroding-my-software-engineering-career-and-i-dont-know-what-to-do/?ref=gorillasun.de#fn-1): it's not hard to see why this blog post went viral. Given how many engineers are watching coding agents get uncomfortably good, it's a bit frightening to hear from a domain expert that most coding agents are already capable of replacing most of their skills. > The only way out for keeping my employability in the long-term now seems to be shifting my domain expertise to something LLMs will not get good at so easily. But what's left? I couldn't track down who wrote it, but I've been sitting with the same question for months. What specific forms of human expertise — in writing and architecting code — are agents still genuinely bad at? Where does the hard ceiling actually sit? What are the skills that I should get really good at, that agents and LLMs still haven't cracked? [LLMs are eroding my software engineering career and I don’t know what to doI’m a software engineer, completing 10 years of professional experience this year. I started my career as a web frontend engineer (it was easier for me to de…![](https://static.ghost.org/v5.0.0/images/link-icon.svg)the human in the loop![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/pawel-czerwinski-G6ez-Kt1-XOs-unsplash-1-70764806-14e9-45e2-9bd1-c5d9aaecaff3.jpg)](https://human-in-the-loop.bearblog.dev/llms-are-eroding-my-software-engineering-career-and-i-dont-know-what-to-do/?ref=gorillasun.de) I hate fearmongering, hence I have a sense that we will eventually figure out something that AI is truly bad at and will never be able to solve; my hunch is that it has something to do with creativity and human connection. **2 —** [**High on AI**](https://www.instagram.com/p/DY7oL6FBMQr/?ref=gorillasun.de): Maybe the final frontier for LLMs is after all creativity itself? This is what Tim Rodenbröcker tackles in a recent instagram video of his. He argues that agents should be used tactically, much less during creative work, much more for infrastructure tasks that consist of repetitive or tedious work, where they can actually save us time. For creative processes AI is largely a liability, where prompting something into existence just means having to clean up after it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-22-at-21.10.28.png) [Link to instagram video](https://www.instagram.com/p/DY7oL6FBMQr/?ref=gorillasun.de) And I couldn't agree more. Similarly to before, I feel that typing prompts into an agent slowly erodes my reasoning and creative skills. This is why I try to limit my usage. It's very similar to doomscrolling on instagram and how it completely obliterates my ability to concentrate or keep my attention for longer than the duration of a reel. [Being High on AI • tim rodenbröker creative codingSome time ago, an older friend of mine told me: “Tim, many years ago I used cocaine, once”. “How was \[…\]![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-icon-180x180-917db674-7861-4811-a370-68fe3c372cfc.png)tim rodenbröker creative codingTim![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/highonai-8420ba7a-a320-403d-a312-fe59703eac14.jpg)](https://trcc.timrodenbroeker.de/being-high-on-ai/?ref=gorillasun.de) **3 —** [**The User Is Visbily Frustrated**](https://pscanf.com/s/354/?ref=gorillasun.de): Paolo Scanferla points out that much of the frustration we experience with coding agents is due to their anthropomorphism. They talk and respond like humans, and we get frustrated at them like we would with another person, but ultimately experiencing this kind of frustration is a bit absurd, because the agent does not actually understand it or attempt to steer it in such a corrective manner. [The User Is Visibly FrustratedIn this article, I try to understand why coding agents can be infuriating to use. I think the problem is their conversational UX: they behave enough like helpful colleagues to trigger our social instincts, but they don’t learn, adapt, or take responsibility the way people do, which makes their repeated mistakes feel much more frustrating than they should.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon.light.excalidraw.Dkf1GufG_Znvt4E-83dab0b8-1deb-4145-9da3-4ea603cd757a.png)\[email protected\]![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/profile.CewbUKyT_Z1miYcf-e161cea9-524c-4052-9f4e-3fff46beacc6.avif)](https://pscanf.com/s/354/?ref=gorillasun.de) **4 —** [**Can gzip be a language model?**](https://nathan.rs/posts/gzip-lm/?ref=gorillasun.de): when I began my master studies back in 2019, the first thing I learned about was Shannon-entropy and auto-encoders. Auto-encoders are nothing more than teachable compression machines that create an abstract representation of the data. In that sense, the large language models of today can also be considered massive compressors — the premise of Nathan Berry's project. Without learning any weights, he wants to see if the gzip algorithm can actually be used for text prediction, and it actually kinda works. "*It’s not exactly coherent text, but it clearly knows something about the text. Much more than I expected `gzip` to know. So how can a compressor generate this?*" [Can gzip be a language model?A while back I wrote about language modeling without neural networks, where I generated Shakespeare with an unbounded n-gram model: no weights, no training, …![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-3913f9e4-c7c8-4dfd-b0b6-b6b7b10212b5.png)nathan.rs![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/calendar-c923619a-8ccd-43da-9dc2-460b1619bbd8.svg)](https://nathan.rs/posts/gzip-lm/?ref=gorillasun.de) It has something to do with the fact that compression is inherently a form of probability modelling, but I'll leave you to discover this for yourself in the post. **5 —** [**Human cooking compressed into 2MBs**](https://epicure.kaikaku.ai/?ref=gorillasun.de): Epicure is a multilingual food embedding model that covers 4.1 million recipes across seven languages, mapping 1,790 ingredients, each represented as a 300 dimensional vector, into about 2MB of storage space. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-22-at-20.32.54.png) [Link to Tweet](https://x.com/josefchen/status/2059350978109874677?ref=gorillasun.de) The full paper, *Epicure: Navigating the Emergent Geometry of Food Ingredient Embeddings* by Radzikowski & Chen (KAIKAKU.AI), is up on arXiv [here](https://arxiv.org/abs/2605.22391?ref=gorillasun.de). And you can play with a [live demo](https://epicure.kaikaku.ai/?ref=gorillasun.de) here. Maybe the title might be a bit misleading though, but the demo clarifies it, essentially allowing you to compose recipes via a connectivity graph, that suggests what flavors go well together. This can then also be hooked up to an agent to give it knowledge about flavors and such. Interesting discussion over on [hackernews](https://news.ycombinator.com/item?id=48291225&ref=gorillasun.de) as always. **6 —** [**The Smallest Brain You Can Build**](https://ranpara.net/posts/perceptron-explained-from-scratch/?ref=gorillasun.de)**:** and to wrap up this section, an educative resource where Devrash Ranpara teaches us how to code a perceptron from scratch in python: [The Smallest Brain You Can BuildA perceptron explained from scratch in Python, with interactive demos. Learn weights, bias, the decision boundary, epochs, learning rate, and why we normalize data.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Devarsh RanparaDevarsh Ranpara![](https://ranpara.net/images/your-thumbnail-image.jpg)](https://ranpara.net/posts/perceptron-explained-from-scratch/?ref=gorillasun.de) ## Gorilla Updates If you haven't read my update — here it is again: [A Strange YearIt’s been almost exactly a year since I last posted here. A lot has happened in the meantime — I moved to a new place, I’m no longer part of fxhash, I had some gnarly health issues, and I’m slowly getting back to working on the things that I actually love doing.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-fb6f65e2-3ad7-49ba-8d67-33d9c4df0abd.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2026-06-26-at-22.05.42-01f7b93c-1604-4829-aa61-a9f283af9b13.png)](https://www.gorillasun.de/blog/a-strange-year/) In the last few months I've tackled quite a few things — a big one was organizing all of my digital clutter, sifting through all of the sketches that I've made over the past years. Only considering the past Genuarys, then that already adds up to a 150 individual pieces. Right after coming back from the hospital I got started on building a little archive page to showcase all of them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-24-at-11.44.15.png) This ended up being a much larger endeavour than I had anticipated (story of my life). Since I want this archive to be clean, it required not just collecting all of the projects from my hard drives — I really have not done a good job organizing my folders in the past — setting up a database to store the images for each one, writing an individual description for each, and hardest of all, cleaning up the code as well. There's still a lot to do there tbh, but it's an enjoyable process to which I can allocate a little bit of time when I don't feel like doing other tasks. This involved learning lots about react and Next.js, and there's much to share there, but I'll probably keep for that for a future update! Besides that I also went back to playing with flow-fields — the highly, highly overdone shtick in genart. I recently went back to look at [Junia Farquhar's Dipolar](https://www.artblocks.io/collection/dipolar-by-junia-farquhar?ref=gorillasun.de), an Art Blocks project back from 2022\. I was always very impressed with the compositions, and the incredibly satisfying manner in which the flow field wraps around the magnetic poles placed on the canvas. Hence why I made the attempt to implement my own version. The math is fairly easy to get something rudimentary going, but it ends being quite slow with how many computations it takes to determine how the flow lines should bend. I got it somewhat speedy on CPU, but still not fast enough to really call it "real-time". 0:00 /0:31 1× I might write something about this eventually, I think it's interesting enough. ## Music for Coding In an ever-growing catalogue of AI generated playlists, I am in a constant search of original human-made music. Skee Mask blends ethereal textures in a way that's reminiscent of Aphex Twin — highly enjoyable, and highly recommend letting yourself sink into this album: And that's a wrap — hope you've enjoyed this curated assortment of tech shenanigans! I'm really happy to be back. I'm not yet sure if this is going to be a weekly thing again or not, or if I have the stamina to send it out on a very consistent basis — but I'll give it my best shot. > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **It's been a tad bit inactive, but we can change that... maybe.** **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### A Strange Year URL: https://www.gorillasun.de/blog/a-strange-year/ Last updated: 2026-08-10T07:11:03.000Z Hey everyone, it's been almost exactly a year since I last posted an update to the blog. This post is an attempt to fit a strange year into just a few paragraphs. There were more than a few things that I didn't envision having on my bingo card. Here's the TLDR: 1. I moved. 2. I'm no longer with fxhash. 3. I got pretty sick. 4. I'm working on the blog again. If you're reading this, then the newest issue of the newsletter is also out! The next one's also already in the works. I guess I'll jump around a bit in terms of timeline, just to keep this relatively short. ## Life, Moving, Health Problems Mid 2025 I moved to a new place. The move happened around the same time I was updating the blog less and less — if you've ever moved places, you can probably imagine that the logistics of it are terrible. Add to that, the new place had a lot of issues that needed to be fixed up before it was ready to be moved into. Fortunately, all of that is a thing of the past, and so far, I've settled in quite nicely. It's still in the same city, but much more centrally located. A big improvement compared to where I'd previously been, now saving me quite a bit of time on commutes. I didn't know if I was really ready for a larger space, if I would be able to manage all the chores that come with it, but honestly I've done a better job than I thought. Now I also have a much nicer working space — lemme flex with my little creative/work corner. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/IMG_1554.jpg) The living room is pretty spacious, hence subdivided into living room area and this working space. Still a work in progress, but getting some of my best work done here. I still haven't figured out how to store the plotter in an effective manner, as I don't use it that often (I probably should though). It just sits there most of the time — so if you have any tips for that, hit me up. Moving did take a lot of energy out of me, more than I'd anticipated. Looking back, I probably ran myself too thin. Throughout the move I was still working full-time and didn't really take any time off. It didn't help that the work just got more and more stressful as time went on. The last few months of 2025 just feel like a blur. And I guess, by 2026 all of it made me reach a breaking point; on February 23rd I walked myself to the ER thinking I was having *a heart attack*. Over the course of that weekend I had already felt some strange intermittent pain in my chest, which I blamed on the flu from the week before. Sunday night this pain only grew more and more intense, and even felt it radiate into my left arm. If you've ever read up on heart attacks, that's pretty much the one sign you need to look out for. Around 4AM when the pain still hadn't subsided, I debated calling 911, but having a hospital only a 10 minute walk from my place, it made more sense to just try and go there as quickly as possible. A few hours and a cardiac catheter later, I was diagnosed with a Peri-Myocarditis — essentially an inflammation of the heart muscle and the area around it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/PHOTO-2026-06-26-18-50-58.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-26-at-18.54.52.png) In the ER with my dad — funnily enough it was also his birthday that day. "Hello dad, happy birthday, btw I'm in the ER." Also cool MRI pic of my torso. At the time of writing, it's been 4 months to the day. The recent MRI I did shows that all my heart functions have returned to normal, but at the same time shows that it's still partially inflamed. Meaning that I need to take it easy for a few more weeks. It's a bummer. Not being able to move freely, and exercise, has taken a toll on my mental health. In the last three years weightlifting had become a big part of my daily routine — losing that in an instant was difficult to cope with. That hour at the gym was a really effective way to shut off my brain for a little bit, and be away from the rest of my digital life. So far I have not found a good replacement for it. Yes, I have tried yoga. Unfortunately, I find it quite boring. But that's that, all I can do now is rest and wait, and try to channel my energies into the other things that matter. I'm grateful to have a loving partner, family, and friends that helped me with it all. And hey, it's given me the time to pick up the blog again, as well as some other neglected hobbies of mine. Making music again and playing some video games. I'm halfway through Expedition 33, and what an absolute masterpiece. It's rare that a game captures me like that. Without much of a segway, the day I was hospitalized was the same day that I received the layoff notice from fxhash. ## Time at fxhash Getting the offer from fxhash in September of 2024 was a dream come true. Getting the chance to be directly involved with the platform that had enabled so many things for me in previous years, was just surreal. I felt that I was really advancing in the gen-art x creative coding career (if you can call it that). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-26-at-20.34.57.png) At the same time, I really hadn't been doing well financially the few months before. The gig I had previously gotten to help out with the documentation end of 2023, had already helped out tremendously. The first few months were okay, but it also quickly became apparent that the team was quite burnt out from the previous years. And it really is no wonder with the pace of how the platform had grown, and had to grow really. As the weeks rolled by, the more it became clearer that there were also a lot of other internal issues. Initially I was hired to write community newsletters, continue working on the docs, and make educative content for the platform related to generative art. I ended up writing quite a few things, some of which never saw the light of day for one reason or another. For instance, there was this full length tutorial on Chladni patterns, that I worked on in tandem with the CYMATIC exhibition that happened in Photo Paris 2024. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/image-2.png) I will eventually have the tutorial up on the blog though. While those newsletters were well received initially, it also felt that it wasn't really putting a dent into this decline in interest. Somehow fxhash never managed to regain the same community sentiment that it had experienced in the early days, even though there were many sincere attempts to recapture it. fxhash did quite a few pivots throughout 2025 — dropping support for Tezos, moving towards art coins, open-form projects, ranked auctions, two revamps of the website, the attempt to open to all digital art, etc. I didn't have a say in any of it, but I also don't know what could have been done differently to have a better outcome for the company. Maybe the beginning of the end already was the move towards ETH, but I believe that was also a requirement for the seed-raise. Dropping support for Tezos felt like the final nail in the coffin for any sort of positive community sentiment, but then again, it was simply not profitable enough. The coin stuff all just came way too late. All moves were always just reactive towards the current situation. Maybe the best solution would have been to down-size the team and platform to absolute the absolute minimum, rather than aiming for scale. But that would have required ciphrd to make some hard choices. The most challenging part of the job was absorbing the overwhelming negativity whenever an announcement rolled out. One of the reasons why I felt less and less desire to be on social media. Some of the feedback was entirely fair — but a platform can't change course every time one person voices an opinion, even if it's a valid one. There were some seriously crazy sprints in 2025, especially with how ambitious the entire open-form idea was — in retrospect it's really impressive that the team managed to get it deployed and running. Yes, there were a lot of issues, and it was too complicated, but I think it was still a very interesting experiment in generative art x blockchain. Had it been done a year or two earlier it would have probably taken off in a much different manner. But that's just a hypothetical. As time went on, my position slowly shifted to handle more and more of the day to day comms of the team internally, handling the meetings, writing design docs for the product, and overall coordinating timelines and projects. Partially this was due to me already being involved in most of everything, so that I could compile these updates for the socials. And at the same time, there was a bigger and bigger leadership vacuum, so those tasks needed to be handled by someone. Overall, the work itself was quite interesting, would it not have been for the difficult circumstances that surrounded fxhash. I hope this paints a broad picture of things. There's a lot more I could say here, but at the same time I'm trying to close this chapter. ### The End With open-form and the FXH launch being somewhat successful it felt that things were moving in a positive direction again. End of September we had one of our regular team-syncs. The call went fine, we ended it on a positive note, we assured Baptiste that we would assist him with everything. All things considered, team morale was high. Unknowingly it would be the last time I saw Baptiste until March 2026\. The months after, the team was pretty much in limbo — the next week then just complete radio-silence. Not giving a simple notice is inexplicable to me. There probably is a lot more here that I don't know, hence I will leave it at that. In the end, I find the community update that was given disingenuous; claiming that exorbitant IPFS costs broke the camel's back, is just part of the issue. The actual plan for 2026 had been the introduction of ranked auctions, followed by opening up to all forms of digital art on the platform. The former we miraculously managed to put into production in less than two months considering that it involved some gnarly contract work in the context of artcoins. At that point we were genuinely stretched thin and motivation was at an all time low, especially with less and less runway looming over us. The lofty goal of opening up the platform to all digital art was becoming quite impossible. Things then ended on February 23rd, with a notice that salaries for that month would not be paid due to a non-existent runway. I despise over-dramaticizing things, but quite literally as soon as I was rolled into my assigned hospital room, and after calling my family, I got the notification on my phone. Life has comedic timing sometimes. ### The Good Moments But it's not all bleak though, there were quite a few rewarding moments in between. My favourite one was helping eboy upload and mint their open-form project to the platform — which was also the most successful open-form project imo. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2025-07-03-at-21.32.06.png) While we were waiting for the devs to help figure out some hiccups with the upload flow, we had a few moments to chat and talk about art, life, and all sorts of other things. In the screenshot we were post launch, watching some of the mints show up in the open-form graph. I also really enjoyed giving the workshop in Ghent at the very start of my employment, getting to meet Bjørn in person, exchange some words, and experience the amazing Entangled installation live was surreal. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/IMG_6059.JPG) I also greatly enjoyed working with Markus, Leo, and Louis over the course of the year and a half. They are the unsung heroes behind fxhash, none of it would have actually been up and online if it wasn't for them. They deserve much more credit for that than they have received. All three of them are incredibly skilled and talented devs. Other companies would be lucky to have this kind of dev team: Markus built that crazy open-form graph from scratch in just a few days, Leo handled hooking up some crazy complicated contract work to the frontend, and besides handling the database, Louis would always immediately be there whenever anyone faced an issue. Sadly I never got the chance to meet them in person. Writing this down, it's a really strange feeling looking back on it all. A significant part of my life, not just working for fxhash, but also the amount of time I have put into the projects that I've released with fxhash, as well as thinking and writing about it ever since 2021\. It could have been a good memory. I genuinely cared deeply about the platform, and I still do care about generative art, even if this entire experience taints my joy for it just a little bit. At the same time, I'm relieved that it's over. It took a while to process all of it, especially with how abruptly it ended, in conjunction with my health. Here is a notebook my partner gifted me when I got the job — she wrote me a small note on the first page. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/IMG_1536-1.jpg) "Good luck with work! I know you'll do good <3" ## Where to from here? When I first launched this blog, it was meant to be my little corner of the internet. I started it at a time when I felt like I didn't have a voice — like I wasn't doing anything meaningful. Having a platform to put words out into the world, to inform and teach people, to actually reach them, matters a lot to me. Making a positive impact, however small. Looking back, I think I've built something genuinely valuable. Some parts are all over the place, sure — but still. My plan is to flesh this out into a more polished archive of my work, my writing, and not just a newsletter. Still a newsletter, but also more than that. I am currently working on rebuilding the blog as a proper platform. That is the n-th time that I do this, but this time I actually have the know-how to do so. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2026/06/Screenshot-2026-06-26-at-20.57.49.png) Experimental new homepage for the blog. And while we're already talking about the newsletter. I had already started pivoting more towards creative technology at large as the newsletter progressed, in its wake, the blog was to a large extent about generative crypto art. That space looks completely different now. I recently checked the Discords of various platforms that existed at some point, and it largely feels like a digital wasteland now. Maybe I am missing something though, with all the buzz I'm seeing around Art Basel, it feels that digital art is just becoming more and more mainstream, and just isn't such a niche thing anymore. In comparison, everything related to AI in tech has just become magnitudes more relevant; obviously considering that is an existential threat to programmers and the craft. Without a doubt it's the most important conversation of this decade, and has heavy implications on creative technology, art making, and the value of human opinion. Not taking part in this conversation is simply stupid. This is to say, that I'm aware this should become a more prevalent part of the newsletter, rather than just a footnote. In the advent of AI, I strongly believe that human-made "content", and original opinion will only increase in value. One of the reasons why I feel comfortable coming back to writing, and compiling the newsletter. While AI can do many of these tasks much faster and much better than me, at least for the foreseeable future it will not be able to replace my thoughts, opinions, and the human experience I'm living. What's my plan moving forward? I'll try to be more active again on here and my socials in the coming weeks and months. I'm not promising or imposing any sort of strict schedule on myself, but I have already worked on some new art, drafted some new articles, experimented with some new formats, etc. So yeah, that's pretty much it, that's all I wanted, and needed to say. I'll catch you in the newsletter, or in the next update! Cheers \~ Gorilla 🌸 ### Gorilla Newsletter 101 URL: https://www.gorillasun.de/blog/gorilla-newsletter-101/ Last updated: 2025-07-21T05:00:09.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the **101st** issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news 👇*** ## All the Generative Things **1 —** [**Programming Physarum Simulations**](https://bleuje.com/physarum-explanation/?ref=gorillasun.de): this week Etienne Jacob, aka Bleuje, treats us to a particularly insightful write-up on an all-time classic genart algorithm—Physarum sims! He shares his own implementation, where compute shaders (using openFrameworks) enable him to drive millions of particles at a crisp 60 FPS. What's more, is that he's open-sourced all of his code throughout the tutorial: [Algorithms for making interesting organic simulationsArticle explaining simulation algorithms that produce complex organic behaviours, starting with the classic physarum algorithm from Jeff Jones.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-73.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/article-thumbnail.jpg)](https://bleuje.com/physarum-explanation/?ref=gorillasun.de) What's more is that Etienne actually also introduces a 15th sensing parameter, integrates color gradients (comparing current vs. delayed trails), particle inertia, and an interactive “pen” that spatially blends parameter sets under the cursor. 0:00 /0:10 1× We've previously talked about the topic in [issue #68](https://www.gorillasun.de/blog/gorilla-newsletter-68/) of the newsletter, where Deniz Bicer had created a really cool [interactive introduction](https://denizbicer.com/202408-UnderstandingPhysarum.html?ref=gorillasun.de). Physarum sims are essentially particle-based algos that recreate the behavior of [slime mold](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de)[s](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de), as well as ant colonies, in a digital setting. For context, I'll quote what I previously wrote: > Originally described by Jeff Jones in his 2010 paper titled "[Characteristics of pattern formation and evolution in approximations of Physarum transport networks](https://uwe-repository.worktribe.com/output/980579/characteristics-of-pattern-formation-and-evolution-in-approximations-of-physarum-transport-networks?ref=gorillasun.de)", the algorithm was later brought to popular attention in the generative art/creative coding space by Sage Jenson ([@mxsage](https://x.com/mxsage?ref=gorillasun.de)), with an iconic [blog post](https://cargocollective.com/sagejenson/physarum?ref=gorillasun.de) of his published in 2019. If you're looking for a more beginner friendly intro to the algorithm, you should definitely check out Patt Vira's [tutorial](https://www.youtube.com/watch?v=VyXxSNcgDtg&ref=gorillasun.de). **2 —** [**Programming Software/Triangle Rasterizers**](https://www.youtube.com/watch?v=yyJ-hdISgnw&ref=gorillasun.de): and while we're on the topic of computer graphics—strange how we recurrently talk about computer graphics on this newsletter—a recent Sebastian Lague coding adventure shows us how to program a software rasterizer. Software rasterizers are essentially a CPU-based renderer that can render primitives to the screen by determining which pixels need to be turned on, and what color they should be. So the entire GPU shader-shebang, like scan conversion, per‑vertex attribute interpolation (color, texture coordinates, and normals), performing depth tests to resolve visibility, and running fragment shaders to compute final pixel color, but simply on the CPU. Lague also covers some tricks on how to create a relatively performant pipeline: Coincidentally, this week I also came across a tutorial series back from 2022, written by Kristoffer Dyrkorn, similarly showing us how to create a triangle rasterizer that's fast and precise: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/Screenshot-2025-07-19-at-16.01.19.png)](https://kristoffer-dyrkorn.github.io/triangle-rasterizer/?ref=gorillasun.de) [Link to Series](https://kristoffer-dyrkorn.github.io/triangle-rasterizer/?ref=gorillasun.de) **3 —** [**Fractal formulas in Duality of Zed**](https://www.fxhash.xyz/project/duality-of-zed?ref=gorillasun.de): Ryan Bell is not only an OG generative artist, but also turns out to be one of the earliest to experiment with NFTs. A recent article by Archivist uncovers this story, linking two of the first digital artifacts on the Namecoin chain (the first altcoin and second blockchain after Bitcoin launched on April 18, 2011 as a fork of Bitcoin’s code), back to Ryan Bell. [Fuckyea, 2012 — A Brief Echo into the Void of Crypto ArtThe forgotten 2012 Namecoin experiment: Fuckyea, a fully on-chain pixel-art meme, may be the earliest crypto art ever made.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156-5)MediumArchivist![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1-_R-YVVK6YOpSA9fUMXMVNw.png)](https://archivist-eth.medium.com/fuckyea-2012-a-brief-echo-into-the-void-of-crypto-art-a93097473476?ref=gorillasun.de) Just last week Ryan Bell has also published a new project on fxhash—titled Duality of Zed, his project charts wholly uncovered fractal territory. The work explores two fractal formulas in particular: `ln(-z)/ln(z)` and `ln(z)/(z+1)`, resulting in some really crazy patterns, that only get more intricate as they are evolved by collectors 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/GwA5MdJWwAAdYAW.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/GwACpOqWkAAfOg8.jpg) > These are forms that emerge naturally from pure logic through concise yet powerful expressions like ln(-z)/ln(z) or ln(z)/(z+1). Using computers as microscopes, viewers can explore these patterns across a zoom range spanning more than 25 orders of magnitude, from macroscopic scales down to microscopic depths, where individual pixels represent regions smaller than subatomic particles. **4 —** [**Instancing with Three.js**](https://tympanus.net/codrops/2025/07/10/three-js-instances-rendering-multiple-objects-simultaneously/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de): if you caught up with the last issue of the newsletter you'll know that I've been working on a new generative art project, essentially a soft body generator that strives to be a simple a-life simulation. Implementing the initial version with P5, I already knew how to optimize particle collisions via spatial hashing (a grid lookup), but then I quickly realized that rendering was a performance bottleneck. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/Screenshot-2025-07-20-at-17.38.17.png)](https://x.com/gorillasu/status/1945237692079309185?ref=gorillasun.de) [Link to Post](https://x.com/gorillasu/status/1945237692079309185?ref=gorillasun.de) With P5 you essentially draw shapes one after the other to the canvas—each taking its own turn. But why not render all of them to the screen simultaneously? This can be done when you use a GPU accelerated renderer like Three.js, there you can batch draw calls if they all use the same texture and material. A new codrops article by Matias Gonzalez Fernandez shows how to use instancing to achieve simultaneous rendering of multiple similar 3D objects in the same scene, using React Three Fiber—which essentially is the React version of Three.js: [Three.js Instances: Rendering Multiple Objects Simultaneously | CodropsLearn how to render thousands of 3D objects efficiently using instancing in React Three Fiber, as demonstrated in the performance-optimized basement.studio site.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-37.png)CodropsMatias Gonzalez Fernandez![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/forest_featured.jpg)](https://tympanus.net/codrops/2025/07/10/three-js-instances-rendering-multiple-objects-simultaneously/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) **5 —** [**MOTE large-scale interactive eco-system sim**](https://x.com/recursecenter/status/1946230097003872653?ref=gorillasun.de): Peter Whidden will be giving a presentation about his a-life sim project Mote on August 13th at the Recurse Center in New York—you can [RSVP here](https://lu.ma/cee99o8y?ref=gorillasun.de). I couldn't find more information about the project at this, except for the trailer shared in the Twitter post and the description on the luma invite link: > Mote is an interactive ecosystem simulation composed of hundreds of thousands of organisms. It integrates elements from both games and research to create a sandbox for computational biology, machine learning, and physics. It uses a custom GPU-based physics engine to model the interactions of many simple behaviors at a massive scale, producing a wide range of fascinating emergent phenomena. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/Screenshot-2025-07-20-at-17.12.03.png)](https://x.com/recursecenter/status/1946230097003872653?ref=gorillasun.de) [Link to Post](https://x.com/recursecenter/status/1946230097003872653?ref=gorillasun.de) The talk will be up on the Recurse Center's YouTube channel afterwards! **6 —** [**Live Coding Industrial Robots**](https://www.creativeapplications.net/education/improvisational-machines-live-coding-industrial-robots/?ref=gorillasun.de)**: Dr.** Madeline Gannon led a four day workshop teaching a group of students to create a flexible workflow for live coding industrial robots. *Improvisational Machines* was inspired by the [Haute Cuture Robotics](https://atonaton.com/haute-couture-robotics?ref=gorillasun.de) choreography previously presented the 2025 Paris Fashion show, where she had to rapidly figure out a setup over the course of a two week sprint, where the team could only finalize the creative decisions the day before the show. The page on Creative Applications explains some of what was covered by the workshop: [Improvisational Machines: Live Coding Industrial RobotsOrganised and led by Madeline Gannon, Improvisational Machines is a workshop that brings live coding, dynamic interfaces, and flexible workflows into industrial robotics.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-7.png)CreativeApplications.NetFilip![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/reflections_trinity-2.jpg)](https://www.creativeapplications.net/education/improvisational-machines-live-coding-industrial-robots/?ref=gorillasun.de) **7 —** [**ProcGen Space**](https://procgen.space/resources?ref=gorillasun.de): is a big resource that aggregates all kinds of resources relevant to procedural content generation 📚 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/Screenshot-2025-07-20-at-17.45.30.png) [Link to Page](https://procgen.space/resources?ref=gorillasun.de) I'm not certain if Theobald Beyer is still active on social media, or if the list is still being maintained, but I found that is the same person that's behind the famous [Hydraulic Erosion paper](https://www.firespark.de/resources/downloads/implementation%20of%20a%20methode%20for%20hydraulic%20erosion.pdf?ref=gorillasun.de) from the Technical University in Munich, on which the equally famous Sebastian Lague coding adventure is based: This makes me want to create my own link aggregator page—I think I've accumulated quite a few resources at this point through the newsletter! **8 —** [**Experiencing ADHD in form of a Website**](https://www.adhdexperience.com/?ref=gorillasun.de): and to cap off this segment, for all of those that somehow made it to 2025 without developing some form of ADHD, here's a fun website that aims to emulate the kind of distraction you would experience: [Experience ADHD | Web.Lab | Wix StudioGet a small taste of what it’s like to see things differently. Experience the ups and downs of ADHD, including hyperactvity, impulsivity, and time blindness.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)glass effect - Hadar Yamini web.lab![](https://static.wixstatic.com/media/c164a8_4e33f50a32354a2cb890b83e4ac33e7f~mv2.jpg/v1/fill/w_1920,h_1000,al_c/c164a8_4e33f50a32354a2cb890b83e4ac33e7f~mv2.jpg)](https://www.adhdexperience.com/?ref=gorillasun.de) ## Dev & Web Tech **1 —** [**The State of Devs 2025**](https://2025.stateofdevs.com/en-US/?ref=gorillasun.de): a bit late to the party, but a new "State of ..." survey is out—rather than focusing on a specific language or framework, this time it's about the people who write the code! With 8717 one respondents chiming in, on questions about workplace issues, health, and hobbies. It's a really interesting, and likely relatable one for many devs out there—for instance the top 3 workplace problems that participants stated were bad management, burnout, and work-life balance issues. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/07/Screenshot-2025-07-20-at-14.34.23.png)](https://2025.stateofdevs.com/en-US/?ref=gorillasun.de) [Link to Survey](https://2025.stateofdevs.com/en-US/?ref=gorillasun.de) There's also four insightful statements packaged along with the survey results, about workplace discrimination, the importance of bringing in new devs, and the urgence of software companies focusing on the well-being of their employees. Anjana Vakil writes: > As software developers, we tend to think that what we do is about programming, performance, and pull requests. But ultimately, software is really about **people**. And people are complicated. One statement is from Josh Comeau, who was also quick to create a full analysis of the results that he sent out in his newsletter: > \[...\] the biggest thing that stood out to me is that while things aren’t as good as they used to be, they’re also not as bad as I expected. [The “State of Devs” results are in! • Josh W. ComeauFriendly tutorials for developers. Focus on React, CSS, Animation, and more!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-34.png)Josh W. Comeau![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-image-2.png)](https://www.joshwcomeau.com/email/2025-06-30-dev-survey-results/?ref=gorillasun.de) Highly recommend subscribing to him! **2 —** [**5 things I learned from 5 years at Vercel**](https://leerob.com/vercel?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de): a perfect complement to the State of Devs 2025 survey, is an article from Lee Robinson, previously Vercel's VP—he sheds some light on what it takes to push hard and run a successful start-up: [5 things I learned from 5 years at Vercel | Lee RobinsonHere are some of the lessons I learned and how I grew as a leader and manager, as well as a bunch of behind-the-scenes photos.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-76.ico)Lee Robinson![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-image-3.png)](https://leerob.com/vercel?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Many of his points resonated with me, and are things I have already experience to some extent both throughout working on my own projects, and during actually work—particularly this segment: > If you're okay with things moving slowly, they will. Aggressive deadlines expose hidden complexity. They force conversations about what really matters. \[...\] If there's no date, it might take 3 months. But if you set a date of 2 weeks and it actually takes 1 month, great, you just shipped a first version 3x faster. Deadlines can be a blessing and a curse, but if you want to make things move forward, you should always set a deadline. It's often the only way to figure out what works, what doesn't, and where the problems are actually at. But that's just one of the points he brings up throughout. **3 —** [**How OAuth Works**](https://www.clerk.com/blog/how-oauth-works?ref=gorillasun.de): you know what Vercel and Next.js make super straightforward? OAuth! Especially when coupled with a database service like Firebase or Supabase. When you get into app development, this is usually first thing you learn: signing up new users and then letting them log in—which is provided out of the box by DBaaS. If you're like me, you're happy that this is provided as is, without actually having to learn how it works, or needing to build it yourself. Jeff Escalante wrote a break-down of the Open Authorization protocol and how it works in detail: [How OAuth WorksA practical guide to OAuth Scoped Access that walks through the Authorization Code Flow with real code examples, security best practices, and clear explanations of how third-party app integrations actually work.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-74.ico)ClerkJeff Escalante![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-image)](https://clerk.com/blog/how-oauth-works?ref=gorillasun.de) Usually I try to add something smart to the article, but this one's entirely above my paygrade, so... 🤷 enjoy the article! **4 —** [**A DOM Templating API**](https://justinfagnani.com/2025/06/26/the-time-is-right-for-a-dom-templating-api?ref=gorillasun.de): the vast majority of web frameworks in existence today revolve around templating—creating re-usable chunks of code that let you "declaratively combine markup with data". While there's ways to re-create this with vanilla HTML/CSS/JS—aka [plain vanilla web components](https://plainvanillaweb.com/pages/components.html?ref=gorillasun.de)—there is still no native API to achieve this. Justin Fagnani argues that the time is right to build a declarative templating API directly into the DOM; with modern frameworks we've already converged on similar syntax and semantics, and figured out best-practices—using tagged template literals, reactive primitives like signals, and efficient update strategies such as template identity. In essence, nothing stands in the way of having a small, secure, performant templating primitive. [The time is right for a DOM templating API![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Justin FagnaniJustin FagnaniJun 26, 2025Web Development Standards![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/BYs7-KqWBL-1200.jpeg)](https://justinfagnani.com/2025/06/26/the-time-is-right-for-a-dom-templating-api?ref=gorillasun.de) And ultimately this would benefit everyone involved: smaller downloads and faster loads for users, no extra dependency management for devs, and framework authors could build on a standardized foundation instead of re‑inventing the wheel. **5 —** [**Links, Resources, and Humans of Note**](https://infrequently.org/links/?ref=gorillasun.de): and to cap off this section, Alex Russell compiled this large list of resources relevant to performance and platform-oriented web development—it's a very long one 👇 [Links, Resources, and Humans of Note - Infrequently NotedAlex Russell on browsers, standards, and the process of progress.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/ino-dark-opt-192x192.png)Alex RussellAlex Russell](https://infrequently.org/links/?ref=gorillasun.de) ## AI Corner 1 — [Diffusion Models the next Frontier of AAA Game Development](https://kylekukshtel.com/diffusion-aaa-gamedev-doom-minecraft?ref=gorillasun.de): Kyle Kukshtel argues that for decades console generations have relied on raw GPU power to chase ever‑shinier graphics—only to hit a plateau in photorealism. New games that require more performant devices to run on, rarely use this performance boost to actually do more in terms of gameplay. Engines like Unreal now ship “80% of AAA fidelity” out of the box, commoditizing graphical spectacle, and squeeze premium studios that still pour $500–900 million into marginal visual gains. Meanwhile, players have come to realize that good graphics don't really make a good game, and generally gravitate toward lean, honest experiences rather than increasingly glossy but hollow blockbusters. Kyle sees us at a new frontier, where integrated, graphics-generating diffusion models pose themselves a threat to triple AAA game makers. While we are still far out from this, his article speculates about how this changes the playing field for game creators: [UNSTABLE SCULPTURES — Diffusion Models are the Next Frontier of AAA Game Development - k-holeExploring a future of AAA game development focused around controlling diffusion models![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/d5eb2d47-553c-4c16-9529-04e5c8cd95bc.jpg)kyle kukshtel's website![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/large.jpg)](https://kylekukshtel.com/diffusion-aaa-gamedev-doom-minecraft?ref=gorillasun.de) Check out [issue #71](https://www.gorillasun.de/blog/gorilla-newsletter-71/), where we talked about GameNGen, a diffusion model that runs DOOM and is capable of responding to user inputs. **2 —** [**Impact of AI on Open-Source Dev Productivity**](https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/?ref=gorillasun.de): METR ran a controlled study on 16 seasoned open‑source developers—each of which are contributing to large, well‑known projects—to see how much AI tools actually help real coding tasks. [Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-35.png)METR10 July 2025![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/logo-montserrat-ratio-2-1-white-bg.png)](https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/?ref=gorillasun.de) Developers were assigned a mix of bug fixes, new features, and refactors and randomly told to either use AI (mainly Cursor Pro with Claude) or go solo. Surprisingly, when AI was on the table, writers took about 19% longer to finish tasks than without it, despite expecting a 24% speedup. Even after working with AI and slowing down, most still believed the tools had sped them up by around 20%. Unsurprisingly, most of the slowdown stemmer from the extra overhead of crafting prompts, reviewing AI suggestions, and integrating them into the existing codebase. You can read the full paper [here](https://arxiv.org/pdf/2507.09089?ref=gorillasun.de). ## Music for Coding This week I discovered the music of Kowloon—a **musician and filmmaker from Los Angeles**. His debut album 'Come Over' was written and recorded in its entirety in his home studio in the industrial outskirts of the city. Kowloon fuses vintage synths, drum machines, and bubbling bass lines—culminating in very danceable love songs. The lyrical content of the soft vocals however contrasts with the lightheartedness of the music itself however, and aims to convey a sense of "digital malaise". You can listen to entire album on his YouTube channel here 👇 And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide web—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 100Evolving Genart with fxhash - Flow Lenia for Emergent Evolutionary Behaviour - WebGPU Particle Life Sims - One Million Chessboards - 280 Character Shaders - JavaScript turns 30 - JPEG Format History - New PNG Spec - Search Engine from Scratch - LangGraph for Agentic Workflows![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-29.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-05-31-at-16.12.05-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-100) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 100 URL: https://www.gorillasun.de/blog/gorilla-newsletter-100/ Last updated: 2025-06-30T05:00:23.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the **100th** issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news 👇*** ## All the Generative Things **1 —** [**Evolving generative art with fxhash**](https://x.com/fx%5Fhash%5F/status/1938518292043350117?ref=gorillasun.de): after months of architecting, building, and refining a new generative kind of generative art, it's finally time—open-form genart is coming to fxhash this week! 0:00 /0:42 1× Super proud being a part of the fxhash crew—look at this banger of a video charlie cooked up! In the last issue of the newsletter I already outlined some parts of how the protocol works, now there's extensive documentation about it all—if you'd like to build your own open-form project and publish it on fxhash, this is your starting point 👇 [Programming Open-form Genart | fxhash docsPracticable notes on seeding open-form generative artworks and crafting interesting projects![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/image-1)fxhash docs![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/vP3YcE3svOr9k07jFX1x-1)](https://docs.fxhash.xyz/fxh/programming-open-form-genart?ref=gorillasun.de) I'm super stoked for the coming week—also a little bit nervous—but overall excited; especially for all of the projects that are going to be dropping, and bringing back the spirit of the early days of fxhash: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/eBoyArts---1937739305633612122.gif) The legendary pixel art group eboy are launching a project on fxhash! And it's going to be epic! In the meantime, I also continued to make good progress on my own project—while the aesthetics haven't really advanced, and aren't quite where I want them to be, what's going on under the hood went through a big refactor. I swapped out P5 in favor for Three.js for rendering purposes—while spatial hashing is sufficient for computing collisions, rendering the individual shapes that make up the blobs ended up being a big bottleneck. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-07-at-23.50.53.png) Hoping to start posting more about the project again in the coming weeks. And while we're talking about a-life sims, there's been some interesting developments 👇 **2 —** [**Emergent evolutionary dynamics with Flow-Lenia**](https://www.arxiv.org/abs/2506.08569?ref=gorillasun.de): while we're on the topic of "evolving" digital organisms, Erwan Plantec recently published a 27 page long research paper that's a continuation of his previous work on Flow Lenia. I've previously featured Erwan in issue #78 of the newsletter, where we briefly covered the topic—he is is back with a how they are at the root of artificial life with emergent evolutionary behaviour. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-28-at-23.14.26.png) If you've ever tried spinning up random cellular automata (I have)—with arbitrary adjacency rules—you'll quickly realize that the vast majority will collapse and vanish. John Conway actually spent quite a long time designing the rules for his famous Game of Life, as we know it today, to end up discovering a simple set of rules that present emergent behaviour on the grid. This stable behaviour of Conway's GoL is to a large part why it's so mind bogglingly fascinating—it stands out among a myriad of other sets of rules that don't result in anything impressive. This is what Flow-Lenia research basically tries to solve—finding emergent complex behaviours in random starting states, that don't just collapse every time. At least that's my current understanding of it—Erwan explains this concisely in a thread of his: 0:00 /0:22 1× [Link to Thread](https://x.com/eplantec/status/1937569852698308806?ref=gorillasun.de) I recommend reading the segment I wrote in [issue #78](https://www.gorillasun.de/blog/gorilla-newsletter-78/) as a quick recap—but in essence, it's a continuous type of cellular automata (not grid-based basically), where the behavior of each cell in a simulation is influenced by **spatially varying parameters**, enabling richer and more adaptive dynamics. Co-author Clément Moulin-Frier also gave an insightful ~~talk~~ lecture on the topic at Demeco2025, that I recommend checking out for something more approachable than the paper: **3 —** [**WebGPU particle life simulations**](https://lisyarus.github.io/blog/posts/particle-life-simulation-in-browser-using-webgpu.html?ref=gorillasun.de): topically, Nikita Lisitsa recently published a tutorial on how to simulate and render a full fledged particle based a-life simulation with the modern WebGPU API: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-29-at-18.25.21.png) Play around with the sim for yourself [here](https://lisyarus.github.io/webgpu/particle-life.html?ref=gorillasun.de) and even adjust some of the settings—it requires a browser that supports WebGPU however. Sorry FireFox users. There's actually quite a few tricks to optimize particle sims directly on the CPU, with spatial hashing for instance, but only up to certain theoretical ceiling of course—doing all of it in parallel is the way to go ultimately. In lisyarus sim there's different types of particles that interact in unique ways—some attract, some repel—leading to behaviors that look surprisingly complex, life-like patterns. [Particle Life simulation in browser using WebGPU![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-70.ico)lisyarus blog![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover-4.png)](https://lisyarus.github.io/blog/posts/particle-life-simulation-in-browser-using-webgpu.html?ref=gorillasun.de) Using the CPU you will also quickly run into a performance bottleneck when rendering, with the canvas context for instance, you have to loop over all particles and then draw them individually, which is not the case if you would use WebGL for instance. This is is why I ultimately decided to run with Three.js for my own soft-body sim rendering purposes. **4 —** [**Running a million-board chess MMO**](https://eieio.games/blog/a-million-realtime-chess-boards-in-a-single-process/?ref=gorillasun.de): in the last issue of the newsletter—before going on this longer break—I had mentioned that Nolen Royalty was working on an extensive article that explains the inner workings of his crazy One Million Chessboards mmo. In a massive article he explains how the website manages to handle thousands of requests every second with ease: [Running a million-board chess MMO in a single process · eieio.gamesHow one million chessboards works![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-31.png)eieio.games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-image-2.png)](https://eieio.games/blog/a-million-realtime-chess-boards-in-a-single-process/?ref=gorillasun.de) Nolen also published a complementary video essay, that currently has a criminally low view count compared to the traction that he's been getting over on X: **5 —** [**Codrops' The Collective newsletter discontinued**](https://thecollectivenewsletter.beehiiv.com/p/the-collective-is-changing?ref=gorillasun.de): Codrops' weekly round-up of creative tech things has been a tremendous source of inspiration over the past couple of years—sad to discover that it's being discontinued after a whopping 915 editions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-28-at-21.59.07.png) That said, I'm looking forward to receive the occasional update from them in my inbox, and the existing issues will continue to be a big archive of creative code history. In the meantime, they've continued to publish some excellent articles and tutorials👇 **6 —** [**Modeling the world in 280 characters**](https://tympanus.net/codrops/2025/06/23/modeling-the-world-in-280-characters/?ref=gorillasun.de): you'll be familiar with Xor if you read some of the previous newsletter issues. Xor has quickly risen to social media fame with his tweet sized shader sorceries, and he continues to churn them out at a mind-boggling rate—here's a recent one: 0:00 /0:06 1× [Link to Post](https://x.com/XorDev/status/1935730294625059139?ref=gorillasun.de) He wrote a massive article for Codrops explaining his process, how he's acquired an intuition for this compact kind of math, and a quick overview of some of the techniques that let you compress the shader code into just the size of a tweet: [Modeling the World in 280 Characters | CodropsAn exploration of the mindset, methods, and motivations behind crafting tiny, expressive shaders that combine code, art, and constraint.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-35.png)CodropsXor![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/xor_280.jpg)](https://tympanus.net/codrops/2025/06/23/modeling-the-world-in-280-characters/?ref=gorillasun.de) If you want to explore a big archive of Xor's creations, make sure to check out the "[Arsenal](https://www.xordev.com/arsenal?ref=gorillasun.de)" that he's put together: an archive featuring over 260+ of his shaders. **7 — Other cool generative things**: - [**Damek Davis Basic facts about GPUs**](https://damek.github.io/random/basic-facts-about-gpus/?ref=gorillasun.de): while we're talking about shaders—after reading [@cHHillee](https://x.com/cHHillee?ref=gorillasun.de) and [@Si\_Boehm](https://x.com/Si%5FBoehm?ref=gorillasun.de)'s blog posts on GPU programming, Damek decided to compile a few notes about his learnings and also sharing them in form of a hefty post—calling it just a few notes would actually be an understatement as his notes are quite detailed: - [**3D Audio Visualizer with Three.js**](https://tympanus.net/codrops/2025/06/18/coding-a-3d-audio-visualizer-with-three-js-gsap-web-audio-api/?ref=gorillasun.de)**:** another tutorial published on Codrops, where [Filip Zrnzevic](https://tympanus.net/codrops/author/filip/?ref=gorillasun.de) shows us how to build a futuristic **audio-reactive 3D visualizer** in Three.js. Add to that GSAP based control panels for an interactive and modifiable visualizer. - [**Introduction to Sketching with Code**](https://www.creativeapplications.net/tutorial/introduction-to-sketching-with-code/?ref=gorillasun.de): Kenic He Yoneda, who you might rather know through his alias kynd, has published quite a few tutorials on creative coding simply through his notion site kyndinfo.notion.site. This time around his piece titled "Introduction to Sketching with Code" is featured directly on Creative Applications. ## Dev & Web Tech **1 —** [**A brief history of JavaScript**](https://deno.com/blog/history-of-javascript?ref=gorillasun.de): JavaScript turned 30 years old this year, and the Deno blog compiled a massive timeline of all the important milestones throughout its lifetime, documenting the rise and fall of different frameworks, specs, and adjacent technologies—it's a really, really fascinating list, in that it provides historical context for much of the modern tech that we now use for building on the web: [A brief history of JavaScript | DenoIn 30 years, JavaScript went from being a little scripting language to one of the world’s most popular. Here are key moments to show how it has evolved and where it is headed.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Deno![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og.webp)](https://deno.com/blog/history-of-javascript?ref=gorillasun.de) And can I just say that I fricking love JavaScript? With all the hate the language gets, for being slow, being a mess to program and maintain projects in, and its inconsistent behavior across different browsers—it's been at the core of my personal creative journey on the internet, and continues to be an absolute joy to build things in. **2 —** [**JPEG Image Format History**](https://spectrum.ieee.org/jpeg-image-format-history?ref=gorillasun.de): besides JS, there's other technologies that have significantly contributed to what we collectively consider to be the modern web; the JPEG format is one of them, and almost as old as the internet itself. A Spectrum guest article by Ernie Smith recounts the coming-to-be of the image format, recounting another chunk of internet history. While initially inline GIFs were used for the transfer of image data, the JPEG format quickly usurped that position and became the most convenient image format that we still use till this day: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-29-at-15.49.43.png)](https://spectrum.ieee.org/jpeg-image-format-history?ref=gorillasun.de) [Link to Post](https://spectrum.ieee.org/jpeg-image-format-history?ref=gorillasun.de) **3 —** [**New PNG Spec**](https://www.w3.org/TR/png-3/?ref=gorillasun.de): not quite as old as the JPEG format, the PNG format also gets some love this week; after 22 years of its inception, we get an update and see the third edition of the PNG spec land. Chris Lilley—one of PNG's original co‐authors and current Technical Director contributing to the new PNG work—wrote an excellent article explaining how it works: [cICP in PNG, explained • Chris Lilley![](https://static.ghost.org/v5.0.0/images/link-icon.svg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/2506926)](https://svgees.us/blog/cICP.html?ref=gorillasun.de) You can read the entire technical doc for yourself here: [Portable Network Graphics (PNG) Specification (Third Edition)This document describes PNG (Portable Network Graphics), an extensible file format for the lossless, portable, well-compressed storage of static and animated raster images. PNG provides a patent-free replacement for GIF and can also replace many common uses of TIFF. Indexed-color, greyscale, and truecolor images are supported, plus an optional alpha channel. Sample depths range from 1 to 16 bits.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-71.ico)W3CChris Blume![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/W3C)](https://www.w3.org/TR/png-3/?ref=gorillasun.de) And of course there's also a brimming conversation about it over on Hacker News: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/Screenshot-2025-06-28-at-22.42.31.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=44365754&ref=gorillasun.de) **4 —** [**A simple search engine from scratch**](https://bernsteinbear.com/blog/simple-search/?ref=gorillasun.de): back to back to back, another resource that's entirely about how the internet works—quite literally—if you're ever wondered about building your own "simple" search engine from scratch, Max Bernstein explains how to do it using the fantastic word2vec that makes text content easily indexable and searchable: [A simple search engine from scratch\*\*if you include word2vec.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-68.ico)Max BernsteinMax Bernstein![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/favicon.ico)](https://bernsteinbear.com/blog/simple-search/?ref=gorillasun.de) **5 —** [**Masonry, Item Flow, and... GULP?**](https://meyerweb.com/eric/thoughts/2025/05/21/masonry-item-flow-and-gulp/?ref=gorillasun.de): Eric Meyer writes about the relatively new Item Flow proposal that's butted into the entire CSS Masonry debate—that was first introduced in a WebKit article a few months ago. The short summary of the Item Flow proposal, is that it takes the both the flow and packing capabilities from the flex and grid specs respectively, and groups them into a joint property, along with some new capabilities. [Masonry, Item Flow, and… GULP?Masonry layout is a difficult thing to do with CSS at present. Item Flow could make it easy.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-69.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/fb-og-image-1.png)](https://meyerweb.com/eric/thoughts/2025/05/21/masonry-item-flow-and-gulp/?ref=gorillasun.de) **6 — Other cool things**: - [The CSS Height Enigma](https://www.joshwcomeau.com/css/height-enigma/?ref=gorillasun.de): our favorite web designer Josh Comeau wrote about the CSS height rule's quirky behaviour. - [The Ergonomics of JS Generators](https://macarthur.me/posts/generators/?ref=gorillasun.de): Alex MacArthur compiled an ode to the ergonomics of JS generator. JS generators are lesser known, and underrated, feature of the language that I've personally also grown quite fond of over the years. It's pr - [Minecraft in pure CSS](https://benjaminaster.com/css-minecraft/?ref=gorillasun.de): as the title says, Benjamin Aster built a fully functional, interactive 3D minecraft scene in just HTML & CSS—without using any JavaScript to make it happen ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/06/image.png) You can check out the [code](https://github.com/BenjaminAster/CSS-Minecraft?ref=gorillasun.de) for yourself over on Github ## AI Corner **1 —** [**LangGraph for complex Workflows**](https://surma.dev/things/langgraph/?ref=gorillasun.de): One tool that's become popular over the past year for building complex agentic workflows is LangGraph. Developed by LangChain, it's an LLM agnostic framework that lets you orchestrate reasoning loops—feeding LLM responses back in as follow-up prompts, letting the LLM autonomously make tool calls, like other software and/or making API calls, and also lets link all of it together in a conditional, graph-like manner. While powerful, the framework is a bit tricky to get into—from personal experience of reading the docs—hence Surma.dev's tutorial on the topic is quite enlightening, showing us how to create a proper agent with the framework: [LangGraph for complex workflows — surma.devI may be late to the party, but LangGraph lets you build complex workflow architectures and codify them as powerful automations. Also LLMs, if you want. But you don’t have to!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/surma.1bdb48ee-1.jpg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/social-2.png)](https://surma.dev/things/langgraph/?ref=gorillasun.de) I played with the framework for myself a few months ago actually; in an attempt to automate some parts of writing this newsletter, particularly the initial resource and article collection phase that I always start out with. My idea was architecting a smart crawler that can autonomously parse a bunch of resources/sites I'd feed into it, and then give me a list of potentially interesting articles that fit this newsletter—but this proved to be trickier than expected. **2 —** [Done with GenAI](https://blog.glyph.im/2025/06/i-think-im-done-thinking-about-genai-for-now.html?ref=gorillasun.de): Glyph reflects on their deep discomfort with generative AI, why they’re stepping away from the discourse, and the emotional toll of unresolved skepticism—they write about it in a blog post of theirs: [Deciphering Glyph :: I Think I’m Done Thinking About genAI For NowDeciphering Glyph, the blog of Glyph Lefkowitz.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Deciphering GlyphGlyph Lefkowitz![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/3f36deb2aefc09c0bcd985db2458f2b5.png)](https://blog.glyph.im/2025/06/i-think-im-done-thinking-about-genai-for-now.html?ref=gorillasun.de) ## Music for Coding Not a piece of music this time, but for the special #100 issue of the newsletter, it felt fitting to feature this article about the history of album art—Matthew Ström tells us the story of how the first album covers came to be, replacing the previously used mono-colored cardboard sleeves that vynil records were sold in, and how Alex Steinweiss pioneered this particular artform: [The history of album artMatt Ström-Awn · Designer, leader, and coach focused on building exceptional products and teams.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-29.png)Matthew Ström, designer-leader![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/albumart-5.jpg)](https://matthewstrom.com/writing/album-art/?ref=gorillasun.de) And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 99Open-form Genart x fxhash - One Million Chessboards - strudel Music live coding in the browser - Inigo Quilez & Freya Holmér on the Wookash Podcast - Reservoir Sampling - CSS Hell - Container Query Hack - Zip bombing malicious Traffic![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-27.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-05-12-at-02.24.23.png)](https://www.gorillasun.de/blog/gorilla-newsletter-99/) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 99 URL: https://www.gorillasun.de/blog/gorilla-newsletter-99/ Last updated: 2026-07-27T10:54:37.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 99th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Before we get into the news this week, a special segment to kick things off*** 👇 ## Open-form genart x fxhash A new way to create and collect generative art is coming to fxhash, and I'm super stoked to be among the first to explore an entirely new paradigm! 0:00 /0:31 1× Over the past weeks I built a toy 'proof-of-concept' app to explore and better understand how this new form of generative art works, how to program it, and also discover some of the new archetypes it enables. The above clip shows this simulator in action—there's a bunch of technical aspects to *open-form* genart that I'm personally super excited to share more about in the coming weeks! *But before we get into all of that, a little bit of context first to explain how we actually got here* 👇 Generative art on the blockchain has without a doubt captured the attention of a global audience over the past couple of years. Starting with Larva Labs' Autoglyphs demonstrated back in 2019, the project demonstrated that NFT collections didn't necessarily have to just exist in the form of pre-rendered assets (like the BAYC), but could also equivalently be pieces of code that live directly on the blockchain, and capable of generating interesting visuals . When fxhash entered the scene, it opened the floodgates for all generative artists to tap into this new paradigm. Maybe it sounds bit cheesy, but it legitimately felt like a goldrush era—and I'm not just saying that, I was present in the flesh at the time. While long-form genart was new and exciting for a period of time, things have come to a crawling stop in the past months. It's become more and more evident that there's quite a few shortcomings to the long-form paradigm, particularly in how it constrains both artists and collectors. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-11-at-12.03.38.png)](https://x.com/ciphrd/status/1918308217177690238?ref=gorillasun.de) [Link to Post](https://x.com/ciphrd/status/1918308217177690238?ref=gorillasun.de) Which leads us to the current moment in time. To quote Kevin Esherick's seminal essay [Generative Anesthetics](https://kevinesherick.substack.com/p/generative-anesthetics): > Generative Art has had a moment. Over the past months it's been quite busy behind the scenes at fxhash—the team's ideated, designed and implemented an entirely new protocol for creating and collecting generative art on the blockchain, that attempts to remedy many of the problems that the genart space has been suffering from. **Enter open-form genart.** In open-form genart, collected outputs are no longer static mints, but instead can be thought of as their own self contained systems. Mints can now be interacted with through a set of actions, that open up new options for both collectors and artists alike. For instance, as a collector you can now reroll or burn your mints—that way you're no longer stuck with duds (crappy output from an algo) or editions that you simply don't enjoy. This means that open-form genart has collector curation directly built into it. Collected editions from an open-form project can now also act as their own mini-generators that spawn new *child* mints. We call this *evolving* a mint, because it now becomes possible to transfer information between a parent and a child mint! Naturally, this is entirely up to the artist on how they leverage this aspect of open-form genart—and from my early tests I believe there's really a lot that can be done. I've written a couple of posts over on X already to explain how this works from a technical POV if you're curious to learn more. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-12-at-01.17.11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-12-at-01.17.48.png) [Link to post #1](https://x.com/gorillasu/status/1920085305530450300?ref=gorillasun.de) | [Link to post #2](https://x.com/gorillasu/status/1920822620108337648?ref=gorillasun.de) In terms of the underlying tokenomics, it does also get a little bit more complicated. All new interactions are ultimately powered by an underlying token that's attached to the artwork. This additional complexity however is ultimately for a good reason—it's also intended to solve some of the financial problems attached to releasing generative art on the blockchain. That said, if this has piqued your interest now, the best way to learn more is by joining the big info session we're doing this **Wednesday May 14th at 9AM EST / 17:00 CET** over in the fxhash discord — [here's an invite link to the event!](https://t.co/p9SOvfXlHB?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/image-1.png) [Link to Discord Event](https://t.co/p9SOvfXlHB?ref=gorillasun.de) ***Now, back to regular scheduling—cue the news*** 👇 ## All the Generative Things **1 —** [**One Million Chessboards**](https://eieio.games/blog/one-million-chessboards/?ref=gorillasun.de): Nolen Royalty is back with another experiment that disregards absolutely any considerations for the general scale of things on the web — one million chessboards is a chess MMO, where players can move the pieces of one million chessboards simultaneously — try it out for yourself here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-11-at-13.59.00.png) [Link to Page](https://onemillionchessboards.com/?ref=gorillasun.de#1571,1043) He just recently released a v1.1 for the game that resets the board and improves some aspects of it. I honestly had a blast having skirmishes with randos so far 😆 What adds a lot of complexity is that pieces can travel between adjacent boards— you can't capture when traversing the boundary however, which adds an interesting dynamic where players attempt to amass tiny forts of pieces of one color that line the boundary of an entire board. Nolen also already shared a brief write-up over on his blog with the promise of a much more in depth upcoming article. [One Million Chessboards · eieio.gamesI made a website. It’s called One Million Chessboards. It has a million chessboards on it. Moving a piece moves it for everyone, instantly. There are no turns.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-28.png)eieio.games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-image-1.png)](https://eieio.games/blog/one-million-chessboards/?ref=gorillasun.de) He's also shared a bunch of technical details over on X if you're curious. **2 —** [**strudel Music Live Coding in the Browser**](https://strudel.cc/?ref=gorillasun.de): strudel is an official JavaScript port of [tidalcycles](https://tidalcycles.org/?ref=gorillasun.de) — while scouring Hacker News I recently learned that the popular Haskell-based music live-coding environment also has a browser based version — and I'm super impressed with how smoothly it runs considering that web audio can be a pain to work with. Here's an example of wjat a "track" in strudel looks like 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-10-at-12.29.27.png) [Listen and directly edit this track over in the strudel docs](https://strudel.cc/workshop/getting-started/?ref=gorillasun.de) What's more, strudel is [free and open source](https://github.com/tidalcycles/strudel?ref=gorillasun.de). **3 —** [**Wookash Podcast**](https://www.youtube.com/channel/UC9J9u3apteD0EuFjzRpt71w?ref=gorillasun.de) **featuring** [**Inigo Quilez**](https://www.youtube.com/watch?v=F1ax1iJTHFs&ref=gorillasun.de) **&** [**Freya Holmér**](https://www.youtube.com/watch?v=1o73moRXLAA&ref=gorillasun.de): a few weeks back, in [issue #92](https://www.gorillasun.de/blog/gorilla-newsletter-92/) of the newsletter, I mentioned the Wookash podcast, on which Łukasz has up to this point featured many a renowned game dev. Now he's pivoted to also feature guests from broader programming scene—particularly interesting for the genart & creative code community are Inigo Quilez and Freya Holmér. In both conversations the coding wizards talk about their careers, their processes, and how they work on their ideas: **4 —** [**Inventing the Adventure Game**](http://www.warrenrobinett.com/inventing%5Fadventure/?ref=gorillasun.de): this week's wildcard is "a*n unpublished book manuscript from the dawn of the video-game age (written in 1983-84).*" by Warren Robbinet. The book documents early video game history, particularly the 1980 game Adventure. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-12-at-00.05.19.png)](https://en.wikipedia.org/wiki/Adventure%5F%281980%5Fvideo%5Fgame%29?ref=gorillasun.de) [Link to Wikipedia Page](https://en.wikipedia.org/wiki/Adventure%5F%281980%5Fvideo%5Fgame%29?ref=gorillasun.de) I only skimmed through it but it's quite a fascinating read — particularly interesting is the final chapter where it outlines the program architecture of both Adventure and Rocky's Boots. **5 —** [**I hate my Portfolio**](https://medium.com/design-bootcamp/i-hate-my-portfolio-d9f6f1d18574?ref=gorillasun.de): and to cap off, an article about the emotional challenge of putting together a portfolio of your work—Valeria Yakovchik explains why it is a difficult task and how to create a good portfolio: [I hate my portfolioMandatory challenge for designers that no one wanted![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156-3)BootcampValeria Yakovchik![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1--jrxlV8MPMb0g_ECFZkunw.jpeg)](https://medium.com/design-bootcamp/i-hate-my-portfolio-d9f6f1d18574?ref=gorillasun.de) On that note, Anna Lucia [recently wrote about this exact topic](https://annaluciawrites.substack.com/p/tending-to-my-personal-website-like) in one of her newsletters, that's she's been sending out more frequently again. It's a really good read about making a simple portfolio that just works, without worrying about it being super polished. ## Dev & Web Tech **1 —** [**Reservoir Sampling by Sam Rose**](https://samwho.dev/reservoir-sampling?ref=gorillasun.de): Sam Rose is back with one of his wonderful interactive explainers! Reservoir Sampling is a technique for selecting a fair random sample when you don't know the size of the set you're sampling from. At first that might seems like an impossible task to solve when approaching with regular random sampling approaches—but turns out that there's a fairly simple and elegant solution that's solely based on probabilities. [Reservoir SamplingChoosing fairly when you don’t know how many you’re choosing from.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-64.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/reservoir-sampling.png)](https://samwho.dev/reservoir-sampling?ref=gorillasun.de) When observing an incoming stream of data samples and deciding whether or not to hold on to the current samples or select a new one, we simply generate a random number between 1 and the index of the current item in the stream. If the number is 1, we replace the current sample with the new item; otherwise, we keep the existing one. This ensures that every item in the stream has an equal probability of being selected, even though we're only storing one item at a time. This might not be intuitive, but logging the probability as Sam does in his article, turns out that this is perfectly fair. **2 —** [**CSS Hell**](https://csshell.com/?ref=gorillasun.de): is a set of 15 CSS challenges devised by Marcos Acosta, intended to be challengingly infuriating — having made it through the first 3 (taking longer than I had anticipated) I can say that it's probably just as fun. Marcos' concept is simple: you get to add a couple of CSS rules + properties to certain UI elements to make the colored pegs shown on the page overlap the matching holes. Making them barely touch is good enough of a solution here, as you can see from how I solved the third one 🤣 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-11-at-10.12.40.png) The tricky part is that you only get one or two rules for each challenge, with the solution kinda being unintuitive if you rely on how you'd usually go about layouting and positioning ing CSS. A big highlight for me were the short congratulation messages that Marcos threw in, in between the challenges — shots fired a backend devs: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-11-at-10.10.24.png) Let me know how far you get if you end up giving it a try! **3 —** [**Using Container Query Units Relative to an Outer Container**](https://frontendmasters.com/blog/using-container-query-units-relative-to-an-outer-container?ref=gorillasun.de): if you're not familiar with container queries yet (what are you still doing?) check out this excellent [interactive guide by Ahmad Shadeed](https://ishadeed.com/article/css-container-query-guide/?ref=gorillasun.de), as well as another two posts by Josh Comeau, an [introductory tutorial](https://www.joshwcomeau.com/css/container-queries-introduction/?ref=gorillasun.de) as well as [a more advanced one](https://www.joshwcomeau.com/css/container-queries-unleashed/?ref=gorillasun.de). Container queries are a way to size elements relative to another container element, instead of on the whole viewport. They get a bit tricky to work with when you're dealing with nested divs where the sizing of a child element needs to be relative to a specific outer container and not to its immediate parent — the CSS spec doesn't let you directly say "use this other container's size." A recent post from Ana Tudor provides an elegant solution to this problematic simply by using a CSS property: [Using Container Query Units Relative to an Outer ContainerContainer units (e.g. cqi) are only able to reference the closest container. But if you register a custom property and set that higher up, you can get your hands on other containers units.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-32.png)Ana Tudor![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/5761)](https://frontendmasters.com/blog/using-container-query-units-relative-to-an-outer-container?ref=gorillasun.de) If you define a custom property (`--s`) with a `cqw` value **on the intermediary container**, and make sure it's a **registered CSS property** (using `@property`), then its value will be calculated relative to the outer container and become available to the child that you want to size relatively. **4 —** [**I use Zip Bombs to Protect my Server**](https://idiallo.com/blog/zipbomb-protection?ref=gorillasun.de): Ibrahim Diallo shares how he deals with malicious bot traffic on his site by using zip bombs: tiny compressed files that, when opened, expand into a massive size, overwhelming the system that tries to process it. [I use Zip Bombs to Protect my ServerThe majority of the traffic on the web is from bots. For the most part, these bots are used to discover new content. These are RSS Feed readers, search engines crawling your content, or nowadays AI bo![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-icon.png)Ibrahim Diallo BlogIbrahim Diallo![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/thumb.jpg)](https://idiallo.com/blog/zipbomb-protection?ref=gorillasun.de) When he detects bots that scan for security vulnerabilities, probing for a response or trying to inject a script, he responds with a 200 OK header and attaching one of the innocuous zip bombs. Ibrahim also proceeds to show us how he creates them directly on the terminal! **5 —** [**Functional HTML**](https://overreacted.io/functional-html/?ref=gorillasun.de): if you could add an HTML tag of your choice, what would it be? Dan Abramov reimagines what it would be like if HTML behaved more like a full fledged functional and composable programming language—in essence Dan reinvents React Server Components and how they can be understood as a natural evolution of HTML that addresses fundamental web development challenges. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/05/Screenshot-2025-05-12-at-02.54.31.png)](https://overreacted.io/functional-html/?ref=gorillasun.de) [Link to post](https://overreacted.io/functional-html/?ref=gorillasun.de) **6 —** [**How Promises Work in JavaScript**](https://www.deepintodev.com/blog/how-promises-work-in-javascript?ref=gorillasun.de): the asynchronous side of JavaScript is probably one of the most misunderstood aspects of the language overall — Kaan Peksen wrote an excellent explainer on JS Promises, how they work behind scenes, and how they power asynchronous operations. [How Promises Work in JavaScriptUnderstand the inner workings of JavaScript Promises with a step-by-step explanation.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)DeepIntoDevKaan Peksen![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/image-3)](https://www.deepintodev.com/blog/how-promises-work-in-javascript?ref=gorillasun.de) **7 —** [**Good vs. Great Animations**](https://emilkowal.ski/ui/good-vs-great-animations?ref=gorillasun.de): And to cap off, Emil Kowalski shares a short collection of practical tips for elevating your CSS animations, making them feel more organic and natural. [Good vs Great AnimationsPractical tips on how to go from good to great animations.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-65.ico)Emil Kowalski![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-image-1.png)](https://emilkowal.ski/ui/good-vs-great-animations?ref=gorillasun.de) *No AI Corner section this week, didn't really come across anything interesting* 🤷 ## Music for Coding This week I enjoyed Glue Trip's dreamy, sun-soaked melodies, layered synths, and mellow vocals that all blend so seamlessly on their 2022 album *Nada Tropical*. Glue Trip is a Brazilian psychedelic pop band that you might remember from their 2013 hit track back titled "Elbow Pain": And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 98RampenSau v1.0 - Spectral.js 3 - Understanding Shader Functions - Livecoding Graphics in Lisp - Acerola on Perlin Noise - L-systems & Pattern Grammars - Federating a Microblog - Writing Useful Error Messages - Cookie Store API -![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-26.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-04-27-at-22.43.10.png)](https://www.gorillasun.de/blog/gorilla-newsletter-98) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 98 URL: https://www.gorillasun.de/blog/gorilla-newsletter-98/ Last updated: 2025-04-28T05:00:15.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 98th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**RampenSau v1.0 Color Ramp Generator**](https://meodai.github.io/rampensau/?ref=gorillasun.de): by now David Aerne (aka meodai) is known in the creative code scene for building many a cool color generation tool — RampenSau being one of them, for which he just recently released the 1.0 version: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-26-at-15.13.01.png) [Link to Post](https://x.com/meodai/status/1914358295306940658?ref=gorillasun.de) RampenSau is a lightweight, dependency-free and blazingly fast color generation library "perfect for generating color palettes for data visualizations, visual design, generative art, or just for fun". The lib can generate a broad variety of different colors by hue cycling in the HSL colorspace and using easing functions to interpolate between them — there's a cool codepen demo that demonstrates it in action, as well as an interactive doc page that lets you configure the ramp generation settings: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-26-at-17.22.36.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-22.17.45.png) [Link to demo](https://codepen.io/meodai/pen/ExQWwar?editors=0010&ref=gorillasun.de) As an aside, I really love the creative, play-on-words name of the lib! "Rampensau" is a German word, that in English translates to "stage hog" basically refers to people who love performing and being in the limelight — it's the perfect name for a tool that generates *vibrant* color *ramps*! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-21.47.24-1.png)](https://github.com/meodai?ref=gorillasun.de) Check out [David's impressive GitHub](https://github.com/meodai?ref=gorillasun.de) for some of the other color tools he's built! **2 —** [**Spectral.js 3 for Realistic Pigment Mixing**](https://onedayofcrypto.art/?ref=gorillasun.de): we're getting absolutely spoiled this week! Ronald van Wijnen also released the new and improved version of Spectral.js that brings a whole bunch of new improvements and features to the table, in addition to a whole website that lets you try it out: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-26-at-15.08.49.png)](https://x.com/OneDayOfCrypto/status/1915880914506096676?ref=gorillasun.de) [Link to Post](https://x.com/OneDayOfCrypto/status/1915880914506096676?ref=gorillasun.de) A few weeks ago (in [issue #86](https://www.gorillasun.de/blog/gorilla-newsletter-86/) of the newsletter) I already wrote about the Kubelka-Munk model and how it plays a central role in simulating realistic pigment mixing digitally — particularly for the MixBox library. Spectral.js implements a simplified version of it, for which Ronald outlines some details over on GitHub: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-22.23.29.png)](https://github.com/rvanwijnen/spectral.js?ref=gorillasun.de) [GitHub Repo](https://github.com/rvanwijnen/spectral.js?ref=gorillasun.de) And the lib works splendidly, I used it in this sketch of mine to achieve some super vibrant gradient colors: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/image-8-1.png) Go and give the lib a try in your next sketch! Besides this, I'm also super humbled to have both David and Ronald in the discord, occasionally sharing some of their creations — if you want to shoot them a message or ask about their tools, doing so in the discord might be the best way to go about it! **3 —** [**Acerola on Perlin Noise**](https://www.youtube.com/watch?v=DxUY42r%5F6Cg&ref=gorillasun.de): Perlin Noise is without a doubt a behemoth of an algorithm, not only in generative art and creative coding, but also computer graphics at large. With a new video of his, Acerola gives us a break-down at the inner workings of the algo, and how it's several layers of pseudo-random number generation stacked on top of each other: **4 —** [**Getting Started with Shader Functions**](https://rherault.dev/articles/learn-with-me-shaders-functions?ref=gorillasun.de): we double down this week with another GLSL tutorial, this time honing in on the individual functions that are provided by the shader language that enable many computations directly out of the box — Romain Herault explains how to use the step, mix, and smoothstep functions effectively: [Learn with me: Getting Started with Shader Functions (step, mix, smoothstep) - Romain HeraultJoin me as I learn GLSL shader functions! We’ll explore step, mix, and smoothstep with interactive Three.js examples and fun challenges.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-61.ico)Romain Herault![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/image-2)](https://rherault.dev/articles/learn-with-me-shaders-functions?ref=gorillasun.de) **5 —** [**Livecoding Graphics in Lisp**](https://kevingal.com/blog/cl-livecoding.html?ref=gorillasun.de): now I don't know the first thing about Lisp programming, but I was super intrigued by this cool graphics live-coding tutorial from Kevin Galligan, where he shows us how the language makes it possible to rerun a sketch during runtime for instantaneous updates using a flocking skech: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-21.34.33.png) [Link to Post](https://kevingal.com/blog/cl-livecoding.html?ref=gorillasun.de) **6 — L-systems & Pattern Grammars**: we've been hard at work behind the scenes at fxhash, and there's big things coming that are going to open up a lot of new avenues in generative art — I'm infinitely excited to be among the first to explore an entirely new generative artform! While I won't reveal too much yet, I've been working on a new project that fits into this new scheme, revolving in its entirety around L-systems and how they can be leveraged to create interesting pixel patterns — here's the little visualizer I've built to test my project: 0:00 /0:43 1× [Link to Post](https://x.com/gorillasu/status/1915488916406493524?ref=gorillasun.de) **7 —** [**Gorilla Inspired Sketch out in the Wild**](https://www.reddit.com/r/generative/comments/1jscd06/generative%5Fflowers/?ref=gorillasun.de): and to cap off, wanted to share this lovely cover of a flower sketch of mine from way back when from redditor liszstbrain — discovered out in the wild while browsing the r/generative subreddit: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-26-at-16.20.10.png)](https://www.reddit.com/r/generative/comments/1jscd06/generative%5Fflowers/?ref=gorillasun.de) [Link to Post](https://www.reddit.com/r/generative/comments/1jscd06/generative%5Fflowers/?ref=gorillasun.de) And if you're curious about the inspiration, it's the banner of this P5 guide I wrote back in May of 2023 (almost 2 years ago now 😱): [Getting started with P5JSIn this post we’ll have a look at p5.js, a creative coding and generative art javascript library. We’ll setup our first project, learn how to draw some shapes and get started on our creative coding journey.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-24.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/plantsmember-1.png)](https://www.gorillasun.de/blog/getting-started-with-p5js/) ## Dev & Web Tech **1 —** [**Creating a federated Microblog**](https://fedify.dev/tutorial/microblog?ref=gorillasun.de): after a year in the making, Ghost has recently brought all of the blogs powered by their service to the Fediverse. This means that you can now follow the Gorilla Sun Blog from any service that makes it possible to follow ActivityPub accounts — via ***@gorilla@gorillasun.de*** The framework they've used as a foundation for their own implementation is Fedify — a TypeScript library for building federated server apps powered by the [ActivityPub](https://www.w3.org/TR/activitypub/?ref=gorillasun.de) protocol. You can read about the entire development journey through the dedicated newsletter they've spun up for this purpose — I found it highly interesting to follow along over the past months: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-12.53.06.png)](https://activitypub.ghost.org/day4/?ref=gorillasun.de) [Link to Post](https://activitypub.ghost.org/day4/?ref=gorillasun.de) Now if you were to spin up your own self-hosted Ghost instance, you'll also be able to fedify it — which I find wildly exciting! You don't just get a CMS + newsletter tool, but also the ability to tap into a massive network for a potential audience. Naturally, if you're running your own non-Ghost blog, you'll also be able to fedify it — I'm not certain if it's a new post or not, but there's a massive tutorial over on the Fedify docs that shows how to do it: [Creating your own federated microblog | FedifyIn this tutorial, we will build a small microblog that implements the ActivityPub protocol, similar to Mastodon or Misskey, using Fedify, an ActivityPub server framework.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-192x192.png)Fedify![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/03a63032-03aa-481e-aa31-091809a49043)](https://fedify.dev/tutorial/microblog?ref=gorillasun.de) **2 —** [**Writing Useful Error Messages**](https://piccalil.li/blog/how-to-write-error-messages-that-actually-help-users-rather-than-frustrate-them?ref=gorillasun.de): and a new post from one of my favorite dev blogs; Amy Hupe explains how to write meaningful error messages that are human readable, action-oriented, and give a clear way forward for the user that may have run into an error: [How to write error messages that actually help users rather than frustrate themOne of the most consistently neglected parts of today’s user experiences is our handling of errors. We’re so busy designing the happy paths through our products that we often forget to give the same care and attention to the times when things will go wrong![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-31.png)PiccalilliAmy Hupe![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/png-3)](https://piccalil.li/blog/how-to-write-error-messages-that-actually-help-users-rather-than-frustrate-them?ref=gorillasun.de) **3 —** [**The new Cookie Store API**](https://fotis.xyz/posts/the-new-cookie-store-api?ref=gorillasun.de): The new(er) [Cookie Store API](https://developer.mozilla.org/en-US/docs/Web/API/Cookie%5FStore%5FAPI?ref=gorillasun.de) is starting to become a reliable standard for cookie management, with the newest version of safari having just rolled out support for it. It's an improvement to the previous [document.cookie interface](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie?ref=gorillasun.de) by providing asynchronous access to cookies, less back-and-forth serialization, as well as introducing more standardization across different cookie libraries — Fotis Papadogeorgopoulos explains how to use the API and how to account for browsers that might not yet support the feature: [The new Cookie Store APIIntroducing the relatively new Cookie Store API, and what it means for web applications.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-128x128.png)Fotis PapadogeorgopoulosFotis Papadogeorgopoulos![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-2.png)](https://fotis.xyz/posts/the-new-cookie-store-api?ref=gorillasun.de) **4 —** [**Making Sites Keyboard Navigable**](https://www.smashingmagazine.com/2025/04/what-mean-site-be-keyboard-navigable/?ref=gorillasun.de): the drawback of flashy, modern, and interactive designs is that they're often severely lacking in terms of accessibility — a new post from Smashing Magazine shows us the dos-and-donts of making website keyboard navigable, using clear focus indicators to indicate where you currently are on the page, as well as following a logical tab order: [What Does It Really Mean For A Site To Be Keyboard Navigable — Smashing MagazineKeyboard navigation is a vital aspect of accessible web design, and a detail-oriented approach is crucial. Prioritizing keyboard navigation prioritizes the user experience for a diverse audience, extending your reach while simultaneously fostering a more inclusive web environment.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-18.svg)Smashing MagazineEleanor Hecks![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/what-mean-site-be-keyboard-navigable.jpg)](https://www.smashingmagazine.com/2025/04/what-mean-site-be-keyboard-navigable/?ref=gorillasun.de) **5 —** [**Why does JSON have commas?**](https://simonsafar.com/2025/json%5Fwith%5Fno%5Fcommas/?ref=gorillasun.de): Simon Safar wrote a short post about the nonnecessity of commas in JSON, and why their addition "feels like an evil plan to have more syntax errors, with no obvious benefit." ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-27-at-20.29.35.png) [Link to Post](https://simonsafar.com/2025/json%5Fwith%5Fno%5Fcommas/?ref=gorillasun.de) And I wouldn't have included the post if there wasn't also a [stimulating discussion over on Hacker News](https://news.ycombinator.com/item?id=43599649&ref=gorillasun.de) about it 😆 ## AI Corner **1 —** [**The Post-Developer Era**](https://www.joshwcomeau.com/blog/the-post-developer-era/?ref=gorillasun.de): two years after GPT-4 first sparked fears about AI taking over coding jobs, Josh Comeau chimes in on the big debate whether our machinized overlords would take over or not. He points out that the current discourse around AI is often misleading, at least to non-programmers, where it's made seem to be that AI itself is doing the programming: [The Post-Developer Era • Josh W. ComeauWhen OpenAI released GPT-4 back in March 2023, they kickstarted the AI revolution. The consensus online was that front-end development jobs would be totally eliminated within a year or two.Well, it’s been more than two years since then, and I thought it was worth revisiting some of those early predictions, and seeing if we can glean any insights about where things are headed.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-27.png)Josh W. Comeau![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-the-post-developer-era.jpg)](https://www.joshwcomeau.com/blog/the-post-developer-era/?ref=gorillasun.de) In my humble opinion, we're still very, very far away from AI getting even close to replacing real devs, and echoing Josh's words: while AI is a powerful tool, it’s here to enhance, not replace, human developers. Staying skilled and adaptable will keep developers valuable in the evolving tech landscape. **2 —** [**Adopting AI-assisted coding workflows**](https://x.com/karpathy/status/1915581920022585597?ref=gorillasun.de): on that note, here's some top notch practicable advice from Andrej Karpathy on how to actually use AI coding assistants — in a non-vibe-coded manner — that allows the production of clean code rather than big spaghetti messes: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-25-at-14.53.14.png)](https://x.com/karpathy/status/1915581920022585597?ref=gorillasun.de) [Link to Post](https://x.com/karpathy/status/1915581920022585597?ref=gorillasun.de) **3 —** [**Why AI company logos look like buttholes**](https://velvetshark.com/ai-company-logos-that-look-like-buttholes?ref=gorillasun.de): and to cap things off, a humorous article by Radek Sienkiewicz that examines the questionable anatomical design of many an AI company's logo: [Why do AI company logos look like buttholes?A humorous exploration of the uncanny resemblance between AI company logos and human anatomy. Discover why circular, gradient-based designs dominate the AI industry, and what this design convergence tells us about branding in tech.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-62.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/why-do-AI-company-logos-look-like-buttholes.png)](https://velvetshark.com/ai-company-logos-that-look-like-buttholes?ref=gorillasun.de) ## Music for Coding Who would've thought that chillrave is my kind of music?! While going through some YoutTube playlists I came across a stellar track titled Nemova, made by Geju. I was immediately hooked and had to explore more of Geju's — they've posted quite a few albums and mixtapes that I think are all worth checking out. Turns out that chillrave, combined with slow house and ritualistic sounds is perfect for writing and programming: And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 97Programming WebGL Gradients - Painting with Evolutionary Algorithms - Hydra JS Tutorial Series - Bilinear Interpolation of Quad Meshes - Jonas Lund’s Network Maintenance - Shaders in SQL - WebKit’s text-wrap: pretty - Over-engineering Anchor Links - h1 Default Styling Changes![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-25.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/BeFunky-collage-3--1-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-97) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 97 URL: https://www.gorillasun.de/blog/gorilla-newsletter-97/ Last updated: 2025-04-21T05:00:20.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 97th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**A flowing WebGL gradient, deconstructed**](https://alexharri.com/blog/webgl-gradients?ref=gorillasun.de): top of the list this week is a massive shader tutorial by Alex Harri. He teaches us how to program colorful and flow-y gradients in WebGL, explaining each individual line of code in minute detail. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-19-at-15.27.06.png)](https://alexharri.com/blog/webgl-gradients?ref=gorillasun.de) [Link to Tutorial](https://alexharri.com/blog/webgl-gradients?ref=gorillasun.de) **2 —** [**Painting with Evolutionary Algorithms**](https://x.com/mattdesl/status/1909309607694020683?ref=gorillasun.de): Matt DesLauriers' been playing with SNES — no, not the *Super Nintendo Entertainment System* — but rather the evolutionary optimization algorithm "Separable Natural Evolutionary Strategy", that's designed to solve high-dimensional black-box problems efficiently. In a nutshell, evolutionary algorithms are useful when it comes to solving, or optimizing problems where the ‘fitness’ function is either unknown or too complex to be modeled directly. In a post he recently shared, he tasks 200 randomly colored and positioned rectangles to self-assemble into a re-creation of an image of the Mona Lisa, in an attempt to match it as closely as possible. 0:00 /0:14 1× [Link to Post](https://x.com/mattdesl/status/1909309607694020683?ref=gorillasun.de) Using SNES for something like evolving rectangles to match a target image, you'd first start by defining a solution as a long list of numbers—for example, each rectangle might have 7 values (x and y coordinate position, size in width and height, and RGB colors), so 200 rectangles means 1400 values per solution. SNES then samples random candidate solutions, rendering these sets of rectangles into an image, and comparing to the target image via pixel-wise difference to get a fitness score — which is then used to figure out how to improve. Obviously there's also a numerical distribution and a type of natural gradient involved to make this happen. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-19-at-13.52.28.png)](https://people.idsia.ch/~juergen/xNES2010gecco.pdf?ref=gorillasun.de) [Link to Paper](https://people.idsia.ch/~juergen/xNES2010gecco.pdf?ref=gorillasun.de) For a much more technical explanation of how this works I recommend reading through the paper that originally introduced the family of algos "Exponential Natural Evolution Strategies" by T Glasmachers et. al., which is directly referenced by Matt in his generously open-sourced implementation over on GitHub: [GitHub - mattdesl/snes: Separable Natural Evolution Strategy in JavaScriptSeparable Natural Evolution Strategy in JavaScript - mattdesl/snes![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-18.svg)GitHubmattdesl![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/snes)](https://github.com/mattdesl/snes?ref=gorillasun.de) **3 —** [**Hydra Tutorial Series for Everyone**](https://www.creativeapplications.net/tutorial/hydra-tutorial-series-for-everyone/?ref=gorillasun.de): Hydra is a live-coding environment for creating real-time visuals using JavaScript (that compiles to WebGL under the hood). The syntax is inspired by analog modular synthesis, in which chaining or patching transformations (functions in this case) together can generate varying visual results. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-19-at-12.25.57.png)](https://hydra.ojack.xyz/?sketch%5Fid=ritchse%5F3&ref=gorillasun.de) [Try it out for yourself here](https://hydra.ojack.xyz/?sketch%5Fid=ritchse%5F3&ref=gorillasun.de) Naoto Hieda is a creative coder that's primarily been using Hydra for his artistic experiments. Naoto treats YouTube as an open notebook, to experiment in public such that each video acts like a performative creative session in which ideas are allowed to flow naturally. Naoto has recently restarted a tutorial series for beginners, with the only requirement to be able to type in some way: [Hydra Tutorial Series for EveryoneThis series isn’t a conventional step-by-step coding tutorial. It’s more about Naoto showing how he explores ideas, tries things and learns through doing. He makes mistakes, remixes things, and follows unexpected paths.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-4.png)CreativeApplications.NetFilip![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/vlcsnap-2025-04-09-20h33m47s167-1.jpg)](https://www.creativeapplications.net/tutorial/hydra-tutorial-series-for-everyone/?ref=gorillasun.de) Naoto tries to give back to the community by creating these kinds of educative materials — in just a few years Hydra has attracted a global community around it. The software tool was introduced a few years ago by Olivia Jack, if you'd like an excellent intro and the backstory behind Hydra I recommend giving this JSConf talk from 2019 a watch: **4 —** [**Network Maintenance – A Node in the Living System**](https://www.creativeapplications.net/project/network-maintenance-a-node-in-the-living-system/?ref=gorillasun.de): is an art installation created by Jonas Lund that features a number of wall-mounted devices, that require regular interaction from visitors to stay active. Each device has a screen and controls where viewers need to press buttons or respond to patterns to keep device active and alive, simultaneously contributing to the health of the entire network of interconnected devices. [Network Maintenance – A node in the living systemNetwork Maintenance is a series of networked wall-mounted devices that explore the relationship between ownership, care, and collective responsibility. Each device consists of a custom construction housing, a display, and number of analog controls. The device function as a node in an interconnected![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-5.png)CreativeApplications.Netssssyan![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/OfficeImpart_JonasLund_MBP-1-1400x1750-cover.jpg)](https://www.creativeapplications.net/project/network-maintenance-a-node-in-the-living-system/?ref=gorillasun.de) Inspired by quantum mechanics, where entangled particles influence each other, the screens display the network’s health, showing things like stability and connectivity depending on how participants engage with them. If people stop interacting, the devices begin to decay. The installation is currently on display at Art Düsseldorf with OFFICE IMPART — which I will have to go and see since I'm based here 😆 conceptually the artwork invites people to think about how we’re all interconnected, and highlights how our individual efforts can help sustain a larger community. **5 —** [**A better Method for shading split Quads**](https://gpuopen.com/learn/bilinear-interpolation-quadrilateral-barycentric-coordinates/?ref=gorillasun.de): a recent article from AMD introduces a new method to preserve smoothness over the common edge that's formed by splitting quadrilaterals into two triangles. [Bilinear interpolation on a quadrilateral using Barycentric coordinatesA new algebraic method for hardware-accelerated bilinear interpolation on convex quadrilaterals is presented, using the Barycentric coordinate feature of modern GPUs.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-correct_red_chip_500px-270x270.png)AMD GPUOpen![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/bilinearquad.jpg)](https://gpuopen.com/learn/bilinear-interpolation-quadrilateral-barycentric-coordinates/?ref=gorillasun.de) Modern graphics hardware is entirely geared towards handling triangle meshes, whereas 3D artists apparently prefer using quads for modelling assets. The issue that ensues when quads are displayed on screen, is that they get split into two triangles, creating a visible line or seam across the diagonal. This often causes noticeable visual problems during shading, texturing, and lighting. The core problem is that graphics hardware only understands triangles and barycentric coordinates (the standard way graphics hardware calculates positions and properties inside triangles), whereas artists expect bilinear blending to happen on their quads (bilinear interpolation being the natural way to blend properties across a four-sided shape). The novelty of the article: AMD basically found a formula that converts between these two systems and that can interpolate color and texture across the two triangles seamlessly, pretending that it's still a quad. The maths is also directly implemented in the graphics pipeline, which makes it quite efficient. **6 —** [**Shaders in SQL**](https://x.com/geocucu%5Ft/status/1909291486367166717?ref=gorillasun.de): we reach new levels of what you would call "cursed" with George's GLSQL shader 😅 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-12-at-12.36.01.png)](https://x.com/geocucu%5Ft/status/1909291486367166717?ref=gorillasun.de) [Link to Post](https://x.com/geocucu%5Ft/status/1909291486367166717?ref=gorillasun.de) I have no idea what's going on here, but in one of the replies he states that he's: > Software rendering with sqlite as the compute engine. Every stage of the pipeline is its own table. Blit the framebuffer table with winapi at the end. My interpretation of this: he's rebuilt a rendering pipeline as a series of data transformations (what SQL was actually designed for), such that each rendering stage is represented by its own table. Naturally, it's dramatically slower that GLSL — but if we can have DOOM in TypeScript types, then why not have GLSL in SQL? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/image-6.png) Digging into some of the other replies on the post, I came across this other gem; apparently some crazy person has previously also made a raytracer in SQL, because why the heck not 😆 here's the GitHub repo for that project. [GitHub - chunky/sqlraytracer: Everyone writes a Raytracer eventually. This is mine.Everyone writes a Raytracer eventually. This is mine. - chunky/sqlraytracer![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-19.svg)GitHubchunky![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/sqlraytracer)](https://github.com/chunky/sqlraytracer?ref=gorillasun.de) I eagerly await further updates from George and his SQL powered shader renderer — ideally a juicy blog post for me to share on the newsletter! ## Dev & Web Tech **1 —** [**Better typography with text-wrap pretty**](https://webkit.org/blog/16547/better-typography-with-text-wrap-pretty/?ref=gorillasun.de): I was a bit confused by this article from the WebKit team — I had assumed that the `text-wrap: pretty` rule was already a feature of most browsers, but apparently it's up to each individual browser vendor to implement their own text-wrapping algorithm for rule. Here, Jen Simmons explains how they go about implementing the algo: [Better typography with text-wrap prettySupport for text-wrap: pretty just shipped in Safari Technology Preview, bringing an unprecedented level of polish to typography on the web.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-58.ico)WebKitJen Simmons![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/bad-typography-SM-light.png)](https://webkit.org/blog/16547/better-typography-with-text-wrap-pretty/?ref=gorillasun.de) Jen goes over some of the considerations that make for a text's readability, like the impact orphan words, hyphenation, and the right-end rag of a text-block can have, comparing to other options like `text-wrap: balance` that's great for making headlines look neat and tidy, and shares insights on how the other browsers are adopting the feature. She also points out that text-wrapping is actually an innocuously difficult optimization problem — over on Hacker News there were some interesting discussions on the topic that are worth digging into 👇 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-20-at-22.51.44.png)](https://news.ycombinator.com/item?id=43622703&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=43622703&ref=gorillasun.de) **2 —** [**Overengineering anchor links**](https://thirty-five.com/overengineered-anchoring?ref=gorillasun.de): I'm of the strong opinion that every blog/article on the web should have a TOC (Table of Content) — not just to give a quick visual overview of the text's different sections — but also as a handy navigation element. If you ever tried building your own TOC, and tried to have the section title in the table highlighted in tandem with the one that's currently displayed on screen, you'll quickly realize that you've run into a big pile of different problems. Mats Erdkamp tackles this task and demonstrates a highly over-engineered approach to building one: [Overengineered anchor links - 35®Learn about the ‘overengineered anchoring’ pattern, a technique to improve the user experience of scrollable content.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-17.svg)35Mats Erdkamp![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-1.png)](https://thirty-five.com/overengineered-anchoring?ref=gorillasun.de) Mats not only ends up using virtual headings — hidden headings that are positioned differently on the page than their real counterparts — but also builds a custom mapping function that leverages of a full fledged optimization algorithm (SQLS). As ingenious as it is, it's most likely overkill for all practical purposes (if you just want to highlight section titles in a TOC). That said, I'll likely try and recreate it whenever I get back to revamping my blog's design. **3 —** [**Default styles for h1 elements are changing**](https://developer.mozilla.org/en-US/blog/h1-element-styles/?ref=gorillasun.de): Browsers are updating how they style `

` headings inside sections, articles, navs, and asides. Previously, when an `

` was placed within a `
`, it would automatically look like an `

` so that it fits into the hierarchy. Now, all `

` tags will have the same size regardless of where they are placed. This change means websites that depended on these automatic styles might now display headings inconsistently or even fail website performance checks. Simon Pieters from the MDN Web Docs explains: [Default styles for h1 elements are changing | MDN BlogBrowsers are starting to roll out changes in default UA styles for nested section headings. This post describes the incoming changes, how to identify if it’s an issue on your websites, and hints for conformant and better-structured pages.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-48x48.bc390275e955dacb2e65.png)MDN Web DocsSimon Pieters![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/featured-1.png)](https://developer.mozilla.org/en-US/blog/h1-element-styles?ref=gorillasun.de) **4 —** [**Gumroad is now open-source... or is it?**](https://gumroad.gumroad.com/p/gumroad-is-now-open-source?ref=gorillasun.de): earlier this month Gumroad celebrated its 14th birthday. For the occasion they announced that the platform's code-base has been open-sourced! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-20-at-20.13.50.png) [Link to Announcement](https://gumroad.gumroad.com/p/gumroad-is-now-open-source?ref=gorillasun.de) Well, that's what they claim at least, when inspecting [the license of the GitHub repository](https://github.com/antiwork/gumroad?ref=gorillasun.de) things look a little different, as it's distributed under a custom license that sets limits on who can use the code for monetization purposes, which doesn't directly agree with what's generally understood as "open source". Dan Brown examines what's going on with the license in a post of his: [No, Gumroad Did Not Become Open Source Today · Danb BlogAdvisory: I am not a legal expert and there could likely be inaccuracies in this post. Today Gumroad announced that they’ve become open source, with this being echoed by the founder and on social sites like Hacker News:![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-60.ico)Danb Blog![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/gumroad_x.png)](https://danb.me/blog/gumroad-is-not-open-source/?ref=gorillasun.de) **5 —** [**Tweaking Text Level Styles, Reprised**](https://adrianroselli.com/2025/04/tweaking-text-level-styles-reprised.html?ref=gorillasun.de): Adrian Roselli shares a comprehensive guide to properly using and styling text-level HTML elements including ``, ``, ``, and ``, with detailed information about their default browser styles, recommended enhancements, print considerations, and screen reader behavior across different platforms. [Tweaking Text Level Styles, ReprisedIn 2017 I wrote Tweaking Text Level Styles (terrible name in retrospect) and I made regular updates over the years. Stop reading it. Remove it from your bookmarks. Unlink it from your posts. Print it onto paper and then burn it. Demo Wrap-up The conclusions and…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-26.png)Adrian RoselliJedi![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/text-semantics_thumb-300x300.jpg)](https://adrianroselli.com/2025/04/tweaking-text-level-styles-reprised.html?ref=gorillasun.de) He also makes abundantly clear that it's a replacement to his 2017 post on the same topic. **6 —** [**Et tu, Grammarly?**](https://dbushell.com/2025/03/29/et-tu-grammarly/?ref=gorillasun.de): after receiving repeated complaints from users about his website being oddly styled, David Bushell was forced to investigate. It turned out that the Grammarly browser extension was injecting styles that interefered with the site’s own native design. [Et tu, Grammarly?The one where I deploy counter defences![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/180x180.png)dbushell.comDavid Bushell![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/2025-03-29-et-tu-grammarly.png)](https://dbushell.com/2025/03/29/et-tu-grammarly/?ref=gorillasun.de) Turns out that Grammarly was using a CSS variable named `--rem`, which clashed with David’s own use of it for font sizing — resolving the conflicts boiled to changing the variable's name 🤷 Moral of the story... don't trust browser extensions? **7 —** [**The Best Programmers I Know**](https://endler.dev/2025/best-programmers/?ref=gorillasun.de): to cap off this section, Matthias Endler wrote a cool piece about the qualities that make out a top-notch programmer. [The Best Programmers I Know | Matthias EndlerI have met a lot of developers in my life. Late…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-59.ico)Matthias EndlerMatthias Endler![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/default.png)](https://endler.dev/2025/best-programmers?ref=gorillasun.de) Two big points he mentions, that I can only agree with, is that the best programmers: 1. Understand the tools they use on a fundamental level. As simple as that, they know the in and out of the tools they use to build things. 2. Never stop learning, stay ahead of the curb, and share their knowledge with others. Couldn't agree more, that some of the best programmers I admire are also great educators. ## AI Corner **1 —** [**Why I stopped using AI Code Editors**](https://lucianonooijen.com/blog/why-i-stopped-using-ai-code-editors/?ref=gorillasun.de): I've mentioned this a couple of times already, but when you start relying on AI code assistants too much, you're robbed of your intuition, and the ability to tap into your own "auto-pilot mode". Luciano Nooijen wrote a thoughtful piece about the deterioration of his programming skills in the context of these code assistants: [Why I stopped using AI code editors · Luciano NooijenIn the past I used AI code editors for all of my programming, but I stopped using it and recommend others to consider this as well![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-25.png)Luciano Nooijen](https://lucianonooijen.com/blog/why-i-stopped-using-ai-code-editors?ref=gorillasun.de) **2 —** [**Google is winning on every AI Front**](https://www.thealgorithmicbridge.com/p/google-is-winning-on-every-ai-front?ref=gorillasun.de): while it might seem that Google's DeepMind has been falling behind in the AI race (that's been my impression at least), Alberto Romero from the Algorithmic Bridge wrote a massive post on why this is apparently not the case. He shares a big list on how most of DeepMind's models currently rank highly on the benchmarks compared to the rest of the competition — benchmark-maxxing or not, it makes for quite an impressive list: [Google Is Winning on Every AI FrontNeither OpenAI nor Anthropic have a chance at this point![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com-2Fpublic-2Fimages-2Fad6f1ff5-550f-4f70-b9c8-244d5d1115ff-2Fapple-touch-icon-180x180.png)The Algorithmic BridgeAlberto Romero![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fc0b56a55-08ab-4b78-b5cc-daa5bf90b965_4056x1792.png)](https://www.thealgorithmicbridge.com/p/google-is-winning-on-every-ai-front?ref=gorillasun.de) ## Music for Coding Lazarus is a brand new animated series produced by Adult Swim, currently with a [rating of 7.8 on IMDb](https://www.imdb.com/title/tt28454008/?ref=gorillasun.de). Aesthetically it's reminiscent to Cowboy Bebop if you're a fan of that show, but with it's own unique visual identity. What's special is the soundtrack that was commissioned for it; produced by none other than Bonobo, who's one of my favorite artists. The soundtrack is reminiscent of some of Bonobo's early stuff, gritty, rich, and simply a joy to listen to. Honestly also a perfect fit for coding: Check out Bonobo's YouTube channel for the rest of the tracks. And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 96The Art of Pen Plotting - Interleaved Gradient Noise - Mondrian Shader - String Art in P5 - PIPO Creative Interfaces - GLSL Rubik’s Cube - CSS Item Flow Concept - CSS LQIPs - Microsoft OG Source Code - Anime.js v4 -![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-23.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-04-06-at-23.13.34-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-96) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 96 URL: https://www.gorillasun.de/blog/gorilla-newsletter-96/ Last updated: 2025-04-07T15:51:28.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 96th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things 1 — [The Art of Pen Plotting](https://penplotter.art/p/pen-plotter-art-history?ref=gorillasun.de): Jerad Maplethorp wrote a beautiful piece about how pen plotting evolved into a form of art; while pen plotters weren't originally intended for the purpose of bringing code-generated doodles onto paper — much rather for the creation of precise blueprints and circuit diagrams — the programmable drawing machines are now central to a modern artform. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-06-at-13.34.53.png)](https://penplotter.art/p/pen-plotter-art-history?ref=gorillasun.de) [Link to Article](https://penplotter.art/p/pen-plotter-art-history?ref=gorillasun.de) At the forefront we find pioneers like Frieder Nake, Vera Molnar, and Manfred Mohr (among many others) that all in their own ways came into contact with pen plotters back in the 50s, unknowingly laying the ground-work for what would become a global art movement today. Now we see artists do all sorts of interesting things with the machines, like Licia He's watercolor shenanigans, Adam Fuhrer's daily postcard sized doodles, or Daniel Catt's various experiments to name a few of my favorites. In fact, Jerad's blog only came to my attention through the most recent issue of Daniel Catt's newsletter, who's also one of the artists that I admire for his efforts in documenting his processes and endeavours so systematically for others to learn from. In issue #058 he updates us again about what he's been up to, and includes a kind shoutout right at the very top! 😄 [📙 #058 - Rated 15 for swearing & some f\*\*\*ing postcardsIs swearing in art big & clever? No? But is it funny? No? And has that stopped me? Also no! A photo essay of sorts.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fdbf7afe8-faf2-45f6-a369-638b2d09f43a-2Fapple-touch-icon-180x180-2.png)Drawing Machines & Notes from Art Studio RobotsDaniel Catt![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fa0f575e4-23a2-4580-a6bb-1e236c1f59ac_2048x1365.jpeg)](https://newsletter.revdancatt.com/p/058-rated-15-for-swearing-and-some?ref=gorillasun.de) Heads-up PG15 warning this time round 😆 As we keep ping-pong-ing shoutouts back and forth, it's starting to feel a little like a good old web-ring! Guess it's your turn now Jerad 🔫 there's also a couple more posts on Jerad's site worth checking out; fittingly titled Ink & Algorithms, it revolves entirely around the pen plotting practice. **2 —** [**Interleaved Gradient Noise**](https://blog.demofox.org/2022/01/01/interleaved-gradient-noise-a-different-kind-of-low-discrepancy-sequence/?ref=gorillasun.de): Unlike regular random noise, which can clump or leave gaps, Interleaved Gradient Noise (IGN) is a noise generation technique that ensures each small group of pixels has a balanced mix of sample points — it's a method that can be used whenever you need a per pixel random number in rendering. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/image-3.png) [Jorge Jimenez from the Activision team originally created IGN](https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare/?ref=gorillasun.de) to improve how games render smooth images during Temporal Anti-Aliasing (TAA), a technique that combines pixel information from past frames and the current frame to remove [jaggies](https://en.wikipedia.org/wiki/Jaggies?ref=gorillasun.de) in the current frame. During TAA pixels are sampled across several frames and then combined into a single image, and this sampling is done according to a noise distribution. IGN helps Temporal Anti-Aliasing (TAA) by spreading out pixel samples evenly across frames. [Interleaved Gradient Noise: A Different Kind of Low Discrepancy SequenceThe python code that goes along with this post can be found at In 2014, Jorge Jimenez from Activision presented a type of noise optimized for use with Temporal Anti Aliasing called Interleaved Grad…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-grand-teton.jpg)The blog at the bottom of the seademofox2![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/noisesbig.png)](https://blog.demofox.org/2022/01/01/interleaved-gradient-noise-a-different-kind-of-low-discrepancy-sequence/?ref=gorillasun.de) At least that's what I pieced together from the article. I also thought that the noise pattern's aesthetics were kinda interesting, and could probably be used for some genart purposes. Xor, through whom I discovered the article also shares what dithering looks like using IGN. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-05-at-14.06.07.png) [Link to Post](https://x.com/XorDev/status/1907526222848070001?ref=gorillasun.de) **3 —** [**Infinite Mondrian grid in GLSL**](https://bsky.app/profile/xordev.bsky.social/post/3llz2qglnq22a?ref=gorillasun.de): Xor doesn't only shares cool resources, but is also a certified GLSL code-golfing wizard. In a recent sketch, he showcases a continuously re-arranging Mondrian-esque grid that's done in only 169 characters 🤯 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/ScreenRecording2025-04-05at12.12.07-ezgif.com-optimize.gif) I never feel that just sharing these is enough, hence I tried to dive in and understand what's going on. Obviously because I'm an absolute GLSL noob, the first step was formatting the code into something readable and thentranslating it into a poor-man's shader version in P5 that I'm capable of wrapping my head around: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/gif.gif) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/gif-1-.gif) [Play around with the code for yourself here](https://editor.p5js.org/AhmadMoussa/sketches/XJXa%5FFjty?ref=gorillasun.de) | On the right you can see a zoomed out version that shows how the canvas is subdivided into rectangular regions. In essence, it's an elaborate sine wave based SDF that quantizes the canvas into individual rectangular regions, where each pixel is processed through with number of discrete, non-linear transformations to create the segmented color boundaries. I still don't have a complete mental model of how it works, but I think I just need to play around with the code a bit more. As always, de-tsubuyakifying these is such an incredibly rewarding exercise. **4 —** [**String Art in P5Js**](https://www.youtube.com/watch?v=qH7ZgQghKUU&ref=gorillasun.de): the prolific Patt Vira has continued to churn out one tutorial after another over on her YouTube channel; in a recent one she shows us how to simulate string art with P5\. String art is the practice of wrapping a thread around a circular configuration of nails or pins, such that the thread overlaps with itself to create darker and lighter areas and recreates an image in the process — just like what you see in the thumbnail below 👇 Way back when I first got started with creative coding I tried my hand at this algo, but I never actually got very far — turns out the secret sauce here is a greedy approach. In essence, for each pin we run a loop that finds the darkest possible pixel path to another pin by summing up the individual pixel values of an underlying grayscale image. Once that path is found we slightly brighten the values of the image's pixels, and slowly consume it until we've spun a maximal number of threads. **5 —** [**Pipo Interfaces for creative sensing**](https://www.creativeapplications.net/objects/pipo-interfaces-a-new-playground-for-creative-sensing/?ref=gorillasun.de): Pipo Interfaces offers a toolkit that makes adding sensors to creative projects simple and accessible, they provide small, affordable modules like for motion tracking, measuring distances, and touch inputs. They're easy to connect wirelessly and can work together or separately in various setups, perfect for creating interactive art installations or devices that depend on creative input. [Pipo Interfaces – A new playground for creative sensingPipo Interfaces brings a new versatile toolkit for creative sensing and audiovisual interaction in real-time. Developed by creative technologist Rupert Renevier, Pipo is a range of electronics sensor modules that simplify creative interactivity between people, real-world objects, and digital creatio![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-3.png)CreativeApplications.NetFilip![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Pipo-1.jpg)](https://www.creativeapplications.net/objects/pipo-interfaces-a-new-playground-for-creative-sensing/?ref=gorillasun.de) What sets Pipo apart is a user-friendly web interface, that lets you adjust settings directly from your phone without additional software; meaning that you can quickly tweak how your sensors respond, like changing MIDI notes or setting detection ranges. Plus, since it's open source and built with common platforms like Arduino, you can customize and expand your toolkit as needed. **6 —** [**Interactive GLSL Rubiks Cube**](https://www.shadertoy.com/view/w3lGRf?ref=gorillasun.de): kishimisu's built a fully functional Rubik's cube entirely with GLSL fragment shaders. You can try it out for yourself over on ShaderToy, where they also left us with a copious amount of comments that explain the code! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-05-at-13.23.11.png) [Link to ShaderToy Sketch](https://www.shadertoy.com/view/w3lGRf?ref=gorillasun.de) While checking in which issue of the newsletter I had mentioned them before, it turns out that they got a spot in the hall of fame for making it into a single digit issue number of the newsletter, namely [#5](https://www.gorillasun.de/blog/gorilla-recap-5/), where I shared their stellar video on creative shader coding. If you haven't seen that one yet, it's a must watch! **7 —** [**Grant Kott's Liquid Layers**](https://x.com/kotsoft/status/1907854001397277086?ref=gorillasun.de): when I first shared Grant Kott's liquid layers, I didn't know that he had granter plans for it 😛 in a video he shares his development roadmap for what he's going to work on next based on the feedback that he's received. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-04-at-18.25.36.png) [Link to Post](https://x.com/kotsoft/status/1907854001397277086?ref=gorillasun.de) **8 —** [**Raytraced Audio for Realistic 3D Audio**](https://www.youtube.com/watch?v=u6EuAUjq92k&ref=gorillasun.de): and to cap off, I'm throwing this one in as a wildcard, YouTuber Vercidium spent the last 7 years building a game engine and figured out a way to use raytracing for simulating realistic 3D audio. The video is a non-technical explainer on how it works. ## Dev & Web Tech **1 —** [**Item Flow layout concept**](https://webkit.org/blog/16587/item-flow-part-1-a-new-unified-concept-for-layout/?ref=gorillasun.de): the Safari team just dropped a proposal that unifies Flexbox, Grid, and Masonry layouts under one set of properties. Over the course of 2023 and up until the end of 2024 discussion concluded in two competing ideas, where Masonry was either a subset of CSS Grid, or its own layout rule. The people over at WebKit now throw both of these suggestions out the window, and propose a completely different approach. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/image.png) > The suggestion isn’t to combine all of Flexbox with all of Grid — but rather to create a new set of properties and values to “replace” specifically the `flex-flow` and `grid-auto-flow` properties. (You will always be able to use the older syntax if you prefer.) Think how originally the [Alignment properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS%5Fbox%5Falignment/Box%5Falignment?ref=gorillasun.de) and the[gap](https://developer.mozilla.org/en-US/docs/Web/CSS/gap?ref=gorillasun.de) property were defined to work only in one layout system, and then later got modified and extended to work in multiple layout contexts. [Item Flow, Part 1: A new unified concept for layoutCSS Grid and Flexbox brought incredible layout tools to the web, but they don’t yet do everything a designer might want.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-55.ico)WebKitJen Simmons, Saron Yitbarek, Elika Etemad, Brandon Stewart![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/masonry-options-2-1.jpg)](https://webkit.org/blog/16587/item-flow-part-1-a-new-unified-concept-for-layout/?ref=gorillasun.de) **2 —** [**Minimal CSS-only blurry image placeholders**](https://leanrada.com/notes/css-only-lqip/?ref=gorillasun.de): after surveying some of the different approaches that are popular for creating blurred image placeholders, Jordan Brennan introduces a clever CSS-only method for creating them. His approach makes use of a single custom property, known as LQIPs (low quality image placeholder), that doesn't require an extra markup or JavaScript. Jordan LQIP appriach packs image information — in this case a base color and a 3x2 grid of brightness components — into a 20-bit integer which is then decoded using pure CSS techniques like bit shifting and masking. He provides a bunch of interactive examples on the page to play around with. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-06-at-00.23.29.png) Additionally, the post discusses the challenges of achieving smooth gradients and seamless blending using CSS radial gradients. He implements quadratic easing to mimic bilinear interpolation, ensuring that the placeholders look natural and blend well with the final images. This innovative method not only reduces the need for bulky scripts but also showcases the power of CSS in handling complex visual tasks efficiently. **3 —** [**Microsoft Original Source Code**](https://www.gatesnotes.com/meet-bill/source-code/reader/microsoft-original-source-code?ref=gorillasun.de): Bill Gates celebrates Microsoft's 50th anniversary, not only by looking back on a semicentury of his brainchild existing and thriving, but also by sharing the original source code he wrote with Paul Allen in 1975 that would become their very first product. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/Screenshot-2025-04-05-at-11.25.09.png)](https://www.gatesnotes.com/meet-bill/source-code/reader/microsoft-original-source-code?ref=gorillasun.de) [Link to Article](https://www.gatesnotes.com/meet-bill/source-code/reader/microsoft-original-source-code?ref=gorillasun.de) The article is a retrospective of how the two of them wrote a BASIC interpreter for the Altair 8800 over the span of two months, which would also mark the birth of Microsoft. Worth pointing out is the excellent ASCII themed design of the page, with a subtle text hover/click effect that makes the individual letters flicker before they return to what they were, in addition to a really cool dither-esque load-in animation on the images included in the text. **4 —** [**Anime.js Javascript Animation Engine v4**](https://animejs.com/?ref=gorillasun.de): after 5 years in the making Julian Garnier releases his lightweight animation library — v4 of Anime.js boasts a new modular API, scroll-linked animations, draggables, WAAPI support, and so much more. The new landing page is also an artwork in of itself, demonstrating the capabilities of the library: [Anime.js | JavaScript Animation EngineA fast and versatile JavaScript animation library![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-24.png)anime.js logo v4![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/anime-js-sharing-image.png)](https://animejs.com/?ref=gorillasun.de) **5 —** [**Kevin Powell vs. Andy Bell CSS Battle**](https://www.youtube.com/watch?v=TyCbg7YWaXo&ref=gorillasun.de): in a recent video our favorite web dev YouTuber Kevin Powell challenges none other than Andy Bell from the Picalilli Blog to a CSS battle. In four 10 minute rounds they're tasked with matching a target layout and design, where the one to finish first wins, or whomever matches the design more closely if the time runs out. Turns out that seemingly simple layouts can sometimes be quite tricky to whip up from scratch. It was also interesting to see the different approaches that the two of them took to match the target layout, and how they were both entirely different to my own initial ideas, showing me that my CSS brain is wired in an entirely different way 😅 I think this really highlights the beauty and versatility of CSS — a big toolbox that lets you mix and match different rules to achieve the same thing in multiple ways. If you'd like to challenge your friends and/or colleagues to a round or two of CSS battle, you can do so [here](https://cssbattle.dev/?ref=gorillasun.de). ## AI Corner **1 —** [**Browse No More**](https://paulstamatiou.com/browse-no-more?ref=gorillasun.de): Paul Stamatiou, aka Stammy, shares his shift from traditional web browsing to using LLMs for quick answers — while these AI engines save time, he misses the unique and surprising discoveries that come from exploring different websites and forums. He highlights that what gets lost in translation, due to the uniform responses of LLMs, are the personal human touches that made exploring the internet engaging. [Browse No MoreI’m no longer browsing the web; I’m consuming AI answers instead. I love and adore today’s so-called AI answer engines: tools like ChatGPT, Perplexity, Grok, Copilot, and Gemini. I use them at least a dozen times throughout the day, and I’m sure you use them frequently as well. Their convenience is![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-30.png)Paul StamatiouPaul Stamatiou![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/stammy-ai-answer-engines-3.webp)](https://paulstamatiou.com/browse-no-more?ref=gorillasun.de) Using LLMs for quick answers is largely the same approach I have adopted in the past years — for example, I never really enjoyed StackOverflow, and now there's really no reason to visit the site anymore because I can just quickly ask ChatGPT why my div isn't centered; but at the same time I'm missing out on tapping into exchanges other brains have had on the internet before me, or picking up on tangential information that might be useful and interesting in of itself. Stammy believes that one way to improve these AI systems would be by adding thoughtful personalization, allowing them to understand individual preferences without being overwhelming. **2 —** [**GPT-40 Image Mania**](https://www.youtube.com/watch?v=Bt-7YiNBvLE&ref=gorillasun.de): you've likely taken notice of the entire studio Ghibli dilemma unfold over on social media in the past week, which I've consciously decided not to engage with. As always, FireShip was quick to make a video on the topic; all of this ensued after OpenAI added an image generator to their GPT-4o model, that might be a little too good for its own sake. For instance, it's really good at character continuity, text rendering that was up to this point a big weak point for all image gen models. Obviously it's also really good at turning your favorite memes into the style that you desire — particularly studio Ghibli that somehow escaped OpenAI's content guardrails. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/04/image-5.png) ## Music for Coding For some late night coding and reading I often enjoy listening to some minimal techno; and a recent discovery of mine in the genre is HOZHO, a portuguese producer and DJ who's created somewhat of his own niche labeled as Melodark Minimal. His album Yin Yang is such an effortless listen, that's really perfect for fueling thinking tasks without being distracting. And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 95The HTML Review 2025 - The Rivulet Esolang - DDA Algorithm Explained - DIY Synths Database - Writing Blog Posts for Devs - Programming an Undo Stack - CSS Gap Decorations Proposal - LLM Agents are simply Graphs![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-22.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/pattern-1--1-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-95) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 95 URL: https://www.gorillasun.de/blog/gorilla-newsletter-95/ Last updated: 2026-06-19T14:08:16.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 95th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**The HTML Review 2025**](https://thehtml.review/04/?ref=gorillasun.de): *the html review* is a collection of artful, poetic, and web native pieces of story-telling — or more simply: *an annual journal of literature made to exist on the web*. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-29-at-11.05.05.png) This year features a series of very personal, somewhat esoteric, web experiences that act as direct commentaries on our digital existences on the web, where the storytelling deeply is intertwined with the tech itself. A couple of my favorites this time round: - [Navigation Queues Navigation Cues](https://navigation-queues-navigation-cues.f451.studio/?ref=gorillasun.de) doesn't only tell you the history of scrollbars but also comments on the contemporary role that *scrolling* plays in our lives, how it's no longer an active act of exploration, but rather a way for getting lost. - [Cavity!](https://thehtml.review/04/cavity/?ref=gorillasun.de) tells its story in a non-sequential manner, simply by letting you uncover the individual text nodes, but still conveying a sense of sequence through the graph structure in the background — that I believe you are meant to disentangle. - In [I want my computer to forget like I do](https://www.blairs.computer/?ref=gorillasun.de) the author downloads their files onto the viewers machine in an irreversible manner — tasking you with holding on to and safekeeping them until they might be needed again in the future. Thank you for the digital burden... 😅 But that's just a few of the works that I personally enjoyed among many others. I highly recommend taking a few moments and checking them out for yourself. Also have a look at the HTML reviews of previous years — I covered the 2024 issue in newsletter [#49](https://www.gorillasun.de/blog/gorilla-newsletter-49/). **2 —** [**The Rivulet Programming Language**](https://github.com/rottytooth/Rivulet?ref=gorillasun.de): if it weren't for the HTML review, this one would have easily taken the top spot in this week's roundup — Rivulet is an esoteric, list-based programming language that encodes its operations as flowing semigraphic character strands within block-like glyphs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-30-at-23.41.34.png) A Fibonacci program in Rivulet Glyphs can be arranged vertically or horizontally, delineated by a beginning marker `╵` in the upper left corner and ending with a `╷` at the bottom right — different instructions are then executed as the glyph is traversed. Four different types of strands specify what instructions should be executed: value strands write numbers into lists, reference strands point to specific cells, action strands that modify these values using arithmetic operations, and paired question strands that test conditions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-30-at-15.41.11.png) So instead of traditional loops or if-statements, every strand in a glyph runs in a set visual order where the layout itself dictates the program’s logic and execution, with conditional branching and rollbacks, creating an interesting maze-like flow. [GitHub - rottytooth/RivuletContribute to rottytooth/Rivulet development by creating an account on GitHub.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-12.svg)GitHubrottytooth![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Rivulet)](https://github.com/rottytooth/Rivulet?ref=gorillasun.de) If you're interested, check out the official GitHub repo. **3 —** [**The DDA Algorithm**](https://aaaa.sh/creatures/dda-algorithm-interactive/?ref=gorillasun.de): in a nutshell, the Digital Differential Analyzer (DDA) algorithm is an efficient method for drawing straight lines on our screens — which, as you might be aware of, are discrete pixel grids. In essence, it lets us determine which pixels need to be turned on to visualize lines, based on how the line at hand arithmetically travels through these pixels. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-29-at-12.17.29.png) [Link to Article](https://aaaa.sh/creatures/dda-algorithm-interactive/?ref=gorillasun.de) While its effect is rather simple to grasp, implementing it can be a bit tricky because it involves quite a bit of math; that's why Joshua Michael wrote this wonderful interactive article about the algorithm showing us all the small mathematical parts that make it work. **4 —** [**Our interfaces have lost their senses**](https://wattenberger.com/thoughts/our-interfaces-have-lost-their-senses?ref=gorillasun.de): Amelia Wattenberger writes as beautifully as ever, in her most recent post she talks about how our digital interfaces have become increasingly flat and text-based, stripping away the texture, sound, and tactile feedback that make interactions more organic, immersive, and satisfying. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-29-at-11.40.43.png) The key-takeaway here is that different modalities of interaction that play into our sense can potentially allow for richer ways to manipulate our daily digital playgrounds, and align more with the way our brains function and the ways that we think. **5 —** [**DIY Synths Database**](https://diy-synths.snnkv.com/?ref=gorillasun.de): while we're talking about being hands-on, check out this collection of 50+ standalone open source synth builds, ranging from newbie projects all the way to more complex ones. [DIY synths databaseCurated collection of DIY-friendly hardware synthesizers and related musical equipment you can build on your own. All open source.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-53.ico)diy-synths.snnkv.com![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/norns-og-1.jpg)](https://diy-synths.snnkv.com/?ref=gorillasun.de) Each synth listed links to a project page over on GitHub where you can find the required materials, 3D printables, instructions on how to assemble it, and everything else you might need. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/image-4.png) I never built my own synth, but just looking at all of these gorgeous contraptions tickles my brain in a certain way that makes me want to include it here **6 —** [**Missile Command with a twist**](https://mastodon.social/@danluu/113529014341128697?ref=gorillasun.de): this one's included because I thought it was genuis, Dan Luu built a game of Missile Command where you quite literally a fight for survival — the objective is to protect the game state that sits visualized at the bottom of the game screen, if damaged it makes parts of the game defect and can even render it unplayable. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-30-at-12.10.09.png) [Link to Toot](https://mastodon.social/@danluu/113529014341128697?ref=gorillasun.de) **7 —** [**SVG ASCII Logo Generator**](https://github.com/ykhli/ascii-logo?ref=gorillasun.de): to cap off, Yoko Li built this neat little command line tool that lets you print text as ASCII art to the terminal and simultaneously exports them as SVGs to feed into your plotter or laser cutter. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/image-2.png) ## Dev & Web Tech **1 —** [**How to Write Blog Posts that Developers Read**](https://refactoringenglish.com/chapters/write-blog-posts-developers-read/?ref=gorillasun.de): one of the hardest things to figure out when you're just getting started with your blog, is finding topics to write about — topics that you have an opinion on, and that are relevant to a specific group of people that could potentially become your audience. Michael Lynch writes about how to write dev blog posts that actually reach people, and some of the pitfalls to avoid: [How to Write Blog Posts that Developers ReadSoftware bloggers can make the same mistakes for years that prevent readers from discovering their writing. I know because I’m one of them. Over time, I’ve learned techniques that help some blog posts succeed and the pitfalls that cause others to languish in obscurity.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Refactoring English![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-cover.webp)](https://refactoringenglish.com/chapters/write-blog-posts-developers-read/?ref=gorillasun.de) **2 —** [**UI Algorithms: A Tiny Undo Stack**](https://blog.julik.nl/2025/03/a-tiny-undo-stack?ref=gorillasun.de): Julik Tarkhanov writes about how to program an undo stack in JavaScript — a feature in many UIs letting you undo and redo actions you've performed. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-29-at-13.01.15.png) [Link to Article](https://blog.julik.nl/2025/03/a-tiny-undo-stack?ref=gorillasun.de) A simple approach to achieve an undo stack involves storing actions in an array and then keeping track of them with a pointer. Julik points out that keeping track of the pointer is cumbersome, and proposes a more sensible dual-stack method, where undo/redo actions simply migrate between the two arrays. **3 —** [**A new way to draw separators in CSS**](https://blogs.windows.com/msedgedev/2025/03/19/minding-the-gaps-a-new-way-to-draw-separators-in-css?ref=gorillasun.de): Kevin Babbitt and Patrick Brosset from the Microsoft Windows Blog wrote about a new way to draw separator lines in CSS and propose a new gap decorations solution where you can specify column and row rules to style separators in different layouts. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/image-3.png) They write about it in more detail in an [explainer](https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/CSSGapDecorations/explainer.md?ref=gorillasun.de) on GitHub. For genart purposes I'm actually excited for this one; I recently attempted recreating one of my P5 sketches purely by using HTML and CSS to draw elements — I quickly realized that the positioning is quite cumbersome if you're drawing things simply using a border/fill hack; this could potentially be a solution to that. **4 —** [**War Story: the hardest bug I ever debugged**](https://www.clientserver.dev/p/war-story-the-hardest-bug-i-ever?ref=gorillasun.de): sometimes you run into vexxing mystery bugs that are seemingly impossible to debug — Jacob Voytko recounts a non-deterministic, worst-case scenario bug that occurred during the development of Google Docs back in the early 2010s. After 2 days of grueling debugging, it turned out that the bug was deep within Chrome’s V8 JavaScript engine. [War story: the hardest bug I ever debuggedAll of a sudden, without any ostensible cause, Google Docs was flooded with errors. How it took me 2 days and a coworker to solve the hardest bug I ever debugged.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fdfa1c7fb-b297-4734-bb5c-7e4889776bf9-2Fapple-touch-icon-180x180.png)Client/ServerJacob Voytko![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fa655bf2a-96bd-4cd3-8d6c-688ee74d9051_710x403.jpeg)](https://www.clientserver.dev/p/war-story-the-hardest-bug-i-ever?ref=gorillasun.de) **5 —** [**A Love Letter to the CSV format**](https://github.com/medialab/xan/blob/master/docs/LOVE%5FLETTER.md?ref=gorillasun.de): I wasn't aware that there's apparently some antagonism towards the CSV format; personally always thought it's pretty straightforward for my hobby purposes 🤷 But I guess that my sentiment towards CSV is just my uneducated opinion on the topic 😅 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-30-at-13.27.24.png)](https://news.ycombinator.com/item?id=43484382&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=43484382&ref=gorillasun.de) A little readme over on in the xan docs (a command line tool for processing csv files) reveals itself as a love letter to the format, highlighting its strengths and why its often criticized for the wrong reasons. [xan/docs/LOVE\_LETTER.md at master · medialab/xanThe CSV magician. Contribute to medialab/xan development by creating an account on GitHub.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-15.svg)GitHubmedialab![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/xan-1)](https://github.com/medialab/xan/blob/master/docs/LOVE%5FLETTER.md?ref=gorillasun.de) ## AI Corner **1 —** [**Why are we still bullish on LLMs**](https://x.com/skdh/status/1905132853672784121?ref=gorillasun.de): I guess this one tracks back to the issue that AI is still not quite *there* yet. Sabine Hossenfelder singles out a very particular use-case here, and generalizes her sentiment to LLMs at large, which I might not entirely agree with. Finding and extracting relevant references sounds like a task for an agent that's specialized for it, like the Deep Research GPT agent which I think works decently enough. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-29-at-00.40.07.png)](https://x.com/skdh/status/1905132853672784121?ref=gorillasun.de) [Link to Post](https://x.com/skdh/status/1905132853672784121?ref=gorillasun.de) LLMs are great for automating a lot of the tedious/mundane/crappy tasks — like for instance, I'm really happy I don't have to write data parsing python scripts from scratch anymore — now I can just prompt them into existence. Obviously, for anything slightly more complicated, that involves some sort of creative nuance, you'll find that LLMs quickly fall short. **2 —** [**LLM Agents are simply Graph**](https://zacharyhuang.substack.com/p/llm-agent-internal-as-a-graph-tutorial): LLM agents are simply thinking loops modeled as graphs: each node of the graph is either a particular action that the LLM is allowed to perform, or a prompt that updates the current state. Currently there's an explosion of LLM agnostic frameworks (meaning you can plug in the LLM of your choice) to build these kinds of agents, like Pocket Flow that's advertised through this post. Some weeks ago I played around a bit with LangGraph, but I found it quite overkill for my little experimental projects — glancing over the docs, Pocket Flow seems like a much more accessible alternative. This lovely little tutorial breaks down the basics of it. [LLM Agents are simply Graph — Tutorial For DummiesEver wondered how AI agents actually work behind the scenes?![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F265ef0c5-930e-4e68-889e-f54914c5b0c4-2Fapple-touch-icon-180x180.png)Pocket FlowZachary Huang![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F382ea8f1-0610-4cce-b4ef-350a9df68ee0_1050x588.png)](https://zacharyhuang.substack.com/p/llm-agent-internal-as-a-graph-tutorial) ## Music for Coding It's a big shame that this EP is only 15 minutes long — in jazz is for ordinary people, berlioz blends jazzy melodies with deep house grooves in a really seamless manner. Perfect way to start your Monday morning I'd say: And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 94Procedural Ant Colonies - Bounding Volume Hierarchies - Procedural Cave Systems - 3D Printer for Yarn - Voronoi Sudoku - TypeScript 10x Faster - Writing Exceptional Documentation - Functions in CSS - Design in Tech Report 2025![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-21.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-03-24-at-00.26.55.png)](https://www.gorillasun.de/blog/gorilla-newsletter-94) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 94 URL: https://www.gorillasun.de/blog/gorilla-newsletter-94/ Last updated: 2025-03-24T08:44:55.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 94th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. 🐘 ****The Gorilla Sun blog is now officially fedified!** Recently the team at [Ghost rolled out ActivityPub support for all Ghost blogs](https://activitypub.ghost.org/the-social-web-lift-off/?ref=gorillasun.de) — which means that you can now follow the blog directly via your Mastodon, and other ActivityPub-based social media accounts via [@index@www.gorillasun.de](https://mastodon.social/@index@www.gorillasun.de?ref=gorillasun.de) and receive updates whenever I publish a new issue or make a direct post into the Fediverse! If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**Optimizing Ant Simulation**](https://www.youtube.com/watch?v=hTHpEF%5Fjcu4&ref=gorillasun.de): youtuber Pezzza revisits a 5 year old video series of his, in which he previously explored and simulated the procedural behavior of ant colonies. In this installment he greatly optimizes the code that powers the sim, and incorporates additional constraints such as collision detection: We actually already had a look at ant colony simulation, in [issue #68](https://www.gorillasun.de/blog/gorilla-newsletter-68/) of the newsletter to be precise, when I wrote about Physarum sims. Check out this excellent [interactive tutorial by Deniz Bicer](https://denizbicer.com/202408-UnderstandingPhysarum.html?ref=gorillasun.de), as well as this excellent [video by Patt Vira](https://www.youtube.com/watch?v=VyXxSNcgDtg&ref=gorillasun.de). Physarum simulations are a type of particle-based algorithm in digital morphology, designed to recreate the behavior of [slime mold](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de)[s](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de), or ant colonies, in a digital setting. Essentially all sort of hive-like flocking behavior where agents seek out food sources and carve out distinct looking network like path patterns. In a genart setting these sims are popular due to the visually interesting patterns they can produce. **2 —** [**Collision Detection & Bounding Volume Hierarchies**](https://www.youtube.com/watch?v=MKeWXBgEGxQ&ref=gorillasun.de): the Ten Minute Physics YouTube channel dropped two new videos in the past month, both revolving around collision detection. In the first video, Matthias tackles the Sweep and Prune algo, that's relatively efficient for most 2D settings, showing us how to implement it in just 10 lines of code. The [second more recent video](https://www.youtube.com/watch?v=LAxHQZ8RjQ4&ref=gorillasun.de) explains a much more efficient approach, that spatially indexes objects in a scene and leverages a tree structure to check for collisions — that is magnitudes more efficient than the Sweep & Prune approach. **3 —** [**The Art of Chaos**](https://store.steampowered.com/news/app/1555980/view/655941948402566460?ref=gorillasun.de): After having worked for the past 10 years on heavily procedural tile-based games, the game studio Maschinen-Mensch treads into an entirely different genre with their newest release Mother Machine. In an article of theirs they explain the inner workings of the procedural cave-generator they built for their game: [Mother Machine - The Art of Chaos - Steam NewsA fun look at how Mother Machine creates its caves—hand-crafted chunks, smart placement, and procedural magic make every run feel fresh and exciting!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-46.ico)STEAM![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/043fc82359777b4926a41e66eaecaf7d61fd5b53.png)](https://store.steampowered.com/news/app/1555980/view/655941948402566460?ref=gorillasun.de) It turns out that the seemingly organic tunnel system is based on a smart tile-based grid, where entrances and exits are anchors that can connect to other tiles. Placing this one high up on the list this week, because it turned out to be a surprisingly insightful resource on dungeon/cave generation. **4 —** [**Building a 3D printer for Yarn**](https://www.youtube.com/watch?v=chP1dZfkgiE&t=114s&ref=gorillasun.de): combining his passion for building, crafts, and programming, Martin automated a manual knitting machine to make it "print" any kind of pattern on yarn — essentially making it a 3D printer for Yarn. And yes, I blatantly stole this one from Daniel Catt's newsletter; it was too good to not also share here. That said, [check out Daniel's newsletter](https://newsletter.revdancatt.com/p/057-pastels-and-apocalyptic-albums?ref=gorillasun.de), it's great! **5 —** [**Voronoi Sudoku**](https://danielchasehooper.com/posts/cracked-sudoku?ref=gorillasun.de): aka Cracked Sudoku, as Daniel Hooper describes it (due to it looking like a cracked/shattered surface), is a — cracked — variant of the popular puzzle game (both literally, and figuratively). [A New Sudoku Layout With 81 Uniquely Shaped CellsMy journey making a Sudoku variant that doesn’t have rows or columns![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/avatar2.jpg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/crackedSudokuWide.png)](https://danielchasehooper.com/posts/cracked-sudoku/?ref=gorillasun.de) Apparently there is an entire community of creatives and tinkerers that have gathered around the idea of creating all sorts of crazy Sudoku variants — if you'd like to delve into this topic, there's a huge YouTube channel that regularly posts about this topic, it's basically Numberphile for Sudoku: While people have come up with many alternative rule-sets, it seems that there hasn't been much innovation in terms of layout, which is what Daniel attempts to change with his version. His post explains how the puzzle generator works as well as the additional rules the Voronoi variant introduces, where numbers can't be repeated along specific "runs" of cells, instead of rows and columns. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/layouts_hu0d6b0adbc60ad5fdacf3d9060a606c8b_283091_1350x0_resize_box_3.png) You can give it a try [here](https://danielchasehooper.com/projects/cracked-sudoku/?ref=gorillasun.de). **6 —** [**The Balatro Timeline**](https://localthunk.com/blog/balatro-timeline-3aarh?ref=gorillasun.de): if you have the slightest interest in gaming, you'll very likely have heard of Balatro, the uber-addictive pocker inspired rogue-like indie game, that seemingly came out of nowhere and sold a record breaking number of copies in the first couple of days. Developed as a labor of love over the course of the past 3 years, sole dev LocalThunk recounts the entire creation timeline of the game in a big write-up of his: [The Balatro Timeline — LocalThunkIt’s been approximately 3 years since I began work on Balatro - and in that time I have personally documented almost nothing about the journey. This is something that has bothered me since the game launched. I am constantly forgetting major moments in development or milestones. It’s about time I sta![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/default-favicon.ico)LocalThunkLocalThunk![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/IMG_6226.jpg)](https://localthunk.com/blog/balatro-timeline-3aarh?ref=gorillasun.de) ## Dev & Web Tech 1 — **TypeScript 10x faster**: if you haven't heard yet, Microsoft just made TypeScript 10x faster — now you too can be a 10x dev, in the literal sense of the phrase! 😆 Jokes aside, it's not everyday that a programming language becomes 10 times faster overnight — so how did Andres Hejlsberg do it? Ironically, by not using any of the numerous programming languages he has created in his lifetime. Rather than using the TypeScript to compile the TypeScript, Go is a seemingly much better tool to do so, and porting the compiler yielded the massive speed-up. As always, check out the [FireShip video](https://www.youtube.com/watch?v=PQ2WjtaPfXU&ref=gorillasun.de) that summarizes things in a succinct and humorous manner. **2 —** [**How to write exceptional documentation**](https://chrisnicholas.dev/blog/how-to-write-exceptional-documentation?ref=gorillasun.de): if you're building software of any kind, you've likely had to write documentation at some point, either for users, or other devs. The difficulty here is that the docs need to suit the needs of multiple different readerships, with varying levels of expertise. Chris Nicolas provides us with excellent guidelines for writing and structuring docs in such a manner that they accommodate these varying needs: [Chris Nicholas | Developer experience at LiveblocksDX engineer at Liveblocks. Articles on developer experience and web engineering.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/safari-pinned-tab.svg)Chris NicholasChris Nicholas![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-image-bp6a7s)](https://chrisnicholas.dev/blog/how-to-write-exceptional-documentation?ref=gorillasun.de) **3 —** [**Functions in CSS**](https://css-tricks.com/functions-in-css/?ref=gorillasun.de): Chrome Canary is an experimental, bleeding-edge version of Google Chrome designed primarily for developers that want to experiment with early features. One of the shiny new things that it currently supports are CSS Functions, which the spec describes succinctly as *parameterized custom properties* — basically custom properties that can return different things based on an input parameter: [Functions in CSS?! | CSS-TricksArguments?! Return values?! What’s crazier, you can use functions right now in Chrome Canary! So, after reading and playing around, here are my key insights on what you need to know about CSS Functions.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-15.svg)CSS-TricksJuan Diego Rodríguez![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/css-functions-mixins.png)](https://css-tricks.com/functions-in-css/?ref=gorillasun.de) As you might have guessed though, it's likely going to be a couple of years before we can fully enjoy CSS functions across the major browsers (or we all just start using Chrome Canary 🤷). **4 —** [**Pocket-sized keyboard design contest**](https://chrischrislolo.github.io/orthoLabLogs/keyboard-design-contest-00.html?ref=gorillasun.de): I've been meaning to get myself a mechanical key-board for a while now, but with all the choices out there I've been a bit paralyzed. After discovering that there's a whole key-board DIY and modding community out there, I even played with the idea of getting a 3D printer to build my own — but that was a short-lived daydream. This post isn't new, but still very much worth sharing, back in May of last year the sporewoh blog ran a design content for pocket-sized keyboards, the results then came out in October, with the top-designs listed in this article, there's a bunch of fascinating pieces in there. [keyboard design contest #00 resultsOverview The results are in! Thank you to everyone who has participated in the contest! I am floored by all of the creativity and thought put into the entries!! I’d like to list out the entries, what I like about each one, and finally outline…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-47.ico)sporewohsporewoh![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/ToadsTempestF-2.JPG)](https://chrischrislolo.github.io/orthoLabLogs/keyboard-design-contest-00.html?ref=gorillasun.de) ## AI Corner **1 —** [**Design in Tech Report: Autodesigners on Autopilot**](https://johnmaeda.medium.com/autodesigners-on-autopilot-88c5b07609b9?ref=gorillasun.de): It's that time of the year again, John Maeda presented his famous Design in Tech Report at the [2025 SXSW conference](https://www.sxsw.com/?ref=gorillasun.de). I wrote about the 2024 Report back in [issue #48](https://www.gorillasun.de/blog/gorilla-newsletter-48/), titled **Design against AI**. It almost seems ages ago now, back then we were still grappling with adopting AI as a solution for design purposes, with a general negative sentiment towards it — now this seems a thing of the past, and the narrative having shifted quite significantly. If you want a concise summary of Maeda's thoughts on the topic, he also wrote this wonderful post on X — the two strongest threads right now are that [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-23-at-11.18.08.png)](https://x.com/johnmaeda/status/1902005437022790100?ref=gorillasun.de) [Link to Post](https://x.com/johnmaeda/status/1902005437022790100?ref=gorillasun.de) **2 —** [**Photoshop for Text**](https://x.com/damienhci/status/1902106534345371830?ref=gorillasun.de): What if you could lengthen a sentence and make it wordier, simply by dragging it? What if you could make the text more colorful — changing its tone essentially — by using a color selection wheel? That's Damien Masson's paper **Textoshop** explores: novel text interactions that mimic those you'd usually find in image editing software. He demonstrates many of those interactions in the X thread he posted here 👇 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-23-at-15.01.46.png)](https://x.com/damienhci/status/1902106534345371830?ref=gorillasun.de) [Link to Post](https://x.com/damienhci/status/1902106534345371830?ref=gorillasun.de) And it seems that this is not a new idea, X user kepano had predicted this with a thread of theirs back in October 2022, read up on it [here](https://x.com/kepano/status/1726289854915629262?ref=gorillasun.de). This also strongly reminds me Amelia Wattenberger's LLM based experiments that I highly recommend checking out. ## Music for Coding I went to a concert for the first time in a while this past week — and calling it a concert doesn't really feel right, it was much rather an experience, and to an equal extent a phenomenon to witness. Heilung is a Nordic-Ritual-Folk band (according to Wikipedia), that's rhythmic, primal, and at points even atmospheric and cinematic. It's the kind of music that transports you away to a different time and place — seeing them live definitely made me feel like I was somewhere else. It might not be everyone's cup of tea, but I definitely would recommend giving it a listen at least once — and if they're doing a show near you, experiencing it for yourself: And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 93Dithering in Colour - The Lost Art of Logarithms - Evolving Shaders with LLMs - Art with Sinusoids - IO Devices & Latency - Whimsical Web Animations - Deceptive Progress Bars - CSS Relative Colors - Understanding Embeddings![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-20.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2025-03-12-at-20.12.28-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-93) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 93 URL: https://www.gorillasun.de/blog/gorilla-newsletter-93/ Last updated: 2025-03-17T06:00:03.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 93rd issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**Dithering in Colour**](https://obrhubr.org/dithering-in-colour?ref=gorillasun.de): traditionally, dithering's a technique to create the illusion of color depth with a limited color palette, tricking our eyes into seeing more colors than there actually are, the term is now generally used to refer to a bunch of algorithms that can reduce the number of colors in an input image. Today, it's become a bit of a lost art, and broadly used for aesthetic and artistic purposes. While dithering is most commonly used in the monochrome setting, this past week Niklas Oberhuber shared a post in which he explains how multi-channel dithering works and some of the pitfalls to avoid while doing so. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-12.04.40.png) Instead of converting an image to grayscale and using a simple threshold, color dithering involves comparing each pixel’s RGB values in a three-dimensional space to find the closest matching color in a chosen palette, then diffusing the quantization error across each channel separately. A key point is the need to linearise the sRGB input before dithering because the gamma-encoded values do not represent brightness linearly, which can lead to overly bright or inaccurate outputs. > We have just committed a mortal sin of image processing. I didn’t notice it, you might not have noticed either, but colour space enthusiasts will be knocking on your door shortly. Niklas also mentions a whole bunch of other interesting articles on the topic of dithering that I haven't previously come across, nor shared on the Newsletter: - A recent one from Amanvir Parhar, where he implements [Atkinson dithering in Racket](https://amanvir.com/blog/writing-my-own-dithering-algorithm-in-racket?ref=gorillasun.de) (a versatile multi-purpose programming language in the Lisp family) - And another from surma.dev back from 2021 titled "[Ditherpunk — The article I wish I had about monochrome image dithering](https://surma.dev/things/ditherpunk/?ref=gorillasun.de)" that's a comprehensive overview of all steps involved in creating a dithering algorithm [Ditherpunk — The article I wish I had about monochrome image dithering — surma.devI always loved the visual aesthetic of dithering but never knew how it’s done. So I did some research. This article may contain traces of nostalgia and none of Lena.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/surma.1bdb48ee.jpg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/social-1.png)](https://surma.dev/things/ditherpunk/?ref=gorillasun.de) To end this first segments, and to share something artful, I saw that Roni Kaufman has recently also been experimenting with color dithering, he made this beautiful dithered rendition of Anna Boch's "Falaise - Côte de Bretagne" — go and drop him a like 👇 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/image.png)](https://www.instagram.com/p/DHGeihlCiQk/?img%5Findex=1&ref=gorillasun.de) [Link to Instagram Post](https://www.instagram.com/p/DHGeihlCiQk/?img%5Findex=1&ref=gorillasun.de) **2 —** [**Evolving shader sketches with LLMs**](https://www.joelsimon.net/lluminate?ref=gorillasun.de): Joel Simons came up with an interesting approach that leverages evolutionary principles for prompting LLMs, in an attempt to maximize the diversity of generated outputs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-19.00.49.png) Starting from an initial sample population generated by the LLM, the evolutionary step is guided by a "creative thinking" strategy, that are essentially different kinds of methods for combining and blending samples of the population. These strategies are inspired by the creative approaches from known theorists and creatives. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-19.27.25.png) After a new batch of samples is generated, their similarity to previous samples is computed through an embedding, this provides a measurable score to grade how novel and different generated examples are. The cycle is then repeated until a certain stopping criteria is reached. Here I'm just providing the big picture, so highly recommend reading through the page for yourself. Although the final sketches might still not be aesthetically pleasing (imo), the results do seem to indicate that this approach nudges the LLM to explore a greater diversity of examples than it normally would — which is maybe also not so surprising, since we have already established that "step by step" reflection and thinking loops scale LLMs' capabilities to a great extent. **3 —** [**The Lost Art of Logarithms**](https://www.lostartoflogarithms.com/preface/?ref=gorillasun.de): in an attempt to put down some of the prehistory of computing in writing, Charles Petzold is currently in the process of documenting everything related to Logarithms and how they are *central to our perceptions and consequent understanding of the world*, in form of a book. Albeit still a work in progress, the resource currently is and will be freely accessible, with many of the first chapters already filled in: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-21.16.15.png) Although the topic at hand is something profoundly technical, *The Lost Art of Logarithms* reads surprisingly easy, much like a normal book; at least that was my impression going through the first chapter over the weekend. Charles writes in a really accessible way that simplifies much of the complexity — it's one of those resources I wish I would have had back in high-school to have more context around the notions we were being taught in math class. **4 —** [**Art with Sinusoids**](https://how-to-build-du-e.tumblr.com/?ref=gorillasun.de): this week I'm excited for a collaboration between Rob Scalera and 0xbenj, two really talented generative artists that I've been following for a while now — their generative artwork *what lingers within* is releasing this coming week on fxhash, and it's a really gorgeous one. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/collage2-2-.jpg)](https://x.com/fx%5Fhash%5F/status/1901235030350864765?ref=gorillasun.de) [Learn more about the project here](https://x.com/fx%5Fhash%5F/status/1901235030350864765?ref=gorillasun.de) Their work is in part inspired by Masaru Fujii, an artist that doesn't claim to be a generative artist but still leverages trigonometric functions for the purpose of creating mesmerizing algorithmic compositions — I discovered a page where he has actually explained a little bit about his method and how it's simply based on combinations of sinusoids. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-23.43.57.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-23.39.28.png) [Link to Post](https://x.com/ozachou%5Fg/status/1892897713081241613?ref=gorillasun.de) | [Link to write-up](https://how-to-build-du-e.tumblr.com/?ref=gorillasun.de) **5 —** [**Infinite Zoom Wikipedia**](https://folk.systems/canvas/space/hypertext-zui?ref=gorillasun.de): Orion Reed built a mind boggling Wikipedia-like website where, instead of hovering over hyperlinks to see their content, you can zoom in and out of them, to physically traverse the page into the links. I have no idea how it works, and it did induce a bit of motion-sickness, but it's the coolest thing I saw this past week. 0:00 /0:14 1× [Link to Post](https://x.com/OrionReedOne/status/1899444153936658691?ref=gorillasun.de) **6 —** [**Algorithmic Pattern 2025 call for talks/papers**](https://2025.algorithmicpattern.org/call/?ref=gorillasun.de): to cap off this section, back in January I shared the Algorithmic Pattern conference that's taking place later this year in September, you can read about it in [issue #85](https://www.gorillasun.de/blog/gorilla-newsletter-85/) of the newsletter, or directly check out their website — the important point is that they are now accepting submissions for talks & papers, with the submission deadline being **June 2nd 2025**. ## Dev & Web Tech **1 —** [**IO Devices and Latency**](https://planetscale.com/blog/io-devices-and-latency?ref=gorillasun.de): without a doubt the most fascinating tech article of the past week, Ben Dicken wrote about the evolution of non-volatile storage—from tape drives and hard disk drives (HDDs) to modern solid state drives (SSDs)—and how each technology’s physical design impacts input/output (IO) latency. What makes the article really stand out are the many interactive examples throughout that let you play around with the different kinds of storage mediums, demonstrating their inner workings and shortcomings in a tangible manner. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-15-at-10.22.02.png)](https://x.com/BenjDicken/status/1900221083636379822?ref=gorillasun.de) [Link to Post](https://x.com/BenjDicken/status/1900221083636379822?ref=gorillasun.de) Although the article is directly related to a new product release of Ben Dicken's company, but it's in of itself quite interesting, rather than separating storage from compute like many cloud solutions nowadays do — and in that manner introducing latency — PlanetScale proposes to go back to using storage that’s directly attached to compute using fast NVMe (Non-Volatile Memory Express) SSDs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-13.55.45.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=43355031&ref=gorillasun.de) **2 —** [**Programming Whimsical Web Animations**](https://www.joshwcomeau.com/blog/whimsical-animations/?ref=gorillasun.de): Josh Comeau's got a new course lined up that's all about creating playful, interactive effects using vanilla web tech. He's just launched the [landing page](https://whimsy.joshwcomeau.com/?ref=gorillasun.de) for it, and it was an absolute joy to explore — I recommend playing around with the landing page by yourself before diving into the article. In the massive write-up Josh explains how he created many of the effects that are used throughout it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-14.06.20.png) If you've been wanting to add some character, or easter-eggs, to your own website, this one's for you. **3 —** [**Truth, Lies and Progress Bars**](https://cloudfour.com/thinks/truth-lies-and-progress-bars/?ref=gorillasun.de): I've read this on several occasions now, that progress bars only on rare occasion really accurately convey the progress that's being made by an application, and instead just serves as an indicator to convey a *sense of progress* to the user. Tyler Sticka wrote a short and sweet post about an early career experience where he worked on a project that implemented this kind of bogus progress bar, and explains that sometimes a small performance loss is worth a more accurate estimation of progress: [Truth, Lies and Progress BarsAn early encounter with a fabricated progress indicator inspired several more honest alternatives.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-7.svg)Cloud FourTyler Sticka![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/progress-feature-r1-1200x0-c-default.jpg)](https://cloudfour.com/thinks/truth-lies-and-progress-bars/?ref=gorillasun.de) This also reminds me of a thread I came across not so long ago — apparently this "perception of progress" is also applicable in a physical setting: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-18.46.55.png) [Link to Post](https://x.com/FreyaHolmer/status/1810617330495275490?ref=gorillasun.de) **4 —** [**CSS Relative Colors**](https://ishadeed.com/article/css-relative-colors/?ref=gorillasun.de): Ahmad Shadeed is back with another article, this time exploring CSS relative colors, a modern approach that lets you adjust colors directly in CSS without relying on tools like Sass; using functions like `hsl()` and `oklch()`, you can now easily change a color’s opacity or create lighter and darker shades on the fly, or even entirely hue shift to a different color. [CSS Relative ColorsAn interactive guide to learn CSS Relative Colors.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-7.png)Ahmad Shadeed![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/twitter-card-2.jpg)](https://ishadeed.com/article/css-relative-colors/?ref=gorillasun.de) **5 —** [**Colormaxxing with P3 Colors**](https://karuna.dev/colormaxxing/?ref=gorillasun.de): in more color related news, turns out that using the modern Display-P3 color space allows for much brighter and vibrant colors in certain browsers, and on displays that support the color space — going through the examples Daniel Karuna provides in his post does indeed reveal much more vivid colors (on a MacBook using Brave — no luck with FireFox). [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-16-at-15.04.53.png)](https://karuna.dev/colormaxxing/?ref=gorillasun.de) No idea if you'll be able to see it through the screenshot 😅 it's a different shade of red on the right — source: trust me bro Not sure for what practical purposes this is useful for, if not all displays and/or browsers support the color space at this point, but it's pretty cool that it's possible to squeeze out a bit more color range in that manner! ## AI Corner **1 —** [**Understanding Embeddings**](https://www.youtube.com/watch?v=GikIJpUv6oo&ref=gorillasun.de): Embeddings are numerical representations of complex data — such as words, images, or sounds — that capture the underlying meaning and context in formats that are easy to work with. An embedding space is thus just a conversion of data items to high-dimensional vectors, where similar items are positioned close together, where algorithms can then recognize patterns and relationships. They are the cornerstone of modern applications of AI, semantic search engines for example, that leverage embeddings to understand query context and retrieve relevant related information; but also recommendation systems, and various other natural language processing applications like sentiment analysis, machine translation, and chatbots. If you're curious about this, Santiago Valdarrama published a video about how to train your own neural network that can generate image embeddings, from scratch — it's a beefy one but worth the watch: **2 —** [**Tips for using cursor**](https://www.nickcraux.com/blog/cursor-tips?ref=gorillasun.de): I've used cursor quite a bit now, in fact it's my current coding editor of choice, the inbuilt AI functionalities are neat for all sorts of purposes — for vibe coding for instance 🤣 Nick Craux wrote an article on how to get the most out of it while also saving yourself from the crappy debugging. [Nick Crauxhello i’m nick![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-44.ico)here's how I avoid the garbage parts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-image.png)](https://www.nickcraux.com/blog/cursor-tips?ref=gorillasun.de) One key tip Patrick offers, that I haven't tried out yet, is using the .cursorrules or .mdc files to set guidelines for the LLM — clear, minimal rules, seem to work best and overall make the AI generate better code. ## Music for Coding Naxatras is a psychedelic rock band hailing from Greece, and have built a reputation for blending progressive, spacey elements with hard rock, blues, and expansive jam sections. Previously unaware of the band's track record, they seem to be THE big thing in the psychedelic rock space — reading through some reviews online to learn a bit more it seems we've got a very special album at hand: > Naxatras has come before us with what’s effortlessly the year’s biggest release of the genre so far with any bands with any to-be-announced albums having an exceedingly high bar to clear if they hope to top the overwhelming mastery of what’s been pulled off here \~ [Head-Banger Reviews](https://headbangerreviews.com/2025/02/08/naxatras-v/?ref=gorillasun.de) But I'll leave you to savour it for yourself 🤤 And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 92Logic Circuit Cellular Automata - Generative Plotter Vending Machine - Tweet Coding GLSL Shaders - Distance Test for Bad Art - Indie Web Love Letter - What is TypeScript? - Doom in TypeScripts’s Type System - Bloom Filter Data Structure - In Praise of Off-Screen Menus - Blogging in the Age of AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-19.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/IMG_7651.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-92) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 92 URL: https://www.gorillasun.de/blog/gorilla-newsletter-92/ Last updated: 2026-06-18T14:44:28.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 92nd issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**Differentiable Logic Cellular Automata**](https://google-research.github.io/self-organising-systems/difflogic-ca/?ref=gorillasun.de): new research from Google's Paradigms of Intelligence team demonstrates that hardware circuits can be trained in a neural network like manner to learn specific target Cellular Automata (CA) without having to define specific rules by hand. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/Screenshot-2025-03-09-at-10.25.00.png) They build on their work from 2020 "[Growing Neural Cellular Automata](https://distill.pub/2020/growing-ca/?ref=gorillasun.de)", where they previously investigated the autonomous generation and re-generation of cellular patterns through training a neural type of CA. Here they take this a step further and introduce a fully discrete CA framework that's powered by differentiable logic gates, modified to learn local update rules. In the article they explain how they actually make traditionally non-differentiable logic gates trainable, and demonstrate it through a number of interactive examples: [Differentiable Logic Cellular Automata: From Game of Life to pattern generation with learned recurrent circuitsWe use Differentiable Logic Gate Networks to create end-to-end differentiable, self-organizing discrete cellular automata powered by recurrent circuits, capable of playing the Game of Life as well as producing patterns à la Neural Cellular Automata.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/notaorb_180.png)![](https://pietromiotti.github.io/diffLogicCA/images/card.png)](https://google-research.github.io/self-organising-systems/difflogic-ca/?ref=gorillasun.de) Interestingly, this idea of "programmable matter" (matter that is capable of computation) has already been floating around for a couple of decades, the article points out [Norman Margolus](https://en.wikipedia.org/wiki/Norman%5FMargolus?ref=gorillasun.de) and [Tommaso Toffoli](https://en.wikipedia.org/wiki/Tommaso%5FToffoli?ref=gorillasun.de)'s paper "Speculating in Precious Computronium", where *Computronium* is this hypothetical kind of programmable matter. Sadly I couldn't find a version of the paper that isn't locked behind a paywall; but there's a short [Wikipedia entry](https://en.wikipedia.org/wiki/Computronium?ref=gorillasun.de) on it however. Regardless, this research might well be a step towards turning this science-fiction kind of matter into something that can actually be tangibly investigated. **2 —** [**Generative Plotter Vending Machine**](https://niklasroy.com/oneEuro/?ref=gorillasun.de): by disguising a plotter in form of a coin-operated vending machine, Niklas Roy's project *Generative Art 1€* lets visitors dispense a unique plot to take home with them. The project can be viewed as a commentary on the transience of digital art, where the device has the ability to transform viewers from passive consumer to active collectors: > A generative algorithm continuously draws an animated black line on a screen, offering an endless stream of potential artworks. Each piece exists in a transient digital state until someone intervenes by spending a coin. The contraption is in itself technically interesting — over on his personal blog, Niklas posted a write-up that sheds some light on the internals of the machine, how he built it, as well as what's going on in the generative artwork: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/collage2.jpg)](https://niklasroy.com/oneEuro/?ref=gorillasun.de) [Link to Article](https://niklasroy.com/oneEuro/?ref=gorillasun.de) If you want to experience it live in the flesh, the machine is currently part of the exhibition “Intelligence, it's automatic” at Zebrastraat in Gent/Belgium, and will be on display until the 8th of June, 2025\. You can find more info about the exhibition and the other contraptions that are presented over on the [exhibition page](https://www.zebrastraat.be/nl/ntaa/contestexpo?ref=gorillasun.de). It's also worth having a look at the [creative net page](https://www.creativeapplications.net/objects/generative-art-1e-democratizing-art-consumption-and-collection/?ref=gorillasun.de) covering the project. **3 —** [**Tips & tricks for Tweet sized GLSL shaders**](https://x.com/XorDev/status/1894397258474357122?ref=gorillasun.de): size coder Xor shared a cool thread containing a bunch of useful tricks that they frequently use for their creations — what's cool is that each post in the thread quotes a practicable example of a tiny shader that demonstrates the mentioned trick. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/03/collage2-1-.jpg)](https://x.com/XorDev/status/1894397258474357122?ref=gorillasun.de) [Link to Thread](https://x.com/XorDev/status/1894397258474357122?ref=gorillasun.de) Xor also has his own [SubStack](https://mini.gmshaders.com/?ref=gorillasun.de) where they've shared a couple of insightful articles and tutorials on shader coding, recommend checking it out! **4 —** [**How to tell when your art is bad**](https://newsletter.revdancatt.com/p/056-how-to-tell-when-your-art-is?ref=gorillasun.de): Daniel's back with the 56th issue of his newsletter, and as always, he shares some invaluable advice for making good art — this time he tells us about a distance-based test he's been using to quickly determine if he's got a potentially good artwork at hand. In brief, the art should be interesting and engaging at multiple different viewing distances, from across the room, all the way to standing in front of it up-close: [📙 #056 - How to tell when your art is badBut also, how to tell when it’s good. A quick rule of thumb.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fdbf7afe8-faf2-45f6-a369-638b2d09f43a-2Fapple-touch-icon-180x180-1.png)Drawing Machines & Notes from Art Studio RobotsDaniel Catt![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Ff8e50e81-8cd7-4868-929c-f48e6d51198b_2048x1365.jpeg)](https://newsletter.revdancatt.com/p/056-how-to-tell-when-your-art-is?ref=gorillasun.de) I believe this is also applicable in a digital setting, where the different viewing distances become different screen sizes. There's been many times where I made something that I thought looked great on my desktop screen, but once posted to Instagram, the smaller thumbnail image really didn't do it justice. And vice-versa, sometimes some of my animations ended up looking much better on mobile than on desktop, which then also explained why those posts got more likes than I had have anticipated. Well, maybe... what do I know about art? 😆 **5 —** [**This page is under construction**](https://localghost.dev/blog/this-page-is-under-construction?ref=gorillasun.de): Sophie Koonin wrote a beautiful love letter to the indie web — she urges us to create our own personal websites, to claim just a little patch of digital space, and leave our colorful personal marks in the increasingly bland and corporate mass that the internet has become today: [This page is under construction - localghostIf you take just one thing away from this article, I want it to be this: please build your own website.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-40.ico)localghostSophie Koonin![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/this-page-is-under-construction.png)](https://localghost.dev/blog/this-page-is-under-construction?ref=gorillasun.de) **6 —** [**The Code Architecture of Animal Well**](https://www.youtube.com/watch?v=YngwUu4bXR4&ref=gorillasun.de): to cap off this section, I want to give a shout to the Wookash Pocast that's been hosting devs behind many of the popular indie games out there today. Here's the episode with Billy Basso, the dev behind Animal Well, which I've only heard/read/seen good things about so far, and had an overwhelmingly positive release when it came out: *Gorilla from the future here*: while checking out the Steam page I discovered that just a few days ago a full documentary about the game was released — so you might also want to check that out 👇 Billy Basso recounts the 7 years he spent on developing the game: and has been on my Steam wish-list for a while now Getting this behind the scenes on how it was programmed was the nudge I needed to finally get it! ## Dev & Web Tech **1 —** [**What is TypeScript? An overview for JavaScript programmers**](https://2ality.com/2025/02/what-is-typescript.html?ref=gorillasun.de): you've likely heard of TypeScript at this point, it's essentially JavaScript's strongly typed big brother (that ultimately gets compiled back down to plain JavaScript). If you've been meaning to learn more about the superset language, Dr. Axel Rauschmayer wrote a simple overview of how it works and demystifies the different ways in which TypeScript can actually be run: [What is TypeScript? An overview for JavaScript programmersRead this blog post if you are a JavaScript programmer and want to get a rough idea of what using TypeScript is like (think first step before learning more details). You’ll get answers to the following questions: How is TypeScript code different from JavaScript code? How is TypeScript code run? How does TypeScript help during editing in an IDE? Etc. Note: This blog post does not explain why TypeScript is useful. If you want to know more about that, you can read my TypeScript sales pitch.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/2ality-favicon-180x180.png)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/external-link-light.svg)](https://2ality.com/2025/02/what-is-typescript.html?ref=gorillasun.de) Here you might ask why you should use TypeScript, and how the strongly typed language improves on plain JavaScript? If you're curious about that, it's covered in chapter 2 of Dr. Rauschmayer's book [Tackling TypeScript](https://exploringjs.com/tackling-ts/toc.html?ref=gorillasun.de) that's freely accessible in its entirety, and that you should definitely also read! Originally developed by Microsoft, TypeScript was created to address the challenges of building large-scale, complex JavaScript applications, where maintainability, tooling, and early error detection become increasingly important. Hence, to answer the above question, enforcing types essentially creates clear contracts about what kind of data is passed around in a program, reducing the chances of unexpected behavior at runtime. **2 —** [**TypeScript types can run DOOM**](https://www.youtube.com/watch?v=0mCsluv5FXA&ref=gorillasun.de): quite a big leap from an introductory article on TypeScript to running DOOM in TypeScript's type system, but just recently Dimitri Mitropoulos was able to achieve this Herculean feat. For now there's only a short video providing a high-level overview of the scale of this personal challenge, but we're promised two upcoming in-depth videos that will dive into more details. In this overview Dimitri shows us that he essentially built an entire virtual computer inside of TypeScript to run the game in. He also showcases the reactions from leading industry/community members to his creation — most of which were in shock, and who we'll likely see more of in the upcoming videos. While writing this, I also saw that there were two more videos up on the channel already, a supplementary one where Dimitri talks about [the hardest challenge](https://www.youtube.com/watch?v=hPaiK0omhEw&ref=gorillasun.de) of this entire project, besides another where we get a [full reaction and commentary from Anders Hejlsberg](https://www.youtube.com/watch?v=5506X2xioi0&ref=gorillasun.de), the creator of TypeScript, to DOOM running in its Type system. **3 —** [**Bloom Filter: A Deep Dive**](https://www.kirupa.com/data%5Fstructures%5Falgorithms/bloom%5Ffilter.htm?ref=gorillasun.de): if you got excited to learn about the kind of Bloom effects that you would use in video games, I'm sad to disappoint — however you're still in for a treat information-wise. Bloom filters are essentially the name of a smart probabilistic data structure, that let you efficiently check if something exists in a large (gigantic) list, without using tons of memory — the kirupa blog recently published a deep dive on how these data structures work: [Bloom Filter: A Deep DiveLearn how to quickly check if a value exists in a ridiculously large collection of data by using the world’s favorite little probabilistic data structure, the Bloom filter.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon_new.png)kirupa.comKirupa Chinnathambi![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/bf_og.png)](https://www.kirupa.com/data%5Fstructures%5Falgorithms/bloom%5Ffilter.htm?ref=gorillasun.de) **4 —** [**Reimagining Fluid Typography**](https://www.oddbird.net/2025/02/12/fluid-type/?ref=gorillasun.de): it's been a minute since we talked about fluid typography on the newsletter, the first time we tackled the notion in [issue #47](https://www.gorillasun.de/blog/gorilla-newsletter-47/), where we had a look at the [original proposal](https://utopia.fyi/?ref=gorillasun.de) from the Utopia group. In a recent article Miriam Suzanne hones in on a specific detail, and challenges traditional fluid typography setups where fluid ranges are built on top of the assumption that 16px = 1em — she argues that we should avoid this “magic math” and instead let the user’s own browser default (and preferences) guide font sizing. [Reimagining Fluid TypographyAre we responding to the right inputs?![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-28.png)OddBirdMiriam Suzanne![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/font-scale-hero-1366w.jpeg)](https://www.oddbird.net/2025/02/12/fluid-type/?ref=gorillasun.de) By not forcibly setting a root font-size and by using truly relative units (em, rem, viewport units)—sometimes in combination with clamp()—we can ensure our text scales properly for accessibility and varying device contexts. The main takeaway here is that respecting user defaults and providing slight responsive tweaks (rather than overriding them with fixed assumptions) leads to better, more flexible, and more user-friendly typography on the web. **5 —** [**In praise of off-screen menus**](https://piccalil.li/blog/in-praise-of-off-screen-menus/?ref=gorillasun.de): a new treat from one of my favorite web design blogs; Jason Bradburry explains why there's merit to hiding web menus off-screen from a UX point-of-view, and demonstrates a whole slew of different websites that do this brilliantly, each one of them in wholly unique way: [In praise of off-screen menusJason Bradberry challenges the ideals of displaying your entire navigation as a cluster of links and presents a case for exploring off-screen menus where the context is right for it.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-29.png)PiccalilliJason Bradberry![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/png-2)](https://piccalil.li/blog/in-praise-of-off-screen-menus/?ref=gorillasun.de) ## AI Corner **1 —** [**It's still worth blogging in the age of AI**](https://www.gilesthomas.com/2025/02/blogging-in-the-age-of-ai?ref=gorillasun.de): writing on the internet has always been a way for me to discover, digest, and muse on my findings and consolidate some of my learnings — I think I've mentioned this before, but as much as I write these newsletters, and now infrequent blog posts, for the readership, I equally write them for myself. But just like I turn off the AI auto-complete in my code editor, to actually do some proper non-vibe-coding and practice my programming skills, the same thing is true for writing these posts — you can only get better at something if you actively engage with it, and if AI is doing it for you, I don't think you're actually spending meaningful time on it. Giles Thomas writes that blogging is still worth doing in the age of AI for exactly these reasons, besides many more thoughtful arguments: [It’s still worth blogging in the age of AIAlthough it might seem that AI will make it pointless, I still think it’s worth blogging.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-27.png)Giles ThomasGiles Thomas![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/web-app-manifest-512x512.png)](https://www.gilesthomas.com/2025/02/blogging-in-the-age-of-ai?ref=gorillasun.de) 2 — [Not I](https://www.creativeapplications.net/sound/not-i-the-voice-identity-and-the-epistemic-mirage-of-machine-learning/?ref=gorillasun.de): Produced by the creative studio Unit Test, *Not I* is an essay film and installation that investigates, and essentially scrutinizes the use of machine learning in vocal forensics — where contemporarily Speech-2Face model are apparently used to infer a speaker's face from their voice. B y adding imperceptible noise to audio samples, they demonstrate that the model produces blatantly incorrect facial outputs. [Not I - The voice, identity and the epistemic mirage of machine learningNot I explores the problematics at the heart of contemporary vocal forensics’ use of statistical learning techniques. The work develops a form of investigative aesthetics which seeks to open up the epistemic assumptions that ground the development of these socio-technical objects through a ’counterc![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/CAN_Logo_512-512x500-2.png)CreativeApplications.Netmartindisley![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/3_banner.jpeg)](https://www.creativeapplications.net/sound/not-i-the-voice-identity-and-the-epistemic-mirage-of-machine-learning/?ref=gorillasun.de) On a more philosophical level, the essay film highlights an unsettling relationship between vocal perception and speaker identity, exposing the socio-technical complexities of contemporary vocal profiling, and the dubious epistemic assumptions underpinning the tech. ## Music for Coding I haven't listened to Nick Johnston in years — so I was super stoked to see that there's been a whole bunch of new albums since the last one I listened to! I will have to go on a binge this week and catch up on all of it 🤩 The most recent one Child of Bliss tells me that his style has evolved bounds and leaps since I last listened to him roughly 8 years ago — the tracks throughout the album are simply really thoughtful, emotive, melodic, and full of interesting harmonic twists and turns that you don't find many other artists do. The album is also just short enough to be too short for my taste, but I'll let you give it a listen for yourself: And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 91Pong in 240 Favicons - Psychedelic Graphics - XOR Deep Dive - JesseSort: a New Sorting Algo - History of Algorithmic Composition - Size Coding Botto - Intricacies of a Calculator App - Bluesky’s Lossy Timelines - NASA’s 10 Rules for Software Development - Creativity and AI - LLM from Scratch![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-18.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/IMG_7565-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-91) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 91 URL: https://www.gorillasun.de/blog/gorilla-newsletter-91/ Last updated: 2025-02-24T06:00:18.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 91st issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) 📣 ***Heads up, I'll be tied up IRL again next weekend — hence no newsletter! But I might share some of the interesting things I find over on Discord** ✨ ***That said, cue the news*** 👇 ## All the Generative Things **1 —** [**Running Pong in 240 Browser Tabs**](https://eieio.games/blog/running-pong-in-240-browser-tabs/?ref=gorillasun.de): Nolan Royalty, who you might remember as the creator of One Million Checkboxes, returns this week with a new web-experiment — this time hacking the favicons of his open browser tabs (precisely 240 of them) to run a playable game of Pong. He details how he did it in a blog post of his: [Running Pong in 240 Browser Tabs · eieio.gamesWhat should you do with your unclosed browser tabs? I ran pong in mine.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-19.png)eieio.games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/title-image.png)](https://eieio.games/blog/running-pong-in-240-browser-tabs/?ref=gorillasun.de) Recently there's been a new creative indie trend (I don't know what else to call it) of doing stuff inside of the favicon of a webpage — rather than doing stuff inside the webpage itself 😆 this started with Tru Narla programming an entire game of [Flappy Bird inside of the page's favicon](https://mewtru.com/flappyfavi?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-11.57.49.png)](https://x.com/trunarla/status/1890067345261158556?ref=gorillasun.de) [Link to Post](https://x.com/trunarla/status/1890067345261158556?ref=gorillasun.de) | [Link to Page](https://mewtru.com/flappyfavi?ref=gorillasun.de) So, where do you even start with recreating Pong across several favicons? Not only do you need to arrange the tabs you also need to actually display the game in them. Nolan uses AppleScript to automate the process of opening and arranging the tabs, having them self-assemble into 8x30 grid, then using web workers and broadcast channels to project individual square areas of a canvas into the favicon grid, as you might've already guessed, synchronizing them ended up being quite a challenge. Make sure to also check out the thread he made on the topic: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-22.36.48.png)](https://x.com/itseieio/status/1892657295919874084?ref=gorillasun.de) [Link to Thread](https://x.com/itseieio/status/1892657295919874084?ref=gorillasun.de) **2 —** [**Psychedelic Graphics**](https://benpence.com/blog/post/psychedelic-graphics-0?ref=gorillasun.de): Ben Pence started a series of articles that attempts to explain computer graphics — particularly those of the trippy, psychedelic kind — in an accessible manner that doesn't assume any prior knowledge of graphics or programming. Because I'm a sucker for evergreen resources like this one, I'm putting this one high up the list. In the [introductory part](https://benpence.com/blog/post/psychedelic-graphics-0?ref=gorillasun.de) part Ben provides us with a breakdown of how computers interpret UV coordinates, as well as how UV mapping works, in essence, wrapping flat 2D graphics and textures onto 3D models, particularly useful in video games (Ben seems to be in the process of developing one). In [the first proper chapter](https://benpence.com/blog/post/psychedelic-graphics-1?ref=gorillasun.de), Ben tackles sinusoidal animation of colors and how to create trippy repeating patterns. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-22.15.30.png)](https://benpence.com/blog/post/psychedelic-graphics-1?ref=gorillasun.de) [Link to Article](https://benpence.com/blog/post/psychedelic-graphics-1?ref=gorillasun.de) **3 —** [**XOR Deep Dive**](https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/xor/?ref=gorillasun.de): XOR, short for "exclusive OR," is **a logical operator whose negation is the logical biconditional...** in simpler terms, it's an operation that compares two boolean values and returns true if only one of its inputs is true, but false if both inputs are the same. Simon Tatham wrote a massive deep dive on the XOR operator, not just to provide an intuition on the logical operator, but also showcasing many of the applications in which it makes an appearance and where it is a useful/necessary tool. One interesting application is in computer graphics actually. In the mid‑1980s, when home computer systems were extremely limited by memory and color depth, one innovative and efficient drawing method revolved around XOR: Rather than storing entire screen images to keep track moving objects, reversible XOR drawing was used, where each pixel of a moving object is combined with the background, such that drawing it twice would automatically erase it. Even though it would sometimes produce minor artifacts like missing pixels where lines crossed, it was a reasonable price to pay. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/animated-lines.gif) Moving-line animation using XOR drawing One other interesting appearance Simon highlights is the game of Nim (or Nim-Sum); a simple two-player game where each player takes turns removing (or "nimming") any number of objects from one of several piles (at least one), where the goal is to avoid being the player who can’t make a move because all the counters are gone. This sounds much simpler than it actually is — the key to winning ends up being calculating the “nim-sum,” which is found by applying the XOR operator to the numbers of objects in all the piles. If the nim-sum is zero, it means the current position is losing if both players play perfectly, while a nonzero nim-sum means there is a winning strategy. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-11.png) The unique winning move here is to take 3 counters from the pile of 12\. But why? There's also a good [Wikipedia entry on the game of Nim](https://en.wikipedia.org/wiki/Nim?ref=gorillasun.de). **4 —** [**JesseSort: A New Sorting Algorithm faster than Python's Default**](https://github.com/lewj85/jessesort?tab=readme-ov-file&ref=gorillasun.de): this one's a bit out of left field; Jesse Lew introduces a new sorting algorithm that operates differently from traditional sorting algorithms by leveraging a unique data structure called a *Rainbow*. [GitHub - lewj85/jessesortContribute to lewj85/jessesort development by creating an account on GitHub.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-10.svg)GitHublewj85![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/jessesort-1)](https://github.com/lewj85/jessesort?tab=readme-ov-file&ref=gorillasun.de) JesseSort operates in two main phases; first it goes through a given unsorted list and assigns each item to a specific group, called a band, by comparing against a set of key values that make up the first and last item of each band — where these key values are stored in a separate list known as the base array. The Rainbow is thus simply an organized collection of these bands — lists of items in almost sorted order. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-13.45.06.png) [Link to the pre-print paper](https://www.researchgate.net/publication/388955884%5FJesseSort?ref=gorillasun.de) This way the algorithm can quickly determine the appropriate group for each new item simply by looking at those boundary values, before merging them into a final sorted list. Jesse claims that his sort performs comparably well to well-known sorting algos like QuickSort and MergeSort in worst case scenarios, but can take advantage of data that's already partly organized — outperforming traditional methods in practical settings. The discussions in the accompanying Hacker News item are as always quite heated. Apparently there's also unspoken rules about the naming conventions of sorting algorithms 🤔 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-22.12.19.png)](https://news.ycombinator.com/item?id=43040869&ref=gorillasun.de) [Link to Hacker News item](https://news.ycombinator.com/item?id=43040869&ref=gorillasun.de) **5 —** [**The History of Algorithmic Composition**](https://ccrma.stanford.edu/~blackrse/algorithm.html?ref=gorillasun.de): I also did a little bit of web archeology this week, and found this article all the way back from 1999 about the history of algorithmic composition. It traces its evolution from ancient practices all the way to modern computer-aided techniques and contains some interesting nuggets of information. I particularly enjoyed this quote from Brian Eno in the introduction, one that I haven't encountered before, but that I believe will resonate with many of those that make generative art today: > "Since I have always preferred making plans to executing them, I have gravitated towards situations and systems that, once set into operation, could create music with little or no intervention on my part. That is to say, I tend towards the roles of planner and programmer, and then become an audience to the results" -Brian Eno (Alpern, 1995). **6 —** [**Size Coding Botto**](https://x.com/gorillasu/status/1892193404089446861?ref=gorillasun.de): if you've been keeping up with the genart x AI x NFT scene you'll likely have heard of Botto, the autonomous AI that's been community guided into creating a bunch of P5 sketches. The concept, and the heated discussions around the project are quite interesting, the art itself is kinda "meh" tbh — [you can view them here](https://p5.botto.com/?ref=gorillasun.de). The important thing I want to share is that I took a satirical a stab at tsubuyakifying (size-coding) one of them — the replies got quite out of hand with some of the size-coding legends like Piter Pasma, Frank Force, and Koma Tebe pitching in with their own attempts at it, check them out here. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-22.06.35.png)](https://x.com/gorillasu/status/1892193404089446861?ref=gorillasun.de) [Link to post](https://x.com/gorillasu/status/1892193404089446861?ref=gorillasun.de) If I find the time I might even write a little post about it, if you're curious about P5 size-coding, I have this older [post of mine about it here](https://www.gorillasun.de/blog/9-tips-for-tsubuyaki-processing/#putting-it-all-together). ## Dev & Web Tech **1 —** [**The Challenges of Building a Calculator App**](https://chadnauseam.com/coding/random/calculator-app?ref=gorillasun.de): while building a calculator app might seem trivial at first, in re-framing it as software that can correctly evaluate any of the mathematical expressions it allows you to feed into it, does make it seem a bit more complicated. Chad Nauseam recounts the story of how Hans-J. Boehm was tasked with developing Google's Android Calculator App — originally as an X thread and later as a blog post: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-16.26.40.png)](https://x.com/ChadNauseam/status/1890889465322786878?ref=gorillasun.de) [Link to thread](https://x.com/ChadNauseam/status/1890889465322786878?ref=gorillasun.de) The first challenge right off the bat are imprecise floating point numbers; for instance, you can't actually represent fractions like 0.3 or big numbers like 10^100\. And although you can circumvent these imprecision problems using bignums, that let you represent very large numbers, there's more problems — like irrational numbers such as π for example, how do you handle these precisely? The solution Boehms found was Recursive real arithmetic (RRA); a technique where each real number is represented as a function that, when given a precision, computes an approximation guaranteed to be within that error margin — in essence a kind of arithmetic that can generate real numbers to any desired level of accuracy. That's just the tip of the iceberg however, I'll leave you to explore the rest of the thread for yourself — now if you ever want, or have to, build a calculator app, you have a starting point 😆 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-16.46.07.png) **2 —** [**When Imperfect Systems are Good, Actually: Bluesky's Lossy Timelines**](https://jazco.dev/2025/02/19/imperfection/?ref=gorillasun.de): designing distributed systems for millions of users is challenging, particularly when you're trying to be sensible about it, and not build a timeline like TwiX's curated stream of BS. Jaz from the Bluesky team explains how they approach this task in an imperfect manner with their "Lossy Timelines": [When Imperfect Systems are Good, Actually: Bluesky’s Lossy TimelinesBy examining the limits of reasonable user behavior and embracing imperfection for users who go beyond it, we can continue to provide service that meets the expectations of users without sacrificing scalability of the system.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Jaz’s BlogJaz![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/fanout_diagram.png)](https://jazco.dev/2025/02/19/imperfection/?ref=gorillasun.de) Bluesky's database is fragmented into smaller shards that group users together (so that the database can scale horizontally) — each shard being capable of handling its own load perfectly well in theory, however, when some users abnormally follow hundreds of thousands of other users, it creates a huge load, slowing everything down for all other users on the same shard. To solve this, instead of trying to update every single follower perfectly, the system is allowed to skip updates at random at a rate relative to the number of inbound writes — as a result, Jaz was able to improve the overall performance dramatically, reducing P99s by over 96%. **3 —** [**NASA's 10 Rules for Software Development**](https://www.cs.otago.ac.nz/cosc345/resources/nasa-10-rules.htm?ref=gorillasun.de): Gerard J. Holzmann writes about NASA's 10 software development rules that were originally crafted for building reliable embedded systems in spacecraft. While these rules might be quite restrictive for other types of software projects, they provide a set of principles for writing mission-critical software — Gerard notes at the very start that he offers his thoughts from the POV of writing software in general, emphasizing the importance of adapting guidelines to fit the specific context of a project rather than following them blindly. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-23-at-16.52.28.png) Besides that, these rules provide a glimpse into a different kind of programming that I'm happy I don't have to do — I don't think I could handle the stress of writing software that people's lives depends on ☠️ I can also recommend the [Hacker News discussions](https://news.ycombinator.com/item?id=43061977&ref=gorillasun.de) about the post with some insightful perspectives. **4 —** [**uchū: the color palette for internet lovers**](https://github.com/NeverCease/uchu?ref=gorillasun.de): and to cap off this section, here's a cool color palette that's been specifically designed for the web 👇 [uchū — the color palette for internet loversuchū is the color palette for internet lovers, by NetOperator Wibby.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-13.svg)uchū![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-1.png)](https://uchu.style/?ref=gorillasun.de#uchu%5Fblue) ## AI Corner **1 —** [**GenAI is the Least Imaginative Use of AI**](https://hai.stanford.edu/news/ge-wang-genai-art-least-imaginative-use-ai-imaginable?ref=gorillasun.de): There's beauty and joy in making things just for the sake of making them — some of the most viral internet experiments, like Nolan Royalty's experiments, are these kinds of creations/explorations. Ge Wang, professor at Stanford comments on this in the context of AI, and how it robs us of the joys of creating meaningless fun things: [Ge Wang: GenAI Art Is the Least Imaginative Use of AI ImaginableThe prevailing public mindset that AI is only a labor-saving tool betrays a lack of understanding of why people create and a lack of imagination of this technology’s potential.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Stanford HAIGe Wang![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Ge-20Wang-20What-27s-20the-20Point-20copy.jpg)](https://hai.stanford.edu/news/ge-wang-genai-art-least-imaginative-use-ai-imaginable?ref=gorillasun.de) Ge believes that the challenges and frustrations involved in making art are what make the process meaningful and fulfilling — if we simplify things too much, AI services can strip away the personal growth and satisfaction that come from working through these creative difficulties. **2 —** [**SmolModels: ML models with Minimal Code**](https://github.com/plexe-ai/smolmodels?ref=gorillasun.de): I haven't tried it yet, but it looks really cool; a python library for building machine learning models with minimal code simply by describing what you want them to do in plain words. You explain the task, and the library builds a model for you, including data generation, feature engineering, training, and packaging. [GitHub - plexe-ai/smolmodels: ✨ build ml models in natural language and minimal code✨ build ml models in natural language and minimal code - plexe-ai/smolmodels![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-11.svg)GitHubplexe-ai![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/smolmodels)](https://github.com/plexe-ai/smolmodels?ref=gorillasun.de) ## Music for Coding After last week's recommendation I explored some of the other bands signed by Gondwana Records, one of them being GoGo Penguin, a British instrumental trio from Manchester with an incredibly dynamic sonic range; a modern, cinematic dimension of jazz that I've come to particularly enjoy these days. The live performance I linked here is absolutely sublime, the double-bass riff that kicks off "Everything is Going to Be OK" at 14:15 gave me real shivers, and then in the track after "An Unbroken Thread of Awareness" they just incorporate a modular synth sound seamlessly with their playing. Besides that, it's really impressive how the band’s able to fill up so much mix space with just a piano, double bass, and drums! And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 90Getting into Pen Plotting - Shader Programming with Rick & Morty - GPU Conditional Branching Misconception - Simulating Water over Terrain - The Art of Data Viz - Thinkserver - Gorton Font - Leaking Youtube Emails - Knob.js - The End of Programming - Freya Holmér on Generative AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-17.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Gj1iUATWEAA9b2d-1.jpg)](https://gorillasun.de/blog/gorilla-newsletter-90?ref=gorillasun.de) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 90 URL: https://www.gorillasun.de/blog/gorilla-newsletter-90/ Last updated: 2025-02-17T06:00:09.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 90th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Before we get into this week's roundup of creative tech shenanigans, let's talk about plotters*** 👇 ## Getting into Pen Plotting As the banner of this week's issue might already have revealed — I got a plotter! It arrived this past Monday actually, just a couple of hours after the previous issue of the newsletter had gone out. I didn't waste much time, quickly set it up, and had it trace out some sketches. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-9.png) I've enjoyed the process tremendously — not only because it's quite meditative to watch the plotter slowly bring physical instances of my sketches to life, but also because it's brought up some interesting new technical challenges that I had to figure out. Luckily there's tools like [Zenozeng's SVG runtime for P5](https://github.com/zenozeng/p5.js-svg?ref=gorillasun.de), that [I've previously explored way back in 2022](https://www.gorillasun.de/blog/working-with-svgs-in-p5js/), as well as Golan Levin's newer [p5.plotSvg](https://github.com/golanlevin/p5.plotSvg?ref=gorillasun.de), both of which make it quite straightforward to turn P5 outputs into plottable SVGs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-10.png) With the plotter you also need to start thinking a bit more about what works well on paper, rather that what is possible digitally (everything) — which is honestly a welcome restriction that I'm happy to embrace. I also already discovered some other useful tools, like the [axidraw hidden line removal plugin for inkscape](https://www.evilmadscientist.com/2023/hidden-paths-axidraw/?ref=gorillasun.de) that's quite handy when you have many overlapping shapes, as well as the [svgo command line tool](https://github.com/svg/svgo?ref=gorillasun.de), that will not only trim down your svg files but also reorder the paths so that the plotter doesn't waste time jumping around back and forth. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-8-1-1.png) **A gigantic shout-out to Dan Catt here, and all the content he's made around pen plotting — it's been a tremendous help!** [**Check out his YouTube here**](https://www.youtube.com/channel/UC%5F8PKPeFbehqd7cTZtCr8lA?ref=gorillasun.de)**.** I'll have more updates/pics to share next week — feel like I'm slowly getting the hang of it here. One issue I'm running into right now though, is how to not spend all of my money on pens and paper 😆 ***That said — cue the news*** 👇 ## All the Generative Things **1 —** [**Learn Shader Programming with Rick and Morty**](https://danielchasehooper.com/posts/code-animated-rick/?ref=gorillasun.de): kicking off this week with a Rick and Morty themed programming tutorial — Daniel Hooper shows us the ropes of shader programming by recreating Rick's recognizable features in 240 lines of GLSL code. [Learn Shader Programming with Rick and MortyAn interactive guide on making animations on the GPU![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/avatar-2.jpg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/rick-banner-2.jpg)](https://danielchasehooper.com/posts/code-animated-rick/?ref=gorillasun.de) The tutorial starts by explaining SDFs to create basic shapes that'll make up individual parts of Rick's face, and then shows how to combine them into more interesting composite shapes by computing their union — simply with the `min()` function. This is a trick that I sorta discovered by myself before, while doing my silly little non-shader SDF experiments. Okay, what the heck — here's a mini tutorial 😆 With P5JS we can simulate a dumb shader by looping over all the pixels of the canvas, and then setting the color of specific pixels if they falls inside a certain region we defined — in the following example we're simply drawing two circles: ```JavaScript let d1 = dist(x,y,C1.x,C1.y) - C1.r if(d1 < 0) buff.set(x,y, color(255,0,0)) let d2 = dist(x,y,C2.x,C2.y) - C2.r if(d2 < 0) buff.set(x,y, color(0,0,255)) ``` [Link to P5 sketch in the editor](https://editor.p5js.org/AhmadMoussa/sketches/-Gdc15bEP?ref=gorillasun.de) You get something like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/separateSDFs-1.png) There's a better way to do this though, without doing two separate if statements — yes, you could just do a logic or `||` — but you could also combine the two regions as one by getting the minimum distance, as such: ```JavaScript let d = min(d1,d2) if(d < 0) set(x,y, color(255,0,0)) if(abs(d) < .5) set(x,y, color(0,0,0)) // colors the outline in black ``` [Link to P5 sketch in the editor](https://editor.p5js.org/AhmadMoussa/sketches/gQlU%5Fm%5FHh?ref=gorillasun.de) Then you'd get something like the below render, where it also becomes really easy to set the color of the region's outline: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-7-1.png) Towards the end of the tutorial Daniel also shows us how to export the animation as a video — and that simply with bash script! 2 — [How to not "optimize" GPU conditionals:](https://iquilezles.org/articles/gpuconditionals/?ref=gorillasun.de) while we're already talking about GLSL, here's an important PSA from Inigo Quilez — he posts about a common misconception that's often erroneously advised to be a math trick for optimizing conditional moves on the GPU. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-16-at-12.41.17.png)](https://x.com/iquilezles/status/1888409333182218691?ref=gorillasun.de) [Link to post](https://x.com/iquilezles/status/1888409333182218691?ref=gorillasun.de) | [Link to Article](https://iquilezles.org/articles/gpuconditionals/?ref=gorillasun.de) I had to do a little bit of research to understand this, because I'm not by any means an expert; but in essence, GPUs run many threads in groups called **warps**, all of which follow the same instructions at the same time. When an `if` statement causes some threads to take one path and others to take a different one, the GPU has to run these paths separately, one after the other. This obviously slows things down because while one set of threads is working, the others have to wait — this problem is known as **warp divergence** (which sounds like something straight out of Star Trek). The issue that Inigo Quilez points out is that some people mistakenly believe that using ternary operators (`? :`) or `if` statements in shader code introduce this warp divergence. In cases where the condition simply selects between values (the code snippet he demonstrates in his post), the GPU does not actually branch — it simply performs a **conditional move (select)**, which is an efficient instruction that does not disrupt execution flow. The misguided "optimization" replaces the ternary-based selection with arithmetic masking (`step()` functions and multiplications), thinking it avoids the GPU from branching. But in reality, this approach actually introduces unnecessary calculations, making the shader slower. Inigo Quilez confirms this by inspecting the compiled GPU machine code, showing that the original ternary-based code doesn't branch, and that the so-called optimization is both unnecessary and counterproductive. **3 —** [**Simulating Water over Terrain**](https://lisyarus.github.io/blog/posts/simulating-water-over-terrain.html?ref=gorillasun.de): Lisyarus shows us how to create realistic water behavior for top-down, grid-based games in which the terrain can be dynamically modified. He introduces a method called "virtual pipes" where neighboring water cells in the game are connected by imaginary pipes to simulate the flow of water between them. [Simulating water over terrain![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32.ico)lisyarus blog![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover-3.png)](https://lisyarus.github.io/blog/posts/simulating-water-over-terrain.html?ref=gorillasun.de) In a nutshell, it's basically a simulation based on a simplified version of the Navier-Stokes equations, also known as the [**shallow-water equations (SWE)**](https://en.wikipedia.org/wiki/Shallow%5Fwater%5Fequations?ref=gorillasun.de). Instead of working in 3D, things are flattened down to 2D, averaging the water's behavior along the vertical direction. This requires the use of a **staggered grid**, where the water's height is stored inside the grid cells, whereas water flow is stored along the edges between cells. In a very oversimplified manner of explaining things, water moving between cells depends on the difference in elevation, and the amount of water held by each cell. Naturally the water will flow from higher to lower positions, and the quantity will also balance itself out — Lysiarus shares the technical details in the tutorial and also provides a WebGPU implementation [here](https://github.com/lisyarus/webgpu-shallow-water?ref=gorillasun.de). Noteworthy here is that this same approach is used in a game called Timberborn, a post-apocalyptic beaver themed city-building game: [Deep Dive: Designing the dynamic irrigation and water systems in TimberbornBuilt on hybrid 2D and 3D water simulation models, here’s how these mechanics informed the gameplay of this unique city builder.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/gamedeveloper-CAvl2PCb.ico)Game DeveloperMichal Amielanczyk![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Timberborn_Irrigation_Systems_and_Water_Modeling.jpg)](https://www.gamedeveloper.com/design/deep-dive-timberborn-s-water-mechanics?ref=gorillasun.de) **4 —** [**A Year of Learning WebGPU**](https://t.co/ymcTinAxFh?ref=gorillasun.de): if you've been meaning to get into WebGPU, Javi Agenjo shares notes he took over the course of a year of learning — in 96 slides he provides a complete introduction to WebGL's successor. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-13-at-10.52.05.png)](https://x.com/tamat/status/1889617965886193869?ref=gorillasun.de) [Link to Post](https://x.com/tamat/status/1889617965886193869?ref=gorillasun.de) **5 —** [**Visualizing Data is an Art**](https://perthirtysix.com/visualizing-data-is-an-art?ref=gorillasun.de): Shri Khalpada argues that successful data visualization isn't just about technical accuracy or perceptual precision, but should also provide new perspectives on the data, spark curiosity, and even tell a story. [Visualizing Data Is An Art - We Should Treat It Like OneThe case for less rigor and more nuance![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-35.ico)PerThirtysixShri Khalpada![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/datavizart-cover-1.png)](https://perthirtysix.com/visualizing-data-is-an-art?ref=gorillasun.de) ## Tech & Web Dev **1 —** [**Thinkserver: my web-based coding environment**](https://checkmyworking.com/posts/2025/02/thinkserver-my-web-based-coding-environment/?ref=gorillasun.de): after having heavily used [Glitch](https://glitch.com/?ref=gorillasun.de) for creating projects, a platform where devs can create and share websites with minimal setup, Christian Lawson was inspired to build his own web-based coding environment tailored towards his needs — he details how it works in an blog post of his: [Thinkserver: my web-based coding environmentI’ve made my own web-based coding environment for working on little projects. A few years ago I found Glitch. It’s great: a web-based coding environment that makes it really easy to quickly start edit![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Check my workingChristian Lawson-Perfect![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/thinkserver-index.png)](https://checkmyworking.com/posts/2025/02/thinkserver-my-web-based-coding-environment/?ref=gorillasun.de) After a year of using it and creating around 80 small projects, he shares the code for it over on his [Forgejo instance](https://code.lawson-perfect.uk/clp/thinkserver?ref=gorillasun.de). What's worth pointing out is that it strongly resonated with the folks over on Hacker News, with many sharing stories about their own custom coding environments to build small useful tools: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-16-at-22.39.44.png) [Link to Hacker News ](https://news.ycombinator.com/item?id=42999655&ref=gorillasun.de)[item](https://news.ycombinator.com/item?id=42999655&ref=gorillasun.de) **2 —** [**The hardest working font in Manhattan**](https://aresluna.org/the-hardest-working-font-in-manhattan/?ref=gorillasun.de): ***Gorton*** is an overlooked font that's seemingly almost everywhere you look in New York City — Marcin Wichary shares how he discovered and tracked it down while photographing different corners of NYC, and lets us in on the fascinating backstory of the font: [The hardest working font in ManhattanA story of a 150-year-old font you have never heard of – and one you probably saw earlier today.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Marcin Wichary![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/ogimage.png)](https://aresluna.org/the-hardest-working-font-in-manhattan/?ref=gorillasun.de) Originally created for engraving machines in the early 1900s, Gorton found its way onto everything from subway signs and machinery to space equipment — Gorton's mechanical design and durability made it perfect for signs and labels that needed to last, which is why you find it in places like nuclear facilities, and even the Apollo moon missions. *Can we also take a moment to appreciate how incredibly stylish Marcin's website is?* **3 —** [**Leaking the email of any YouTube user for 10 grand**](https://brutecat.com/articles/leaking-youtube-emails?ref=gorillasun.de): security researcher brutecat discovered that blocking someone on YouTube exposes their linked Gaia ID — a unique internal backend identifier used by Google to track user accounts across its services. By itself this ID isn't sufficient to reveal someone's email address, but they didn't stop there however, and figured that the ID can be fed into the endpoints of older Google product, like the Pixel Recorder app, to resolve into an email address. [Leaking the email of any YouTube user for $10,000What could’ve been the largest data breach in the world - an attack chain on Google services to leak the email address of any YouTube channel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-12.svg)brutecat.com![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/youtube-email-disclosure-1.png)](https://brutecat.com/articles/leaking-youtube-emails?ref=gorillasun.de) **4 —** [**How Apple Designs Virtual Knobs**](http://jherrm.com/knobs/?ref=gorillasun.de): an older article, that was apparently written in 2012, but only published in 2022 — Jacob Herr explains the clever design behind Garageband’s virtual knobs and what goes on behind the scenes for them to respond to different touch gestures like spinning and sliding. Jacob's investigation culminated in the development of Knob.js, a JavaScript library that mimics this knob behavior. [How Apple Designs a Virtual Knob![](https://static.ghost.org/v5.0.0/images/link-icon.svg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/gestures_diagram.svg)](http://jherrm.com/knobs/?ref=gorillasun.de) ## AI Corner **1 —** [**The End of Programming as We Know It**](https://www.oreilly.com/radar/the-end-of-programming-as-we-know-it/?ref=gorillasun.de): expert Tim O’Reilly argues that it's unlikely programmers will lose their jobs anytime soon, and rather than rendering the profession obsolete, it's simply a fundamental shift in programming overall — O'Reilly echoes many of the articles I've shared on the newsletter already on this topic. I believe that the fearmongering is generally just a reaction to how quickly things are evolving, but not actually a reflection of what is happening. The reaction to the paradigm shift AI introduces, isn't so different from the times when new "revolutionary" technologies were introduced — each time being proclaimed as another "End of Programming". [The End of Programming as We Know It![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-36.ico)O’Reilly MediaTim O’Reilly![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/binary-1187198_1920_crop-cf3ecf0e521f99a1bb5c5565755c9c4d-1-1.jpg)](https://www.oreilly.com/radar/the-end-of-programming-as-we-know-it/?ref=gorillasun.de) backs his claims by tracing the history of how programming has evolved, changes in programming over the past decades showed that as tools became more powerful and user-friendly, more people could create software, expanding the field rather than shrinking it. **2 —** [**Generative AI is a Parasitic Cancer**](https://www.youtube.com/watch?v=-opBifFfsMY&ref=gorillasun.de): while AI is revolutionizing certain fields, it's also wreaking destructive havoc in other places, in particular when it comes to content creation. Freya Holmér's had enough of AI generated content —in particular when it's flooding the top results of most search engines. She demonstrates this with a simple query with which she wants to learn a little more about the .gltf format, revealing that almost all of the top search results are in some form AI generated: In the second half of the video Freya comments on the deceptive nature of this content, what's seemingly friendly sounding on the surface is simply a low effort slop that tries to compete in the search rankings, either to promote whatever product/software that website is trying to sell, or to get a few cents of ad-revenue out of your attention. ## Music for Coding This one was recommended to me while listening to Matthew Halsall's On the Go that I recommended last week — and I've pretty much just been listening to Mammal Hands this entire week, in particular their fifth studio album "Gift from the Trees" that came out last year. All tracks are really rich and atmospheric, somehow earthy and spiritual. Swirling, smooth saxophone melodies soar above complex rhythmic percussion patterns. I can also highly recommend all other albums put out by Gondwana Records, it's all just pure ear candy! *Fun fact: after digging for the designer behind the stellar album covers, it turns out that it's actually Matthew Halsall's brother, Daniel Halsall, the creative director of Gondwana Records.* And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 89Voronoi Diagrams via Fortune’s Algorithm - Planetary Fluid Simulations - GameDev Maths - Spirograph Mathematics - Post-Processing Shaders as Creative Medium - Returns and Swirls - Sublime Text in 2025 - Sam Rose on Technical Blogging - Container Queries Unleashed - Coding with your Voice![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-16.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/myCanvas-58--1-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-89) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 89 URL: https://www.gorillasun.de/blog/gorilla-newsletter-89/ Last updated: 2025-02-10T06:00:57.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 89th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Cue the news*** 👇 ## All the Generative Things **1 —** [**Generating Voronoi Diagrams using Fortune's Algorithm**](https://redpenguin101.github.io/html/posts/2025%5F01%5F21%5Fvoronoi.html?ref=gorillasun.de): let's kick this week off with a rather obscure blogpost I found — you just know that the content is fire when the URL ends with a .html, the page itself is rather un-styled, and the tutorial comes with a health warning at the very top 🤣 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-08-at-22.39.32.png)](https://redpenguin101.github.io/html/posts/2025%5F01%5F21%5Fvoronoi.html?ref=gorillasun.de) [Link to Post](https://redpenguin101.github.io/html/posts/2025%5F01%5F21%5Fvoronoi.html?ref=gorillasun.de) When it comes to generating Voronoi Diagrams, many roads lead to Rome, and in the context of this beefy article, our road is Fortune's algorithm: Joe, aka redpenguin, wrote a massive tutorial detailing how to implement the algo 👇 In a nutshell, Fortune's algorithm builds a Voronoi diagram by "sweeping" a horizontal line across a set of points: as the line moves, it creates a curve called the beach line that changes shape based on which points have been passed. When the sweep line reaches a new point, an arc is added to the beach line, and as the curve evolves, arcs may merge or disappear, forming new corners (vertices) in the diagram. The algorithm keeps track of these changes using a structured list of events, allowing it to efficiently and gradually construct the full diagram. By far one of the best visualizations of the algorithm that I've seen is by Daniel Piker — in the 3D context the abrupt motion of newly added arcs just makes much more sense. 0:00 /0:06 1× [Link to Original by Daniel Piker](https://x.com/KangarooPhysics/status/1253336959755251716?ref=gorillasun.de) In theory the algorithm sounds quite simple, but its implementation is actually quite challenging as Joe states at the beginning of the article. This is mainly due to how you need to handle the addition of new voronoi sites to the diagram as the beachline progresses — if you're up for a challenge you know where to start! **2 —** [**Planetary Fluid Simulations**](https://www.youtube.com/watch?v=8nIB7e%5Feds4&ref=gorillasun.de): Sebastian Lague returns with another video on Fluid Simulations, this time in the planetary context! He adapts the fluid sim that he's implemented over the course of two previous installments of his coding adventure to act as the hydrosphere of a planet — this involves simulating gravity, actual terrain for the fluid to collide with, and dialing in the influence of celestial bodies on the tide: If you're out of the loop, roughly a year ago Lague made his [first video on fluid sims](https://www.youtube.com/watch?v=rSKMYc1CQHE&ref=gorillasun.de), in which he implements the particle algorithm described in the famous paper "[Particle-Based Fluid Simulation for Interactive Applications](https://matthias-research.github.io/pages/publications/sca03.pdf?ref=gorillasun.de)". Lague followed up with a second coding adventure, where he investigates [rendering the particle sim as a visually realistic fluid](https://www.youtube.com/watch?v=kOkfC5fLfgE&ref=gorillasun.de). **3 —** [**Maths for GameDev**](https://www.youtube.com/watch?v=eRVRioN4GwA&ref=gorillasun.de): unsurprisingly much of the math required for game development is pretty much identical with the techniques frequently used in creative coding and generative art. After a seven month hiatus, another one of my favorite educative video makers, SimonDev, returns with a new video — a primer for game dev maths, covering linear interpolation, vectors, trigonometry, and all that fun stuff. **4 —** [**The Mathematics of Spirograph**](https://aperiodical.com/2021/12/the-mathematics-of-spirograph/?ref=gorillasun.de): A Spirograph is not actually the spiral-y drawing that likely comes to mind reading the term, but rather a drawing device that lets you create the circular shapes — the drawings themselves are in fact called hypotrochoids and epitrochoids. Found this older post, back from 2021, while looking into the topic — an article by Katie Steckles that runs The Aperiodical, an online magazine and podcast about arts-y math related topics. [The Mathematics of SpirographIf you’re the kind of person who’s interested in doodling and/or fun toys, you might have encountered the fun doodling toy Spirograph, or some unbranded equivalent. It sits somewhere on…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-14.png)The AperiodicalKatie Steckles![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/spirograph-edited.jpg)](https://aperiodical.com/2021/12/the-mathematics-of-spirograph/?ref=gorillasun.de) Highly recommend checking out the other articles by the Aperiodical, the magazine posts relatively frequently — about once a month. The drawing device typically consists of a fixed outer ring and a smaller, movable wheel with several holes for a pen; by placing the pen in one of these holes and rolling the wheel along the inside or outside of the ring, one can produce a wide range of complex, looping designs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-6.png) Spirograph set (early 1980s UK version) Obviously it's not required for simulating the patterns algorithmically with a computer, but it's kind of a beautiful way to visualize the maths behind the resulting patterns. **5 —** [**Post-Processing Shaders as a Creative Medium**](https://blog.maximeheckel.com/posts/post-processing-as-a-creative-medium/?ref=gorillasun.de): throughout 2024 Maxime Heckel published a series of articles about post-processing shader techniques specifically geared towards creating aesthetic effects, such as dithering, painterly textures, and moebius style aesthetics. In contrast to these deep-dives that hone in on specific techniques, this time-round Maxime presents us with a whole swath of effects that he's explored over the past months, explaining each one in detail and providing us with interactive code to play around with. [Post-Processing Shaders as a Creative Medium - Maxime Heckel’s BlogTBD![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Maxime HeckelMaxime Heckel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/4ee5dd3a7430a9057589b7736b41c263.png)](https://blog.maximeheckel.com/posts/post-processing-as-a-creative-medium/?ref=gorillasun.de) **6 —** [**Perceptions of Space**](https://x.com/getjonwithit/status/1886858295157383335?ref=gorillasun.de): Jonathan Gorard wrote a wonderful thread about how we quantify the distortion of space and time via measures of energy, momentum, pressure, etc. in just a few words Gorard offers us an alternative way to think about these concepts much more intuitively. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-08-at-14.48.37.png)](https://x.com/getjonwithit/status/1886858295157383335?ref=gorillasun.de) [Link to Post](https://x.com/getjonwithit/status/1886858295157383335?ref=gorillasun.de) ## Tech & Web Dev **1 —** [**Sam Rose on Technical Blogging**](https://writethatblog.substack.com/p/sam-rose-on-technical-blogging): I love me a good interview, and this one was excellent! Sam Rose, who's made several appearances on this newsletter already for his stellar interactive articles, was invited by Write that blog! — a blog that revolves around the practice of writing a blog. They ask Sam Rose how he got into blogging in the first place, how he writes his technical pieces, and what the biggest lessons he's learned over the years were. [Sam Rose on Technical BloggingThe story behind Sam’s masterful interactive visualizations![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Faa988cd7-0d48-4560-82f1-9056a0d84a7b-2Fapple-touch-icon-180x180.png)Write that blog!Write that blog!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F273ccb06-8961-450c-9405-17da1a215dea_1456x1048.png)](https://writethatblog.substack.com/p/sam-rose-on-technical-blogging) He closes out with some tips for those interested in starting out. **2 —** [**Container Queries Unleashed**](https://www.joshwcomeau.com/css/container-queries-unleashed/?ref=gorillasun.de): Josh Comeau is also back with another new article, this time breaking down how container queries enable new avenues in UI design. Before digging into this one, you might want to first check out Josh Comeau's previous deep dive "[A Friendly Introduction to Container Queries](https://www.joshwcomeau.com/css/container-queries-introduction/?ref=gorillasun.de)". [Container Queries Unleashed • Josh W. ComeauContainer queries expand the universe of designs that can be implemented, giving us whole new superpowers. Now that container queries are broadly available, I think it’s time we start exploring this potential! In this post, I’ll share the “killer pattern” I can’t stop using in my work, and explore what’s possible with this new capability.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-15.png)Josh W. Comeau![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-container-queries-unleashed.jpg)](https://www.joshwcomeau.com/css/container-queries-unleashed/?ref=gorillasun.de) If you're not familiar, **container queries** are a relatively new CSS feature that allows you to apply styles to an element based on the size (or other properties) of its containing element rather than the overall viewport - while media queries allow you to change the overall layout of elements on your page, they can't really be used to describe how the stuff within those elements should respond dynamically as the container's size changes. As always, Josh provides us with interactive examples to illustrate this. **3 —** [**Coding with your Voice**](https://whitep4nth3r.com/blog/how-i-learned-to-code-with-my-voice/?ref=gorillasun.de): while going through Josh Comeau's archive of articles I found an interesting one from a couple of years ago in which he writes about [how he had to use his voice for coding](https://www.joshwcomeau.com/blog/hands-free-coding/?ref=gorillasun.de) during a period of six months, when he lost the ability to use his hands. Purely by coincidence, I came across an article by Salma Alam-Naylor, aka whitep4nth3r, where she recounts a similar difficult situation after being afflicted by carpal tunnel syndrome. She provides a list of the tools that ended being useful to her, like [Talon](https://talonvoice.com/docs/?ref=gorillasun.de) and [Cursorless](https://www.cursorless.org/?ref=gorillasun.de), that let you write and navigate simply with your voice. [How I learned to code with my voiceStruggling with severe hand pain, I learned to code by voice. This is my journey with Talon and Cursorless, plus practical tips for hands-free development.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-26.png)whitep4nth3r.comSalma Alam-Naylor![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og_pink_aug2024.png)](https://whitep4nth3r.com/blog/how-i-learned-to-code-with-my-voice?ref=gorillasun.de) Just as I was writing this, I found through Salma's Bluesky that she'd been on Kevin Powell's YouTube channel to talk about her situation: She points out that this condition is much more common than you might think, which became apparent when she turned to her following asking for advice. The big response she received showed that a surprising number of people struggle, or have struggled, with accessibility — browsing the web, using every-day tools, like Notion, as well as the UIs of different apps, many of them simply aren't geared towards accessibility. **4 —** [**Why I still like Sublime Text in 2025**](https://ohdoylerules.com/workflows/why-i-still-like-sublime-text-in-2025?ref=gorillasun.de): I have to confess, I've never really spent much time customizing/optimizing my coding environment and editor to my needs — I generally just use things the way they come out of the box. This recent article by James Doyle makes me reconsider however, having been an avid Sublime Text user for the past 15 years, he shares why it continues to be his go-to editor in 2025. [Why I still like Sublime Text in 2025 | OhDoyleRulesI still use Sublime Text in 2025 even after trying a lot of other editors![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-25.png)OhDoyleRulesjames2doylegmail.com James Doyle![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/logo-2.png)](https://ohdoylerules.com/workflows/why-i-still-like-sublime-text-in-2025/?ref=gorillasun.de) **5 —** [**Smuggling Arbitrary Data through an Emoji**](https://paulbutler.org/2025/smuggling-arbitrary-data-through-an-emoji/?ref=gorillasun.de): and to cap off, this cool post by Paul Butler on a trick that lets you encode arbitrary data in emojis and other text 🤯 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-09-at-14.21.34.png)](https://paulbutler.org/2025/smuggling-arbitrary-data-through-an-emoji/?ref=gorillasun.de) [Link to Post](https://paulbutler.org/2025/smuggling-arbitrary-data-through-an-emoji/?ref=gorillasun.de) ## AI Corner **1 —** [**AI can't see the Gorilla in the Data**](https://chiraaggohel.com/posts/llms-eda/?ref=gorillasun.de): Itai Yanai and Martin Lercher explored how having specific hypotheses can limit people’s ability to notice obvious patterns in data. They found that students who were told exactly what to look for often missed unexpected trends, like a “gorilla in the data.” — this isn't a metaphor, but basically the plotted data appeared in the shape of an actual gorilla 😆 [Your AI can’t see gorillas – Chiraag GohelA comparison of LLMs’ ability to perform exploratory data analysis![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Chiraag Gohel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/unnamed-chunk-4-1.png)](https://chiraaggohel.com/posts/llms-eda/?ref=gorillasun.de) To dig deeper, they compared how ChatGPT and Claude handled data analysis. Both models did a good job summarizing numbers but struggled to spot unusual patterns in visual plots unless shown the images directly. Even then, they didn’t recognize the hidden “gorilla” without extra prompting. This highlights that while large language models are great for crunching numbers, they might miss surprising insights during open-ended exploration. **2 —** [**Deep Dive into LLMs**](https://www.youtube.com/watch?v=7xTGNNLPyMI&ref=gorillasun.de): if it comes from Andrej Karpathy, one of the leading minds in AI today, then it's probably the first and last video on LLMs you'll likely need for the foreseeable future — and it's a whopping three and a half hours long video at that. **3 —** [**DeepSeek Drama Continued**](https://x.com/7etsuo/status/1886770680794104221?ref=gorillasun.de): maybe DeepSeek was in fact just a big media stunt after all, and isn't as revolutionary as it's claimed to be — to cap off the AI section, I leave you with tetsuo.ai that explain why DeepSeek could not have possibly been trained on just a $6 million budget. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-09-at-15.38.22.png)](https://x.com/7etsuo/status/1886770680794104221?ref=gorillasun.de) [Link to Post](https://x.com/7etsuo/status/1886770680794104221?ref=gorillasun.de) ## Music for Coding This is some of the absolute best Jazz I have heard in a hot minute — Matthew Halsall had me hooked with the first couple of notes that came through his trumpet. I can't remember the last time I've listened to an instrumental album where the trumpet takes the lead; but Halsall's buttery smooth notes are just ear candy. Halsall is a British jazz trumpeter, composer, and bandleader that has earned critical acclaim for his innovative and soulful approach to modern jazz — the rich and introspective soundscapes in his third studio album *On the Go* are testament of this. Looking at some of what others said about the album, it's been described as a musical journey, while that may be a cheesy way to put it, I couldn't agree more. Each track carries you away in a different manner, from soaring highs that sweep you off your feet to quiet stretches that let you regain your composure. Those heavily oriental sounding scales throughout even stirred a hint of nostalgia in me. And that's a wrap — hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 88Wrapping Up Genuary 2025 - Surface-stable Fractal Dithering - Automatic Wave Function Collapse - Kim Asendorf’s PXL DEX - Piter Pasma’s Impossible Sentinels - Tweet Sized Web Assembly Compiler - Modern Javascript Servers - Accessibility Essentials - DeepSeek R1 & o3-mini![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-15.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/pattern-18-.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-88) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 88 URL: https://www.gorillasun.de/blog/gorilla-newsletter-88/ Last updated: 2025-02-03T06:00:53.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 88th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server where we nerd out about all sorts of genart and tech things — if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Before we get into this week's news — let's first wrap up Genuary 2025*** 👇 ## Wrapping Up Genuary 2025 First things first — mad props to everyone who completed the 31 prompts this year round! Although I cheated and secretly prepared a couple of prompts ahead of time towards the end of December 2024, I still didn't manage to keep up 🤣 this actually makes it the first Genuary that I don't manage to finish all the prompts on time. No biggie though — I'm simply going catch up in the coming days, and tackle the leftover prompts that inspire in the moment. In the meantime, here's a batch of sketches for some of the prompts I tackled this past week: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/collage2-7-.jpg) #14 Pure Black and white. No Gray | #19 OP Art | #21 Create a collision detection system (no libraries allowed) | #22 Gradients only | #25 One line that may or may not intersect itself | #27 Make something interesting with no randomness or noise or trig You'll notice that I got quite obsessed with OP art this time round, a consequence of browsing Pinterest that provides boatloads of excellent visual references for the topic. My sketches for prompts #14, #19, and #25 are pretty similar in approach, they all redraw an underlying input image with a simple geometric shape, albeit in a slightly different manner. In #14 I crank up the number of dashes drawn on the brighter areas of the image (almost like a stippling effect), whereas in #19 and #25 I simply modulate the stroke width — turns out are our brains are really good tricking us into seeing images. ***In retrospect, it's kind of a sort of dithering... with extra steps?*** For the 25th prompt I came across this really cool thread on the code golf stack exchange, where folks have a crack at exactly this task — redrawing images simply with a single line, a cool rabbit hole you might want to explore for yourself: [Redraw an image with just one closed curveInspired by vi.sualize.us Goal The input is a grayscale image and the output is a black and white image. The output image consists of just one closed curve (loop) that is not allowed to intersect…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-21.png)Code Golf Stack Exchangeflawr![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/apple-touch-icon@2.png)](https://codegolf.stackexchange.com/questions/36374/redraw-an-image-with-just-one-closed-curve?ref=gorillasun.de) Beyond that I also released a project on the lovely EditArt.xyz, after Piero was so kind to hit me up and ask if I'd like to participate in the Genuary 2025 project marathon organized by Tezos. Collision detection algos are something that I've explored copiously in the past, and the project is in essence just an elaborate packing procedure that places rectangular shapes in a non-overlapping manner. I titled it [**Fït**](https://www.editart.xyz/series/KT1Er4LJTHHfGTMfitthgLxeKjCwivK8z7Je?ref=gorillasun.de), as a sort of spiritual successor to the previous project I had minted on EditArt back in 2023 **Blöck**. The challenge here was optimizing the code so that the packing algo runs almost instantly — something that's necessary for EditArt due to the sliders that let collectors modify their iteration prior to collecting it. You can play with the artwork for yourself [here](https://www.editart.xyz/series/KT1Er4LJTHHfGTMfitthgLxeKjCwivK8z7Je?ref=gorillasun.de). And that's about it for my own genuary shenanigans these past two weeks. Once I'm done with all of the prompts I might put together a recap post. Not promising anything at this point in time though, I might just end up being as busy 😅 As for my favorite sketches that popped up on my timeline — here's a few that stood out to me: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/collage2-8-.jpg) [Link to Stranger in the Q's post](https://x.com/stranger%5Fintheq/status/1883278834549838144?ref=gorillasun.de) | [Link to Pablo Andrioli's post](https://x.com/kali%5Fshade/status/1881549079941161164?ref=gorillasun.de) | [Link to Piter Pasma's post](https://x.com/piterpasma/status/1883998868830122209?ref=gorillasun.de) Stranger in the Q's day 25 creation is in a way similar to what I did for #19 and #25, where the image emerges through the thickness of the line — zooming in on Stranger's sketch, it also appears to just be a single line that's perturbed when it coincides with darker areas of an underlying image. What's really is that the pattern itself also seems to just be a single line or 3D wire that fills out the scene. Pablo Andrioli is a shader wizard that's been at it for several decades, and I have absolutely no idea how he conjures up the fractal architecture in his sketch — but it's absolutely stellar. Highly recommend checking out his profile for more shader/fractal explorations. Then there's none other that the creator of Genuary himself, Piter Pasma, with his photo-realistic renderer: for day 27 "no randomness" he humorously generated two dice. I've thought about this before, but what if we make a full fledged, realistic physics simulation in which we roll a pair of dice, would that technically be pseudo-true-randomness? 😆 Two other creators that I want to highlight here are Kat, aka the Poet Engineer, and Torin Blankensmith, both of which are making cool interactive, gesture controlled sketches. Not only do they make me want to explore this myself, it seems that these sketches also have a big potential for virality, purely based off of the amount of engagement they rake in. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/collage2-9-.jpg) [Link to Kat's post](https://x.com/poetengineer%5F%5F/status/1882297032901329270?ref=gorillasun.de) | [Link to Torin's post](https://x.com/blankensmithing/status/1884523743428378821?ref=gorillasun.de) And that's it for Genuery related things! With the month having come to an end, that's also going to be it for these special segments at the start of the newsletter — I might bring back this broader, ramblier starting segment from time to time whenever there's something that deserves its own section. ***That said — cue the news 👇*** ## All the Generative Things **1 —** [**Surface-Stable Fractal Dithering**](https://www.youtube.com/watch?v=HPqGaIMVuLs&ref=gorillasun.de): purely by chance I featured Rune Skovbo Johansen in issue [#86](https://www.gorillasun.de/blog/gorilla-newsletter-86/) of the newsletter for the procedural game that he's been working on for the past couple of years. This past week Rune made a splash on social media and Hacker News by publishing a video and [Github repo](https://github.com/runevision/Dither3D?ref=gorillasun.de) about a new dithering technique he created, he titled it Surface-Stable Fractal Dithering for its ability to dither moving scenes in a stable, non-flickering manner — while also having maintaining its density in a fractal like manner. This new technique is essentialy the outcome of Rune's quest in creating a 3D dithering pattern that remains stable as the player moves around the world. Rune was originally inspired by Lucas Pope's **Return of the Obra Dinn** — which might've already come to mind seeing the above thumbnail ☝️ It's an iconic game that's famous for its unique dithered aesthetic. [Lucas wrote numerous articles documenting his explorations](https://forums.tigsource.com/index.php?topic=40832.msg1363742&ref=gorillasun.de#msg1363742) leading to the dithering technique that he ultimately used in the game; in his explorations he also found that standard dithering techniques are not particularly suitable for moving scenes, as they can cause a distracting flickering; arguably also nauseating to take in. Lucas Pope ultimately ended up mapping dithered textures to a sphere around the player camera, so that the dither patterns are invariable as the player rotates, but still change during translation of the camera. This effect was visually acceptable and does not detract from the experience. Inspired by this approach, Rune wondered if it was possible to create a dithering technique that would stay consistent even during translation of the camera. I'll leave it to Rune and the excellent video he made to explain how the algorithm works — and why As always it's worth checking out the [Hacker News thread](https://news.ycombinator.com/item?id=42808889&ref=gorillasun.de) on the topic where you'll find more links to interesting realted things — in particular [this discussion](https://news.ycombinator.com/item?id=42084080&ref=gorillasun.de) from not too long ago about the Lucas Pope's dithering technique. **2 —** [**Wave Function Collapse**](https://www.youtube.com/watch?v=5iSAvzU2WYY&ref=gorillasun.de): Daniel Schiffman is back in the trenches, and revisits the Wave Function Collapse algorithm. He first covered in coding challenge #171 two years ago — you can find the [original video here](https://www.youtube.com/watch?v=rI%5Fy2GAlQFM&ref=gorillasun.de). If you're not familiar, WFC is an algorithm that lets you procedurally generate tile-based patterns by automatically resolving adjacency rules. I wrote a little bit about it in issue [#70](https://www.gorillasun.de/blog/gorilla-newsletter-70/) of the newsletter, in addition to a newer more general technique by the same creator, Paul Merrell. One aspect of the algorithm that Daniel Schiffman didn't cover in the original video revolves around an extension of the algorithm, wherein it can automatically detect adjacency patterns in an input texture, and then generate new similar patterns on its own — kinda what you can see in the thumbnail down below 👇 **3 —** [**Kim Asendorf's PXL DEX**](https://pxl.onl/dex?ref=gorillasun.de): Kim Asendorf made quite a splash in the genart scene with his newest work PXL DEX: an onchain generative artwork consisting of 256 editions, each an abstract 3D animation called a Deck that can be purchased as an NFT through a custom website. The innovative thing about the project is that it's tied to its own token — when collectors grab a Deck they also get 500,000 PXL, which they can then spend on the artwork to modify its aesthetics; essentially increasing the pixel density of the artwork. This is a bit esoteric, hence I highly recommend checking out the custom PXL DEX website and exploring it a bit for yourself — it's really mind-boggling elaborate: [PXL DEXKim Asendorf’s PXL DEX poses provocative questions about the simultaneously material and ephemeral nature of digital art, revealing surprising perceptual qualities of digital objects, demonstrating how artworks create their own internal systems, and functioning as a digital jewel box, a virtual object for collecting virtual objects. Asendorf lays bare the foundations of digital art on screens, offering insights into the nature of digital objecthood.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Kim Asendorf![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/pxl-dex-index.png)](https://pxl.onl/dex?ref=gorillasun.de) Naturally, Le Random are quick as always and already covered PXL DEX with their most [recent interview](https://www.lerandom.art/editorial?ref=gorillasun.de). This is without a doubt the direction that the onchain genart space is heading towards in 2025\. The long-form paradigm that emerged in 2021, is now making way to a new breed of generative art on the blockchain that's much more tied to the underlying tech than before. With Bjørn Staal's Entangled last, and now Kim Asendorf's PXL DEX, the bar has been raised significantly — the generative artwork now needs to do more than just be a long-form if it wants to receive critical acclaim. **4 —** [**Piter Pasma's Impossible Sentinels**](https://piterpasma.nl/impossible-sentinels/?ref=gorillasun.de): I might be biased here, but Piter Pasma's Impossible Sentinels is just such an impressive project, that I need to gush about it for a bit. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/collage2-10-.jpg) Impossible Sentinels. code on the left and output on the right. Over the past two weeks I spent a lot of time writing about the Cure3 projects — that actually go live on fxhash today! In case you're not familiar, Cure3 is a charitable art fundraiser that supports Cure Parkinson's; in 2023, as well as this year, the fifth edition of the event, they're featuring a digital section where the sale of generative art on fxhash supports the cause. One of the participating projects is Piter's Impossible Sentinels — the backstory behind it is quite fascinating, I recounted it briefly in a [thread](https://x.com/fx%5Fhash%5F/status/1882775249063751830?ref=gorillasun.de) over on the main fxhash TwiX account! Back in 2022 Piter developed a framework for his project Industrial Devolution, essentially an algorithm that lets him turn 3D scenes (generated by using SDFs) into plottable line drawings in SVG format — he wrote an [article](https://www.fxhash.xyz/article/rayhatching-evolution?ref=gorillasun.de) about this framework back in 2022, giving it the fitting name "Rayhatcher". Later this same idea evolved into The Universal Rayhatcher, where collectors could input their own SDF formulas that would then be rayhatched; culminated in this large large-scale collaborative artwork, with some really mindblowing outputs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-4.png) Universal Rayhatcher #9 Impossible Sentinels is in essence the latest evolution of this idea, with the additional twist that the shape is now traced with a single uninterrupted line, rather than a hatch pattern — Piter wrote a little bit about it, as well as the compressed, hyper-optimized code that powers the artwork, in a [post](https://piterpasma.nl/impossible-sentinels/?ref=gorillasun.de) over on his website. **5 —** [**On Signed Distance Fields by Render Diagrams**](https://renderdiagrams.org/2017/12/28/signed-distance-fields/?ref=gorillasun.de): since we're talking about SDFs, here's a not-so recent article back from 2017 that explains how SDFs work for the purpose of approximating shapes. Signed distance fields are essentially shape defining mathematical functions — a technique that became popular after Valve (studio behind Half Life and Counter Strike) introduced them in a [paper of theirs](https://steamcdn-a.akamaihd.net/apps/valve/2007/SIGGRAPH2007%5FAlphaTestedMagnification.pdf?ref=gorillasun.de) in 2007 at SIGGRAPH, in particular for the purpose of text rendering. Highly recommend giving this post a read and playing around with the interactive examples — it really illustrates the idea excellently. **6 —** [**Analytical Portrait**](https://ssbkyh.com/works/analytic%5Fportrait/?ref=gorillasun.de): I guess this week's issue is just about highlight cool projects — I discovered the work of Shinseungback Kimyonghun this past week that really spoke to me aesthetically. In particular their recent project Analytical Portraits, that reminds me a bit of fxFactune — I really love artworks that incorporate pseudo-scientific elements. In this case it's cool because those elements are traces of the process by which the artwork is created in the first place. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/image-5.png) **SSB, Analytic Portrait*, AI system and camera, 2024\. | **Analytic Portrait* is a series of portraits created based on the way AI perceives humans. 14 AI vision algorithms\* are used to analyze the human subject, and the integrated results are recorded to construct the portrait image. ## Tech & Web Dev **1 —** [**WASM Compiler that fits in a Tweet**](https://wasmgroundup.com/blog/wasm-compiler-in-a-tweet/?ref=gorillasun.de): my favorite find this week is this article about creating a WebAssembly compiler in just 269 bytes — code so short it fits in a Tweet! If you're not familiar with WebAssembly (WASM), it's a portable binary format that allows running compiled code, from languages like C, C++, Rust, and others, in web browsers — a WASM compiler translates this compiled code into a binary format that can be run in the browser. [A WebAssembly compiler that fits in a tweetStarting with a 192-byte one-liner that implements a Reverse Polish Notation arithmetic compiler, we’ll work backward to transform it into readable JavaScript by removing one code golf trick at a time![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-28.ico)WebAssembly from the Ground Up![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover-2.png)](https://wasmgroundup.com/blog/wasm-compiler-in-a-tweet/?ref=gorillasun.de) Here's the tweet-sized compiler discussed in the article: ```JavaScript let c=(b,l)=>WebAssembly.instantiate(new Int8Array( [,97,115,109,1,,,,1,5,1,96,,1,127,3,2,1,,7,4,1,,,,10, l=(b=b.split` `.flatMap(t=>t>-1?[65,t]:107+'-*/'.indexOf(t))) .length+4,1,l-2,,...b,11])) ``` Interestingly it's broken down with a reverse approach, by unobfuscating the code step by step, rather than starting out from an understandable piece of code that's then slowly obfuscated. While the article doesn't go into too much detail about WebAssembly itself, it does cover many useful JavaScript code-golfing tricks — if you want to learn more about WebAssembly though, I recommend checking out this big [github](https://github.com/mbasso/awesome-wasm?ref=gorillasun.de) repo that collects more than enough resources to get started. **2 —** [**The Modern Way to write JavaScript Servers**](https://marvinh.dev/blog/modern-way-to-write-javascript-servers/?ref=gorillasun.de): in a recent post of his, Marvin Hagemeister explains a new, simpler way to build JavaScript servers. When using Node.js, you have to set up a network connection (or “bind to a socket”) to make your server listen for requests — meaning that your code has to open a specific port and wait for data to come in; which makes testing slow and complicated. His modern approach uses a style similar to the browser’s fetch API: instead of binding a socket, your server is just a function that takes a request and returns a response. Testing is now much faster because you can directly call your server function without setting up a network connection. [The modern way to write JavaScript serversThe Request/Response-API is not just faster, but also makes writing tests easier.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-22.png)marvinh.dev![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/me-twitter.jpg)](https://marvinh.dev/blog/modern-way-to-write-javascript-servers/?ref=gorillasun.de) **3 —** [**Accessibility Essentials every Front-end Developer should know**](https://martijnhols.nl/blog/accessibility-essentials-every-front-end-developer-should-know?ref=gorillasun.de): accessibility in front-end development is not just about compliance; it's about improving user experience for all. Martijn Hols shares a fantastic resource that outlines essential accessibility principles — an cheat-sheet for when you're doing your next accessibility audit: [Accessibility essentials every front-end developer should know by Martijn HolsEssential accessibility practices for front-end developers, including semantic HTML, alt texts, ARIA, and keyboard navigation tips to build inclusive components.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-13.png)Martijn Hols![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/ogimage-accessibility-essentials-every-front-end-developer-should-know.391eb371.png)](https://martijnhols.nl/blog/accessibility-essentials-every-front-end-developer-should-know?ref=gorillasun.de) **4 —** [**Tetris in a PDF Explainer**](https://th0mas.nl/2025/01/12/tetris-in-a-pdf/?ref=gorillasun.de): In the [last issue](https://www.gorillasun.de/blog/gorilla-newsletter-87/) I shared Thomas Rinsma's DOOM in PDF, and [prior](https://www.gorillasun.de/blog/gorilla-newsletter-86/) to that his Tetris in a PDF experiment. This past week he wrote a quick post on his blog that explains how these experiments work — spoilers: it's basically just JavaScript! ## AI Corner Holy Moly, we got a lot of ground to cover this week in AI! 🤯 **1 —** [**DeepSeek is a Game Changer for AI**](https://www.youtube.com/watch?v=gY4Z-9QlZ64&ref=gorillasun.de): DeepSeek R1 is the new competitor in the AI arms race, that seemingly came out of nowhere from a small Chinese company; and somehow it's rivaling, if not outperforming, the multi-million dollar models of OpenAI, Anthropic, and Google — all while being [open-source](https://github.com/deepseek-ai/DeepSeek-V3?ref=gorillasun.de)! It's made quite a big buzz these past two weeks, and the the big AI companies are in shambles. **What makes DeepSeek so good, while being trained at a fraction of the cost?** *Afaiu*, DeepSeek optimizes several parts of the LLM pipeline, from training to running on prompts out in the wild — for instance, it employs a technique called **Mixture of Experts**, where it activates only specific parts of its learned weights for different prompts/tasks, that are related to the specific subject, making it overall more efficient to train and run. A recent Computerphile video provides an excellent breakdown of this: But that's not the only thing that people are excited about — it's mainly the **Chain of Thought** method that DeepSeek employs to arrive at conclusions, it's also why it's called a reasoning model in the first place. If you used o1, it's basically the same thing, where the LLM engages in a sort of reflection step before delivering answers. Another key aspect of this kind of thought model, is that it allows for **Model Distillation**, which allows a large reasoning model to train a smaller, regular version of itself to solve the same tasks at an acceptable performance, while also being able to operate on standard hardware. This ultimately means that more people can access and use advanced AI without needing expensive equipment. Some folks have also taken it upon themself to run the most powerful DeepSeek model on local hardware — here's a tutorial if you want to take a stab at it: [How To Run Deepseek R1 671b Fully Locally On a $2000 EPYC Server – Digital Spaceport![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/headshot-no-bg.png)Check Out My Other Posts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/deepseek-r1-671b-on-local-2k-AI-Server-4-1024x576.png)](https://digitalspaceport.com/how-to-run-deepseek-r1-671b-fully-locally-on-2000-epyc-rig/?ref=gorillasun.de) **2 —** [**OpenAI releases o3-mini**](https://openai.com/index/openai-o3-mini/?ref=gorillasun.de): the release of DeepSeek has definitely thrown OpenAI into a scramble, most likely forcing their hand to release their newest series of o3 models early — as well as opening up their previously 200$/month o1 model to copilot users free of charge. I played around with it a bit, and it's actually quite an improvement at their regular LLM models. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/02/Screenshot-2025-02-02-at-21.22.02.png)](https://openai.com/index/openai-o3-mini/?ref=gorillasun.de) [Link to announcement post](https://openai.com/index/openai-o3-mini/?ref=gorillasun.de) **3 —** [**AI-generated Art can't get Copyright Protection**](https://www.theverge.com/news/602096/copyright-office-says-ai-prompting-doesnt-deserve-copyright-protection?ref=gorillasun.de): to cap off this crazy week in AI, there's also been a development with regards to copyright of AI generated art. In essence, the US copyright office declared in a [broad report](https://copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf?ref=gorillasun.de) that purely prompt based generated outputs can't be copyrighted, no matter how elaborate the prompt is, this doesn't however include art created with the partial assistance of AI, as far as I understand. The Verge covers this in detail in a recent article: [Purely AI-generated art can’t get copyright protection, says Copyright OfficeAI prompts are different from Jackson Pollock’s paintings, apparently.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-23.png)The VergeLauren Feiner![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/STK149_AI_Chatbot_K_Radtke.jpg)](https://www.theverge.com/news/602096/copyright-office-says-ai-prompting-doesnt-deserve-copyright-protection?ref=gorillasun.de) Considering that in recent years many artists have made a career out of AI generated imagery, the implications are quite severe. I'm also wondering about the ramifications this could have for generative art as a whole (whether you subscribe to the idea that it's an umbrella term or not) — what does this mean for art created through autonomous systems in general? I might have to throw the report into ChatGPT and have it answer that for me 😜 ## Music for Coding Jon Hopkins is a British musician and producer celebrated for his signature sound that blends ambient textures with pulsating rhythms. His innovative work—featured in albums like *Immunity* and *Singularity*—has earned him acclaim and collaborations with artists such as Brian Eno and Coldplay, marking him as a distinctive force in modern electronic music. Hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 87Genuary Week 3 Recap - Passing of Ruth Leavitt - Generating Mazes with Recursive Subdivision - Nonsensical Math Paper Generator - Fluid Simulation Pendant - Generative Grid Art with Three.js - DOOM in PDF - Realtime Collaborative Apps with Yjs - Artificial Aesthetics Book Release![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-14.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/quarpetexotic-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-87) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 87 URL: https://www.gorillasun.de/blog/gorilla-newsletter-87/ Last updated: 2025-01-20T06:00:57.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 87th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server now, where we nerd out about all sorts of genart and tech things—if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Let's kick things off with a quick recap of the third week of Genuary 2025*** 👇 ## Genuary Week 3 Recap My favorite part about Genuary, and any of these month-long challenges for a matter of fact, is seeing how folks interpret the prompts in vastly different manners — I try to do my sketch before I explore what others have made, otherwise I will be too tempted to recreate some of them. This year's prompt selection is particularly poised for that kind of creative interpretation — here's some of my favorites from the last week's batch of creations again: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-19-at-12.59.12.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-20-at-01.23.02.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-18-at-14.51.58.png) [Link to Yann's Post](https://x.com/Yann%5FLeGall/status/1880667840199762033?ref=gorillasun.de) | [Link to Roni's Post](https://x.com/KaufmanRoni/status/1879513054679060973?ref=gorillasun.de) | [Link to Florian's post](https://x.com/flockaroo/status/1880305396537319776?ref=gorillasun.de) - For the day 14 prompt "Pure black and white. No gray." Yann Le Gall created this cool optical illusion, where the line width of the rectangles is modulated in such a way that it creates an animated 3D shape. I tried my hand at a similar effect before, but with much less success. - For the day 15 prompt "Design a rug" I'm impressed yet again by Roni's sketch, because he really nailed it with the pattern. I might be completely wrong on this, but it seems to me like a sort of cellular automaton that's tiled across a grid. - Day 17 prompt "What if π = 4?" proved to be a bit of a challenge, because it kinda breaks everything when you can't make proper circles or loops, but Florian Berger's idea of slapping rectangular wheels on a car is in a league of its own. One sketch that I missed in the first week, and that's too good to not include here, is Joshua Bagley's 42 lines of [differential growth](https://medium.com/@jason.webb/2d-differential-growth-in-js-1843fd51b0ce?ref=gorillasun.de) — the first time I tried my hand at it, I think I ended up with around 200 lines of code, hence if you want a sort-of-tsubuyakified version of the algo, here you go: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-19-at-12.58.29.png) [Link to Post](https://x.com/gengeomergence/status/1875291140855099774?ref=gorillasun.de) How's my Genuary going, you ask? Pretty decently, but could be better 😅. In the past week I only managed to do 4 prompts — technically I only made three sketches, but one of them combines two prompts. I'm really happy with the ideas that I had for the ones that I tackled though: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-19-at-00.34.02.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-5.png) [Prompt 12 Subdivision](https://x.com/gorillasu/status/1879577706251395399?ref=gorillasun.de) | [Prompt 16 Generative Palette](https://x.com/gorillasu/status/1880067819402064235?ref=gorillasun.de) | [Prompt 15 Design a Rug & 17 What if π = 4?](https://x.com/gorillasu/status/1880392437316907423?ref=gorillasun.de) **#12 Subdivision**: This one was an interesting challenge, initially I wanted to subdivide the image simply with white rectangles that have black outlines, so that the subdivisions are clustered more densely around the prominent features of the image — the problem with that is extruding these prominent features in the first place. A simple edge detection filter doesn't really produce good results, is hard to tune, and overall isn't generalizable. The approach that you see here, subdivides rectangles on the image depending on the range of colors that they contains, and attempts to split regions so that range is reduced — you end up with rectangles clustered around the regions with larger color variation. **#16 Generative Palette**: I've been thinking about making a color palette generator for the longest time, and it turned out that putting one together was easier than expected. I've recently been playing around with groq, a free LLM API that lets you query prompts and get back results. Obviously there's rate limits, but it's more than enough for hobby projects like this. Here I essentially ask the LLM to generate n hex codes for colors, that I then parse to isolate and store them in an array. The sliders simply modify aspects of that prompt. **#15 Design a Rug & #17 What if π = 4?**: For my this generative rug I was playing with [taxicab distances](https://en.wikipedia.org/wiki/Taxicab%5Fgeometry?ref=gorillasun.de) — a geometric space where where the familiar Euclidean distance is ignored, and the distance between two points is instead defined to be the sum of the absolute differences of their respective Cartesian coordinates. In that setting, the value of the analog of the circle constant π, the ratio of circumference to diameter, is equal to 4, and circles essentially become squares, which is how I produce the square shapes on the rug. The rug is then additionally deformed with a sine wave. ***And that's a wrap on Genuary related things, we'll check back in next week with some new creative ideas — now let's cue the news*** 👇 ## All the Generative Things **1 —** [**Honoring the Life and Legacy of Ruth Leavitt**](https://x.com/ragnar%5Fmeta/status/1880283950817353962?ref=gorillasun.de): Ruth Leavitt was among the pioneering figures in computer art, renowned for her contributions to early generative art during the 1960s and 1970s. She sadly passed away on the 17th of January 2025. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/collage2.jpg)](https://x.com/Noahbolanowski/status/1880334603975791068?ref=gorillasun.de) [Link to Post](https://x.com/Noahbolanowski/status/1880334603975791068?ref=gorillasun.de) Dissatisfied with off-the-shelf interactive software, she turned to programming and developed her own computer art systems with her husband Jay Leavitt. By 1973, they had created a “stretching program” that could swivel, warp, and reshape lines, to transform rigid constructivist artworks into more fluid compositions. For those curious about that program, Ruth and Jay published a paper on the topic titled "Pictures Based on Computer Drawings Made by Deforming an Initial Design" that details how their method works. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-19-at-12.36.31.png)](https://www.jstor.org/stable/1573115?ref=gorillasun.de) [Link to Paper](https://www.jstor.org/stable/1573115?ref=gorillasun.de) Most notably Ruth is known for authoring her seminal book Artist and Computer, published in 1976\. The book gathers 35 North American, European and Japanese artists that worked with computers for artistic purposes during that period of time, and gave them a space to talk about their work in the burgeoning field. Among them are Lillian Schwartz, Ben F. Lapowsky, Manfred Mohr, Hiroshi Kawano, Herbert W. Franke, among many others — the names on this list demonstrate just how important the book really is. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-6.png) Front & back cover of the book | The visionary quote on the back cover of the book still resonates strongly today, maybe more than ever before. You can read the book in its entirety over in the [Atari Archives](https://www.gorillasun.de/blog/gorilla-newsletter-86/). It's sad that many of the pioneers are leaving us now when we're just at the brink of really understanding and appreciating their contributions. **2 —** [**Generating Mazes with Recursive Subdivision**](http://weblog.jamisbuck.org/2011/1/12/maze-generation-recursive-division-algorithm?ref=gorillasun.de): Jamis Buck's "The Buckblog" is an incredible resource for programming related topics — particularly if you're looking to learn about programming maze generators: he's written about most of the popular graph algorithms that are generally used towards this end, such as Prim's, Kruskal's, Recursive Backtracking and many more, which you can all find over in the blog archive (scroll down to 2011). Recently one of those tutorials resurface again while I was scouring Hacker News; it's one that I'd actually tried implementing before, where the maze is generated with recursive subdivision instead of using a traversal algorithm: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screen-Recording-2025-01-19-at-11.13.59.gif) The algo works in quite a similar way to how you would subdivide a rectangle into smaller one, by successively inserting walls between them — with the difference that you insert openings into the walls to create connections between the individual rooms. As the rooms become smaller and smaller, you end up with maze like paths. An observation here is that this recursive approach creates evident sector-like regions, that can only be accessed via a single opening — in certain scenarios this might be useful, but doesn't create a very challenging maze. Jamis published an [update](http://weblog.jamisbuck.org/2015/1/15/better-recursive-division-algorithm.html?ref=gorillasun.de) later on, revisiting the idea with a non-linear path to split up two regions and create a boundary between them, resulting in more organic looking maze patterns. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-19-at-11.43.13.png) **3 —** [**Generating Nonsensical Math Papers**](https://github.com/SylvanFranklin/nonsense?tab=readme-ov-file&ref=gorillasun.de): Sylvan Frankling made a Typst generator that creates deceivingly real looking math papers. If it's your first time hearing about [Typst](https://typst.app/?ref=gorillasun.de), it's an open-source typesetting language designed to create beautifully formatted documents — basically a friendlier, markdown-like alternative to LaTeX, that's technically also programmable. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/generation.gif) Typst supports dynamic content through variables, loops and simple logic, which Sylvan leverages to create a simple PRNG that then populates template strings with randomly selected math terms and assembles them into a fake paper. Maybe this is how we will make our last stand against our future neural overlords — by poisoning them with bogus data 😂 jokes aside though, this is quite fascinating, because I genuinely can't tell that the resulting papers are fake. I'm not entirely sure if even a very knowledgeable mathematician would be able to tell that these are fake by just glancing over them. **4 —** [**Physical Fluid Simulation Pendant**](https://x.com/Mankaran32/status/1879556837810610352?ref=gorillasun.de): Tim Alex Jacobs creates silly, little, and impressive gadgets under the alias of mitxela. Among his most popular creations: [the world's tiniest MIDI synth](https://www.youtube.com/watch?v=bmFmsn6VZSM&ref=gorillasun.de), a [stylophone business card](https://www.youtube.com/watch?v=zHVrY%5FxLM3c&ref=gorillasun.de), and now a tiny fluid simulation pendant — essentially a wearable amulet that digitally mimics the motion of a responsive fluid. Besides creating write-ups for his projects, mixtela also breaks them down over on YouTube: He explains that the **FLIP (Fluid-Implicit Particle)** algorithm is at the core of what's powering the pendant — a hybrid method that combines particle-based and grid-based approaches to achieve a realistic and dynamic fluid behaviour. He points out Matthias Müller's Ten Minute Physics YouTube channel that provides arguably the most concise explanation of the non-trivial algorithm: We don't usually talk much about hardware on here, but mixtela's YoutTube channel was a really fascinating rabbit hole to explore — it's basically size-coding, but with hardware. Also, funnily enough, the pendant itself turns out to be waterproof. **5 —** [**Generative Grids with Three.js**](https://tympanus.net/codrops/2025/01/15/creating-generative-artwork-with-three-js/?ref=gorillasun.de): Eduardo Fossas wrote a generative art tutorial for codrops, in which he shows how to create grid based artworks inspired by the Brazilian artist [Lygia Clarke](https://www.moma.org/artists/27445?ref=gorillasun.de) — the tutorial doubles as a great introduction to Three.js with React Three Fiber: [Creating a Generative Artwork with Three.jsLearn how to create dynamic, generative artwork using Three.js, inspired by Lygia Clark’s minimalist geometric designs, with a grid system and creative coding techniques.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-18.png)CodropsEduard Fossas![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/creating-generative-artowkr-three-preview.gif)](https://tympanus.net/codrops/2025/01/15/creating-generative-artwork-with-three-js/?ref=gorillasun.de) ## Tech & Web Dev **1 —** [**DOOM in PDF**](https://github.com/ading2210/doompdf?ref=gorillasun.de): last week I shared Tetris in a PDF, and Art Galleries in DOOM — this week I present you with DOOM in a PDF; and it's exactly what you might think: a port of DOOM that runs inside of a PDF. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-18-at-15.14.05.png)](https://x.com/thomasrinsma/status/1878549178227269941?ref=gorillasun.de) [Link to Post](https://x.com/thomasrinsma/status/1878549178227269941?ref=gorillasun.de) I don't have much more to share here 😆 it's also worth noting that this has previously been done by X user [Reelix](https://x.com/Reelix/status/1878820602435518479?ref=gorillasun.de). **2 —** [**Simple Masonry-like Composable Layouts**](https://piccalil.li/blog/a-simple-masonry-like-composable-layout/?ref=gorillasun.de): if you've been following the long masonry discussion that got quite heated during 2024, the fazit is that it's still going to take a long time before we're going to see CSS masonry become supported by all browsers ( `grid-template-rows: masonry;` is now supported as an experimental feature in FireFox and Safari). Using CSS properties that are currently supported by all browsers, Andy Bell shows us how to create a simple, masonry-like layout that's composable — a modular and reusable design where independent components are combined to create flexible and scalable layouts. [A simple masonry-like composable layoutIt’s going to be a long time until CSS masonry is ready for us to use in our projects so I’ve got a nice stop-gap here for you that uses composable layouts.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-19.png)PiccalilliAndy Bell![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/png-1)](https://piccalil.li/blog/a-simple-masonry-like-composable-layout/?ref=gorillasun.de) **3 —** [**Building Realtime Collaborative Apps with Yjs**](https://learn.yjs.dev/?ref=gorillasun.de): At the core of collaborative apps, in which you can see updates from other users in realtime (like Notion or Figma), are CRDTs (*Conflict-free Replicated Data Type)*. They’re a special kind of data structure that can take state stored on multiple different computers, and merge it all together without conflicts. What makes CRDTs special is that they don’t depend on centralized servers to merge the state — it can be done on any client! Throwback to this great [article on CRDTs](https://jakelazaroff.com/words/an-interactive-intro-to-crdts/?ref=gorillasun.de) by Jake Lazaroff! [Yjs](https://github.com/yjs/yjs?ref=gorillasun.de) is a library by Jamsocket, that lets you create and manage CRDTs with ease. They recently kicked of a series of lessons to explain how the library works: [Learn Yjs by JamsocketLearn Yjs is an interactive tutorial series on building realtime collaborative applications using the Yjs CRDT library. Learn about handling state in distributed applications using Yjs shared types, with explorable explanations and code exercises.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-24.ico)Y-Sweet![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/learn-yjs.png)](https://learn.yjs.dev/?ref=gorillasun.de) ## AI Corner **1 —** [**Artificial Aesthetics Book Release**](https://manovich.net/index.php/projects/artificial-aesthetics?ref=gorillasun.de): I mentioned Lev Manovich's book already in issue [#69](https://www.gorillasun.de/blog/gorilla-newsletter-69/) of the newsletter, when he had just released the second chapter. In it he tackles the questions that arise around authorship in the advent of generate AI. Now the book's been completed and is freely accessible to everyone — skimming over the new chapters they strike me just as important: [Lev ManovichLev Manovich: photos, bio, complete CV.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-25.ico)manovich![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/dsc_1880_-edit-square_max.jpg)](https://manovich.net/index.php/projects/artificial-aesthetics?ref=gorillasun.de) **2 —** [**How I Program with LLMs**](https://crawshaw.io/blog/programming-with-llms?ref=gorillasun.de): Before you roll your eyes and think to yourself "another one of those posts about using LLMs for programming", David Crawshaw presents a compelling perspective on how chat-oriented programming has improved his overall practice — while a big part of the productivity boost lies in LLMs being able to generate a lot of code very quickly, their potentiality also lies in making smart suggestions that would otherwise be difficult to come up with by yourself or through traditional search. > There is an allure to a technology that can (at least some of the time) craft sophisticated responses to challenging questions. \[...\] I followed this curiosity, to see if a tool that can generate something mostly not wrong most of the time could be a net benefit in my daily work. The answer appears to be yes, generative models are useful for me when I program. For someone like me, this cutting edge approach to prototyping is invaluable; I often have more ideas than I have time to realistically spend time on, and when I really want to get an idea out of my system, just to validate if it's something that I actually want to flesh out later on, then why wouldn't I conjure a prototype at the snap of a finger? I would definitely be frustrated at this point if LLMs suddenly weren't a thing anymore. ## Music for Coding ODESZA is an electronic music duo from Seattle, that blend lush cinematic soundscapes, with upbeat percussive rhythmic layers. Their third studio album *A Moment Apart* was critically acclaimed and earned a nomination for the 60th Grammy awards, marking a career milestone for the duo. Throughout the tracks they explore ideas of space-travel, separation, and isolation — there's a big [megathread](https://www.reddit.com/r/Odesza/comments/6yfaxf/a%5Fmoment%5Fapart%5Fmegathread/?ref=gorillasun.de) over on Reddit back from when the album came out in 2017 in which people discuss these topics. Hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 86Genuary 2025 Week 2 Recap - Practical Color Mixing - Procedural Creatures - Programming Fractals - Art Galleries in DOOM - Programming Tetris in a PDF - Balancing Text in CSS - A Philosophy for Digital Longevity - LLMs in 2024![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-13.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/collage2-13-.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-86) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 86 URL: https://www.gorillasun.de/blog/gorilla-newsletter-86/ Last updated: 2025-01-13T06:00:37.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 86th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server now, where we nerd out about all sorts of genart and tech things—if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Let's kick things off with a quick recap of the second week of Genuary 2025*** 👇 ## Genuary Week 2 Recap Another week of Genuary has gone by, and we're now 12 prompts in! It definitely feels like the biggest edition of genuary thus far — it's all I've been seeing on my social feeds these past two weeks, and I ain't complaining! Wish it could be like that all year round 😄 There's no way for me to make an exhaustive list of what everyone's made, but at least I can point out my two favorites up till now — Roni Kaufman's day 6 "make a landscape using only primitive shapes" and Darien Brito's day 9 "the textile design patterns of public transport seating". Roni arguably has the best sense for consistently good aesthetics in the entire gen-art space, the 8-bit feel of his day 6 creation just really does it for me! As for Darien's textile pattern, it's hard for me to believe that this isn't actually a photo: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-20.52.08.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-20.52.34.png) [Link to Roni's Post](https://x.com/KaufmanRoni/status/1876255485369954517?ref=gorillasun.de) | [Link to Darien's Post](https://x.com/DarienBrito/status/1877340324046995757?ref=gorillasun.de) Beyond that, the standout prompt that everyone enjoyed enormously, was by far day 7 "use software that is not intended to create art or images" where you had to get inventive and come up with a way to repurpose some software for art-making purposes. I had a lot of fun reprogramming the same code I used for my isometric day 5 creation in Google Sheets! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-20.43.12.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-20.43.52.png) [Link to Day 5 Post](https://x.com/gorillasu/status/1875714172534845539?ref=gorillasun.de) | [Link to Day 7 Post](https://x.com/gorillasu/status/1876764220416512139?ref=gorillasun.de) Yes, you read that right: turns out Google Sheets actually has a scripting API, that's simply programmable with regular JavaScript, and lets you create custom extensions. It's limited in that you can't create animations (at least not that I know of), but essentially lets you treat the spreadsheet as a regular grid of pixels — meaning that you can pretty much make anything (naturally with some extra steps). Day 11 was also quite fun: "Impossible day - Try to do something that feels impossible for you to do". I simply used the prompt as an excuse to attempt something I've been wanting to do for a long time: implementing a full-fledged neural network in vanilla JavaScript — and I somehow managed to make it work! 0:00 /0:43 1× The programming part wasn't too difficult, but I struggled quite a bit to get the simple classifier to actually train and update its weights — I'm still not entirely sure that all parts are working as intended, but it seems to work decently well! I have a couple more ideas for it at this point — going the entirely custom route does open up quite a few interesting possibilities. Besides that, I think this has potential to be one of those viral tweets that could potentially explode (if I manage to figure out a good caption). That said, while everyone's busy with Genuary, tutorials and articles have slowed down a little bit — but there's still been a bunch of interesting stuff I came across throughout the past week 👇 ## All the Generative Things **1 —** [**Practical Pigment Mixing for Digital Painting**](https://scrtwpns.com/mixbox.pdf?ref=gorillasun.de): If you're familiar with the [Mixbox](https://scrtwpns.com/mixbox/?ref=gorillasun.de) library you might've heard about this paper already — it essentially details the algorithm that makes the realistic color mixing of the library possible. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-16.05.25.png) Digital painting softwares do not actually mix colors in a way that is true to real life—for instance, if you blend blue and yellow paint IRL, you get shades of green; when doing so in digitally however, most programs produce gray-ish colors. This is due to how the mixing is done numerically in the underlying color space that's used by the software. But it turns out that we actually have a model that mimics real-world color mixing, namely the [Kubelka-Munk model](https://en.wikipedia.org/wiki/Kubelka%E2%80%93Munk%5Ftheory?ref=gorillasun.de)... we're just not using it! Apparently this is due to it being relatively computationally expensive — and isn't "practical to implement" as the paper states. The K-M model is a mathematical approach to predicting how light interacts with layered, scattering materials such as the pigments in paint: it defines color mixing in terms of **absorption (K)** and **scattering (S)** coefficients, describing how the pigments physically reflect and transmit light. [Mixbox](https://scrtwpns.com/mixbox/?ref=gorillasun.de) leverages this model in a way that allows for fast RGB-in/RGB-out operations, and simultaneously integrates easily into existing digital painting software. They have two wonderfully accessible explainer videos up on [Youtube](https://www.youtube.com/@secretweapons1199?ref=gorillasun.de) to demonstrate how all of this works: **2 —** [**Developing "The Big Forest"**](https://blog.runevision.com/2025/01/2024-retrospective.html?ref=gorillasun.de)[ **an Infinite Procedurally generated Game**](https://blog.runevision.com/2025/01/2024-retrospective.html?ref=gorillasun.de): Rune Skovbo Johansen is one of the creators that's been popping up on-and-off in my reddit feed, or whenever I check the r/proceduralgeneration subreddit. For the past couple of years he's been developing a game titled "The Big Forest", an infinitely procedurally generated game that primarily revolves around exploration. [2024 retrospectiveAnother year went by as an indie game developer and what do I have to show for it? In last year’s retrospective I wrote that apart from w…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-23.ico)runevision![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/AEn0k_vbMipnV-BFxk2NX69DNZ0yggRoOPCX__CPz1qRXX1gn94QEPOG3tDyH6lTH8LbtvADZgUW_hmNIbsnDNlkJbosa0_7VGXrrZ5xhfYkExPjtEcrDRAMFugRsQ-w1200-h630-p-k-no-nu)](https://blog.runevision.com/2025/01/2024-retrospective.html?ref=gorillasun.de) His 2024 recap documents the development progress throughout the year and points out the two big milestones that he's achieved. I mentioned the Everything Procedural Conference (EPC2024) that took place in Breda in issue [#70](https://www.gorillasun.de/blog/gorilla-newsletter-70/) of the newsletter — Rune actually gave a talk there where he explains the Layer-Based engine that he's developed for his game: In another recent article, Rune writes about his progress, and struggles, in procedurally generating and animating creatures for the game, constituting the bigger task on which he spent the latter half of 2024\. This involved creating a parametric system in which all randomly generated outputs create visually valid 3D creatures, as well as making a system that animates their movement in a seamless manner. [Procedural creature progress 2021 - 2024For my game The Big Forest I want to have creatures that are both procedurally generated and animated, which, as expected, is quite a resea…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-22.ico)runevision![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/CreaturesGoal.jpg)](https://blog.runevision.com/2025/01/procedural-creature-progress-2021-2024.html?ref=gorillasun.de) **3 —** [**Simple Fractal Rendering and the Deep Zoom Effect**](https://www.youtube.com/watch?v=uc2yok%5FpLV4&ref=gorillasun.de): Fractals are fascinating, endlessly self-repeating shapes governed by strikingly simple formulas. For instance, the formula for the Julia set simply is **zₙ₊₁ = zₙ² + c**, where z and c are complex numbers. We essentially compute this formula a set number of times over the complex plane (the pixels of the canvas in our case) until the computed value exceeds a certain threshold, or a given number of maximum iterations has elapsed. To visualize the fractal, we assign each pixel's brightness based on how quickly that coordinate's calculations either exceed our threshold or reach the maximum iterations. This process then reveals an intricate pattern with spiraling structures: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Julia-1.png) A quick low-rez Julia fractal done with P5 The fascinating thing here is that many fractals actually share this same formula; simply by tweaking the starting conditions, or how we iteratively computed the z value yields very different fractal shapes. YouTuber Pezzza breaks down how to do this in GLSL in just a few lines of code, in a really easy to understand way. He also explains how to create the mesmerizing deep zoom effect that makes it seem as if we're endlessly travelling into the fractal shape while it's expanding outwards: I would be curious to see how an infinite zoom works — I'm assuming that this is only possible with specific types of fractals, and with some trick to line up the repeat? **4 —** [**DOOM: The Gallery Experience**](https://bobatealee.itch.io/doom-the-gallery-experience?ref=gorillasun.de): for all of you artists that have been looking for the optimal way to present your portfolios, I present you with a DOOM powered art gallery! Instead of shooting up mobs, you now traverse a gallery space, sipping on wine and collecting munchable hors d'oeuvres — you can play it in your browser here: [DOOM: The Gallery Experience by bobatealee, CreechMagooAn artistic parody of the ultimate classic![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/yulzGq.png)itch.ioXGRiDEN![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/zvd5-2Fl.png)](https://bobatealee.itch.io/doom-the-gallery-experience?ref=gorillasun.de) This DOOM variant made the rounds, warranting a feature on the Ars Technica that sheds some light on the motivations behind the remake and how it came into existence in the first place. The developers state that their student project somehow culminated in "a parody of art gallery culture" — and I think it's actually not so far from reality 🤣 [Gentrified Doom remake trades chainsaw for cheese knifeRemake of 1993 classic lets you drink wine and eat hors d’oeuvres as you admire masterpieces from art history.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-ars-logo-512_480-300x300.png)Ars TechnicaBenj Edwards![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/doom_gallery_experience-1152x648.jpg)](https://arstechnica.com/gaming/2025/01/doom-marine-crashes-art-gallery-politely-sips-wine/?ref=gorillasun.de) **5 —** [**An Unreasonable Amount of Time**](https://allenpike.com/2024/an-unreasonable-amount-of-time?ref=gorillasun.de): this short blog post by Allen Pike isn't directly related to generative art, but is solid advice for everyone that's aiming to get better at making art, writing, or acquiring a skill of any kind really — you simply need to invest an unreasonable amount of time until you get so good that it appears to others as if it were magic. [An Unreasonable Amount of TimeA method for magic.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-16.png)Allen Pike![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/simple-opengraph-banner.png)](https://allenpike.com/2024/an-unreasonable-amount-of-time?ref=gorillasun.de) ## Tech & Web Dev **1 —** [**Programming Tetris in a PDF**](https://x.com/thomasrinsma/status/1875923074635424250?ref=gorillasun.de): this one's a bit of a WTF inclusion — because I have no idea in which section this should go — it's too cool to leave out though. So, apparently it's possible to program an entire game of Tetris inside of a PDF file — Thomas Rinsma sheds some light on how he created the Tetris PDF in his Hacker News post, and also shares a Github repo with the code for it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-21.36.29.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-21.37.03.png) [Link to Post](https://x.com/thomasrinsma/status/1875923074635424250?ref=gorillasun.de) | [Link to Hacker News Item](https://news.ycombinator.com/item?id=42645218&ref=gorillasun.de) **2 —** [**Ahmad Shadeed on Balancing Text in CSS**](https://ishadeed.com/article/balancing-text-css/?ref=gorillasun.de): Our favorite web designer is back with another deep-dive, this time tackling strategies for automatically balancing text with CSS. The article's a thorough and interactive explanation of how the `text-wrap` rule in CSS works, in particular the `balance` property, that distributes space evenly between lines. Ahmad also demonstrates this through a bunch of examples from websites he's found out in the wild. [Balancing Text In CSSMake text look more balanced with text-wrap in CSS.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-5.png)Ahmad Shadeed![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/twitter-card-1.jpg)](https://ishadeed.com/article/balancing-text-css/?ref=gorillasun.de) **3 —** [**A Philosophy for Digital Longevity**](https://rishikeshs.com/file-over-app/?ref=gorillasun.de): in this article Rishikesh emphasizes the importance of creating lasting digital artifacts, that can be easily accessed in the future. He makes the cause for the long-term value of timeless file formats, and includes a personal recount of using local-first, and exportable note-taking tools like Obsidian, that directly endorse this philosophy, over apps like Notion. [File Over App: A Philosophy for Digital LongevityMy take on the ‘file over app’ philosophy and why it’s essential for keeping my data resilient and built to last.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-4.png)Rishikesh SreehariAlgo Rithm![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/fountain.webp)](https://rishikeshs.com/file-over-app/?ref=gorillasun.de) **4 —** [**VLC Media Player AI Subtitling Feature**](https://www.theverge.com/2025/1/9/24339817/vlc-player-automatic-ai-subtitling-translation?ref=gorillasun.de) **\+** [**24 Carat Gold GameBoy Competition**](https://x.com/videolan/status/1877875812050907277?ref=gorillasun.de): the VLC Media player team made an appearance at CES 2025 that took place last week. When asked why they were there, they simply stated that "we have nothing to sell, we just decided to show up"! I've personally been using VLC for a long time, not as much these days as some years ago, but it just has so many useful features that make it far superior to most of the default media players. Their newest feature involves real-time AI subtitling and translation, that runs locally and offline in over 100 languages, using entirely open-source models — which I think is a super cool milestone, and super useful for those who rely on subtitles to consume popular media. [VLC player demos real-time AI subtitling for videosThe video player is testing a new AI tool to create subtitles in over 100 languages.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple_touch_icon.png)The Verge![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/vlc.png)](https://www.theverge.com/2025/1/9/24339817/vlc-player-automatic-ai-subtitling-translation?ref=gorillasun.de) The VLC team also celebrates hitting 6 billion downloads by kicking off a competition that involves beating a GameBoy game they've developed. The first to beat the entire game gets a 24 carat gold plated GameBoy — find the game [here](https://vlcstudio.itch.io/conefuse?ref=gorillasun.de)! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-12-at-21.50.44.png)](https://x.com/videolan/status/1877876237160300983?ref=gorillasun.de) [Link to Post](https://x.com/videolan/status/1877876237160300983?ref=gorillasun.de) Not sure if there's still time or if someone's already beat it. ## AI Corner **1 —** [**Things we learned about LLMs in 2024**](https://simonwillison.net/2024/Dec/31/llms-in-2024/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de): If you want a big comprehensive review of the major LLM related developments throughout 2024, then Simon Willson's article is likely the only one that you'll need. He goes over the important points and provides commentary on them. [Things we learned about LLMs in 2024A lot has happened in the world of Large Language Models over the course of 2024\. Here’s a review of things we figured out about the field in the past …![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-20.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/arena-dec-2024.jpg)](https://simonwillison.net/2024/Dec/31/llms-in-2024?ref=gorillasun.de) Probably the most interesting advancement in the latter half of 2024 is that of inference-scaling and “reasoning” models, where instead of allocating more resources to improve the capabilities of LLMs, we simply let them engage in self-reflective loops to achieve better responses: > This is that trick where, if you get a model to talk out loud about a problem it’s solving, you often get a result which the model would not have achieved otherwise. **2 —** [**Orbit AI Summarizer**](https://orbitbymozilla.com/onboarding?ref=gorillasun.de): Orbit is basically a browser extension for firefox that runs an LLM directly in your browser for content summarization, and it does so completely locally! I tested it for a bit and it's pretty decent, obviously not as good as Claude or GPT 4, but good enough to get the job done. It also works on YouTube videos where it automatically looks at the transcript to generate the summarization! [Orbit by Mozilla![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-8b83196d3cc040b40efa1e451ed68c9c3d53db31832ce071af4fd7f3e940c9ec.png)Orbit by Mozilla![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/orbit-logo-81944463619c0dde6a98a4d45cf710c98bb177bdea22230f4b7c07c5d5bdeaf3.svg)](https://orbitbymozilla.com/?ref=gorillasun.de) If you FireFox is your default browser, I recommend taking the extension for a spin! ## Music for Coding Ólafur Arnalds is an Icelandic composer and musician that blends classical and electronic sounds into evocative ambient soundscapes. This last week I listened to his album *Some Kind of Peace*, and it took me a second to realize that I'd already heard the opening track "Loom", which is a collaboration with Bonobo, one of my favorite artists. If you need something captivating and introspective, this is the album you need. Hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 85Genuary 2025 - Painting with Plotters - Automatic ALife Discovery - PI’s Evil Twin - Recreating the Comanche Voxel Space Engine - Programming as Theory Building - Designing TinyUrl - Understanding B-Trees - 2024 AI Recap![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-12.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/blackonblack-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-85) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 85 URL: https://www.gorillasun.de/blog/gorilla-newsletter-85/ Last updated: 2025-01-06T18:47:42.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 85th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server now, where we nerd out about all sorts of genart and tech things—if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Let's get into the news*** 👇 ## All the Generative Things **1 —** [**Licia He's Painting with Plotters Course**](https://www.eyesofpanda.com/project/painting%5Fwith%5Fplotters/?ref=gorillasun.de): Licia He's plotter course kicked off mid-December, and the first two modules are now up on the course page! In the first two videos Licia gives an introduction to the world of plotters, going over many of the considerations around using plotters with water color painting, alongside other practical tips for plotting in general—even if you don't have a plotter (yet) it's a super insightful watch! [Module 0: Introduction![](https://static.ghost.org/v5.0.0/images/link-icon.svg)The Painting with Plotters Course![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/0_introduction_banner.jpg)](https://www.eyesofpanda.com/project/painting%5Fwith%5Fplotters/module%5F0/?ref=gorillasun.de) The second video provides more glimpses into Licia's workflow; for instance, she what I found fascinating is that she uses a network of Raspberry Pis to control several plotters at once, while keeping her main computer free for other tasks. Licia also additionally gives a breakdown of her physical setup that uses a magnetic board to fix things in place—overall it looks like her course will save you a lot of headaches before you even get started with your plotter journey. Super cool stuff, excited for the coming modules releasing over the next couple weeks/months—we're looking at around 20 videos! 👏 **2 —** [**Automating the Search for Artificial Life with Foundation Models**](https://sakana.ai/asal/?ref=gorillasun.de): the term "[Foundation Model](https://en.wikipedia.org/wiki/Foundation%5Fmodel?ref=gorillasun.de)" refers to all forms of large neural networks that can be used across a broad range of different tasks—think LLMs as well as the powerful text-to-image generators. A new paper from Sakana AI proposes an algorithm titled *Automated Search for Artificial Life* (ASAL), that basically makes use of a vision-text model to automatically discover new artificial life patterns that present certain interesting behaviors. [Sakana AIAutomating the Search for Artificial Life with Foundation Models![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-19.ico)Sakana AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/sakana_rect.png)](https://sakana.ai/asal/?ref=gorillasun.de) > Our proposed approach aims to **(1)** find simulations that produce a specific target behavior, **(2)** discover simulations that keep generating novelty forever as you run it, and **(3)** illuminate all the different simulations that are possible. Their method can somehow magically accomplish this task by simply providing an input text prompt, such as "a self-replicating pattern" for instance, and then automatically discovering a set of rules (within the constraints of the algorithm that it can use) that produces emergent behavior to visually satisfy the given prompt. I will admit that I don't fully understand how the entire algorithm works, but the labeled examples provided in the paper demonstrate that their method is mindbogglingly spot on with the given input prompts: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-04-at-14.03.28.png) Whether or not they're cherry picked, this is super impressive. Later on down the page they demonstrate some larger ALife explorations, where multiple instances of cellular automata are first generated within their own small universes (cells in a grid) and then pitted against each other to see which of them will occupy the most space. If you're interested, check out the [official paper](https://arxiv.org/pdf/2412.17799?ref=gorillasun.de) and the [Github repo](https://github.com/SakanaAI/asal?ref=gorillasun.de) of the open sourced code. **3 —** [**Algorithmic Pattern Conference**](https://2025.algorithmicpattern.org/?ref=gorillasun.de): *is a hybrid conference/festival that brings together researchers and practitioners curious about the practice and culture of algorithmic pattern-making*. The conference took place for the first time in November 2023 (was about to say last year \*slaps on hand\*) mainly as an online Salon, with a small gathering in Barcelona. [Algorithmic Pattern – Sheffield and Online, September 2025![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-alpaca_400x400-1-180x180.jpg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/algorithmicpattern.original-e1735840605400-1200x308.png)](https://2025.algorithmicpattern.org/?ref=gorillasun.de) It's organized by Alex McLean, who you might recognize for being part of the scene with his algorithmic music & live coding—alongside other individuals that make some cool stuff (there's a list on the conference page). If you're interested you'll probably want to sign up to their mailing list to get an update when there's more concrete information about the event. Apparently, from what the website states right now, it will take place in Sheffield this year, 12-14th September. The page also states that a call for proposals will open this January with a deadline in May—it might be worth pitching an idea! I have a hunch that this year's installment will be overtaken by a horde of generative artists 😄 **4 —** [**Recreating the Comanche Voxel Space Engine**](https://github.com/s-macke/VoxelSpace?tab=readme-ov-file&ref=gorillasun.de): NovaLogic's 1992 [Comanche](https://en.wikipedia.org/wiki/Comanche%5F%28video%5Fgame%5Fseries%29?ref=gorillasun.de) is an iconic simulation game where the player flies military missions in a [RAH-66 Comanche](https://en.wikipedia.org/wiki/Boeing-Sikorsky%5FRAH-66%5FComanche?ref=gorillasun.de) [attack helicopter](https://en.wikipedia.org/wiki/Attack%5Fhelicopter?ref=gorillasun.de) over procedural landscapes. The novelty of Comanche was the gigantic leap in graphics that it achieved in comparison to previous games—It's the first commercial flight simulation based on [voxel technology](https://en.wikipedia.org/wiki/Voxel?ref=gorillasun.de), via the company's proprietary [Voxel Space](https://en.wikipedia.org/wiki/Voxel%5FSpace?ref=gorillasun.de) engine (written entirely in [assembly](https://en.wikipedia.org/wiki/Assembly%5Flanguage?ref=gorillasun.de)). Sebastian Macke recreated this engine and published it as a repo over on his Github with some additional explanations and a breakdown of the [voxel](https://en.wikipedia.org/wiki/Voxel?ref=gorillasun.de) [raster graphics](https://en.wikipedia.org/wiki/Raster%5Fgraphics?ref=gorillasun.de) rendering engine that Novalogic invented at the time [GitHub - s-macke/VoxelSpace: Terrain rendering algorithm in less than 20 lines of codeTerrain rendering algorithm in less than 20 lines of code - s-macke/VoxelSpace![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-5.svg)GitHubs-macke![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/VoxelSpace)](https://github.com/s-macke/VoxelSpace?tab=readme-ov-file&ref=gorillasun.de) > The graphics were breathtaking for the time being and in my opinion 3 years ahead of its time. You see many more details such as textures on mountains and valleys, and for the first time a neat shading and even shadows. Sure, it's pixelated, but all games in those years were pixelated. Check out Sebastian Macke's [simulationcorner.net](https://www.simulationcorner.net/?ref=gorillasun.de) page for other cool similar retro-recreations! And I also recommend checking out the Hacker News item for Sebastian's repo, there's an interesting discussion around novelty in past and present video games. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-04-at-15.51.12.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=42588956&ref=gorillasun.de) **5 —** [**5 Ways for Drawing 3D Outlines (in Unity)**](https://ameye.dev/notes/rendering-outlines/?ref=gorillasun.de): Alexandre Ameye shows us 5 different techniques for drawing 3D object outlines and goes pretty in depth on each one. The article is geared towards creating outline effects in Unity, but the methods are general enough to be applicable in any 3D setting—hence if you've been looking into creating this kind of effect, this is your starting point. [5 ways to draw an outline🖍️ Explaining multiple techniques for rendering outlines and highlights for real-time applications. This includes vertex object-space as well as screen-space methods. This can be used to render outlines in Unity or Unreal. Outlines can be used for gameplay reasons or aesthetics.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-15.png)Alexander Ameye![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover-1.png)](https://ameye.dev/notes/rendering-outlines/?ref=gorillasun.de) **6 —** [**PI's Evil Twin (the Lemniscate Constant)**](https://shorturl.at/TsbOS?ref=gorillasun.de): To cap off this section, John Carlos Baez made a cool in-depth thread over on Mastodon about a strange constant that's related to the infinity curve (the eight curve ♾️). This evil twin of PI has its own associated *mutant* trigonometric functions and properties—but I'll leave it to John's to explain what it's all about, it gets real math-y real quick though. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-04-at-14.27.56.png)](https://shorturl.at/TsbOS?ref=gorillasun.de) [Link to Thread](https://shorturl.at/TsbOS?ref=gorillasun.de) ## Genuary 2025 & EOY Gifts Before we get into some of the other notable finds of the past week—let's quickly talk about Genuary 2025 that's currently in full swing! It's already been a blast to see all of the cool creations that people are making for the prompts! Personally I'm really happy that I prepared just a little bit ahead of time, and laid out some potential ideas for each prompt—so far I've been able to keep up with the dailies, and I'm happy with the batch of sketches that I've churned out so far—here's the ones I've made at the time of writing for the first 5 prompts. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/canvas-11-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/layers-6--2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/42_5-3-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/blackonblack-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/output-4-.png) As always, I'll put together my personal Genuary recap towards the end of the month where I'll explain what's going on in each one of these—if you're curious to learn a bit more about all the things that I end up making. If you're interested here's the one from last year: [Genuary 2024: A Personal RecapGenuary 2024 is now officially over! And while we emerge with folders loaded with sketches and ideas to work on throughout the coming weeks, here’s my personal celebratory recap of everything I’ve made in Genuary.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-10.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/genuary2024-1-1.jpg)](https://www.gorillasun.de/blog/genuary-2024-personal-recap/) Now it's already getting a bit tight time-wise; moving forward it'll be about being a bit more pragmatic, going with ideas that aren't too overly ambitious and can be realized in a reasonable amount of time. Might just have to pull something from the trick-bag! Another notable thing I want to point out here, is that I received a little gift from none other than [Julien Gachadoat](https://x.com/v3ga?ref=gorillasun.de)! We chatted a bit during the Berlin summit, where I learned that he enjoys reading the newsletter—for the holiday season he was so kind to send over the beautiful black and white plot, here's a pic next to the blue mini plot he handed out in Berlin: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-1-1.png) I will definitely have to get a small frame and hang it next to my desk! Thank you again Julien! As for my EOY recap, it's taking a bit longer to put together this time, since I want to actually reflect a bit on what I've accomplished in 2024 and figure out how to actually best move forward in 2025\. Should be ready this coming week though! With the housekeeping out of the way—**let's get into some other cool stuff I found this week** 👇 ## Programming Corner **1 —** [**Peter Naur's Programming as Theory Building**](https://pages.cs.wisc.edu/~remzi/Naur.pdf?ref=gorillasun.de): Peter Naur’s *“Programming as Theory Building”* is a seminal paper that challenges the prevailing view of programming as primarily a process of problem-solving or the production of code. Instead, Naur argues that programming is fundamentally an activity of building, evolving, and maintaining a mental theory about a problem domain—**essentially a theory that lives in the mind of the programmer.** [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-05-at-12.12.18.png)](https://pages.cs.wisc.edu/~remzi/Naur.pdf?ref=gorillasun.de) [Link to Paper](https://pages.cs.wisc.edu/~remzi/Naur.pdf?ref=gorillasun.de) And this still very much holds true today, in contemporary discussions about technical debt, knowledge management, and the human factors of software development. His emphasis on the human understanding behind code highlights why codebases become hard to maintain—it’s not just about the code itself but about the loss of the underlying mental theory when developers leave or stop maintaining it. Also recommend checking out the associated Hacker news discussions that shed some more light on the paper. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-05-at-12.11.30.png)](https://news.ycombinator.com/item?id=42592543&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=42592543&ref=gorillasun.de) > Peter Naur was a Danish computer science pioneer and 2005 Turing award winner. He is best remembered as a contributor, with John Backus, to the [Backus–Naur form notation](https://en.wikipedia.org/wiki/Backus%E2%80%93Naur%5Fform?ref=gorillasun.de) used in describing the syntax for most programming languages. **2 —** [**Designing TinyUrl as an Systems Design Problem**](https://x.com/GrantSlatton/status/1875087447920607675?ref=gorillasun.de): a recent tweet from Grant Slatton caught my attention, not just because it did some numbers, but because it's something I attempted to do earlier in 2024 when I undertook my little forray into Next.js, re-creating a simple (or so I thought) link shortener web app as an exercise. I didn't really get very far, just a simplistic interface, a database to store the input links, as well as a redirect function. Under the apparent simplicity of such an app actually hides quite a bit of depth; how do you design this system at scale? [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-04-at-15.28.43.png)](https://x.com/GrantSlatton/status/1875087447920607675?ref=gorillasun.de) [Link to Post](https://x.com/GrantSlatton/status/1875087447920607675?ref=gorillasun.de) My general take-away from the discussions in the replies is that the answer to this question is "it depends on the number of users and traffic". Looking into it a bit more out of curiosity I found this in depth article from Sandeep Verma that details outlines the considerations for this kind of service. [System Design : Scalable URL shortener service like TinyURLThe goal of this article is to discuss system design of services like bitly.com , tinyurl , t.c o etc. Innumerable articles are present on…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156-2)MediumSandeep Verma![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1-mParFcnj7wO_-Srp3IalKg.png)](https://medium.com/@sandeep4.verma/system-design-scalable-url-shortener-service-like-tinyurl-106f30f23a82?ref=gorillasun.de) Hence, if you have an upcoming job interview for you next system design job, this would be your starting point 😆 **3 —** [**Understanding B-Trees for Databases**](https://benjamincongdon.me/blog/2021/08/17/B-Trees-More-Than-I-Thought-Id-Want-to-Know/?ref=gorillasun.de): A **B-Tree** is a type of search tree that holds multiple keys in each node, unlike a binary tree where each node only has two children. In a binary tree, searching can become slow if the tree becomes unbalanced (higher depth than required to hold all the data), but B-Trees keep their height small by splitting and merging nodes as needed. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/image-2.png)](https://en.wikipedia.org/wiki/B-tree?ref=gorillasun.de) [Wiki Page on B-Trees](https://en.wikipedia.org/wiki/B-tree?ref=gorillasun.de) B-Trees have an inherently more balanced structure making them efficient for handling large datasets, which is why they are widely used in databases and file systems for fast lookups. Ben Congdon explains this in an article of his, walking us through how this would work at scale. [B-Trees: More Than I Thought I’d Want to KnowB-Trees are not boring, after all![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon_hu26f271b218bfbcdcc2d7c4970e2dc205_23311_180x180_resize_lanczos_3.png)Ben CongdonBen Congdon![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/cover.jpg)](https://benjamincongdon.me/blog/2021/08/17/B-Trees-More-Than-I-Thought-Id-Want-to-Know/?ref=gorillasun.de) Fun-fact, and if you were curious: the "B" in B-Tree doesn't actually have a universally agreed-upon meaning, but it most commonly stands for Balanced or Bayer, after Rudolf Bayer, who co-invented the structure in 1972. ## AI Corner **1 —** [**The Batch 2024 AI Roundup**](https://www.deeplearning.ai/the-batch/issue-281/?ref=gorillasun.de): It's been a huge year for AI, things have made astronomic leaps since the start of the year, from LLM powered code editors to agentic crypto analysts—it's kind of a pretty crazy time to be alive. The iconic Andrew Ng's provides us with a summary of the interesting developments in 2024 and lets us in on his predictions for 2025. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2025/01/Screenshot-2025-01-05-at-13.02.30.png)](https://x.com/AndrewYNg/status/1874191082436895002?ref=gorillasun.de) [Link to Post](https://x.com/AndrewYNg/status/1874191082436895002?ref=gorillasun.de) **2 —** [**Can LLMs write better code if you keep asking them to "write better code"?**](https://minimaxir.com/2025/01/write-better-code/?ref=gorillasun.de): you might remember the short-lived [AI Slop](https://en.wikipedia.org/wiki/AI%5Fslop?ref=gorillasun.de) phase where people used image generators to turn a starting image "more X", for example "[make this image of a metal head more metal](https://www.reddit.com/r/metalguitar/comments/185zdba/theres%5Fa%5Ffun%5Ftrend%5Fon%5Frchatgpt%5Fwhere%5Fyou%5Fask%5Fthe/?ref=gorillasun.de)"—with it always deteriorating (ascending?) into something cosmic. Max Woolf explores this idea in the setting of LLM generated code, what happens if you keep asking the chat-bot to make the code better? [Can LLMs write better code if you keep asking them to “write better code”?Most coders want AI to write code faster: I want AI to write FASTER CODE.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Max Woolf's Blog![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/featured.png)](https://minimaxir.com/2025/01/write-better-code/?ref=gorillasun.de) And that ends up kind of working, until you hit that point of diminishing returns. Naturally the code also becomes bloated beyond recognition. Max then also explores the results with a expertly engineered prompt to guide the LLM, which obviously ends up working much better—this latter section is particularly interesting because it provides a couple of explanations of why he designed the prompt in a particular way that I wasn't previously aware of. ## Music for Coding Kenmochi Hidefume's Shakespeare is an absolute masterpiece—and I can confidently say that after just one listen of the 2010 album! Hidefumi is a Japanese musician, songwriter, producer, and DJ—his early work caught the attention of [Nujabes](https://www.discogs.com/artist/194395?ref=gorillasun.de) who signed him to his label [Hyde Out Productions](https://www.discogs.com/label/30597?ref=gorillasun.de). In 2012, he became a founding member of [水曜日のカンパネラ](https://www.discogs.com/artist/4091793?ref=gorillasun.de) (Wednesday Campanella) as the songwriter and producer until his departure in 2021 to work on other projects. You might recognize Wednesday Campanella from their hit song [Edison](https://www.youtube.com/watch?v=8tOIjOPZ5sA&ref=gorillasun.de), which I also recommend giving a listen to while you're at it! And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs—more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 84Understanding Turing Machines - Quantifying Chaos: what is Entropy? - Roguelike Celebration 2024 - Luka Piskorec’s fxFacetune - Processing 4.3.1 - Century-Scale Storage - Ideas from A Philosophy of Software Design - The Flaws of JSON - Fish-eye Lens for Text - TRELLIS 3D![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-11.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/horizonn-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-84) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 84 URL: https://www.gorillasun.de/blog/gorilla-newsletter-84/ Last updated: 2024-12-23T06:00:56.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 84th issue of the Gorilla Newsletter - a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a Discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) 🎄 ****PSA:** **Wishing you all a merry Christmas and a happy new-year! Next week, instead of the weekly newsletter, I'll be sending out my EOY recap. We'll have a look back at everything that's happened with the blog in 2024, both online and IRL!* **That said, hope you're all having a lovely holiday season and get to spend some quality time with your loved ones ❤️* ***Apparently it's not "queue" but actually "cue"... so, cue the news*** 👇 ## All the Generative Things **1 —** [**What does it mean for something to be Turing Complete?**](https://samwho.dev/turing-machines/?ref=gorillasun.de): you've probably heard programming languages being described as 'Turing Complete.' It's a fancy way of saying they can compute anything that's computationally possible—in other words, anything that can be described algorithmically. But what does that actually mean? This is what Sam Rose tries to answer in his most recent article; through interactive examples he demonstrates how a Turing Machine works, then also tackling the more theoretical aspects of Alan Turing's work, such as the famous Halting problem. [Turing MachinesAn interactive introduction to Turing machines, the theoretical foundation of modern computing.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-18.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/turing-machines-og-1.png)](https://samwho.dev/turing-machines/?ref=gorillasun.de) Back in 1936, Alan Turing came up with the original idealized model of a computer, he proposed a machine that could, in principle, perform any computation. And that with just 5 basic instructions. A computation in this setting is a well-defined set of steps (an algorithm) that can transform an input into an output, ranging from simple arithmetic to the much more complex tasks that modern computers can perform. In theory, Turing's original machine could run Fortnite, but probably not at a speed that you'd need it to. Sam also provides us with a [sandbox to create our own mini Turing Machines](https://samwho.dev/christopher/?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-16.40.08.png) Fun fact, not just computers and programming languages are Turing Complete, but other devices can also be attributed that quality, for instance Microsoft Excel, or Minecraft, and even Magic the Gathering! ([proven in this 2019 Paper](https://arxiv.org/abs/1904.09828?ref=gorillasun.de)). **2 —** [**What Is Entropy? A Measure of Just How Little We Really Know**](https://www.quantamagazine.org/what-is-entropy-a-measure-of-just-how-little-we-really-know-20241213/?ref=gorillasun.de): the formal definition for entropy might at first glance seem a bit absurd: "entropy is the measure of disorder, randomness, or uncertainty in a system". The question here—how do you actually quantify chaos? Quanta magazine provides us with a deeply insightful piece on the topic, starting with a rich historic background, up until modernity where it is a fundamental notion in fields like thermodynamics, information theory, and computing. [What Is Entropy? A Measure of Just How Little We Really Know. | Quanta MagazineExactly 200 years ago, a French engineer introduced an idea that would quantify the universe’s inexorable slide into decay. But entropy, as it’s currently understood, is less a fact about the world than a reflection of our growing ignorance. Embracing that truth is leading to a rethink of everything from rational decision-making to the limits of machines.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-9.png)Quanta MagazineZack Savitsky![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/EntropyDeepDive-crKristinaArmitage-Social.jpg)](https://www.quantamagazine.org/what-is-entropy-a-measure-of-just-how-little-we-really-know-20241213/?ref=gorillasun.de) A better way to think about entropy is as a measure of unpredictability—which is a bit of a broad generalization—but in essence, the higher the entropy of a system is, the harder it is to predict what comes next, because there are more possible outcomes or states. As an example, picture a deck of cards. You're asked to pick cards at random from the deck and guess the order in which the cards are arranged. In a sorted deck you'll be able to tell after just a few tries, which means that the deck of cards has low entropy. We would also catch on pretty quickly if we were to sort the deck by card color or by pips for example. On the other hand, were the deck to be randomly shuffled, you would never be able to tell the pattern because there simply is none—maximum entropy. The difference here is that in the sorted order each card actually also informs us about the entire arrangement of the deck. Quanta further demonstrates this with a number of interactive examples that accompany the article's text. **3 —** [**Roguelike Celebration 2024**](https://www.youtube.com/@roguelikecelebration/videos?ref=gorillasun.de): is a yearly community-generated weekend of talks, games, and conversations about roguelikes and related topics. The 2024 edition took place back in October, and all of the recordings have since been uploaded on YouTube. As it is the case with these conferences/get-togethers, it's a treasure trove of information! Particularly for those interested in procedural generation and game design. [Roguelike CelebrationRoguelike Celebration is a nonprofit community-generated conference that celebrates roguelike computer games and related topics, including procedural generation and game design![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon_144x144-1.png)YouTube![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/AIdro_l1PtebLVsnqDeW88uCYMkm_ztVtpBh23RBOYri4E7onw-s900-c-k-c0x00ffffff-no-rj)](https://www.youtube.com/@roguelikecelebration/videos?ref=gorillasun.de) If you're not familiar with the genre, Roguelikes are basically video games where you explore randomly generated dungeons, collecting items and fighting monsters, with the key feature being that when you die, you lose everything and have to start over from the beginning. In this manner the genre revolves entirely around replayability, with different randomized elements contributing to making each run unique. Naturally, there is usually also an element of progression that takes place between runs, so that you can get a little bit further each time. Although the genre's been around since the 80s, I remember things really taking off in the early 2010s (I feel old) with games like the Binding of Isaac, and FTL: Faster than Light, both of which really defined the genre in the following years. Another game that I also remember sinking more than a few hours into, back when it came out in 2015, is Crypt of the Necrodancer. The game is at its core a turn based rhythm game, with an unforgiving clock—I never really got very far in it. I was surprised to learn that the game still has a very vibrant community around it and that it's actively being updated: in one of the talks Adrian Zeyfang recounts the story of how his fan project, that arose to as a sort of challenge, ended up turning into the most recent DLC, adding an online multiplayer mode to the game which was previously thought impossible: Bottom-line: these games aren't just art—they're also fascinating feats of programming! But maybe those two aren't so different after all. **4 —** [**Luka Piskorec's fxFacetune**](https://x.com/LukaPiskorec/status/1868789740205654059?ref=gorillasun.de): every once in a while you come across a project that really blows you away—this past week I felt that way with Luka Piskorec's fxFacetune! It's a longform genart project on fxhash, that lets you turn a selfie of yours into a generative charicature stored directly on the blockchain. Not just the code that produces the artwork, but the image itself is stored onchain—and that's crazy impressive, because just storing a small amount of information onchain can quickly get pretty expensive. Luka sidesteps this however by leveraging a smart compression algorithm to bring the images down to a manageable size. If you're curious about how this works, I recommend checking out the in depth thread that Luka made over on Twitter, giving us a glimpse behind the scenes where there's many more moving parts that make the artwork happen. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-11.34.01.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-11.34.13.png) [Link to Thread](https://x.com/LukaPiskorec/status/1868789740205654059?ref=gorillasun.de) The project is originally inspired by Gretchen Andrews Facetune Portraits, featured during the Berlin Art Week, if you want to learn a little more about that, Gretchen also made her own post. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-22.52.50.png)](https://x.com/gretchenandrew/status/1868946725756448936?ref=gorillasun.de) [Link to Post](https://x.com/gretchenandrew/status/1868946725756448936?ref=gorillasun.de) **5 —** [**The Year in Computer Science**](https://www.quantamagazine.org/the-year-in-computer-science-20241219/?ref=gorillasun.de): another article from Quanta recaps some of the important advancements in theoretical computer science during 2024, across a variety of different fields. Although not all-encompassing, I thought that it was an interesting selection, from quantum computing, to the discovery of the fifth busy beaver number, as well as a segment about AI it gives a brief overview of the past year. [The Year in Computer Science | Quanta MagazineResearchers got a better look at chatbots’ thoughts, amateurs learned just how complicated simple systems can be, and codes became expert self-fixers.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-8.png)Quanta MagazineBill Andrews![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/YIR-CS_crRichard-Borge-Social.jpg)](https://www.quantamagazine.org/the-year-in-computer-science-20241219/?ref=gorillasun.de) What I found most intriguing, was actually just a sidenote, about how [aperiodic tilings (like the Penrose tiling) have something to do with quantum correction](https://www.quantamagazine.org/never-repeating-tiles-can-safeguard-quantum-information-20240223/?ref=gorillasun.de)—not embarrassed to admit that I don't really get it—but naturally Quanta has an article on that topic as well! It's likely a rabbit hole in of its own that I might end up exploring. ## Tech & Web Dev **1 —** [**Century-Scale Storage**](https://lil.law.harvard.edu/century-scale-storage/?ref=gorillasun.de): *If you had to store something for a 100 years, how would you do it?* is the opening question that this fascinatingly in depth piece by Maxwell Neely Cohen kicks off with (you might remember Maxwell as one of the co-creators of the HTML review). It's a massive article that explores the challenges and potential strategies for long-term digital data storage, over a seemingly arbitrary yet practically significant timeframe. [Century-Scale StorageIf you had to store something for 100 years, how would you do it?![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-17.ico)Maxwell Neely-Cohen![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/preview.png)](https://lil.law.harvard.edu/century-scale-storage/?ref=gorillasun.de) The challenge with data storage at this time scale is that technology can change significantly—making the task a dual battlefield of maintenance: not only the data has to be kept intact, but also the software/hardware environment that gives us access to the data. This has also been an increasingly acute problem in digital art preservation for instance. Later on in the article Maxwell introduces "Archivism" as an ideology; a belief in the preservation of cultural and intellectual output for future generations—at the expense of anything else. **2 —** [**Ideas from "A Philosophy of Software Design"**](https://www.16elt.com/2024/09/25/first-book-of-byte-sized-tech/?ref=gorillasun.de): in a quest to learn from and summarize a variety of books on software development, Eliran Turgeman starts us off with John Ousterhout's iconic *A Philosophy of Software Design*. Eliran presents us with his main three take-aways, explaining that the book largely revolves around combating complexity in software design by adopting a radical zero-tolerance policy towards it. [Ideas from “A Philosophy of Software Design”Almost a month ago, I created a telegram channel with the goal of reading tech books consistently, and sharing summaries of them.This week, I have finished reading the first book - “A Philosophy of So![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-13.png)Eliran TurgemanEliran Turgeman](https://www.16elt.com/2024/09/25/first-book-of-byte-sized-tech/?ref=gorillasun.de) A comment over on the accompanying Hacker News item provides us with a concise summary that I found too beautiful to not include here; in essence, keeping code simple boils down to creating well-designed abstractions that are easy to understand and use. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-15.45.59.png)](https://news.ycombinator.com/item?id=42456492&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=42456492&ref=gorillasun.de) **3 —** [**Nobody gets fired for picking JSON, but maybe they should?**](https://shorturl.at/ZGGoE?ref=gorillasun.de): who doesn't love JSON? It's simple, and it does the job. But, it seems it also has quite a few flaws—a recent article from Miguel Young highlights some of the fundamental issues of the light-weight data interchange format. He explains, that despite its widespread use in software development today, JSON suffers from serious technical limitations and inconsistencies. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-23.02.43.png) The key takeaway here is that under the apparent simplicity hide interoperability and data integrity problems, that can lead to serious real-world consequences, such as potential privacy violations or compliance issues due to data corruption. Miguel also points out that these problems are fundamentally unfixable due to JSON's widespread adoption and the inconsistent ways different tools and languages implement it. ## AI Corner **1 —** [**Fish-eye Lens for Text**](https://wattenberger.com/thoughts/fish-eye?ref=gorillasun.de): Amelia Wattenberger is back with a new post! Following in the same style of her previous explorations, she demonstrates that LLMs can be used in interesting and creative new ways, this time as a sort of fish-eye lens for text that enables a novel approach to presenting information at multiple scales simultaneously. LLMs are really good a summarization, which can also be described as semantic compression. Often the same idea that's expressed over the span of a paragraph can also be conveyed through a single sentence. This is what Amelia leverages for her experiment: she presents a full text through an LLM powered fish-eye lens. Only the current portion that we're focused on is presented in full detail, whereas preceding and future passages are increasingly compressed the further away they are. Amelia demonstrates this with an interactive example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-21.45.32.png) In essence, this fish-eye lens effect for text mirrors how we naturally process information—our brains implicitly do this sort of semantic compression—but presenting information this way might just facilitates a deeper and more human understanding; it allows us to move between detail and context without losing sight of the whole picture. **2 —** [**TRELLIS: High-Quality 3D Asset Generation**](https://trellis3d.github.io/?ref=gorillasun.de): TRELLIS is a novel method for generating high-quality 3D assets simply from an input prompt or an input image, and even allows for local editing by prompting—it made quite a splash since the quality of the models is astoundingly good. They even provide a huggingface playground for you to [try it out for yourself](https://huggingface.co/spaces/JeffreyXiang/TRELLIS?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-22-at-22.10.59.png) ## Music for Coding This week I discovered the music of Autechre, an iconic electronic music duo from the UK that finds its beginnings in the 1980s and is a cornerstone of the Warp Records roster. They rose to fame for their innovative approach to sound design and abstract compositions. Blending intricate rhythms, experimental textures, and atmospheric elements, their music spans a vast sonic spectrum and creates complex and often otherworldly auditory landscapes. I learned about Autechre through this article that recounts the fascinating history of the band's album covers—which was just too good of a piece to not share here: [A Brief History of Autechre’s Album CoversI’ve always hated minimalism. I don’t think that’s a blanket statement I’d make about any other artistic movement but I hate minimalism. From my perspective, it was audacious for like a year, and t…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-15.ico)Art F CityRhett Jones![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/oversteps_vinyl_ae_post.jpg)](http://artfcity.com/2016/08/05/a-brief-history-of-autechres-album-covers/?ref=gorillasun.de) And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs - more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've also got a Discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** And in case you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 83Chemical Reactions with Cellular Automata – Hidden Code in PNGs – Generative Puzzles – Optimizing Truchet Tiles for Plotting – Demystifying Generative Autonomy – KIKK 2024 – CSS Wrapped 2024 – Writing Down Every UUID – AI makes Dev Skills more Valuable – Death of the Stubborn Programmer![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-8.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/tesselatron-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-83) You can also find a backlog of all previous issues here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 83 URL: https://www.gorillasun.de/blog/gorilla-newsletter-83/ Last updated: 2024-12-16T06:00:44.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 83rd issue of the Gorilla Newsletter - a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) 💡 ****PSA:** [****The prompts for Genuary 2025 are out**](https://genuary.art/prompts?ref=gorillasun.de)****! In case you want to get a head start on organizing your January for the challenge.** ***Queue the news*** 👇 ## All the Generative Things **1 —** [**Programming the Belousov-Zhabotinsky Reaction**](https://www.youtube.com/watch?v=CicXI-WBgQ4&ref=gorillasun.de): The Belousov-Zhabotinsky (BZ) reaction is a special kind of chemical system in which the reaction repeats itself in cycles rather than reaching a stable equilibrium, also known as a chemical oscillator. Visually the BZ reaction presents itself as swirling, self-organizing spirals and waves that cyclically repeat over time—here's what this looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/s1-ezgif.com-speed-1-.gif) In code this reaction can actually be captured as a cellular automaton that comes to life in just a few lines of code; Patt Vira tackles this in a recent video of hers, teaching us how to implement it in P5\. Patt points out a [short paper by Alasdair Turner](https://discovery.ucl.ac.uk/id/eprint/17241/1/17241.pdf?ref=gorillasun.de) back from 2009, that she uses as a basis for the video, and that shows the formulas to create the swirly patterns. In essence each cell of the cellular automaton computes its state based on the values of the surrounding cells, similarly to how reaction diffusion can be modeled as algorithmically. Over the weekend I ended up playing a little with the code, creating a few broken versions, as well as the animation you see above. As always, really appreciate Patt's efforts in breaking down these algorithms–felt very refreshing to do a coding tutorial for the first time in a while again! **2 —** [**Hiding Code in PNGs with Jos Vromans**](https://www.josvromans.art/writing/2024/10/steganography/?ref=gorillasun.de): Steganography is the practice of concealing messages or information within other text or data. In generative art, a number of artists have adopted the idea of baking the source code that produces an image, into the image itself—partly to make the output a self-contained artwork, but also to be able to algorithmically reproduce the art in case version control goes out of hand. This particularly makes a lot of sense in the case of SVGs, since SVGs are text based, the source code can simply be embedded as a ``. For bitmap based image formats, like PNGs and JPEGs, this becomes trickier, but is also feasible; Jos Vromans wrote about the topic in a recent article of his–explaining how source code can be hidden within a PNG file by leveraging a number of smart observations. [Jos Vromans | Blog | SteganographyJos Vromans | Mathematical Art | Blog post![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-12.png)SteganographyJos Vromans![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/attraction.png)](https://www.josvromans.art/writing/2024/10/steganography/?ref=gorillasun.de) A PNG is in essence a bitmap of pixel values, where pixels are composed out of three RGB values, each one of them represented by 8 bits. This means that one pixel holds 24 bits of information overall. In the article Jos points out that a change to the least significant bits (LSB) of each RGB component is visually imperceptible, demonstrating it with an interactive example—you need alter quite a few until the image devolves into something unrecognizable. This basically means that we can substitute the LSBs of an image's pixels without anyone really noticing, and actually store meaningful information instead. If you put one and one together, we can now convert the characters that make up the code into an ASCII encoding and store them in the image. I recommend reading Jos' article for the full details. **3 —** [**Programming a Puzzle Generator in Elm**](https://www.juricho.me/posts/puzzle-generator/?ref=gorillasun.de) **🧩**: Generating puzzles algorithmically is an interesting task, because it seems like something trivial at first but then turns out to be trickier than initially expected. Juri Chomé wrote about the topic, showing us how to program a jigsaw puzzle generator in Elm. In his case he used it to create SVG files to feed into a laser cutter that then cuts out the individual puzzle tiles from a block of wood. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/lasercutter.gif) Juri's approach is quite straightforward: he creates a grid, deforms it slightly—so that the edges between tiles are a little slanted—and then replaces these edges with the connector/knob-like shape that you commonly find between two puzzle tiles. To this day, I still don't know what they're actually called. If you aim to create plottable SVGs this is sufficient and does the job, it gets a bit trickier when you want the individual puzzle tiles to know their actual adjacency, as well as the inwardness/outwardness of their attached connectors. This is what I tackled earlier this year, for a generative artwork I titled *Some Parts of Me*. The logic for creating the grid ended up being tricky, because I approached it in an object oriented manner; and I actually wrote an full fledged deep dive about the project... that never ended up seeing the light of day. Maybe I'll polish it up at some point and then release it, here's a sneak peak: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/collage2-31-.jpg) But I digress, check out Juri's article, it's insightful even if you aren't an Elm programmer, doubly so if you have a laser cutter at hand—I reckon that these custom puzzles make for an amazing gift! **4 —** [**Creating and Optimizing Plottable Truchet Tile Patterns**](https://newsletter.revdancatt.com/p/050-kaleidoscopic-workflow?ref=gorillasun.de): while we're talking about laser cutting and plotting, catching up with Daniel Catt's newsletter, I learned that issue #50 is actually the third part of a series throughout which gives a detailed breakdown of a really cool Truchet tile generator, that's optimized for plotting purposes. [📙 #050 - Kaleidoscopic WorkflowAt last, I’ve got my act together enough to post the third part of this little pen plotting adventure from newsletters #047 and #048 - with some online code, which I’ll link in just a moment.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2Fdbf7afe8-faf2-45f6-a369-638b2d09f43a-2Fapple-touch-icon-180x180.png)Drawing Machines & Notes from Art Studio RobotsDaniel Catt![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F5c3c83b0-4d2c-48f4-80e1-ac233297b96e_1920x1280.jpeg)](https://newsletter.revdancatt.com/p/050-kaleidoscopic-workflow?ref=gorillasun.de) Highly recommend subscribing to Daniel's newsletter ✨ In issue [#47](https://newsletter.revdancatt.com/p/047-no-such-thing-as-too-much-yellow?ref=gorillasun.de) Daniel explains how Truchet patterns work and how to go about programming them. In [#48](https://newsletter.revdancatt.com/p/048-truncated-optimisation?ref=gorillasun.de) he explains how to optimize the generated patterns for the plotter, so that the machine can trace out continuous lines rather than drawing out individual tiles one at a time. And in this most recent issue, he explains the grid based Truchet pattern can be turned into a snowflake kind of shape by leveraging a cool Kaleidoscope effect. Really cool stuff, at this point in time I am strategically planning the acquisition of my first plotting device 🤞 **5 —** [**Demystifying Generative Autonomy**](https://www.lerandom.art/editorial/demystifying-generative-autonomy?ref=gorillasun.de): It's been a minute since I've featured a piece by Monk on here, but only because I've not had the bandwidth to keep up with the consistent stream of excellent writing over on Le Random. This one's important though because it's the fourth part in the Demystifying Generative Art series that Monk started last year, with which he aims to create a complete framework for understanding and evaluating generative art. [Demystifying Generative AutonomyThis is Part IV in a series on building a framework for appreciating generative art. In Part I, “Demystifying Generative Art,” Peter Bauman (Monk Antony) builds the case for such a framework. In Part II, “Demystifying Generative Aesthetics,” Bauman examines generative outputs—the results of generative systems. In Part III, “Demystifying Generative Systems,” he examines generative systems themselves. Now in Part IV, Bauman investigates another framework component, autonomy—control within generative systems. The essay includes Bauman’s discussions with Christiane Paul, Matt DesLauriers, Sougwen Chung and Zach Lieberman.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/6728e2b05099d4ce8e84c187_lr-serp-20-1-.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/675ae0ed9a34353550ae3bd4_sougwen-2017_doug2_thumb.jpg)](https://www.lerandom.art/editorial/demystifying-generative-autonomy?ref=gorillasun.de) In this massive analysis, Monk tackles the philosophical component of his framework, namely autonomy. A big part of what makes generative art special as an artform, has to do with how practicing artists relinquish control over the art making process to some extent. And this is reflected by how much of the contemporary discourse around the artform is about the machine as a collaborator rather than simply a medium. Monk provides a logical breakdown of everything that's involved. **6 —** [**KIKK Festival 2024 Recordings**](https://www.youtube.com/@kikk%5Ffestival/videos?ref=gorillasun.de): [KIKK](https://www.kikk.be/?ref=gorillasun.de) is an international festival that celebrates the creative dimension of digital cultures and new technologies. The event takes places every year in Namur, Belgium, and brings together those that are interested in the intersection of art and technology. The recordings of the 2024 edition's talks have just been uploaded to YouTube a few days ago if you want to check them out. One of the talks features [Marcin Ignac](https://x.com/marcinignac?ref=gorillasun.de), founder of [Variable.io](https://variable.io/?ref=gorillasun.de) a generative design and data visualisation studio, and co-creator of [Nodes.io](https://nodes.io/?ref=gorillasun.de)—naturally, that makes Marcin an accomplished generative artist. He showcases some of the projects he's worked on and lets us in on his practice, with more than a few really interesting nuggets in throughout. He briefly talks about his 2022 fxhash project Urban Flora, which I remember being mesmerized by when it first came out. He provides some details about the algorithm that powers the project, explaining that it is in fact created with Nodes.io. He reveals that the hollow geometric structures, that are central to each artwork, are created according to [Conway's polyhedron notation](https://en.wikipedia.org/wiki/Conway%5Fpolyhedron%5Fnotation?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-7.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-6.png) [Link to Project](http://marcinignac.com/projects/urban-flora/?ref=gorillasun.de) | [Conway's Polyhedron Notation](https://en.wikipedia.org/wiki/Conway%5Fpolyhedron%5Fnotation?ref=gorillasun.de) This notation essentially describes a family of symmetric 3D shapes that can be derived from a seed polyhedron (a starting shape) through modifications, such as slicing and cutting edges for example. **7 —** [**6 Lessons I learned working at an Art Gallery**](https://shorturl.at/HMPle?ref=gorillasun.de): not directly related to generative art, but a worthwhile read for all the aspiring artists following along. Henrik Karlsson reflects on his three-and-a-half-year experience working at an art gallery, and explains how he turned, what many would consider a mediocre job, into a worthwhile opportunity to grow professionally. ## Tech & Web Dev **1 —** [**CSS Wrapped 2024**](https://chrome.dev/css-wrapped-2024?ref=gorillasun.de)**:** It's been an amazing year for CSS, and just like last year, the Chrome DevRel team recaps all CSS developments over the past 12 months in a mega-compilation, where each feature is accompanied by an interactive codepen. [CSS Wrapped 2024Join the Chrome DevRel team and a skateboarding Chrome Dino on a journey through the latest CSS launched for Chrome and the web platform in 2024.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-9.svg)Adam Argyle![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/social.png)](https://chrome.dev/css-wrapped-2024/?ref=gorillasun.de) Here's the couple of the new features that I am personally excited about: - [Cross-Document View Transition](https://developer.mozilla.org/en-US/docs/Web/API/View%5FTransitions%5FAPI?ref=gorillasun.de): I haven't used this one yet, but it seems like the most exciting one out of the bunch. You've probably visited a website before where transitions between different pages happens seamless, usually with a [quirky animation](https://allhero.co.jp/company/?ref=gorillasun.de). Previously this was difficult to do, or required an animation library like GSAP to take care of it, now it's possible to support it with CSS. - [Scroll-Driven Animations](https://css-tricks.com/unleash-the-power-of-scroll-driven-animations/?ref=gorillasun.de): Scroll-driven animations on the other hand, is the new feature that I've seen being hyped the most this year. Now you can basically tie animations directly to a user's scrolling behavior—which you might want to keep in mind before you bust out GSAP the next time. - **@property**: The `@property` rule made a big buzz this year, and were hailed as [next-gen CSS variables](https://web.dev/blog/at-property-baseline?ref=gorillasun.de). We had a look in issue # of the newsletter, but in brief its a more refined way to define CSS variables that allows the assignment of a specific type, and initial value, and inheritance rules! This subsequently enables things that were previously impossible to do, such as animating colored gradients for instance. Sadly Firefox, my browser of choice, still lags significantly behind Chrome. **2 —** [**What do the State of CSS and HTML surveys tell us?**](https://web.dev/blog/state-of-css-html-2024?ref=gorillasun.de)**:** on a related note, if you've missed the [State of CSS 2024](https://2024.stateofcss.com/en-US?ref=gorillasun.de) and the [State of HTML 2024](https://2024.stateofhtml.com/en-US?ref=gorillasun.de) surveys that came out earlier this year, you've got some catching up to do! If you only care about the notable findings that the two surveys bring forth, then the Google DevRel team got us covered again—Rachel Andrew provides a nice little compact recap: [What do the State of CSS and HTML surveys tell us? | Blog | web.devA look at the survey results from the State of HTML and State of CSS surveys.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-7.png)web.devX![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/hero.png)](https://web.dev/blog/state-of-css-html-2024?ref=gorillasun.de) **3 —** [**Writing down every UUID**](https://eieio.games/blog/writing-down-every-uuid/?ref=gorillasun.de)**:** if you enjoyed the esoteric One Million Checkboxes website from a few months ago, then you're in for a treat. Nolen Royalty is back with another interesting, *large scale* exploration: this time he created a [website to list out every possible UUID](https://everyuuid.com/?ref=gorillasun.de), and makes them searchable. For what purpose, you ask? Probably for the heck of it—he breaks down how he created this webpage in a complementary explainer. [Writing down (and searching through) every UUID · eieio.gamesI couldn’t remember every UUID so I wrote them all down![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-6.png)eieio.games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/opengraph-image.png)](https://eieio.games/blog/writing-down-every-uuid/?ref=gorillasun.de) ## AI Corner **1 —** [**Why AI is making Dev Skills mode Valuable, not Less**](https://www.builder.io/blog/ai-dev-skill?ref=gorillasun.de): having an AI powered coding assistant conjure up a fully working prototype at the snap of a finger feels like having superpowers—what previously took several hours now can be done in a matter of minutes. However, it all comes crumbling down when the smart assistant also hallucinates an esoteric bug, that it simply can't solve on its own again. When this happens, and the code spirals out of control, you're ultimately left with no other choice than jumping into the thicket and figure it out on your own. A recent article by Steve Sewell describes this beautifully, as it perfectly captures this experience. Steve also provides a useful graphic to illustrate the problematic at hand: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/assets_YJIGb4i01jvw0SRdL5Bt_c8407ea276e7418a8be29398fa8b433b.webp) The beautiful thing here is that it makes dev skills just that much more valuable—only if you have the necessary knowledge will you be able to go in and fix whatever is at the root of this *pit of death*. Also, let's not even get started talk about building maintainable codebases. **2 —** [**The Death of the Stubborn Developer**](https://sourcegraph.com/blog/the-death-of-the-stubborn-developer?ref=gorillasun.de): another installment in the recent surge of articles discussing the impact or **Chat-Oriented Programming, or CHOP** as the author Steve Yegge calls it, on the programming landscape. The main problematic that CHOP introduces is that it automates much of the trivial tasks that previously were handed to junior devs, consequently breaking the *circuit* through which junior devs traditionally gain experience. But the danger isn't limited to just those that are at the start of their career, but also those in higher positions, if they are reluctant to adopt the chat driven paradigm. This makes me think of something John Maeda stated about the transformative effect of AI, that I think is very relevant here. > The good programmers will only get better and the novice programmers will have a chance at creating computational works that would have been previously impossible for them to achieve in their lifetime. [The death of the stubborn developerHow stubborn developers are getting left behind by refusing to adopt chat-oriented programming (CHOP) as their primary development approach.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/sourcegraph-mark-touch-180.png)Sourcegraph![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/the-death-of-the-stubborn-developer.jpg)](https://sourcegraph.com/blog/the-death-of-the-stubborn-developer?ref=gorillasun.de) The key take-away: developers and companies must adapt to CHOP to stay competitive in the evolving software landscape, as it represents a major shift in how coding is done today and in the near future. ## Music for Coding This week I've been listening nonstop to *Sempiternal*, Bring Me the Horizon's fourth studio album. It's definitely on the heavier side and might not be for everyone, but I found it incredibly refreshing. From what I’ve read, the album is quite polarizing actually—it marks a major shift in the band’s sound, with them adopting a more melodic approach. I can’t speak to the contrast with their earlier work since I have yet to listen to their other albums, but this one really resonated with me: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs - more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've got also got a discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 82Punch Out Model Synthesis - Analytical Anti-Aliasing - Mathematical Art Exhibition - The Aesthetics of Source Code - Graphics Programming Conference 2024 Recordings - RYBitten - Painting with Plotters - Advent of Code - Native Dual Range Input - Creators vs. AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-7.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/mirrorimage-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-82) And a backlog of all previous issues can be found here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 82 URL: https://www.gorillasun.de/blog/gorilla-newsletter-82/ Last updated: 2024-12-09T06:00:23.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 82nd issue of the Gorilla Newsletter - a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***Queue the news*** 👇 ## All the Generative Things **1 —** [**Punch Out Model Synthesis**](https://zzyzek.github.io/PunchOutModelSynthesisPaper/?ref=gorillasun.de): **Punch Out Model Synthesis (POMS)** is a new constraint based method for automatically creating tile-grids, similarly to what the Wave Function Collapse (WFC) algorithm accomplishes. By providing an initial tilemap it can arrange these tiles in a logical manner, lining them up in such a way that they match at the edges, resulting in congruent tile grids. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-08-at-01.25.33.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/pm_w-ezgif.com-optimize-1.gif) Given a tile constraint set, find a realization respecting those constraints in a large tiled grid. Here, the tile constraint set is from the **Pill Mortal* tile set. Punch Out Model Synthesis is run, progressively realizing sub-blocks and reverting regions or eroding resolved boundaries as a backtracking measure when it fails to find a sub-block realization. POMS works differently from WFC. The WFC algorithm tries to fill in the entire grid in one go, choosing the "best" tile for each spot based on probabilities, causing it to get stuck if it has no way to resolve problematic spots. When that happens, WFC has to restart the entire process. POMS, on the other hand, is more flexible in that regard; as the animation above reveals, the algorithm doesn’t need to start over if it runs into trouble—instead, it just "punches out" the problematic area and reworks that area. [Punch Out Model Synthesis: A Stochastic Algorithm for Constraint Based Tiling GenerationPunch Out Model Synthesis![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-9.ico)Z. Zzyzek![](https://zzyzek.github.io/PunchOutModelSynthesisPaper/static/image/teaser.png)](https://zzyzek.github.io/PunchOutModelSynthesisPaper/?ref=gorillasun.de) As the results section informs us, this makes POMS better for larger grids or cases where the rules are complex, since it can work with fewer initial assumptions about the grid. *I'm highlighting this one as the top feature this week since it was directly dropped over in the discord by the author themself, the mysterious Z. Zzyzek; about whom I couldn't really find much except for their Github—*[*here's the repo for POMS*](https://github.com/zzyzek/PunchOutModelSynthesis?ref=gorillasun.de)*. Super cool stuff, thanks for sharing!* **2 —** [**Analytical Anti-Aliasing**](https://blog.frost.kiwi/analytical-anti-aliasing?ref=gorillasun.de): In computer graphics aliasing occurs when digital images display jagged, stair-stepped edges, in this setting also referred to as ***jaggies***, instead of smooth lines, especially on diagonal or curved edges. This happens because there's simply no way to actually display a smooth diagonal line or curve on a display that's made out of a grid of square pixels. With anti-aliasing we refer to a family of techniques that aim to remedy this problem, or at least these visual artifacts. Here's an example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-4.png) In anti-aliasing we often try to soften harsh edges by blending the colors of adjacent pixels, just like you see in the above pic, we added additional gray pixels adjacent to the black ones to trick our brain into seeing a smoother curve. This one's an exaggerated example, on higher resolutions it makes a huge difference. Fun fact, when you draw graphics to the canvas with P5 (which I think a lot of you use) it automatically applies an anti-aliasing filter to the canvas. The function [noSmooth()](https://p5js.org/reference/p5/noSmooth/?ref=gorillasun.de) lets you turn it off; sometimes that can be used for creative effects at lower resolutions! If you're now curious about how these algorithms work, and want to see some of the different flavours that they come in, then this anti-aliasing magnum opus by Wladislav Artsimovich (aka Frostkiwi) is your entry point (and maybe even the only article you'll need to read on the topic): [AAA - Analytical Anti-AliasingHow to fix jaggies the analytical way with some juicy secrets![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-4.svg)Analytical Anti-AliasingWladislav Artsimovich![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/dfc7kPcqEI-512-1.jpeg)](https://blog.frost.kiwi/analytical-anti-aliasing/?ref=gorillasun.de) After a thorough introduction to all the different anti aliasing techniques that have been devices over the past decades, the article explains analytical anti-aliasing which approaches the problem backwards—but I'll leave it to Wladislav to provide a break down. Fantastic article, chapeau! **3 —** [**Mathematical Art Digital Exhibition (MADE) at Queens College**](https://www.qc.cuny.edu/academics/math/made-gallery/?ref=gorillasun.de): kicking off for the first time year, MADE is an initiative to highlight the artistic dimension of mathematics, showcasing 22 different artworks that are inspired and directly underlined by mathematical notions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-08-at-11.26.22.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-08-at-11.26.09.png) I particularly enjoyed the texts accompanying each artwork, shedding light on how each of the individual pieces were created. Among good company, we unsrprisingly find Simone Conradi, who you might be familiar with from issue [61](https://www.gorillasun.de/blog/gorilla-newsletter-61/) & [66](https://www.gorillasun.de/blog/gorilla-newsletter-66/#complex-roots-of-polynomials-as-generative-art) of the newsletter; he creates really mesmerizing parametric art by visualizing the complex roots of polynomial functions. In issue 66 I even took a stab at recreating them, but only with moderate success. **4 —** [**The Aesthetics of Source Code**](https://source.enframed.net/?ref=gorillasun.de): This thesis by Pierre Depaz, from the Université Sorbonne Nouvelle, investigates the formal characteristics of code, and how its aesthetics play a part in the way it's written and understood in different fields by diverse groups of people. The text inspects the ***art*** of programming through different lenses, and explores what we actually mean with ***beautiful*** code. [The aesthetics of source codeThe aesthetics of source code is a PhD thesis on the role that formal presentation plays in machine languages.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-8.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/header.svg)](https://source.enframed.net/?ref=gorillasun.de) Skimming through some of the chapters reveals that it's a fascinatingly unique text, that I can only recommend to all of you that are subscribed, assuming that you likely have an interest in the art-centric avenues of code. Towards the end of the Thesis, Pierre relates the introduced notions to Nelson Goodman's theories on Aesthetics. Goodman is a philosopher who thought about art as a "cognitively effective symbol system", which pretty much describes what code really is. If you want to learn a bit more about that, I found this [page](https://plato.stanford.edu/entries/goodman-aesthetics/?ref=gorillasun.de#TheSymSysLanArt) to be a really good introduction. **5 —** [**Graphics Programming Conference Recordings**](https://www.youtube.com/@GraphicsProgrammingConference/videos?ref=gorillasun.de): Some months ago I mentioned the Graphics Programming Conference, that then took place in Breda this November. This past week I discovered, in a relatively timely manner, that the recordings were uploaded to YouTube. And it's an absolute treasure trove of information. The talks feature devs of some of highly acclaimed video games that came out this year, such as the wonderful Tiny Glade, Baldur's Gate 3, Ghost of Tsushima, and many more—hence if you're curious about the cutting edge techniques that sit behind the games of today work under the hood, these are a must watch. **6 —** [**RYBitten: Color tool inspired by Johannes Ittens'**](https://github.com/meodai/rybitten?ref=gorillasun.de): back in issue [#56](https://www.gorillasun.de/blog/gorilla-newsletter-56/) of the newsletter I featured our favorite color hacker David Aerne, with his project titled RYBitten—while the website is still currently a work in progress, the API has now been released and is publicly available. [GitHub - meodai/RYBitten: Implementation of pseudo RYB color conversions derived from Johannes Itten’s color wheel.Implementation of pseudo RYB color conversions derived from Johannes Itten’s color wheel. - meodai/RYBitten![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40-4.svg)GitHubmeodai![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/RYBitten)](https://github.com/meodai/rybitten?ref=gorillasun.de) If you need a quick refresher what it's about, it's essentially a color library that allows you to convert RGB colors to a custom RYB color space based on Johannes Itten's idea of the color wheel—I recommend reading the previous issue to learn a bit more about it. If you want to get access to the tool in the browser when it comes out, you can now sign up to a waiting list [here](https://rybitten.space/?ref=gorillasun.de). Excited to see how it turns out! **7 —** [**Licia He's Painting with Plotters Course launching Dec. 15th**](https://x.com/Licia%5FHe/status/1861795835131887791?ref=gorillasun.de): And to wrap up this section, there's an update regarding Licia He's plotter course: the release date is now set! And while I still am a plotterless individual, I am still excited for what Licia has to teach us! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-08-at-22.59.03.png)](https://x.com/Licia%5FHe/status/1861795835131887791?ref=gorillasun.de) [Link to Tweet](https://x.com/Licia%5FHe/status/1861795835131887791?ref=gorillasun.de) ## Tech & Web Dev **1 —** [**Advent of Code**](https://adventofcode.com/?ref=gorillasun.de)**:** *Looking at the calendar, I can’t help but wonder—how is it already the 9th of December?* It’s that time of year when we’re all just counting down the days to the holiday break... and to make the wait feel just a little shorter, we’ve conjured up all sorts of clever (and slightly chaotic) ways to pass the time; I call it the **Advent-pocalypse**. From code challenges to creative countdowns, there's more than a few festive advent-inspired events happening in the programming world. Pretty much every programming language has its own version of a programming advent-calendar, a quick google should probably help in that regard. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-08-at-23.01.28.png)](https://adventofcode.com/?ref=gorillasun.de) Naturally, top of the list is the iconic Advent of Code, that's been running since 2015 and just been getting more popular with every passing year. For the 25 days leading up to Christmas you're presented each day with a different programming puzzle for you to solve. You can then submit your answer directly on the website—which also grants you a spot on the leaderboard if you're among the fastest to solve the puzzle, but it's kinda really competitive. 😅 **2 —** [**Native Dual-Range Input**](https://muffinman.io/blog/native-dual-range-input/?ref=gorillasun.de): Muffin Man has been featured before on the newsletter for his cool generative art, recently published an article and a repo revolving around a cool dual slider input, built with vanilla native browser tech. It's essentially a slider track with two heads that let you easily specify a range of values instead of having to input those two extremes individually—the blog post explains the very little 50 lines of code behind how it works: [Native dual-range inputTwo native range inputs and fifty lines of JavaScript to make them work together.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-5.svg)Muffin Man![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/thumbnail.png)](https://muffinman.io/blog/native-dual-range-input/?ref=gorillasun.de) You can find the github repo with the code that makes it possible [here](https://github.com/stanko/dual-range-input?ref=gorillasun.de). **3 —** [**Investigating Malicious Hardware with Industrial CT**](https://www.lumafield.com/article/investigating-malicious-hardware-with-industrial-ct?ref=gorillasun.de): this one isn't directly programming related but was nonetheless super interesting. Lumafield is a company that provide industrial grade CT (basically 3D x-ray) services for companies to get scans of their products and see what their innards look like. [Last year they inspected Apple's USB-C cable](https://www.lumafield.com/article/usb-c-cable-charger-head-to-head-comparison-apple-thunderbolt-amazon-basics?ref=gorillasun.de), that sparked outrage with its $129 price tag—their scans revealed the elegant, almost microscopic, design that's hidden inside of it. If it warrants the price tag is still ultimately up to the consumer, but it showed that it's not comparable to an Amazon Basics cable. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-5.png) Hidden elements of malicious hardware such as the O.MG Cable escape the scrutiny of most inspection tools, but industrial CT yields comprehensive volumetric data that can help stop threats in their tracks. In this most recent article they investigate the curious O.MG Cable, an innocent looking USB cable that's designed for malicious purposes, from what I understand it's almost like a mini computer embedded in the socket of the cable. The article goes into detail what's going inside of it. The also share an interview with the engineer and designer behind the cable. **4 —** [**Emoji 1997 SVG Icons**](https://buninux.gumroad.com/l/emoji1997?ref=gorillasun.de): And to cap off the Tech & Web Dev section this week, here's *the original Softbank JP Emoji set from 1997, restored as SVG icons for Figma and Sketch*. They look cool and I might end up using them for some projects! Licensed under CC BY 4.0. ## AI Corner **1 —** [**Creators vs AI: Navigating the Copyright Crisis**](https://journal.everypixel.com/creators-vs-ai-navigating-the-copyright-crisis?ref=gorillasun.de): as generative AI continues to grow more powerful, the copyright law surrounding the development of these models remains unsolved. The current state of affairs is that the companies at the forefront of it are raking in large amounts of profit, and that generally on the back of the small creator's efforts, while simply claiming that these endeavors fall under fair use. In a recent article of his Dmitry Shironosov tackles this issue, and tries to get to the root of the conflict. [Creators vs. AI: Navigating the copyright crisis - Everypixel JournalIn this blog post, we share thoughts on legal disputes between tech companies and rights holders from the entrepreneur, investor, CEO & co-founder of Everypixel Dmitry Shironosov. After a few years of euphoria over the potential of AI and admiration for increasingly complex technologies and solutions, AI is now frequently at the center of legal disputes![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-11.png)Everypixel Journal - Your Guide to the Entangled World of AIDmitry Shironosov![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/DSC_5791-1-2-scaled.jpg)](https://journal.everypixel.com/creators-vs-ai-navigating-the-copyright-crisis?ref=gorillasun.de) Dmitry points out the mutual reliance between creators and AI: creators provide the data AI needs, and AI can ultimately be a powerful tool to enhance their work. To him the solution is finding a compromise in the meantime, while the involved copyright laws are revisited and adjusted, so that creators also obtain a share of the generated revenue. He presents some examples where this has worked out. He also states, that it isn't a sustainable solution however, especially in certain industries where AI completely outperforms manual labor; for instance the stock image market that's now to large extents been rendered obsolete. **2 —** [**The 70% Problem: Hard Truths about AI-assisted Programming**](https://addyo.substack.com/p/the-70-problem-hard-truths-about): Addy Osmani is back with another great article, this time about something we actually talked about last week (and on several other occasions), it's the discussion around whether AI helps us develop projects faster or not. AI can often get us 70% of the way there, but the resulting code is usually not really by any means production ready. Adam stresses that programmers need to stay true to their standards in the advent of AI-powered programming assistants, but also ends with the positive note that programmers are likely on the much safer end of the spectrum of obsolescence. ## Music for Coding Luiz Bonfá (1922–2001) was a Brazilian guitarist, composer, and singer, renowned for his role in shaping the bossa nova genre. He gained international acclaim for his contributions to the soundtrack of the 1959 film *Black Orpheus*, particularly with the iconic compositions *Manhã de Carnaval* and *Samba de Orfeu*. His 1972 album *Introspection* (1972) showcases his virtuosic guitar skills in a deeply personal and experimental work and is a departure from his earlier bossa nova roots. For *Introspection* he starts incorporating elements of jazz, folk, and avant-garde elements; the album’s sparse, contemplative sound invites the listener to an intimate musical journey. And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs - more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say hi over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've got also got a discord now, let me shamelessly plug it here again.](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 81Gearing up for Genuary 2025 - Threading Knots through the Menger Fractal - Electric Dreams at Tate - Anna Lucia’s Talk at Responsive Dreams - Sub-Pixel-Art A New Web Performance Score - Hosting a Website on Bluesky - 1kx Botto Analysis - On not using Copilot![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-6.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1f9-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-81) And a backlog of all previous issues can be found here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 81 URL: https://www.gorillasun.de/blog/gorilla-newsletter-81/ Last updated: 2024-12-02T06:00:30.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 81st issue of the Gorilla Newsletter - a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) --- **Before we get into the news this week, I want to use the small reach I have with the newsletter to share the current DMCA situation that OpenProcessing is facing.** Roughly a month ago Sinan from OpenProcessing received a take down notice from ARS—short for the [Artists Rights Society](https://arsny.com/about/?ref=gorillasun.de), that describes itself as *the preeminent copyright, licensing, and monitoring organization for visual artists in the US.* Currently it appears they are also protecting Vera Molnár's work, which was the cause for the take-down notice that Sinan that runs OP received; it's no surprise that her work is a big inspiration to many in the creative coding scene, myself included. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-01-at-10.53.07.png)](https://x.com/openprocessing/status/1851232065397596445?ref=gorillasun.de) [Link to Post](https://x.com/openprocessing/status/1851232065397596445?ref=gorillasun.de) It's a bit of an absurd situation overall, I'm certain that Molnár herself would have celebrated these works rather than have them taken down. It's unclear at this point if much can be done to have this notice retracted, from an [update](https://x.com/openprocessing/status/1862537621215273145?ref=gorillasun.de) Sinan posted it seems that it was not possible to prevent it. --- *That said, hope that you're all having a good start into the new week! Here's your weekly roundup 👇* ## All the Generative Things **1 —** [**Genuary 2025 Page is Up**](https://genuary.art/?ref=gorillasun.de) 🔗: and as always, Piter has outdone himself with the animated banner, this time the headline seamlessly emerges from a tessellated and shattered polygonal region that iteratively fills in the canvas. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-01-at-22.03.10.png)](https://genuary.art/?ref=gorillasun.de) [Link to Genuary Page](https://genuary.art/?ref=gorillasun.de) | Prompt: Disregard December and skip to January And just like in previous years, [Piter shares the code for us to learn from](https://genuary.art/logo.js?ref=gorillasun.de). The prompts are not yet finalized, but I can definitely say that I'm already waiting for them with great anticipation. At this point my daily coding chops are quite rusty, and from what it looks like right now, the start of 2025 is going to be quite loaded in terms of work—so I'm not entirely certain if I'll be able to manage the dailies this year! How are you feeling about it? **2 —** [**Finding Knots in the Menger Sponge**](https://www.quantamagazine.org/teen-mathematicians-tie-knots-through-a-mind-blowing-fractal-20241126/?ref=gorillasun.de) 🪢: Back in 2021 Malors Espinosa and three of his high school students managed to make a significant breakthrough in mathematics by revisiting a century-old theorem. ***They proved that all knots can be found within a fractal called the Menger sponge.*** In mathematics, a **knot** is a closed loop in 3D space, like a piece of string twisted and tangled, with its ends joined so it has no breaks or loose ends. Knots can have intricate shapes but are defined by their ability to loop back to the starting point without intersecting themselves. They are studied to understand properties like how they can be untangled or represented. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-01-at-21.44.51.png)](https://en.wikipedia.org/wiki/Knot%5F%28mathematics%29?ref=gorillasun.de) A table of all [prime knots](https://en.wikipedia.org/wiki/Prime%5Fknot?ref=gorillasun.de "Prime knot") with seven [crossings](https://en.wikipedia.org/wiki/Crossing%5Fnumber%5F%28knot%5Ftheory%29?ref=gorillasun.de "Crossing number (knot theory)") or fewer (not including mirror images) The **Menger sponge** on the other hand is a fractal, a shape made by repeating a simple process infinitely. Starting with a cube, you divide it into 27 smaller cubes (like a Rubik’s cube), remove the middle cube, and also the middle cube of each face. This leaves 20 smaller cubes. Repeating this process infinitely creates a sponge-like structure with exponentially increasing pores, giving it counterintuitively paradoxical properties: **its volume shrinks to zero, but its surface area grows infinitely**. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image.png) After Karl Menger had come up with the fractal, he proved in 1926 that the sponge could in fact contain any conceivable curve, like lines, circles, or tree-like structures. Meaning that these curves could follow the sponge’s intricate contours without breaking or intersecting themselves. For this reason, Menger called the sponge a **“universal curve.”** However, at the time he didn’t consider more complex objects like **knots**—tangled loops equivalent to a circle in that they have no loose ends and always return to their starting point. This is basically what Malors Espinosa explored with his students, asking if the sponge could contain all possible knots, while keeping their twists and loops intact. Meaning that the knots could exist fully within the sponge’s structure without falling into its empty holes. The students succeeded ultimately succeeded at this, and extended Menger’s original theorem; in the aftermath their work was praised for revealing a new relationship between knots and fractals. [Teen Mathematicians Tie Knots Through a Mind-Blowing Fractal | Quanta MagazineThree high schoolers and their mentor revisited a century-old theorem to prove that all knots can be found in a fractal called the Menger sponge.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-2.png)Quanta MagazineGregory Barber![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/KnotsInFractals-crDaveWhyte-Social-1.jpg)](https://www.quantamagazine.org/teen-mathematicians-tie-knots-through-a-mind-blowing-fractal-20241126/?ref=gorillasun.de) Yet again, it's none other than Dave Whyte that made the [animated banner](https://x.com/beesandbombs/status/1861463975927382093?ref=gorillasun.de) for the article. **3 —** [**Electric Dreams: How Artists Pioneered Tech Art Before the Internet**](https://www.tate.org.uk/whats-on/tate-modern/electric-dreams?ref=gorillasun.de) 🔌💭: a new exhibition at Tate Modern celebrates the early innovators of optical, kinetic, programmed, and digital art between the 1950s and the early 1990s, and offers a rare opportunity to experience vintage tech art in action. The exhibition showcases the artists who experimented with early home computing systems to mediate machine-made art and that imagined the visual language of the future. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-2.png) Suzanne Treister *Fictional Videogame Stills/Are You Dreaming?* 1991 Of course also make sure to check out [Le Random's interview with Suzanne Treister](https://www.lerandom.art/editorial/suzanne-treister-on-critical-futurism?ref=gorillasun.de), one of the artists featured in Electric Dreams. **4 —** [**The Women Who Pioneered Early Computer Art**](https://news.artnet.com/art-world/women-who-pioneered-computer-art-2570283?ref=gorillasun.de) [💻](https://news.artnet.com/art-world/women-who-pioneered-computer-art-2570283?ref=gorillasun.de): a new ArtNet article shines a light on six of the unsung early heroes that paved the way for the computer art of today, and that contributed meaningfully to the field in the 1960s and 70s. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/image-3.png) Samia Halaby in her studio. Photo: Lara Atallah. | [Link to Article](https://news.artnet.com/art-world/women-who-pioneered-computer-art-2570283?ref=gorillasun.de) **5 — Anna Lucia's talk at Responsive Dreams** 🧣: I was happy to see that Anna Lucia's talk at the Responsive Dreams festival was actually recorded and uploaded to YouTube. It's a great intro to her work, what inspires her generative art, and her most recent series Oefenstof, also giving an overview of some of the projects that she's tackled over the past couple of years. She explains that she draws inspiration from traditional crafts like weaving, quilting, and embroidery, and explores how these physical practices can be translated into an algorithmic form. Anna describes her process as iterative and playful, balancing between structure and randomness when refining her ideas and embracing unexpected outcomes when they occur. Moreover she sees her work as a bridge between the digital and the physical, and as means to highlight and honor the historical and cultural significance of textiles, simultaneously experimenting with modern computational tools—that share many properties to **6 — How to make Sub-Pixel Art** 🟥🟩🟦: In a recent video Japhy Riddle shows us how to make sub-pixel art—a thing that admittedly isn't really a notion outside of his video. Japhy shows that it's possible to turn on and off the individual color channels of pixels, and in this manner hacking the screen's resolution to be larger than it technically is. Japhy also demonstrates how to achieve this with photoshop. ## Tech & Web Dev **1 —** [**Designing a New Web Performance Score for Fair and Meaningful Comparisons**](https://csswizardry.com/2024/11/designing-and-evolving-a-new-performance-score/?ref=gorillasun.de) 🌐: web performance consultant Harry Roberts designed a new web performance scoring system to simplify competitor analysis for clients and stakeholders. Recognizing the limitations of Core Web Vitals for direct comparisons across websites, he sought a way to create a single, comparative score that respects both the thresholds (e.g., Good, Needs Improvement, Poor) and the continuity of metrics. The new scoring system, called CrRRUX, simplifies web performance evaluations into a single number while balancing simplicity and fairness. It achieves this by normalizing Core Web Vitals metrics to a comparable scale, aggregating them, and incorporating thresholds and passingness for a more representative view. The method enables intuitive and accurate cross-site performance comparisons, making it useful for both technical and non-technical audiences. [Designing (and Evolving) a New Web Performance Score – CSS WizardryWhy design another new performance score?! Good question…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-2.png)CSS WizardryHarry Roberts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/new-metric-indexed.png)](https://csswizardry.com/2024/11/designing-and-evolving-a-new-performance-score/?utm%5Fsource=thecollectivenewsletter.beehiiv.com&utm%5Fmedium=newsletter&utm%5Fcampaign=the-collective-887) **2 — Bluesky sees massive influx of new users**:— t̶o̶ ̶a̶ ̶l̶a̶r̶g̶e̶ ̶e̶x̶t̶e̶n̶t̶ mainly due to the political events that transpired earlier this month. This sudden growth has forced the platform to drastically increase their moderation team, they address this in a massive post of theirs. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-01-at-01.03.46.png)](https://bsky.app/profile/safety.bsky.app/post/3lbsqm7kfns23?ref=gorillasun.de) [Link to Post](https://bsky.app/profile/safety.bsky.app/post/3lbsqm7kfns23?ref=gorillasun.de) **3 —** [**How to Host Websites on Bluesky**](https://danielmangum.com/posts/this-website-is-hosted-on-bluesky/?ref=gorillasun.de) 🌐: turns out that the decentralised protocol that Bluesky is built on, namely the AT protocol, allows for creative use cases, such as hosting a simple website. Daniel Magnum reports on how he hacked the protocol for this purpose in an article of his. Bluesky primarily uses two data types: **records** (structured data like posts) and **blobs** (unstructured files like images or HTML pages). While blobs are typically hidden unless linked to records, Daniel managed to upload and make a webpage accessible by creating a custom record type, bypassing the usual constraints of Bluesky’s system. **4 —** [**Paul Butler's Treeverse, a Bluesky Conversation Viewer**](https://github.com/paulgb/treeverse?ref=gorillasun.de) 🌳: another cool Bluesky thing I came across, from 2014-2023, Treeverse was a bookmarklet and later Chrome/Firefox extension for visualizing Twitter conversations as exploded tree views. That version was killed by changes to Twitter's API, Paul Butler has however revamped the tool since and made it to work with the Bluesky API. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-02-at-03.27.37.png) [Link to Repo](https://github.com/paulgb/treeverse?tab=readme-ov-file&ref=gorillasun.de) | Hovering over the tree reveals the conversation on the right sid **5 —** [**Art Blocks on On-Chain Preservation for Genart**](https://www.artblocks.io/curated/articles/true-on-chain-preservation-a-four-year-journey?ref=gorillasun.de) 🎨: for the occasion of Art Blocks' 4 year anniversary, they made a big announcement that now 90% of projects across its ecosystem can be fully generated from the blockchain—simply using a web browser. While projects were already on chain previously, supporting scripts, and external assets/libraries still had to be hosted off-chain. This has now been amended, simultaneously being open sourced, and marking a step forward in genart preservation. **6 —** [**Botto: Redefining the Concept of Art through AI, Token Networks, and Community Governance**](https://mirror.xyz/1kx.eth/wxdYULL5-mu2WYrBt6IKMhQLQ0ohzebjrWxzMxzkGm4?ref=gorillasun.de) **🤖:** In a recent analysis, the crypto investment firm 1kx, shares why Botto is one of the most important digital art projects of the past decade and explains its facets in detail, from an investment POV. Botto is a conception by Mario Klingemann (Quasimondo), and to put it mildly, has made a splash in the art world over the past couple of years. Botto combines AI, blockchain technology, and community governance to not just power a decentralized autonomous artist (DAA), but essentially to create a sustainable and autonomous artistic entity. It essentially emerges as a community driven entity that's challenging traditional notions of artist-hood, and introduces a new blockchain paradigm that mediates a form of multiplayer creativity. **7 —** [**David Aerne's CSS Color Shooter**](https://t.co/oKehuna84W?ref=gorillasun.de) **🔫**: our favorite color hacker shared an old CSS experiment where mouse clicks shoot out colorful splatters across the canvas. By popular demand he shares a [codepen](https://x.com/meodai/status/1861483145419239458?ref=gorillasun.de) with the code that makes it happen. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/Screenshot-2024-12-02-at-02.19.22.png)](https://x.com/meodai/status/1861068150642540663?ref=gorillasun.de) [Link to Post](https://x.com/meodai/status/1861068150642540663?ref=gorillasun.de) ## AI Corner **1 — Evolving an AI worm for 1000 years** 🪱: cozmouz's YouTube channel revolves in its entirety around training AI agents to perform different tasks, such as outrun the police, do parkour, or spar in boxing matches. In a recent video that went quite viral, he evolved an worm-like creature to seek and move towards a target in its vicinity. At some point I'd like to try and recreate one of these experiments—these videos always make it look so fun an easy— ***famous last words...*** 😄 **2 —** [**On not using Copilot**](https://macwright.com/2024/11/20/not-using-copilot?ref=gorillasun.de) [🧑‍✈️](https://macwright.com/2024/11/20/not-using-copilot?ref=gorillasun.de): Tom MacWright questions if our AI powered coding assistants truly lead to productivity gains or just shift the dynamics of labor. Are they actually saving us time, or are we simply doing a different kind of work? And from my own experience this thought resonates with me; overall my sentiment is that writing code via an AI assistant just becomes a different kind of programming. ## Music for Coding Guys, it's happened... AI won. The playlist I shared last week was actually AI generated—and I absolutely didn't notice 😅 let's amend that this week (not that I mind AI music, but prefer featuring artists in the flesh). This week I enjoyed the second album from Colorado based folk/alt-rock band Richy Mitch & The Coal Miners, where the YouTube version comes *with an exclusive track on no other streaming service* as the description states! At 18k views this album is heavily underrated, it's easily one of the best things I've listened to in the past couple of months after sifting through more than a couple dozen albums: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! Oh and btw, before I forget it, here's the official article that Trilitech posted over on the official Tezos website about the workshop—it's an absolute honor to be featured on there. [Creative Coding on Tezos: A WorkshopA fusion of coding and art took place at the Trilitech London office last week, showcasing the Tezos ecosystem’s appetite for exploring diverse creative mediums.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-6.svg)TRILITECHTezos![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1fc.jpg)](https://spotlight.tezos.com/creative-coding-on-tezos-a-workshop/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/12/1f8.jpg) Spreading the good word of creative code, one of the few pics where I look passably photogenic 😆 > Now that you find yourself at the end of this Newsletter, consider forwarding it to some of your friends, or sharing it on the world wide webs - more subscribers means that I get more internet points, which in turn allows me to do more internet things! Otherwise come and say over on [TwiX](https://x.com/gorillasu?ref=gorillasun.de), [Mastodon](https://mastodon.social/@gorillasun?ref=gorillasun.de), or [Bluesky](https://bsky.app/profile/gorillasun.bsky.social?ref=gorillasun.de) and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **And if you've read this far, thanks a million!** If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here: [Gorilla Newsletter 80Matt DesLaurier’s BITFRAMES - Rayhatching with Piter Pasma - SVG Exporter for P5 - Random Mazes with JS - Everything in Math is a Set - Analysis of Title Drops in Movies - CSS New Logo - Shopify BFCM Animation Breakdown - LLMs For Curious Beginners - LLMs & Chess![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-5.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/collage2-10--1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-80) And a backlog of all previous issues can be found here: [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 80 URL: https://www.gorillasun.de/blog/gorilla-newsletter-80/ Last updated: 2024-11-25T06:00:22.000Z **Hey everyone, after a much needed two week break—I'm back!** You'll quickly notice that this week's issue has a bit of a different format! Shorter than usual, but still just as many interesting things as before. If you're curious about the ***why*** for this change, I share some reasons and thoughts on this matter at the end of the post. > That said—welcome back to the **80th** issue of the Gorilla Newsletter! ***A weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI.*** [We also have a discord server, come and say hi!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) Let's get into the news👇 ### All the Generative Things **1 — Matt DesLauriers' BITFRAMES**: arguably the biggest thing that's happening in genart this week. BITFRAMES is an open source project and crowdfund, where 100% of the proceeds support the creation of [a generative art documentary](https://www.generativefilm.io/?ref=gorillasun.de) that Matt is working on simultaneously. I actually met Matt briefly in Berlin for the Genart Summit, and by chance chatted with one of the two production people that were accompanying him, telling me that they were working on a movie—it was mentioned that it was a documentary. It makes sense now though, they were likely interviewing some of the pioneers that were present at the summit. The project is really interesting—both conceptually and how it is technically executed. Matt built his own [custom project page](https://bitframes.io/?ref=gorillasun.de), from which collectors can create their own individual editions and then mint them. Matt also shared some tech notes on the project in this [tweet](https://x.com/mattdesl/status/1860451567163576817?ref=gorillasun.de). Of course it's also aesthetically really nice, here's two outputs I saw on my timeline: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/collage2-11-.jpg) [Link to Tweet #1](https://x.com/lerandomart/status/1860115943898423785?ref=gorillasun.de) | [Link to Tweet #2](https://x.com/MattKaneArtist/status/1860024097000018060?ref=gorillasun.de) If you want to learn more about the project, Le Random naturally already covered Matt's documentary effort in a recent article of theirs, where Monk sits down with Matt to talk about [a Generative World](https://www.lerandom.art/editorial/matt-deslauriers-on-a-generative-world?ref=gorillasun.de). **2 — Piter Pasma on Rayhatching** 🧵: another accomplished generative artist that I got to chat with during the Berlin summit is Piter Pasma—back then he gifted me a mini print of his [Epihyperderpflardioids](https://www.instagram.com/piterpasma/p/B-PDx3HnHeK/?img%5Findex=1&ref=gorillasun.de), and told me a bit about how they work. Now it sits on my desk where I often admire when I'm procrastinating. To get to the point though, recently the banner for warpcast's genart channel has been on a rotation, with artists throwing their artwork into the ring—this week it's been one of Piter's rayhatched pieces that adorns the top of the channel: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/image-3.png)](https://warpcast.com/piterpasma/0xcc07fd8b?ref=gorillasun.de) For the occasion he posted a big [thread about how he made the rayhatched piece](https://warpcast.com/piterpasma/0xcc07fd8b?ref=gorillasun.de). The thread links to many useful articles, one of which is Piter's own, which I wasn't aware of previously; published back in October 2022 it explains [the evolution of his rayhatching algorithm](https://www.fxhash.xyz/article/rayhatching-evolution?ref=gorillasun.de) and provides some big insights into how the he iteratively refined it. If you've been meaning to implement something similar, this is your starting point. **3 — A Plotter-Oriented SVG Exporter for p5.js** ✏️: Golan Levin released a SVG exporting library for our beloved P5 that is in essence directly meant to be used for plotter work—specifically tailored for path-based vector output devices like the Axi-Draw. One of the most popular articles on the blog is about [exporting P5 sketches as SVG](https://www.gorillasun.de/blog/svg-export-for-p5-and-js-rendering-context/), hence this is probably of interest to you guys. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/image-4.png)](https://github.com/golanlevin/p5.plotSvg?ref=gorillasun.de) **4 — Generating Random Mazes with JavaScript** [🔗](https://cloudfour.com/thinks/generating-random-mazes-with-javascript?ref=gorillasun.de): Paul Herbert wrote a tutorial for generating random mazes with JS, in which he essentially programs a random walk, with backtracking, that finds a path through a grid, and then constructs a maze around it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/Screenshot-2024-11-24-at-21.22.44-2.png) I really loved these hand-drawn sketches that Paul included. The last one gives a pretty good idea of how the algo works—you basically create branching paths for the main one through the maze. Yours truly has written something similar, not for generating mazes per se, but that you could equivalently use for that purpose: [An Object Oriented Approach to Random Walkers](https://www.gorillasun.de/blog/an-object-oriented-approach-to-random-walkers/). **5 — Everything in Math is a Set** 📐: this one's for the math nerds. Mateusz Kubusok wrote a super, super in depth [article that explains how any mathematical object can be defined using sets](https://kubuszok.com/2018/in-the-beginning-there-was-the-empty-set/?ref=gorillasun.de), simply by "*wrapping up empty sets and merging it with more wrapped empty sets in various degree of wrapping"* as he puts it. **6 — Creating Your Own Programming Language** 💻: In a recent Computerphile video, Dr Laurie Tratt teaches us how to make our own programming language—who doesn't want to program their own programming language at some point? ### Tech & Web Dev **1 — An Analysis of Title Drops in Movies** 🎬: Dominikus Baur is yet another cool dude I met in Berlin—joined by Alice Thud, he published a large-scale data visualization of title drops in 73,921 movies that have been released over the past 80 years. [Full of Themselves: An analysis of title drops in moviesA title drop is when a character in a movie says the title of the movie they’re in. Here’s a large-scale analysis of 73,921 movies from the last 80 years on how often, when and maybe even why that happens.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-10.png)Dominikus Baur + Alice Thudt![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og_image.png)](https://www.titledrops.net/?ref=gorillasun.de) A title drop is essentially when the the dialogue of the movie contains the name of the movie itself. It's a really fascinating article, and an impressive feat of work; the website even reached top spot on Hacker News! **2 — CSS got a New Logo** 💻: After well over a decade of using the “CSS3” badge, there’s now a new CSS logo that fits nicely next to the JS, TS and friends logo’s—[Kilian Valkhof provides an outline version](https://michaelcharl.es/aubrey/en/code/new-rebeccapurple-css-logo?ref=gorillasun.de). The backstory behind the logo's color —***namely #663399 rebeccapurple***—is surprisingly sad and heartwarming: It's named after Eric Meyer's daughter that passed away from a brain tumor at the age of 6. [rebeccapurpleOn the proposal to add the named color rebeccapurple (equivalent to #663399) to the CSS specification.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-6.ico)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/fb-og-image.png)](https://meyerweb.com/eric/thoughts/2014/06/19/rebeccapurple/?ref=gorillasun.de) **3 — How Shopify built its BFCM 2023 Globe** 🌐: Every year for Black Friday Cyber Monday (BFCM), Shopify puts together a real-time visualization of purchases made through Shopify-powered merchants worldwide—last year they represented this as a globe that would shoot fireworks out at the location where a purchase happened. Leading to this year's BFCM, they published an [in depth write-up of how it was done](https://shopify.engineering/how-we-built-shopifys-bfcm-2023-globe?ref=gorillasun.de). [How We Built the BFCM 2023 Globe (2024) - ShopifyEvery year for Black Friday Cyber Monday (BFCM), we put together a real-time visualization of purchases made through Shopify-powered merchants worldwide. This year we’re cooking up something big, and in anticipation we wanted to show you how we built the globe last year. Video of BFCM 2023 Globe Besides going for better visuals, a big focus was performance. We’ve put together an interactive deep dive into how we built and optimized the 3D visuals using technologies such as Three.js and React-three-fiber. Before we jump in, here’s the globe with simulated data that you can play with. Arcs The arcs flying around are the most important component. Each one represents an order being placed in real time, and they travel from the merchant to the buyer’s location. These can be defined as a Bézier curve with 4 control points. Each point is a 3-dimensional vector. P0: located at start position P1: located 25% of the way between start and end P2: located 75% of the way between start and end P3: located at end position Arc height can be adjusted by moving control points P1 and P2 away from the surface. To render the arc, we create a mesh that is a strip of triangles moving along the curve. This gives us the ability to control thickness and have better flexibility for stylizing it with shaders. You’ll notice however that as you move the mesh around, it disappears from certain angles. We needed a way to make it always face the viewer. The solution was surprisingly simple. The red lines along the curve represent the tangent at those points. Taking the cross product of the tangent with the direction of the camera gives a new vector. This is used in the vertex shader to offset the position so the mesh always faces the viewer. To texture the arcs, the UVs of the mesh are defined with v going from 0 at the start to 1 at the end. So a vertex in the middle of the![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/c97c60ca19c64a8b5378d9f9e971f7bd.png)ShopifyDiego Macario Bello![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/7d0d75df-3ace-45f1-8d18-d566a2b70bc3.webp)](https://shopify.engineering/how-we-built-shopifys-bfcm-2023-globe?ref=gorillasun.de) [Daniel Beauchamp also wrote a more condensed TwiX thread on it](https://x.com/pushmatrix/status/1856340314757206353?ref=gorillasun.de). ### AI Corner **1 — LLMs For Curious Beginners** 🤖: Grant Sanderson shares a new video as a lighter-weight, but still substantive, intro to Large Language Models, complementing the more technical breakdowns of the underlying architecture that other videos of the channel cover. **2 — Something weird is happening with LLMs and chess** ♟️: Making LLMs play chess is not a new idea—there's been a bunch of [hilarious attempts at matching up two different models](https://www.youtube.com/watch?v=FojyYKU58cw&ref=gorillasun.de) and letting them hallucinate all sorts of fantasy moves—but apparently [something strange is happening](https://dynomight.net/chess/?ref=gorillasun.de), according to Dynomight: surprisingly ***gpt-3.5-turbo-instruct*** beats all other models in its chess abilities! Dynomight also has a hunch for the why, but we'll have to wait for another article to get our answer here. ***And that pretty much wraps up the news this week. Now for some other stuff that I want to address 👇*** ### So... why the new format? ***We are the architects of our own cages.*** If something doesn't work anymore—you change it. Simple as that. I started this newsletter in search of a more sustainable way for producing a piece of writing every week, that still was valuable in some way to the blog's readership without it being a super in-depth researched tutorial. Back then I also had a lot more time on my hands. This hasn't been the case for the past couple of months or so, not really because of the work at fxhash—it's been a really great experience overall—but basically because the newsletter had started feeling like a chore rather than an enjoyable thing that I do on my weekends. **I also have this really bad habit of overdoing things**. A newsletter's purpose is to provide a quick update about things, and also be an enjoyable read—however, I tried turning it into some sort of abomination that attempts to go in depth on several topics at once, and to somehow outdo myself every week. Over the past weeks it started feeling like I was not really giving any one of the topics the attention it deserved—hence why I will not try to do that anymore, simply because it doesn't work, and isn't fun for me anymore. I know that for some of you guys it felt like a ***mixed bag of candies***, informing about a lot of new things at once, but I'd much rather reserve these writing juices of mine that I have left at the end of the week to go towards more in depths pieces and tutorials—which there has been a big lack of this past year. I want to change that in 2025\. 🤞 Moving forward, the newsletter will be more concise—I'll still share the same amount of links/things I find interesting throughout the week, but I'm imposing a stricter word limit on myself, and will not spend more than a morning/afternoon on writing it. I believe this new approach will still fulfill the same purpose in our creative coding niche, but with the advantage of giving me more time for the other endeavors that I want/should tackle. Like doing some more sketching again (I did some today 😄), posting more on social media, being active in the discord, and maybe even just going on an additional mental health walk occasionally. 😬 Anyway, let me know what you think about this new format—it'll likely change a little bit throughout in the coming weeks as I fine-tune it! ### What have I been up to? While I took a break from the newsletter, I've still been quite busy—in the last issue that came out before this mini break I announced that I'd be traveling, and not just for fun, but for creative coding purposes! Friday the 8th of November I was kindly invited by Helge Rhodin, a professor, lecturer and researcher at the university of Bielefeld, to give a guest lecture for his Video Game Programming course and introduce the undergrads there to creative coding. Big thanks go out to Dave Pagurek for putting me in touch with Helge—[check out Dave's blog, he's got a few really cool posts](https://www.davepagurek.com/blog/creative-coding-2002/?ref=gorillasun.de)! The following week I found myself for a couple of days in London to give not one, but two creative coding workshops for the lovely folks at Trilitech. The first one was public for everyone to attend, and another internal one for the devs there. While I don't have pics for the guest lecture, I do have some pics for the workshop that you already saw in the banner—but sharing again here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/collage2-10-.jpg) We didn't expect there to be that many people, 30 had RSVP'd and usually that means that a third will actually show up, but in this case it was probably more than 20. I was also told some more profesh pics and a short post about it are on the way. Big thanks to Vincianne and Beata for inviting me—the idea for this came together after the workshop I gave in Ghent, and I'm really happy that it happened! Definitely going down as a highlight of this year for me! ### Some progress on the re-design When I woke up Saturday morning after the workshop, I felt like a lot of weight had come off my shoulders. It was the first day in a while where I didn't set an alarm to wake me up—but I still ended up opening my eyes around 9:00AM. I felt really well rested then. When I eventually mustered the strength to peel the covers off of me, and splash my face with some cold London water; I packed my laptop and headed downtown again—somehow I really enjoyed the bustling vibes of Soho. I picked one of those hipster coffee shops in one of the alleways, plugged in my airpods like all the other cool kids, and allowed myself to just do whatever I felt like on my mac—I ended up working for a couple of hours on the blog before my grumbling stomach notified me that it was lunchtime. Long story short, I ended up making quite a bit of progress on the new theme for the blog, that's also hopefully quite functional when it comes out—I am aiming for the end of the year, with where I'm at, and with what I have right now it is a realistic timeline for me. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/Screenshot-2024-11-24-at-22.28.46.png) Here's a sneek-peak of potentially the new articles/archive page! Might potentially even add a bookmark feature like you can make out here, that lets you save articles for later, and stores them as a cookie in your browser. Still need to figure out a couple of things here though! Anyway, that's it from me this week—any before I forget it, here's my music recommendation: Okay, let's roll the credits! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 79Crafting Painterly Shaders - Djikstra’s Algorithm Universally Optimal - Poisson Point Process on Infinite Grids - Ahmad Shadeed on CSS Masonry - A Modern CSS Reset - Democratising Publishing with Ghost - Github Spark - Building Things with Claude Artifacts![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-4.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/chladdddd-1--1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-79) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 79 URL: https://www.gorillasun.de/blog/gorilla-newsletter-79/ Last updated: 2024-11-04T06:00:42.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 79th issue of the Gorilla Newsletter - a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) 💡 ****Quick PSA:** The Newsletter is going on break for the next two weeks, as I'll be traveling—for creative coding purposes! ****See you on the 25th of November** ✨ I also want to take some time and rethink the format and direction of the newsletter moving forward 🙏 *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ***...and other creatively computational thingamajigs!*** ### **On Crafting Painterly Shaders** Developed in 1976 by the Japanese researcher Hiroshi Kuwahara, the Kuwahara filter is an image processing technique that’s primarily used for edge-preserving smoothing and reducing noise while maintaining sharp boundaries in an image. It also turns out to be the secret sauce for *painterly shaders*—shaders that mimic paint, watercolor, and aquarelle textures when used as a post-processing filter. Maxime Heckel describes how this works in detail with his newest massive deep dive: [On Crafting Painterly Shaders - Maxime Heckel’s BlogA detailed essay on my research and process of building a shader to mimic paint, watercolor, and aquarelle by exploring various implementations of the Kuwahara image smoothing filter.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/74de4631cb2e9b2be1f36ae01f33ba37.png?v1)](https://blog.maximeheckel.com/posts/on-crafting-painterly-shaders/?ref=gorillasun.de) The kuwahara filter essentially works by inspecting a square region around each individual pixel, splitting it into four overlapping smaller squares. In each of these squares, the filter calculates the average color and the amount of variation in color. Then, it picks the region with the least variation, meaning it’s the smoothest or most uniform area assigning it to the pixel in the center. This filtering technique has the effect of preserving edges but also manipulates the image in a way that makes it look ***painterly***. Maxime doesn’t stop at implementing a simple Kuwahara filter however, but also explains further improvements to really take the effect to the next level. One of them is a modification Giuseppe Papari proposed in his 2007 paper [Artistic Edge and Corner Enhancing Smoothing](https://www.cs.rug.nl/~imaging/artisticsmoothing/TIP%5Fartistic.pdf?ref=gorillasun.de), that replaces the square filter with a circular area. I won’t spoil too much more however and leave you to read through the article by yourself. ### Djikstra’s Algorithm proven Optimal ***TLDR: This past week a new paper from a group of researchers at INSAIT shows that with an elegant modification Djikstra’s shortest path algorithm can become universally optimal!*** [Universal Optimality of Dijkstra via Beyond-Worst-Case HeapsThis paper proves that Dijkstra’s shortest-path algorithm is universally optimal in both its running time and number of comparisons when combined with a sufficiently efficient heap data structure. Universal optimality is a powerful beyond-worst-case performance guarantee for graph algorithms that informally states that a single algorithm performs as well as possible for every single graph topology. We give the first application of this notion to any sequential algorithm. We design a new heap data structure with a working-set property guaranteeing that the heap takes advantage of locality in heap operations. Our heap matches the optimal (worst-case) bounds of Fibonacci heaps but also provides the beyond-worst-case guarantee that the cost of extracting the minimum element is merely logarithmic in the number of elements inserted after it instead of logarithmic in the number of all elements in the heap. This makes the extraction of recently added elements cheaper. We prove that this working-set property guarantees universal optimality for the problem of ordering vertices by their distance from the source vertex: The sequence of heap operations generated by any run of Dijkstra’s algorithm on a fixed graph possesses enough locality that one can couple the number of comparisons performed by any heap with our working-set bound to the minimum number of comparisons required to solve the distance ordering problem on this graph for a worst-case choice of arc lengths.![](https://arxiv.org/static/browse/0.3.4/images/icons/apple-touch-icon.png)arXiv.orgBernhard Haeupler![](https://arxiv.org/static/browse/0.3.4/images/arxiv-logo-fb.png)](https://arxiv.org/abs/2311.11793?ref=gorillasun.de) ***There’s a bunch of stuff to unpack here: for those that aren't familiar, what actually is Djikstra’s Algorithm and what does it do? What’s the modification this new paper makes? And what does it actually mean for an algorithm to be universally optimal?*** The famous shortest-path algorithm can not only be considered as a cornerstone of Djikstra’s fame, but also as a cornerstone of computation itself; it’s become a staple in undergraduate computer science curricula around the world. Unsurprisingly, I learned about it for the first time in my algorithms and data sctructures course, and looking back it was one of the most rewarding and fun materials that we learned about in the course. Years later I rediscovered graph traversal algorithms for generative art purposes—Djikstra’s algo being one of them—here’s two things I made where the algo plays an important role: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/image-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/image-1.png) As the name suggests, shortest path algorithms are methods for finding the shortest path from a starting node to a target node, usually in a network—a weighted graph—where nodes can be connected in arbitrary mannes. A weighted graph simply means that each edge between two nodes has a numerical value, or "weight," associated with it, representing a cost, distance, or other quantity. In this setting the shortest also means ***least costly***. Nodes in this setting are usually modeled in an object oriented manner, where each node is its own instance holding references to the nodes it is connected to—basically its neighbors. The graph then emerges in an implicit manner by means of connecting nodes with each other. I won't regurgitate the individual steps of the algorithm here, since there's like a million posts about it, but the [Wikipedia page provides a pretty good description](https://en.wikipedia.org/wiki/Dijkstra%27s%5Falgorithm?ref=gorillasun.de). Edsger Dijkstra came up with his shortest-path algorithm in a surprisingly casual way—in an [interview](https://dl.acm.org/doi/pdf/10.1145/1787234.1787249?ref=gorillasun.de) he gave in 2010 towards the end of his life, he gives a beautiful recount of how the idea for the algorithm came to be: > One morning I was shopping in Amsterdam with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path. As I said, it was a 20-minute invention. He published his idea three years later in 1959 in a paper titled “A Note on Two Problems in Connexion with Graphs”, and after the algorithm gained widespread popularity, a lot of research went into finding optimizations. In 1984 the two scientists Michael Fredman and Robert Tarjan demonstrated that Djikstra’s algorithm can actually be worst-case optimal with a modification, in their paper “[Fibonacci Heaps and Their Uses in Improved NetworkOptimization Algorithms](https://web.eecs.umich.edu/~pettie/matching/Fredman-Tarjan-Fibonacci-Heaps.pdf?ref=gorillasun.de)". In this setting **Worst-case Optimal** means that no algorithm could possibly solve a given problem faster in the most difficult situation. It's like saying "even in the hardest possible case, this is as fast as anyone could ever make it." Fredman and Tarjan showed this for Dijkstra's algorithm by using a clever heap data structure to store and update distances, which they call a Fibonacci heap and describe in an earlier paper of theirs. If you're curious about it, here's a really good explainer by SithDev: In essence, using a Fibonacci heap improves Dijkstra's algorithm by making it faster to select and update the node with the smallest distance. In steps where Dijkstra’s algorithm finds the closest unvisited node and updates distances to neighboring nodes, a Fibonacci heap handles these tasks more efficiently than a regular heap, and can quickly find the minimum, allowing for fast updates when shorter paths are discovered. Tarjan continued to make a number of important contributions to graph papers over the years, and his name is also on this newest paper, that goes a step beyond and proves that Djikstra’s algorithm is not only worst-case optimal, but universally optimal. U*niversally Optimal* means that the algorithm is as efficient as possible across all different types of graphs, not just in the worst-case scenarios. I’m not going to claim that I exactly understand how this works—but in essence they use a new smarter version of the Fibonacci heap that adapts based on how the algorithm is accessing nodes, further optimizing these operations. Naturally there's also the mathematical part that proves this claim. I hope this was relatively informative—the reason I'm writing about the topic is because I came across this article by Ben Brubaker for Quanta Magazine, tackling the very same paper, for which the animation in the banner was made by none other than Dave Whyte aka beesandbombs: [Computer Scientists Establish the Best Way to Traverse a Graph | Quanta MagazineDijkstra’s algorithm was long thought to be the most efficient way to find a graph’s best routes. Researchers have now proved that it’s “universally optimal.”![](https://www.quantamagazine.org/wp-content/themes/quanta2024/frontend/images/favicon.png)Quanta MagazineBen Brubaker![](https://www.quantamagazine.org/wp-content/uploads/2024/10/DijkstraOptimality_crDaveWhyte-Social.jpg)](https://www.quantamagazine.org/computer-scientists-establish-the-best-way-to-traverse-a-graph-20241025/?ref=gorillasun.de) ### Uniform Point Distribution on an Infinite Grid Poisson Disk Sampling is a popular technique for generating aesthetically pleasing, ***seemingly*** uniform point distributions. In a Poisson Disk Sampling points are distributed on a surface in such a manner that each point is separated from its neighbors by at least a specified minimum distance. This results in a well-spaced and visually appealing pattern that avoids clustering or large gaps. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/11/image.png) In creative coding and generative art Bridson’s algorithm is probably the most common approach to achieve a Poisson Disk Sampling—the algorithm works by first placing an initial random point and then attempts to iteratively place new points in the proximity of existing points in random directions, enforcing the minimum distance constraint. There’s many resources that cover the topic: an iconic one is [Sighack’s write-up about implementing the algo in Processing](https://sighack.com/post/poisson-disk-sampling-bridsons-algorithm?ref=gorillasun.de), naturally [the coding train’s also covered the topic](https://www.youtube.com/watch?v=flQgnCUxHlw&pp=ygUWIHBvaXNzb24gZGlzayBzYW1wbGluZw%3D%3D&ref=gorillasun.de), as well as [Sebastian Lague](https://www.youtube.com/watch?v=7WcmyxyFO7o&pp=ygUbc2ViYXN0aWEgbGFndWUgcG9pc3NvbiBkaXNr&ref=gorillasun.de). Overall the algorithm is really potent in a procedural setting, either for the placement of things, or for using it as an underlying structure to create triangulations, and/or other kinds of grids. The caveat however, is that it relies on a spatial data-structure to remember the position of the already placed points and enforce the minimum distance requirement. It also isn’t really a true uniform distribution, but rather a kind of blue noise distribution. True uniform point distributions on the other hand, might not be as visually pleasing, but are still quite useful in for procedural generation purposes. In a recent article, Boris Brave explores an approach geared towards that end, in a infinite setting, by using a ***Poisson Point Process***—which turns out to be a techniques that hasn’t actually previously been documented before: [Infinite Uniform Point DistributionsRune’s recent talk on layered procedural generation has got me thinking about procedural generation again, so I wanted to share a technique I found about doing a uniform distribution of point…![](https://www.boristhebrave.com/wp-content/uploads/2020/09/btb_logo.png)BorisTheBrave.ComBoris![](https://www.boristhebrave.com/wp-content/uploads/2024/10/uniform_points_thumb.png)](https://www.boristhebrave.com/2024/10/30/infinite-uniform-point-distributions/?ref=gorillasun.de) [Link to Tweet](https://x.com/boris%5Fbrave/status/1851678092919558646?ref=gorillasun.de) By subdividing the plane into square chunks, and then distributing points inside of the cells, the illusion of an infinite point distribution is made possible. The number of points in each cell is determined by a poisson distribution, where the index of the square chunk serves as a seed, in turn making it possible to remember what the random points in any given chunk are. Boris explains the maths behind this in the post and demonstrates that by hiding the underlying grid it makes it seem like a very organic distribution. ### Other Cool Generative Things 1. When this newsletter comes out then it'll already be to late to participate in this jam event—[Proc Jam 2024](https://itch.io/jam/procjam?ref=gorillasun.de) took place over the course of October, and somehow I completely missed it. But I still wanted to point it out as we may see some cool creations submitted to the event. 2. In an article of his [Matt Greer explains how he crammed a full featured recreation of Solitaire he programmed onto a Nintendo E-Reader](https://mattgreer.dev/blog/cramming-solitaire-onto-a-nintendo-ereader-card/?ref=gorillasun.de)—a Game Boy Advance peripheral that Nintendo released in 2002 and allows you to run mini games and other apps. 3. Sergey Borovikov shares a codepen sketch on how to pack spheres such that they do not intersect when viewed on any axis—not sure how to describe other than this, check out the [video he posted over on Twitter](https://x.com/upo11o/status/1852388823990153290?ref=gorillasun.de), self-explanatory when you see it. Jeff Clark pitches his own sketch in the replies, with a take on the idea where there additionally are shapes cut out of the packing area. ## Tech & Web Dev ### Should Masonry be Part of CSS Grid [Last week we saw the WebKit blog publish an update post on the CSS Masonry debate](https://www.gorillasun.de/blog/gorilla-newsletter-78/), in which Jen Simmons talks us through the current state of affairs asking for help to decide on the final syntax of CSS Masonry. She explains that the implementation has now been figured out, but what remains is whether or not Masonry should actually be integrated with the Grid spec or become its own layout mode. This week CSS expert Ahmad Shadeed weighs in on the discussion with an insightful article that's as always chockfull with interactive examples: [Should masonry be part of CSS grid?An exploration of examples showing masonry as both a part of CSS Grid and as its own display type.![](https://ishadeed.com/assets/favicon-32x32.png)Ahmad Shadeed![](https://ishadeed.com/assets/masonry/twitter-card.jpg)](https://ishadeed.com/article/css-grid-masonry/?ref=gorillasun.de) Shadeed believes that integrating masonry as part of the Grid spec is more practical than making it a separate layout module for a couple of reasons: having masonry as part of the grid spec would reduce code duplication and simplify progressive enhancement—considering that it will take a while for browsers to roll-out support for masonry, devs could simply fall back on the standard grid layout in browsers that do not yet support it yet. Otherwise you’d require separate styling ruels. Shadeed also argues that masonry is essentially a form of a grid layout, so it doesn’t make sense to treat it as an entirely new module. This way it also becomes possible to dynamically switch between normal grid and masonry layouts based on conditions like viewport size or the number of items in the grid. ### Jake Lazaroff’s Modern CSS Reset I’ve mentioned CSS resets in a couple of issues at this point, but I never actually explained what it exactly is! A **CSS reset** is basically a set of CSS rules that eliminates the default styling applied by web browsers to HTML elements. Browsers usually have built-in styles for elements like margins, padding, and headings, and they often annoyingly vary between different browsers which can lead to inconsistencies your web designs. That’s why it makes sense to start with a clean slate and use a CSS reset as a baseline for styling purposes. The first CSS reset was proposed by Eric Meyer in 2007\. It gained widespread popularity as a practical solution for managing browser inconsistencies and became a staple in web developer toolkits. His reset was designed to address the significant inconsistencies in styling across browsers, that were prevalent at the time. Meyer’s reset removed all default margins, padding, and other stylistic properties from HTML elements, making cross-browser compatibility easier to manage, you can find it here if you’re interested in reading it: [Reset ReasoningThe reset styles are undergoing yet another overhaul, but in the meantime, I thought I’d answer a question several people have asked: why?!?![](http://meyerweb.com/favicon.ico)![](https://meyerweb.com/ui/i/hamonshu/fb-og-image.png)](http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning/?ref=gorillasun.de) While it’s become a bit of a tradition for web devs to postulate their own CSS resets, I’m bringing this up, because in last week’s issue I briefly pointed out Josh Comeau’s custom CSS reset, due to Josh making an update to it. This week, Jake Lazaroff (who you probably won’t remember making an appearance in issue #26 of the newsletter) published his own Modern CSS Reset that’s based in part on Comeau’s, with a couple of interesting modifications that he explains in a post over on his blog: [My Modern CSS Reset | jakelazaroff.comA CSS reset I’ve been using for new projects.![](https://jakelazaroff.com/favicon.ico)Jake Lazaroff![](https://jakelazaroff.com/og/my-modern-css-reset.png)](https://jakelazaroff.com/words/my-modern-css-reset/?ref=gorillasun.de) A special thing about Lazaroff’s reset is that it’s "classless", meaning that it applies styles only to elements without a class via the `:not([class])` selector. This is to ensure base styles are only applied to unstyled elements, which makes it easier to customize elements with class-based styles. The goal here is to create a solid styling foundation while keeping the flexibility that makes it easy to override or extend styles without too much hassle. ### Ghost CEO on Democratising Publishing If you’ve been a reader of the newsletter for a while, you’ll have noticed that I’m somewhat of a Ghost fanboy—the open source software that powers the Gorilla Sun Blog. When I first migrated the blog from my own Jekyll+Github pages setup over to Ghost, I wrote a little bit about the reasons behind it in an article titled [Goodbye Jekyll](https://www.gorillasun.de/blog/goodbye-jekyll/). At the time I did the switch relatively quickly, and while the pragmatic reasons for switching over to Ghost at the time are still valid—with time it became more and more clear that it is the ideal tool for my Blog. It’s quite remarkable that Ghost is a self-sufficient non-profit building an open source tool in this day and age, when many other organizations have to rely on enshittifying their products to be profitable. In light of the wordpress drama, John O’Nolan, co-founder of Ghost, shares his thoughts on how they set themself apart from the others out there. [Democratising publishingThoughts on open source governance and how to create trust within technology, communities, and media.![](https://john.onolan.org/content/images/size/w256h256/format/jpeg/2024/03/gravatar-j10-square.jpg)John O'NolanJohn O’Nolan![](https://john.onolan.org/content/images/size/w1200/2024/10/e4b60d8a-582b-4fb8-9342-106a73886a7a.webp)](https://john.onolan.org/democratising-publishing/?ref=gorillasun.de) > Our setup is pretty different to most, and while I certainly don't think we've got it all figured out — I think our model is especially relevant at this particular moment in time. ### Other Cool Tech Things 1. Chris McCully has been hard at work going down the solo dev route. [He recently made a new write-up about some of the things he's made and shares his thoughts on product design as a solo dev](https://medium.com/@chriswmccully/product-design-as-a-solo-developer-a5549dd33742?ref=gorillasun.de). 2. After purchasing a domain name for his side project, [Bryan Braun discovers that this domain name is haunted and has a problematic backstory](https://www.bryanbraun.com/2024/10/25/before-you-buy-a-domain-name-first-check-to-see-if-its-haunted/?ref=gorillasun.de). He enumerates some steps to avoid getting spooked like he did. ## AI Corner ### Github Spark Github Spark is a new AI platform that lets anyone build their own personalized micro apps—simply by describing them in natural language. Spark then also lets you run these apps in a hosted environment, that has access to the internet to make use of various APIs (as far as I understood from the demos they showcase), in addition to data storage, and LLM powered capabilities: [GitHub Next | GitHub SparkGitHub Next Project: Can we enable anyone to create or adapt software for themselves, using AI and a fully-managed runtime?![](https://github.githubassets.com/pinned-octocat.svg)GitHub Next![](https://githubnext.com/assets/images/og/project/github-spark.png)](https://githubnext.com/projects/github-spark?ref=gorillasun.de) Right now Spark is only available via a waitlist, and it was a bit tricky to figure out how to actually get on the waitlist—[here](https://github.com/github%5Fspark%5Fwaitlist%5Fsignup?ref=gorillasun.de) is the signup link if you're interested. Then you also have to head over to the [Github Next (the folks developing Spark) discord server](https://discord.gg/tjKcQf4XW8?ref=gorillasun.de) and drop your Github username in the “Let me Spark! Megathread!” thread of the Spark channel. I'm currently still waiting for access 🤷 ### Building things with Claude Artifacts Last week we saw Claude roll out the analysis tool that now makes it possible to run code. Their artifacts feature however had already allowed for the generation of various types of content in a sidepanel next to the chat interface. Simon Willison wrote a big post about all of the single page web apps he’s built thus far with Claude Artifacts—if you need some inspiration while waiting for your access to Github Spark, check it out, some of them are actually quite useful: [Everything I built with Claude Artifacts this weekI’m a huge fan of Claude’s Artifacts feature, which lets you prompt Claude to create an interactive Single Page App (using HTML, CSS and JavaScript) and then view the result …![](https://simonwillison.net/favicon.ico)![](https://static.simonwillison.net/static/2024/claude-artifacts/sqlite-wasm.jpg)](https://simonwillison.net/2024/Oct/21/claude-artifacts/?ref=gorillasun.de) ## Music for Coding I can’t believe this track is 9 years old at this point—I remember listening to Alabama Shakes ***Sound & Color*** on repeat back when it came out, at a time I was still living with my parents in Lebanon. Back then I was really trying to write and play my own music, and the opening track of the album was a huge inspiration. How I discovered the track eludes me at this point, probably some new release aggregator site. I’m not going to lie, even though it’s a cheerful track it’s a bit difficult listening to it again—lots of emotions thinking back to some of these *simpler* days of my life, and it’s also sad to read that the band went on an indefinite hiatus in 2018\. Regardless however, Brittany Howard, the lead singer, has still to this day one of my favorite voices—do yourself a favor and listen to the entire Sound & Color album when you’ve got an hour to spare: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 78Wolfram’s Theory of Everything - Flow-Lenia Universes - The Fascinating History of Cymatics - Category Theory Illustrated - State of CSS 2024 Survey Results - Solar-Powered Self-Hosted Website - CSS Masonry Update - Anthropic Analysis Tool - Infinite Generative Games![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/10/patternn-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-78/) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 78 URL: https://www.gorillasun.de/blog/gorilla-newsletter-78/ Last updated: 2024-10-28T06:00:54.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 78th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ***...and other creatively computational thingamabobs!*** ### Wolfram's Theory of Everything ***Might the universe just be one big generative system?*** Stephen Wolfram is arguably one of the most influential figures in computational sciences over the past couple of decades. While he's widely known for his entrepreneurial endeavours as the creator of *Mathematica* and *Wolfram Alpha*, he's also published quite a bit of influential writing as well. His 2002 magnum opus, *A New Kind of Science*, is his most ambitious contribution: a 1,200-page book proposing his "theory of everything" that attempts to unify physics under a single computational model. And the book's actually freely available in its entirety over on Wolfram's website: [Stephen Wolfram: A New Kind of Science | Online—Table of ContentsThe latest on exploring the computational universe, with free online access to Stephen Wolfram’s classic 1,200-page breakthrough book.![](https://www.wolframscience.com/favicon.ico)Wolfram Media, Inc.Stephen Wolfram![](http://www.wolframscience.com/share.png)](https://www.wolframscience.com/nks/?ref=gorillasun.de) And Wolfram's theory is quite fascinating: it suggests that the universe operates as one big computational system where space, time, and matter emerge from simple, underlying rules—much like the patterns we see in cellular automata, where basic, deterministic operations can generate remarkably complex patterns. Furthermore, he claims that these rules operate within what he calls a hypergraph structure: a sophisticated network of nodes and connections that evolve according to precise mathematical principles. In this sense, Wolfram proposes that the complex physical phenomena that the universe operates under emerge as computational properties rather than fundamental physical laws. (as far as I understand it) While the book was a best seller and got significant attention from the public, his ambitious framework faced considerable skepticism from the scientific community. Largely for the speculative nature of it. What didn't help was the book's self-publication, and it not being peer reviewed. Besides that, some also simply didn't like Wolfram, for his bold presentation style, and his sweeping claims that sometimes appeared to downplay the significance of established physics research. [Physicists Criticize Stephen Wolfram’s ‘Theory of Everything’The iconoclastic researcher and entrepreneur wants more attention for his big ideas. But so far researchers are less than receptive![](https://www.scientificamerican.com/static/favicon.ico)Scientific AmericanAdam Becker![](https://static.scientificamerican.com/sciam/cache/file/10E6E611-2E7A-4073-9540042ABF851479_source.jpg?w=1200)](https://www.scientificamerican.com/article/physicists-criticize-stephen-wolframs-theory-of-everything/?ref=gorillasun.de) In 2020, Wolfram published a substantial follow-up paper titled "A Class of Models with the Potential to Represent Fundamental Physics." The 448-page work iterates and expands on his original theory, demonstrating that he still holds on to it: [Finally We May Have a Path to the Fundamental Theory of Physics… and It’s Beautiful—Stephen Wolfram WritingsHow does our universe work? Scientist Stephen Wolfram opens up his ongoing Wolfram Physics Project to a global effort. His team will livestream work in progress, post working materials, release software tools and hold educational programs.![](https://writings.stephenwolfram.com/favicon.ico)Stephen WolframDavid Terr![](https://content.wolfram.com/sites/43/2020/04/swblog-2036-explainer.png)](https://writings.stephenwolfram.com/2020/04/finally-we-may-have-a-path-to-the-fundamental-theory-of-physics-and-its-beautiful/?ref=gorillasun.de) The implications of Wolfram's work extend into philosophical territory. The question of whether the universe's complexity can be reduced to simple computational rules touches on fundamental debates about the nature of physical laws and our ability to comprehend them. After having been asked for years to provide her perspective on the long running debate, theoretical physicist and science communicator Sabine Hossenfelder finally complied and addressed Wolfram's ideas in one of her YouTube videos—which is also why I ended up going down this rabbit hole. In her video, titled "This Theory of Everything Could Actually Work: Wolfram’s Hypergraphs", she breaks down Wolfram's idea explains a little what she thinks about it: Whether there is merit or not to Wolfram's theory, it's a fascinating perspective on the fundamental nature of our universe. And while Wolfram might be a polarizing character for his worldview, it's undeniable that his work continues to spark important discussions in theoretical physics about our understanding of the universe and the potential modii under which it operates. ### Flow-Lenia Universes And while we’re already on the topic of simulating the universe, I’d like to highlight a post that caught my attention where Flow-Lenia are used in the context of artificial life simulations. In [issue #61](https://www.gorillasun.de/blog/gorilla-newsletter-61/) of the Newsletter we talked about particle Lenia, where I also briefly brought up Smoothlife, a smooth approximation of Conway’s game of life, which then later inspired Lenia as a further, smoother generalization of the CA—I did however miss that there was another variant called Flow-Lenia, which we'll get to in just a second. Last week Pierre-Yves Oudeyer, research director at INRIA, gives us a sneak-peek into a new research project that's being worked on, showcasing a simulation where Lenia are somehow self-assembling into different life-like organisms: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-10.png)](https://x.com/pyoudeyer/status/1846564316532691143?ref=gorillasun.de) [Link to Post](https://x.com/pyoudeyer/status/1846564316532691143?ref=gorillasun.de) The short trailer immediately reminded me a lot of Christian Heinemann’s A.L.I.E.N. project, which is probably the most elaborate artificial life simulation to-date (this year’s A-Life virtual creatures competition winner, covered in [issue #69](https://www.gorillasun.de/blog/gorilla-newsletter-69/) of the newsletter), with the difference however that it’s a particle based simulation. Which is why I find it quite interesting to see Lenia used in this context: one limitation of Lenia is that the emergent patterns are bound by the parameters of the context they exist in, meaning that two different creatures can't coexist in the same environment. So how does this actually work then, are the emergent entities/creatures actually self aware in a stateful manner? While Pierre-Yves doesn’t reveal too much just yet, he points out the previous research that they base their work on, namely last year’s A-Life best paper award winner, Erwan Plantec’s paper “[Flow Lenia: mass conservation for the study of virtual creatures in continuous cellular automata](https://arxiv.org/abs/2212.07906?ref=gorillasun.de)” which answers my question: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-11.png)](https://x.com/eplantec/status/1604825334591160320?ref=gorillasun.de) [Link to Tweet](https://x.com/eplantec/status/1604825334591160320?ref=gorillasun.de) | [Recording of the talk given at A-Life 2023](https://www.youtube.com/watch?v=605DcOMwFLM&ref=gorillasun.de) Flow-Lenia is in essence an evolution-focused extension of Lenia. We’ve seen that Lenia are capable of generating life-like, self-organizing patterns resembling artificial life forms, that are however limited to specific constraints, such that different "creatures" cannot emerge or interact within the same environment as I just mentioned. Flow Lenia addresses this limitation by adding two key features: mass conservation and parameter localization. I’m not going to claim that I entirely understand how it works, but from what I understood mass conservation is used to ensure that matter is redistributed rather than accumulating indefinitely, which is the restricting mechanism that makes patterns spatially stable, and creates localized forms in a sort of organic manner. Parameter localization then allows for different species to coexist and interact, with each creature being governed by locally adaptive update rules. These two modifications make it possible to simulate ecosystems with multiple types of entities exhibiting diverse, life-like behaviors. I recommend giving Erwan Plantec’s talk a watch for this: The paper then also shows that it is possible to evolve creatures with specific behaviors, like moving in straight lines, navigating obstacles, or following a gradient towards a "food" source. In larger simulations, creatures with different parameter sets form diverse interactions, from symbiotic relationships to territorial dynamics. In this manner, by embedding parameters within the cellular dynamics, Flow-Lenia allows for open-ended, intrinsic evolutionary processes without predefined objectives. In this new exploration, Flow-Lenia are thencombined with autotelic exploration algorithms, which are described as efficient diversity search algorithms. Pierre-Yves also explains them as "curiosity-driven exploration mechanisms" that enable agents to invent and sample their own goals, he talks about in [this presentation](https://www.youtube.com/watch?v=6a80g%5FKm2ik&ref=gorillasun.de) of his. ### The Fascinating History of Cymatics In other news, I’ve done a ton of research and reading on Cymatics and Chladni patterns this week, primarily due to the current project that the team at fxhash is working on—you might’ve seen some teasers already over on social media, it’s Erika Weitz and Thomas Noya’s CYMATIC: Patterns of the Pentatonic that will be presented at the Paris Photo Fair 2024\. If you're in Paris at the time you might want to check out the fair, it's essentially one of the most important photography events that happens every year; so it's really cool that generative art makes an appearance there! While I was looking into the history behind cymatic patterns, I ended up going down a rabbit-hole of trying to figure out how they are implemented algorithmically. And it turned out to be a quite tricky, but after a couple of evenings I did end up figuring it out—you can see the fruits of my work in the banner of this week's issue. I also made an animated interactive version, of which you can see a teaser here: 0:00 /0:40 1× I'll still have to work on the behaviour of the particles a bit to make it seem that they're actually physical grains of sand, but we're getting there. Cymatic patterns aren’t just fascinating from a computational point of view, but also due to the rich scientific history behind them. There were actually quite a few that discovered cymatic patterns before Chladni formally described them in his famous 1787 book "Discoveries in the Theory of Sound". Many others then also contributed later on, most notably Hans Jenny who actually coined the term ***cymatics***. Here's a thorough resource that lists all influential characters in that regard: [Cymatics History - CymascopeCymatics History Cymatics is an aspect of Nature that has been known for centuries, possibly millennia, and it has a rich and fascinating history with many twists and turns. Direct ocular viewing of vibrations typically involves exciting inorganic matter such as particulate matter, pastes (both magnetic and non magnetic) and liquids under the influence of![](https://cymascope.com/wp-content/uploads/2022/01/cropped-image-fav-270x270.jpeg)Cymascope - Cymatics and the Cymascope Device for Sound Research![](https://cymascope.com/wp-content/uploads/2020/03/01-2020_cymascope-logo_blk-scaled.jpg)](https://cymascope.com/cymatics-history/?ref=gorillasun.de) I encourage you to try and recreate the patterns for yourself, there's a few resources about it online—but it was interesting to figure out that they're kind of a type of SDF. That said, I'm working on a tutorial and I'll have more to share quite soon! ### Category Theory Illustrated To cap of this section of the newsletter this week, I'd like to briefly venture into a topic that's a bit more mathematical at heart, and highlight a book I discovered about Category theory, written by Jencel Panic it's an illustrated and accessible introduction to the topic: [Category Theory Illustrated - index![](https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/category-theory-illustrated/&size=128)index![](https://abuseofnotation.github.io/category-theory-illustrated/logo.svg)](https://abuseofnotation.github.io/category-theory-illustrated/?ref=gorillasun.de) In brief, Category Theory can be described as a branch of mathematics that focuses on the relationships and structures within different mathematical concepts. Instead of studying individual objects, it examines how objects interact through *morphisms* or *arrows*, which represent functions or transformations. So you also shouldn't conflate it with set theory, although category theory can be considered a generalization of set theory, as Jencel Panic states at the beginning of the first chapter, that preliminarily introduces set theory. In this setting, a "category" consists of objects and arrows that follow specific rules, like how arrows can be combined (composed) in a consistent way. This approach allows us to find commonalities across various areas of math by abstracting out details and focusing on the structures and relationships between them, to later better understand and unify different mathematical theories. ![Function from a smaller set to a bigger one](https://abuseofnotation.github.io/category-theory-illustrated/01_set/function_small_big.svg) One of the Jencel's illustrations found in the book. We also see category-theory make an appearance in functional programming, where functions are treated as first-class entities, and composition is very similar to *morphisms* in category theory. Concepts like *monads* and *functors* are also inspired by category-theoretic structures. I found a cool 2 part series on this topic back from 2016 by Nikolay Grozev: [Functional Programming and Category Theory \[Part 1\] - Categories and FunctorsThis series of tutorials defines and illustrates the Category Theory concepts which are most widely adopted in FP. We will use simple Scala and pseudocode ex…![](https://nikgrozev.com/favicon.ico)Nikolay GrozevMarch 14, 2016![](https://nikgrozev.com/images/bio-photo.jpg)](https://nikgrozev.com/2016/03/14/functional-programming-and-category-theory-part-1-categories-and-functors/?ref=gorillasun.de) ### Other Cool Generative Things - I completely forgot to mention it in last week’s issue, but the [BIG Entangled article](https://shorturl.at/0K3ag?ref=gorillasun.de) went out as an fx(text) last week. If you want to learn more about the project, the numerous conversations that Bjorn's initial tweet sparked, and details around the exhibition that happened over in Ghent, you can now read up on it. - [The Art Blocks weekend is making a return, and it's taking place from the 14th to the 17th of November in Marfa.](https://x.com/artblocks%5Fio/status/1780642650158170311?ref=gorillasun.de) - Steve, who you might know from the awesome Steve's Makerspace YouTube channel, has been on a personal foray into shader coding. Last week he showcases a cool [warp shader applied to his webcame](https://x.com/SteveMakerspace/status/1849505484929167399?ref=gorillasun.de) and shares the code for it. As a little addendum to this first section, I want to talk a little bit about its content; I might have been a bit too ambitious when I started being more serious about the Newsletter, but recently there haven't really been too many new resources about generative art and creative coding in general, and I don't know why that is. Maybe it's just that time of the year where people are most busy? Or maybe it's due to me not having too much time anymore to spend on scouring various social media feeds for interesting things—I can only dedicate my weekends for writing these newsletter. You might've noticed that I've started casting a wider net and featuring a broader spectrum of resources, leaning a bit more into mathematics and science based topics, that might not always be inherently generative, but are still in some way tangentially related. I also don't want to change the title of the section out of the blue—so for now you'll see that little additional subtitle. Maybe you have some thoughts on this? I'd really appreciate any feedback I can get on this, especially from those who've been subscribed for a while: how do you feel about the weekly selection? ## Tech & Web Dev ### The State of CSS 2024 The State of CSS 2024 survey results were released a few days ago, and there's a ton to unpack! As mentioned in a previous issue of the newsletter, 2024 has arguably been the most exciting year for CSS in a long time; in the foreword to this year's results, Sacha Greiff describes it as the year we'll look back on as the turning point between "CSS Classic" and "New CSS"—and I couldn't agree more. This sentiment is also echoed by Ahmad Shadeed in the concluding statement, who's excited by the possibilities and experimentation that the big amount of newly introduced features open up. If you just want to explore the results for yourself you can do so here, I also believe that you can still fill out the survey itself to contribute to the statistics: [State of CSS 2024The 2024 edition of the annual survey about the latest trends in the CSS ecosystem.![](https://devographics.github.io/surveys/state_of_css/css2024/images/css2024-favicon.svg)Google Chrome– Sacha Greif![](https://devographics.github.io/surveys/state_of_css/css2024/images/css2024-og.png)](https://2024.stateofcss.com/en-US/?ref=gorillasun.de) I really love the granularity of the results: the graphs in the demographic section have additional tabs that offer complementary breakdowns of the same data, and also let you set your own filters, whereas the feature section breaks down each CSS rule in terms of usage, where respondents could indicate if they “used it”, “heard of it”, or “never heard of it”, and then for each of these responses can additionally indicate their sentiment "postiive", "neutral", or "negative": ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-8.png) Additionally respondent can leave a little comment explaining their answer, which you can view by clicking on the little speech bubble icon. If you're interested in doing some visualization experiments, or compare the results to previous years, the survey also makes available a GraphQL endpoint. While not the most used feature overall, the [:has()](https://developer.mozilla.org/en-US/docs/Web/CSS/:has?ref=gorillasun.de) pseudo-class is unsurprisingly the most popular new addition. If you somehow haven't heard of it yet, it allows you to select elements based on their child elements, meaning that it provides a way to target a parent element if it contains a specific child element—which is particularly handy for creating more specific and context-aware styles. For example, you can style a parent element differently if it contains a specific child element. It's also this year's superstar in terms of discussion; we saw more than a few in depth articles addressing it over the course of the year, here’s [Ahmad Shadeed interactive guide](https://ishadeed.com/article/css-has-guide/?ref=gorillasun.de) and [Josh Comeau’s massive article](https://www.joshwcomeau.com/css/has/?ref=gorillasun.de) on it just to name two, but a quick google reveals a ton more. If you want a much more nuanced and expert review of the survey results, you should check out Josh Comeau’s in-depth article: [Email newsletter issue • Josh W. ComeauFriendly tutorials for developers. Focus on React, CSS, Animation, and more!![](https://www.joshwcomeau.com/favicon.png)Josh W. Comeau![](https://www.joshwcomeau.com/opengraph-image.png?cac0cc658da9fd03)](https://www.joshwcomeau.com/email/2024-10-22-css-survey/?ref=gorillasun.de) Josh also points out the new `text-wrap: pretty` rule, that I also thought was kind of underrated for what it does. It basically improves the visual appearance of text by preventing single words (orphans) from appearing alone on a new line at the end of a paragraph; it does so by subtly adjusting line breaks and hyphenation making text overall more pleasing to look at. ### DIY Solar-Powered & Self-Hosted Website In an exploration of more environmentally friendly web hosting, Dries Buytaert created a solar-powered setup that allows him to self-host a website on a Raspberry Pi. You can read about the technical details on the solar-powered website itself (with a [hosted backup copy](https://dri.es/my-solar-powered-and-self-hosted-website?ref=gorillasun.de) available 24/7)—naturally, on cloudy and rainy days, the website might go offline when the battery powering the raspberry Pi is depleted, so you’ll have to check back in after a while. You can also check the status of the battery via a handy dashboard that Dries makes readily available [here](https://dri.es/sensors/solar?ref=gorillasun.de). [Solar-powered, self-hosted website\>Solar-powered, self-hosted websitedriesbuytaert.net![](https://solar.dri.es/images/solar-panel-on-roofdeck.jpg)](https://solar.dri.es/?ref=gorillasun.de) In the write-up, Dries explains that his setup is deliberately larger than needed to handle long periods of low sunlight, which results in unused energy once the battery is full. Dries finds this frustrating as it could be put to better use, helping offset the setup’s costs. He points out that this problem isn’t limited to his personal DIY project, but also highlights a larger issue in web hosting: providers over-allocate resources to ensure uptime, leaving much hardware idle and increasing environmental costs. A solution to this could be that non-critical websites could embrace occasional downtime, reducing hardware needs and making the web more sustainable. For many personal sites, the 99.9% uptime standard actually isn’t necessary. Dries points out the [Low-Tech magazine](https://solar.lowtechmagazine.com/?ref=gorillasun.de) as a solar-powered inspiration to his experiment, that also has some [resources on building small solar powered systems](https://solar.lowtechmagazine.com/2023/12/how-to-build-a-small-solar-power-system/?ref=gorillasun.de) if you’re curious about the topic now, among other interesting things. ### Final Chapters of CSS Masonry Maybe a bit of a dramatic headline for this section, but the big CSS Masonry saga seems to be nearing a conclusion (maybe that’s a bit optimistic however). And we've followed along with the saga in a number of previous issues whenever the discussion picked up again. This week, Jen Simmons updates us on the current state of affairs, informing us that the WebKit engineers at Apple have been hammering out the details in close collaboration with colleagues over at Google and the CSS Working Group (CSSWG): [Help us choose the final syntax for Masonry in CSSBack in April 2024, we wrote about “Masonry” layout in CSS and the ongoing work to bring this feature to browsers.![](https://webkit.org/favicon.ico)WebKitJen Simmons and Elika Etemad, with Brandon Stewart![](https://webkit.org/wp-content/uploads/masonry-demo.png)](https://webkit.org/blog/16026/css-masonry-syntax/?ref=gorillasun.de) Jen states that it is in fact possible to integrate Masonry layout with the full power of CSS Grid, and that in an performance efficient manner. Now the remaining debate—which is basically kinda the main issue still—is whether to integrate masonry as a new display type with its own properties or simply add a new value to existing CSS Grid properties. Jen argues in favor of the latter approach, to create a unified and extensible layout system that is both efficient and user-friendly. Creating a separate display type might appear simpler in isolated examples, but introduces redundancy and complexity in the larger context. She also addresses concerns around the proposed default value for masonry-style layouts, and suggests that it could lead to unexpected and undesirable outcomes. ### Other Cool Tech Things 1. Joery Sebrecht, whom I featured on last week's Newsletter for his stellar resource on building web components with vanilla tech, published an important follow up post to explain his no-build, no-framework [setup for developing vanilla web components](https://plainvanillaweb.com/blog/articles/2024-10-20-editing-plain-vanilla/?ref=gorillasun.de). 2. [Dave Ruperts explains the pros and cons of web components](https://daverupert.com/2024/10/super-web-components-sunshine/?ref=gorillasun.de); how they excel in diverse scenarios, like design systems and low-memory projects, but face challenges with Shadow DOM intricacies and limited server-side rendering, making them versatile yet occasionally tricky tools. 3. And more content from Josh Comeau, he recently made an [update to his modern CSS reset](https://www.joshwcomeau.com/css/custom-css-reset/?ref=gorillasun.de), with the `text-wrap: pretty` rule mentioned earlier! ## AI Corner ### Claude can now run Code Anthropic introduces an analysis tool, a new built-in feature that lets write and run JavaScript code! They describe it as a built-in code sandbox, where Claude can do complex math, analyze data, and iterate on different ideas before sharing an answer. You can read more about it in their official announcement here: [Introducing the analysis tool in Claude.aiWe’re introducing a new built-in feature for Claude.ai, the analysis tool, that enables Claude to write and run code. With the analysis tool, Claude can process data, conduct analysis, and produce real-time insights.![](https://www.anthropic.com/images/icons/apple-touch-icon.png)![](https://cdn.sanity.io/images/4zrzovbb/website/c5fbdad19dbc8980e35a1e3cf98fca9813b035c7-2400x1260.png)](https://www.anthropic.com/news/analysis-tool?ref=gorillasun.de) I didn't have too much time to play around with it yet, but I'm already impressed, I dropped in a sketch I'm working in P5 and asked if it could run it, and it answered with: "I'll help you create a similar visualization using HTML5 Canvas since p5.js isn't directly available." and it worked like a charm! Maybe that's due to the improved version of Claude 3.5 sonnet though, that boasts even better programming capabilities. They also released an announcement about it [here](https://www.anthropic.com/news/3-5-models-and-computer-use?ref=gorillasun.de). You can also drop in a CSV file and it'll automatically create a visualization for you—here I used the demographics data from the State of CSS 2024 survey: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-27-at-21.52.50.png) ### Infinite Generative Games Developed by a team of researchers at Google and UNC, *Unbounded* is a new kind of AI-based game that ditches the typical start-and-finish structure for something much more open-ended; it aims to make all aspects of gameplay feel spontaneous—Nataniel Ruiz provides a breakdown in this thread: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-9.png) [Link to Post](https://x.com/natanielruizg/status/1849807021131874583?ref=gorillasun.de) The innovative thing about this project, is the consistency of visuals and narrative during play, by using a custom LLM and image generator pipeline—based off of their results section it seems that their approach works much better when compared related previous works. However, I'm not entirely convinced about the game-play aspect of it, from what I understand it feels like I could also simply chat with a regular LLM prompt interface and pretend that I'm playing a text based game. But maybe I'm missing something? You can read the write-up for yourself here: [Unbounded: A Generative Infinite Game of Character Life SimulationUnbounded: A Generative Infinite Game of Character Life Simulation![](https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/&size=128)Jialu Li1,2![](https://generative-infinite-game.github.io/images/teaser.png)](https://generative-infinite-game.github.io/?ref=gorillasun.de) This also reminds me of the research project from a few weeks ago, where an interactive generative image model was used to run DOOM—it was also a discussion to really call the model a *game engine*. The same thing is true here. I'm not entirely convinced that this is the future of gaming, I'd argue that one of the most enjoyable things about games is the hand-crafted aspect of them—since there are no set rules, paths, or end goals, it might feel a bit aimless and lack a "sense of achievement". I could equally ask ChatGPT to endlessly generate a bunch of fantasy stories for me, and keep me entertained forever—but at some point it's gonna start to feel a bit pointless. That's just my 2 cents however, what do you think? ## Music for Coding Fujii Kaze is a Japanese singer-songwriter and pianist that started gaining significant popularity in 2022 with the viral success of his song "Shinunoga E-Wa" on TikTok—while he'd been releasing music since 2019, it was this song that brought him international attention. His music is a laid-back blend of soulful R&B with elements of jazz and pop, often driven by catchy melodies—I thoroughly enjoyed this Tiny Desk concert of his: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 77Honoring Lillian Schwartz - λ-2D New Esolang - Genetic Algorithms for Creative Coding - Enshittification of the Modern Web - Are Web Components the Future? - HTML for People - NotebookLM - AGI24![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/10/Untitled-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-77) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 77 URL: https://www.gorillasun.de/blog/gorilla-newsletter-77/ Last updated: 2024-10-21T05:00:28.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > This is the 77th issue of the Gorilla Newsletter—a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Honoring Lillian Schwartz This past week we mourn the loss of Lillian Schwartz, a pioneering figure in computer art. She passed away on October 12 at the age of 97\. While Schwartz has only recently gained more recognition in the broader art world, she was undeniable a trailblazer in digital art for her technology based approach, and the many timeless contributions that she’s made over the span of her career. [LILLIAN SCHWARTZ (1927–2024)Trailblazing computer artist Lillian Schwartz, whose jittery, color-saturated, digital films burst onto screens at a time when computers were still massive mainframes laboriously programmed with punch cards, died on October 12 at her home in Manhattan.![](https://www.artforum.com/wp-content/uploads/2023/09/cropped-AF-Favicon-3.png?w=192)ArtforumNews Desk![](https://www.artforum.com/wp-content/uploads/2024/10/THF705911.jpg?w=650)](https://www.artforum.com/news/lillian-schwartz-dies-19272024-1234720358/?ref=gorillasun.de) Schwartz believed that computers could serve as powerful tools for understanding and interpreting the complexities of modern society. One of her most notable works, is her 1968 kinetic sculpture *Proxima Centauri*, which was one of nine E.A.T.-affiliated works chosen by curator Pontus Hultén for his landmark exhibition “The Machine as Seen at the End of the Mechanical Age” held at the Museum of Modern Art. The sculpture allowed visitors to step on a mat which would then trigger a mechanism to raise a plastic dome displaying animated, glowing visuals, meant to represent a sort of tiny galaxy. This piece later made an appearance in a *Star Trek* episode as a prison for the brain of the human-Vulcan character Spock. Through her participation in this exhibition Lillian Schwartz met Leon Harmon, who would proceed to invite her to the renowned Bell Labs in New Jersey, where she'd become a resident-visitor just a week after. She continued to work there until 2002\. This residence provided her with access to cutting-edge technology and a supportive environment, enabling her to make numerous important contributions over the years. Schwartz's early short film experiments at Bell Labs, such as "Pixillation" (1970) and "UFOs" (1971), pushed the boundaries of what was possible with computer graphics and animation. In [issue #73](https://www.gorillasun.de/blog/gorilla-newsletter-73/) I featured Schwartz's 1976 short film titled "The Artist The Computer," that explores her relationship with this new technology, and how artists can harness it as a new creative medium—which I believe is an essential watch, not only if you're interested in learning more about Schwartz's work, but also for anyone interested in how computer art arrived at where it finds itself today: ### λ-2D New Esolang LingDong Huang’s λ-2D (*lambda-2D*) is a new esoteric programming language in which programs can be drawn instead of being typed. Inspired by other non-verbal stateless programming languages, like Piet (that we’ve covered in [issue #57](https://www.gorillasun.de/blog/gorilla-newsletter-57/) of the newsletter), or [Befunge](https://esolangs.org/wiki/Befunge?ref=gorillasun.de), λ-2D is designed as functional programming language inspired by lambda calculus, which is in essence a mathematical framework that describes how functions… function; functional programming in its most primitive form. It makes it such that function definitions and applications can be expressed entirely in a symbolic manner, which is leveraged for the purpose of λ-2D. LingDong recounts the challenges and joys of creating the esoteric language in this article published on the MIT Media Labs’ website, which also sheds some light on how the language is meant to be parsed via a computer vision model: [Project Overview ‹ λ-2D: An Exploration of Drawing as Programming Language, Featuring Ideas from Lambda Calculus – MIT Media Lab An Exploration of Drawing as Programming Language, Featuring Ideas from Lambda Calculus![](https://www.media.mit.edu/static/images/icons/apple-icon-180x180.7c705d989dde.png)MIT Media Lab![](https://dam-prod2.media.mit.edu/thumb/2022/04/02/PXL_20220302_203150013.jpg.1400x1400.jpg)](https://www.media.mit.edu/projects/2d-an-exploration-of-drawing-as-programming-language-featuring-ideas-from-lambda-calculus/overview/?ref=gorillasun.de) An additional early design consideration that LingDong embarked with, was that programs created with λ-2D needed to be visually appealing “such that someone would want to put a frame around them and hang them on the wall”. In this manner, programs in λ-2D come to life as intricate line diagrams that represent functions feeding into other functions, visually describing certain computations. LingDong also provides us with an [online demo editor](https://l-2d.glitch.me/?ref=gorillasun.de) that allows for the creation of these diagrams and also provides some out-of-the-box examples to play around with: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-5.png) You might also recognize LingDong from his earlier creative works, such as [{Shan, Shui}\*](https://github.com/LingDong-/shan-shui-inf?ref=gorillasun.de) where traditional Chinese landscape paintings come to life as endlessly generative side scrolling tapestries, or [fishdraw](https://github.com/LingDong-/fishdraw?ref=gorillasun.de) a project where plottable line drawings of fish are procedurally generated. A good overview of all his works can be found over on his [Github profile](https://github.com/LingDong-?ref=gorillasun.de). ### Genetic Algorithms for Creative Coding JSConf 2024 took place a couple of months ago in Budapest, and I just recently stumbled across the talks that had been uploaded to YouTube—Here’s a [playlist of all the talks](https://www.youtube.com/playlist?list=PL37ZVnwpeshEczPCbFGVGd-hj1DR7%5FSKy&ref=gorillasun.de) that were given, that in some way or another revolve around JS. I think I'll have to start marking my calendar for all of the different conferences that are taking place all of the time, because, seriously how are you supposed to keep track? 🤣 JK, as always, I'm super grateful for the documentation efforts! One talk that stood out to me in particular, was Kevin Mays' presentation on genetic algorithms (GAs) and their applications in various settings. The second half of the talk showcases an example that demonstrates how to program your own GA and using it for creative coding purposes in JS with our beloved HTML Canvas Element: If you're not familiar with GAs, they're essentially computational methods inspired by the principles of natural selection and genetics. They’re used to solve optimization and search problems by mimicking the process of evolution. In a GA, potential solutions to a problem are represented as individuals in a population, that undergo nature inspired processes like selection, crossover (recombination), and mutation to produce new generations of solutions. Over time, the population then "evolves" toward better solutions, as fitter individuals (those closer to the desired outcome) are more likely to be selected for reproduction. GAs are especially useful for solving complex problems where traditional methods may struggle, but they can also be used as a tool to simulate artifical environments, we covered a very iconic project in that regard in [issue #69](https://www.gorillasun.de/blog/gorilla-newsletter-69/) of the newsletter. Another good intro to them is the following Computerphile video, that demonstrates an application of GAs in the setting of the Knapsack problem: Genetic algorithms also have a fascinating history; their foundation was laid by the pioneering work of Lawrence Fogel in the 1960s, who introduced the concept of evolutionary programming. Later followed by John Holland who is widely regarded as the father of genetic algorithms. In the 1970s, Holland built upon Fogel's ideas to create genetic algorithms as we know them today. Holland was inspired by Charles Darwin's theory of evolution by natural selection and sought to apply biological processes like selection, crossover, and mutation to artificial systems. His groundbreaking work, published in 1972, detailed the theory and set the stage for the widespread adoption and development of genetic algorithms across various fields in the following decades. If you're interested about this original work, you can find it here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-21-at-01.21.41.png) [Link to Paper](https://www.geos.ed.ac.uk/~mscgis/12-13/s1100074/Holland.pdf?ref=gorillasun.de) ### Other Cool Generative Things 1. In a recent article titled [Transforming colors with matrices](https://lisyarus.github.io/blog/posts/transforming-colors-with-matrices.html?ref=gorillasun.de), Nikita Lisitsa shows us an efficient technique for color manipulation that relies on matrix multiplications. By representing colors as vectors and transformations as matrices it becomes easy to compose and apply various color operations like darkening, lightening, blending, and hue shifting. 2. The [newest issue of Chris Reid's generative art newsletter](https://newsletter.generatecoll.com/p/computation-using-fractions-shader?ref=gorillasun.de) shares an article on [Fractran, an esoteric programming language that's entirely based on the multiplication of fractions](https://wiki.xxiivv.com/site/fractran.html?ref=gorillasun.de). What's equally interesting is that the brilliant mind behind the language is yet again John Conway, a PDF of the original paper can be found [here](https://www.cs.unc.edu/~stotts/COMP210-s23/madMath/Conway87.pdf?ref=gorillasun.de). 3. Reddit user [awesomegraczgie21](https://www.reddit.com/user/awesomegraczgie21/?ref=gorillasun.de) built a fully functioning [Raycaster in Excel using VBA](https://www.reddit.com/r/GraphicsProgramming/comments/1g3mjan/excel%5Fthe%5Fbest%5Fgame%5Fengine%5Fa%5Fsimple%5Fraycaster/?share%5Fid=UhhjjX8tOcY5msdg08HZ9&utm%5Fcontent=1&utm%5Fmedium=android%5Fapp&utm%5Fname=androidcss&utm%5Fsource=share&utm%5Fterm=1) (Visual Basic for Applications). An additional comment explains that the demo uses the DDA algorithm for raycasting purposes, and even supports transparency as well as per column texture mapping 4. [OGLDEV made a video tutorial that shows how to program an endless grid in OpenGL](https://www.youtube.com/watch?v=RqrkVmj-ntM&ref=gorillasun.de), which is generally useful for debugging purposes. 5. Last but definitely not least, Japanese creative coder FumiSA created an [in depth 21 part tutorial series on building a complete beat/drum machine with P5JS](https://note.com/fumisa2821/m/m6f37532aff20?ref=gorillasun.de). The articles are in Japanese, but as always you can use your browser's translate function to help with that. You can also try out the synth for yourself [here](https://editor.p5js.org/FumiSA/full/KfbrJZo05?ref=gorillasun.de). ## Tech & Web Dev ### Enshittification of the Modern Web In November 2022 Cory Doctorow coined the term “enshittification” as a neologism to describe a pattern in which online services and platforms gradually deteriorate in quality, due to the prioritization of profit at the expense of user experience. [Enshittification - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Fuck_spez.png/220px-Fuck_spez.png)](https://en.wikipedia.org/wiki/Enshittification?ref=gorillasun.de) Doctorow explains that this process essentially happens in three phases: platforms start out by providing the user with a lot of value to attract them in a early growth phase, then slowly shift their focus to benefiting businesses, such as advertisers or sellers, and finally focus on extracting as much profit as possible out of both parties at the expense of everyone involved. Cory Doctorow makes a passionate appearance at last month's DEF CON 32 addressing the current state of platforms, and explains some of the ways that users and developers can act against it: ### Are Web Components the Future? Some weeks ago the creator of SolidJS published an article that caused a bit of an uproar in the Web Development scene: titled "Web Components are not the Future", Ryan Carniato contends the opinion that Web Components actually make web development more complicated, and while there are ergonomic benefits in certain scenarios, their cost generally outweighs their advantages: [Web Components Are Not the FutureA few years ago I wrote an article suggesting that Web Components might not be the most beneficial…![](https://media.dev.to/dynamic/image/width=180,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png)DEV CommunityRyan Carniato![](https://media.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplztptpee83p6bjvoy9h.png)](https://dev.to/ryansolid/web-components-are-not-the-future-48bh?ref=gorillasun.de) Carniato's article comes by no means from a place of dissent, but simply to advocate for a more nuanced approach that gives room for a wider variety of tools for their own particular tasks. The standardization of higher-level mechanisms like Web Components risks stifling innovation and exploration of alternative solutions, as developers tend to gravitate towards established standards, even when they are suboptimal. > If too many assumptions are made it becomes harder to explore alternative space because everything gravitates around the establishment. Last week Baldur Bjarnason chimes in with his own article, a massive one at that, not as an answer to Carniato's piece, but to provide further context, a historical recount of "*Why Web Components cause online web developer communities to erupt in anger and argument?*", and a critical analysis of the current state of things: [Liskov’s Gun: The parallel evolution of React and Web ComponentsBecause this essay is over 11 000 words long(!) I’ve made a convenience EPUB file for offline reading. (EPUB only! No PDF this time.) You can download it over on the fulfilment service I use, Lemon Squeezy, with the option to pay what you want if you feel the urge to support my writing.![](https://www.baldurbjarnason.com/dark-bird.svg)Baldur Bjarnason![](https://www.baldurbjarnason.com/favicon-96x96.png)](https://www.baldurbjarnason.com/2024/liskovs-gun/?ref=gorillasun.de) ### HTML for People And to cap things off, I wanted to share this resource by Blake Watson: a non-technical introduction to HTML, that assumes zero prior knowledge. Essentially the perfect resource to send to your creative DIY friends that have been meaning to create their own websites from scratch: [HTML for PeopleHTML isn’t only for people working in the tech field. It’s for everyone. Learn how to make a website from scratch in this beginner friendly web book.![](https://htmlforpeople.com/assets/img/design/favicon.png)![](https://htmlforpeople.com/assets/img/design/og.png)](https://htmlforpeople.com/?ref=gorillasun.de) ## AI Corner ### NotebookLM NotebookLM has been making a buzz over on social media lately, and since it's become a bit of tradition for me to do a test-run whenever a new fancy AI tool comes out—I dove in over the weekend and had a look. *So, what's NotebookLM?* It describes itself as "a tool that allows users to organize, analyze, and understand information" and that in an LLM augmented manner. It essentially lets you create your own notes as *sources*—these can be anything really, PDFs, text files, URLs, etc.—and then lets you ask questions about them via the familiar LLM chat interface. This means that the AI has knowledge about the content of the added sources. [NotebookLM | Note Taking & Research Assistant Powered by AIUse the power of AI for quick summarization and note taking, NotebookLM is your powerful virtual research assistant rooted in information you can trust.![](https://notebooklm.google/_/static/v4/favicon/light_mode/apple-touch-icon.png)Note Taking & Research Assistant Powered by AI![](https://notebooklm.google/_/static/v4/og/notebook_lm_share.png)](https://notebooklm.google/?ref=gorillasun.de) Besides that it also has a bunch of other features, like being able to save responses from the chat as notes that get pinned to your notebook This seems super useful, I've actually been using LLMs quite a bit for all sorts of different writing tasks. I think that many of us are. For example, sometimes I like to drop in a URL to an article into ChatGPT/Gemini and ask it to provide me with a quick summary of the content. I usually do this in the case when I'm not entirely certain if it's a piece that I actually want to read. It doesn't always have the ability to access the page, but when it does, it's usually a big time saver—then I can also continue asking it other questions about the content. So that's definitely something I'd use NotebookLM for, especially since it can keep track of multiple sources at the same time. Besides that I can also think about a bunch of use-cases to improve my own writing, turning it into my own personal mini, smart search engine. For instance, at some point I want to go back over all the pieces I've written and improve the writing, to fix typos and grammatically incorrect sentences—which would be quite laborious if I'd do it manually. Hence, as a test, I made a fresh notebook and dropped in the past 10 issues of the newsletter asking it to list out all typos that it can find, and it kinda did the trick: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-20-at-22.30.44.png) That's just something I thought of, off of the top of my head though—here it would probably tell me that the phrasing of the preceding sentence is pretty terrible. But to defy my hypothetical AI overlords I will keep it in. NotebookLM does come with some limitations, for example, you can only add 50 sources at this point. Each source can be up to 500,000 words. So I could technically just dump all of my newsletters in one huge file and then ask it questions about it. I'm not entirely sure at this point how I will end up using it, but I know that I will definitely be using it. ### François Chollet's Keynote Talk at AGI24 Francois Chollet makes an appearance the AGI24 conference that took place back in August. His keynote talk was released last week in which he discusses the limitations of Large Language Models and proposes a new approach to advancing artificial intelligence. He argues that current AI systems excel at pattern recognition but struggle with logical reasoning and true generalization: > LLM performance depends entirely on task familiarity, and not task complexity. \[...\] Skill is not intelligence, and displaying skill at any number of tasks does not show intelligence. **\~13:48 in the talk** ## Music for Coding This week’s music recommendation is a blast from the past, it’s Curtis Mayfield’s 1974 Sweet Exorcist, that I had the joy of listening to for the first time this past week. Curtis Mayfield was a highly influential American singer, songwriter, and guitarist, known for blending soul, funk, and socially conscious lyrics–his music often addressed civil rights, social justice, and Black empowerment. While *Sweet Exorcist* didn't reach the same level of commercial success of previous work the album still showcases Mayfield's signature socially conscious themes and smooth, yet funky sound reflecting his ability to merge groove-driven music with thoughtful and political lyrics: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 76Generative Floor Plan Design with Voronoi Diagrams - Reversing Conway’s Game of Life - What it means to be Open - Plain Vanilla Web Components - Wordpress Drama Recap - Learning Vulkan - Physics Nobel Prize 2024 - Can LLMs actually reason?![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/10/voronoii.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-76/) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 76 URL: https://www.gorillasun.de/blog/gorilla-newsletter-76/ Last updated: 2024-10-14T05:00:11.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 76th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Generative Floor Plan Design via Voronoi Diagrams This week's highlight is a research paper that was presented at the Pacific Graphics 2024 conference by a team of researchers from the University of Tokyo. Titled **"Free-form Floor Plan Design using Differentiable Voronoi Diagrams,"** the paper introduces an innovative method for the automatic generation of floor plan designs. Here's some of the visualizations that shared over in the Github repo accompanying the research paper: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-3.png) [Link to Github repo](https://github.com/nobuyuki83/floor%5Fplan?ref=gorillasun.de) where you can see a few more figures and animated examples. Similar to **Lloyd’s algorithm**, the method is based on the fact that each Voronoi cells can be entirely defined by their centroid—meaning that the polygonal region of a cell is implicitly defined by its distance to the centroid. The challenge is then to figure out how to move the centroids such that rooms (represented by clusters of same-colored cells) take shape, and the boundaries between them align with the coordinate axes. The procedure starts by randomly assigning room types to each cell in the diagram (represented by a color here), where the number of cells per room is based on the room’s relative size compared to the overall area that is meant to be subdivided. The method then iteratively adjusts the centers of the Voronoi cells until a meaningful floor plan takes shape. The only input required is an adjacency graph that defines the rooms and their relative sizes. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/1_shapeB_1.gif) The paper treats this relaxation task as an **optimization problem**. If you're not familiar, in an optimization problem the goal is to find the best solution by adjusting certain variables (in this case, the positions of the Voronoi centroids) to minimize or maximize a specific objective, called a "loss function." In this case we have multiple objectives (multiple loss functions), to control various aspects of the desired emergent floor plan, such as the individual room sizes, the wall alignment between them, and how they connect. By minimizing these losses, we can then determine how to nudge the positions of the centroids such that the system generates a well-organized and functional layout (by minimizing the loss function we compute a gradient that tells us in which direction the centroids need to be moved). In this case the authors actually end uses five different losses to guide the process: - An **Area Loss** ensures that each room matches its target size by minimizing the difference between current and desired areas, while - A **Wall Loss** simplifies and aligns the walls between rooms. - A **Lloyd Loss**, inspired by Lloyd’s algorithm, that keeps the Voronoi sites evenly distributed to avoid distorted room shapes. - A **Topology Loss** that maintains room connectivity, preventing adjacent rooms from disconnecting or splitting. - A **Fix Loss** that locks certain key locations in place during the optimization process, such as the entrance of the plan. There's a lot more to optimization problems that I'm glossing over here, but in essence these 5 indicators provide sufficient information for the self-assembly of a floor plan. The optimization then runs for several iterations until the loss function converges, where the cells stabilize and no further improvements are needed, which is when we should have arrived at a coherent layout. I actually couldn't resist trying my hand at re-implementing the algorithm, I believe that the technique could be quite a potent pattern generator—but turns out that it's going to take me a bit longer than just one Saturday afternoon. ### Differentiably Reversing Conway’s Game of Life Computing the next state for a given configuration of Conway’s Game of Life is trivial, you only need to determine what rule applies to each cell given the state of its neighbours. But have you ever wondered if it’s possible to compute the previous state for a given random configuration? This is the topic of a recent article that picked up speed over on Hacker News, where Kartik Chandra, aka Comfortably Numbered, investigates how to find predecessors of Life configurations that visualize portraits: [Conway’s Gradient of Life - Comfortably Numbered![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-4.ico)Comfortably Numbered![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/conway-out.png)](https://hardmath123.github.io/conways-gradient.html?ref=gorillasun.de) Turns out that this is quite a difficult computational problem: a given configuration can have multiple possible previous states (predecessors) or even none at all. This happens because the rules of the game lead to many-to-one transitions, where different initial states can evolve into the same configuration. Add to that, that certain patterns can “fizzle” out, where one or more cells simply die and remain inactive, this means that information was lost in an irretrievable manner. Quite a bit of research has gone into the topic—one notable resource in that regard is a transcript of a talk from Neil Bickford back from 2012, given at the Gathering for Gardner biennial conference (that is organized by none other than Martin Gardner himself, we covered his Mathematical Games column back in issue [#73](https://www.gorillasun.de/blog/gorilla-newsletter-73/) of the newsletter): [Link to Transcript](https://nbickford.wordpress.com/2012/04/15/reversing-the-game-of-life-for-fun-and-profit/?ref=gorillasun.de) Luckily, we can actually cheat to achieve the effect Kartik describes, such that we don't need to treat it as a search problem at all! But rather, as an optimization problem where we use gradient descent to find a predecessor, iteratively nudging a starting configuration into something that could result in the desired portrait configuration. Here's how it works: 1. We start with a random Life configuration, which we’ll call **b**. 2. After applying the game's rules to **b**, we get a new configuration, **b'**. At this point in time **b'** looks nothing like the target image, at best it's just a random configuration. 3. But we can make **b'** resemble a target image (like a portrait of John Conway as a Life configuration). To do so, we measure the difference between **b'** and the target image **t**. 4. Using this difference, we compute a gradient that tells us how to adjust **b** to get **b'** closer to **t**. 5. We then make small changes to **b** based on this guidance, run the Game of Life again to get a new **b'**, and repeat the process. 6. By continuously refining **b** through this iterative method, we gradually transform it to match the target image more closely. Since Life’s rules aren’t directly differentiable (because it’s based on binary “alive” or “dead” cells), Kartik creates a **differentiable approximation** of the game by representing the grid with real numbers (0 for "dead," 1 for "alive"), then applies a smooth, continuous version of the rules, using Gaussians to approximate the conditions where cells come to life or stay alive. The resulting pattern look somewhat like Turing patterns. ### What it means to be Open [Lu, aka Todepond](https://x.com/TodePond?ref=gorillasun.de), is one of the very first creatives that I started following over on TwiX when I joined the platform back in 2020, at a time when it was still known as the blue bird site. I followed because I was intrigued by the cellular automata experiments that Lu had been sharing—it seemed that Lu was exploring different code-based experiments on a daily basis. I still frequently think about this mind-boggling exploration from time to time: Now, years later, I learned that these were actually part of a daily coding practice, and has been ongoing for several years now, similarly to what Saskia Freeke is doing. Back in September Lu gave a talk at Clojure 2024, that was recently uploaded to Youtube. It's by far my favourite watch of this week, not only because it gives insight into Lu's creative practice, but also because it's a beautiful tale about opening up and sharing one's creations online: ### Other Cool Generative Things 1. Frank Force is hosting an online [Game Jam for the LittleJS game engine](https://itch.io/jam/littlejs-game-jam?ref=gorillasun.de), accepting submissions from the 11th of November till the 12th of December. The topic will be announced at the launch of the jam. 2. 3Blue1Brown recorded an hour long sit down with Ben Sparks (who you might know from the Numberphile channel) where [Grant Sanderson shows us his workflow for his Manim python library](https://www.youtube.com/watch?v=rbu7Zu5X1zI&ref=gorillasun.de), that he uses for creating the stunning visualizations in most of his videos. 3. [John Maeda is in the process of reprinting his iconic 2019 book “How to Speak Machine” in paperback](https://x.com/johnmaeda/status/1844975744767885465?ref=gorillasun.de). He mentions an interview that he gave back in 1999 for NYT about him combining computer science with the visual arts—turns out this interview still exists (as part of an ACT exam prep site) and he links to it [here](https://exam.actexam.net/exam/explanation.php?type=reading&examid=200901&no=27&ref=gorillasun.de). 4. The talks given at the [XOXO Festival](https://xoxofest.com/?ref=gorillasun.de) (an experimental festival for independent artists) are in the process of being [uploaded over on YouTube](https://www.youtube.com/@xoxofest/videos?ref=gorillasun.de), and while they don’t really revolve around creative coding, there’s more than a few interesting nuggets about creativity in there. 5. Some week ago I shared the upcoming Graphics Programming Conference taking place in Breda November 12th-14th. They just updated their website with the [schedule for the talks that will be given](https://www.graphicsprogrammingconference.nl/schedule/?ref=gorillasun.de). ## Tech & Web Dev ### **Plain Vanilla Web Components** My personal highlight of this week is a tutorial series by Joeri Sebrechts titled Plain Vanilla. It revolves around building Web Components with vanilla web tech, without relying on any external framework: [Plain Vanilla - ComponentsAn explainer for doing web development with vanilla web components.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-8.png)Components](https://plainvanillaweb.com/pages/components.html?ref=gorillasun.de) A web component is in essence a reusable, self-contained piece of code that encapsulates HTML, CSS, and JavaScript to create custom elements on a webpage. This approach to building UIs goes a long way when it comes to creating consistent and maintainable web projects, having the advantage that each component can be developed and tested independently. The concept of web components has been a bit elusive to me up until this point—I’d erroneously assumed that it is something entirely reserved to frameworks like React and Vue, but it turns out that you can also harness this ability with native web technologies. Joeri states: > The plain vanilla style of web development makes a different choice, trading off a few short term comforts for long term benefits like simplicity and being effectively zero-maintenance. This approach is made possible by today's browser landscape, which offers excellent web standards support. ### **Recap of the Wordpress Drama** And it wouldn’t be a week in tech if there wasn’t at least a little bit of drama—here’s a quick TLDR of the Wordpress situation as it is unfolding. In short, **the founder of WordPress, Matt Mullenweg, is having a public disagreement with the managed WordPress hosting company WP Engine.** Mullenweg has criticized WP Engine for profiting from WordPress without contributing significantly to its development. WP Engine has defended its business model, arguing that it provides valuable services to WordPress users. If you want a quick recap in video format, I recommend FireShip's coverage of the story: And here's the long version. If you’re for some reason not familiar with WordPress ([Wordpress.org](http://wordpress.org/?ref=gorillasun.de)), it’s a widely-used free and open-source content management system (CMS) that allows you to create and manage websites easily. Created in 2003 by Matt Mullenweg and Mike Little, it rose to popularity due to the fact that it doesn’t require any programming knowledge. Now it boasts an extensive plugin and theme eco-system, making it power over 43% of webpages on the internet today according to statistics. Wordpress itself has a commercial branch ([Wordpress.com](http://wordpress.com/?ref=gorillasun.de)), that provides hosting and all other services required to publish a Wordpress website for a fee. This commercial branch exists under the company Automatic, of which Matt Mullenweg is the CEO and apparently contributes significantly towards the development of the open source software. **WP Engine** on the other hand was founded later on in 2010, offering a similar managed hosting service that takes care of all the technical aspects of running a Wordpress website, however with less contribution to the open source software. Now the Drama started on the 20th September when Automatic requested WP Engine to sign a “Trademark License Agreement” with which WP Engine would essentially agree to give up 8% of their revenue to Automatic on a monthly basis. WP Engine naturally declined however, which then led Mullenweg to further escalate the situation the very next day, publishing an article criticizing the way in which WP Engine reuses the software, straight out calling it as a cancer to WordPress: [WP Engine is not WordPressIt has to be said and repeated: WP Engine is not WordPress. My own mother was confused and thought WP Engine was an official thing. Their branding, marketing, advertising, and entire promise to cus…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/wmark.png)WordPress NewsMatt Mullenweg![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Screenshot-2024-09-21-at-4.05.03-E2-80-AFPM.png)](https://wordpress.org/news/2024/09/wp-engine/?ref=gorillasun.de) A long-winded legal back and forth ensued that culminated in [Mullenweg banning WP Engine from accessing the resources of WordPress.org](https://techcrunch.com/2024/09/25/wordpress-org-bans-wp-engine-blocks-it-from-accessing-its-resources/?ref=gorillasun.de), in other words, WP Engine can no longer use the service to fetch plugins and themes, which is a service that is not covered under the open source WordPress license. On October 1st WP Engine deployed its own services for this purpose, and a good summary can be found here: [The WordPress vs. WP Engine drama, explained | TechCrunchThis story has been updated throughout with more details as the story has developed. We will continue to do so as the case and dispute are ongoing. The![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/cropped-cropped-favicon-gradient.png)TechCrunchIvan Mehta![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/wordpress-v1.jpg)](https://techcrunch.com/2024/10/10/wordpress-vs-wp-engine-drama-explained/?ref=gorillasun.de) ### Learning Vulkan by Elias Daler Vulkan has a bit of a bad rep in the graphics programming scene due to it being notoriously difficult to get into. It's quite complex and requires a lot of setup compared to simpler graphics APIs like OpenGL or DirectX—which is why there’s so many memes about the difficulty of just conjuring a simple triangle onto the screen: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-2.png) [Meme Sauce](https://www.reddit.com/r/GraphicsProgramming/comments/1bxo2cr/my%5Fteacher%5Ftold%5Fthat%5Fi%5Fwas%5Fcrazy%5Fto%5Fdo%5Fa/?ref=gorillasun.de) On the flipside however, those who do end up getting into Vulkan end up really appreciating its powerful features. Elias Dahler is one of them, and wrote a super in-depth recount of his own Vulkan journey, from learning the basics all the way to building his own game engine in it, in addition to two small game demos in the short span of 3 months. [How I learned Vulkan and wrote a small game engine with itThe personal website of Elias Daler about programming, technology and videogames![](https://static.ghost.org/v5.0.0/images/link-icon.svg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/final-1.jpg)](https://edw.is/learning-vulkan/?ref=gorillasun.de) I really appreciate the introductory section that provides a quick explainer about the current state of graphics APIs in 2024, including a little comparison between OpenGL and WebGPU. If you’ve ever thought about getting into Vulkan, this is likely the first thing you should sink your teeth into. ## AI Corner ### 2024 Nobel Prize in Physics goes to Geoffrey Hinton & John Hopfield In October of every year the Nobel prize winners are announced, which are then awarded later on December 10th. This year the Nobel prize in Physics is jointly given to Geoffrey E. Hinton and John J. Hopfield for their contributions in artificial intelligence—their work in the 1980s has indubitably laid the foundation for today’s AI boom. [The Nobel Prize in Physics 2024The Nobel Prize in Physics 2024 was awarded jointly to John J. Hopfield and Geoffrey E. Hinton “for foundational discoveries and inventions that enable machine learning with artificial neural networks”![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/Nobel-favicon-232x232-1.png)NobelPrize.org![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/fig_fy_24_4x3-1024x768-1.jpg)](https://www.nobelprize.org/prizes/physics/2024/press-release/?ref=gorillasun.de) In 1982 John Hopfield created a type of artificial neural network, called the Hopfield network, that works like a memory system in which a grid of "neurons" (or nodes) can store and retrieve patterns. When you show it an incomplete or blurry version of something it has seen before, the network adjusts itself step by step to try to fill in the missing parts and give you the complete version—kind of like how your brain remembers and completes an image even when parts are missing. Geoffrey Hinton built on Hopfield's idea and developed something called the Boltzmann machine. It learns to spot common features in data, like recognizing familiar objects in pictures. Which later became a big part of how AI systems can classify images or even create new ones. But this is just one of the things that Geoffrey Hinton has worked on in his career, he also contributed in developing the back propagation algorithm, that is arguably one of the most important notions in training neural networks today. In recent years Geoffrey Hinton has also stood out for his advocacy of the controlled and secure development of AI technologies, which he also addresses in his speech. He states that he considers the prize as “a recognition of a large community of people who worked on neural networks for many years before they worked really well”: Congrats to both Geoffrey Hinton and John Hopfield, well deserved. This also prompted a return of the Schmidhuber meme—there’s a running gag in the AI community centered around Schmidhuber's frequent claim to be the “father” of many foundational ideas in AI: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image-1.png) [Link to Tweet](https://x.com/Plinz/status/1843690678267851051?ref=gorillasun.de) ### Can LLMs actually Reason? Victor Taelin, who you might recognize as the creator of the Bend programming language covered in issue [#57](https://www.gorillasun.de/blog/gorilla-newsletter-57/) of the newsletter, made an interesting post about AI with a strong argument against the ability of LLMs to actually truly reason. He demonstrates this with a modified version of a simple binary tree inversion problem, where just a few simple modifications are sufficient to push the problem outside of the "memorized solution zone”: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/image.png) [Link to Tweet](https://x.com/VictorTaelin/status/1844886809005687270?ref=gorillasun.de) This essentially emphasizes that the perceived intelligence of large language models stems entirely from their vast scale and the extensive data they have been trained on, effectively "memorizing" a significant portion of the internet. While LLMs can produce solutions based on existing knowledge, they cannot engage in abstract reasoning and would therefore not be able to contribute to research in the way that humans can. ## Music for Coding OMA, pronounced oh-em-ay, has gained significant recognition over the past year for its innovative reinterpretations of classic hip-hop tracks. I found myself listening to the following performance after the algo recommended it to me while listening to last week’s recommendation—it probably thought I’d enjoy another one of those live sessions recorded out in nature—and alas it was right. And while giving it a listen, it took me a moment to realize that each tune was actually a cover: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 75The Curious History of Vectors and Tensors - Mathtober 2024 - Weekly Demoscene Report - Nicole Sullivan on CSS Masonry - CSS Module Level 5 - Writing Code for Humans - RNNs make a Return - Bas Djikstra is tired of AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-3.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Untitled.png)](https://www.gorillasun.de/blog/gorilla-newsletter-75) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 75 URL: https://www.gorillasun.de/blog/gorilla-newsletter-75/ Last updated: 2024-10-07T05:00:42.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 75th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### The Curious History of Vectors and Tensors Vectors and tensors are ubiquitous concepts in modern mathematics, physics, and computation—much of our current technology would be impossible without them. While the elegant notation that allows us to express many real-world phenomena seems obvious today, the mathematical history behind it is fascinating, and to some extent, dramatic—perhaps even controversial. Two pioneers who enter the ring in this regard, with differing philosophical views on mathematical representation and notation, are the Irish mathematician William Rowan Hamilton and the American scientist Josiah Willard Gibbs. In 1843 Hamilton proposed Quaternions for solving problems in 3 dimensions that regular algebra struggled to handle easily. Quaternions are in essence “a form of hypercomplex number with four components” and can be thought of a precursor generalized version of vectors. The notation essentially represents a rotation in 3D space using four components: one real part and three imaginary parts. It's written as `q = a + bi + cj + dk`, where `a` is the scalar part (magnitude) and `b`, `c`, and `d` are the imaginary parts that handle the rotation (the direction). [History of quaternions - Wikipedia![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/wikipedia-1.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1200px-Inscription_on_Broom_Bridge_-Dublin-_regarding_the_discovery_of_Quaternions_multiplication_by_Sir_William_Rowan_Hamilton.jpg)](https://en.wikipedia.org/wiki/History%5Fof%5Fquaternions?ref=gorillasun.de) Later on in the century, Gibbs, alongside Oliver Heaviside, introduced a more intuitive system and simpler notation that laid the foundation for the modern notation that we are familiar with today. Vector notation simplifies things by having one component for each dimension, directly representing the magnitude along the respective axis. The existence of these two approaches sparked a debate in late 19th-century mathematics and physics. While quaternions had supporters, including Hamilton himself, Gibbs and Heaviside advocated for the simpler vector approach. Overall, this debate reflected deeper differences in mathematical representation philosophies, and despite the elegance of quaternions in certain applications, vectors ultimately prevailed due to their practicality in calculations. However, quaternions remain valuable in computer graphics and robotics for representing 3D rotations today. If you’d like to learn more about this, John Schutt wrote a lengthy article that shines some light on this historical mathematics debate. He does so in context of a paper that he's written about the topic back in 1986 titled “Quaternions: A Case Study in the Selection of Tools for Mathematical Physics”: [The great vectors-versus-quaternions debateWhat? You’ve never heard of it? A big knock-down, drag-out fight between great minds of its day over, more-or-less, the philosophy of ho…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-3.ico)John Shutt![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/icon18_edit_allbkg.gif)](http://fexpr.blogspot.com/2014/03/the-great-vectors-versus-quaternions.html?ref=gorillasun.de) This segment is inspired by a book review that I came across over on SIAM News, the Society for Industrial and Applied Mathematics' website—an excellent resource that I plan to scan more frequently in the future. The book in focus is "Vector: A Surprising Story of Space, Time, and Mathematical Transformation" by award-winning science writer *Robyn Arianrhod*, published in May of this year. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-07-at-01.51.37.png) [Link to Review](https://www.siam.org/publications/siam-news/articles/the-curious-history-of-vectors-and-tensors?ref=gorillasun.de) I’ve since ordered it and am eagerly awaiting its delivery on Wednesday! I might do my own review after I've gone through it, but for the time being, the SIAM review gives a fair picture of the book, also warning that some parts might be way too complex for someone not familiar with certain materials. ### Mathtober 2024 in full Swing And since we’re already talking about Mathematics; it’s that time of the year again—no, not Halloween, but Mathtober! The month-long bonanza where math enthusiasts from around the world can virtually flock together and participate in creating daily sketches for each one of the 31 prompts: [Mathober 2024Mathober is just around the corner, and I can’t wait to see everyone’s creative take on this year’s prompts! If you’ve never participated before, now’s the perfect time to jump in! The goal of Math…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/logo200-1-1.jpg)Fractal Kitty![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/image-1-1.png)](https://fractalkitty.com/2024/09/10/mathober-2024/?ref=gorillasun.de) There's already been quite a few entries since the start of the month, and you can check them out via the [#Mathtober](https://x.com/search?q=%23Mathober&src=typed%5Fquery&ref=gorillasun.de) and/or [#Mathober2024](https://x.com/search?q=%23Mathober2024&src=typed%5Fquery&f=top&ref=gorillasun.de) hashtags over on social media. ### Psenough's Demoscene Report You might remember psenough as one of the hosts from the yearly Lovebyte size coding competition; we covered this year’s installment in issue [#43](https://www.gorillasun.de/blog/gorilla-newsletter-43/) and [#44](https://www.gorillasun.de/blog/gorilla-newsletter-44/) of the Newsletter; this week I discovered that psenough has his own YouTube channel on which he does a weekly Demoscene report. This vlogged newsletter highlights all of the important things that are transpiring in the current active demoscene: From current events and competitions, to interesting writeups and articles, psenough really does a very thorough job at finding the important bits and pieces. My personal highlight that he points out in this week’s recap is an article about Boris Vallejo, a renowned fantasy artist, whose art seemingly also played an important part in the demoscene where artists would frequently recreate his pieces as pixelart: [Boris Vallejo and the Pixel Art of the DemosceneBoris Vallejo is an epic fantasy painter, who has had an immense influence on fantasy book covers, computer game box art, and even the demoscene. Throughout the decades, his works have often been replicated by pixel artists, leading to controversy. I rediscovered Vallejo’s great work for myself, looked into the demoscene’s love for his pictures and decided to recreate one of his paintings using only four colors and record it on video. My little article here features fantasy art history, demoscene drama, and a lot of pixel art fun.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-2.ico)Marin ComicsMarin Balabanov![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/vallejo-tn.jpg)](https://marincomics.com/vallejo-pixelart.html?ref=gorillasun.de) [The article also sparked a gigantic discussion over on Hacker News.](https://news.ycombinator.com/item?id=41703213&ref=gorillasun.de) ### Other Cool Generative Things 1. [Rohan Paul](https://x.com/rohanpaul%5Fai?ref=gorillasun.de) shared some cool mathematics resources over on TwiX: MIT's [Mathematics for Computer Science](https://www.gorillasun.de/blog/gorilla-newsletter-74/) as well as Carnegie Mellon's [An Infinite Descent into Pure Mathematics](https://infinitedescent.xyz/dl/infdesc.pdf?ref=gorillasun.de). Both are quite chonky, but at the same time freely accessible to anyone. 2. Following [last week's segment on the JS13K competition](https://www.gorillasun.de/blog/gorilla-newsletter-74/); they've just got done with selecting the winners for each one of the respective categories. You can check them out [here](https://js13kgames.com/2024/blog/winners-announced?ref=gorillasun.de). 3. The [myriad exhibition](https://rethread.art/projects/myriad/?ref=gorillasun.de) is currently taking place at in Stockholm till the 12th at the R1 Reactor Hall. It is organized by [re|thread](https://rethread.art/?ref=gorillasun.de), a collective of software researchers, artists, and designers. Roni Kaufman made a cool [thread](https://x.com/KaufmanRoni/status/1840442238125633560?ref=gorillasun.de) explaining the artworks showcased at the venue. 4. Maxim Heckel is working on a new article, in which he'll teach us how to create painterly shaders. He recently made a [post revealing that the Kuwahara Filter is an essential method towards that end](https://x.com/MaximeHeckel/status/1842582517528088838?ref=gorillasun.de). 5. [CAX is a high-performance library designed to accelerate cellular automata simulations in JAX](https://t.co/0T5i2CRuJC?ref=gorillasun.de). Maxence Faldor over explains it in a [thread](https://www.siam.org/publications/siam-news/articles/the-curious-history-of-vectors-and-tensors?ref=gorillasun.de) over on TwiX. ## Tech and Web Dev ### Another Chapter in the CSS Masonry Discussion While I assumed that all CSS Day 2024 talks had been uploaded, when I wrote about [a couple of weeks ago](https://www.gorillasun.de/blog/gorilla-newsletter-70/), it turns out that there were still quite left over at that point. They have been uploaded over the past couple of weeks, and I highly recommend checking them out, they're all very insightful, and given by experts in their respective domains. With this segment I’d like to highlight the closing keynote by Nicole Sullivan, who you might recognize as the creator of the OOCSS paradigm (Object Oriented CSS), besides many other formative CSS concepts. In her talk she tackles a topic that’s become more and more important over the course of the past year, namely the CSS Masonry conundrum, and whether it should become part of the CSS Grid spec, or rather its own thing. We’ve followed along closely with the topic here on the newsletter and covered it on several occasions ([#54](https://www.gorillasun.de/blog/gorilla-newsletter-54/), [#55](https://www.gorillasun.de/blog/gorilla-newsletter-55/), [#56](https://www.gorillasun.de/blog/gorilla-newsletter-56/), [#57](https://www.gorillasun.de/blog/gorilla-newsletter-57/), [#58](https://www.gorillasun.de/blog/gorilla-newsletter-58/), [#70](https://www.gorillasun.de/blog/gorilla-newsletter-70/)). Nicole’s talk is especially insightful since it aggregates much of the feedback that’s been received thus far, and picks up the conversation from that point of view: Nicole goes over the entire issue up thus far, showcasing some of the Masonry layouts that can currently be found out in the wild and what they accomplish. She then explains the pros and cons behind both approaches. Receiving first-hand feedback from David Desandro, the creator of Masonry.js that he’s maintained for years now, states that flexible column is not such an important feature based off of the input he’s received—meaning that `display: masonry` could be entirely sufficient. Nicole argues against this however, as that would limit the possibilities of what can be done with a masonry layout, especially in the case when we want items that are sometimes irregular and span multiple columns, or in the setting where the columns don't have the same widths. This plays into another piece of content that we're graced with this week; about the same topic, which I believe might even be inspired by Nicole’s talk—Geoff Graham from CSS-Tricks pretty much summarizing the entire story so far, and goes into more detail on the opposing points of view around the issue: [CSS Masonry & CSS Grid | CSS-TricksAn approach for creating masonry layouts in vanilla CSS is one of those “holy grail” aspirations. I actually tend to plop masonry and the classic “Holy Grail”![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-4.svg)CSS-TricksGeoff Graham![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/381216-1)](https://css-tricks.com/css-masonry-css-grid/?ref=gorillasun.de) ### **New Values and Functions in CSS** Last month, the CSS Working Group released the first Public Working Draft of the CSS Values and Units Module Level 5\. This module describes the values and units that CSS properties typically accept as input and introduces some exciting new features. Alvaro Montoro, a frequent appearance on this newsletter, digs into the draft and explains some of these new additions in a recent article of his: [New Values and Functions in CSSThe CSS Working Group released the first Public Working Draft for the CSS Values and Units Module Level 5\. It describes the common values and units that CSS properties accept and the syntax used for them, and it comes with some interesting new features. A review of some new functions and values that you will see in CSS (hopefully soon) :: Blog post at Alvaro Montoro’s Personal Website.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/fav-1.ico)Alvaro Montoro (alvaromontorogmail.com)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/coding-1.jpg)](https://alvaromontoro.com/blog/68062/new-values-and-functions-in-CSS?ref=gorillasun.de) Here’s a super quick run-down of the new features: - **Enhanced `attr()` Function**: Use any attribute in any CSS property, with optional type and fallback. - **`calc-size()` Function**: Enables calculations with intrinsic values like `auto` or `fit-content`. - **`first-valid()` Function**: Chooses the first valid value from a list, simplifying custom property handling. - **`-mix()` Functions**: Mix various properties (e.g., colors, lengths) efficiently. - **Randomization**: New `random()` and `random-item()` functions generate random values from a list or range. - **Sibling Functions**: `sibling-count()` and `sibling-index()` return sibling order and count for styling based on position. - **`toggle()` Function**: Cycles through values for nested elements, reducing complex rules. - **New Functional Notation**: Introduces semicolons for clearer separation of argument lists. - **Flow-relative Positioning**: Allows positioning relative to text flow (e.g., `x-start`, `block-end`). And some of these are actually kind of bonkers—we're getting a `random()` function in CSS! Which is huge for generative art! ### **It’s hard to write Code for Humans** Erik Bernhardsson shares his thoughts on crafting joyful frameworks, libraries, and APIs in a recent article. When building developer tools, one faces not only technical challenges in implementing functionality, but also the task of creating an intuitive and accessible mental model for users. The article tackles the broader question of how to build a tool that can be easily grasped: [It’s hard to write code for computers, but it’s even harder to write code for humansHow to build developer tools for happiness and productivity.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/face-1.jpeg)Erik BernhardssonErik Bernhardsson![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/toolbox-1.jpeg)](https://erikbern.com/2024/09/27/its-hard-to-write-code-for-humans?ref=gorillasun.de) [What people had to say about Erik’s article over on Hacker News.](https://news.ycombinator.com/item?id=41668304&ref=gorillasun.de) The points enumerated by Erik are also in many ways applicable to educating about code in general, something that I’m attempting with this blog of mine. One of the big questions I always ask myself when I get started on a new tutorial (it’s been a minute) is “How do I explain this without it being overwhelming?” My approach is usually to explain everything from the ground up, in minute detail, so that the only assumed requirement is the reader’s ability to read. But now I’m coming around to thinking that this might not be the best way actually. Erik shares a Tweet by Chris Albon that captures an alternative approach: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-06-at-00.58.25.png)](https://x.com/chrisalbon/status/1831497223076770217?ref=gorillasun.de) [Link to Tweet](https://x.com/chrisalbon/status/1831497223076770217?ref=gorillasun.de) | [What people had to say about Erik’s article over on Hacker News.](https://news.ycombinator.com/item?id=41668304&ref=gorillasun.de) From personal experience, I’ve noticed that this also works quite well. Being dropped right into the midst of things, and then working your way outwards, in the direction you desire (learning the things that you are interested in basically) instead of having to climb the mountain from the bottom. Although, this second approach generally doesn’t give me as much of a clear overview. Anyway, great article, the other points are also quite valid. Which way do you usually learn best? Maybe another completely different approach? ### Other Cool Tech Things 1. Amelia Wattenberger continues her philosophical foray into exploring the possibilities of what user interfaces *could be*, by asking the question "[H*ow should our interfaces handle the transition from the hard logic of machines into the soft logic of humans?*](https://wattenberger.com/thoughts/hard-and-soft?ref=gorillasun.de)*"* 2. Piccalilli is back with another [article](https://piccalil.li/blog/a-guide-to-destructuring-in-javascript/?ref=gorillasun.de)[ that tackles destructuring in JavaScript](https://piccalil.li/blog/a-guide-to-destructuring-in-javascript/?ref=gorillasun.de). Yours truly has also written an [article](https://www.gorillasun.de/blog/introduction-to-the-javascript-spread-operator/) about the topic a while ago, that showcases some of the more obscure things that you can do with the JavaScript spread operator. 3. [Jhey Tompkins is a CSS wizard](https://x.com/jh3yy?ref=gorillasun.de) that frequently shares cool web experiments over on his TwiX, alongside the source code for them as codepens. ## AI Corner ### Were RNNs all we needed? With the omnipresent transformer architecture in LLMs, that is currently being hailed as the be all-end all architecture, RNNs have essentially become an extinct type of architecture. You might remember the important article Andrej Karpathy wrote back in 2015, titled “[**The Unreasonable Effectiveness of Recurrent Neural Networks**](http://karpathy.github.io/2015/05/21/rnn-effectiveness/?ref=gorillasun.de)” that showcases their effectiveness in a wide variety of applications.A recent paper titled “[Were RNNs All We Needed?](https://arxiv.org/abs/2410.01201?ref=gorillasun.de)” revisits the architecture and demonstrates an efficient method for training them that wasn’t possible before. If you’re curious you can give it a read, but the important point here is brought up in a tweet by Francois Chollet. I haven’t seen him grace my timeline in a long while, although he is one of the first people I followed in the early days of my Twitter account. He points out a notion that’s been becoming more apparent in deep learning research: model architecture is not actually that important in the grand scheme of things, given enough data every kind of architecture can achieve the same performance. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-05-at-11.36.42.png) This is at the same time a sobering but also depressing realization: does that in fact mean that all of Deep Learning is in fact just a big charade of function approximation? This also brings up the question if we’re actually on the right track towards AGI; if data is in fact so much more important, are the current methods actually capable of some sort of AGI, or will it require a completely different approach that we just haven’t discovered yet? ### I am tired of AI With an article of his, Bas Djikstra laments the ever increasing presence of AI in almost every area of our current digital existence—a sentiment that is arguably shared by many at this point—while AI accelerates many tasks related to writing and programming, it still requires human expertise and effort to turn whatever the AI spits out into something useful. [I am tired of AIUnless you have been living under a rock for the last few years, you probably have seen the same massive surge I’ve seen in the application of artificial intelligence (AI) to pretty much every problem out there, in software testing, in software development, and in life in general.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon-32x32-1.png)On Test AutomationBas Dijkstra![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/logo_large.png)](https://www.ontestautomation.com/i-am-tired-of-ai/?ref=gorillasun.de) And it’s definitely something that I'm also feeling more and more; what was at one point an impressive feat of computation is now less than mundane, annoying even in certain scenarios. I don’t think I really want to see another AI generated image, or read another sentence that’s obviously LLM generated. Just like the ad-pocalypse trained my brain to entirely censor out anything that looks remotely like a cheap ad-banner, the same is happening with when I just catch a whiff of something having been AI generated, I click away and move on with my life, because it’s probably not worth spending time on. Dr. Amy Clukey echoes this with a Tweet of hers that became quite viral: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/10/Screenshot-2024-10-07-at-01.13.24.png)](https://x.com/AmyClukey/status/1842342623295533117?ref=gorillasun.de) [Link to Tweet](https://x.com/AmyClukey/status/1842342623295533117?ref=gorillasun.de) ## Music for Coding This week's music recommendation is the young band Yuuf, who released their first EP "In the Sun" earlier this year. The EP has been quite successful, with a live recording posted on YouTube amassing over 700,000 views in just one month. The band has already celebrated several important gigs, including a performance on KEXP. Yuuf's sound can be best described as a blend of instrumental soul and ambient retro psychedelia: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 74Visiting Bjørn Staal’s Entangled - JS13K Competition - Electric Op at Buffalo AKG - Licia He Plotter Workshop & FEMG3N - Ghost CMS Developments - Josh Comeau’s New Blog - Jonas Hietala on 15 Years of Blogging - OpenAI becomes For-Profit![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-2.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/paterrnnnnn.png)](https://www.gorillasun.de/blog/gorilla-newsletter-74) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 74 URL: https://www.gorillasun.de/blog/gorilla-newsletter-74/ Last updated: 2024-09-30T05:00:32.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 74th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## Visiting Bjørn Staal's Entangled Maybe you caught a glimpse of it already over on TwiX, but last week I managed to catch the Entangled exhibition over at the Wintercircus in Ghent. Which is also the reason why I did not have time to send out the weekly newsletter—but we're making up for it with this special segment. Now it's already been a week that the exhibition concluded, but it's still been on my mind over the past couple of days. I am genuinely incredibly grateful to have been able to see it in peron; the Wintercircus is really a venue like none other—and you really had to be there to *feel* the space. *#nofomo* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-7.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-6.png) I really think that it was a perfect venue for the project. In the short time that I've been with fxhash now, I really need to give a big kudo to the team for the effort and dedication that went into putting all of it together over course of several months. From the amazing custom project page, to the project's release, as well as the complicated logistics behind the actual installation—so much work went into it all, that goes a bit unnoticed when you just see the end product in form of a tweet in your timeline. I maybe feel just a tad bit guilty to be able to join in for the good bits after all of the hard work has already been done; but on the other hand, its awesome to see this part of generative art history come to life in person. I even got to hang out with Bjørn a bunch, who's a really nice, down to earth kinda guy, and got to chat with him not just about the project, but also about all sorts of other things: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-5-1.png) Getting a private tour from Bjørn. Also me contemplating my next trip to Turkey, colorized. You should actually keep your eyes peeled, there's an article coming up that aims to capture the entire story behind the project. Also worth mentioning, is that the exhibition concluded with a couple of workshops, which is in part why I was actually in Ghent. I got to give an intro to creative coding and generative art workshop, where I gave a whirlwind tour of the entire current scene and community around it, and also live-coded a couple of examples. I think the few that attended really enjoyed it, I even got a bunch of messages afterwards. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/IMG_6059.JPG) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/IMG_6093.jpg) I posted a tweet during the workshop, showing how easy it is to export an animated looping GIF with p5, and for some reason the Tweet got quite a few likes. [Tweet for reference](https://x.com/gorillasu/status/1837456727194620224?ref=gorillasun.de). Thanks Olha for the pic! I also got to enjoy Bjørn's workshop where he provided an overview of the code behind Entangled. It ended up being a 4 hour long tour de force, but I learned a lot about Three.js and how to manipulate millions of particles on the GPU—we'll definitely have to think about bringing the workshop contents to the community, either in form of written tutorials or an online workshop. Besides all of this, Ghent is also really just such an absolutely beautiful city, wish I would have been able to see more of it. But that simply means that I'll have to visit again! ## All the Generative Things ### The JS13K Coding Competition JS13K is a yearly coding competition for **web game developers**, where submissions need to adhere to a **13KB** size limit. The competition runs throughout the month of August, from the 13th till the 13th of September—meaning that it's already concluded this time around, but there were a couple of cool things I wanted to point out with this segment. For starters, this year marks the 13th anniversary of the virtual game-jam. For this occasion, the theme was fittingly chosen to be [triskaidekaphobia](https://medium.com/js13kgames/js13kgames-2024-start-and-theme-announcement-5d734f77da68?ref=gorillasun.de), a term that essentially stands for a fear or avoidance of the number 13\. You can read the announcement here: [js13kGames 2024 start and theme announcement!The thirteenth, anniversary edition of the online js13kGames competition starts… NOW! Build a Web game on a given theme within the next…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156)js13kGamesAndrzej Mazur![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1-Edtgs7IX36i_HYT8Okof4g.png)](https://medium.com/js13kgames/js13kgames-2024-start-and-theme-announcement-5d734f77da68?ref=gorillasun.de) Every year size coders from all around the world virtually flock together to show their chops and participate in the game-jam, and naturally one of the participants is none other than the prolific Frank Force. His submission for this installment is an Outrun inspired racing game that also incorporates a procedural element in how the visual assets are generated during the game's startup—you can play it for yourself [here](https://killedbyapixel.github.io/Drive13K/?ref=gorillasun.de), and learn a bit more about how the game works through Frank's tweets: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-27-at-21.09.56.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-28-at-12.08.45.png) [Link to Tweet](https://x.com/KilledByAPixel/status/1836115337705656523?ref=gorillasun.de) | Do you think you can beat my time? Let me know if you do 😆 Crazy how much you can do in just 13kb. Besides being an impressive feat of programming, the game actually turns out to also be quite addictive, even though it's relatively simple—I didn't think that I'd end up playing it as much as I did. Right now I'm still trying to crack that sub 6 minute speed-run, but that's gonna take me a couple more tries at least. With the number of times I've mentioned Frank Force on the Newsletter at this point, I might as well rebrand it to "Frank Force Fanletter"—I'm not complaining though, keep' em coming 😄 Also make sure to check out some of the other games that folks have submitted to the challenge, it was a joy going through [the submissions page](https://js13kgames.com/2024/games?ref=gorillasun.de) and playing through a few. ### Electric OP at the Buffalo AKG + Stan VanDerBeeks OP Art **Op Art**, short for **Optical Art**, is a style of visual art that uses optical illusions to create a sense of movement, flashing, vibrating patterns, or other effects that trick the eye. The art form emerged in the 1960s and is closely associated with geometric abstraction and minimalism, but with a specific focus on how patterns, shapes, and colors can deceive the human eye. Currently there's a huge exhibition taking place at the Albright-Knox Art Museum, located in Buffalo, New York, that revolves in its entirety around Op Art, tracing the artform's 60 year old history and featuring most of the significant pieces of art in that regard over the years. If you're in that part of the world, you should definitely try and catch the exhibition, it's going to be on till the 27th of January 2025, so you still have ample time: [Electric Op | Buffalo AKG Art MuseumPlease note: Electric Op contains many artworks with intense optical effects and illusions that may cause vertigo, migraine, or nausea. The show is not recommended for anyone with photosensitive epilepsy (PSE) or severe vertigo.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-3.png)Buffalo AKG Art Museum![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/electric_op_title2-1.png)](https://buffaloakg.org/art/exhibitions/electric-op?ref=gorillasun.de) Two famous artists that you might know in that regard are [Victor Vasarely](https://buffaloakg.org/person/victor-vasarely?ref=gorillasun.de), who's often regarded as the father of Op Art, as well as[Bridget Riley](https://buffaloakg.org/person/bridget-riley?ref=gorillasun.de)**,** known for her black-and-white and later colorful works that create the sensation of movement and visual tension. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-4.png) Vega from the portfolio Cinétique III by Victor Vasarely, 1950-1960 | Coloured Greys III by Bridget Riley, 1972 The exhibition shines a light on many more artists though, that might not be as recognized, for instance I wasn't familiar with Stan VanDerBeek's Op art, particularly his 1970 short film titled Moirage—[this obscure article](https://www.johncoulthart.com/feuilleton/tag/stan-vanderbeek/?ref=gorillasun.de) I found describes the short film as "*an abstract work that animates the kinds of patterns that would have been deemed Op Art in the few years before LSD use became widespread*". I believe that the short film can actually be viewed at the exhibition. Unarguably Op Art has deep ties with algorithmic art, in both cases, **geometry, repetition, and structure** are fundamental components. But beyond the aesthetics, the methods by which Op artworks are produced present similarities, often requiring precise calculations and automated means for creating patterns. [In issue 47 of the newsletter I wrote about Akiyoshi Kitaoka's mesmerizing algorithmically generated optical illusions](https://www.gorillasun.de/blog/gorilla-newsletter-47/#optical-illusions-by-akiyoshi-kitaoka) and his documentation thereof, in case you'd like to explore an extensive resource on the topic. To wrap up this segment, here's a Tweet from the renowned art collector Michael Spalter explaining the significance of the exhibition: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-29-at-22.16.47.png)](https://x.com/michaelspalter/status/1840431920854782154?ref=gorillasun.de) [Link to Tweet](https://x.com/michaelspalter/status/1840431920854782154?ref=gorillasun.de) ### Licia He's Plotter Workshop + Third installment of FEMG3N Licia He gave this wonderful workshop, that I really wish I could have attended; taking place at the Victoria and Albert Museum in London, Licia hosted a participatory event where folks could join in to make their own plotter drawings—Licia posted a bunch about it over on TwiX, and there's also some updates about her upcoming plotter course: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-27-at-23.16.01.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-29-at-11.46.39-1.png) [Link to Tweet #1](https://x.com/Licia%5FHe/status/1833174194047041800?ref=gorillasun.de) | [Link to Tweet #2](https://x.com/Licia%5FHe/status/1837611775098781851?ref=gorillasun.de) What's more is that she'll also take part in the third installment of FEMG3N that's taking place on the 12th of October, alongside generative artist Anna Ridler, to talk about how *new generative approaches are redefining the relationship between art and technology—*if you're based in London you can RSVP here: [FEMG3N: Expanding the Art World with New Digital Practices - Talk at V&A South Kensington · V&AJoin artists Licia He and Anna Ridler in conversation as they discuss how new generative approaches are redefining the relationship between art and technology. Chaired by Charlotte Kent and with contributions from Peter Bauman and Melanie Lenz.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-180x180-39ebb34bd076605b5b06bdfd7a3f4c22d2684141dfaba350d0c2a2680d986ff4.png)Victoria and Albert Museum![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/femg3n-expanding-the-art-world-with-new-digital-practices_640.jpg)](https://www.vam.ac.uk/event/aKJWbELqpo/femg3n-expanding-the-art-world-12-october-2024?ref=gorillasun.de) And if you want to learn more about FEMG3N, you should check out this [article](https://www.rightclicksave.com/article/femgen-and-the-brave-new-art-world?ref=gorillasun.de) from the RCS magazine published back in 2023. ### Other Cool Generative Things 1. Last Week, [Jeff Davis](https://x.com/jeffgdavis?ref=gorillasun.de) and [Erick Calderon](https://x.com/ArtOnBlockchain?ref=gorillasun.de) announced the launch of their [Generative Art Fund](https://x.com/jeffgdavis/status/1836794933392359768?ref=gorillasun.de), an initiative that aims to *elevate generative art in all its forms and promote creative coding as a meaningful artistic practice*. For instance, it is currently supporting the Electric Op exhibition. If you would like to pitch an idea for a grant request, or contribute with a donation, you can do so over on [the fund's website](https://www.generativefund.org/?ref=gorillasun.de). 2. Version v1.11 of P5.JS was just released, and as always it introduces a bunch of [bug fixes as well as a couple of new features](https://github.com/processing/p5.js/releases/tag/v1.11.0?ref=gorillasun.de). Most notably, it includes a cool new way to extend and modify existing P5 shaders with a hook—[Dave posted a demo of how this works over on TwiX](https://x.com/davepvm/status/1840194540545687618?ref=gorillasun.de). 3. [Data through Design put out their 2025 open call](https://datathroughdesign.com/?ref=gorillasun.de). They're looking for participants to pitch their ideas in a wide range of media and formats with the one requirement to reference or useat least one [NYC Open Data dataset](https://opendata.cityofnewyork.us/data/?ref=gorillasun.de) in their project. 4. The [Web Game Dev Newsletter](https://www.webgamedev.com/newsletter/022?ref=gorillasun.de) is a cool resource that gets sent out every 3 months summarizing everything noteworthy in the space, from framework updates, to new tool releases, as well as articles and videos about implementing specific algorithms. The latest issue just came out this past week—my favorite mention is probably the [Rune Blog](http://developers.rune.ai/blog/building-a-scalable-multiplayer-game-architecture?ref=gorillasun.de), that's publishing an impressive number of posts about developing multiplayer games. 5. [Humanbydefinition is releasing a new project in just a couple of days on fxhash](https://x.com/humanbydes1gn/status/1837836998200963362?ref=gorillasun.de). Similarly to the previous project it features mesmerizing shifting ASCII pattern. If you would like to get insight into how the piece works from a technical point of view, come check out the discord (shameless plug), they left [a chonky explainer in the creative-coding channel](https://discord.com/channels/1168651116855173161/1233785303429288047/1289361021953249362?ref=gorillasun.de). ## Tech & Web Dev The good thing about taking a break from the Newsletter is that the number of cool things to talk about quickly adds up—this week I had absolutely no trouble finding interesting things to feature in the Tech & Web dev section. If you're a fan of blogging, building blogs, or reading blogs, then you're in for a treat! ### Developments with the Ghost CMS Over the past couple of weeks there's been a bunch of exciting developments with the Ghost CMS—all of which have been really exciting to follow. This isn't a sponsored segment, but as somewhat of an independent writer, I'm really happy to be using the open source tool that Ghost provides, especially considering that they are putting in a lot of effort into improving their tool in all aspects. It is invigorating to see a company actually care about their product and their users—considering that it is currently a trend for platforms to blatantly exploit the latter. But let's get to some actual updates here. Recently they teased a new analytics dashboard in a tweet of theirs titled "WIP 👀". And if the attached image is actually what the stats dashboard will be like, then I'm actually super excited about it—it would mean that I could simply ditch Google Analytics at some point and have visitor stats natively in the Ghost admin dashboard without going through a third party service—this is even better for those that are self-hosting their Ghost instances: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-28-at-12.47.11.png) [Link to Tweet](https://x.com/Ghost/status/1836827009990938906?ref=gorillasun.de) I'm really hoping that this will also enable querying of this data directly on the blog itself. For instance, displaying a visitor counter on posts is something I've been wanting to do for ages, but haven't really found a solution to at this point (without using yet another third party service that is). A second big update, is that Ghost is slowly, but surely coming to the Fediverse. In their dedicated Fediverse newsletter, they recently announced that they reached a big milestone: users in the Fediverse can now leave comments on posts that were sent out from Ghost, and vice-versa, replies on Fediverse enabled Ghost blogs will also show up in the Fediverse. Their recent newsletter states that a private beta is now only a few weeks away: [They say conversation is the music of the mindIt’s time we had a talk![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/ghost-orb-white-squircle-07.png)Building ActivityPubGhost![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/DALL-E-2024-09-20-15.18.08---A-whimsical-image-featuring-a-pug-typing-away-on-a-laptop-in-a-dimly-lit-room-at-night--writing-responses-to-internet-comments.-The-pug-is-seated-at-a-1.webp)](https://activitypub.ghost.org/they-say-conversation-is-the-music-of-the-mind?ref=gorillasun.de) Am I being unreasonable to be this excited? Every Ghost blog can then by default reach an audience directly in the social feeds of Fediverse clients. Lastly, and on a related note, Ghost is now also partnering up with The Social Web Foundation that recently launched on the 24th of September. Their mission is "a growing, healthy, financially viable and multi-polar Fediverse"—I'm not entirely sure what it entails at this point, but it feels important, and I'm interested to see what will come of it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-28-at-12.53.21.png)](https://x.com/Ghost/status/1838627561632317606?ref=gorillasun.de) [Link to Tweet](https://x.com/Ghost/status/1838627561632317606?ref=gorillasun.de) ### How Josh Comeau built his Blog The CSS wizard Josh Comeau recently re-built his blog, and in tandem published a big article documenting the tech that now powers his site; turns out that there's an impressively complex custom tech stack sitting behind the scenes—in essence the blog is one big Next.js app, that's been rebuilt to use the modern App Router, in favor of the previous Pages Router. [How I Built My Blog • Josh W. ComeauI recently launched a brand new version of this blog, and in this post, I share how it’s built! We’ll examine the tech stack and see how all of the pieces fit together, as well as dig into some of the details to see how they work.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon.png)Josh W. Comeau![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/og-how-i-built-my-blog-v2.png)](https://www.joshwcomeau.com/blog/how-i-built-my-blog-v2/?ref=gorillasun.de) If you're not familiar with Next.js, it's basically a React framework (the most popular one actually) for building fast and scalable web apps. Its main appeal is that it makes routing super easy (what to show users when they visit a specific URL) and allows the rendering of pages on the server before showing them to users. The cool thing about the App Router I mentioned, is that it now lets you render specific parts of a web page on the server before sending them to the client, via React Server Components (there's a big buzz around them right now). But that's just scraping the tip of the iceberg, Josh goes into much more detail, on content management with MDX (that lets you embed JavaScript directly in the markdown files), syntax highlighting, code snippets, as well as interactive code playgrounds, and much more. All in all it's incredibly impressive—a must read if you want to learn about a true class act of building a your own personal blog. Some companies' blogs are much less elaborate than that... Earlier this year I spent a bit of time on learning Next.js, and I even made a couple of mini apps with it, but the entire eco-system is still a big mystery to me. Once I'm a bit less busy again I'll try to get back into it. ### Why I still blog after 15 years Jonas Hietala wrote a beautiful post in which he explains why he still blogs after 15 years—besides enumerating a bunch of reasons why blogging is a worthwhile personal endeavor, all of which I wholeheartedly agree with, he also provides a quick timeline visualizing how the tech stack that powered his blog has evolved over the years. Crazy to see that Jekyll was already a thing in 2009: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-29-at-12.37.01.png)](https://www.jonashietala.se/blog/2024/09/25/why%5Fi%5Fstill%5Fblog%5Fafter%5F15%5Fyears/?ref=gorillasun.de) [Link to Article/Blog](https://www.jonashietala.se/blog/2024/09/25/why%5Fi%5Fstill%5Fblog%5Fafter%5F15%5Fyears/?ref=gorillasun.de) I've been directing my efforts into this very blog for over 3 years now, which is far longer than any other project I've ever worked on; somehow, miraculously, I've managed to keep at it all this time, no matter the other things that were going on in my life. Evidently, 15 years is a much longer time span than 3 years—5 times longer to be precise. Pretty much all of the points that Jonas mentions throughout, are all ones that also resonate with me—there's two that I want to highlight and add onto: 1. **Looking at a log of things I’ve done makes me feel better**: this might sound silly, but for the longest time I would feel incredibly depressed every New Years eve—almost suffocated by existential dread—with a feeling that I have accomplishing nothing at all throughout the year. Writing my yearly recap (for the past 3 years now) has completely wiped out that feeling. Looking back at all the things that I've done throughout the year, all the projects I've worked on, all the articles I've written, **with documented proof**, makes it hard for my brain to gaslight myself into feeling that I haven't accomplished anything. 2. **Writing helps me think more clearly and helps me flesh out ideas**: to a big extent that's also true for me. Writing things down allows me to get them out of my brain—the ideas now live in on the paper or the digital document that I wrote them on, and some quiet can now take over the vacant space. I know that there's some arguments against to-do/idea lists, but they help me tremendously to bring structure into the chaos. All of that said, I think everyone should blog, at least for themselves. I often make fun of my younger sister for writing her diary every single day—like she basically documents every detail of each day (I guess we're a weird kind of family 😆)—but looking at it now, I think that I'm not so different; I also obsessively put together this Newsletter every week 🤷 ### Other Cool Things 1. A couple of weeks ago I shared Oskar Wickström's cool minimal design exploration titled the Monospace Web. Last week he published an insightful [article](https://wickstrom.tech/2024-09-26-how-i-built-the-monospace-web.html?ref=gorillasun.de) explaining the most significant bits of CSS that contribute to aligning all elements to a grid. Fun fact, the idea for the exploration started from [a simple tweet in which Oskar yearns for a simpler web](https://x.com/owickstrom/status/1825200136873501136?ref=gorillasun.de). 2. It seems that it's currently "rework your personal blog" season: Ahmad Shadeed, another repeat offender on this newsletter, also recently wrote about [how he redesigned his blog](https://ishadeed.com/article/redesign-2024/?ref=gorillasun.de). 3. [The State of HTML 2024](https://survey.devographics.com/en-US/survey/state-of-html/2024?ref=gorillasun.de) survey is now up and running, awaiting your feedback. Go and fill out the survey, so that I have something to write about when the results come out. Jokes aside, I actually really enjoy seeing the outcome of these whenever they come back around. ## AI Corner ### OpenAI becomes For-Profit Last week we observe OpenAI make a huge shift in their corporate structure, leaving behind its nonprofit roots to become a for-profit benefit corporation under CEO Sam Altman’s control. Altman now holds significant equity worth billions—in stark contrast to earlier claims of being financially independent from the company’s profits—and now ultimately holds control over the company: [OpenAI as we knew it is deadThe maker of ChatGPT promised to share its profits with the public. But Sam Altman just sold you out.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon-2.png)VoxSigal Samuel![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1255340518.jpg)](https://www.vox.com/future-perfect/374275/openai-just-sold-you-out?ref=gorillasun.de) In an ever dwindling number of executive figures in OpenAI, shortly before the news broke about OpenAI's restructuring, current CTO Mira Murati announced that she would be leaving the company after 6 and a half years. OpenAI chief research officer Bob McGrew and vice president of research Barret Zoph then also announced their resignations in the aftermath. ### Cursor AI Efficiency Hack McKay Wrigley shares a trick to improving the efficiency of Cursor's AI powered code completion, turns out that you simply need to add a ton of comments that explain the code: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-29-at-11.08.07.png)](https://x.com/mckaywrigley/status/1838321570969981308?ref=gorillasun.de) [Link to Tweet](https://x.com/mckaywrigley/status/1838321570969981308?ref=gorillasun.de) I did end up taking Cursor AI for a test run a couple of weeks ago, and while I'm positively impressed, I do have some mixed feelings about how the AI copilot changes the way that I write code—it frequently feels like I'm less in control and I end up relying on it too much. But I'll probably have to write about it in more detail at some point. ## Music for Coding I've been desperately looking for other psych-rock bands that hit the same way Yīn Yīn and Altın Gün, and I finally discovered Glass Beams that fits into the same category with their experimental sound. Based in Australia, the three members hide anonymously behind masks during their live performances. The band gained attention with their debut EP *Mirage*, released in 2021, which was praised for its rich textures, blending vintage and contemporary influences, as well as its instrumental focus, which avoided traditional vocals and instead relied on atmospheric and instrumental storytelling. And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 73Hexaflexagons and other Mathematical Diversions - Roni Kaufman’s Portrait Robot - Computer Art Pioneer Lillian Schwarz - Personal Update: I’m Joining the fxhash Team - How to Monetize your Blog - Stripe’s New Website - PHP is the New Javascript - OpenAI’s New o1 Model![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/meshh.png)](https://gorillasun.de/blog/gorilla-newsletter-73?ref=gorillasun.de) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\~ Gorilla Sun 🌸** ### Gorilla Newsletter 73 URL: https://www.gorillasun.de/blog/gorilla-newsletter-73/ Last updated: 2024-09-16T05:00:37.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 73rd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Hexaflexagons and Other Mathematical Diversions **Flexagons** are flat, geometric shapes, usually made of paper, that can be folded and "flexed" to reveal hidden faces. In essence, they're a particular type of topological structure that appear to be flat polygons, like hexagons or triangles, but have more faces hidden within their interior. Unfolding these structures then lets you reveal these hidden faces, that you wouldn't expect by just by looking at them. Describing flexagons with words probably makes little sense—I definitely had trouble conjuring up a mental image of how these *magic* paper tricks work when I first read about them—so here's a little visual aid: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Flexagon-2-.gif) [Wikipedia Article on Flexagons](https://en.wikipedia.org/wiki/Flexagon?ref=gorillasun.de) The shape that you see above is called a trihexaflexagon. As its name suggest, a trihexaflexagon is a hexagon that can potentially display three different faces, of which the third is always hidden within its interior. This particular configuration is apparently also the first flexagon that was initially discovered. And the story how this discovery came to be is also quite fascinating. During his studies at Princeton University in 1939, British mathematician Arthur H. Stone had to trim off the protruding lengths of his American papers to fit into his English binder. He then started folding the leftover strips into different shapes, eventually forming a trihexaflexagon. The notion of Flexagons was later brought to the public through Martin Gardner in the December 1956 issue of the Scientific American. Gardner was in charge of writing a recreational mathematics column for the magazine that generally covered a wide range of topics: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-14-at-15.23.34.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-14-at-15.23.58.png) You should be able to find a PDF version of the book by giving the title of the publication a google 😜 Gardner's text on Hexaflexagons was so successful, and received so many mail ins, that it became a regular column which subsequently ran for the next 25 years. Over on Wikipedia you can actually find a complete list of all mathematical games that Martin Gardner authored throughout those years—definitely an instant bookmark, as it's a treasure trove of ideas for creative code related purposes: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-12.33.20.png)](https://en.wikipedia.org/wiki/List%5Fof%5FMartin%5FGardner%5FMathematical%5FGames%5Fcolumns?ref=gorillasun.de) [List of Martin Gardner's Mathematical Puzzles](https://en.wikipedia.org/wiki/List%5Fof%5FMartin%5FGardner%5FMathematical%5FGames%5Fcolumns?ref=gorillasun.de) If this has peaked your interest, and want to make your own physical paper flexagons, you might also want to check Vihart's very popular video on the topic that explains how to put fold your own flexagons: ***No flexagons were harmed during the writing of this segment.*** ### Roni Kaufman's "Portrait Robot" While we're already talking about paper cutouts and making creative things with them, I'd like to highlight [Roni Kaufman](https://x.com/KaufmanRoni?ref=gorillasun.de)'s shortlisted submission for Combine24, "Protrait Robot", that puts a creative generative spin on dadaist inspired collages: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-14-at-14.02.51.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/image.png) [Link to Thread](https://x.com/KaufmanRoni/status/1821885378837561385?ref=gorillasun.de) When I first caught wind of [the open call](https://combine24.alusta.art/?ref=gorillasun.de) I spent some time trying to figure out a creative approach to remix the dataset provided by the Finnish national gallery. Being a mix of artworks that primarily consisted of portraits and landscape paintings, alongside some other miscelanious artworks, it felt like a tough nut to crack—working with data, or any sort of input, is not really my fortée. I thought that Roni's project was really refreshing, particularly because collages and photomontages, have become a bit frowned upon in the genart scene in recent years—mainly due to fact that the technique is frequently used for uninteresting PFP projects. Culturally however, collages played an integral part in the 1920s Dadaist art movement that tried to subvert and reject established aesthetic norms. Using fragments of mundane, everyday materials allowed artists to create entirely new things, as a means to critique conventional values. And I think that Portrait Robot captures the essence of the movement brilliantly. Worth pointing out here, is that it actually isn't the first time that Roni tries his hand at image manipulation/processing - a work of his that I frequently find myself coming back to is his personal Poetical Computer Vision challenge back from July 2021, where the same image of Ada Lovelace is transmogriphied in 31 different ways: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-10.44.00.png) [GitHub - ronikaufman/poetical\_computer\_vision: 31 portraits of Ada Lovelace made with code31 portraits of Ada Lovelace made with code. Contribute to ronikaufman/poetical\_computer\_vision development by creating an account on GitHub.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/pinned-octocat-093da3e6fa40.svg)GitHubronikaufman![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/poetical_computer_vision)](https://github.com/ronikaufman/poetical%5Fcomputer%5Fvision/tree/main?ref=gorillasun.de) Besides that, Roni's also an awesome dude (we hung out a bunch at the Berlin Summit)—if you get the chance you should try to catch the [Stockholm creative code meetup](https://x.com/KaufmanRoni/status/1834556145534370099?ref=gorillasun.de) that he's organizing once a month. Also make sure to check out the other [shortlisted projects for Combine24](https://combine24.alusta.art/?ref=gorillasun.de), they're all very smart. ### Computer Art Pioneer Lillian Schwartz Noah Bolanowski frequently shares interesting computer art history threads over on his TwiX profile. In a recent one he highlights a post that Le Random shared earlier this year in April, revolving around MoMa's 1968 landmark exhibition "The Machine as Seen at the End of the Mechanical Age". Curated by Pontus Hultén, the exhibition aimed to reflect on the profound changes brought by machines and mechanization in the modern world, especially as society was transitioning from the mechanical to the electronic age. Noah's thread adds further context around the genart pioneer Lillian Schwarz that participated in the exhibition with a piece of hers, sharing two short video sequences that provide a glimpse into the exhibition: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-14-at-11.06.33.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-11.17.24.png) [Link to Noah's Thread](https://x.com/Noahbolanowski/status/1834580586595328032?ref=gorillasun.de) | Noah also points out a [Tweet](https://x.com/nf%5Fsuzanne/status/1712031916625653785?ref=gorillasun.de) from SuzanneNFT that recaps Lillian Schwartz's career. You can explore the entire exhibition catalogue over on [the MoMa website](https://www.moma.org/calendar/exhibitions/2776?ref=gorillasun.de). Schwartz initially worked in more traditional art forms, but her groundbreaking work in digital media and her collaborations with scientists, engineers, and researchers helped to establish the foundation for the field of computer art. Working at the famous Bell Laboratories gave her access to cutting-edge technology, including early graphics software and hardware, which she used to create her digital artworks. The first video Noah shares is an excerpt from Lillian Schwartz's 1976 documentary "The Artist The Computer" in which she showcases how computers can be used as creative tools by artists. Schwartz essentially demonstrates how algorithms and programming can be used to generate artistic images and animations, emphasizing the creative potential of computers: The documentary underscores the idea that, rather than replacing the artist, the computer becomes a powerful extension of artistic expression. You might want to give Noah over on TwiX for more educative updates like this one. ### Other Cool Generative Things - [The second part of Patt Vira's Quadtree powered flocking simulation tutorial is now up on YouTube](https://www.youtube.com/watch?v=AMugNCfP1NA&ref=gorillasun.de). - [Two Stop Bits is basically a Hacker News type website for retro computing and gaming.](https://twostopbits.com/?ref=gorillasun.de) Might be worth checking every now and then. - Freya Holmér posted a useful infographic that explains the proper way for visualizing XYZ axes and how to think about them in terms of handedness - discussions ensue in the thread's replies: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-12.46.25.png)](https://x.com/FreyaHolmer/status/1834989650236015036?ref=gorillasun.de) [Link to Tweet](https://x.com/FreyaHolmer/status/1834989650236015036?ref=gorillasun.de) ## I'm joining the fxhash Team! Last week marked a huge personal milestone for me: I joined the fxhash team as a generative art educator! Check out the announcement Tweet that was posted, it sums things up pretty succinctly: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-23.32.56.png) [Link to Tweet](https://x.com/fx%5Fhash%5F/status/1834668118159114658?ref=gorillasun.de) In essence I'll be helping out with bringing more regular updates to the community, and keeping you guys informed on generative art related things. What implications does that have for the blog? Moving forward, my main priority will definitely be the work at fxhash—which simply means that you'll be seeing more of me, just in a different place. My weekends will still be spent putting together the newsletter, so no worries about that. Might mean that future issues are going to be a tad bit shorter in the first couple of weeks, as I'll be trying to balance between all of these new experiences and finding a sustainable rhythm. ## Tech & Web Dev ### How to Monetize a Blog *How to Monetize a Blog* is a biting satire of modern blogging culture, particularly the erosion of content quality in pursuit of monetization. The post seemingly starts out like a genuine informative piece, explaining how blogs are commonly monetized—but it's just a bait and switch—the piece gradually devolves into an absurd web experience: [How to Monetize a BlogA guide on turning your diary into dollars.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/favicon.svg)![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/monetization-hero.png)](https://modem.io/blog/blog-monetization/?ref=gorillasun.de) I have a love/hate relationship with display ads, while they are one of the few options to monetize content on the web that simultaneously allow the content to be freely available, they are also generally frowned upon. The problem with advertising on the web are mainly the ethics attached to it. The root cause of it all: traffic being the main metric measured to determine ad revenue. This has the consequence that in many cases the actual content becomes secondary—content is no longer king, and quantity becomes more important that quality. That's the reason why "Clickbait" emerged as a phenomenon in the first place. While people are nowadays less susceptible to it, we see predatory algorithms exploit our brains in other ways. YouTube is an example of a platform, that seems to have struck a good balance. Creators that post their content on the platform, have the option to get compensated for their efforts when they agree to have ads shown on their videos—in other words, when they agree to have their content used as promotional vessels. On the other hand, the platform also provides you with the option to pay a monthly subscription fee to avoid being presented ads; meaning that you can pay a convenience fee, to avoid being inconvenienced. It's debatable if this is ethically questionable, because you could also compare it to a sort of highway toll - you're using YouTube's service after all, and they need to generate revenue to keep operations going. For the individual creator, the ethical considerations of advertising is more nuanced. Having ads on your personal blog is kind of frowned upon; it can be intrusive, it detracts from the actual content, makes things seem unauthentic, and by matter of association with the flood of low quality websites out there, it can make things seem *cheap.* However, as mentioned, ads provide a potential revenue stream and offer compensation for the time and effort that's invested in creating the content—which is generally crucial for independent platforms to sustain themselves. On the other hand though, introducing ads risks compromising the very qualities that attract and retain an audience. It seems that creative integrity often comes at the expense of financial sustainability, especially in the modern "creator economy" bubble where content is often expected to be free. Every cent earned comes with a twinge of guilt, every ad-free post with a pang of missed opportunity. Tangentially related, last year I wrote an article about predatory social media algorithms, and I believe much of it still holds true: [The Current State of Social MediaSocial media has changed significantly over the past two decades: from networks that aimed to connect people, to content-centric devices that mainly care about engagement and user retention. Many issues arise that are not immediately evident to the user.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/photo-1592495989226-03f88104f8cc)](https://www.gorillasun.de/blog/the-current-state-of-social-media/) I'll likely have to revisit this topic in depth again at some point though. ### Stripe's New Website If you're not familiar with Stripe, it's an online payment processing platform. It enables businesses to accept payments and manage transactions through a suite of different APIs. In the last week they made a big buzz with the launch of their new website—and it really is a work of art. The designer behind the new interface Devin Jacoviello compiled a thread in which he goes over the inspirations for this new design: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-12.59.07.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-13.06.33.png) [Link to Tweet](https://x.com/devinjacoviello/status/1833521766146445830?ref=gorillasun.de) | [Link to Stripe Website](https://stripe.dev/?ref=gorillasun.de) Maybe it's just me, but even if you don't use Stripe, I'd say that it's still worth checking out the site for a couple of minutes and playing around a bit—there's a bunch of cool easter-eggs. Coolest thing is that there's a console, that lets you execute a bunch of commands, to change the theme for instance, play background music, and even has a playable snake game. Another stand out thing, that probably is of interest to the Gorilla readership, is that many parts of the website are infused with minimal animated sketches: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-15-at-13.15.56.png) Web-design at its finest! 👏 ### PHP is the new Javascript I have faint memories of using PHP when they first taught us about web development back in Uni, but I haven't interacted with it ever since, nor have I really tried to keep up with it, but apparently the PHP of 2024 is leaps and bounds better than it was a decade ago. A recent article from Dave Kiss chronicles his rediscovery of PHP and newfound potentials with the Laravel framework: [Look out, kids: PHP is the new JavaScript | MuxWhat would it take to switch back to PHP after years of full-stack JavaScript? A boy and his AI-enabled IDE set off to find out.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon.svg)Mux LogoDave Kiss![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/1055fe5732c7aded728c10d4448d4ae21fec3268-1200x760.png)](https://www.mux.com/blog/php-is-the-new-javascript?ref=gorillasun.de) Laravel is to PHP what Node.js is to Javascript, describing itself as "The PHP Framework for Web Artisans" it provides much of the functionality required for putting together an MVP straight out of the box. In his Article Dave is surprised to discover the potence of Laravel. PHP's initial appeal was its low barrier to entry, but this also led to its reputation for poor code quality and scalability issues. Even in 2024, the server side scripting language still gets a really bad rep - and with the rise of Node.js it's been abandoned by many web devs at this point, especially considering that the job market is also dominated by the Javascript eco-system. I guess the final take-away here is that Laravel is a potent one-in-all solution that might be worth exploring. ### Other Cool Tech Things - [Philipp Opperman wrote a massive guide to programming a complete OS in Rust](https://os.phil-opp.com/?ref=gorillasun.de). - [Scott Chacon a co-founder of Github wrote about how the platform became the dominant force that it is today.](https://blog.gitbutler.com/why-github-actually-won/?ref=gorillasun.de) He provides a quick TLDR summary of the two reasons he thinks were important towards that end; he states that GitHub started at the right time, and had good taste when it came to the developer experience. - Josh Comeau is back with another article, this time he writes in depth about [the CSS :has pseudo class](https://www.joshwcomeau.com/css/has/?ref=gorillasun.de). ## AI Corner ### OpenAI's New o1 Model OpenAI released their new series of o1 models, and the benchmarks indicate that they're magnitudes more powerful than previous installments of Gippity based models—Sam Altman boasts with stats over on TwiX: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-14-at-10.50.54.png)](https://x.com/sama/status/1834283100639297910?ref=gorillasun.de) [Link to Tweet](https://x.com/sama/status/1834283100639297910?ref=gorillasun.de) This new series of *deep reasoning* o1 models differentiates itself from the previous GPT installments as they engage in a sort of self-reasoning feedback loop before yielding a response. While this comes at the cost of a longer delay before an answer is returned—where the chat interface lets you know that the model is *thinking*—it lets the LLM avoid, and amend, hallucinations to ultimately provide a more thoughtful answer, even for relatively complicated tasks. Right now o1 models are reserved for those that subscribed to OpenAI's services on a plus plan, and that at a very limited weekly rate, but you can still get a taste of how it works however through the complementary [technical write-up](https://openai.com/index/learning-to-reason-with-llms/?ref=gorillasun.de) that the OpenAI team shared last week. They showcase how the model constructs a chain-of-thought in the context of different tasks. As always, also do check out Fireship's entertaining recap: ### Google's DataGemma That's just the tip of last week's LLM iceberg though, Google also came out with 2 new models last week: by embedding the Data Commons knowledge graph, that contains over 240 million data points from trusted sources, DataGemma also aims to be more factually accurate: [DataGemma: Using real-world data to address AI hallucinationsIntroducing DataGemma, the first open models designed to connect LLMs with extensive real-world data drawn from Google’s Data Commons.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/apple-touch-icon.png)GooglePrem Ramaswami![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/Keyword_-_2096x1182_.width-1300.png)](https://blog.google/technology/ai/google-datagemma-ai-llm/?ref=gorillasun.de) ## Music for Coding And to wrap things up, my music recommendation this week is the Hermanos Gutiérrez. I randomly came across a track of theirs listening to a playlist, and was immediately hooked—the duo’s use of reverb-drenched guitars creates a lush, expansive sound that is both intimate and spacious, and evokes a sense of nostalgia, with an almost mystical atmosphere. If I had to put a label on it, it's a slow, moody, and atmospheric blend of Latin folk, blues, and even a touch of flamenco and surf: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 72Completion of Le Random’s Genart Timeline - Computational Life: Self-Replicating Programs - The Art of Finishing - TC39 New Stage in Feature Pipeline - A Fast JS Color Library - Stephen Wolfram on Machine Learning - The Current State of AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/icon/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/thumbnail/img-29--1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-72) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 72 URL: https://www.gorillasun.de/blog/gorilla-newsletter-72/ Last updated: 2024-09-09T09:52:00.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 72nd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Le Random Completes their Genart Timeline Last Monday, September 2nd, marked the completion of Le Random's expansive generative art timeline. After nearly two years in the making, the massive documentation project catches up to the present day, and in over a 1000 distinct moments it captures all important and influential instances that contributed to the evolution of generative art as we know it today. You can explore the timeline for yourself here: [Timeline - Le RandomExplore the 70,000-year history of generative art through hundreds of milestones and ten chapters.![](https://timeline.lerandom.art/favicon.ico)Timeline - Le Random![](https://timeline.lerandom.art/img/og-image.png)](https://timeline.lerandom.art/?ref=gorillasun.de#/chapter-10) The final 10th chapter focuses on the most recent history of generative art - technically only the first half of the current decade - but arguably the most transformative and explosive era that really accelerated the global discourse around the artform, particularly in context of blockchain technology that has opened many new avenues for code as an artistic medium. As per usual, the release of each chapter is commemorated with a panel that features the most influential characters of the era, and this time is no different, in their podcast Le Random invites [Lauren Lee McCarthy, Erick Calderon, Itzel Yard, Rafael Lozano-Hemmer](https://art.us9.list-manage.com/track/click?u=b6abc6e595e4a0d8b24b5cb25&id=ca85c43bc0&e=6e6e6c4c9f&ref=gorillasun.de): Monk explains that this should not be considered the end of the timeline though, but rather as a big milestone in Le Random's efforts. The team will continue to refine the content of the timeline, with a planned UI overhaul to make things more user-friendly. It's also revealed that a book is in the making - which I must say, is something that I'm quite excited for. ### Computational Life: Self-Replicating Programs A recent research paper from the *Google Paradigms of Intelligence* Team shows that a primordial soup of randomly stringed together characters using the esoteric [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck?ref=gorillasun.de) programming language gives rise to self-replicating machines (programs): [Computational Life: How Well-formed, Self-replicating Programs Emerge from Simple InteractionThe fields of Origin of Life and Artificial Life both question what life is and how it emerges from a distinct set of “pre-life” dynamics. One common feature of most substrates where life emerges is a marked shift in dynamics when self-replication appears. While there are some hypotheses regarding how self-replicators arose in nature, we know very little about the general dynamics, computational principles, and necessary conditions for self-replicators to emerge. This is especially true on “computational substrates” where interactions involve logical, mathematical, or programming rules. In this paper we take a step towards understanding how self-replicators arise by studying several computational substrates based on various simple programming languages and machine instruction sets. We show that when random, non self-replicating programs are placed in an environment lacking any explicit fitness landscape, self-replicators tend to arise. We demonstrate how this occurs due to random interactions and self-modification, and can happen with and without background random mutations. We also show how increasingly complex dynamics continue to emerge following the rise of self-replicators. Finally, we show a counterexample of a minimalistic programming language where self-replicators are possible, but so far have not been observed to arise.![](https://arxiv.org/static/browse/0.3.4/images/icons/apple-touch-icon.png)arXiv.orgBlaise Agüera y Arcas![](https://arxiv.org/static/browse/0.3.4/images/arxiv-logo-fb.png)](https://arxiv.org/abs/2406.19108?ref=gorillasun.de) Released back in June of this year it's not an entirely new paper, but I only just found the time to look into it - it's arguably one of the most interesting computational experiments that I've read about this year. Artificial life has been a topic of research for many decades now; with John von Neumann being recognized as a pioneering researcher of the field in the 1940s. He was the first to propose a formal model of a self-replicating machine\- a device that when run, could create a copy of itself. To describe this machine in more detail von Neumann simultaneously laid the groundwork for what we know today as Cellular Automata, later even leading to Conway defining the famous Game of Life. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-08-at-09.38.50.png)](https://en.wikipedia.org/wiki/Von%5FNeumann%5Funiversal%5Fconstructor?ref=gorillasun.de) The **von Neumann Universal Constructor*[Link to Wiki](https://en.wikipedia.org/wiki/Von%5FNeumann%5Funiversal%5Fconstructor?ref=gorillasun.de) Even if a cellular automaton may seem simplistic in its nature when compared to the complexity of real life, they're still in many ways revelatory about the mechanisms of entropy and emergence. In the Google research paper this topic is explored by creating an artificial setting in which self-replicating machines can emerge by themself without any man-made precedent. The creative twist here is that this is achieved by leveraging the Brainfuck programming language. If you've never heard of it, [Brainfuck is an esoteric programming language created in 1993 by Urban Müller](https://en.wikipedia.org/wiki/Brainfuck?ref=gorillasun.de), that is widely known today for its obscure minimalism. The language features only eight commands (`>`, `<`, `+`, `-`, `.`, `,`, `[`, and `]`) and operates by manipulating an array of memory cells, that is initialized to zero. A memory pointer is used to move left or right, and increment or decrement the value at the current cell, and even input or output data. Loops are also possible and controlled using brackets (`[` and `]`). All of this allows for complex behavior despite the simplicity of the command set, for instance, the "Hello World" program in Brainfuck would look as follows: ```brainfuck >++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++>-]<+. ``` Conveniently this means that any random collection of these symbols makes for a valid program. While the language is Turing-complete (meaning that you can theoretically perform any type of computation with it), using it in any kind of practical setting is virtually impossible due to its low-level and highly abstract nature. In the paper a modified version of the language (referred to as BFF) is used, where data and instructions share the same tape - such that both the program's code (the instructions basically) and the data it manipulates are stored in the same memory space, meaning that the system can alter its own code as it is running, allowing for *self-modification*. The paper describes a larger system that is made out of many small programs (64 bytes long) containing random instructions from a simple set of operations. These programs are placed in a "soup" where they interact, concatenate, and execute each other’s code - the underlining point being that this is happening entirely at random. While the expectation here is that the primordial soup will simply do nothing, *as it has no incentive to do anything*, the surprising observation is that after a while self-replicating programs start to emerge slowly overtaking the entire system. And this despite specifying any explicit fitness landscape, guiding selection pressures, or external incentives, but merely through random interactions and self-modifications. In this setting a self-replicator can be defined as a program who's self-modifying operations happen to copy itself (or part of itself) accurately, allowing it to spread to other regions of the soup - leading to a more complex dynamic where the replicators compete for space and resources. In the paper this is likened to autocatalytic chemical reactions. That's as far as I understand it - I might be getting some things mixed up however. A great video that explains the paper in simple terms is from Anton Petroc, which also shows some visualizations of the primordial soup and the behavior it exhibits when it gets overtaken by a self-replicating mechanism: One of the comments left on the video was also quite intriguing and worth including here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-08-at-09.29.33.png)](https://www.youtube.com/watch?v=L%5FIWVZPmc-E&ref=gorillasun.de) ### The Art of Finishing by Tomas Stropus Starting a new project is always infinitely easier than getting back into a half-baked thing that's been gathering dust for a while. In many ways it's a cognitive and emotional challenge: picking up the mental state that you were in, back when a particular project was first coming together, is not an easy feat to achieve, as the initial driving motivations might have waned, or because you might have moved on to other ideas in the meantime. And that's besides the technical debt and unresolved issues that the project was left off with. While determination can go a long way in this kind of scenario - à la "I won't get up from my desk until it's done" - it's better to actually have a meaningful gameplan. Tomas Stropus talks about this in an article of his titled "The Art of Finishing" - although the article isn't really about generative art in particular, I believe that it's applicable to all sorts of creative endeavors and a universal feeling shared by many artists, makers and creatives. Tomas first identifies some of the reasons why we get stuck in this kind of "never finishing anything loop" and then enumerates some strategies to remedy the problem: [The Art of Finishing | ByteDrumMy endless battle with the “Project Hydra”: why I can’t seem to finish projects, and the strategies I’m exploring to finally complete what I start. A personal journey through productivity’s thorniest challenge.![](https://www.bytedrum.com/favicon.svg)ByteDrumTomas Stropus![](https://www.bytedrum.com/assets/art-of-finishing/og.png)](https://www.bytedrum.com/posts/art-of-finishing/?ref=gorillasun.de) One paragraph in particular struck a chord, it's something I've felt at many points throughout my creative endeavors - an accumulating feeling of not being able to get anything done at all: > The costs of never finishing extend far beyond just missed opportunities. \[...\] it’s in the act of finishing — of solving those last, trickiest problems — where real *skill growth* often occurs. Each unfinished project can chip away at your confidence. The most noticeable personal growth I've experienced was from finally releasing my projects out into the world - it's difficult to describe, but you always see the project in a different perspective afterwards. Maybe one of the best tips he gives throughout is "separating ideation from implementation" which is something that I've personally also been trying to adopt; basically allocating time for meaningful progress driven work "implementation", and some time for messing around "ideation". In a practice like generative art, or even web design, it's easy to lose yourself in the details, and start fine-tuning things when there's more pressing things to work on first. I assume that my ADHD brain is probably particularly prone to this, but it's simply a really bad habit that creeps back in sometimes and can cause a lot of time loss. ### Other Cool Generative Things 1. Alexandre Villares has been making one sketch a day since 2018 - and he's documented all of it over on [his website](https://abav.lugaralgum.com/sketch-a-day/?ref=gorillasun.de), where you can explore the entire archive and even find code for each individual sketch. 2. The second installment of the [Responsive Dreams](https://x.com/ResponsiveDream/status/1820749276001006022?ref=gorillasun.de) generative art festival took place last week in Barcelona (5th to 7th), featuring many familiar faces of the genart crowd that had their works on display. You can learn more about it over on [the official website](https://responsivedreams.com/?ref=gorillasun.de). 3. Next week, in another part of Spain, [Digital Art Day Málaga 2024](https://x.com/DigitalArtDay/status/1823035429513269340?ref=gorillasun.de) is taking place, a conference celebrating not only generative art, but digital art in general. Another group of established generative artists will by making an appearance, and I'm hoping that the presented talks will be recorded in some manner. 4. Pikuma shares an open source, *bare metal,* [raycaster written in x86 assembly](https://x.com/pikuma/status/1831567408416403955?ref=gorillasun.de) \- that boots from a floppy disk and doesn't require an OS to run. Made by [Stillwwater](https://github.com/stillwwater?ref=gorillasun.de). 5. [Pulsar](https://muffinman.io/pulsar/?ref=gorillasun.de) is a tiny creative coding website that lets you explore grid SDFs by writing a mathematical formula to control the visualized animation. ## Tech & Web Dev ### TC39 Introduces New Stage into Feature Pipeline The TC39 committee that's in charge of developing the ECMAScript specification language recently introduced a new stage into their 5 step feature development pipeline, namely stage 2.7\. It finds itself between the Draft and Candidate stage, and addresses the challenge of ensuring that proposals are thoroughly tested before implementation in browsers and runtimes: [Inside ECMAScript: JavaScript Standard Gets an Extra StageAfter nine years of annual JavaScript updates, the TC39 committee has tweaked the process to make rolling out new features faster and smoother.![](https://thenewstack.io/favicon.ico)The New StackMary Branscombe![](https://cdn.thenewstack.io/media/2024/08/0feb79c3-viktor-forgacs-5j8nd3qprbo-unsplash.jpg)](https://thenewstack.io/inside-ecmascript-javascript-standard-gets-an-extra-stage/?ref=gorillasun.de) Previously, proposals sometimes had to revert to earlier stages when design changes necessitated rewriting tests, resulting in wasted effort. Stage 2.7 is now a marker that a feature's design is stable and requires only testing and validation before moving to full implementation in Stage 3 — this separation allows for smoother transitions and reduces redundant work, particularly for large or complex proposals like [ShadowRealm](https://github.com/tc39/proposal-shadowrealm/blob/main/explainer.md?ref=gorillasun.de#Introduction). Here the numbering was carefully chosen to reflect the position of the stage in the pipeline. ### The Fastest JS Color Library You might remember romgrk from [issue #50](https://www.gorillasun.de/blog/gorilla-newsletter-50/) of the newsletter, where we had a look at their insightful article on various methods for optimizing JavaScript code. They recently made a return with an article that introduces their very own JS color library called "color-bits" - boldly claiming that it is the fastest JS color manipulation library out there. In the complementary article romgrk explains why this is the case, and in a way also documents the development process of the lib: [The fastest JS color libraryromgrk’s personal blog![](https://romgrk.com/favicon.svg)![](https://romgrk.com/color-bits-stack.png)](https://romgrk.com/posts/color-bits/?ref=gorillasun.de) romgrk points out a number of inefficiencies in common methods for representing and manipulating RGBA colors, that are commonly stored as objects like `{red: 0, green: 0, blue: 0, alpha: 1.0}` \- while this approach is generally readable, it also results in heavy garbage collection due to object creation. To remedy this, rmgrok suggests encoding RGBA values into a single 32-bit number using bitwise operators, which significantly reduces memory overhead. After a lengthy exploration of how different JavaScript runtimes deal with 32-bit numbers, romgrk ends up embracing JS's signed number system, recognizing that the underlying bit patterns remain correct for their needs, even if the values are interpreted as negative numbers. ### Other Cool Tech Things 1. [When Regex Goes Wrong](https://www.trevorlasn.com/blog/when-regex-goes-wrong?ref=gorillasun.de) is a case study by Trevor Lasn examining a regex backtracking mishap that caused StackOverflow to experience a downtime of 34 minutes in 2016\. He also brings up other instances where regex happened to be the critical point of failure. 2. Andy Bell is back with yet another article for the Picalilli blog, this time teaching us how to [create breakout elements with container queries](https://piccalil.li//blog/building-a-breakout-element-with-container-units/?ref=gorillasun.de), which was also a part of the Picalilli redesign. ## AI Corner ### What's really going on in Machine Learning? I wasn't aware that Stephen Wolfram, who you might know as the creator of Mathematica and Wolfram|Alpha, was actually publishing writings over on his website - and that fairly regularly (at least once a month or so). Towards the end of August Wolfram published a massive deep dive in which he takes a fascinating reductive approach to explaining the inner workings of neural networks, via his own minimal toy models - and ends up making a deeply interesting observation during the endeavor: [What’s Really Going On in Machine Learning? Some Minimal ModelsStephen Wolfram explores minimal models and their visualizations, aiming to explain the underneath functionality of neural nets and ultimately machine learning.![](https://writings.stephenwolfram.com/favicon.ico)Stephen WolframDavid G. Stork![](https://content.wolfram.com/sites/43/2024/08/sw-ml-social-share-v2.png)](https://writings.stephenwolfram.com/2024/08/whats-really-going-on-in-machine-learning-some-minimal-models/?ref=gorillasun.de) One surprising result is that neural nets can be simplified to a great extent while still retaining a big part of their capabilities - Wolfram makes use of a structurally simpler and discretized type of neural network for this purpose. The other very surprising observation is that models don't actually end up relying on any sort of structured mechanism to achieve the tasks that they're trained on, but rather tap into "[the general richness of the computational universe](https://www.wolframscience.com/nks/chap-3--the-world-of-simple-programs/?ref=gorillasun.de)", which sounds a bit esoteric - and I don't fully grasp how that can be - but is in essence related to a Wolfram's previous notion of Computational Irreducibility. [Computational Irreducibility](https://www.wolframscience.com/nks/p737--computational-irreducibility/?ref=gorillasun.de) is the idea that some systems, especially those that follow simple rules, can produce behavior so complex that no shortcut or simplified method exists to predict their outcomes. To know the result, you'd have to let the system run its full course, as there’s no faster way to determine what will happen than by performing the actual steps. This suggests that even though the ruleset is simple, the complexity it generates is irreducible and cannot be easily predicted or simplified. If you only have time for one article this week, this is the one - will most likely give it a couple more reads to fully grasp everything that Wolfram tackles throughout. ### Tobias van Schneider on the AI Hype Another insightful read this week, about the current state of AI, is a think-piece by Tobias van Schneider. He contemplates the rapid rise of AI in recent years and makes a couple of predictions for where he thinks we're headed with the tech: [AIAIAIHow tired are we collectively about AI? Are we over it yet? Can you even hear about it anymore? I’m sorry if you can’t, because this essay will be entirely about it.![](https://vanschneider.com/blog/content/images/size/w256h256/2021/01/desk_publication_logo_square2.png)The DESK MagazineTobias van Schneider![](https://vanschneider.com/blog/content/images/size/w1200/2024/07/AI-AI-AI.png)](https://vanschneider.com/blog/aiaiai/?ref=gorillasun.de) AI has unarguably catalyzed a moral and technological shift, comparable to that of the industrial revolution – particularly in areas like copyright, intellectual property, and privacy. This shift is also reshaping societal norms and aggravating a growing generational divide on AI acceptance. The most interesting point that Tobias makes however, is his prediction of a counter wave against AI; an eventual turning point in the content creation meta that'll focus on more personalized, human-driven experiences—where craftsmanship and human connection will serve as a response to the hyper-efficient but boring AI content. ## Music for Coding *Kikagaku Moyo* is japanese and means as much as "Geometric Patterns" - which make the band a no-brain inclusion for the Newsletter, they're a psychedelic band founded in Tokyo in 2012 - unfortunately now on an indefinite hiatus since 2022\. Mammatus Clouds is comprised of just 3 songs, with the first takes up more than half of the records' time. Their sound is a mix of atmospheric, tribal sounds with a psychedelic element: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 71Non-Euclidean Geometry in Video Games - Planar Graphs for City Map Generation - Quadtrees for Flocking Simulations - OKLCH in Web Design - Regular Expressions in JS - Re-Implementing React from Scratch - DOOM in a Diffusion Model - 3Blue1Brown Deep Learning Chapter 7![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/09/flowws-1-1.jpg)](https://gorillasun.de/blog/gorilla-newsletter-71?ref=gorillasun.de) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 71 URL: https://www.gorillasun.de/blog/gorilla-newsletter-71/ Last updated: 2024-09-02T05:00:51.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers who joined in the past week!** > **This is the 71st issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech, and AI. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Non-Euclidean Geometry in Video Games In recent years the term "Non-Euclidean" has been appropriated in video game lingo to refer to types of games where space doesn't behave the way it does in reality - such that the game space becomes traverse-able in impossible manners. There's a very iconic video from the CodeParade YouTube channel, that demonstrates some of the ways of how Non-Euclidean geometry can come to life in a video game setting - such that the outward appearance of spaces is deceptive and does not reflect the interior dimensions: The video also introduces a [game engine](https://github.com/HackerPoet/NonEuclidean?ref=gorillasun.de) that makes the creation of these types of experiments more accessible. Thrown around to describe any type of strange geometry in games, the term Non-Euclidean might have come to be miss-appropriated when compared to its definition in mathematics, where it generally refers to spaces that are of a hyperbolic (space is curved negatively - the angles of a triangle sum to less than 180°) or elliptic (space is curved positively - the angles of a triangle sum to more than 180°) nature. An insightful article on the topic is from Zeno Rogue, dating back to 2019, it gives a historic perspective on the notion and showcases some of the different flavors that these unconventional spatial experiments come in: [Non-Euclidean geometry and gamesThe term “non-Euclidean” is often used by gamers to mean any kind of game where geometry does not work exactly as in our world. While such…![](https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156)MediumZeno Rogue![](https://miro.medium.com/v2/resize:fit:1200/1*uxFX950Y2QMHRQqunlaJCQ.png)](https://zenorogue.medium.com/non-euclidean-geometry-and-games-fb46989320d4?ref=gorillasun.de) Arguably the most iconic example of a video game with a Non-Euclidean mechanic is Portal (& Portal 2); as the player you have the ability to create your own hyper connections - portals - between surfaces to creatively traverse space and solve the puzzle of each level. A less obvious example is Sid Meier's Civilization series: by traversing the map horizontally you can loop around the world seamlessly, which implies that the tile map is wrapped around a cylinder (the poles can't be traversed). Besides many more examples, the author also mentions their very own game titled [Hyper Rogue](https://www.youtube.com/watch?v=xAFrKKApHTY&t=69s&ref=gorillasun.de), a dungeon crawler that takes place on an endless heptagonal tile grid - the ***bitruncated order-3 heptagonal tiling of the hyperbolic plane***, to be precise. On the Hyper Rogue site, Zeno also shares an in depth piece (an absolute gem of a resource) that explains the tiling in detail: [HyperRogue - Experiments with geometrypuzzle roguelike on a hyperbolic plane![](https://roguetemple.com/favicon.ico)Experiments with geometryZeno Rogue![](https://roguetemple.com/z/hyper/bitrunc-thumb.png)](https://roguetemple.com/z/hyper/geoms.php?ref=gorillasun.de) The reason I find myself writing about this topic was actually a Reddit post from Sean Dewhirst, that I also want to highlight here while we're at it. Sean showcases procedurally generated labyrinthic pathways, that are seemingly connected in a way that defies the 2D space they exist in - multiple rooms can occupy the same physical space, and can also unexpectedly loop back on themself. In a lengthy comment Sean elucidates how this is achieved: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-01-at-10.42.41.png) [Link to Reddit Post](https://www.reddit.com/user/Sean%5FDewhirst/comments/1f5qjv5/persistent%5Fnoneuclidean%5Fmaze%5Fthat%5Fgenerates%5Fas/?ref=gorillasun.de) | [Link to Explanation](https://www.reddit.com/user/Sean%5FDewhirst/comments/1f5qjv5/comment/lkuu7rn/?utm%5Fsource=share&utm%5Fmedium=web3x&utm%5Fname=web3xcss&utm%5Fterm=1&utm%5Fcontent=share%5Fbutton) Here the T-junctions, that appear to have many dead ends, are actually passages to other corridors that only become apparent when they fall in line of sight with the character (the green dot). I generally pride myself with a good sense of direction, but it seems that this talent is not applicable to Non-Euclidean geometry - after watching the GIF over a dozen times I still wasn't able to make a mental map of the different corridors. This also raises the interesting question of what a visualization of the spaces in form of a mini-map would look like - if the concept were to be employed in an actual game setting. ### City Map Generation with Planar Graphs Two weeks ago, in [issue #69](https://www.gorillasun.de/blog/gorilla-newsletter-69/) I featured an interesting paper that leverages tensor fields for the purpose of generating city-like road networks; this week, in another episode of procedural city map generation, I came across a creator that goes under the alias of WorldSmith who's started a series of articles documenting their own approach to the task. [The Worldsmith Project - City map generationOverview of an algorithm to generate a network of city streets, using planar graphs and some simple constraints.City map generation![](https://zero.re/worldsmith/roadnet/preview.jpg)](https://zero.re/worldsmith/roadnet/?ref=gorillasun.de) Worldsmith's method is based on planar graphs, in the first article it's describes how the procedure goes aboout constructing the graph such that it produces a distinct pattern resembling that of a road network. This is primarily achieved by enforcing constraints on how the initial nodes are allowed to connect with each other, for instance, by restricting the angle that edges connected to a same node can form, as well as how many connections each node is allowed to make. Tuning those constraints then leads to different aesthetic variations. More than just a technique for pattern generation, the article can also serve as a mini crash course on graphs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/09/Screenshot-2024-09-01-at-23.32.14.png) In the second article tackles the interesting problem of Zoning, which essentially involves the assignment of a type to each face in the previously constructed graph (a face is a polygon enclosed by 3 or more edges - essentially a house/building/structure in the city). While this might not seem like a difficult problem — like, just assign a type duh — mimicking the manner in which cities naturally segregate themself into particular areas, where buildings serve a specific purpose (residential, commercial sectors, etc.), is not as easy at it may seem. WorldSmith describes an interesting voting mechanism such that adjacent faces can agree on a type in a relatively organic manner. Worldsmith shares a demo of his code in action over on YouTube: Looking forward to the next installments! ### Introduction to Quadtrees by Patt Vira Spatial hashing is probably one of the most useful optimization techniques to have in your programming toolbox, it's handy whenever you need to determine the proximity of two objects in a scene of some sort, be it in 2D or 3D. In a nutshell, spatial hashing involves partitioning the scene into a number of buckets/regions that allow for the efficient querying of spatial data - in this setting the buckets know which items they contain, and vice-versa the items know which bucket they are in. These types of partitioning come in many flavors, and a very popular one is the Quadtree that's frequently used in video games as well as generative art. Last week Patt Vira published an in depth video on exactly this topic; inspired by a [sketch](https://www.instagram.com/p/C-QHx2ASmWx?ref=gorillasun.de) from [Chris Barber aka @code\_rgb](https://www.instagram.com/code%5Frgb/?ref=gorillasun.de) that demonstrates a flocking simulation with a quad tree like structure running in the background - that I assume is employed to optimize the Boyd proximity calculations. Patt tackles the implementation of this structure, from inserting points into the data structure, all the way to querying them in an efficient recursive manner: ### Other Cool Generative Things 1. Amit Patel shares [a post](https://x.com/redblobgames/status/1828568863216382040?ref=gorillasun.de) about an algorithm called [Probabilistic Roadmap Planning](https://en.wikipedia.org/wiki/Probabilistic%5Froadmap?ref=gorillasun.de): a [motion planning](https://en.wikipedia.org/wiki/Motion%5Fplanning?ref=gorillasun.de) algorithm in robotics, that solves the problem of determining a path between a starting configuration of the robot and a goal configuration while avoiding collisions. This is done by creating a random graph around a set of obstacles and then finding the shortest path that allows an agent to efficiently traverse the space. 2. Keijiro Takahashi has made a number of [experiments using Unity's VFX Graph that can now run on WEBGPU ready browsers](https://www.keijiro.tokyo/WebGPU-Test/VFXCustomCode/?ref=gorillasun.de) (Desktop and Mobile). He's generously shared the [source code](https://x.com/%5Fkzr/status/1820093845125923230?ref=gorillasun.de) for these experiments over on his GitHub. 3. Via Agoston Nagy I learned about a cool book titled [Live Coding a User's Manual](https://direct.mit.edu/books/oa-monograph/5495/Live-CodingA-User-s-Manual?ref=gorillasun.de) that was published in 2022; it's a comprehensive reference for live coding as a performance art, what's special is that it's published under a creative commons license, making it freely accessible to everyone. 4. Not generative art per se - but with generative potentiality - catching up on the other talks given at the CSS Day 2024, another one that stood out was from Julia Miocene, that makes stunning digital illustrations as well as animations in pure CSS. In her talk she walks us through how she made a couple of them, and over on her own channel she's also posted more than a few tutorials on the topic. ## Tech and Web Dev ### OKLCH Color Space in CSS The [CSS Color Module Level 4](https://www.w3.org/TR/css-color-4/?ref=gorillasun.de) is now a nearly final specification and finds itself in the Candidate Recommendation stage since November 2022; many major browsers already adopt some of the new features it introduces. This last week Andrey Sitnik from Evil Martians (a product development consultancy) published a deep dive that focuses on one new feature in particular, the OKLCH color space. The article explains all of the ways in which it improves on the RGB and HSL color spaces and also points out some of the challenges of working with it: [OKLCH in CSS: why we moved from RGB and HSL—Martian Chronicles, Evil Martians’ team blogCSS Color Module 4 adds oklch(), and we gain P3 wide-gamut support, boost code readability, and improve developer-designer communication.![](https://evilmartians.com/favicon.svg)Evil MartiansAndrey Sitnik![](https://evilmartians.com/social-cards/chronicles/oklch-in-css-why-quit-rgb-hsl.jpg)](https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl?ref=gorillasun.de) In brief, the perceptual uniformity of OKLCH helps tremendously when it comes to picking and generating colors, in addition to working well with modern displays that are capable of displaying a wider range of colors. While native color modification is not an option yet in Color 4 (the Color Module Level 5 will introduce it), OKLCH is actually the best space for effectuating dynamic color changes due to the predictability of the results - the article provides an example to demonstrate this, where the functional `oklch()` notation easily allows for the change of an accent color: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-31-at-13.03.26.png)](https://developer.mozilla.org/en-US/docs/Web/CSS/color%5Fvalue/oklch?ref=gorillasun.de) [Link to MDN Docs of the feature.](https://developer.mozilla.org/en-US/docs/Web/CSS/color%5Fvalue/oklch?ref=gorillasun.de) But that's just one of the cool things the article covers - highly recommend checking out all of it. What's also of note here, is that Evil Martians published an article earlier in the year on the same topic, where they introduce a color picker tool of theirs that's aimed at helping you "think perspectively" when working with OKLCH: [OK, OKLCH: a color picker made to help think perceptively—Martian Chronicles, Evil Martians’ team blogWe designed the UI of the OKLCH Color Picker & Converter with education in mind as the driving design principle. Beyond being a handy tool, we aim to speed up familiarity and adoption of OKLCH and perceptual color spaces.![](https://evilmartians.com/favicon.svg)Evil MartiansRoman Shamin![](https://evilmartians.com/social-cards/chronicles/oklch-a-color-picker-made-to-help-think-perceptively.jpg)](https://evilmartians.com/chronicles/oklch-a-color-picker-made-to-help-think-perceptively?ref=gorillasun.de) ### The History And Future Of Regular Expressions In JavaScript Regular expressions are a longstanding polarizing topic: notorious for being difficult to read and write, they are at the same time incredibly powerful at what they do - especially when its for pattern matching tasks that are not easily accomplished with regular programming languages. Last week, Steven Levithan published an article for Smashing Magazine, where he provides a comprehensive overview of the evolution and current state of regular expressions in JavaScript, tracing the journey from JS' early regex limitations, all the way to showcasing modern capabilities in action, while also addressing some of the persisting limitations: [Regexes Got Good: The History And Future Of Regular Expressions In JavaScript — Smashing MagazineAlthough JavaScript regexes used to be underpowered compared to other modern flavors, numerous improvements in recent years mean that’s no longer true. Steven Levithan evaluates the history and present state of regular expressions in JavaScript with tips to make your regexes more readable, maintainable, and resilient.![](https://www.smashingmagazine.com/images/favicon/favicon.svg)Smashing MagazineSteven Levithan![](https://files.smashing.media/articles/history-future-regular-expressions-javascript/history-future-regular-expressions-javascript.jpg)](https://www.smashingmagazine.com/2024/08/history-future-regular-expressions-javascript/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) To some extent, JS can nowadays stand its ground compared to other regex flavors. Notably, ES2018 and ES2024 have substantially elevated its regex capabilities, incorporating features like lookbehind assertions, named capture groups, and Unicode property escapes, aligning JavaScript more closely with the modern regex standards that can be seen in languages like Python and Ruby. Despite these improvements however, it seems that JS regexes still lack certain features - towards the end of the article Steven Levithan introduces a library with extended functionality that aims to bridge those remaining gaps: [GitHub - slevithan/regex: Regex template tag for readable, high-performance, native JS regexes, with context-aware interpolation and always-on best practicesRegex template tag for readable, high-performance, native JS regexes, with context-aware interpolation and always-on best practices - slevithan/regex![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubslevithan![](https://repository-images.githubusercontent.com/807854206/90b6165c-3f85-4cdf-aa20-27ea7378080e)](https://github.com/slevithan/regex?ref=gorillasun.de) ### Building React from Scratch React has unarguably revolutionized modern web development, by making UI code declarative it abstracts away direct DOM manipulation, and its component-based architecture lends itself perfectly to more scalable, modular and maintainable development approaches. If you've ever wondered how the leading frontend framework works internally, Robby Pruzan wrote a no frills deep dive on re-implementing React from scratch, not only exposing its inner workings, but also offering valuable insights into the library's architecture and some of the design decisions that influenced it—caution though, it's quite a technical read, Robby throws us in the deep end right off the bat: [Implementing React from scratchA detailed explanation of the architecture I used to rebuild react![](https://www.rob.directory/apple-icon.png?1b2c8f78a7ad51f3)![](https://www.rob.directory/_next/image?url=%2Freact-from-scratch%2Fimage.png&w=1080&q=75)](https://www.rob.directory/blog/react-from-scratch?ref=gorillasun.de) ### Other Cool Tech Things 1. CSS has made some big strides in past years; with a constant stream of new features, and many ongoing discussions, the language's progress has been more noticeable than ever. This makes the return of the [State of CSS 2024](https://survey.devographics.com/en-US/survey/state-of-css/2024?ref=gorillasun.de) survey more exciting than ever, as it'll be interesting to see how this march of progress is being perceived, and what the current trends are. 2. Oskar Wickström made a big buzz on social media with his minimalist design exploration titled [The Monospace Web](https://github.com/owickstrom/the-monospace-web?ref=gorillasun.de), a project in which he perfectly aligns all elements of a website to a monospace grid. [Wickström open sources the design under the MIT license for everyone to use. ](https://github.com/owickstrom/the-monospace-web?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-28-at-16.59.42.png)](https://x.com/owickstrom/status/1828469089666298315?ref=gorillasun.de) [Link to Tweet](https://x.com/owickstrom/status/1828469089666298315?ref=gorillasun.de) ## AI Corner ### Doom Running in a Diffusion Model Running DOOM on various devices, from graphing calculators and printers, to oscilloscopes, and even ATMs, has become a popular challenge among hackers and in many ways a modern cultural meme - so much so that there's actually a [big community around the practice](https://www.reddit.com/r/itrunsdoom/?ref=gorillasun.de). In a most recent development we see DOOM run entirely through a diffusion based neural network called GameNGen, not just as a generated simulation, but supporting full fledged user input and control: [Diffusion Models Are Real-Time Game EnginesWe present GameNGen, the first game engine powered entirely by a neural model that enables real-time interaction with a complex environment over long trajectories at high quality. GameNGen can interactively simulate the classic game DOOM at over 20 frames per second on a single TPU. Next frame prediction achieves a PSNR of 29.4, comparable to lossy JPEG compression. Human raters are only slightly better than random chance at distinguishing short clips of the game from clips of the simulation. GameNGen is trained in two phases: (1) an RL-agent learns to play the game and the training sessions are recorded, and (2) a diffusion model is trained to produce the next frame, conditioned on the sequence of past frames and actions. Conditioning augmentations enable stable auto-regressive generation over long trajectories.![](https://arxiv.org/static/browse/0.3.4/images/icons/apple-touch-icon.png)arXiv.orgDani Valevski![](https://arxiv.org/static/browse/0.3.4/images/arxiv-logo-fb.png)](https://arxiv.org/abs/2408.14837?ref=gorillasun.de) This is an interesting modality - is the neural network actually *running* the game, or has it just memorized the entirety of it? The original DOOM is not that expansive of a game after all. Taking on the role of reviewer #2 over on Twix, Dr. Jim Fan criticizes the usefulness of the model, stating that the concept isn't easily extrapolate-able due to a lack of data. He also points out that the model is grossly overfitting on 9 billion frames of the game, meaning it's very likely that it's not generating an *original* world - making GameNGen behave more like a NERF model for a particular game; a type of neural network that can predict a different perspective given an image of an object: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-29-at-13.54.39.png)](https://x.com/DrJimFan/status/1828813716810539417?ref=gorillasun.de) [Link to Tweet](https://x.com/DrJimFan/status/1828813716810539417?ref=gorillasun.de) I've mentioned it in the past, but I believe that there's exciting applications for video games, especially when it comes to computer graphics. Once we have consumer hardware that's powerful enough to run these beefy models (or they've been made much more efficient) I believe that they could serve as potent rendering engines. Besides that, we've already seen some cool experiments where LLMs power the dialogue of NPCs. ### How Might LLMs store Facts? Over 6 years ago, at a time when LLMs didn't exist, Grant Sanderson aka 3blue1brown published the first four videos in his Deep Learning series, where he introduces neural networks and back propagation. Earlier this year he published chapter 5 and 6 that introduce the fundamental building block of LLMs, explaining the inner workings of transformers - just yesterday he uploaded the latest installment of the series in which he tackles how transformers, and LLMs in general, might store knowledge in their internal representation: ## Music for Coding Following up on last week's recommendation of the iconic Mexican fusion band Sacbé, I recently discovered another impressive South American jazz fusion group that you need to hear. Ekathe, a young band from Argentina, released their debut album just last year and is already doing some great things; they heavily remind me of Snarky Puppy's groove-driven, genre-blending style. From mellifluous jazz passages to the occasional distorted guitar riff, what Ekathe offers is a bit of a mixed bag of sonic treats: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 70Beyond Wave Function Collapse - Markov Junior: A Probabilistic Programming Language - The Sweep-and-Prune Algorithm - Visualizing Sound - A Font with Code Highlighting Built In - CSS Day 2024 and CSS Accessibility - The Process behind Redesigning Piccalilli - The Advent of AI Powered Code Editors![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/08/flowerss-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-70/) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 70 URL: https://www.gorillasun.de/blog/gorilla-newsletter-70/ Last updated: 2024-08-30T15:10:01.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 70th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Beyond Wave Function Collapse + EPC 2024 EPC 2024 (Everything Procedural Conference) took place earlier this year in April, and over the weekend I discovered that the talks given at the conference had been published in their entirety a while ago already - unsurprisingly they turn out to be a treasure trove for all sorts of different cutting edge generative and procedural techniques. You can find a run-down and descriptions for them over on [the official website](https://www.everythingprocedural.com/?ref=gorillasun.de), as well as and the complete archive of recordings (also including talks from past years) over on YouTube: [BUas GamesBreda University of Applied Sciences’ games programme is known worldwide as one of the best. Whether you want to become a game developer, designer, character artist or producer of a Triple-A game, we will help you on your way. We use our YouTube channel to showcase some of our students’ work.![](https://www.youtube.com/s/desktop/b9bfb983/img/favicon_144x144.png)YouTube![](https://yt3.googleusercontent.com/EhtrnYn381d-Lb-ZWwhQ4N9CYSCp83JjUpbIKv9UAqCywIsn49Sw4WA4dU-3BT4kIJAaVZ-Hqg=s900-c-k-c0x00ffffff-no-rj)](https://www.youtube.com/@BUasGames/videos?ref=gorillasun.de) For generative art purposes, one talk in particular stands out this year, it's by Paul Merrell who you might recognize as the brain behind the original series of papers that introduced the *Model Synthesis* algorithm for procedural pattern generation, a technique that we more commonly know today as *Wave Function Collapse* in genart and game dev circles. While Merrell had a hunch early on that his method would find great application in video games, *WFC* only gained traction after Maxim Gumin published a Github repository that provides a tangible implementation of the algorithm: [GitHub - mxgmn/WaveFunctionCollapse: Bitmap & tilemap generation from a single example with the help of ideas from quantum mechanicsBitmap & tilemap generation from a single example with the help of ideas from quantum mechanics - mxgmn/WaveFunctionCollapse![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubmxgmn![](https://opengraph.githubassets.com/4b4aa2b97556a143598646b50f61adc88752dab6f3ec03a8402781f76ebf846e/mxgmn/WaveFunctionCollapse)](https://github.com/mxgmn/WaveFunctionCollapse?ref=gorillasun.de) In a nutshell, WFC is essentially a procedural content generation algorithm that's primarily used to create textures, patterns, and game levels (assembling tilemaps) in a way that looks coherent and follows certain rules or constraints. The algorithm operates by determining the state of each cell in a grid (like a tile or pixel, but can also be extended to irregular grids) based on constraints derived from example input patterns. It "collapses" possibilities for each cell into a single outcome that aligns with its neighbors, ensuring the generated output matches desired properties - for a digestible introduction you should check out Coding Challenge #171 in which Daniel Shiffman tackles a full implementation of the algo: Famous instances of the algorithm in action, out in the wild, are the iconic Townscaper and the lesser known mobile game Bad North, both developed by Oskar Stålberg. It's important to note here that Stålberg additionally extended the method by applying it to an irregular grid (I wrote about a bit about the construction of such grids in [issue #59](https://www.gorillasun.de/blog/gorilla-newsletter-59/)). A more recent example is Tiny Glade that I believe to also employ wave function collapse for adjoining textures. In this manner WFC is arguably a revolutionary technique for video game aesthetics. In generative art there's also a very cool recent example for it, loackme's and Karim Safa's Nullmachines also leverages WFC to create the animated endlessly looping conveyor belts: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/image-3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/image-4.png) A limitation of WFC however is that it's tile based and confined to a grid - and as the title of the Paul's conference talk reveals it revolves around a new method to achieve procedural patterns without relying on tiles at all. Having worked on this for over 2 decades since the publishing of the Model Synthesis paper, Paul introduces us to Graph Grammars: I highly recommend watching the talk, while quite technical, the notions can be understood quite easily. Merrell explains that there are actually already many procedural techniques that rely on *shape grammars*—rules that dictate how certain shapes can combine with each other into new shapes. The caveat of these previous methods is that these combinatory rulesets are generally manually designed by experts. In contrast, Merrell's proposed method generates the shape grammar automatically, based off of an example texture and/or sample shape - and that without relying on a grid of tiles for the assembly of new patterns, but rather modeling the result as a graph. I'll leave it at that though, if you only have time for a single video this week, this is the one! ### Markov Junior: A Probabilistic Programming Language By chance, I discovered another important Github repo from Maxime Gumin - not by going through his GitHub profile, but rather through a post from the [@algoritmic](https://x.com/algoritmic/status/1827045721695994229?ref=gorillasun.de) TwiX account that showcased intriguing procedurally generated voxel towers, linking back a repo from Gumin titled Markov Junior: [GitHub - mxgmn/MarkovJunior: Probabilistic language based on pattern matching and constraint propagation, 153 examplesProbabilistic language based on pattern matching and constraint propagation, 153 examples - mxgmn/MarkovJunior![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubmxgmn![](https://opengraph.githubassets.com/f22026a25630676cb63efc13e78c80e7742a1499b3ae1c045d4b75f8e1b8ed0e/mxgmn/MarkovJunior)](https://github.com/mxgmn/MarkovJunior?ref=gorillasun.de) To put it simply, Markov Junior is a sort of esoteric programming language that draws inspiration from Markov Algorithms, and is in essence a general purpose tool geared towards procedural content generation. Not to be confused with Markov Chains, probabilistic mathematical models used to describe state transition systems - Markov algorithms on the other hand are abstract symbol manipulation and transformation machines. An algorithm in this setting is comprised of two things: an alphabet of symbols, accompanied by a set of rules or instructions to perform string transformations and rewrites on the symbols in the alphabet - more formally this is described as a scheme; a finite ordered set of *substitution formulas*. This sounds more complicated than it actually is, to give an example, a rule could simply be "replace the letter a with the letter b" - Wikipedia provides a more sophisticated example: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-00.58.50.png)](https://en.wikipedia.org/wiki/Markov%5Falgorithm?ref=gorillasun.de) [From the Wikipedia page on Markov Algorithms](https://en.wikipedia.org/wiki/Markov%5Falgorithm?ref=gorillasun.de) The github repo itself provides a brief explanation of Markov Algorithms, and also showcases a more practical example, converting the binary representation of a number to its unary equivalent: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-01.08.57.png) With Markov Junior these rewrite protocols gain application in procedural content generation - in the 2D and 3D settings programs essentially describe types of cellular automata, some of which might look very familiar at first glance, like maze generators for instance. The distinction is that these procedural patterns become very easy to define with just a couple of substitution rules: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-26-at-02.43.03.png) ### On Collision Detection Algorithms by Lean Rada Lean Rada wrote, not one, but two articles on collision detection; the first article talks us through how sorting objects can go a long way for the purpose of reducing the number of collision checks that need to be computed, all while introducing us to the elegant and efficient Sweep-and-Prune algorithm - followed up by a second installment where Lean fills in the missing parts and explains a more complete implementation of the algorithm: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-13.40.46-1.png)](https://leanrada.com/notes/sweep-and-prune/?ref=gorillasun.de) [Link to Part 1](https://leanrada.com/notes/sweep-and-prune/?ref=gorillasun.de) The common issue with naive approaches to collision detection is the number of checks required to determine if any two shapes in the simulated world intersect or not—in the worst case, each shape needs to be checked against every other shape, leading to a computationally expensive O(n^2) problem. The Sweep-and-Prune algorithm is one of the methods that reduces the number of necessary checks. In essence, this is done by sorting objects based on their positions along a chosen axis and creating intervals that represent the space each object's axis-aligned bounding box (AABB) occupies along that axis. This allows the algorithm to focus only on checking collisions between objects whose intervals overlap, thus quickly narrowing down the number of object pairs that might be colliding. The algorithm then tracks the minimum and maximum extents of each object’s AABB as separate points in a sorted list, and then sweeps a line across this list. As the sweep progresses, it keeps track of which objects' intervals are currently active (overlapping with the sweep line) and checks for potential collisions only between those objects, efficiently identifying pairs of shapes that could potentially intersect. Then we can fire-up a more accurate collision check for the shape we're dealing with to determine if there is in fact a collision. Now I'm oversimplifying this with my explanation; make sure to check out both of Lean's articles, they're wonderfully written and accompanied by more than a few nice interactive snippets to exemplify the ideas throughout - the latter part of the second article discusses further optimizations that we can apply to further speed up the overall procedure: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-13.39.08.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-01.56.48.png) [Link to Part 2](https://leanrada.com/notes/sweep-and-prune-2/?ref=gorillasun.de) While I've implemented spatial hashing (grid/quadtree lookups basically) on several occasions, I've never actually used Sweep-and-Prune - what's interesting is that the two can actually be combined, for instance you could do a sweep check on each grid cell to potentially further reduce the number of collision checks that need to be made. I'm not entirely certain if it would lead to that much more of a performance gain however. ### On Visualizing Sound - Are.na Editorial Be it Spectrograms produced by passing a sonic signal through the Fourier Transform, or the geometric compositions that visualize different chords and melodies on an instrument - representing sound in the visual domain via graphical notation, as a form of translation between the senses, has long been a fertile ground for creative expression. A recent Are.na editorial piece highlights this relationship through Travess Smalley and Daniel Lefcourt's work with graphic notation, offering a compelling look at its contemporary relevance, and how it lends itself as a perfect playground for building interpretational systems: [Visualizing Sound | Are.na EditorialArtists Travess Smalley and Daniel Lefcourt on graphic notation.![](https://www.are.na/favicon.svg)Are.na![](https://images.ctfassets.net/xq10wb7ogoji/SwcU5ezYWNvqm607aKY4s/b8d4f2f9318c801469777334835ab75a/original_2e5fdc3e91e13dcb204936b2fcbeaca1.jpg?w=1200&h=630&q=85)](https://www.are.na/editorial/visualizing-sound?ref=gorillasun.de) Both artists agree that the applications of graphic notation extends beyond that of mere artistic expression, and can serve as a powerful educational tool for teaching abstraction, as a rule-based approach to creativity; rather than relying solely on intuitive or subjective decision-making, students have to derive form and composition from a systematic computational process that can translate between the sonic and visual domain. Make sure to check out Travess Smalley's [Visualizing Sound: Tools, Notations, Drawings, Graphics, and Paintings channel](https://www.are.na/travess-smalley/visualizing-sound-tools-notations-drawings-graphics-and-paintings?ref=gorillasun.de) and Daniel Lefcourt's [Graphic Traces channel](https://www.are.na/daniel-lefcourt/graphic-traces?ref=gorillasun.de) towards that end, they're chock-full of creative music and sound visualizations examples, some of which are talked about in more detail throughout the article itself. If you're not familiar with Are.na, I briefly wrote about it in issue #47 and #48 of the Newsletter, but in essence it is a social networking platform designed for collaborative curation, organization, and sharing of content. It was created to provide a space for thoughtful and creative individuals to collect and organize information in a more structured and intentional way than typical social media platforms. ### Other Cool Generative Things 1. Chris Ried is back with another issue of his fantastic newsletter, he seemingly always manages to find interesting things that I miss - [go check it out and give it a ried](https://substack.com/@generatecoll/p-148095672?ref=gorillasun.de). 2. It seems that there is no end to Nolen Royalty's creative experiments, less than 48 hours after giving a talk about his 1 million checkbox website, he gives second talk, at another conference, about a different project of his. If you're curious about [programming flappy bird in the MacOS finder](https://x.com/itseieio/status/1827400773317415247?ref=gorillasun.de), you should catch up with what Nolen's been up to. 3. And for our weekly installment of mini code shenanigans, I want to highlight a post from Michael Rostoki, whom I am a big fan of ever since discovering his stuff during Genuary - he frequently shares short [tweet sized Lua sorceries](https://x.com/von%5Frostock/status/1827020229085413815?ref=gorillasun.de) for the beloved Pico 8 fantasy console. 4. To not reinvent the wheel, the P5 sound library is being revisited following the 2023 sound fellowship, such that it'll act as a thin wrapper around tone.js - which is already designed with creative coding in mind. You can [read more about this endeavour here](https://github.com/processing/p5.sound.js-pre-release?ref=gorillasun.de). ## Tech and Web Dev ### Font with Built in Syntax Highlighting If you've ever started your own programming blog, you probably found yourself in a situation where you want to showcase some code snippets on your page, and actually have them highlighted as proper syntax, and not just as plain text. And in that scenario there's no way around using some third party library that takes care of code and syntax highlighting. This blog uses the popular highlight.js as a solution towards that end. While these libraries are super handy, they also come with some downsides. For instance, they add an additional overhead to the pageload, either because they're additional resources that need to be loaded in from an external place, or by making your page's size more bloated by being directly included. That's also beside the code itself running to modify the DOM and color the syntax accordingly - and in these modern times we care a lot about making our pages blisteringly fast to load. A recent article from the Glyph Drawing Club Blog, explores an intriguing approach to syntax highlighting without relying on JavaScript at all — but rather by building syntax highlighting directly into the font itself, and this through certain OpenType font features. The method uses colored glyphs and contextual alternates to identify and highlight different elements of code syntax: [Font with Built-In Syntax HighlightingAn experiment in javascript-free syntax highlighting, made possible by opentype contextual alternates and COLR table![](https://blog.glyphdrawing.club/assets/icons/favicon/apple-touch-icon.png)GlyphDrawing.Club -blog![](https://blog.glyphdrawing.club/assets/f3KmrWOM5Z-300.jpeg)](https://blog.glyphdrawing.club/font-with-built-in-syntax-highlighting/?ref=gorillasun.de) This approach obviously comes with its own set of pros and cons. The most impressive thing about it is how simple it makes code highlighting - you just have to specify the modified font via the `font-family` css rule and apply it to the `code` html tag. An added benefit is that it also make syntax highlighting possible in the `textarea` and `input` tags that were previously impossible to style in that manner. On the flipside, the limited pattern-matching capabilities compared to regex-based solutions may also result in less accurate syntax highlighting in complex scenarios — although... the Hacker News comment section argues otherwise, bringing up that it might just be possible to implement that: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-14.52.36.png)](https://news.ycombinator.com/item?id=41245159&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=41245159&ref=gorillasun.de) Another minus is that it requires one to modify the font file itself, which is not a very straightforward thing to do, firstly because specific software is needed for that, and secondly because many font licenses simply don't actually allow for modification. From a broader perspective however, it's a really cool project - while it may not replace traditional syntax highlighting libraries just yet, it's an interesting alternative to keep in mind for scenarios where you need something simple and performant, without caring too much about extensive customization. ### CSS Day 2024 Talks + Sara Soueidan CSS Accessibility The talks given at CSS Day 2024, held earlier this year in July, have been gradually published over the past couple of weeks on the [Web Conference Amsterdam YouTube channel](https://www.youtube.com/@WebConferencesAmsterdam/videos?ref=gorillasun.de) \- all of them are gems and worth queuing into your to-watch list. One talk that I want to highlight in particular, is by none other than Sara Soueidan, who's arguably become a CSS superstar at this point given her contributions over the years. In her talk she tackles CSS from an accessibility perspective, and how certain rules can have a severe impact on the accessibility of the elements in the user interface that they style, all while providing remedies and alternatives to those faux-pas: CSS does not only affect the visual presentation of elements, but also indirectly impacts the information that is exposed by elements in the accessibility tree, and whether it's exposed at all. For instance, lists are crucial for screen readers because they convey important structural information about grouped items, and are often used to indicate sequences of related interface elements, like navigation links. For visual purposes, however, developers might use `list-type: none` to remove visual list markers, particularly for navigation elements - this also inadvertently strips them of their semantic accessibility labels in certain browser/screen reader pairings. A better solution here is to use `list-style-type: ""`. Sara points out an [interesting article on that matter here](https://piccalil.li/links/removing-list-styles-without-affecting-semantics/?ref=gorillasun.de). Another example is relying on the popular `display: none` CSS hack as a solution to visually hide elements from a webpage, not only does it achieve that, but also completely removes it from the accessibility tree - no bueno - using a utility class to this end, for visually hiding content, while keeping it accessible is a better approach: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-16.01.59.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-16.06.35.png) But that's just scratching the tip of the iceberg though, she covers many more considerations, referencing many more interesting resources, and is overall a must-watch if you want to get better at designing for accessibility. Bottom-line is that you should always fire-up a screen reader and test rigorously. ### The Process behind Redesigning Piccalilli And to cap off the tech section this week, I'd like to highlight an article from one of my favorite tech blogs, Picalilli. More precisely, it's a publication that is run by Set Studio, with Andy Bell acting as the primary writer. Picalilli's made a couple of appearances on the newsletter in the past, in [issue 57](https://www.gorillasun.de/blog/gorilla-newsletter-57/) where [they pitch in on the CSS Masonry Grid debacle](https://piccalil.li/blog/masonry-and-tabbing/?ref=gorillasun.de) (that is still an ongoing debate at this point), as well as in [issue 24](https://www.gorillasun.de/blog/gorilla-newsletter-24/) with a follow up to their iconic CSS reset article, [A more Modern CSS Reset](https://piccalil.li/blog/a-more-modern-css-reset/?ref=gorillasun.de). This week they make a return with a very special article, the third and final in a series of three, documenting the redesign of the blog, from the ground up to finishing touches, in an ongoing effort to become a more frequent and serious online publication overall: [Redesigning Piccalilli: the build processIn the final part of this redesign series we break down our approach to aspects of the production build of the incoming, new front-end.![](https://piccalil.li/favicons/apple-touch-icon.png)PiccalilliAndy Bell![](https://api.urlbox.io/v1/ln9ptArKXobLRpDQ/1874cfc836d20579415f3afb2edd3920b68b380d41108c97661757fc62a85500/png?url=https://piccalil.li/og/redesigning-piccalilli-the-build-process/&width=1024&height=526&retina=true)](https://piccalil.li/blog/redesigning-piccalilli-the-build-process/?ref=gorillasun.de) [Link to First Article](https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/?ref=gorillasun.de) | [Link to Second Article](https://piccalil.li/blog/redesigning-piccalilli-the-second-part-of-the-design-process/?ref=gorillasun.de) And this three part series is just absolute gold, since it documents the entire process it's especially insightful for my own purposes as I'm still working on the redesign of this very blog you are currently reading (I promise it'll be ready at some point), and because I've never done something like it before I'm trying to actively collect each and every piece of advice I can come across. In particular when it comes from a web design firm. I found that I'm actually doing some things the right way, such as mood boarding to find potential design direction of the project, as well as using Figma to prototype, etc. But equivalently, there's also a lot of things that I've missed. Anyway, big must-read! ### Other Cool Tech Things 1. Stefan Judis covers a [cool and mind-boggling clipboard *copy-paste* magic trick](https://www.stefanjudis.com/notes/a-clipboard-magic-trick-how-to-use-different-mime-types-with-the-clipboard/?ref=gorillasun.de) that was originally shared by Cyrus Roshan in [a post back from 2022](https://blog.cyrusroshan.com/post/explaining-copy-paste-magic?ref=gorillasun.de). Stefan explains how it works in detail, and I might just turn this one into a proper section in the next newsletter. 2. [Another update from the Ghost team on their efforts of integrating the CMS with the activity pub protocol](https://activitypub.ghost.org/archive/?ref=gorillasun.de) \- and they've made some big strides since they got started a couple of months ago. I've genuinely been eagerly awaiting their newsletter every Sunday. ## The Advent of AI Powered Code Editors The AI powered code editor *Cursor* has been making a buzz over on social media in the past weeks: it's a direct fork of VS Code that extends its capabilities with AI features, directly built into the editor itself. This essentially replaces the need for running Github copilot separately, as code completion and edits are now provided out of the box, in addition to a contextual chat that *sees* your codebase and lets you directly apply the LLM generated suggestions to your code: [Features | Cursor - The AI-first Code EditorCursor is the AI code editor.![](https://www.cursor.com/favicon.ico)logo-words![](https://portal-website-cursor-kk2b4ub2q-anysphere.vercel.app/banner.png)](https://www.cursor.com/features?ref=gorillasun.de) It does come at a cost though, but lets you try it out for 2 weeks free of charge, so it might be worth checking out. It also runs all the existing VS Code extensions that can be found on the marketplace, so you're really not missing out on anything from the regular VS Code. I have yet to try it out, but it's on my to-do list this week, I have a hunch however that it'll probably be a no-brainer since I already use LLMs on a daily basis for all sorts of tasks - recently I've been especially impressed by Claude Sonnet 3.5 for programming purposes. But I'm not alone with that, unarguably many programmers already use LLM's for programming purposes - the StackOverflow Developer Survey that came out earlier this year shows that 61% of programmers are already using AI in their development process, so it just makes sense to directly incorporate AI within the code editor and perfectly fill out this latent market gap: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-22.38.17.png)](https://survey.stackoverflow.co/2024/ai/?ref=gorillasun.de) [Link to the AI section of the StackOverflow Developer Survey](https://survey.stackoverflow.co/2024/ai/?ref=gorillasun.de) Cursor's already been labeled as the "VS Code Killer" - and that might just be the case considering that it's raised 60$ million in funding in the first 2 months after launching, with the majority of funding coming directly from OpenAI. Regardless of that however, I can definitely see that this will be the new status quo when it comes to the code editors of the future. The influential Andrej Karpathy voices his thoughts on that matter with a Tweet of his, basically stating that he can't imagine going back to programming without AI powered assistance - it does however also raise concerns about the future generations of programmers that don't have to go through learning how to code "the hard way": ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-22.48.18.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-25-at-23.04.00.png) ****I basically can't imagine going back to "unassisted" coding at this point** | [Link to Thread](https://x.com/karpathy/status/1827143768459637073?ref=gorillasun.de) ## Music for Coding This week I've got an album with historic significance for you; Sacbé is Mexico's very first fusion band, and their titular album is nothing short of a masterpiece that holds very strong even in 2024 - I found an [interview with Enrique Toussaint](https://www.favoriterec.com/2020/08/sacbe-interview/?ref=gorillasun.de) that recounts the initial days of the band, and how they arrived at their very tight and dynamic sound, a perfect read while listening to the album: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 69Artificial Life Simulations - Tensor Fields for City Map Generation - Who is an Artist in the Software Era - Tiny Glade Release - Random Injections in Sorting Algorithms - The Free Mint Meta - 10 Years of Dear Imgui - The CSS5 Era - Trainable Neural Network in tldraw![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/08/snakess-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-69) *And a backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 69 URL: https://www.gorillasun.de/blog/gorilla-newsletter-69/ Last updated: 2024-08-24T15:39:59.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 69th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Artificial Life Environment aka A.LI.EN ALIEN is not only the most massive artificial life simulation out there, but also one of the longest ongoing software projects of that kind that I'm aware of; finding its beginnings with a [paper](https://link.springer.com/article/10.1007/s00287-007-0205-1?ref=gorillasun.de) of the same name back in 2008, it's been Christian Heinemann's brainchild ever since. A timeline over on the project's official page indicates that the first version of the software was released to the public in 2018, a decade after the initial paper had been published: [artificial life environmentArtificial LIfe ENvironment (ALIEN) is an artificial life simulation tool based on a specialized 2D particle engine in CUDA for soft bodies and fluid-like media. Each simulated body consists of a network of particles that can be enriched with higher-level functions, ranging from pure information processing capabilities to physical equipment (such as sensors, muscles, weapons, constructors, etc.) whose executions are orchestrated by a signaling system. The bodies can be thought of as agents or digital organisms operating in a common environment.![](https://www.alien-project.org/assets/favicon.ico?v=2021070601)![](https://www.alien-project.org/media/images/molecule1large.png)](https://www.alien-project.org/index.html?ref=gorillasun.de) To explain ALIEN in a few words, it's essentially a massive particle based simulation engine that models digital organisms within an artificial ecosystem. The digital organisms in these simulations are modeled as particle clusters (networks/graphs of connected nodes) that emerge in an entirely evolutionary manner, replicating and re-configuring themselves autonomously to adapt to the environmental conditions that they're faced with. While I won't claim to understand a lot of the complexities of the project, skimming over the [docs](https://alien-project.gitbook.io/docs?ref=gorillasun.de) does reveal a little bit more about the technical details behind how it all works. The engine that powers ALIEN is structured in multiple layers, each of which handles a particular aspect of the simulation. For instance, the computation of physical interactions between particles is entirely decoupled from the information processing layer that's required for modeling the more complex behaviors that can arise between the different types of particles: [Simulation model | ALIEN DocumentationWarning: This documentation is out of date and does not describe the behavior of the latest major version 4, which implements a new model. An up-to-date documentation can be found in the program help.![](https://2013985295-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fe8K9QsJfEYh4t8JJKucG%2Ficon%2F3tENOeKqlVjTBaCSPhYm%2Fprofile2.png?alt=media&token=25956920-1cba-457a-961b-fb5f36d39e56)ALIEN Documentation![](https://2013985295-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fe8K9QsJfEYh4t8JJKucG%2Fsocialpreview%2FXVMaPGwMC5orbRSxihGa%2Fversion3.png?alt=media&token=9023db0e-1037-4e3b-8ac7-f711a1eb3c90)](https://alien-project.gitbook.io/docs/fundamentals/simulation-model?ref=gorillasun.de) The software can handle millions of particles at a time, by virtue of being programmed in OpenGL and being CUDA accelerated. As for the digital organisms themself, the particles that composite them are unsurprisingly called cells, that are made out of programmable properties and functions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-18-at-14.12.18.png)](https://alien-project.gitbook.io/docs/fundamentals/basic-notion?ref=gorillasun.de) But that's just scraping the tip of the iceberg, there's a lot more cool stuff to it, I recommend exploring the docs for yourself (they might be a bit out of date because the latest version of the software just introduced a number of new updates). A recent big milestone for the project that put it on my radar again, was it winning the Virtual Creature Competition prize at this year's [ALIFE conference](https://2024.alife.org/?ref=gorillasun.de) \- and deservedly so, the trailer video is nothing short of stunning, also showcasing many of the fascinating emergent virtual creatures: Beyond that, the software is also open-source and available under the BSD-3-Clause license - you can find the GitHub repo here: [GitHub - chrxh/alien: ALIEN is a CUDA-powered artificial life simulation program.ALIEN is a CUDA-powered artificial life simulation program. - chrxh/alien![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubchrxh![](https://repository-images.githubusercontent.com/305438235/61a0bdf2-3283-446c-9a4a-24d96b3ff441)](https://github.com/chrxh/alien?ref=gorillasun.de) ### Procedural Street Modeling with Tensor Fields Coincidentally, this week I also came across another interesting paper back from 2008 titled [Interactive Procedural Street Modeling](https://www.sci.utah.edu/~chengu/street%5Fsig08/street%5Fproject.htm?ref=gorillasun.de), that revolves around leveraging tensor fields for the purpose of modeling realistic road networks that resemble real-life city maps. This rabbit hole ensued from a post over on the r/procedural subreddit that showcases a short GIF where a tensor field is transformed into such a city map: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-23.16.58.png)](https://www.reddit.com/r/proceduralgeneration/comments/1etyjbh/city%5Fmap%5Fgeneration%5Fusing%5Ftensor%5Ffields/?ref=gorillasun.de) [Link to Reddit Post](https://www.reddit.com/r/proceduralgeneration/comments/1etyjbh/city%5Fmap%5Fgeneration%5Fusing%5Ftensor%5Ffields/?ref=gorillasun.de) Here you might ask, what are Tensor fields? And how do we actually turn them into road maps? Starting with a single tensor, it's basically a small 2x2 matrix that draws its values from an angle in an underlying scalar field. Arranging many of these tensors together, we get a tensor field—nothing more than a grid where each point holds its own tensor. The interesting part here is that each one of these tensors describes its own eigenvector, which reveals the principal directions in which the tensors have the most influence - in other words, the direction in which the tensor is exerting some amount of force. If we now follow these directions, we can trace lines through the tensor field more commonly referred to as hyperstreamlines. This probably sounds a lot like a flowfield at this point, but there's some differences; in a regular vector field a streamline is a curve that is tangent to the vector field at every point. Meaning that streamlines show the path that a particle would follow if it moved along the flow of the vector field. Attaching "hyper" as a prefix to the term extends the concept of a streamline to more complex fields, where individual points can describe multiple directions and magnitudes, and in turn require more complex representations. Long story short, hyperstreamlines are tangent to one of the principal directions indicated by a tensor at each point in the field - we then use these lines to define the layout of roads and blocks in the city map. If you want a comprehensive resource about eigenvalues and eigenvectors in video format, I highly recommend 3blue1brown's in depth explanation: The use of tensor fields is thus an elegant solution for the purpose of city maps, as it naturally accommodates the dual-directional nature of urban street layouts. Looking into the topic a bit more I came across another reddit post, from 4 years ago, that tackles the same topic but with the added perk of having a comment section where some of the involved notions are discussed in more detail: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-23.47.31.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-23.33.40.png) [Link to Post](https://www.reddit.com/r/proceduralgeneration/comments/g22yhy/city%5Fmap%5Fgeneration%5Fusing%5Ftensor%5Ffields%5Fnow%5Fwith/?ref=gorillasun.de) Just as an interesting aside, before explaining their own approach the authors of the paper also point out a previous method described in a 2001 paper, which leverages L-systems for the purpose of modeling cities procedurally: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-18-at-13.52.03.png)](https://cgl.ethz.ch/Downloads/Publications/Papers/2001/p%5FPar01.pdf?ref=gorillasun.de) [Link to Paper](https://cgl.ethz.ch/Downloads/Publications/Papers/2001/p%5FPar01.pdf?ref=gorillasun.de) ### Who is an “Artist” in Software Era I was going to cram this one into the AI Corner section based entirely on the title of the post, but after giving it a read it definitely pertains to generative art in general. [Dr. Lev Manovich](https://manovich.net/index.php/about?ref=gorillasun.de) shares the second Chapter of a book that he's currently in the process of writing, titled "Artificial Aesthetics: Generative AI, Art and Visual Media" it tackles several of the contemporary issues and open ended questions that arise around these related fields. Titled "Who is an “Artist” in Software Era?" the second chapter of the book raises important questions around the nature of creativity in this digital age, in particular the role that AI plays in it. Manovich explains that we need to reconsider the criteria by which we judge artistic achievement, especially as digital tools increasingly mediate the creative process - today's digital media externalize the creative process into discrete, programmable steps, fundamentally altering how art is produced and learned: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-15.15.13.png)](https://x.com/manovich/status/1824451812814160124?ref=gorillasun.de) [Link to Tweet](https://x.com/manovich/status/1824451812814160124?ref=gorillasun.de) Given this context, Manovich also questions what it would mean for an AI to compete with human artists. Should AI strive to replicate the creative processes and outcomes of a pre-digital era, or should it be measured against contemporary digital practices? Furthermore, should we consider AI that assists human creativity as part of the evaluation? Manovich implicitly calls for a broader, more nuanced discussion about the intersection of technology, creativity, and aesthetics in the 21st century. I also recommend checking out his website where he shares more of his writing: [Lev ManovichLev Manovich: photos, bio, complete CV.![](https://manovich.net/favicon.ico)manovich![](https://manovich.net/content/01-about/dsc_1880_-edit-square_max.jpg)](https://manovich.net/index.php/projects/who-is-an-artist-in-ai-era?ref=gorillasun.de) ### Tiny Glade Release + Graphics Programming Conference 2024 If you're a fan of Townscaper, a relaxing town building sandbox game, that I believe to be well known in the genart scene, you'll have to mark your calendar, because a new game of this kind is coming to... town! (ba-dum-ts 🥁) Tiny Glade! Being one of the most anticipated games over on Steam with over a million wishlists at this point in time, it's bound to be a gigantic hit right from day one! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-14.29.30.png) [Link to Tweet](https://x.com/PounceLight/status/1824117060953088420?ref=gorillasun.de) I've been following Tiny Glade's development for the past couple of years now; whenever one of its two creators Tomasz Stachowiak ([@h3r2tic](https://x.com/h3r2tic?ref=gorillasun.de)) & Anastasia Opara ([@anastasiaopara](https://x.com/anastasiaopara?ref=gorillasun.de)) showcase a progress video on Twitter, I've just been completely blown away by the seemingly magical proceduralism of the game and the incredibly satisfying manner in which geometries adjoin each other seamlessly. If you'd like to learn about the story behind Tiny Glade, the early days, some of the challenges the duo has faced and a little bit about the technical bits, like the game-engine that's used and how it works, an interview with them was published earlier this year over on the 80 level website: [Tiny Glade Developers on Bevy, Proceduralism, Publishers & Cozy GamesTo celebrate the release of Tiny Glade’s demo version, Pounce Light’s Anastasia Opara and Tomasz Stachowiak have joined 80 Level to discuss the game’s history, proceduralism, Bevy, Rust, self-publishing, and the “cozy games” genre.![](https://cdn.80.lv/static/images/favicons/80lv/apple-touch-icon.png)80lvPounce Light![](https://cdn.80.lv/api/upload/meta/34065/images/665603eda6756/contain_1200x630.jpg)](https://80.lv/articles/exclusive-tiny-glade-developers-discuss-bevy-proceduralism-publishers-cozy-games/?ref=gorillasun.de) As an added bonus, through Tiny Glade's upcoming launch I also learned about the Graphics Programming Conference that's going to be held later this year in November - and from what it looks like it's going to include more than a few interesting talks about computer graphics, one of them about some of the tech behind Tiny Glade, you can learn more here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-14.28.42.png) [Link to Tweet](https://x.com/h3r2tic/status/1813197502411092186?ref=gorillasun.de) [Graphics Programming ConferenceGraphics Programming Conference (GPC) is a new, international conference for real-time and interactive graphics programming.![](https://www.graphicsprogrammingconference.nl/wp-content/uploads/2024/05/cropped-GPC_Logo_01-270x270.png)Graphics Programming Conference![](https://www.graphicsprogrammingconference.nl/wp-content/uploads/2024/05/Social-Embed.png)](https://www.graphicsprogrammingconference.nl/?ref=gorillasun.de) ### Matt Henderson's Algorithmic Experiments On this week's episode of how to torture your sorting algorithm; Matt Henderson probes how different sorting algorithms react to injections of random values, while they are in full swing. The resulting animations are surprisingly satisfying to watch, as the algos eagerly try to bring order to the seemingly unsatisfyable data that they're operating on: 0:00 /0:27 1× [Link to Tweet](https://x.com/matthen2/status/1824454320215167346?ref=gorillasun.de) I believe it a big missed opportunity to not have made a sonified version of these as well for endless procedural music 😛. While you're at it, make sure to check out Matt's profile, there's more than a few interesting experiments worth taking a second to look at. ### Other Cool Generative Things 1. Quick reminder that most [talks given at the July 2024 genart summit in Berlin](https://x.com/Foundation%5FHWF/status/1824877625271259448?ref=gorillasun.de) have now been released over on Youtube. 2. [Inigo Quilez has also been making YouTube shorts](https://youtube.com/shorts/6fgqQ65YFqU?si=QQjW5iZq%5FllYC0Rs&ref=gorillasun.de) to showcase interesting tidbits; his most recent shows the interesting patterns that emerge when the pixels of an image, in raster order, are re-ordered along a Hilbert curve. 3. [Yohei Nishitsuji](https://x.com/YoheiNishitsuji/status/1787226428079292903?ref=gorillasun.de) is yet another Japanese code golfing wizard, who's Tsubuyaki GLSL tweets have made quite the buzz - check out some of them. 4. [Lygia's ](https://x.com/patriciogv/status/1824817561495580958?ref=gorillasun.de)[p5js](https://x.com/patriciogv/status/1824817561495580958?ref=gorillasun.de) [raymarching demo gets an update](https://x.com/patriciogv/status/1824817561495580958?ref=gorillasun.de). ## The Free Mint Meta In light of Foundation's Rodeo taking off in the past weeks, a big polarized discussion around this type of micro-mints has taken shape; while some artists have wholeheartedly embraced free mints, others have expressed themselves negatively towards the paradigm. After all it makes sense, distributing your work with a virtually limitless supply and at a negligible fee does not bode well for the value of past and upcoming works. The question then is, what purpose do free mints actually serve? Bruce voiced his thoughts on the matter and tries to answer this question, he explains that free mints can actually be approached as a means to enhance the value of an artist's body of work, instead of being a detriment to it, when leveraged the right way - community building and long-term engagement being key in this scenario: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-14.30.11.png)](https://x.com/StudioYorktown/status/1824542036269342755?ref=gorillasun.de) [Link to Bruce's Tweet](https://x.com/StudioYorktown/status/1824542036269342755?ref=gorillasun.de) Some of the lengthy replies to Bruce's post remain skeptical however. Others have chimed in as well and pitched their own thoughts: Marius Watz provides a different point of view, explaining that artists can repurpose these platforms to express a different body of work from what they usually do, Sofia Garcia and Jamie Gourlay also ask interesting questions on that matter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-14.46.02.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-17-at-14.30.59.png) [Link to Marius Watz' Thread](https://x.com/mariuswatz/status/1824740767169966275?ref=gorillasun.de) | [Link to Jamie Gourlay's Tweet](https://x.com/jamiegourlay/status/1824533851915296794?ref=gorillasun.de) | [Link to Sofia Garcia's Tweet](https://x.com/sofiagarcia%5Fio/status/1824508020577144884?ref=gorillasun.de) ## Tech and Web Dev ### 10 years of Dear ImGUI If you're not familiar with Dear ImGui,it's an open-source, lightweight, and highly customizable graphical user interface library that's primarily used in the development of tools and applications where a quick and flexible UI is needed. With nearly 60k stars, it currently is the 13th most bookmarked Github repo overall - and is pretty much the industry standard when it comes to create editor tools, debug interfaces, and in-app menus. The term imgui is short for Immediate-Mode Graphical User Interfaces which was first conceived by Casey Muratori - [there's a famous talk from him back from 2005](https://www.youtube.com/watch?v=Z1qyvQsjK5Y&ref=gorillasun.de) where he explains the paradigm, but in essence it means that the interface elements are constructed and rendered in real-time, every frame, based on the current state of the application The initial version of Dear ImGui was released exactly ten years ago, on August 11th 2014, it's creator [Omar Cornut](https://www.miracleworld.net/?ref=gorillasun.de) ([@ocornut](https://x.com/ocornut?ref=gorillasun.de)) wrote a lengthy and deeply insightful post to commemorate and celebrate this milestone - naturally in form of a Github issue on the repo itself - where he shows some stats, recounts the early days, and provides reflections on the past 10 years of maintaining a software project of this scale: [10 years of Dear ImGui (long post) · Issue #7892 · ocornut/imgui10 years of Dear ImGui 🎉 On August 11, 2014, I published v1.00 of Dear ImGui on GitHub. I thought I would take the occasion to reflect about it, share some data points and stories, and generally th…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubocornut![](https://opengraph.githubassets.com/309df68b759ab4dbb693af6072013aaf222e52c0ed96688d3f4ad07724389cdb/ocornut/imgui/issues/7892)](https://github.com/ocornut/imgui/issues/7892?ref=gorillasun.de) ### It's Time to Talk about CSS5 A recent article published over on Smashing Magazine titled "It's time to talk about CSS5" immediately hooked me — what do you mean CSS5? What happened to CSS4? Wasn't CSS3 the last major update to the language in... wait, let me check my calender — 2012? Those are the questions that Brecht De Ruyte tries to address with his article, pointing out the lack of a cohesive and recognizable way to define the evolution of the tech since the CSS3 era — some of the features that were introduced over 10 years ago are still frequently described as being "modern", which is to say that the term CSS3 is a bit meaningless nowadays: [It’s Time To Talk About “CSS5” — Smashing MagazineHave you ever wondered what happened after CSS3? It’s common knowledge that we never saw CSS4 come after it, yet we have a plethora of new features that have no similar way of defining when they were introduced. The W3C CSS-Next community group is actively searching for better approaches for how we describe the evolution of CSS over time and identify feature sets as effectively as we did with CSS3 way back in 2009 — and you can help.![](https://www.smashingmagazine.com/images/favicon/favicon.svg)Smashing MagazineBrecht De Ruyte![](https://files.smashing.media/articles/time-to-talk-about-css5/time-to-talk-about-css5.jpg)](https://www.smashingmagazine.com/2024/08/time-to-talk-about-css5/?ref=gorillasun.de) This is where CSS-Next comes in; the article introduces it as a community driven initiative to create CSS "eras" and categorize the features that have been introduced over the past decades by the eras in which they have been introduced. By defining these eras, it becomes easier for everyone involved in web development to keep up with CSS changes, much like how CSS3 once encapsulated a significant leap forward in web styling capabilities. This proposal is therefore not just about versioning for the sake of it; it's about creating a framework that developers, educators, and employers can easily understand and use. This would also acknowledges that CSS is a living language, constantly evolving with new features that need to be recognized in a structured way. The overarching challenge will be in the adoption of these new terms however. The success of CSS3 was partly due to its strong branding and the significant leap it represented at the time. For CSS4, CSS5, and beyond to gain similar traction, the community will need to see value in these distinctions. This is where marketing and education will play a crucial role—ensuring that these new "eras" are not just technically accurate but also widely recognized and adopted. The article ends with a call to action, asking developers to weigh in with their own thoughts on the matter and join the CSS-Next group. If you want to read more about this, two important posts are Jen Simmons issue that was opened back in 2020 over on the w3c repo: [Let’s Define CSS 4 · Issue #4770 · w3c/csswg-draftsIt’s come up quite a few times recently that the world of people who make websites would greatly benefit from the CSS Working Group officially defining ”CSS 4”, and later “CSS 5“, etc. Chris Coyier…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubw3c![](https://opengraph.githubassets.com/10c7f5b21b0fcb08194903821b930457f8a70c49d90d14f3b78c1f8ec12592bd/w3c/csswg-drafts/issues/4770)](https://github.com/w3c/csswg-drafts/issues/4770?ref=gorillasun.de) As well as this article over on CSS-Tricks, fittingly titled CSS4: [CSS4 | CSS-TricksWhat is CSS4? Is it a real thing? I hate to break it to you, but not really. But maybe we could make it a thing? CSS3 was successful, so why not keep that train rolling like they do in JavaScript?![](https://css-tricks.com/favicon.svg)CSS-TricksChris Coyier![](https://css-tricks.com/wp-json/social-image-generator/v1/image/302215)](https://css-tricks.com/css4/?ref=gorillasun.de) ## AI Corner - Trainable Neural Network in tldraw If you're not familiar with [tldraw](https://github.com/tldraw/tldraw?ref=gorillasun.de), it's a library for creating infinite canvas experiences for the web - basically a digital whiteboard onto which you can scribble down diagrams as well as create flowcharts of all sorts, and is simultaneously very customizable. TwiX user Dennis is the creator of [holograph.so](https://www.holograph.so/?ref=gorillasun.de); a visual programming language that is built on top of tldraw - it's a bit reminiscent to Samuel Timbo's [Unit](https://x.com/io%5Fsammt?ref=gorillasun.de), minus the physics part, that I featured in [issue #38 of the newsletter](https://www.gorillasun.de/blog/gorilla-newsletter-38/). In his most recent endeavor Dennis succeeds at the impressive feat of creating a fully functioning and trainable neural network, entirely within the constraints of the visual framework he's created: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-18-at-10.59.04.png)](https://x.com/dennizor/status/1824075908120035460?ref=gorillasun.de) [Link to Tweet](https://x.com/dennizor/status/1824075908120035460?ref=gorillasun.de) On a related AI note, last year tldraw released an AI powered feature that made quite a buzz, titled "[make real](https://makereal.tldraw.com/?ref=gorillasun.de)" it let you magically generate websites from your hand-drawn diagrams. You can [read about it here](https://tldraw.substack.com/p/make-real-the-story-so-far). ## Music for Coding Artifacts is a real treat of an album, blending soulful jazzy sounds with hip-hop elements to create a thick lo-fi vibe that's hard not to get lost in. After some digging, I found out that SLUG isn't just one artist but rather a collective of musicians from the US and Europe, that work together under their own record label called Coleslaw Records - and they’ve already got a [solid catalogue over on Bandcamp](https://www.youtube.com/watch?v=eenLTTYn%5Fxw&ref=gorillasun.de) if you want to listen to more of them. But anyway, that's beside the point, enjoy these phenomenally jazzy sounds: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 68Interactive Physarum Simulation - Visualizing the Olympics - WebGPU Unleashed - Sound & The Fourier Transform - AutoAlbers, Nectar, and a Gradient Generator - Metamagic of Mathematics - Pxlshrds Conversations - The Secret Mechanisms of CSS - EU AI Act![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/08/batt.png)](https://www.gorillasun.de/blog/gorilla-newsletter-68) *And backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 68 URL: https://www.gorillasun.de/blog/gorilla-newsletter-68/ Last updated: 2024-08-12T16:35:55.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 68th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Interactive Physarum Simulation by Deniz Bicer Physarum simulations are a popular type of particle-based algorithm in digital morphology, designed to recreate the behavior of [slime mold](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de)[s](https://en.wikipedia.org/wiki/Physarum%5Fpolycephalum?ref=gorillasun.de) in a digital setting. The algo was originally described by Jeff Jones in his 2010 paper titled "[Characteristics of pattern formation and evolution in approximations of Physarum transport networks](https://uwe-repository.worktribe.com/output/980579/characteristics-of-pattern-formation-and-evolution-in-approximations-of-physarum-transport-networks?ref=gorillasun.de)", and later brought to popular attention in the generative art/creative coding space by Sage Jenson ([@mxsage](https://x.com/mxsage?ref=gorillasun.de)), with an iconic [blog post](https://cargocollective.com/sagejenson/physarum?ref=gorillasun.de) of his published in 2019. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-11-at-16.23.28.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-11-at-16.24.22.png) [Jeff Jones 2010 Paper](https://uwe-repository.worktribe.com/output/980579/characteristics-of-pattern-formation-and-evolution-in-approximations-of-physarum-transport-networks?ref=gorillasun.de) | [Sage Jenson's 2019 Blog Post](https://cargocollective.com/sagejenson/physarum?ref=gorillasun.de) Recently a Tweet by Deniz Bicer made the rounds over on Twitter, in which she shares her own version of the growth pattern sim with the additional twist that it can be fine-tuned with 3 intuitive sliders that control the behavior of the agents tracing out the emergent patterns. [In a thread](https://x.com/ojelibalon/status/1820839257793233164?ref=gorillasun.de) of hers she explains all of the details: 0:00 /0:22 1× [Link to Thread](https://x.com/ojelibalon/status/1820839257793233164?ref=gorillasun.de) If you're curious about how the Physarum algorithm works, here's a quick breakdown. Similarly to other particle based simulations that model a collective behavior, say a flocking algorithm à la Boyd, the individual agents in the Physarum sim also follow a few simple rules: 1. **Sensing:** Each agent (representing a part of the slime mold) senses its environment by detecting the concentration of a substance (often referred to as "food" or "nutrients") in its vicinity. The agent typically samples the environment in multiple directions (in a specific radius in front of it) to determine where the highest concentration of the substance is located. 2. **Movement:** Based on the sensing step, the agent moves toward the direction with the highest concentration of the substance. This movement is often biased towards areas with more nutrients but can also include randomness to simulate natural exploration. The movement is also be influenced by a trail of a chemical substance (like pheromones) left behind by other agents, creating a feedback loop where the slime mold reinforces paths that lead to abundant resources. 3. **Deposition:** After moving, the agent deposits a small amount of a chemical substance (often called "slime" or "pheromones") onto the trail it has just traveled. This trail influences other agents by guiding them toward regions with higher concentrations of the deposited substance. And over time, the slime mold forms a network of trails that efficiently connects the resource points. Naturally, this becomes slightly more complicated in code as it is stated here in natural language. This parametric system then creates intricate, vein-like networks, as agents reinforce successful paths and abandon less efficient ones, leading to the emergence of complex, organic patterns. In Deniz's version of the algo, the sliders let you control the sensor angle and radius (by which the agents determine where to go next) as well as the step size of their movement. And it's actually quite addictive to play with, here's a pattern I configured: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-09-at-19.30.46.png)](https://denizbicer.com/202408-UnderstandingPhysarum.html?ref=gorillasun.de) You can try out the interactive simulation for yourself over on Deniz's blog, here's a [link](https://denizbicer.com/202408-UnderstandingPhysarum.html?ref=gorillasun.de) If you'd like to have an explainer in video format however, you should check out Patt Vira's tutorial on the topic - fun fact, it is now headlining the new P5 site's tutorial section: ### Krisztina Szűcs Visualizing the Olympics Although I'm not big on sports, I couldn't help noticing Krisztina Szűcs recent data visualizations that summarize some of the events at the 2024 Olympic games held in Paris. For someone like me, that doesn't have the patience to sit through the entirety of these events, I really appreciated the creative and condensed manner in which Krisztina's visualizations convey the final results - my favorite probably being the one she did for the women's high jump final, where the choreographed animation also introduces some of the suspense and anticipation that you'd normally feel watching the event live: 0:00 /0:32 1× [Link to Tweet](https://x.com/szucsi/status/1820218352251666762?ref=gorillasun.de) And this isn't actually the first time that Krisztina attempts this, here's a post of hers back from 2022 where she shares some of her previous sports visualizations she's made for events in recent years: [Animated sport results - Krisztina Szucs - Data Visualization Designer PortfolioThis post is a summary of the animated data visualizations I’ve created for UEFA Euros 2020, Copa America, Tokyo 2020 Summer Olympics (fencing, swimming), 19th FINA World Championships Budapest 2022 (swimming), Beijing 2022 Winter Olympics (ice hockey), Handball World Championship 2021, Roland Garros and Wimbledon 2022 (tennis).![](https://krisztinaszucs.com/favicon-1.ico)Animated sport results by Krisztina SzucsKrisztina Szucs![](https://krisztinaszucs.com/blog/20220829_gif/img/cover-04.jpg)](https://krisztinaszucs.com/blog/20220829%5Fgif/index.html?ref=gorillasun.de#swimming) While data viz is in of itself already a big challenge, where the visuals need to capture the essence of the data, it becomes even more interesting with these different sports categories; since each sport has its own set of rules and unique way of being scored, there's no "one-fits-all" type of plot that can be re-used. In a way they create their own data viz affordances. For instance, Krisztina leverages the fact that Handball, Soccer and Fencing are scored in relatively similar manner, as a chronology of points attributed to the two teams/opponents, creating an entirely new type of chart that she calls "timeline triangles". With these types of visualizations even I might come to enjoy the Olympic games - definitely also check out [Krisztina](https://x.com/szucsi/?ref=gorillasun.de)'s twitter for more data viz goodness. ### WebGPU Unleashed by Shi Yan If you've for some reason been in a coma in the past two years and this is the first time that you hear about WebGPU, buckle up! It's a modern, low-level graphics API designed to provide high-performance access to GPU resources for rendering 3D graphics and performing general-purpose computing tasks (including machine learning and/or complex calculations) directly on the GPU. It is developed as part of the W3C initiative and is meant to be a successor to WebGL, offering overall more advanced features and better performance. The [MDN web docs](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU%5FAPI?ref=gorillasun.de)[ provide a comprehensive resource](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU%5FAPI?ref=gorillasun.de) to that end. If you want something a little bit more accessible though than MDN, you'll have to check out this free book recently published by Shi Yan (which is also the entire reason for this section) that goes over the in and outs of the tech: [WebGPU Unleashed: A Practical TutorialWebGPU Unleashed, your ticket to the dynamic world of graphics programming. Dive in and discover the magic of creating stunning visuals from scratch, mastering the art of real-time graphics, and unlocking the power of WebGPU - all in one captivating tutorial.![](https://shi-yan.github.io/webgpuunleashed/favicon.ico)![](https://shi-yan.github.io/webgpuunleashed/meta.png)](https://shi-yan.github.io/webgpuunleashed/?ref=gorillasun.de) Skimming a little through the different sections it immediately gave me big "Book of Shaders" vibes; it's written in a very approachable manner and seems to explain things in a way such that it doesn't get too overwhelming. It also provides a copious amount of examples throughout that you can run a tweak directly as code playgrounds. Did I mention that it's free? ### Sound & The Fourier Transform Sebastian Lague is back with another installment in his coding adventure series, this time the video revolves entirely around processing sound in various manners; from reading .wav files, to simulating a virtual microphone, all the way to generating signals and implementing the Fourier transform that visualizes the constituent frequencies of an audio signal. Sound processing is a fascinating and challenging task for computers due to how densely audio signals need to be represented in their discretized form for them to make sense to the human ear - as always, Sebastian's video is an educative treasure trove in that regard: You can also support Sebastian on Pateron to get access to the source code of his experiments. My personal highlight of the video was definitely the simulated virtual speaker + microphone where he repurposes his fluid simulation ([covered in a video from a few months back](https://www.youtube.com/watch?v=rSKMYc1CQHE&ref=gorillasun.de)) so that the particles behave more like air. The virtual speaker then vibrates causing the particles to move along with the pressure waves emitted, to have the microphone sample this simulated pressure to recreate the original signal. I don't think I've ever seen something like it, and it's crazy that it actually works (regardless of how slow it needs to be run). ### A Bunch of New Color Tools David Aerne, who you might remember from [issue #56](https://www.gorillasun.de/blog/gorilla-newsletter-56/) in which I featured his RYBitten project, is back, with not one, but two new color tools - the first one is called AutoAlbers, and puts creative generative spin on color generation with a visual twist inspired by the Albers effect. The **Albers effect** refers to a visual phenomenon described by the artist and educator Josef Albers in his book *"Interaction of Color"* (1963). In his work he illustrates how the perception of color is relative and influenced by surrounding colors, leading to changes in how a color appears based on its context: > If one dips one's left hand into cold water, the other into warm water and then both hands into lukewarm water, one will perceive this water with the right hand as cold, the left hand as warm. It is the same with color. \~ [Sarah Wittig](https://www.kunstpalais.de/en/147/Josef-Albers:207.html?ref=gorillasun.de) David's tool generates a band of colors that bleed into each other mesmerizingly with an interesting sort of blur - I don't have the first clue as to how that effect is achieved: [Exploring Color and Perception: A Generative Art ProjectDive into a generative art project inspired by Josef Albers’ study of color perception. Experience dynamic, algorithmically generated color compositions.![](https://albers.elastiq.ch/vite.svg)AutoAlbersDavid Aerne / Meodai![](https://albers.elastiq.ch/share.png)](https://albers.elastiq.ch/?ref=gorillasun.de) As for the other tool, David basically made a classic image color picker, that lets you samples colors directly in your browser, without having to upload the image to some server - your browser itself does all of the heavy lifting which is pretty neat: [Nectar - Extract Colors from ImagesCreate stunning color palettes from your images. Nectar extracts colors and generates a harmonious color scheme.![](https://nectar.color.pizza/favicon.svg)Nectar![](https://nectar.color.pizza/preview.png)](https://nectar.color.pizza/?ref=gorillasun.de) The other tool that I want to highlight is from Eric Kennedy that lets you generate beautiful gradients and easily copy them in CSS & SVG format. The cool thing about this particular generator is the manner in which these gradients are generated without having dead "gray-zones" - Eric explains how his generator achieves this in the text underneath the tool: [Gradient Generator ToolCreate & export linear, radial, & conic gradients. Automatically creates vivid, colorful gradients. One-click CSS or SVG (drag-and-drop into Figma, Sketch, Canva, etc).![](https://www.learnui.design/tools/favicon.ico)![](https://learnui.design/tools/img/og-gradient.png)](https://www.learnui.design/tools/gradient-generator.html?ref=gorillasun.de) ### Other Cool Generative Things - Similarly to Sebastian Lague, Maxime Heckel also updates us every few months with one of his stellar deep dives - his most recent article revolves around [dithering with shaders and how to apply them as a post processing filter to existing scenes](https://blog.maximeheckel.com/posts/the-art-of-dithering-and-retro-shading-web/?ref=gorillasun.de). - Barney Codes posted a [new video that breaks down image distortion effects with shaders](https://www.youtube.com/watch?v=ZcRptHYY3zM&ref=gorillasun.de) in a beginner friendly way. - [Monk made a (moderately controversial) diagram that categorizes/hierarchizes some of the terms that we use today for the different generative practices](https://x.com/monkantony%5Ftez/status/1821463834139275733?ref=gorillasun.de) \- while not everyone agreed it sparked a number of interesting discussions. - On September 6th the [Weaving Past & Present Pattern Language Symposium](https://kunstbygda.no/pattern-language?ref=gorillasun.de) will be held at Norsk Reiselivsmuseum in Balestrand Norway, including a few familiar generative artists. If you're there you might want to stop by. ## Web3 News ### The Matemagic of Mathematics In [issue #62](https://www.gorillasun.de/blog/gorilla-newsletter-62/) I mentioned the "Awaken, MetaMagic Hands" exhibition that's currently in full swing at the Gazelli Art House over in London. It brings together a number of the second wave pioneers of genart to showcase their works, under the co-curation of none other than John Maeda. The exhibition also serves as a critical lens to address a number of important topics related to the current state of the generative art market - in an insightful RCS interview Bronac Ferran lets us in on some of the participating artists' thoughts: [The Metamagic of MathematicsA pioneering generation of artists discusses the creative power of computation with Bronac Ferran![](https://cdn.prod.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)RCS![](https://cdn.prod.website-files.com/61e6c06a23cb13bf76051194/66b0ea2cae88223f221a2816_Screenshot%202024-08-05%20at%2017.05.08.png)](https://www.rightclicksave.com/article/the-metamagic-of-mathematics-generative-art-interview-john-maeda-joshua-davis-golan-levin-lia-gazelli-art-house?ref=gorillasun.de) To give a brief recap: - Joshua Davis states that NFTs have arguably been the catalyst for the generative art explosion that we've witnessed in recent years, but also expresses concerns over the commercialization thereof - many players might have only joined for the "gold rush" but not the art movement. But on the flip-side, Joshua Davis also seems to be generally enthusiastic about the affordances that NFT tech has created around generative art and how it has enabled. - LIA echoes both the positive and negative sentiment, lamenting that the commercial aspect has also stifled experimental freedom. - Golan Levin critiques the current state of software art in relationship to the commercial aspect: "I prefer to think about the art itself, independent of its saleability, and I don’t like the way that art warps itself to accommodate marketplaces." - As for John Maeda, [we've already covered his views](https://www.gorillasun.de/blog/gorilla-newsletter-66/) in a recent issue, he finds advancements in AI exciting as they reduce the necessity for mathematical expertise in computational art. But that's just a few of my own takeaways from the interview, highly recommend reading through all of it. ### Pxlshrd's Conversations Pxlshrd makes a big return with a new genart project titled [Conversations](https://x.com/pxlshrd/status/1820849909131542816?ref=gorillasun.de) that's bound to release on Verse soon. With this segment I'd like to highlight the beautiful narrative that's spun around the project; Pxlshrd wrote a wonderful [essay](https://pxlshrd.xyz/conversations-essay.html?ref=gorillasun.de) that captures his thoughts, influences, and state of mind behind the project - it's a beautifully written piece about change, nature, music and how all of these play a role in the artwork: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-10-at-12.28.05.png)](https://pxlshrd.xyz/conversations-essay.html?ref=gorillasun.de) Pxlshrd's beautifully nostalgic website | [Link to the Essay](https://pxlshrd.xyz/conversations-essay.html?ref=gorillasun.de) Besides that, he also released music video with an original track of his, that I highly recommend giving a listen to, quality of the video and sound is absolutely stellar: Now that I'm done gushing - you might also remember that I did an interview with Pxlshrd back in October of last year, covering his artistic process at the time and the important role that music played in it. I felt that we hit it off pretty well back then, and I've continuously enjoyed seeing his code explorations on my timeline: [In conversation with pxlshrd - Between Music and GenartPxlshrd is a generative artist that draws inspiration from music. Having created an impressive number of generative pieces on fx(hash), he has a lot of insights to share on the process. This is the story of pxlshrd.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-14.36.33.png)](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/) Anyway, congrats on the new release! 🎉 ## Tech and Web Dev ### The Secret Mechanisms of CSS If you only have time for a single video this week, I'd highly recommend watching Josh Comeau's "The Secret Mechanisms of CSS": a deeply insightful talk he gave at Web à Québec 2024 (that took place back in May), but was only released a couple of days ago: [Josh Comeau](https://x.com/JoshWComeau?ref=gorillasun.de) describes himself as an "Indie hacker and educator" in his TwiX bio; but I think that it's much too humble considering how he's mastered many of the different web technologies at this point in time - I discovered his blog around a year ago and it's been a big source of inspiration and learning ever since: [CSS articlesFriendly tutorials for developers. Focus on React, CSS, Animation, and more!![](https://www.joshwcomeau.com/assets/favicon.png?v=4)![](https://www.joshwcomeau.com/images/og-default.png)](https://www.joshwcomeau.com/tutorials/css/?ref=gorillasun.de) With his talk he tries to provide "a set of mental models you can use to better understand CSS, so that it stops feeling so unpredictable and inconsistent" the latter part of which I think is something that many struggle with when it comes to CSS - just like Josh describes it, CSS is often treated like a big box of different tools that get thrown together haphazardly until the desired layout is achieved, when there's actually better ways to go about it. ### Designing Depth by Rauno Freiberg Adding depth is arguably one of the more challenging tasks when it comes to making a design really "pop", and many websites fall short in that regard. Rauno Freiberg wrote a piece on this topic, explaining a number of inconspicuous techniques that can be utilized to create an illusion of depth in design as well as motion: [Designing DepthJuly 2024![](https://rauno.me/favicon.svg)Rauno FreibergRauno Freiberg![](https://rauno.me/static/craft/og-depth.png)](https://rauno.me/craft/depth?ref=gorillasun.de) He brings up a technique used in filmmaking that's often utilized for this purpose called "Dirtying the Frame", which refers to the layering of elements in the foreground to make shots seem deeper - basically, "when there are people and/or objects between you and the key subject of the frame". He showcases how this can also be achieved in software design by introducing background and foreground elements. ### Designing Design Systems Design systems are crucial for modern product development, as they provide a structured approach to creating and maintaining a consistent user experience across a product or a suite of products. Isabelle Hamlin recently wrote about the challenging task of redesigning and evolving the iconographic part of Adobe's design system. Isabelle goes over the lifecycle that this kind of project needs to undergo, from a planning and experimentation phase, to beta testing and ultimately finalizing decisions before production work begins. Isabelle enumerates and highlights the important steps to focus on during each one of those phases: [Designing design systems: Constructing an icon systemA process for creating a unified brand experience through iconography![](https://adobe.design/icon.svg)Isabelle Hamlin![](https://adobe.design/stories/design-for-scale/media_1fbdba694b5c729ad46f90dc0f6fb4f76a8540977.jpeg?width=1200&format=pjpg&optimize=medium)](https://adobe.design/stories/design-for-scale/designing-design-systems-constructing-an-icon-system?ref=gorillasun.de) ## AI Corner ### EU puts into effect the AI Act I've already featured Alvaro Montoro in [issue #66](https://www.gorillasun.de/blog/gorilla-newsletter-66/), sharing an article of his about 10 useful CSS one-liners; this week he makes a swift return with another update tackling an important development in AI - this last week we saw the [EU put into effect the AI Act](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=OJ%3AL%5F202401689&ref=gorillasun.de): a legal framework that will impose a number of much needed regulations on AI powered technologies in the coming years: [AI Act is HereThe European Union enabled the Artificial Intelligence Act, the first-ever legal framework on AI, addressing its risks and positioning Europe as a leader in AI legislation. This article reviews the AI Act, the different risk categories, and how (and when) it will impact development. :: Blog post at Alvaro Montoro’s Personal Website.![](https://alvaromontoro.com/fav.ico)Alvaro Montoro (alvaromontorogmail.com)![](https://alvaromontoro.com/images/blog/aiact-0.webp)](https://alvaromontoro.com/blog/68057/ai-act-is-here?ref=gorillasun.de) As far as I understand, the Regulatory Framework categorizes AI systems into four risk categories, defining a spectrum of regulations for different AI applications, ranging from permissible to unacceptable - such that the use of AI systems in the latter is outright banned - whereas a strict auditing process is imposed on high-risk applications. Two diagrams found on the official post illustrate this categorization: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/image.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/image-1.png) [Link to Official Article](https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai?ref=gorillasun.de) This act will come fully into effect in about 2 years time - Alvaro provides another diagram in his post to visualize this timeline. ### AI Powered Sketch Descriptions Alexander Chen made a cute sketch that combines P5 and Google's Gemini LLM in a creative way: scribbling something onto the canvas prompts the LLM to describe the sketch in a single word, then printing that word to the canvas — essentially playing a game of "What am I?" with the smart chatbot: 0:00 /0:15 1× Alexander provides additional information in a thread underneath the Tweet | [Link to Tweet](https://x.com/alexanderchen/status/1819939988676440241?ref=gorillasun.de) Credit where credit's due though, this was originally inspired by [a sketch from Pitu](https://x.com/pitaru/status/1819797112399511625?ref=gorillasun.de) on TwiX that attempts the very same thing. Check them out, they both share the source code as well if you'd like to play around with this idea. ### Other Cool AI Things - Of note for the educators here is a new AI powered learning tool called [Little Language Models by CoCo](https://medium.com/mit-media-lab/little-language-models-empowering-children-to-be-future-ai-modelers-a30e1a5f020a?ref=gorillasun.de) that aims to teach a younger audience about the underlying ideas of AI and probabilistic thinking in a playful manner. - [WebLens](https://weblens.ai/?ref=gorillasun.de) is a cool AI powered tool that audits your website simply via a link to it, suggesting potential ideas for A/B testing and optimizations to improve your search rankings. Seems useful to bookmark for the Gorilla Blog. ## Music for Coding This week I discovered yet another weird genre that I wasn't aware before; it's called "Dungeon Synth", and sonically it's quite unambiguous if you ask me. It's a subgenre of dark ambient music that draws heavily from the fantasy and medieval themes, as well as crossing that over with early, retro electronic music. The genre typically features atmospheric and immersive compositions, created using synthesizers and other electronic instruments to evoke a sense of ancient or mystical settings, such as dungeons, castles, or forgotten realms. Here's one album that I particularly enjoyed: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 67Genart Summit VODs - Patt Vira & Daniel Shiffman Colab - Javascript Haikus by Frank Force - Matt DesLaurier’s Color Library - Deca Collector Pages - A Recount of HEN’s History - dialog() Asia - 2024 Stack Overflow Developer Survey - Github Vulnerability - Scaling to 650M Checkboxes![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/08/blurbb.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-67) *And backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 67 URL: https://www.gorillasun.de/blog/gorilla-newsletter-67/ Last updated: 2024-08-05T11:18:34.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 67th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* --- ## All the Generative Things ### Berlin Genart Summit Recordings If you weren't able to take part in the GAS (Generative Art Summit) Conference that took place at the beginning of July in Berlin, you can now do so at least spiritually by watching some of the talks in recorded form over on YouTube - they've been gradually uploaded over the past couple of days: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-02-at-15.52.20.png) [Link to Tweet](https://x.com/Foundation%5FHWF/status/1815403856408219997?ref=gorillasun.de) One thing that I really have to say here, is that the camera work is stellar; some of the close-up shots are more immersive than having been there in person. Besides that, I'm really happy that the talks are actually being released rather than disappearing in some dusty archive - here's Bill Kolomyjec's that I highly enjoyed, both at the summit and again in video: What Susanne Päch has achieved with this conference, and the wealth of information that she's putting out into the world with these recordings is just absolutely stellar. ### Patt Vira Collab with Daniel Shiffman If you end up watching one or more of the recorded talks, you might as well add another video to your playlist, a colab between my two favorite creative code YouTubers Patt Vira and Daniel Shiffman. Patt recently got the chance to sit down with The Coding Train's conductor and ask him many a question in an hour-long podcast format: If you're not familiar with Patt Vira, she's a budding creative code educator that's following in Shiffman's footsteps with the primarily video based tutorial approach, and has churned out over a 100 tutorials in the past year. And here I am still thinking about how to go about my first one 🤣 And at this point I don't think Shiffman needs an introduction, he's in charge of arguably the largest educational creative coding YouTube channel, where he's now been making content for over a decade, and has also authored the most famous book in that regard "The Nature of Code". If you didn't know, the 2.0 revised version is now available, with an entire additional chapter! After having watched so many of his videos, it was actually really cool to learn a bit more about Shiffman's background. With this collaboration we also see Patt take over as a guest conductor on The Coding Train channel, where she introduces us to ml5.js 1.0 and creates a quirky face tracking sketch: Not to flex, but let me quote myself from the [44th issue](https://www.gorillasun.de/blog/gorilla-newsletter-44/) of the Newsletter in which I'd already mentioned Patt once before: > Definitely recommend keeping up with what Patt's doing - I have a hunch that we're going to see a lot more stellar content from her in the coming months. And what do you know, I believe I was right! Jokes aside, definitely recommend checking out both videos as well as checking out Patt's channel, she's covered a lot of cool material at this point. ### JavaScript Haikus by Frank Force If you've been around for a while, you'll know that I'm a big fan of everything that Frank Force does - at this point in time, he's now the record holder with the most number of mentions on the newsletter! Featured in [#23](https://www.gorillasun.de/blog/gorilla-newsletter-23/), [#25](https://www.gorillasun.de/blog/gorilla-newsletter-25/), [#39](https://www.gorillasun.de/blog/gorilla-newsletter-39/), [#43](https://www.gorillasun.de/blog/gorilla-newsletter-43/), and most recently in [#58](https://www.gorillasun.de/blog/gorilla-newsletter-58/)! This week he makes a return with a stellar talk given at Nerd Nite 160 (a live event in Austin, Texas) which ends up being an 87 slide long whirlwind tour of everything that you could possibly need to know about size coding graphics: Throughout his talk Frank highlights [Dwitter.net](https://www.dwitter.net/?ref=gorillasun.de) \- a Twitter clone that came to life in 2016 and is entirely geared towards size code experiments. The basic idea is that users post tiny JavaScript programs of up to 140 characters that then run directly in the social feed executed by your browser. My favorite part of the talk was Frank's showcase of some of the dweets he deems most impressive (basically go have a closer look at those as learning exampes), followed by some of his own favorite creations that he's created in over 5 years of having been active on the platform. ### Matt DesLauriers Color Library It seems that whenever Matt DesLauriers sets out to build a tool for himself, he's also super kind to open source it for everyone else to use. You might remember that a couple of weeks ago he released a [repo containing a number of useful PNG encoding/decoding tools](https://github.com/mattdesl/png-tools?tab=readme-ov-file&ref=gorillasun.de) (which we might see more of at some point in the future). I wrote about it back in [issue #58](https://www.gorillasun.de/blog/gorilla-newsletter-58/) of the newsletter if you want to read up on it. This last week he open sources yet another tool he's been working on, in form of a tiny and heavily optimized library, entirely geared towards color manipulation - the github repo's description puts it very succinctly: "A minimal and modern color library for JavaScript. Especially useful for real-time applications, generative art, and graphics on the web." Here's a link to the repo if you'd like to take it for a test-run yourself: [GitHub - texel-org/color: modern color library for image processing and creative coding (oklab, xyz, p3, rec2020 + more)modern color library for image processing and creative coding (oklab, xyz, p3, rec2020 + more) - texel-org/color![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubtexel-org![](https://opengraph.githubassets.com/42a2d3b6101a7bf02d4d2848baa29e27a92ab2b41dfcd62fa2cd39dc190cd2e8/texel-org/color)](https://github.com/texel-org/color?ref=gorillasun.de) Here's also the official announcement tweet, in addition to another predating the release where he points out an interesting paper from 2008 for procedural color generation: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-03-at-00.36.07.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-04-at-03.56.31.png) [Link to Left Tweet](https://x.com/mattdesl/status/1819405253877362744?ref=gorillasun.de) | [Link to Right Tweet](https://x.com/mattdesl/status/1814648724078874983?ref=gorillasun.de) ### Other Cool Generative Things 1. [P5JS Version 1.10.0 Release](https://github.com/processing/p5.js/releases/tag/v1.10.0?ref=gorillasun.de): the newest version of P5 is out with a whole bunch of improvements and new things! 2. [Bantam Tools' Plotterfest](https://medium.com/@bre/bantam-tools-plotterfest-20d3250a06fe?ref=gorillasun.de): Last weekend Plotterfest 2024 took place over in New York, seeing 35 participants flock together to nerd out about all things related to plotters. Bre Pettis published a short recap post over on Medium for the occasion. 3. [Amy Goodchild's Handwritten Spirals](https://substack.com/home/post/p-147269390?ref=gorillasun.de): Amy's recently made these stellar plotted spirals that consist entirely out of her generative handwriting. In her recent Newsletter she writes a little about them and some technical issues she's run into along the way that produced cool misaligned versions of the spirals. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-04-at-02.10.32.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-04-at-02.11.19.png) [Link to Plotterfest Recap](https://medium.com/@bre/bantam-tools-plotterfest-20d3250a06fe?ref=gorillasun.de) | [Link to Amy's Newsletter](https://substack.com/home/post/p-147269390?ref=gorillasun.de) ## Web3 News ### Deca Collector Pages Deca rolled out a big new feature a couple of days ago, introducing collector pages that now let you aggregate your complete collection in one place, even if it spans multiple wallets on different blockchains/networks - you can read more about it in their announcement post: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-05-at-01.22.04.png)](https://x.com/0xDecaArt/status/1819156819308138587?ref=gorillasun.de) [Link to Tweet](https://x.com/0xDecaArt/status/1819156819308138587?ref=gorillasun.de) If you're not familiar with Deca, in a nutshell it's basically a Web3 gallery tool that lets you view and display your NFT collection, and arrange custom shareable boards while you're at it. There's a lot more to it other than that, such as social features, to connect with other collectors, heart their boards and tokens, or stay up-to-date with the artists you admire, and so on. From what I've seen I believe that it's currently the best tool for collection management and presentation purposes - especially with this new functionality that'll set it apart from the competition. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-05-at-01.46.27.png) [Link to Gorilla Sun Deca Page](https://deca.art/gorillasun/wallet?ref=gorillasun.de) ### Recounting HEN's Story I've mentioned HEN on a few occasions, as it constitutes one of the early factors that played a big role in me getting more serious about creative coding and generative art. If you've never heard about the platform that took the Web3 art scene by storm in 2021, or have some plot-holes that need filling in; TwiX user Michael Nicolaou provides us with a super detailed recount of the marketplace's timeline - from its inception all the way to its reincarnation under a different identity: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-03-at-02.03.00.png)](https://x.com/nicolaoumike1/status/1686051219226214402?ref=gorillasun.de) [Link to Thread](https://x.com/nicolaoumike1/status/1686051219226214402?ref=gorillasun.de) While I was actually quite invested in the early days, from March till roughly September of 2021\. Then things just kept getting more and more chaotic, and my focus had also shifted towards fxhash that was concurrently emerging at the time. Fast forwarding to the beginning of 2022, I'd completely lost touch with what was going on in the scene - hence, Michael's thread was enormously insightful in that regard. Towards the end of the thread you'll also find a link to a proper long-form piece of writing that recounts this in even more detail. ### dialog() Asia To cap off the Web3 section, I also want to briefly write about dialog() Asia, a genart exhibition spanning 4 of the major cities in East Asia, and bringing together 40 artists from among them to present their generative/code artworks. We're bound to see much more of it in the coming days, but you can read up about it on the official page - maybe you somehow end up finding yourself in one of these locations during the scheduled times: [dialog() - Asian Generative Art Exhibition 2024Asian Generative Art Exhibition 2024![](https://dialog-asia.com/heads/apple-touch-icon.png)dialog() - Asian Generative Art Exhibition 2024![](https://dialog-asia.com/heads/ogp.png)](https://dialog-asia.com/?ref=gorillasun.de) ## Tech and Web Dev ### 2024 Stack Overflow Developer Survey [Last week](https://www.gorillasun.de/blog/gorilla-newsletter-66/) we had a look at the results for the global JavaScript survey, The State of JS 2023, which revealed an overall shift towards the negative across the entire JS eco-system. This week Stack Overflow came out with the results for its yearly developer survey, that provides a more complete picture of what's happening in the programming world at large: [2024 Stack Overflow Developer SurveyIn May 2024, over 65,000 developers responded to our annual survey about coding, the technologies and tools they use and want to learn, AI, and developer experience at work. Check out the results and see what’s new for Stack Overflow users.![](https://survey.stackoverflow.co/2024/favicon.ico)![](https://survey.stackoverflow.co/2024/img/hero.png)](https://survey.stackoverflow.co/2024?ref=gorillasun.de) Here's a link to If you don't have the time to go through the aggregated numbers you can also simply check out the complimentary blog-post that's been published as a follow up highlighting the most important things. To quickly TLDR it, probably to no one's surprise, JavaScript is still the most used language today (62% vs 63% last year), with Python as a close second (51% vs 49% last year). Visual Studio Code is also currently still dominating as the most used IDE (74% same as last year). Maybe the biggest shift in numbers has been with regard to the adoption of AI tools: > 62% professional developers are using AI tools this year compared to 44% last year. 76% of all respondents are currently using or planning to use AI tools. If you're curious about the survey and some of the criticism that it received, indicative of how well/poorly it's structured, you can view a thread about it here: [The 2024 Developer SurveyJuly 24, 2024 Update: The 2024 Dev Survey results are now live! We want to thank everyone again for their participation and cannot wait to see you next year. Update: Due to the holiday and other f…![](https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon.png?v=b73aa18f2881)Meta Stack OverflowErin Asks![](https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon@2.png?v=6de7587d1583)](https://meta.stackoverflow.com/questions/430298/the-2024-developer-survey?ref=gorillasun.de) ### Your Private Github Repos are not as Private as You think In this week's episode of tech scandals we've got news from none other than Github. A recent blog post from Truffle Security highlights a critical vulnerability in GitHub's handling of deleted and private repository data. Apparently, data from deleted forks and repositories, as well as that of private repos, can still be publicly accessed if the commit hash is known. They call this vulenrability Cross Fork Object Reference (CFOR); and sensitive data being retrievable in that manner makes for a huge security risk for organizations: [Anyone can Access Deleted and Private Repository Data on GitHub ◆ Truffle Security Co.You can access data from deleted forks, deleted repositories and even private repositories on GitHub. And it is available forever. This is known by GitHub, and intentionally designed that way.![](https://framerusercontent.com/images/Zc4TyjSMxOgNAgz2xiSmBA3veU.png)![](https://framerusercontent.com/images/QBddtt3Ue3SLvfEshNFBiR49U8I.png)](https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github?ref=gorillasun.de) In essence it's possible to access three types of commits that shouldn't actually be accessible: - **Deleted Fork Data**: Even after deleting a fork, committed data can still be accessed via the original repository. - **Deleted Repo Data**: Data committed to a repository after it has been forked remains accessible even if the original repository is deleted. - **Private Repo Data**: When a private repository is made public, any committed data from internal forks during the private phase becomes accessible through the public repository. And this simply via their commit hashes, which turns out to not be that hard to brute force - here's a recap video of the above article that demonstrates this: Somehow it seems that this issue is not actually new, or unbeknown to Github - according to this Hacker News thread it seems that they are fully aware of the issue: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/08/Screenshot-2024-08-04-at-10.09.19.png)](https://news.ycombinator.com/item?id=41060102&ref=gorillasun.de) [Link to Hacker News Item](https://news.ycombinator.com/item?id=41060102&ref=gorillasun.de) ### Scaling One Million Checkboxes to 650M A few weeks ago you might've caught wind of quite a peculiar website which allows users to concurrently check and uncheck a whopping 1 million checkboxes that are updated in real-time for every visitor of the page. I did play around a bit with it at the time, and it was kind of absolute madness, since I expected the page to quiet down a bit after scrolling to a random section, but that wasn't the case. If you've wondered how a page like that works from a technical point of view, you're in for a treat this week - the dev behind it reveals how it's done and also shows us how to scale to a much larger number of concurrent checkboxes: [Scaling One Million Checkboxes to 650,000,000 checksDealing with unexpected popularity![](https://eieio.games/assets/images/favicon.png)eieio.gamesitseieio![](http://eieio.games/assets/images/scaling-omcb/main-image.png)](https://eieio.games/essays/scaling-one-million-checkboxes/?ref=gorillasun.de) ### Other Cool Tech Things: 1. [Node.js adds experimental support for TypeScript](https://github.com/nodejs/node/pull/53725?ref=gorillasun.de): a github PR from the official Node.js repo reveals that an experimental flag makes it possible to execute TypeScript files, such that Node automatically transpiles them into JS. 2. [Garbage Collection and Closures](https://jakearchibald.com/2024/garbage-collection-and-closures/?ref=gorillasun.de): Jake Archibald wrote an interesting piece on how JS garbage collection doesn't actually work the way that you'd think when it comes to closures, pointing out a specific scenario he ran into that causes a memory leak. 3. Ksenia Kondrashova made a [quirky Rube Goldberg HTML form](https://x.com/uuuuuulala/status/1818958558420955561?ref=gorillasun.de), that you need to solve before unlocking the submit button. ## Music for Coding In this week's YouTube binge listen the most noteworthy album that I came across was by Music For Animal Cafés by Nobonoko - might not be everyone's cup of tea but it was a nice change of pace with its video-game-y sounds: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 66Generative Anesthetics - Algorithmic Art as a Subset of Generative Art - Le Random Genart Timeline entering the 2010s - Simone Conradi’s Complex Polynomial Roots - Agoston Nagy’s Procedural Drawings - How not to use Box-Shadows - Rodeo: 1 Week In - Demystifying Cookies - State of JS 2023 - LLaMA 3.1![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/07/Rotten-Cheese-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-66) *And backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 66 URL: https://www.gorillasun.de/blog/gorilla-newsletter-66/ Last updated: 2024-08-15T07:59:38.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 66th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* --- ## All the Generative Things ### Generative Anesthetics: A Eulogy for Generative Art One most important recent piece of writing, *that I'm quite late to cover*, is Kevin Echerick's thought-provoking critique piece titled Generative Anesthetics. In it he eloquently points out the shortcomings of current generative art in the context of blockchain tech and the economic market that's emerged around the art-form in recent years: [Generative AnestheticsA eulogy for generative art![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9b7aefd-6170-4c74-84a1-394d2b9c6d26%2Fapple-touch-icon-180x180.png)DuckrabbitKevin Esherick![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82c3c4b3-c167-4bb4-a445-838a9eae5ab9_2008x1244.png)](https://kevinesherick.substack.com/p/generative-anesthetics?r=9bnfh&utm%5Fcampaign=post&utm%5Fmedium=web&triedRedirect=true#footnote-1-143057406) Usually I'd put this one in the Web3 section of the newsletter, but I believe that it'll be an important read for many years to come. Esherick explicitly states his main point of critique: the current NFT market and the mass-production/consumer culture surrounding it set a detrimental precedent, generally making for a breeding ground that spawns weak and uninteresting works. The root of this problem can be traced back to how generative art is inherently financialized on the blockchain - maybe we've grossly over-glorified digital ownership in this setting. Just because generative art can exist under this tokenized form, doesn't mean that it always needs to do so. Here's one point that I'd like to offer my thoughts on, not to refute it but to provide context: > Usually this involves something about the “dynamic interplay between order and chaos” or “the emergence of complexity from simple algorithmic rules.” The works are algorithm-first. Meaning, the real human impact of the artwork, is with frustrating frequency only an afterthought. In place of meaning come technical explainers that fill the void where concept should be. The reason for generative art being primarily algorithm-first, in lieu of trying to explore interesting concepts, is that generative art simply is inherently algorithm-first. Artists that engage with the art-form are mainly driven by exploratory desires. In essence, a different Modus Operandi. A good source to back up this claim is an article by Amy Goodchild from a few months ago, where many generative artists chime in with their raison d'être: [How does it feel to make generative art? — Amy GoodchildI asked other generative artists how the process feels to them![](https://images.squarespace-cdn.com/content/v1/5f33cddd6aff255aabb0c6cd/1598285066323-AE6AS241FTS6QP3C4OA6/favicon.ico)Amy GoodchildAmy Goodchild![](http://static1.squarespace.com/static/5f33cddd6aff255aabb0c6cd/5f37d09b551f154577577f01/615610e5b471c12c60201b70/1716380629257/0000180.png?format=1500w)](https://www.amygoodchild.com/blog/how-does-it-feel-to-make-generative-art?ref=gorillasun.de) An important aspect that plays into this are also the affordances that code as a medium, as well as the modern tools used for making generative art create. It also plays a big factor in the resulting aesthetics, aggravating this feeling of sameness. These two factors might not be a good recipe for making innovative, novel, and impactful works. But then again, what actually is *the real human impact of an artwork*? If you tell me... maybe I can work that into my next piece. There were many responses to Esherick's article, all of them worth reading and taking in - the most important one of them was however from Maxwell Cohen, titled "Leave Generative Artists Out of It". The text makes a very important point that Esherick's lengthy analysis seemingly leaves out: viewing all of these issues from the artists' vantage point, most of which are simply lumped together as a large body of uninteresting work: [M○C△ Confessional: Leave Generative Artists Out of ItIn so many words…![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0bf83f-7c2c-4190-a122-bb273d96b3a4%2Fapple-touch-icon-180x180.png)The Museum of Crypto ArtMaxwell Cohen![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febbc09ed-d1c5-40b4-9401-ea10332c2e7a_1212x1276.jpeg)](https://museumofcrypto.substack.com/p/mc-confessional-leave-generative?utm%5Fsource=post-email-title&publication%5Fid=1612477&post%5Fid=146902439&utm%5Fcampaign=email-post-title&isFreemail=true&r=10rchl&triedRedirect=true&utm%5Fmedium=email) Maxwell makes a few points that really hit home: > When we peruse Artblocks or Objkt or Fxhash and look over the generative work there, we must remember that we’re looking first-and-foremost at experimentation, at uncertainty. We are looking at works in progress. We are looking at people fooling around with a new medium, a new mechanism, the resultant mix of new paint. Sure, there is a lot of trash out there, to be very blunt about it. Only out there for a quick buck. Sure, maybe of a lot of my works from the early HEN days, are by today's standards also considered trash, but it's important to keep in mind that these works don't really claim to be art, as much as they've been ongoing explorations of the medium, the underlying tech, and as a means to document my personal journey. I think it's a bit unfair, even a bit snobbish to imply this kind of grouping statement. I'll be honest, it hits a little bit of a nerve. At this point I've talked to dozens of the generative artists currently active in the space, that come from all sorts of backgrounds, and ranging from all sorts skill levels. The common denominator is that they all have interesting stories to tell about their works, and are deeply involved with their practice, pouring endless amounts of thought and passiong into their works: > To peruse generative art projects individually is to encounter a gargantuan array of aesthetics, moods, styles, influences, and themes, let alone coding practices. This is not an assembly line run by automatons (some of them, maybe); these are real artists who have approached a new medium with exploration their primary purpose. Many of them do not receive the recognition that they deserve. But as any other niche, generative art has also become hyper competitive. Of course, the market will not prosper on passion alone. This is to say that even if a lot of the ideas are rehashed, it doesn't mean that this collective body of work hasn't contributed anything, or doesn't have any value. One other notable response to Esherick were thoughts by Linda Dounia, in which she formulates her own thoughts much better than I can. She describes the relationship between gen art and the market as an "arranged marriage": [003My thoughts on Kevin Esherick’s essay “Generative Anesthetics”.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F637a7b5a-0532-42a7-94af-7f33c9f9ee35%2Fapple-touch-icon-180x180.png)thewyrmLinda Dounia![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89bad8f8-f103-4fcc-a635-77800df84494_572x525.png)](https://lindadounia.substack.com/p/003) Esherick's essay is a refreshing take, especially when compared to some of the of the other critiques that I've read, often not amounting to much more than loose bundles of words, that leave you dizzied and confused after taking them in. When you write a critique, I think you owe it to at least be eloquent and make it count. Critique needs to breed discourse, and Esherick did it masterfully. ### Algorithmic Art as a Subset of Generative Art On a related - algorithm-first - note, Monokai wrote a statement addressing the current terminological problems surrounding the label "Generative Art" and its conflation with AI Art these days: [Algorithmic Art as a subset of Generative ArtHow art driven by code differs from AI-assisted art![](https://monokai.com/favicon.png)homeMonokai![](https://monokai.com/_app/immutable/assets/featured-image.DRy8JEx0.jpeg)](https://monokai.com/articles/algorithmic-art-as-a-subset-of-generative-art?ref=gorillasun.de) I had the chance of chatting with Monokai a bit during the genart summit earlier this month, and we actually talked exactly about this issue, which makes reading his words so much more interesting. Maybe I can offer my own thoughts - unsurprisingly I've also been thinking about this quite a bit. I fully stand behind that it is semantically correct to classify AI *generated* art as generative art, primarily due to how these models inherently function - be it image generators or LLMs. You might have noticed this yourself, feeding in the same prompt twice will usually return outputs that adhere to what you asked for in your prompt, but also present variations. In other words: same prompt /= same output. This is because the process by which images and text are sampled involves randomness. Besides the points that Monokai already stated in how the process between classic generative art and AI art is vastly different, creating the generator vs. prompting/sampling from the generator, I would also argue that there's a big difference to machine learning models from an algorithmic point of view. They are a special category of learning algorithms, that distinguish themself by also requiring storage to function. Classic generative art relies on self-sufficient hand crafted generators on the other hand. When you train a model, it abstracts numeric internal representations that essentially capture the ideas presented in the training data. These learned weights need to be stored separately, and are necessary for the models to really do much at all. I've also recently thought about the defining qualities of generative art, similarly to how Monokai approaches it, trying to pin point the common denominators to generative works, and whether or not this investigation could lead me to a better term for it. I kept finding myself coming back to the notion of "Emergence" as one of those defining qualities, as it encapsulates and implies a number of the aspects we usually associate with a generative artworks: - Emergence implies a system. Emergent behavior can only become apparent when a number of rules interact with each other. Several rules in combination are a system. - Emergent behavior in turn is usually labeled as "something more than the sum of its parts", and this is generally what artists strive to do in generative art. A good generative system should also present this property. - To some extent emergence also implies randomness. Emergent behavior is usually unpredictable and surprising, which I feel is also an important part of generative art. While emergence is a phenomenon that many generators strive to emulate, it doesn't capture all of the dimensions of the artform. But maybe I'm also completely off with this. I'd love to hear your thoughts on the matter! I think "Algorithmic Art" is a good placeholder in face of AI art to lessen confusion and miscommunication, since it implies a difference in the process. It might not be the ideal term to capture the entire essence of artform however - you could make an equal argument for something like "Procedural Art" I think. I still tend to answer with "I do creative coding" whenever I meet someone that's not in the know of all of this. Anyway, these are my 2 cents, I'll report back in when I've thought about it a bit more. Thanks for sharing your thoughts Monokai. I also couldn't stop admiring the beautiful website! ### Le Random Generative Timeline - Entering the 2010s & Interview with John Maeda Le Random's timeline is now almost caught up with the present day, this Monday (the day this newsletter comes out) will mark the addition of chapter 9 that recounts the eventful 2010s, in which not only tools like P5JS entered the scene, but also set the technological, blockchain based precendents that catapulted generative art to new levels of popularity in the 2020s: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-26-at-12.10.46.png)](https://x.com/lerandomart/status/1816388871694774610?ref=gorillasun.de) [Link to Tweet](https://x.com/lerandomart/status/1816388871694774610?ref=gorillasun.de) On the Editorial side, Monk's sat down with one of the current leading voices at the intersection of design and AI, none other than John Maeda. Currently the VP of Design at Microsoft, John Maeda was a research professor at the famous MIT Media Lab that gave birth to Processing: [John Maeda on Computational EvolutionJohn Maeda discusses his multifaceted identity as a technologist, artist and designer with Peter Bauman (Monk Antony). Maeda emphasizes the importance of a multidisciplinary approach to innovation and creativity, while reflecting on the transforming needs of artists in the age of AI.![](https://cdn.prod.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://cdn.prod.website-files.com/6411e594fbd274173bf8c35c/669e319843baf4fba3c39b1e_Florada_Maeda-m.png)](https://www.lerandom.art/editorial/john-maeda-on-computational-evolution?ref=gorillasun.de) In the interview it becomes apparent that Maeda embraces AI powered creativity with open arms, especially as an augmentation to human creativity rather than a replacement. His prediction is that experts in their fields will become even better, while novices will have the chance to create work that they might not have been able to achieve in their lifetime. One point that he stresses however, is the importance of understanding the capabilities and limitations of current AI - and that artists will need to become extremely efficient in their unique styles to be able to compete in this new fast paced landscape: > Visual artists and writers will need to get much faster at delivering their craft in this new age of computational creativity. We’ll all have to learn to use our seconds as carefully as we manage our days and weeks. I am definitely feeling this on a daily basis; AI's dramatically changed the expectations for speed and variety in art and content creation - if social media hasn't already imposed unrealistic paces, AI's just raised the bar another notch. I think this is a good point to re-share a talk that Maeda gave earlier this year, titled "Design against AI" in which he explains how designers need to adapt with the increasing influence of AI on design tools: Besides this - not to flex (absolutely a flex) - Maeda follows me on TwiX for some reason. Please don't tell him. He might just cut me off the list to turn that Following count into a nice round 500 😂 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-18.44.40.png) ### Complex Roots of Polynomials as Generative Art Simone Conradi has been on an absolute tour-de-force of generative art in the past couple of weeks. You might remember [issue 61 of the newsletter](https://www.gorillasun.de/blog/gorilla-newsletter-61/) in which I shared Simone's implementation of Particle Lenia - a mesmerizing modern particle based approach to Conway's Game of Life. In the meantime Simone's explored some other mathematical notions for art making purposes, one of them being the evaluation of polynomials and their complex roots - have a look for yourself at the following beautiful shapes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-26-at-12.04.59.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-26-at-12.03.52.png) [Link to Tweet #1](https://x.com/S%5FConradi/status/1815035748623462639?ref=gorillasun.de) | [Link to Tweet #2](https://x.com/S%5FConradi/status/1815347662310273444?ref=gorillasun.de) | You should also check out Simone Conradi's Twitter profile for more beautiful variations. Over the weekend I challenged myself and tried to figure out how to actually visualize these polynomials the way that Simone describes. To that end we need to unpack a few things, in particular what complex roots of polynomials are. Maybe there's some inaccuracies, so correct me if I'm off - not a mathematician by any means. A polynomial is nothing more than an equation containing variables that are raised to different powers and multiplied by coefficients (some numbers basically). For example, one that might be familiar to you from your school days, is: `x^2 + 2x + 1 = 0`. The root of a polynomial are then simply the values of `x` for which the polynomial equals zero. For example the root of `x^2 + 2x + 1 = 0` would be `x = -1`. Some polynomials turn out to be problematic however and don't end up having a proper root; take `x^2 + 1 = 0` for example; simply moving one term to the other side we obtain `x^2 = - 1` which is not something that has a solution. The square of a number can never be negative. But, if we were to evaluate this polynomial as a complex number we could say that i and -i are two solutions for it - essentially the complex roots thereof. I'm not going to go over complex numbers here, but if you want a refresher on and have 20 minutes to spare, I'd recommend this video by Veritasum that is quite an enjoyable watch: The polynomials chosen by Simone always end up being complex the way that they're structured with the deliberate t1 and t2 coefficients. These two *variables* are also important in that they are the handles by which the resulting swirly shape emerges. In the context of complex numbers, S1 stands for the unit circle in the complex plane, meaning that we're simply moving t1 and t2 around it, varying their values and evaluating the polynomial for each, then marking the result on the canvas. Naturally, I couldn't resist attempting these recreation of these patterns, especially since Simone provides all that is necessary. I picked a particular variation that I thought looked cute (below), and while I didn't manage to actually get it right, it seems that the code that I threw together in about an hour is at least doing *something*, there seems to be some similarity at least: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-27-at-23.48.00.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/polynom.png) [Link to Tweet](https://x.com/S%5FConradi/status/1816376539103068496?ref=gorillasun.de) I will definitely have to revisit the idea when I have more time and try and exactly reproduce Simone's creation. ### Time-shifting Geometries by Agoston Nagy Another artist I had a lovely chat with at the summit was Agoston Nagy. He also recently published an article titled Time-Shifting Geometries, in which he gives us insight into the inspirations and the process behind his generative series titled Procedural Drawings: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-24-at-17.44.49.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-27-at-13.22.19.png) [Link to Tweet #1](https://x.com/%5Fstc/status/1815806897724780585?ref=gorillasun.de) | [Link to Tweet #2](https://x.com/%5Fstc/status/1816808446701797491?ref=gorillasun.de) | I also had the chance of seeing one of the works in person at the Expanded gallery, I did unfortunately not snap a pic. Agoston's work is deeply influenced by the ritualistic procedural practices of old, such as the ancient Indian Kolam, where flower is used to draw symmetric patterns for ornamental and ceremonial purposes, as well as the ancient Chinese divination text referred to as I-Ching "The Book of Changes" where random arrangements of yarrow sticks are used to make predictions and advice decisions. He also mentions Aristid Lindemeyer's grammatical systems (L-systems) that were introduced in the famous book "The Algorithmic Beauty of Plants" as a source of inspiration, and proceeds to provide a break-down of the system sbehind his plotter art pieces, as well as some thoughts on the temporal aspect of them. ### David Gerrells on How Not to Use Box Shadows Following up on his article from last week, in which David Gerrells writes about simulating millions of particles on the CPU with vanilla JS, he's now back with another experiment in which he tries to push things to the limit. This time he explores Box Shadows, and in particular, on "how not to use them": > I want to share some of the worst possible things one can do with box shadows all on a single div. Things which shouldn't work at all yet somehow they do. So yeah, he basically ends up making an entire ray-tracer with box shadows, the writing is hilarious and engaging, and you'll learn a lot from it - check it: [How not to use box shadowsSo you think you know box shadows huh? I bet you didn’t know they could do this.![](https://dgerrells.com/favicon.ico)TheRealDavid![](https://dgerrells.com/images/boxshadowrender.jpg)](https://dgerrells.com/blog/how-not-to-use-box-shadows?ref=gorillasun.de) ### Other Cool Generative Things 1. Earlier this year PyCon 2024 took place over in the US in Pittsburg, Pennsylvania. And just recently a complete playlist of talks was released for it - [you can watch it here](https://www.youtube.com/playlist?list=PL2Uw4%5FHvXqvYhjub9bw4uDAmNtprgAvlJ&ref=gorillasun.de). I learned about it through [a blog post from Jörg Kantel](https://kantel.github.io/posts/2024072701%5Fpy5%5Fpyscript/?ref=gorillasun.de) in which he shares some of the highlights (post's in german, but I think you'll figure out how to translate it). Most notably one of the talks is about the python version of P5JS. 2. I don't know how she does it, but Amelia Wattenberger shares [yet another cool tool](https://x.com/Wattenberger/status/1816567815136247838?ref=gorillasun.de) of hers, one which lets you assemble SVGs, simply by dragging and dropping them onto a canvas, which then automatically generates the corresponding SVG code in a side panel. 3. [Mathias Isaksen shared a demo for a command line tool](https://x.com/st4yhome%5Fart/status/1816528614923637145?ref=gorillasun.de) that he's been working on, which assists you in generating animations/videos of your code art directly from a URL. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-00.11.32.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-00.11.13.png) [Link to Mathias' Tweet](https://x.com/st4yhome%5Fart/status/1816528614923637145?ref=gorillasun.de) | [Link to Amelia's Tweet](https://x.com/Wattenberger/status/1816567815136247838?ref=gorillasun.de) ## Web3 News ### Riding the Bull: 1 Week In .*..I'm ashamed to say, it only just clicked why it's called Rodeo.* Rodeo's been a whole bunch of fun up till now, and it's been an amazing way to stock up my collection with a whole bunch of affordable works from friends and creators that I admire. After this initial honeymoon phase it's however also important to take a step back and see how Rodeo fits into the larger picture of the the current market - and the overall sentiment's been a bit mixed: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-26-at-12.17.31.png) [Link to Tweet](https://x.com/nftaverse/status/1816752653336215621?ref=gorillasun.de) I'd say that Jamie Gourlay is absolutely right with his points, pushing out this many works at such a low price point, could heavily devalue an artist's body of work. I think this entirely depends on how you view Rodeo as platform however, if you actually consider it to be a marketplace, or just a social media platform enhanced with minting capabilities. We've been advocating for a slower paced market with more deliberate and meaningful releases - Rodeo completely subverts this however, with its overarching mechanics incentivizing a fast pace and big quantities. It feel that this might not really be sustainable in the long run and could be a recipe for burnout. Maybe these minting mechanics will need to see some revision to make them more sustainable. ### Bruce's Artistic Journey In a long-form tweet Bruce shares the story of his artistic journey, highlighting an important inflection point in his career, and a crucial change in mindset that's allowed him to persevere in the space. It's un-intuitive, and it's super difficult, especially with the pressures that the space can exert on artists at times, but Bruce advises to let go of what "could be" and focus on creating - the process is the only thing that we can actively control after all: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-00.09.47.png)](https://x.com/StudioYorktown/status/1816805765136502821?ref=gorillasun.de) [Link to Tweet](https://x.com/StudioYorktown/status/1816805765136502821?ref=gorillasun.de) Maybe this is the exact reason why Bruce's methodology is so sound, and I've really admired how he's been able to be so consistent about it over the past years. > As artists in the NFT space, we face unique pressures. We are driven by a desire for success, but the metrics we use to measure it – mint numbers, revenue, floor prices – they can be cold and unforgiving. It is easy to get caught up in the narratives and expectations of others. But we must resist. It's very easy to beat yourself up when your work doesn't meet the market's criteria for it being considered a success, but it's really important to remind yourself of the reasons why you're creating and making things. The joy of making and learning things has always been my own inherent driving factor, sometimes it's easy to lose sight of it however. Back in 2021 when I minted my very first few code experiments on HEN, and later on fxhash, I had no clue on how deeply impactful this would be on what I'd be doing in the following years. And what a turbulent journey it's been - with many emotional challenges. But I'm grateful that I'm still at it ### The Curator Economy by Tom Beck Tom Beck wrote an interesting piece about publishing in the digital age, particularly about the importance of the curator in it... and I feel oddly addressed by it. In the essay he tries to redefine the role of publishers in a modern setting, and how they can more accurately perform a curatorial role: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-13.10.39.png)](https://warpcast.com/tombeck.eth/0x598c3cec?ref=gorillasun.de) [Link to Cast](https://warpcast.com/tombeck.eth/0x598c3cec?ref=gorillasun.de) And this newsletter is in essence a form of curation; the original motivation for the newsletter was to collect and highlight all the worthwhile things that I can scour every week so that you don't have to. While it's not the primary intent, in a way this is like telling you what is important and what isn't. Tom explains that in the current digital landscape the curatorial role has to a large extent been overtaken by the algorithm that governs most platforms: > \[...\] this is how all social media feeds and recommendation algorithms work. They gather information on what you consume and then feed you more based on that initial input. They quite literally cannot do anything else. They are not capable of introducing true novelty. Tom advocates for more human friendly algorithms, and systems that can enable a symbiotic relationship between creators, curators, and the platforms. He provides an example of such a system in the Web3 setting towards the end of the piece. He also mentions Timothy Greene's "Curation Revolution" as an inspiration, which I'll definitely have to check out. ## Tech and Web Dev To kick off this section this time, I'd like to shout out one of my favorite newsletters out there (not that they need it but anyway): The Collective. It's one of my main sources for putting together this section of the Gorilla Newsletter every week since they always share bangers. Their round-up this week was really chock-full of awesome links, so recommend checking it out: [The Collective #857![](https://mailchi.mp/favicon.ico)![](https://mcusercontent.com/10ffec652b0f54fe5d8682ac0/images/e630435c-8657-51ca-c11b-ef3286a2206c.jpg)](https://mailchi.mp/codrops/collective857-ylqp?ref=gorillasun.de) ### Demystifying Cookies and Tokens The negative connotations that we associate with browser cookies stems from the fact that over the past decade the tech has been heavily exploited for data collection, tracking, and advertising purposes. In particular third-party cookies that track your activity across different web pages you visit, even after you've left the domain that the tracker originated from. In recent years this debacle has led to what is today referred to as the "Cookie Apocalypse", leading to major browsers disallowing and phasing out certain types of unnecessary cookies, primarily those that have been leveraged by advertiser for dubious tracking activity, in light of tighter privacy regulations. While Safari and FireFox have already disabled third party cookies, Google initially had the intent of doing so this year but seemingly postponed it for early January 2025 - an article on the topic that speculates some of the reasons behind this delay: [Inside Google’s latest move to postpone the cookie apocalypseDespite Google’s (most recent) assurances that it would stick to its (newest) game plan, there has been a lot going on as of late.![](https://digiday.com/wp-content/themes/digiday/static/images/favicons/apple/apple-touch-icon-180x180.png)DigidaySeb Joseph![](https://digiday.com/wp-content/uploads/sites/3/2024/03/magnifying-chip-digiday.gif)](https://digiday.com/marketing/breaking-it-down-googles-latest-move-to-postpone-the-cookie-apocalypse/?ref=gorillasun.de) To get to the main point of this segment however: these small pieces of data that browsers store on your machine are not always malicious in intent, in a lot of cases they are even necessary to communicate information with the server that you're connecting to and provide a better user experience (first-party cookies). For instance, many web apps use cookies to remember that you're logged in. Tommi Hovi provides us with an insightful article in which he gives us a run-down of the different types of cookies that exist (including session tokens and JSON Web tokens), how they work, and what legitimate problems that they solve: [Demystifying cookies and tokens – Tommi Hovi | The Security blog![](https://tommihovi.com/wp-content/uploads/2024/03/cropped-Logo-removebg-preview-270x270.png)Tommi Hovi | The Security blogTommi Hovi![](https://tommihovi.com/wp-content/uploads/2024/05/Post-Main-Image.jpg)](https://tommihovi.com/2024/05/demystifying-cookies-and-tokens/?ref=gorillasun.de) ### The State of JavaScript 2023 Results A bit late to the party, but the state of JS 2023 came out a couple of weeks ago (after a significant delay), and the turnaround's been quite surprising. The aggregated statistics show that the general sentiment towards the current JavaScript eco-system has had an observable dip into the negative - in particularly the *libraries* section of the global survey reflects this: [State of JavaScript 2023The 2023 edition of the annual survey about the latest trends in the JavaScript ecosystem.![](https://assets.devographics.com/surveys/js2023-favicon.png)Google Chrome– Sacha Greif![](https://assets.devographics.com/surveys/js2023-og.png)](https://2023.stateofjs.com/en-US?ref=gorillasun.de) YouTuber Theo Browne tries to analyse these results and provides a few theories on why this might be the case in a video of his - he speculates that the negative sentiment is most likely due to most devs currently having to work with frameworks that they have not chosen for themselves: Could be, but I'm not sure if I entirely agree. As some of the comments point out, it might just be the increasing complexity of the individual frameworks. Another reason could be, that it's just the natural entropy of things, that when you use something long you enough you eventually start hating it 🤷‍♂️ ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-28-at-12.47.35.png) It's definitely going to be interesting to see which frameworks will end up coming out on top and rise to popularity in 2025\. It's likely still a sage bet to hold on to your React and Next chops in the meantime. ### CSS One-Liners for Every Project Alvaro Montoro shares 10 of his personal favorite CSS one liners that are quite useful to add to your CSS vocabulary. They're not like ground-breaking things, more situational than anything else, but still might not be things that you'd have naturally thought of: [CSS One-Liners to Improve (Almost) Every ProjectA collection of ten simple one-line CSS solutions to add little improvements to any web page. :: Blog post at Alvaro Montoro’s Personal Website.![](https://alvaromontoro.com/fav.ico)Alvaro Montoro (alvaromontorogmail.com)![](https://alvaromontoro.com/images/blog/one-liners.webp)](https://alvaromontoro.com/blog/68055/ten-css-one-liners-for-almost-every-project?ref=gorillasun.de) Also highly recommend checking out Alvaro's other posts, lots of CSS goodies in there! Geoff Graham from CSS-Tricks piggybacked onto Alvaro's post, and shares some additional one-liners of his own: [Alvaro Montoro: CSS One-Liners To Improve (Almost) Every Project | CSS-TricksThese sorts of roundups always get me. My wife will flip through Zillow photos of the insides of homes for hours because she likes seeing how different people![](https://css-tricks.com/favicon.svg)CSS-TricksGeoff Graham![](https://css-tricks.com/wp-json/social-image-generator/v1/image/379278)](https://css-tricks.com/alvaro-montoro-css-one-liners-to-improve-almost-every-project/?ref=gorillasun.de) ### Other Cool Tech Things: And to close off this section, here's some other cool web & tech related thingies that might interest you: 1. [Hamburg HTML 5th yearly Meetup](https://hhtml.de/events/2024-11-05-fifth-meetup/?ref=gorillasun.de): If you're somewhere near Hamburg in Germany later in November of this year, you might want to check out the HTML meetup that's held there. 2. [Chris McCully's shares the story behind the making of](https://medium.com/@chriswmccully/snippp-io-or-how-i-made-my-organization-tool-into-a-service-6465a73aca4d?ref=gorillasun.de) Snippp.io, the tool that he's been chipping away at over the past months and also made accessible as a service for the public to contribute their own code snippets. It's been really inspiring to follow along on the journey. ## AI Corner ### Meta releases LLaMA3.1 405B With the release of LLaMA 3.1, Meta is giving OpenAI, and the other closed source LLMs currently out there, a run for their money. Not only is the series of new LLaMA models on par, if not superior, in ability with the competition (according to the benchmarks), but they are also open source! Zuckerberg wrote a lengthy official statement for this occasion, explaining why open sourcing these types of models is important: [Open Source AI Is the Path Forward | MetaMark Zuckerberg outlines why he believes open source AI is good for developers, Meta and the world.![](https://about.fb.com/wp-content/uploads/2021/10/meta-favicon.png?fit=16%2C16)MetaMark Zuckerberg, Founder and CEO![](https://about.fb.com/wp-content/uploads/2024/07/MZ-Open-Letter-AI_Social-Share.jpg?w=1200)](https://about.fb.com/news/2024/07/open-source-ai-is-the-path-forward/?ref=gorillasun.de) TLDR: Zuckerberg advocates for open source AI because it'll allow organizations to tailor models to their needs, let them stay in control, and protect their customers' data by avoiding dependency on third parties for this service. The bottom-line of it is that he sees no advantage to closing off access to the tech, which is not only beneficial to developers, but also to Meta and its partners. If you're curious about the models themselves, or want to take them for a test run, you can do so here: [Llama 3.1The open source AI model you can fine-tune, distill and deploy anywhere. Our latest models are available in 8B, 70B, and 405B variants.![](https://static.xx.fbcdn.net/rsrc.php/y5/r/m4nf26cLQxS.ico)Meta Llama![](https://scontent.xx.fbcdn.net/v/t39.2365-6/384127954_1010009116964035_2906046058102555347_n.jpg?_nc_cat=101&ccb=1-7&_nc_sid=aa6a2f&_nc_ohc=g0dZTPpV53AQ7kNvgHmiJ98&_nc_ht=scontent.xx&oh=00_AYCCJvOUwTIoGzj7eYWMcyfK9gsR_U4etjPMPjIwWfHI7Q&oe=66A95685)](https://llama.meta.com/?ref=gorillasun.de) Over the past couple of days I've actually been playing around more and more with Claude Sonnet 3.5, and it's quickly become my go-to model for programming purposes - I'm incredibly impressed with its ability in that regard, as it just beats Gippity 4o and Gemini by miles. It's going to be interesting to see if Llama 3.1 can rival Claude in that regard, or if some fine-tuned variant will do the trick. I'm sure we'll see a whole slew of customized models in the coming weeks/months. I've been playing with the thought of fine-tuning my own model towards that end - to aid me in my writing every week, especially with the Newsletter, where I could often need someone to help me brainstorm. I do think that I've got enough data at this point 😅 If you don't feel like reading the linked article you can also check out Fireship's humorous code report on the LLaMA King: Besides this, among the tech billionaires, Zuckerberg currently strikes me as the most likeable character (in case he isn't actually a lizard-man). I would still love to see that cage fight with Elon at some point, but I doubt that it will ever happen. ### What LLMs actually See Prompts aren't actually fed in as plain text into LLMs - the text is first processed such that individual words are converted into tokens, which are essentially hieroglyphs that the model can understand. In a recent tweet of his Andrej Karpathy likens this to representing a text as a string of emojis, where each emoji represents an individual word. For this purpose he's put together a little google colab, to give us an idea of *what* LLMs actually see: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-27-at-17.35.46.png)](https://x.com/karpathy/status/1816637781659254908?ref=gorillasun.de) [Link to Tweet](https://x.com/karpathy/status/1816637781659254908?ref=gorillasun.de) ## Gorilla Updates Here's some of the stuff I worked on this week - nothing outstanding, just some random ideas in search of something that I have in mind: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/collageblocks3.jpg) I also made these pixelized patterns as an offspring to the above idea - that kinda looked like organic, fungal thingies: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/collageblocks.jpg) Not sure where this is going at this point, but I'm having fun. With all of this said, I'm heading off to my yearly trip to Tunisia tomorrow for a much needed vacation. There will definitely be another issue next week, alebit a little shorter. I might overall be a bit quieter over on social media, which is not to say that I'll continue to working on my projects while I'm there. ## Music for Coding This week I thoroughly enjoyed listening to The Paper Kites - an indie folk band from Australia that had their big break back in 2011 with their EP *Woodland*, a short and sweet atmospheric collection of 6 tracks that really captures the essence of the genre with its gentle, melodic tunes and introspective lyrics: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 65Generative Architecture: Jacek’s Unbuilt - Mesh Neural Cellular Automata - Meta Morph Awards - Rodeo by Foundation - Known Origin Shuts Down - ARTXCODE Rebrand - CrowdStrike Disaster - Drag & Drop Website with mmm.page - Next Gen CSS Variables - Negotiating with AI![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/07/generativehomework.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-65) *And backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 65 URL: https://www.gorillasun.de/blog/gorilla-newsletter-65/ Last updated: 2024-08-15T07:59:22.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 65th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Generative Architecture: Unbuilt by Jacek Unbuilt is an iconic piece from the early days of fxhash by Jacek Markusiewicz, who you might recognize from his more recent project [Barbarians](https://verse.works/exhibitions/barbarians?ref=gorillasun.de), that released back in February/March 2024 as a Verse Solos piece. This past week we got a recount of the original inspirations behind the beautiful generative architectural project directly from Jacek himself, in form of a video space on TwiX hosted by Anaglyphic, who guides the conversation with a number of excellent questions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-13.15.18.png)](https://x.com/anaglyph%5Fic/status/1814702808916021536?ref=gorillasun.de) [Link to Tweet](https://x.com/anaglyph%5Fic/status/1814702808916021536?ref=gorillasun.de) In the recount Jacek reveals that Unbuilt is a tribute to Palladian architecture, an architectural style that derives its name from [Andrea Palladio](https://en.wikipedia.org/wiki/Andrea%5FPalladio?ref=gorillasun.de), a classicist architect from the 16th century (1508–1580). He describes the architectural style as "very mathematically definable", with the Wikipedia section on the topic echoing this, stating that the main focus of this architectural style lies on symmetry and perspective "to emulate the grandeur of [classical](https://en.wikipedia.org/wiki/Classical%5Fantiquity?ref=gorillasun.de) buildings" of ancient Greece and ancient Rome. Moreover, the project hails to the research of Gines and Stiny who studied the architectural rules that Palladio describes in his books as a form of architectural grammar - quite literally describing it as a generative approach to creating the structures: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-22.25.18-1.png) [Link to Paper](https://www.andrew.cmu.edu/course/48-747/subFrames/readings/Stiny&Mitchell.thePalladianGrammar.pdf?ref=gorillasun.de) In Unbuilt Jacek uses this concept of a generative grammar and applies it in the setting of French sacral architecture, to abstract and capture the architectural idea of a cathedral and then producing variations off of it. I recommend checking out the research that inspired Unbuilt, it's quite fascinating and might give you some ideas for your own generative artworks. While there were a few hiccups with the VOD, I did enjoyed the format; being able to see the artworks while listening helps quite a bit. And apparently this is one of a first in a series of such "Welcome to my practice" style videos that Anaglyphic's planned - the second one's already out as well if you're curious: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-22.45.14.png)](https://x.com/anaglyph%5Fic/status/1815034085271585152?ref=gorillasun.de) [Link to Tweet](https://x.com/anaglyph%5Fic/status/1815034085271585152?ref=gorillasun.de) ### Neural Mesh Cellular Automata + SIGGRAPH 2024 SIGGRAPH 2024 will be taking place from the 28th of July till the 1st of August, and considering that it's internationally the most prestigious computer graphics conference, there's bound to be more than a few interesting papers (which I'll be happy to share in future issues of the Newsletter) - you can find the full 2024 program, with links to each individual presentation here: [SIGGRAPH 2024The Premier Conference & Exhibition on Computer Graphics & Interactive Techniques. 51 years of SIGGRAPH and join us in Denver or online starting 28 July.![](https://s2024.siggraph.org/wp-content/uploads/2023/10/cropped-favicon-270x270.png)SIGGRAPH 2024![](https://s2024.siggraph.org/wp-content/uploads/2023/10/siggraph-2024-site-image.jpg)](https://s2024.siggraph.org/?ref=gorillasun.de) I learned about one of the interesting papers that's going to be presented by chance, through a Twitter thread from Ehsan Pajouheshgar, who's collaborated with Google Research on MeshNCA, short for Mesh Neural Cellular Automata: it's an approach for applying animated textures to 3D objects without requiring UV maps - here's a link to the thread where Ehsan elaborates on it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-14.16.43.png)](https://x.com/Esychology/status/1813905494412492833?ref=gorillasun.de) [Link to Tweet](https://x.com/Esychology/status/1813905494412492833?ref=gorillasun.de) While quite a bit of the math involved eludes me (tweets 3, 4, and 5), the showcased results are simply stellar - hence very worth checking out the entire thread. I've written about cellular automata on a few occasions for the Newsletter before; most recently we had a look at [Particle Lenia](https://www.gorillasun.de/blog/gorilla-newsletter-61/), a modern particle based approach to cellular automata. One type of cellular automata that I haven't tackled before however are NCAs, the neural variant. They're hybrid models that combine the grid-based structure and local interaction rules of cellular automata with the adaptive learning capabilities of neural networks - here you might remember that paper from a few years back with a self regenerating pixel lizard: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-22-at-11.48.50.png)](https://distill.pub/2020/growing-ca/?ref=gorillasun.de) [Link to Paper/Demo](https://distill.pub/2020/growing-ca/?ref=gorillasun.de) As far as I understand it, with an NCA each cell in the grid holds its own mini neural network that computes the next state based on the state of the neighbouring cells - in the context of NCAs we refer to this aggregated state as a cell's perception. A really good explainer video on the topic is by Data Garden: I think at this point I might have to do a proper full-length article on cellular automata and all of the different variants that are out there. ### Meta Morph Awards We've got two generative artists claim trophies in the Metamorph awards that were announced last week - and I have to say very well deserved! For one we've got Greweb winning the generative category with his plotted animation piece "L'Homme et la machine", and for another Frederik Vanhoutte winning the NFT category with his submission "Isoverse - Invisible Cities" - both stellar pieces: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-14.14.11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-22-at-12.05.56.png) [Link to Greweb's Tweet](https://x.com/greweb/status/1814170103379816844?ref=gorillasun.de) | [Link to Winterbload's Tweet](https://x.com/wblut/status/1812979614387695774?ref=gorillasun.de) You can also check out the other winners over on the Meta Morph page: [Winners | Meta Morph Award![](https://static.wixstatic.com/media/344787_0a57e1b171df4cb2978330f205ca9f06~mv2.jpg/v1/fill/w_192%2Ch_192%2Clg_1%2Cusm_0.66_1.00_0.01/344787_0a57e1b171df4cb2978330f205ca9f06~mv2.jpg)Meta Morph Award![](https://static.wixstatic.com/media/c0f4bc_7a37b3db62a543d9806f02302014b32d~mv2.png/v1/crop/x_627,y_884,w_1757,h_1213/fill/w_144,h_94,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/ONE_White%20Background.png)](https://www.metamorph-award.com/winners?ref=gorillasun.de) ### Other Cool Genart Things - [Peckham Digital](https://www.peckhamdigital.org/info/?ref=gorillasun.de) took place last week, a two day festival of creative computing, while I don't think that the session were recorded, we do get some insights from Amy Goodchild's most recent [Newsletter](https://amygoodchild.substack.com/p/generative-art-diary-limitations) where she also shares updates about her ongoing generative handwriting project. - [An article on Hackaday shares algorithmic artwork by Prof. Halim Boutayeb ](https://hackaday.com/2024/07/17/making-art-with-maxwells-equations/?ref=gorillasun.de)who leverages Maxwell's equation in combination with a number of electromagnetic sources for the purpose of making colorful and fractal-esque plots. ## Web3 News ### Rodeo by Foundation The Web3 news that made a buzz this week, was Foundation's launch of a brand new platform titled *Rodeo* \- a Web3 social media platform, that at first glance seems very similar to Zora with it's main mint feed, but with a different micro-minting dynamic that does give it an overall different vibe. Before getting my hands on an invite I found this explainer by UV quite insightful: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-22-at-00.40.41.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-17.54.07.png) [Rodeo on Twix](https://x.com/rodeodotclub?ref=gorillasun.de) | [Link to Tweet](https://x.com/uvtourist/status/1806197653379666360?ref=gorillasun.de) When I first read UV's post I had concerns about the 24 hour minting window, that it might make for a stressful experience, but so far it hasn't felt that way. Logging in with my ETH wallet it also immediately picked up my Farcaster profile, automatically connecting me with others that I'm already mutuals with over on FC: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-22-at-00.27.41.png) Got a nice dopamine hit off of seeing those first few notifications roll in. The apparent simplicity of it in its current state is quite refreshing - although there are a few subtle aspects to it that create an interesting dynamic, and that also make it a little addictive. The best way to describe it, is that it's basically a Web3 Instagram clone where media posts (PNG, JPG, GIF, MP4, and MOV are supported at this point) are NFTs that can be collected within a 24 hour window after they've been *posted*. When you mint something is it also shows that in the feed, if someone else then subsequently mints it after seeing that notification in their feed, you get a reward. I'm calling it micro-minting, because minting/collecting has a minimal fee attached to it 0.0001 Base ETH (0.35 cents at the time of writing). The only drawback that I see at this point, is the retroactive FOMO (is there a term for that?) for when I see all of the future mints that I'm no longer able to collect. Overall super fun experience so far, excited to see how it progresses! ### Known Origin Shuts Down At the same time that Foundation is launching a new platform, we bid farewell to another; Known Origin, one of the pioneering NFT platforms on ETH that took off back in 2018, and was later acquired by Ebay in June 2022, now made an official and conclusive announcement that it would be transitioning out of service in the coming weeks: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-15.27.24.png)](https://x.com/KnownOrigin%5Fio/status/1813576642058698830?ref=gorillasun.de) [Link to Thread](https://x.com/KnownOrigin%5Fio/status/1813576642058698830?ref=gorillasun.de) | [Link to Article on NFT Now](https://nowmedia.infura-ipfs.io/ipfs/QmbQnaZwwEALeN5oEYddWB1kk3AownrmdtW7BYPKcHR9jx?ref=gorillasun.de) This announcement is unsurprising, considering that Ebay had laid off 30% of their Web3 employees back in February 2024 - a short article about this can be read [here](https://www.tradingview.com/news/cryptobriefing:7e45ac61e094b:0-ebay-lays-off-30-of-web3-and-nft-staff-report/?ref=gorillasun.de). This now raises concerns about the permanence of the digital items that have been minted on the platform in the past 5 years. While the platform contracts are stored onchain, the actual files are in fact stored on IPFS, the popular decentralised storage system that is notoriously ephemeral - a tweet by Ella voicing her concerns made the rounds: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-14.23.30.png) I assumed that it was common knowledge by now that IPFS is not a reliable storage solution, and that provenance is mostly decoupled from the actual media files for most NFTs. I remember that this was a big discussion back in 2021 - with IPFS, creators and collectors need to take care of pinning all of the files that matter to them manually. This then also led to services like Club NFT to pop-up, and later fxhash to introduce their ONCHFS (On Chain File System). If you need/want to back up your NFT collections you should look into Club NFT - I'm not sponsored, but it's the only tool I know of for this purpose: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-12.23.48.png)](https://www.clubnft.com/?ref=gorillasun.de) This text banner on their landing page now also has KnownOrigin in big bold letters, not sure if it was like that before | [Link to Club NFT](https://www.clubnft.com/?ref=gorillasun.de) You can however also pin your files on IPFS manually, by spinning up your own node if you want to do it yourself. Overall, it just feels a bit odd to read this in 2024 - but maybe it's another wake-up call to address this particular issue with the tech again: [Does Ebay’s NFT marketplace KnownOrigin shutdown raise storage concerns?KnownOrigin has announced its imminent shutdown, sparking fresh debates about the reliability and longevity of NFT storage solutions.![](https://crypto.news/app/uploads/2022/01/cropped-cryptonews-icon-300x300.png)crypto.newsJulius Mutunkei![](https://crypto.news/app/uploads/2024/04/crypto-news-nft-option17.webp)](https://crypto.news/does-ebays-nft-marketplace-knownorigin-shutdown-raise-storage-concerns/?ref=gorillasun.de) Things are already better than they used to be however, with many platforms, especially the ones geared towards generative art, providing the option to mint the code directly onchain, making the individual editions that are ultimately collected eternally reproducible. Naturally, only as long as the chain exists however. ### ARTXCODE Rebrand & Misunderstood Machines ARTXCODE made the announcement that on the 29th of July they'll be launching a revamped website with a brand new identity, enhanced with new minting capabilities powered by highlight, in addition to a genesis project by the founder of Sofia Garcia. The announcement thread over on TwiX provides all of the necessary details: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-13.00.34.png)](https://x.com/artxcode%5Fio/status/1813243622323638503?ref=gorillasun.de) [Link to Tweet](https://x.com/artxcode%5Fio/status/1813243622323638503?ref=gorillasun.de) | [Link to the accompanying press Release](https://www.artxcode.io/journal/artxcode-press-release-16-july-2024?ref=gorillasun.de) The genesis project of this relaunch, titledMisunderstood Machines is an interactive, generative art piece that aims to highlight both the emotional experience that code-based artists undergo, as well as the beauty of web development's foundational technologies. The artwork renders two decks of playing cards that flip over to reveal two words side by side - evocative adjectives on one side, technical terms on the other - and the juxtaposition of the two is sufficient to tell a story: [ARTXCODE | Misunderstood MachinesAs an art dealer and curator deeply rooted in the world of code, I am fascinated by the human side of technology — enchanted by the somewhat naïve realization that the technical touch points of our everyday life were, in fact, built by someone.![](https://www.artxcode.io/favicon.ico)Misunderstood Machines![](https://cdn.sanity.io/images/fckygwwd/production/fef9ac55921c4067afb67ed5a7a6448093093ba1-1200x630.png)](https://www.artxcode.io/journal/misunderstood-machines?ref=gorillasun.de) You can also check out the [TwiX space](https://x.com/i/spaces/1mnxeALDEoZxX?ref=gorillasun.de) that was held for the occasion. Sofia's article really resonated with me; my personal journey has been somewhat similar when I look back on it. Albeit the other way around, I've somehow slowly found my way more and more into web development through generative art - discovering the tech as another means for creative expression. In fact, in the past couple of weeks I've spent more time on programming and learning various web things compared to making generative art - and it's been really refreshing, it's felt a bit more purposeful overall and I wake up in the morning excited to learn something new. ## Tech & Web Dev ### The CrowdStrike Disaster This past Friday (the 19th of July) things went south real quick when CrowdStrike rolled out an update to their Falcon software, an “endpoint detection and response” (EDR) software that monitors machines for nefarious activity, affecting [8.5 million windows machines](https://www.bbc.com/news/articles/cpe3zgznwjno?ref=gorillasun.de) around the world, and causing the biggest IT outage in history. The faulty software caused machines that it is installed on to crash on boot with a blue screen of death, and subsequently rendering them inaccessible by leaving them stuck in a boot loop - naturally, this made many operations around the world to come to a grinding halt, including airports, hospitals, and banks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-14.21.44.png) [Link to Tweet](https://x.com/vxunderground/status/1814267016699576369?ref=gorillasun.de) If you've never heard about CrowdStrike, it's basically a cybersecurity vendor that provides large corps with anti-hacking software (to a large extent fortune 500 companies) for windows machines. And because their software isn't just your regular run-of-the-mill McAfee anti-virus, it needs to sit in the critical path of the machine to safeguard it - this is what makes all of this such a big disaster: affected computers need to be booted up in safe mode so that the faulty driver can be removed manually, and most company devices don't allow this. And that's pretty much the gist of it, Fireships code report covers the entire debacle in more detail if you want a quick and fun watch: Luckily (sadly?), I'm a mac chad (and also work freelance on my own machine) so I am unaffected by this, meaning that the weekly newsletter can be delivered in a timely manner 😌. *Also, I do not wish to trade places with the CrowdStrike employee that was responsible for this.* ### Drag and Drop Websites I just learned about mmm.page - a website builder of a different kind, that lets you assemble your own custom and quirky webpages simply dragging and dropping elements, and that without requiring any programming knowledge at all: [mmm.page — Your Corner of the InternetWebsites don’t have to be so cookie cutter. Make a website that feels uniquely you in under five minutes.![](https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://mmm.page/&size=128)mmm.page![](https://static.mmm.page/image/preview_800x419.jpg)](https://mmm.page/?ref=gorillasun.de) The tool's been in development for quite a while, and launched as a beta back in January 2024, and just yesterday launched it's 1.0 version - and it already has quite a buzzing community that've created many artful and quirky webpages that hail back to the early days of the internet - you can find the anonymous founder of the platform XH over on Twitter where they share a bit more about it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-16.34.22.png)](https://x.com/xhfloz/status/1814990357932732612?ref=gorillasun.de) [Link to Tweet](https://x.com/xhfloz/status/1814990357932732612?ref=gorillasun.de) In an interview with TechCrunch earlier this year XH explains some of the motivations for building mmm.page: > I grew up on an internet filled with personal websites and niche forums that existed, sometimes, for the benefit of three people who shared an interest,” XH told TechCrunch. “It was fun to explore, and I remember feeling like I wasn’t supposed to be privy to these various subcultures from the remoteness of my suburban childhood. To a kid that kind of freedom is exciting. [mmm.page could make you enjoy the internet again | TechCrunchThe internet can be bad. But mmm.page might just be good. The platform is hard to explain, but it describes itself as “Tumblr x Animal Crossing x Mii![](https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=192)TechCrunchAmanda Silberling![](https://techcrunch.com/wp-content/uploads/2024/01/banner-1.jpg)](https://techcrunch.com/2024/01/25/mmm-page-could-make-you-enjoy-the-internet-again/?ref=gorillasun.de) ### Next Gen CSS Variables CSS variables get a power-up with the @property rule that is now supported by all modern browsers, web.dev celebrates this with an article that provides a run-down of the possibiliteis: [@property: Next-gen CSS variables now with universal browser support | Blog | web.devSemantic custom properties with @property just reached Baseline newly available.![](https://www.gstatic.com/devrel-devsite/prod/vfa66122381520aa66a2392fe22cd63e3f9c34ba07e71f8c7082c2a470b6e6f49/web/images/favicon.png)web.devX![](https://web.dev/static/blog/at-property-baseline/image/thumb.png)](https://web.dev/blog/at-property-baseline?ref=gorillasun.de) So now you can basically create variables in the following manner, to also specify a variable type and a fallback value: ``` @property --myColor { syntax: ''; inherits: false; initial-value: hotpink; } ``` What's cool about this? One cool use-case is that it's now possible to animate gradients with vanilla css which wasn't possible before: > One of the neat applications of `@property` is the smooth animation of properties that were previously impossible to transition, like gradients, which are perceived as images by the browser. However, if you give variables syntactic meaning via `@property`, these can be used in a gradient statement. Unfortunately the embeded codepen in the article seems to be broken, but I did however find this YouTube video by Frontend FYI that explains how to do it: And this is now supported in all browsers! ## AI Corner ### AI Powered Semantic Grouping I believe that the current advancements in generative AI can only come to full fruition if we build innovative and novel interfaces through which we can lay bare their capabilities in a useful and functional manner - we have these super powerful neural machines, but our main way of interacting with them is a simple chat box. Surely, there must be a better way? And this is exactly what Amelia Wattenberger is currently exploring with creative works. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-22-at-10.01.14.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-15.19.16.png) [Link to First Tweet](https://x.com/Wattenberger/status/1813257271427932667?ref=gorillasun.de) | [Link to Second Tweet](https://x.com/Wattenberger/status/1814670849959456990?ref=gorillasun.de) Her most recent tweets showcase an AI powered application that helps with labeling user aggregated bundles of notes/texts/ideas on an infinite by automatically generating a semantic label to the clusters, summarizes the overall content. I'm assuming that is done with an LLM, by feeding in the text, alongside a prompt to indicate what needs to be done. In another version, the tool can also automatically merge individual ideas to breed new cards that contain a text that tries to combine the ideas of the two original cards. This is genius, because the interface here plays a crucial part in creating a new affordance. It's not only that the summarisation/merging process is streamlined, but it also creates a new way to view and analyze the data, basically asking *what's the main idea if I group these couple of notes together?* Seeing what the AI thinks and what label it generates is interesting, and can spark new ideas and/or perspectives - and I think that's what AI is currently all about: to act like a side-kick, a smart assistant, and a second brain. I'm hoping that Amelia will release this in one form or another at some point. ### Negotiating for a better deal with AI On a related note, what if we used AI for negotiating purposes? I came across a tweet by George McGowan, where he shares the website of a mattress vendor on which you can haggle for the price of their products with an "AI" chatbot: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-16-at-16.17.10.png) [Link to Tweet](https://x.com/GjMcGowan/status/1812965799940047035?ref=gorillasun.de) I immediately had multiple questions, the first of which... *why?* Why let potential buyers negotiate for the price? And what's the point of using AI for this purpose? While I have no idea what a good mattress costs these days, using this tool implies that the product is overpriced from the get-go - it seems that they're happy to sell the mattress at a lower price depending on how much time and effort the buyer is willing to invest in negotiating. That doesn't actually mean that you're getting a good deal though - in fact, the product might still be overpriced in the end. But psychologically, the fact that it is offering a deal might be enough reason for some customers to seal the deal and make the purchase. The tech that's behind this negotiating bot is called Nibble: [Nibble - AI Negotiation Platform - B2B, DTC, MarketplacesAI negotiation for ecommerce and B2B sales, creating win-win deals for online retailers or B2B SaaS providers and their customers![](https://www.nibbletechnology.com/hubfs/raw_assets/public/nibble-theme-2022/assets/images/favicon.png)Logo new (1)![](https://www.nibbletechnology.com/hubfs/Nibble_logo_400x400px.png)](https://www.nibbletechnology.com/?ref=gorillasun.de) I put AI between quotation marks earlier, because it seems that it's not really the kind of prompt-based LLM interface that we're familiar with today, but rather just relies on some hard coded logic, that will ultimately offer you the lowest possible price if you try enough times, as some of the replies under George's tweet suggest. Maybe there's a little AI involved in the text generation part of it, but that also to a limited extent. Clearly it'd be too risky to allow for an AI to have control over choosing a price - since there's more than a few ways to break them. I guess it does makes sense to slap on *AI* as a trendy buzzword for branding purposes however, but I'd be curious to see a more intelligent AI based version of this. Idk, that's my 2 cents here. ### Suno & Udio Sued for Copyright Infringement *Hold the front page! AI startup \[insert AI startup name here\] is being sued by \[insert other company name here\] for copyright infringement. Who would've guessed? (Spoiler: Everyone.)* This piece of news is almost a month old by now, but somehow I only caught wind of it now - maybe because it's not really a new shtick - but the two generative AI music startups Suno and Udio are getting sued by more than a few record labels for copyright infringement: > A group of record labels including the big three — Universal Music Group (UMG), Sony Music Entertainment, and Warner Records — are suing two of the top names in generative AI music making, alleging the companies violated their copyright “en masse.” [Major record labels sue AI company behind “BBL Drizzy”Two major names in AI music are being sued by the RIAA.![](https://www.theverge.com/icons/apple_touch_icon.png)The Verge![](https://cdn.vox-cdn.com/thumbor/qBYLqARZ4NQ8WNUwns4DkbpTJNA=/0x0:2040x1360/1200x628/filters:focal(1020x680:1021x681)/cdn.vox-cdn.com/uploads/chorus_asset/file/25383541/STK467_AI_MUSIC_CVirginia_A.jpg)](https://www.theverge.com/2024/6/24/24184710/riaa-ai-lawsuit-suno-udio-copyright-umg-sony-warner?ref=gorillasun.de) This debacle ensued after the AI generated track BBL Drizzy by King Willonius took off and became viral on multiple platforms - and it's actually a pretty good track: It will be interesting to see how this unfolds, because, while it is evident that the models are trained on copyrighted material (where else is the data coming from otherwise?), it's very difficult to factually and conclusively prove it. Another point of view suggests that training AI on the copyrighted material is fair use, because the ultimate product is of a transformative nature. [The RIAA versus AI, explainedThe question of fair use is haunting AI music generators.![](https://www.theverge.com/icons/apple_touch_icon.png)The VergeJordan Pearson![](https://cdn.vox-cdn.com/thumbor/v23sWCTBpmICcE6_BGgaAUm1xM0=/0x0:2040x1360/1200x628/filters:focal(1020x680:1021x681)/cdn.vox-cdn.com/uploads/chorus_asset/file/25383554/STK467_AI_MUSIC_CVirginia_B.jpg)](https://www.theverge.com/24186085/riaa-lawsuits-udio-suno-copyright-fair-use-music?ref=gorillasun.de) It might also relevant to bring up the lawsuit between the New York Times and OpenAI here, that has not come to a conclusion yet as of now - with the current state of affairs indicating that it will likely not end in favor of NYT: [NYT v. OpenAI: The Times’s About-Face - Harvard Law ReviewThe New York Times has sued OpenAI and Microsoft for the unpermitted use of Times articles to train GPT large language models. The case…![](https://harvardlawreview.org/wp-content/uploads/2023/03/cropped-hlr_512-270x270.png)Harvard Law Reviewhlr![](https://harvardlawreview.org/wp-content/uploads/2023/03/HLR-Logo.png)](https://harvardlawreview.org/blog/2024/04/nyt-v-openai-the-timess-about-face/?ref=gorillasun.de) ## Gorilla Updates Simultaneously while I was in Berlin at the start of July another important personal thing happened - a couple of iterations of my generative project "Some Parts of Me" were exhibited at [DiGen Art](https://x.com/DiGenArt?ref=gorillasun.de) back in Lebanon, for Beirut art week, as a part of their inaugural Digital Me group show. The pieces were specifically made to perfectly fill out the two main big screens that adorn the wall right next to the entrance of the gallery: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-19-at-14.25.26.png)](https://x.com/gorillasu/status/1813692007048785935?ref=gorillasun.de) [Link to Tweet](https://x.com/gorillasu/status/1813692007048785935?ref=gorillasun.de) I have a technical/inspiration write-up for the project that's almost done - but the project itself will need some more time before I fully release it, I have some ambitious ideas for it, which I still need to figure out. On a related note, I'm also in the process of giving a mini course about creative coding with P5JS for a small group of students, which was set up in collaboration with DiGen Art and Code Brave, a Lebanon based non-profit that aims to teach kids programming for better career opportunities. Because I don't have the time to be involved with all of the course sessions, I wanted to at least provide something for the students to explore on their own time, which is how I ended up putting together a mini course *site* that's a little more complicated than just a simple syllabus page - and basically ended up being a mini CMS in disguise. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-21-at-10.42.19.png) I will share a link to the page once it's ready. I also spent a copious amount of time on the design, I think it ended up being quite quirky although designing a user interface is never really easy, even if it's something as simple as this: Yes, I could have equally just spun up a Jekyll blog, but it kinda felt overkill for this purpose. While it's maybe not very impressive, I do think that I found a creative solution for storing and serving markdown files via a Github repo. I'll hopefully also make a proper write-up for it when I find the time 😌 Ultimately, the cool thing about it is that it can be easily repurposed for other courses/content - right now I'm still trying to figure out how to best do that with a minimal number of actions on the user's behalf. Consider this mini web project my answer to all the crappy course syllabi that I had to endure throughout my years at uni. And as the banner image indicates, I also picked up another older genart project this week - not sure what I'm searching for at this point, but I'm having fun exploring: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/yell.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/doingmyhomework.jpg) What would homework look like if you went to genart school? ## Music for Coding This past week I was captivated by [Steven Lynn](https://www.stevenlynnmusic.com/?ref=gorillasun.de)'s "Soundtrack for an Imaginary Western". The sounds that Steven's crafted is highly reminiscent of the legendary compositions by Ennio Morricone for "The Good, the Bad, and the Ugly", with the eclectic blend of unconventional sounds, especially the use of an electric guitar, which crafts that very distinct *western* atmosphere. If you're feeling like having a showdown with your bugs at high noon, this is probably the soundtrack for it: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more generative art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 64Simulating 20M Particles with JS - Algorithmic Barrier Grid Animations - A New Node Based Shader Editor - Drawing Chili Peppers with Math - Chromie Squiggles EOL - Streling Crispin’s Brain Worms - EthCC 2024 - Holographic Card Effect in CSS - Brian Kernighan on The Practice of Programming![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/07/Under-the-Microscope-Y-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-64) *And backlog of all previous issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy coding, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Newsletter 64 URL: https://www.gorillasun.de/blog/gorilla-newsletter-64/ Last updated: 2024-07-15T10:30:03.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 64th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Simulating 20M Particles with JavaScript ***What if I challenged you to simulate 1 million particles, on the CPU, only using JavaScript? How would you do it?*** This is exactly what David Gerrells tasked himself with in a recent blog post of his; in an attempt to simulate millions of particles with JavaScript, he leaves no stone un-turned in trying to squeeze the last bit of performance out of the particle simulation that he ends up putting together. And to call it a blog post is a bit of an understatement, as it ends up being quite a chunky article, where David successively explores 7 ideas to optimize his code: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-15-at-01.02.28.png)](https://dgerrells.com/blog/how-fast-is-javascript-simulating-20-000-000-particles?ref=gorillasun.de) [Link to Post](https://dgerrells.com/blog/how-fast-is-javascript-simulating-20-000-000-particles?ref=gorillasun.de) **So, how do you actually go about** **simulating such a massive amount of particles in JavaScript?** JS is notoriously not the fastest programming language, and has a bit of a bad rep in that regard, but you'd be amazed how much you can get out of it if you leverage the right features that it provides. Two important tools that David leverages to this end are web workers, essentially the implicit JavaScript method for achieving a sort of multi-threaded program, as well as shared array buffers, aka SABs. As the name implies, SABs are a data structure that make it possible to share data across several workers in a seamless manner. This is due to the fact that when passing the same SAB to a number of different workers, the memory of this SAB remains shared between them rather than being copid, making it such that changes made by one thread are immediately visible to the others. This in turn enables direct communication and shared state management where all workers can read and write the same underlying memory. David puts it simply as "**easy mode multithreading without having to worry locks. Cool stuff.**" This is in contrast to passing in a regular array buffer to a Web Worker, where the contained data is copied to the worker’s context. In other terms the web worker would essentially get its own individual copy of the data. Naturally, you can learn more about SABs in the MDN web docs: [SharedArrayBuffer - JavaScript | MDNThe SharedArrayBuffer object is used to represent a generic raw binary data buffer, similar to the ArrayBuffer object, but in a way that they can be used to create views on shared memory. A SharedArrayBuffer is not a Transferable Object, unlike an ArrayBuffer which is transferable.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global%5FObjects/SharedArrayBuffer?ref=gorillasun.de) Every week I discover new features of JavaScript SABs are just the tip of the iceberg though, David goes into detail about the other optimizations that he implements while continuously profiling his code. And here's what a million particles running on the CPU looks like: Genuinely a fascinating read! I would love to have a crack at it myself when I find the time for it; I'm super curious if the ideas can be adapted for particle simulations that involve collisions, since that would unlock several other ideas down the line, like soft-body physics and fluid simulations. Wouldn't have to be a million particles, a couple thousands would be entirely sufficient, and doing so without shaders would be super amazing. The tricky part though would be figuring out how to distribute the collision logic, including spatial hashing, aka a grid lookup, over several web workers with an SAB - maybe it's not actually that difficult to implement though? 🤔 (famous last words) ### Algorithmic Barrier Grid Animations Barrier grid animations, also referred to as picket-fence animations, parallax barrier animations, or more modernly as kinegrams, are a type of optical illusion that create the appearance of motion when a striped overlay is moved across an image consisting of the interlaced frames of an animation. The overlay, consisting of an array of alternatingly transparent and solid colored bars, will reveal the individual frames of the animation in sequential order when it is moved across the image, simply by occluding the rest of the interlaced image, producing the intended animation. I think it might be a bit easier to just show an example instead of describing it with words: The animations in the video were apparently made with a freeware called animbar This optical illusion is also interesting in an algorithmic setting, because it works equally well on a digital screen - here's the inspiration that led me down this entire rabbit-hole - TwiX user jitanpon from Japan made the following interesting animation, when sliding a striped overlay over a sinusoid, it reveals a sinusoid with a different frequency depending on the spacing of the individual bars: 0:00 /0:04 1× The text in Japanese says "The red line isn't moving" | [Link to Tweet](https://x.com/jitanpon/status/1812029597342663074?ref=gorillasun.de) The apparent pattern, hidden within the original pattern makes me think about information theory, and whether or not there are other creative ways to create hidden animations by using the barrier grid concept. Frank Force was quick to make a code golfed version of the sketch - if you're curious about recreating it, you can have a crack at deciphering Frank's tweet here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-11.30.31.png)](https://x.com/KilledByAPixel/status/1812130883714851309?ref=gorillasun.de) [Link to Tweet](https://x.com/KilledByAPixel/status/1812130883714851309?ref=gorillasun.de) The true master of these code based kinegrams is Neel Shivdasani, who's been exploring the concept for several months now, a few iterations of which can be seen over on his Twitter profile: 0:00 /0:08 1× [Link to Tweet](https://x.com/DataNeel/status/1613516236905906176?ref=gorillasun.de) ### A Node Based Shader Editor in the Making Something that's popped up a couple of times in my timeline over the past days is the node based shader editor that Palash Bansal's been working on. While I'm not very familiar with the current node based shader editor eco-system, the previews of Palash's tool look very, very promising, striking me as elegant and intuitive to use - have a look for yourself: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-23.19.09.png)](https://x.com/repalash/status/1810766317798191546?ref=gorillasun.de) [Link to Tweet](https://x.com/repalash/status/1810766317798191546?ref=gorillasun.de) | View the video on TwiX An innovative feature that sets the editor apart is a special type of math node, that let you write GLSL functions directly in form of math notation, which can then be directly plugged into a fragment shader. And this just makes so much sense that it's surprising something like it doesn't exist already. Another plus at this point are markdown nodes that also easily let you provide written context to explain specific node concoctions. It's definitely something I'll keep an eye on in the coming days/weeks, in some of his replies Palash hints at that it will be released sooner rather than later. You can however already try out an early alpha version of the editor [here](https://dev.shaders.app/?ref=gorillasun.de). ### Drawing Chili Peppers with Math You might've seen some of them already, but these impressive *math* based drawings by Hamid Yeganeh have been making the rounds on several of my socials, where Hamid shows a rendered graphic followed by the mathematical equations that produce the graphic: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-11-at-10.12.22.png)](https://www.threads.net/@hamidnaderiyeganeh/post/C84N3HhoCUM/?ref=gorillasun.de) [Link to Thread](https://www.threads.net/@hamidnaderiyeganeh/post/C84N3HhoCUM/?ref=gorillasun.de) And given the short description above the math part, it seems that the big elephant equation here describes the rgb value of the pixels in the image. And after some initial doubts about legitimacy (because you could technically just slap a big slab of math under any image), the math does in fact check out, based off of the verification that Anisch Chopra did - reporting about it over on github: [GitHub - anishchopra/generating\_chili\_peppers: Using math to generate an image of chili peppersUsing math to generate an image of chili peppers. Contribute to anishchopra/generating\_chili\_peppers development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubanishchopra![](https://opengraph.githubassets.com/f19c8a5b0496042117da585ef6371962a81dccda4e1b2d640ab31d933cc769f0/anishchopra/generating_chili_peppers)](https://github.com/anishchopra/generating%5Fchili%5Fpeppers?ref=gorillasun.de) This makes me wonder however, how is the sausage made? Is the mathematical equation put in place in its entirety before the artwork is rendered? Or is it more of an iterative process, where the equation for a single chili pepper is derived, and then the rest of the artwork is put together based on that? I believe the latter to be true. From a social media POV, it's definitely a smart move to include the math that produces the image, since the scary looking equation definitely makes for that wow effect - but otherwise, philosophically, is it necessary to show how the artwork was made, to ultimately appreciate the chili peppers for what they are? Thinking about it for a while, it's a bit like if a painter were to append a photograph of their atelier underneath their artworks - but then again, that's also the case for code golfed artworks/animations where it's simply tradition to show the minimal code as a proof. On the other hand however, you could alos ocnsider the math to be part of the artwork, if intentional, that would then be a different discussion. Maybe the big take-away here is that I should be showing more of my code underneath the generative art that I post on social media - is that ultimately the key to big numbers? Maybe I should also start posting on Facebook to really maximize the number of people that I can impress in that way 🤷 Anway, I'll now leave you to ponder on these thoughts by yourself. ### Other Cool Genart Things And to wrap up this section here's a couple of other cool things I found: - [Distance to the Sine Curve](https://suricrasia.online/blog/sine-distance/?ref=gorillasun.de): ever wondered if there's an SDF to represent a sine curve? Well, here's your answer: Blackle Mori writes about how to approximate a sine SDF with Chebyshev polynomials. - [Plotter Art Month by Thibaud Frere](https://codepen.io/tfrere/pen/KKLjOxo?ref=gorillasun.de): for Genuary 2024 Thibaud decided to make a plotter drawing for each prompt, compiling the results in a wonderful little page that the showcases 31 cards, each of them holding one of the artworks alongside a little description. ## Web3 News ### Chromie Squiggles #9999 Minting July 15th (the day this newsletter comes/came out) will mark the minting of the last Chromie Squiggle, where the final edition of the iconic generative artwork, #9999, will go into the collection of [LACMA](https://www.lacma.org/?ref=gorillasun.de), the Los Angeles County Museum of Art. For this special occasion, Erick Calderon, the creator of Artblocks and the genesis mint on the platform, joined forces with [0xDEAFBEEF](https://x.com/%5Fdeafbeef?ref=gorillasun.de) to put together a very special farewell contract, inviting everyone to participate in the mint by leaving their mark in the transaction that creates the final mint. Snowfro explains this in a announcement of his over on TwiX: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-11-at-09.44.45.png) [Link to Tweet](https://x.com/ArtOnBlockchain/status/1811151870964232420?ref=gorillasun.de) There should be another announcement with more details about it, as well as the contract address, on Monday, but as far as Snowfro's tweet states, to record your participation with the final mint you simply need to send an arbitrary amount of ETH to this special contract, which then triggers a function that sends back the ETH and registers the transaction. This minting event is going to run for an entire week, and the most important thing is that there's no website or interface to connect your wallet to - simply a raw contract that can be viewed on Etherscan. This announcement from Snowfro garnered a massive response, as it is essentially marking the end of an era. In another tweet he explains the motivation behind this particular way of celebrating the project's end of life: Snowfro draws inspiration from the documentary 'Levitated Mass', that recounts the story of Michael Heizer's iconic 340-ton boulder sculpture and its journey to LACMA: [Levitated Mass - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Levitated_Mass_by_artist_Michael_Heizer_at_Los_Angeles_County_Museum_of_Art_in_California_LCCN2013632453.tif/lossy-page1-1200px-Levitated_Mass_by_artist_Michael_Heizer_at_Los_Angeles_County_Museum_of_Art_in_California_LCCN2013632453.tif.jpg)](https://en.wikipedia.org/wiki/Levitated%5FMass?ref=gorillasun.de) The participatory nature of the farewell contract is meant to symbolically reflect the spectacular nature of the boulders travel through the towns it passed through, attracting thousands of viewers along the way - making the artwork so much more meaningful. Snowfro's tweet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-13.35.52.png)](https://x.com/ArtOnBlockchain/status/1811518488554385900?ref=gorillasun.de) [Link to Tweet](https://x.com/ArtOnBlockchain/status/1811518488554385900?ref=gorillasun.de) The boulder now sits above a 456-foot pathway in front of LACMA to accommodate for 360-degree viewing. ### Brain Worms by Sterling Crispin Sterling Crispin's "Brain Worms" is arguably the most intriguing and innovative Web3 project that I've seen in a while - having been in the works for several months, Sterling's built a generative art NFT project based on the fractional ERC-404 token standard. The project is stored fully on chain, in addition to having interesting game and multiplayer mechanics besides the collectible aspect of it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-11-at-09.57.12.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-13.46.15.png) [Link to Tweet](https://x.com/sterlingcrispin/status/1811144681805468076?ref=gorillasun.de) I'll have to invest some more time to fully understand the minting mechanics behind these blockchain native creatures - but as far as I understand they can be evolved (leveled-up) and their traits re-rolled by being traded, something that's made possible due to being based on the ERC-404 standard. What's even more interesting is the entire alternative fictional universe that's spun up around the project, that makes it believably seem that the brain worms are actually real creatures that are being researched by an organization under the name of Del Complex. All of it has quite an intentional eery and liminal vibe to it. The project's website also follows that theme, and the aesthetics are super on point, with a cool interface where you can examine your tokens, mimicking a sort of imaging device: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-16.42.28.png) [Link to Del Complex Website](https://delcomplex.com/brainworms?ref=gorillasun.de) Moreover, Sterling's also open sourcing the complete source code for the project under the MIT license. You can find more info about this in another announcement of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-12-at-09.04.46.png)](https://x.com/DelComplex/status/1811416705421459706?ref=gorillasun.de) [Link to Tweet](https://x.com/DelComplex/status/1811416705421459706?ref=gorillasun.de) ### Gavin Wood at EthCC 2024 If you don't know Gavin Wood, he's the co-founder of Ethereum and the creator of the Polkadot and Kusama chains. Last week he gave an insightful talk at [EthCC 2024](https://ethcc.io/?ref=gorillasun.de) in Brussels, the yearly Ethereum community conference - you can find a VOD of the entire talk here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-13.59.22.png)](https://x.com/thewhiterabbitM/status/1811009553565114766?ref=gorillasun.de) [Link to Tweet](https://x.com/thewhiterabbitM/status/1811009553565114766?ref=gorillasun.de) In summary however, he addresses the current state of Web3, its perception and what it is actually about - with the bottom-line being that Web3 is not just about blockchain tech, or NFTs, or cryptoeconomics, but generally about building resilient digital systems that are interoperable, performant, and scalable. If you want this talk summarized in form of a couple of important bullet points, Daureen compiled a useful TwiX thread to that end: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-11-at-09.53.11.png)](https://x.com/Daureeen/status/1811171231300767886?ref=gorillasun.de) [Link to Tweet](https://x.com/Daureeen/status/1811171231300767886?ref=gorillasun.de) ## Tech & Web Dev ### Holographic CSS Effect Besides Pinterest, I also frequently find myself exploring code pen to find new inspirations. Last week, I came across this amazing page by Simon Goellner in which he explores holographic card effects with CSS, something that you'd more commonly find in physical form when collecting trading card games like Pokémon or MTG. This experiment was initially posted as a codepen but later on also as an improved standalone page: [Pokémon Cards CSS Holographic EffectAn exploration of what’s possible with CSS for Pokemon Cards, simeydotme (Simon Goellner)![](https://poke-holo.simey.me/favicon.png)![](https://poke-holo.simey.me/thumb.png)](https://poke-holo.simey.me/?ref=gorillasun.de) When collecting these cards by opening packs, there's sometimes a chance to get a shiny, reflective card, namely a foil (or holofoil in Pokémon) which is usually more valuable than a normal card. Depending on which set of cards this foil belongs to it might have different physical and/or reflective properties appearance - which Simon also tries to immitate as closely as possible his exploration, enumerating a whole bunch of different effects And the effect that Simon's achieved is nothing short of stunning; he's managed to make the cards feel convincingly real, almost making them appear to pop out of the screen. Simon also provides a Github repo for the code that makes this holographic effect possible: [GitHub - simeydotme/pokemon-cards-css: A collection of advanced CSS styles to create realistic-looking effects for the faces of Pokemon cards.A collection of advanced CSS styles to create realistic-looking effects for the faces of Pokemon cards. - simeydotme/pokemon-cards-css![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubsimeydotme![](https://repository-images.githubusercontent.com/505538251/a4d243ef-2779-4881-9796-844d2ba47805)](https://github.com/simeydotme/pokemon-cards-css?ref=gorillasun.de) Although this made quite the splash 2 years ago now, I did also come across a tweet by Josh Dance in which he attempted the recreation of the effect on his own, sharing a cool write-up in which he elaborates a little on the techniques used: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-14.06.09.png) [Link to Tweet](https://x.com/JoshDance/status/1582080945795977219?ref=gorillasun.de) ### Typescript 5.5 & Isolated Declarations Something that entirely passed me by the week before heading off to Berlin at the start of July, was the release of TypeScript 5.5\. While I've just started using TypeScript a little bit in my fullstack journey learning Next.js, it seems that there's been a whole slew of new features and quality of life improvements - the release notes to that end are super elaborate: [Announcing TypeScript 5.5 - TypeScriptToday we’re excited to announce the release of TypeScript 5.5! If you’re not familiar with TypeScript, it’s a language that builds on top of JavaScript by making it possible to declare and describe types. Writing types in our code allows us to explain intent and have other tools check our code to catch mistakes like typos,![](https://devblogs.microsoft.com/typescript/wp-content/uploads/sites/11/2018/10/Microsoft-Favicon.png)TypeScriptDaniel Rosenwasser![](https://devblogs.microsoft.com/typescript/wp-content/uploads/sites/11/2018/08/typescriptfeature.png)](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/?ref=gorillasun.de#isolated-declarations) In a previous issue of the newsletter I shared Marvin Hagemeist's series of articles titled "Speeding up the JavaScript ecosystem", and in light of the new TypeScript release he writes about one of the new features that addresses an accute problem in the JavaScript eco-system, concerning the packaging of libraries: [Speeding up the JavaScript ecosystem - Isolated DeclarationsTypeScript’s new isolated declaration feature is a game changer for sharing code among developers. It significantly simplifies the process of packaging your code for consumption whilst reducing the time to create type definition files from minutes, sometimes even hours, down to less than a second.![](https://marvinh.dev/apple-touch-icon.png)Isolated Declarationsmarvinhagemeist![](https://marvinh.dev/media/me-twitter.jpg)](https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-10/?ref=gorillasun.de) ### Brian Kernighan Reflects on *The Practice of Programming* Brian Kernighan was one of the original creators contributing to the creation of the Unix operating system, alongside Ken Thompson and Dennis Ritchie at Bell Labs, later also recoginzed also co-authoring the seminal first book on the C programming language with Dennis Ritchie: > \[...\] [Brian Kernighan](https://en.wikipedia.org/wiki/Brian%5FKernighan?ref=gorillasun.de), had written the first C tutorial, and he persuaded Ritchie to coauthor a book on the language. Kernighan would write most of the book's "expository" material, and Ritchie's reference manual became its appendices. Later on he authored another important book titled "The Practice of Programming" with Rob Pike, that had the aim of making individual programmers "more effective and productive". Today it is considered as a sort of early grail in that regard, and still holds up in many ways till today. He recently made an appearance on the Book Overflow podcast, where he reflects on that particular book, the motivations behind writing it and how it has aged in the modern programming landscape: There were also interesting discussion over on Hacker News about it, praising it for what a masterpiece it is: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-14-at-17.38.20.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=40927481&ref=gorillasun.de) ## Gorilla Updates Last week I actually found the time to dive back into the circle tangency problem that I shared a couple of weeks ago - the original tweet for reference: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-15-at-10.36.32.png)](https://x.com/gorillasu/status/1802639444631077293?ref=gorillasun.de) [Link to Tweet](https://x.com/gorillasu/status/1802639444631077293?ref=gorillasun.de) Before going back and diving into all of the interesting replies that people provided, I made an attempt at solving the problem on my own. This led me to understand that this particular geometric problem can be represented as a linear system of equations, where the radii of the circles are the unkown variables and the edge lengths of the polygon that's formed by connecting their centers are the constants/knowns. You end up with something that has the following form `r1 + r2 = d1, r2 + r3 = d2, ..., rn + r1 = dn`. No the tricky part is figuring out whetheror not this system is solveable - turns out that (another) David over on Twitter came to the same conclusion when he tackled the task, discovering that there's a nifty solution to it only when we try to place an odd number of circles: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-15-at-10.04.07.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-15-at-10.03.44.png) [Link to Thread](https://x.com/physbuzz2/status/1802676137359012014?ref=gorillasun.de) I don't fully understand why it's only solveable for an odd number of circles at this point (give me another session to think about it 😆), but the code for it is surprisingly short- essentially just a nested loop that magically produces the perfect radii for the circles given the lengths of the sides of the polygon that's formed by connecting the centers of the circles. The issue with this is that the blobby, flower like shapes that led me to this problem in the first place only work when it's an even number of circles - otherwise the shape can't line up with itself anymore. The creative hack that I figured for this is to first compute the solution for an odd number of circles following David's approach, then deleting 2 circles from that ring and replacing them with three new ones, placing their centers at random on the empty arc, then computing their radii in a recursive manner with another linear system: ![Image](https://pbs.twimg.com/media/GSTDa_ZXEAAB-0G?format=png&name=small) ![Image](https://pbs.twimg.com/media/GSTF4oCWIAAKIBz?format=png&name=900x900) The linear system here is easier to solve because we already have the radius of the first and last circle, so we just need to fill in the unknowns. There's a few other interesting things that I learned while exploring this task, which I might write about in the future. Let me know if you're interested in an article about this particular geometric problem. ## Music for Coding This week's recommendation comes directly from Tom Hinton @pumaparded over on TwiX who occasionally participates in Raph's WCCChallenge (more frequently than me at least) - he sent over the album "Voice of Storms" by a band Horseburner that I haven't heard of before, but it's totally up my alley. They have a cool vibe that sounds a little like a mix of Mastodon and Baroness: 💡 If you have music recommendations, shoot them my way — would be curious to know what you guys listen to while coding! 👀 And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 63Genart Summit 2024 - Geart Group Show Barcelona - The International Generative Art Conference since 1998 - Chris McCully’s Snippp.io - Exploring Randomness in JS - Objkt.com Native Genart Minting - Are NFTs Dead... yet? - JavaScript Set Methods - HyperCard Simulator - The State of AI 2024![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/07/img.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-63) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one!** **\- Gorilla Sun 🌸** ### Gorilla Hypersub July Update URL: https://www.gorillasun.de/blog/gorilla-hypersub-july-update/ Last updated: 2024-07-15T10:31:30.000Z A quick update about the Gorilla Hypersub, the new member section, the new articles for the past month, the monthly art airdrop, as well as what's in store for the coming weeks! _This post is for subscribers on the Hypersub tier only._ ### DIY Market Analysis: Objkt.com Case Study URL: https://www.gorillasun.de/blog/diy-market-analysis-objkt-com-case-study/ Last updated: 2024-07-15T10:31:38.000Z In this tutorial we have a look at how to do our own market Tezos analysis by querying the Objkt.com GraphQL API endpoint via a python script and then visualizing the fetched data with matplotlib. _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 63 URL: https://www.gorillasun.de/blog/gorilla-newsletter-63/ Last updated: 2024-07-08T09:50:05.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 63rd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Generative Art Summit 2024 It's difficult to put in words what a whirlwind tour the Generative Art Summit was, especially considering that Berlin was in the midst of hosting some games of the European football cup - I'm not a big sports fan, but the city was truly brimming with energy. While the Summit was in part a big celebration of Herbert W. Franke's life work, it was equally a celebration of Generative Art in general, bridging between the old and new generations, and highlighting all of the different modes of expression within the field. Susanne Päch did an absolutely stellar job at organizing the Summit. And it was genuinely an incredibly experience, not only to see some of the generative art pioneers in the flesh, but also to meet many of my fellow generative artists and peers that I'd previously only interacted with over the internet. Here's a few pics from the past days: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-06-at-22.25.56.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-06-at-22.22.57.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-06-at-22.22.04.png) [Link to Tweet #1](https://x.com/gorillasu/status/1808831518896161027?ref=gorillasun.de): Big Artist group shot taken in front of the Academy of Arts | [Link to Tweet #2](https://x.com/gorillasu/status/1808532623884464542?ref=gorillasun.de): The Auditorium in which the talks were held + a pic Haiver took at the Expanded.art opening the day before the conference + some of the swag that others were handing out | [Link to Tweet #3](https://x.com/gorillasu/status/1809352391805772048?ref=gorillasun.de): A selfie with Raph at the Creative Code Stammtish held ever first Friday of the month. A few weeks ago I was debating whether or not to attend, but I am incredibly happy that I did end up going - having conversations in person is just incomparable to chatting online. And if you didn't attend, don't fret, I'm already in the process of preparing a big recap for my trip - while I didn't manage to attend all of the events or presentations I do have a lot of thoughts that I want to share. I just came back yesterday and think I ended up catching the flu, so it might take a few days for me to compile all of the info. I also took note of the many cameras that were set up at the back of the auditorium and recording the various talks - I'm wondering if these recordings will be released somewhere at some point. The gathering in Berlin is definitely one for the history books, and again, I'm really happy that I was part of it. ### MAGBa in Barcelona If you're still hanging around somewhere in Europe, and aren't tapped out after the Genart Summit, your next destination is Barcelona: a lovely group of 9 generative artists has banded together to kick off a group show under the title "MAGBa: Mostra Art Generatiue Barcelona" (translates to Generative Art Show Barcelona) in collaboration with Palo Alto and The Generative Art Museum. The exhibition will be held in the Escoleta building in the Palo Alto complex in Poble Nou, running from July 11th through August 23, and you can find a list of the participating artists over on the official website here: [MAGBa · Palo Alto BarcelonaDesde el próximo 11 de julio hasta el 23 de agosto de 2024 la nave Escoleta acogerá MAGBa, la Muestra de Arte Generativo de Barcelona, donde nueve artistas darán a conocer sus creaciones mediante el uso de algoritmos y del azar como medio de expresión artística.![](https://static.wixstatic.com/media/c89c43_4eb14db67ee84bf6b321caee5057c26c~mv2.png/v1/fill/w_192%2Ch_192%2Clg_1%2Cusm_0.66_1.00_0.01/c89c43_4eb14db67ee84bf6b321caee5057c26c~mv2.png)Palo Alto Barcelona![](https://static.wixstatic.com/media/c89c43_e84b8aaf2dbd4dbbb882e692d50b3c7c~mv2.png/v1/fill/w_1080,h_1080,al_c/c89c43_e84b8aaf2dbd4dbbb882e692d50b3c7c~mv2.png)](https://es.paloalto.barcelona/expomagba?ref=gorillasun.de) While the page is only in Spanish (a click from your browser's translate function should remedy this), Luis Fraguada was so kind to send over a press release in English that explains a little bit more what the show is about, to those that might not be so familiar with what generative art is - here's an excerpt: > By adding bounded randomness to each algorithm, the computer creating the work adds some variation each time it paints the artwork.. In this act, which we might imagine to be repetitive, different and unique pieces are created every time. Works that not even artists can replicate, ephemeral works of art that capture the will and voice of the artist but completely escape their control. There's also been a couple of teasers floating around over on TwiX, if you're curious about what it looks like, but I'm certain that we'll be seeing a lot more media coverage in the coming days: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-08-at-01.22.55.png)](https://x.com/mekhno%5Fart/status/1809295437980922327?ref=gorillasun.de) [Link to Tweet](https://x.com/mekhno%5Fart/status/1809295437980922327?ref=gorillasun.de) ### The Official Generative Art Conference While everyone was in Berlin, discussions came up about on where to eventually meet up in 2025, in the case that the genart summit isn't going to become a yearly re-occurrence - during these talks it came to light that there actually is an official generative art conference that's been held yearly since 1998\. The official website for the conference is quite a treasure trove, loaded with links to papers and books that were released through the conference over the years: [GENERATIVE ART INTERNATIONAL CONFERENCEGenerative Art Conference, Generative AI, Generative Approach to Architecture, design, city design, Art, Music, Poetry. Generative metaverse, Images, Movies and 3D models of Generative Visionary events![](https://generativeart.com/images/favicon.ico)GENERATIVE ARTCelestino Soddu, Enrica Colabella![](https://generativeart.com/GAstelline.png)](https://generativeart.com/?ref=gorillasun.de) I genuinely tried making sense of the website's structure, but to no avail, it seems to be an archipelago of different pages that are somehow interlinked, yet also placed under different domains. I can't really trace back how I ended up on this other book-shop page, it does strike me as the most interesting one though as it contains all of the previous proceedings of the conference since its inception - with many thousands of pages all available for free: [Generative Art and Design free downloadable ebooks. ARGENIA Publisherebook about Generative Design and Art, proceedings of GA conferences since 1998![](https://static.ghost.org/v5.0.0/images/link-icon.svg)![](http://www.artscience-ebookshop.com/AleatoryCities_cop_RID.jpg)](https://www.artscience-ebookshop.com/?ref=gorillasun.de) I'm not entirely certain about the vibe of the conference, but in comparison to the genart summit that happened last week in Berlin, it seems to be a much more traditional, *academic style* conference (something I was running away from when I first got into generative art). What I find a bit peculiar is that I can't seem to find any pictures of the conference, even though it's been ongoing for 26 years - in an exchange over on TwiX, Aleksandra does vouch however that the conference exists: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/collage-9-.jpg)](https://x.com/sableRaph/status/1549031860310888448?ref=gorillasun.de) [Link to Thread](https://x.com/sableRaph/status/1549031860310888448?ref=gorillasun.de) I also discovered that I have apparently commented on Raph's tweet from two years ago - something I've completely wiped from my memory since. While I'm more concerned with the mysterious nature of the conference, Raph's biggest gripe seems to be that they have "modernized" the aesthetic of the website in the meantime. Maybe I'm meeting the entire thing with too much skepticism and the intentions behind the conference are genuine - to my defense, I'm just a little bit traumatised by predatory journals/conferences that demand exorbitant participation fees. The mastermind here, that's behind organizing the conference, is Celestino Soddu, who's written quite a few interesting papers and books on generative design himself: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-08-at-00.53.22.png) Figure from the paper "[Aleatority and Urban Species; Unique, Unrepeatable and Recognizable Identity, like in Nature](https://www.researchgate.net/publication/272740244%5FReconstructing%5FAncient%5FLandscape?ref=gorillasun.de)" The Le Random timeline actually also marks the first installment of this International Generative Art Conference as an important moment in the 1990s: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-07-at-18.28.23.png) It might after all be an interesting potential time + location for another genart retreat: this year's conference is taking place on the 17th, 18th, and 19th of December in Venice, and participation for guests that aren't presenting seems to be free of charge. Otherwise I also heard that Bright Moments is planning on hosting a week-long event in Berlin next year. I couldn't however find any more info about it at this point. ### Chris McCully's Snippp.io [Back in January](https://www.gorillasun.de/blog/gorilla-newsletter-41/#chris-mccullys-snippets-for-art) I shared a cool tool built by my fellow generative artist Chris McCully that's entirely geared around sharing and discovering useful snippets of code. He's recently made it public that he's been back at it and completely revamped the tool, now much improved with many additional features. If you want to explore some of the existing snippets, or add your own, you can check it out here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-06-at-22.14.05.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-07-at-14.19.54.png) [Link to Tweet](https://x.com/SpinkDinky/status/1809179746401436070?ref=gorillasun.de) | [Link to Snippp](https://snippp.io/?ref=gorillasun.de) One thing that I would love to see, and that I think would make the tool much more accessible, is an info/description box that users need to specify when creating a new snippet - otherwise it's a bit difficult to try and decipher what a snippet does just from its name or trying it out manually. Occurred to me while trying out some of the snippets that are already available, but that's just my two cents. ![](https://media.tenor.com/sgof3MXQFOgAAAAC/snip-snap-michael-scott.gif) \*M\* ### Exploring Randomness in JavaScript While building a color swatch generator with [Alpine.js](https://alpinejs.dev/?ref=gorillasun.de) \- Ben Nadel discovers that JavaScript actually provides an alternative method to the `Math.random()` function for generating random numbers - namely using the Crypto API (and in this case it has nothing to do with Web3). While the MDN docs claim that this cryptographic random number generator is more secure, Ben sets out on an exploration to determine how the Crypto API compares to the regular `random()` function in the Math module, and whether or not it also feels *more random*. He provides an interesting experiment for gauging the apparent randomness: [Exploring Randomness In JavaScriptBen Nadel compares the randomness of Math.random() to crypto.getRandomValues() in JavaScript.![](https://bennadel-cdn.com/favicon.png)Ben Nadel![](https://bennadel-cdn.com/resources/uploads/2024/math-random-vs-crypto-get-random-values@2x.png)](https://www.bennadel.com/blog/4669-exploring-randomness-in-javascript.htm?ref=gorillasun.de) So what's this `Crypto.getRandomValues()` function in Javascript? The method describes itself as a means to *get cryptographically strong random values* \- which in other terms means that it is not straightforward, or straight-out impossible, to reverse-engineer the method/algorithm by which these numbers were generated, which in turn also means that it is also not possible for third parties to predict the next values that the PRNG will generate. Which is quite an important notion in cryptography, blockchain tech as a big example here, where many things rely on random cryptographic hashes. Ben's experiment indicates that the generated randomness is comparable, but it also feels cut short in a way - I wish he had explored things a bit further. This makes me wonder, what are actually some other ways are for comparing PRNGs? Ben's experiment reminds me of a sketch I did for the 24th prompt of Genuary in 2022, where the given prompt asked to create a PRNG from scratch - and I ended up finding the generated patterns quite fascinating: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-07-at-13.09.32.png)](https://x.com/gorillasu/status/1485543504285769728?ref=gorillasun.de) [Link to Tweet](https://x.com/gorillasu/status/1485543504285769728?ref=gorillasun.de) I think this might actually be quite a nice topic for an upcoming article. In the meantime, if you want to learn more about the `getRandomValues()` function, here's the MDN Web Docs on it: [Web Crypto API - Web APIs | MDNThe Web Crypto API is an interface allowing a script to use cryptographic primitives in order to build systems using cryptography.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/API/Web%5FCrypto%5FAPI?ref=gorillasun.de) And if you're interested in reading the color swatch article that inspired Ben's article on randomness, you can find it here - it's also quite relevant to the Newsletter: [Color Palette Utility In Apline.jsBen Nadel builds a color palette tool using Alpine.js. Color palettes can be saved (and loaded) as PNG and SVG files.![](https://bennadel-cdn.com/favicon.png)Ben Nadel![](https://bennadel-cdn.com/resources/uploads/2024/color-palette-utility.gif)](https://www.bennadel.com/blog/4668-color-palette-utility-in-apline-js.htm?ref=gorillasun.de) ## Web 3 News ### Objkt.com's Native Generative Art Feature Release The biggest news last week is arguably Objkt.com's announcement of native support for minting generative on their big marketplace platform. They're kicking the feature off as a collaboration with the curated media platform Fakewhale, and placing none other than PixelFool as the premier artist to publish a generative project with the new feature: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-06-at-22.06.58.png)](https://x.com/fakewhale%5Fxyz/status/1809255838273478720?ref=gorillasun.de) [Link to Tweet](https://x.com/fakewhale%5Fxyz/status/1809255838273478720?ref=gorillasun.de) It's definitely strikes me as an interesting timing for such a release. I'm quite curious to see how it will compare to fxhash, the longstanding flagship genart marketplace on Tezos - especially considering fxhash's recent Vertex release. This also makes me wonder whether or not Re-tain will ever see the light of day. If you want to learn a little more about PixelFool's piece "Uncertain Index" you can also check out the article that's linked in the Tweet (as always can't link to .xyz domains since they're considered spam when sending out this Newsletter). ### Are NFTs Dead... yet? One of the big talking points at the genart summit were NFTs - to be precise, whether or not they were dead... yet. And it seems that NFTs have been in the death-throes for the past couple of years. TwiX user heavenrazor makes a statement about it that garnered quite a bit of public approval: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-07-at-23.13.44.png)](https://x.com/heavenrazor/status/1809370234790273040?ref=gorillasun.de) [Link to Tweet](https://x.com/heavenrazor/status/1809370234790273040?ref=gorillasun.de) Bottom-line is that cartoony Penguin images, or any other animal for a matter of fact, are simply lame in the long term - what really is there to talk about? Especially with more people becoming familiar with Web3 technology and the idea of digital ownership becoming more commonplace. But this particular discourse seems to be in a constant state of transience - the thing is, NFTs aren't dead, the hype is, and I think it's bothering people that this is the case. I do however fully agree that we need thought provoking revolutionary shit. ### The CasterBites Newsletter To stay up to date with different niches I follow quite a few Newsletters, one of them is the CasterBites Newsletter, that I've come to really appreciate. It quickly sums up what's new over on Farcaster in 5-6 brief headlines - with an additional section that shows the top trending tokens in the past 24 hours, which is less interesting (to me) but also kinda neat if you're into this sort of thing: [CasterBites: Farcaster Daily DigestDive into Farcaster’s Daily Digest for your personalized must-reads. Spend just 3 minutes daily to stay updated with all things important. Never miss out again!![](https://www.casterbites.com/favicon.ico)![](https://www.casterbites.com/opengraph-image.png?5daaab77221a71d1)](https://www.casterbites.com/?ref=gorillasun.de) You can also choose if you'd like to receive the Newsletter on daily or weekly basis, which is neat. Not a paid promo. ## Tech and Web Dev ### JavaScript Set Methods There's an exciting development with JavaScript: the language now supports Set methods, and that as a baseline widely available feature, meaning that these functions are now supported by all major browsers: [New JavaScript Set methods | MDN BlogNew JavaScript Set methods are landing across browsers. Learn about sets, how you can use these methods to compare different sets, create new sets with specific properties, and more.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web DocsBrian Smith![](https://developer.mozilla.org/en-US/blog/javascript-set-methods/featured.png)](https://developer.mozilla.org/en-US/blog/javascript-set-methods/?ref=gorillasun.de) Here you might ask, weren't sets already a thing in JavaScript? Yes, but not really. While Sets were introduced in the ECMAScript 2015 update, they were still largely incomplete - missing quite a bit of functionality, that up to this point needed to be implemented manually. The newly introduced functions now make it quite easy to compute set intersections, unions, differences, etc... essentially all sorts of set operations can now be used out of the box within JavaScript. And of course the MDN Web Docs are already up to date in that regard: [Set - JavaScript | MDNThe Set object lets you store unique values of any type, whether primitive values or object references.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global%5FObjects/Set?ref=gorillasun.de) I find it super exciting, not because I have a particular use case in mind, but because it gives me another creative tool to play around with. ### HyperCard Simulator HyperCard is a software application and development environment created by Bill Atkinson and released by Apple Computer in 1987\. It combines elements of a database, a programming language, and a graphical user interface (GUI) to allow users to create and navigate "stacks" of virtual cards. In other words, it allowed users to create their own little utility programs of various kinds. The following website revives the software in form of an online simulator that lets you import your own Hypercard stacks, in case you still have access to some or want to make them in 2024: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-08-at-09.44.51.png)](https://hcsimulator.com/?ref=gorillasun.de) [Link to Simulator](https://hcsimulator.com/?ref=gorillasun.de) The Simulator is also already preloaded with a bunch of stacks that I had a load of fun exploring. In particularly I highly enjoed the minimal game "Foul Airs" which I think is conceptually simply a masterpiece. Looking a bit more into it I also found this article by Jen Thorp - a decade old at this point - where he writes a beautiful recount of the impact that the software has had on him: [The Hypercard LegacyApple’s forgotten software gem was a last breath for democratized computing. Can it be revived?![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)The NextographerJer Thorp![](https://miro.medium.com/v2/resize:fit:700/1*NqWGz3iof7FneP5H8mc3DQ.jpeg)](https://medium.com/the-nextographer/the-hypercard-legacy-e5b9eb273b6a?ref=gorillasun.de) > HyperCard was a tool for making tools – Mac users could use Hypercard to build their own mini-programs to balance their taxes, manage sports statistics, make music – all kinds of individualized software that would be useful (or fun) for individual users ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-08-at-09.49.54.png) I think this is my favorite find this week. ### Progressive Blur Effect with webGL We've also got another contender for the progressive blur effect trick, and while it might not be as light-weight as [the one that we had a look at two weeks ago](https://www.gorillasun.de/blog/gorilla-newsletter-61/#progressive-blur-in-css), aesthetically it's quite nice. This time the blur is achieved with a WebGL Shader that gradually blurs the image depending on the image's relative position with respect to the scroll of the page: [Progressive Blur Effect using WebGL with OGL and GLSL Shaders | CodropsLearn how to create an interesting progressive blur effect using WebGL, OGL, and GLSL shaders.![](https://codrops-1f606.kxcdn.com/codrops/wp-content/themes/codropstheme03/favicons/apple-touch-icon.png?x11129&v=2)CodropsJorge Toloza![](https://codrops-1f606.kxcdn.com/codrops/wp-content/uploads/2024/06/WebglProgressiveBlurFeatured.jpg?x11129)](https://tympanus.net/codrops/2024/07/02/progressive-blur-effect-using-webgl-with-ogl-and-glsl-shaders/?ref=gorillasun.de) ## The State of AI 2024 I think that at this point we're all familiar with the "State of" type of articles - they've somehow become much more popular in recent years - or it could be a classic Bader Meinhoff illusion where I'm just noticing the increased frequency due to compiling this Newsletter every week. But these kinds of articles are popular for a good reason - they're actually good indicators about the public's general sentiment around a certain field/topic. Tn the State of AI 2024, the Retool blog provides some interesting stats that reflect the current state of AI in 2024: [Read the newest State of AI report | Retool Blog | CacheLearn how developers are building AI apps with real ROI and get insights on tools like vector databases, LLMs, and inference platforms in this report.![](https://retool.com/favicon-blog-light.svg)Cache![](https://cdn.sanity.io/images/bclf52sw/production/e4c289506185d3c2adb52ee833a06e7c09ba719c-1920x1080.png)](https://retool.com/blog/state-of-ai-h1-2024?ref=gorillasun.de) With 59% of votes there seems to be consensus that AI in its current state is still vastly overhyped, while it is also the case that the current adoption rate of AI tech is still quite low. Other interesting questions involved whether or not people were secretly using AI tools at work, and apparently 29% of people actually are. I would also like to point out the 2023 article, that is equally beautifully made and can serve as a comparison for this year's article: [Retool State of AI Report 2023What models, infra, and apps are devs using and loving? What are AI’s real production use cases? Get insights on AI sentiment, adoption, and tooling in the report.![](https://retool.com/icons/state-of-ai-favicon.svg)![](https://cdn.sanity.io/images/bclf52sw/production/873b71ab4bdb93aeffd1c103b387cc98e501d26a-1200x628.png)](https://retool.com/reports/state-of-ai-2023?ref=gorillasun.de) ## Gorilla Updates No updates from me this week - I've just been trying to soak up all of the energy that I've received over in Berlin and will likely need a little bit more time to process all of that. I am however full of inspiration and new ideas for things to work on, that I'm incredibly excited to start/continue working on. The only thing I had time for this week was starting to learn a little bit more about Solidity programming - just to get a feel for the complexity of it - via this free course by Alchemy (also not sponsored): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-07-at-10.51.10.png)](https://university.alchemy.com/overview/solidity?ref=gorillasun.de) [Link to Course](https://university.alchemy.com/overview/solidity?ref=gorillasun.de) One other final thing that I managed to put together is this stupidly annoying memory game as a submission for Raph's WCCChallenge, you can find it [here](https://openprocessing.org/sketch/2312275/?ref=gorillasun.de). It's mainly intended as a proof of concept for making a generative memory game, it's not very aesthetic at this point however. ## Music for Coding Don't ask me how I'm finding these — the YouTube recommendation algorithm just knows me too well at this point. The thumbnail + video title combo made me click in the first place, but the awesome music and visualizer kept me enthralled. Samuel Shepherd is a British music producer that makes tracks under the alias of Floating Points, and his vibe is definitely one that I enjoy: But that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 62Basins of Attraction in Chaos Theory - Then and Now by Jasia Reichardt - Declarative Path Drawing - RNG Day - Tezos Collaboration with the Museum of the Moving Image - Tezos X Upgrade - Microfeatures in Blogs - Config 2024 +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/07/37407556-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-62) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 62 URL: https://www.gorillasun.de/blog/gorilla-newsletter-62/ Last updated: 2024-07-01T08:49:16.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 62nd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### Basins of Attraction in Chaos Theory In the study of chaotic systems, basins of attraction are regions in the state space of a dynamical system where initial conditions lead to long-term behavior that eventually settles into an stable state (an attractor). The fascinating thing about these basins, is that the boundaries between them often present fractal-like, infinitely self-similar properties, the visualization thereof leading to stunning graphics. *The question here is, how do we visualize these features of a dynamic system? What do we actually mean with a dynamic system? And what are some examples?* That's what I set out to learn this past week, with the entrance to this rabbit hole being a post by redditor u/novamber over in the r/generative subreddit, in which he shares a stunning visual that seems to be a fractal of some sort: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-09.30.27.png)](https://www.reddit.com/r/generative/comments/1dpx99z/discovering%5Fpython%5Fand%5Fmathematical%5Fformulas%5Fto/?ref=gorillasun.de) [Link to Post](https://www.reddit.com/r/generative/comments/1dpx99z/discovering%5Fpython%5Fand%5Fmathematical%5Fformulas%5Fto/?ref=gorillasun.de) When another redditor asked about how these graphics were created, u/novamber points out three techniques that I hadn't heard of before: attractive basins, Latte's orbit, and polarization. While I couldn't really find too much about the latter two, attractive basins ended up being a relatively well documented notion, with quite a bit of material across the internet. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-09.30.55.png) Looking into it, the best initial example to explain attractive basins is by picturing a ball rolling on a bumpy landscape. The landscape here represents a mathematical system with different valleys aka "basins" - when dropped into the landscape, the ball will roll down along the landscape and end up settling in one of these basins. With the basin essentially *attracting* the ball. Evidently, the starting point of the ball here matters quite a bit, as it is the most important factor determining in which basin it will eventually settle. What makes these basins interesting are their boundaries between each other - if we were to place the ball directly on such a boundary, it becomes quite difficult to predict which way it will roll. Zooming in on these boundaries will often reveal that they have a fractal structure - hence the visualizing these basin boundaries then leads to interesting graphics, and much study has actually gone into the topic. These fractal basin boundaries aren't just mathematical models, but actually occur in many dynamic systems and physics simulations. Although the relationship might not be immediately evident, one popular example for this purpose is the magnetic pendulum. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-30-at-15.13.43.png)](https://simple.wikipedia.org/wiki/Magnetic%5Fpendulum?ref=gorillasun.de) [Link to Wiki](https://simple.wikipedia.org/wiki/Magnetic%5Fpendulum?ref=gorillasun.de) Magnetic pendulums are actually very simple contraptions, where we simply attach a metal ball on the swinging end of a metal rod or rope, that is in turn attached to a fixture above. In this setting we call the swinging part of the pendulum a "bob". Underneath this bob (or surrounding it) we place a number of magnets in an equidistant manner (along the circumference of a circle) that are all attracting the metal ball and will eventually draw it in when it comes too close and doesn't have enough momentum to escape the magnet's pull, essentially stopping it in its tracks. The chaotic behavior emerges when we release the ball from a random starting position above: it is not quite clear which magnet will win and capture the ball at the end. This is very similar to what I describe earlier, where we had a ball rolling around on a bumpy surface, with the different that the boundaries here are invisible magnetic forces. How does this lead us to these cool visualization that converge towards the center? Let's assume that we've implemented a virtual version of this magnetic pendulum that we're looking onto from a top-down view, the surface underneath being a pixel canvas. We will also assign a color to each one of the three magnets. We will now release the pendulum from a random starting position on the canvas and let it swing for a while until it settles on one of the three magnets. After that's done we will color the pixel at the starting position of the pendulum with the color of the magnet that we settled on. This will lead to an interesting fractal graphic with distinctly colored regions - a great visualization for this can be found here: Now don't tell me that this isn't incredibly fascinating. A quite structured graphic emerges from an initially chaotic system. I'm not entirely certain but I believe that the first to make such a graphic was Ian Win in the 2006 paper of his titled "The Chaotic Oscillating Magnetic Pendulum" where he describes this exact experiment: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-30-at-15.35.16.png)](https://www.math.hmc.edu/~dyong/math164/2006/win/finalreport.pdf?ref=gorillasun.de) [Link to Paper](https://www.math.hmc.edu/~dyong/math164/2006/win/finalreport.pdf?ref=gorillasun.de) If you're curious about how this is implemented, there is a thread on the Mathematica Stack Exchange that shows some equations: [Fractal basins of attraction in a Magnetic PendulumI am trying to write a Mathematica program that realizes a graphical approximation of the basins of attraction in a Magnetic pendulum subject to friction and gravity, in which the three magnets are![](https://cdn.sstatic.net/Sites/mathematica/Img/apple-touch-icon.png?v=e9d3b58724f3)Mathematica Stack ExchangeLonidard![](https://cdn.sstatic.net/Sites/mathematica/Img/apple-touch-icon@2.png?v=1b98edea1597)](https://mathematica.stackexchange.com/questions/120946/fractal-basins-of-attraction-in-a-magnetic-pendulum?ref=gorillasun.de) Checking the r/generative reddit for the "Attractive Basin" search term led me to the a post from two years ago that shows a similar type of swirly pattern: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-09.32.02.png)](https://www.reddit.com/r/generative/comments/w2w3ie/fractal%5Fbasins%5Fof%5Fattraction/?ref=gorillasun.de) [Link to Post](https://www.reddit.com/r/generative/comments/w2w3ie/fractal%5Fbasins%5Fof%5Fattraction/?ref=gorillasun.de) The redditor u/vobarkun also [explains the code](https://www.reddit.com/r/generative/comments/w2w3ie/comment/igsxbx0/?utm%5Fsource=share&utm%5Fmedium=web3x&utm%5Fname=web3xcss&utm%5Fterm=1&utm%5Fcontent=share%5Fbutton) a little when asked about it - and it's pretty similar to a magnetic pendulum: > Each pixel corresponds to a different initial position and velocity for a particle that moves in a potential with five minima positioned at the corners of a regular pentagon. In each frame of the animation, the color of that pixel is determined by the current position of that particle. This is a so called chaotic system, that is, small changes in the initial conditions can have very large effects, producing the fractal pattern. I still can't tell you however how the first render I shared by u/novamber comes together - in another reply he points towards a profile over on Facebook where a creator under the name of [Errobas](https://www.facebook.com/Erroba.MathArt) exclusively shares these kinds of visualizations, and some of them are absolutely bonkers: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-30-at-15.56.59.png)](https://www.facebook.com/Erroba.MathArt) [Link to Errobas profile on Facebook](https://www.facebook.com/Erroba.MathArt) I definitely will have to examine all of this in more detail in a future issue, but I think that I've supplied you with sufficiently material to chew on - if you end up figuring out how to make these kinds of patterns, shoot me a message, would absolutely love to learn more! ### Then and Now by Jasia Reichardt The Cybernetic Serendipity exhibition is unarguably one of the most important events in generative art history. Taking place in 1968 at the Institute of Contemporary Art in London, it was the very first exhibition that put computer art on the international radar: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-01-at-08.33.04.png)](https://timeline.lerandom.art/?ref=gorillasun.de#/1968) [Screenshot from the Le Random Timeline](https://timeline.lerandom.art/?ref=gorillasun.de#/1968) Jasia Reichardt was the curatorial brain behind the exhibition, and was one of the visionary people at the time that predicted generative art as an artform of the future. In light of the Generative Art Summit that's happening in Berlin this week (at the time this Newsletter comes out), she provides her thoughts in form of an editorial piece over on Le Random, capturing how computer art has continuously evolved since those early days: [THEN AND NOWCherished icon Jasia Reichardt met with Peter Bauman (Monk Antony) before the Foundation Herbert W. Franke’s Generative Art Summit Berlin. The Cybernetic Serendipity curator wrote this text as one of the few people who anticipated our digital future along with Franke in the 1960s. This piece extends the earliest thought on art and AI to the present, as only a singular voice like Reichardt’s could.![](https://cdn.prod.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random![](https://cdn.prod.website-files.com/6411e594fbd274173bf8c35c/667a7b47b0b8d8ad5005f86f_JR%20TAN1.png)](https://www.lerandom.art/editorial/then-and-now?ref=gorillasun.de) While I don't know how involved Reichhardt is in the contemporary issues that revolve around genart today, her closing statement does seem to address one of the terminological pain points that has recently taken shape in recent months - where the word "generative" has become a bit of a disputed term to describe the practice, especially for those that are not as familiar with the field. > \[... \] new ideas, are based on an exchange—a conversation that reaches continually beyond the recognisable categories of art. Even the term avant-garde cannot be applied because the code-based art is like a wave—a progressive and continuous experiment, with possibilities extending in all directions. Maybe we should just concede that there will never be a proper term to describe all of what these new kinds of affordances encompass and that they simply are in a constant state of change as they are tightly tied to the underlying technology that will likely not halt from progressing.But maybe that's just the beauty of this discussion. *That said - I'm excited to also be in Berlin next week (this week, I'm leaving tomorrow* 😬*) for the Genart summit, if you're also there, hit me up!* ### Proposal for a Declarative Path Drawing Library In light of [Processing's new developer grant program (pr05)](https://medium.com/@ProcessingOrg/pr05-grant-2024-new-beginnings-open-call-93ac092a183e?ref=gorillasun.de) that we saw kick off earlier this year, tool developer Baku Hashimoto made the interesting proposal for supporting alternative path drawing methods in p5js: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-01-at-07.58.29.png) While the proposal wasn't accepted, I think that it's still worth sharing. Baku's idea is based on an already existing library that they've previously developed, geared towards manipulating SVG paths: [PaveA library for manipulating SVG/Path2D curves![](https://baku89.github.io/pave/logo.svg)![](https://baku89.github.io/pave/logo.svg)](https://baku89.github.io/pave/?ref=gorillasun.de) Essentially, rather than tracing out paths imperatively with specific commands, like the lineTo() function for instance, the library would provide a declarative approach to do so - Baku elaborates on this in a TwiX thread: > The proposed library, p5.path, adopts a functional programming design, allowing the combination of generators and filters. Instead of coding the steps to draw shapes, it focuses on declaratively describing what the shape is, making it more accessible to artists familiar with design tools like Adobe Illustrator. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-01-at-08.25.11.png)](https://x.com/%5Fbaku89/status/1804877969166680174?ref=gorillasun.de) [Link to Tweet](https://x.com/%5Fbaku89/status/1804877969166680174?ref=gorillasun.de) ### International RNG Day And to cap off this segment, RNG day is a special kind of celebration that falls on a different, randomly selected, date every year - it took place last week on the 25th of June: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-01-at-09.37.01-1.png)](https://rngday.com/en/?ref=gorillasun.de) [Link to Page](https://rngday.com/en/?ref=gorillasun.de) RNG day might just be the perfect day of the year to make some generative art! ## Web3 News ### Tezos Foundation x Moving Image NYC I haven't really been keeping up with what's been going on with Tezos - but after instating [Aleksandra Artamonovskaja earlier this year in April as the head of Arts at Trilitech](https://www.theartnewspaper.com/2024/04/15/aleksandra-artamonovskaja-is-appointed-head-of-arts-for-trilitech-the-entrepreneurship-arm-of-tezos-blockchain?ref=gorillasun.de) (the entrepreneurship firm that supports the Tezos Foundation), it seems that things have started moving in the right direction. With their latest announcement they kick off a new partnership and collaboration with the Museum of the Moving Image (MoMI) in NYC with the aim to run a year long program that exhibits the artists currently operating across the Tezos eco-system: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-27-at-18.46.40.png)](https://x.com/tezos/status/1805931052147363852?ref=gorillasun.de) [Link to Tweet](https://x.com/tezos/status/1805931052147363852?ref=gorillasun.de) The special aspect of this initiative is that visitors will have the ability to collect, and *take home* complimentary fragments to the exhibited pieces in form of tokens minted on the Tezos blockchain as Open Editions - and that free of charge. This strikes several birds with one stone, introducing people to the digital ledger, giving them a taste for collecting art on the blockchain, while also giving the artists some much needed exposure. You can read more about it in this feature article from the Art Newspaper: [A piece of the action: museum partnership in New York invites visitors to take home fragments of digital artworksThe Museum of the Moving Image (MoMI) and the Tezos Foundation have teamed up to offer the public a chance to acquire—for no cost—parts of works projected onto a screen in the lobby![](https://www.theartnewspaper.com/favicons/favicon-196.png)The Art Newspaper - International art news and eventsLouis Jebb![](https://cdn.sanity.io/images/cxgd3urn/production/bb98c1a4d476d34cb7d3ff2e36026acbc209f7f7-1400x649.jpg?rect=159,0,1082,649&w=1200&h=720&q=85&fit=crop&auto=format)](https://www.theartnewspaper.com/2024/06/26/a-piece-of-the-action-museum-partnership-in-new-york-invites-visitors-to-take-home-fragments-of-digital-artworks?ref=gorillasun.de) They kicked things off last week on the 28th of June, with a work from the highly acclaimed Net Artist Auriea Harvey titled Echo Core: [Echo: Core – Museum of the Moving ImageIn the ancient Greek myth of Echo, the cursed nymph is condemned to only repeat the words of others. Auriea Harvey reimagines the story in the monumental sculpture Echo (2024).![](https://movingimage.org/wp-content/uploads/2021/04/cropped-momi2_favicon-270x270.png)Museum of the Moving Image![](https://movingimage.org/wp-content/uploads/2024/06/AH_Echo_1600x900.png)](https://movingimage.org/event/echo-core/?ref=gorillasun.de) ### Tezos X And there's actually more Tezos News this week - apparently there's some exciting changes coming to the tech itself! Seemingly taking inspiration from Elon Musk - that's irrevocably ruined the antepenultimate letter of the alphabet - they're calling this protocol upgrade *Tezos X*, and their thread over on TwiX provides an overview of what's in store, additionally providing a very elaborate roadmap in their official announcement (linked below): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-10.23.58.png) ![](https://spotlight.tezos.com/media/image/18t.jpg) [Link to Tweet](https://x.com/tezos/status/1806288477580820782?ref=gorillasun.de) It's a bit of technically laden article, so if you just want the juicy bits I'll try my best to explain here - and to understand we need a little bit of historical context. Tezos was originally designed as a monolithic chain where each node replicated all activities across the network. In such a setting increased network activity required higher bandwidth and more computational resources, which in turn risked centralization.This then later led Tezos to transition to a modular design, to maintain decentralization while also improving performance, such that tasks are offloaded to specialized modules, while consensus and governance were kept on the primary layer (L1). This modular approach however comes with its own drawbacks, it makes the chain overall more fragmented and less composable - meaning that individual dapps aren't as interoparable depending on what modules they rely on. In the recent article they argue that scaling a single *canonical* smart rollup would be entirely sufficient to address all of the throughput needs of the chain, without compromising the other aspects: > That’s what Tezos X envisions: the creation of a single canonical rollup able to handle - and massively expand - all activity on the Tezos network. And that's basically the entire idea in a nutshell (as far as I understand - correct me if I'm wrong). Iff all of that sounded like some random Technobabble, here's a succinct explanation by TwiX user HPLoveBux: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-10.31.20.png)](https://x.com/Pierreo01/status/1806318136762994993?ref=gorillasun.de) [Link to Thread](https://x.com/Pierreo01/status/1806318136762994993?ref=gorillasun.de) So basically all the advantages of L2 tech without it actually really being an L2\. I still recommend reading their article nonetheless: [Blockchain Evolved: the Road to Tezos XThe next generation in blockchain design: modular in design and integrated in experience, providing a scalable, cloud-like backend to a wide range of applications.![](https://spotlight.tezos.com/media/favicon/favicon.svg)Tezos SpotlightNomadic Labs, Trilitech, Functori![](https://spotlight.tezos.com/media/image/18x-tezos-x-blog-cover.jpg)](https://spotlight.tezos.com/tezos-x/index.html?ref=gorillasun.de) Beyond that they're also planning on bringing support to mainstream programming languages, such as JavaScript, TypeScript, Python, and Java to allow for smart contract development in them, leading to easier developer entry. The article concludes with "**It’ll be a reliable, usable, and scalable cloud-like backend for a wide range of applications.**" - I'm wondering if this much improved infrastructure could then also serve as a drop in replacement for traditional web2 backend/storage systems - with a similar model to what Farcaster is doing these days, where users just have to pay an upfront fee to cover the cost of transactions that are effectuated whenever they use the app. ### Awaken MetaMagical Hands One other event that I wanted to point out here, is a collaboration between the Gazelli Art House and Verisart that's coming up later this month over in London; with the interesting title of "Awaken, Metamagical Hands" they're kicking off an exhibition featuring new works from many of the genart OGs that have helped shape the field as we know it today, such as Joshua Davis and Golan Levin. Furthermore, the exhibition is happening under the curatorial oversight of none other than John Maeda: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-28-at-09.43.14.png) [Link to Tweet](https://x.com/verisart/status/1804152347024670773?ref=gorillasun.de) | [Link to Exhibition Announcement Page](https://gazelliarthouse.com/exhibitions/184-awaken-metamagical-hands-robbie-barrat-joshua-davis-golan-levin-lia-lauren/?ref=gorillasun.de) I might also be in London later this month and build in a pit-stop for the exhibition! ## Tech and Web Dev ### Microfeatures I Love in Blogs Since I ended up finding some time to work on the overhaul of the blog this week (more on that in a bit) I've been more actively doing some reading on web design topics again - and a recent article that perfectly fits into the category is by Daniel Fedorin, where he writes about his favorite microfeatures on blogs and personal websites: [Microfeatures I Love in Blogs and Personal WebsitesIn this post, I talk about pleasant but seemingly minor features in personal sites![](https://danilafe.com/img/favicon.png)![](https://danilafe.com/blog/blog_microfeatures/fasterthanlime-dialogue.png)](https://danilafe.com/blog/blog%5Fmicrofeatures/?ref=gorillasun.de) Daniel enumerates a bunch of them and explains the why and how behind them improving the user experience, such as sidenotes that occur in the margins next to the main block of text of a site, a table of contents that kicks off the page and gives an overview of what's to come, as well as page progress indicators that show how far one is into the content. While all of them aren't really necessary, they all help the reader navigate your pages and overall provide a better experience. Again, that's why platforms like Substack and Medium just aren't for me, the lack of customizability is a big detriment. I strongly believe that different types of content need to be formatted differently - programming tutorials for instance **need** to have a table of contents, because it's very likely that readers want to skip ahead to a certain section. Here I want to point out that Daniel also wrote about his own JavaScript-less implementation of blog sidenotes - if that is something you'd like to have on your own blog as well: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-10.11.25.png)](https://danilafe.com/blog/sidenotes/?ref=gorillasun.de) [Link to Article](https://danilafe.com/blog/sidenotes/?ref=gorillasun.de) It's also worth mentioning the original inspiration for Daniel's post was an article from early 2023 by Hillel Wayne, that talks about QOL microfeatures in programming languages. It is also a fascinating read: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-09.59.52.png)](https://buttondown.email/hillelwayne/archive/microfeatures-id-like-to-see-in-more-languages/?ref=gorillasun.de) [Link to Article](https://buttondown.email/hillelwayne/archive/microfeatures-id-like-to-see-in-more-languages/?ref=gorillasun.de) ### Config 2024 To assist me in my design endeavours, I picked up Figma as a software over the past week, and I found that it's quite easy to use so far. If you're not familiar with Figma, it's essentially a design/wireframing tool that lets you make design prototypes for websites and apps, and it's been super easy to use so far. Unbeknownst to me it also happened to be Config 2024, Figma's yearly conference/event in which they showcase all of their new and upcoming features - they provide a big recap here: [Figma Config 2024 | June 26-27 - Moscone Center SFConfig 2024: Figma’s conference for people who build products![](https://d8o6urisxu54f.cloudfront.net/template_image/e42425db3d060dfc368222826c43ef5ec347d404/original/1699981940-26c37910bae9b253.png?1699981940)Moscone Center SF![](https://d8o6urisxu54f.cloudfront.net/field_data/5f3b56b31fe775917620fc0b250013795acf8ad8/original/1716372129-ef3c38fd85e860c2.png?1716372129)](https://config.figma.com/?ref=gorillasun.de) The two big things that have been making a fuss over on social media, are firstly the new minimal design of the UI, where instead of two sidebars adorning the application it's now just a simple floating bar at the bottom of the page, they call it UI3\. They also published an interesting article about the process that brought them to ultimately land on this design: [Inside the Redesigned Figma, Where Your Work Takes Center Stage | Figma BlogOur biggest redesign of Figma’s interface in five years clears space on the canvas for designers to turn their wildest imagination into reality.![](https://static.figma.com/app/icon/1/touch-180.png)Figma![](https://cdn.sanity.io/images/599r6htc/regionalized/cb5330ddd236de5bb8b1fec2315552b3d172fe75-1608x1072.png?w=1200&q=70&fit=max&auto=format)](https://www.figma.com/blog/behind-our-redesign-ui3/?ref=gorillasun.de) The other feature is their new AI generator that will create designs based on an input prompt - and people have been gushing about it non-stop over on social media: [Meet Figma AI: Empowering Designers with Intelligent Tools | Figma BlogWe’re introducing a suite of AI-powered features to help you push past creative blocks and bring your best ideas to life.![](https://static.figma.com/app/icon/1/touch-180.png)Figma![](https://cdn.sanity.io/images/599r6htc/regionalized/d1ef1bc0c4df3219a0ee3d61e3b2160ffbd0f754-3840x2160.png?w=1200&q=70&fit=max&auto=format)](https://www.figma.com/blog/introducing-figma-ai/?ref=gorillasun.de) ### Round Rects Are Everywhere! To cap off the tech section this week - here's an older post that I somehow came across on a site titled Folkflore that recounts some fascinating tales about the *development of the original Macintosh and the people that made it*. In this particular story it tells the tale of how Steve Jobs persuaded Bill Atkins to come up with a method for creating rectangles with rounded corners: [Folklore.org: Round Rects Are Everywhere!![](https://www.folklore.org/images/macfavicon.ico?v=1)folklore.org![](https://www.folklore.org/images/logo.gif)](https://www.folklore.org/Round%5FRects%5FAre%5FEverywhere.html?ref=gorillasun.de) ## AI Corner - Claude 3.5 Sonnet Last week Anthropic released Claude 3.5 Sonnet that they calaim to be more performant than any of the other models out there - even beating ChatGPT 4o on many of the benchmarks as shown in their announcement article: [Introducing Claude 3.5 SonnetIntroducing Claude 3.5 Sonnet—our most intelligent model yet. Sonnet now outperforms competitor models and Claude 3 Opus on key evaluations, at twice the speed.![](https://www.anthropic.com/images/icons/apple-touch-icon.png)![](https://cdn.sanity.io/images/4zrzovbb/website/8a4eb6c412e5e7ffa38f07233344f4b7e6644994-2400x1200.png)](https://www.anthropic.com/news/claude-3-5-sonnet?ref=gorillasun.de) I played a bit with it, especially with their experimental "Artifacts" feature, where it lets you generate different pieces of media according to an input prompt. Here I asked it to generate an SVG logo for the blog: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-13.39.38.png) ## Gorilla Updates From my end there's been a couple of things this week - as mentioned in last week's newsletter I had my project released with Koda, and I'm super happy with the response to the project - we even got a retweet from the Polkadot TwiX account itself (which has 1.4 million followers) so that definitely brought some eyeballs on the project: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/blobby-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-09.25.28.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-09.22.02.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-09.22.20.png) [Link to Tweet](https://x.com/Polkadot/status/1806322684495540349?ref=gorillasun.de) Beyond that I'm also super excited to be participating in the inaugural *Digital Me* exhibition - I will have an update about it throughout the coming week: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/37407556.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-29-at-12.16.38.png) [Link to Tweet](https://x.com/gorillasu/status/1806990158069219625?ref=gorillasun.de) Besides that I picked up Figma to work on the overhaul of the blog - at this point I must sound like broken record - but I feel like I was making absolutely zero progress designing things directly on to go with CSS; although I shared some pretty WIPs some months ago, the main issue is that the design isn't consistent across different pages, and if it takes me a week or two to just finish one page, by the time I'm working on a different part I've long forgotten the design/aesthetic decisions that I've made earlier. Using a design software has given me some much needed relief in that regard as things were getting a bit tad bit too frustrating - now I feel that the task's become much more manageable: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/07/Screenshot-2024-07-01-at-10.16.40-1.png)](https://x.com/gorillasu/status/1806781785088630823?ref=gorillasun.de) [Link to Tweet](https://x.com/gorillasu/status/1806781785088630823?ref=gorillasun.de) Now I'm super excited to work on the design, finalizing it, before jumping back in to implement it. ## Music for Coding Tycho obviously needs no introduction - he'll be making a return this summer with his 6th studio album. And you can already listen to the second track on the album *Phantom* here: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 61A Particle based Approach to Conway’s Game of Life - Fluid Sims in Web Assembly - Demystifying Generative Systems - Gearing up for a release on Koda - Hypersub News - Bjorn Staal’s Entagled Aftermath - OpenSauce 2024 x Bantam Tools Drama +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/Under-the-Micro-1.jpg)](https://gorillasun.de/blog/gorilla-newsletter-61?ref=gorillasun.de) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 61 URL: https://www.gorillasun.de/blog/gorilla-newsletter-61/ Last updated: 2024-06-24T22:22:07.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 61st issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server now, where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### A Particle based Approach to Conway's Game of Life My most curious discovery of the past week were Particle Lenia. What might at first glance seem like a sort of self-organizing reaction diffusion pattern, is actually a particle based adaptation of Conway's Game of Life - what took me down this fascinating rabbit hole was Simone Conradi's implementation of it with MLX: 0:00 /0:08 1× We already saw some of the things that is possible with MLX in [last week's issue](https://www.gorillasun.de/blog/gorilla-newsletter-60/) with Roman Gaditskii's experiments | [Link to Tweet](https://x.com/S%5FConradi/status/1803404664773181880?ref=gorillasun.de) To understand what's going on here, we have to do a quick trip back in time and revisit a paper released in 2011 titled "[Generalization of Conway's "Game of Life" to a continuous domain - SmoothLife](https://arxiv.org/abs/1111.1567?ref=gorillasun.de)". The term SmoothLife does actually ring a bell here, but I never knew that it was related to the Game of Life. developed by Stephan Rafler, it's a first attempt to create a more fluid and realistic model of life-like structures based on the original rules that Conway proposed, for the simulation of organic movement more naturally than its discrete and rigid predecessor. In SmoothLife the state of each cell is represented by a continuous variable rather than a binary state (alive or dead). Meaning that this continuous state can take any value between 0 and 1 and represents varying degrees of "aliveness", giving rise to a generalized form of the birth and survival rules of the original Game of Life, such that they are defined using smooth functions that take into account the weighted sum of the states of neighboring cells within a certain radius. This smooth weighting is visualized by gradual changes rather than abrupt state transitions. Due to this continuous nature, the emergent patterns are seemingly more complex, more dynamic, less pixelated, and resembling natural phenomena such as fluid flows, waves, and the motion of biological organisms. It also exhibits behaviors not seen in Conway's Game of Life, such as gliders that can travel in any direction as well as structures that resemble elastic cords. 0:00 /0:13 1× Link to an interactive web Implementation by Ricky Reusser ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-10.33.46.png) [Link to Original Paper](https://arxiv.org/pdf/1111.1567?ref=gorillasun.de) Lenia (from the latin word lenis that means as much as lenient) was then a further generalization of SmoothLife, that injects smoothness into more aspects of the overall implementation, leading to an even broader range of different patterns - a good video on the topic is by birdbrain, comparing these different evolutions of the same concept: There is a problem however with these generalized versions of the Game of Life: in both SmoothLife and Lenia the emergent creatures can only exist when they are supported by the spatial configuration of the universe that they exist in. Which leads us to the newest pitch in this narrative, proposed by researchers over at Google, they argue that a particle based implementation is a much more sensible approach to the task - they explain this in detail in an article of theirs here: [Particle Lenia and the energy-based formulationSimple particle-based artificial life-form![](https://google-research.github.io/self-organising-systems/assets/img/favicon-32x32.png)Alexander Mordvintsev![](https://google-research.github.io/self-organising-systems/particle-lenia/lenia_card.jpg)](https://google-research.github.io/self-organising-systems/particle-lenia/?ref=gorillasun.de) Simone Conradi also shares generously shares his implementation in form of a python notebook here: [ALife/Particle\_Lenia\_Simulation.ipynb at main · profConradi/ALifeArtificial Life simulations. Contribute to profConradi/ALife development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubprofConradi![](https://opengraph.githubassets.com/e3d6845bb2a9edd2c300d56a33c972a762ddea052d965f423a81f3e6a26979fb/profConradi/ALife)](https://github.com/profConradi/ALife/blob/main/Particle%5FLenia%5FSimulation.ipynb?ref=gorillasun.de) ### Grant Kot's Fluid Sims in Web Assembly And while we're talking about particle simulations, in [an issue from a few weeks back](https://www.gorillasun.de/blog/gorilla-newsletter-46/) I wrote about particle based fluid sims, with the topic making a resurgence in my Twitter feed this week round. Grant Kot's been making a splash (pun intended) with his Web Assembly based implementation of a fluid sim, that runs super smoothly directly in the browser: 0:00 /0:07 1× [Link to Tweet](https://x.com/kotsoft/status/1792648786826686522?ref=gorillasun.de) What's super exciting about this is that Grant Kot has actually open sourced the implementation of this fluid sim, based on the paper "Particle-based Viscoelastic Fluid Simulation" - he provides a quick rundown of the entire thing in a YouTube video of his: ### Demistifying Generative Systems Monk delivers the third installment in his Demystifying Generative Art series, this time with a focus on understanding and appreciating the systems that lie at the heart of the generative artist's practice. Many would argue that in genart the system is the actual artwork, rather than any of the individual outputs that it is capable of generating - positing the creation of these systems as the major creative act in the artform. Monk explains this in more detail, and showcases some of the generative techniques that artists leverage to create their systems: [Demystifying Generative SystemsThis is the third part in a series on building a framework for appreciating generative art. In Part I, “Demystifying Generative Art,” Peter Bauman (Monk Antony) builds the case for such a framework. In Part II, “Demystifying Generative Aesthetics,” Bauman examines outputs—the results of generative systems. In Part III, he investigates another layer of the Framework, systems themselves. He spoke to Frieder Nake, Casey Reas, Emily Xie, DEAFBEEF, Matt DesLauriers, Jen Lowe and Patricio González Vivo for the piece.![](https://cdn.prod.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://cdn.prod.website-files.com/6411e594fbd274173bf8c35c/6674137c6f93c64e548bc0c6_ZLHH.jpeg)](https://www.lerandom.art/editorial/demystifying-generative-systems?ref=gorillasun.de) The philosophical question here, is whether or not you need to understand the underlying mechanisms to appreciate an artwork for what it is - probably not, but at the same time it's a bit of a silly question: in what scenario would you not want to know how the sausage is made? Not only to gain a more informed perspective on the work but also to deepen your engagement with it - I think we hardly ever have a purely sensory-emotional response to anything, we are rational beings after all. *Also a big thanks here for the mention in the article* 🤝 ### On Fountain Pens In what seems to be a love letter disguised as a blog post - James Merill writes about why he primarily uses fountain pens for plotting purposes, explaining how different kinds of inks can further impact the plot with their physical properties: [Why I use Fountain pens with pen plottersFirst, I fell in love with code. Then came pen plotters because I could use code to instruct them to draw things that I found beautiful. After that, I fell in love with inks because my drawings needed spectrums of color. Finally, I stumbled upon the world of fountain pens.![](https://lostpixels.io/favicon.ico)Lostpixels.io![](https://res.cloudinary.com/dtz3cezyb/image/upload/c_fill,w_2400,h_1254,g_center/c_scale,w_1200/f_jpg/q_auto/DSCF_0850_53fa1e0f20?_a=BAVAosIB0)](https://lostpixels.io/writings/fountain-pens-plotters?ref=gorillasun.de) ## Web3 News ### Gearing up for a Release on Koda *Let's start the Web3 section this week with some shameless self-promo, shall we?* It's been a hot minute since I've released a genart project - over 6 months at this point, which is absolutely bonkers! This makes me super excited to announce that I'll be having a new project released over on Koda later this week on the 27th of June (exact time TBD) - "Under the Microscope" is a project that aims to celebrate the beauty of the natural world in its most minute forms, with an abstract and generative perspective on the tiny landscape that emerge under the lens of a microscope: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/undermicro2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/alternate.jpg) What started as an exploration of another circle packing pattern quickly evolved into something more intricate, a bug in my code caused shapes to overlap in all sorts of manners, which I ended up leaning into. If you'd be interested in a proper "Making of" type of post let me know, as there's a couple of interesting things going on in the code. And if you're not familiar with Koda, it's essentially an NFT platform on the Polkadot blockchain, that's just recently broken into the genart NFT paradigm. While I'm not too familiar with the Polkadot chain, I have heard good things about it so far, and it's actually pretty interesting from a tech point of view - as far as I understand, the chain is specifically designed for ease of communication between the L2s that are built on top of it. The folks over at Koda were also really awesome in this regard and guided me through everything that I needed to do to make the project happen - I'll likely have a few more announcements (over on my socials) about the project leading up to its release on Thursday. ### Hypersub Overhaul and V2 Contracts + Blog Member Section Hypersub is probably the thing in Web3 that I'm currently most excited about, not only because Jonny Mack seems like a down to earth kinda guy, but also because it's enabling creators to monetize their content in a novel blockchain native manner. The Hypersub website recently got a pretty neat overhaul, with a new UI that accommodates the growing number of users, allowing for an easier discovery, while also improving the dashboards that it provides for creators to manage their subscribers: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-12.53.55.png) Secondly, the protocol's recently also gotten an upgrade that gives creators a couple of new options in how they can configure their onchain subscipritions - for instance it's now possible to have different subscription tiers. If you offer a subscription token via Hypersub it'll ask you to migrate your current subscribers to the V2 contract the next time you visit your dashboard - the announcement: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-12.56.57.png)](https://warpcast.com/nonlinear.eth/0x6cf1bd4b?ref=gorillasun.de) [Link to Cast](https://warpcast.com/nonlinear.eth/0x6cf1bd4b?ref=gorillasun.de) There's also an update from my end here, if you're one of my Hypersubs you can now find a new page directly on the blog to view and read all of the previously released Hypersub exclusive articles - currently consisting of two Platform reviews, 3 tutorials and a Zine (more coming very soon): [Hypersub - Gorilla SunThis is an archive for all Hypersub exclusive posts. If these posts look interesting to you, consider subscribing to my Hypersub over here, to get access to all of these articles, 2 monthly exclusive articles, and additionally get a monthly art airdrop.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/Hypersub-Token-1.jpg)](https://www.gorillasun.de/tag/hypersub/) Since these articles are "member-only" - if you're a Hypersub, you'll have to login via your email to view them (doesn't require a password, simply a magic link sent to your inbox). If you're already logged in then you don't need to do anything. While I really like Paragraph and the feature that allows me to token gate posts, I've been feeling a bit limited when it comes to writing my programming tutorials over there, it seems that it is not possible to embed interactive code snippets (via the p5 editor, openprocessing, or other widgest) at this point, which many of my tutorials require. I'm fully aware that it wasn't intended for this particular purpose, and likely will not accommodate in that regard. That's why this intermediary solution should do for now, it's actually not too big of an hassle to import the email addresses from the csv sheet that hypersub provides. *Fully customizable Web3 blogging platform + CMS á la Ghost wen?* Somebody make it happen! That's it, thanks for being subscribed to my Hypersub! ### Getting Entangled Unsurprisingly, the release of Bjorn Staal's Entangled turned out to be a smash hit. Not only did it mint out on both chains in just a matter of minutes, but it also brought back a certain kind of excitement to the fxhash community that I haven't felt in quite a while; with its innovative cross-chain mechanics, and the immaculate execution, it'll definitely go down as a historic genart project. And I'm extremely happy that I have a beautiful red one in my collection: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-08.57.12.png) If you're curious to learn more about the motivations and the process behind the project, directly from Bjorn, he did an interview with Monk from Le Random that's been posted over on Twitter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-08.50.47.png) [Link to Tweet](https://x.com/fx%5Fhash%5F/status/1802734621664428035?ref=gorillasun.de) Later this year, in September, we'll also see a live event for Entangled at the Winter Circus in Gent - I wonder what fxhash has got in store for us in that regard. And apparently there's more to fxhash's new Vertex platform than I had assumed the first time round: it seems that we'll also get some new features in the fxhash sdk that'll allow artists to create their own custom minting experiences. I'm assuming it'll be a set of tools to create generative tokens that have the ability to interact with each other in some way just like Bjorn's Entangled does: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-07.43.21.png)](https://x.com/maerzhase3000/status/1803832257829917129?ref=gorillasun.de) [Link to Tweet](https://x.com/maerzhase3000/status/1803832257829917129?ref=gorillasun.de) ### Null Machines by loackme and Kerim Safa To cap off the Web3 news this week, I wanted to share another stellar project that's releasing next month; a collab between the two monochrome pixel junkies loackme and Kerim Safa titled Null Machines, putting a generative twist on Kerim Safa's trademark conveyor belts. They've set up a dedicated project page that tells a little but more about the project and how the tiny mesmerizing machines come to life, even share the recipe that aligns the animated tiles into a looping whole: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-10.43.44.png)](https://x.com/loackme%5F/status/1803697725537386918?ref=gorillasun.de) [Link to Article](https://x.com/loackme%5F/status/1803697725537386918?ref=gorillasun.de) If you're not familiar with wave function collapse, you should check out Coding Challenge #171, in which Daniel Schiffman covers the algorithm and even implements it from scratch: ## Tech and Web Dev ### Cognitive Load and Creative Continuity In a living document of his, Artem Zakirullin tackles the issue of code readability from a bit of a different angle that is based in cognitive load theory. He presents several strategies for reducing the induced extraneous difficulty that emerges when code is written in certain ways: [GitHub - zakirullin/cognitive-load: 🧠 Cognitive Load is what matters🧠 Cognitive Load is what matters. Contribute to zakirullin/cognitive-load development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubzakirullin![](https://opengraph.githubassets.com/114a3b83d8f70e62acca63f353cd64cc6310f50fec8797863b95b9e298f586a7/zakirullin/cognitive-load)](https://github.com/zakirullin/cognitive-load?ref=gorillasun.de) One of the statements that I really loved, is where he points out that having more options is rarely a good thing — and I genuinely couldn't agree more. When a programming language provides multiple different methods to solve a certain task, it will not only waste your time figuring out the one that should be used for a specific scenario, but also cost time when returning to the code later on and trying to figure out why that particular approach was chosen: > If there are lots of features, we may spend half an hour playing with a few lines of code, to use one or another feature. And it's kind of a waste of time. But what's worse, **when you come back later, you would have to recreate that thought process!** I also find this argument interesting because I believe that it can be extrapolatated and generalized for creative tasks in general - one of the best things you can do for yourself, is to strike the Iron while it's still hot, keeping at it when you're in that flow "state". I frequently experience this with coding, with writing, as well as when I'm scribbling down some sketches on my notebook. Finding back into a specific mental state, recreating a certain thought process, or trying to force creative spurs of the moment rarely ever works. For me at least, but that's not to say that you can't create continuity by some other means, like documenting your thoughts and ideas in some form or another. ### OpenSauce 2024 x Bantam Tools Drama Probably the biggest thing in tech from last week was Open Sauce 2024 that took place over in San Francisco on the 15th and 16th of June. If you're not familiar, Open Sauce is an event that brings together makers, builders and tinkerers of all sorts to share their passions, and showcase their creations at various kinds of booths and exhibits set up at the venue: [Open Sauce 2024 - Open SauceA Celebration Of Makers And Creators. A two-day event in San Francisco at Cow Palace. Attendees will explore interactive exhibits…![](https://opensauce.com/wp-content/uploads/2023/02/OS-Icon-1-300x300.png)Open Sauce![](https://opensauce.com/wp-content/uploads/2023/02/Banner-2.png)](https://opensauce.com/?ref=gorillasun.de) While I tried to find some sort of official recap, there sadly doesn't seem to be much online coverage of things (for free at least, I just saw on the website that you can purchase an archive of talks) - except for the individual creators that decided to showcase their creations via their own channels. As a big chess fan, one of my favorites was this quirky chess board that punishes you for wrong moves with an electric shock: Beyond that, there also seems to have been some sort of drama revolving around Bantam Tools (the company that acquired Evil Mad Scientist earlier this year, the creators of the AxiDraw) setting up an improptu booth at the Open Sauce venue, which in turn prompted a pretty harsh response from the founder of the event William Osman, stemming from the fact that Bantam Tools had originally declined sponsoring the event. Osman's tweet now sits at around 100k likes on Twitter, which is kind of bonkers: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-24-at-09.56.32.png) [Link to Tweet](https://x.com/WilliamOsman/status/1803869773484429330?ref=gorillasun.de) To me it seems like a big misunderstanding, but judge for yourself, here's a clickbaity recap of what happened: ### Progressive Blur in CSS Last week I wrote about blurs in CSS, this week I discovered another useful nugget in that regard. Dennis Brotzky shows us how to create a nice seamless blur with CSS - this is actually something I have encountered some weeks ago without finding a proper solution to it. When you combine the backdrop filter blur with a transparent linear gradient it gives for a cool modern aesthetic, but the issue with the blur filter is that it creates a hard cutoff edges wherever the blur is bound to start/end. Turns out that the solution boils down to layering several blurs and positioning them in a staggered manner to accentuate the effect in the same direction of the linear gradient: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-23-at-21.39.28.png)](https://x.com/brotzky%5F/status/1802739980827308314?ref=gorillasun.de) [Link to Thread](https://x.com/brotzky%5F/status/1802739980827308314?ref=gorillasun.de) ## Gorilla Updates While I did spend time on finalizing some of my upcoming genart projects, I also found myself with quite some free time on my hand for the first time in a long while. While I considered picking up some new video games (Elden Ring DLC looking really good right now, but not sure if I'm just ready yet to get my ass whoopped again), I actually ended up spending most of it trying to learn more about building web apps with the long term goal to eventually be able to build something solid that has a backend attached to it. And I actually ended up having a blast doing so. Earlier this week I managed to figure out how to sign up and login new users using Supabase with their vanilla js API, which quickly led to me realizing that there's a lot more to authentication flows than just logging in a user. You essentially have to design your entire web app around this auth flow. While I might at some point try and figure it out with vanilla js, it feels like reinventing the wheel here. This had me looking at some of the starter templates that Supabase provides, including most of the popular modern js frameworks such as angular, vue, react, and next. I ended up picking next js, partially because it seems to have everything that I currently need to build an app, but also because I discovered a free course for it by egghead.io, which teaches you how to build a Twitter clone from scratch (not sponsored): [Build a Twitter Clone with the Next.js App Router and SupabaseNext.js App router is ushering in the next era of web development. The App router leverages React Server components for the first time. React Server c…![](https://egghead.io/favicon.ico)egghead![](https://res.cloudinary.com/dg3gyk0gu/image/upload/v1690298333/course-resources/build-a-twitter-clone-with-the-next-js-app-router-and-supabase/twitter-clone-og-banner.png)](https://egghead.io/courses/build-a-twitter-clone-with-the-next-js-app-router-and-supabase-19bebadb?ref=gorillasun.de) I'm about 60% of the way through it at this point, and it's already answered a lot of the questions that have been swirling around in my head for a couple of months now. And that's pretty much everything from my end this week, hope to have some more dev updates in the next issue. ## Music for Coding This week's Music for Coding highlight was a tough call - the YouTube algo decided to suggest me a whole slew of different Metal albums all at once, and between the bands Ten Ton Slug, Monkey Bog, Robot God, Atomic Vulture, and Morgul Blade, the last one emerged as the winner. I'm not making these names up 😆, and although all of them got some absolute banger tracks - as a big LOTR fan, Morgul Blade stands out with its thematic twist. Might not be everyone's cup of tee, but I enjoyed having these on in the background while going about my day: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 60The GJK Algorithm for Polygon Intersections - Optimizing Ray Tracers with Sebastian Lague - Turning Genart into Optimization Problems - Getting Fedified - Kaloh x Jonny Mack Podcast - Scribble Together by Minimizer - I/O 2024 Recap - Stable Diffusion 3 +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/coralline-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-60) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Creating Organic Blob Shapes with Circles and Tangents URL: https://www.gorillasun.de/blog/creating-organic-blob-shapes-with-circles-and-tangents/ Last updated: 2024-07-13T12:08:51.000Z In this tutorial I'll show you how to create interesting wavy and blobby shapes by tracing around the circumferences of a bunch of circles. Throughout we'll tackle how to partition things with code, how to compute the tangents between two circles, and also deal with some tricky angle computations. _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 60 URL: https://www.gorillasun.de/blog/gorilla-newsletter-60/ Last updated: 2024-06-17T06:39:12.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 60th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server where we nerd out about all sorts of genart and tech things - if you want to connect with other readers of the newsletter, come and say hi: [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) *That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup 👇* ## All the Generative Things ### The GJK Algorithm for Shape Intersections This week I learned about the GJK algorithm; an elegant and very efficient method for computing shape intersections - with the special twist that it takes quite an unorthodox and unexpected approach to achieve this. A number of resources seemingly decided to all resurface at the same time, pointing me towards the algo - classic scenario of the Baader-Meinhof phenomenon I'm guessing - one of them was an article over on *Henry*'s blog, that also hit the front page of Hacker News in the meantime: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-16-at-13.38.05.png) [Link to Article](https://computerwebsite.net/writing/gjk?ref=gorillasun.de) | [Check out what people have said over on Hacker News](https://news.ycombinator.com/item?id=40660761&ref=gorillasun.de) So what's this algo about? The GJK algorithm leverages the fact that we can represent geometric shapes as sets of infinitely many points. And, logically, if these two sets share just a single point we can determine that they intersect and overlap. How can we compute this though? It's not feasible to just make an infinite number of point comparisons. An important mathematical notion that emerges in this setting and plays a big part in the GJK procedure is the Minkowski sum. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-17-at-08.20.07.png)](https://en.wikipedia.org/wiki/Minkowski%5Faddition?ref=gorillasun.de) In a nutshell, it's a method that lets us create a new geometric shape by adding all possible vectors in one shape (the vector going from the origin to an arbitrary position inside of the shape) to all vectors in the other shape - essentially "adding" the two shapes together. The cool thing about this is that it's equivalent to sweeping one polygon along the contour of the other, and then marking the area that's covered by this *sweeping* operation. Here's two diagrams to visualize this - it's oddly difficult to mentally predict the resulting shape just by seeing the two individual ones: ![Minkowski addition - Wikipedia](https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/%D0%A1%D1%83%D0%BC%D0%BC%D0%B0_%D0%9C%D0%B8%D0%BD%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE.svg/1200px-%D0%A1%D1%83%D0%BC%D0%BC%D0%B0_%D0%9C%D0%B8%D0%BD%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B3%D0%BE.svg.png) ![a) Two convex polygons A and B. (b) The Minkowski sum A ⊕ B depicted... | Download Scientific Diagram](https://www.researchgate.net/publication/221326391/figure/fig2/AS:394105592008705@1470973503114/a-Two-convex-polygons-A-and-B-b-The-Minkowski-sum-A-B-depicted-as-a-sweep-c-The.png) I found this interesting in of itself - especially in a generative context it gives me a lot of ideas. For the GJK algo however, we care about the "corresponding inverse" of this addition, the Minkowski difference that you might have already spotted in the Wikipedia explanation above. You can think of this difference as a shape that lets us generate one of the original shapes when we compute the Minkowski sum with the other original shape. Meaning that it isn't a commutative operation like the addition. It might not be a very intuitive observation, but if this Minkowski difference between the two shapes now contains the origin, it means that the two shapes overlap/intersect. That's great, but that doesn't solve the issue of doing an infinite number of point comparisons... what if we could compute this Minkowski difference with an alternative method though? That's exactly what the GJK algorithm does, circumventing the issue again with a super smart observation and a shift of perspective - I'm not going to spoil all of it here now, if you're curious about it I highly recommend watching the following video from Reducible, that does an incredibly job at breaking down the entire procedure in a very simple language: Now if we couple this with an ear-clipping/triangulation algorithm that can represent concave shapes as convex components, we can essentially compute the intersection of arbitrary shapes in a very efficient manner. Implementing the GJK might be a super valuable topic to tackle as a tutorial in the future. ### Sebastian Lague on Optimizing Ray Tracers It's always a good week when Sebastian Lague comes out with a new video - and this time it's quite a fitting one actually. Just [two weeks ago](https://www.gorillasun.de/blog/gorilla-newsletter-58/) we talked about Ray Tracing in context of Frank Force's "City in a Bottle" - a minimal code golfed ray-caster. Lague's new video this week is a direct continuation of an exploration from a year ago, in which he explains and codes a (simple) ray tracer from scratch - in case you'd like to watch that video first, here you go: In the second installment he talks about some of the improvements that can be made to speed up the ray-tracing procedure, such as some of the methods that reduce the number of ray collision checks that need to be made to determine if a ray intersects with a particular simplex in the scene: ### Simulating Physics with Machine Learning I would usually cram this into the Gorilla Updates section towards the end of the newsletter, but Roman Gaditskii's been sharing some really cool experiments that it merits being showcased here. Two weeks ago I started exploring a special kind of geometric shape, in which I deform the edge of a rectangle with a bunch of circles, tracing around them to create a sort of wave pattern - I iterated on this idea and also made a version that wraps around the circumference of a circle, which then involved the computation of tangent points to the individual circles. It ended up being reminiscent of Dmitri Cherniak's famous Ringers — that I assume also does something similar (could be wrong on that), simulating a thread being wound around a number of circular cogs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/debuggaesthetics.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/actually-tracing-the-shape.png) Sharing these WIPs over on Twitter ended up being an inspiration to Roman, who decided to not directly figure out the math behind it but rather turn it into an optimization problem and use a neural network to solve it for him - here's what he ended up with: 0:00 /0:09 1× Yes, what a lazy way to recreate this | [Link to Tweet](https://x.com/gadirom%5F/status/1801366661360193840?ref=gorillasun.de) I thought that it's quite impressive, firstly because my version is actually static, where the individual circles can't be moved around, and secondly because I have no idea how MLX works. Asking about what's going on here, Roman elaborates a bit: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-16-at-14.20.03.png)](https://x.com/gadirom%5F/status/1801383884233576688?ref=gorillasun.de) [Link to Tweet](https://x.com/gadirom%5F/status/1801383884233576688?ref=gorillasun.de) So, as far as I understand it, this means that the model is adjusting the curve lines (the two angles at which the tangents meet the circle) based off of the the scalar product between the radius and the incident tangents - I'm assuming that because this scalar product is zero when the two vectors involved are perpendicular, it's thus a meaningful target for the loss function. I could be interpreting this completely wrong though. Roman also explored another similar idea later on, which kind of went viral, comparing two different optimizers for the purpose of a somewhat elastic chain of nodes: 0:00 /0:11 1× [Link to Tweet](https://x.com/gadirom%5F/status/1801960993704067377?ref=gorillasun.de) So what's Apple's MLX? As an abbreviation for "Machine Learning eXperience", it's basically an ML framework that leverages the silicon hardware of apple devices to perform computations. If you've got an apple device you might want to try it out here: [GitHub - ml-explore/mlx: MLX: An array framework for Apple siliconMLX: An array framework for Apple silicon. Contribute to ml-explore/mlx development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubml-explore![](https://opengraph.githubassets.com/276e68e4ee1401bf21817fd1eb9cbc7c6f442a4a15ecece360bcc3dbcd8e4450/ml-explore/mlx)](https://github.com/ml-explore/mlx?ref=gorillasun.de) I'm super stoked to see where Roman takes this next! ## Web3 News ### The Ghost CMS is getting Fedified While you might not directly think about ActivityPub or the Fediverse as something in the realm of Web3, it's still a decentralized technology and hence merits a spot in the this segment of the Newsletter. I've previously mentioned it, but the awesome people over at Ghost have been hard at work figuring out how to integrate the Ghost CMS with the ActivityPub protocol, and after 5 weeks of keeping us posted via a dedicated Newsletter, they've had their first breakthrough. A comment on last week's issue, pointed them towards an open source framework called Fedify, that describes itself as: *a library that aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience:* [FedifyFedify is a TypeScript library for building federated server apps powered by ActivityPub and other standards, so-called fediverse.![](https://fedify.dev/favicon-192x192.png)What is Fedify?![](https://repository-images.githubusercontent.com/766072261/03a63032-03aa-481e-aa31-091809a49043)](https://fedify.dev/?ref=gorillasun.de) In other words, a library that provides boilerplate functionality to build a Fediverse compatible service. In the most recent issue of the Newsletter they simply reached out directly to Hong Minhee, the creator of Fedify, asking him about the library and the intent behind it - if you're curious to read about it you can find more information here: [Alright, let’s FedifyProblem: It’s the end of a long week and your soul is tired from the endless monotony of slowly but surely conforming your behaviour to accommodate social acceptability as defined by our algorithmic overlords. Solution: Pull up a chair and engage in escapist optimism by reading about an equally disheveled![](https://activitypub.ghost.org/content/images/size/w256h256/2024/04/ghost-favicon48.png)Building ActivityPubGhost![](https://activitypub.ghost.org/content/images/size/w1200/2024/04/appp-1.jpeg)](https://activitypub.ghost.org/day-4/?ref=gorillasun.de) The plan right now is to leverage Fedify to build out the ActivityPub service into its own standalone open source service. While it will be integrated as an out-of-the-box feature with Ghost in the future, it'll also be useable by others that don't necessarily use the Ghost CMS. I'm already looking forward to next week's update! ### Kaloh's PodCast ft. Jonny Mack I've been using Hypersub for more than a couple of weeks now and it's been a total blast, it's really helped with creating some more exclusive content and supplement the rest of my blog work. Jonny Mack, the creator of Hypersub (and originally the Fabric protocol) has also been super supportive over on Warpcast, recasting whenever I had a Hypersub related update. This week Kaloh's invited Jonny onto the podcast, asking him about his endeavors, the motivations behind it, and what's in store for the future: ### Scribble Together by Minimizer You might already know Minimizer as the creator behind the Infinite Scribble project - he's now back with a new project that's somewhat of a spiritual successor as a different kind of collaboration; titled "Scribble Together" he's reached out to 20 of his genart friends asking them to create palettes for the colorization of the project's outputs: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-15-at-14.03.00.png)](https://x.com/minimizer%5Fart/status/1800978575329571067?ref=gorillasun.de) [Link to Tweet](https://www.gorillasun.de/blog/gorilla-newsletter-59/) I'm also super curious about the algo behind these patterns - if you asked me to recreate these I'd have no clue where to start! Maybe some sort of semi-quantized noise function to guide the flow of the thicker strokes that occur throughout 🤔 ## Tech and Web Dev ### I/O 2024 Recap This past year has been quite an exciting one for CSS, with more than a few interesting developments - for instance, we now have native support for scroll driven animations as well as view transitions, that streamline modern JS-less web experiences to a great extent. Here's a stellar example of view transitions in action: 0:00 /0:08 1× [Link to Tweet](https://x.com/FredKSchott/status/1800548938434642119?ref=gorillasun.de) We also got a whole bunch of other new features and tools that enable complex interactions, as well as a number of quality of life improvements that address many of the pain-points that have become common-place with modern web development - the Chrome Developer Blog provides us with their yearly massive recap enumerating all of these updates: [The latest in CSS and web UI: I/O 2024 recap | Blog | Chrome for DevelopersRead all of the CSS and Web UI announcements from Google I/O 2024.![](https://www.gstatic.com/devrel-devsite/prod/vcb16788a46369f41192d8988c5149cea86bddfebb91a7fb85ede926f44da4a35/chrome/images/favicon.png)Chrome for DevelopersX![](https://developer.chrome.com/static/blog/new-in-web-ui-io-2024/image/css-io-24.png)](https://developer.chrome.com/blog/new-in-web-ui-io-2024?ref=gorillasun.de) ### Composing JavaScript Functions that take Multiple Parameters In a previous article of his back from 2022, James Sinclair wrote about function composition - a paradigm in functional programming that revolves around chaining functions together and creating specific program 'flows' with them. The important part here is that these functions are arbitrarily compatible and can be chained in any order. If you're curious to learn about this I would recommend checking out Sinclair's piece on this: [JavaScript function composition: What’s the big deal?To hear some people talk, you’d think function composition was some kind of sacred truth. A holy principle to meditate upon whilst genuflecting and lighting incense. But function composition is not complicated. You probably use it all the time, whether you realise it or not. Why, then, do functional programmers get all worked up about it? What’s the big deal?![](https://jrsinclair.com/theme-images/favicon.ico)James Sinclair![](https://jrsinclair.com/assets/javascript-function-composition-whats-the-big-deal.jpg)](https://jrsinclair.com/articles/2022/javascript-function-composition-whats-the-big-deal/?ref=gorillasun.de) Compositing functions this way usually requires them to be unitary, meaning that they accept a single input and return a single output (default output behavior anyway). This becomes problematic in settings where you need to work with a state that can't be expressed by a single variable. If you're thinking about collating information in form of an array/object then you're already on the right track, but there's more to it than that. While I'm probably making this seem like it's not very exciting, Sinclair explains the intricacies of it, and showcases some scenarios where this is useful: [How to compose JavaScript functions that take multiple parameters (the epic guide)Function composition is beautiful. It lets us create elegant function pipelines. And when everything lines up, the data flows like maple syrup over pancakes. But what happens when the functions don’t line up? What if some of those functions expect more than one argument? What do we do?![](https://jrsinclair.com/theme-images/favicon.ico)James Sinclair![](https://jrsinclair.com/assets/how-to-compose-javascript-functions-that-take-multiple-parameters.png)](https://jrsinclair.com/articles/2024/how-to-compose-functions-that-take-multiple-parameters-epic-guide/?ref=gorillasun.de) ### Seasons and Falling Leaves Fittingly titled "What remains of the Seasons?", Mathieu Rudaz put together a beautiful website that visualizes how the seasons have changed over the past years via a nifty scroll animation that causes a tree to go through the different stages of shedding and growing back its leaves. The page is in French, but a simple click on your browser's translation function should remedy this: [En images et en graphiques – Que reste-t-il des saisons?Le développement de la végétation n’a jamais été aussi précoce que cette année. L’expression «y a plus de saisons» est-elle devenue réalité?![](https://www.tdg.ch/_next/static/media/appleTouch_tdg.ac9416c2.png)Tamedia Publications romandes S.A.Mathieu Rudaz![](https://cdn.unitycms.io/images/2MK202s34JhAoAJCB67_xp.gif)](https://www.tdg.ch/climat-que-reste-t-il-des-saisons-380282963891?ref=gorillasun.de) ### Blur Filters and Blur Alignment If you already know how a blur filter works, then this is nothing new, but I still found this animation that visualizes how a blur filter passes over an image by Dan Hollick quite interesting: 0:00 /0:10 1× [Link to Tweet](https://x.com/DanHollick/status/1800450566025527714?ref=gorillasun.de) Coincidentally I also found another tweet that shows an interesting blur trick for the visual alignment of elements, especially when it comes to placing icons somewhere in the corner of a container or parent element - this is also better referred to as optical fit, which could come in handy during your design endeavors: 0:00 /0:19 1× [Link to Tweet](https://x.com/avstorm/status/1666845758824251393?ref=gorillasun.de) ## AI Corner ### Real Photo wins AI Image Contest I dismissed this as an engagement farming headline when I first saw it over on Twitter - considering it a fun take on the inverse "AI Image wins photography contest" from a few months back - while in a way it is a fun take on this past incident - it also is a real incident. Miles Astray decided to turn the tables on AI art with this stunt of his, in an interview he explains: > After seeing recent instances of AI-generated imagery beating actual photos in competitions, I started thinking about turning the story and its implications around by submitting a real photo into an AI competition The write-up over on PetaPixel provides a good recap of this: [Photographer Disqualified From AI Image Contest After Winning With Real PhotoThe photographers strike back.![](https://petapixel.com/wp-content/themes/petapixel-2017/assets/prod/img/apple-touch-icon-180x180.png)PetaPixelMatt Growcoot![](https://petapixel.com/assets/uploads/2024/06/falmingone4.jpg)](https://petapixel.com/2024/06/12/photographer-disqualified-from-ai-image-contest-after-winning-with-real-photo/?ref=gorillasun.de) ### Stability.ai releases Stable Diffusion 3 While I'm still not really impressed with the quality of the images from SD models, stability's just released SD3, and beside being a more powerful model, now also provide a bunch of additional new features to keep up with the other image generators out there. You can read about everything new in their official announcement: [Stable Diffusion 3 Medium — Stability AIWe are excited to announce the launch of Stable Diffusion 3 Medium, the latest and most advanced text-to-image AI model in our Stable Diffusion 3 series.![](https://images.squarespace-cdn.com/content/v1/6213c340453c3f502425776e/cfbf5bc5-47d4-4f4a-b133-23bd12a7d7c2/favicon.ico?format=100w)Stability AIGuest User![](http://static1.squarespace.com/static/6213c340453c3f502425776e/62f2452bc121595f4d87c713/66589fe3e5e60f48c5f5cda3/1718267728461/view-6.png?format=1500w)](https://stability.ai/news/stable-diffusion-3-medium?ref=gorillasun.de) For instance, subscribing to their paid tier lets you access an online chat interface, similar to ChatGPT and Gemini, where you can prompt the model for images, but also directly upscale, outpaint, and even generate video clips from the generated images (not a promo). They even have a dedicated function for removing backgrounds, and prompting the removal of particular items/objects in the scene. I gave it a try on their free trial (remind me to cancel that later) just to see how well it holds up, and it's pretty descent actually: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/1581b06b-0372-449d-bf0e-0be1a0585147.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/0a28c2b1-febd-43af-b15b-15f46796b420.jpg) Here I asked it to generate a "Japanese Landscape" and then replace the "river" with a "road". And I'm quite impressed actually how well it did it at keeping everything pretty similar except for removing the river just like I asked it to. But maybe that's an easy example for it to solve, I'm not entirely sure. I also asked it to upscale the original image twice, and it didn't actually introduce any new artifacts in the process. It still struggles with fine grained details and texture however, as opposed to DALL-E, Magnific, and Mid Journey that seem to have solved these issues - I'm guessing the secret sauce here is training on copyrighted material? Will probably play around a bit more with SD3 before I make up my mind entirely - will also be interesting to see if EmProps integrates SD3 soon in light of their interface overhaul, might be straightforward since SD3 also makes the API readily available. ## Gorilla Updates I already showed what I worked on this week earlier, when I talked about Roman's MLX experimentations - but here's some more WIPs from the idea: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/what-to-do.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/whatdo.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/coraline.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/coraline2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/coralline3.jpg) The way I wrote the code actually lets me trace around any arbitrarily positioned circles - à la ringers basically. I still have to think about what I want to do with these shapes though, somehow they reminded me of corals, which is why I tried leaning into that aspect of it. One last thing I'd like to share here, is an email from Daniel Borowski, where he shared some WIPs of a project he's working that's inspired by an older article/sketch idea of mine: [An Object Oriented Approach to Random WalkersA closer look at random walkers, and how to make them explore and traverse an underlying grid, in p5js.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/rw2-1.png)](https://www.gorillasun.de/blog/an-object-oriented-approach-to-random-walkers/) > I had an idea for a game for some time now that was similar to things like [Halite](https://github.com/HaliteChallenge/Halite?ref=gorillasun.de) and the OG [ants ai.](http://ants.aichallenge.org/?ref=gorillasun.de) I drew some inspiration from some tweets of yours I saw some months back \[...\] and ended up creating a game where you can code some "bots" that move around a grid, fight other players' bots, gain energy, fight, break down walls, etc. Still a WIP, just wanted to reach out since one of your tweets is what finally got me to start working on this idea! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/bots_game.gif) Daniel's email definitely made my day! I really appreciate it whenever someone reaches out to me and shares some work that they've made by being inspired from some of the stuff that I've put out into the world. If you ever make something, don't hesitate to reach out! ## Music for Coding In an attempt to make my YouTube addiction a bit more useful and educative, I've been watching a lot of Kurzgesagt videos this past week. Not only is the art-style a huge inspiration, but also the background music that sets the overall mood of the videos. I learned that the ambient background tracks are composed and produced by Epic Mountain, a team of music makers that take on all sorts of different scoring projects. You can find all of the tracks that they've put out so far over on their YouTube - and tere's their most popular track to-date with a whopping 1.3 million views, and it's quite a treat: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got also got a discord now, let me shamelessly plug it again here. Come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the newsletter here:* [Gorilla Newsletter 59Kusakari’s approach to Soft Body Sims - Quadrangulations in Video Games - RCS Interview with Roman Verostko - The 70000 Year History of Generative Art - Cara: Anti AI Social Media - fxhash kicking off Vertex with Bjørn Staal’s Entangled +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/aerodome-1-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-59) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 59 URL: https://www.gorillasun.de/blog/gorilla-newsletter-59/ Last updated: 2024-06-10T10:09:47.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 59th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. If it's your first time here, we've also got a discord server where we nerd out about all sorts of genart and tech things, come and say hi - [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) That said, **hope that you're all having an awesome start into the new week!** Here's your weekly roundup 👇 --- ## All the Generative Things ### Kusakari's Soft Body Blobs To kick off this week, Kusakari's been making a splash over on TwiX with some really fun soft body animations: 0:00 /0:14 1× [Link to Tweet](https://x.com/kusakarism/status/1792924068129157192?ref=gorillasun.de) In computer graphics, soft body physics (or soft body dynamics) deals with simulating the movement and behavior of squishy objects; unlike rigid objects with fixed shapes, soft bodies can deform and jiggle. Imagine a bouncing ball made of rubber compared to one made of steel. There's a number of approaches to simulating these soft bodies, but the most common approach, that you find in creative coding at least, is via a particle-spring mesh, and depending on what kind of object you want to simulate the configuration of it will usually vary. If you're curious about the topic, I've written about it back in 2023, and it's actually surprisingly easy to achieve: [Programming Soft Body Physics and BlobsOne approach to modeling deformable objects in computer graphics are spring-mass systems: a technique that allows us to bring Soft Body physics to life. Picking up from the particle mesh that we created last time; in this post we’ll tackle different configurations for blob-like shapes.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/thegreattraversal-3-.jpg)](https://www.gorillasun.de/blog/soft-body-physics-and-blobs/) When I first saw the behavior of Kusakari's squishy rectangles/bands I assumed that some sort of physics engine was used to create the animations - but the #p5js hashtag suggested otherwise. Especially when you observe at the longer elongated bands/rectangles, while they're quite bendy they still somehow retain their overall shape and don't collapse on themselves when at rest or when there's other shapes pressing down on them. Kusakari's TwiX feed was a super useful open notebook documenting their progress - digging into it a bit more, it turns out that this particular behavior stems from the particular configuration that Kusakari's come up with, where the individual particles are tightly packed and cover the entire interior of the shape: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-12.42.17.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-12.44.02.png) [Link to Left Tweet](https://x.com/kusakarism/status/1787374025561587746?ref=gorillasun.de) | [Link to Right Tweet](https://x.com/kusakarism/status/1790711769327087955?ref=gorillasun.de) The second tweet suggests that there's an additional trick here with some sort of calculation happening between the internal particles of a shape such that they repulse each other. One other thing that I'm not entirely certain about is if Kusakari's animations are rendered in real-time; having to compute that many particle and spring interactions can be quite intensive on the CPU - but maybe there's an additional grid-lookup that's helping out with that under the hood. All in all, super super cool exploration! ### Björn Ottoson's Irregular Grids aka Quadrangulations Björn Ottoson - [who you might know as the creator of the oklab color space](https://bottosson.github.io/posts/oklab/?ref=gorillasun.de) \- has recently been sharing some really cool WIPs over on TwiX, showcasing his development progress on a town/city building game of his. The most recent tweets visualize the creation of interesting, organic looking irregular grid and tesselation patterns: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-06-at-18.13.28.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-08-at-16.46.39.png) [Link to Left Tweet](https://x.com/bjornornorn/status/1798344289677889964?ref=gorillasun.de) | [Link to Right Tweet](https://x.com/bjornornorn/status/1781379998047158333?ref=gorillasun.de) If these look familiar, then you might've previously seen the game Townscaper by [Oskar Stålberg](https://twitter.com/OskSta?ref=gorillasun.de) where the terrain is also based on a similar type of grid. What's fascinating about them is how they're relatively even throughout, but then collapse at certain positions so that some vertices have more than 4 outbound/inbound edges. Maybe it's due to how my brain is wired from years of making generative art and playing video games, but visually they're super satisfying to look at. The difference with Björn's approach, is that he allows the player to create their own grid configuration by placing individual nodes. Digging into the topic a bit more, I came across a Tweet by Stålberg back from 2019 in which he writes about his approach to creating these kinds of grids - even providing a super useful animation that illustrates the overall procedure: 0:00 /0:08 1× [Link to Tweet](https://x.com/OskSta/status/1147881669350891521?ref=gorillasun.de) And it seems that the proper term for these patterns is Quadrangulation, as Amit Patel points out (the OG behind the massive resource Red Blob Games). So basically just like triangulations (think Delaunay) but with quads: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-08-at-16.56.30.png)](https://x.com/redblobgames/status/1181437664303562752?ref=gorillasun.de) [Link to Tweet](https://x.com/redblobgames/status/1181437664303562752?ref=gorillasun.de) I highly recommend checking out the entire thread of replies where other people pitched in with their own takes on the concept. Also follow Björn over on TwiX, his stuff's really cool. ### When the Artists Met the Algorist Roman Verostko, another early pioneer of algorithmic art sadly passed away recently on the 1st of June 2024\. In a similar vein to Harold Cohen, Verostko also employed pen plotters as an extension to his artistic self - I believe that he is among the first to strap a brush onto a plotter. Back in 2022, RCS had the chance to interview Verostko, he recounts his long career in the field: [When the Artists Met the AlgoristAfter a pioneer of generative art reached out to RCS, the community jumped at the chance to talk to Roman Verostko![](https://cdn.prod.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Alex Estorick![](https://cdn.prod.website-files.com/61e6c06a23cb13bf76051194/636e4a60ef41c9728f01f771_Screen%20Shot%202022-11-11%20at%2013.12.25.png)](https://www.rightclicksave.com/article/when-the-artists-met-the-algorist?ref=gorillasun.de) What makes this piece special is that it brings many of the current leading artists to join in on the conversation and ask Verostko their own questions - Verostko provides insightful perspectives: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-15.01.40.png) Verostko explains the importance of incorporating personal experiences in the creative process, even when these ideas are expressed through an algorithm. ### The 70,000 Year History of Generative Art The yearly Non Fungible Conference (NFC) took place last week in Lisbon, and Monk from LeRandom made an appearance giving us a whirlwind tour of generative art, condensing its 70000 year long history into just the top 10 most important moments - fortunately for us, the talk was recorded and can be re-watched over on YouTube here: ## Cara: a Social Media against AI You've probably seen it already - a new social media platform's been on the rise. Cara is a direct response to Meta AI's new policies for training their AI models on user data - where you're opted in by default and have to go through an arduous process/form to opt out. Cara promises to be a safe haven for artists in this changing landscape of data privacy policies - which are starting to become more and more meaningless. The new app saw a massive influx of users in just a couple of days: [A social app for creatives, Cara grew from 40k to 650k users in a week because artists are fed up with Meta’s AI policies | TechCrunchArtists have finally had enough with Meta’s predatory AI policies, but Meta’s loss is Cara’s gain. An artist-run, anti-AI social platform, Cara has grown![](https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=192)TechCrunchAmanda Silberling![](https://techcrunch.com/wp-content/uploads/2024/06/1-cara-explore.jpg?resize=1200,675)](https://techcrunch.com/2024/06/06/a-social-app-for-creatives-cara-grew-from-40k-to-650k-users-in-a-week-because-artists-are-fed-up-with-metas-ai-policies/?guccounter=1&guce%5Freferrer=aHR0cHM6Ly90LmNvLw&guce%5Freferrer%5Fsig=AQAAADIMCYOWfIyhkD1IaBSnjrfPkeEL5lGax6BwE1%5FHtjT8ouFynP79LyXa8V2cBNZd-Y2z9g-R1j-a-PB1KK50jORXOqya1xGM6GA9wMcejgujfakDyWIB9FwvujfNcBQQq-gk9kA5PUFJl0m7osIbGxklcVsMofJROgmoejUAt4pB&ref=gorillasun.de) What's special about Cara is that it provides anti-AI tools out of the box, I wrote about Glaze a couple of months ago - it's essentially an AI tool that places invisible watermarks on digital images rendering them useless for training purposes. From my first impression, Cara doesn't posit itself as a very friendly platform for generative art - when posting, the app asks you to tag your post with a category, currently there is not genart tag option on the list. A discussion on the discord indicates that people would take more kindly to the terms "procedural" or "parametric", but again, we find ourselves in a semantic conundrum: the suggested terms do not reflect the emergent and autonomous properties of generative art. By that definition, maybe the term generative art is itself not the ideal term to describe the art-form, and is merely the accepted term that's established itself over time. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-10-at-10.48.47.png) [Link to Discord Thread](https://discord.com/channels/1053156655115817012/1248638917679251557/1248638917679251557?ref=gorillasun.de) ## Web3 News ### fxhash's Vertex x Bjørn Staal's Entangled This week's hottest Web3 news comes directly from fxhash, revealing their newest initiative called *Vertex.* And they're kicking things off with Bjørn Staal's project - that you might remember seeing in a tweet of his a couple of months ago, and kinda sorta breaking the internet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-14.05.46.png)](https://x.com/%5Fnonfigurativ%5F/status/1727322594570027343?ref=gorillasun.de) [Link to Tweet](https://x.com/%5Fnonfigurativ%5F/status/1727322594570027343?ref=gorillasun.de) The release strategy for the project is actually quite avant-guard; we've seen a couple of projects that have already been released in a cross-chain manner (and it's kinda worked out well), Entangled will follow that same approach, with one half of the editions being minted on the Tezos chain, and the other on Ethereum. What's special however, to further highlight the dual nature of the project and have it transcend the confines of a single blockchain, editions minted on one chain will be entangled with another edition on the other chain: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-14.19.13.png) [Link to Discord Message](https://discord.com/channels/900333075509149767/909081044932788295/1248696020385136703?ref=gorillasun.de) I'm wondering if that literally means that the two particle orbs - when run in two browser windows on the same machine - will only entangle with each other in the case that they constitute such a mint pair? It will definitely be interesting to see what kind of market dynamics this will cause on secondary. Beyond that, there's another educative dimension to the release - digging into the announcement page that's been setup for the project, the very last line hints at something that I personally find very exciting: > All VERTEX projects will arrive fully open-sourced and accessible for everyone to learn from and build on. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-14.31.12.png) Here's the codes bro! This means that the code for Entangled will be entirely open sourced - the word *guide* here indicates that it'll actually be more than that and also feature some additional explanations for the project. I'm hoping that this will also include the parts of the code that handle the cross-chain entanglement aspect. Seems to also be a cheeky answer towards the issues surrounding the original Tweet when people were directly asking for the source code of the project. ### Onchain Summer kicks Off Onchain summer is a global virtual Web3 hackathon organized and hosted by Base (coinbase), where builders of all sorts can get rewarded for their blockchain projects and initiatives - if you're building something, or have a cool idea you might as well send in your application or apply for the grant program that's running in parallel: [Onchain Summer | BuildathonOnchain Summer is back to unleash onchain creativity and invite everyone to build all summer long. Build, create, and get rewarded. June – August 2024.![](https://www.base.org/document/apple-touch-icon.png)Buildathon![](https://base.org/images/ocs/buildersummer_og.png)](https://www.base.org/onchainsummer?ref=gorillasun.de) ### Highlight's Digital Artist Index One other interesting info from last week was Nat Emodi sharing that they've been working on creating a digital artist index over highlight, planning to encompasses the top 1k artists and all of their EVM tokens (Ethereum Virtual Machine): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-06-at-17.57.37.png)](https://x.com/natemodi/status/1798689293298209248?ref=gorillasun.de) [Link to Tweet](https://x.com/natemodi/status/1798689293298209248?ref=gorillasun.de) ## Tech and Web Dev ### How Microsoft Office's First Vulnerability was Discovered Not really a tech update but quite an interesting recount from Greg Linares that hails all the way back to 2006 when Microsoft Office 2007 had just come out. All while downing more than a few drinks throughout posting his thread, he tells us how him and his team had to scramble to save face and find an actual vulnerability in the Office software, after having falsely reported one to the media that wasn't actually an issue: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-09-at-11.57.48.png)](https://x.com/Laughing%5FMantis/status/1799457232607985698?ref=gorillasun.de) [Link to Thread](https://x.com/Laughing%5FMantis/status/1799457232607985698?ref=gorillasun.de) ### On Constraints and Freedom In an article of his Alan Smith explains that giving users more options is not always to their benefit. He recounts how this was the case for the Canvas Kit that he helped develop, where providing multiple ways to style components led to inconsistent and inefficient implementations: [On Constraints and Freedomlessons learned from component styling APIs![](https://www.alanbsmith.dev/favicon.ico)![](https://www.alanbsmith.dev/moniker-image.png)](https://www.alanbsmith.dev/writing/on-constraints-and-freedom?ref=gorillasun.de) Realizing the need for a unified approach, Smith introduced "Stencils" in Canvas Kit v10, an object-based styling solution that reduces decision-making time and cognitive load while promoting a CSS-first mindset. The key takeaway here, is that constraints can enhance productivity by simplifying choices, and in turn allows users to focus on creating. ## AI Corner ### The Algorithmic Gaze by Danielle King Drawing on John Berger's and Laura Mulvey's theories, Danielle King wrote a highly interesting and relevant piece for Le Random, discussing how historical and contemporary biases find their way into AI datasets and end up deeply embedded in them, resulting in a sexualized and idealized depiction of women in AI generated content. Danielle proceeds to showcase a number of artists that are currently challenging these biases and provides some thoughts on combating the *algorithmic gaze* in the future: [The Algorithmic Gaze: Representations of Women in AI ArtEmploying John Berger’s Ways of Seeing (1974) as a critical lens, Danielle King observes the rise of the algorithmic gaze—the perpetuation of the male gaze into the realm of AI-generated art—underscoring entrenched patriarchal values and the protracted commodification of female bodies.![](https://cdn.prod.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomDanielle KingDanielle King is an artist, collector, writer, and curator based in Western Massachusetts.![](https://cdn.prod.website-files.com/6411e594fbd274173bf8c35c/666035db325b1a6beb018d86_Screenshot%202024-06-05%20at%2010.54.28%20AM.png)](https://www.lerandom.art/editorial/the-algorithmic-gaze-representations-of-women-in-ai-art?ref=gorillasun.de) ### Suno.ai Music from Samples Apparently Suno's got a new feature, where it's now possible to create tracks based of off audio samples. To showcase this they reached out to the AI OG Mario Klingemann to take it for a test drive - and naturally he delivers a banger, sampling a dialogue snippet from an old movie in the public domain: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-06-at-18.00.10.png)](https://x.com/quasimondo/status/1797673004115370036?ref=gorillasun.de) [Link to Tweet](https://x.com/quasimondo/status/1797673004115370036?ref=gorillasun.de) It's not yet a public feature (not that I'm aware of), but it seems their models are just getting better and better; they just recently released their improved 3.5 model that seems to be quite a bit more potent as compared to the previous iterations - I'm assuming this is due to the feedback that they've received from the users on the platform thus far, via the upvote/downvote buttons next to each generated song. On this note, you might also want to check out the competition that they're currently hosting throughout June (and the coming summer months), offering some quite beefy prize money for the top participants: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-10-at-01.13.15.png)](https://x.com/suno%5Fai%5F/status/1796556065972035868?ref=gorillasun.de) [Link to Thread](https://x.com/suno%5Fai%5F/status/1796556065972035868?ref=gorillasun.de) ## Gorilla Updates While my personal life has still been quite chaotic, I did managed to get in some generative explorations, and in a long time feel that I am managing to be ahead of the curve again - I returned to a previous idea and actually made some outputs I thought looked pretty nice: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/aerodome.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/algae.jpg) Another exploration was the following generative shape: 0:00 /0:16 1× If you're curious about how it's made - all you need is a bunch of circles really. I don't however know what to do with it at this point though. Replicating the shape on the canvas multiple times, allowing for overlaps and experimenting with different blend modes does make for some interesting compositions however: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/granulation.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/sunburn.jpg) And that was pretty much it. I did also work a little bit on the blog, but there wasn't that much progress on that front. Maybe next week I'll have a bigger update. ## Music for Coding Last week I discovered the music of Ryan Lee West, who creates expansive and textural soundscapes under the alias of Rival Consoles... and I was instantly blown away! It's a bit difficult to pin down the genre exactly, but if you're a fan of *minimal atmospheric techno*, that's built with a human touch, you'll definitely enjoy these sounds: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got a discord now, let me also just plug that here, come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the Newsletter here:* [Gorilla Newsletter 58256 Byte Raytracer - Vertex Shader Domain Warping - Amy Goodchild’s Meaningful Nonsense - Painting with Plotters - P5JS ASCII Shader Renderer - r1b2’s fit - JavaScript PNG Encoder - CSS Masonry +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/quiltgen9-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-58) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 58 URL: https://www.gorillasun.de/blog/gorilla-newsletter-58/ Last updated: 2024-08-15T08:06:47.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 58th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. First off, apologies for the radio silence last week! Sometimes, life throws you a curveball (or three), and everything else has to take a temporary backseat for a little while. After running this newsletter for 58 weeks straight without a single week off, it was bound to happen at some point - next time I'll make sure to make it a scheduled break and announce it properly ahead of time! The important thing is that I'm back this week! While I didn't really get a break, I feel quite refreshed, and eager to get back to reporting on everything that's been going on in the genart space. Besides that, thanks again to everyone that's joined the discord so far, we're over a whopping 100 members now! 🎉 If you're making some cool art or building some cool things, come say hi and let's have a good time nerding out about tech things - [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) ***That said, hope that you're all having an awesome start into the new week! Here's your weekly roundup*** 👇 --- ## All the Generative Things ### City in a Bottle by Frank Force The size coding wizard Frank Force treats us to an incredibly insightful article/tutorial, explaining how the code behind one of his most viral size code tweets "City in a Bottle" works - in just 256 bytes Frank manages to implement a tiny ray caster that visualizes an endlessly side-scrolling cityscape - what's more impressive is that it's not just the JavaScript code that produces the imagery, but actually an entire valid HTML page: [City In A Bottle – A 256 Byte Raycasting SystemHello size coding fans. Today, I have something amazing to share: A tiny raycasting engine and city generator that fits in a standalone 256 byte html file. In this post I will share all the secrets…![](http://frankforce.com/wp-content/uploads/2013/06/favicon.ico)Killed By A PixelFrank Force 🌻![](https://frankforce.com/wp-content/uploads/2024/05/city4-2.png)](https://frankforce.com/city-in-a-bottle-a-256-byte-raycasting-system/?ref=gorillasun.de) If you're not familiar with ray casting, it's essentially a technique that lets you render and map 3D scenes onto a 2D canvas. It works by tracing imaginary lines (rays) from a viewpoint (like a camera or observer) out into the scene, using the collision information of the rays with different objects in the scene to determine what needs to be rendered onto the screen. In the article Frank explains how this can be achieved in a minimal manner, with just a few lines of code. As a side note here, the terminology can be a little confusing if you're ever researching ray casting for yourself; ray casting's not exactly the same thing as ray tracing - ray tracing is a more elaborate version that simulates the physical properties of the light rays and how they illuminate a 3D scene, where individual rays can bounce off of objects and reproduce phenomena like refractions and reflections. Here's a pretty good answer that provides a distinction between them: [What is the difference between ray tracing, ray casting, ray marching and path tracing?As far as I know, all the techniques mentioned in the title are rendering algorithms that seem quite similar. All ray based techniques seem to revolve about casting rays through each pixel of an im…![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a)Stack Overflowjanekb04![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v=73d79a89bded)](https://stackoverflow.com/questions/67347177/what-is-the-difference-between-ray-tracing-ray-casting-ray-marching-and-path-t?ref=gorillasun.de) Some stellar ray tracing works are from Piter Pasma, such as his Universal Rayhatcher that's described [here](https://shorturl.at/XLTg3?ref=gorillasun.de), as well as his Blokkendoos project that also takes a size coding approach. Another resource that I recently discovered and shared in the Newsletter issue from two weeks ago is by [Eric Loftis where he recreates iconic ray-traced scenes and open sources the code for them](https://www.gorillasun.de/blog/gorilla-newsletter-56/). Overall it's a super fascinating topic, I haven't attempted ray casting/ray tracing so far, except for the purposes of a homework in a graphics course I took many years ago where we had to implement a ray tracer with OpenGL in c++. Ultimately I wasn't able to get the ray tracer working properly, but still got a good grade on it somehow. I digress however, if you're curious, here’s the original tweet that went viral around two years ago (it's a video so you'll have to view it on the blog or on Twitter): 0:00 /0:08 1× [Link to Tweet](https://x.com/KilledByAPixel/status/1517294627996545024?ref=gorillasun.de) Highly recommend checking out the Tweet over on Twitter, Frank added a whole lot of additional information in follow-up tweets that link to revised versions of the sketch, and additional resources that better understand what's going on in the code, such as this [verbose version by Daniel Darabos over of observablehq](https://observablehq.com/@darabos/decoding-a-city-in-a-bottle?ref=gorillasun.de). Apparently there's also a technique called Photon Mapping that's yet another different technique, here's an interesting discussion about it over on Hacker News (back from 2015): [What’s the difference between path tracing, ray tracing and photon mapping? I’d ... | Hacker News![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Hacker News![](https://news.ycombinator.com/y18.svg)](https://news.ycombinator.com/item?id=9994935&ref=gorillasun.de) So, big thanks to Frank for providing us with such an insightful article, it's another testament that you don't always need a lot of code to do amazing things! ### Domain Warping with Vertex Shaders by Dave Pagurek Another awesome article from the past two weeks is Dave Pagurek's rewrite of a piece of his on *Domain Warping* with vertex shaders. In it he explains the necessary tricks to deform all sorts of different 3D shapes: [Vertex Shader Domain Warping with Automatic Differentiation - Dave Pagurek![](https://www.davepagurek.com/favicons/favicon-180.png)Dave Pagurek![](https://www.davepagurek.com/content/images/2024/05/warped-bunny.jpg)](https://www.davepagurek.com/programming/shader-domain-warping/?ref=gorillasun.de) The previous version of the article can be found [here](https://www.davepagurek.com/blog/realtime-deformation/?ref=gorillasun.de). What's domain warping though? It's a technique that lets you deform shapes that are made out of vertices. Instead of drawing the vertices that make up the shape directly to the canvas/screen, an additional step displaces the individual vertex coordinates according to some type of wave or noise function (any type of function really) before they're drawn. I've use domain warping on a couple of occasions in a 2D setting - here's two examples that you might remember from previous issues of the Newsletter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2023-10-30-at-08.30.06.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/stars-2.png) On the left I'm warping the entire grid with a sine function. On the right I'm warping the individual edges of the triangles inside a triangular lattice to obtain a more interesting tessellation. Not entirely sure if you can really call the second one domain warping. You might've also done something like it before without realising that the technique actually had a name. In 2D displacing vertices is pretty straightforward, in 3D things get a bit more complicated as Dave explains in his article. The issue is that the warping function ignores the normal vectors that are used to determine the color of the shapes in the fragment shader pass - since the vertex positions have been changed, the tangents would also need to be adjusted to account for the deformation and remain perpendicular to the shape's surface. And that isn't so easy as the math gets quite involved. If you don't like reading words, Dave also provides us with an explanation in video format at Creative Code Toronto: ### Meaningful Nonsense Amy Goodchild Amy's back with a new article, this time letting us in on the sentence generating system that she's come up with for creating the esoteric words and sentences that make an appearance in her current ongoing generative diagram project: [Meaningful Nonsense: How I generate sentences — Amy GoodchildI’m coding a system in JavaScript that generates sentences of “meaningful nonsense”. Here are some examples.![](https://images.squarespace-cdn.com/content/v1/5f33cddd6aff255aabb0c6cd/1598285066323-AE6AS241FTS6QP3C4OA6/favicon.ico)Amy GoodchildAmy Goodchild![](http://static1.squarespace.com/static/5f33cddd6aff255aabb0c6cd/5f37d09b551f154577577f01/664a09b389a8185730d4cab8/1716987088674/meaningfulnonsense.jpg?format=1500w)](https://www.amygoodchild.com/blog/meaningful-nonsense-sentences?ref=gorillasun.de) While the system was initially intended for creating titles to accompany the generative diagrams, the system's evolved since to also generate "truths". And it's interesting how you don't actually need something incredibly complicated to composite these kinds of sentences, Amy does so by first defining a couple of sentence templates that define the resulting sentence structures, which are then filled in with the appropriate word types at the correct positions. For this purpose she also defines lists of words that can fit at those positions in the sentence. Simple, but genius - if the Poetry topic makes a return in next years Genuary I'm definitely using this approach as an inspiration! In other news, Amy's also been sharing more frequent updates via her Newsletter; if you're interested in following along with what she's been up to I recommend subscribing to her over on Substack! [Gen art diary #3: Meaningful nonsenseMy system for generating sentences, plus more from the plotter.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Amy GoodchildAmy Goodchild![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca3c56ad-2ea3-4b4c-984e-05ad7f57e2c9_1807x988.png)](https://amygoodchild.substack.com/p/gen-art-diary-3-meaningful-nonsense) ### Painting with Plotters by Licia He Probably one of the most exciting news that dropped last week, was Licia He's announcement about her plans a full plotter course - what's more is that it's going to be free for everyone! I don't even have a plotter, but I'm super excited nonetheless. Here’s the announcement Tweet with some additional info in the thread: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-26-at-00.05.03.png) You'll be able to find the course over on her website, here: [Painting With PlottersLicia He![](https://eyesofpandaweb.s3.us-east-2.amazonaws.com/website_public/projects/painting_with_plotters/00/00_banner.jpg)](https://www.eyesofpanda.com/project/painting%5Fwith%5Fplotters/?ref=gorillasun.de) It indicates that September 2024 is planned for the release and already provides an outline of the topics that she'll tackle throughout. What's also exciting is that Licia's having her very first solo exhibition at the Gazelli art house in London - if you're around at the time you might want to check it out! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-02-at-16.29.49.png) [Link to Tweet](https://x.com/Licia%5FHe/status/1793989414768775499?ref=gorillasun.de) ### A Fast and Customizable P5JS ASCII Renderer Back in Genuary, I don't really remember for which prompt it was, I attempted an ascii renderer in vanilla JS that took in the color information of the ascii grid from the underlying pixel array - I quickly realized that it would be awfully slow. Through Raph's birbsnest discord I discovered that humanbydefinition made a blistering fast P5 compatible GLSL shader that achieves this, and even shares the source code for it in a github repo: [GitHub - humanbydefinition/p5js-ascii-renderer: A fast and customizeable p5.js ascii renderer utilizing a GLSL shaderA fast and customizeable p5.js ascii renderer utilizing a GLSL shader - humanbydefinition/p5js-ascii-renderer![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubhumanbydefinition![](https://opengraph.githubassets.com/5772c630c36f36bc172537f59a9276d6b0f9d9ca30f01e172dd424eaf49b23a1/humanbydefinition/p5js-ascii-renderer)](https://github.com/humanbydefinition/p5js-ascii-renderer?ref=gorillasun.de) Rendering stuff with an ascii grid is a super useful trick to have in your creative toolkit, so at some point I will definitely have to have a closer look at how this works under the hood! ![header](https://github.com/humanbydefinition/p5js-ascii-renderer/raw/main/assets/repository_media/logo_gif.gif) ## Web3 News ### Gorilla Zine I've got a very special update this week: I made my very first Zine! You can read it here (you can click on the images to zoom in for a better reading experience): [GORILLAZINE IA digital zine in 2024!? Blasphemy!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/06/Purple-Haze---Farcaster-News.-A-new-era-of-decentralized-social-media-TwiX-the-Place-where-Tweets-go-to-Die---a-mini-essay.-In-Conversation-with-Gemini---investigating-the-strangest-parts-of-laten-1--1.png)](https://www.gorillasun.de/blog/gorillazine-i/) Consider it this week's recap of Web3 news... with some additional reading entertainment! It's a bit of a weird one really - content-wise at least, if you're not a fan of crypto or AI things you might want to skip it, but I'm really happy with how it turned out. The idea for it came really quickly and it was a lot of fun doing something with an editing software for once, dragging and dropping shapes and text by hand was a really nice change of pace. I also made this additional little infographic and an accompanying thread to explain the motivations behind this digital artifact a little: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Purple-Haze---Farcaster-News.-A-new-era-of-decentralized-social-media-TwiX-the-Place-where-Tweets-go-to-Die---a-mini-essay.-In-Conversation-with-Gemini---investigating-the-strangest-parts-of-laten-3--1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-03-at-11.21.14.png) [Link to Thread](https://x.com/gorillasu/status/1796900075165110719?ref=gorillasun.de) ### r1b2's Newest Project and Write-Up r1b2's released a new project over on highlight, and it's a free open edition running throughout the month of June. Aptly titled "Fit" the project revolves around shape packing, and in combination with noise fields to guide the compositions, it feels like big celebration of the two popular genart techniques. r1b2 also provides us with a walkthrough explaining how the outputs come together, shining some light on the technical details of the project: [“Fit” walkthrough – Circle packing, noise fields, and Joe Jackson – R1B2![](https://www.r1b2.com/wp-content/uploads/2022/01/cropped-r1b2logo2-270x270.jpg)R1B2![](https://www.r1b2.com/wp-content/uploads/2024/05/GOi55UNW4AASd7H.jpg)](https://www.r1b2.com/2024/05/31/fit-walkthrough-circle-packing-noise-fields-and-joe-jackson/?ref=gorillasun.de) We've actually chatted quite about packing things over in the discord, r1b2 shared a really cool personal story that dates back to 2006 where he placed in the top 20 for a programming contest that revolved around circle packing. What makes this ranking special is that he was competing on his own against research labs: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-02-at-22.27.21.png) [Link to Competition Website](https://shorturl.at/Nkohj?ref=gorillasun.de) That story makes the project just so much more special. I'm also still very honored that one of my tutorials served as the inspiration for r1b2's previous project the Circle of Life - if you're curious about that one, there's also a write-up about it here: [Making of “Circle Of Life” – R1B2![](https://www.r1b2.com/wp-content/uploads/2022/01/cropped-r1b2logo2-270x270.jpg)R1B2![](https://www.r1b2.com/wp-content/uploads/2023/11/ezgif-4-c48df4a512.gif)](https://www.r1b2.com/2023/11/25/making-of-circle-of-life/?ref=gorillasun.de) ### Julian Espagnon's Crypsis Another project that released a couple of days ago was from Julian Espagnon, another awesome generative artist, and the piece is absolutely delightful - Julien shares a bit more about the process in [here](https://x.com/Julien%5FEspagnon/status/1794329558755549280?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-02-at-22.51.09.png) [Link to Tweet](https://x.com/Julien%5FEspagnon/status/1795108931775217946?ref=gorillasun.de) | [Link to Foundation Collection](https://foundation.app/collection/crypsis?ref=gorillasun.de) ### L2s as cultural extensions of Ethereum The creator of Ethereum Vitalik Buterin wrote an interesting article about the emergent cultural aspects of Layer 2s and different blockchains, they're not simply technological innovations, but also form their own unique communities around them, and is reminiscent of how different online communities have had their own distinct vibes and values over the years.: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-03-at-11.26.30.png)](https://vitalik.eth.limo/general/2024/05/29/l2culture.html?ref=gorillasun.de) [Link to Article](https://shorturl.at/eDXJ7?ref=gorillasun.de) ## Tech and Web Dev ### HTML in the Canvas Unarguably the biggest news that dropped this past week was from the Google Chrome developer team, announcing a new feature for the HTML canvas that allow HTML elements to now be integrated as part of the canvas itself - I have no idea how this works, so don't ask me - and afaik this is simply a very early demo but will still have to go through W3C for it to be a thing. Here's the demo video that's been posted: 0:00 /0:22 1× [Link to Tweet](https://x.com/fserb/status/1794058245901824349?ref=gorillasun.de) ### Matt DesLauriers' Javascript PNG Encoder Matt DesLauriers' been up to quite a few shenanigans over on Twitter, posting about his efforts in building a png encoder and decoder - just a few days ago he's released some of the tools in form of an open source repository on Github - here's Matt's tweet: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-02-at-23.17.45.png) So what's this? Why do you need a PNG encoder? When you're making art with JavaScript, like many a modern generative artist does, then you might run into complications when the time comes to save and export your outputs as images for printing purposes. I haven't really made any prints so far, but I have to admit that I've never actually thought about this, and that there's more to it than just right-click saving the canvas - a proper PNG encoder in this setting takes the pixel array of the HTML Canvas element that you're manipulating and encodes it into a PNG file. Having control over the encoder in this sense helps tremendously with the fidelity of the file. Here's a link to the Github repo, definitely worth a star: [GitHub - mattdesl/png-tools: low-level PNG tools for JavaScript and Weblow-level PNG tools for JavaScript and Web. Contribute to mattdesl/png-tools development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubmattdesl![](https://opengraph.githubassets.com/02fb268a9a29f3bdb6ad94f6dfb04dc416dd6a378f3f4b11fa49428015358963/mattdesl/png-tools)](https://github.com/mattdesl/png-tools?tab=readme-ov-file&ref=gorillasun.de) ### CSS Masonry Saga Part IV Another challenger enters the ring for the CSS Masonry discussion. There's been a new article on the issue almost every week ever since the WebKit team made their initial proposal (so simply check the previous Newsletter to get catch up). Similarly to the Chrome team counterproposal, Keith Grant argues that Masonry layouts should be separate from the Grid spec, and this simply because it would make learning the Masonry layout for newcomers much easier. If it were part of the Grid spec, you'd have to learn the intricacies of it even if you're not going to end up using most of it - Keith does a better job at explaining this than I can in just a few words: [Weighing in on CSS MasonryShould masonry be its own \`display\` method outside grid? Absolutely.![](https://keithjgrant.com/images/favicon-96.png)Home Owl logoKeith J. Grant![](https://res.cloudinary.com/keithjgrant/image/fetch/c_scale,f_auto,w_600/https://keithjgrant.com/images/2024/stone-masonry.jpg)](https://keithjgrant.com/posts/2024/05/weighing-in-on-css-masonry/?ref=gorillasun.de) I think it's pretty clear now that Masonry will likely end up being its own separate thing, since it generally feels like there's quite a bit of resistance against it becoming a part of the Grid spec. ## AI Corner ### ComfyUI + P5 Bejamin Fox's a cool thing he's put together over in the discord: a custom node for ComfyUI that runs a p5 sketch and feeds it into an SD img2img model, allowing you to alter and transform the generated sketch via a text prompt, here a bunch of cubes are turned into crystals and geodes: ![](https://cdn.discordapp.com/attachments/1233098198537732229/1245432786807160932/p5js_2.PNG?ex=665d586b&is=665c06eb&hm=c053e2aa3ddf1b07570b694e55f56c815b699dd02f108f8bef58b0bb80ae5d1a&) [Link to github repo.](https://github.com/tracerstar/comfyui-p5js-node?ref=gorillasun.de) If you're not familiar with ComfyUI, it's essentially amodular stable diffusion GUI with a graph/nodes interface, and lets users design and execute their own stable diffusion pipelines with a flowchart-based interface. If that sounds interesting to you, here's the Github repo: [GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface. - comfyanonymous/ComfyUI![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubcomfyanonymous![](https://repository-images.githubusercontent.com/589831718/974ecfce-09f7-4199-8bed-1449497d778d)](https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file&ref=gorillasun.de) ### Did Github Copilot really increase my productivity? Yuxuan Shui wrote an article in which he reflects on his experience with Copilot, that he's mainly used for the purposes of developing his own personal project. He ultimately comes to the conclusion that he's more productive without the smart coding assistant, mainly due to the unpredictability of it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Screenshot-2024-06-03-at-11.37.57.png)](https://trace.yshui.dev/2024-05-copilot.html?ref=gorillasun.de) [Link to Article](https://shorturl.at/YLvFN?ref=gorillasun.de) I haven't used copilot yet, but for those of you who do, what's your experience been like? ## Music for Coding This past week I discovered the timeless masterpiece "A Color Map of the Sun" by the band Pretty Lights. Listening to it for the first time a decade after its initial release I can only say that I would place right up there alongside Bonobo and Tycho: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got a discord now, let me also just plug that here, come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the Newsletter here:* [Gorilla Newsletter 57Big OpenAI and GoogleIO Recap - Coding my Handwriting by Amy Goodchild - The Art of Digconart - Colette Bagert on Growing Visually - Art Blocks Studio Update - Crypto’s Broken Moral Compass - Bend Programming Language - CSS Masonry Part 3 +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/05/51205102-1--2-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-57) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### GORILLAZINE I URL: https://www.gorillasun.de/blog/gorillazine-i/ Last updated: 2024-06-22T10:56:28.000Z ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/6.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/7.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/8.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/9.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/10.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/12-1-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/13.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/14.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/15.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/16.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/06/Purple-Haze---Farcaster-News.-A-new-era-of-decentralized-social-media-TwiX-the-Place-where-Tweets-go-to-Die---a-mini-essay.-In-Conversation-with-Gemini---investigating-the-strangest-parts-of-laten-3-.png) ### Gorilla Newsletter 57 URL: https://www.gorillasun.de/blog/gorilla-newsletter-57/ Last updated: 2024-05-20T21:54:25.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 57th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of Gorilla updates. Thanks again to everyone that's joined the discord so far, we're at a whopping 100 members now! 🎉 Come say hi and let's have a good time nerding out about tech things - [here's an invite link!](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de) That said, **hope that you're all having an awesome start into the new week!** Here's your weekly roundup 👇 --- ## Another Chapter in the Race for AGI Boy, where do we start this week? I know this isn't the usual format - but all of my social media timelines have been absolutely abuzz with the recent announcements by OpenAI and Google, both of which came out with some big updates to their AI models. That's why we're kicking off the Newsletter this week with a big recap of everything that's transpired throughout the past week - there's a quite a lot to sink our teeth in this week! **If you just want the quick version, you can find a TLDR at the end of this section! 🧠 ⏬** ### Hello ChatGPT-4o On May 13th, OpenAI made a surprise announcement revealing their new and improved flagship model ChatGPT 4o. The letter O here stands for Omni, or Omnimodel, and is meant to highlight the multi-modal capabilities of this iteration of ChatGPT. While also being cheaper and faster, their announcement places an emphasis on the human-like conversational abilities of the AI. They boast that it is now seemingly much easier to use, with a noticeably reduced latency between picking up the users' spoken inputs and the text-to-voice generated replies, making it possible to hold a conversation with the smart chat-bot in almost real-time. What's more, is that they're also making 4o accessible to all users, not just those that are currently paying for the premium version. If you check out the web app/mobile app it should already be available. Paying subscribers still do get a higher message limit however. In the key-note presentation that OpenAI released over on YouTube, currently sitting at close to 4 million views, CTO Mira Murati starts off by providing a run-down of 4o's new features - followed by a live demo, showcasing what the app can do: And honestly it's quite impressive that it can pick up on voice and shoot back with answers so quickly, even with video input thrown into the mix, it seems to be able to handle all of it pretty well. I gave it a shot over the weekend while helping out my sister with her homework, and it worked like a charm - you just snap a pick of the exercises, ask it to solve it, and then it'll generate the answer. Truly stuff of the future. And it seems that OpenAI doesn't actually have to fabricate its demos - like some of the other recent trailers in the AI space: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-15.44.53.png) Biggest flex of the year award goes to Greg Brockman | [Link to Hacker News Item](https://news.ycombinator.com/item?id=40345775&ref=gorillasun.de) While the live demo is a bit awkward - I found their accompanying article [Hello GPT-4o](https://openai.com/index/hello-gpt-4o/?ref=gorillasun.de) to be much more informative. In it they provide a number of benchmarks indicating that 4o's got many of the other models out there beat across several tasks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-15.38.33.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-15.38.55.png) The article also showcases a number of very useful applications. For instance, the model can handle over 50 different languages, and detects these automatically - you don't have to fiddle around with the setting. This means that it can basically serve as a drop in replacement for translators - guess programmers were not actually the ones that should have been afraid for their jobs 🤷 One aspect of 4o, that sparked quite a bit of controversy, is the fact that their text-to-speech pipeline was a little too realistic, even being able to adjust its tone of voice and mood according to the requests of the users. In another demo that was posted over on TwiX - the chatbot decided (set to?) to take on a very flirty tone of voice which was not received well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-15.53.39.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-15.56.37.png) [Link to the Demo in Question](https://x.com/OpenAI/status/1790072174117613963?ref=gorillasun.de) | [Link to Quote Tweet by Cassie Evans](https://x.com/cassiecodes/status/1790330792075280861?ref=gorillasun.de) This even prompted an entire segment on the daily show, ridiculing this particular demo: The question here, does the vocalized version of the LLM require the ability to imitate different tones of voice and moods? These models have no innate ability to feel any sort of emotion whatsoever, they are simply emulating these voices based on patterns in the training data - why is a monotonous and robotic synthesized voice not enough? Obviously, I am fully aware that this wouldn't be as marketable. While this is being passed off as a big joke right, it's actually a severe issue. Edit: Gorilla from the future here (realtive to the Gorilla that wrote this 🦍) just as I was putting the final touches on the Newsletter there was another update from OpenAI regarding the voices included in the app - the decide to disable the 4o's flirt mode for now: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-20-at-11.01.40.png) [Link to Tweet](https://x.com/OpenAI/status/1792443575839678909?ref=gorillasun.de) | [Link to Article](https://openai.com/index/how-the-voices-for-chatgpt-were-chosen/?ref=gorillasun.de) On a more lighthearted not however, it seems that this has also prompted a new type of meme where 4o serves as a [virtual boy/girlfriend](https://x.com/julesterpak/status/1774305346690957533?ref=gorillasun.de). Beyond that, OpenAI is also in the process of rolling out ChatGPT as a Desktop app, I was not able to download it yet however, as it's not currently available in the German App Store it appears. ### Wave of Resignations and Open AI Partnership Deals In an alarming turn of events, the very same day that OpenAI reveals 4o, Ilya Sutskever makes his own announcement, sharing that he's made the decision to leave OpenAI after a decade of working there - his Tweet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-23.35.01.png)](https://x.com/ilyasut/status/1790517455628198322?ref=gorillasun.de) [Link to Tweet](https://x.com/ilyasut/status/1790517455628198322?ref=gorillasun.de) If you are not familiar with Sutskever, he is essentially OpenAI's co-founder and been the chief scientist there for the longest time. In a Tweet from December he did voice his concerns with their trajectory, but there has been no recent update about it. It seems that he is working on a new project of his own that'll we'll learn more about in due time. This resignation is followed by another from Jan Leike, the current (former) super alignment co-lead. He actually follows up with some further information on why he came to this decision, voicing his disagreement with OpenAI's trajectory towards AGI: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-23.44.06.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-23.46.32.png) [Link to Tweet](https://x.com/janleike/status/1790603862132596961?ref=gorillasun.de) | [Link to Thread](https://x.com/janleike/status/1791498174659715494?ref=gorillasun.de) It seems that OpenAI is not currently prioritizing the safety of the models that they're developing - which is alarming- but not surprising. We actually did end up getting an update on this issue from Vox that was quick to reach out to those that resigned. You can read it here: [“I lost trust”: Why the OpenAI team in charge of safeguarding humanity implodedCompany insiders explain why safety-conscious employees are leaving.![](https://cdn.vox-cdn.com/uploads/hub/sbnu_logo_minimal/441/touch_icon_iphone_retina_1000_yellow.755.png)VoxSigal Samuel![](https://cdn.vox-cdn.com/thumbor/8qQgX0BSfSkPYxLKWtSUNelT3n8=/0x1078:8195x5369/fit-in/1200x630/cdn.vox-cdn.com/uploads/chorus_asset/file/25451466/sam_altman_GettyImages_1258197161.jpg)](https://www.vox.com/future-perfect/2024/5/17/24158403/openai-resignations-ai-safety-ilya-sutskever-jan-leike-artificial-intelligence?ref=gorillasun.de) One aspect that plays into this issue is OpenAI's current quest for making deals with all of the major forum-like platforms across the internet, following their deal with StackOverflow, they recently announced a partnership with Reddit: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-17-at-11.16.17.png) [Link to Tweet](https://twitter.com/OpenAI/status/1791205420142670250?ref=gorillasun.de) And we've also got Musk doing his own thing over here. ### Gemini 1.5 Pro & Project Astra at GoogleIO Now that we've covered the OpenAI side of things - let's have a look at GoogleIO, the annual developer conference where Google showcases all of its new tech products. While the conference doesn't solely revolve around AI things, in this section we'll focus on the AI related updates. If you only care about the tech updates, there's a good and concise list of ten highlights over on the Chrome for Developers blog: [10 updates from Google I/O 2024: Unlocking the power of AI for every web developer | Blog | Chrome for DevelopersDiscover exciting features from the Google I/O Developer Keynote and sessions.![](https://www.gstatic.com/devrel-devsite/prod/ve5ef9ac7b497e19ece9427facc78d0c59aaab7a2bc6a0f75fdae93f4ee589f67/chrome/images/favicon.png)Chrome for DevelopersX![](https://developer.chrome.com/static/blog/web-at-io24/image/thumbnail.png)](https://developer.chrome.com/blog/web-at-io24?ref=gorillasun.de) The two big AI updates from GoogleIO are Gemini 1.5 Pro and TheProject Astra. Gemini 1.5 Pro now boasts a massive 2 million token context - meaning that it can retain quite a bit of information during a chat (approximately equivalent to 1.4 million words). In light of this they also make available a new feature called context caching that lets you reuse certain chunks of tokens. You can find a whole lot of info about this in their official article - for example they showcase how they feed in the entire 402 transcript of the Apollo 11 mission and ask it question about the massive piece of text: [Gemini ProOur best model for general performance across a wide range of tasks. 1.5 Pro has a two-million-token long context window — the longest of any large-scale foundation model.![](https://deepmind.google/static/icons/google_deepmind_48dp.5b470587fe7d.svg)Google DeepMind![](https://lh3.googleusercontent.com/CaqGzA90X7KxxvEASKh15n8jY_EUFDn9nlViSRt-76Z9RJqx-gnoJdsVb5fXI3LLaNeyczeZDtaC0Ec0Fb5242DwCYstds-xF2LouEGSVGy-IuIetw=w1200-h630-n-nu)](https://deepmind.google/technologies/gemini/pro/?ref=gorillasun.de) Secondly, they also reveal their Project Astra, a multi-modal LLM powered chat assistant that looks quite similar to GPT–4o - minus the quirky voice, and a noticeably longer delay in response time: Besides this their project IDX - an AI powered code editor - is now also publicly accessible. I remember signing up to the wait-list for that a couple of months ago, but never getting back an update. I'm guessing the most entertaining part of the GoogleIO event was Marc Rebillet's stellar performance, which we'll definitely be used as a meme template for months to come: ### OpenAI x Google Beef: Race for Apple Integration It's not pure coincidence that both OpenAI and Google made announcements about their new products - it seems that it was a calculated strike from Altman to steal the show, just a couple of hours prior to when GoogleIO kicked off. When Altman made a snarky remark about the "aesthetics" of the event, this prompted a reply from Nado a research engineer over at Google Brain: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-17-at-10.38.42.png) [Link to Tweet](https://x.com/zacharynado/status/1791208273812623462?ref=gorillasun.de) The surprise announcement of OpenAI could have very likely been related to the negotiations that have been underway with Apple, which is currently looking for a third party to power the AI features of future iterations of the iPhone. While it seemed like the deal with OpenAI was coming to a close just a few days ago, apparently Google's Gemini is not off the table as a candidate: [Apple reportedly still in talks to use Gemini for iPhone AI features as OpenAI deal loomsAccording to a new report, Google and Apple are still in talks to use Gemini for AI features on the iPhone, but an OpenAI deal is closer.![](https://9to5google.com/wp-content/themes/ninetofive/dist/svg/9to5-clock.svg)9to5GoogleBen Schoon![](https://i0.wp.com/9to5google.com/wp-content/uploads/sites/4/2023/12/google-ai-gemini-cover.jpg?resize=1200%2C628&quality=82&strip=all&ssl=1)](https://9to5google.com/2024/05/10/google-apple-gemini-discussions-report/?ref=gorillasun.de) This begs the question why Apple is not simply developing their own in-house solution for this purpose. But it might just be that they don't really have the data for this purpose due to their privacy policy: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-22.55.47.png)](https://www.reddit.com/r/OpenAI/comments/1bhknr9/apple%5Fis%5Fin%5Ftalks%5Fto%5Flet%5Fgoogles%5Fgemini%5Fpower/?ref=gorillasun.de) [Link to Reddit Post](https://www.reddit.com/r/OpenAI/comments/1bhknr9/apple%5Fis%5Fin%5Ftalks%5Fto%5Flet%5Fgoogles%5Fgemini%5Fpower/?ref=gorillasun.de) But that's a can of worms that we'll have to open another day when Apple makes a decision on which third-party they'll rely on for powering their AI features. And yeah that's pretty much all of the important updates from the past week in that regard - that I could find at least. What did I miss? ### TLDR Recap of Events - [OpenAI reveals GPT-4o](https://openai.com/index/hello-gpt-4o/?ref=gorillasun.de), an improved, cheaper, faster, more multi-modal iteration of the GPT models. - [Controversial demo of GPT-4o makes the rounds on TwiX](https://x.com/cassiecodes/status/1790330792075280861?ref=gorillasun.de) | [Daily Show segment takes a stab at the much too realistic voice of 4o](https://www.youtube.com/watch?v=9rRK4KPRVEs&ref=gorillasun.de) - Wave of resignations ensues, Ilya Sutsekever & Jan Leike | [Vox Coverage of the reason behind the resignations](https://www.vox.com/future-perfect/2024/5/17/24158403/openai-resignations-ai-safety-ilya-sutskever-jan-leike-artificial-intelligence?ref=gorillasun.de), concerns about safety and OpenAI's trajectory. - OpenAI x Reddit Partnership Announcement Link - [GoogleIO 10 Highlights](https://developer.chrome.com/blog/web-at-io24?ref=gorillasun.de) | [Gemini 1.5 Pro](https://deepmind.google/technologies/gemini/pro/?ref=gorillasun.de) | [Project Astra](https://deepmind.google/technologies/gemini/project-astra/?ref=gorillasun.de) | [Project IDX](https://idx.dev/?ref=gorillasun.de) - [Twitter Beef GoogleIO x OpenAI](https://x.com/zacharynado/status/1791208273812623462?ref=gorillasun.de) | [Race for Apple Integration](https://www.reddit.com/r/OpenAI/comments/1bhknr9/apple%5Fis%5Fin%5Ftalks%5Fto%5Flet%5Fgoogles%5Fgemini%5Fpower/?ref=gorillasun.de) - [Marc Rebillet's performance at GoogleIO](https://www.youtube.com/watch?v=wwk1QIDswcQ&ref=gorillasun.de) ## All the Generative Things ### Coding my Handwriting by Amy Goodchild Amy Goodchild is back with another article, and as always, it's a banger. As a continuation to her previous post on figuring out a generative approach to handwritten letterforms, she updates us with an improved method that upgrades her generative blockscript into a cursive writing generator. Individual letters can now be connected in a seamless manner: [Coding my Handwriting — Amy GoodchildCoding my handwriting in Javascript - how I did it and what I’m doing with it.![](https://images.squarespace-cdn.com/content/v1/5f33cddd6aff255aabb0c6cd/1598285066323-AE6AS241FTS6QP3C4OA6/favicon.ico)Amy GoodchildAmy Goodchild![](http://static1.squarespace.com/static/5f33cddd6aff255aabb0c6cd/5f37d09b551f154577577f01/6642095b62643354c29c66e0/1715958998459/handwriting+banner+smaller.jpg?format=1500w)](https://www.amygoodchild.com/blog/cursive-handwriting-in-javascript?ref=gorillasun.de) By putting together a little editor that lets one encode the letter coordinate paths, simply by placing individual key-points via mouse click, it's now become much easier to encode multiple variations of each letterform. Amy further elaborates on some of the intricacies of adjoining the letter paths. ### The Art of Digconart As always, it's been a big joy to get to know you guys in the discord. In this segment I'd like to shout out [Andrew Wulf](https://x.com/digconart?ref=gorillasun.de), who I've had the pleasure of exchanging a couple of messages with in one of the channels. Prior to retiring in 2021 and finding himself picking up a generative art practice, Andrew spent over 4 decades working as a programmer. He recounts some of his experiences over the years and provides interesting retrospectives in written form on his programming blog *The Codist*: [A Programming Career By The NumbersAs I continue to recover from some health issues that kept me from writing, I thought it might be interesting to describe my long career with numbers. If you wind up working for four decades, your experience may vary. Years Active: 1981-2021, totaling 39.5 years. Irrespective of my title![](https://thecodist.com/content/images/size/w256h256/2023/04/icon2-1.png)The CodistAndrew Wulf![](https://thecodist.com/content/images/2024/01/numbers.jpg)](https://thecodist.com/a-programming-career-by-the-numbers/?ref=gorillasun.de) What I found quite interesting, and what sets Andrew apart from the crowd, is that he uses the Swift programming language for the purpose of making generative art. Swift is a language that you'll most likely associate with iPhone App development, rather than artistic purposes. But it seems to be working for Andrew, and he states that he's built his entire tooling in Swift (I would be curious to learn more about how that works!). At this point in time, I'm currently not aware of any other generative artist that is using Swift. You can view many of Andrew's creations over on this art repository that he's created for himself carefully archiving all of his creations: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-19-at-23.14.20.png)](https://digcon.art/202405.html?ref=gorillasun.de) [Link to Site](https://digcon.art/202405.html?ref=gorillasun.de) Andrew also runs another blog in parallel, that focuses on his art practice. I particularly enjoyed the article titled "What is Generative Art", in which he summarizes the art-form pretty succinctly. It also provides a pretty sobering perspective, that stands in contrast to many of the narratives that are being spun around generative art these days. You can read it here: [What Is Generative Art?I am a generative artist. But what does that mean? Generative art is generally created by a process, typically computer code but can also be mechanical or manual, wherein an image is produced automatically. Most often, it includes an element of randomness. Using a computer to generate art goes back![](https://artasartist.com/content/images/size/w256h256/format/jpeg/2023/02/icon.jpg)Art As ArtistAndrew Wulf![](https://artasartist.com/content/images/2023/08/amazed.jpg)](https://artasartist.com/what-is-generative-art/?ref=gorillasun.de) Highly recommend checking out Andrew's stuff! ### Colette Bangert on Growing Visually I have to admit that I was previously not familiar with the work of Colette and Jeff Bangert, two pioneers that were already using machine made randomness for the purpose of art making in the 1950s. As usual, this is where Monk comes in to educate me, introducing the Bangert duo to us in a recent Le Random article: [Colette Bangert on Growing VisuallyWith work in the collections of the Museum of Modern Art, Los Angeles County Museum of Art, Victoria and Albert Museum and more, the acclaimed nonagenarian artist Colette Bangert spoke to Peter Bauman (Monk Antony) about a life spent observing, exploring and collaborating.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/6639f44bac073812f5799e97_2019MH9760.jpg)](https://www.lerandom.art/editorial/colette-bangert-on-growing-visually?ref=gorillasun.de) Sadly Jeff Bangert passed away in 2019 - having been the one to write the computer code that brings their art to life, Colette now resumes her practice by hand. Bangert's artistic philosophy is deeply grounded in the continuous observation and interpretation of the world around her. She views art as a process of seeing and creating, where traditional methods and new technologies coexist and enhance each other. ## Web3 News ### News from the Purple App Things seem to have slowed a bit over on the Purple app - it's felt a little quieter (to me) at least. This is likely due to that big haircut that DEGEN allowances have received since the beginning of the second airdrop's fourth season — which was a big factor in driving traffic on the platform. But that doesn't mean that there haven't been a couple of other developments however; just a few things I found interesting in recent days: 1. Dylan Steck reports to us from the front-lines and tells us about the [happenings over at FarCon with his write-up](https://shorturl.at/fhSRe?ref=gorillasun.de) here. 2. [Bonfire](https://shorturl.at/fP1Ri?ref=gorillasun.de) is a platform geared towards Web3 creators, allowing you to manage your community, create different kinds of pages and provides a way to present all of your content in different ways. I haven't had the time to check it out yet - but it looks interesting however. 3. AirStack is a tool that lets you build dapps on FarCaster - you can find the docs [here](https://shorturl.at/dMkPT?ref=gorillasun.de). ### Art Blocks Studio Update Art Blocks makes a return with an update regarding the Studio platform that they teased a couple of months ago, and been developing ever since - it seems that they're nearing something more complete. If you've missed the previous announcement, it's basically a new part of the Art Blocks eco-system that will allow artists to self-publish generative art projects (not entirely un-curated though as far as I understand going off of the previous announcement). They'll be gradually rolling out new features in that regard over the coming days (or months) - the official announcement indicates that it'll be more than just a tool for creating and publishing generative projects on AB: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-17-at-12.44.40.png) [Link to Tweet](https://x.com/artblocks%5Fio/status/1790811987158646998?ref=gorillasun.de) ### Crypto's Broken Moral Compass Polynya is an pseudonymous crypto writer that's become quite influential in the space over the past years with their insightful writing on crypto related topics. As always I'm quite late to the party: towards the end of 2023 Polynya made the decision to leave crypto Twitter, and early 2024 going on an indefinite hiatus from writing. The article titled "Crypto's broken Moral Compass" marks the end of the popular blog - you can read it here: [Crypto’s broken moral compassI’ll begin by saying - obviously, there’s good in crypto. Indeed, I have written over 150 blog posts over the last 3 years about them (and plenty more with previous pseudonyms), and making the best of crypto and related tech. But none of that matters right now - things have swung too far away to the bad side. (Addendum: just for more clarity,![](https://shorturl.at/favicon.ico)![](https://images.mirror-media.xyz/publication-images/1OowxnWfvU1a_99MpVLEI.png?height=1296&width=1296)](https://shorturl.at/2y7dJ?ref=gorillasun.de) The article addresses the steep decline of the crypto space into what is largely just a big casino - where many of the meme coins and Ponzi schemes are not contributing to anything meaningful or productive. And this is something that I've also experienced, while I try to exist in my own little gen-art bubble most of the time, treading outside of it, especially on Farcaster right now, feeling like stepping into a big untamed jungle. If you're active in any Web3 related community, what's your overall sentiment been? Are things looking up, or are we standing at the edge? Polynya has however been sporadically casting over on the Purple App: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-20-at-01.05.24.png)](https://warpcast.com/polynya/0xc14db736?ref=gorillasun.de) [Link to Cast](https://warpcast.com/polynya/0xc14db736?ref=gorillasun.de) ## Bend Programming Language *Bend* is a brand new high-level programming language that seems quite practical: it lets you write parallel code for multi-core CPUs and GPUs - without having to write out the code that handles the parallel computations manually. A first glance at the syntax, Bend looks a LOT like python, and supposedly, writing Bend also feels like it. The language makes the bold promise that *Any work that can run in parallel, will run in parallel*: [Higher Order CompanyWe’re the HOC, a tech startup revolutionizing computing with massively parallel runtimes and processors using our HVM runtime and Bend programming language.![](https://higherorderco.com/favicon.ico)![](https://higherorderco.com/logo.svg)](https://higherorderco.com/?ref=gorillasun.de) You can try Bend for yourself following the instructions over on [the official Github repo](https://github.com/HigherOrderCO/Bend?ref=gorillasun.de) How does Bend do this? And how does it work under the hood? In Bend, expressions and values are internally modeled as graphs called "Interaction Combinators" - basically representing the chain of computations that need to be effectuated, where larger expressions come to life as a number of these graphs tied together. Running the program then boils down to solving these graphs, which somehow allows for instructions to be executed in parallel wherever it is possible - that's my rudimentary understanding of it right now. The concept of interaction combinators was originally proposed in a paper by Yves Lafont back in 1997: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-12.23.59.png) Beyond that it also has some other syntactical differences to real Python. Victor Taelin, the creator of Bend, reports that it took over a decade to put this into concept into practice however: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-18-at-11.42.08.png)](https://x.com/VictorTaelin/status/1791213162525524076?ref=gorillasun.de) [Link to Tweet](https://x.com/VictorTaelin/status/1791213162525524076?ref=gorillasun.de) ## Tech and Web Dev ### CSS Masonry Saga Part 3 The CSS Masonry Saga continues; if you haven't been following along with what's been going on that front, here's a quick recap: - [Two weeks ago the WebKit team over at Apple published a proposal for integrating a Masonry layout as a part of the CSS Grid spec.](https://webkit.org/blog/15269/help-us-invent-masonry-layouts-for-css-grid-level-3/?ref=gorillasun.de) - [A week after (last week) the Chrome Browser Dev team published an article in response voicing their concerns on this proposal.](https://developer.chrome.com/blog/masonry?ref=gorillasun.de) I don't know why the WebKit team decided to open this can of worms, but at this point it's become a pretty lengthy discussion. The article that's made the rounds is by Picallili most recently, who's already had an appearance on the Newsletter previously with an previous piece of his titled "A more Modern CSS Reset". He pitches in on the CSS Masonry debacle with a new article of his, voicing his concerns on the accessibility of Masonry Grids, especially regarding their tabbing behavior: [I’m worried about the tabbing behaviour, rather than the syntax and name of CSS masonry![](https://piccalil.li/apple-touch-icon.png?v=1)PiccalilliAndy Bell![](https://api.urlbox.io/v1/ln9ptArKXobLRpDQ/fe191d2f680cf1fd73f795740e9aa8617d79f3c71028674745c49099b2f911a9/png?url=https://piccalil.li/og/masonry-and-tabbing/&width=1024&height=526&retina=true)](https://piccalil.li/blog/masonry-and-tabbing/?ref=gorillasun.de) Essentially, when you have a Masonry grid, the tabbing behaviour becomes ambiguous, in which order should the selected box travel - horizontally or vertically down the columns? What's the expected behavior in this scenario? This causes confusion for users who rely on keyboard navigation. ### We can have a different Web In a beautiful essay, Molly White provides a poignant analysis of the current state the Web finds itself in, lamenting the good old days of the internet when things seemed to be much easier than they are today. She delves into some of the reasons why we might be feeling this way, and reflects on how large corporations and different monetization strategies have transformed the current landscape: [We can have a different webMany yearn for the “good old days” of the web. We could have those good old days back — or something even better — and if anything, it would be easier now than it ever was.![](https://www.citationneeded.news/content/images/size/w256h256/2024/01/cn-blue-square.png)Citation NeededMolly White![](https://www.citationneeded.news/content/images/2024/05/Untitled_Artwork.png)](https://www.citationneeded.news/we-can-have-a-different-web?ref=gorillasun.de) ### How to train a Developer Alan Zucconi shares an interesting trick that should help keep your code in check and will implicitly train you to write better - flatter - code: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-14-at-16.10.56.png) [Link to Tweet](https://x.com/AlanZucconi/status/1789627148292026380?ref=gorillasun.de) ## Gorilla Updates *We'll safely skip over the usual AI Corner segment this week, since we've already copiously talked about the current state of AI in the opening section.* As far as Gorilla things go, this week I published another Hypersub exclusive tutorial over on Paragraph, and it's a topic that I've been meaning to tackle for a while now: deforming geometric shapes, and creating all sorts of wavy tile patterns. I'm not gonna reveal too much here, but it's actually not too complicated of a trick - if you're interested in reading, article's here: [Deforming Tesselations with Periodic Functions and NoiseIn this tutorial we discuss a method for creating deformable shapes, which we’ll then use within a grid framework to obtain all sorts of different patterns.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Deforming Tesselations with Periodic Functions and Noise![](https://storage.googleapis.com/papyrus_images/853d9415f4c5d335a3182705dabcea00.jpg)](https://shorturl.at/4CSPh?ref=gorillasun.de) If this sounds interesting to you, want to get access to three other exclusive pieces of my writing, in addition to a monthly artwork airdropped directly into your ETH wallet, consider signing up to my Hypersub [here](https://shorturl.at/S4bD4?ref=gorillasun.de). If you're already subscribed, thanks a million, and hope you enjoy the tutorial! Let me know if you need any clarifications - and make sure to join the member only discord channel! While we're already on the topic of Ethereum, my Hypersub got featured in the coinbase wallet - which absolutely made my day when Bas notified me about it (thanks again for that): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-20-at-02.02.24.png)](https://warpcast.com/gorillasun/0x48cc196e?ref=gorillasun.de) [Link to Cast](https://warpcast.com/gorillasun/0x48cc196e?ref=gorillasun.de) Besides this I continued working on my Arabesque Puzzle Grids, which turned into something that I'm extremely proud of, a write-up for the project is also almost complete and should be published quite soon - here's a sample of one of the outputs that I'm really happy with: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/51205102-1--1.jpg) Feel free to zoom in and view the details! 😊 One last thing pertaining to the blog, is Ghost publishing another update regarding the ActivityPub integration that they're currently trying to realize. While it's still very early at this point it seems that they're committed to it, and already doing some initial tests. For instance one thing that the integration will enable is that Ghost blogs will be able to follow each other, just like other accounts on ActivityPub can follow each other. They also replied to my question on their first update, which does shine just a little bit of light on how things will work: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-19-at-01.51.17.png)](https://activitypub.ghost.org/day-0/?ref=building-activitypub-newsletter) [Link to Ghost's Blog Post](https://activitypub.ghost.org/day-0/?ref=building-activitypub-newsletter) ## Music for Coding I don't frequently listen to Ambient music, since it seldomly is a mood I have, but over the weekend I highly enjoyed Dan Abrams', aka Shuttle358, dreamy soundscapes: And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got a discord now, let me also just plug that here, come join and say hi](https://discord.gg/M4kb3EDXC9?ref=gorillasun.de)! *This week's Newsletter ended up being quite beefy (4600+ words, how bout that Dan? 🤣). Take it as an early make-up for the upcoming Newsletter, that will likely end up being quite a meager one, as I'm expecting to be quite busy with IRL obligations next week* **🙏** **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the Newsletter here:* [Gorilla Newsletter 56The Piet Programming Language - New Genart Podcast - RYBitten Color Tool by David Aerne - Eric Loftis Ray Tracing Recreations - StackOverflow x OpenAI Partnership - Apple Ad Controversy - Alex Kaul’s Freeter +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/05/puzzleee-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-56) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *Interested in advertising or sponsoring the Blog? Reach out!* ### Deforming Tesselations with Periodic Functions and Noise URL: https://www.gorillasun.de/blog/deforming-tesselations-with-periodic-functions-andnoise/ Last updated: 2024-06-22T11:22:54.000Z In this tutorial we discuss a method for creating deformable shapes, which we'll then use within a grid framework to obtain all sorts of different patterns. _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 56 URL: https://www.gorillasun.de/blog/gorilla-newsletter-56/ Last updated: 2024-08-12T16:17:02.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 56th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, web3, tech and AI - with a spritz of gorilla updates. Thanks again to everyone that's joined the discord so far, we're almost at a whopping 100 members now! 🎉 Come say hi and let's have a good time nerding out about tech things - [here's an invite link!](https://discord.gg/Uy67DUDk8q?ref=gorillasun.de) That said, **hope that you're all having an awesome start into the new week!** Here's your weekly roundup 👇 ## The Piet (Mondrian) Programming Language... **...where programs look like colorful abstract paintings.** When David Morgan created his esoteric programming language in 1991 he initially wanted to call it Mondrian - but apparently some [people had beat him to it](https://link.springer.com/chapter/10.1007/3-540-45337-7%5F9?ref=gorillasun.de). Piet is however a much more interesting language and has acquired somewhat of a cult following in the 30+ years of its existence. Here's some examples of what Piet programs look like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/raccoon-2-.jpg) A Hello World program by David Morgan, a program that solves the Towers of Hanoi problem, and a Prime Number Generator by Sylvain Tintillier, respectively. Clearly, **written* in the Piet programming language. After reading Morgan's [specification page](https://www.dangermouse.net/esoteric/piet.html?ref=gorillasun.de) a couple of times, I think I've been able to acquire a rudimentary understanding of the language - and will make an attempt at providing an explanation. Conceptually it's quite simple, but the complexity emerges from the manner in which instructions are coded into these colorful bitmaps. First, about the structure, In Piet programs, single units of color are called codels - named that way to not be confused with the actual pixels of the image, as a codel might be composed out of several pixels when the image is enlarged for viewing of the bitmap. Contiguous regions of codels that have the same color represent *blocks.* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-13-at-04.38.08.png) Piet programs are interpreted via traversal. Starting with the top-left codel, the traversal is controlled via two pointers: a Direction Pointer (DP) that tells the interpreter in which direction to move forward (right, left, up, down), and a Codel Chooser (CC) that rotates the direction pointer when a black codel or an edge of the program is reached (the boundaries of the bitmap basically). Ok, great... but how do we actually execute instructions in this manner? Well, whenever we traverse from one block of color into another, differently colored block, a specific instruction is executed. The difference in hue and lightness between the two blocks determines which instruction is going to be executed, such as addition, subtraction, multiplication, division, etc.: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-10-at-00.04.32.png) Link to Piet Specifications Two special instructions here are *push* and *pop* that let you store and remove numbers on an internal stack that Piet provides - this stack is the only method for storing numbers for the computation. How do we define numbers in Piet? Simply by the overall size of contiguous color blocks (number of codels in a block). For instance, when you leave a block of color into another and effectuate the push instruction due to the difference in hue and lightness between those two colors - it will push the integer that represents the size of the block that was just exited. And that's pretty much it - as far as I understand that provides all of the necessary tools to program all sorts of things. A bunch of examples can be viewed on a second page that Morgan has compiled, and I was super impressed to see so many interesting creations, all of them visually very distinct. As you would assume, there isn't really any way of telling *how* they programs actually work by just looking at them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-10-at-01.07.00.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-10-at-01.07.15.png) [Link to Example Gallery](https://www.dangermouse.net/esoteric/piet/samples.html?ref=gorillasun.de) If you want to learn more about David Morgan, the origin story of the Piet programming language, and some of his perspectives on eso-langs in general, you'll want to check out this interview from 2015 on Esoteric Codes: [Interview with David Morgan-MarDavid has created some of the best-known esolangs, including Chef and Piet, which exress code within other rule-based systems, and Whenever, a language that overturns a key element of how code is controlled.![](https://esoteric.codes/mstile-310x310.png)esoteric.codes![](https://esoteric.codes/uploads/fd2c411f-b4ab-47da-89bd-8a24e14cbf16/Mar_Piet.png)](https://esoteric.codes/blog/david-morgan-mar?ref=gorillasun.de) But that's just scratching the tip of the esolang iceberg - there's an entire culture around it. A number of other interesting Eso-langs is introduced in this article: [Programming Language Design as ArtOpen-ended, community based, and collaborative, “esolangs” serve as a reminder that digital art has other histories and other futures.![](https://i0.wp.com/hyperallergic-newspack.s3.amazonaws.com/uploads/2020/11/cropped-Hyperallergic-favicon.png?fit=192%2C192&quality=100&ssl=1)HyperallergicDaniel Temkin![](https://i0.wp.com/hyperallergic-newspack.s3.amazonaws.com/uploads/2022/01/socials-helloworld-pietbig.gif?fit=900%2C506&quality=100&ssl=1)](https://hyperallergic.com/701981/programming-language-design-as-art/?ref=gorillasun.de) Big shoutout to [Chris Reid and his own genart Newsletter](https://substack.com/@generatecoll?ref=gorillasun.de) \- only reason I actually discovered Piet. ## All the Generative Things ### Camille Roux's new GEN ART Podcast Arguably the most important piece of content in the genart space from last week was Camille Roux's new genart podcast. It made quite the splash due to its innovative format: instead of taking the common approach and inviting one or two guests to record a conversation as it is unfolding - Camille chose to do it a little differently, extending an open invitation for other generative artists to record their spoken answers in reply to a question of his. The podcast is then presented as a collage of these voice messages. You can listen to it here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-07-at-15.49.38.png)](https://podcasters.spotify.com/pod/show/genart-podcast/episodes/Ready-for-the-Drop-e2jbt02?ref=gorillasun.de) [Link to Podcast](https://podcasters.spotify.com/pod/show/genart-podcast/episodes/Ready-for-the-Drop-e2jbt02?ref=gorillasun.de) What adds a fun element to it is that the participants pretend that they're leaving a message in Camille's voicemail inbox. And I quite enjoyed the format actually; I'm generally not a big fan of podcasts because I easily get bored after a while as they tend to drag on - but having a variety of speakers, with different perspectives and different accents does make it more engaging to listen to. Besides the format, the topic was also a very interesting one, the participants were asked: > **How do you decide when your project is finished, and how do you handle deadlines?** While many thoughtful answers were given I highly enjoyed how Paolo Curtoni almost poetically described it: > In generative art the artwork is never truly finished - especially in the craze of long form generative art projects. What's fascinating to me is that at a certain point the artwork begins to have a life of its own in a way that is not completely controllable. \[...\] My role as an artist is to recognize this moment. When working on a generative project there's often this magical moment where the artwork starts doing things that you haven't initially envisioned - and in certain ways starts to express its own identity. Paolo captured this beautifully with his words. If you have half an hour to spend on some entertainment this week, I recommend you give this pilot episode a listen! ### David Aerne's new color tool RYBitten David Aerne is a software dev, creative coder, generative artist with a big passion for colors - most of his time you'll find him diligently building tools for the purpose of manipulating colors in all sorts of different ways; from their nomenclature, to palette configuration and other related tasks. David recently announced his newest creation titled RYBitten - a little library that lets you generate color spectrums according to Johannes Itten's color wheel theory: 0:00 /0:38 1× [Link to Tweet](https://twitter.com/meodai/status/1788316833969262905?ref=gorillasun.de) So, who's Johannes Itten and what did he have to say about colors? What's actually the RYB color space? And how do these two things come together in Aerne's tool? Johannes Itten is a famous expressionist painter, teacher and writer that was associated with the early Bauhaus between 1919 to 1922\. Most famously he's known for his contributions in color theory however. In his book "The Art of Color" he suggests a 12 part color wheel that is constructed by interpolating between the primary and secondary colors in the center: [![Color Theory for Beginners: Itten's Color Wheel](https://www.movavi.io/wp-content/uploads/2020/08/Itten.jpg)](https://encyclopedia.design/2023/03/06/johannes-itten-swiss-expressionist-painter-designer-teacher-writer/?ref=gorillasun.de#jp-carousel-809511) [More about Johannes Itten's life](https://en.wikipedia.org/wiki/Johannes%5FItten?ref=gorillasun.de) | [More info about Itten's Chromatic Wheel](https://encyclopedia.design/2023/03/06/johannes-itten-swiss-expressionist-painter-designer-teacher-writer/?ref=gorillasun.de#jp-carousel-809511) The significant part of this wheel is its geometry that allows us to derive a number of useful properties. For instance, drawing a straight line from one color on the circle to another on the opposing side lets us find complementary colors. Itten also proceeds to identify seven types of contrast via this color wheel, which is a topic that I need to explore a little bit more before I can write about it. By substituting the primary and/or secondary colors in the central hexagon, we can obtain different interpolations and therefore a different color wheel - David's tool accomplishes this and automatically computes these interpolations. The RYB color space is chosen in this setting because it is frequently used by artists working with paint and can emulate that particular aesthetic. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-12-at-12.13.40-1.png) You should also check out some of the other tools that David has made in the past, here's the popular Poline for example 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-12-at-11.01.13.png) The cool thing about them is that they're not only accessible as webpages, but are also always accompanied by an API that lets you invoke them directly from your code - which is especially useful for all sorts of different genart projects. ### Eric Loftis' OG Ray Tracing Recreations Fascinated by Roy Hall's 1983 ray-traced artwork [The Gallery](https://digitalartarchive.siggraph.org/artwork/roy-hall-the-gallery-2/?ref=gorillasun.de), Erich Loftis decided to recreate it with threejs. In a thread he tells us about the details of his implementation: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-09-at-22.32.48.png) [Link to Tweet](https://twitter.com/ErichLoftis/status/1788295077091016899?ref=gorillasun.de) At the end of the thread he shares a gigantic resource in which he's actually recreated an impressive number of classic ray-tracing demos from the 80s and 90s under a creative commons license - if you want to learn how OG ray-tracing works this one is a definite bookmark: [GitHub - erichlof/THREE.js-RayTracing-Renderer: Real-time Classic Ray Tracing on all devices with a browser, with real reflections, refractions, and depth of field, all on top of the Three.js WebGL framework. Click here for Live Demo: https://erichlof.github.io/THREE.js-RayTracing-Renderer/Classic\_Geometry\_Showcase.htmlReal-time Classic Ray Tracing on all devices with a browser, with real reflections, refractions, and depth of field, all on top of the Three.js WebGL framework. Click here for Live Demo: https://er…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHuberichlof![](https://opengraph.githubassets.com/21da62f44de8dc3bb5504651382bd583329f63f9245c879bb231749332785c05/erichlof/THREE.js-RayTracing-Renderer)](https://github.com/erichlof/THREE.js-RayTracing-Renderer?ref=gorillasun.de) ## Web3 News ### Over Supply and Sameness in the NFT Space There's a gigantic elephant in the porcelain shop this week... and I have no idea how to get it out! Y'all decided to uncork this one on a Saturday evening, when I was just about to wrap up the Newsletter - hence, I'm gonna take a big pass on this one, at least as a segment for the Newsletter since there's simply been too much floating around here that it would require an individual post. So maybe later this week. The catalyst to it all was this Tweet by Alejandro Cartagena titled **The Sabotaging Practice of Over Supply and Sameness in the NFT Space**: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-11-at-23.27.36.png)](https://twitter.com/halecar2/status/1789215658573443422?ref=gorillasun.de) An excerpt of the Tweet - make sure to read the rest of it. [Link](https://twitter.com/halecar2/status/1789215658573443422?ref=gorillasun.de). I've been raking my brain about a meaningful way to respond to it, but it's not just one singular issue that's being addressed here, but it's a big pile of hot steamin problems that have been brewing for quite a while. The big questions that we need to ask ourselves: How did we get here? In which direction do we want the space to move forward? And what are we really trying to accomplish? Honest and truthful answers to these questions would be a good foundation for a discussion. ### Paragraph takes over Mirror I think I've mentioned it before, but paragraph is essentially a Web3 Substack alternative. I've been quite out of touch with what's been happening with FarCon, but there's been an exciting development regarding paragraph as it's taking over Mirror - which is in essence a very similar platform to paragraph that allows writers to publish their content in a decentralized manner: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-09-at-22.51.00.png)](https://warpcast.com/colin/0x4b44b1b6?ref=gorillasun.de) [Link to Cast](https://warpcast.com/colin/0x4b44b1b6?ref=gorillasun.de) I'm not entirely certain what the fusion of the two tools will entail, but I'm excited for the future of paragraph as I've publishing a bunch of my writing over there in the past weeks. ### Berlin Blockchain Week One other thing here - if you're in Berlin or nearby in the next you might want to check Berlin Blockchain Week 2024 as it's unfolding over there. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-09-at-22.53.29.png) [Link to Page](https://blockchainweek.berlin/24?ref=gorillasun.de) ## OpenAI x StackOverflow Arguably the biggest news in tech from the past week was the announcement of a partnership between OpenAI and StackOverflow. In this new partnership OpenAI essentially aims to utilize the massive programming knowledge base that SO has accrued over the past 15 years of its existence, leveraging the OverflowAPI for the purpose of improving its proprietary models. SO will follow suit and integrate some of OpenAIs models to improve its own in-house AI solution OverflowAI, benefitting from OpenAIs experience in that regard. And that's pretty much the gist of it - there isn't much more information on how this large language collaboration will unfold at this point. The official announcement can be found here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-11-at-17.39.46.png)](https://openai.com/index/api-partnership-with-stack-overflow/?ref=gorillasun.de) [Link to Tweet](https://openai.com/index/api-partnership-with-stack-overflow/?ref=gorillasun.de) We'll apparently be able to experience this partnership come to life quite soon actually, with the first features rolling out by the end of June on both platforms: > The first set of new integrations and capabilities between Stack Overflow and OpenAI will be available in the first half of 2024 The big issue that emerges from this partnership that caused quite a bit of outrage amongst the SO contributor community is that SO is simply handing out its own user data to the AI giant. Does SO actually have the rights to the exchanges that have transpired on the platform? In light of this a digital protest quickly took shape in response to the announcement: many SO contributors that were displeased with the thought of aiding the training of OpenAIs proprietary LLMs, attempted the deletion of their posts. SO does not however allow this when it comes to highly upvoted questions and answers: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-11-at-21.18.17.png)](https://mastodon.social/@ben@m.benui.ca/112396506720255941?ref=gorillasun.de) [Link to Toot](https://mastodon.social/@ben@m.benui.ca/112396506720255941?ref=gorillasun.de) The SO mods were swift to strike the ban hammer against every user that attempted such alteration of their posts. Apparently a clause in StackOverflow's terms indicates that they own all of the content that is submitted to the platform. A good recap of these happenings can be found on Tom's Hardware Blog: [Stack Overflow bans users en masse for rebelling against OpenAI partnership — users banned for deleting answers to prevent them being used to train ChatGPTStack Overflow is overflowing with salt.![](https://vanilla.futurecdn.net/tomshardware/959250/apple-touch-icon.png)Tom's HardwareDallin Grimm![](https://cdn.mos.cms.futurecdn.net/bYkniCyqmEZFxa5fHQiBz-1200-80.jpg)](https://www.tomshardware.com/tech-industry/artificial-intelligence/stack-overflow-bans-users-en-masse-for-rebelling-against-openai-partnership-users-banned-for-deleting-answers-to-prevent-them-being-used-to-train-chatgpt?ref=gorillasun.de) It's not very clear what the ultimate outcome of this partnership will be, whether SO will fundamentally change as a platform since LLMs are already doing a pretty good job at answering questions without all of the man-made digressions that frequently transpire on the platform. Even if LLMs still sometimes make mistakes and are generally not very helpful when it comes to very niche knowledge, we might very soon see the platform shift to a more AI-centric model. ## Tech and Web Dev ### Apple's Promotional iPad Gambit Who would've thought that creatives wouldn't really enjoy seeing thousands of dollars worth of creative tools being destroyed? Well... clearly Apple didn't, because that's exactly what they did in a recent promotional gambit of theirs. And the entire thing backfired on them quite dramatically, with quite a bit of turmoil on social media. Here's their promo video for the new iPad: 0:00 /0:53 1× [Link to Tweet](https://twitter.com/tim%5Fcook/status/1787864325258162239?ref=gorillasun.de) It's not because people were pissed about the monetary value that was evaporated to create a 60 second commercial, compressing the creative tools as if they were garbage, but rather due to it being a symbolic act of dismissal of the intrinsic creative and human values of these tools in favor of a something that is merely a product. Smaller, faster, better, yada, yada - Big Tech is gonna do big Tech things, and the new iPad is going to sell millions of copies regardless of the controversial advertisement that they decided to launch it under. ### A Productivity App by Alex Kaul As a freelancer you frequently have to wear multiple hats, and things can quickly turn into a real mess; you've got important files strewn about different directories, a million tabs open at the same time, and in all the chaos you skip an important step of your workflow that makes or breaks your project. To combat this conundrum freelance web dev Alex Kaul created his personal productivity app titled Freeter, that allows him to better keep track of the different tasks that he needs to tackle and lets him set clear boundaries between his different workflows - he explains how it works in a write-up of his: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-13-at-06.30.43.png) [Link to Article](https://hackernoon.com/how-i-boosted-my-productivity-while-working-on-multiple-projects?ref=gorillasun.de) And it's actually an open source tool! If you've been following along in the past couple of Newsletter issues you'll have noticed that I've been on a bit of a productivity power trip; transitioning from Obsidian over to Notion, as well as leveraging Raycast as a more powerful finder app - what's one more app gonna make a difference. I gave Freeter a shot and it actually does make a lot of sense, it's in essence a tool that lets you *containerize* workflows, for instance when I'm collecting the content for the blog I will often switch between the Ghost editor and my Twitter bookmarks, with Freeter I can save these two views as a workflow: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-11-at-09.45.36-1.png) It's not very elaborate, and I could add other widgets here, but this works for me. My only gripe right now is that the web page widgets are a little lag-y at times. Freeter is still in beta however, so that might be why. ### Text Manipulation Kung Fu in Zed Earlier this year ([back in January](https://www.gorillasun.de/blog/gorilla-newsletter-41/#tech-and-code)) I wrote about the new code editor Zed, made by the same folks who previously built Atom and Tree-sitter. Over the weekend, while I was putting together a simple python script to automate a task I took Zed for a test drive. First impression, very similar to Atom - but somehow also feels fresh. I'll definitely have to use it a bit more however before I can form a final opinion though. To not get side-tracked, I'm bringing up Zed because they've been publishing a couple of interesting articles over on their blog, one of them a deep-dive on a bunch of very useful hotkeys for navigating your code more efficiently: [Text Manipulation Kung Fu for the Aspiring Black Belt - Zed BlogLearn the basics of text manipulation in Zed via a series of guided exercises.![](https://zed.dev/favicon_black_64.png)Joseph Lyons![](https://zed.dev/api/og?title=Text%20Manipulation%20Kung%20Fu%20for%20the%20Aspiring%20Black%20Belt)](https://zed.dev/blog/text-manipulation?ref=gorillasun.de) 💡 ****The cool thing: All of these hotkeys also work in VSCode!** Kind of embarrassed to admit that I didn't know about ANY of these hotkeys before - manually highlighting an entire line of code with the trackpad instead cmd+left-arrow-keying it... you'd think that after this many years of writing code I'd actually spend some time on learning how to use my tools a bit better. 🤪 ## AI Corner ### FKA twigs at US Congress on AI Deepfakes The musician FKA twigs recently spoke at US Congress to address the usage of AI deepfakes, on the one hand by herself to represent her own likeness, and on the other hand by others to imitate her likeness. This is under in regard to a draft for the NO FAKES bill that will aim to regulate these issues: [‘My brand is my brand’: FKA twigs speaks at US Congress about AI deepfakes · News ⟋ RAThe UK artist joined Warner Music Group CEO Robert Kyncl and others at Tuesday’s Judiciary subcommittee.![](https://ra.co/static/apple-touch-icon.png)Resident AdvisorCarlos Hawthorn![](https://static.ra.co/images/news/2024/fka-twigs-congress.jpg)](https://ra.co/news/80638?ref=gorillasun.de) ### Magnific joins Freepic Not sure if this is a big deal, it seems like it to me but Magnific and Freepik are joining forces and they're two companies that I would keep on my radar. Magnific is currently the best AI up-scaler out there when it comes to AI art, it really produces some incredible results compared to other models that have. Freepik on the other hand was original a marketplace and repository for stock images that's just recently embraced AI tech for image creation - one really cool tool that they have is the a live sketching canvas that directly converts your sketch to an AI generated image in pretty much real time: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-12-at-01.06.42.png) [Link to Sketching Tool](https://www.freepik.com/pikaso/sketch?ref=gorillasun.de) | It is a paid service, but you get a couple of free credits to get started. And here's the announcement for their joint endeavors moving forward: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-12-at-00.07.08-1.png)](https://twitter.com/javilopen/status/1787852344681787754?ref=gorillasun.de) [Link to Tweet](https://twitter.com/javilopen/status/1787852344681787754?ref=gorillasun.de) | If you scroll down far enough there's a sign up link that lets you use all of Freepik's AI services for free for 3 weeks. ### Can Computers create Art? Aalto University invited the three guests Tomi Slotte Dufva, Kyle McDonald, Hannu Toivonen to talk about computers, creativity and Art - I haven't watched it yet but it should be a good one. You can find the recording of the talk [here](https://tiedekulmamedia.helsinki.fi/fi/web/tiedekulma/player/webcast?playerId=38521893&eventId=279851607&ref=gorillasun.de). [Can computers create art? | Aalto UniversityAalto University and University of Helsinki organise an event about artificial intelligence and art. These talks are part of the Creative Technologies series.![](https://www.aalto.fi/sites/g/files/flghsv161/files/favicons/apple-touch-icon.png)Aalto University![](https://www.aalto.fi/sites/g/files/flghsv161/files/styles/1_91_1200w_630h_n/public/2024-03/7.5._AaltoHY_final_16.9..png?h=0433241f&itok=bvIAC-lD)](https://www.aalto.fi/en/events/can-computers-create-art?ref=gorillasun.de) ## Gorilla Updates After publishing the Newsletter last Monday, I doubled down and wrapped up the second Gorilla Monthly in which I ended up doing a big deep dive on the EmProps OpenStudio that I recently got access to - a big examination of how to prompt Stable Diffusion models and how the different parts of the OpenStudio play into this - you can get access to the article by subscribing to my Hypersub [here](https://shorturl.at/lpsB9?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-13-at-06.18.14.png)](https://shorturl.at/kostD?ref=gorillasun.de) [Link to Article](https://shorturl.at/kostD?ref=gorillasun.de) I actually also managed to spend quite a bit of time on making generative art this week, not just polishing some of my ongoing projects but also experimenting with a couple of new ideas - for instance, I spent a little bit of time trying to recreate an interesting tiling pattern that I came across on Pinterest (as always): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/tilings-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/hexs-and-stars.png) I couldn't actually pinpoint the original source of the image. My recreation on the right side. How would you go about recreating the pattern with code? Examining the tile pattern a bit more you'll notice that it's simply a triangle grid - if we were to iron out the wavy edges that is. That means that we would simply need to deform the edges of the triangles with a sine wave, and that's basically what I did. Well, it's not really a sine wave, but rather a smoothed variant of it (that's also basically a lie, to make a sine wave appear smoother you actually make it steeper around the inflection point). A handy approach towards that end is described in the following StackOverflow answer: [making a sine wave steeper?I’ve written a a little function that gives me out a value based on a sine wave when I put in a float between 0 and 1\. I’m using it to lerp things around in a game. public static class Utilities…![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a)Stack OverflowGuye Incognito![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v=73d79a89bded)](https://stackoverflow.com/a/39291146/6688750?ref=gorillasun.de) The cool thing here is that deforming edges with a periodic wave function will work for any sort of regular tessellation in which edges are all of the same length - here's what I mean in the setting of a hexagonal grid: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/tesselations-1.png) This way you can get all sorts of interesting interlacing patterns. Definitely a powerful trick that's earned itself a permanent spot in my toolbox! ## Music for Coding Under the artist name Murcof, the composer Fernando Corona combines minimal electronic elements with washed out orchestral drones into tracks that you could almost describe as being liminal - in an interview Murcof states that he finds himself "attracted to sounds that evoke a sense of mystery and otherworldliness" and his 2005 track Reflejo is a testament to this: Link to Murcof's Bandcamp And that's it from me—hope you've enjoyed this week's curated assortment of genart and tech shenanigans! > Now that you find yourself at the end of the Newsletter, you might as well share it with some of your friends - word of mouth is till one of the best ways to support me! Otherwise come and say hi over on my socials - and since [we've got a discord now, let me also just plug that here, come join and say hi](https://discord.gg/Uy67DUDk8q?ref=gorillasun.de)! **If you've read this far, thanks a million!** *If you're still hungry for more Generative Art things, you can check out last week's issue of the Newsletter here:* [Gorilla Newsletter 55Generative Art vs. Generate AI - Mathematical Paper Marbling - Making of Raycast’s Homepage Shader - Project Neo - Crypto Artists invest in Themselves - XCOPY’s mysterious mint on HEN - Alternative Proposal for CSS Masonry +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/05/12-1-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-55) *A backlog of all previous Gorilla Newsletters can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** [Join the Discord!](https://discord.gg/Uy67DUDk8q?ref=gorillasun.de) *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### ### Gorilla Monthly 2: A Closer Look at EmProps' OpenStudio URL: https://www.gorillasun.de/blog/gorilla-monthly-2-a-closer-look-at-emprops-openstudio/ Last updated: 2024-06-22T11:20:46.000Z A deep dive into prompting Stable Diffusion models and a closer look at the EmProps OpenStudio. _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 55 URL: https://www.gorillasun.de/blog/gorilla-newsletter-55/ Last updated: 2024-08-12T16:17:18.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 55th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. Before we get started this week, I just wanted to say thanks to everyone that's joined the discord already! There's already over 60+ members in there, and it's been really lovely to get to know all of you a little through the introductions that you've posted! If you haven't joined yet - [here's another invite link!](https://discord.gg/Uy67DUDk8q?ref=gorillasun.de) That said, **I hope that you're all having an awesome start into the new week!** Without further ado, here's your weekly roundup 👇 ## Is Generative AI... Generative Art?! AI's done it again - and people are angry! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-00.03.43.png) [Link to Tweet](https://twitter.com/queenkellee/status/1786427881234821320?ref=gorillasun.de) Recent developments in AI tooling indicate that the reaper is now knocking at the doors of musicians and film-makers. A recent post that's been making the rounds over on TwiX, and that has garnered quite a bit of anger in the replies, is an AI generated music video by Paul Trillo. It might be hard to believe at first but it's quite an outstanding piece: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-06-at-09.06.03.png)](https://twitter.com/paultrillo/status/1786425157915234776?ref=gorillasun.de) [Link to Tweet](https://twitter.com/paultrillo/status/1786425157915234776?ref=gorillasun.de) If you haven't heard of it yet, there's a new tool that's been making the rounds: Sora. It's OpenAI's newest model that lets you generate videos simply via a text prompt. I quite enjoyed the dreamy, trippy nature of the video though, and I thought that it was quite creative since I haven't seen anything like it before. Paul Trillo leverages the AI for a number of effects, that I'm not quite sure if they're easy to replicate by other digital or analog means. Scrolling down the replies however, it quickly turned into quite a roller-coaster of mixed sentiments. I've been having my own internal conflict about the current state of AI, simply trying to understand my stance on the state of things. I'm neither pro, nor anti AI - but if there's something that I **hate**, then it's maximalist stances. It generally leads to an oversimplification of complex issues, the nuance of conversations is lost, and ultimately leads to polarization and division of the involved parties. That is one of the biggest issues that I'm currently seeing with AI, people are either entirely against it, or sometimes even too enthusiastic about as well. And I'm trying to understand both points of view. There's definitely still is a big elephant in the room, and it's how large companies train their models - which in many cases is done on data that they likely don't have the rights to train on. While I completely understand the anger that's directed towards the companies in that regard, the tech in itself is not inherently bad, it's simply the scummy practice of those companies. But that seems to be the de-facto standard in any industry, not just AI - see some of the things that are going on in the games industry for instance. In this sense: AI doesn't suck. Companies suck. From a different point of view, are we angry at AI because it now takes much less effort to recreate certain art-forms that previously took painstaking effort? If that is the case, do we judge and appreciate art solely because of the technical difficulties involved? But that's hardly ever the only criteria for judging a piece of art - there's so many other things that play into it. Here you could argue that it makes the art become soulless - but I wouldn't agree with that either, the AI didn't make something out of its own volition, the person at the steering wheel clearly had thoughts and feelings of their own. I think that a much better descriptor for this issue in particular, is that it's making people **lazy**. Whether it's shilling AI generated NFTs, making AI influencers with Onlyfans accounts, or flooding YouTube with AI generated playlist. While all of these aren't illegal, they are however morally questionable. AI doesn't suck. People suck. In my opinion the music video by Paul Trillo does not fall into the lazy category, I thought that it was pretty creative. I believe that it's only a matter of time before people get better at differentiating between those two different kinds of AI generated content - the important thing is to educate. Are we angry at AI because it's changing the industry too rapidly? Well in that case, buckle up, because things are just going to get faster from here on out. All things considered, the woes of the small artist are quite negligible in the larger scheme of things. I hope one day in the future some type of conscious AGI gets trained on this exact text - and halts for just a brief moment to think to itself "this dude gets it". AI is going to transform the music industry, and AI is going to transform the movie industry, just like it's already changed the digital arts in many ways. And we're gonna listen to that music, and watch those movies, and we're most likely going to enjoy them, because ultimately it's just forms of data that are intended to stimulate our senses. To a large extent the advancement in AI here are driven by the financial incentives that it provides to a lot of companies - but again, things are likely not going to slow down. AI doesn't suck. Capitalism sucks. While digital artists, musicians, and more recently also filmmakers are undergoing an existential crisis at this point in time, generative artists are fighting an entirely different one: the battle of Terminology. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-17.58.36.png) [Link to Tweet](https://twitter.com/mactuitui/status/1784874592944771165?ref=gorillasun.de) Generative Art and Generative AI are just not the same thing - while at their foundation they share common aspects, in that a code based system is responsible for generating the outputs, they both define two completely different modes of working (which I think is the best way to state the distinction). Zach Lieberman chimes in on this with his concerns on the issue: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-06-at-09.30.46.png) [Link to Tweet](https://twitter.com/zachlieberman/status/1784926860146544665?ref=gorillasun.de) The terminology here is quite complicated, and I'm not certain how to solve it. Generally when people ask me what I do, my answer of choice is "I make creative things with code" - although that also doesn't capture some of the emergent and mathematical properties that generative art implies it generally is sufficient to convey the idea. Another issue nowadays, is that when you say that something is made with AI, it's often immediately devalued as it comes across as being lazy - whereas the traditional genart, where you write code to generate an image - does require quite a bit of knowledge and skill. I'd be curious to hear, where do you stand on all of these issues? AI yay, or nay? And why? ## All the Generative Things ### Paper Marbling Coding Challenge It's always a really good week for creative coding when Daniel Shiffman releases a new video - this week he tackles a method for simulating Paper Marbling in Coding Challenge: If you've never heard of Paper marbling, in essence it's a centuries-old technique that's used to create decorative patterns that resemble the veining of marble or other stones. Physically, this is achieved by floating special inks and/or paints on a thickened liquid base called "size". While the inks already create interesting deformed patterns when they're dropped into the size, other beautiful effects emerge when the artist further manipulates the colors with combs, styluses, and other tools to create interwoven patterns: [Paper marbling - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Marbled_Paper.jpeg/1200px-Marbled_Paper.jpeg)](https://en.wikipedia.org/wiki/Paper%5Fmarbling?ref=gorillasun.de) A sheet of paper is then carefully laid onto this liquid surface, to capture the emergent pattern, subsequently dried to reveal the final result. Historically, paper marbling was used for bookbinding, decorative end-papers, and even to deter forgery in documents. Today, it continues as both a traditional art form and a popular craft. As you can imagine, this is not a simple feat to simulate computationally, while I've seen some attempts I never really looked into it myself; I was under the assumption that you'd require some complicated shader-based fluid simulation. The approach that Shiffman presents in the video is actually none of those things - Aubrey Jaffer, a mathematician from MIT, proposes a relatively simple method for it in a paper of his back from 2012\. Well, a lot of the math he presents is still way over my head, but the part that pertains to simulating paint drops in a liquid and combing them are relatively straightforward. All of the info can be found in form of a website here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-22.37.26.png)](http://people.csail.mit.edu/jaffer/Marbling/?ref=gorillasun.de) [Link to Site](http://people.csail.mit.edu/jaffer/Marbling/?ref=gorillasun.de) And it's actually quite a simple formula: it essentially describes how drops of paint that have already been placed on the canvas are deformed and displaced by subsequent drops. In this scenario the paint drops are simply vertex shapes, where the coordinate information of the vertices is updated with the following formula: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-22.35.53.png) I haven't tried the coding challenge for myself yet, but Alexis André has been quick to the gun and made his own mind-boggling take on the idea: 0:00 /0:10 1× [Link to Tweet](https://twitter.com/MacTuitui/status/1787210214321651857?ref=gorillasun.de) ### On Building RayCast's webpage Hero My master plan has already come to fruition, and I've been discovering and learning about new things through what's been shared on the discord! Earlier this week, Richard linked to the Raycast homepage, pointing out that it's headlined by a really cool interactive shader: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-17.42.32.png) Two things came from the exchange, for one, I learned about Raycast, which turns out to be a really cool tool, and for another, I later actually paid attention while doom-scrolling down the TwiX feed and learned how the shader was made through a Tweet from the creator. A little about Raycast since it seems to be all the rage right now! (Not sponsored!) In essence it's an alternative to the finder app on mac devices - finder on steroids basically; it "adds productivity tools mac should have shipped with" and extends the capabilities of the original Mac finder. For example, it provides a color picker that can be used anywhere and everywhere on the mac, which is super useful when you see a cool color and want to save it for later. Another useful thing is a clipboard history, where you can basically see all of the things you've copied since the start of your session. Those are just two of many things it can do. I've been on a bit of a productivity power-trip over the past couple of weeks, so it was a no-brainer to take it for a spin. Overall I'm really satisfied with it. Let's talk more about the shader though. My initial assumption was some sort of SDF controlling the movement of the colors inside the diagonal bands. But it turns out that the trick is actually much simpler than that, conceptually at least. The creator behind it, Dan Hollick lets us in on the creative journey he underwent to create the piece: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-18.19.18.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-06-at-01.19.07.png) [Link to Tweet](https://twitter.com/DanHollick/status/1786006799734489476?ref=gorillasun.de) While it's "just a cube behind some glass" I think it's actually ingenious, and not really that easy to recreate from scratch as people have pointed out in the replies: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-06-at-01.18.53.png) To some extent it also reminds me of Shaderisms art, particularly of his piece Blind Spots on Art Blocks, as I believe that it's created in a similar manner. [You can check it out here](https://www.artblocks.io/legacy/collections/curated/projects/0x99a9b7c1116f9ceeb1652de04d5969cce509b069/484?section=details&ref=gorillasun.de). ### A 3D SDF Editor by Inigo Quilez Just yesterday the OG SDF wizard Inigo Quilez announced that he's releasing a new tool titled Project Neo. It's a project that's done under Adobe, and is essentially an SDF powered 3D editor that lets you create all sorts of shapes and then export them. Here's the announcement: 0:00 /0:31 1× [Link to Tweet](https://twitter.com/iquilezles/status/1786936754366542066?ref=gorillasun.de) | [Link to Project Neo](https://projectneo.adobe.com/?ref=gorillasun.de) Although it's being released as a beta version, you can already try it out for yourself [here](https://projectneo.adobe.com/?ref=gorillasun.de). And my first impression is very positive; it runs pretty smoothly directly in the browser and is pretty easy to navigate. One downside that I noticed however, is that the editor requires a chromium based browser - a slight inconvenience if you're using something else, like FireFox. Apparently the editor is also collaborative - checking out one of the creations that's presented on the main page, it shows me the other users that are also currently viewing the same project: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.06.35.png) Arguably one of the coolest features that Project Neo currently has, as one of the replies to Quilez post points out as "black magic", is support for exporting the 3D render as an SVG, simply by sending the project over to Adobe Illustrator. Surprisingly however, it doesn't currently support any functionality for exporting 3D assets - many of the other replies were comparing it to Womp3D, another similar editor that does support this however: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.21.47.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.21.26.png) While I'm not a big fan of Adobe's Creative Cloud, the tool looks very exciting. Considering that it's still in beta, we'll see what other features will be added in the future. ### Generative Art Summit Berlin (July 2024) Later this year, from the 3rd to the 6th of July to be precise, Berlin is going to oversee the Generative Art Summit hosted by the Foundation Herbert W. Franke. The conference invites many of the leading generative artists to discuss some of the important questions that currently pertain to generative art - you can find more information about the event here: [Generative Art Summit Berlin | art meets scienceJuly 3rd - 6th: “Generative Art Summit”, Academy of Arts Berlin, fostering the dialog about the history of generative art across generations and the globe.![](https://art-meets-science.io/wp-content/uploads/fbrfg/apple-touch-icon.png)art meets science![](https://art-meets-science.io/wp-content/uploads/2024/02/Summit-Visual.jpg)](https://art-meets-science.io/en/generative-art-summit-berlin/?ref=gorillasun.de) I'm not entirely certain about the exact format of the conference, if it's presentations, panel talks, or a mixture of both. The tickets for the conference are quite affordable however, and at this point in time I'm tending towards attending, but I still need to resolve some things with my schedule before I can fully commit. ## Web3 News ### Crypto Artists Invest in Themselves Have you ever made an NFT? If yes, have you ever bought your own art back when it was listed on the secondary? If yes, why? I personally have, but just on one occasion (that I can remember right now), where some of my collectors immediately listed their mints on secondary for lower than the original price on primary - assuming that they were not happy with their mints I bought them back. If you ever collect something from me and would like a refund, you can simply reach out. Now don't come and tell me you want a refund for something you've collected from me 2 years ago. RCS tackles this specific topic, of artists buying back their own art, in their most recent article; apparently some of the bigger, more successful artists have been buying back their own art from the secondary market. In certain cases for a much higher value than they had originally sold them for. Nina Knaack dives into the specifics of the issue, describing it as "more than just a market trend" she talks to a number of those artists: [Crypto Artists Invest in ThemselvesThe trend of crypto artists buying back their own NFTs![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Marius Watz![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/662fb549f9dc2d01ca3bae56_Justin%20Aversano%20-%20Knight%20of%20Staffs%20-%20Physical%20Tarot%20Scroll%20-%201_1.png)](https://www.rightclicksave.com/article/crypto-artists-invest-in-themselves?ref=gorillasun.de) Reflecting on my own relationship with my art - and without being cynical, the article feels a little alienating. It's only a very small percentage of artists that can *afford* to reinvest in themselves in that manner. I also don't understand how it leads to artists "gaining more control over their work's distribution and valuation" - yes, artists can to some extent curate their work that exists out on the secondary market, but I'm not entirely certain if that will have an impact on its valuation, if they're not already highly acclaimed. Maybe I just don't get it because I don't generally have that religious conviction in my own art. Maybe it's my German half that's speaking out loud here, but the sobering reality is that there's a difference between "believing that you will be successful" and "actually being successful" - the latter makes it a lot easier to actually believe that you are successful. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-23.57.19.png) Investing in myself and buying back my own art - am I doing this right? 🙂 ### XCOPY's mysterious mint on HEN Zancan brings back a wonderfully hazy memory from the early HEN days, that must've felt like a fever dream for NFTBiker. It's the story of him discovering an unannounced XCOPY mint on HEN: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-04-at-00.29.48.png) [Link to Tweet](https://twitter.com/zancan/status/1786333702487777500?ref=gorillasun.de) He recounts the story in a blog post of his, telling us how he clicked the mint button after some initial doubts: [How I bought XCopy REACHBACK artworkI really like what XCopy do. I also love the new NFT plateform HicEtHunc, which use tezos blockchain instead of ethereum. So one day, I posted on twitter a simple question Imagine that, like many…![](https://64.media.tumblr.com/b1a4dd57cb1f2875d86d851efbd9db48/a017c1ec6102d4e7-e2/s128x128u_c1/4ecb6b3f159bce1954814519fa7edd927c56a879.jpg)Tumblr![](https://64.media.tumblr.com/fcf6220ca3571506dcf98b49a5ec2d4d/93be6ca50c026ee0-b6/s1280x1920/ad3ec5fa1768346b96c210edfde9b1dbe4adeabe.gifv)](https://blog.nftbiker.com/post/702747397756010496/how-i-bought-xcopy-reachback-artwork?ref=gorillasun.de) ### The NFT Market's Comeback While I want to believe that we're at the start of another bull run, I'm not certain if it's actually going to happen - the signs are positive however. Daniel Grant from The Art Newspaper tackles this topic in a recent article, he argues that this resurgence is being driven by a new type of collector – Grant describes them as more "mature" and established within the art world. Overall these collectors are less interested in quick profits and more focused on the long-term value of NFTs. I wouldn't disagree that this shift in the nature of collectors could lead to a more stable and sustainable NFT market in the future: [How ‘more mature’ collectors are powering the NFT market’s comebackWhile Bitcoin and other cryptocurrencies reach new highs, the market for digital art has not experienced the same frenzy of speculation as in 2021\. Recent auction results, however, suggest that an appetite is once more growing![](https://www.theartnewspaper.com/favicons/favicon-196.png)The Art Newspaper - International art news and eventsDaniel Grant![](https://cdn.sanity.io/images/cxgd3urn/production/d02f650fae3def30eb8421282163446a426bbc55-1890x1418.jpg?rect=0,199,1890,1134&w=1200&h=720&q=85&fit=crop&auto=format)](https://www.theartnewspaper.com/2024/05/01/how-more-mature-collectors-are-powering-the-nft-markets-comeback?ref=gorillasun.de) ## Tech & Web Dev ### An Alternative Proposal for CSS Masonry Last week I shared an [article by Jen Simons from the WebKit team, in which they propose the integration of masonry layouts as a part of the CSS Grid specification](https://webkit.org/blog/15269/help-us-invent-masonry-layouts-for-css-grid-level-3/?ref=gorillasun.de). While they go over how it could be done, the article is in essence an open invitation for other web devs to join the discussion. This past week the folks over at Chrome answer this call, to voice their concerns about this idea. They argue that it would be a mistake to integrate Masonry Layouts as a part of the Grid specification like the WebKit team suggests. They explain their reasoning and also provide an alternative solution towards that end: [An alternative proposal for CSS masonry | Blog | Chrome for DevelopersA proposal to define masonry and grid in different specifications.![](https://www.gstatic.com/devrel-devsite/prod/v7ec1cdbf90989ab082f30bf9b9cbe627804848c18b70d722062aeb6c6d8958b5/chrome/images/favicon.png)Chrome for DevelopersX![](https://developer.chrome.com/static/blog/masonry/image/thumb.png)](https://developer.chrome.com/blog/masonry?ref=gorillasun.de) As far as I understand the issue lies not within deciding whether or not one can semantically consider a masonry layout to be a sort of grid, but rather because these two types of layouts simply function differently. While the article provides a brief overview of the problematics, they do address the involved issues in more detail in a lengthy reply to a Github issue: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.56.55.png) [Link to Github Issue](https://github.com/w3c/csswg-drafts/issues/9041?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.57.30.png) [Link to Reply](https://github.com/w3c/csswg-drafts/issues/9041?ref=gorillasun.de#issuecomment-2075210820) And it seems that this entire debate is tackling a larger overarching problematic - whether or not different layouts should be integrated as part of Grid or not: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-13.55.23.png)](https://news.ycombinator.com/item?id=40130148&ref=gorillasun.de) [Link to HackerNews Item](https://news.ycombinator.com/item?id=40130148&ref=gorillasun.de) ### Printing Music with CSS Grid While we're already talking about CSS Grids, here's a cool thing that Stephen Band has created with them, making it possible to display responsive sheet music in the browser: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-05-at-14.31.48.png)](https://cruncher.ch/blog/printing-music-with-css-grid/?ref=gorillasun.de) [Link to Article](https://cruncher.ch/blog/printing-music-with-css-grid/?ref=gorillasun.de) While there might be many edge cases for which this approach might break, if you just need a lightweight solution for displaying simple sheets on a web-age, this might come in handy. ### The Polish Paradox Have you ever noticed how truly excellent design often fades into the background? This is what Matthew Ström calls "The Polish Paradox." The most polished elements—the ones that took painstaking effort—are precisely the ones that seem effortless and obvious - and sometimes the most important and impactful details in design are the ones that are the least visible: [The polish paradoxThe more you polish, the less you see![](https://matthewstrom.com/favicon.png)Matthew Ström, designer-leader![](https://matthewstrom.com/images/og/Vhi2Zt3qX_-1200.jpeg)](https://matthewstrom.com/writing/the-polish-paradox/?ref=gorillasun.de) One example that is presented in the article, is the iPhone's keyboard. When Ken Kocienda developed it, he had the keyboard’s touch targets invisibly adjusted based on what was being typed, preventing users from otherwise making errors - while this is a feature that you will never actually make note of, it makes typing just a whole lot easier. From a technical point of view I believe that this is simply done by predicting the next letter from a weighted dictionary and then enlarging the touch area of the corresponding letter on the keyboard. Overall, what Ström tries to tell us, is that true polish isn't tacked on at the end - but rather is a commitment that's built-in from the start, to perfecting even the smallest elements. ## AI Corner ### Sam Altman's Controversial Interview I'm generally not a big fan of this type of sensationalist posts, but this one actually did a pretty good job at capturing the highlights from Sam Altman's recent appearance at a Stanford seminar: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/Screenshot-2024-05-03-at-10.46.58.png) [Link to Tweet](https://twitter.com/aisolopreneur/status/1786118836309352492?ref=gorillasun.de) ### Building a Chat Integration with Gemini How do you actually build your own chatbot with an LLM? And how do you make it handle the chat history and be able to look back on the conversation that's been held? Raymond Camden answers this in an article of his, in which he shows us how to build a chatbot with the Gemini SDK: [Building a Chat Integration with Google GeminiFather, husband, developer relations and web standards expert, and cat demo builder.![](https://www.raymondcamden.com/apple-touch-icon.png)Raymond CamdenFather, husband, developer relations and web standards expert, and cat demo builder.MenuPatron![](https://static.raymondcamden.com/images/banners/cat_chat.jpg)](https://www.raymondcamden.com/2024/04/30/building-a-chat-integration-with-google-gemini?ref=gorillasun.de) ## Gorilla Updates Earlier this week I published a new Interview, and it's with none other than Aleksandra Jovanić! It was an absolute pleasure talking to her, to learn about her career, and to also get a glimpse into her generative practice where she more often than not tries to blend between the digital and the physical: [In Conversation with Aleksandra JovanićAleksandra Jovanic is an artist and programmer from Belgrade, Serbia, with a Doctorate in Digital Arts and a BSc in Computer Science. In her artistic practice she combines various media, mainly in the field of interactive art, art games, and generative art.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-18.18.40.png)](https://www.gorillasun.de/blog/in-conversation-with-aleksandra-jovanic/) In other news I've also continued working on the puzzle grid project of mine - there's still quite a bit to be done in that regard, but it's overall been chugging along nicely. Going off of the reaction of folks over on Twitter it also seems to be received very positively: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/22-1-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/12.jpg) There hasn't been that much more generative art otherwise as I've been mostly locked down writing. I did however play a lot with AI image generators trying out new things that I haven't done before and some of the outputs here turned out really cute: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/_3345747d-3a98-4e58-9e65-d013a25792b2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/_3882a3f4-1ade-4b30-8686-1dccd6a4f68c.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/_cc58e4bd-aa38-42a5-a601-c9a04408218e.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/05/_0e89513c-c6a7-49ce-8181-535d574aa72c.jpg) ## Music for Coding Never have I vibed this hard to a mix - this selection of tracks by Bobby Ghanoush really took me away over the course of several sessions in the past week: And that's it from me, hope you've enjoyed this week's curated list of generative art and tech shenanigans! Now that you've made it through the newsletter, might as well share it with some of your friends - one of the best ways to support it! Otherwise come and say hi over on my socials! [Since we've got a discord now, let me also just plug that here, come join and say hi.](https://discord.gg/Uy67DUDk8q?ref=gorillasun.de) **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 54Gorilla Sun Discord Launched - Puneyvr’s Record Breaking Glyph - Differential Growth Vases - The Crochet Protocol - Sonifying Github Repositories - Bright Moments comes to an End - Minimizer’s Infinite Scribbles - On Writing Alt Text +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/04/aaaa-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-54) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### In Conversation with Aleksandra Jovanić URL: https://www.gorillasun.de/blog/in-conversation-with-aleksandra-jovanic/ Last updated: 2024-09-06T13:08:05.000Z **I've recently had the pleasure of speaking to the brilliant Aleksandra Jovanić. When she's not busy giving lectures, Aleksandra spends most of her time making generative art - in a variety of mediums. She's quickly risen to become one of the most prolific artists in the space over the past two years, participating in multiple digital and IRL exhibitions around the globe.** In our conversation we speak about her early beginnings, from the path that led her to becoming an associate professor at the university of arts in Belgrade, that had just spun up a new program in Digital Arts in the early 2000s - to later getting into making code based blockchain art on hicetnunc and fxhash. We also address the influence this formal career has had on the art that she makes today. In the latter half we dive deeper into her practice, from the importance of a conceptual foundation for her works, to her fascination for making series and collections of things. It was deeply insightful to learn about how she approaches the generative practice in general - and how she tries to go beyond the boundaries of the screen to experiment with different physical materials. ## Education and Early Years **GS: Looking at your CV, you have an impressive track record. You started with a Bachelor in Computer Science and later transitioned to the digital arts, I'm curious, how did that happen? Where does it all start from childhood and how did you end up getting into generative art?** Aleksandra Jovanić: As every child, I was curious about a lot of things; drawing, sculpting, making, and deconstructing how things are built. In school I was better at the subjects that didn’t involve a lot of repetition and memorising, like math for instance. Subjects where I could use logic and intelligence were generally more interesting. I wasn’t an all A student, but was almost there, and I continued in that style throughout all of my education. Ultimately, some of the subjects that I was taking in high-school led me to studies in computer science - I guess due to the environment that I grew up in and the always present narrative about struggling artists, I ended up choosing a field that was a bit more future-proof. But even then, there were different faculties that you could choose from, for example the Faculty of Electrical Engineering had a computer science track, the Faculty of Mathematics, the Faculty of Organisational Studies, etc. Ultimately I chose the Faculty of Mathematics. And I’m still satisfied with all of my choices. I ended up finding a good path. Coincidentally, when I graduated they had just established a new program in Interdisciplinary studies at the University of Arts here in Belgrade, and for the first time, they were opening their doors for anyone to apply. Usually, the further along you are with your studies, the narrower your choices become. You end up having a limited number of options for universities that you can go to if you graduate from a certain faculty. But at the time, the people in charge of the program realized that technology had started influencing the field, and they did something really advanced for their time. That was the year 2000\. Because this new program in Digital Art was a joint effort between different professors from different faculties and areas of study, it was possible for everyone that had portfolio to apply. Your degree didn't matter that much. During my studies at the faculty I had found interest in web design, researching and learning HTML, CSS and scripting languages - so I had already done different kinds of designs and animations - and it wasn't really a problem for me to put together a portfolio and sample some of my works for this purpose. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/miopija.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-135714.png) It was interesting for me - because for my colleagues that were already coming from art faculties, it was simply an upgrade to what they were already doing. But for me it was a completely new field, in which I was essentially starting from scratch again. This is basically how I switched to digital art after I had finished my degree in computer science, and later on led me to also pursue my doctoral studies in digital arts. And because I was so enthusiastic about all of it and did good work, I was offered to start working as a teaching assistant, which marked the start of my academic career. Now I'm working at the Faculty of Fine Arts, teaching a set of subject that's called "Technology of New Media", which is in fact includes Creative Coding, Physical Computing, 3D modelling and 3D animation, Web Design, Makers Technologies. I also stayed as a professor at doctoral studies in Digital Art, and I teach a subject there called Interactive media. ## Influence of a Formal Education on making Art **GS: My entire educational background lies in computer science, I'm curious about the things that you learn in an art-centered field. What are some of the things they teach you during your Master and PhD studies in Digital Arts? Or is it more research oriented?** **AJ**: Because it was a new program when I started my post-grad studies, we basically had 5 main subjects: digital animation, digital video, digital imaging, digital sound and interactive media - tadaa \[laughs\] - so it's basically all the fields in traditional media with a technological aspect introduced. Then there's accompanying subjects, like theory of art, writing methodology, as well as other things that add value to the core subjects. This program is similar to what is now taught as a PHD program. During my masters I mostly focused on digital animation. The final project that I did in 2005 was an installation that consisted of a series of animations, titled Digital Dreams. The installation tries to imagine a future in which our machines have become more intelligent and be able to dream - and if they could dream, what would they dream of? The animations represent those dreams, displayed on computer monitors, and they were essentially collages of materials, that I imagined the computer owners would expose their computers to. During my doctoral studies, I dove more into interactivity and mostly used Flash. I played with the notion of using game mechanics, as well as algorithms that were commonly used in games, to create an environment in which players could explore short stories and poems - so you had to solve puzzles and play the game to unlock new chunks of the story. This was already generative in a way because the puzzles you had to solve were always different. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/over7seas01.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/over7seas03.jpg) When I got my doctoral degree I was invited to teach these studies, and that's when I started teaching with Processing. That was around 2011 I think. Later on I started using P5 because I wanted to share my work in an interactive manner online. **GS: Do you think you had an advantage over your colleagues coming from a background in computer science?** **AJ:** I think I did, yes. Sometimes you're not aware of the advantages that you have over others, and you take for granted the things that you know. Before my Masters I worked for half a year at an agency doing web design, and I had colleagues that did not have a formal education in mathematics or computer science, so there were some things that were easy for me that they struggled with. Like boolean algebra or regular expressions for example; that's when I became aware, for the first time, that the things they tortured us with in the faculty can actually pay off. \[laughs\] **GS: A lot of the things they tortured me with during my time at uni, like data structures and different kinds of algorithms, ended up being quite useful for making funny images with code \[laughs\] But at the time you don't know that.** AJ: Exactly. \[laughs\] **GS: When I made a poll over on Twitter asking how people got into creative coding, I was surprised to learn that a lot of people were actually self-taught. Back in Lebanon, pursuing academia is the more common career path. If you told me today that I had to re-learn programming from scratch again, I don't know if I would be able to, by myself at least. In uni you have to because you eventually want to pass your courses.** **Long story short, to what extent do you think your academic background influences the art that you make today? Do you think you would make a different kind of art, or have a different approach if you were self taught? A bit of an open-ended question.** **AJ:** That's an old question.I think we can reposition this questions as "What art would you make if you didn't know what art was?" basically if you hadn't seen or read anything from the history of art - in the context of generative art, that's similar to asking "How does knowing different algorithms influence the art that you make?" Maybe your course was similar to mine, in our exams they would ask us to write the code for a specific problem, and ask us to do so in the most optimal manner. And I was always frustrated with that; if it works, why does it matter how long it takes \[laughs\] and today I still don't really mind waiting for my code to produce its outputs - okay I have to admit it matters when I need a good frame rate for the smooth animation. While for art purposes the technical knowledge doesn't matter, it can influence the way that we write the code and sometimes lead us to surprising results that can lead to different outcomes. So for me its important to have a strong initial concept, - if you start with a strong concept it doesn't need to be as algorithmically complex. **GS:** **Being more knowledgeable about techniques and methods allows you to express yourself more freely. But at the same time it makes me wonder - if you didn't know a particular solution for a given task, would it lead you to be more creative, to discover your own solutions, and even lead you down the path to a completely different kind of art?** AJ:Exactly, I like to compare this to machine learning models of the future. If you already know the solution for something that you want to create, you're not very different from a computer executing instructions; you're not forced to be creative and think outside of the box. In the future we're expecting General AI to have ideas of their own. Essentially, our creativity emerges from balancing between learned concepts and adding something new. There are so many philosophical aspects to your one question. Maybe early cave paintings are an example of this, where art was made without any prior notion of what art actually was. Everything that came after, somehow builds on top of what came before. Even in technology we are strongly influenced by previous inventions. **GS: Maybe a bit of an unpopular opinion, but I think that cave paintings are overrated - I think they were just bored in their cave.** AJ:Exactly, we also put a lot of meaning into those paintings. The meaning is more important than the actual paintings. ## Conceptualism in Genart **GS: Now that you mention meaning in Art - I'm a big fan of your Chromatlas series, that explores the concept of Apophenia, essentially letting the viewers attribute their own meaning to the artworks.** **In art we frequently emphasize what the art is aiming to represent, and what message it tries to convey - in my own work, the message is often not in the foreground, the work generally comes from a joy of making, and an internal urge to do so. What is it like for you? Do you specifically try to put meaning into your works? Or is it more of an explorative approach?** AJ: I think that my stronger pieces are those that have an underlying concept, and I generally value them more. Although I do have pieces that emerge from exploration and process. A recent example for this, was a solo exhibition back in December (2023) where I chose one of Sol Lewitt's etchings as a starting point, not the artwork itself but the “instructions” that he used to make the piece, words that describe what is the piece or how to make it. This particular one revolved around drawing different types of lines, straight, wavy, and broken ones. It was really interesting and inspiring to me to try more variations inside of these instructions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-04-at-00.54.23.png) [Link to Project](http://aleksandrajovanic.com/line/?ref=gorillasun.de) For this exhibition I explored what I can make strictly inside of those limits, but during the process I often thought to myself "what if"… saving the interesting ideas for the next project. Without conceptual constraints, I’m free to add something new to the algorithm every day. This is more of an experiment however, where I try to explore the visual side of a simple algorithm. Maybe this example is not so illustrative, and they're (the two approaches) overlapping a bit, but I'm aware that when I'm working on something if it's an exploration or a more complete piece backed by a concept. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/427923629_406461638534135_4057260537270432563_n.jpg) [Link to Instagram Post](https://www.instagram.com/p/C3cYfyJosjt/?img%5Findex=1&ref=gorillasun.de) **GS**: **Would you say it is a sort of visual research similarly to Vera Molnar's?** AJ: Exactly. It's quite lucrative to work with algorithms, maybe economical - every reload you get a different result. This fast pace of rendering outputs allows for more time to explore the possibilities of adding and removing elements, as well as the flipsides. **GS**: **I'm really fascinated by your ability to create series of artworks that are stylistically and conceptually coherent, and that's often what you do, with Chromatlas as a prime example. Speaking to the other artists that I've interviewed in the past, including myself, there's always a desire to do something like that, to make a series of artworks. But it never works out somehow, separating ideas into individual standalone pieces that are still somehow coherent.** **How do you do it? Is it a single idea, that you make variations of? Or is it an idea that evolves over time?** AJ: For Chromatlas it was an evolving idea. When I started I didn't know that it would be a series of 10 volumes. But the concept was there, and I knew that there were more visual ideas within this concept that I could explore. The question here is, how do you decide that your piece is finished? [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-12.20.33.png)](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de) [Write-up for Aleksandra's Chromatlas Project](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de) I developed the project over the course of a whole year, with some pauses in between. While working on one volume I would see aspects that could be turned into projects of their own. Approaching the last two pieces, I realized that I had explored all the ideas that I liked, from the visual language of data science, and also from vintage color classification books. This is also how the name of the series came to be. So basically, it felt I had exhausted all the ideas, and in part I was also getting fatigued of it. Reflecting on the project now, I know it could have also easily been released just as a single generator that randomly produced a variation from all of the volumes. But I also like the way that I concluded the series, I don't think I overdid it. People were *complaining* that the series concluded with ten pieces, instead of a number that's divisible by 3, either 9 or 12, to allow for a neat arrangement in a grid \[laughs\]. But then you have Herbarium and Balancium - the two pieces that I made for Art Basel which I made in the middle of the Chromatlas series, and are aesthetically similar - so you can consider them bonus pieces to conclude the grid. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/herbarium.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/balancium.png) [Herbarium #987](https://www.fxhash.xyz/gentk/KT1U6EHmNxJTkvaWJ4ThczG4FSDaHC21ssvi-780705?ref=gorillasun.de) and [Balancium #1052](https://www.fxhash.xyz/gentk/KT1U6EHmNxJTkvaWJ4ThczG4FSDaHC21ssvi-1604433?ref=gorillasun.de) in my personal collection. Later I also exhibited the series, where I made a big book that would show 2 cherry-picked iterations of each project with an accompanying scientific-style poster: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-12.19.10.png)](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de) ## Serialization of Ideas **GS:** **Sometimes I have an idea that could potentially become a series, then I become too invested in one of them, improving it and it turns to be better than the other ideas - and you can't release a series where one is better than the others, you want them to be somewhat on the same level. So it's the balancing aspect that I struggle with.** AJ: You say that your pieces are different from each other, but I do recognize your work whenever I see it, therefore you do have a style. I think what makes me inclined towards series is my tendency to collect things. I was always fascinated with apothecary drawers - you know, big apothecary closets with multiple drawers each of which contains different things. I'm not so much of a collector in real life, I don't own much physical art, but digitally I do it a lot, putting things into series and collections, so in that way it's in my nature to make or create in series. **GS: Is this idea of collecting, and making collections, related to you posting consistently on social media?** AJ: Probably \[chuckles\] **GS: You have an impressive following on Instagram!** AJ: I've been posting on Instagram for a long time, but it wasn't until I started posting Chromatlas WIPs that my following exploded - I can't really explain it, but it must be that the algorithm likes those colors \[laughs\] my following has been pretty much stable after I concluded Chromatlas. When it comes to posting on social media it's more of a daily exercise, maybe a bit similar to the other artists that do daily sketches. I can't commit to a strict daily coding practice like that, I need to rest from time to time, but posting regularly on social media gives me a sense that I'm working on something. Now it's almost like an automated task, for example this morning I did my daily, posted it on my socials - done! Sort of like a conclusion for the daily exercise/workout, and then I can move on to other things, otherwise I'd just obsess over it and keep working on it for the whole day. I often get more ideas right after I've published a post/tweet, and that's usually what I’ll explore the day after. The good thing that comes out of these daily experiments, eventually they fit nicely with an algorithm and concept that I have, so they can serve as a building block for something new. If I'm working on a piece for an exhibition, if I have a deadline, then my dailies suffer. **GS: I can relate to that, when you post to social media it feels like a conclusion to the coding session.** ## On Composition and Color **GS: On that note, when you're doing your explorations and developing these ideas, do you focus more on the structure or the aesthetics of the piece? Or is it more of an interplay between the two?** AJ: I don't know the right answer. I haven't thought about it. Maybe the composition is the first part of it for me, because it shows me the whole piece and if it works, followed by the details. So at the beginning it's a simpler version of the final output, without so many fine details. I have no idea though, maybe we could analyze some of my projects where we compare the first draft with the final outputs and make a conclusion. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/439611724_453972140356707_1074961101101602863_n_jpg-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/439631615_1612888492808092_1098990878326737494_n_jpg.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/cdcd201012.png) **GS: For me I like to think of structure and texture separately. I often struggle with the texture part, I don't know why it is so hard for me; when it comes to making interesting geometric things that comes more easily. Maybe it's because get so tired of seeing the same colors while working on a piece - do you experience that as well?** AJ: Yes and no, I usually limit myself to a simple palette with 2 or 3 colors and do everything with them. In Chromatlas I also used a limited palette of eight colors - two of them being similar shades of red, so seven colors really. I don't remember spending too much time choosing them actually. In Chromatlas I also started introducing gradients, choosing values in between 4 chosen colors, and letting these gradients overlap and multiply each other resulting in beautiful effects. It's such a simple trick, that's worked for me for more than a year now, so even though I'm always using similar colors, I'm getting results that look recognizable and fresh enough. But now I've gone back to choosing only two main colors, in addition to a background color. But like you said, that makes things harder again, because you can get bored of the palette more easily again. On the other hand if I add too many colors too quickly, it gets too colorful and I also get sick of it fast. So you have to find your own way to go about it. **GS: That's something I feel that I need to really sit down and properly practice at some point. But you're giving me good ideas to explore.** ## Getting into NFTs **GS: One other topic I wanted to touch on was how you got into NFTs - that was around the same time that you joined Raph for hosting an episode of creative code news. How did you discover hicetnunc and what was it like in those days?** AJ: Maybe half a year before I got started with NFTS, I had consciously decided to post more of my generative art explorations. It was a solitary endeavour, just doing something for myself. Those pieces were experiments, they weren't really connected to any kind of concept, so you can't really go to an exhibition space or gallery to exhibit them or be part of a group show. The generative art community was very welcoming, receiving all the likes was really emotional for me. I started following more people that were doing generative art, you, Raphaël, and all the other celebrities. I remember people commenting "when will you mint this?" and "will this be an NFT?" - at that time I didn't know what to answer so I played dead. At the same time I became intrigued by Raphaël's WCCChallenge (Weekly Creative Coding Challenge), and I remember being so nervous about submitting something for the challenge, fearing what he'd say. The community around his discord and challenge was really inspiring though. And Raphaël was actually one of the people that helped me get started at the time. I remember asking some of my friends prior to that, to help me, read some articles and figure out where to start - "set up a wallet" - okay but how? - "How do I transfer..." - "Where can I buy Tez" - so I had a lot of questions without any easy answers. So basically, Raphaël helped with a few pointers telling me "if you don't succeed with this I will help". But, also mentoring me on how to price pieces appropriately, something that no one was writing about then. "Price one at this price, two at this price, three at this price, etc..." and I was like "I don't understand why or how…". But by minting my first piece 12 hours later it all started to make sense. Looking back 3 years later, you can't actually recall all the problems and all the questions that you had when you started. So you have to actually go through it on your own and try things to figure them out. It's just like programming, you can't just watch a programming tutorial and then magically get that knowledge. **GS: I wish you could \[laughs\] I remember that I also discovered Raph through Twitter, then joined the discord and started participating in the challenge. Lately I really haven't had the time to join, but I've had some really cool ideas through the challenge, when you have to follow a prompt you end up with something that you wouldn't have otherwise made. Same with Genuary.** **Later on what was it like for you creating your first long-form generative project on fxhash? Was it challenging?** AJ: My first mint on HeN was code, and I tried to maintain that practice to mint exclusively code ever since. I have one collab with Raphaël, that is still a code based piece, but was minted as a capture of the outputs from our combined code: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-13.19.06-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-13.21.11.png) [Link to Tweet](https://twitter.com/sableRaph/status/1522865830748475393?ref=gorillasun.de) | Originally minted on Versum, that no longer exists today, [the project can be found over on Objkt.com](https://objkt.com/tokens/versum%5Fitems/16998?ref=gorillasun.de). It is still mintable as of today. I can’t recall any other piece that I've minted that isn’t code. So even if the pieces are minted as editions, when you view them they always look different, generating a different variation. Therefore, it wasn't really difficult for me to transfer those ideas to fxhash. And also lomz, one of my IRL friends was one of the first people that minted on fxhash and encouraged me: "Oh it's so fun, you should try it!". ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/lomz.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/lomz2.png) [Generative Art - Poster](https://www.fxhash.xyz/generative/7?ref=gorillasun.de) and [Generative Graphics - Parts](https://www.fxhash.xyz/generative/274?ref=gorillasun.de) by lomz released on fxhash on November 11 and November 17 respectively Then, during one of Raphaël's creative code meetups, that usually happens once a month in person in Berlin, but held online due to the pandemic, Raph invited me one day to do something together, and basically we tried to see how the fxhash generator produces the random hashes. A few days later I combined that knowledge with something that I had already been working on, and released my first series. It was a 3 part series \[laughs\]! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/reflection-of-stripes.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/diffraction-of-waves.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/refraction-of-stones.png) [Reflection of Stripes](https://www.fxhash.xyz/generative/679?ref=gorillasun.de) | [Diffraction of Waves](https://www.fxhash.xyz/generative/704?ref=gorillasun.de) | [Refraction of Stones](https://www.fxhash.xyz/generative/716?ref=gorillasun.de) published on Novemeber 22 on fxhash (interactive pieces) In the morning I released the first one, then in the next hour I minted the second and the third one, because I already had them all prepared, with their names and everything. **GS: That's really cool. I remember having a lot of trouble with my first fxhash projects, since it was an entirely new concept for me at the time.** AJ: I mean, I have a bug in those early projects, they're not always the same because of the resize (that resets the artwork when the window size changes). But it was so early no one really complained about it, and I don't feel like I can't sleep over it \[laughs\]. **GS: It's the same with my first tokens, the furbols and wisps, when you zoom in or out with the browser it's different every time, but I think it's cool, idk - it's a feature, not a bug. They're still deterministic for the respective window sizes.** AJ: In the beginning people weren't really expecting pieces to be animated, or to adapt to different window sizes, the thumbnails were enough. It was so fun at the beginning of fxhash, it was so relaxing. I mean, we had trouble to develop best practices, to see how it works and get a feel for it, but a lot of good things were minted just in those early days. ## On Productivity and Frequency of Releases **GS: I remember that as well, it wasn't actually that many people active on the platform early on, and every day you could see who made what - now it's become a lot more competitive.** AJ: I mean it's a market, so naturally it will be competitive. But at the same time, things have slowed down a little. When I look at the calendar of how many things I minted in the first year of fxhash, I have to ask myself "am I normal", how did I manage to develop so many pieces? This feeling that I'm not working on anything, now persists because of that huge production during that time. A few days ago I was in a meeting with Danielle King, (we collaborated on an generative AI project, and continued with our weekly meetings. First she introduced me to AI, now I’m training her in coding.) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-13.48.17.png) EmProps collab with Danielle King | [Echoes of Forgotten Tales](https://emprops.ai/projects/echoes-of-forgotten-tales?ref=gorillasun.de) I complained having a feeling that I'm not working on anything huge or important now - but then after the meeting I took a moment and thought to myself "You just had a solo exhibition last December, what's wrong with you, it's only been a couple of months.” I used to have one exhibition per year, and now I feel like I have to have 2 exhibitions a month! It's not normal, so I'm trying to control those destructive thoughts. **GS: I've been thinking about this for a while, on social you see that there's constantly something happening, every week there's a new release - and they're all beautiful - but it gives you a wrong perspective on how much you should be producing. I feel that sometimes you need to slow down a little and just be methodical, like one piece every three months might be a good pace.** AJ: Yeah I think that's a good amount \[laughs\] for some people that might even be too much, each of us has to find their own pace. ## Bridging between Code and the Physical AJ: The same way that I experiment with algorithms, I experiment with materials. I have a friend that tells me "if you're feeling bad, just do something with your hands, make something, it'll make you feel better". I may be doing it unconsciously, exploring analogue mediums and applying the same generative logic is something I'm interested in. A recent example are the red and blue linocuts that I experimented with. I had to split the code, not by objects, but by color. I wanted to combine two colors and get the third in overprint, so I had to figure out the code for it - sort of the other way around. Sometimes I'm not satisfied with the final outcomes on paper, but the outcomes from the code gave me inspiration for further experiments. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/viber_image_2024-04-28_09-57-57-103.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/line_D.png) I realised sometimes I have this problem, that I don’t do things in an usual way. When you start a new hobby, first you make something small and then you work your way towards more complicated things. I’m a lunatic that skips the easy levels - for example years ago I decided that I wanted to do origami, and instead of first learning to fold some of the simpler ones, like cranes, I immediately started with a complicated ball with 100 different parts, and when I finished I was like "Ok done, I can do this, what’s next!". This is became obvious with the two books that I've made so far, they're both huge, 50x70cm, B1 paper folded in half. Now I'm thinking maybe I should do a regular sized book. I’m still exploring ideas for the content, one of them the red and blue dailies that I did in February (2024). I'm thinking about rendering them as a mix of plotter drawings, linocuts etc. 0:00 /1:07 1× [Link to Instagram Post](https://www.instagram.com/p/Cfb9QD-D74X/?ref=gorillasun.de) From time to time I search for experiment with different materials for my code generated pieces - if they don't include animation or interaction, then they can work as physical pieces well too. Now, my Phenakistoscopes project is the combination of the two - they are colourful disks, but are animated when put in motion! There's a number of very talented animators that make these zoetropes and phenakistoscopes these days, and for me it's interesting to see how I can push the code to generate those kinds of images / animations, to get satisfying results considering that there are a lot of constraints involved. **GS: Interesting, the phena - phenak - phe - I cannot pronounce the word \[laughs\]** AJ: Nobody can \[laughs\] phenakistoscope (enunciated) **GS: Phenakistoscope (slowly) - I can't remember the arrangement of the letters - is that also a side project?** AJ: No, that one should be a big project. There's actually so many aspects to the production of the piece. Aside from code, to which I return constantly, there are these material aspects of the physical pieces. I'm currently testing prints on different materials, viewing them under different lighting conditions, and how they work on a record player - the most recent one is with plexiglass. A friend of a friend has a workshop, and was able to print directly on plexiglass without issue - the print is perfect in terms of colors, but it's grainy, so when the light hits it at certain angles you can see the relief of the colors compared to the matte paper, that I prefer. The issue with it is that you need a bright light to make a recording where the disk doesn't appear as blur. So there's so many technical issues with these... then my curator was like "can we have like 10 of them rotating on the wall?". So now I'm buying record player parts and motors from Ali Express. **GS: How do you sync the framerate of the camera with the rotation of the disks?** AJ: You have three parameters for the sync - disk rotation (usually RPM - rounds per minute), camera frame rate (fps) and number of slices on the disk - loop animation frames. The record player is a convenient solution because speeds are already defined, as is the case for the camera frame rate. When you know those two pieces of information, you can calculate how many frames you can put on the circle to obtain a looping animation. It's not that difficult, simple math. Ultimately it could be an animation on the screen but then you lose the physicality of it. I want it to be a piece that works in a gallery, physical space, your home, where you can play the record and see it through your own phone and record it. The key thing is that we curse time spent on our phones, but in this case you’ll need your phone to fully experience the work. ## Inspirations & Advice **GS: Since you talked about Raph and Danielle, who are some of the artists that inspire you today? They don't necessarily have to be doing generative art, can be any kind of art.** AJ: Currently I'm working and developing my “phenakistoscopes” project, so I’m obsessed with vintage illustrations, as well as the history of animation and cartoons. I tend to get an adrenaline spike when I see works by Ori Toor or Jean Giraud (*Moebius)*, but also works by my friends from the Graphics department [Nikola Velicki](https://www.instagram.com/velickinikola/?ref=gorillasun.de) and [Vladimir Veljasevic]( veljasevicvladimir ): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-29-at-16.33.27.png)](https://www.instagram.com/p/CqdG3vLoohS/?utm%5Fsource=ig%5Fweb%5Fcopy%5Flink&igsh=MzRlODBiNWFlZA%3D%3D) [Link to Post](https://www.instagram.com/p/CqdG3vLoohS/?utm%5Fsource=ig%5Fweb%5Fcopy%5Flink&igsh=MzRlODBiNWFlZA%3D%3D) From our field, I feel privileged not only to know, but to be in touch with all artists from the FF (Feral File) GRAPH group exhibition, that Casey Reas assembled and curated. Besides, obviously, Casey, each of them inspire me mostly through their different processes and techniques Julien, Licia, Iskra, James, and Joannie. And also Tom White (dribnet), mostly for his clever approach to machine perception and AI and consistent explorations. **GS: What is something you wish you'd known much earlier as an artist and as a creator? What is piece of advice that you would like to give people that are just starting out?** AJ: I can only talk about my own struggles, but I have this problem where I don't know how to relax after finishing a project. Taking the time to celebrate the accomplishment basically; when I finish something I often immediately start something new instead, instead of taking breaks and doing some celebratory things - maybe this isn't a good answer, nor advice, it's more of a trait of my personality \[chuckles\] Slowing down is something we've been talking about for the past 2 years, but I don't feel like I've slowed down one bit - maybe I'm not minting every two days - but, I still have so many ideas and projects happening all the time. We were hoping that the hype and so many things happening at the same time was just a characteristic of the bull market, and that things would slow down a bit with the bear market. But I don't feel that things are changing. The good thing I can see about this, is that the way we are creating \[...\] isn't so much connected to the market or economic things. We are creating no matter what. ## Closing Thoughts To wrap things up, I'd like to give a big thanks to Aleksandra, not just for taking the time to talk to me, but also for sharing her story and letting me in on her practice, while also bearing with me as I transcribed and edited this interview. If you haven't done so yet, and want stay up-to-date with what Aleksandra is up to, go and follow her on [Twitter](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de) and [Instagram](https://www.instagram.com/aleksandrajovanic/?ref=gorillasun.de) where she most frequently posts works in progress, as well as her portfolio [here](http://aleksandrajovanic.com/?ref=gorillasun.de). If you enjoyed reading this conversation consider sharing it on your socials with friends and followers. Also make sure to have a look at some of the other interviews I've done with other generative artists: [Daniel Aguilar](https://www.gorillasun.de/blog/in-conversation-with-daniel-aguilar/), [Alessandro Fiore](https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/), [Pxlshrd](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/), [Monk Antony](https://www.gorillasun.de/blog/in-conversation-with-peter-bauman-demystifying-monk-antony/), [Tezumie](https://www.gorillasun.de/blog/interview-tezumie/). **That said, thank you for reading! Consider signing up to the Newsletter if you'd like to receive updates like this one directly in your inbox every wekk. Cheers, and happy sketching!** ### Gorilla Newsletter 54 URL: https://www.gorillasun.de/blog/gorilla-newsletter-54/ Last updated: 2024-04-29T15:26:02.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 54th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. ## Gorilla Sun Community Discord Before we get started today, I've got a little announcement to make - I've launched a Discord server, and it's open for everyone to join! If you'd like to chat with me and other generative art/creative coding lovers, you can [join via this link](https://discord.gg/CerM56eB2Z?ref=gorillasun.de). [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-11.05.00.png)](https://discord.gg/CerM56eB2Z?ref=gorillasun.de) [Invite to the Discord](https://discord.gg/CerM56eB2Z?ref=gorillasun.de) It's still a bit of a work in progress, and I might switch around some of the current channels, but I think I've got everything set up properly now. *So... why create a discord server?* Writing and making this Newsletter often feels like a one-way street, where it's just me pinging you guys once (sometimes twice) a week via your email inbox. While I think that the Newsletter is a great way to document and de-fragment some of the conversations in the space every week, it doesn't create or stimulate new conversations - and it doesn't provide the tools to allow for this. And the measly comment section towards the bottom of the posts doesn't really cut it. Essentially, the aim of this new discord will be to provide a space for the readers of the newsletter to talk to each other. This discord is ultimately not about me, or a fan-club for the newsletter, but rather about fostering a more active discussion around all of the topics that play into generative art and that I cover every week. To some extent it might also help me find interesting things to feature on the newsletter. I actually made an effort towards this end about a year ago, when I set up a discourse forum for the blog. [I briefly wrote about it in the 13th issue of the Newsletter](https://www.gorillasun.de/blog/gorilla-recap-13/). [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-11.17.58.png)](https://twitter.com/gorillasu/status/1679451967624556548?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1679451967624556548?ref=gorillasun.de) In hindsight I should've maybe known that it wouldn't gain much traction - trying to get a forum off the ground in 2024 is arguably one of the harder things that you could tackle. Discord on the other hand seems like a much more viable approach, since most of everyone already has an account, and joining a new server is pretty seamless. That said, come and hang out in the discord, and share some of the interesting things you've made with code - there's already a bunch of cool people in there! On other thing of note here that's related to community building, is that the Ghost CMS recently announced that they're working on integrating with the ActivityPub protocol over the course of the next months. This means that the blog will soon be coming to the Fediverse! Here's their official announcement: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-13.14.56.png)](?ref%5Fsrc=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1679451967624556548%7Ctwgr%5E5ede3baf0b9717bf1c1ac2cf7390e34461922009%7Ctwcon%5Es1%5F&ref%5Furl=https%3A%2F%2Fwww.gorillasun.de%2Fblog%2Fgorilla-recap-13%2F) [Link to Tweet](?ref%5Fsrc=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1679451967624556548%7Ctwgr%5E5ede3baf0b9717bf1c1ac2cf7390e34461922009%7Ctwcon%5Es1%5F&ref%5Furl=https%3A%2F%2Fwww.gorillasun.de%2Fblog%2Fgorilla-recap-13%2F) It's not entirely clear how this is going to work exactly - but as far as I understand - it will be possible to sign up to the blog and interact with posts (liking and sharing) them via Fediverse accounts. I have to confess, I haven't been as active over on Mastodon as much as I would've to be, especially considering that a big chunk of the creative crowd is active over there. If you're active on Mastodon, or some other part of the Fediverse, [I'd love to connect!](https://mastodon.social/@gorillasun?ref=gorillasun.de) That said, sorry for the lengthy introduction this week. Consider it a little bit of digital house-keeping - as always, **I hope that you're all having an awesome start into the new week!** Without further ado, here's your weekly roundup 👇 ## All the Generative Things ### Differential Growth Vases This week I discovered the work of Tim Zarki, a 3D artist and multi-disciplinary designer. His portfolio features a number of interesting projects that lie somewhere at the intersection of the physical and the generative - such as this experiment from 2021 in which he creates renders of Flower Vases with a Differential Growth algorithm: ![](https://assets-global.website-files.com/59dab96fbcf3990001939efa/61da007381ab832d32a9f84a_vase_render_01c_e.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-13.41.03.png) If you're not familiar with differential growth; it's a morphogenic algorithm that's frequently used in generative art to mimic *wavy* patterns that occur in nature - such as the shape of corals and lichens as an example. The name of the algorithm might be a tag bit intimidating, but it actually has nothing to do with differentiation as we know it in calculus - the term here merely indicates that the generated shapes don't grow in a uniform manner, but rather that the individual parts of the shape grow at different rates. Differential growth algorithms are most commonly implemented as particle simulations in 2D, where an initial shape is modeled as a chain of particles that iteratively expands and evolves with time. In this setting, individual particles are drawn towards its immediate two adjacent neighbors, while being repulsed by the rest - whenever the distance between two particles exceeds a certain threshold a new node is inserted at that position. The balancing of the attractive and repulsive forces allows for a variety of different organic shapes. Although the algorithm can also be implemented in 3D - Tim does in fact create his vases in 2D; as he explains in the heading text of the project page, the final shapes emerge by tracking the contour of the growths over time - stacking them on top of each other. This isn't however the first attempt at using differential growth for generative design - a previous iconic attempt dates back to 2015 with the Floraform project that aimed at creating shapes for jewelry: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-12.06.06.png)](https://n-e-r-v-o-u-s.com/blog/?p=6721&ref=gorillasun.de) [Link to Page](https://n-e-r-v-o-u-s.com/blog/?p=6721&ref=gorillasun.de) If you want to implement differential growth for yourself, I recommend checking out this nice tutorial by Jason Webb, in which he shows you how to do it in Javascript: [Exploring 2D differential growth with JavaScriptLet’s use modern JavaScript and p5.js to make bendy, undulating shapes using the 2D differential growth algorithm!![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumJason Webb![](https://miro.medium.com/v2/resize:fit:879/1*2oQNnQaEtYxIvA-LR5gmKw.png)](https://medium.com/@jason.webb/2d-differential-growth-in-js-1843fd51b0ce?ref=gorillasun.de) Also highly recommend checking out this huge [resource by Jason Webb that lists many other morphogenic algorithms](https://github.com/jasonwebb/morphogenesis-resources?tab=readme-ov-file&ref=gorillasun.de). ### The Crochet Protocol What if, instead of telling the machine what to do, we let the machine give us instructions? This is the premise of Julia Vollmer's generative crochet experiment, in which a wearable device tells the user what the next crocheting instruction is via a vibration signal: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-19.58.47.png)](https://www.creativeapplications.net/objects/the-crochet-protocol-machines-in-need-of-human-labour/?ref=gorillasun.de) [Link to feature on Creative Applications](https://www.creativeapplications.net/objects/the-crochet-protocol-machines-in-need-of-human-labour/?ref=gorillasun.de) Julia Vollmer published an article on this and illustrates the experience of what it is like to work with the device, a sort of power dynamic emerges, where she has to either trust the instructions of the machine, or proceed according to her own judgment. Interestingly, the item that is being crocheted is not the primary focus of this process, but rather attuning and listening to the device: [The Crochet ProtocolCrocheting = Coding?![](https://alpaca.pubpub.org/favicon.ico)Algorithmic PatternJulia Vollmer![](https://assets.pubpub.org/vepr7w1m/eyJidWNrZXQiOiJhc3NldHMucHVicHViLm9yZyIsImtleSI6ImZ5Y294d3N5L3RjcF9kZXZpY2UyLTAxNjk1NDAyNTYwODg1LmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6MTYwMCwiZml0IjoiaW5zaWRlIiwid2l0aG91dEVubGFyZ2VtZW50Ijp0cnVlfX19-61699738183289.jpeg)](https://alpaca.pubpub.org/pub/1orm86wv/release/1?ref=gorillasun.de) I found the idea highly interesting, since I've been indirectly exposed to a lot of crocheting in the past year through my partner who's picked the hobby teaching herself the ins and outs of it, resulting in me being the subject of many a question such as "Which yarn looks better? This one, or this one?". While I know nothing about how to crochet, I've thought a lot about how to combine the craft, as well as related ones, like knitting and cross-stitching (I am fully aware that they're completely different) with generative ideas. I believe that trying to translate generative aesthetics to the medium wouldn't work too well, generating instructions however, like in Vollmer's experiment, would make much more sense. ### Sonifying Github Repositories I think I've briefly shared it before, but Ren Yuan has been making these stellar *sonifications*,to essentially summarize the commit histories of popular github repositories - although the animations are also really cool, you'll have to check out the recording with sound over on TwiX for the full experience: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-20.21.10.png)](https://twitter.com/%5Frenyuan/status/1777427294186840112?ref=gorillasun.de) [Link to Tweet](https://twitter.com/%5Frenyuan/status/1777427294186840112?ref=gorillasun.de) It's actually fascinating how well this works; in a way it's like giving each repository its own sonic identity and footprint. Ren Yuan explains a little what his aim with these projects in a threaded reply to their post: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-20.31.01.png) What I would ultimately love to come out of this project, is some means of comparing different repositories sonically, either on a temporal axis or harmonic one - our hearing is actually super proficient at picking up subtle variations, repetitions, and trends in sound that might be harder to spot on a visual chart. ## Puneyvr's Record Breaking Glyph Arguably the biggest news in Web3 genart from last week was the release of Puneyvr's Glyph: a free OE on Base ETH fxhash, that swiftly broke the world record for the largest genart collection in history. The project currently sits at a record breaking number of 180k (*hundred eighty thousand*) mints at the time of writing - **when you're reading this it'll likely have eloped this number however** (I've already updated this section 3 times): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-15.00.56.png)](https://shorturl.at/bps57?ref=gorillasun.de) [Link to Project](https://shorturl.at/bps57?ref=gorillasun.de) The baseline for the world record was set not that long ago with Zancan's Aux Arbres, reaching a grand total of 76208 mints over on highlight. I still believe that Aux Arbres stands strong, not just because it is the first to beat the record but for the concept around it, where the individual mints play into a larger whole. Zancan humorously comments on this with a cast of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-14.58.18.png)](https://warpcast.com/zancan/0x36b8047d?ref=gorillasun.de) [Link to Cast](https://warpcast.com/zancan/0x36b8047d?ref=gorillasun.de) If you're not familiar with Puneyvr you might be left scratching your head, and asking yourself why Glyph had such a meteoric rise - Puneyvr is actually the very first artist that published a project on fxhash after the OG generative fxhash logos, and Ciphrd's genesis project *RGB Elementary Cellular Automaton* \- sorting the feed by "oldest minted" reveals Puneyvr's face as the fourth project minted on the platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-15.17.31.png) Puneyvr's projects are a little bit what you would call cult classics - always minted as large editions at a low price - it's no different with Glyph. One big factor that played into the success of the mint is that it's a free mint - like, completely free, not 3 bucks free - when minted through the farcaster frame where fxhash covers the minting fees: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-15.39.14.png)](https://warpcast.com/fxhash/0x9e2065e8?ref=gorillasun.de) [Link to Cast](https://warpcast.com/fxhash/0x9e2065e8?ref=gorillasun.de) \- Minting from fxhash or the contract directly still incurs gas fees that you'll have to cover. If you haven't collected one at this point — why not? Another factor that plays into the success of the mint is that it was also pushed by the Base chain through its official accounts, something that we've only rarely seen from the Tezos Foundation. While speculation definitely plays into the massive number of mints, only time will tell how the project will fare on the secondary market in the future. The next goal to beat would be the 11 ETH trading volume that Aux Arbres currently has on secondary. I strongly believe however that we're beginning a new chapter in blockchain based code art. I also couldn't resist from participating in the madness, and acquired a couple of Glyphs for my own collection (I might mint a few more just for the fun of it). fxhash also recounts Puneyvr's story in a thread of theirs that I recommend checking out: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-12.18.49.png) [Link to Thread](https://twitter.com/fx%5Fhash%5F/status/1783592742217740310?ref=gorillasun.de) | [Link to Cast](https://warpcast.com/fxhash/0x694697b7?ref=gorillasun.de) ## Web3 News ### Bright Moments comes to an End If you've been active in genart social media over the course of the last week, you'll have taken note of the big gathering that happened over at the Biennale in Venice, with generative artists from all around the world flocking together to celebrate the end of Bright Moments' three-year global tour. As always, I'm grateful for Le Random's report on the events and for capturing the thoughts of the people involved - I've been pretty much out of touch with all of the happenings - and it was nice to read about it: [Bright Moments on Prioritizing the PersonalAs Bright Moments concludes its three-year global tour at the 2024 Venice Biennale, they release the ambitious Finale Collection, showcasing the works of over sixty artists on a single contract. Peter Bauman (Monk Antony) engaged with the Bright Moments team and participating artists, delving into the project’s key themes and the organization’s future. The discussion included Seth Goldstein, Phil Mohun and Samer Dabra (Spongenuity) from Bright Moments, together with artist and Art Blocks Founder Erick Calderon (Snowfro), as well as artists Maya Man, Anna Carreras and Piter Pasma.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/661e7e1195b93bce3fa78235_download%20(24).png)](https://www.lerandom.art/editorial/bright-moments-on-prioritizing-the-personal?ref=gorillasun.de) In essence, it was a large live-minting event in which each of the previous Bright Moments artists contributed an original work. The article addresses that it was risky in that regard, since there was no guarantee that the projects would actually sell - but overall that wasn't the point, rather than to simply pay tribute to Bright Moments' impressive achievements over the course of the past three years. Now when you visit the Bright Moments page it display a black screen, with a single word in the center: "goodbye" - marking the end of the project. *... Or maybe not?* A cryptic message has been making the rounds over on TwiX - it seems that there might be something in the works (or it's just a big elaborate scheme to make us believe that): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-13.04.10.png)](https://twitter.com/fingacode/status/1783605281403875407?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fingacode/status/1783605281403875407?ref=gorillasun.de) At this point - I wonder if Spongenuity is doing something that's never been done before 🤔 In other news, one noteworthy project that was released as part of the Bright Moment's finale was from Lars Wander, with an accompanying educative write-up that elaborates a little bit on the technique that makes it happen - namely *Spectral Ray Tracing*: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-24-at-10.14.48.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-24-at-10.15.23.png) [Link to Tweet](https://twitter.com/artxcode%5Fio/status/1782850183165862390?ref=gorillasun.de) | [Link to Write-up](https://larswander.com/writing/spectral-ray-tracing/?ref=gorillasun.de) If you've ever been curious about learning about Ray Tracing - it's a really nice intro. In a nutshell, ray tracing is a technique that simulates light rays traveling through a scene, and the interactions of these rays with surfaces and objects to render them. Spectral ray tracing is a little more sophisticated in that it also factors in the wave length of each ray, allowing the more accurate simulation of certain phenomena, such as dispersion. And another cool thing I wanted to mention, is Anna Lucia setting up shop in Venice to provide the visiting folks with generative tattoos: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-16.43.36.png)](https://twitter.com/fx%5Fhash%5F/status/1781397569375252858?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1781397569375252858?ref=gorillasun.de) Bright Moments folks, what interesting things did I miss? ### Minimizer's Infinite Scribbles As always, I'm a bit late to the party, but last week I also discovered Minimizer's Infinite Scribbles - a generative NFT project that is an "experiment in mechanics": [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-26-at-13.08.17.png)](https://minimizer.art/project/2?ref=gorillasun.de) [Minimizer's write-up about the Infinite Scribble project](https://minimizer.art/project/2?ref=gorillasun.de) In a nutshell, the Minimizer's project is subject to a continuously decreasing closing timer, which would permanently end its minting period if it were to ever reach zero. The interesting mechanic stems from the fact that this timer gets refreshed whenever someone mints an iteration from the project - this means that there's an interest from minters in keeping the project alive if they want it to remain mintable. So far, the project has been running for almost a year and a half! The numbers in bold that you see in the screenshot above are actually dynamically updated. I recommend checking out the entire write-up if you want to learn more. Here's Infinite Scribble #4151 that I recently collected, display in the infinitely scrolling feed of the project: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-17.09.40.png) Mint's free - just have to cover gas fees! ## Tech and Web Dev ### On Writing Alt Text One thing I have always struggled with is writing alt text for my art, how do you describe highly abstract things? Or even GIFs? If it is about a code generated piece, sometimes I feel like it would make sense to have the alt text be the code, after all those are the exact instructions that create the image! Jokes aside, Scott Vandehey wrote an article on the topic, telling us that we should write alt text just like we would describe the image to a friend without over-complicating it and also provides a bunch of additional tips towards that end: [Write Alt Text Like You’re Talking To A Friend“There was this dog wearing safety glasses, surrounded by chemistry equipment, saying ‘I have no idea what I’m doing.’”![](https://cloudfour.com/wp-content/themes/cloudfour2022/node_modules/@cloudfour/patterns/src/assets/favicons/icon.svg)Cloud FourScott Vandehey![](https://cloudfour.com/wp-content/uploads/2024/03/alt-text-friend-r1-1200x0-c-default.jpg)](https://cloudfour.com/thinks/write-alt-text-like-youre-talking-to-a-friend/?ref=gorillasun.de) Coincidentally I came across another article that explains how alt text is experienced by screen reader users, and all of the things that should not be done towards that end as alt text is not actually rich text - hence allowing for all sorts of breakage. It is actually interesting to see that different browsers handle alt text differently as well: [Long AltTL;DR: Keep your image alternative text brief, devoid of special characters, empty of URLs, and ideally in one language. Here We Go Sometimes you can have too much alternative text, particularly for an . I don’t mean there is a limit to what is allowed, I mean there is a…![](https://adrianroselli.com/wp-content/themes/AAR/favicon.png)Adrian Roselliis![](https://adrianroselli.com/wp-content/uploads/2024/04/Longcat_thumb.jpg)](https://adrianroselli.com/2024/04/long-alt.html?ref=gorillasun.de) ### Building CSS Grid Level 3 Masonry A recent article by Jen Simmons over on WebKit tackles whether or not masonry layouts should be an inherent feature of CSS - and if that is the case how it should be implemented, either via its own display property or as a part of CSS grids. The article calls upon web devs and designers to chime in with their thoughts on the issue. Jen first explains the classic manner in which masonry grids are made (nice tutorial), then proceeds to discuss potential implementations of it: [Help us invent CSS Grid Level 3, aka “Masonry” layoutIf you’ve been making websites for years, you know how frustrating it was to lay out a web page with CSS floats.![](https://webkit.org/favicon.ico)WebKitJen Simmons![](https://webkit.org/wp-content/uploads/image1-masonry-light.png)](https://webkit.org/blog/15269/help-us-invent-masonry-layouts-for-css-grid-level-3/?ref=gorillasun.de) I remember that when I first started making websites I absolutely **needed** to have a masonry grid, today I feel rather unexcited by it and prefer having fixed size cards. Functionally, I believe that a masonry layout only makes sense on websites that aim to provide a "content discovery" experience, like Pinterest for instance - which is actually the only website where I think that it's done well. Personally I don't think that masonry layouts are important enough to warrant their own rule or property if future extensibility has to be sacrificed. ### On Load Balancing It is frequently the case that large companies need to distribute across multiple servers to handle the amount of incoming traffic; in this setting a load balancer becomes crucial for automatically distributing incoming network requests across them and to prevent server overload and improve reliability. Sam Who wrote a stellar article on the topic, explaining different load balancing algorithms and comparing them. The highlight of this article are the stellar animations that illustrate the addressed concepts: [Load BalancingA bottom-up, animated guide to HTTP load balancing algorithms.![](https://samwho.dev/favicon.ico)![](https://samwho.dev/images/load-balancing-card.png?h=2703ab1eefd58d7ba55b)](https://samwho.dev/load-balancing/?ref=gorillasun.de) ## AI Corner ### Building a meme search engine with AI The cool thing about the internal representations that AI models learn about data, is not only that we can use them to generate new instances of the data, but also make it possible to measure the similarity between two inputs. This is what Harper Reed discovers in a recent exploration of his, toying with sigclip/CLIP and ending up building a search engine for memes - he recounts how he did it and also provides a github repo with the code: [I accidentally built a meme search engineI built a magical meme search engine using siglip/CLIP and vector encoding images. It was a fun way to learn about this powerful technology. I’m sharing the code so you can build your own and discover forgotten gems in your photo library. Let’s unleash the power of AI on our images!![](https://harper.blog/favicon.ico)Harper Reed's BlogHarper Reed ![](https://harper.blog/images/og.png)](https://harper.blog/2024/04/12/i-accidentally-built-a-meme-search-engine/?ref=gorillasun.de) ### A New Paradigm of Creativity Apparently a large chunk of the talks at TED2024 in Vancouver was geared towards AI and its role as a tool for creativity. Honor Harger reports on the talks that she's been part of, including the talk titled "A New Paradigm of Creativity" that highlights 8 of the successful artists that are working with AI today: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-24-at-10.29.10.png)](https://honorharger.wordpress.com/2024/04/23/a-new-paradigm-of-creativity/?ref=gorillasun.de) [Link to Article](https://honorharger.wordpress.com/2024/04/23/a-new-paradigm-of-creativity/?ref=gorillasun.de) The overall sentiment is similar to what we've recently covered, where AI is a creative tool that can be leveraged collaboratively. ## Gorilla Updates While I've primarily been preoccupied with setting up the discord this week and getting a bunch of writing done - I also actually managed to make some art! Earlier this week I got an email from EmProps - short for Emergent Properties - letting me know that my turn on the waitlist had come, and that I could now access their OpenStudio online tool that lets you create projects for their platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-28-at-12.09.28.png) I remember signing up to it back in November of last year, when also briefly talked about the platform in the 29th Newsletter issue: [Gorilla Newsletter 29This week: Volumetric Raymarching by Maxime Heckel - Ana María Caballeros Paperwork - fx(hash) 2.0 launch calendar - ComplexCity by John F. Simons - Studio Yorktown’s Journal + lots more.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/11/F9jPdbAXsAAYuqQ.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-29/#ai-corner) If you're not familiar, EmProps is essentially the first, and currently only, long-form generative AI NFT marketplace out there - the concept is straightforward, instead of artists creating a project with code, they craft a prompt that is given as an input to a StableDiffusion model. When collectors mint from the project they obtain an NFT of the image that the model generated based on the prompt. EmProps OpenStudio is designed to aid artists in setting up their project - it works similarly to other prompting interfaces currently out-there, with additional customization options that allow for an extended variety in output prompts. I've been experimenting with generative image models for a couple of years now, ever since they came out actually - and still do play from time to time with them when a specific prompt comes to mind. Hence it wasn't too difficult to get an initial idea going that I think has a lot of potential: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Test_Project_Page_1_3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Test_Project_Page_1_1-2-.png) Essentially I don't want to do something that tends to be more oriented into the PFP project direction, but rather something a bit more abstract. I'm not entirely certain when I'll be releasing this project though, it might be sooner rather than later. *The next Gorilla Monthly exclusive post on my Hypersub will actually be a deep dive into EmProps with some of my thoughts about it.* [*You can sign up to my Hypersub here.*](https://shorturl.at/iFMW7?ref=gorillasun.de) While we're speaking about Hypersub, the first month has already come to an end - and that means that it was time for a new monthly art drop! I shared this animation a couple weeks ago already, it being among the cooler ones I've made it only made sense to use it as the monthly drop: 0:00 /0:10 1× ## Music for Coding While listening to many an indie playlist I discovered the music of Phil Danyew, originally the keyboardist of Foster the People, he left the band in 2020 to pursue his own music, and now goes under the artist name Elephant Castle. If you're fan of Tame Impala, Danyew's sound will be right up your alley - with saturated retro synths and psychedelic reverberating melodies he hails a music from an era long past: And that's it from me, hope you've enjoyed this week's curated list of generative art and tech shenanigans! Now that you've made it through the newsletter, might as well share it with some of your friends - sharing the newsletter is one of the best ways to support it! Otherwise come and say hi over on my socials! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 53Recreating Noita’s Falling Sand Sim - Procedural Color Visualization - Minecraft in Javascript - Long Distance Plotting with La Ligne - A New Generative Art Platform Intrinsic - OBJKT4OBJKT 2024 - Building a Code Formatter - Devin lied to us +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/04/globuli-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-53) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### A Deep-Dive into Font & Text Packing URL: https://www.gorillasun.de/blog/a-deep-dive-into-font-text-packing/ Last updated: 2024-06-22T10:53:39.000Z A deep-dive into font packing with opentype.js, with our own customizable path packing procedure for the non-overlapping placement of letter-forms. Including a detailed look at many useful vertex operations. _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 53 URL: https://www.gorillasun.de/blog/gorilla-newsletter-53/ Last updated: 2024-08-15T08:00:07.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 53rd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Recreating Noita's Sand Simulation Yet again we revisit the fascinating world of Cellular Automata in this issue of the Newsletter. I've previously written about CAs in two past issues of the Newsletter: most recently in issue # when I featured Spacefiller's wonderful interactive essay about Conway's Game of Life that was made as a submission for the HTML review, and second time back in Genuary, in [issue #41](https://www.gorillasun.de/blog/gorilla-newsletter-41/) when Daniel Schiffman released the video for this Coding Challenge #180 in which he recreates a falling Sand simulation with p5js: Aside from Schiffman's coding challenge, there's also a bunch of other cool resources that teach about creating falling sand sims, like [Max Bittker's write-up of how he created his iconic Sandspiel](https://maxbittker.com/making-sandspiel?ref=gorillasun.de), as well as [Jason McGhee's tutorial](https://jason.today/falling-sand?ref=gorillasun.de) series. My gripe however, is that these tutorials don't usually go beyond explaining how to model a sand CA, and don't touch on the other elements that I generally find to be much more interesting, like water, plants, and even fungal growths. The third part of McGhee's series does hover go into the creation of fire and smoke CAs. Falling sand simulations are not just fun to recreate with code for little sandbox experiments, but actually an entire genre of video games has emerged around the concept. If you've ever done a little bit of research around CAs you'll likely have come across the game [Noita](https://en.wikipedia.org/wiki/Noita%5F%28video%5Fgame%29?ref=gorillasun.de); an action [roguelike](https://en.wikipedia.org/wiki/Roguelike?ref=gorillasun.de) in which the player explores a procedural world that's entirely made out of different types of cellular automata: [![Noita review | PC Gamer](https://cdn.mos.cms.futurecdn.net/nBHryRZTSU4w5GK3PHerEZ.png)](https://www.pcgamer.com/noita-review/?ref=gorillasun.de) [You can read a little more about the Game in this PC-Gamer Review](https://www.pcgamer.com/noita-review/?ref=gorillasun.de) I recently came across a Youtube video by John Jackson, in which he dives into the different elements that occur in Noita and explains them in a little more detail: Although the video is already 3 years old - ancient by internet times - there were more than a bunch of interesting pointers in it. For instance the notes on simulating water; while I had assumed that making a CA for this purpose would be highly complex, and that it would involve some sort of fluid simulation, it turns out that that isn't the case. It's actually no so different from simulating sand! Simply by giving particles the ability to also move to adjacent cells left and right of its own, without having to necessarily go downwards, it makes it seem as if the water particles push each other in a fluid-like manner. I'm certain that the implementation thereof isn't as easy as this, but Jackson does however provide additional information in a pinned comment in the video's comment section. What's also worth mentioning here is that there's quite a famous GDC (games developer conference) talk back from 2019, in which Petri Purho, one of the creators of Noita, gives us a more detailed look into how the game is implemented and designed: I believe that CAs are among the most rewarding topics to tackle in creative coding, as their implementation requires you to think in an inherently computational manner that is applicable in a multitude of different scenarios. At the same time they have a fascinating history and can teach us many things about the world around us. If you run into any interesting resource around CAs please send them my way! ### A Procedural Color Visualization Method Sometimes you come across a user's profile on the internet and it ends up being an absolute treasure trove of interesting ideas - this was the case for me with [Mrmo Tarius](https://twitter.com/MrmoTarius?ref=gorillasun.de)' profile, a Graphic Designer that has a knack for procedural things. In a fortunate streak, the TwiX timeline for once decided to show me content that is actually relevant to me, and presented me with one of Tarius' recent creations - a 3D experiment for visualizing color palettes: 0:00 /0:10 1× [Link to Tweet](https://twitter.com/MrmoTarius/status/1645462342010798080?ref=gorillasun.de) In essence, as far as I understand the visuals, the colors in a given palette are placed as coordinate points in the RGB cube, then expanded into 3d Voronoi regions, and subsequently smoothed to create the blobby aesthetic that can be seen in the video. Depending on where the coordinate points fall, they might occupy varyingly small or large regions. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-21-at-15.03.08.png)](https://twitter.com/OskSta/status/1645523670134128643?ref=gorillasun.de) I mean if you have [Oskar Stålberg](https://twitter.com/OskSta?ref=gorillasun.de) (creator of the city building game TownScaper) comment on your creation, that's something | [Link to Tweet](https://twitter.com/OskSta/status/1645523670134128643?ref=gorillasun.de) You can see some more recent versions of this experiment on Tarius timeline. Why I found it so interesting, is because I believe that it might be an ingenious *spatial* weighted approach to sampling colors from a palette! Basically, we simply sample a random point inside the volume of the cube, in a uniform manner, and then select the color of the region that the point falls into. Since certain regions are larger than others, the structure already predicates the color distribution and the probability of picking a certain color - in this manner highlight colors could be assigned smaller regions, whereas the base colors could occupy larger partitions, etc. but maybe this doesn't work that well in theory. Would love to hear you guys' input on this! Besides that Tarius also makes all sorts of cool things, one pic that I really loved was the following - a picture that's rendered via Mrmo's own "print emulation shader" Blender node: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-17-at-14.25.12.png)](https://twitter.com/MrmoTarius/status/1527658334609977344?ref=gorillasun.de) [Link to Tweet](https://twitter.com/MrmoTarius/status/1527658334609977344?ref=gorillasun.de) Like come on, this looks so good! Can I please get an entire game styled like this? ### Building Minecraft with JavaScript and Three.js While we're on the topic of procedural generation; here's an interesting video from roughly a year ago about how Minecraft handles the procedural generation of its different worlds and biomes: And you might've noticed, it's by none other than Alan Zucconi! He starts us off with some of the history behind procedural generation in video games, and some of the early precursors that pioneered the concept, like the game Elite for the BBC Micro in 1984\. Procedural generation often boils down to carefully balancing between consistency and variety, and is generally not an easy feat to accomplish - many games fall short in that regard, we've seen a few modern examples where this was the case, like Bethesda's Starfield for instance, with the major complaint that the worlds felt "empty". While the issues of "endless content" and "replay value" in video games do play into this narrative, that's a story for another day. Minecraft however has managed to keep players interested even 15 years after its original release, which is impressive and cannot be said about many other games. Zucconi has also written a companion article for the video here: [The World Generation of Minecraft - Alan ZucconiLearn how Minecraft creates its worlds. This article will finally explain how the world, biome and terrain generation algorithms work.![](https://www.alanzucconi.com/wp-content/uploads/2015/10/cropped-AZ-big-270x270.png)Alan ZucconiAlan Zucconi![](https://www.alanzucconi.com/wp-content/uploads/2022/06/minecraft_worldgen.png)](https://www.alanzucconi.com/2022/06/05/minecraft-world-generation/?ref=gorillasun.de) I wouldn't have come across Zucconi's video if it wasn't for this series on recreating Minecraft with Javascript and Three.js Coffee Code Create: ### Long Distance Plotting with La Ligne One other thing that I wanted to share is La Ligne - a long distance plotter group show. In a nutshell, artists around the globe can send in their SVG files to be then plotted on site in Amiens, France - you can learn more about the project here as well as some of the participating artists: [la ligne — code && art —long distance drawingLa ligne — code créatif pour tous.![](https://ligne.page/safari-pinned-tab.svg)la ligne![](https://ligne.page/la-ligne.png)](https://ligne.page/en/les-ressources/long-distance-drawing?ref=gorillasun.de) This came to my attention after seeing CCDDBB's post over on TwiX with the beautiful artwork that he had submitted: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-13.17.19.png)](https://twitter.com/CCDDBB/status/1779857071758094648?ref=gorillasun.de) [Link to Tweet](https://twitter.com/CCDDBB/status/1779857071758094648?ref=gorillasun.de) I don't want to jinx it, but CCDDBB has been on an absolute roll lately, highly recommend checking out their timeline. \*knocks on wood\* ### Generative Minis 1. Daniel Schiffman announced that he completed the [new version of The Nature of Code](https://twitter.com/shiffman/status/1781689870466916655?ref=gorillasun.de). 2. Christiane Pauland David Lisbon, the curatorial team behind the Harold Cohen: AARON exhibition on the 8th Floor of the Whitney museum, share insights about the show in [this conversation](https://www.youtube.com/watch?v=xkrJwURBEfg&ref=gorillasun.de). 3. Gallery's curatorial series "Gallery Selects" featured [Zancan's Aux Arbres in a big article](https://shorturl.at/OQ246?ref=gorillasun.de) of theirs, with many of his thoughts throughout the process and release of the massive project. ## Web3 News It's been yet another chaotic week in Web3\. With the bitcoin halving just having passed this weekend there's uncertainty around how things will swing in the coming days. The overall sentiment however is that we're slowly coming out of the bear market. ### A new Genart Platform: Intrinsic.art I came across this cast by Matto announcing the launch of his project "Metta" on a platform that I hadn't heard of before: Intrinsic.art. It's essentially a new generative art NFT platform, that puts a different spin on the collector customizable minting experience, the likes that have been pioneered by Crayon Codes, fx(params) and EditArt - with the difference that the parameters are themselves NFTs in this scenario. I recommend giving Matto's thread a read as it illustrates the concept pretty nicely: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-19-at-10.24.02.png) In essence, as far as I understand it, the traits that define a minted iteration are not just attributes and pieces of information that get stored on-chain to define the minted iteration, but rather, the traits are themselves tokens that combine into the generative token - they're basically building blocks. If you take a look at Metta's mint page on intrinsic.art it shows that each trait has an edition size and price: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-19-at-11.00.52.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-19-at-11.05.45.png) Each individual trait has a number of types, that in turn have their own edition sizes. It seems that this allows the artist for greater control over the rarity of the final collection. An added effect of this, is that minted edition can then be burned to be disassembled into their individual traits, and then recombined into other versions of the generative artwork when the different traits are mixed and matched. While I understand how it works in concept, in practice this makes me a bit concerned - if it is possible to collect traits by themselves, what happens when someone collects all editions of one individual trait? Does that then prevent other collectors from assembling artworks from the collection? I'm also wondering what the practical purpose is of having different prices on individual trait categories - but maybe I'm overthinking this too much - I asked Matto about it in the Thread and he provides some insightful answers in that regard: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-13.12.58.png)](https://warpcast.com/gorillasun/0x3966084e?ref=gorillasun.de) [Link to Thread](https://warpcast.com/gorillasun/0x3966084e?ref=gorillasun.de) I'm definitely excited to see how the new platform pans out with its first couple of projects. I also recommend giving Matto's write-up a read: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-13.37.14.png) [Link to Article](https://shorturl.at/dI269?ref=gorillasun.de) ### OBJKT4OBJKT 2024 It's been a minute since I've talked about Tezos - simply because there hasn't really been much to report on in recent months, and at the same time been overshadow by other developments in the crypto space. Last week however, the popular OBJKT4OBJKT event made a return, with its fourth installment running for four days from the 18th to the 21st of April 2024\. The event concluded just yesterday evening with a whopping 38.8k editions sold overall and 944 artists participating in total - NftBiker crunched the numbers for us: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-11.01.58.png)](https://twitter.com/NFTBiker/status/1782322119776354539?ref=gorillasun.de) [Link to Tweet](https://twitter.com/NFTBiker/status/1782322119776354539?ref=gorillasun.de) Unfortunately, when this Newsletter comes out the event will have concluded already, I'm certain however that there's likely still many goodies that are still waiting to be collected and haven't been burned yet. It's generally the best time of the year to grow your Tezos collection and acquire some stellar pieces for little funds. And as always NFTBiker's tool has been the best way to keep track of things: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-17-at-14.05.08.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-21-at-12.36.56.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-17-at-14.06.36.png) [Link to Cast](https://warpcast.com/kika/0x1baa1214?ref=gorillasun.de) | [Link to NFTBiker's Objkt4Objkt Tool](https://shorturl.at/achV6?ref=gorillasun.de) | [Link to Cast](https://warpcast.com/nftbiker/0x20af9836?ref=gorillasun.de) I only managed to dedicate some time towards the event this Saturday, on the third day of the event - here's what I made 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/ASTRAIOS-1.gif) [Link to Objkt](https://objkt.com/tokens/KT1F45aBw2czKHo6dbPVFLiwakaobisAPuEA/2?ref=gorillasun.de) And I also managed to cop a couple of pieces from some artist friends, and even made my very first curation on Objkt.com, it was actually super fun and definitely made me excited to collect more - here's a link, some of the pieces might still be up for grabs: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-13.08.12.png)](https://objkt.com/curations/objkt/gorilla's-objkt4objkt-2024-fbad812d?ref=gorillasun.de) [Link to Curation](https://objkt.com/curations/objkt/gorilla's-objkt4objkt-2024-fbad812d?ref=gorillasun.de) ### Statelessness, state expiry and history expiry As the blockchain is becoming more and more part of my daily reality, in terms of social media and genart practice, I'm actively trying to learn more about its intricacies, and also become more involved. A new article directly from the Ethereum foundation addresses a concern with the decentralization of the chain: one big bottleneck that prevents users from running their own nodes on low-end devices is the growing state data that needs to be stored at any given time for the node to function properly: > Today, high disk space requirements is the main barrier preventing universal access to nodes. This is primarily due to the need to store large chunks of Ethereum's state data. This state data contains critical information required to correctly process new blocks and transactions. At the time of writing, a fast 2TB SSD is recommended for running a full Ethereum node. [Statelessness, state expiry and history expiry | ethereum.orgExplanation of history expiry and stateless Ethereum![](https://ethereum.org/favicon.png)ethereum.org![](https://ethereum.org/heroes/roadmap-hub-hero.jpg)](https://ethereum.org/en/roadmap/statelessness/?ref=gorillasun.de) The text discusses some potential solutions to the issue, and underlines that accessibility is crucial for true decentralization; an effort has to be made to bring this ideal closer to reality and to ultimately empower a wider range of users to participate in the Ethereum network. ### News from the Purple Side 1. Highlight now allows for minting with DEGEN, and also enables creator rewards on free collections. [Read the official announcement here.](https://warpcast.com/highlight/0x4bda1a83?ref=gorillasun.de) 2. Warpcast now implements a different method for ordering cast replies, they are now shown in the following order: 1\. If the author replies to the reply 2\. If the author likes the reply 3\. If the author follows the user replying 4\. Replies from users with the power badge 5\. Everything else. [Learn more about it in this cast from Dan Romero](https://warpcast.com/dwr.eth/0x3ba74556?ref=gorillasun.de) as well as what people thought about it. 3. DEGEN allowances have been reduced for everyone across the board by roughly 40% - this might be due to the big influx of new users on the platform. There were some allowance outages again this past week, but they should have been resolved again by now. ## Tech and Web Dev ### MarkdownDown by Asad Memon Came across this cool online tool by Asad Memon, that lets you download any page on the internet as a clean markdown file, plus an option to download the images that occur throughout the page, as well as a ChatGPT powered filter in which you can instruct the downloader to make any and all sorts of edits via a prompt: [MarkdownDownConvert any webpage to a clean markdown w/ images downloaded.![](https://markdowndown.vercel.app/favicon.ico)MarkdownDown![](https://markdowndown.vercel.app/og.png)](https://markdowndown.vercel.app/?ref=gorillasun.de) Scraping pages is actually quite a challenging task, since pages can be structured in vastly different manners there isn't a one size fit all solution to the task - I found the Hackernews comment section that announced the tool to be quite enlightening as well, with many other tool builders chiming in discussing their approaches: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-19-at-11.53.56.png) [Link to Hacker News Item](https://news.ycombinator.com/item?id=40033490&ref=gorillasun.de) ### How to write a Code Formatter Have you ever wondered how your code editor automatically formats your code for you? I actually never thought about it, but naturally, there's an algorithm that takes care of this - and it's actually a pretty interesting task from a computational point of view. Yorick Petersee walks us through the challenges of putting together a code-formatter from scracth in this beefy article of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-21-at-15.58.56-1.png)](https://yorickpeterse.com/articles/how-to-write-a-code-formatter/?ref=gorillasun.de) [Link to Article](https://yorickpeterse.com/articles/how-to-write-a-code-formatter/?ref=gorillasun.de) ### How to generate Color Palettes for Design Systems The growing needs of the modern internet have imposed more and more requirements of the color palettes that we use to style our design systems. On the one hand we need our schemes be recognizable and consistent, conveying a strong sense of "brand", while also being flexible enough to be applicable to different interfaces, use cases, and also adhere to web standards and accessibility requirements. Matthew Ström tackles the task in this deep-dive of his and proposes an approach of his own: [How to generate color palettes for design systemsA guide on how to generate color palettes for design systems![](https://matthewstrom.com/favicon.png)Matthew Ström, designer-leader![](https://matthewstrom.com/images/og/3ImCaGK5ta-1200.jpeg)](https://matthewstrom.com/writing/generating-color-palettes/?ref=gorillasun.de) Ström points out that there's currently many different tools out there that are aimed at generating color palettes, but that they're all arguably flawed; either they're too convoluted and inaccessible for anyone to use them, or they're too simple to be able to generate meaningful schemes - there needs to be some sort of middle-ground. And I have to agree, I have yet to run into my own ideal palette generator. Ström also points out a bit of an older article from Stripe from 2019, in which they explain how they went about designing their own system for accessible colors: [Designing accessible color systemsHow we designed a color system with hand-picked, vibrant colors that also met standards for accessibility and contrast.![](https://assets.ctfassets.net/fzn2n1nzq965/01hMKr6nEEGVfOuhsaMIXQ/c424849423b5f036a8892afa09ac38c7/favicon.ico)Daryl Koopersmith![](https://images.ctfassets.net/fzn2n1nzq965/5jke06jpu3duAMGzkrYNCz/859251e4f5699467afcdc0e2cc93db3c/blog-accessible-color-systems.png?q=80)](https://stripe.com/blog/accessible-color-systems?ref=gorillasun.de) ## AI Corner ### LLMs explained... by Ryan Gosling This is probably the 15th time that I share a video explainer on how LLMs work, the difference with this one however, is that it's done by Ryan Gosling! Well, not the real Ryan Gosling, but a deep-fake version of his; the creator of the video *howtofly*, explains their approach in the description of the video, chaining together a number of AI services for this purpose. I was actually curious about ElevenLabs, that lets you generate spoken versions of text with a number of different voices, and tried it out for myself to see if it is as potent as advertised. And turns out it's actually really good! Here's a sample where I fed in the opener of the Newsletter: Herald Grumpy and Tired Sample 0:00 /21.028563 1× If you're interested in trying it out for yourself you can check it out [here](https://elevenlabs.io/?ref=gorillasun.de). Not sponsored. The website's a bit laggy though. You know, I'd really love to see Michael or Dwight from The Office give the Gorilla Newsletter an endorsement... ### Devin... lied to us? When it comes to lying on your CV, I believe that Devin has already beat many of the human software devs. I've already expressed my skepticism for the legitimacy of Devin's capabilities when Cognition made their announcement, and turns out that it was warranted. Carl from the Internet of Bugs YouTube channel addresses some important points in that regard, and explains why the "hype" around AI can have an incredibly negative effect on our perception of different professions - misrepresenting AI capabilities can devalue the contributions and ability of skilled professionals. Carl proceeds to debunk Cognition's showcase of Devin, and why the AI software engineer is likely much worse than advertised: Software engineering is complicated. It requires creativity, problem-solving, debugging, as well as the ability to adapt to new and ever-changing technologies. What we can currently do with AI is incredibly impressive, but at the same time we're still very far from replacing real-human-people with it. While in this case we're specifically talking about software development, I think this applies to all fields that are currently being explored with AI. ## Gorilla Updates What have I been up to this past week? A bunch of stuff actually, besides the animation I made for Objkt4Objkt, I also released a new article for my Hypersubs, a deep-dive on Text & Font packing, using the OpenType library and a custom path packing procedure: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-22-at-13.33.15.png)](https://shorturl.at/mwxFM?ref=gorillasun.de) [Link to Article](https://shorturl.at/mwxFM?ref=gorillasun.de) If you're interested in reading it, you can collect a [Hypersub subscription here](https://shorturl.at/zLY19?ref=gorillasun.de). The cool thing about it is that it lets you use any fonts and any sort of typographic letterforms - even works for other languages: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/arabikh.png) I also worked on some other sketches that I'll be sharing more of in the coming days - for instance this circle packing sketch: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/globuli.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/simplicidad.png) As well as my generative puzzle sketch that is shaping up really nicely: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/palettten.png) ## Music for Coding This week I have been thinking a lot about the short, but adventurous vacation that I spent in Spain last year, it was definitely a big highlight of 2023\. It might sound a little silly but I wanted to listen to something that made me feel like I was there again — while not originally from Spain, I discovered the Mexican singer and producer León Larregui that has some really beautiful tunes: I also really enjoyed the beautiful cover of the album that gives me some ideas for a generative sketch. And that's it from me, hope you've enjoyed this week's curated list of generative art and tech shenanigans! Now that you've made it through the newsletter, might as well share it with some of your friends - sharing the newsletter is one of the best ways to support it! Otherwise come and say hi over on my socials! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 52RCS on the Future of Creative AI - Creative Code Tutorial Galore - Retro Nostalgia with Workstation 95 - News from the Purple Side - The Fabulous Cartier Journey - Andrej Karpathy implements GPT-2 in C +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/04/dino-eggs-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-52/) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 52 URL: https://www.gorillasun.de/blog/gorilla-newsletter-52/ Last updated: 2024-04-15T09:26:33.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 52nd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## The Future of Creative AI Although AI models have become increasingly proficient at making art, and are already capable of impressive generative feats - feats that we've only dared to think possible a couple of years ago - there's a big difference between **being** creative and **simulating** creativity. Featuring the two experts Mick Grierson and Luba Elliott, RCS tackles this topic in a recent article of theirs: [The Future of Creative AITwo leaders in the field of machine learning assess its progressive potential for art and beyond![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Alex Estorick![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/6616c85d05c13e52904083f8_sougwen-2023_LifeLines_ProcessFilm_2.jpg)](https://www.rightclicksave.com/article/the-future-of-creative-ai-machine-learning?ref=gorillasun.de) Rather than subscribing to the silly hollywood-esque idea that AI will develop its own independent creativity, the two experts see AI as a powerful creative tool that artists will leverage for different kinds of tasks, augmenting and transforming their creative processes. Mick Grierson provides an interesting perspective, stating that the cutting edge tech is merely a different framework in which we can express ourselves creatively: > Some forms of expression, such as dancing, don’t require any technology at all. However, a drum, which is an early form of technology, can also transform dancing by providing a new framework within which that kind of expression can occur. Maybe AI art shouldn't be placed on its own pedestal, separately from the the other artforms, but rather be considered a new framework that enables new affordances. In its short history, AI art has already had a radically transformative effect on art *making*, in terms of accessibility its enabled many people to *create* and make art, who otherwise would've never tried their hand. Moreover, AI art is still rapidly changing as the underlying tech is evolving *\-* in stark contrast to the traditional artforms that took decades and centuries to reach their current state. A recent project that I'd like to mention in this regard, that leverages AI as a creative tool, is Matt DesLauriers Filligree - featured in a recent interview with Monk from Le Random: [Matt DesLauriers on Challenging the Image‍Acclaimed software artist Matt DesLauriers spoke to Peter Bauman (Monk Antony) about the implications of AI’s prevalence. They examine how DesLauriers has begun incorporating AI into his process and how AI challenges our relationship with the image.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/6615563c3d876a896b83995c_DSC05111.jpg)](https://www.lerandom.art/editorial/matt-deslauriers-on-challenging-the-image?ref=gorillasun.de) DesLauriers is also of the view that its much more likely that AI models will serve us as tools to enhance the creative process, rather than replace us creatively - just like we use computers that we did not engineer or build ourselves as tools on a daily basis. In Filligree, LLMs were used for the purpose of generating the mood and color palettes of the individual artworks. While the partnership between artificial intelligence and human creativity has already led to fascinating developments in art, it also drives forward an important narrative around authorship. The question of "Who made the art, man or machine?" has already existed to a lesser extent in other fields, like generative art, the increased autonomy of these systems renders the line even blurrier - generative AI has most definitely made quite an impact on programming, with LLMs' ability to generate chunks of code on demand. [Can Artificial Intelligence Be Creative?AI is a helpful tool for creatives. This article explores examples of AI creativity and how businesses can use AI to help them build more creative solutions.![](https://assets-global.website-files.com/5c97e8c9de94e8a3480419a5/5efe550a1f34ac815c1775aa_favicon32.png)AkkioCraig Wisneski![](https://assets-global.website-files.com/5ced99a4fd5e3ae5e159181c/638e03b1a813a955134db074_20221205T0243-080e11b8-c258-44ec-8a41-2f45b068184a.jpeg)](https://www.akkio.com/post/can-artificial-intelligence-be-creative?ref=gorillasun.de) Although the current arguments that we're getting dangerously close to true AGI (Artificial General Intelligence) raise reasonable concerns, I find it hard to believe that the current statistical models are all it takes to simulate the conscious, self-reflective capabilities of the human brain. We might be closer than ever to AGI - but at the same time I believe there's still a lot left to figure out. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-12-at-18.19.52.png) ## All the Generative ~~Things~~ Tutorials This past week has been an absolute treasure trove of generative art and creative coding tutorials! ### Daniel Velasquez ASCII Tower Breakdown Taking inspiration from Andreas Gysin's iconic ASCII towers, Daniel Velasquez puts his own 3D spin on the idea and recreates the sketch using shaders in WebGL - he walks us through the steps to achieve his recreation in a recent tutorial of his, detailing some of the technical challenges involved: [ASCII Tower BreakdownLearn how to use deferred rendering with ascii by packing values into color channels.![](https://offscreencanvas.com/images/favicon.ico)Offscreen/ Canvas.![](https://offscreencanvas.com/images/issues/045/metaImage.jpeg)](https://offscreencanvas.com/issues/ascii-tower-breakdown/?ref=gorillasun.de) Rendering ASCII characters with a shader is a completely different challenge from doing so with HTML + JavaScript. By repurposing the built-in **`gl_fragColor`** output variable, that is normally used to pass colors from one shader pass to subsequent ones, the RGB channels can be cleverly leveraged as data storage. While the Blue and Green channels are still used for color purposes in this setting, to specify the cosine offset of the sinusoidal palette that ultimately gives the characters their color, the Red channel is used to store a set of ASCII symbols. Velasquez also shares a cool trick for storing multiple symbols inside of a single channel, I won't spoil it all here, go and check out the write-up. In the article Velasquez also links to another interesting resource that I'd like to feature here, the first installment in a three part series of case studies that debunk how GTA V renders its graphics: [GTA V - Graphics Study - Adrian CourrègesThe Grand Theft Auto series has come a long way since the first opus came out back in 1997\. About 2 years ago, Rockstar released GTA V. The …![](https://www.adriancourreges.com/apple-icon-180x180.png)Adrian CourrègesAdrian Courrèges![](http://www.adriancourreges.com/img/blog/2015/gtav/gtav_banner.jpg)](https://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study/?ref=gorillasun.de) I also want to point out that Daniel Velasquez runs an awesome Newsletter, that you should definitely subscribe to if you're interested in creative front-end dev things. ### Coding Adventure: Rendering Text While we're on the topic of rendering ASCII characters and text, Sebastian Lague published a new YouTube video over the weekend, and as usual it's a fascinating deep dive. If you've ever tried to render text using different fonts with code and do something creative with them while you're at it, you're in for a rude awakening - especially dealing with font files can be challenging. In the video Sebastian Lague dives into the details of the font file format and how to parse it for finding the contour information of individual glyphs, subsequently he explores the challenges of visualizing the individual letters: If you ever have a project that requires you to handle font files - this one's a must watch. Up to this point I've heavily relied OpenType.js to do the job for me, and it works pretty well, but it's always been a bit cumbersome to use - maybe I'll put together my own minimal font file parser at some point. ### On Flow-fields and Novelty and Taste Adam, aka Genlight, has been writing a bit more frequently over on his Substack, and recently published a tasteful essay on *novelty* in the setting of generative aesthetics. Generative art in particular succumbs to the problem of an over-saturation of similar aesthetics - primarily due to the tools and methods that are commonly used for their creation. The enjoyment derived from the perceived originality of a generative art, can quickly turn into distaste when this novelty wears off. Adam explains some of the things that can make art seem Clichee, and using the all-too-familiar flow field, Adam walks us through his process: [On flow fields and novelty and tasteMake a flow field with me![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cb0c9d2-26c3-478d-827e-62599c91c227%2Fapple-touch-icon-180x180.png)Generative LightAdam![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F246e5de4-f21b-4102-b485-edee94234116_1200x1600.jpeg)](https://generativelight.substack.com/p/on-flow-fields-and-novelty-and-taste) The article really hits home for me. Although I don't always succeed at it, I've been striving at incorporating a new element in each single one of my projects - be it conceptually or a new algorithmic element, even if it doesn't lead to a much different aesthetic. Although it's uncertain if the viewers will ever recognize these elements, it is to a large extent a personal challenge. I'm generally not satisfied with my work unless it brings something new to the table. Moreover, when new ideas are incorporated in a work, I find that it's important for them to serve a purpose - contributing to elevating the artwork, and not just be tacked on. Just as Adam points out in the case of the painting that is needlessly split up into a triptych, adding aesthetic complexity for no reason can often have a reductive effect. ### Manuel Lariño's Forecast Although it isn't a recent post, I also wanted to share this beautiful write-up and explainer by Manuel Lariño, in which he details the making of his Art Blocks project "Forecast". Inspired by the rich vocabulary surrounding rainfall in the Galician region of Spain, Lariño explores the profound connection between weather and human emotion as a way to pay homage to his hometown: [Forecast — Manuel Lariño | Generative artForecast is an analogy between weather and human emotions, comparing the outcome of a weather forecast to the range of emotions a rainy day can evoke.![](https://images.squarespace-cdn.com/content/v1/640b09b6718943668d2ed71c/80694a79-0fbb-4649-a2ec-66b5d480d729/favicon.ico?format=100w)Manuel Lariño | Generative art0![](http://static1.squarespace.com/static/640b09b6718943668d2ed71c/t/6532d884a47f3b3d0dde2bf0/1697831049032/forecast-generative-art.png?format=1500w)](https://mlarino.com/work/forecast?ref=gorillasun.de) With a grid system that represents the paved streets of Galicia, and curved streaks that simulate the raindrops, the generative artwork strives to visually represent rainfall in an abstract manner. Lariño draws inspiration from a number of minimalist art movements, making use of geometric elements and carefully designed color palettes to capture the different emotional states that rain can evoke. ## Web3 News ### Workstation 95 One of my favorite NFT projects from the past week has been a collaboration between the two users that go under the aliases of sgt slaughtermelon, and Iteration. Combining two previous ideas of theirs they bring to life a beautifully nostalgic piece titled 'Workstation 95', in which each mint is a unique little pixel-art workstation, at its center an older desktop machine, surrounded by a number of different gadgets: ![](https://i.seadn.io/s/raw/files/3cd267a913ac4eca406737a59afbbe5b.png?auto=format&dpr=1&w=1000) The fascinating thing about the project is its minting experience that happens through a Farcaster Frame - collectors can assemble their own Workstation. The above one is the one I minted, at random since it took me a bit to figure out what I was doing. If you're interested in checking it out for yourself, you can find the frame here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-14-at-23.10.31.png)](https://warpcast.com/sgt-sl8termelon/0x13a80f6d?ref=gorillasun.de) [Link to Cast](https://warpcast.com/sgt-sl8termelon/0x13a80f6d?ref=gorillasun.de) These mood-reflecting text at the top of the piece aims to capture the mixed emotions that we often experience at our desks – the place where work and play intertwine. Wokrstation 95 acts as a playful yet thought-provoking ode to the place where we spend countless hours. Sgt slaughtermelon wrote a beautiful piece to recount the making of Workstation 95 (indirectly linking to it here because the article is on an .xyz domain): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-14-at-23.11.51.png) [Link to Cast](https://warpcast.com/sgt-sl8termelon/0xf3563681?ref=gorillasun.de) ### News from the Purple Side It's been wonderfully chaotic over on Farcaster in the past week - with DEGEN allowances going haywire and image uploads breaking just yesterday, it's been wonderfully chaotic 1. DEGEN allowances have been inaccurate for a couple of days last week, this is due to some issues with Dune and Neynar, the two services that calculate the allowances - [more info about this by Ryan J. Shaw in this cast](https://warpcast.com/rjs/0x0dfe6e4f?ref=gorillasun.de). 2. Image Uploads are [apparently broken due to an API request limit as NFTBiker points out in a cast of his](https://warpcast.com/nftbiker/0xce074b87?ref=gorillasun.de). One way to get around it is by posting an image to imgur/discord and then pasting the link in your cast. 3. Warpcast has a feature called 'Cast Actions', basically tiny add-ons that you can tack onto the regular roster of reactions that's normally available (liking, recasting, bookmarking) - they can be accessed via the 4 squares button underneath a cast. [You can learn more about them here](https://shorturl.at/txCIZ?ref=gorillasun.de). 4. Supercast is an alternative client to Warpcast that lets you interact with the Farcaster eco-system. Supercast is a paid service however, but seems to provide an overall much smoother experience. 5. Want to tip someone directly with ETH/DEGEN and other tokens from your wallet? Paybot can be used as a tool for this purpose, simply tag the bot + the recipient + state an amount + the token symbol. The bot will then reply with a frame in which you need to confirm the transaction. 6. One other interesting thing I want to share here, Cryptopunks #7804 was acquired by Artudito for 16.4 million - [NFT Now interviews the collector on the purchase and the motivations behind it.](https://nftnow.com/features/artudito-alien-cryptopunk-16-million-exclusive/?ref=gorillasun.de) ### Meme Coins & Crypto Liftoff I am simply sharing this article because I found it to be a fascinating read, the author also clearly states that putting any money in meme coins is at best gambling. And it's just absolute madness because there isn't really any rhyme or reason as to why the chart is swinging up or down, other than the speculation of everyone that's invested - a simple social media post by someone influential can sometimes be sufficient to wreck the entire chart. Arbitrage Andy explains this daunting new market in an article of his: [Meme Coins & Crypto Liftoff258: You were warned repeatedly![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fb14db214-f259-4b31-b9e9-725b84dc4273%2Fapple-touch-icon-180x180.png)ARB LetterArbitrage Andy![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52d5bd17-6e88-42fa-9fb3-e797f13c2fdf_358x349.webp)](https://arbitrageandy.substack.com/p/meme-coins-and-crypto-liftoff) Admittedly, from the few times that I've tried trading I've learned that it is clearly not for me and that I absolutely have no talent for it. ## Tech & Web Dev ### The Fabulous Cartier Journey The digital gamification studio Merci Michel recently received recognition for their immersive and interactive web experience title "The Fabulous Cartier Journey" which is currently nominated for a number of awards. In the game players embark on a dreamlike adventure, taking control of a zeppelin and steering it through whimsical airy landscapes. The goal of each level is to collect gems and jewels that fuel the zeppelin and drive it forward for it to reach the Maison Cartier. These collected treasures then unlock exclusive product reveals: 0:00 /0:10 1× [Link to Tweet](https://twitter.com/MerciMichel/status/1777241344949256467?ref=gorillasun.de) If you're not familiar with Cartier, it's "**a French luxury goods brand that designs and manufactures high-end watches and jewelry**". Although I'm certainly not the target audience for the promoted products, I did enjoy playing through some of the first few levels of the game, I'm impressed by how smoothly it runs in the browser. ### Object structure in Javascript Engines Two weeks ago I shared an article about optimizing JavaScript (for fun and profit) in which one of the tips claims that the *shape* of your objects can have a direct impact on the performance of your code. This week I came across a talk from JSConf 2018 that shines some light on this issue: Mathias Bynens and Benedikt Meurer provide an insightful explanation on how JavaScript engines generally work, and also address how the engine's pipeline deals with objects: In a nutshell, JavaScript engines use a concept called shapes to improve the efficiency of property access. Shapes are essentially dictionaries that store information about the properties of an object, including the property names and their attributes (writable, enumerable, configurable). This allows the engine to quickly look up properties on objects without having to search the entire object every time - if shapes don't correspond then this optimization doesn't happen. The talk can also be found in form of an article here: [JavaScript engine fundamentals: Shapes and Inline Caches · Mathias Bynens![](https://mathiasbynens.be/favicon.ico)![](https://mathiasbynens.be/_img/js-engines/js-engine-pipeline.svg)](https://mathiasbynens.be/notes/shapes-ics?ref=gorillasun.de) ### The Debuggers Toolkit The prolific writer Addy Osmani, who you might also recognize as the person in charge of the Chrome Web browser, wrote an interesting article on Debugging. He provides us with a good overall recipe for debugging code: [The Debugger’s ToolkitUnderstanding the thoughtful art of debugging code![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5461e150-2b93-418a-b0b7-0499a1a2ac22%2Fapple-touch-icon-180x180.png)ElevateAddy Osmani![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f9d00f-f9e6-426a-8315-e0d5c3880aa3_6072x6072.jpeg)](https://addyo.substack.com/p/the-debuggers-toolkit) ### Andrej Karpathy implements GPT-2 in C Arguably the biggest news in AI from the past week is Andrej Karpathy's GPT-2 implementation in pure C – in less than 1000 lines of code! He announces his creation in this tweet of his with some further explanations in the threaded replies: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-14-at-22.55.01.png) [Link to Tweet](https://twitter.com/karpathy/status/1777427944971083809?ref=gorillasun.de) While it's an absolutely impressive feat of coding, it's even more impressive that he's open sourcing this project. ## Gorilla Updates There hasn't been much on my end this week - with a surprise family visit there hasn't really been that much time for other things. I did get a lot of writing done, some of which you'll likely see more of throughout the coming week. I did however dive back into my irregular puzzle grid algo (actual name tbd), and explored some geometric variations for the puzzle tiles: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/geometric-puzzle.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/notreally3d.png) I also tried putting a fake 3D spin on the puzzle tiles to see what it would look like, and it lead to an interesting perspective trick, in the image on the right sometimes it's not entirely clear if the tiles are indented inwards or protruding outwards. ## Music for Coding While I was binging the entire In Flames discography a couple of days ago, Spotify suggested that I listen to a band called Soilwork... and I haven't listened to anything else ever since. With soaring, epic melodies that seamlessly transition to thrashing riffs, it's quickly taken a spot in the roster of my favorite bands. The Swedish band is considered to be one of the other Melodic-Death-Metal Bands, besides In Flames, that is currently at the forefront of the genre: And that's it from me, hope you've enjoyed this week's curated list of generative art and tech shenanigans! Now that you've made it through the newsletter, might as well share it with some of your friends - sharing the newsletter is one of the best ways to support it! Otherwise come and say hi over on my socials! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 51Tuning Parameter Spaces with Machine Learning - Daizaburo Harada’s Artificial Lifeforms - 2024 Processing Fellowships - Buffer Overflow by Marcel Schwittlick - Tsubuyaki plotting tip by Zancan - Generative SVG mountain ranges by Pierre Casadebaig +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/GKVWkqBXsAEEsDc-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-51) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 51 URL: https://www.gorillasun.de/blog/gorilla-newsletter-51/ Last updated: 2024-08-15T08:05:26.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 51st issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Tuning Parameter Spaces with Machine Learning When creating long-form generative art, one of the more difficult parts of the process is the fine-tuning step. Balancing between a varied output space, while also steering clear from "duds", can often be a laborious endeavor and frequently boils down to spending a significant amount of time on sculpting and refining various parameter ranges. The difficulty of the task stems from the inherent complexity and high dimensionality of parameter spaces with many variables. In a generative artwork the different parameters that determine the final output usually have a **non-linear r**elationship: changes to one variable are not isolated and can have an unexpected effect on the outcome of other parameters down the line. A small tweak in one area might have drastic consequences for the final output, which makes it hard to predict the outcome of adjustments. Bjørn Staal, a repeat offender on this Newsletter, recently addressed exactly this issue over on TwiX; in a tweet of his he asks whether tuning these parameter spaces can be done with machine learning methods and if there have been attempts to do so. The replies give rise to a bountiful conversation around the topic, other artists pitching in with their own approaches towards the challenging task: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-09.35.45.png)](https://twitter.com/%5Fnonfigurativ%5F/status/1776181671433327041?ref=gorillasun.de) [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1776181671433327041?ref=gorillasun.de) One project that comes up in the conversation and that I was not familiar with previously is Ben Snell's Cattleya - a generative artwork that makes use of statistical shape modeling and PCA (Principle Component Analysis) to create a generalizable template for the shape of different types of Orchids. [Ill With Orchid FeverHow I channelled my obsession into an endless orchid generator![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumBen Snell![](https://miro.medium.com/v2/resize:fill:1200:632/g:fp:0.46:0.58/1*A0NTKP0eQrMhwvtFeBF23Q.jpeg)](https://bensnell.medium.com/cattleya-queen-of-orchids-7c943673d54f?ref=gorillasun.de) To give a brief summary, in 2021, Snell discovered a new passion of his when he began growing different kinds of Orchids in a corner of his NYC apartment. Learning more about this plant species, and becoming engrossed with how they grew inspired Snell to return to the canvas and rekindled his creative flame - ultimately leading to the creation of his generative artwork Cattleya that released on Art Blocks in May 2022\. In his write-up "Ill with Orchid Fever" he recounts this story and explains the process behind the generative system. How does PCA come into play here? And what actually is PCA? In a nutshell, PCA is a statistical technique used to reduce the number of variables (dimensions) in a dataset while retaining as much of the original information as possible. Snell's approach to modeling his generative flowers relies on a common template that has the ability to represent any of the emergent shapes, he explains: > There were two primary forms to model: the shape of flowers and the shape of foliage. I approached each form independently using a technique known as Statistical Shape Modeling. This approach is exactly what it sounds like: it uses statistics to model shapes, in order to make generalizations about them and generate new shapes from the same distribution. In simple terms, adding PCA on top of this template allows Snell to extrapolate a number of "control dials" that let him interpolate between different Orchid configurations. It's a fascinating and creative approach to tuning the output space of the artwork, in this setting, tuning the parameter space is made more tangible by reducing the number of parameters to tune. I highly recommend reading the article as it provides a more complete picture than I can provide here. Bjørn's tweet received other interesting replies, more than I have capacity to cover; but another interesting resource that I'd like to share is a paper titled "[Understanding Aesthetic Evaluation using Deep Learning](https://arxiv.org/pdf/2004.06874.pdf?ref=gorillasun.de)" which is accompanied by a presentation over on Youtube: The overarching questions of the paper is: *Can we use machine learning to model individual human aesthetic preferences?* While the approach is interesting, I don't see it as particularly useful for the average generative artist. A better title for the paper would likely have been *"*Using ML to rank and classify images according to aesthetics". Since the authors already had an annotated dataset for the occasion, it was easy to train a model on top, it doesn't seem very generalizable to other aesthetics and or projects however. The [Hacker News comment section](https://news.ycombinator.com/item?id=12793915&ref=gorillasun.de) for the article raises some interesting points as well, the top comment mentions an article by Jürgen Schmidhuber in which he presents an interesting perspective on the enjoyment and understanding of aesthetics, and that it has a lot to do with our ability to compress patterns and scenes: [![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-08-at-11.10.06.png)](https://news.ycombinator.com/item?id=12793915&ref=gorillasun.de) [Link to comment section](https://news.ycombinator.com/item?id=12793915&ref=gorillasun.de) ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-08-at-11.12.43.png) [Link to Page](https://people.idsia.ch/~juergen/creativity.html?ref=gorillasun.de) I think that much of our understanding of the world around us can be abstracted as mental process of compression. But lest this section becomes too philosophical, I'll cut it short here. What are your thoughts on this, and how do you personally go about fine-tuning your own generative artworks? While I'd argue that the approach is individual to every project, the ideas discussed here aren't necessarily just pragmatic approaches to more efficiently refine the output-space of a generative system, but could very well also be leveraged for creative purposes - to discover novel outputs that you wouldn't have necessarily been able to find fine tuning by hand. Make sure to check out the other replies in the discussion. ### Daizaburo Harada's Artificial Lifeforms Our favorite Japanese creative coder, Shunsuke Takawo, recently shared a resource that recounts some of the influential Japanese generative artists from the 70s leading up to the 21st century: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-12.49.58.png)](https://twitter.com/takawo/status/1776074992020832654?ref=gorillasun.de) [Link to Tweet](https://twitter.com/takawo/status/1776074992020832654?ref=gorillasun.de) | [Link to Page](https://dm.jagda.or.jp/?ref=gorillasun.de) While Hiroshi Kawano's artistry is widely recognized and needs no introduction, I'd like to highlight Daizaburo Harada's work, one of the other artists that is mentioned. Harada is most notably known for his "AL: Artificial Life" series that he release in 1993 Harada as a CG book (at a time where this was still a popular thing to do). The CG book depicted strange otherworldly creatures that Harada labeled as insects; I like to assume for emergent organic features that they presented: ![https://cdrom.ca/images/al/al-book-03.jpg](https://cdrom.ca/images/al/al-book-03.jpg) ![https://cdrom.ca/images/al/al-book-02.jpg](https://cdrom.ca/images/al/al-book-02.jpg) Not only are the aesthetics captivating (impressive for their time) but also the very interesting story behind the artworks. Apparently the creation process for these digital creatures involves sound as an input according to a few resources: "They were created using a novel procedural generation technique using audio waveforms as a seed" according to this [page](https://www.mobygames.com/game/182401/al-artificial-life-insects/?ref=gorillasun.de) on Moby Games. I would have loved to learn more about the process, but I couldn't really find more info. The only resource that gives a comprehensive historical recount of Harada's work is an article by [Misty De Méo](https://www.mistys-internet.website/?ref=gorillasun.de) via the CD-ROM Journal - I have to add here, that it is beautifully written: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-08-at-01.08.17.png)](https://cdrom.ca/games/art/2022/03/31/artificial-life.html?ref=gorillasun.de) [Link to Page](https://cdrom.ca/games/art/2022/03/31/artificial-life.html?ref=gorillasun.de) It honestly makes me a little sad that only little information can be found about Harada's work, and makes me wonder how many other artists and works have already been lost to the passage of time. ### Processing 2024 Fellowship Grants Last week the Processing Foundation kicked off the submission period for their 2024 Fellowship program - the application deadline for submitting your fellowship proposal is the *2nd of May, 11:59 PM EST.* If you're not familiar with the fellowship program, it's essentially designed to support a number of projects aimed at benefiting the community in a number of priority areas: > Our fellowship is designed to provide substantial support to individuals and groups within our community. This includes a $10,000 stipend, dedicated mentorship, skill-building workshops, public programs, and community engagement opportunities. Participation for the fellowship is entirely online and we invite applicants from around the world to apply. This year's theme is 'Sustaining Community: Expansion & Access', with the following 4 priority areas: Archival Practices: Code & New Media, Open-Source Governance, Disability Justice in Creative Tech, Access & AI. If you have ideas that might align with one of these priority areas, and want to learn more about the program, you can do so here: [FellowshipsThe Processing Foundation Fellowships support artists, coders, and collectives in visionary projects that conceive a new direction for what Processing as a software and a community can do. Fellowships are…![](https://processingfoundation.org/content/favicon.png)Processing Foundation Logo .logo-st0{fill:#9C4BFF;} .logo-st1{fill:#5501A4;} .logo-st2{fill:#D4B2FE;}![](https://processingfoundation.org/content/4-fellowships/saskia-project.jpg)](https://processingfoundation.org/fellowships?ref=gorillasun.de) In addition to that, a new partner program/development grant will be announced later, that is specifically aimed at software contributions towards the p5js library. ## Pen and Plottery ### Buffer Overflow by Marcel Schwittlick The plotter wizard Marcel Schwittlick has recently been experimenting buffer overflows, purposefully causing them in a vintage plotter of his, the HP 7475A, to create interesting and unpredictable artworks. Schwittlick explains how this is done in a post over on his website, and additionally showcases some of the artworks that came to be from this approach: [Marcel Schwittlick - Electronic Art | Buffer OverflowMarcel Schwittlick is a Berlin-based artist working across digital and physical mediums. His practice is rooted in algorithmic systems and computational aesthetics, primarily focused on work created with drawing machines (pen plotters). Schwittlick’s work often involves a unique process where cursor-lines, recorded over years, are transformed from digital traces into tangible analog artworks by using a variety of processes ranging from algorithmic drawings to generative photography.![](https://schwittlick.net/favicon.ico)Marcel Schwittlick - Electronic Art | Buffer Overflow![](https://schwittlick.net/img/buffer_overflow/2021-05-18%2019.00.36.jpg)](https://schwittlick.net/buffer%5Foverflow/?ref=gorillasun.de) Essentially, the buffer overflows are caused by skipping an important signal in the communication between the plotter and the interface that is sending the movement commands to it, namely the handshake. This handshake's purpose is generally to prevent these overflows from happening, for instance, when the plotter's memory capacity has no room to allocate and read the next instruction Essentially a waiting mechanism as far as I understand it. Why is it called a buffer overflow? When sending data without a handshake, the buffer might not have enough space available, the excess data then overflows and overwrites parts of memory outside the intended buffer. This can corrupt existing instructions, including those that the plotter is trying to execute, leading to an erratic behavior. Schwittlick shared a video over on TwiX, showing the plotter in action while it succumbs to a number of overflows: 0:00 /0:10 1× [Link to Tweet](https://twitter.com/schwittlick%5F/status/1776217108516405735?ref=gorillasun.de) ### Plotting Tips from Zancan Zancan shares an insightful tip to drawing filled circles with a plotter - circles in this setting are simply spirals in disguise! He also shares a short Tsubuyaki processing snippet: 0:00 /0:09 1× [Link to Tweet](https://twitter.com/zancan/status/1774900877981061144?ref=gorillasun.de) It's also worth checking out the replies that provide additional plotting tips and tricks. ### Slicing Surfaces Not a new tutorial, but last week I came across an article from Pierre Casadebaig in which he explains how to convert "topographical data into monochromatic ink sketches" bringing to life beautiful plottable mountainscapes that bear likeness to Matt DesLaurier's iconic Meridian: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-09.34.41.png)](https://warpcast.com/casadebaig.eth/0x88eaee44?ref=gorillasun.de) [Link to Cast](https://warpcast.com/casadebaig.eth/0x88eaee44?ref=gorillasun.de) | [Link to Tutorial](https://art.casadebaig.net/posts/process/dispyr/?ref=gorillasun.de) I also recommend checking out a more recent article of his in which he explores an alternative aesthetic for representing mountainscapes that is reminiscent of traditional Shan Shui paintings: [Paths | Pierre Casadebaig - Ridge RegressionPaths | Pierre CasadebaigPierre Casadebaig![](https://art.casadebaig.net/posts/process/ridge/img/reference/cozens1785.jpeg)](https://art.casadebaig.net/posts/process/ridge/?ref=gorillasun.de) ## Web3 News ### Keeping up with Farcaster Have you recently been active over in the Farcaster scene? Having trouble keeping up? Well, I don't blame you... here's a list of resources that I found helpful in making sense out of everything that's currently been happening on the purple platform: 1. If you're still confused about how the entire DEGEN thing works, or need a specific detail cleared up, Ryan J. Shaw wrote a [massive FAQ on DEGEN tipping](https://warpcast.com/rjs/0x2fcf11ac?ref=gorillasun.de) to answer all of your questions. 2. If you need to check your DEGEN allowance and how many tips you've received so far, [this frame](https://warpcast.com/nikolaiii/0xfbed5ab9?ref=gorillasun.de) by Nikolai does the trick. 3. Ombre developed a neat farcaster frame called [Farstats](https://warpcast.com/0mbre/0x47becf76?ref=gorillasun.de) (with an additional accompanying website) to keep track of your activity score as well as useful information about your followers/following. 4. With the increasing activity on Farcaster users have been quickly reaching their storage limits. With how Farcaster storage functions this has been raising concerns - here's a [cast by Dan Romero](https://warpcast.com/dwr.eth/0xa7eb1dbb?ref=gorillasun.de) in which he addresses the issue and explains the reasons behind how Farcaster stores casts. 5. Todemashi compiled a big filterable [list of the different NFT marketplaces](https://warpcast.com/todemashi/0xeb2f3f6a?ref=gorillasun.de) (a big chunk of them generative) over on Notion. ### Genesis on Foundation Over the past couple of weeks we've seen more and more platforms embrace a more efficient alternative to mainnet Ethereum, adopting the Base L2 chain with its affordable gas fees and speedy transaction times. Last week, Foundation followed suite, commemorating the Base integration with their Genesis group show, bringing back an iconic roster of artists for a series of 1/1 auctions on Base: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/02-1-.png) What's interesting about the Base integration is that it allows for an entirely new kind of seemingly 'real-time' bidding experience on Foundation: 0:00 /0:08 1× I've certainly been enjoying the new developments that Base has been enabling, it's interesting to see this kind of renaissance at a point when the "market" has been pretty much in the gutter for the longest time now - it's exciting to see things pick up again. ## Tech & Web Dev ### Google introduces Jpegli Google recently released Jpegli, a new image coding library that significantly improves how JPEG images are compressed. Jpegli encodes images faster and more efficiently, achieving up to 35% smaller file sizes at high quality settings according to the crowd survey that they ran on several image datasets. Google details how all of it works in their announcement post: [Introducing Jpegli: A New JPEG Coding LibraryJpegli, an advanced JPEG coding library that maintains high backward compatibility is faster, and more efficient, than traditional JPEG.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Google Open Source Blog![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDa_aWprUuwxdb9QLGHWUyUy_kkJfNhH4uj-04R3BCpOBk4TcmDCRQLYyWFXu3VqVV9m41R63WlpeGTPzuu1rI6D6LmdTcSLY5mgpwXud-8S2G9b8_CFJvBCux3YZ0QJa7MwCZXIEyb1naPhbN8Mpx2xwMyKZuBK9pQYCizBO_Xf6FzYekhd34EvjWsjk/w1200-h630-p-k-no-nu/OS-New-Library-for-Network-Optimization-social%20(1)%20(1).png)](https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html?ref=gorillasun.de) This seems to be quite innovative as it's essentially an upgrade to the already existing JPEG format without any sort of interference, or asking anyone to support yet another image format. Jyrki Alakuijala, one of the folks that worked on Jpegli, posted a bunch of comparison images over on TwiX that you can check out for yourself - I can't tell any differences but maybe an expert reader amongst can point out the differences for me: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-23.23.24.png)](https://twitter.com/jyzg/status/1622891538823929857?ref=gorillasun.de) [Link to Tweet](https://twitter.com/jyzg/status/1622891538823929857?ref=gorillasun.de) Overall, the jpegli images do however seem slightly crisper overall. Per usual, it was also highly entertaining to give the [Hacker News comments section](https://news.ycombinator.com/item?id=39920644&ref=gorillasun.de) a read, polarizing as always. ### Low Effort Image Optimization Tips On a similar note, here's an article by Lazar Nikolov from Sentry in which he lists some easy image optimization tips that you can take advantage of for optimizing the images displayed on your website: [Low effort image optimization tipsBoost your site’s speed with our guide on optimizing images. Learn about using AVIF, WebP, lazy loading, and more for faster, efficient web performance.![](https://blog.sentry.io/icons/icon-192x192.png?v=843baceb3011f83fdc90d4dc7d650a3e)Product Blog • Sentry![](https://images.ctfassets.net/em6l9zw4tzag/10t2l7OSgzXMmAlp2Nnz2f/d95a2175c1177ab9f2c800222e864f68/PerformancePageSketches__2_.jpg)](https://blog.sentry.io/low-effort-image-optimization-tips/?ref=gorillasun.de) If you didn't know, loading in heavy images with large file sizes can be a death toll to your website especially when it comes to SEO - search engines will automatically give you a worse ranking if your page takes more than a couple of milliseconds to load. When it comes to the Newsletter, I frequently don't optimize the images that I include since I don't care so much about SEO purposes as much as I do about deliverability - but I can demonstrate the tangible effect of this via the Brave Browser's Lighthouse tool; in the most recent issue of the Newsletter from last week, the diagnostics tell me that I could shave off a lot of loading time by simply reducing the image sizes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-23.53.58.png) One of the tricks that Lazar pitches, is using the HTML tag instead of the tag. It might not seem useful at first, especially since the srcset attribute is already a thing, but it provides greater control over how the browser serves images. While srcset lets browsers automatically decide which resolution of an image to serve, the tag goes a step further and allows for fallback options when the browser doesn't support a certain encoding format: [The picture element | web.devExercise more creative control over your images.![](https://www.gstatic.com/devrel-devsite/prod/v66c4dc9b65fea2172a0927d7be81b5b5d946ea60fc02578dd7c264b2c2852152/web/images/favicon.png)web.dev![](https://web.dev/static/images/social-wide.jpg)](https://web.dev/learn/design/picture-element?ref=gorillasun.de) ### The Unreasonable Effectiveness of Inlining CSS And while we're already talking about optimizing the load speed of our web pages, here's an article by Luciano Strika where he talks about inlining CSS to shave off a couple of milliseconds from his page load speed: [The Unreasonable Effectiveness of Inlining CSSA case study: I inlined CSS on the site and document how that impacted its loading times and traffic.![](https://strikingloo.github.io/potted-plant-icon-1.png)The Unreasonable Effectiveness of Inlining CSS/![](https://strikingloo.github.io/resources/preview-image-terrarium.png)](https://strikingloo.github.io/inlining-css?ref=gorillasun.de) Inline styles improve loading times because it eliminates the need for a separate network request to load the CSS file. It's definitely an awesome trick for simple sites that don't have much styling, but I wouldn't unnecessarily clog up the HTML files of a larger site that way. IMO, I think it can be viable to inline the styles that are unique to certain pages. ## Gorilla Updates What have I been up to this week? I would like to believe that I've been quite productive... shitposting over on Twitter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-10.08.54-1.png) [Link to Tweet](https://twitter.com/gorillasu/status/1775935294686232802?ref=gorillasun.de) But jokes aside, I came across these figures in a paper titled "[Straight-Skeleton Based Contour Interpolation](https://www.cs.jhu.edu/~misha/Fall13b/Papers/Barequet04.pdf?ref=gorillasun.de)" while researching how to simulate foam bubble structures - this paper doesn't actually have anything to do with the topic, but had some pretty cool figures (and might actually come in handy for some other generative tasks). I was exploring if there were methods for simulating foam/bubble lattices, here's what I've been working on that led me down this rabbit hole: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/GKKiAO1XUAAoApw.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/GKJ_QrHWgAAtxkF.jpg) The above patterns emerge from a simple algorithm that uses circle packings as a starting point, the Voronoi-esque diagram emerges when the individual circles in the packing are expanded/inflated such that they fill out the empty space around them, only stopping when two circumferences collide. This can be done via a particle based approach. The emergent patterns then reminded me of a top-down view of sea foam like structure, you know, when ocean waves smash against a cliff and then retreat again. Apparently it's not an easy task that has a straightforward algorithmic solution due to the complexity of the physics involved - we're actually treading into the realm of fluid simulation with this topic. Moreover, foam lattices are kinda strange, on the one hand they have very specific structural configurations but are also not entirely rigid; as foam bubbles come together they have the ability to relax into specific positions. Here's two photographs from pinterest that I found really mesmerizing; when pressed against a flat surface bubbles form a voronoi-like tesselation, in which the shared edges are not always perfectly straight: ![](https://i.pinimg.com/564x/5e/ba/1c/5eba1c90cc7afeb46023789d9733c851.jpg) ![](https://i.pinimg.com/564x/4c/76/3f/4c763f5b5ac7ceb2ef55b097bd508181.jpg) One paper that I found on the topic that describes a procedure for this is titled "[The immersed boundary method for two-dimensional foam with topological changes](https://jupiter.math.nycu.edu.tw/~mclai/papers/foam2Dtop%5Fcicp%5Frev2.pdf?ref=gorillasun.de)": ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-10.39.33.png) But I will need some more time to figure out if the implementation describe can bring me closer to the aesthetics I'm aiming for. On another note, I also explored circle packings in a different setting, revisiting an older idea, where we peek behind the canvas: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/dino-eggsss.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/dino-eggs.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/somewhere-down-below.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/something-down-below1.png) These sketches are made possible with the rendering context's clip function as well as some graphics buffer shenanigans. The emergent patterns are actually pretty cool, while I can totally visually interpret these as cutouts that let me peer onto another layer, the circles also almost look like 3D eggs of some sort. I'm excited to continue exploring this project! ## AI Corner ### Visual intro to Transformers 3Blue1Brown is back with another video, this time explaining the central mechanism that powers the LLMs of today: Transformers. Not much to say here, except that it's likely going to become the best introduction to the topic: ### AI and the Problem of Knowledge Collapse In the advent of LLMs, the increased usage of these models has led to concerns around a potential "information collapse" - this term is essentially descriptive of a situation where AI curates information for us, favoring common viewpoints; being trained on massive datasets, models tend to favor providing the most common information that lies somewhere at the center of their internal representations in addition to other sorts of biases that they might have. This could ultimately limit our exposure to diverse ideas and ultimately shrink the overall knowledge we access. A recent paper by Andrew J. Peterson tackles this issue: [AI and the Problem of Knowledge CollapseWhile artificial intelligence has the potential to process vast amounts of data, generate new insights, and unlock greater productivity, its widespread adoption may entail unforeseen consequences. We identify conditions under which AI, by reducing the cost of access to certain modes of knowledge, can paradoxically harm public understanding. While large language models are trained on vast amounts of diverse data, they naturally generate output towards the ‘center’ of the distribution. This is generally useful, but widespread reliance on recursive AI systems could lead to a process we define as “knowledge collapse”, and argue this could harm innovation and the richness of human understanding and culture. However, unlike AI models that cannot choose what data they are trained on, humans may strategically seek out diverse forms of knowledge if they perceive them to be worthwhile. To investigate this, we provide a simple model in which a community of learners or innovators choose to use traditional methods or to rely on a discounted AI-assisted process and identify conditions under which knowledge collapse occurs. In our default model, a 20% discount on AI-generated content generates public beliefs 2.3 times further from the truth than when there is no discount. Finally, based on the results, we consider further research directions to counteract such outcomes.![](https://arxiv.org/static/browse/0.3.4/images/icons/apple-touch-icon.png)arXiv.orgAndrew J. Peterson![](https://arxiv.org/static/browse/0.3.4/images/arxiv-logo-fb.png)](https://arxiv.org/abs/2404.03502?ref=gorillasun.de) It's interesting to see the opposing opinions on this issue, some argue that AI is simply a tool, and people will still be able to seek out the information they desire; new tools haven't necessarily made us less knowledgeable in the past. The debate over on hackernews highlights the importance of using AI responsibly and remaining curious in the face of an ever-evolving information landscape: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-06-at-13.39.18.png) [Link to Hackernews comment section](https://news.ycombinator.com/item?id=39946169&ref=gorillasun.de) ## Music for Coding I didn't listen to much music this week - but an artist that I just recently discovered really enjoyed was JW Francis. I found his tracks super uplifting with their retro indie vibes - in addition to some of the super fun riffs. I'm surprised that Francis doesn't actually have a bigger following, the music's quite awesome to be frank: And that's it from me this time, hope you enjoyed this week's curated list of generative art and tech shenanigans! Now that you've made it through the newsletter, might as well share it with some of your friends - sharing the newsletter is one of the best ways to support it! Otherwise come and say hi over on my socials! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 50Conway’s Game of Hope by Spacefiller - Emilie Xie on Textile as Personal Canvas - Connecting Worlds through the Browser feat. Bjørn Staal - Rheotomic Surfaces - Moebius-style post processing shader - upcoming genart shows +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/04/genpuzzzz.png)](https://www.gorillasun.de/blog/gorilla-newsletter-50) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 50 URL: https://www.gorillasun.de/blog/gorilla-newsletter-50/ Last updated: 2024-08-15T08:00:24.000Z **Welcome back everyone** 👋 **A heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 50th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. Needless to say, we're reaching a major milestone with this 50th issue of the Gorilla Newsletter! It's incredible to see how far we've come, and I want to express my gratitude to everyone who's been a part of this journey, whether you joined last week or from the very beginning - it means the world to me that you read these updates every week! We'll stick to our regular format with this issue, but keep an eye out for a special celebratory article coming later this week! That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Conway's Game of Hope Storytelling meets interactive tutorial in Spacefiller's digital fable titled "Conway's Game of Hope". Alex Miller brings to life a beautiful blend of Greek Mythology and Philosophy in form of a beautiful story that teaches you about Conway's famous Cellular Automata, the Game of Life: 0:00 /0:12 1× [Link to Tweet](https://twitter.com/spacefillerart/status/1774146196451537247?ref=gorillasun.de) Although Conway disliked the fact that the Game of Life became his most influential work, I truly believe that reading through Alex's fable would have most definitely made him reconsider his position towards the brainchild of his. I cannot express how much I love what Alex has managed to accomplish with his writing - it's not just a tutorial packaged in form of a narrative; but the manner in which the elements of the story tie back into the computational concepts behind the famous Cellular Automaton, in an almost allegorical manner, and how it is symbolical of the incomprehensibly infinite aspects of the game... simply a masterpiece! [![A screenshot of the linked article.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-31-at-03.37.36.png)](https://alex.miller.garden/game-of-hope/?ref=gorillasun.de) [Link to Conways' Game of Hope](https://alex.miller.garden/game-of-hope/?ref=gorillasun.de) Thinking about the philosophical aspects of the Game of Life often triggers a feeling of existential dread within me; wand with the vastness of mathematics in general, will we ever be able to discover all of its secrets? While we have just recently proved that Conway's Game of life is [Omniperiodic](https://www.discovermagazine.com/the-sciences/mathematicians-prove-the-omniperiodicity-of-conways-game-of-life?ref=gorillasun.de), there are still many mysteries that elude us. If you're going to read one thing this week, I recommend reading Conway's game of hope. If you're interested in learning more about Cellular Automata, from a generative art POV, I covered this in more detail in [issue 41 of the Newsletter](https://www.gorillasun.de/blog/gorilla-newsletter-41/). On this note, sometimes I really need to do my homework better - Spacefiller's interactive fable was actually part of the 3rd issue of the HTML review that I shared in last week's Newsletter - due to a lack of time I didn't manage to check out all of the showcase pieces, I'm certain that there's more than a few gems amongst them still. ### Emily Xie on Textile as Personal Canvas Look, I'm running out of ways to introduce Monk's articles... by now I probably must've written the phrase "This week, Monk's back with a stellar article..." on about 5 separate occasions - and yet again, this week, Monk's back with a stellar article. This time he's in conversation with Emily Xie, a generative and visual artist that you might better know through her groundbreaking Art Blocks Curated release [Memories of Qilin](https://www.artblocks.io/collections/curated/projects/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270/282?ref=gorillasun.de): [Emily Xie on Textile as Personal CanvasVisual artist Emily Xie spoke with Peter Bauman (Monk Antony) about her close relationship with textiles, their intersection with computation and coded generativity’s aesthetic pursuits.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/6603e08e8148e0937288d1b3_emily_xie_memories_of_qilin_235-min.png)](https://www.lerandom.art/editorial/emily-xie-on-textile-as-personal-canvas?ref=gorillasun.de) Together they dive into the historically intimate relationship of textile works and machines; recounting how the Jacquard loom played an important role in the evolution of the modern computer as one of the first devices that made use of punch-cards. Moreover they also juxtapose and compare the analogue qualities of textile works with the sterile nature of machine art - and how Emily bridges between the two with her generative art. I'll leave you here with an article about the Jacquard Loom, because it is fascinating piece of history: [Programming patterns: the story of the Jacquard loom | Science and Industry MuseumThe Jacquard loom ties together two of Manchester’s most important historic industries: textile manufacturing and computing.![](https://www.scienceandindustrymuseum.org.uk/themes/smg_msi/apple-touch-icon.png)Science and Industry Museum![](https://www.scienceandindustrymuseum.org.uk/sites/default/files/styles/social_facebook/public/2019-06/Jacquard-cards-1.jpg?h=b69e0e0e&itok=EfUsqDib)](https://www.scienceandindustrymuseum.org.uk/objects-and-stories/jacquard-loom?ref=gorillasun.de) ### Connecting Worlds through the Browser A few months ago Bj*ø*rn Staal broke the internet with a viral Tweet of his, with over 10 Million views, it currently reigns supreme as the most viewed generative art tweet in history: 0:00 /0:24 1× [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1727322594570027343?ref=gorillasun.de) The tweet showcases an experimental artwork that transcends the browser window - in the literal sense of the word - to connect with another instance of itself in an adjacent one, such that the two particle blobs entangle with each other. I initially covered Bj*ø*rn's tweet in [issue 32](https://www.gorillasun.de/blog/gorilla-newsletter-32/) of the Newsletter, if you're curious to learn a bit more about the technical aspects of the experiment. *So, how's a tweet from November 2023 news, Gorilla?* Bj*ø*rn recently shared that he had done an interview with Fakewhale back in December prior to the release of his [Art Blocks Curated project *Immaterial*](https://www.artblocks.io/collections/presents/projects/0x99a9b7c1116f9ceeb1652de04d5969cce509b069/481?ref=gorillasun.de). The interview completely flew under my radar, but I found it well worth re-sharing, since it focuses on some of the happenings that happened in the tweet's aftermath as well as Bj*ø*rn's perspective on them: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-14.42.11.png)](https://twitter.com/%5Fnonfigurativ%5F/status/1772970171470062013?ref=gorillasun.de) [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1772970171470062013?ref=gorillasun.de) | **Sorry for making you jump through hoops and not linking directly to the interview - but spam assassin flags the Newsletter if it contains certain domains with an xyz extension.* New considerations have emerged around open source culture; especially with the rising popularity of generative art and the monetization thereof, there's a noticeable bigger hesitance from artists to open source their projects' code - similarly to how a magician doesn't reveal his secrets, generative artists are less willing to share their tricks nowadays. Following the viral Tweet, Bj*ø*rn received many blunt requests asking directly for the source code behind Entangled - with the majority of them likely not genuine requests. [In a humorous manner he did eventually make the code public](https://twitter.com/%5Fnonfigurativ%5F/status/1729411738708107743?ref=gorillasun.de). Bj*ø*rn comments on the matter: > I try to share code when I think it can be of value to others in a range of different contexts. \[...\] I think it’s amazing to see others rehashing concepts that I developed as long as I feel they bring something new to the table. But it is an interesting issue, I see many interesting innovations and powerful algorithms come to life in generative art, especially in computer graphics, many of which will likely never be made public, which is a shame considering the educational value. This is in addition to Open Source culture already being in a precarious state, it quite often is a thankless job with little to no compensation - but who's to blame? We are victims of our own System - an interesting issue in that regard was the HashiCorp controversy from last year: [Open Source is Dead: Understanding the HashiCorp License Controversy | HackerNoonHashiCorp’s controversial switch from open source to “source-available” licensing has reignited debates on open-source sustainability and business models.![](https://hackernoon.com/favicon.ico)Hackernoon logoSal Kimmich![](https://hackernoon.imgix.net/images/RHANbxrXjsYoxIMTyKJFleCFJyC3-hh93xm3.jpeg?mark-pad=0&mark=http://hackernoon.imgix.net/HackerNoon%20Rounded%20Horizontal.png?w=400)](https://hackernoon.com/open-source-is-dead-understanding-the-hashicorp-license-controversy?ref=gorillasun.de) While we're on the topic of interviews — here's a thread that I started over on Farcaster where I asked folks to pitch their favorite generative art interviews; there were quite a few that I hadn't seen before, so if you're looking for some more reading material this week I recommend you check out some of the links people have left in the replies: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-30-at-13.10.16.png) [Link to Thread](https://warpcast.com/gorillasun/0xaebb90d3?ref=gorillasun.de) ### Rheotomic Surfaces I've recently been exploring alternative coordinate systems, as a means to discover new kinds of shapes and patterns that I wouldn't otherwise come across so easily while working within the regular Cartesian coordinate framework. During my search, scouring Pinterest, I came across a number of interesting flow diagrams: ![ ](https://spacesymmetrystructure.files.wordpress.com/2009/02/diaglines-converted.jpg?w=510&h=510) ![ ](https://wewanttolearn.files.wordpress.com/2014/11/final-print122.jpg) The diagrams linked back to articles about the notion of "Rheotomic Surfaces". Learning more about them, they are a type of mathematically generated surface defined by their “flowable” and “cut” properties. The name itself originates from the Greek words “rheo” which means flow and “tomos” which means cut or section. In simpler terms, Rheotomic surfaces are smooth, ‘walkable’ 3D structures that give rise to interesting 2D flow diagrams. Daniel Piker discusses the mathematical concept in more detail in one of his articles, and explains how they find their way into Architecture; he references a work from the 1960s titled "The function of the oblique" by Claude Parent and Paul Virilio, where these kinds of structures are explored in a functional setting: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-12.13.51.png) ![ ](https://bravedrawnworlddotnet.wordpress.com/wp-content/uploads/2015/11/claude-parent-paul-virilio-function-of-the-oblique-11.jpg?w=470) [Link to Article](https://spacesymmetrystructure.wordpress.com/rheotomic-surfaces/?ref=gorillasun.de) You can essentially imagine these surfaces as constructs in which traveling upwards and downwards between floors, is possible without requiring stairs - simply by virtue of the smoothly curved surface. Are they practical? Probably not. What about satisfying Feng-Shui requirement? We'll have to consult an expert on the matter. While I was first drawn in by the generative aesthetics of the emergent flow diagrams, I found the underlying mathematical concepts and the philosophical approach to architecture equally inspiring. These surfaces also find application in fluid dynamics, but the Math thereof eludes me at this point. ### Moebius-style Post Processing Shader Maxime Heckel is back with another deep-dive, this time showing us how to code a post-processing shader that emulates the aesthetics of Jean Giraud work: [Moebius-style post-processing and other stylized shaders - Maxime Heckel’s BlogA detailed essay on the process of building a post-processing stylized shader reproducing the style of legendary artist Jean Giraud a.k.a Moebius for your React Three Fiber projects. In it, I detail the process of drawing outlines with a Sobel Filter as well as custom shadow and lighting patterns to bring a unique style to your WebGL scene.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/2bfb7849828624d59eee96d4591a381b.png?v1)](https://blog.maximeheckel.com/posts/moebius-style-post-processing/?ref=gorillasun.de) If you're not familiar, Giraud is famous for his fantasy and science fiction comics that he's created under the pseudonym of Mœbius - more specifically for his distinct drawing style: [![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-05.48.33.png)](https://en.wikipedia.org/wiki/Jean%5FGiraud?ref=gorillasun.de) [Link to Wikipedia](https://en.wikipedia.org/wiki/Jean%5FGiraud?ref=gorillasun.de) Maxim's article is inspired a video from Useless Game Dev, that also shows us how to recreate ta similar Moebius aesthetic in Unity: ## Upcoming Group Shows + Fluffhead's Art Collector Corner We've got a whole slew of group shows coming up in the next weeks - and it's been a bit dizzying trying to keep up with all of them. To preface this, I wanted to give a little shoutout to Fluffhead Chaser who's recently launched a new site, specifically geared towards helping collectors keep track of new releases: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-30-at-11.58.34.png) [Link to Cast](https://warpcast.com/fluffheadchaser/0x5b4017d8?ref=gorillasun.de) | [Link to Art Collector's Corner](https://www.artcollectorscorner.com/upcoming-1?ref=gorillasun.de) The main feature of the new site is a curated launch calendar that lets you filter through the releases on different platforms and blockchains. This way Fluffhead does the heavy lifting and adds new releases to the calendar whenever they get announced. Moreover, the design's clean and straight to the point, without any additional fluff. I thought it was a great initiative, and I'll definitely be checking in whenever I'm putting together the Newsletter. I certainly have been missing out on a bunch of releases whenever my social feed decides to not show them to me. And that brings to the main topic of this section - some of the upcoming/ongoing group shows during April that I'm personally quite excited about 👇 ### Atelier's Visual Poetry Following their first fxhash group show back in December of last year, the duo Pixel Symphony and Aether are back with another awesome line-up of artists. Based on some of the teasers that the participating artists have shared, the up-and-coming digital exhibition titled "Visual Poetry" will to a large extent revolve around generative approaches to typographic designs, emphasizing the visual nature of poetry: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-30-at-11.17.35.png) ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/poetryy.jpg) [Link to Tweet](https://twitter.com/Pixel0Symphony/status/1773745538355306582?ref=gorillasun.de) | [Link to Announcement Page](https://www.atelierart.io/visualpoetry?ref=gorillasun.de) Poetry embodies a dual nature as an art form - certain artistic elements only truly flourish when spoken aloud, resonating throughout the sonic realm. Simultaneously however, it maintains an artistic visual essence on the page, encapsulated within its written form. This parallels code art - the code that is working behind the scenes is in many ways as artful of a creation as the graphics that it conjures to the digital canvas. In that manner code-art also has such a dual nature. This is why I found the topic of Atelier's show really interesting, I'm excited to see all of the works once they're released. A couple of interviews have also been published over on Atelier's site, if you're curious to learn more about some of the artists that are involved: [In Search of ‘Random Access Memories’A Conversation between Rapha and Æther CavendishBonjour Rapha, would you share a bit about yourself and your journey into generative art?I grew up during a time dominated by analog technologies, only encountering computers in my late childhood and early teens. Despite this late introduction, I always had a strong passion for creation and understanding how things work. This drive led me to pursue Computer Science in my academic journey, eventually venturing into the multimedia industry during the![](https://static.parastorage.com/client/pfavico.ico)Atelieræther Cavendish![](https://static.wixstatic.com/media/4ec7e3_9544034d4aca48ef997e39d128d12bc2~mv2.png/v1/fill/w_1000,h_950,al_c,q_90,usm_0.66_1.00_0.01/4ec7e3_9544034d4aca48ef997e39d128d12bc2~mv2.png)](https://www.atelierart.io/post/in-search-of-random-access-memories?ref=gorillasun.de) Make sure to mark your calendars - Atelier's group show is bound to start on the 9th of April over on fxhash. ### Let it Flow by Alba Launching concurrently to Atelier's, Alba announced their next group show "Let it Flow" for the 10th of April - as you might've already guessed from the title, this time it's going to be all about our beloved flow field: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-29-at-22.41.56.png) ****If you're a generative artist, and have a flow field based piece at the ready, you might want to apply to Alba's open call!** | [Link to Thread](https://twitter.com/AlbaDotArt/status/1773743680777507148?ref=gorillasun.de) If you've dipped your toes into generative art you're likely familiar with the notion. And by now, flow field type sketches have become somewhat clichéd - it's a technique that is often explored by beginners. The story behind why this is the case, is actually quite an interesting rabbit hole - or maybe it's just a theory of mine - but I would dare to say that flowfields wouldn't be as popular as they are if Processing and P5JS hadn't made the conscious decision to include Perlin noise as a readily available part of their software toolkit; Perlin noise being a common method to achieve the flow field aesthetics. Historically, the backstory here is a bit longer though, so maybe in another post. As for the projects that will release on Alba, they are in no way cliché, from what I've seen in some of the teasers they all successfully put a fresh spin on the concept. I'm especially looking forward to Juhani's piece, since I'm a big fan of his! ### TEXTScape Group Show on Zora This one isn't entirely generative art based, but some cool generative artists are participating in it such as Julian Hespenheide, Pixelfool, and ertdfgcvb (if you're not familiar, "ertdfgcvb" is the artists' name, I didn't just have a stroke on my keyboard). And who doesn't love ASCII Art? [TEXTSCAPE: ASCII Art, Textmode & its derivatesIntroducing TEXTSCAPE, an online ASCII art and textmode exhibition presenting the contemporary wave of character-based digital artworks. ˜”\*°• 𝗔𝗥𝗧𝗜𝗦𝗧𝗦 •°\*”˜ cap’n elle ertdfgcvb Goto80 Julian Hespenheide L444U MEK.txt p1xelfool Raquel Meyers V5MT 1mposter Curated by Vienna Kim & Benoit Palop. (★ω★)/![](https://zora.co/api/thumbnail/8453/0xf505e3a5fdca911e38c02cfd555d5e05bae73caf)![](https://zora.co/api/thumbnail/8453/0xf505e3a5fdca911e38c02cfd555d5e05bae73caf)](https://zora.co/collect/base:0xf505e3a5fdca911e38c02cfd555d5e05bae73caf?ref=gorillasun.de) I recommend checking out some of the pieces and supporting the artists, they're quite affordable. ## Farcaster: here for the long run? It's been absolute madness over on Farcaster - a big wave of internet friends are currently in the process of leaving TwiX behind - for good - and joining the new and budding decentralized social network. My concern is that the generative art community is becoming more and more fragmented, many have already left Twitter in favor of Mastodon back in 2022 when the first talks about Elon's takeover emerged - a good portion of those that have switched over never turned back to TwiX, and I can't blame them for it. Then with Threads launching, we saw another such wave of people jumping ship - and the same thing is happening again with Farcaster. The difference right now with Farcaster is that it genuinely has a lot more to offer than the other platforms, especially when it comes to the needs of generative artist. The current debacle revolves around the hyper financialization of the platform that's mainly due to the inherent tipping mechanism of the platform that is happening via the DEGEN token. If you want a quick catch up of the situation, I recommend checking out Kaloh's post on the topic: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-14.55.26.png)](https://warpcast.com/kaloh/0x89ab01d7?ref=gorillasun.de) [Link to Cast](https://warpcast.com/kaloh/0x89ab01d7?ref=gorillasun.de) In a nutshell, DEGEN is a digital token that is currently being distributed for free via an interesting allowance mechanism, that lets people tip each other simply via a specific reply command. Naturally, the financial incentive is currently a big driving factor in on-boarding new users and fueling the platform with constant activity - but what happens once the taps run dry, and it's back to simply being a social network? Sure it will still be a social platform with Web3 superpower, but will that be enough to retain users in the long run? ## Tech, Web Dev, and AI ### Optimizing Javascript Usually I'm not a big fan of list articles, you know, the kind that's something like "10 tips to optimize your JavaScript code" or "10 things you didn't know about JavaScript" - it usually is the case that they provide little to no value if you're not an absolute beginner. The optimization tips in this article by romgrk article however, were quite insightful. romgrk provides an expert analysis of how the JavaScript runtime engine actually processes our code and even goes as far as providing benchmarks for each one of the tips: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-30-at-13.37.26.png) [Link to Article](https://romgrk.com/posts/optimizing-javascript?ref=gorillasun.de) Although it's no news to me that declarative programming is in fact much slower than the imperative approach, one thing that I genuinely didn't know before was that the shape (the structure and property order) of your JavaScript objects can have an impact on performance: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-02.31.37.png) Why is that the case? This is related to the notion of monomorphism, not in the setting of Object Oriented programming, but from a code structuring POV - an iconic article that rmgrok metions is by Aleph from quite a while ago: [What’s up with monomorphism?![](https://mrale.ph/favicon.ico)![](https://mrale.ph/images/2015-01-11/v8-vs-ox.png)](https://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html?ref=gorillasun.de) ### Coding games like it's the 80s Back in the 80s, if you wanted to play video games you had to program them yourself. Conveniently there was many a book and magazine then that outlined the code for specific games. With her YouTube video, Kari takes us back in time and shows us what it was like to program one of these games on the Sinclair ZX Spectrum: Towards the end of the video Kari points out that Usborne, the publisher of these books actually uploaded many of these over on their website making them freely accessible in PDF format. I recommend checking them out, even if you just briefly flip through them, the books themselves are in many ways eye-candy: [![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-03.08.03.png)](https://usborne.com/books/computer-and-coding-books?ref=gorillasun.de) [Link to Usborne Website](https://usborne.com/books/computer-and-coding-books?ref=gorillasun.de) ### 20 Years of Gmail Exactly 20 years ago today (1st of April) Google launched their mailing service. What people assumed would simply be an April Fool's joke by Google, since they offered much more than the competition at the time, turned out to become the main email provider used around the world - in 2024 it has over 1.8 billion active users. The Verge recounts the story of it all, not only how it has become an official communication channel, but also in many ways a sort of digital record for people's lives and identity: [20 years of GmailWill it still be here in another 20 years?![](https://www.theverge.com/icons/apple_touch_icon.png)The Verge![](https://cdn.vox-cdn.com/thumbor/BucC5UyRIZ_T0u_e3lBA4vKkB9E=/0x0:1750x1167/1200x628/filters:focal(875x584:876x585)/cdn.vox-cdn.com/uploads/chorus_asset/file/25357916/247048_Gmail_20_Years_1750_NLittle.jpg)](https://www.theverge.com/24113616/gmail-email-20-years-old-internet?ref=gorillasun.de) I remember creating my first address - quite late all, things considered - back in 2012 (I just checked actually, it was the 10th of May 2012). I remember making it so that I could sign up to Facebook and hang out digitally with all of my friends after school. I don't use that particular address that often anymore, with an inbox that's telling me I have 18 thousand unread messages (mostly marketing newsletters and spam) I should maybe at some point go through it and archive the important ones in an external hard drive. ## Gorilla Updates ### Find me on Hypersub For all of you folks that are currently exploring Web3, I've got an exciting announcement to make: last week I launched my very own Hypersub! ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-04.11.21.png) ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-04.27.32.png) [Link to Cast](https://warpcast.com/gorillasun/0xb2076edb?ref=gorillasun.de) What's Hypersub, you ask? It's basically like Patreon, but in a decentralized format. It lets creators mint a subscription token that supporters then can collect to get access to some perks (perks are basically like Patreon rewards). In my case, these perks come in the form of Airdrops and token gated content over on paragraph. Airdrops are simply digital art tokens sent directly to the wallets of subscription token holders. Here's one of the tokens that I'm sending out this month - you might remember it from last week's Newsletter actually: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-04.39.47.png) [Link to Zora mint page](https://zora.co/collect/base:0x36a640abba81f89b53bee8eff70c8cb0070995b7/1?ref=gorillasun.de) Besides these airdrops, I'm also offering access to exclusive pieces of writing published over on paragraph, which makes it possible to token gate content. A token gate is essentially a decentralised version of a paywall - in a nutshell, if you hold the subscription token you can read the exclusive articles. I actually published the very first one just yesterday evening: ![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-04.20.21.png) No worries though, I'll bring all of these articles over to the blog - that is, once I finish the revamp. I knooow, it's taking a long time... but it's very close now! I can sense it. At most 2 more months! Reading all of this back to myself, it might be a lot to take in - what implications does this announcement have on the Newsletter? None! Nothing's going to change with the Newsletter, it'll resume going out every Monday sometime around noon CEST, with the same content format. If you're interested about the stuff that I just wrote about but Web3 stuff is still new to you, you can reach out to me and I'd be happy to chat - either via my socials or email, but preferably my socials. On that note, I've also been having a lot of fun over on Farcaster, more and more of my genart friends have joined the platform in the past week. Launching my Hypersub I also decided to start a channel of my own for all Gorilla Sun and generative art related things: [![ ](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/04/Screenshot-2024-04-01-at-05.19.56.png)](https://warpcast.com/~/channel/gorillasun?ref=gorillasun.de) [Link to Channel](https://warpcast.com/~/channel/gorillasun?ref=gorillasun.de) If you're on Farcaster, come by and say hi! ## Music for Coding Remember the Pyromaniacs game from the early 80s? Me neither, because it never existed - but it's OST is very real! Heavily inspired by the Shadowrun games for the Sega Genesis, Slowerpace crafted a fictitious sound track for a game that never was - also making use of the original art for the album cover: That's it from me this week, hope you enjoyed this week's curated list of generative art and tech shenanigans - now that you've made it through the newsletter, you might as well share it with someone that you know who might enjoy this kind of *content* \- sharing the newsletter is one of the best ways to support it! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 49Demystifying Generative Aesthetics by Le Random - Santiago Ortiz peers into the mind of ChatGPT - The HTML Review - WTBS in conversation with Erick Calderon - Highlight Studio - CSS Flexbox vs. CSS Grid +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/03/Hypersub-Token-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-49) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Monthly 1: All about Hypersub URL: https://www.gorillasun.de/blog/gorilla-monthly-1-all-about-hypersub/ Last updated: 2024-06-22T11:02:59.000Z In this issue we have a closer look at Hypersub, a decentralized and Web3 flavored Patreon alternative: what it is, how it works, how to set up your own, and how to manage your airdrops with interoperable services! _This post is for subscribers on the Hypersub tier only._ ### Gorilla Newsletter 49 URL: https://www.gorillasun.de/blog/gorilla-newsletter-49/ Last updated: 2024-03-25T12:19:35.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 49th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **Before we get started* \- for some reason last week's newsletter was intercepted by many a spam filter, I don't know exactly why, and it's the first time that this happens. My hunch is that I might have used some words that the spam filter doesn't like, which I'll be more careful with in the future.* *If you got a second to check your spam folder and mark the Newsletter as 'not spam', that would actually help tremendously! It sends a positive signal and helps improve the overall deliverability of the Newsletter!* That said, **I hope that you're all having a great start into the week! L**et's get into it! 👇 ## All the Generative Things ### Demystifying Generative Aesthetics Among the very first videos that I've watched on generative art is Tyler Hobbs' iconic talk at Clojure Con 2018 'Code goes in, Art Comes out'. He begins his presentation with a number of loaded questions: [![A screenshot of Tyler Hobbs talk at Clojure Con 2018 where he shows a slide in which he asks some important questions about what makes for interesting art.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-24-at-12.12.34.png)](https://www.youtube.com/watch?v=LBpqoj2nOQo&ref=gorillasun.de) I need to be careful what I'm saying here, interesting art is kind of a loaded term, what does that mean exactly? | [Link to Youtube video](https://www.youtube.com/watch?v=LBpqoj2nOQo&ref=gorillasun.de) What actually makes for an interesting artwork? And more specifically, what makes for an interesting *generative* artwork? Are the requirements different just because it's made with code? This question bothered me for a long time because there isn't really a clear cut objective answer to it - in some cases I can't even explain to myself why I feel drawn to a particular artwork or why it evokes something inside of me — "Ugh, you know, the colors are nice, and stuff" That's why I've really fallen in love with Monk's article on this topic from a couple of months ago, titled 'Demystifying Generative Art', he hypothesizes a framework for the analysis, evaluation and appreciation of generative art: [Demystifying Generative ArtPeter Bauman (Monk Antony) develops a framework for appreciating and analyzing generative art through an investigation of the movement’s locus of artistic intent.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/64b80a26a2fd5b2f287e7e39_Screenshot%202023-07-19%20at%205.06.29%20PM.png)](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) Generative art is quite a unique artform when compared to other art practices, and that's primarily due to the artist not directly creating the artwork, but rather a *somewhat* autonomous system that is in charge of *generating* the actual outputs. This gives rise to new evaluation criteria: should we now place emphasis on the qualities of this system? Or the process that goes into the creation of this system? Both? Neither? Maybe the system isn't so important after all, and what truly matters is still the final result that comes out on the other end - after all, that's in many cases the only thing that the audience will ultimately interact with. Each one of these questions can be leveraged as a unique angle of analysis - a lens as Monk calls them - to further examine what makes for an interesting generative artwork. While Monk's pilot article focused on introducing a potential framework, the second installment places emphasis on the aesthetics, and examines the criteria to evaluate them: [Demystifying Generative Aesthetics‍This is the second part in a series on building a framework for appreciating generative art. In the first part, “Demystifying Generative Art,” Peter Bauman (Monk Antony) builds the case for such a framework. In this essay, he takes a closer look at one of the five framework components, Results—the outputs of a generative system. Peter spoke to Tyler Hobbs, Kim Asendorf, Andreas Gysin, Leander Herzog, Erick Calderon, William Mapan, Lauren Lee McCarthy, Sougwen Chung, Christiane Paul, Patricio González Vivo, Linda Dounia and Golan Levin for the piece.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/651c4b639ee9c037fbbbd6c8_Fidenza575.png)](https://www.lerandom.art/editorial/demystifying-generative-aesthetics?ref=gorillasun.de) Monk explains that we require a mixed approach, we not only need to consider traditional design principles, but also modern, digital, criteria - particularly the algorithmic considerations that are unique to generative art. Whether you're a generative artist, a collector, or simply someone that is interested in the art form, these are essential reads, and a great deal can be learned from Monk's insightful writing. As always I thoroughly enjoyed it, and am eagerly awaiting the next installment! ### Inside the Machine Santiago Ortiz recently shared a data visualization experiment which made quite the ripples over on Twitter - by asking ChatGPT to complete the same prompt "Intelligence is" hundreds of times and subsequently visualizing the results with an interesting interface, he enables us to peer into the mind of the smart text generator: 0:00 /0:23 1× [Link to Tweet](https://twitter.com/moebio/status/1770861652566479101?ref=gorillasun.de) | [Link to demo](https://moebio.com/mind/?ref=gorillasun.de) I believe that this could be an interesting exploratory tool to examine the output space of an LLM. I often find that I have to tune my input prompts to guide the answers that the chatbot returns, and nudge them into a satisfactory direction. It's pretty much trial and error. This also just makes me realize how slow LLMs still are, all things considered, having this kind of tool run in real-time could be a game changer. Beyond that, I think that it reveals something more profound about LLMs, and it's humbling really. Seeing the outputs exposed in such a manner does ultimately exemplify that they're simply text generators, albeit very powerful ones they merely complete input sequences. If you were to repeatedly ask a person to complete the phrase "Intelligence is", they'll likely tell you off and to stop pestering them with stupid questions after the third time. ### The HTML Review The HTML review describes itself as an *annual journal of literature made to exist on the web.* Edited by Maxwell Neely-Cohen and Shelby Wilson, it strives to collect and showcase web-based experiments and experiences that act as story-telling devices. After being drawn in by the intriguing circular design shown in the tweet, I quickly realized that I had stumbled upon a treasure trove of internet art: ![A screenshot of an image showing the HTML review](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-22-at-17.22.33.png) [Link to Tweet](https://twitter.com/nhyphenc/status/1770084424870244444?ref=gorillasun.de) And it reminds me a lot of NET art; many of the showcased projects make me feel the same way, almost as if you're going through someone's diary, intimate experiences where the authors share their stories with you. While I didn't have too much time to dig into all of the showcased projects, my personal highlight was this web essay by Garry Ing, where the interactivity of the page ties into its narrative: [a view source webreflections on view source by Garry Ing. the html review, spring 2024![](https://viewsource.info/favicon.ico)Garry Ing![](https://viewsource.info/img/preview.png)](https://viewsource.info/?ref=gorillasun.de) Recounting the history of the *view source* button that every web browser now makes readily available, he lets us simultaneously inspect the HTML tags of the elements that make up the essay's page. I highly recommend giving it a read! Beside this, if you have a cool project of your own that goes in this direction, you might want to pitch it to the HTML review. In their about section they elaborate a bit what kind of projects they're generally looking for: > We especially love when the subject matter of a piece has nothing to do with the web or technology, but the medium is merely a means to further the story and poetry. ### P5JS' New Website P5JS's new website is bound to launch this spring, and for the occasion they're currently accepting submissions from the community to later showcase on the website when it eventually comes out. Submissions are open until the 31st of March, and need to be submitted to the respective curation over on [Openprocessing](https://openprocessing.org/?ref=gorillasun.de): ![Screenshot of p5js announcement tweet](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-24-at-23.18.47.png) [Link to Tweet](https://twitter.com/p5xjs/status/1768806810734260330?ref=gorillasun.de) | [Link to Openprocessing Curation](https://openprocessing.org/curation/87594?ref=gorillasun.de) An important detail that you might miss if you don't check the tweet's replies is that you should also use the [describe()](https://p5js.org/reference/?ref=gorillasun.de#/p5/describe) function that lets you add a screen-reader accessible text to your canvas creation: ![screenshot of p5js tweet asking to use the describe() function in the submissions](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-25-at-01.26.47.png) [Link to Reply](https://twitter.com/p5xjs/status/1768806812487463373?ref=gorillasun.de) ## Web3 News Maybe it's just me, but the past couple of months have been absolutely bonkers in terms of web3 and generative art. First we've had fxhash's launch on Ethereum at the end of 2023, and then more recently its Base integration earlier this month, then we also had Art Blocks' announcement of acquiring Sansa and their plans on greatly expanding their eco-system, and all of that while Highlight is dropping banger after banger, culminating in the largest generative art collection in history with Zancan's Aux Arbres. That is to say that it's overall been an incredibly exciting time in the space, and it seems that things are moving forward really quickly! ### WTBS in Conversation with Erick Calderon We've all been eagerly waiting for the newest episode of the WTBS podcast after they teased it a couple weeks ago - this time, they're in conversation with Erick Calderon, aka Snowfro, who's probably best known for being one of the founders of Art Blocks. In their conversation they ask him all about the recent acquisition of Sansa, and what it means for the future of Art Blocks: [![Screenshot of WTBS podcast episode with Erick Calderon](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-23-at-12.03.20.png)](https://podcasters.spotify.com/pod/show/waitingtobesigned/episodes/Building-The-Next-Wave-of-GenArt-Lovers-Interview-with-Erick-Calderon-e2hb0nh/a-ab3a9hf?ref=gorillasun.de) [Link to Episode with Erick Calderon](https://podcasters.spotify.com/pod/show/waitingtobesigned/episodes/Building-The-Next-Wave-of-GenArt-Lovers-Interview-with-Erick-Calderon-e2hb0nh/a-ab3a9hf?ref=gorillasun.de) The acquiry of Sansa is mainly motivated by Art Blocks desire to cater to the collectors that lean towards a more data-driven approach to collecting, while wanting to remain a art-forward platform at the core. Sansa was originally built around Art Blocks and already has all of the tools to provide such an experience. Beyond that, Art Blocks will however remain a curated platform even with this expansion, artists will still need to apply and get a stamp of approval before being able to release their project on the platform - and for a good reason as there's just too many problems with a completely open approach. Erick states "I don't have the courage to be an open platform" Another thing that really came through in the conversation, is that we're still incredibly early; we're at the very forefront of something that's going to be much bigger in the future. The generative art scene is still very much a niche when compared to other spaces, Erick gives a good example of this, consider how many iphones are sold every year by Apple - a whopping 232 million in 2023 - compared to the 2 million generative art NFTs that have been sold overall, as Erick estimates. But despite this, I'd wager that NFTs are here to stay and no longer just an experimental new technology, especially when I see what the different players in the field are currently building, how they're innovating, and how the eco-system is becoming more interoperable. > \[20:37\] Getting your work timestamped on the blockchain is critical right now, don't be disappointed and don't be discouraged with the market, get it out there because you are staking your place in history prior to the day where I can go to ChatGPT and ask it "Please, build me the entire Art Blocks platform with 75 projects of great variety"\[...\] ### An Update from fxhash Ciphrd recently posted a big announcement over in the fxhash discord, explaining why it might appear from the outside that the platform has been somewhat inactive, and why it's been necessary to take some time to regroup and figure out how to rebuild a strong foundation and clear all of the tech debt that the platform has accumulated over time: [![Screenshot of Ciphrd's announcement in the fxhash discord](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-23-at-19.56.25.png)](https://discord.com/channels/900333075509149767/909081044932788295/1219693204279136517?ref=gorillasun.de) [Link to discord announcement](https://discord.com/channels/900333075509149767/909081044932788295/1219693204279136517?ref=gorillasun.de) Ever since its inception fxhash has grown incredibly quickly, both in terms of platform features as well as in terms of community size. Emerging from the remnants of the hicetnunc community towards the end of 2021, many generative artists quickly flocked towards the open platform that enabled them to publish their work in a web-native manner. And I remember, it was so wonderfully chaotic in the early days, for instance, you had to wait a couple of hours for the minter to come through and reveal what had been minted. In those early days it absolutely made sense to build out the platform very quickly, and iterate rapidly to cater towards what its audience wanted - how many platforms have we already seen completely lose momentum and find their end of service earlier than expected? Even if it means that things will slow down momentarily, I honestly believe that it's for the best to take some time, clear all of the technical debt and deliver a more refined fxhash experience. Especially considering that the scene has become more competitive. I for one, am eagerly awaiting the new design and am excited to dive into the new version of fxhash when it comes out. ### Highlight Studio This piece of news completely flew under my radar last week - but Highlight released their proprietary tool for aiding artists in developing their generative projects for the platform: Highlight Studio. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-25-at-03.19.50.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-25-at-12.05.37.png) [Link to Thread](https://twitter.com/Highlight%5Fxyz/status/1768350905613668426?ref=gorillasun.de) Although I haven't tried it yet, apparently there's two ways to use it; either directly from the highlight website where you simply drop in a link to your project running on localhost, or by downloading it as a script and including it in your project where you have more functionalities to play with. You can find more information about it over on Github: [generative-art/HLSTUDIO.md at main · highlightxyz/generative-artContribute to highlightxyz/generative-art development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubhighlightxyz![](https://opengraph.githubassets.com/18712a8a76ad50532bf0ffd9ad9741317f786200aae1f4d6e5f222f8c591048d/highlightxyz/generative-art)](https://github.com/highlightxyz/generative-art/blob/main/HLSTUDIO.md?ref=gorillasun.de) ## Tech & Web Dev ### CSS Flexbox vs. CSS Grid Choosing between CSS Grid and Flexbox is a common web design dilemma. While the CSS Flexbox comes in handy for one-dimensional layouts and is super useful for arranging items linearly in a row or column, CSS grids on the other hand let you tackle two dimensional layouts more easily and allow for a more precise positioning of elements. There's many scenarios where both could be used interchangeably, which often gives rise to the age old debate on which one should be used. Christine Vallaure recently published a deep-dive into exactly this topic, explaining both methods in detail, illustrating what each one is good for, and all of that in a way that is specifically geared towards UI designers who might not program the interface themselves: [Why UI designers should understand Flexbox and CSS GridOr bye bye, 12-column grid layout![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)UX CollectiveChristine Vallaure![](https://miro.medium.com/v2/resize:fit:1200/1*k64zdk6Y8nTjBXo5Emn1jQ.png)](https://uxdesign.cc/why-ui-designers-should-understand-flexbox-and-css-grid-e236a9dec37a?ref=gorillasun.de) The most interesting part of the article is towards the end, where Vallaure addresses the usage of breakpoints in conjunction with these layout methods, enumerating a number of scenarios where the use of breakpoints is acceptable. for instance, whenever a more radical change of the layout is desired, or a component needs to completely change in appearance. Recently, in modern, modern web design (not a typo) there's been a trend towards more fluid design that tries to avoid breakpoints as much as possible, ditching them in favor of *fluid* design approaches that can self-sufficiently adjust to different viewport sizes. A prime example for this is Utopia's fluid approach to scaling font sizes to different viewport widths respectively - covered in issue 47 of the newsletter. Might the future of responsive web design be breakpointless? But anyway, kudos to Christine for putting together this great resource. Here's also another cool article on the two methods that I thought was put together really well: [When to use Flexbox and when to use CSS Grid - LogRocket BlogLearn about which of the CSS layout systems, CSS Flexbox or CSS Grid, is best for your project according to what designs you prefer.![](https://blog.logrocket.com/wp-content/uploads/2019/06/cropped-cropped-favicon-196x196.png?w=180)LogRocket BlogLeonardo Maldonado![](https://blog.logrocket.com/wp-content/uploads/2020/04/css-flexbox-vs-css-grid.png)](https://blog.logrocket.com/css-flexbox-vs-css-grid/?ref=gorillasun.de) ### A Formula for Responsive Font-Size Last year when I migrated the blog over to Ghost I decided on using one of the free themes that they provide, namely the [solo](https://ghost.org/themes/solo/?ref=gorillasun.de) theme - now the blog looks a lot different than what you see in the theme, since I made quite a few modifications in the meantime. When I first popped the theme into my code editor to try and make sense of what's going on in the CSS, and trying to make an adjustment to the size of the text I was met with the following line: ```CSS --content-font-size: clamp(1.7rem, 0.38vw + 1.4rem, 2rem); ``` For the longest time I couldn't really make sense out of this line, but thinking about it for a second now, it actually makes sense, and turns out to be a cool trick to achieve somewhat responsive font sizes. In CSS, a *rem*, short for “root-em”, is simply a relative unit of measure that's used for defining font sizes as well as other element dimensions, and is usually based on the font-size of the root element. Most browser will usually default it to 16px although users can change that influence this from the settings. Similarly, the vw term is a viewport width relative measure, a percentage essentially - 10vw would basically be equivalent to 10% of the viewport width. Combining these two notions, we get the above line: basically a *formula* that makes the font-size grow and shrink depending on the overall width of the viewport, naturally also clamping it to a maximum and minimum value as well. I'm bringing all of this up because I recently came across this post by James Fisher where he talks exactly about this in a bit more detail: [A formula for responsive font-sizeThis CSS is now part of most websites I make:![](https://jameshfisher.com/assets/jim_128.png)jameshfisher.com![](https://jameshfisher.com/assets/jim_512.jpg)](https://jameshfisher.com/2024/03/12/a-formula-for-responsive-font-size/?ref=gorillasun.de) The comments over on Hackernews bring up some good points though, since users often set the root font-size themselves for an ideal reading experience, or have vision problems, it might be a bad idea to override this with a CSS rule like that when a specific font-size is desired. But I'm not certain which is right or wrong, maybe using breakpoints in this scenario might not be too bad after all: [![Screenshot of hackernews comment section](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-25-at-02.50.58.png)](https://news.ycombinator.com/item?id=39682871&ref=gorillasun.de) [Hackernews comments](https://news.ycombinator.com/item?id=39682871&ref=gorillasun.de) ### The State of the Terminal Gregory Anders published a companion article to a talk that he gave at Neovimconf 2023, titled 'The State of the Terminal' and with it he takes us back in time showing us some of the historical problems terminal based applications have had to deal with and how they were overcome before explaining how modern terminal emulators tackle these issues: [State of the Terminal | g.p. andersThis is a companion article to my talk at Neovimconf 2023\. I have been using Vim/Neovim as my full time text editor for close to 10 years. I’ve spent a lot of time in the terminal and have become very aware of the many flaws and idiosyncrasies of this bizarre platform. But I also think it gets a lot of things right! And I’m not alone in this belief: terminal based tools are still widely popular even in the presence of many alternatives (the StackOverflow developer survey shows that Neovim is the “most loved” editor 3 years in a row).![](https://gpanders.com/apple-touch-icon.png)g.p. anders![](https://gpanders.com/img/DEC_VT100_terminal.jpg)](https://gpanders.com/blog/state-of-the-terminal/?ref=gorillasun.de) If you prefer a video format, a recording of the talk can be found here: ## Gorilla Updates ### RE:designing the Blog This week I made some big progress on the redesign, and finally feel very confident about being able to complete the re-design in a reasonable amount of time. There's still a lot of details that I need to figure out to set myself up with a sustainable system, and there's still many pages that I still need to tackle. But, the heart-piece, the article template, is shaping up really nicely and close to completion now - here's what it currently looks like with a fancy dark mode as well: 0:00 /0:22 1× And since we talked about the CSS Flexbox earlier, this new design solely relies on a Flexbox driven approach: the entirety of the page is contained within a big Flexbox, containing the vertical navigation bar on the left hand side (itself a vertical column flexbox), and the page content on the right that in turn nests other Flexboxes. Why not use CSS grids though? Well because I never really learned how to use it, and never felt the need to so far, I have yet to run into a scenario where I'm not able to make the layout that I want with a Flexbox - although I will admit that sometimes there probably are many parts where it would make more sense to use a grid instead. I'm also really happy about how the sidebar turned out; instead of solely applying a blur to the background when it expands, giving it an additional slightly transparent background color makes its contents much more readable imo - and it works both in light and dark mode: 0:00 /0:19 1× Hoping to make more progress in the coming days. Let me know what you think so far! What are some of the things you'd like to see on the new website? Any features in particular? I still also need to consider a lot of accessibility issues, so let me know if any of you guys have specific requirements in that regard. ### SDF Shenanigans I've also found the time to experiment a little more with SDFs, here's one that came out really nicely - although it's just a bunch of circles rotating around a central point, it almost feels like it's a 3 dimensional thing, and it's not actually very clear if the floating orbs are represented by the colored area or the negative empty space: ![Animated gif of seven orbs rotating around the center](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/mySketch-10-.gif) Initially I dismissed the sketch as being boring, but after posting it to Twitter and seeing that it got a bunch of likes I had another look and thought that it actually was pretty cool with an unintentionally interesting effect. This one was actually not the initial sketch that I had made that day. Earlier in my session I was playing with the `Math.exp()` and `Math.log()` functions in JS, since I rarely ever use them, leading to the emergence of the following a meta-ball-esque sketch: ![Animated gif of orbs rotating around the center and melting into each other.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/mySketch--3-.gif) ### Letter packing made Easy And yet other thing that I tackled head on this week was letter packing; or font packing... or text packing - I'm not entirely sure what to call it, might be important to figure that out for SEO purposes. But the idea basically revolves around loading in a font file, then writing a bunch of letters to the canvas using that font, and later on jumbling them up and packing them on the canvas so that they don't collide. Here's something I made with it: [![screenshot of a tweet showcasing the letter packing example](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-23-at-17.31.47.png)](https://twitter.com/gorillasu/status/1770834206693757004?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1770834206693757004?ref=gorillasun.de) I've had the idea for a long time, but I never actually tackled it because I knew it would be tedious to write the code for it - and it was, but it's not actually that complicated, just quite lengthy. A big part of it is OpenType.js, that lets you easily load in fonts, and also lets you get the paths of individual letters (glyphs) as vertex arrays. Coupling it with a collision strategy makes it possible to *pack* them on the canvas. I'm already in the process of writing about this idea and will likely release as my first premium content piece! If you're interested in packing shapes I recommend checking out this post of mine: [An Algorithm for Polygon IntersectionsIn this post we’ll work our way towards an algorithm that can compute convex polygon intersections. We’ll also a method for intersections between axis-aligned rectangles, a function that can determine the intersection of two line segments, as well as a point in polygon test.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/thumb2.png)](https://www.gorillasun.de/blog/an-algorithm-for-polygon-intersections/) ## Music for Coding Well there's really only one piece of music that I can share this week, and it's Tycho's Awake for the occasion of it's 10th anniversary: I remember the first time listening to it in my bedroom around 2017-2018, I was completely blown away. At the time I wasn't a big fan of electronic music, but listening to Tycho really made me do a complete 180 on that. I've listened to the album countless times now and I really recommend you give it a listen, works especially well while coding. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-22-at-17.24.24.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-22-at-17.25.53.png) [Link to Tweet](https://twitter.com/ISO50/status/1766572272020496779?ref=gorillasun.de) And that's it from me this week, hope you enjoyed this week's curated list of generative art, web3 and tech shenanigans — now that you've made it through the newsletter, you might as well share it with someone that you know who might enjoy this kind of *content* \- sharing the newsletter is one of the best ways to support it! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 48Generating the Alphabet by Amy Goodchild - Fragment: a Web Environment for Creative Coding - Generative Music in Blender - Words of Advice from Kika Nicolela - Dave Bollinger’s Pixel Spaceships - We Love the Art Contest Winners - Obsidian’s Infinite Canvas file format +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/03/dazemaze-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-48/) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 48 URL: https://www.gorillasun.de/blog/gorilla-newsletter-48/ Last updated: 2024-03-18T10:51:12.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 48th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Generating the Alphabet by Amy Goodchild Amy Goodchild recently published a new article over on her blog, in which she explores a generative approach to creating hand-written letter forms: [Generating The Alphabet — Amy GoodchildMy current generative artwork-in-progress includes text, but I don’t want to use a font. In browser based art work, using a “web safe” font could produce inconsistent results, while including a font file would mean a large file size. Additionally, I don’t want a visual element of the project to be s![](https://images.squarespace-cdn.com/content/v1/5f33cddd6aff255aabb0c6cd/1598285066323-AE6AS241FTS6QP3C4OA6/favicon.ico)Amy GoodchildAmy Goodchild![](http://static1.squarespace.com/static/5f33cddd6aff255aabb0c6cd/5f37d09b551f154577577f01/65eddf08b483da6034c6b0b8/1710504277038/typographybanner.png?format=1500w)](https://www.amygoodchild.com/blog/generating-the-alphabet?ref=gorillasun.de) In the past I've also incorporated text in some of my sketches, but it always felt a bit off to use an external font when everything else is generative - so I completely understand why you'd want to also make the font itself generative. Amy achieves this by representing the letters as a set of paths that are subsequently smoothed and deformed with a bunch of helper functions that she details in the article. The resulting *hand-written* aesthetic is spot on imo! This generative alphabet is part of her latest generative project, of which she's shared a number of WIPs over on Twitter already - they've been eye catchers every single time. From what's revealed, it seems to be a generative system for apophenic diagrams, and the variety of layouts that's been shown so far is quite impressive: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-02.37.28.png) [Link to Tweet](https://twitter.com/amygoodchild/status/1763543110179590310?ref=gorillasun.de) But why stop at generative letters? Another cool part of the project is the use of word2vec to generate semantically related words for the labels and markers that occur throughout the diagrams. If you're not familiar, word2vec is a technique used in NLP (Natural Language Processing) that lets you attribute words with a semantic score and groups them together according to that score - it then lets you easily fetch semantically similar words: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-18-at-01.04.03.png)](https://twitter.com/amygoodchild/status/1754172947525193915?ref=gorillasun.de) [Link to Tweet](https://twitter.com/amygoodchild/status/1754172947525193915?ref=gorillasun.de) Overall, I'm super excited to see where the project goes, and maybe we'll get another write-up once the it's released! I did experiment with something a bit similar earlier this year, where I had an idea of packing numbers on the canvas - the numbers shown here are also simply represented as paths/vertices, then placed with an algo that checks for collisions between the paths, I thought that the outputs turned out pretty nicely but weren't really all that interesting without additional elements: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/two-trying-to-escape.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/backtothedrawingboard.png) I'm curious to see what these would look like with letters instead of numbers 🤔 If all of this has made you curious about generative letter forms, I highly recommend also checking out what Daniel Catt's been up to lately - he's been working on turning his plotter into a journaling assistant and documenting the journey over on his Substack: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-18-at-10.33.10.png) [📙 #030 - Arts-Based Research, may contain swearingWhat actually is arts-based research, what am I researching, am I going to get Kitty to do all the work (yes), and some fancy journaling page layouts, plus swearing.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf7afe8-faf2-45f6-a369-638b2d09f43a%2Fapple-touch-icon-180x180.png)The Dan Catt Pen Plotting NewsletterDaniel Catt![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19e404a-4fe0-4b5b-872a-86449c8c8a6d_2048x1365.jpeg)](https://newsletter.revdancatt.com/p/030-arts-based-research-may-contain?ref=gorillasun.de) And while we're talking about diagrams and apophenia, I coincidentally also came across a tweet by the genart OG Paul Prudence, in which he shares Benjamin Bett's *Mathematical Models of Consciousness*, which immediately struck me to have aesthetic similarities with Amy's project: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-03.35.03.png)](https://twitter.com/MrPrudence/status/1769112769041969308?ref=gorillasun.de) [Link to Tweet](https://twitter.com/MrPrudence/status/1769112769041969308?ref=gorillasun.de) Also very reminiscent of Aleksandra Jovanić's work in [Chromatlas](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de), Benjamin Betts spent a significant chunk of his life exploring the representation of the "evolution of human consciousness" via geometric diagrams\- I don't know enough about Betts work to be able to comment on it, but my only thought here is that the diagrams are pretty gorgeous. I found this article that shines some light on his endeavors, but doesn't however elucidate according to what principles Betts created his diagrams: [Geometrical Psychology: Mathematical Models of Consciousness by the 19th-Century Psychologist Benjamin Betts“Imagination receives the stream of Consciousness, and holds apart and compares the different experiences.”![](https://i0.wp.com/www.themarginalian.org/wp-content/uploads/2021/10/cropped-tm_site_icon-1.png?fit=192%2C192&ssl=1)The MarginalianMaria Popova![](https://www.themarginalian.org/wp-content/uploads/2012/11/benjaminbetts00.jpg?fit=600%2C315&ssl=1)](https://www.themarginalian.org/2012/11/20/geometrical-psychology-benjamin-betts/?ref=gorillasun.de) ### Raphaël Améaume's Fragment I featured Raphaël Améaume in an earlier issue of the newsletter, when he published his brilliantly designed [personal portfolio](https://raphaelameaume.com/?ref=gorillasun.de). Raphaël recently popped up on my timeline again, announcing that he's joining Polar with the aim to find support in the development of the creative coding environment that he's currently building: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-03.38.42.png)](https://twitter.com/raphaelameaume/status/1767842403547807999?ref=gorillasun.de) [Link to Tweet](https://twitter.com/raphaelameaume/status/1767842403547807999?ref=gorillasun.de) And it turns out that it's actually a super cool tool; easily installed with npm, and if you're familiar with p5 you should have no difficulty spinning up a sketch and get started with exploring some ideas. The first thing you'll notice when you access the local server on which fragment runs the sketch, is the control panel that sits next to the canvas preview and offers a number of useful toggles and sliders. For instance it useful controls to create captures of your work on the fly. Raphaël has actually been developing Fragment for a couple of years now, prior to making it open for the public in September of 2022\. The project initially came to be as a personal tool for exploring his own ideas as well as developing client projects: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-02.38.51.png) [Link to Tweet](https://twitter.com/raphaelameaume/status/1565324043267497986?ref=gorillasun.de) If Fragment looks interesting to you, I recommend checking it out and supporting Raphaël over on Polar if you end up using it for your own projects. Polar is essentially a Patreon-like subscription platform for open source projects, just like Raphaël's Fragment: [Introducing Fragment, a web development environment for creative codingFragment is a web development environment for creative coding. It works with any external libraries using a HTML canvas. It can export a canvas to images and videos and can also be deployed online. From a quick prototype to a complex experience, Fragment facilitates the creation process by providing a fast and reliable environment to work with.![](https://polar.sh/favicon.png)raphaelameaumeraphaelameaume![](https://7vk6rcnylug0u6hg.public.blob.vercel-storage.com/meta-PDpagMqGBEANUb8k5QQdJSJPeeierH.png)](https://polar.sh/raphaelameaume/posts/introducing-fragment?ref=gorillasun.de) ### Generative Music in Blender Sione Teumohenga, that goes under the artist name Lonelyspeck, recently shared an audio experiment that unconventionally makes use of Blender as a sonic playground: by moving sound sources rapidly past the viewport (the camera) sounds are pitched up and down when they approach and then distance themself from the user again: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-01.46.53.png)](https://twitter.com/lonelyspeck/status/1768981293235343500?ref=gorillasun.de) [Link to Tweet](https://twitter.com/lonelyspeck/status/1768981293235343500?ref=gorillasun.de) This is due to the Doppler effect that takes place in this scenario, if you're not familiar, the Doppler effect is essentially the change in frequency of a wave that an observer experiences due to the relative motion between the observer and the source of the wave. In simpler terms, it's how the sound or light you hear from a moving source can change pitch or color depending on whether the source is moving towards you or away from you. I found a cool visualization for the effect here, fittingly the simulation that's shown in the video is also made with Blender (although I was looking for an explanation of how sound waves are *actually* simulated in Blender): A classic example for this is the change in pitch of a siren as an ambulance approaches you and then recedes. As the ambulance gets closer, the sound waves get bunched up, making the pitch higher. Then, as it moves away, the waves spread out, causing a lower pitch. I'm actually impressed that Blender is capable of simulating spatial audio in this manner, if anyone can educate me on how that works. I assumed that in games they simply reduce the volume of a sound source the further away it is, but I'm probably quite wrong on that. In any case, super interesting exploration by LonelySpeck - I'm excited to see what comes from it! ## Sign Up to the Newsletter **Reading this in the Browser? Receive the Newsletter directly in your inbox every Monday!* Sign Up Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ## Web3 News ### Words of Advice from Kika Nicolela Kika Nicolela has been an artist and filmmaker for over 20 years, been exhibited numerous times around the world and has contemporarily become one of the leading voices in the NFT art space - in a recent long-form Tweet of hers she addresses the downward trend of the market and the overall low morale of the community due to it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-01.54.02.png) [Link to long-form Tweet](https://twitter.com/kikanicolela/status/1768984489475104930?ref=gorillasun.de) A bit later in her tweet Kika explains that art sales in the traditional setting are much, much rarer when compared to what we've seen so far in Web3\. And this has lead to us acquiring a distorted perception of what makes a successful project - apparently works need to sell out in a matter of minutes and in gigantic quantities for them not to be considered failed projects. When this isn't really what this space is actually about after all: > The concept that we should release an art piece and sell out in minutes is, imo, a distortion of this space. Maybe we should appreciate what we have here: a new way of spreading, communicating and selling our art. And that expands our realm of possibilities of surviving as artists. And I really couldn't agree more. I've addressed the issue before, that bragging about how fast something sells is a problem, and should not be a metric for quantifying the worth of an artwork. If you're a collector that cares about these stats, then sure it's important, but the artistic discourse should not really revolve around it. This is especially detrimental to artists, where the only take-away they get is that "your art is not good because it didn't sell" instead of more meaningful feedback. And we're still hyper fixated on sales, even in the midst of the deepest bear market - just as Kika puts it, the space isn't really about that, it's never been about the sales, but rather about the community, the art, the conversation as well as the interesting experiments that we're able to do with the wonderful new tech. It might be easy to think that an engaged audience ensues from big sales, and although it works for some projects and artists, it's generally the exception and not the norm. I believe that it mainly works the other way around - you put yourself out there, connect with people, exchange ideas, whether you're an artist, collector, or builder, and then success comes over time. Most of the successful artists that I follow do exactly that - they show up everyday and share their art and ideas. Maybe this extended bear market that we're experiencing right now isn't such a bad thing after all, weeding out all of those that are just in it for a quick buck. Personally, I feel very enthusiastic about the future of the space, there's still so many cool things popping up every single day! ### Dave Bollinger's Pixel Spaceships I don't consider myself a big collector, but every now and then I come across a project that I just can't pass up on, for instance Dave Bollinger's Pixel Spaceships that released last week on fxhash. And at 4 tez it felt like an absolute steal, I was lucky to snag two mint tickets before the project minted out in the following hours after: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-16.23.51.png) If you're not familiar with Dave Bollinger, he's a generative art OG having been part of the scene since the mid-2000s. Pixel Spaceships doesn't only impress with the variety of its aesthetics, but also with historical value as Frederik Vanhoutte points out in a tweet of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-16.28.14.png)](https://twitter.com/wblut/status/1767304207097315529?ref=gorillasun.de) [Link to Tweet](https://twitter.com/wblut/status/1767304207097315529?ref=gorillasun.de) If you're curious about the systems behind an artwork like Pixel Spaceships, and want to learn how Dave conjures pixelated spaceship shapes onto the canvas, I recommend checking out the detailed write-up that he's made for the project over on his personal site (where you can also find writings about other projects of his): [PixelSpaceships — Dave Bollinger![](https://images.squarespace-cdn.com/content/v1/65bfb4dd3014452b13d7c4a0/fea78526-e7fe-4b5c-8295-90635e11b617/favicon.ico?format=100w)Dave Bollinger0![](https://images.squarespace-cdn.com/content/v1/65bfb4dd3014452b13d7c4a0/ac7e6599-93d1-48e8-b7d2-75b24854d6ad/PixelSpaceships1800x400.png)](https://www.davebollinger.us/pixelspaceships?ref=gorillasun.de) ### We Love the Art Contest Winners Towards the end of last year the Optimism foundation (an Ethereum L2) held an NFT contest titled "We Love the Art" that receiving over a whopping 7000 submissions for the three categories of AI art, generative art and music that the contest was held on. But the results are out, and the winners have been announced, with quite a few interesting creations in the lineup - you can read all about it here, including some of the motivations behind holding such a large scale contest: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-12-at-10.07.49.png)](https://nftnow.com/features/optimism-foundation-we-love-the-art-winners/?ref=gorillasun.de) [Link to Article](https://nftnow.com/features/optimism-foundation-we-love-the-art-winners/?ref=gorillasun.de) One of the most notable generative artworks in the line-up are 0xfff's 'You are Here' that transcends a single blockchain and actually bridges across 31 of them! The tokens' artwork is actually directly influenced by their blockchain traversal history - there's a nice little thread by IMG.ART that explains it in a bit more detail here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-18-at-00.35.13.png) [Link to Thread](https://twitter.com/imgdotart/status/1765419983733920108?ref=gorillasun.de) ## Web & Tech ### Obsidian's infinite Canvas file format If you're not familiar with Obsidian, it's probably the most powerful and versatile note taking app that's currently out there. And it's free to use as well! I use it on a regular basis for all sorts of organizational purposes, as well as for drafting up ideas for new posts and projects on the fly. It comes with a bunch of powerful features out of the box that elevate it beyond a simple note taking app, for instance a graph view that lets you see how your notes are interconnected, and which resources reference each other. But beyond those features, what makes Obsidian great is its philosophy - a really insightful long-form tweet by Andrej Karpathy (the AI legend) explains this in a bit more detail: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-21.49.16.png)](https://twitter.com/karpathy/status/1761467904737067456?ref=gorillasun.de) [Link to Tweet](https://twitter.com/karpathy/status/1761467904737067456?ref=gorillasun.de) One of Obsidian features that's pretty cool and recently got an interesting upgrade is their infinite canvas, that lets you organize notes and other types of media in logical flows, which is often used to plan out things that might require a more involved layout: ![Obsidian 1.0 for desktop and mobile](https://obsidian.md/images/canvas/canvas-hero.png) They recently released a unique JSON-like file format to represent this infinite canvas, replacing the .canvas format that was previously used. This means other infinite canvas applications can now adopt this format and can in that manner become interoperable - here's Obsidian's announcement tweet where you can learn more about it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-13-at-11.06.17.png)](https://twitter.com/obsdmd/status/1767232042226647326?ref=gorillasun.de) [Link to Tweet](https://twitter.com/obsdmd/status/1767232042226647326?ref=gorillasun.de) | I'm not sponsored by Obsidian, it's just a really great tool! ### A mega-guide to organizing your CSS Since I've been working on a new design for the blog, I've been battling against an ever increasing pile of messy CSS files where I'm spending most of my time just moving things around and renaming classes in the attempt to make things just a smidge more organized and maintainable for my future self. While researching if there were actually any organizational philosophies for CSS I came across this massive resource from the MDN Web docs that goes over all of the dos and donts: [Organizing your CSS - Learn web development | MDNThis is the final part of our building blocks module, and as you can see there are many ways in which your exploration of CSS can continue from this point — but now you can go on to testing yourself with our assessments: the first one is linked below.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building%5Fblocks/Organizing?ref=gorillasun.de) One of the tips introduces us to OOCSS, which stands for Object Oriented CSS, and just as the name suggests it's a CSS methodology that relies on Object Oriented principles for structuring different classes in a style sheet. It's kinda really smart actually, and most of the mistakes that it strives to avoid are things that I am 100% currently doing in my own CSS. For instance, it advises to avoid location based styling and encourages a separation between the styling of containers and their content. OOCSS was pioneered by Nicole Sullivan in 2008, so I'm only 16 years late to the party, but it seems that modular approaches to CSS are still relevant in modern web development: [Organize CSS with a Modular Architecture: OOCSS, BEM, SMACSSBye-bye spaghetti code! Learn how to organize your CSS architecture using foolproof methodologies like OOCSS, BEM, and SMACSS. Result? A scalable, modular CSS architecture.![](https://snipcart.com/favicon-180x180.png)SnipcartClaudio Mendonca![](https://www.datocms-assets.com/48401/1628645190-devdensm-2x.png?auto=format&fit=max&w=1200)](https://snipcart.com/blog/organize-css-modular-architecture?ref=gorillasun.de) ### Bluesky Open Sources its Moderation Tools While it's the absolute wild west out here on Twitter, Bluesky is in the process of open sourcing Ozone, their collaborative moderation tool that allows users and teams to come together and create custom moderation approaches to the content that's posted across the network - they detail how all of this works in this announcement post: [Bluesky’s Stackable Approach to Moderation - BlueskyToday, we’re open sourcing Ozone, a tool that lets a team of moderators or curators collaboratively review reports, create labels, and inspect content on the atproto network. Later this week, we’re opening up the ability for users to run their own independent moderation services.![](https://bsky.social/about/images/apple-touch-icon.png)Bluesky![](https://bsky.social/about/images/social-card-default-gradient.png)](https://bsky.social/about/blog/03-12-2024-stackable-moderation?ref=gorillasun.de) Although Bluesky looks like a cool place to be, I simply don't have the bandwidth to be on yet another platform, maybe at some point in the future I'll actually try and be more active over there. ### A Question of Probability I came across a super intriguing poll by Daniel Litt in which he asked who was more likely to win a game of chance based on flipping coins. The rules of the game are described in the following Tweet (think about it for a second and then make your pick): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-01.44.56.png)](https://twitter.com/littmath/status/1769044719034647001?ref=gorillasun.de) [Link to Tweet](https://twitter.com/littmath/status/1769044719034647001?ref=gorillasun.de) To me it intuitively seemed that Alice had an advantage, since in my mind she'll be rewarded for consecutive sequences of Hs, but it seems that this is in fact not the case - in reality Bob is more likely to win this game: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-23.10.42.png) Now you might ask why that is? Well, I can't actually tell you why, but Juha Karttunen made an interesting visualization for the outcome of a million games played with varying numbers of consecutive tosses: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-23.16.25.png)](https://twitter.com/jkarttunen/status/1769315908701261842?ref=gorillasun.de) [Link to Tweet](https://twitter.com/jkarttunen/status/1769315908701261842?ref=gorillasun.de) ## AI Corner ### First AI Software Engineer by Cognition Cognition introduces the very first AI software engineer: Devin! In a showcase video they present us with an LLM powered AI agent that has access to a code editor, a terminal as well as a browser, and makes use of these three tools to solve programming problems - you can watch it here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-23.42.10.png) [Link to Tweet](https://twitter.com/cognition%5Flabs/status/1767548763134964000?ref=gorillasun.de) After devising an initial plan, the agent iteratively writes code, browses API documentation, squashes bugs and follows the instructions that are typed into the LLM prompt box until the developed code is of a satisfactory state. Currently Cognition boasts a 13.86% preformance on real world software engineering benchmarks, setting itself apart form all other competitors: ![Image](https://pbs.twimg.com/media/GIu9cqoW8AArTqu?format=jpg&name=medium) More info about Devin's performance can be found in [this twitter thread](https://twitter.com/cognition%5Flabs/status/1768716551056728233?ref=gorillasun.de) But honestly I don't know what all the fuss is about, sure, it's impressive that we can now have LLMs sit in the driver's seat to operate tools in such a seamless manner, but the video still clearly shows that *Devin* was being instructed by a person - just sped up really quickly. It's likely that the person operating Devin had to actually check and monitor what the agent had concocted to direct it towards a desired outcome. At this point it just doesn't strike me as very useful - most of the examples that are floating around are very basic things. Over on Youtube, Theo voices his opinion on Devin and raises some good points in reaction to the different showcases, I recommend checking out the video if you're curious to learn more about how Devin actually works from the regular user's perspective: ### Design against AI The AI landscape is currently in a consistent state of upheaval, there's a new tool, new model, new something coming every couple of days and being heralded as the new big thing. And somehow the hype has yet to die down somehow. How do we actually work with AI in this setting and incorporate it into our practices, be it programming, or design? In the rapid version of his talk at the 2024 Design in Tech conference John Maeda tackles this exact issue with AI. Should we fight against it? Compete with it? Collaborate with it? Or something else entirely? You can watch it here: ## Gorilla Updates What have I been up to this week? Looking back I actually got a lot done, even though there's been other life stuff that I had to deal with. Overall I've probably spent more time than I've ever have on social media - but for a good reason, I've just been having so much fun over on Warpcast, with the additional incentive that I'm being given a considerable $degen allowance everyday to tip other creators and artists, and that simply for being active on the platform... why wouldn't I? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-01.58.18.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-01.58.57.png) Your boi climbing the leaderboard! | [Link to Cast](https://warpcast.com/gorillasun/0xccecb990?ref=gorillasun.de) Is it engagement farming? Absolutely, yes, but then again... why not? I'm having a blast. There's so much to talk about with what's currently going on over on Farcaster, that it warrants its own article - although it's taking a lot of mental bandwidth to keep up with everything, a good descriptor for it at this point would be "vibrant", with new shenanigans popping every day (see drakulas and vampires) that might or might not develop into something more legitimate in the future. If you're still not on Farcaster, here's an [invite link](https://warpcast.com/~/invite-page/212516?id=94b37123&ref=gorillasun.de) \- it costs a couple of bucks to join but we both get some Warps if you do via the link. That said, I also explored a couple of new ideas, like alternative coordinate systems. I learned about Bipolar coordinate systems a couple of months ago, but then couldn't really wrap my head around the concept nor could I figure out how to implement it. I somehow managed to get my idea working in a matter of minutes when I tried again this week - have a looksy at what I came up with: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/mySketch-8-.gif) Basically instead of having a single origin point you now have two, such that points are defined by their relative distance to both centers, as well as the angle that is formed from the two centers and the coordinate point. As always, the Wikipedia page actually gives you a good overview of what the math for this looks like, it's actually not incredibly difficult: [Bipolar coordinates - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Iso1.svg/1200px-Iso1.svg.png)](https://en.wikipedia.org/wiki/Bipolar%5Fcoordinates?ref=gorillasun.de) I also experimented with elliptic coordinates - not to be confused with ecliptic and ellipsoidal coordinates - but often perceived to have epileptic qualities (as the comments over on Twitter have pointed out 🤣). But not too much came from that idea however - careful with this one, might make you motion sick: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/mySketch-9-.gif) I also managed to put in some legwork on the redesign of the blog... yes, yes I know it's taking me an absolutely disgusting amount of time but I'm finally getting to a point where I have a complete picture of all the CSS and HTML partials in my brain - and also finally decided on a font combo that I'm 100% confident with, and that I believe represents the identity of the Gorilla Sun blog really well - here's some sneak peeks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-02.23.38.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-17-at-02.21.13.png) I also managed to figure out how to make a sleek dark mode toggle purely out of CSS: 0:00 /0:22 1× It definitely still needs some work but I'm happy with it at this point. ## Music for Coding This week I've mainly been jamming out to some Ginger Root tracks after getting hooked by Loretta: And that's it from me this week, hope you enjoyed this week's curated list of generative art and tech shenanigans - now that you've made it through the newsletter, you might as well share it with someone that you know who might enjoy this kind of *content* \- sharing the newsletter is one of the best ways to support it! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 47Le Random’s First Anniversary - Combine24 Generative Art Competition - Tsubuyai Porcessing by Koma Tebe - Optical Illusions by Akiyoshi Kitaoka - Aux Arbres Largest Genart Collection in History - Naive Yearly by Are.na - Flui Typography by Utopia +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/03/tarr-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-47/) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-13-at-11.03.10.png)](https://twitter.com/mathladyhazel/status/1767659965420851592?ref=gorillasun.de) [Link to Tweet](https://twitter.com/mathladyhazel/status/1767659965420851592?ref=gorillasun.de) ### Gorilla Newsletter 47 URL: https://www.gorillasun.de/blog/gorilla-newsletter-47/ Last updated: 2024-03-13T10:33:37.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 47th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Le Random's first Anniversary Last week, on the 8th of March, Le Random celebrated its first anniversary marking one full year of their presence in the generative art scene. In this short span of time they've established themselves as a leading voice in the space, not just by building the largest documented genart timeline in existence, but also by amplifying the voices of the individuals that are at the forefront of this art movement: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-10-at-12.31.38.png) [Link to Tweet](https://twitter.com/lerandomart/status/1766449380888854691?ref=gorillasun.de) Happy Birthday Le Random, and thank you for all the wonderful articles and interviews throughout the past year! Naturally we also get a new piece from Monk, in which he writes about how we got to where we are today with generative art, recounting how the machine has played a crucial role in reinventing how we make art and how it greatly augments our art making capabilities: [Mona Lisa to monogridHow did we transition from art that looks like Leonardo’s Mona Lisa to art like Kim Asendorf’s monogrid? Peter Bauman (Monk Antony) investigates the history of art’s mechanization to contemplate the future of digital generativity.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65e7514e6041cde9b18e6399_ML2mg.gif)](https://www.lerandom.art/editorial/mona-lisa-to-monogrid?ref=gorillasun.de) ### Combine24 Generative Art Competition In other news, the Finish National Gallery just recently announced that they're organizing an open generative art competition; you can find more info about it over on the official announcement page: [Combine24 - A generative art competition by the Finnish National Gallery.A generative art competition by the Finnish National Gallery.![](https://combine24.alusta.art/favicon.svg)A generative art competition by the Finnish National Gallery.![](http://combine24.alusta.art/thumbnail.png)](https://combine24.alusta.art/?utm%5Fsource=x&utm%5Fmedium=social&utm%5Fcampaign=combine24&utm%5Fcontent=combine24%5Fopen%5Fcall%5Fstill) The submission period for the competition runs from March 1st to May 31st, so there's still plenty of time. The only requirements for your artwork are that A) it needs to make use of the provided CC0 dataset that represents the gallery's collection, and B) it to be an original work minted as a generative project on Highlight: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-09-at-12.40.04.png) If I find the time, I might give it a shot and participate. But it might be challenging for me personally at least, since I'm not generally used to making data driven works. The first idea that comes to mind is training a neural network of some sort on the dataset and then have it imagine new outputs, but that's hardly very innovative - it would still need to have some sort of creative twist. Besides, it's also been a minute since I've done anything ML related. Another idea would be some form of generative dadaist collage, but that would also be outside of my comfort zone, and I'm not certain how you'd go about implementing it - since the final work needs to be minted on highlight, the image assets would also have to be stored somewhere. On second thought, maybe I should actually get a feel for the dataset first and then only do something with a subset of the images. ### Tsubuyaki Processing by Koma Tebe Koma Tebe never ceases to amaze us with his tweet sized code sorceries; in a recent creation of his he impresses with a cool metaball-esque sketch, that makes use of a cool P5 trick that I had almost forgotten about: 0:00 /0:07 1× [Link to Tweet](https://twitter.com/KomaTebe/status/1762880511767097413?ref=gorillasun.de) The secret to this one is the [filter()](https://p5js.org/reference/?ref=gorillasun.de#/p5/filter) function that comes out of the box with p5js, which lets you apply an image filter to all pixels of the canvas at once, such as the BLUR and THRESHOLD filters in this instance. Quickly popping Koma's code into the P5 editor and toggling off the two filters, we can get a feel for what's happening under the hood: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/noffil.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/blur.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/thresh-2.png) Base Pattern -> Blurred Canvas -> Thresholding the pixel values The blur makes it such that the outward going circular shapes on the canvas blend into each other, while the threshold clamps these values back to a saturated black or white value. This makes it such that the shapes connect in a sort of goo-y, metaball-esque manner. Which has the nice side-effect that you can get different outcomes depending on the harshness of the blur and threshold parameters. Simply a classic P5 trick. I also recommend checking out Koma Tebe's other sketches over on Twitter, since there's lots of cool tricks that can be learned from the Tsubuyaki format. And while we're talking about code golfing, another cool one I came across recently was by Steve over on Warpcast, in which he packages an entire web page inside of a tiny cast: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-09-at-12.47.05.png) [Link to Cast](https://warpcast.com/sdv.eth/0x3b01246e?ref=gorillasun.de) Initially I had some trouble figuring out what I was looking at, but that was due to being a Firefox user... which doesn't actually render the code properly. If you're viewing the cast in Chrome you can simply highlight the content of the cast, then right click it to reveal an option that says 'go:to' to open the code snippet as page in the browser (or alternatively drop the cast content into your address bar) - which will then reveal Steve's creation: the farcaster logo made entirely out of vertical slashes and horizontal dashes. It's a neat trick, and I'm wondering what more can be done with it since you technically could also include JavaScript within such a short code snippet. ### Optical Illusions by Akiyoshi Kitaoka I frequently browse Pinterest to find inspiration for my sketches, and my latest obsession has been optical illusions - they also seem to perform really well on social media since they're really powerful eye-catchers. I recently came across one that had me do a double-take, to check if I I was actually seeing correctly - have a look for yourself: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-09-at-12.14.01.png) If you're not color-blind then it should appear as if the grid of alternating darker and lighter green tiles is warped in some manner - but that's actually just an optical illusion, the grid is actually perfectly square! And there's no bend to it whatsoever. So, what's actually going on? I quickly did a little investigation and recreated the pattern with code, also making an alternative version with different colors: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/illusion.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/interff.png) It's not a 1-to-1 copy of the pin when it comes to the placement of the pink and white geometric flowers, but the effect's still there, and even more pronounced when you scroll over the image. In the alternative version with different colors the effect didn't really come through - so it must have something to do with the actual colors! After posting it over in the birbsnest discord, Metamere jumped in explaining that it's an optical illusion invented (discovered?) by the Japanese professor Akiyoshi Kitaoka: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-09-at-12.14.56.png) Turns out this specific pattern is called Primrose Field, and comes in different versions, it also works when the grid is grayscale and the geometric flowers are alternatingly black and white. But that's just one of many, many more optical illusions that Kitaoka has created - he's actually been documenting his works since 2002 over on a page titled Akiyoshi's illusion pages: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-10-at-01.06.39.png) [Link to Akiyoshi's illusions pages](https://www.ritsumei.ac.jp/~akitaoka/index-e.html?ref=gorillasun.de) It's essentially a treasure trove for all sorts of different optical illusions - with a big focus on those that are still images but appear to be in motion whenever your gaze shifts, or when they fall into your peripheral vision. What's more is that Akiyoshi's illusions have made it onto quite a few influential album covers, such as [Animal Collective](https://en.wikipedia.org/wiki/Animal%5FCollective?ref=gorillasun.de)'s critically acclaimed album, [*Merriweather Post Pavilion*](https://en.wikipedia.org/wiki/Merriweather%5FPost%5FPavilion%5F%28album%29?ref=gorillasun.de), as well as [Lady Gaga](https://en.wikipedia.org/wiki/Lady%5FGaga?ref=gorillasun.de)'s 2013 album [*Artpop*](https://en.wikipedia.org/wiki/Artpop?ref=gorillasun.de). You can learn more about Kitaoka's life over on Wikipedia: [Akiyoshi Kitaoka - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Peripheral_drift_illusion_rotating_snakes.svg/1200px-Peripheral_drift_illusion_rotating_snakes.svg.png)](https://en.wikipedia.org/wiki/Akiyoshi%5FKitaoka?ref=gorillasun.de) I'll probably try and recreate some more of his works and maybe even try to come up to remix them in a generative manner. ### On SDFs by Inigo Quilez Inigo Quilez made a full rewrite for one of his stellar articles about SDFs, in which he introduces smooth-minimums and how they allow us to blend 3D shapes in a smooth manner: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-11.22.18.png)](https://twitter.com/iquilezles/status/1765935148091261277?ref=gorillasun.de) [Link to Tweet](https://twitter.com/iquilezles/status/1765935148091261277?ref=gorillasun.de) [Inigo QuilezArticles on computer graphics, math and art![](https://iquilezles.org/favicon.png)Inigo Quilez![](https://iquilezles.org/logo.jpg)](https://iquilezles.org/articles/smin/?ref=gorillasun.de) ## Web3 News ### The largest Genart Collection in History: Aux Arbres A couple of days ago the minting period for Zanca's Aux Arbres concluded - and with over 70 thousand mints it indubitably went down as the largest blockchain art collection in history. A factor that played into this exorbitant number of mints likely has to do with the fact that Zancan's system kept revealing new types of variations, colors and patterns whenever a certain mint-number milestone was reached: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/auxarbres.jpg) Aux Arbres #72806 collected by yours truly Some of the rarer variations that were revealed later throughout the minting will likely be highly valuable collector pieces in the future, for instance the honey-comb variation that was one of the last ones to be revealed, as well as a cool Smolskull crossover: ![Image](https://pbs.twimg.com/media/GIJysdSWYAEvuqt?format=jpg&name=medium) ![Image](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-10.52.55.png) #74213 minted by [@MorpheusSomnia](https://twitter.com/MorpheusSomnia?ref=gorillasun.de) | [Link to Mark Knol's Tweet](https://twitter.com/mknol/status/1764643449997848920?ref=gorillasun.de) After being asked about if there were still variations that were unrevealed, Zancan reveals to us that these variations weren't actually part of the original script but were added in during the minting of the project! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-10-at-13.14.09.png) [Link to Thread](https://twitter.com/zancan/status/1766598996401783233?ref=gorillasun.de) If Zancan hasn't already cemented himself as one of the greatest contemporary artists then this should do it, we'll likely still be talking about Aux Arbres for many years to come. I'm happy I didn't sleep on this one and have a few in my own (meager) collection. ### ArtBlocks Self-Publishing Announcement Last week Art Blocks made quite a big announcement, unveiling that with their recent acquisition of Sansa the platform is currently in the process of creating an environment that will make it possible for artists to self-publish their generative projects: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-08-at-10.17.19.png)](https://twitter.com/artblocks%5Fio/status/1765800537667084652?ref=gorillasun.de) [Link to Tweet](https://twitter.com/artblocks%5Fio/status/1765800537667084652?ref=gorillasun.de) It is however not entirely clear how *open* this new branch of Art Blocks will be, considering that projects which weren't *Art Blocks curated*, still had to undergo some form of curatorial audit before obtaining a stamp of approval for being released. In other news, WTBS also made an announcement that they're recording an episode with Erick, and I believe that we should be getting more information about the upcoming changes to Art Blocks in that conversation: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-10-at-16.59.00.png)](https://twitter.com/WaitingToSign/status/1765882457755206120?ref=gorillasun.de) [Link to Tweet](https://twitter.com/WaitingToSign/status/1765882457755206120?ref=gorillasun.de) ## Web & Tech ### Naive Yearly by Are.na I must confess that when I first came across Are.na, I didn't really get it - it simply seemed like a place for collecting things you find on the internet, and I can already do that in any kind of note taking app, so what's the point? But I slowly came around, Are.na is a distraction free place on the internet where you can not just collect ideas and arbitrary types of content, but it also lets you organize your thoughts and give them structure, while providing social features tailored towards this end. If you're not familiar with Are.na, this article by Jil Wright describes it beautifully, explaining how she uses the platform as someone that has an information addiction (just like me): [Using Are.na for ResearchAren.a is an online platform that I’ve started using for personal knowledge management and collaboration.![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumJil Wright![](https://miro.medium.com/v2/resize:fit:1200/1*212M2AjxAKPAAzyYQ9wqbw.png)](https://medium.com/@jilwright/using-are-na-for-research-2b9274c8429?ref=gorillasun.de) Every year Are.na holds a conference gathering people who expand *what the web is and can be*. They document this conference in form of a web page with pieces that compliment the talks given by the invited speakers: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-01.58.53.png)](https://twitter.com/AREdotNA/status/1765846368147353888?ref=gorillasun.de) [Link to Tweet](https://twitter.com/AREdotNA/status/1765846368147353888?ref=gorillasun.de) I highly encourage you to explore those pieces (by clicking on the speaker names in the list on the right) - my favorite is Maya Man's eulogy for Google's 'I'm Feeling Lucky' button that found the end of it's lifespan in 2010: [naive-yearly.are.naNaive Yearly + Are.na![](https://naive-yearly.are.na/favicon.ico)![](https://naive-yearly.are.na/arena-mark.svg)](https://naive-yearly.are.na/?ref=gorillasun.de) That said, if you're not on Are.na yet, go check it out! ### Retrofitting Fluid Typography Choosing fonts and an appropriate font-size for different text elements in a web page's UI is often more involved than it seems. In the age of responsive web design it often makes sense to scale font-sizes depending on the size of the browser's viewport that's displaying the page; and the most common solution nowadays is to apply a different *font-size* value whenever one of these breakpoints takes effect. This is a bit cumbersome as you'll have to create quite a few media queries in which you define the font-size values. Richard Rutter recently wrote an interesting article in which he takes a different approach that calls itself Fluid Typography: [Retrofitting fluid typographyAs part of my forthcoming Patterns Day talk I decided to rebuild the newly redesigned Creative Boom article page using Utopian fluid typography to replace its multitude of breakpoints. This is the story of why and how.![](https://clagnut.com/favicon.ico)ClagnutRichard Rutter![](https://clagnut.com/images/2428/social.png)](https://clagnut.com/blog/2428/?ref=gorillasun.de) Fluid Typography disposes of breakpoints and interpolates font-sizes depending on minimum and maximum values. It's a novelconcept suggested by Utopia, which isn't a tool or framework, but rather a way of thinking about type and space in web design in a fluid manner. Although it sounds a little pretentious, I recommend giving Utopia's introductory video a watch, where they explain the concept and overall approach: Over on their website they provide a couple of free tools, like font calculators, for you to use and get started with fluid typography yourself: [UtopiaFluid responsive design![](https://utopia.fyi/apple-touch-icon.png)Utopia![](https://utopia.fyi/og.png)](https://utopia.fyi/?ref=gorillasun.de) ### CSS Scroll-triggered Animations Modern CSS is truly a treat - Ryan Mulligan recently wrote an interesting article about scroll-triggered animations that are purely done with CSS: [CSS Scroll-triggered Animations with Style QueriesCombine scroll-driven animations and style queries to trigger an animation sequence powered only by CSS.![](https://ryanmulligan.dev/favicon/favicon.svg)Ryan Mulligan![](https://ryanmulligan.dev/social/scroll-triggered-animations-style-queries.png)](https://ryanmulligan.dev/blog/scroll-triggered-animations-style-queries/?ref=gorillasun.de) His article is inspired by an experiment from last year by Bramus van Damme that's also worth a read: [Creating Scroll-Triggered Animations by combining Scroll-Driven Animations, Custom Properties, Style Queries, and TransitionsWhen you combine Scroll-Driven Animations with Custom Properties, Style Queries, and Transitions you hack your way into creating Scroll-Triggered Animations.![](https://www.bram.us/favicon.ico)Bram.usView more posts![](https://www.bram.us/wordpress/wp-content/uploads/2023/06/scroll-triggered-animations-025-10fps.gif)](https://www.bram.us/2023/06/15/scroll-triggered-animations/?ref=gorillasun.de) ## AI Corner ### Why future AI won't revolve around Chatbots The hype around our AI powered chat partners has yet to die down - and deservedly so, they've proven themselves to be extremely powerful tools for all sorts of tasks. We are however still limited in that our only means of communicating with them is through a prompt based interface. Fast Company discusses this issue in a recent article of theirs and showcases three companies that have already leveraged LLMs in innovative manners: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-10-at-01.27.27.png) [Link to Article](https://www.fastcompany.com/91034315/these-three-companies-show-why-the-next-ai-wave-wont-revolve-around-chatbots?ref=gorillasun.de) For instance, the second example they provide, a company pitted two LLMs against each other in a sort of conversation to come up with new ideas: > He started playing around with the idea of combining two [large language models](https://www.fastcompany.com/90826178/generative-ai?ref=gorillasun.de) (LLMs), one to gather travel data and the other to analyze company spending. What if those two LLMs had a kind of conversation? And what if they instructed one of those LLMs to act as if it were a CFO who needed to prepare a board presentation on how to save money on corporate travel? A relevant article in this regard is by Amelia Wattenberger back from 2023, in which she had already identified this same issue and also tackles it from a UI perspective: [Why Chatbots Are Not the Future of InterfacesAmelia Wattenberger’s personal website![](https://wattenberger.com/favicon.svg)Amelia Wattenberger![](https://wattenberger.com/thoughts/chatbots/ai-writing.png)](https://wattenberger.com/thoughts/boo-chatbots?ref=gorillasun.de) ### An AI masterpiece better than Dune 2 This one isn't educative in the least bit, but as someone who's attempted to make ASCII art with ChatGPT's help, I highly enjoyed watching this dramatic chat of someone with far more patience that I do: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-11.26.10.png)](https://twitter.com/petergyang/status/1765611617960747246?ref=gorillasun.de) [Link to Tweet](https://twitter.com/petergyang/status/1765611617960747246?ref=gorillasun.de) ## Gorilla Updates I've been deep, deep in CSS hell again this past week, in an attempt to figure out a relatively decent design for a new landing page for the Newsletter, and there's still not much to really show right now, except a big stinkin pile of broken CSS. I did however find a little bit of time for some generative shenanigans - I already mentioned the little Akiyoshi Kitaoka inspired optical illusion sketch earlier - but I also explored another idea that involves a triangular lattice inspired by yet another thing I saw on Pinterest: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-00.32.35.png) ![Star Tetrahedron Bilder – Durchsuchen 989 Archivfotos ...](https://t3.ftcdn.net/jpg/05/43/36/72/360_F_543367274_HpemvOlqNJDn5nAZwMbOukduSZ7UXifJ.jpg) I thought that the unfolded cutout for the star tetrahedron looked really cool - from an artistic POV it's more interesting than the actual 3D shape that it forms, to me at least. Apparently these are called nets: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-11-at-00.39.58.png) Looking just a little bit more into it, if you're looking for an algorithm to unfold a 3D shape onto a 2D plane you'd probably be looking at [UV unwrapping](https://computergraphics.stackexchange.com/questions/8774/unfold-a-3d-mesh-to-a-2d-plane?ref=gorillasun.de). But yet again, I was all out of time for exploring internet rabbit holes this week... so maybe that's something better left for next week. And that's not really what I wanted to do in the first place, I just wanted to generate some interesting triangle patterns, so I started out simple and just did a little grid/lattice in which I apply some random rotations to the individual triangles, and I feel that there's already something there: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/tarr-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/entangled.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/triangular.png) Besides that I also finally got another idea out of my system that I've been thinking about ever since I made my sketch for Genuary 2024's Wobbly prompt - and it turned out differently from what I had envisioned, but in a good way actually! In my mind I was envisioning a circular thing that had wavy bands shooting outwards from the center, but it ended up looking somewhat 3D, with the bend of the bands conveying some sort of additional depth: 0:00 /0:10 1× ## Music for Coding If you're a fan of Nujabes, then this one by Uyama Hiroto will hit the sweet spot - Freeform Jazz is Hiroto san's third full-length studio album released in 2016: The overall sound is hard to describe, somehow distant and mysterious, but still raw and intimate, uneasy but relaxed. Each track is very different and unique, but the entirety of the album still flows really well and blends into a beautiful larger whole that never loses your attention. A relevant piece of writing here is a conversation between Uyama with his editor and music compiler Hashimoto Toru that shines light on how the album came to be: [Uyama Hiroto “freeform jazz” Interview (2016)This is an interview about Uyama Hiroto’s third full-length album, freeform jazz. Joining Uyama here is close friend Hashimoto Toru. This interview is particularly recommended reading for fan…![](http://kumomi.org/favicon.ico)kumomiHenkka![](http://kumomi.org/wp-content/uploads/2022/03/img_b11bb451144801e65a31d636634e6c38447488.jpg)](http://kumomi.org/2022/12/02/uyama-hiroto-freeform-jazz-interview-2016/?ref=gorillasun.de) > It is, as implied by the title, a work that is free in form. Alongside the beautiful ensembles characteristic of Uyama, the release is filled with freaky beats, experimental ideas, and dope song progressions, lulling the listener into a false sense of security. In the famous words of Patrick Star "Now you must acquire a taste for... Freeform Jazz" - but I believe that it's not too difficult to do so when the Jazz is presented as beautifully as this. After giving the album a full listen, I have to say that it's very likely going to establish itself as a personal favorite. Being considered as Nujabes right-hand man, they have worked closely together on multiple tracks - here's one of them that I found to be stellar: That's it from me this week, hope you enjoyed this week's curated list of generative art and tech shenanigans - now that you've made it through the newsletter, you might as well share it with someone that you know who might enjoy this kind of *content* \- sharing the newsletter is one of the best ways to support it! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 46Compressionism as an Art Movement - Particle based Fluid Simulations - Infinite Procedural Photorealistic Worlds - Molnar’s Paris - Plotting on Jackson Cubes - The Blockchain was Invented for NFTs, not Currency - A CMS for Github Pages - A Netlify Horror Story +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/03/patternicus-1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-46/) *And if that's not enough, you can find a backlog of all previous Gorilla Newsletter issues here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 46 URL: https://www.gorillasun.de/blog/gorilla-newsletter-46/ Last updated: 2024-03-04T11:00:21.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 46th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Compressionism as an Art Movement Compression isn't only crucial for all sorts of technical purposes and applications, but has also occupied an art-centric role over the years - it is actually quite fascinating to think about how the size limitations of early computers have influenced the overall trajectory of digital art over the past decades, not only from a technical point of view but also the aesthetics thereof. Twitter user Diid, who's currently building out [The Center for the Advancement of Digital Art](https://www.cada.art/?ref=gorillasun.de), recently published an article on this exact topic, diving into the origins of the term *Compressionim*, positing it as an art movement in its own right, and how it is undergoing somewhat of a renaissance with blockchain art that is also confronted with the size limitations of the underlying tech: [On Compressionism — The Center for the Advancement of Digital ArtA brief history and explanation of what compressionism is and where it came from.![](https://images.squarespace-cdn.com/content/v1/64ffb07a35df0f4d185ada3f/9818eec3-f14d-4dc2-83e7-edcd77e96c15/favicon.ico)The Center for the Advancement of Digital Artdiid![](http://static1.squarespace.com/static/64ffb07a35df0f4d185ada3f/t/65e015fea1fd42189c5e8fa5/1709184512949/you-dont-remember-do-you-FINAL.png?format=1500w)](https://www.cada.art/columns/compressionism?ref=gorillasun.de) Diid starts us off by recounting the origins of the term *Compressionism*, first coined by James Powderly as a title for an interactive video project of his, but then later given to Nathaniel Stern for another performance art project: [A short description of the project can be found here](https://artelectronicmedia.com/en/artwork/compressionism/?ref=gorillasun.de) If you google the term *Compressionism* you don't actually find much about it, as an artform/art movement at least. But I would to some extent agree with Diid that it is an apt umbrella term for much of the art of our era, be it dither art that employs color reduction techniques for aesthetic purposes, ASCII art that reduces an image into letter symbols, size-coding and code-golfing that are often impressive feats of a human type of compression, and would go as far as saying that AI art falls under this category, where machine learning models up-sample imaginary outputs from compressed internal representations. And especially with code based on-chain projects, we are seeing a renaissance of this phenomenon, where expensive blockchain storage pushes code artists make their projects as small as possible, such as to minimize the associated cost - just past December we observed many a generative artist size-code their systems for fxhash's launch on ETH. The most notable project in that regard was Piter Pasma's [Blokkendoos](https://www.fxhash.xyz/generative/slug/blokkendoos?ref=gorillasun.de), in which he creates a Monte Carlo path tracer in only 5954 characters of dependecy-less vanilla JavaScript code. At the time Piter also shared an interesting thread on the importance of size optimizing code, that I believe is relevant to this discussion: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-03-at-01.23.53.png)](https://twitter.com/piterpasma/status/1736000934923137413?ref=gorillasun.de) [Link to Tweet](https://twitter.com/piterpasma/status/1736000934923137413?ref=gorillasun.de) Piter Pasma also chimes in with some questions of his own underneath Diid's tweet, raising some interesting points: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-02-at-12.04.43.png)](https://twitter.com/0xdiid/status/1763398889997005292?ref=gorillasun.de) [Link to Tweet](https://twitter.com/0xdiid/status/1763398889997005292?ref=gorillasun.de) But as Diid points towards the end of his article, he's not trying to define the movement as a whole - if it can be called a movement that is. While it can be interesting to group different artforms under a collective -ism, to more easily categorize and compartmentalize, it can often lead to overly simplifying the complexity, the philosophical ideas and the historical context of these artforms. After all, an isms is not synonymous with idiosyncrasy, and I believe the distinction has to be made there. Art is generally beyond isms. ### Particle based Fluid Simulations Although a bunch of circles bouncing around on a virtual canvas might at first glance seem a bit underwhelming, the implementation thereof lies at the foundation of some quite advanced computational concepts. The first culprit in that regard being numerical stability - when simulating physics computationally we are entirely at the whims of the internal finite precision arithmetic of our computers, and in many cases achieving a somewhat stable system can be quite challenging. Particle simulations are also fascinating because they're an integral component of many other interesting types of simulations, such as collision systems, mesh and soft body simulations, flocking simulations, and as I most recently learned, also fluid simulations. I came across a tutorial series by PixelPhysics over on YouTube, in which they show us how to implement a particle based fluid sim from scratch, entirely in vanilla JavaScript: Their implementation is based on a paper back from 2005 titled [*Particle based viscoelastic fluid Simulation*](https://www.semanticscholar.org/paper/Particle-based-viscoelastic-fluid-simulation-Clavet-Beaudoin/6090b0c36b0867ee249648072caf641a0fb37009?ref=gorillasun.de) (the paper is not an incredibly difficult read), which describes a system that allows the simulation of surface tension via a double density relaxation procedure - but before this starts sounding like some strange technobabble straight from r/VXJunkies, I'll leave it to PixelPhysics to do the heavy lifting and explain how it works. I might attempt my own implementation at some point though. A commonality that I see between particle simulations, is that the behavior of particles often boils down to their proximity to other neighboring particles and their movement. In a flocking simulation, following [Craig Reynolds famous model](https://www.red3d.com/cwr/boids/?ref=gorillasun.de), the movement of the individual particles is influenced by steering behaviors that depend on the vector forces of other nearby *Boids* (other particles). When it comes to fluid sims, another important resource is this Coding Adventure by the OG Sebastian Lague, in which he also creates a proper fluid simulation: When I explored physics simulations for myself last year and wrote a number of posts on the topic, I always felt that there was a lot more there to explore, and it's definitely something that I'll likely tackle again in the coming months - especially flocking and fluid sims. So the main take-away here, is that investigating the behavior of bouncing virtual particles is frequently a worthwhile scientific endeavor. ### Infinite Photorealistic Worlds using Procedural Generation Whenever I see the term 'Procedural' nowadays, it almost feels like a relic from an era long past - considering how far along generative AI has come. This week I came across an interesting, relatively recent, paper that claims an entirely procedural approach to creating photorealistic scenes: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-29-at-11.40.45.png)](https://arxiv.org/abs/2306.09310?ref=gorillasun.de) [Link to Paper](https://arxiv.org/abs/2306.09310?ref=gorillasun.de) | [Link to Project Page](https://infinigen.org/?ref=gorillasun.de) The results look quite impressive, especially since the generator not only creates images but also 3D asset files (Blender) for the depicted scenes. As always, the Hackernews comment section for the article is quite polarized: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-29-at-11.44.57.png) [Link to Hackernews Comments Section](https://news.ycombinator.com/item?id=36376071&ref=gorillasun.de) I can get behind both points of view though; on the one hand the system seems quite useful for generating novel 3D training data, and the paper actually already has a few citations that use it for this purpose - but on the other hand I also have to give it to the other opinions that question the photo-realism of the generated scenes. It might not be the best descriptor, and a procedural approach might just be a little too late for that considering what we're doing with machine learning these days. But I find it strange to diminish the value of a project like this one, just because we can do things with AI now, I strongly believe that there's always merit to exploring alternative approaches to different tasks even when they might not be cutting-edge. Genuinely curious, what do you think about this issue? ### Molnár's Paris And to top off this generative column, and with NFT Paris conlcuding, Le Random leaves us with a historical travel guide that takes us through Paris, recounting the important places of Vera Molnár's life in the bustling art capital: [Molnár’s ParisVera Molnár moved to Paris at the end of 1947 and would call the city home for the rest of her storied life. Use our interactive map to follow in her footsteps across the French capital and discover the entwined narrative of artistic evolution and urban existence that defined her practice.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter Bauman (Monk Antony) is Le Random’s Editor-in-Chief.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65dc7206a2a99f957dcb3b2c_Screenshot%202024-02-26%20at%2012.11.21%20PM.png)](https://www.lerandom.art/editorial/molnars-paris?ref=gorillasun.de) I was especially curious to see what Monk had to say about Le Select, the Hungarian expat café that Molnár would frequent, through which she got to know Sonia Delauney. When I wrote my own piece on Molnár's life I came across some resources stating that she met Kandinsky and Malevich there, although I couldn't find further information if these claims were accurate. Maybe it was only meant metaphorically. Next time you find yourself in Paris, you might just want to build in some of these locations into your itinerary! ## Pen and Plottery The occasional plotter segment of the Newsletter is back! ✏️ There were quite a few plotter-related things this week that warranted its return 👇 ### Plotting on Jackson Cubes If you've noticed, I'm a big fan of written resources that inspire us with new ideas, teach us new things and/or provide us with interesting methods to make interesting art - and that's exactly what Jos Vromans did with a recent post of his, in which he checks all three of those boxes. In *Plotting on Jackson Cubes*, Jos introduces us to Jackson Cubes, shows us how they can be decorated with different plotted patterns and even provides us with a couple of SVG generators to easily create these patterns: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-01-at-17.38.13.png)](https://www.josvromans.com/blog/2024/2/jackson-cubes/?ref=gorillasun.de) [Link to Article](https://www.josvromans.com/blog/2024/2/jackson-cubes/?ref=gorillasun.de) If you're not familiar with what a Jackson Cube is, it's essentially an Origami cube that's assembled out of 6 interlocking pieces of folded paper. There's different variations, like the one shown above that have one or more corner sliced off, resulting from a slightly different folding procedure, and making them stackable on top of each other. These cubes derive their name from their creator Paul Jackson, who came up with the folding technique in the early 1970s - there is a cool video of his back from 2018, in which he personally demonstrates the folding technique: Looking into it a bit more, I also found this interesting list of the different variations that Paul Jackson came up with, and I guess the proper term for the cubes with the corners sliced off is *Columbus Cubes*: [David Mitchell’s Origami Heaven - MODE - Designs From the Paul Jackson CubeThe web-site of paperfolding designer, author and publisher David MitchellDesigns From the Paul Jackson Cube![](http://www.origamiheaven.com/pictures/Paul%20Jacksons%20Cube.jpg)](http://www.origamiheaven.com/designsfrompauljacksonscube.htm?ref=gorillasun.de) Decorating these cubes with generative patterns is the cherry on top, and imo makes them really *pop*. Jos points us towards two pattern generators of his, that allow you to directly export SVG files and feed them into your own plotter if you have one. Although I've messed around quite a bit with the 10 print pattern, I actually never experimented with triangle subdivisions - so I found it super cool that Jos also wrote a bit about how to create these patterns in another post of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-02-at-22.07.34.png)](https://www.josvromans.com/blog/2021/1/triangle-subdivisions/?ref=gorillasun.de) [Link to Article](https://www.josvromans.com/blog/2021/1/triangle-subdivisions/?ref=gorillasun.de) Overall, I really love the plotter+origami combo, feels like a match made in heaven. Besides that, a little bird also told me that Jos is already working on a couple more articles that we'll likely see quite soon over on his blog. ### Plotter Animation by Compote de Plot Another cool thing that you can do with plotters are stop-motion animations - such that each individual frame is plotted and then later recombined into a complete digital animation. The cool thing here is that it's often difficult to align frames perfectly, giving it that nice stop-motion jitter effect. Compote de plot created a really cool one recently, in which a tessellated sphere disintegrates into individual tiles and then reappears from the void: 0:00 /0:06 1× [Link to Tweet](https://twitter.com/loic%5Fgoulefert/status/1763177069964345589?ref=gorillasun.de) I thought that the pattern on the sphere was really cool, it reminds me of a Voronoi diagram with the added effect that the edges between them are slightly bent due to the curvature of the sphere's surface. Compote de Plot sheds some light on how they did it after I inquired about it on Twitter, revealing that he's using blender's *cell fracture* tool to generate the pattern on the sphere: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-04-at-09.29.08.png)](https://twitter.com/gorillasu/status/1763154663933698467?ref=gorillasun.de) [Link to Thread](https://twitter.com/gorillasu/status/1763154663933698467?ref=gorillasun.de) I'll have to try and figure out how to generate a Voronoi Diagram/Delaunay Triangulation on a sphere now, I think the challenge here is having the tessellation wrap around- a quick google actually reveals that Red Blob Games has written about this, so I might just dig into it sometime this week: [Delaunay+Voronoi on a sphere![](https://www.redblobgames.com/favicon.ico)![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Geodesic_icosahedral_polyhedron_example.png/1280px-Geodesic_icosahedral_polyhedron_example.png)](https://www.redblobgames.com/x/1842-delaunay-voronoi-sphere/?ref=gorillasun.de) ### Plotter assisted Lithographs And in other news, Licia He has been experimenting with making plotter assisted lithographs: 0:00 /0:26 1× [Link to Tweet](https://twitter.com/Licia%5FHe/status/1762539025502539907?ref=gorillasun.de) What's a lithograph, you ask? A lithograph is essentially a printmaking technique that involves creating an image on a flat surface with ink (or other painting materials), typically a stone or metal plate, and then pressing a piece of paper against that surface to transfer the image from the surface to the paper. Here, Licia prepares the lithograph surface with her plotters. I found this cool article that shows the process step-by-step by means of a series of animated GIFs: [LithographLithography is a planographic printmaking process in which a design is drawn onto a flat stone (or prepared metal plate, usually zinc or aluminum) and affixed by means of a chemical reaction.![](https://www.metmuseum.org/content/img/presentation/icons/favicons/apple-touch-icon-180x180.png?v=4)The Metropolitan Museum of Art![](http://www.metmuseum.org/-/media/images/about-the-met/collection-areas/drawings-and-prints/materials-and-techniques/printmaking/teasers/lithography_teaser_final_v2.jpg?sc_lang=en)](https://www.metmuseum.org/about-the-met/collection-areas/drawings-and-prints/materials-and-techniques/printmaking/lithograph?ref=gorillasun.de) ## Web3 News ### The Blockchain Was Invented for NFTs, not Currency The invention of the blockchain is probably most often erroneously attributed to the elusive figure of *Satoshi Nakamoto.* Although the original white-paper for the bitcoin blockchain was revolutionary, from a historical point of view, that wasn't actually the inception of the cryptographic and decentralized notions that most blockchains build upon today. Satoshi based his decentralized financial system on the ideas of Stuart Haber and Scott Stornetta, that were previously more concerned with developing a system for proving the integrity of digital records of any form, which led them to the conception of an early blockchain system. In this interview with Jason Bailey for RCS they recount their story: [The Blockchain Was Invented For NFTs, Not CurrencyA candid interview with the inventors of the blockchain![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Alex Estorick![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/65df737307381a72d7afa89d_Scott_and_Stuart_Cropped.jpg)](https://www.rightclicksave.com/article/the-blockchain-was-invented-for-nfts-not-currency?ref=gorillasun.de) Throughout the interview they do emphasize that Satoshi made impactful contributions in the manner that their system was leveraged for financial purposes. They also state that NFTs in their current form are essentially the manifestation of their long-term goals for the system that they've built, and are moreover big proponents of an interoperable multi-chain future, where the decentralized ledgers can seamlessly communicate with each other. And we've actually already been witnessing this to some extent in recent months. As always, a highly interesting read from RCS. ### Deep-dive into Farcaster NFTs The Farcaster scene has been unfolding more and more rapidly, especially with Farcaster Frames that make it possible to directly mint NFTs from the social feed. Kaloh did some number crunching and reports back with what seem to be the most valuable collectibles in the current eco-system: [🟣 Deep Dive: Farcaster NFTsLet’s dive in Farcaster NFT ecosystem with a market analysis and a curated list![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-180x180.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd1cb4c-fca4-4cb9-a6b5-02532cdb778a_1990x2000.png)](https://www.kaloh.xyz/p/deep-dive-farcaster-nfts?ref=gorillasun.de) If you're curious about how Kaloh aggregates these numbers I also highly encourage you to check out another piece he's written in which he explains all of it: [📈 How To Crunch The Numbers Behind NFTsUnderstand how to use my market analysis spreadsheets![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-180x180.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fpbs.substack.com%2Fmedia%2FFQPusPxVQAEvMQu.jpg)](https://www.kaloh.xyz/p/-how-to-crunch-the-numbers-behind?ref=gorillasun.de) ## Tech and Web Dev things ### A CMS for Github Pages Github pages is really cool, it makes the deployment of static websites incredibly straightforward. But once that static site grows just a little bit larger, working with it can quickly become a hassle - managing a bunch of markdown files in form of a github repo and manually linking image and media files through markdown can get messy really quick. This is where Pages CMS comes in, as an attempt to alleviate these pain points by creating a proper content management system for Github pages: [Pages CMS: The No-Hassle CMS for GitHubTired of juggling Git and YAML to update your Next.js, Astro, Hugo or Nuxt website? Make it easy on you and your team, get a user-friendly CMS running straight on top of GitHub.![](https://pagescms.org/apple-touch-icon.png)![](https://pagescms.org/cover@2x.png)](https://pagescms.org/?ref=gorillasun.de) I spent some time and took it for a spin with a side project of mine - and I have to say, I'm really impressed! You simply link it to an existing github repo of yours, be it a Jekyll, 11ty, or any other static site generator, and set up a configuration file that defines the relevant folders in your project, mainly those that contain your media and markdown files, then you can already get started creating and managing your content via the CMS. Definitely worth keeping an eye on how this project develops in the future! ### CSS :has() Rule Our favorite web dev Ahmad Shadeed, as well as repeat offender of the Newsletter, is back with another deep-dive, this time teaching us about the :has() rule in CSS: [CSS :has() Interactive GuideEverything you need to know about CSS :has() selector.![](https://ishadeed.com/assets/favicon-32x32.png)Ahmad Shadeed![](https://ishadeed.com/assets/css-has-guide/twitter-card.jpg)](https://ishadeed.com/article/css-has-guide?ref=gorillasun.de) If you're not familiar the :has() rule, it's essentially a means for us to 'look ahead' and check what kind of element comes after the current element. A scenario where this comes in really handy is when you want to override the bottom-margin of the current element depending on what the next element is - for instance, we sometimes want a bigger margin when a block of text is followed by an image, to allow for some visual breathing room. Ahmad Shadeed guides us through all of the intricacies of this special CSS rule. ### DOOM Rendered via Checkboxes I came for *DOOM Rendered via Checkboxes* \- I stayed for interesting Web Assembly internet lore and the Nerd Sniping phenomenon: [DOOM Rendered via CheckboxesWebAssembly meets 16000 HTML checkboxes.![](https://healeycodes.com/favicon.ico)![](https://healeycodes.com/_next/image?url=%2Fposts%2Fdoom-rendered-via-checkboxes%2Fdoom-checkboxes.png&w=1920&q=100)](https://healeycodes.com/doom-rendered-via-checkboxes?ref=gorillasun.de) Andrew Healey's was inspired by Bryan Braun's checkbox shenanigans to create a version of DOOM that's entirely rendered via HTML checkbox elements. Apparently you can make a lot of things on the Web entirely with checkboxes as Bryan explains in an article of his: [I keep making things out of checkboxesSomething happened earlier this year where I got on a run making checkbox animations and just couldn’t stop.![](https://www.bryanbraun.com/favicon.ico)Bryan Braun - Frontend Developer![](https://www.bryanbraun.com/assets/images/logo.png)](https://www.bryanbraun.com/2021/09/21/i-keep-making-things-out-of-checkboxes/?ref=gorillasun.de) Andrew builds his creation on top of Diek Mann's Web Assembly port of the original DOOM, pointing us to an interesting repo in which Diek Man not only teaches us about Web Assembly but also show us how the port is made possible: [GitHub - diekmann/wasm-fizzbuzz: WebAssembly from Scratch: From FizzBuzz to DooM.WebAssembly from Scratch: From FizzBuzz to DooM. Contribute to diekmann/wasm-fizzbuzz development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubdiekmann![](https://opengraph.githubassets.com/74cf07bf461cd81c17f48ce0c7b02d72d0a9fabe97dccf7028e5b1d3146cd607/diekmann/wasm-fizzbuzz)](https://github.com/diekmann/wasm-fizzbuzz?tab=readme-ov-file&ref=gorillasun.de) Have you been Nerd Sniped yet? ### A Netlify Horror Story A post from r/webdev has recently been making the rounds, in which a Netlify user has been billed a whopping $104k by Netlify for the bandwidth consumption of a simple static site: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-03-at-13.22.24.png)](https://www.reddit.com/r/webdev/comments/1b14bty/netlify%5Fjust%5Fsent%5Fme%5Fa%5F104k%5Fbill%5Ffor%5Fa%5Fsimple/?ref=gorillasun.de) [Link to entire reddit post](https://www.reddit.com/r/webdev/comments/1b14bty/netlify%5Fjust%5Fsent%5Fme%5Fa%5F104k%5Fbill%5Ffor%5Fa%5Fsimple/?ref=gorillasun.de) After reaching out to Netlify's customer support it turns out that the site has in fact succumbed to a DDOS attack and incurred these exorbitant bandwidth costs - Netlify informs that the subject of this attack was an .mp3 file of an old Cantonese song included on the page. Netlify then offered to reduce the cost to 5% in light of it being a DDOS attack. Reddit comments recommended OP to post the story over on Hackernews before actually paying the outstanding cost - which then actually led the entire thing to catch on fire, even prompting a reply from Netlify's CEO over on Hackernews: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-03-at-13.47.14.png)](https://news.ycombinator.com/item?id=39520776&ref=gorillasun.de) [Link to Hackernews Story](https://news.ycombinator.com/item?id=39520776&ref=gorillasun.de) As well as an official statement from Netlify over on Twitter: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-03-at-13.19.34.png)](https://twitter.com/Netlify/status/1762518910107033798?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Netlify/status/1762518910107033798?ref=gorillasun.de) ## AI Corner ### Runway Studios Creative Dialogues Generative AI is unarguably going to transform the film-making scene in the coming years, and Runway Studios is currently at the helm of driving the creative dialogue around the cutting edge technology. Runway Studios, an off-shoot of the generative AI tooling company Runway, recently started a series of conversations between creatives that use AI for the purpose of creative expression - I found them to be highly insightful and really enjoyable to watch, here's episode 2 featuring Anna Ridler and Lex Fefegha: You can keep an eye on upcoming episodes here, one of them will feature Golan Levin, so definitely worth keeping an eye on: [Creative Dialogues from Runway StudiosA series of conversations exploring human creativity and artificial intelligence.![](https://studios.runwayml.com/images/favicon.ico)![](https://d3phaj0sisr2ct.cloudfront.net/studios/images/rw-studios-cd-ep-02-card.jpg)](https://studios.runwayml.com/creative-dialogues/episode-2?ref=gorillasun.de) ### AI and Design Systems Last week I shared an article by Brad Frost from early January 2024 in which he proposes a global design system that I found highly interesting. Frost returns with a new article, this time exploring the role that AI models currently occupy in aiding the creation of design systems: [AI and Design SystemsWe’ve all watched with simultaneous fascination and trepidation as a flood of AI-powered tools continues to wash over the digital landscape. At Big Medium, we help complex organizations design at scale and pragmatically adopt new technologies, so naturally we’ve been putting AI tools through their p![](https://bradfrost.com/favicon.ico)Brad FrostBrad Frost![](https://bradfrost.com/wp-content/uploads/2024/02/DALL%C2%B7E-2024-02-27-09.07.48-Imagine-a-whimsical-and-innovative-scene-where-a-friendly-robot-full-of-character-and-warmth-is-literally-bringing-digital-designs-to-life-by-emitti.webp)](https://bradfrost.com/blog/post/ai-and-design-systems/?ref=gorillasun.de) The main point of the article is that LLMs can be super powerful in generating the code for new components when trained on an already existing design system's codebase: > **When you train a LLM on a design system’s codebase, conventions, syntax and documentation, you get a component boilerplate generator on steroids.** However, as we've already seen in recent history, it is still not a replacement for human judgement, and still requires a guiding hand to yield satisfactory outputs. ## Gorilla Updates ### Generative Irregular Puzzle Tilings This week I worked a little more on my generative puzzle generator - I was wondering what it would look like to combine it with my code for irregular grids, albeit still a bit rough around the edges it did end up working out: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/irregular-puzzle-grid.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/irregularpuzzlegrid.png) It was actually quite tricky to coordinate the connections between the irregular rectangular tiles - if done manually, you'd have to check which tiles are adjacent and at what positions their adjacency falls which is non-trivial. I cheated a little, and create a preliminary regular square grid of puzzle tiles, for which we already lock in place the adjacency between each of the tiles. This grid is then overlayed it with an irregular grid that will then simply imitate the adjacency of the square tiles - if there is a shared edge that is. Maybe it's not a hack, since it still required quite a bit of code. Here's two debug outputs to visualize what's actually going on behind the scenes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/irregulargrid.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/puzzlegrid.png) Maybe once I've wrapped up this project I can make a proper write-up. I'm also interested in seeing what it would look like when adapted to other tesselations, and in the future maybe I can also figure out how to bring this to life and create physical versions of these generative puzzles. ### Designing Landing Pages and making things wonky This past week I've been hard at work re-designing and re-structuring the blog - there's still sooo much to be done, but I'm slowly etching my way closer to something that I think I'll be really proud of: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-04-at-11.29.59.png) I shared a couple of WIPs and asked for feedback over in [Raph's birbsnest discord](https://discord.gg/xawSKAAG3N?ref=gorillasun.de), which led to an interesting chain of events where Dave suggested adding a tiny css rotation to every element of the page: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-02-at-22.15.40.png) This inspired Jordanne to create a tiny script called Wonky.js that does exactly that: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-04-at-11.32.10.png) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-03-at-00.33.25.png)](https://wonky-js.glitch.me/?ref=gorillasun.de) [Link to Wonky.js](https://wonky-js.glitch.me/?ref=gorillasun.de) So, what are you waiting for? Do the right thing and wonkify your page right now. ### A pit-stop at Unit London Last week I went on a brief trip to the UK, visiting my partner who's recently started her PhD over there (so proud of her btw), and I used it as a chance to stop by Unit London that's currently exhibiting some works by Zach Lieberman and Ziping Wang. It was really awesome to see generative art in person for the first time. Zach's prints are really out of this world: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/03/Screenshot-2024-03-02-at-21.27.10-1.png)](https://twitter.com/gorillasu/status/1763675306160718043?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1763675306160718043?ref=gorillasun.de) Ziping Wang's oil paintings are also incredible up close, I had to double and triple check that they actually were oil paintings. If you're in London for some reason, I highly recommend passing by - entrance is free of charge! ## Music for Coding I generally like to shout-out individual artists, but I've listened to this playlist so many times at this point I just had to share it - the cosmopolitan sound of the city pop genre might not be everyone's cup of tea, but to me it just instantly flips a *feel good* switch. Especially this playlist, with classics like Stay With Me by Miki Matsubara and Bay City by Junko Yagami, that just encapsulate the genre so beautifully: That's it from me this week, hope you enjoyed this week's curated list of content - and now that you've made it through this week's newsletter, you might as well share it with someone that you know who might enjoy this kind of *content* \- sharing the newsletter is one of the best ways to support it! **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 45This week 📬 Weighted Voronoi Stippling - All about Color Spaces - Speaking in Net Language - fxhash comes to base - Zancan’s Aux Arbres - Global Design and Documentation Systems +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/02/puzzleban.png)](https://www.gorillasun.de/blog/gorilla-newsletter-45/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising with the Newsletter - reach out!* ### Gorilla Newsletter 45 URL: https://www.gorillasun.de/blog/gorilla-newsletter-45/ Last updated: 2024-02-26T09:14:58.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 45th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## Weighted Voronoi Stippling When I read the title of the newest coding challenge I immediately dropped everything and had to watch it start to finish. This time around Mr. Shiffman breaks down quite a tricky one for us — Weighted Voronoi Stippling! I'm super excited about this topic because it's something that I've looked into myself about 2 years ago, at a time when I was exploring Voronoi diagrams and Delaunay triangulations. Back then however I gave up on pursuing a stippling effect, because I ultimately couldn't figure out how to implement the algorithm. If you look into it yourself, you'll come across the very same paper that Shiffman implements in the challenge - which makes up the very first result that comes up for the search query *Weighted Voronoi Stippling*: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-24-at-17.26.41.png)](https://www.cs.ubc.ca/labs/imager/tr/2002/secord2002b/secord.2002b.pdf?ref=gorillasun.de) [Link to Paper](https://www.cs.ubc.ca/labs/imager/tr/2002/secord2002b/secord.2002b.pdf?ref=gorillasun.de) The effect really comes to life when it's used to represent 3D scenes, such as the little mannequin/figurine that's shown in one of the paper's figures (see above) - it's fascinating how the human eye can make out shadows/illumination simply through the density of the individual points. That makes me think of a recent collaboration between Joannie Lemercier and Quentin Hocde that's also powered by a stippling algorithm, titled *Nuages Possibles*,in which beautiful cloudscapes are brought to life through many thousands of individual dots: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-25-at-17.39.01.png) What's bonkers about this project is that each iteration was also sent out to collectors as a pen plot. Poor plotter. | [Link to Project](https://www.fxhash.xyz/generative/slug/nuages-possibles?ref=gorillasun.de) But what actually are Voronoi Diagrams? A Voronoi diagram is essentially a type of space partitioning, in which a 2 dimensional surface is split into individual polygons based on the distance to a set of points that's scattered across this surface - we basically need to distribute some points on a plane as a starting condition to construct a Voronoi diagram. The defining characteristic of each polygon is that it corresponds to the region that is closer to a specific point than to any other point in the set. Here's what this looks like, next to some art I made with the concept back from Genuary 2023: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Euclidean_Voronoi_diagram.svg.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/327396674_220427097029684_5977870041753505186_n.jpg) [Link to Wikipedia page on Voronoi Diagrams](https://en.wikipedia.org/wiki/Voronoi%5Fdiagram?ref=gorillasun.de) Voronoi Diagrams are also closely related to Delaunay Triangulations, in fact, they're duals! This means that we can derive a Delaunay Triangulation from every Voronoi Diagram and vice versa - we can do so by simply connecting the centroids of each two adjacent Voronoi regions with a line. Here's what this looks like, as well as some art I made with Delaunay triangulations: ![The Voronoi Diagram and Delaunay Triangulation | System ...](https://content.cdntwrk.com/files/aHViPTExODYyNSZjbWQ9aXRlbWVkaXRvcmltYWdlJmZpbGVuYW1lPWl0ZW1lZGl0b3JpbWFnZV82NDQwZWY2MzAyZTRiLmpwZyZ2ZXJzaW9uPTAwMDAmc2lnPWE0ZmI1ZDE0MWZiODNlYTZjODVkYTdlMDgyZmNjMDcx) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/shrinkk.png) A fun fact here is that Delone, the mathematician that came up with/discovered this kind of triangulation, actually knew Georgy Voronoy, and if you're curious about some of the history between these two types of fascinating patterns, I encourage you to check out something I've written about it: [Delaunay Triangulation and Voronoi DiagramsThis is the first one of a two part series of blog posts on Delaunay Triangulations. In this one we have a look at artworks that have been created with Delaunay Triangulations, a little bit of it’s history, possible strategies to create them, and the related Voronoi Diagram.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/mountains.jpg)](https://www.gorillasun.de/blog/delaunay-triangulation-and-voronoi-diagrams/) If you want something a bit more technical, and want to challenge yourself with an algorithm that can construct a Delaunay triangulation from an initial set of points, here's an explanation of the Bowyer-Watson algorithm: [Bowyer-Watson Algorithm for Delaunay TriangulationThe Bowyer-Watson algorithm for Delaunay triangulation is maybe one of the easier methods to implement and understand for obtaining a Delaunay Triangulation.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/color_triangulation.jpg)](https://www.gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation/) But back to the main topic, how do Voronoi Diagrams lead us to a Stippling effect? There's this cool algorithm called Lloyd's relaxation, that iteratively 'relaxes' a Voronoi diagram until all of the individual regions attain a somewhat equal size, essentially iteratively nudging the seed points that predicate the individual regions in the direction of their centroids - here's what this looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/timmmmmm-ezgif.com-video-to-gif-converter-1-.gif) [Link to Tweet in which I originally shared this GIF](https://twitter.com/gorillasu/status/1536349815931654144?ref=gorillasun.de) (back from 2022) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-25-at-23.11.38.png)](https://en.wikipedia.org/wiki/Lloyd%27s%5Falgorithm?ref=gorillasun.de) [Link to Wikipedia page about Lloyd's relaxation](https://en.wikipedia.org/wiki/Lloyd%27s%5Falgorithm?ref=gorillasun.de) This already looks really cool, but it's not very interesting since the resulting diagrams will always end up looking similarly even after the relaxation has come to a conclusion. However, what if we modified this procedure, and relaxed the Voronoi diagram based on some probability distribution? Meaning that we don't nudge the seed points towards the geometric centers of the cells, but rather in a weighted direction, towards a weighted centroid. This weighted centroid could for example be derived from the underlying pixel values that fall under the Voronoi cell, nudging the seed points in the direction of darker colors, ultimately achieving the stippling effect described when we place an image underneath our Voronoi diagram. And this is the part that I couldn't figure back then, how to calculate the weighted centroid basically - that's where Shiffman comes in, tackling it in the latter part of the video! I haven't had time to experiment with it yet but I'm super excited to do so. And kudos, the recent coding challenges have just been banger after banger! ## Okay, Color Spaces **My therapist:** *color spaces aren't real, they can't hurt you...* **Color Spaces:** *RGB, CMYK, HSB/HSV, HSL, LAB, YUV, XYZ, YCbCr, LCH (CIELCh), sRGB...* If you've ever wondered about Color Spaces, what the differences are, what each one of them is useful for, why we need so many and why there are so many in the first place - this is likely going to be the last article that you'll need to read about the topic. Eric provides us with all of the answers in this massive article: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-25-at-23.50.46.png)](https://ericportis.com/posts/2024/okay-color-spaces/?ref=gorillasun.de) [Link to Article](https://ericportis.com/posts/2024/okay-color-spaces/?ref=gorillasun.de) [Okay, Color Spaces — ericportis.com![](https://ericportis.com/favicon.ico)Eric Portis![](https://ericportis.com/assets/2024-02-20-okay-color-spaces/toy-colorspace2.svg)](https://ericportis.com/posts/2024/okay-color-spaces/?ref=gorillasun.de) I was shocked to learn that Oklab, a perceptual lab-like color space, is actually only 4 years old, and proposed in 2020 by Björn Ottoson through a blog post of his - now tell me that you can't change the world with a blog - and it actually seems to have become quite a big deal seeing that it has a number of advantages in certain areas: [A perceptual color space for image processingA perceptual color space for image processing A perceptual color space is desirable when doing many kinds of image processing. It is useful…![](https://bottosson.github.io/img/favicon/apple-touch-icon.png?hash=624ca04e47)Björn Ottosson![](https://bottosson.github.io/img/oklab/hue_oklab.png)](https://bottosson.github.io/posts/oklab/?ref=gorillasun.de) Unfortunately I'm all out of time for investigating strange internet rabbit-holes this week, so you'll have to be satisfied with this thread over on the Processing forums about the Oklab color space: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-26-at-00.11.27.png) How time flies, feels like the 'OK boomer' meme was trending just yesterday | [Link to Thread](https://discuss.pixls.us/t/oklab-colorspace/21964/4?ref=gorillasun.de) Anyway, lots of cool stuff here again. Read the article. ## Speaking in Net Language Credit for discovering this one goes to Tom aka pumaparded, sharing it over in the birbsnest discord's inspiration channel - leading me to one of the most fascinating reads I've had in a while. Michael Connor recounts the story behind Olia Lialina's net.art masterpiece "My boyfriend came back from the War": [Speaking in Net Language: My Boyfriend Came Back from the WarOn hypertext and memory in Olia Lialina’s groundbreaking 1996 work.![](https://static.rhizome.org/media/favicon256x256.png)RhizomeMichael Connor![](https://static.rhizome.org/media/blog/b4dc9d81-5c5a-422e-a4f3-c428bf13127f.jpg)](https://rhizome.org/editorial/2016/nov/10/my-boyfriend-came-back-from-the-war/?ref=gorillasun.de) If you're not familiar with Net art, short for networked art, it's and artform and art movement that emerged in the 1990s with the increasing accessibility of the internet, and used the emerging web technologies as the primary medium - it's a really interesting piece internet history to dive into: [net.art - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Teo_Spiller_net.art.trade_(net.art)_2.jpg/220px-Teo_Spiller_net.art.trade_(net.art)_2.jpg)](https://en.wikipedia.org/wiki/Net.art?ref=gorillasun.de) Olia Lialina's work is a prominent example of this. In "My boyfriend came back from the War" she retells the reunion with her boyfriend as an interactive web experience, and it can still be accessed [here](http://www.teleportacia.org/war/wara.htm?ref=gorillasun.de). I have to say it again, the Rhizome article is an absolutely fascinating read, not just analysing Lialina's work, but also contextualizing it and providing insights and commentary on the net.art movement from a historical point of view. Olia Lialina's work is part of the Net Art Anthology, where efforts have been made to present and preserve many more of these kinds of works: [NET ART ANTHOLOGYRETELLING THE HISTORY OF NET ART FROM THE 1980S THROUGH THE PRESENT DAY.![](https://d1v7jayx2s9clc.cloudfront.net/user/themes/rhizome/images/logo.png)NET ART ANTHOLOGY![](https://anthology.rhizome.org/user/themes/rhizome/images/social.png)](https://anthology.rhizome.org/?ref=gorillasun.de) ## Web3 News The FOMO this past week has been absolutely unreal with all of the NFT Paris shenanigans in full-swing and seeing everyone having a good time over in France - if you're curious about all of that you just gotta hop on over to Twitter and check out what everyone's posted over the past week: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-26-at-01.28.51.png)](https://twitter.com/thefunnyguysNFT/status/1761739362335678936?ref=gorillasun.de) [Link to Tweet](https://twitter.com/thefunnyguysNFT/status/1761739362335678936?ref=gorillasun.de) Doesn't mean that there hasn't been some other cool Web3 things to report on throughout the week 👇 ### fxhash launches on base [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-21-at-23.16.57.png)](https://twitter.com/fx%5Fhash%5F/status/1760418609292316746?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1760418609292316746?ref=gorillasun.de) Holup... what is Base? *Base-ically an Ethereum L2!* ... and what is an L2? 😅 L2s are solutions built on top of a blockchain's mainnet (L1) to improve scalability, and usually drastically lower gas fees! Base is actually only one of Ethereum's L2s, you might have heard other terms thrown around, like Polygon and Arbitrum that refer to other L2s. I have no idea how they work from a technical point of view, but I found this nice article by Lipsa Das from Ledger, that provides us with a good and easy to understand overview: [What Are Ethereum Layer 2 Blockchains and How Do They Work? | LedgerBuilt on top of Ethereum, Layer 2 blockchains help speed up transaction processing while keeping the costs down for the L1 network.![](https://www.ledger.com/wp-content/uploads/2021/11/Ledger_favicon.png)LedgerLipsa Das![](https://www.ledger.com/wp-content/uploads/2023/05/02_Blockchain_Thumb_No-title.jpg)](https://www.ledger.com/academy/topics/blockchain/what-are-ethereum-layer-2-blockchains-and-how-do-they-work?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-26-at-00.25.18.png) If I'm understanding this correctly, minting an NFT on base should then theoretically also make it available on mainnet Ethereum? Depending on how the L2 stores the token on the blockchain? Maybe one of you guys can chime in on this. But anyway, big W for fxhash - not an L at all. ### Aux Arbres by Zancan And while we're talking about base, in light of the Coinbase's France kick-off, Zancan was tasked with creating a generative artwork for the occasion - and it turned out to be a really impressive one: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-23-at-17.20.46.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-23-at-17.30.06.png) [Link to Thread](https://twitter.com/Highlight%5Fxyz/status/1760024190529245419?ref=gorillasun.de) | [Link to Project](https://highlight.xyz/mint/65d4c33f139818e311c5011e?ref=gorillasun.de) Continuing with his signature aesthetic, Zancan lets us take individual snapshots of larger growths with *Aux Arbres,* that translates to "To the Trees", each mint presents part of the branches or trunks of a number of trees. What's special about this generative artwork is that each unique mint from *Aux Arbers* is part of a bigger whole, in the literal sense of the word; highlight provides us with a special interface to visualize where each one of those minted snapshots falls and to which tree they belong: [Aux Arbres by zancan 🌿Aux Arbres “To the Trees” Infinite variations around the universal symbol of a tree. Browse the trees at https://auxarbres.xyz - Generative Art - Made with original JavaScript code - zancan, 2024![](https://mint.highlight.xyz/favicons/apple-touch-icon.png)Highlight![](https://highlight-creator-assets.highlight.xyz/main/image/78e95d13-2607-425c-926c-219c0110df2b.jpeg?d=1000x1000)](https://highlight.xyz/mint/65d4c33f139818e311c5011e?ref=gorillasun.de) What's more, it's a free mint, and the gas fees are super low due to it being minted on base - so if you've every wanted a Zancan piece, now's your chance! The project's still open for minting for a couple of days, and at this point over 50k individual snapshots have been taken. ### Iroh: IPFS Reimagined Recently learned about Iroh, an IPFS alternative that seems to do things in a little bit of a different manner, aiming to be a more efficient and scalable version of IPFS: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-26-at-02.32.45.png)](https://www.iroh.computer/design/iroh/?ref=gorillasun.de) [Link to official page](https://www.iroh.computer/design/iroh/?ref=gorillasun.de) But there seem to be some mixed opinions on the project when juxtaposed with IPFS. ## Thoughts on a Global Design System An interesting article from early January that I only recently came across is a piece by Brad Frost, titled 'A Global Design System'. The article caught my eye because when the term 'global' is attached to something, it often incites political undertones. In recent years the globalization debate has become more nuanced, more politically charged, and opposing views have emerged around it in different context. Moreover, the notion doesn't only concern itself with global trade and economics, but can also be conceptually extended to other practices, like web design in this instance: [A Global Design SystemTL;DR: This is a call to action to create a Global Design System that provides the world’s web designers & developers a library of common UI components. A Global Design System would improve the quality and accessibility of the world’s web experiences, save the world’s web designers and developer![](https://bradfrost.com/favicon.ico)Brad FrostBrad Frost![](https://bradfrost.com/wp-content/uploads/2023/11/CleanShot-2023-11-02-at-13.53.24.png)](https://bradfrost.com/blog/post/a-global-design-system/?ref=gorillasun.de) Frost argues that we live in *a duplicative present*, where organizations invest valuable labor time and resources into creating design systems that are to a large extent the same - naturally because everyone needs to adhere to the same web standards. The main argument of the article is that we'd alleviate much of this wasted time with a unified global design system - Frost doesn't just preach, but also follows up with an actual proposal for such a design system. You could now argue that it is not necessarily a bad thing that different companies are creating their own individual proprietary design systems - isn't it a good thing that there's diversity in brand identities and how they design things? On a related note, I only learned about 'A Global Design System' through a more recent article by Piccalilli that argues for a similar globalization scheme in the context of documentation platforms: [A Global Documentation Platform - PiccalilliInspired by the recent “A Global Design System” article, I talk about what worries me: the future of MDN and a possible alternative to it.![](https://piccalil.li/images/apple-touch-icon.png)Piccalilli![](https://api.urlbox.io/v1/ln9ptArKXobLRpDQ/png?width=1024&height=526&url=https%3A%2F%2Fpiccalil.li%2Fblog%2Fa-global-documentation-platform%2F%2Fsocial-image&retina=true)](https://piccalil.li/blog/a-global-documentation-platform/?ref=gorillasun.de) And another interesting piece of content by Brad Frost is this talk he gave at TEDx, almost a decade ago now, that I think pertains to many of the creative folk on here: ## Web Dev Things ### TC39 Meeting Notes Ecma International's TC39 is a group of JavaScript developers, implementers, and academics, that collaborates with the community to maintain and evolve the definition of JavaScript - and they recently held their 100th meeting. Hemanth captured all of the points of discussion of this 100th meeting in form of a dev.to writeup: [Updates from the 100th TC39 meetingThere were several items on the agenda, this post focuses on feature proposals and their progress…![](https://media.dev.to/cdn-cgi/image/width=180,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png)DEV Community![](https://media.dev.to/cdn-cgi/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0roll43cmd48luqxyyz.png)](https://dev.to/hemanth/updates-from-the-100th-tc39-meeting-4j2f?ref=gorillasun.de) ### Interactive Guide to SVG Loading Spinners Who doesn't love loading spinners? A repeat offender of the Newsletter, Sébastien Noël from fffuel, wrote this cool interactive guide to making them: [Making SVG Loading Spinners: An Interactive GuideLearn to create a cool SVG loading spinner with this step-by-step guide. We’ll use attributes like stroke-dasharray and stroke-dashoffset to make it easy.![](https://fffuel.co/images/favicon/favicon.svg)fffuel![](https://fffuel.co/images/covers/svg-spinner.jpg)](https://fffuel.co/svg-spinner/?ref=gorillasun.de) ### Book Reviews by Adam Majmudar Adam Majmudar built a really cool page for his book reviews, with an interactive scrolling bookshelf that lets you click on the individual books to read their reviews: 0:00 /0:13 1× [Link to Tweet](https://twitter.com/MajmudarAdam/status/1760485637680198099?ref=gorillasun.de) You can check it out here: [Books | Adam MajmudarI’m a constant learner and aspiring technical generalist. I’m also a founding enginer at thirdweb and on gap year from the University of Pennsylvania.![](https://adammaj.com/favicon.ico)Adam Majmudar![](https://adammaj.com/og-image-dark.jpg)](https://adammaj.com/books?ref=gorillasun.de) And also have a look at the code here: [adammaj.com/components/Bookshelf.tsx at main · adam-maj/adammaj.comadammaj.com | Built with Next & Chakra. Contribute to adam-maj/adammaj.com development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubadam-maj![](https://opengraph.githubassets.com/665cf3d1d4380b5b19e8e3fdff67808df7ce64ced765ea499ac4da761fdd234e/adam-maj/adammaj.com)](https://github.com/adam-maj/adammaj.com/blob/main/components/Bookshelf.tsx?ref=gorillasun.de) ## The Importance of Page Footers I got sick again this week, and came down Tuesday morning with some sort of food poisoning, which left me bedridden for the most of Tuesday and Wednesday. The older I'm getting, the more sensitive my stomach is becoming it seems. I did however come out on top of it pretty quickly, had a relatively clear head again on Thursday, and decided to pick up the re-design of the blog again as a way to ease myself back into things. I'd actually started working a little on designing a page footer back in January, hence it made sense to resume with that and try to finish it. A page footer is quite an important part of a webapge - some studies show that users will often scroll all the way down to the bottom of the page before actually reading any of the actual content of a page, usually in search of more information about the page, or alternatively as a navigation portal: [Why Optimizing Your Website Footer is More Important Than You ThinkThe website footer is one of the most overlooked areas of a company’s website. Learn why it deserves more attention and how to optimize it.![](https://static.licdn.com/aero-v1/sc/h/al2o9zrvru7aqj8e1x2rzsrca)Jon MacDonald![](https://media.licdn.com/dms/image/D5612AQG05865qVLVaw/article-cover_image-shrink_720_1280/0/1692234639299?e=2147483647&v=beta&t=d5RTkp9zmqaXnM8oGai10RxNRRBspB47jOXnD6gSlNQ)](https://www.linkedin.com/pulse/why-optimizing-your-website-footer-more-important-than-jon-macdonald?ref=gorillasun.de) Here's what I have come up with so far - and I must say, I'm quite happy with how it turned out: 0:00 /0:05 1× Wowowow, fancy schmancy animated cards. Figuring out the JS part that slides in the card description from below was actually trickier than I expected. It's still a bit rough around the edges, and the layout of the footer card still needs to be fixed up a little - but I'm quite proud of the idea of including the footer as an element within an article grid, making it feel sort of like a business card, while also being somewhat modular in design such that I can include it on other pages and grids as well. I also ended up spending quite some time designing the surrounding article cards, which I think will replace the current card design that you can find over on the article/archive page - that is currently a bit bare-bone. It's always a question of how information rich you want to make the elements, so that you catch the user's eye and make them want to click on it. The trickiest part here was overlaying text on an image; if the images aren't hard coded, then you can't always predict on top of what color your text will be placed - sometimes there will not be enough contrast for the text to be readable. When using white text, a solution is to underlay the text section of the cards with a soft blur that transitions to a darker color towards the bottom. This way we bring back enough contrast and the text becomes readable again. Also, you might've noticed the lack of a Gorilla Updates section - I thought I might try something a little different and give the section a proper title in context of what I've been working on in throughout the week. Expect a lot more web dev/design mini updates in the coming weeks! ## Music for Coding Neon Indian is one of those artists that has their very own sonic identity - it really isn't comparable to anything else. I thoroughly enjoy listening to his tracks every now and then. Drawing inspiration from 1980s pop and electronic music, with heavily analog and textured sounds, the overall mood he evokes is often described as nostalgic, capturing a sense of dreamy escapism: **And that's it from me this week, ~~while I'm typing out these last words I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.~~** Maybe you've noticed already, I've tried a little bit of a different tone/writing style this week, and now that I'm reading the previous closing statement, it's just a bit too *meh* for my taste, let's try something a bit more quirky - it was definitely a lot of fun putting together this week's issue. And now that you've made it through this week's newsletter, you might as well share it with someone that you know who might enjoy this kind of *content*, or not, but send it anyway - what's the worst thing that could happen? **If you've read this far, thanks a million!** *And if you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 44This week 📬 Lauren Lee McCarthy on Software Values - Intro to sizecoding with Mathieu Henri - Patt Vira tutorials - Tezumie’s AIJS Editor - Vetro Editions at Galeria Data - The Confusing 2024 Crypto-Art Meta - OpenAI’s text-to-video Sora model +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/02/puzzlebannn.png)](https://www.gorillasun.de/blog/gorilla-newsletter-44/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring or advertising through the Newsletter - reach out!* ### Gorilla Newsletter 44 URL: https://www.gorillasun.de/blog/gorilla-newsletter-44/ Last updated: 2024-02-19T18:26:15.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 44th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. That said, **hope you're all having a great start into the week!** Let's get straight into it! 👇 ## All the Generative Things ### Lauren Lee McCarthy on Software Values Yet again, Monk blesses our timelines with a stellar interview, this time with none other than Lauren Lee McCarthy. Having created P5 back in 2013, and having been part of the board of directors for the Processing Foundation from 2015 till 2021, she's done tremendous efforts in creating a more inclusive and accessible community for those that have not historically had the privilege to learn code and tech literacy. More than that, she is also an accomplished artist that creates profound conceptual work. In their conversation they address her most recent project 'Seeing Voices' that's releasing with Bright Moments as part of the Paris AI collection. The artworks are a curated set of collages, in which a system combines AI generated messages with generative compositions consisting of drawings by McCarthy. ![Image](https://pbs.twimg.com/media/GFXt0B_acAAF--2?format=jpg&name=4096x4096) The generated messages are an echo from her previous work 'Voices in my head' that she collaborated on with Kyle McDonald. Both pieces are about attributing meaning to software, asking questions about control and how software can influence and change us. McCarthy states that software is not a neutral product; that it inherits the ideas, biases and values of its creators. I believe that this is an incredibly important topic that isn't talked about enough. We engage with software on a daily basis, what effect does it have on us? How are we collectively changing through our interactions with it? [Lauren Lee McCarthy on Software ValuesLauren Lee McCarthy, celebrated artist, UCLA professor and creator of p5.js, spoke with Peter Bauman (Monk Antony) about Seeing Voices, her first long-form generative art project. They also discuss collaborating with AI and inclusive community building, while questioning the inherent values embedded in software.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65cb645a90c702418d27a1fb_LLM%20SV.jpeg)](https://www.lerandom.art/editorial/lauren-lee-mccarthy-on-software-values?ref=gorillasun.de) And if that's not enough Le Random for you, there's another interview with Linda Dounia, that I just haven't had the time to dig into yet: [Linda Dounia on Memory MachinesArtist Linda Dounia spoke with Peter Bauman (Monk Antony) about the potential of AI to combat cultural as well as biological loss, using her project Flore Perdue as a springboard.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65d1fbaef17f19b1fb728170_LD%20C.jpeg)](https://www.lerandom.art/editorial/linda-dounia-on-memory-machines?ref=gorillasun.de) ### Introduction to size-coding by Mathieu Henri In last week's newsletter I mentioned Lovebyte 2024, a yearly online celebration of everything related to sizecoding and the demoscene. Although the 2024 edition of the event is over now, there's still a couple of cool things that I missed and that are very worth sharing still. For instance, the closing ceremony that took place the same day I published the previous issue, in which all of the winning submissions were presented. The event concluded with a whopping 351 submissions from participants all around the world: Another really cool recording that came from the event, is this awesome video seminar by Mathieu Henri who's been part of the demoscene since the very start, and still highly involved. In the video he introduces us to sizecoding in JavaScript and also tells us a little bit about the history of the demoscene: Mathieu starts us off with some of the features that make Javascript a great language for sizecoding - pointing out its leniency and some of the shenanigans that allow us to shave off quite a few bytes from our code. He proceeds to give a recount about the early days of the demoscene, showcasing some of the very first competitions that were held in that context and pointing out the competition websites - that somehow still work today - where the participants' submissions were documented, such as [Web4096](http://web4096.message.sk/?ref=gorillasun.de) held in 1999, as well as the impossible [256B](http://www.p01.org/256b%5Fhtm/?ref=gorillasun.de) challenge in 2002, where you had to somehow make a sketch in only 256 bytes. Mathieu actually documented his participation in some of these events over on his portfolio and even provides us with the code that he submitted back then, alongside modern equivalents - I was really blown away by his entry to the 256B challenge in which he made a Metaball sketch in just 256 bytes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-18-at-23.13.40.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-18-at-23.14.20.png) [Link to Matthieu's Portfolio](http://www.p01.org/256b%5Fhtm/?ref=gorillasun.de) ### Patt Vira on the Persistence of Vision I've become a huge fan of Patt Vira's content over on YouTube; her code-along tutorials are very polished and easy to follow - her video on marching squares got me back into exploring the algorithm in more depth for myself after Genuary concluded, and unlocked a lot of new ideas that I wouldn't have otherwise had. Patt has a knack for exploring interesting ideas. Here's one that I highly enjoyed, in which she explores the concept of 'Persistence of Vision' where a drawn cube only appears within a noisy grid of pixels when it is in motion: Persistence of Vision is a phenomenon that occurs when the visual perception of an object remains for a few brief moments after the fact that it has actually vanished from our vision. A good example of this are lightning strikes at night-time, you can often still see their outline for an instant after they've struck. On the Wikipedia page there's a nice excerpt from Leonardo da Vinci's notebook on this: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-19-at-00.30.02.png)](https://en.wikipedia.org/wiki/Persistence%5Fof%5Fvision?ref=gorillasun.de) [Link to Wikipedia page](https://en.wikipedia.org/wiki/Persistence%5Fof%5Fvision?ref=gorillasun.de) This effect seemingly also works great in the setting of a noisy grid of pixels. Patt was inspired by a recent video from Chris Long, in which he goes over how he first discovered that effect back in the eighties, while experimenting with line intersections on his home computer - noticing that the apparent shapes could only be made out while they were in motion: The comment section to the video is also highly interesting with other chiming in with their thoughts on the effect. Go and show both of their channels some love and leave them a sub and a thumbs up! Definitely recommend keeping up with what Patt's doing - I have a hunch that we're going to see a lot more stellar content from her in the coming months. ### Tezumie's AIJS Editor Updates Tezumie has been hard at work and consistently adding new features to his AI powered code editor - it's been really exciting seeing him turn his initial idea into more and more of a complete platform. Now it even boasts profile pages for users, the ability to save sketches, as well as an explore page and many more cool and convenient things. Tezumie frequently posts updates about it in the AIJS discord: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-19-at-14.54.03.png) [Link to AIJS discord](https://discord.gg/CRrPc5Tuqt?ref=gorillasun.de) One update that I've been super excited about and have to yet take for a spin is the custom embeds, I mentioned it to Tezumie a couple of weeks ago, asking about it and explaining why I don't usually use the P5 editor's or OpenProcessing's embeds. It's mainly due to them slowing down the initial page load since they have to load in additional script files - if you have multiple embeds on a single page (a tutorial for instance) they don't share those resources, but rather, each individual embed needs to load in its own assets: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-17-at-22.50.38.png)](https://twitter.com/aijs%5Feditor/status/1758969520981487749?ref=gorillasun.de) [Link to Tweet](https://twitter.com/aijs%5Feditor/status/1758969520981487749?ref=gorillasun.de) Checking out the docs for AIJS it's always a breath of fresh air when effort is put into that aspect of a software - I thought that it was a really nice touch to also support Farcaster frames as a potential embed: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-19-at-15.00.10.png) I think what's really cool about AIJS, is that it's made by someone that is a creative coder and generative artist themself - building the relevant features that are useful for that specific workflow. Openprocessing, you better watch out, Tezumie's coming for you! ## Web3 News ### A Web3 Travel Guide for Paris Next week is going to be big with everyone gearing up for the annual NFT Paris show - if you're visiting, you might also want to stop by some of the other spots in Paris that hold significance in the Web3 space. Ana Maria wrote a Web3 travel guide for the occasion over on Forbes, pointing out the important galleries in the area with some of their upcoming shows: [Web3 Travel Guides: The Parisian Crypto Art SceneParis, the City of Light, has long been a magnet for the cultural avant-garde. In the case of Web3 innovators, the same holds true.![](https://i.forbesimg.com/48X48-F.png)ForbesAna María Caballero![](https://imageio.forbes.com/specials-images/imageserve/6540101c37930c0bca90ac5d/0x0.jpg?format=jpg&crop=3840,2160,x0,y0,safe&height=900&width=1600&fit=bounds)](https://www.forbes.com/sites/digital-assets/2023/10/30/web3-travel-guides-the-parisian-crypto-art-scene/amp/?ref=gorillasun.de) Btw, if you end taking any cool pics or see any cool generative art and Web3 related things, send'em over, would love to include them in the next issue of the newsletter! ### Vetro Editions at Galerie Data If you end up finding yourself in Paris tomorrow (20th of February), you'll have to stop by Galerie Data, they're hosting our favorite genart publishing house Vetro Editions, celebrating the launch of four of their books alongside some of the artists featured in those books: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/1e73c8c9-b5d2-d800-301c-fd8dca84b8ff.png) Their roster includes the second issue of Matt DesLaurier's Meridian art book, Julien Gachadoat's "Pathways" that recently came out, "Tracing the Line" that recounts the plotter work of many pioneering and contemporary generative artists, as well an entirely new addition, that just came out this past week for RCS: ![Image](https://pbs.twimg.com/media/GGnVIGfWEAAoP8i?format=png&name=small) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-19-at-01.27.49.png) [Link to RCS](https://www.clubnft.com/book?ref=gorillasun.de) | [Link to Tweet](https://twitter.com/artnome/status/1758634110594191498?ref=gorillasun.de) RCS also published a complementary announcement post over on their site, in which Carla Gannis from the RCS team recounts the motivations behind starting the site, their position in amplifying the voices of the crypto art scene as well as a brief overview of what's happened in recent years. I believe that the book features the 250 articles that have been published on RCS over the course of the past 2 years, and likely more material. If you're interested in getting the book, you can learn a bit more about it here: [ANNOUNCING THE RCS BOOKAfter two years and more than 250 articles, it’s time to put digital art’s global community into print![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Carla Gannis![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/65cf92968cd87996de727f96_Screenshot%202024-02-15%20at%2020.45.31.png)](https://www.rightclicksave.com/article/introducing-the-rcs-book-right-click-save-the-new-digital-art-community?ref=gorillasun.de) Just to disclose, I'm not sponsored by any of the mentioned parties - I simply think that Vetro Editions makes really awesome books, and all of these are very worth having in your genart book collection. ### The Confusing 2024 Crypto-Art Meta Although 2024 is shaping up to be a year with many new and exciting Web3 developments, and while there's many efforts being made into making things more interoperable, it also seems that things are becoming more and more fragmented - I'm personally having a really hard time to keep up with everything, and I believe I'm not the only one in this. Sgt\_slaughtermellon wrote an interesting think piece about the current state of crypto art, providing us with the bigger picture of what's happening with the different marketplaces and chains, how to adapt as an artist, and that it's all just a bit too chaotic: [The Confusing Meta of Early 2024 Crypto-ArtIf you’re an artist who has been around NFTs for a minute but aren’t considered “blue chip” - what’s this year looking like for you? I’m going to take a second to offer some thoughts on the current scene, the market, and toss out some potential strategies.![](https://mirror.xyz/favicon.ico)![](https://images.mirror-media.xyz/publication-images/5xj8nmNtJAhTqr8GvYsA6.png?height=996&width=1992)](https://mirror.xyz/sgtslaughtermelon.eth/GUQMZGtax7C8VzBOC-8yJtLwc3wszvSR7nxx82YQIkI?ref=gorillasun.de) ### Anna Lucia's Spellbound One other thing that I wanted to share here is Anna Lucia's newest project over on fxhash, a redeemable collaboration with the German fashion lab Phoebe Heess. Conceptually, the artwork is fascinating: via fxhash's code driven parameters, collectors can record their voice or upload an audio file, where the waveform of that audio then determines the pattern visualized on the scarf: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-17-at-02.35.44.png) [Link to Tweet](https://twitter.com/annaluciacodes/status/1758549059063697920?ref=gorillasun.de) Being the first manufactured redeemable on fxhash makes this one a very special digital token to collect. ## Tech and AI ### Mario Kart 3 in the Browser A fan of Mario Kart? Well you can now play it in your browser [here](https://mario-kart-3-js.vercel.app/?ref=gorillasun.de#r=R9C3D), and you can even build your own version of it using Alex Lunakepio's recently open sourced project: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-18-at-12.53.07.png) ![Image](https://pbs.twimg.com/media/GGJUz4DWsAAiEUY?format=jpg&name=medium) [Link to Tweet](https://twitter.com/Lunakepio/status/1757060065306022315?ref=gorillasun.de) Here's a link to the github repo, which has amassed a whopping 1.2k stars in just a couple of days - there isn't too much to say here, simply that it's a really cool project: [GitHub - Lunakepio/Mario-Kart-3.jsContribute to Lunakepio/Mario-Kart-3.js development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubLunakepio![](https://opengraph.githubassets.com/84e224c945ceab80e78fbd1b08a7287a139c4d89fa01ad9a5c216930a1d63c69/Lunakepio/Mario-Kart-3.js)](https://github.com/Lunakepio/Mario-Kart-3.js?ref=gorillasun.de) ### 10 Minecraft Facts by Alan Zucconi Minecraft has quite a long history, and was very popular when it first came out in 2009, but slowly fizzling away over the 2010s. The game then saw a massive boom in 2021 when PewDiePie returned to the game, popularizing it again and allowing it to have somewhat of a renaissance. And it seems to have retained its popularity even in 2024, with over half a million daily players. I'm bringing all of this up because Minecraft is also interesting from a computational point of view, recently came across a re-tweet from Alan Zucconi, a thread that he'd posted back in 2022 enumerating 10 interesting facts about the game, mainly revolving around its world generating system, that I found highly interesting: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-18-at-16.11.21.png)](https://twitter.com/AlanZucconi/status/1533124547695845376?ref=gorillasun.de) [Link to Tweet](https://twitter.com/AlanZucconi/status/1533124547695845376?ref=gorillasun.de) If you don't know Alan Zucconi, he's a bit of a super star in the game dev scene, having created an impressive number of tutorials on his blog - if you're getting into game dev things you need to check it out: [Tutorials - Alan ZucconiGame Development, Machine Learning, Programming and Electronics. Browse all the tutorials.![](https://www.alanzucconi.com/wp-content/uploads/2015/10/cropped-AZ-big-270x270.png)Alan Zucconi![](https://www.alanzucconi.com/wp-content/uploads/2019/09/9GPu3SO5.png)](https://www.alanzucconi.com/tutorials/?ref=gorillasun.de) ### OpenAI's text to video model Sora It's been a minute since I've been genuinely impressed by AI, last time I was floored was when I took DALL-E3 for a spin (which is freely accessible via the Bing browser). OpenAI's new Sora model seems to take things to the next level by generating coherent and realistic high quality videos given an input prompt. OpenAI's already shared a number of videos in their announcement page showcasing some of the strengths and weaknesses of the new model: [Sora: Creating video from text![](https://openai.com/favicon.ico)![](https://images.openai.com/blob/8264d3d7-922c-4343-b43d-6665e44bcb91/paper-airplanes.jpg?trim=0%2C0%2C0%2C0&width=1000&quality=80)](https://openai.com/sora?ref=gorillasun.de) The videos aren't perfect - it's not so difficult to determine that they're still clearly AI generated with specific giveaway details - for instance, it doesn't really know too much about the physics of the real world. One of the generated videos that's been making the rounds features a team of archeologists where they dig up a plastic chair - the chair materializes from the sand and floats around the scene almost like it isn't a part of it: 0:00 /0:20 1× The input prompt to this one was: "Archeologists discover a generic plastic chair in the desert, excavating and dusting it with great care." | [Link to page in which the video is shared](https://openai.com/sora?ref=gorillasun.de) The chair was most definitely an unpaid actor in this scene. Another thing that immediately jumped out to me was how eerily synchronous motion sometimes is in the generated videos, like the manner in which pedestrians in the background walk or the waves crashing onto the cliffs featured in some of the other videos. It all feels a little surreal. But on the other hand it seems that we're incredibly close to what might just alter the entire movie, VFX and video game industry - not only can the model generate video based on input prompts but it can also do so from input images and videos. Here's a link to a more technical write-up from the OpenAI team: [Video generation models as world simulatorsWe explore large-scale training of generative models on video data. Specifically, we train text-conditional diffusion models jointly on videos and images of variable durations, resolutions and aspect ratios. We leverage a transformer architecture that operates on spacetime patches of video and image latent codes. Our largest model, Sora, is capable of generating a minute of high fidelity video. Our results suggest that scaling video generation models is a promising path towards building general purpose simulators of the physical world.![](https://openai.com/favicon.ico)![](https://images.openai.com/blob/28bcbcb2-563a-432b-bb30-d74f66a087fe/young-tiger.jpg?trim=0%2C0%2C0%2C0&width=1000&quality=80)](https://openai.com/research/video-generation-models-as-world-simulators?ref=gorillasun.de) ### AlphaCode2: Gemini for Competitive Programming Google recently replaced their previous AI powered chat partner Bard with a more powerful LLM called Gemini: [Introducing Gemini: our largest and most capable AI modelGemini is our most capable and general model, built to be multimodal and optimized for three different sizes: Ultra, Pro and Nano.![](https://blog.google/static/blogv2/images/apple-touch-icon.png)GoogleSundar Pichai![](https://storage.googleapis.com/gweb-uniblog-publish-prod/images/Gemini_SS.width-1300.jpg)](https://blog.google/technology/ai/google-gemini-ai/?utm%5Fsource=yt&utm%5Fmedium=social&utm%5Fcampaign=og&utm%5Fcontent=&utm%5Fterm=#sundar-note) And it seems that there are quite a few differences, with Gemini leveraging a more modern model architecture similar to the other chat-bots out there, multi-modality being an important feature to have for it to compete. What's more is that they built another model on top of Gemini that's specifically devised for solving programming problems - even at the competitive level - called AlphaCode2\. They announced it in the following video: The cool thing about AlphaCode2 is that it not only provides an answer but also the reasoning and how it approaches the given problems: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-18-at-16.26.13.png) As of now it is not a public model and is still kept secret, so we'll have to take their word for it - looking into the previous AlphaCode model I also couldn't really find any concrete pointers to where it can be taken for a test run, or if it has been open sourced somewhere except for this [demo](https://alphacode.deepmind.com/?ref=gorillasun.de#layer=18,problem=114,heads=00000000000). They do however have an interesting writeup on the model back from 2022: [Competitive programming with AlphaCodeSolving novel problems and setting a new milestone in competitive programming.![](https://deepmind.google/static/icons/google_deepmind_48dp.5b470587fe7d.svg)Google DeepMindThe AlphaCode team![](https://lh3.googleusercontent.com/vQ0Ow6LwCpigfPyTGUhXEfdMBWPyHmaCo7eoQW7bv3QoZXW6EIj18FPiCLI1vlMYlUAOvEXta1KSkl8P2KScquYJb-Dm_QygP9kdlLYkpF4nVyEH=w1200-h630-n-nu)](https://deepmind.google/discover/blog/competitive-programming-with-alphacode/?ref=gorillasun.de) ## Gorilla Updates What have I been up to this week? I resumed my exploration of marching squares - extending the code to also become able of finding the contours of arbitrary polygonal shapes. Here's what this looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/raymarching-raytracing.png) I think there's already some interesting possibilities here that are worth exploring more in depth in the future. The trick to do this is by using raycasting to check if grid vertices fall under the areas of the polygonal shapes, setting them to active if they do, such that the marching squares algo can subsequently find the contours. This can be extended with a point-line distance function to determine how close the grid vertices are to the polygonal region, and setting them to an active value based on proximity - which leads to this nice rounded off look of the contours that I thought looked really great. This all started after browsing Pinterest for inspiration, a platform I've grown to love more and more over the past year. I found an interesting artwork that immediately drew me in: ![](https://i.pinimg.com/564x/90/6c/1a/906c1a406aadf4a6042ab243f69f152e.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/IMG_4184-min.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/puzzle-tile-1-1.png) Inspiration / Sketchbook Idea / Generative Shape I couldn't find the artist behind the drawing (image on the left, if you know that artist let me know), but I thought that it was brilliant and gave me many ideas - I immediately had to ask myself what it would look like in generative form. The first step would be to figure out how to create the shape of a puzzle tile algorithmically. And it turned out to be trickier than I initially assumed. Whenever you're trying to make any shape that's a bit more complicated than a simple circle or a convex regular n-gon you run into all sorts of problems. Although marching squares is a viable approach, it also comes with a lot of problems. For instance, the smoothness of the final 'rendered' shape entirely depends on the resolution of the underlying grid that's used to trace the contours - and the higher that resolution of that grid, the longer it takes for the shape to render. The code ended up being an absolute mess when I finally managed to make it produce a the shape of a puzzle tile, which can be done by lining up 4 circles at the edges of a square and then letting the contour algo do its magic. Inward dents are achieved by setting the circles as "negative" and making them toggle off the grid vertices. One thing that I really wanted was the round and organic feel that many puzzle tiles have, which was difficult to do with how the vertices of the final shape were distributed along its contour. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot_2024-02-15_at_20.15.42-1.png) After spending nearly three days on this exploration, I ultimately came to the conclusion that marching squares was not the right approach for this task - I probably could have spent some time optimizing my code but I just wanted to get the idea to work and see what it looked like. I ended up using the polybool.js library that allows the compositing of geometric shapes via boolean operations, a topic that I'm likely going to talk about more at some point. Here's what I ended up with: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/puzzle-patch.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/puzzletiles.jpg) Happy with where it's at now, but this is still not the final form of it. ## Music for Coding The opening to Evangelion is an absolute masterpiece; arguably one of my favorite songs of all time - I must've listened to a few dozen different versions of it over the past years, and I recently had a craving to listen to it again. One of the results that popped up in YouTube search was this a Capella version by Ignite Vocal, and I was instantly floored - what an absolute banger: The group's simply stellar, there isn't a single thing to dislike about their rendition. Their other stuff is great as well. I'm surprised that they only have 619 subscribers on their channel (at the time of writing this) - I think they deserve at least a hundred times that number. **And that's it from me this week, while I'm typing out these last words I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 43A la recherche de Vera Molnár - Poems in Code - Pioneers of ’80s generative art - Matt DesLauriers’ Sierra - Lovebyte 2024 - Jeres’ Heuristics of Emotion - Simulating Infinite Grids - State of the Long-Form Generative Art Market +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/02/render.png)](https://www.gorillasun.de/blog/gorilla-newsletter-43/#generative-art-goes-international) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** *If you're interested in sponsoring the Newsletter or advertising - reach out!* ### Gorilla Newsletter 43 URL: https://www.gorillasun.de/blog/gorilla-newsletter-43/ Last updated: 2024-02-12T12:45:18.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 43rd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **If you're interested in sponsoring the Newsletter - reach out! That said, hope you're all having a great start into the week! L**et's get straight into it! ## Generative Art goes International It seems that everyone's properly recovered from Genuary 2024, and that a whole slew of generative art exhibitions are afoot around the globe - from Budapest to London, and all the way to Japan 🌎 ### À la recherche de Vera Molnár Vera Molnár passed away early December of 2023, just a month prior to what would have been her 100th birthday - she lives on however, not only through her art, but also through the new generation of generative artists for many of which she is still a big inspiration. Just two days ago on the 10th of February, the exhibition *À la recherche de Vera Molnár* kicked off at the Ludwig Museum for Contemporary Art in Budapest to celebrate her life's work: ![À la recherche de Vera Molnár](https://fisheyeimmersive.com/wp-content/uploads/sites/2/2024/02/molnar.jpg) [À LA RECHERCHE DE VERA MOLNAR – Artworks by Vera Molnar and Homages by Internationally Acclaimed ArtistsThe Ludwig Museum’s exhibition titled À la recherche de Vera Molnar pays tribute to the artistic legacy of Vera Molnar, who passed away shortly before her 100th birthday. Born in Hungary and educated at the Hungarian Academy of Fine Arts, Molnar lived and created in France from 1947 until her death. From 1968, she was among the first to create artworks using a real computer, and she is still widely regarded as one of the most significant pioneers of computer art.![](https://www.ludwigmuseum.hu/profiles/ludwig/themes/ludwig_theme/assets/img/favicon.png)Ludwig Museum![](https://www.ludwigmuseum.hu/sites/default/files/exhibition/lead-image/2024-01/LUDWIG_VeraMolnar_negyzetes_0119.jpg)](https://www.ludwigmuseum.hu/en/exhibition/la-recherche-de-vera-molnar-artworks-vera-molnar-and-homages-internationally-acclaimed?ref=gorillasun.de) A highlight of the exhibition's opening ceremony, was a talk given by Frieder Nake, another one of the generative art OGs. From what I see in the picture, it's remarkable how many people came together to celebrate Vera Molnár that day: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.09.53.png) I couldn't find if there was a recording of the talk | [Link to Tweet](https://twitter.com/pointline%5F/status/1756009639555026974?ref=gorillasun.de) Moreover, two tribute pieces were presented, one from Mario Klingemann and another by Iskra Velitchkova: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.10.46.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.14.38.png) [Link to Quasimondo's Tweet](https://twitter.com/quasimondo/status/1756263413997613417?ref=gorillasun.de) | [Link to Iskra's Tweet](https://twitter.com/pointline%5F/status/1756352834977636676?ref=gorillasun.de) In light of the exhibition, [Aurèce Vettier](https://twitter.com/aurecevettier?ref=gorillasun.de) was asked by the centre Pompidou to reflect on his collaboration with Vera back in 2023\. He wrote a beautiful article in which she pays tribute to the Grande Dame, describing how she never lost her passion for making art even with old age: [AI, NFT: Vera Molnár, a step aheadAs early as the 1960s, Vera Molnár was exploring the infinite possibilities of computer-assisted art. A few months before her death at the end of 2023, at the age of 99, she was working on new works generated using... artificial intelligence. As the Musée National d’Art Moderne presents a major retrospective of her work, the artist aurèce vettier, who worked with her, recounts the outstanding creativity of an eternal pioneer.![](https://www.centrepompidou.fr/typo3conf/ext/piazza_base/Resources/Public/Icons/favicon.ico)Centre Pompidouaurèce vettier/Paul Mouginot![](https://www.centrepompidou.fr/fileadmin/user_upload/Vera-molnar-aurece-vignette.jpg)](https://www.centrepompidou.fr/en/magazine/article/ai-nft-vera-molnar-a-step-ahead?ref=gorillasun.de) Over on Twitter he also lets us in on a little personal anecdote : ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.00.55.png) [Link to Tweet](https://twitter.com/aurecevettier/status/1754633111193690572?ref=gorillasun.de) Many more words and resources about the exhibition and Vera Molnár were shared over on social networks - I merely tried to showcase the highlights here. If you somehow find yourself in Budapest, the Ludwig Museum is definitely worth a visit, with several other simultaneously ongoing exhibitions. As an addendum, towards the end of the exhibition page, a nice little booklet is linked which I thought was very well made, but also very easy to overlook - here's some excerpts: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-22.52.45.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-22.53.02.png) [Link to the Booklet](https://www.ludwigmuseum.hu/system/files/news/attachments/2024-02/LUDWIG%5FVeraMolnar%5F100x180%5Fbooklet%5F0125%5FIII.pdf?ref=gorillasun.de) ### Poems in Code Poems in Code is a beautiful single screen exhibit set up in the middle of Ebisu square, a big open space located in the heart of Tokyo: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.21.09.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-23.21.55.png) [Link to Takawo-san's Tweet](https://twitter.com/takawo/status/1756254542491263024?ref=gorillasun.de) | [Link to Takumanakata's tweet](https://twitter.com/takumanakata/status/1756189199664140452?ref=gorillasun.de) The massive screen showcases animated pieces by Shunsuke Takawo, Zach Liebermann, Casey Reas, Seohyo, Alexis Andre, fingacode, and many other Japanese and international artists. Don't be scared by the following big block of Japanese text, you can find a complete list of artists + showcased artworks in this event page - translating it through your browser should do the trick: [CCBT×恵比寿映像祭2024「Poems in Code——ジェネラティブ・アートの現在/プログラミングで生成される映像」 - シビック・クリエイティブ・ベース東京 \[CCBT\]CCBTの未来提案型キャンプを発展させ、大型ビジョンによるジェネラティブ・アート作品の上映を恵比寿映像祭202![](https://ccbt.rekibun.or.jp/wp-content/plugins/ccbt-tweaks/favicon.svg)シビック・クリエイティブ・ベース東京 \[CCBT\] -![](https://ccbt.rekibun.or.jp/wp-content/uploads/2024/01/1_banner-big_fix.png)](https://ccbt.rekibun.or.jp/events/poemsincode?ref=gorillasun.de) ### Zach Lieberman solo Exhibition Over in London, Zach Lieberman kicked off his very first solo exhibition with Unit London, filling an entire exhibition space with his trademark circular gradients and biomorphic blobs: ![](https://res.cloudinary.com/unit-london/image/upload/c_scale,w_1960,h_1474,dpr_2/f_webp,q_auto/v1707391749/B076987-v2_830850a89a.jpg?_i=AA) I've been a big fan of Zach's approach ever since I discovered generative art for myself. His concept of poetic computation, that likens writing code to writing poetry, really resonated with me and was one of the ideas that got me hooked on creative coding as an artform. One the first few videos I ever saw on creative coding was actually by talk by Zach, in which he talks about his concept of poetic computation, showcases his process, and live codes a little squiggly shape to demonstrate what it's all about: If you're in London, definitely go check out the exhibition - I'm actually going to be in London towards the end of February, so I'll definitely stop by. You can learn a little more about the exhibition and see a list of the presented Lieberman works over on the exhibition page: [Zachary Lieberman | Circles, Blobs, Ripples | UnitZachary Lieberman’s first solo exhibition with Unit explores the unexpected effects of geometries crafted with code, revealing how a systematic approach to image-making can transform shapes into mesmerising visual experiences.![](https://res.cloudinary.com/unit-london/images/w_192,h_192,c_fill,g_auto/f_webp,q_auto/v1663174187/cropped-favicon-512-2/cropped-favicon-512-2.png?_i=AA)Unit![](https://res.cloudinary.com/unit-london/images/f_webp,q_auto/v1707486397/outputTest-366-2/outputTest-366-2.png?_i=AA)](https://unitlondon.com/exhibitions/zachary-lieberman-circles-blobs-ripples/?ref=gorillasun.de) ## All the Generative Things And here's some other generative news that you can enjoy no matter where you currently are in the world right now 🎨 ### Pioneers of '80s Art & Innovation Le Random has been going strong in the past weeks, not only consistently expanding their timeline, but also putting their best foot forward in terms of Twitter spaces and publishing the recordings in podcast format. In the most recent talk they invited 9 of the pioneers that were at forefront of generative art in the 80s, letting them present their stories and reflecting with them on the practice at that point in time: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-00.49.57.png) [Link to Podcast](https://podcasts.apple.com/us/podcast/le-random/id1726153340?i=1000644631183&ref=gorillasun.de) We often talk about the pioneers from the 50s and 60s, but not much about the following decades, and I believe that the artists from those eras are in many ways overlooked and not given the credit that they deserve. Le Random steps in as the middle-man to introduce us to them - I'm a bit embarrassed to admit, that I didn't know any of the invited guests other than Geoff Davis prior to listening to the talk. You can also find the group talk in video format here if you prefer that: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-12-at-12.32.02.png)](https://twitter.com/lerandomart/status/1755585860043423788?ref=gorillasun.de) [Link to Tweet](https://twitter.com/lerandomart/status/1755585860043423788?ref=gorillasun.de) I know, at this point I'm sharing a piece of Le Random content about every other week, but they're simply doing efforts in the genart space that no one else is - quite literally documenting the entire history of it. Go support them and share their content! Also looking forward to Monk's next article! ### Matt DesLauriers' Sierra Following his previous project Hachure, which exhibited with Verse towards the end of 2023, Matt DesLauriers returns with another Web Assembly project in which he takes a step back from the long-form approach in favor of letting his system fulfill a more curatorial role in the art making process: [In conversation: Matt DesLauriers | Avant ArteGenerative artist Matt DesLauriers and Master printmaker Tom Murphy discuss the process behind Sierra, a print that explores systems in colour and systems in printmaking.![](https://avantarte.com/apple-touch-icon.png)Avant Arte![](https://avantarte.com/api/og?token=ca9977fc9dc331d093348e90e4213417cd04b71b09a4db1fc691b3f92ac06166&overline=Articles&title=Generative%20printmaking%20and%20systems%20of%20colour&image=https%3A%2F%2Fa.storyblok.com%2Ff%2F119968%2F2068x1238%2Ffebfd43ba3%2Fmatt-deslauriers-_timcraig_18-1-24_98.jpg%2Fm%2F510x510&overlay=&isDark=&isVideo=true)](https://avantarte.com/insights/articles/Matt-DesLauriers-Generative-printmaking-and-systems-of-colour?ref=gorillasun.de) Matt DesLauriers details the making of Sierra in form of a meticulous project page over on his site, that isn't just a treat for the eye, but also reveals and explains to us the code that brings the single output to life: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-00.25.47.png) I really appreciate how much thought and care Matt puts into presenting and documenting his works - something that I don't see from many artists. I think it's really important to capture these moments in time for future reference. Here's also a link to the Github repo in which he open sources part of the code that helps in creating the screen print: [GitHub - mattdesl/lcms-wasm: a WASM reboot of lcms.js (Little-CMS for JS)a WASM reboot of lcms.js (Little-CMS for JS). Contribute to mattdesl/lcms-wasm development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubmattdesl![](https://opengraph.githubassets.com/5776a6c8343f5cef52561ae4c79953a104e90b71b17d133dabc39f3f3f8292aa/mattdesl/lcms-wasm)](https://github.com/mattdesl/lcms-wasm?ref=gorillasun.de) Now you might ask, what actually is WebAssembly? Often abbreviated as wasm, it's basically a technology that allows developers to run high-performance code on web browsers. It's like a common language that different programming languages can be translated into, enabling them to work together seamlessly on the web. A good starting point for Web Assembly is the mdn web documentation: [WebAssembly | MDNWebAssembly is a type of code that can be run in modern web browsers — it is a low-level assembly-like language with a compact binary format that runs with near-native performance and provides languages such as C/C++, C# and Rust with a compilation target so that they can run on the web. It is also designed to run alongside JavaScript, allowing both to work together.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/WebAssembly?ref=gorillasun.de) It's interesting to see Matt shift to this more curatorial approach considering that he's previously previously mainly been making long-form projects, most notably Meridian and FOLIO. I wonder if it's to adjust to the current generative art market. We'll talk a bit more about that in one of the following sections. ### Lovebyte 2024 I only learned about Lovebyte through a tweet by Frank Force, in which he announced that he was working on a tiny demo for the event - the demo itself is super impressive, considering that it's roughly 1kb in size, and also generates music in addition the animation: 0:00 /0:13 1× The video also has sound, which I couldn't screencap, so check out the tweet as well | [Link to Tweet](https://twitter.com/KilledByAPixel/status/1755470294565699827?ref=gorillasun.de) And it seems that Lovebyte is an absolutely crazy event, that comes to life in its entirety through a number of live streams, where coders present their bytesized creations and also live code them. You can find some of the recordings over on their Youtube channel, including this year's opening show - if you're into size-coding this is going to be a treat for you: Link Here's a link to [the event page](https://lovebyte.party/?ref=gorillasun.de#About), as well as an [overview to all submissions](https://demozoo.org/parties/4760/?ref=gorillasun.de). ### Jeres' Heuristics of Emotion Jeres wrote a beautiful article accompanying his newest generative art project 'Heuristics of Emotion', which is an attempt at giving shape and color to the digital emotions of the machine: [Jeres | Heuristics of Emotion![](https://jeres.xyz/favico/apple-touch-icon.png)Heuristics of Emotion![](https://jeres.xyz/heuristics-of-emotion/images/hoe-header.png)](https://jeres.xyz/heuristics-of-emotion/?ref=gorillasun.de) I really love the blend of essay-like introduction, intertwined with anecdotal storytelling and technical details sprinkled on top - it seems Jeres is not just great at making generative art, but also at putting his thoughts into written form. If you're going to read one thing this week, I recommend that you read this one. ### Creating an Animated 3D Starfield Effect One interesting tutorial I came across this week is over on the kirupa site, teaching us how to create a 3D Starfield Effect - basically an animation that simulates the POV of flying through a starfield in space: [Creating an Animated 3D Starfield EffectLearn how to create this fun effect where we simulate us flying past endless stars in outer space.![](https://www.kirupa.com/favicon_new.png)kirupa.comKirupa Chinnathambi![](https://www.kirupa.com/animations/images/og_starfield.png)](https://www.kirupa.com/animations/animated%5F3d%5Fstarfield%5Feffect.htm?ref=gorillasun.de) This was interesting to me because I attempted this myself at some point, and found that it's a nice little illusion that can actually be achieved entirely in 2D, but is still kind of tricky to get right - you can find [my sketch over on OpenProcessing](https://openprocessing.org/sketch/1763038?ref=gorillasun.de). Over on kirupa they do it entirely with the canvas drawing API without P5\. Now I'm really tempted to give it another go 🤔 I also recommend checking out the rest of the site - it's actually quite massive and a really good resource for beginners to intermediate coders, specifically if you're trying to get better at JavaScript coding. They've got tutorials about making animations, dealing with the canvas element, as well as more general JavaScript things: [Working with the CanvasLearn all about this thing called the canvas and how it helps bring pixels to life using just JavaScript!![](https://www.kirupa.com/favicon_new.png)kirupa.comKirupa Chinnathambi![](https://www.kirupa.com/images/s/19.png)](https://www.kirupa.com/canvas/index.htm?ref=gorillasun.de) ### Simulating an Infinite Grid Giorgio Fnool shows us how to create a fake infinite grid, which basically is nothing more than a draggable grid that creates the illusion of being infinite by wrapping around on itself when items leave the viewport - the 'making of' style video he shared already gives a good idea of how it's done, but he further elaborates in the replies to his thread: 0:00 /0:08 1× [Link to Tweet](https://twitter.com/gfnool/status/1755531785272734075?ref=gorillasun.de) This reminds me of a tweet from Juhani Halkomakki back from early 2022, in which he created a similar proof of concept: 0:00 /0:15 1× [Link to Tweet](https://twitter.com/JuhaniHalkomaki/status/1599469014891532288?ref=gorillasun.de) And on a related note, if this idea is something that interests you, definitely also give Amelia Wattenberger's article 'Evolving the Infinite Canvas' a read: [Evolving the infinite canvasAmelia Wattenberger’s personal website![](https://wattenberger.com/favicon.svg)Amelia Wattenberger![](https://wattenberger.com/dogs/portugese%20water%20dog.png)](https://wattenberger.com/thoughts/evolving-the-infinite-canvas?ref=gorillasun.de) ## State of the Long-Form Generative Art Market If I've learned one thing from putting together this newsletter over the course of the past year (almost a year now), it's that the Web3 space is evolving at an insanely rapid pace. It's often hard to keep track of how things are advancing, what the different players in the field are up to every week, and what the new trends are. I believe that it's really important to stay on top of things in that way, especially when you're an artist that's trying to get a foot in the door. Having curated an impressive number of projects with Dawn Contemporary, Haiver has some of the best insights when it comes to artists trying to make a living from generative art - in a long-form tweet of his, he provides us with some of his thoughts about how the market has changed over the past three years and gives some words of advice on how artists can adjust: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-09-at-12.29.02.png)](https://twitter.com/HaiverArt/status/1755660425369153649?ref=gorillasun.de) [Link to entire Tweet](https://twitter.com/HaiverArt/status/1755660425369153649?ref=gorillasun.de) Fact is, the space has gotten a lot more competitive — the art's gotten a whole lot better, and collectors have gotten a whole lot smarter at detecting what good art is, whether it's the aesthetics of it or the conceptual idea. With the advent of long-form generative art and the underlying blockchain technology that makes it possible, selling out *fast* has become one of those hot topics that's established itself as an important factor in determining the value of a collection - one of the points that Haiver tackles in his tweet. Recently however, it's been less and less the case that projects sell out instantly. But did we actually all really think that **everything** would sell out **all** the time? One thing that I want to stress here right off the bat, is that selling out should not be one of the factors that your happiness and mental health depend on. If you're an artist that's been consistently selling out with every project, and it's the first time that a collection isn't an instant complete, it might hit you very hard. Maybe not if you're a seasoned veteran and have been in the art game for a long time. With some of my own earlier works that didn't sell out I'd be lying if I said that it didn't hurt a bit, especially with those projects that were labors of love. At the same time however, it's a very sobering experience, and presents you with a different reality - it requires you to take a step back and objectively assess in which ways your work fell short. There's really no point in blaming yourslef, or the market, because after all nobody owes you anything, but rather take it as a chance to learn from and grow as an artist. I don't go into releases anymore with the romantic idea that they will be smash hits. *I mean, what are you gonna do if your project doesn't sell out? Throw in the towel and just stop making art altogether?* Maybe instead of bragging about how fast our collections have sold out, we can brag about who collected one of our works? When I released Hex Appeal back in December, and saw that two of my internet friends showed up so quickly to mint the very first 2 iterations, it felt as if the collection was already complete: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-12-at-01.58.08.png) Thank you meezwhite and Melissa, it genuinely made my day when I released the project and it still brings me joy to see you two pop up whenever I look at the collection. A relevant statement on this matter is from Kevin Abosch: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-12-at-02.44.27.png)](https://twitter.com/kevinabosch/status/1749009202754830753?ref=gorillasun.de) [Link to entire Tweet](https://twitter.com/kevinabosch/status/1749009202754830753?ref=gorillasun.de) I believe that there's a lot more that can be said here, because it's a topic that I've thought about a lot and that I've tried to understand - it's definitely an important part of the generative art game that we're all trying to play. I'm certain however that in a couple of months things will have changed drastically again, and that there's going to be different rules to the game. Best thing we can collectively do is try to steer the space in a better direction where we talk in a balanced manner about the art and the underlying market dynamics. ## Web3 News ### Foundation Exhibitions And while we're talking about Art, NFTs and the market, just a couple of days ago, Foundation announced a new feature that's coming to their platform, with the self-explanatory title "*Exhibitions"*: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-22.17.52-1-1.png) [Link to Thread](https://twitter.com/saturnial/status/1755284828034077029?ref=gorillasun.de) There isn't much information about how it'll work at this point, but I'm assuming that it'll be some sort of combination between web page editor and curatorial tool that's native to foundation, where curators and artists can showcase their works and provide additional information in form of text and supplementary material - I'm purely going off of the little 'Add content' popup that's shown in kayvon's tweet. Conversations and stories quickly get lost on social media, hence I think that this is a great initiative from Foundation, providing artists and curators means to document their work within little self-contained spaces. The feature is planned to go live for everyone on the 26th of February, but they've already got a few exhibitions lined up to kick things off - a list of partners can be seen here: [Exhibitions by FNDA new era of Exhibitions. Coming 2.26.24.![](https://rm-content.s3.amazonaws.com/64f02736663784003456fbcf/Favicon-31599ea3-5e31-468c-8834-76fe7f35ba3e_144.png)Exhibitions by FND![](https://d3n32ilufxuvd1.cloudfront.net/64f0a3844bdf060055cc5483/Image-384a001b-70aa-4f75-86c6-4215fe172db2.jpg)](https://exhibitions.foundation.app/?ref=gorillasun.de) I'm also still eagerly awaiting what fxhash has planned in this regard, in an interview with Le Random, Ciphrd hinted that a curatorial tool was in the works, but that was the only mention of it. But from what it seems, 2024 is shaping up to be the year of curatorial tools. ### arltcollector in conversation with Han I love me a good interview, and this one from arltcollector with Han fit the bill just right - if you're not familiar with Han, he's an architect turned NFT artist, and the creator of Crypto Cubes, arguably one of the earliest instances of generative art minted on the blockchain. In the interview Han talks about his practice, reminisces about how the Crypto Cubes project came to be back in 2020, and also tells us about his upcoming endeavors: [1 of 1 Art Pieces with Han — ARTXCODEHan is most well-known for his early OG generative art NFT collection that was launched in 2020 called CryptoCubes. If you were around back then you would know how collectible and exciting these cubes were. It’s the end of 2023 and Han hasn’t stopped innovating. Han presents a collection of 1 of 1![](https://images.squarespace-cdn.com/content/v1/5f3d21d4566e5c1a731605bf/1602261196656-NEJPTCZ1N90QUTI44ABF/favicon.ico)ARTXCODEarltcollector![](http://static1.squarespace.com/static/5f3d21d4566e5c1a731605bf/5f502f58dec00e605636a598/652df101f06d942876b1e2ac/1700870441385/Screenshot+2023-10-18+at+10.50.10%E2%80%AFPM.png?format=1500w)](https://www.artxcode.io/journal/han-interview?ref=gorillasun.de) I don't fully understand how Han's new project works, because my technical knowledge of smart contracts is limited, but it seems that he's creating a series of 1/1 pieces, each of which consisting of its very own smart contract that enables it as a marketizable piece of digital art. ## Tech, Code and Web There's also a lot of other interesting things that I found on the Web in the past week - here's a little sampler of different Tech and Code related thingamabobs 👇 ### A Self-balancing Cube Willem Pennings designed a mechanical cube that balances itself on one of its corners: ![This cube can balance on its corner using three orthogonally mounted reaction wheels](https://willempennings.nl/wp-content/uploads/2024/02/cube-19-1568x1043.jpg) As he points out himself in the explanatory article that he posted, there isn't much practical value to this esoteric gadget, but still a worthwhile idea to explore - he details the technical aspects of it: [Balancing cube – Willem Pennings![](https://willempennings.nl/wp-content/uploads/2021/12/cropped-wrench-270x270.png)Willem Pennings Personal projectsWillem![](https://willempennings.nl/wp-content/uploads/2024/02/cube-19-1568x1043.jpg)](https://willempennings.nl/balancing-cube/?ref=gorillasun.de) ### A Search Engine in 80 Lines of Python We already talked about size-coding earlier, but this takes it to the next level - with an itch to learn how search engines work, Alex Molas decided to create his own from scratch, and ended up doing so in just 80 lines of code - the interesting part of it at least. He details how he did it in this write-up: [A search engine in 80 lines of PythonIn this post I explain how I built a search engine from scratch using python. The resulting search engine is used to search in the posts of the blogs I follow.![](https://www.alexmolas.com/favicon.ico)![](https://www.alexmolas.com/docs/search-engine/screenshot-fastapi-app.png)](https://www.alexmolas.com/2024/02/05/a-search-engine-in-80-lines.html?ref=gorillasun.de) If you've ever wanted to build your own search engine, this might just be your starting point. It turns out that you don't actually need that much: obviously a first is some data (pages) to actually search, then an index to store references to this data based on the information that occurs in this data (keywords), followed by a ranking mechanism that produces a curated list of outputs from a query, and last but not least also an interface through which all of this can be accessed by a user. ### The Cursed Library The Cursed Library is not really a game, but rather an interactive web experience, in which you explore books in a library, each of which tells a different sordid tale through meticulously crafted 3D scenes - I'm not going to lie, the little experiment immediately took me in and transported me away into another world: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-23.54.15.png)](https://cursed.epic.net/?ref=gorillasun.de) [Link to the Cursed Library](https://cursed.epic.net/?ref=gorillasun.de) The little interactive page was put together by [EPIC](https://twitter.com/epicwebagency?ref=gorillasun.de) \- not the games launcher Epic Games, just EPIC - a digital agency from Belgium, that describes itself as a group with a unique blend of technical, strategic and creative skills. Check them out, they do all sorts of interesting Web experiments. ### Curated: A Web Design Inspiration Catalogue Pinterest is usually my go to resource when I'm in need of inspiration when I'm trying to get in just the right mood for my next generative art project, but when it comes to web design and styling something in CSS, I find it best to look at other pages and borrow visual concepts from them - and recently came across Curated, an aggregator site that collects and showcases elegantly designed pages across the web: [Curated web design inspiration catalogUnleash your creativity with out-of-this-world web design inspiration from across the web.![](https://assets-global.website-files.com/63bd42e1e586a852754fab62/63dbbba5be5acc69145b9627_favicon.png)![](https://assets-global.website-files.com/63bd42e1e586a852754fab62/63e397fec7605a21a97bb284_Open-Graph-1.png)](https://www.curated.design/?ref=gorillasun.de) ### Trillions to reshape the Semi-Conductor Industry Altman has been one of the most polarizing individuals in the world of AI last year, being ousted from OpenAI back in November of 2023, and quickly being reinstated in a matter of few days after the incident triggered a wave of resignations, or at least threats thereof. Currently there's no public knowledge if his current plans are in relation to this incident, but there's reports of him seeking funding for a prospective chip venture just prior to that. Now it seems that he is looking for a much larger sum of money, to completely dwarf the current chip industry: [OpenAI CEO Sam Altman seeks as much as $7 trillion for new AI chip project: ReportOpenAI CEO Sam Altman wants to overhaul the global semiconductor industry with trillions of dollars in investment, The Wall Street Journal reported.![](https://sc.cnbcfm.com/applications/cnbc.com/staticcontent/img/favicon.ico)CNBCHayden Field![](https://image.cnbcfm.com/api/v1/image/107346332-1702387207643-gettyimages-1841164541-HOPE_GLOBAL_FORUMS.jpeg?v=1705513471&w=1920&h=1080)](https://www.cnbc.com/2024/02/09/openai-ceo-sam-altman-reportedly-seeking-trillions-of-dollars-for-ai-chip-project.html?ref=gorillasun.de) ## Gorilla Updates I've also been up to some shenanigans of my own. In the first half of this week I explored [Reaction Diffusion](https://en.wikipedia.org/wiki/Reaction%E2%80%93diffusion%5Fsystem?ref=gorillasun.de) again after roughly two years of having first encountered it. I think I have acquired a much better understanding of it now, and how to actually get some nice looking patterns out of it. Here's a little demo of what I ended up making: 0:00 /0:40 1× Reaction Diffusion is really cool, it basically simulates the change in concentration of two chemicals, where the concentration thereof is representing through the color of the canvas pixels. Reaction Diffusion brings to life a multitude of intricate and organic patterns, that are also more commonly known as [Turing Patterns](https://en.wikipedia.org/wiki/Turing%5Fpattern?ref=gorillasun.de). The most popular way to implement a Reaction Diffusion system is via the Gray-Scott model, that basically postulates of a set of two equations which simulate the interaction of the two chemicals at any given pixel and how this concentration should evolve over time: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-01.32.03.png) [Link to Equations](https://itp.uni-frankfurt.de/~gros/StudentProjects/Projects%5F2020/projekt%5Fschulz%5Fkaefer/?ref=gorillasun.de) I'm not certain if you can call this a cellular automaton still, but it's also a kind of system where cells (pixels) update their state based on the state of adjacent cells. I'm working on putting together a proper tutorial for it at the moment, so I'm not going to dive too deep just now - but if you want a great introduction and a guide to implementing it for yourself, I recommend this video from the Codingtrain: What's more, is that I also actually managed to implement it in form of a shader - but since that's not really my fortee there's still a lot of things that I need to figure out there to bring it closer to the pixelized aesthetic that I achieved in JS: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-11-at-01.38.04.png) [Link to Shadertoy](https://www.shadertoy.com/view/lXfGW8?ref=gorillasun.de) Besides Reaction Diffusion, I also spent a copious amount of time on making weird pixelized generative numbers and packing them on across the canvas - goal for this one is kind of ambitious, and I'm already happy with where it's at: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/bingo2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/backtothedrawingboard.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/jumble-of-numbers.png) I'll likely have more updates about it in the coming week - keep your eyes peeled! ## Music for Coding Last week while I was collecting pieces for my personal [Genuary 2024 recap](https://www.gorillasun.de/blog/genuary-2024-personal-recap/), I featured a sketch by [Roni Kaufman](https://twitter.com/KaufmanRoni?ref=gorillasun.de), and came across [his gorgeous portfolio page](https://ronikaufman.github.io/?ref=gorillasun.de) \- found out that he'd done an album cover for the stellar guitarist Adrian Holovaty. The album leans quite heavily into gypsy jazz with the chugging rhythm guitar and arpeggiated melodic elements layered on top: [Melodic Guitar Music, by Adrian Holovaty10 track album![](https://f4.bcbits.com/img/a1360270371_3.jpg)Adrian HolovatyBandcamp New & Notable Mar 11, 2021![](https://f4.bcbits.com/img/a1360270371_5.jpg)](https://adrianholovaty.bandcamp.com/album/melodic-guitar-music?ref=gorillasun.de) You can give the album a listen over on Bandcamp I've been a big fan of Django Reinhardt for years, so this really did it for me - I found that the tracks were quite a treat for the ear, while I was chucking away at some code! **And that's it from me this week, while I'm typing out these last words I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 42Warpcast and Farcaster Frames - Genuary 2024 Concludes - Harold Cohen Retrospective - Infini Craft by Neal Agarwal - Generative audio with vanilla JS - Custom Highlight Embeds - Artblocks Acquires Sansa - Digen Open Call - Interop 2024 +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/02/something.png)](https://www.gorillasun.de/blog/gorilla-newsletter-42/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-10-at-11.39.07.png) And a little closing meme | [Link to Tweet](https://twitter.com/mathladyhazel/status/1756077355779383703?ref=gorillasun.de) ### Gorilla Newsletter 42 URL: https://www.gorillasun.de/blog/gorilla-newsletter-42/ Last updated: 2024-02-05T09:58:21.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 42nd issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **Hope you're all having a great start into the week!** That said, let's get straight into it!👇 ## Warpcast & Farcaster Frames Let's start this week's issue with some words about Farcaster - a big chunk of the generative art community has recently joined the budding Web3 social media platform, and it's overall been gaining a lot of traction as a Twitter alternative for the Web3 crowd. Warpcast is a relatively new social media platform that's built on top of Farcaster, which is a Web3 protocol for building decentralized social media apps, conceived and developed by Dan Romero - I actually signed up to Warpcast about a month ago, without knowing too much about the platform, after I saw a Tweet from Romero in which he attempted to address and clear up some of the notions that were cause for confusion: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-13.42.20.png) [Link to Tweet](https://twitter.com/dwr/status/1740082379124023495?ref=gorillasun.de) Maybe it's erroneous to compare the two, but I think a good point of reference is the Fediverse if you're familiar with it. In the last two years we've seen a big migration of people over to Mastodon, in the aftermath of Musk's Twitter takeover, which is a decentralized social media platform that exists in the larger context of the Fediverse, in which the different entities make use of the ActivityPub protocol to communicate with each other. This means that things in the Fediverse are interoperable, due to them using the same underlying protocol. Farcaster is similar in this manner, that it's also such a decentralized protocol, with the big difference that it's built on Ethereum, enhancing it with blockchain powered capabilities. For isntance, your identity on Farcaster is tied to your wallet address, and is also one of the primary ways to interact with apps and features that it integrates. In this scenario, Warpcast is simply the interface that you use to interact with the Farcaster protocol: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-14.58.29.png) [Link to Tweet](https://twitter.com/fabdaRice/status/1740086938147938673?ref=gorillasun.de) The following post provides a good explanation and some insights into all of this: [What is Farcaster? A Beginner’s Guide (2023)Farcaster is a decentralized protocol for building web3 social media apps. Learn more about what it is, how it works, and how to build on it.![](https://blog.thirdweb.com/content/images/size/w256h256/2022/08/tw-logo-newsletter-31.png)thirdwebMrig P![](https://blog.thirdweb.com/content/images/size/w1200/2023/10/What-is-the-Farcaster-Protocol-.png)](https://blog.thirdweb.com/what-is-farcaster/?ref=gorillasun.de) > *Picture it as a unified platform where social apps like X, Instagram, and Facebook coexist and users can connect them all with one decentralized ID. This means even if any app imposes restrictions, users still have their identity and can seamlessly migrate their connections to alternative apps on the network.* If this has piqued your interest and you're interested in joining Farcaster, you can use [this invite link](https://warpcast.com/~/invite-page/212516?id=94b37123&ref=gorillasun.de), which gives the both of us warps - a kind of token that can be redeemed within the Farcaster eco-system. It's important to note here that Farcaster costs 5 bucks a year, which is used to cover the associated gas fees. One of the biggest developments in the Farcaster eco-system so far happened last week, where a feature called Frames was introduced: a new kind of interactive embed that Farcaster users can build themselves and inject into the Farcaster feed. This probably sounds a little bit esoteric, but in other words, people can now code their own little embeddable apps and share them directly as casts on Farcaster - think of them as interactive media tweets. some notable examples of this are Onframe Chess by 5/9 and Base Quest by Sean: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-16.06.45.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-16.07.08.png) Link to Onframe Chess Cast | [Link to Base Quest Cast](https://warpcast.com/seangeng/0x3ad1d126?ref=gorillasun.de) Basically you can now play Chess as well as a text adventure directly in your Farcast feed, I believe that this really sets Farcaster apart from other social media apps. If you're curious about learning more about Frames, here's another recent article that introduces them with a little more context than I do: [What Are Farcaster Frames? Discover the Top 5 Best Frames So Far!The introduction of Frames by Farcaster is a game changer in the Decentralized Social Media space, significantly boosting Warpcast’s daily…![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)PERCSJojo\_Percs![](https://miro.medium.com/v2/resize:fit:1200/0*-6s8ZDylRRkhONuh.png)](https://medium.com/percs/what-are-farcaster-frames-discover-the-top-5-best-frames-so-far-6a5528c07514?ref=gorillasun.de) And if you're interested in building your own Farcaster Frame, you need to check out Nader Dabit's tutorial that he's posted over on TwitterX: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-16.19.37.png) [Link to Tweet](https://twitter.com/dabit3/status/1752400805938758058?ref=gorillasun.de) Alright, that's enough about Farcaster for starters, lest this sounds more and more like some made up technobabble straight from r/VXJunkies, I'll cut things off here and move on to the regular Newsletter segments. Let me know if you end up joining! And especially if you build some interesting Frame! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-01.14.54.png)](https://twitter.com/Zeneca/status/1753680732701036645?ref=gorillasun.de) Here's another Great long-form Tweet explaining Farcaster | [Link to Tweet](https://twitter.com/Zeneca/status/1753680732701036645?ref=gorillasun.de) ## All the Generative Things Of course there's also been a bunch of interesting developments in the genart space over the course of the past week 👇 ### Genuary 2024 comes to an End Most notably, Genuary 2024 concluded on the 31st of January. With hundreds of participants and thousands of submissions across multiple platforms it's unarguably been the biggest iteration of the event yet. Albeit I'm a little sad that it's over, since it's such a great way to get so many ideas out of your system, I'm at the same time excited to spend some more quality time on some of my favorite ideas that came to be throughout the month. For the occasion, the Le Random team came together with Joyn, organizing a Twitter space in which they invited Piter Pasma, who's in charge of organizing and selecting the prompts for Genuary every year, as well as some of the participating artists, such as Darien Brito, Ella, and yours truly, to talk a little about the entire experience - the Twitter space has been recorded and can be found in a shortened version (minus all of the fluff) over on Apple Podcasts: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-23.45.29.png)](https://podcasts.apple.com/us/podcast/le-random/id1726153340?i=1000644045715&ref=gorillasun.de) [Link to Podcast](https://podcasts.apple.com/us/podcast/le-random/id1726153340?i=1000644045715&ref=gorillasun.de) | [Link to complete Twitter Space Recording](https://twitter.com/lerandomart/status/1752655636544827518?ref=gorillasun.de) I thoroughly enjoyed the thoughtful questions from the Le Random team as well as Piter's thoughtful answers to them, providing insights and reflecting on how Genuary has grown over the past 4 years and now occupies an important spot that ties the community together every year. As a platform independent event, generative artists get the opportunity to connect with each other simply for the joy of making generative art, without any other incentives. Besides that, we also find Monk out in the wild with an exclusive article for Joyn, complementary to the Twitter space, covering some of his favorite artworks for 10 of the Genuary prompts that he found most interesting: [Celebrating GenuaryI’m Peter Bauman, or Monk Antony, and I do the content at Le Random. Freed from Le Random’s tyrannical editor (me), I share my thoughts on Genuary’s unique ability to propel communal creativity before reflecting on the #genuary2024 prompts and pieces I found most compelling.![](https://www.joyn.xyz/favicon.ico)Joyn![](https://assets.joyn.xyz/Backend/cover/290f6ea8853500a7cab2f2a0a55ea1002dcca6df289ae2d145d0a5345bc82def.jpeg?d=l)](https://www.joyn.xyz/showcase/celebrating-genuary-b8961725b413?ref=gorillasun.de) In the Twitter space I was asked about how the overall Genuary experience was like. And I had actually thought a bit about it beforehand - to me the beauty of Genuary lies in the creative interpretation of the prompts. It's not as much of a coding challenge as it simply a creative challenge, where you aim to make something that will surprise in the context of the given prompt. I try to not look at anyone else's creations before I've finished my own, while it keeps what I make authentic, it also makes discovering what others made so much more fun. Piter tells us that the set of prompts that he had conceived for the very first Genuary mainly revolved around programming techniques and algorithms, which then changed quite a bit when he asked others for suggestions, pitching ideas that were not necessarily directly related to any programming specific things. Another big factor is the time limit, of course there's no hard rule to do the prompts within their allocated day, but I believe that it adds another aspect to the challenge that will frequently push artists outside of their comfort zone. This makes me think back to an article that I've shared a couple of weeks ago, a piece by Ralph Amer, where he talks about the *Creative Playground -* "Creative limitations set our creativity free": [The Creative Playground - Ralph AmmerHave fun with drawing! Create yourself a creative playground we need a goal and rules. Here is why and how:![](https://i0.wp.com/ralphammer.com/wp-content/uploads/2020/07/cropped-ralph_fav_512.png?fit=192%2C192&ssl=1)Ralph Ammerralphammer![](http://ralphammer.com/wp-content/uploads/2023/11/Cage_220.gif)](https://ralphammer.com/how-to-get-started/?ref=gorillasun.de) Others also like to create additional challenges factors of their own, like Roni Kaufman, who chose to only create static artworks for each prompt, even when some of them were inherently referring to concepts that are associated with movement, like prompt #15 that asks you to use a physics library, or #19 that simply states 'flocking'. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-01.16.55.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-01.16.25.png) [Link to #15](https://twitter.com/KaufmanRoni/status/1746965232436564197?ref=gorillasun.de) | [Link to #19](https://twitter.com/KaufmanRoni/status/1748383749228712074?ref=gorillasun.de) Or for instance Raphaël de Courville's AI assisted Genuary speedrun. Some people do the prompts on their allocated days, others spread them out over the entire year, and Raph just wants to see the world burn and do all of the prompts in a single sitting. His final time clocks in at 1 hour 46 minutes and 56 seconds. you can watch a recording of his stream here: [Genuary 2024 Any% Tool Assisted Speedrun - sableraph on Twitchsableraph went live on Twitch. Catch up on their Art VOD now.![](https://static.twitchcdn.net/assets/favicon-32-e29e246c157142c94346.png)Twitch![](https://static-cdn.jtvnw.net/cf_vods/d1m7jfoe9zdc1j/c6a071e3c427b7f29496_sableraph_50277632733_1706457663/thumb/thumb0-640x360.jpg)](https://www.twitch.tv/videos/2046285891?ref=gorillasun.de) Towards the end of the stream Raph challenges Shiffman to also attempt the speedrun and see if he can beat his time. We now eagerly await his response. Also subscribe to Raph on Twitch, when he reaches 2000 subs he'll record another funny bird sound that we can then trigger through the Twitch chat. Genuary is just such a beautiful event, and the community never feels more alive than throughout it's course - I'm already looking forward to next year! ### Harold Cohen Retrospective Last week the Harold Cohen Retrospective exhibition showcasing his AARON works kicked off at the Whitney Museum of American Art in Manhatten: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-12.45.47.png)](https://whitney.org/exhibitions/harold-cohen-aaron?ref=gorillasun.de) [Link to exhibition page](https://whitney.org/exhibitions/harold-cohen-aaron?ref=gorillasun.de) Harold Cohen is one of the earliest names that experimented with AI for the purpose of making art, most notably he conceived a set of algorithms under the name AARON: > AARON is the collective name for **a series of computer programs written by artist Harold Cohen that create original artistic images**. Proceeding from Cohen's initial question "What are the minimum conditions under which a set of marks functions as an image?", AARON was in development between 1972 and the 2010s - [excerpt from the AARON Wikipedia page](https://en.wikipedia.org/wiki/AARON?ref=gorillasun.de) Although the source code for AARON is not publicly available, it likely is a vastly different type of AI that we are familiar with today. Harold Cohen was also one the first that explicitly asked questions about the collaborative practice between artist and machine, and being a catalyst for the conversation around authorship and agency. Naturally, we can count on Le Random for stellar coverage, interviewing Christiane Paul, the curator in charge of the AARON exhibition: [Christiane Paul on Curating Cohen’s AARONChristiane Paul’s curation of the Whitney’s Harold Cohen: AARON informs a conversation with Peter Bauman (Monk Antony), where they discuss Cohen’s persistent impact to this day while reflecting on the nature of digital expression.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65b3edd5c757bf75f8fae9ea_RS78111_Harold_Cohen_AARON_for_KCat_2001_-_9.png)](https://www.lerandom.art/editorial/christiane-paul-on-curating-cohens-aaron?ref=gorillasun.de) It was interesting to see Sougwen Chung being brought up, which I also immediately had to think of when I saw pictures of the AARON plotters - in many ways she follows in the footsteps of Harold Cohen, [Le Random also did an interview with her a while back](https://www.lerandom.art/editorial/sougwen-chung-on-us-in-another-form?ref=gorillasun.de). I believe that only a fraction of the newsletter readership is actually physically somewhere near Manhatten, we do however get a glimpse into the exhibition through ClownVamp's excellent Twitter thread, in which some highlights are showcased: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-12.42.06.png) [Link to Thread](https://twitter.com/ClownVamp/status/1753457936490266897?ref=gorillasun.de) ### Infini Craft by Neal Agarwal Neal really outdid himself again with his latest project Infini Craft - an LLM powered crafting game: 0:00 /0:11 1× [Link to Tweet](https://twitter.com/nealagarwal/status/1752716375255101440?ref=gorillasun.de) And as its name suggests, it's an infinite one at that. If you remember a game called [Little Alchemy](https://littlealchemy.com/?ref=gorillasun.de) from way back when, it's essentially that - a sandbox game in which you can combine elements by dragging and dropping them onto each other, where they'll then combine into new elements that can be used to discover even more elements and so on. There isn't really a specific goal to it, the entire fun of it stems from trying out different combinations and seeing what it'll produce. I remember that Little Alchemy would quickly get frustrating once you'd tried out most of the combinations and weren't able to really progress anymore, naturally the combinations in the game are hard coded so once you've got everything it's done. Throwing an LLM into the mix that can endlessly conjure new combinations of things makes this *infinitely* more exciting: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-12.48.04.png) [Link to Tweet](https://twitter.com/nealagarwal/status/1752719299691647395?ref=gorillasun.de) I'm not entirely sure about how it's implemented, there probably is an input prompt that asks the language model "What do you get when you combine X and Y?" in addition to some database that stores combinations that have already been discovered, it is deterministic in the sense that combining the same two elements will always yield the same output - but sometimes you'll get a notice under an element indicating that it's a *first discovery,* meaning that no one else has managed to discover it previously: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-12.56.35.png) [Link to Tweet](https://twitter.com/meodai/status/1753582667407217056?ref=gorillasun.de) David Aerne somehow managed to produce an Obamacrab - and if that doesn't make you want to try the game out for yourself, then I don't know what will. Let me know if you end up getting any cool combos: [Infinite CraftA game about crafting![](https://neal.fun/favicons/infinite-craft.png)![](https://neal.fun/share-cards/infinite-craft.png)](https://neal.fun/infinite-craft/?ref=gorillasun.de) ### Generative Audio with Vanilla JS While putting together my top picks for Genuary 2024 (which should come out sometime next week), I was scouring the r/generative subreddit to see what the folks did over there, and came across an interesting generative audio demo (I think that it was a creation for the final prompt) that claimed it was done entirely in Javascript with zero dependencies, which I thought was quite impressive: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-02-at-11.39.59.png)](https://www.reddit.com/r/generative/comments/1afb20f/generative%5Fmusic%5Fin%5Fjavascript%5F250%5Flines%5Fof%5Fzero/?ref=gorillasun.de) [Link to Reddit Post](https://www.reddit.com/r/generative/comments/1afb20f/generative%5Fmusic%5Fin%5Fjavascript%5F250%5Flines%5Fof%5Fzero/?ref=gorillasun.de) I'd always assumed that you need some library to make Javascript produce any sort of sound, like Tone.js, but that doesn't seem to be the case, as JS actually comes with its own Audio context that can be used for this purpose - I'm guessing that Tone.js is actually built on top of that context: [AudioContext - Web APIs | MDNThe AudioContext interface represents an audio-processing graph built from audio modules linked together, each represented by an AudioNode.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/API/AudioContext?ref=gorillasun.de) Manav Rathi aka u/thousandsongs wrote a brief introduction to the audio context here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-13.20.39.png)](https://mrmr.io/mj?ref=gorillasun.de) [Link to Post](https://mrmr.io/mj?ref=gorillasun.de) This post is complementary to another one in which he explains the demo, introducing Euclid's algorithm that seems to be a potent method for creating interesting rhythmic patterns - [you can read about it here](https://mrmr.io/mj/euclid?ref=gorillasun.de). So that was definitely a treasure trove, Manav also shares a fully commented synth implementation in Typescript with zero dependencies: [mrmr.io/pages/raag/synth.ts at main · mnvr/mrmr.iowords | colors / music •◦◎◉⦿ code – https://mrmr.io - mnvr/mrmr.io![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubmnvr![](https://repository-images.githubusercontent.com/606017661/8d0af68b-8609-4602-a2c5-379bde06d43f)](https://github.com/mnvr/mrmr.io/blob/main/pages/raag/synth.ts?ref=gorillasun.de) ## Web3 News There's way too much going on in the Web3 x genart space to cover every week, but besides the big traction that Farcaster has recently been getting, here's some of the things that I think are worth mentioning 👇 ### Custom Highlight Embeds Highlight now makes it possible for artists to share and distribute their generative mints directly from their own websites with custom embeds - here's a quick video run-down of how it works: Seeing that the Gorilla Sun blog is my main home on the internet, this is super exciting to me - essentially saving the trouble of having to redirect people to another page to mint something. I have yet to release something over on highlight, but there's a couple of ideas that are already brewing - I'm definitely releasing something this month. Overall I'm really impressed with how many new features Highlight has put out since their launch last year, and this is definitely a big one, giving artists even more control over how they release their artworks. ### Artblocks Acquires Sansa Art Blocks made the announcement that they're acquiring Sansa with the goal of integrating their versatile marketplace into the Art Blocks eco-system: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-01.25.41.png) I think we're all familiar with Art Blocks at this point, the pioneering platform that made generative art NFTs possible on the Ethereum blockchain. As far as I understand, Sansa was later developed independently from the Art Blocks platform, enabling a secondary market place for generative artworks on ETH, due to Art Blocks not having its own proprietary secondary marketplace - I think OpenSea was one of the few options for this purpose. Art Blocks wrote a little announcement post explaining a bit how this is going to go down and the road-map is: [Spectrum: Welcoming Sansa to the Art Blocks Family | Art BlocksArt Blocks welcomes Sansa to its family! Discover how this acquisition is set to fuel the evolution and growth of on-chain generative art.![](https://assets-global.website-files.com/62fe95d11738cfa39c3573b0/634ed02d05e56b505a01497f_favicon.png)Art Blocks![](https://assets-global.website-files.com/62fe95d11738cf95c53573dd/65b7edf9e486cffcbec15393_art%20blocks%20%2B%20sansa.png)](https://www.artblocks.io/info/spectrum/art-blocks-sansa-acquisition?ref=gorillasun.de) ### Digen's Digital Me Open Call After their successful soft launch at the end of December, DiGen Art has been hard at work putting together their inaugural group show "Digital Me" - and they're inviting artists from the MENA region in their open call: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-11.21.32.png) [Link to Tweet](https://twitter.com/DiGenArt/status/1752335634356703612?ref=gorillasun.de) If you are an artist from the MENA region or know someone that is, consider applying, you can learn more about what they're looking and the criteria with which they will select the artists through the exhibition page and the accompanying brochure: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-12.15.35.png)](https://digen.art/exhibition/digital-me/?ref=gorillasun.de) [Link to exhibition page](https://digen.art/exhibition/digital-me/?ref=gorillasun.de) ## Tech and Code ### Interop 2024 The results from Interop 2024 just dropped, and it's looking good - the modern web is more interoperable than ever! [The web just gets better with Interop 2024The web is amazing.![](https://webkit.org/favicon.ico)WebKitJen Simmons![](https://webkit.org/wp-content/uploads/Interop-2023-graph.png)](https://webkit.org/blog/14955/the-web-just-gets-better-with-interop/?ref=gorillasun.de) The Interop project is essentially a yearly big comparison between the different modern ever-green browsers where some of the differences are ironed out making it such that features work identically across the different browsers. Jen Simmons from the Webkit team recapitulates the findings from 2024 in this article, going over each one of the different focus areas, explaining the issues and elaborating on what's been done to remedy them. ### 12 Modern CSS One-Line Upgrades CSS has been evolving more and more over the past years, gradually accommodating the increasing needs of the modern web. We're frequently seeing new rules being added that previously had to be implemented in a hack-y way by combining several different statements, for purposes that they weren't originally designed for. Stephanie Eckles writes about some of these new one-liners: [12 Modern CSS One-Line Upgrades | Modern CSS SolutionsSometimes, improving your application CSS just takes a one-line upgrade or enhancement! Learn about 12 properties to start incorporating into your projects, and enjoy reducing technical debt, removing JavaScript, and scoring easy wins for user experience.![](https://moderncss.dev/favicon.png)Modern CSS SolutionsWritten by Stephanie Eckles![](https://moderncss.dev/img/social/12-modern-css-one-line-upgrades.png)](https://moderncss.dev/12-modern-css-one-line-upgrades?ref=gorillasun.de) One other resource that's mentioned, and that I think is worth sharing here as well, is the SmolCSS page; basically a library of small (smol) CSS snippets that accomplish a lot of the reoccurring general purpose tasks, like reoccurring types of layouts, various types of grids, etc. - definitely worth a bookmark: [SmolCSSMinimal snippets for modern CSS layouts and components![](https://smolcss.dev/favicon.png)![](https://smolcss.dev/smolcss.png)](https://smolcss.dev/?ref=gorillasun.de#smol-flexbox-grid) ### Making Sense of Senseless Javascript Features Javascript may be the most popular programming language today, but at the same time has quite a few quirks that will most likely leave you scratching your head when you encounter them for the first time - this article by Juan Diego Rodriguez goes over some of them and tries to explain what is going on: [Making Sense Of “Senseless” JavaScript Features — Smashing MagazineJavaScript may be the most popular client-side language in the world, but it’s far from perfect and not without its quirks. Juan Diego Rodriguez examines several “absurd” JavaScript eccentricities and explains how they made it into the language as well as how to avoid them in your own code.![](https://www.smashingmagazine.com/images/favicon/favicon.svg)Smashing MagazineJuan Diego Rodríguez![](https://files.smashing.media/articles/making-sense-of-senseless-javascript-features/making-sense-of-senseless-javascript-features.jpg)](https://www.smashingmagazine.com/2023/12/making-sense-of-senseless-javascript-features?ref=gorillasun.de) I've shared it before, but if you haven't seen it yet, you need to watch this iconic talk that Brian Leroux gave at dotjs back in 2012, in which bravely descends into the madness of Javascript all while demonstrating the language's most bizarre features in a live coding session: ## OLMo: An Open Source Language Model Arguably the biggest news in the AI world from the past week is the release of OLMo: an open source state of the art large language model. The Allen Institute for AI aims to democratize this type of new technology, to help researchers better understand the inner workings of LLMs, experiment with their capabilities, as well as enabling developers to create interesting LLM powered applications in which they have full control. Here's a quick run-down of the features that come with this project: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-20.43.45.png)](https://blog.allenai.org/hello-olmo-a-truly-open-llm-43f7e7359222?ref=gorillasun.de) [Link to Announcement Article](https://blog.allenai.org/hello-olmo-a-truly-open-llm-43f7e7359222?ref=gorillasun.de) If you're doing anything with AI, this is probably something you'll want to keep an eye on: [OLMo - Open Language Model by AI2OLMo is a series of Open Language Models designed to enable the science of language models. The OLMo models are trained on the Dolma dataset.![](https://allenai.org/_next/static/images/apple-touch-icon-2cacae9fb869cb1ff8787269d0b7373f.png)Open Language Model by AI2![](https://allenai.org/_next/static/images/olmo-social-card-77177b135f14ecbe8c37b39d373ef809.jpg)](https://allenai.org/olmo?ref=gorillasun.de) ## Gorilla Updates ### Hot off the Press Last week I put together one big recap of everything that I made over the course of Genuary 2024 - turns out that you end up making quite a few interesting things when you make a thing everyday for a month. Wrote a little commentary for each one of my creations, explaining what's going on and covering the inspirations and concepts that inspired each individual sketch: [Genuary 2024: A Personal RecapGenuary 2024 is now officially over! And while we emerge with folders loaded with sketches and ideas to work on throughout the coming weeks, here’s my personal celebratory recap of everything I’ve made in Genuary.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/genuary2024-1.jpg)](https://www.gorillasun.de/blog/genuary-2024-personal-recap/) Another thing I'd like to mention here, for documentation purposes, is that I was mentioned in the Collector Stories Season 2 Episode 4 by SUBI at around the 1 hour 30 minute mark - this is in light of SUBI, a collector that's primarily active on the Solana chain, making the decision to join Tezos with my token 'Somewhere in Between' as their first mint. I'm really honored that they chose one of my works: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/GFQl1hOW8AATGee.jpg) Somewhere in Between #69 | [Link to Token](https://www.fxhash.xyz/gentk/KT1EfsNuqwLAWDd3o4pvfUx1CAh5GMdTrRvr-170880?ref=gorillasun.de) | [Link to Project](https://www.fxhash.xyz/generative/27652?ref=gorillasun.de) Here's a link to the recording of the Twitter space, in which some interesting points were raised: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-04-at-22.01.42.png)](https://twitter.com/aychhe/status/1753068385343275348?ref=gorillasun.de) [You can listen to the recording here](https://twitter.com/aychhe/status/1753068385343275348?ref=gorillasun.de) ### Fresh off the Easel Besides wrapping up those final Genuary prompts, I actually found some time this week to start investigating some of the ideas that started taking shape over the course of Genuary. After redoing a Marching Squares algo for the 12th prompt "Lava Lamp", it got me thinking that I don't necessarily need to use it for anything animated, but could be an equally potent method for generating static shapes, especially in the scenario when it's difficult to construct a shape with a geometric approach - this might sound a bit esoteric, but if it unfolds as I'm envisioning it, you might see some of those in the next Newsletter. Here's two WIP outputs, which might not look like much at first glance, but I'm quite happy with what I achieved in them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/individual.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/cvas.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/then-the-computer-made-shapes.png) Besides just being able to find the contour of some regions on the canvas, I'm also able to determine the individual regions in addition to the their vertex information, which means that I can freely control the contour and do more stuff with it, like deforming it, or rounding off the corners, etc. If you're not familiar with Marching Squares: it's a neat algorithm that works in 2D and 3D, and lets you draw the contour of certain regions in a grid depending if the values at those grid points exceed a certain value - in the examples above this value is determined by the proximity of a grid vertex to the surrounding circles. Each of the cells in the grid, depending on which one of it's four vertices is active, will draw a certain type of line, outlining the active region. It's smart and feels a little like magic because the concept is so simple. Wikipedia gives a good overview of the algo: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-11.40.03.png) [Link to Wikipedia Page](https://en.wikipedia.org/wiki/Marching%5Fsquares?ref=gorillasun.de) Naturally, it's not as easy as it sounds, and you'll run into some complications when you're trying to do more with later on down the line. There's also more advanced versions of the algorithm that are more powerful, but at the cost of more complex code - over on Farcaster, Claus Wilke chimed in with a larger project that he's worked on which involved isobands that are more difficult to implement, he also points out that Wikipedia is a really good resource for this algorithm in particular: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-03-at-12.12.10.png)](https://warpcast.com/clauswilke/0xbce8e550?ref=gorillasun.de) [Link to Cast](https://warpcast.com/clauswilke/0xbce8e550?ref=gorillasun.de) | [Link to Iso-band Project](https://isoband.r-lib.org/?ref=gorillasun.de) ## Music for Coding This week I've got a blast from the past for you all, and it's... *drum-roll* \- Weezer! It's a bit of an odd choice, since it might not be the best music to code along to, but after discovering that the singer and guitarist of the band Rivers Cuomo is currently actually active over on Github and a significant amount of time on programming, it was a no-brainer to include: [![](https://cdn.discordapp.com/attachments/884784395280584754/1202920629251080213/Screenshot_2024-02-02_at_11.16.52.png?ex=65cf3623&is=65bcc123&hm=89a7dabc1adeddaa121baf92642896856f1358ef99bd0243a7419ee4ad05f6d8&)](https://github.com/riverscuomo?ref=gorillasun.de) [Link to Rivers Github](https://github.com/riverscuomo?ref=gorillasun.de) It seems that he is mainly working on a discord bot. Another interesting piece of Trivia that I discovered by going down this Rabbit hole, is that the music video for Buddy Holly was actually included with the Windows 95 installation CD: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-02-at-11.33.03.png)](https://news.ycombinator.com/item?id=39222196&ref=gorillasun.de) [Link to Hackernews comment section](https://news.ycombinator.com/item?id=39222196&ref=gorillasun.de) The interesting part of this is that the band had no idea about this until afterwards, after being pissed initially they came around to realise that it probably played a factor in the song becoming as popular as it is today: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-02-at-11.35.07.png)](https://en.wikipedia.org/wiki/Buddy%5FHolly%5F%28song%29?ref=gorillasun.de) [Link to Wikipedia page](https://en.wikipedia.org/wiki/Buddy%5FHolly%5F%28song%29?ref=gorillasun.de) **And that's it from me this week, while I'm typing out these last words I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 41This week 📬 the Tickle #90 - Falling Sand Simulation with the coding train - Maxime Heckel on Caustics - Building 3D scenes for the browser by Yasmin P. - Snippets for Art by Chris McCully - Zed going Open Source +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/asdfg.png)](https://www.gorillasun.de/blog/gorilla-newsletter-41/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Genuary 2024: A Personal Recap URL: https://www.gorillasun.de/blog/genuary-2024-personal-recap/ Last updated: 2024-02-01T10:35:37.000Z ***Dear diary, today I completed all Genuary 2024 prompts! It wasn't easy with all of the other things that I had to do throughout this first month of the year, but I kept at it until there were no more prompts left to code. And I actually managed to not miss a single day! \*virtual pat on the shoulder\**** This is the third Genuary that I participate in, and I think it's the first one where I managed to complete all of the prompts on their respective day. I definitely had my doubts about being able to make it through all of them, especially since I'm a bit obsessive about things like this, where I not only want to cross off the prompt from the list, but also want to make something that I can proudly present on my socials. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/8bioeg-2.png) What I noticed this time around, and I think I've gotten better at, is that I was quickly able to determine if an idea is worth spending more time on or not. Some of the prompts took me a couple of attempts before I had something that I was satisfied with sharing, others turned out pretty good right off the bat. I'm also super surprised with how well some of my #genuary2024 posts did on my socials - in terms of likes, I've gotten numbers that I hadn't seen for quite a while. It's been a minute since I had a post get over a hundred likes, but it's happened on a couple of occasions this month: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-01-at-09.39.00-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-01-at-09.41.42-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/02/Screenshot-2024-02-01-at-09.40.59.png) #genuary2024 tweets be doing numbers Maybe Elon Musk changed something with the algorithm again, picking up on my consistent posting and somehow giving me an engagement boost. Or maybe it's just the Genuary effect, where there's lots of people actively looking for the hashtag to get inspiration? The numbers were definitely encouraging, motivating me throughout to keep at it. So, big thanks if you liked, retweeted or engaged with some of my posts, it made my month! Overall, the entire generative art space has felt a lot more vibrant with everyone coding and sharing, simply for the love of creating, without any strings attached. Moreover, it was also really fun to get back into a daily coding routine, giving me something to look forward to every single day. All of that said, here's another meme before I show you all of the things I've made over the course of Genuary 2024: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/8dhqeo.png) I tried to include relevant material whenever the chance presented itself, maybe you haven't finished all of your prompts yet and still need inspiration for some of them - otherwise maybe you'll discover some new concepts and ideas that you might want to try out for yourself! ## Prompts 1 to 7 ### #01 - Particles, lots of them For the very first prompt I didn't really want to do a particle sim, but rather something a little more artful and aesthetic. The day before I had coincidentally just seen p1xelfool post a new sketch and that really inspired me: 0:00 /0:03 1× [Link to Tweet](https://twitter.com/p1xelfool/status/1741138449732944232?ref=gorillasun.de) I could watch this GIF forever! I don't know how p1xelfool actually manages to get these pixelized animations to be so crisp. The way I did it was by using a tiny 64x64 graphics buffer in P5 that's then scaled up to a larger canvas. What's important here, is to also turn off anti-aliasing on the larger canvas - which is easily done with the noSmooth() function - such that it doesn't garble the colors of the individual pixels. Here's what I ended up with: 0:00 /0:10 1× #01 - [Link to Tweet ](https://twitter.com/gorillasu/status/1741595089099436476?ref=gorillasun.de) Basically just a trigonometry powered 3D spiral. Planning on exploring this aesthetic a bit more in the future. ### #02 - No Palettes Although this second prompt's intent was the algorithmic generation of colors, I chose to interpret it a bit differently and just do a black and white sketch, while also using it as an excuse to recreate an iconic sketch by the OG Dave Whyte aka beesandbombs: 0:00 /0:24 1× #02 No Palettes - [Link to Tweet](https://twitter.com/gorillasu/status/1741999683529064952?ref=gorillasun.de) | [Link to Original](https://twitter.com/beesandbombs/status/1732168044510580818?ref=gorillasun.de) I've been meaning to figure out how this sketch is done, for a while now, and it actually turned out to be relatively straightforward once you figure out how the rectangles need to be rotated, and at what point you have to switch out the grid of white rectangles with black ones. If you want to give it a try yourself, P5's push(), pop() and rotate() functions will definitely come in super handy for this purpose. Let me know if you'd like a write-up for this one, I think it would be worth it! ### #03 - Droste Effect This was the prompt that I struggled with the most, not just because I fell utterly sick on the same day, coming down with a heavy Covid fever (for the third time), but also because I was overly ambitious with my idea and it turned out to be quite technically involved. Here's what I ultimately ended up with: 0:00 /0:08 1× #03 - [Link to Tweet](https://twitter.com/gorillasu/status/1742621402371346899?ref=gorillasun.de) I initially attempted this in 3D, using P5's WEBGL mode, zooming in with the camera on a grid made of quads - but that turned out to be a doozy because you now also have to deal with the viewing frustum of the camera which simply doesn't show the shapes if you're either too far or too close to them. I fell back to doing things in 2D, such that I'm simply scaling the dimensions of the entire grid, then bringing a randomly selected rectangle to the center and zooming in on it, swapping it out with a second grid when it's grown to the size of the canvas (minus some margin). Rinse and repeat. Bringing back the first grid, this conceptually simulates an endlessly zooming effect. Ideally, the grid itself would also be a bit more interesting, and there'd be more than just 2 grids/phases the animation goes through, but with being sick and all I just wanted to wrap it up and check off the prompt. ### #04 - Pixels Throughout 2023 I experimented a lot with graph algorithms, maze generation algos being the favorite rabbit hole that I discovered. What's cool about these algos is that you don't actually have to use them to generate mazes, but can simply use them as space filling methods to grow regions on a 2D canvas - here's something I made with this idea, using Prim's algorithm specifically: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/patterns1ss.png) Letting multiple space filling generators loose on a square grid creates interesting regioned patterns. These maze generating algorithms coming in many different flavors and therefore produce various kinds of patterns - due to something called the 'river factor', look it up, it's super interesting. For Genuary's 4th prompt I'm essentially just doing that, with the difference that I'm using a small canvas and filling in the pixel colors directly instead of drawing rectangles (then up-scaling it to a larger canvas). Adding an individual unique ID to each region allows me to prune the boundaries between the final regions, which carves out paths between them and results in something that reminds of the patterns that you'd find on a giraffe: 0:00 /0:22 1× #04 Pixels - [Link to Tweet](https://twitter.com/gorillasu/status/1742682500680622477?ref=gorillasun.de) I ended up playing quite a bit with this idea throughout some of the other Genuary prompts. ### #05 - In the style of Vera Molnár (1924-2023) RIP Vera Molnár, one of the pioneers of generative art, and one of my biggest personal inspirations. This 5th prompt was actually purposefully chosen to coincide with her 100th birthday - I thought that it was a really nice gesture to honor her legacy. The inspiration for my creation is actually one of the first pictures of hers that pops up when you look her up on google - the image that's also shown on her Wikipedia page: [![Vera Molnár – Wikipedia](https://upload.wikimedia.org/wikipedia/commons/a/a1/Vera_Moln%C3%A1r_%281996%29.png)](https://de.wikipedia.org/wiki/Vera%5FMoln%C3%A1r?ref=gorillasun.de) [Link to Vera Molnar's Wikipedia Page](https://de.wikipedia.org/wiki/Vera%5FMoln%C3%A1r?ref=gorillasun.de) I don't actually know what the name of the artwork is, but I decided to do an animated version of it: 0:00 /0:08 1× #05 - [Link to Tweet](https://twitter.com/gorillasu/status/1743276463875354971?ref=gorillasun.de) If you're curious to learn more about Vera Molnár, I've written a little about her early career here: [The Art of Vera Molnar 1947-1974Vera Molnar is one of the pioneers of what we know today as Generative Art. She was one of the firsts to dare and use computers for the purpose of making art. In this article we have a look at her rich artistic career and how she paved the way for the computer artists of today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/Galerie-La-Ligne-Vera-Molnar-2000x1415.jpg)](https://www.gorillasun.de/blog/the-art-of-vera-molnar/) ### #06 - Screen Saver Here I wanted to make something that looked a bit *retro* as well as a little esoteric like the famous "Plumber's Nighmare". An initial version of the pixel particle spiral that I made for the first prompt was actually just some particles sampled within a rotating shere, here's what that looked like: 0:00 /0:10 1× I thought that it looked pretty nice and that there was something there, hence I simply recycled the idea for the 6th prompt: 0:00 /0:20 1× #06 - [Link to Tweet](https://twitter.com/gorillasu/status/1743407276176580926?ref=gorillasun.de) I additionally used a posterization shader by [BarneyCodes](https://twitter.com/BarneyCodes?ref=gorillasun.de) that creates these cool shifting color bands on the spheres. The final animation ultimately turned out crunchier than I would've liked it to be - but I think that's in the spirit of being *retro*. ### #07 - Progress Bar Similarly to the 4th Genuary prompt, here I'm letting Prim's algo do its magic and expand across the pixels of the canvas, consuming more and more pixels as the red region expands: 0:00 /0:33 1× #07 - [Link to Tweet](https://twitter.com/gorillasu/status/1743769664029606311?ref=gorillasun.de) The cool thing here is the pixel font, since it's a tiny canvas - 64x128 - using a regular font is not an option. Hence I made my own pixel font to be able to visualize the digits 0 through 9, representing them as 3x7 boolean matrices which get printed to the canvas simply by setting the pixels that coincide with a truth-y value to white. Naturally, there's more code to position the digits properly and space them out a bit. All that's left is to calculate the ratio of pixels that are already filled in by the expander, with respect to the pixels that are still awaiting their red fate, to determine the *loading* percentage. ## Prompts 8 to 14 ### #08 - Chaotic System And yet another take on the maze/graph expansion strategy. Here I asked myself what it would look like if I cleared the interior of the regions after they were done expanding based on some adjacency rules, and that led to really interesting patterns: 0:00 /1:35 1× #08 - [Link to Tweet](https://twitter.com/gorillasu/status/1744159664420360249?ref=gorillasun.de) ### #09 - ASCII Nothing too mind boggling for this one, just a circular SDF applied to a grid, where the grid is represented by ASCII characters picked from an array that's sorted by brightness: 0:00 /0:12 1× #09 -[ Link to Tweet](https://twitter.com/gorillasu/status/1744494439840481619?ref=gorillasun.de) This is directly inspired by the famous donut Shaped C-code, that generates a spinning 3D donut made of ASCII characters: ### #10 - Hexagonal This one was easy, simply took the code for my generative token [Hex Appeal](https://www.fxhash.xyz/generative/29784?ref=gorillasun.de) that I released over on fxhash in December, stripped the textures for a more minimal aesthetic, and turned the individual functions that create the individual regions into generators to animate the entire procedure - and you might've guessed it already, yet again it's Prim's algo that's at work here, carving out regions from the hexagonal grid: 0:00 /3:08 1× #10 - [Link to Tweet](https://twitter.com/gorillasu/status/1744856827878359418?ref=gorillasun.de) I might still make a "Making Of" style post about my Hex Appeal project in the future, if I find the time for it. If you're curious about Javascript generators however, I've actually written about them on two separate occasions, here's two bookmarks if you'd like to check those posts out: [An Introduction to Javascript GeneratorsIn this post we’ll go over everything that you should know about Javascript Generators. Javascript generators are a versatile feature of ES6 and allow for interesting programming strategies, that otherwise wouldn’t be possible.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner--1---1-.png)](https://www.gorillasun.de/blog/an-introduction-to-javascript-generators/) [Javascript Generators for Animated Generative SketchesIn this tutorial we’ll have a look at javascript generators and how they can be used for animating the drawing phase for our generative sketches. We’ll cover everything from syntax to actually implementing a simple example using p5’s draw loop.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/06/img-365--1.png)](https://www.gorillasun.de/blog/javascript-generators-for-animated-generative-sketches/) ### #11 - In the style of Anni Albers (1899-1994) This was arguably the post that got the most likes over on Twitter, clocking in at a whopping 178 hearts as of writing this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annibers9.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annibers5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annialbers.png) #11 - [Link to Tweet](https://twitter.com/gorillasu/status/1745219215626486232?ref=gorillasun.de) This was the first non-animated artwork that I'd made for Genuary at that point - I don't know why but these turned out much better than I'd anticipated. Conceptually it's very simple, it's powered by a nested loop that places rectangles in a grid like manner, where some of the rows have a random chance to stretch a longer span occasionally. The individual rectangles then also have the chance to be further subdivided into smaller rectangles, to emulate that famous Anni Albers vertical stripe pattern that can be seen in many of her works. Shout-out to Roni Kaufman and his gorgeous Ten palette that I used here, with some additional colors of my choice! Roni has this cool website called [Color Pals](https://ronikaufman.github.io/color%5Fpals/?ref=gorillasun.de) where he collects some of his personal palettes - you should check it out, I use that page a lot! ### #12 - Lava Lamp Lava Lamp you say? Or did you mean Marching Squares? ... Yeah I think you meant Marching Squares: 0:00 /0:45 1× #12 - [Link to Tweet](https://twitter.com/gorillasu/status/1745581603517083719?ref=gorillasun.de) If you're not familiar, Marching Squares is an algorithm that lets you compute the contours of specific regions on a square grid. In this scenario, the regions are determined by the grid vertices that fall underneath a number of circles that are bouncing around the canvas. If two such circles are close enough, the Marching Squares procedure will produce a sort of blob like shape that spans across those two circles. A great guide to implementing this is by Patt Vira: Patt's been putting out stellar tutorials at an absolutely dizzying rate, highly recommend checking out her channel! ### #13 - Wobbly Function Day Really proud of this one, it was something that I wanted to make some time ago but couldn't really figure out how to do it. The effect in question was the thickening and thinning of the outward spiraling band: 0:00 /0:04 1× #13 - [Link to Tweet](https://twitter.com/gorillasu/status/1745943991282192856?ref=gorillasun.de) The wobbly effect ultimately boiled down to feeding in the angle of rotation and the distance to the center correctly into the sine wave that determines if a given entry on the grid should be drawn. ### #14 - Less than 1KB Artwork One thing that I've always wanted to try out, was programming an animation in vanilla Javascript, without relying on P5's draw loop. And that's exactly what I ended up doing for the 14th prompt, the trigonometric/parametric animation that you see below clocks in at less than 1kb, including HTML and CSS code: 0:00 /0:06 1× #14 - [Link to Tweet](https://twitter.com/gorillasu/status/1746540670318162363?ref=gorillasun.de) And here's the entire code that sits behind the animation: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/carbon-1-.png)](https://codepen.io/gorillasu/pen/LYabKXL?ref=gorillasun.de) And here's the code for the above animation | [Link to Codepen](https://codepen.io/gorillasu/pen/LYabKXL?ref=gorillasun.de) Note to self, need to figure out how to run an animation loop at a specific frame rate - because exporting the gif/video was a bit of a hassle. If you're interested in code golfing and Tsubuyaki processing, I've written a bit about it here: [9 Tips for Tsubuyaki ProcessingTsubuyaki processing has become a popular and fun little challenge on Twitter. In this post I’ll be going over some character saving tricks that can come in clutch when you’re out of ideas for reducing the size of your code!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tsubuyaki.jpg)](https://www.gorillasun.de/blog/9-tips-for-tsubuyaki-processing/) ## Prompts 15 to 21 ### #15 - Use a physics Library Another thing that I heavily explored in 2023 besides graph algorithms, were physics sims, which culminated in me learning a lot more about particle, spring and soft body physics - I was a bit short on time that day hence I just took the code that I'd already written and played a bit with it to make these little squishy blobs: 0:00 /0:50 1× #15 - [Link to Tweet](https://twitter.com/gorillasu/status/1746994480635343106?ref=gorillasun.de) I've always been meaning to return to it for further optimizations as well as implementing a soft body simulation with the Verlet Integration method. Maybe at some point throughout the year I will find the time for it. If you're curious about implementing something like this, here's two posts that should get you up to speed on the topic: [Spring Physics, Particles and MeshesSprings are an integral concept to physics, fundamental components used in many applications, coming to life with Hooke’s Law from the 17th century. In this post we have a look at how to code and simulate such springs and extend a previous particle system with them.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-23-at-17.11.05.png)](https://www.gorillasun.de/blog/spring-physics-and-connecting-particles-with-springs/) [Programming Soft Body Physics and BlobsOne approach to modeling deformable objects in computer graphics are spring-mass systems: a technique that allows us to bring Soft Body physics to life. Picking up from the particle mesh that we created last time; in this post we’ll tackle different configurations for blob-like shapes.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/thegreattraversal-3-.jpg)](https://www.gorillasun.de/blog/soft-body-physics-and-blobs/) ### #16 - Draw 10 000 of Something I love these kinds of prompts, since they're open-ended and allow you to experiment a bit. I've had this idea for drawing a Delaunay triangulation where the individual triangles are represented as hachures, and it turns out that the resulting pattern is quite fascinating: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/10000.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/circs.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/shrinkk.png) #16 - [Link to Tweet](https://twitter.com/gorillasu/status/1747220373005856900?ref=gorillasun.de) The alternative version in which the triangles are filled in with circles came later, but I ended up kind of preferring it over the initial one. ### #17 - Inspired by Islamic Art I've actually attempted Islamic geometric patterns before, in February of 2022 to be precise (feels like it's centuries ago now) for Raph's weekly creative coding challenge, where the topic was "Arabesque": [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/arabesque.jpg)](https://openprocessing.org/sketch/1491053?ref=gorillasun.de) [Link to Sketch on OpenProcessing](https://openprocessing.org/sketch/1491053?ref=gorillasun.de) | A submission for Raph's WCCChallenge so the code's super clean! Remembering that it was quite time consuming to code this kind of tessellation, I decided to look for other patterns that might be a bit more straightforward - ended up discovering Samira Mian's work over on Pinterest, an artist that specializes in Islamic Geometry. And she's actually collaborated with Amy Goodchild in the past, another prolific generative artist. One of her patterns stood out to me in particular: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-31-at-10.35.08.png)](https://www.pinterest.de/pin/1084945366468052086/?ref=gorillasun.de) [Link to Pin](https://www.pinterest.de/pin/1084945366468052086/?ref=gorillasun.de) It seems very intricate at first, but once you look a little closer it's actually not so difficult to deconstruct into individual shapes: 4 octagons positioned on the vertices of a central square that rotate by 45° degrees, plus some additional lines that extend outwards from the square's vertices. And that's essentially the pattern that I recreated for the 18th prompt: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/islamiccccc.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/patternnn.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/islamoccccc-1.jpg) #17 - [Link to Tweet](https://twitter.com/gorillasu/status/1747607023636623772?ref=gorillasun.de) I particularly really like the middle version, with the dark background that really accentuates the pattern. For this sketch the p5 graphics buffer came in super handy, making it possible to line up the colors of the tiles seamlessly whenever it is repeated. I detailed how this idea works in this article of mine: [The P5 Graphics BufferIn this post we’ll have a look at the P5JS graphics buffer and how to effectively use it in your P5 sketching practice. We’ll also create a variation of the 10 PRINT pattern that repeats seamlessly.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/bannerg.png)](https://www.gorillasun.de/blog/the-p5-graphics-buffer/) ### #18 - Bauhaus I've been a huge fan of Gunta Stölzl's generative approach to textile work for the longest time, and wanted to create something that at least captured the visual rhythm that can be seen in many of her works - I'm not sure if I came close to it, but I'm still happy with the minimal geometric compositions that I ended up with. Here's a few curated outputs: ![Image](https://pbs.twimg.com/media/GEJqjLQWUAANQgy?format=jpg&name=4096x4096) #18 - [Link to Tweet](https://twitter.com/gorillasu/status/1748077055793566035?ref=gorillasun.de) ### #19 - Flocking Although I've implemented quite a few particle systems in the past, I've never actually tried my hand at coding a flocking simulation. Luckily we have Mr. Shiffman that's covered the topic on several occasions, highly recommend checking out coding challenge #124 in which he explains and implements such a flocking sketch from start to finish: In addition to the alignment, cohesion and separation rules that are at the core of a flocking simulation, I added in collisions to make the particles not clump up too closely to each other: 0:00 /0:30 1× #19 - [Link to Tweet](https://twitter.com/gorillasu/status/1748370261206851971?ref=gorillasun.de) ### #20 - Generative Typography Not entirely certain if it counts as Generative Typography, but here I'm reusing the pixel font that I'd made for the 7th Genuary prompt, adding in more letters and scrolling them upwards on the canvas: 0:00 /0:06 1× #20 - [Link to Tweet](https://twitter.com/gorillasu/status/1748820492667002962?ref=gorillasun.de) I think this idea could be very useful in the context of a video game, aesthetically and conceptually. An additional property of these tiny letter matrices is that they're super light weight as opposed to regular font faces that needs to store vertex and stroke information. ### #21 - A Library that you haven’t used before Never used ml5.js before, and was pleasantly surprised how easy it is to use - if you're not familiar, ml5 is essentially a web friendly JavaScript machine learning library. It comes equipped with a number of different pre-trained models that you can use straight out of the box, and is super easy to spin up alongside P5 to create all sorts of ML powered demos and visualizations. In the sketch I made for Genuary, I used MobileNetV1 that lets you detect hand poses that occur within a given video feed (P5 lets you easily create one). The model then returns the coordinates of the landmarks of your hand - basically the fingertips and joints of your hand - I then leveraged this to control the position of a bigger particle with my index finger: 0:00 /0:16 1× #21 - Link to Tweet The only downside of it is that the hand/pose detection is a little slow and can't really run at a smooth frame rate - on my machine at least, maybe on a windows pc equipped with an NVIDIA graphics card things would be smoother. Would be such a cool idea for a live installation! Need to investigate this more in the future. ## Prompts 22 to 27 ### #22 - Point - Line - Plane I've done a lot of work in the past that tries to recreate a Suprematist aesthetic and I simply didn't feel like taking another stab at it that day. When I read the prompt I immediately had to think about a sketch from the prolific Loackme, in which he morphs a point into a line, then the line into a square, and then morphs them back again - had to do a cover of it for this prompt: 0:00 /0:04 1× #22 - [Link to Tweet ](https://twitter.com/gorillasu/status/1749466737286713425?ref=gorillasun.de) ### #23 - 64x64 I didn't really know what I wanted to do for the 23rd prompt, but then I saw lots of pixelized falling sand simulations popping up on my Twitter timeline, leading me to discover that Daniel Shiffman had recently released a new video in his coding challenge series: A remembering exploring falling sand simulations a couple of years ago, at a time where I still didn't really know much about creative coding, I never ended up implementing it for myself at the time, but here it was too compelling not to do so. My sketch didn't end up being too different from what Shiffman ended up with in his video: 0:00 /0:16 1× #23 - [Link to Tweet](https://twitter.com/gorillasu/status/1749856633151164764?ref=gorillasun.de) I talked a little more in depth about Cellular Automata in this issue of the Newsletter: [Gorilla Newsletter 41This week 📬 the Tickle #90 - Falling Sand Simulation with the coding train - Maxime Heckel on Caustics - Building 3D scenes for the browser by Yasmin P. - Snippets for Art by Chris McCully - Zed going Open Source +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/asdfg.png)](https://www.gorillasun.de/blog/gorilla-newsletter-41/) What's noteworthy is the 3 part tutorial series by Jason McGhee on falling sand simulations, in which he explains how to implement a falling sand simulation and make it feel relatively realistic. He concludes by additionally implementing fire, smoke and wood elements as CAs: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-31-at-23.48.01.png)](https://jason.today/falling-sand?ref=gorillasun.de) [Link to 1st part](https://jason.today/falling-sand?ref=gorillasun.de) ### #24 - Impossible Objects (Undecided Geometry) Yet another pinterest discovery turned generative art, and although I don't know if it satisfies the prompt, I think it turned out pretty cool with the ambiguous perspective where it isn't immediately evident if the inner square grids are falling inwards or protruding outwards: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/impossibllllee.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/spspsps.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/var.png) #24 - [Link to Tweet](https://twitter.com/gorillasu/status/1750176159965360208?ref=gorillasun.de) I definitely want to play with this sketch a bit more in the coming days, I have a feeling that this has the potential to even become a generative token with just a little more work. ### #25 - Recreate this with Code I visited my fam over the Christmas holidays, and naturally we went out a couple of times to grab food and such - the things that you do with family. On one of our post-meal walks near the Rhine (largest river in Germany, passing through Düsseldorf) I came across this paved pattern in front of a coffee shop. I don't usually take pictures, but seeing that I had done something similar with code before, I felt compelled to snap a pic - which came in really handy for this prompt: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/img---2023-10-21T225453.180.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/IMG_3902.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/pattern.png) #25 - [Link to Tweet](https://twitter.com/gorillasu/status/1750522520200261716?ref=gorillasun.de) On the left you can see the sketch that I made a while back before coming across the tile pattern, in the middle the pic I snapped of the tile pattern, and on the right's the redo. Code for this isn't that difficult, the two main ingredients are linear interpolation and a sine wave. ### #26 - Grow a Seed Still inspired from Shiffman's coding challenge #180, and after playing for way too long with Max Bittker's Sanspiel I just had to figure out how those cute little fungal growths came to be in the game - or at least try to recreate them. After about an hour of researching the topic and not finding much on the topic, I circled back around to Diffusion Limited Aggregation with which you can create these growth like patterns. The way I implemented the sketch though probably doesn't have much to do with DLA anymore. Instead of throwing random walks or particles at the initial seeds to grow them, they proliferate outwards by consuming vacant adjacent cells. The main idea here is that all active cells have the ability to place new cells on immediate vacant neighboring cells, except if there's already too many active cells nearby within a given radius - that's why the branches can sometimes be thicker than just one pixel: 0:00 /1:34 1× #26 - [Link to Tweet](https://twitter.com/gorillasu/status/1750905726870978688?ref=gorillasun.de) I think that there's still many more additional rules that can be tacked onto this CA to make the shapes more interesting. For instance, the color change at the extremities results from tracking the distance of newly activated cells to the original seed. ### #27 - Code for One Hour I had ambitious plans for this one - in my mind I'd record myself coding for an hour, turning the recording it into an epic timelapse, but ultimately I didn't have time for any of those ideas. Ultimately I simply decided to code for an hour, and see what comes of it. In the past year I've started using Pinterest a lot more, not only to post my own creations, but to also discover new ideas and inspirations - it really is a treasure trove for digital art. Came across this super cool interlaced pattern that had these really vibrant margins between the interlacing lines - decided to recreate it with code which wasn't too difficult: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/60fcfa025f166db3e5b37df870fd88c9-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/GE4gmm9XkAATYKd-1.jpg) #27 - [Link to Tweet](https://twitter.com/gorillasu/status/1751375092959838421?ref=gorillasun.de) This design is actually made by Florence Broadhurst, who's a really fascinating artist with a super interesting career, highly recommend checking out her works: [Florence Broadhurst - Wikipedia![](https://en.wikipedia.org/static/apple-touch/wikipedia.png)Wikimedia Foundation, Inc.Contributors to Wikimedia projects![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Tennis_party_at_Mount_Perry_(16283007683).jpg/1200px-Tennis_party_at_Mount_Perry_(16283007683).jpg)](https://en.wikipedia.org/wiki/Florence%5FBroadhurst?ref=gorillasun.de) ## Prompts 28 to 31 ### #28 - Skeuomorphism These last couple of prompts also ended up being quite tough to get through, not only because they were quite specific but also because I was super short on time After spending the entire day packing my entire existence into a couple of cardboard boxes I was able to finally sit down at 11:00 PM to start working on the 28th Genuary prompt. I decide to redo something I'd done before and see if I could recreate it - a simple flowfield of that's made out of short line segments that looks a little like grassy meadow (if you squint real hard): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/patch.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/IMG_4095.jpg) #28 - [Link to Tweet](https://twitter.com/gorillasu/status/1751741805643661738?ref=gorillasun.de) Here's also a polaroid of me packing my stuff that my partner snapped while I wasn't paying attention. Genuary really helped me power through this month, like I said it gave me something to look forward to every day when there was a lot of uncertainty in other aspects of my life. Will need to take it easy in the coming days to process and see where things will go from here. ### #29 - Signed Distance Functions I absolutely love me my SDFs - having finally wrapped up the big move to the new place I finally had time to wind down a bit and take my time with this prompt: 0:00 /0:08 1× #29 - [Link to Tweet](https://twitter.com/gorillasu/status/1752100759569612859?ref=gorillasun.de) If you're interested in learning how to make something like this, I have good news, a series on coding grid based SDFs is already planned for the coming weeks! It's actually a lot easier than it looks. ### #30 - Shaders Oof... this one definitely felt like the final boss of Genuary. I've attempted shader coding a couple of times in the past, without much success, not until this absolutely stellar video by Kishimisu dropped that helped me wrap my head around them a bit more: If you want to get into shader coding you need to watch this video. Period. Not only does it introduce some of the essential concepts, it also additionally leaves you with a sketch to play with and modify. I think that's an underrated aspect of many tutorials, giving the audience something to take with them and experiment with after the tutorial. I think I've watched Kishimisu's video like 5 times now, and every time I feel like I'm getting a better grasp on what's going on. I managed to make my own bastardized version of what Kishimisu creates in the video, here: 0:00 /0:15 1× #30 - [Link to Tweet](https://twitter.com/gorillasu/status/1752333052108239103?ref=gorillasun.de) I also have no idea how to export perfectly looping animations from shadertoy yet - if it's even possible. Maybe I need to route the shader through P5's WEBGL mode and then use the convenient saveGif() function. ### #31 - Generative Music And we already find ourselves at the end of Genuary again with this final prompt - this is the only video on here for which you'll have to turn on the audio. A simple idea where the bouncing particles produce a sound whenever they collide with each other, built with tone.js: 0:00 /0:34 1× #31 - [Link to Tweet](https://twitter.com/gorillasu/status/1752623881544692122?ref=gorillasun.de) ## Concluding Thoughts And that's it - we made it through Genuary 2024! Ultimately it's always nice to come out on the other end with a massive folder full of ideas to explore and work on throughout the coming weeks of the year. A couple of the prompts definitely turned out unexpectedly nicer than I had anticipated, hence I'd like to explore these a little more while they're still fresh in my mind. **This concludes my personal Genuary Recap, keep your eyes peeled in the coming days for another recap in which I'll showcase some of the creations from others!** **If you enjoyed this post, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithms know that this is good content! And if you've read this far, thanks a million!** *If you're still hungry for more Generative Art and Creative Coding content, consider checking out the weekly newsletter here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) ### Gorilla Newsletter 41 URL: https://www.gorillasun.de/blog/gorilla-newsletter-41/ Last updated: 2024-08-15T08:00:42.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 41st issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **Hope you're all having a great start into the week!** That said, let's get straight into it!👇 ## The Tickle #90 I'm stoked to announce that I'm featured in the 90th issue of the Tickle, a monthly magazine that covers the people and happenings in contemporary digital art, with a focus on the Web3 space: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/TICKLE-MONTHLY_-90_GORILLA-SUN3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/TICKLE-MONTHLY_-90_GORILLA-SUN2.jpg) And hats off, Johnny did an amazing job at making my rambly answers read in a coherent manner - he asked about how I got into programming and generative art in the first place, as well as the motivations behind my blog. You can check out this issue and all previous tickle issues over on [the official website](https://thetickle.art/?ref=gorillasun.de). Also consider supporting the Tickle for all of the effort that's going into interviewing different individuals in the space, transcription and putting together a beautiful layout to provide stellar coverage of the digital art space - the tickle is a magazine that's primarily distributed as a digital token: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-29-at-02.34.05.png)](https://objkt.com/tokens/KT1KhepNMQ38DQ84QzT2ijVtsP1cMrvAyzJj/19?ref=tz1hXx6tvTV3kzxpBR6E4hDYcxdgcRGHUTFj) [Link to Issue](https://objkt.com/tokens/KT1KhepNMQ38DQ84QzT2ijVtsP1cMrvAyzJj/19?ref=tz1hXx6tvTV3kzxpBR6E4hDYcxdgcRGHUTFj) An interesting story here is that Johnny actually reached out to me at the beginning of 2022, but my life was a bit chaotic back then (spoilers, it still is) hence I never ended up getting back to him. I was super happy when he reached out again asking for a call. Another thing to mention here is that it's not actually my very first appearance in the tickle - I was mentioned in [issue #57](https://teia.art/objkt/765721?ref=gorillasun.de) by the prolific Aleksandra Jovanić, and I still cherish her words till today: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-29-at-02.38.20.png)](https://teia.art/objkt/765721?ref=gorillasun.de) [Link to Issue](https://teia.art/objkt/765721?ref=gorillasun.de) ## All the Generative Things ### Simulating Sand with Cellular Automata Daniel Shiffman's long running coding challenge series on YouTube resumes with video #180, this time teaching us how to implement a falling sand simulation: This coding challenge is actually closely related to a number of previous challenges, all of which revolve around Cellular Automata like [#85](https://www.youtube.com/watch?v=FWSR%5F7kZuYg&ref=gorillasun.de) (Conway's Game of Life) and [#179](https://www.youtube.com/watch?v=Ggxt06qSAe4&ref=gorillasun.de) (Wolfram's Elementary Automaton), and you might've heard of the term before, as it pops up in a few different places in computation. *But what actually are Cellular Automata?* In simple terms, they're computer simulations that consist of a grid of cells, each of which can be in a certain state. The state of these cells can then change and evolve over the course of a number of discrete time steps, as the simulation progresses, based on certain rules. These rules often have to do with the state of adjacent neighbors of a given cell. The most famous example of a cellular automaton is [Conway's Game of Life](https://en.wikipedia.org/wiki/Conway%27s%5FGame%5Fof%5FLife?ref=gorillasun.de), which gives rise to all sorts of fascinating patterns: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Gospers_glider_gun.gif) [Gosper's](https://en.wikipedia.org/wiki/Bill%5FGosper?ref=gorillasun.de "Bill Gosper")[Glider Gun](https://en.wikipedia.org/wiki/Gun%5F%28cellular%5Fautomaton%29?ref=gorillasun.de "Gun (cellular automaton)") creating "[gliders](https://en.wikipedia.org/wiki/Glider%5F%28Conway%27s%5FLife%29?ref=gorillasun.de "Glider (Conway's Life)")" in the cellular automaton [Conway's Game of Life](https://en.wikipedia.org/wiki/Conway%27s%5FGame%5Fof%5FLife?ref=gorillasun.de "Conway's Game of Life") Conway's Game of Life was a catalyst in making CAs much more popular not just in academia, but also in other contexts - creative coding and generative art for instance. A fun anecdote here is that Conway was actually annoyed at how popular his idea became, in many ways overshadowing his other works in mathematics and computation. If you've got an hour to spare you should give the following video a watch in which Conway talks about surreal numbers, a fascinating number system that he invented: But to get back on track, the cool thing about CAs is that you can come up with all sorts of rules to simulate different kinds of behaviors, falling sand simulations are just one type thereof. A stellar example of what you can do with CAs is Max Bittker's Sandspiel, a falling sand sandbox game that introduces many other elements and materials besides just sand, all of which interact in some manner. For example, you can place a pile of sand, then drop a seed, which then grows into a plant, that you can then burn with fire, then douse with water to extinguish the fire and regrow the plant, and so on. [![screenshot of the game](https://raw.githubusercontent.com/MaxBittker/sandspiel/master/Screenshot.png)](https://sandspiel.club/?ref=gorillasun.de) [Link to Sandspiel](https://sandspiel.club/?ref=gorillasun.de) | Try it, it's super addictive The game's essentially one big Cellular Automaton. Moreover, it runs fully in the browser, so you can give it a try yourself - but careful, it's kind of super addictive. Max Bittker also made [a write-up](https://maxbittker.com/making-sandspiel?ref=gorillasun.de) in which he elaborates on the motivations behind Sandspiel and some of the implementation details, that do get a little technical towards the middle. As pointed out in the coding challenge however, one of the best written guides on implementing a falling sand simulation is by Jason McGhee: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-29-at-02.03.53.png)](https://jason.today/falling-sand?ref=gorillasun.de) [Link to Article](https://jason.today/falling-sand?ref=gorillasun.de) I think I found myself on this article a few years back, or maybe it was another tutorial, but I was delighted to see that it's now actually turned into a three part series, in the last of which McGhee goes as far as showing us how to code Fire, Smoke and Wood elements as well - I don't think there's other resources on the internet that cover these. By complete coincidence I also came across a Tweet by none other than John Maeda, pointing out a sort of fractal/recursive take on Conway's Game of Life which lets you infinitely zoom into the simulation to reveal that the individual cells are made out of cells as well: 0:00 /0:10 1× It's CAs all the way down | [Link to Tweet](https://twitter.com/johnmaeda/status/1749872776549367828?ref=gorillasun.de) | [Link to Demo](https://oimo.io/works/life/?ref=gorillasun.de) I was about to say that "I have absolutely no idea how you would implement something like this" before I dug around a bit more and found that there's actually a blog post on how it's made - although translated from Japanese it still provides interesting insights: [Life Universe: A Technical ExplanationThis is a translation of the original article. It was mostly processed by ChatGPT and DeepL and then I fixed the details. It’s been a while since it was released, but I’ll explain the technical details of “Life Universe”. About Life Universe First, there are some things you should know bef![](https://blog.oimo.io/favicon.ico)おいもログshr![](https://blog.oimo.io/wp-content/uploads/2023/04/life.png)](https://blog.oimo.io/2023/04/10/life-universe-en/?ref=gorillasun.de) I've said this before, but there's something strangely poetic about English translations of Japanese texts: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-29-at-02.29.07.png) That said, all the mentioned resources should get you started with CAs and maybe you end up with some interesting sketches through it, I came up with my own little fungus CA for Genuary 27 "Grow a Seed" which you can see towards the end of the Newsletter. ### Shiffbot: An educative AI Experiment If that wasn't all, Shiffman has also been up to other shenanigans - with some friends over at Google Labs he created his own coding assistant/tutoring chat bot: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-25-at-17.59.54.png) [Link to Tweet](https://twitter.com/shiffman/status/1750229844233752962?ref=gorillasun.de) | [Link to ShiffBot Waitlist](https://shiffbot.withgoogle.com/?ref=gorillasun.de) Basically, ShiffBot ships as a Chrome extension, where Shiffman's head idly sits in the corner of your browser window (staring into the depths of your soul) awaiting your programming questions whenever you might be stuck on something. Google Labs also released an interesting blog post in which they detail how the bot is actually made: [How it’s Made - Exploring AI x Learning through ShiffBot, an AI experiment powered by the Gemini APIThis Lab Session gives you a glimpse of what’s possible using the Gemini API. Use Google’s AI offerings to bring your own ideas to life.![](https://developers.googleblog.com/favicon.ico)Google Developers Blog Logo![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsHoZN-BcIB_5PkK9W6vxg0VdGbvuxxjvX9QJD9zUmEHrD1l9n1pBaDHW6YewMrMVJowrhLkhOLPUoz1OMuwF3bFKE7dejpEHPXsGppIHtC_9bLacdO045gm839nlon65oHD3LMjSCuWbmfkIx25zLe5ixHKIj8pet4EF4G5-8-2kn31j57k3LhJU6tCM/w1200-h630-p-k-no-nu/meta.png)](https://developers.googleblog.com/2024/01/how-its-made-learning-through-shiffbot-powered-by-gemini-api.html?ref=gorillasun.de) In essence the Gemini powered chat bot is fine-tuned on the many resources that Shiffman's created, making the replies that it returns sound as if they were coming directly from Shiffman himself. If that sounds interesting to you, you can sign up to it via a waiting list [here](https://shiffbot.withgoogle.com/?ref=gorillasun.de). ### Maxime Heckel on Caustics Maxim Heckel is back with another stellar tutorial! Calling them blog posts as he does in his announcement Tweet is a gross understatement, as these pieces of writing are incredibly detailed and in depth. Following his previous two explorations on [Raymarching](https://blog.maximeheckel.com/posts/painting-with-math-a-gentle-study-of-raymarching/?ref=gorillasun.de) and [Volumetric Raymarching](https://blog.maximeheckel.com/posts/real-time-cloudscapes-with-volumetric-raymarching/?ref=gorillasun.de), this time around he teaches us about simulating caustics with shaders: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-25-at-18.04.22.png) [Link to Tweet](https://twitter.com/MaximeHeckel/status/1749828336040526044?ref=gorillasun.de) The term *Caustic* refers to the patterns that emerge when light shines and travels through transparent material, like water or glass. Simulating this behavior of light computationally is quite involved, but Maxime breaks down all of the individual steps and demonstrates them with interactive code examples: [Shining a light on Caustics with Shaders and React Three Fiber - Maxime Heckel’s BlogA step-by-step guide on how to build a caustic light effect for your React Three Fiber project using shaders, render targets, normal maps, and custom materials.![](https://blog.maximeheckel.com/static/favicons/apple-touch-icon.png)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/6efee8a2b2f94500a0e6bd2411b888d8.png?v1)](https://blog.maximeheckel.com/posts/caustics-in-webgl/?ref=gorillasun.de) Highly recommend checking out all of Maxime's articles! ### Building 3D Scenes by Yasmin P. And while we're talking about 3D things, here's a gorgeous 3D scene created by Yasmin P. that also runs fully in the browser, in a thread she details how she created the scene with Blender and react-three-fiber: 0:00 /0:15 1× [Link to Thread](https://twitter.com/oyaaaaaaaasumi/status/1749498053692686680?ref=gorillasun.de) I think we're all familiar with Blender already, a software that allows you to create 3D scenes and assets. But what's "react-three-fiber" though? I've heard of the framework before, but I had never actually looked into it before, and apparently it's a library that glues together the popular Three.js, which streamlines creating 3D things in the browser, and the React framework. React-three-fiber thus makes it possible to create interactive 3D environments in the browser. Yasmin also has many other really beautiful projects on her website, highly recommend checking it out for yourself here: [Yasmin P.Design engineer and digital 3D artist, currently at Vercel.![](https://www.yasmins.site/favicon.ico)![](https://images.ctfassets.net/n3e6g0fyj2te/5hU0lTbH4oVScCgcR02Gv2/973710287050bdc82274b9576117bacf/OG-4.webp)](https://www.yasmins.site/?ref=gorillasun.de) ### Chris McCully's Snippets for Art Chris McCully has built a little lookup tool/library for code snippets that are useful for generative art purposes: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-28-at-12.35.07.png)](https://snippets-js.vercel.app/?ref=gorillasun.de) [You can use the tool here](https://snippets-js.vercel.app/?ref=gorillasun.de) Depending on what type of sketch/artwork you're making, there's a often number of general purpose functions that reoccur - I think a lot of us just copy them over from other projects and browser bookmarks whenever we need them, or even create our own little library files and duplicate them when we start new projects - like calculating the angle between two vectors, or shuffling an array, etc. But both approaches are not very efficient, you either sacrifice some of your time to dig through your stuff and find the snippet that you need, or end up sacrificing storage space. Chris' tool solves it with this little library of useful snippets, presenting them in a little display box where they can be browsed and copied from. Moreover, everyone's invited to contribute to it and submit their own snippets that they might deem useful. As you can see the list entries have the contributor's name attached to them. Chris also made a little write-up for the motivations behind it here: [Snippets for ArtA simple library of generative art tools![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumChris McCully![](https://miro.medium.com/v2/resize:fit:1200/1*b2KmhWC1td7957jVrmO4EA.png)](https://medium.com/@chriswmccully/snippets-for-art-7dcea97d68b3?ref=gorillasun.de) I think it's a super cool initiative, and I've had a similar idea in the past for a personal lookup tool, but never really got around to making it although I started collecting some of my own functions in a little list. One thing that almost always makes its way into my own projects are functions that test the intersection between different shapes, like two lines, or the intersection between a line and a circle to determine the intersection coordinates - one resource that's been mega useful for that has always been Paul Bourke's notes on these geometrical calculations, might be worth adding these in: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-28-at-12.50.22.png)](https://paulbourke.net/geometry/pointlineplane/?ref=gorillasun.de) [Link to Paul Bourke's notes](https://paulbourke.net/geometry/pointlineplane/?ref=gorillasun.de) ## Tech and Code ### Zed an open source collaborative code Editor Hailed as being the *VS Code Killer*, Zed recently announced that it's now open-source under a copyleft license. If you haven't heard of Zed before, it's made by the same people that created the customisable code editor [Atom](https://atom-editor.cc/?ref=gorillasun.de) (which is no longer being developed as of 2022) and [Tree-sitter](https://github.com/tree-sitter/tree-sitter?ref=gorillasun.de), and is essentially a code editor that's mainly geared towards a collaborative approach to writing code. You can learn more about the motivations to turn Zed open source here and how the team is planning to finance it's development in the future: [Zed is now open source - Zed BlogWe hope you’ll join us in our mission to fundamentally advance software collaboration.![](https://zed.dev/favicon_black_64.png)Nathan Sobo![](https://zed.dev/api/og?title=Zed%20is%20now%20open%20source)](https://zed.dev/blog/zed-is-now-open-source?ref=gorillasun.de) What makes Zed better than VS Code? I have yet to try it for myself, but the team behind it boasts over a decade of experience in building that type of software - for instance, did you know that they originally built electron for making Atom? I found this video by Theo highly informative about everything that's going on with Zed, in which he also goes over the editor and showcases how it works, exploring its features and comparing it to VS Code: Besides blistering fast performance, Zed places emphasis on inviting other coders into your project - which is something that has become more important in this current age of content creation, where code is now also frequently written live on stream: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-28-at-11.56.01.png) A comment under Theo's video directly from the creators of Zed. I personally switched over to VS Code from using Atom for a long time, because it was becoming more and more clunky, and I'm pretty happy so far, but I will definitely give Zed a shot in the coming days and test it out for myself. Zed also has a blog section over on their official website that I found highly enjoyable to read: [From The Blog - Zed - Code at the speed of thoughtZed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.![](https://zed.dev/favicon_black_64.png)Code at the speed of thought![](https://zed.dev/api/og?title=From%20The%20Blog)](https://zed.dev/blog?ref=gorillasun.de) ### Only 90s Web Devs Remember This In a humorous article, Zach Holman transports us back to the 90s by sharing with us all sorts of web dev tricks that were the *hot-shit* back then: [Only 90s Web Developers Remember ThisWritten pieces, talks, and other bits by Zach Holman.![](https://zachholman.com/apple-touch-icon.png)Zach Holman!Zach Holman![](https://zachholman.com/images/front.jpg)](https://zachholman.com/posts/only-90s-developers/?ref=gorillasun.de) ### What every JavaScript developer should know about Unicode I've never actually spent any time on learning about Unicode beyond that it is an encoding standard that computers use to display the letters and symbols that we see on our screens. Dmitri Pavlutin wrote a deep dive on the topic, specifically in the context of Javascript, which turns out to actually have quite a few features that allow us to manipulate and work with unicode directly: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-29-at-09.32.53.png)](https://dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode/?ref=gorillasun.de) [Link to Article](https://dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode/?ref=gorillasun.de) ## AI Corner ### Salmon in the Loop The Gradient is one of my favorite publications when it comes to AI, boasting a large collection of thoughtful essays from many of the individuals that are deeply involved with the tech. In a recent article from December of the past year Kevin McCraney talks about a challenging problem that he had to solve: Fish Counting, specifically in the context of hydroelectric dams: [Salmon in the LoopOn fish counting – a complex sociotechnical problem in a field that is going through the process of digital transformation.![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)The GradientKevin McCraney![](https://thegradient.pub/content/images/2023/08/DALL-E-2023-08-21-18.52.00---frothing-waves-in-the-middle-of-the-spillway-of-a-hydroelectric-dam--shown-by-a-bridge-across-a-river-with-many-arches--with-a-fish-jumping-downstream.png)](https://thegradient.pub/salmon-in-the-loop/?ref=gorillasun.de) The title of the article is a play of words on the term "Human in the Loop", which refers to systems in which an expert individual is needed for monitoring and decision making. The article explains that a "Human in the loop" has been the main approach to fish counting, and contrary to how simple the task sounds, it's actually a physically demanding job where you not only have to count the number of passing fish, but also need to monitor the characteristics of them, if they're presenting indications of being injured or ill in some manner, for instance. Kevin continues to explain how computer vision models can help with this task and elaborates on how they need to be configured and trained towards that end. ### Building an LLM from Scratch Ravin Kumar has been working on a guidebook for generative AI, specifically geared towards building your own *small* large language models from scratch - although currently still a work in progress, it seems to be taking shape steadily, having already accrued over 2k stars on github: [The GenAI GuideGenAI capabilities used to be limited to researchers or folks in a few organizations. Not anymore. These capabilities are widely available, whether it be popular chat style interfaces, through apis…![](https://ravinkumar.com/favicon.ico)PythonRavin Kumar![](https://ravinkumar.com/GenAiGuidebook/_static/GenAIGuideBookLogo.png)](https://ravinkumar.com/GenAiGuidebook/book%5Fintro.html?ref=gorillasun.de) ## Gorilla's Genuary so far... We're actually almost through Genuary 2024, and I've managed to stay on top of all the daily prompts not missing a single one so far - although the last couple of days have been quite hectic - here's a quick recap of my sketches this week again: 0:00 /0:04 1× Genuary 22 - Point - Line - Plane | I didn't feel like doing a Suprematist composition that day, and remembered a sketch by loackme from a couple of weeks ago, hence I simply challenged myself to recreate it. It turned out to be quite tricky. 0:00 /0:16 1× Genuary 23 - 64x64 | This challenge was a little different for eveyone as the prompt was manipulated with a little Javascript, showing everyone a different power of 2 depending on what browser they use. I took inspiration from the Coding Train's most recent video trying my hand for the first time at a falling sand simulation. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/impossibllllee.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/spspsps.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/var.png) Genuary 24 - Impossible Geometry | While browsing pinterest I came across a Tron-like graphic that was simply made out of lines but appeared to me like it portrayed an inward going corridor of some sorts. On a second glance I could also visualize the grids as patterns that were protruding outwards. Here I recreated the idea with code. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/IMG_3902.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/pattern.png) Genuary 25 - I should try to recreate this with code | While visiting family on Christmas I came across an interesting tile pattern in Düsseldorf somewhere near a cafe at the river, and it reminded me of a sketch that I'd done before, so I challenged myself to recreate it again. 0:00 /1:34 1× Genuary 26 - Grow a Seed | This is the Cellular Automata that I concocted, inspired by Diffusion Limited Aggregation I expand initial mouse presses on the grid and grow the emerging shapes outwards. I will likely write about this in more detail sometime soon. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/60fcfa025f166db3e5b37df870fd88c9.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/GE4gmm9XkAATYKd.jpg) Genuary 27 - Code for one hour | Yet another thing that was inspired by something I saw on Pinterest. I came across this interesting interlaced pattern, that had something very vibrant about it - it's a design by Florence Broadhurst, who's a fascinating artist and individual with an equally interesting career. Recommend checking out her other works. ## Music for Coding I discovered Kurt Rosenwinkel a couple of years ago when I was actively trying to get better at Jazz improvisation, and this song just stuck with me ever since. Kurt Rosenwinkel is just out of this world when it comes to improvisation, and there's something about this song in particular that I really love, as if you'd taken a sunset view out on the ocean and channeled it into the form of a song: **And that's it from me this week, while I'm typing out these last words I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 40This week Bantam Tools acquires Evil Mad Scientist - The Flood by Yoshi Sodeoka - Digital Art recap of 2023 - Fractal Forums - Procedural Generation in Dwarf Fortress - Lesser known Accessibility Issues - Designing target sizes +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/islamoccccc-2-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-40/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 40 URL: https://www.gorillasun.de/blog/gorilla-newsletter-40/ Last updated: 2024-01-22T11:52:37.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 40th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **This week we reach a milestone with 40 weeks of consecutive newsletter issues,** I'll have to think about something special for the 50th installment, if you have ideas shoot me a message - that said, **hope you're having a great start into the week!** Let's get into it!👇 ## All the Generative Things ### Bantam Tools acquires Evil Mad Scientist Our favorite plotter company, Evil Mad Scientist, recently announced that they've been acquired by Bantam Tools: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-11.07.30.png)](https://twitter.com/EMSL/status/1747323288722772094?ref=gorillasun.de) [****Link to Tweet**](https://twitter.com/EMSL/status/1747323288722772094?ref=gorillasun.de) If you're not familiar with Evil Mad Scientist - in contrast to what the company name might suggest, they do not produce weapons of mass destruction, but rather supply generative artists with programmable drawing machines called pen plotters - you can see a lot of what people make with them if you search for [#plottertwitter over on TwitterX](https://twitter.com/hashtag/plottertwitter?ref=gorillasun.de). In a similar vein, Bantam Tools builds desktop CNC milling machines - basically high precision 3D printers that can carve things out of soft metals, plastic as well as some other materials, and mainly used to create components to build other kinds of devices. [Bantam Tools Blog — Bantam Tools Acquires Evil Mad Scientist to Accelerate Development of Next Generation Art and Handwriting MachinesBantam Tools Acquires Evil Mad Scientist to Accelerate Development of Next Generation Art and Handwriting Machines Windell Oskay and Lenore Edman of Evil Mad Scientist named CTO and COO of Bantam Tools![](https://images.squarespace-cdn.com/content/v1/5c8065a4348cd962fe950a4e/1563311820783-316VOQKB5AK0US0YIYN4/favicon.ico?format=100w)Bantam ToolsDevin Cooper![](http://static1.squarespace.com/static/6137bced60adc255eb7b29f5/6137bd1660adc255eb7b2f73/65a58c790730310aa95c7170/1705428529057/IMG_5872.png?format=1500w)](https://www.bantamtools.com/blog/bantam-tools-acquires-evil-mad-scientist?ref=gorillasun.de) What does that mean for all those who've been fans of EMS plotters? Well, we can look forward to a new generation of plotter machines under this new joint force - and they've actually already posted a page for the new product that's in the works and coming in Spring 2024, and you can already have a look at it here (not sponsored): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-22-at-10.22.24.png)](https://store.bantamtools.com/products/bantam-tools-nextdraw?ref=gorillasun.de) [Link to NextDraw](https://store.bantamtools.com/products/bantam-tools-nextdraw?ref=gorillasun.de) If you're like me and don't actually know the first thing about plotters, Raph did a little review of NextDraw's features yesterday on his stream, comparing them to the previous AxiDraw features - he's has an AxiDraw and knows what he's talking about, so I found him going over the features really helpful. From what it seems the NextDraw will be an improved version of its predecessor: 0:00 /0:30 1× [****Link to Stream**](https://www.twitch.tv/videos/2039414864?t=01h16m13s&ref=gorillasun.de) ### The Flood by Yoshi Sodeoka Verse's most recent exhibition features Yoshi Sodeoka, an accomplished multidisciplinary artist, who's gained recognition for his experimental and psychedelic visual creations, as well as being one of the early pioneers in combining art and technology. A stand out piece of his was his 2004 creation *ASCII Bush* in which he transforms two presidential speeches into works of art by representing them entirely with ASCII characters alongside distorting the audio into alien sounding noises: [ASCII BUSH — Yoshi SodeokaVideo 2004 ASCII BUSH View this project at Turbulence.org ASCII BUSH is an ascii video rendition of two State of the Union addresses — one delivered by…![](https://freight.cargo.site/t/original/i/0518e9e395c6b57baebaa6c5efd33f5af24248a277c753dc070a5a6b232f10bb/pink_ghost.ico)![](https://freight.cargo.site/w/1200/i/e27c2d73a1022ea22eb32b8401863dbc85c29284c0ab601fbecb48265d3c143f/Screenshot-2019-01-02-13.09.45.png)](https://sodeoka.com/ASCII-BUSH?ref=gorillasun.de) > The result produces a very grating, flat, and programmatic feel to the topic of war and politics. The stateliness, patriotism, and presidential feel are erased, replaced with a cold, cruel, and unwavering drone of unfamiliar visuals and audio. The viewer is forced to experience the political message through a completely different lens \~ [Cale Mooth, Yoshi Sodeoka Rides the Psychedelic Wave ](https://midnightcheese.com/2022/05/yoshi-sodeoka-rides-the-psychedelic-wave/?ref=gorillasun.de) I'm wondering if this is historically actually the very first instance of someone attempting to visualize a video with ASCII characters - today it isn't really an innovative thing anymore. Seems like it might be worth investigating this for an article. Beyond that, Sodeoka has also been exhibited in several venues around the globe, such as the Centre Pompidou, Tate Britain, the Museum of Modern Art, and many more. He's also worked with several bigger brands and artists - one notable example from last year being his involvement in directing the music video for Metallica's track "You must Burn!". You can actually browse all of his works in chronological order over on his portfolio - with the first one dating back to 2001: [Yoshi SodeokaPortfolio Website of Yoshi Sodeoka, Video Artist.![](https://freight.cargo.site/t/original/i/0518e9e395c6b57baebaa6c5efd33f5af24248a277c753dc070a5a6b232f10bb/pink_ghost.ico)![](https://freight.cargo.site/i/9f7efcf766ed39cfe5ae35d8d8fe43145c9e6183ccb8db99e352ccba11262d8f/39-screenshots_0000_Layer-73_1600_c.jpg)](https://sodeoka.com/?ref=gorillasun.de) If you want to learn more about Yoshi Sodeoka, here's a stellar essay that summarizes his long career very nicely: [Yoshi Sodeoka Rides the Psychedelic WaveA blend of analog and digital signals interacting, shifting in shape and color, and creating a sometimes-dizzying barrage of visual intensity.Midnight CheeseCale Mooth![](https://assets.midnightcheese.com/images/sodeoka-elephant.jpg)](https://midnightcheese.com/2022/05/yoshi-sodeoka-rides-the-psychedelic-wave/?ref=gorillasun.de) To return to the actual topic of discussion, for his recent Verse exhibition he created a series of animations that are quite unlike anything I've seen, I actually have no clue how they're made - my hunch being Touchdesigner due to the shader-esque qualities of the graphics. The animations essentially visualize a number of little digital spider creatures that sprawl out around the canvas, leaving trails behind them, weaving digital spider webs as they explore the canvas. The animations are a bit eerie, but at the same time mesmerizingly beautiful - I had a lot of fun going through the series and watching each one a couple of times: [The Flood | VerseYoshi Sodeoka’s two latest series, The Flood: Orchestrated and The Flood: Chaos consist of code-based simulations that juxtapose the organic behavioural pattern![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2F98ddc9ff-e3be-4fd4-932d-97d528336c65.jpg@jpeg)](https://verse.works/exhibitions/the-flood?ref=gorillasun.de) Highly recommend checking out Sodeoka's work. ### Most Interesting Digital-Art Experiments of 2023 Jiayin Chen from artnet compiled a personal list of the digital-art projects/experiments/happenings from 2023 that she deems as the most interesting, mainly in context of blockchain technology. Quite a few spots on her list are taken up by generative art related projects: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-23.46.57.png)](https://news.artnet.com/art-world/art-and-tech-2023-on-chain-art-2419622?ref=gorillasun.de) [Link to Article](https://news.artnet.com/art-world/art-and-tech-2023-on-chain-art-2419622?ref=gorillasun.de) It's a really good recap of everything that's happened in 2023, and 2023 has definitely been an amazing year for digital and generative art alike. There were a bunch of standout moments throughout, for instance, the auction of Ringers #879's (The Goose) at Sotheby, or fxhash 2.0's announcement and launch later in the crazy month of December, among many more things. I don't know how we'll top all of that in 2024, but I have a strong feeling that a lot of things are already brewing. ### From Islamic Geometry to Fractal Forums After finishing my creation for Genuary's 17th prompt "Islamic Geometry" (today's banner) I went ahead and browsed some of the creations of others, coming across a really beautiful pattern by Pablo Andrioli: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-19.27.47-1.png)](https://twitter.com/kali%5Fshade/status/1747725680115102082?ref=gorillasun.de) [Link to Tweet](https://twitter.com/kali%5Fshade/status/1747725680115102082?ref=gorillasun.de) | [Other Tweet with an animated version](https://twitter.com/kali%5Fshade/status/1747615501738545440?ref=gorillasun.de) Mesmerized, I inquired about how it's done, or at least pointers towards that end, and when I asked Pablo over on discord he mentions that he learned how to do these patterns over Fractal Forums: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-19.30.40.png) And it seems to be indeed the case that the forum is no longer in use - you can no longer post or register to it - but now serves as a gigantic searchable resource for fractal related notions and discussions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-19.36.02.png)](http://www.fractalforums.com/m?ref=gorillasun.de) [Link to old Fractal Forums](http://www.fractalforums.com/m?ref=gorillasun.de) As the banner of the deprecated site indicates, there is a newer iteration of the website that is currently active - so if you're looking to exchange ideas with other Fractal enthusiasts, it's probably your go-to place: [Fractalforums - Indexthe largest resource for fractal art, fractal research and fractal programming online - learn to create fractals![](https://fractalforums.org/favicon.ico)Fractalforums![](https://fractalforums.org/Themes/DilberMC_2/images/favicon.ico)](https://fractalforums.org/?ref=gorillasun.de) ### Procedural Generation in Dwarf Fortress And from the World of Video games this week, I came across a GDC talk back from 2016, where the creators of Moon Hunters and Dwarf Fortress talk about the procedural components in these games: In the talk, the creator of DF talks about how the game procedurally generates centuries of history of a given world instance, which the player then picks up when they start a new game: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-11.10.01.png)](https://www.reddit.com/r/proceduralgeneration/comments/193evav/comment/kh8o1x8/?utm%5Fsource=share&utm%5Fmedium=web2x&context=3) [Link to comment](https://www.reddit.com/r/proceduralgeneration/comments/193evav/comment/kh8o1x8/?utm%5Fsource=share&utm%5Fmedium=web2x&context=3) If you're not familiar with Dwarf Frotress, it's arguably one of the most ambitious games ever, and two decades after it's inception it is still in development today, and has amassed a massive hard-core community around it, you can read a bit about it in this article from Marie Dealessandri from last year, interviewing the two creators of the game: [Slow and steady wins the race: How Dwarf Fortress reinvented itself after 20 yearsDwarf Fortress is an oddity across the games industry. The life’s work of brothers Tarn and Zach Adams (under the name …![](https://www.gamesindustry.biz/static/5eb0a9fadd46fc2d32432bab45e14e33/icon/apple-touch-icon.png)GamesIndustry.bizMarie Dealessandri![](https://assetsio.reedpopcdn.com/-LEAD--Dwarf-Fortress-map-fade-with-art.jpg?width=1200&height=630&fit=crop&enable=upscale&auto=webp)](https://www.gamesindustry.biz/slow-and-steady-wins-the-race-how-dwarf-fortress-reinvented-itself-after-20-years?ref=gorillasun.de) But what makes Dwarf Frotress so special? From what I read it seems that it is the procedural approach that it takes towards simulating an entire phatansy world, where each individual character in that world acts as if they had a volition of their own, and interact with other characters in that game without us, the player, necessarily knowing about it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-22-at-11.47.53.png) [Link to comment](https://www.reddit.com/r/dwarffortress/comments/1jego3/comment/cbdv90t/?utm%5Fsource=share&utm%5Fmedium=web2x&context=3) [You can read about the development progress of DF here](http://www.bay12games.com/dwarves/?ref=gorillasun.de). Tanya Short and Tarn Adams also edited a book titled [Procedural Generation in Game Design](https://www.amazon.de/-/en/Tanya-Short/dp/1498799191?ref=gorillasun.de), where texts from many game devs were compiled - seems like a relavant read here. ### Generative Minis 1. In yet another interview following his Cytographia release, [Golan Levin talks to Regina Harsanyi, this time in video format](https://www.youtube.com/watch?v=7RIFl%5FgJfL0&ref=gorillasun.de), where they fill in some of the details that the other interviews might not have covered. For instance, Golan is asked about his thoughts on asemic writing systems, and also digs a little deeper into the controls that are built into the token (which I wasn't aware of) that allow the viewer to toggle certain things in the generative artwork. 2. Lynn Cherny runs a newsletter titled "Things I Think Are Awesome" or TITAA over on SubStack in which she talks about all sorts of things related to creative coding and generative AI as well as a broad range of other topics, like popular media and book recommendations. The highlight of her newsletter are the opening anecdotes in which she recounts interesting facts based in folklore - [highly recommend checking out the latest installment of TITAA](https://arnicas.substack.com/). 3. [Chris McCully wrote a little bit about Polar Shapes - shapes made with trigonometry - and how to achieve them with code.](https://medium.com/@chriswmccully/intro-to-polar-shapes-77251125ae8e?ref=gorillasun.de) 4. Patricio Gonzalez Vivo is back with another article, this time writing about [Depth estimation from single images](https://medium.com/@patriciogv/the-state-of-the-art-of-depth-estimation-from-single-images-9e245d51a315?ref=gorillasun.de) explaining where the filed is currently at and comparing some of the state of the art approaches today. ## Tech and Code ### 16 Lesser Known Accessibility Issues Accessibility is a big part of the modern web, and should be kept in mind when developing and designing any sort of webpage - it's never possible to anticipate who might be visiting your page, how they intend on navigating it, or what assistive technology they might have to rely on to navigate the web. Toward is a digital branding agency that had their website thoroughly tested, and reports on some of the issues that they missed and were discovered through this process: [16 Lesser Known Accessibility Issues | TowardIn this post Matt discusses 16 accessibility issues and solutions we’ve encountered while building a bi-lingual website application for a public sector…![](https://toward.studio/dist/favicons/apple-touch-icon-180x180.png)Toward![](https://content.toward.studio/toward/assets/transforms/_1200x630_crop_center-center_82_none_ns/a11y-meta.png?mtime=1704382562)](https://toward.studio/latest/16-lesser-known-accessibility-issues?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) I already knew about aria labels that need to be included for users with screen readers, but I never thought about 'focus'. For instance, when you display a popup (modal) on screen and the user keeps exploring the page, you need to shift focus to that modal now instead of just continuing with the page underneath it. I don't actually know how to achieve that right now so I'll have to look into that... designing websites is really hard. ### Designing better Target Sizes And while we're talking about accessibility - Ahmad Shadeed is back with yet another in depth CSS resource - like really in depth, the page is absolutely massive - this time teaching us about designing better target sizes on our webpages: [Designing better target sizesAn interactive guide on designing better target sizes on the web.![](https://ishadeed.com/assets/favicon-32x32.png)LogoAhmad Shadeed![](https://ishadeed.com/assets/target-size/twitter-card.jpg)](https://ishadeed.com/article/target-size?ref=gorillasun.de) What actually is a target size? It's essentially the effective size of the area of a clickable UI element in which the user's interaction is detected. You'll probably have noticed that on mobile phones you can sometimes get away with clicking slightly outside of a tiny text and still have it trigger something - that's because you managed to hit within the target size. Now, how do you actually design these target sizes? And what should you keep in mind when creating them for different devices? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-12.43.00.png) Ahmad Shadeed proceeds to explain how to implement these target sizes for different navigation elements. ### Most Hearted Pens of 2023 CodePen compiled a list with the most hearted pens of 2023, all of which are some really cool innovative concepts, if you have a couple of minutes you should check them out for yourself and play around a bit with them - my personal favorite is actually #9 that showcases a cool blend mode trick: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-19.02.55.png)](https://codepen.io/2023/popular/pens/10?ref=gorillasun.de) [Link to most hearted pens of 2023](https://codepen.io/2023/popular/pens/10?ref=gorillasun.de) ### 4 Billion if Statements It's been a minute since I've enjoyed reading an article this much - Andreas Karlson really outdid himself with this post, trying to write a program that can check if a number is even or odd... the *hard* way: [4 billion if statementsI recently stumbled upon this screenshot while researching social media on the train. Of course, it was followed by a cascade of spiteful comments, criticizing this fresh programmer’s attempt to solve a classical problem in computer science. The modulus operation.![](https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/jekyll/update/2023/12/27/4-billion-if-statements.html&size=128)Blabbin’Blabbin’![](https://andreasjhkarlsson.github.io/assets/images/GCPVDa1WYAAoBut.jpg)](https://andreasjhkarlsson.github.io//jekyll/update/2023/12/27/4-billion-if-statements.html?ref=gorillasun.de) ## AI Corner ### DeepMind's Alpha Geometry DeepMind unveils a new model called Alpha Geometry, that is apparently capable of solving Olympiad level geometry problems with ease, while showing all of the reasoning steps involved - which is kind of bonkers: [AlphaGeometry: An Olympiad-level AI system for geometryOur AI system surpasses the state-of-the-art approach for geometry problems, advancing AI reasoning in mathematics![](https://deepmind.google/static/icons/google_deepmind_48dp.5b470587fe7d.svg)Google DeepMindTrieu Trinh and Thang Luong![](https://lh3.googleusercontent.com/tVTh_ZCW5Qozy4vOCpMH06B7Ac_eF7fmEULMMTwDellOh6hnOMUtf28toD68N527IHQTlBWfBCHcZykYPMdrS48yvuEcJKMJG8rU3YRM3u5Ojn3JXnc=w1200-h630-n-nu)](https://deepmind.google/discover/blog/alphageometry-an-olympiad-level-ai-system-for-geometry/?utm%5Fsource=twitter&utm%5Fmedium=social) If you're curious to learn more about the IMO, the International Mathematics Olympiad, you should check out 3Blue1Browns video from a few years back in which he covers a particularly difficult problem, breaking it down for us mere mortals to understand: ### Bill Gates in conversation with Sam Altman I wasn't aware that Bill Gates had a podcast, on a recent episode he invites Sam Altman, avoiding a discussion about the things that went down at OpenAI in the past week, and simply address the tech, talking about ChatGPT and some of the new upcoming things that we can look forward to this year: ## Gorilla Updates ### In Conversation with Daniel Aguilar First article of the year is out, and it's a massive one at that. A couple of weeks ago, towards the end of October of 2023, I had the chance to talk to Daniel Aguilar, interviewing him, and asking him a serious of questions about the projects that he's been involved in over the course of his career, as well as his more recent generative art endeavors: [In Conversation with Daniel AguilarA conversation with Daniel Aguilar, a creative coder, generative artist and freelancing web dev based in Spain. He recounts how he got into creative coding in the early 2000s with Flash, about his long freelancing career, and also lets us in on his current generative art practice. This is his story.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-16-at-20.50.10.png)](https://www.gorillasun.de/blog/in-conversation-with-daniel-aguilar/) It was really insightful to hear from someone that's been freelancing for as long as he has, and I really admire that he was able to make it work out for himself. Here's my favorite moment from our conversation: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-22-at-12.45.56.png) ### Gorilla's Genuary so far... And it's been yet another week full of prompts - here's a quick recap of everything that I've created for Genuary these past couple of days alongside some tidbits of information: 0:00 /0:50 1× Genuary 15 Use a Physics Library | Ended up using the code that I wrote last year for my article on programming Soft Body Physics without much modification - but I've always been meaning to return to it for further optimizations. Maybe at some point throughout the year I will find the time for it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/10000.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/circs.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/shrinkk.png) Genuary 16 - Draw 10000 of Something | I love these kinds of prompts, since they're open-ended and allow you to experiment a bit. I've had this idea for drawing a Delaunay triangulation where the individual triangles are represented as hachures, and it turns out that this effect works pretty well. The alternative version in which the triangles are filled in with circles also works pretty well. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/islamiccccc.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/patternnn.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/islamoccccc-1.jpg) Genuary 17 - Islamic Geometry | Discovered Samira Mian while looking for inspiration on Pinterest, an artist that specializes in Islamic geometry - highly recommend checking her out - the pattern that I recreated was one that stood out to me in particular. I really like how the sketch turned out ultimately, especially the middle one with the dark background is really nice. ![Image](https://pbs.twimg.com/media/GEJqjLQWUAANQgy?format=jpg&name=4096x4096) Genuary 18 - Bauhaus | I've been a huge fan of Gunta Stölzl's textile work for a long time, for the Bauhaus prompt I wanted to make something that captures the essence of that, mainly focusing on recreating the visually compelling patterns. I don't know if I'm close at all. 0:00 /0:30 1× Genuary 19 - Flocking | Although I've experimented extensively with physics simulations, I've never actually looked into flocking behaviors - not properly at least - this genuary prompt was the perfect excuse to finally write the code for it. 0:00 /0:06 1× Genuary 20 - Generative Typography | In the 5th Genuary prompt "Loading Bar" I made little pixelized numbers to indicate the progress of the loader. I liked the idea of representing numbers and letters as tiny matrices - I think this could be very useful for some sort of tiny video game. I will have to experiment more with it in the future. I also really like how they look. 0:00 /0:16 1× Genuary 21 - Use a library that you haven't used before | Never used ml5.js before, and was pleasantly surprised how easy it is to use - threw this little experiment together in a couple of minutes actually. The downside of it however is that the hand/pose detection is quite slow, but maybe I'm not using it optimally. You can find my other creations over on my Twitter or in the previous two Newsletter issues! ## Music for Coding Distant jazz music, thick layers of vinyl noise, and a mysterious image of a rotund rock smoking a cigarette set the scene for a heavily melancholic album - that almost seems eerie at some points - "An Empty Bliss Beyond This World" transports the listener to a distant era long past: The story behind the album is also quite fascinating, the tracks being based on samples of pre-World War II ballroom music, with it's almost broken sounding texture, aims to be a reflection of how people afflicted with Alzheimer remember music that they heard in their youth, and can sometimes remember how they felt: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-18.39.01.png) The top comment over on YoutTube perfectly describes the overall mood of this Album: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-21-at-18.35.48.png) **And that's it from me this week again — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 39Issue #39 — Golan Levin on the Potentiality of Blobs - Wobbly functions by Piter Pasma - RCS interviews Jared Tarbell - Jamie Wong on Color - LittleJS 2 year Anniversary - Age of Empires written in Assembly - Declarative Programming - The Package that broke NPM +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/annibersban6-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-39/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### In Conversation with Daniel Aguilar URL: https://www.gorillasun.de/blog/in-conversation-with-daniel-aguilar/ Last updated: 2024-08-28T13:36:13.000Z **Recently, I had the pleasure of speaking with Daniel Aguilar, a multifaceted professional with a diverse skill set ranging from interface design to back-end programming. Beyond that, he has also established himself as a prolific generative artist, leaving an indelible mark on the generative art scene in recent years.** From working and experimenting with Flash in the early 2000s, Daniel Aguilar made a career for himself as a freelancing web developer and designer, working with numerous companies and clients in and outside of Spain, always pursuing a creative element within the projects that he takes on. Daniel generously shared details about his various professional pursuits, providing a glimpse into the intricacies of freelance work as a programmer. We also talked copiously about the generative artworks that he's released in recent years, the inspirations that brought them to life, the ideas that he aims to express through his artworks, and also talks us through the generative systems that power these artworks behind the scenes. ## Early Career **GS: First off, thanks so much for taking the time to talk to me today. I've been following you for a while now and I'm a huge fan of your work. For the readers, maybe you can tell us a little about how got started with programming? And then later on how you got into generative art.** DA: The first time I actually got to touch a computer, in a way that involved programming of some sort was in my childhood in the mid 80s. My parents had bought a computer, a model MSX, which came with a simple operating system and an instruction manual. The cool thing about the instruction manual was that it taught you a little how to program certain things. I remember spending many afternoons playing with it, coding text based adventures. I also recall that it came with Logo, if you're familiar, basically a program in which you could program turtle graphics. We also did some of that at school. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/431404252_541711927_tcimg_8A8E94DD-1.jpg) The Sony HB-20P | [Link to Instruction Manual](https://archive.org/details/ManualSonyHB20P/page/n3/mode/2up) Fast forwarding a bit, the first time I did some programming that is similar to what I do today was probably around 1999 or 2000, at the time I had all sorts of jobs, tending bars and restaurants. I had a couple of crazy years after I finished school, but after that I had the desire to do something more with my life. At that point in time the internet was just starting to blow up, and was being talked about more and more in newspapers here in Spain. And it was super interesting to me, as I'd always been a huge fan of technology, science fiction and cyberpunk stuff, I thought that all of the computer things were really cool - hacking and stuff you know \[laughs\] Not long after that I enrolled in a government sponsored course, where they taught basic things like HTML and Javascript, as well as a software called Director, published by the same company that later made Flash (Macromedia, which was acquired by Adobe in 2005\. Director and Flash have been discontinued in 2017 and 2020 respectively). I later put all of that in my CV, heavily inflating it, to be able to land a job. That somehow worked out, and I started out as a design assistant at a smaller company where I designed assets for e-learning materials. One of the softwares that they used was Flash - and after seeing that you could create animations and interactive things with it, I thought to myself "Wow, that's so cool!" so I started learning it on my own, at night at home with my 56kb modem \[laughs\]. I discovered that there was a whole scene of people around it that were creating all sorts of cool stuff with it. **GS: That's really interesting, a lot of people actually found their way into the entire creative coding thing through Flash. How did that progress from there? Did you stay with that company for a while?** DA: Yeah I spent a couple of years there, learning a lot both in terms of programming and design, things like web applications and user interfaces. After that I switched between a couple of smaller different companies here in Barcelona. At some point in 2005-2006 I decided that I wanted to try and do it on my own, which led me to legally registering as a freelancer to have my own clients and have my freedom in that manner. That was the idea at least, but once you go solo it turns out to be not as freeing as it sounds \[laughs\] - but I loved it, and still work in that manner today. So I simply sent out emails to everyone that I thought could be interested in the things that I was doing, and ended up building many websites, and also made a lot of weird things with flash which I would show to potential clients, which is actually how I managed to get my first couple of clients. Those first couple of jobs pushed me to learn other things, like connecting databases, back-end programming, server side scripting - basically all of the things that my clients were asking about. At the time I would simply say yes to everything, my general response being "yeah, yeah I can do it" and then going home to try and figure out how things actually worked \[laughs\]. That's what I did for several years, but at some point I then realized that what I actually enjoyed most about this kind of work was the creative part of it - that's when I tried to shift a little bit and take on gigs that had such an aspect to them. At the time I was very active in different forums, and in 2007-2008 I got lucky when someone found my portfolio and reached out to me; a small studio that was just starting out, targeting museums and companies that wanted to present their corporate information in creative ways. That sounded really exciting to me and I was quickly onboard with it. The digital agency was called Bestiario, and [they're actually still active today](https://www.bestiario.org/?ref=gorillasun.de). I worked with them for maybe 4-5 years, still as a freelancer, but under a contract - and again, it was a great opportunity, and I ended up learning a lot about information design, interactivity, and data visualization. One of the people that worked there was Santiago Ortiz, who became one of my best friends and collaborators later on. He studied Mathematics, but was also a very creative person, and we ended up working together on many projects, such as installations for museums and similar kinds of things. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-03.00.03.png)](https://twitter.com/moebio?ref=gorillasun.de) You should check out [Santiago Ortiz on Twitter](https://twitter.com/moebio?ref=gorillasun.de), he's often working on interesting projects ### Mosi Mosi Metaverse DA: After that I got in contact again with some old friends, they were kind of a weird bunch that were really into punk culture. Most of them were designers and had a studio in downtown Barcelona, that mainly made websites for fashion brands to showcase their catalogues and products. So I started doing some projects with them. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/mosi_web_0.png) Mosi Website At some point we discovered this thing called "Second Life" that was being hyped up by newspapers at the time - you know how it goes with the media, inflating things beyond what they actually are. It was essentially a virtual 3D world in which you could create an avatar and build different kinds of spaces - a "Metaverse" of sorts. We thought that the idea sounded really exciting and that it was something that we could pitch to clients. We quickly founded a new company called "Mosi Mosi Metaverse", and somehow managed to convince some bigger brands in Spain to actually engage with us, using our idea for promotional purposes. And that was super fun time - we were just a bunch of punks in a small studio, coming up with all sorts of crazy ideas. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/500753432_fc8df4463f.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/500798551_9a3da09799.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/502397834_1f1564a266.jpg) Second Life actually still exists today - and has more active users than Meta's Metaverse | [Link to Second Life](https://secondlife.com/?ref=gorillasun.de) **GS: Oh that's interesting, Metaverse was actually a part of the company name? Was that a term that people were familiar with at the time?** DA: Yeah, a year earlier I had read a novel called "Snow Crash", I think the term Metaverse was actually coined in it, and that's where we took it from! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-19-at-12.02.27-1-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Snowcrash.jpg) [More info about Snow Crash](https://en.wikipedia.org/wiki/Snow%5FCrash?ref=gorillasun.de) **GS: What about "Mosi Mosi", what does the word stand for?** DA: It's based on a common Japanese greeting when answering the phone - "Moshi Moshi", which basically translates to "Hello, how are you?". That was the name of their existing company, so when we created the new company we just combined the two terms. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-19-at-12.07.32-1.png)](https://blog.busuu.com/moshi-moshi/?ref=gorillasun.de) [More info about the Japanese greeting](https://blog.busuu.com/moshi-moshi/?ref=gorillasun.de) Actually before we pitched the idea to clients we were doing this Metaverse thing for ourselves for fun, doing cross-reality parties (parties that were held simultaneously in the virtual and real world, connected via audio/video streaming and projections), asking some of our DJ friends if they'd like to perform, broadcasting them in the Metaverse, while broadcasting the audience back to them on a projector. And that's how we pitched it to our clients - after cutting out all the non-politically correct stuff of course \[laughs\] - showing them that they could do really cool interactive stuff with it. Example of a Metaverse party **GS: And how long did that go for?** DA: That was for a couple of years, like I said, we were a bunch of punks and not really business people \[laughs\] so after the hype died down it wasn't sustainable anymore. We still occasionally work under that company name, doing some social media campaigns and the like, but after 2-3 years it was over. ### Tips for Freelancing **GS: On a bit of a unrelated note, but out of personal interest seeing that you've had such a long career in freelancing, I'm quite curious what kind of tips you would offer to someone like me and others that are trying to make freelancing work out for them?** DA: I think it's really important to capture and document the things that you do. At the beginning when I just started out, I was only focused on figuring out what I was doing, but wasn't really documenting anything. Having those materials is invaluable though, and are really useful when approaching new clients. For instance, I wish I had documented the projects with Mosi Mosi more; at the time I didn't think that it was anything serious, and thought that it was just play. But thinking back, what we did was actually really meaningful and really unique - I was actually just looking if I had some videos but they're all low quality. Nowadays I try to take some time every now and then to write down what I'm doing or take some screenshots of my projects. Another thing, that you probably already do - but since you asked - when I take on new projects, it's not only always about the money, but I also try to tackle projects that can teach me something, or that put me in a position in which I have to learn something new. I know some other freelancers that say no to projects that seem daunting or intimidating when they require skills that they might not have - obviously if you know nothing about what is required, then you should probably decline, or at least be honest and state that upfront - but in my case I always agreed to everything, because I simply loved to learn new things. I would suggest to do this as well, even if the pay isn't that great, you can always gain other things, like new skills, experience from working with other people, and connections that might bring new work later on down the line, etc. **GS: That's the experience that I've been making lately, documenting things with the articles and the newsletter, it's really important to me to be able to remember what I did, and to some extent keep track of my work and my life in that manner.** **And these interviews are also super important, on the one hand to get to know people and have a nice exchange, but also to provide value to the readers by putting our words into written form.** DA: Yeah I think those interviews are a super good idea, on the one hand it benefits you because you get to meet people that you're interested in, but it also benefits others, like the articles and code that you share so generously, and the weekly update that covers some of the things in the generative art scene - I find it super useful. **GS: I'm happy to hear that from you, often I don't know how valuable these things are but hearing it from you is awesome.** ## Spirals, Maps and Timelines *For context, here Daniel shared his screen and showed me some projects of his, in part works he'd done for clients but also personal projects that he's tackled purely out of his passion for building meaningful and aesthetically pleasing user interfaces - all while putting a lot of love and care into the details.* ### Curriculum Spiral for Ross School ![Project Screenshot](https://uploads-ssl.webflow.com/60d96bdaf23901a94aaae742/60f8489941a88979175aa637_Large%20Unit.jpg) **GS: While preparing for this conversation and looking through the stuff that you've made I came across your non-generative art portfolio, in which you showcase a couple of projects that you've been involved with.** **One of them was this super cool curriculum spiral, that is part visualization, part interface. Could you talk a bit more about that? How did that project come to be? It's a bit of an unusual geometric shape to represent data - I don't think I've seen anything like it before - I'm curious to know why you chose a spiral as the main component of the interface.** DA: That's easy to answer - the decision of it being a spiral came directly from the client \[laughs\]. It was actually a client of my friend Santiago, and they wanted to do something fancy where they already had an idea of how they wanted it to look like. That's why he contacted me to help with its development. They \[Ross School\] have this educational model that's a bit unusual. It isn't a linear progression on the material, where you learn something and then build on top of it - their approach differs in that different concepts circle back around to each other. They also have a very horizontal approach to teaching, where subjects aren't taught in isolation, but rather, in relationship to each other. For instance if you learn something in mathematics, it's also presented in a cultural and historical context as well. It's a bit crazy when compared to normal education systems. The founders of that school came up with an idea to formulate this in a way that made sense, such that a student's knowledge basically evolves and grows, and in that manner has a upward trend, but isn't necessarily linear because you often revisit things that you already know. Geometrically, they thought that a spiral made the most sense to represent their approach. **GS: Did you agree at the time that this was the best way to represent things?** DA: Yeah, I was sold when they presented it to me. It was also a very memorable project because they invited us over to stay roughly two weeks with them to plan out the project. During that process, while sketching out the model, I was convinced that it is actually a great idea. ![Project Screenshot](https://uploads-ssl.webflow.com/60d96bdaf23901a94aaae742/60f8659d9feca10e95d8c397_hand%20sketches.jpeg) Some of the sketches that are showcase on Daniel's portfolio | [Link to portfolio page](https://www.danaguilar.com/work/ross-spiral?ref=gorillasun.de) But it was also challenging, thinking forward to all of the work that I had to do when I got back home \[laughs\]. It needed to be a fancy software interface, as a means for them to show off a little, but that at the same represented things in a way that made sense and was easy to use from their end. **GS: That's really cool. It's a bit funny to me, that so much thought was put into the curriculum, when the school that I went didn't even have a website or anything like that.** DA: Mine neither \[laughs\] **GS: What was implementing all of this like?** DA: The project ran over the course of almost 2-3 years. The beautiful 3D part of it was mainly coded by Santiago, whereas I did most of the other stuff, like the user interface, the database, the back-end interface for them to enter their content, the navigation and all of that. After a year we had the initial version, after which we added in more things that they wanted. ### Interactive 3D Map of Geneva for the UN **GS: What are some of the other projects that you've worked on? I saw that you had quite a few interesting things on your portfolio!** DA: I haven't updated that page in quite a while now, and what's showcased there is maybe 25% of the projects that I've done that I think are worth showing. One that I think is interesting, is the project I did for the United Nations in Geneva - a collaboration with a company here in Barcelona called One Big Robot, a communication and digital design agency - where the goal was to build an interactive 3D map that showcases international organizations, NGOs, and academic institutions throughout Geneva. This project was a bit of a challenge, since it was the first time I used Three.js. It might not be super innovative, nowadays there's many websites that have a map like that, but to me that kind of thing was a first since I had to figure out a lot of things. For instance, the individual buildings on the map are also 3D, so I had to find something on the internet that was useful for this, and then transform it, learn a little bit of cinema4D to handle 3D assets, etc. In retrospect, I always end up investing a lot of time into these small details that aren't the main thing, but I don't care, I really prefer to take every little opportunity to learn new stuff even if that means that my hourly rate drops because I'm taking more time than I need to. ### Warp Records 25th Anniversary Music Timeline Another project that I'm super proud of, was a personal one - are you familiar with Warp Records? They're a record label that have published many big artists, like Aphex Twin and Boards of Canada. [WARPWarp’s artists create groundbreaking music, videos and cinema. Aphex Twin, Boards of Canada, Flying Lotus, Kelela, Nala Sinephro and Yves Tumor are just a few who represent the label. Watch and listen here.![](https://warp.net/favicon.svg)WARP![](https://api.warp.net/assets/325582d5-5b15-4087-8c1e-e46ae2c6dc95?fit=cover&withoutEnlargement=true&format=jpg&width=1200&height=630&quality=75)](https://warp.net/?ref=gorillasun.de) The year I started this project, Warp Records were celebrating their 25th anniversary, and I noticed that their website, in my opinion, was really crappy - it was really difficult to navigate and to find stuff, and I thought to myself that I could do it better. So I went through the source code of the website, found out from where they were loading in the data, built my own web scraper that collected all of the information, structured it in a big JSON file and made my own interface for it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/60fab536712cff2f1685c274_production_battles.jpeg) And there was a lot of stuff to work with. I wanted to make something useful that was easy to navigate and allow the discovery of all of the albums that they had released over the course of 25 years - I had the idea of structuring it as a timeline. I also took it as another excuse to use Three.js. Ultimately I was super happy with the interface that I had built and ended up posting a couple of demo clips to Twitter, which led to someone that worked at Warp Records to notice it and saying something along the lines of "Hey man, what is this? What are you doing?" \[said enthusiastically\]. So it seemed like there was the opportunity to work with them more formally, but ultimately it didn't work out. **GS: They didn't want to have it?** DA: The conversation just fell off at some point, and it seemed like they weren't really into it for some reason. But that wasn't the initial goal anyway, I just did it for myself and wanted a project that I could play with. ## Getting into Generative Art ### Genuary 2022 and NFTs **GS: How did you get from that kind of work later into generative art? When did that start and what's the story there?** DA: Well, the honest answer would be that it was the other way around, the creative coding that I did early on with Flash was what put on this path, evolving into a more professional career. If we're talking about the current work that I do, I got much more serious about generative art and my entire artistic practice roughly 3 years ago, mid 2021\. I was becoming a little tired of the client works; making websites and forms and all of that kind of stuff is okay, it pays the bills, but it's not really what I love. Just by chance I found out about what was going on in the genart space - out of curiosity I wanted to check in with the people that I was following back in the Flash days, to see what they were up to today, like Joshua Davis and Flight404\. I found out that they were still at it doing cool stuff, and that there were thousands of others now that were doing that kind of thing as well. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-02.53.36.png)](https://twitter.com/protozoo/status/1482323651663904768?ref=gorillasun.de) [Link to Tweet](https://twitter.com/protozoo/status/1482323651663904768?ref=gorillasun.de) That was November or December 2021, and shortly after that I found out about Genuary and thought to myself "man this is so cool" and it was essentially the perfect excuse for me to get back into it, even if I just coded one of the prompts. At the same time I was wrapping up a project with a client that I wasn't extremely happy with, thinking to myself that I'd give generative art a shot for a little while, not taking on any new client work, and to invest a couple of months to allow myself to rediscover this passion of mine, while also trying to build a portfolio that I could use to take my career in that direction. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-02.55.25.png)](https://twitter.com/protozoo/status/1480985023427846144?ref=gorillasun.de) [Link to Tweet](https://twitter.com/protozoo/status/1480985023427846144?ref=gorillasun.de) I didn't end up doing too many of the Genuary prompts - maybe like 10 of them - but posting them to Twitter let me get some feedback on my work and I managed to discover and connect with other people through that. I think you were probably one of them, and all of that really energized me. Naturally, after a while I also returned to my regular client work. In the spring of 2022 there was this event called Tezos4Tezos or tez4tez, for which I minted a simple piece on Objkt.com: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/rhythms.png)](https://objkt.com/tokens/versum%5Fitems/23075?ref=gorillasun.de) "Rhythms" created for the tez4tez event in 2022 | [Link to Token](https://objkt.com/tokens/versum%5Fitems/23075?ref=gorillasun.de) That day I was actually on the beach with my partner, suddenly getting notifications that one after the other had sold, until it had quickly minted out. I was so excited and told my partner "Look! I sold out!". She asked if I was rich now, to which I replied "Well, not really" - I had sold the editions for 1 tezos, but that didn't matter, I was just happy that there were people interested in my work. After asking on Twitter if it would make sense to turn that piece into a generative token people quickly told me "of course, just tune the code for fxhash". And this became my first serious fxhash project: Rhythms. It ended up doing really well. I had published a project prior to that, just as a test to learn how the platform worked, but I think I only sold like 5 or so. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-16-at-20.16.53.png)](https://www.fxhash.xyz/generative/13311?ref=gorillasun.de) [Link to Project](https://www.fxhash.xyz/generative/13311?ref=gorillasun.de) **GS: What's the timeline here, did you discover fxhash before or after Genuary?** DA: It was probably at the same time. I had been looking into crypto and NFTs prior to that, and had actually also traded a little bit before that, but the apes and cryptopunks never really caught my attention, they were just PFP projects to me. Things changed with fxhash however, discovering that there was a lot more to it with generative tokens. So it was all in parallel somehow. ### The Value of Digital Tokens **GS: With where we're currently at, it's not possible to separate the two terms "Generative Art" and NFTs anymore - many generative artists are making money from selling their artworks as NFTs, and many of the most interesting projects are created with that in mind. What are your thoughts on that?** DA: I've noticed that there's criticism towards this issue, which I understand, because there's always a risk involved when you attach a monetary value to things, this risk of corrupting. Because money corrupts I guess. But at the same time, economic value is a super powerful driving force, and everyone needs to pay the bills. So I understand the criticism, but being able to monetize the thing that you love doing is just gold. At the same time, many other artistic fields have been doing that for a long time, and no one bats an eye to that. In music and cinema, they do talk about the technical aspects of it, but they also talk a lot about the industry and how it's going, who the big players are, new technologies etc. why is it so broadly accepted in those fields, but in digital art, where we now have this new technology called NFTs, it's constantly being questioned when it's created an entirely new industry around it. I was actually talking about that with a friend recently, he told me "man I don't understand, so you basically sell digital images to people, that they could simply just download. What's the point?" I told him "Open another bottle of wine, let's talk about this". If you take streaming services for instance, like Spotify or Netflix, why do we pay for these services? You can get all of that content for free by pirating it, but a lot of people don't do it, why? Of course, because it's not ethical, but the other big reason is convenience, if someone creates a service that I can pay for, a reasonable amount, to get all of this cultural content that I have a human right to, I will happily pay - why should digital art be different? I think it's difficult for some to understand. **GS: I think a big factor in it is ownership, the fact that you can sell digital tokens plays a big part in it. Nobody is going to buy a PNG from you. Besides that, the entire concept is very innovative, platforms like Fxhash which enables artists to distribute and monetize their art in a unique manner is actually allowing them to do spend more time on it that ever before.** DA: It's something very irrational, and I admit it, this feeling of knowing that you *own* something - even if that thing that you own is something very abstract, a few bytes somewhere on some decentralized ledger. The fact that I found something that I like, that I valued, and that I made an action that testifies that I contributed to it, that is value in of itself for me. It's kind of like collecting stones at the beach - why would you do that? There's thousands of them! - yeah but that one caught my eye, and now it's sitting here on my table and I will always remember the moment that I got it. I feel like that with NFTs. Another super important part of this technology, is the ability to contribute to someone's work, in a way that isn't just words of praise or felicitation, but actually financially contributing to their work that directly helps them continue their endeavors, with the added benefit that this gets recorded somewhere. I understand that some people would find this totally bonkers, but to me it just makes sense. ### On Monikers, Music, and Creativity **GS: Where does the name Protozoo come from?** DA: It's an old name, it's the moniker that I got when I started out on my freelancing career many years ago. I basically wanted some sort of artist/brand name for what I was doing, and I chose it because it resonated with me, where the 'proto' part stands for something that is becoming - something that is almost becoming something - and zoo standing for an animal, that moves, is alive, and makes things. So in that way it stood out to me at the time, I'm not sure if I would pick it today \[laughs\] but it's the one that I've been using for more than 15 years now and have been using as my domain name and handle throughout different platforms. But yeah, there's no deep meaning to it other than that. **GS: I understands, it's the same for 'Gorilla Sun', it's just a name that I initially picked as an artist name when I wanted to make music. But it grew on me with time.** DA: Yeah I saw that you've made some music from some stuff that you published. In my teenage years I also spent a lot of time with music, especially electronic stuff, composing things with my Soundblaster soundcard and the software that existed back then, like Propellerhead's Reason, Cubase, and Cakewalk. I still do sometimes make some stuff, for many of my fxhash projects I usually make a teaser video with some sound that I make myself. **GS: It took me a long time to get into electronic music. I started playing the guitar when I was like 13 years old, and for the longest time I had the view that music had to be played on an instrument, and that making music with a computer was somehow cheating. But then I heard Tycho for the first time which simply blew me away and I think sometime around then I got Ableton and discovered this entire new world.** DA: \[I had my guitar in the background, Daniel points at his\] I always have it here in the room as well, sometimes I get more serious about it, but it's always been something to relax with whenever I get fed up with coding \[laughs\] it's therapy in a way. **GS: What I've noticed is that a lot of creative coders and programmers are also musicians, I'm not entirely sure if there is a connection there.** DA: I think it makes a lot of sense. Creative people are usually not only interested in one single thing, it's more of a character, being interested in creating things and testing things out, whether it's drawing or painting or doodling. I doodle a lot and try out a lot of handcraft stuff. A few months ago I was experimenting with pinhole photography, you know, with a can and a film, and just brainstorming how I could combine it with coding. I also experimented a little with cyanotypes with some transparent printed sheets of my work. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-03.57.54.png)](https://twitter.com/protozoo/status/1583132697136074752?ref=gorillasun.de) [Link to Tweet](https://twitter.com/protozoo/status/1583132697136074752?ref=gorillasun.de) I have yet to incorporate generative music into my work, but there are some ideas for that already, currently talking to someone for a potential collaboration. **GS: Now that you mention collaborations, you actually did one with Andrew Brereton, your piece 'Hidden Intersections'.** DA: Yeah that one was super fun, especially because it was very informal and impromptu, there wasn't this pressure that comes with bigger projects and we just wanted to get something out rather soon-ish without any big expectations. It was interesting because I usually work by myself, so it was a very nice experience and Andrew having ideas that I wouldn't have had by myself. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-18.59.58.png)](https://www.fxhash.xyz/generative/23188?ref=gorillasun.de) [Link to Project](https://www.fxhash.xyz/generative/23188?ref=gorillasun.de) **GS: Andrew is a really nice guy, he's actually one of the first people I talked to on Twitter, him and Jeff aka ippsketch.** DA: Yeah ippsketch is also one of the first guys I discovered. I actually have one of his tweets printed, the one about imposter syndrome, I can't find it right now... it must've fallen. But it's something along the lines "sometimes I need to remind myself that I don't know what I'm doing" or something like that, and it really resonated with me, because that's was exactly how I feel. I also have a lot of impostor syndrome with my work since I'm self taught - seeing so many smart guys doing all sorts of cool things all the time, reinforces it sometimes. **GS: I think I know which one you're referring to:** [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-03.49.52.png)](https://twitter.com/ippsketch/status/1519312121556881408?ref=gorillasun.de) [Link to Tweet](https://twitter.com/ippsketch/status/1519312121556881408?ref=gorillasun.de) DA: yeah, yeah exactly that one! **GS: I don't think that you missed anything by not going to university, or that others are necessarily 'smarter' because they have a degree, many of the things that I use today I had to learn while struggling through the material on my own. I think you did the same teaching yourself with all of the projects that you've done at this point.** DA: A lot of people tell me this and I think there's some truth to it, I've been able to sustain myself so far, but sometimes I think that I maybe would have a deeper understanding of things if I had studied them properly, I feel like that especially when I'm struggling with some dumb things occasionally, like some basic geometric and trigonometric problems that they teach you in secondary school... ## Long-form Generative Art ### About Effluence [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/prefluence.jpg)](https://objkt.com/tokens/hicetnunc/784519?ref=gorillasun.de) Prefluence - A study piece by Daniel leading up to the release of Effluence | [Link to ](https://objkt.com/tokens/hicetnunc/784519?ref=gorillasun.de)[Token](https://objkt.com/tokens/hicetnunc/784519?ref=gorillasun.de) **GS: Now that you bring up trigonometry, you have that really beautiful piece called Effluence, does it use some form of Trigonometry?** DA: That one is really near and dear to my heart, and yeah, it does involve a little trigonometry. I guess it's explicit through it's description that's up on fxhash what I wanted to express, but it's probably the piece that has a deeper meaning to it and comes from a specific state of mind that I was in when I created it. Technically and aesthetically I'm happy with it, maybe the final collection is a bit lacking in variety, but it captures what I wanted to express really well. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-16-at-20.23.32.png)](https://www.fxhash.xyz/generative/20722?ref=gorillasun.de) [Link to Project](https://www.fxhash.xyz/generative/20722?ref=gorillasun.de) At the time I was regularly meditating and wanted to make something that captured that. Something with a little bit of mystery, and a little bit of menace. The initial outputs looked to me like exploding stars, flowers, mandalas, and also sometimes like eyes looking back at me. And then it felt like it was the universe looking at me, and me looking back at the universe, and I was super excited about the project and thought to myself "wow this is really good" - but then I also told myself that I needed to calm down a little bit \[laughs\] that's usually how it goes. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/efflll.jpg) Effluence preview seed **GS: What I really like about it, and not a lot of works make me feel that way, but when I look at the outputs it seems to me that I'm looking at some very large structure, and there's this feeling of scale.** DA: It's interesting that you bring that up, I haven't gotten that feedback from many people, but I think that's due to the different size of the elements and how they compose a larger whole. There's also this shading effect, that somehow looks like mist or fog, which we usually associate with landscapes, or bigger places. **GS: Is that texture a shader?** DA: No, that's just thousands of transparent lines drawn within a circle that make up that effect, kind of like a cloud. **GS: Does Perlin noise play a part in the composition?** DA: Yeah it does! Essentially the composition is made out of several concentric circles, created by dots positioned on their circumference, then these dots try to connect to other dots on the next circle. Sometimes there are spans on the circumference where those dots aren't drawn which is due to Perlin noise. But even if there is gaps, the dots will still try to connect to other places which kind of creates this organic structure. Perlin noise is also involved in the positioning and sizing of some of these dots. I think introducing 'breaking points' or 'disconnections' in a composition adds interest, because visually the piece lures you in with a pattern and then also breaks it, making the viewer have to think a bit more about what the actual pattern is. **GS: Another cool thing about your works are the introduction screens, what inspired that?** DA: I guess I inherited that trait from my flash days, where it was common to add a loading screen, and very often, flash was actually only used for that purpose, to display something while pages loaded. And I would always include a loader in my projects, so that people had something to watch while they were waiting for things to load. I also think it contributes to the experience, conveying to the viewer that they're not just viewing an image, but are actually entering a new space, preparing them and putting them in the mood for what they're going to see. Basically telling the viewer "Okay, get ready now and forget about everything else for a second". I don't know if that makes sense. **GS: It absolutely does, it definitely has that effect. It builds up anticipation towards seeing the piece instead of having it immediately shown. And obviously the intro screen itself is beautiful, with the font and being able to see the piece in the background through the font.** DA: Another reason that I do it is because I just like it \[laughs\] similarly to the teaser videos, I like to fantasize that I'm creating some sort of brand image for each one of my projects. **GS: Personally I really like it. It makes it look more polished and complete in a way. But on the other hand, some people might feel differently, because maybe they want their token to be 'pure' without any additional stuff. I noticed that when you add a lot of extra stuff, like key presses and interactions some people might not be into that.** DA: Well, first, it's a free world \[laughs\] so you can do what you want, and secondly I think there's room for everything and I like to experiment a lot, with Obliqua for instance that was the first piece in which I used params, and I thought it was such a cool concept that people could participate in a meaningful way to help create the artwork and shape the final collection. But then I also understand the other perspective, maybe I'm a little lazy in that way, because it does take some effort to create a beautiful individual output and when there's a lot of things to modify you have to kind of mentally keep track what the different sliders and toggles do. And maybe that should be on the artist to decide how that works. When fxhash announced the code driven params I was very excited, I considered using it for my newest project, building a custom and artistic UI, but I think I won't do that ultimately because it would also introduce many more points of failure where you could mess up. But basically what I'm trying to say is that we have all of these option now to create custom art experiences with this medium. 0:00 /0:32 1× [Link to Twitter Thread](https://twitter.com/protozoo/status/1724041850539954292?ref=gorillasun.de) ### About Obliqua **GS: Let's talk a bit about Obliqua, is it inspired by Jared Tarbell's substrate algorithm?** DA: I've gotten a couple of people asking me the same thing. I've been a big fan of Jared Tarbell for a long time, and substrate is just an iconic artwork, so maybe it somehow influenced me, but it wasn't a direct influence while working on Obliqua. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-16-at-20.40.40.png)](https://www.fxhash.xyz/generative/26424?ref=gorillasun.de) [Link to Project](https://www.fxhash.xyz/generative/26424?ref=gorillasun.de) The main inspiration was actually a painter, Derek Lerner, he makes these huge paintings, 3-4 meters wide, and I found them super interesting for the way in which he combines elements. I discovered him while I was working on my own framework, putting together all of the functions that I was frequently using for quickly creating different kinds of layouts and patterns, while testing it and looking for some patterns to recreate I discovered his work. [![https://s3.amazonaws.com/roberthenrycontemporary/artworks/1572/images/large/AVEX04-detail-1200px.jpg?1509242754](https://s3.amazonaws.com/roberthenrycontemporary/artworks/1572/images/large/AVEX04-detail-1200px.jpg?1509242754)](https://www.roberthenrycontemporary.com/artists/derek-lerner/artwork/avex4-2?ref=gorillasun.de) [More info about this piece](https://www.roberthenrycontemporary.com/artists/derek-lerner/artwork/avex4-2?ref=gorillasun.de) Lots of his stuff are reminiscent of aerial and urban maps, and I found them super inspiring. I remember one evening deciding after dinner that I'd try and recreate the patterns that occur throughout some of his work, thinking to myself that I could do it before heading to bed... but it ended up being super challenging. But that hooked me and I kept pursuing it, and I ended up with something that didn't look similar but was still interesting in of itself. I don't know how the original substrate algorithm works, but I was experimenting with specific angles, and one particular configuration with 30 and 60 degree angles ended up looking very isometric, or at least added an isometric perspective, which was ultimately the reason why I called it Obliqua. Then the gradients and patterns came into play, in particular these half tone dots. You can also see that the main structure is repeated, occurring in the background, which makes it seem like it's some sort of transparent paper sheet, adding depth and creating a sort of conceptual rhythm. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Obliqua__ooUHrEFkvCnCoHZniANS9WTWgnfUqk67VKzTi5u3b8pqvx8ZkJy__x1.jpg) Obliqua #24 - in the collection of yours truly There were other reasons why I ended up calling it Obliqua, which came a posteriori - btw here, I think it's totally fine to create theories about your own work after it is created - the idea of "Mirada Oblicua", or "oblique gaze", as understood relative to José Saramgo's work: > The oblique gaze is the one that is crossed by error, doubt and suspicion, it is the one that questions what is being looked at or the one that makes one think about the possibility of another response to what is established, thinking that there are no definitive truths. **GS: I like the patterns in the background, they really do convey depth. I think that transparency is quite underused in generative art but can be very powerful.** DA: Sometimes transparent shapes in the background can look like reflections, or even erased images of previous iterations of the structure that were drawn onto the sheet and then discarded to be replaced by the current artwork, somehow presenting a pencil like quality. I really liked that idea and wanted to lean into it more, because that reinforced this concept of sketching and conveying an iterative process. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Cathy-Valentine-Workshop-Day-2_.jpg)](https://katiecgutierrez.wordpress.com/?ref=gorillasun.de) Daniel mentioned another inspiration for Obliqua, an artwork by Cathie Gutierrez | [More Info](https://katiecgutierrez.wordpress.com/?ref=gorillasun.de) It probably sounds like I'm making these things up as I'm going, but that's how my artistic process works, I make things up as I'm working on these projects and experimenting with ideas - it's part of the magic of doing this work. When developing ideas sometimes things don't really pan out as you had envisioned them, but you discover little treasures and jewels along the way that trigger other things, and then seeing if they compliment each other or not. Sometimes I have to remove things because they just don't make sense or don't add value to the piece, but sometimes they can also only need a little modification to fall into the place. That's the fun part of this work. **GS: I think that you're touching on something really important here, you don't want elements in the artwork to just be aesthetically pleasing, but you also want them to fit in conceptually and contribute to the bigger picture. Sometimes you have to remove things if they don't fit.** DA: I think, creating things just because they're beautiful or visually interesting is justification enough, I don't think you need more justification than that. That's value in itself. But of course, you can go a little deeper and try to make things express something more - often you don't even need to try too hard to do that when you're inspired by other things. That's what makes art unique, each one of us has a different life, has different inputs that manifest themselves through your art. ### About Sendas *Sendas is the working title of an unpublished project of Daniel.* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-13.32.18.jpg) **GS: Is this also how you're going about your newest project? I've been seeing that it's gone through a lot of different stages, all beautiful, but quite different.** DA: I still don't know how I'm going to release this one, and I'm not sure if you can call it progress what I'm doing right now - I'm still just exploring and I might very well release the initial version. Or release it as a series of projects. I think it's a common problem that generative artists have, where the output space needs to be cropped, trimmed and constrained such that the generated artworks are coherent, instead of unleashing the complete generative potential of such a system. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-13.32.34.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-13.33.22.jpg) A crazy way to do it would be to combine several projects in one and then releasing that, maybe building in a way that incentivizes collectors to maximize the variety of the final collection - I really would love to not have to leave out some of the things that I made, I think that some of those outputs are cool in their own way. **GS: I often think about doing series as well, when I end up with variations of a project, that are fairly similar but still distinct enough to be their own releases - you know, like Aleksandra Jovanić did with** [**Chromatlas**](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de). DA: Since I started taking my artistic practice more seriously, I've been reading quite a lot of resources that sort of teach you "how to go about being an artist", one of the things that always pops up is to "have your own voice" and "develop your own style" so that people can recognize you and your work. And I understand that, but I struggle with it - if I had to describe what drives me to make art, it would be the exact opposite of that. I find joy in exploring new things, and enjoying the feeling of awe when you discover a new things. If I had to drop that to be an artist, it would feel like cutting off an arm. So I'm always thinking about how to articulate this, so that I can keep on doing very different things, but at the same time still have some connection between my works. The starting point for this project, were Truchet tiles, which I hadn't experimented with before. I started out with square tiles, but they quickly felt very limiting so I decided on using a hexagonal tiling, which added another layer of difficulty since I had never used them before. It took me maybe a week to figure out how to figure things out and how to structure the hexagonal grid for what I had in mind. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-13.01.45.png)](https://www.redblobgames.com/grids/hexagons/?ref=gorillasun.de) If you want to implement your own hexagonal grids you should check out Red Blob Games' resource on the topic that explains these structures in detail | [Link to Tutorial](https://www.redblobgames.com/grids/hexagons/?ref=gorillasun.de) Once I had implemented that I started experimenting and adding in more rules, for instance disabling specific cells that couldn't be traversed and I felt like there was something there already - it creates this negative space and breaks up the grid a bit: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-13.33.09.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-17-at-13.33.22-1.jpg) **GS: I like the interplay between the structured parts and the negative space, it feels a bit incomplete, but in a deliberate manner.** DA: It's interesting that you mention because that's actually something that I sometimes introduce in my pieces, without actively trying for it, which is this idea of the unseen, or unrevealed, which kind of conceptually matches and mirrors what we do in generative art, where output spaces are potentially infinite and you there will always be unseen iterations. It's similar in Obliqua, the faded transparent patterns in the background are a hint towards that, hinting at the idea that there's more. **GS: I'm curious about how the path-finding logic works - it's not just Truchet tiles anymore, but the bands actually move from one cell to the other, right?** DA: It's very simple actually, you just start at a specific hexagon, then look around and find another active adjacent hexagon to move to at random, repeating this process. I actually built a version where this path is encoded as a string, which would let collectors create their own patterns by writing out their own traversal strings. Kind of like turtle graphics in Logo. Talking about it now makes me really excited, but this kind of idea can quickly expand into all sorts of problems, and would open the gates for lots of bugs and points of failure. So it's probably not going to happen. ### About Tetra *I had this conversation with Daniel prior to Tetra's release on Alba on the 19th of December 2023\. It's quickly become one of Daniel's smash hits.* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-13.31.39.png) DA: Tetra is actually based on a very simple idea - and the name gives it away already - it's entirely based on squares. When you zoom in on one particular output you'll notice that it's all squares, but they're just a little bit deformed. Tetra started as a question: as a digital artist, what is the simplest element that we can play with? Obviously, the most elemental thing that we interact with on a daily basis are the pixels on our screens - it's kind of the atom that makes up our displays. What properties does it have? A coordinate, a color, as well as a dimension - it still needs to somehow physically exist. I wanted to challenge myself and create something interesting just by using that idea. So I started layering these squares, and obviously I ended up with what looked like a quadtree. To make it more interesting I started slightly varying the position of the vertices of these squares, to allow for a little movement, and then suddenly I had created a really interesting texture that way. And I found it really fascinating - sometimes I'm intentionally trying to produce a certain texture but here it just happened, and I love how you can sometimes make out a landscape or other kinds of objects within the textures. **GS: I really love the emergent texture in these, or the illusion of a texture at least. To me they resemble flocks of birds in some way, it's really beautiful.** ## Inspirations and Shoutouts **GS: To wrap up, who are some of the people that inspire you and that you look up to?** DA: That's a difficult question, because obviously there's so many people in the space that are doing cool stuff. There's the OGs like Joshua Davis, Paul Prudence, and Robert Hodgins... actually, a couple of weeks ago, I noticed that Joshua Davis collected one of the first Obliqua's so I sent him a message to thank him, and I had never talked to him beforem telling him that I've been a fan ever since I saw him in Barcelona on stage giving a talk 20 years ago. I freaked out when he replied saying that he'd actually been waiting for Obliqua, and sent a screenshot that he had a dedicated shortcut with the url to the project, and man, I was like "I'm printing this on a t-shirt" \[laughs\] But if I just mention the big names that everyone already knows, I don't think that there's much value to that. I looked through my timeline and there are a couple of people that I'm following and that I think are doing interesting stuff but maybe don't get the recognition that they deserve. They're not all generative artists. For instance there's purz, he mainly does AI art, but what I find interesting is his creative approach and how he experiments with the different tools. He also always deflects the critique that AI art gets in a very humorous way, and shares insights and educative material on the entire process. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-14.28.35.png)](https://twitter.com/PurzBeats?ref=gorillasun.de) [Purz Website](https://www.purz.xyz/?ref=gorillasun.de) | [Purz on Twitter](https://twitter.com/PurzBeats?ref=gorillasun.de) Another one is Julia Vergazova, I really like her style, it's pretty unique to me, I think she combines a couple of different techniques to create her works: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-14.34.57.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/1bafe14e-6f13-468c-ac10-801b21d384a4-0xd9cdb950a02921776672aafc7caccc373196bb38ee9e46fc71b86a5daaae2690.webp) [Julia Vergazova on Twitter](https://twitter.com/julia%5Fvergazova?ref=gorillasun.de) | [Imprimatura on Alba](https://www.alba.art/projects/imprimatura?ref=gorillasun.de) Someone I just recently discovered is Marta Timmer, and I found her stuff so cool, the aesthetics of her work really resonated with me, so much so that I messaged her asking a little bit about her work and how she does it. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-14.37.22.png)](https://twitter.com/MartaTimmer/status/1709050238831591708?ref=gorillasun.de) [Marta Timmer on Twitter](https://twitter.com/MartaTimmer/status/1709050238831591708?ref=gorillasun.de) And then there's also Gina Choy - I just recently listened to a Twitter space in which she introduced herself, and her approach to painting is in many ways very generative. Apparently she studied at a traditional art school in China, where art making is taught in a very meditative manner, where the process itself is the art, and the artwork being a resulting artifact of this process. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-20-at-14.41.21.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/G_Hooper_INFINITY-2_72dpi.jpg) [Gina Choy on Twitter](https://twitter.com/GinaChoy%5F?ref=gorillasun.de) | [Infinity Series 2018-2023](https://www.ginachoy.com/gallery?ref=gorillasun.de#/infinity-series-2018-2021) I also reached out to her to learn more about her practice. Recently I've been doing that a lot, but it's been a nice way to connect with people, I guess it's similar to what you're doing with these interviews. **GS: I mean it's always nice to get genuine messages from people that are interested in your work. I really appreciate the thoughtful answer, mentioning some new people that are doing interesting work in their own right.** ## Closing Thoughts To wrap things up, I'd like to give a big thanks to Daniel, not just for taking the time to talk to me, but also for sharing his story, his ideas, and putting thought into the questions that I asked him. I found it all very fascinating, and it is always very insightful to get a peek into the brain of another generative artist. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-19-at-11.56.37.png)](https://www.protozoo.xyz/about?ref=gorillasun.de) From Daniel Aguilar's Portfolio | [Link](https://www.protozoo.xyz/about?ref=gorillasun.de) **And yet again, we find ourselves at the end of the article; here's the mandatory call to action - if you've reached and read this far, it most likely is an indicator that you've enjoyed this article - if you did, consider sharing it on your socials, with friends and followers, it helps tremendously and tells the algorithm that this is meaningful content.** **Otherwise consider signing up to the newsletter to receive updates directly in your inbox whenever there's new content. That said, that's it from me - see you in the next one, cheers and happy sketching - Gorilla Sun 🌸** ### Gorilla Newsletter 39 URL: https://www.gorillasun.de/blog/gorilla-newsletter-39/ Last updated: 2024-08-15T08:06:35.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 39th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **Hope you're all having a great start into the week!** That said, let's get straight into it!👇 ## All the Generative Things ### Golan Levin on the Potentiality of Blobs Le Random is back with their very first article of 2024, getting a hold of Golan Levin for an interview in light of his very first ETH release over on Art Blocks titled 'Cytographia' - a project that's been two years in the making. And as always, Monk knocks it out of the park; with his thoughtful questions he provides us with the bigger picture, inquiring about the inspirations behind the generative system, how it came to be, and what it is that Golan wanted to express - we learn that there's a lot more to blobs than just being squiggly digital shapes: [Golan Levin on the Potentiality of BlobsArtist and educator Golan Levin dips between anecdote and insight with Monk Antony (Peter Bauman), covering Levin’s Art Blocks Curated release Cytographia, his drive to unleash the latent capabilities of computers and his role inspiring and promoting open-source art toolkits.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/659da009a13a4b70b20da805_Screenshot%202024-01-09%20at%207.34.44%20PM-min.png)](https://www.lerandom.art/editorial/golan-levin-on-the-potentiality-of-blobs?ref=gorillasun.de) We also featured Golan in [last week's issue](https://www.gorillasun.de/blog/gorilla-newsletter-38/#in-conversation-with-golan-levin). Cytographia occupies an interesting space in the current long-form generative art meta - it places itself in juxtaposition to many other contemporary projects that adhere to a general trend of static canvases that display artful graphics. Cytographia doesn't go down this route, brings animated and interactive elements into the mix, while still leaning into a skeuomorphic aesthetic to emulate the faded look of old science books. In that manner, Cytographia accomplishes something that not many other projects do, threading a fine line between the arguably controversial skeuomorphic aesthetics and the capabilities of the modern digital medium that it is created in, to create little digital organisms that feel very alive. Levin also lets us in on his fascination with blob shapes, and how they essentially are a product of the medium. When processing made it possible to create shapes by means of placing and connecting individual vertices, it greatly extended the capabilities of artists to create completely new shapes and forms that were only achievable with difficulty before. Which leads us to blobs - if you're long enough into creative coding, it's very likely that you'll have attempted the creation of these kinds of shapes at some point - and they're very special and expressive little creatures, since there isn't a single correct way of generating them with code: > Everyone is going to make blobs that are really uniquely theirs, that are going to be, however you're going to make it, because there's no right answer; there's no correct way to do it. There's no single algorithm to make a blob. I could list six different ways of doing it. That’s what drew me to these quirky forms. And I find it infinitely fascinating how the tools, methods and algorithms, that the original Processing made available to code artists out of the box, have had a profound impact on the aesthetic of the artworks created with them - would the generative art of today have a completely different aesthetic if the original versions of Processing included a different set of tools? For instance, would Perlin noise not be as much of an integral part of generative art as it is today if it wasn't made readily available with Processing and P5? On a related note, this also makes me think of modern video games, where we find many that attempt to recreate the aesthetics of the past decades when machines weren't as powerful as today. Objectively these pixelated graphics might not look great, but the familiarity that they evoke has a profound impact on the experience that they leave the player with. In that scenario, the graphics were most definitely a product of the limitations of that era, and nowadays there is absolutely no need for this aesthetic except for stylistic reasons. On the other hand there's many games today that go into the complete opposite direction, trying to look as realistic as possible - when that actually isn't a defining factor in it being a good or bad game. It becomes a question of aesthetics and stylism, and similarly we shouldn't judge artworks based on their aesthetics alone. What I've noticed, is that many of the more negative stances towards skeuomorphism in generative art come from the established artists whose careers span more than a decade or two - maybe this disinclination towards it stems from having had a formative experience with those tools of a previous era of creative coding, and it might just seem strange when a younger generation tries too hard to emulate an aesthetic that isn't nativel digital. But if the medium allows for it, why not? In this manner blob shapes have been a career long endeavour that Levin has pursued and brought to life with Cytographia. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-12-at-17.22.01.png)](https://twitter.com/IOivm/status/1745720974350467420?ref=gorillasun.de) [Link to Tweet](https://twitter.com/IOivm/status/1745720974350467420?ref=gorillasun.de) If you're interested in creating your own blobs, here's something I wrote on the topic - fittingly for today's genuary prompt 'Using a physics engine', you might want to have a look at this tutorial of mine where I've written about programming soft body physics, one of the many methods to make little interactive blobby shapes: [Programming Soft Body Physics and BlobsOne approach to modeling deformable objects in computer graphics are spring-mass systems: a technique that allows us to bring Soft Body physics to life. Picking up from the particle mesh that we created last time; in this post we’ll tackle different configurations for blob-like shapes.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/thegreattraversal-3-.jpg)](https://www.gorillasun.de/blog/soft-body-physics-and-blobs/) If you're interested in creating your own blobs - here's something I wrote in 2023 on the topic. In other news from LeRandom, just two days ago I received this gift from them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/WhatsApp-Image-2024-01-14-at-20.58.38.jpeg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/WhatsApp-Image-2024-01-14-at-20.50.57.jpeg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/WhatsApp-Image-2024-01-14-at-20.51.11.jpeg) Thanks a million for the generous gifts, it made my week, and I might just have to start my print business now with those beautiful paperweights - been putting it off for far too long. And as always, kudos to Monk, for the stellar article and for putting these slices of generative art history into written form. ### Wobbly Functions by Piter Pasma While we're on the topic of blobby and wobbly shapes, Piter Pasma re-published on of his previously unfinished articles on the topic for the 13th Genuary prompt *Wobbly functions*: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-12.16.29.png)](https://twitter.com/piterpasma/status/1745956336045580314?ref=gorillasun.de) [Link to Tweet](https://twitter.com/piterpasma/status/1745956336045580314?ref=gorillasun.de) [How to make sinusoid wobbly functions – Piter Pasma’s Pages](https://piterpasma.nl/articles/wobbly?ref=gorillasun.de) The article features several interactive examples showcasing some of the methods with which sine waves can be combined to create all sorts of interesting wobbly functions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-12.17.16.png)](https://piterpasma.nl/articles/wobbly?ref=gorillasun.de) [Link to Article](https://piterpasma.nl/articles/wobbly?ref=gorillasun.de) If you find this interesting you should also look into domain warping, a method which combines different noise and displacement functions to create interesting effects - here's an interactive primer by Mathias Isaksen: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-13.09.27.png)](https://st4yho.me/domain-warping-an-interactive-introduction/?ref=gorillasun.de) [Link to article](https://st4yho.me/domain-warping-an-interactive-introduction/?ref=gorillasun.de) ### RCS interview with Jared Tarbell Besides Golan Levin, another very influential figure in generative art is Jared Tarbell, having worked with the earliest versions of Processing and created many an iconic artwork that still inspire today. Just a couple of days ago, Right Click Save released an interview with him, giving us insights into his newest artwork created for the Kate Vass Gallery, as well as some reflections on the early days of creative coding: [The Interview | Jared S. TarbellThe iconic creator shares how generative art can unite computation and spirituality with Kate Vass and Alex Estorick![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Jared S. TarbellZsofi Valyi-Nagy![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/65a02048554f744709402076_circleInversion_index.png)](https://www.rightclicksave.com/article/the-interview-jared-s-tarbell-generative-art-etsy?ref=gorillasun.de) There's so many interesting points throughout, that I found it difficult to pick one to give commentary on - I found it really interesting when he addressed the question why his works are primarily in black and white rather than using colors; he explains that is to put emphasis on the emergent structure of his generative systems: > I stick to black and white because I’m most interested in the structure and less the vibrancy or artistic quality of the piece. I want to expose the structure. Whenever possible, I try to reduce it to the heart of the phenomena that I’m exploring. There's actually quite a few artists that have dedicated themselves to only working in black and white, such as Etienne Jacob, Julien Gachadoat, and loackme for instance. All of them create highly geometric works. In my own generative art, I like to think about generative compositions in two parts: structure and texture. I always start with the structure, such that one part of the algorithm focuses on constructing an interesting layout which is then used as a scaffold to fill in textures and colors. Sometimes the structure can imply and guide the texture and vice versa, so naturally the two aren't always completely separable. [A good example for this is Daniel Aguilar's recent project Tetra](https://www.alba.art/projects/tetra?ref=gorillasun.de). Assessing the interplay between the two has been a meaningful way for me to evaluate if my project is doing something interesting. I tend to struggle with texture and color, because it's more than often very subjectively perceived by different individuals. If you enjoyed this interview with Jared Tarbell, you should definitely also check out Artnome's interview released in 2020: [Interview With Generative Artist Jared Tarbell — ArtnomeAt its best, art is transcendent and sublime. However, few artists can regularly create works that evoke feelings of awe and wonder on that level in its viewers. Even fewer artists have managed to do this by writing code on a computer, a tool which many consider to be at odds with natural beauty, an![](https://images.squarespace-cdn.com/content/v1/59413d96e6f2e1c6837c7ecd/1499608745349-XAAWNTJWTFUP9Q4N1OSG/favicon.ico?format=100w)ArtnomeJason Bailey![](http://static1.squarespace.com/static/59413d96e6f2e1c6837c7ecd/t/5f42c2e285783706be3763ce/1598211592345/12647ec4427e16c13b1a19fda327b7f2.jpg?format=1500w)](https://www.artnome.com/news/2020/8/24/interview-with-generative-artist-jared-tarbell?ref=gorillasun.de) I also recently discovered that RCS have their own podcast - highly recommend listening in to this episode where Danielle King talks to many of the people currently involved in the generative AI scene: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-12.38.34.png)](https://open.spotify.com/episode/0XNxk4oeT3y1823DhKgWSA?si=d89b5d30fccc43e5&nd=1&dlsi=3abb8410f2134017&ref=gorillasun.de) [Link to Episode](https://open.spotify.com/episode/0XNxk4oeT3y1823DhKgWSA?si=d89b5d30fccc43e5&nd=1&dlsi=3abb8410f2134017&ref=gorillasun.de) ### LittleJS 2 year Anniversary Frank Force is a force of nature when it comes to creative coding and game dev things - I've already featured him a couple of times on the newsletter - in issue [#23](https://www.gorillasun.de/blog/gorilla-newsletter-23/) for his cool generative pottery project on fxhash and in issue [#25](https://www.gorillasun.de/blog/gorilla-newsletter-25/#tinycode) for a size coding talk that he gave at the JS game development summit. This week we're celebrating the 2 year anniversary of a lightweight HTML5 game engine that he's built and actively developing: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-14-at-22.19.50.png) Javascript gets a lot of bad rep for being on the spectrum as one of the slower programming language, but I actually think that it's a wonderfully expressive language that's suitable for building all sorts of things - especially for video games. Building them directly for the browsers makes it super easy to share them with others, which is ultimately the entire point of games. If you're comfortable with Javascript and want to build your own little game, LittleJS might be a perfect starting point for that, here's a link if you want to check it out for yourself: [GitHub - KilledByAPixel/LittleJS: LittleJS is a lightweight HTML5 game engine with many features and no depenencies. 🚂 Choo-Choo!LittleJS is a lightweight HTML5 game engine with many features and no depenencies. 🚂 Choo-Choo! - GitHub - KilledByAPixel/LittleJS: LittleJS is a lightweight HTML5 game engine with many features an…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubKilledByAPixel![](https://repository-images.githubusercontent.com/409749889/889e9792-98e6-4c15-b54a-b108fe8021d9)](https://github.com/KilledByAPixel/LittleJS?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-01.04.59.png) ### From Hexcodes to Eyeballs by Jamie Wong Have you ever wondered about how we perceive color with our eyes? How displays translate hexcodes into colors? And what color actually is in the physical sense of the word? Jamie Wong provides us with all of the answers in this massive article of his back from 2018: [Color: From Hexcodes to EyeballsIf you’re curious about rainbows, colorimetry, gamma encoding, and experiments run in the late 1920s, then this is the post for you!![](https://jamie-wong.com/favicon.ico)Zero Wind :: Jamie WongLogo Created using Figma![](http://jamie-wong.com/images/color/TriangleSliceRGB.png)](https://jamie-wong.com/post/color/?ref=gorillasun.de) ### Generative Minis 1. [](https://github.com/quinton-ashley/p5play?ref=gorillasun.de)[Video games in P5 with P5Play](https://p5play.org/index.html?ref=gorillasun.de): P5Play is yet another game engine that builds on top of P5 (for the graphics) and enables quick and easy development of video games in the browser. Quinton Ashley the creator of P5Play also documents his work on the library [here](https://github.com/quinton-ashley/p5play/wiki/Developer-Log?ref=gorillasun.de), where he talks about all sorts of different programming challenges. 2. [Ben Moren makes interesting installations, experiments and artworks that lie somewhere at the intersection of creative coding, technology and nature](http://benmoren.com/?ref=gorillasun.de). ## Tech and Code ### Age of Empires, mostly written in Assembly I'm a bit too young for the original Age of Empires (weird flex but okay), but AOE 2 was one of my favorite childhood games. I remember spending many Saturdays in the sandbox mode, building gigantic fortresses and pitting massive armies against each other - I think I spent more time doing that than playing the actual game. And at that point in time I had yet to write my first line of code. I recently came across an interesting article by PC Gamer that recounts an interesting story from the original games that recently emerged, it turns out that the original games were to a big extent written in low-level Assembly code, making the iconic graphics possible: [Age of Empires developer confirms the game is mostly written in low-level Assembly code because ‘we could scroll the screen and fill it with sprites as fast or faster’ than competitors like Starcraft ‘even though we had twice as many pixels’“I guess I can clarify this, since I wrote all the assembly code used in Age of Empires and Age of Kings.”![](https://vanilla.futurecdn.net/pcgamer/856356/apple-touch-icon.png)PC GamerRich Stanton![](https://cdn.mos.cms.futurecdn.net/uZx8cT9BhSpYB5iWfMGabG-1200-80.jpg)](https://www.pcgamer.com/age-of-empires-developer-confirms-the-game-is-mostly-written-in-low-level-assembly-code-because-we-could-scroll-the-screen-and-fill-it-with-sprites-as-fast-or-faster-than-competitors-like-starcraft-even-though-we-had-twice-as-many-pixels/?ref=gorillasun.de) PC Gamer needs to chill with their headlines This came to light in a recent reddit post that blew up after one of the original AOE devs left a reply, elaborating the claim and providing a detailed answer on the matter - here's the post: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-00.29.18.png) [Link to reddit post](https://www.reddit.com/r/aoe2/comments/18ysttu/aoe%5Fis%5Fwritten%5Fin%5Fassembly%5Fis%5Fthis%5Factually%5Ftrue%5Fo/?ref=gorillasun.de) And here's Matt Pritchard, one of the founding members of Ensemble Studios, who was in charge of graphics and optimisation on the early games. He chimes in: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-00.31.11.png)](https://www.reddit.com/r/aoe2/comments/18ysttu/comment/kgltqrg/?utm%5Fsource=share&utm%5Fmedium=web2x&context=3) [Link to comment](https://www.reddit.com/r/aoe2/comments/18ysttu/comment/kgltqrg/?utm%5Fsource=share&utm%5Fmedium=web2x&context=3) Games from that era really don't get enough credit for the massive feats of programming that they were. ### What's actually Declarative programming? You've probably heard the term "declarative programming" at some point now, but can you actually clearly explain what it entails? For this, we first need to understand what a programming paradigm is. According to wikipedia, programming paradigms *"are a way to classify programming languages based on their features*"*,* which is technically correct, but I think that it's easier to think of programming paradigms as "problem solving methodologies" or even "programming styles". This might sound a bit esoteric, but it's essentially a bunch of commonly agreed on strategies to solve specific programming tasks by leveraging the features of the language that's used. Some languages lend themselves to specific paradigms, because they're designed for that purpose, but then you also have languages that can do a little bit of everything, like Javascript for instance. Two terms that are often thrown around in that context are the "imperative" and "declarative" paradigms, and in recent years we've been gushing a lot about how good and easy declarative programming is, when it's not actually so clear what that actually entails. While "imperative" simply means that we spell out every minute instruction to achieve a certain task, the declarative approach, that is often described as telling the computer "what to do", is not as obvious in comparison. The cool people from UI.dev put together an in-depth article explaining the difference, while providing a good idea what declarative programming is all about: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-04.07.33.png)](https://ui.dev/c/react/imperative-vs-declarative?ref=gorillasun.de) [Link to article](https://ui.dev/c/react/imperative-vs-declarative?ref=gorillasun.de) ### The Package that broke NPM In their bizarre quest (or act of digital mischief) for publishing an everything-package on npm, a package that depends on every other package on npm, high school student uncenter and his collaborators stress tested the limits of github and the node package manager while making quite the news in the process: [The package that broke NPM (accidentally) - uncenter.devHow we made a package that depends on every single NPM package... and broke NPM in the process.![](https://uncenter.dev/apple-touch-icon.png?v=20230717)uncenter.devuncenter![](https://uncenter.dev/1024w.png)](https://uncenter.dev/posts/npm-install-everything?ref=gorillasun.de) Alebti the digital logistics of this endeavour being quite fascinating, github ultimately decided in the aftermath to not allow this, with the main issue of it being that the everything package, being dependent on all other packages, makes it so that these can't be unpublished anymore. Which would not be the case if they weren't dependencies. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-15-at-04.34.51.png) ## AI Corner ### LLMs and Programming in the first days of 2024 I don't know who antirez is, but from what it looks like it seems that they've been around for a while, with their very first piece of writing dating back 4072 days (as of writing this) which is just tad bit more than 11 years. I came across a recent piece of his in which he talks about his experience with LLMs and how they greatly simplify many of the tedious programming tasks today: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-12-at-17.00.40.png)](http://antirez.com/news/140?ref=gorillasun.de) [Link to Article](http://antirez.com/news/140?ref=gorillasun.de) And overall it reflects my own experience, and I'd like to assume that of many programmers that have been programming 'the hard way' prior to the advent of LLMs. LLMs are super powerful but at the same time also really dumb - as antirez states "an idiot who knows everything is a precious ally" which is a really good way to put it, LLMs fail miserably when you ask them to produce something novel or to reason with nuance about certain very niche tasks, but excel when asked about things that are general knowledge. Like doing task X with framework Y, in that setting LLMs can go a long way. Recommend giving the article a read - I'm curious how things will change in the future as these language models become more powerful and nuanced, but as of now I think most programming jobs are still not at danger. ### Attention Mechanism in Transformers In a TwitterX thread deep dive Eduardo Slonski elucidates the Attention mechanism in transformers - the main machine learning component that powers LLMs: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-11-at-17.48.00.png)](https://twitter.com/EduardoSlonski/status/1745130935727894616?ref=gorillasun.de) [Link to thread](https://twitter.com/EduardoSlonski/status/1745130935727894616?ref=gorillasun.de) A transformer is essentially a neural network in of itself with a very specific structure. Transformers were initially introduced in a paper titled "Attention is all you need" by Vaswani et al. in 2017 - and as the title already reveals these innovative part of transformers is an "attention" mechanism, which allows it to weigh the importance of different parts of the input sequence that is fed into it, in contrast to previous types of neural networks that had been used up to that point. In Eduardo's thread he showcases examples and visualizations of how this works and explains some of technicalities behind it. The thread is a bit esoteric without prior knowledge on transformers, I never actually took the time to learn how they work but I guess I should at this point. Definitely bookmarking it for later. ## Gorilla's Genuary so far... It's been yet another week full of genuary prompts, and it's been going surprisingly smooth for me so far. I've been able to get every prompt done in time and am actually very happy with all of my creations. Here's a recap of what I've made this week: 0:00 /1:35 1× Genuary 8 - Chaotic System, similar idea to the previous genuary 'Loading Bar' prompt (see previous newsletter). Here I'm using Prim's maze generating algo to expand the pixelated regions and then doing an additional pass to clear the interiors based on some adjacency rules. It made for some really cool pixelated patterns, will definitely explore this one more at a later point in time. 0:00 /0:12 1× Genuary 9 - ASCII. A simple circular SDF, selecting characters from an array based on a sine wave, where those characters are sorted by brightness in the array. Somehow looks like an eye staring back at me. 0:00 /3:08 1× Genuary 10 - Hexagonal. This one simply borrows the same code from my generative artwork Hex Appeal, that also involves Prim's algorithm and an additional procedure that then traces the contours of the regions. Modified the code to animate how this works. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annibers9.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annibers5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/annialbers.png) Genuary 11 - In the style of Anni Albers. The only static artwork that I made for Genuary so far, and people over on Twitter really enjoyed it. I don't know why but these turned out better than anticipated, it's simply a nested loop that places rectangles in a grid like manner, where some rows occasionally stretch a longer span. Individual rectangles also have the chance to be further subdivided into smaller rectangles. Using Roni's Ten palette, with some additional colors. 0:00 /0:45 1× Genuary 12 - Lava Lamp. A little digital lava lamp powered with a ray-marching algorithm, shoutout to Patt Vira's cool tutorial on how to implement this. I've actually attempted this two years ago, but then never got back to it. 0:00 /0:04 1× Genuary 13 - Wobbly Functions. This one was a lot of fun to make, a classic Gorilla spiral SDF with some additional wobble that modulates the outward traveling bands. I had this one in mind before, but never got around to figuring it out. It ended up being relatively straight forward. 0:00 /0:06 1× Genuary 14 - Less than 1kb Artwork. Wanted to create a cute parametric animation, inspired yet again by some of beesandbombs stuff. As an additional challenge I wanted to do it purely in vanilla JS which ended up not being too difficult. Note to self, need to figure out how to run an animation loop at a specific frame rate, because exporting the gif was a bit of a hassle. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/carbon-1-.png) And here's the code for the above animation. How's your genuary going so far? ## Music for Coding It's been a minute since I've enjoyed an album quite as much as this one - The Ironsides are a trio that make music inspired by Italian cinema, blending sounds from soul and jazz and creating something truly special in the process: **And that's it from me this week, while I'm jamming out to some of these tunes, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 38This week: Damoon Rashidi on Flow Fields - Digital Morphogenesis by Jason Webb - Unit by Samuel Timbo - In Conversation with Golan Levin - Highlight’s Gengine - Amit Patel’s Red Blob Games - Tom Scott’s goodbye +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/chaotic.png)](https://www.gorillasun.de/blog/gorilla-newsletter-38/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 38 URL: https://www.gorillasun.de/blog/gorilla-newsletter-38/ Last updated: 2024-01-25T17:44:49.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined in the past week!** > **This is the 38th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **Hope you've all already had a great start into the new year!** That said, let's get straight into it!👇 ## All the Generative Things ### Damoon Rashidi on Flow Fields Have you ever wondered how the code behind a generative artwork like the highly acclaimed Fidenza works? After exploring the topic for himself, Damoon Rashidi provides us with the answers packaged in the form of a comprehensive article: [What I’ve learned about flow fields so far.Noise values and a tiny bit of math can take you a long way.![](https://damoonrashidi.me/favicon.ico)![](https://damoonrashidi.me/articles/flow-field-methods/example-1.webp?__frsh_c=35d83479d7e5b288d9b64df7753f8a599aa80b3d)](https://damoonrashidi.me/articles/flow-field-methods?ref=gorillasun.de) As the title might've already given away, the secret ingredient are flow fields. After providing a break down and explanation of the involved concepts that allow for the creation of these flow fields, Rashidi proceeds to explain how they can be used as an underlying structure for guiding the squiggly lines as we see them in Fidenza. In a nutshell, flow fields are simply number grids, where these numbers represent small velocity vectors. Tracing the paths that these vectors predicate allows us to visualize certain 'flows' - simply squiggly lines that traverse the grid. These number grids aren't generated at random though, but rather by means of different noise functions that present a certain smoothness, with the consequence that adjacent entries in the vector grid are not too dissimilar and point in a relatively similar direction. Perlin and Simplex noise are often two popular choices for this purpose. Rashidi's article is a great introduction to topic with several interactive examples for you to play with and get a feel for how these noise fields function, also going a step further to elaborate how the colored bands in Tyler Hobbs Fidenza can be achieved. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-13.34.22.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-13.34.32.png) If you've read some of the past articles on here, collision detection and grid lookups might be familiar concepts! Here we also have to point out an article on flow fields written by Tyler Hobbs himself: [Flow Fields — Tyler HobbsFlow fields are incredibly powerful and flexible tools for producing interesting curves. They are one of the main tools I’ve used in my own generative art over the last few years, and I find myself going back to them over and over again. It’s entirely possible that I’ve used them in more programs th![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Tyler HobbsFlow Fields![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/t/5e38ecbb06593343b4ac0017/1580788925885/banner.jpg?format=1500w)](https://tylerxhobbs.com/essays/2020/flow-fields?ref=gorillasun.de) And just a btw here, I came across this article when I noticed that I was getting some newsletter signups over from Hackernews - a quick "Hackernews Gorilla Sun" search led me to Damoon's post under which abetusk had kindly given me a shoutout: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-13.41.22.png) Thanks everyone who's joined over from Hackernews! Thanks abetusk! If you ever come across any cool resource that you think would be a good fit for the newsletter, don't hesitate to shoot me a message on my socials! But anyway, awesome article, hope to see more like it in the future! ### Digital Morphogenesis by Jason Webb I'm not entirely certain if I've shared this resource before, but even if I have, it most definitely deserves another shoutout - it's a massive list of resources on Digital Morphogenesis put together by Jason Webb: [GitHub - jasonwebb/morphogenesis-resources: Resources on the topic of digital morphogenesis (creating form with code). Includes links to major articles, code repos, creative projects, books, software, and more.Resources on the topic of digital morphogenesis (creating form with code). Includes links to major articles, code repos, creative projects, books, software, and more. - GitHub - jasonwebb/morphogen…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubjasonwebb![](https://repository-images.githubusercontent.com/182890512/73af8480-6537-11e9-87f7-5e2d94736a65)](https://github.com/jasonwebb/morphogenesis-resources?ref=gorillasun.de) Digital Morphogenesis refers to the process of generating complex, intricate, and often organic-like forms using algorithms and computational methods. Often the goal is to recreate and simulate physical and chemical processes that occur in nature that produce interesting organic shapes and patterns. A popular example for this is the proliferation of slime mold and it's resulting patterns: [physarum - Sage JensonNEW SITE + PORTFOLIO + NEWSLETTER @ sagejenson.com All images / gifs in this post are from my implentation of a Physarum transport model (described below). This February I spent a bit of time simulating slime mold (Physarum polycephalum).…![](https://favicon.cargocollective.com/598881-1429240292.ico)Sage Jenson![](https://payload.cargocollective.com/1/18/598881/13800048/prt_1551049869_2x.jpg)](https://cargocollective.com/sagejenson/physarum?ref=gorillasun.de) If you've ever wanted to learn about reaction diffusion, differential growth, diffusion limited aggregation, etc. this github repository is your starting point! Here's a differential growth simulation I've made some time ago: 0:00 /0:19 1× ### Unit by Samuel Timbo I've been seeing a few twets by Samuel Timbo float around in which he showcases interesting little interactive machineries that look like state machines at a first glance: 0:00 /0:07 1× [Link to Tweet](https://twitter.com/io%5Fsammt/status/1738186448619139158?ref=gorillasun.de) And that's actually not too far off - Samuel has in fact been developing his own visual programming language that operates on the basis of nodes. You can learn more about *Unit* from it's official github repo: [GitHub - samuelmtimbo/unit: Next Generation Visual Programming SystemNext Generation Visual Programming System. Contribute to samuelmtimbo/unit development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubsamuelmtimbo![](https://repository-images.githubusercontent.com/375391318/b4ed804e-f6cc-4c1c-9a88-4c6c17630033)](https://github.com/samuelmtimbo/unit/?ref=gorillasun.de) > Unit is a General Purpose Visual Programming Language and Environment built with a primary focus on Developer Experience. It is heavily inspired by Live, Data Flow, Reactive, Functional and Object Oriented Programming paradigms. Formally, units are Multi Input Multi Output (MIMO) Finite State Machines (FSM). A program in Unit is represented as a Graph. I find this deeply fascinating, there are already tools that are devised for the visualization of codebases as a connected graphs and or diagrams that clarify how different functions feed into other. In Unit, the code is written by constructing such a connected graph, besides occupying an important position as a transitory tool from visual coding and no-code platforms to actually writing code, I believe it could also be interesting to see what experienced programmers can achieve with it. You can try it out in your browser [here](https://unit.land/?ref=gorillasun.de). ### Generative Minis 1. [Jo Wood's ObservableHQ notebook on Maze Generation](https://observablehq.com/@jwolondon/mazes?collection=@jwolondon/mazes&ref=gorillasun.de): Jo Wood's created a number of cool notebooks that go over implementing maze generating algorithms. If you've tried your hand at generating mazes with code, this is a starting point - a lot of my recent work takes inspiration from these types of algorithms. 2. [Matt Perkins on creating interesting lines with code](https://twitter.com/nudoru/status/1743318022515781767?ref=gorillasun.de): Matt Perkins' another prolific generative artist that stands out from the crowd with his unique style - he recently released two tutorials showing us how to generate interesting lines. 3. [Daniel Velasquez's WEBGL Newsletter](https://offscreencanvas.com/?ref=gorillasun.de): one of the newsletters that I always look forward is from Daniel Velasquez, a creative Web Developer that shares insights and tutorials about WEBGL things. Highly recommend checking it out! ## Genart & Web3 ### In Conversation with Golan Levin With a career of almost 3 decades in creative coding and media art, and having made numerous contributions over the years, Golan Levin has unarguably risen to be one of the most influential figures in the space. Gearing up for his ArtBlocks curated release, Golan tells us about his career as a teacher and creator, and also provides insights into his process and the principles under which he creates work: [Spectrum: In Conversation with Golan Levin on Cytographia | Art BlocksInterview with computational interactive new-media artist Golan Levin. In this conversation, we hear more about his generative artwork, Cytographia, his artistic practice, and his use of the blockchain as an artistic medium.![](https://assets-global.website-files.com/62fe95d11738cfa39c3573b0/634ed02d05e56b505a01497f_favicon.png)Art Blocks![](https://assets-global.website-files.com/62fe95d11738cf95c53573dd/658466431c0141b307cbcfa8_golan_levin_photo_by_tom_cwenar_spectrum.png)](https://www.artblocks.io/info/spectrum/in-conversation-with-golan-levin-on-cytographia?ref=gorillasun.de) Golan explains how interactivity has always been the focal point of his work - more so than the generative aspect of it - with the main goal of provoking "wonder" and "surprise" from the audience that engages with his creations. One prime example that he cites in the interview is his Augmented Hand series from 2014; a real-time interactive software system that transforms and alters the audience's hands in uncanny ways by subtracting or adding fingers to them: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-16.53.56.png)](https://flong.com/archive/projects/augmented-hand-series/index.html?ref=gorillasun.de) [Link to Article](https://flong.com/archive/projects/augmented-hand-series/index.html?ref=gorillasun.de) For his upcoming release Cytographia he relaxes his own rules a little and focuses more on the generative aspect of things. Worth mentioning again, here is Golan's almost two year long Twitter thread in which he's shared each minute step of the making of Cytographia [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-05-at-17.18.51.png)](https://twitter.com/golan/status/1472819559791013891?ref=gorillasun.de) [Link to Thread](https://twitter.com/golan/status/1472819559791013891?ref=gorillasun.de) Not only has Golan impacted the field through his work, but also through the many creatives that he's mentored and taught, such as Zack Lieberamn, Huw Messie, and many others. ### Highlight announces Gengine A few days ago Highlight announced a private beta for a new developer platform called Gengine, that aims at greatly extending artists' capabilities in customizing their generative systems minted on Highlight: [Announcing Gengine™We’re announcing a new generative developer platform today called Gengine™ and opening up private beta to interested artists and developers. If you’re interested in using Gengine, send us an email with details on your project to gm@highlight.xyz.![](https://highlight.mirror.xyz/favicon.ico)![](https://images.mirror-media.xyz/publication-images/58xOpc9nKu3TSwE8zuZ3c.png?height=1080&width=2160)](https://highlight.mirror.xyz/bbkwLrT-Cft7mg0K7sWIpc1S-YobOZmSS-Q44E5OFtg?ref=gorillasun.de) As far as I understand it, Gengine essentially exposes a set of APIs, called *engines*, that artists can make use of to configure how their generative artworks behave once they go live. For instance, the data engine is aimed at streamlining access to blockchain data if devs choose to base aspects of their generative artworks off of it, instead of having to code these manually. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-06-at-00.47.58.png)](https://twitter.com/Highlight%5Fxyz/status/1743319230257189051?ref=gorillasun.de) You can also read more about it in [this thread](https://twitter.com/Highlight%5Fxyz/status/1743319230257189051?ref=gorillasun.de) If you have some interesting ideas that could come to life with Gengine, you can reach out to them through the article. ### Thoughts on Selling Generative Art by Phil Mohun In other news from Highlight, they've invited Phil Mohun from Bright Moments to talk about some of his considerations when it comes to selling generative art on the blockchain. The Twitter space goes live on Tuesday the 9th of January (the day after this issue comes out) - you can listen to it [here](https://twitter.com/Highlight%5Fxyz/status/1743633639668175305?ref=gorillasun.de). This is in light of a recent article that he's written: [Thoughts on Selling Generative ArtHow independent creators can build an audience and make a living with NFTs![](https://highlight.mirror.xyz/favicon.ico)![](https://images.mirror-media.xyz/nft/22ToQ6FCylVkGzrHGDrVY.png)](https://highlight.mirror.xyz/%5FeUKOZ2fS24FbLejgDkvOST%5FYSco1HTIBeLFfus%5F6EQ?ref=gorillasun.de) In the article, Mohun addresses several important factors involved in publishing and selling generative artworks, and with the experience he's acquired from working at Bright Moments, he makes some good very points. Especially when it comes to pricing and supply, which is arguably one of the more challenging calls to make prior to release. Deciding on an appropriate number of editions for an artwork without over or under-pricing, requires you to have a good understanding of your audience as well as the current market - I think I've definitely messed this up on several occasions, especially considering that sold out collections are extremely attractive to collectors on the secondary market and likewise good indicators for future collectors. I recommend bookmarking that page for future reference when you're releasing your next project. ## Red Blob Games by Amit Patel Amit Patel is the mastermind behind the website [Red Blob Games](https://www.redblobgames.com/?ref=gorillasun.de), an incredible resource for game development and creative coding that boasts numerous in depth articles on algorithms and techniques that are frequently used for the purpose of making video games. I genuinely recommend checking out the site and bookmarking it for later - Patel's been working on the website for almost 3 decades now, and there is an absurd of stuff there to learn from: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-21.40.27.png) Some of these tutorials are simply timeless pieces of information - and have most definitely helped me tremendously on several occasions. **Some pieces of information that Amit shares on his site you will simply not find anywhere else on the internet**. For instance, the Hexagonal Grid reference (my favorite) explains some of the methods with which you can arrange and store hexagonal tilings that makes working with them a lot easier. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/asdasdasddsa.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-21.52.53.png) I used an axial coordinate system in my generative artwork Hex Appeal, which I would not have known about if it weren't for the Red Blob Games reference. I also admire Amit for the way in which he creates his work and shares it on the internet. I thoroughly enjoyed the recap that he published at the end of 2023 - one paragraph that resonated deeply with me and found really insightful touches on something that I've experienced as well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-21.47.00.png) [Link to Article](https://simblob.blogspot.com/2023/12/what-i-did-in-2023.html?ref=gorillasun.de#more) I've talked about this in my own recap for 2023, but writing these big articles/tutorials takes a massive amount of time, sometimes months. And when the hard work comes to fruition and people acknowledge these polished pieces you start holding yourself to a certain standard, which is really not a healthy mindset and hampers you from creating new work. Important to point out here, that I'm not comparing myself to Patel - I still have a very long way ahead of me. In one tutorial that I recently found, back from the beginning of 2023, he reveals to us some of the magic that make the interactive demos on his site possible, in particular he focuses on how to create interactive draggable objects which are actually not very straightforward to achieve as there's a lot of things to consider when implementing them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-21.41.19.png) [Link to Tutorial](https://www.redblobgames.com/making-of/draggable/?ref=gorillasun.de) ## Ten years of Tom Scott Last week the Youtube science icon Tom Scott announced that he's going to take a step back from making videos after 10 years of consistent weekly uploads. It's not a *goodbye* goodbye per se, as his other content is still going to resume, but the weekly uploads are going to take a pause for at least a while, as he explains in his official statement on it: It's insane to think that he's uploaded a piece of content every single week for 10 years without missing a beat - the amount of dedication, consistency, and sacrifice that must've taken is unimagineable. I'm only a little over half a year into this weekly newsletter, and I already struggle on some weeks to get things ready on time, sometimes there's just a lot of other things that take precedence - will I still find myself making this newsletter in a couple of years? In 10 years? But in any case, Tom Scott's and his weekly videos will be sorely missed by many. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-07-at-23.15.24.png) [Link to Reddit post](https://www.reddit.com/r/youtube/comments/18w0b41/tom%5Fscott%5Fafter%5Ften%5Fyears%5Fits%5Ftime%5Fto%5Fstop%5Fmaking/?ref=gorillasun.de) ## Tech and Code ### Making Small Games And while we're on the topic of video games, here's another cool article that I found that talks about the importance of building small games: [How To Make Good Small GamesPolly the Frog by…![](https://farawaytimes.blogspot.com/favicon.ico)John Thyer![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFUstM24Tpvij7kXjimxCt39n_B3bnT3vX-Zzy5BF5Rshkxv4-TACtzKiTd6yz6CnLMVvWPgCbhZroKyHvoE2Xqxd3wbYwSkho8GVxkcQhVcgvTH8NzZN90rXB2eel7z_JSrZ5gsmv_yS2gIhxEXX8GJMJW4eyoetYa0sUYAgGUubwreMkX_zb0jv4/w1200-h630-p-k-no-nu/PollyTheFrog.png)](https://farawaytimes.blogspot.com/2023/02/how-to-make-good-small-games.html?ref=gorillasun.de) Building a game is a completely different challenge compared to other kinds of programming, because it involves so many different things besides coding itself - in many ways it can be considered as an artform in of itself. Being an expert programmer naturally helps, but it's not only about that, it's also about crafting an experience, telling a story and expressing something to the player, leaving them with something more once they've played your game. The article argues that it's a worthwhile and meaningful endeavor to build small games and to try out different concepts before throwing yourself into building massively large games - and I strongly believe that's a good piece of advice for any creative endeavor, to try and make many small works, all the time, rather than dedicating the entirety of your time to developing one larger project that might ultimately not make it. Some of the best artists that I look up to do this, so it can't be too far off the mark. The article proceeds to act as sort of a manifesto, describing what makes good small games. I found the enumerated points really interesting, and I think they're actually applicable to other artforms - it's all about what you promises with your art to the audience and how it delivers on these promises. Here's two other interesting pages that discuss the same topic and that I really wanted to include here as well: [Make and release lots of small games before making a big oneThe only piece of eternally relevant gamedev advice.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97916bd-c681-4d4e-b2dc-ca60ce9a83db%2Fapple-touch-icon-180x180.png)Tyler Glaiel's BlogTyler Glaiel![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79a4609f-1d2d-4cf2-9f31-4ba99187849c_144x144.png)](https://blog.tylerglaiel.com/p/make-and-release-lots-of-small-games?ref=gorillasun.de) [Making small games, which is fun in itself · Joys of Small Game Development![](https://abagames.github.io/joys-of-small-game-development-en/gitbook/images/apple-touch-icon-precomposed-152.png)abagames![](https://github.com/abagames/crisp-game-lib-11-games/raw/main/docs/timbertest/screenshot.gif)](https://abagames.github.io/joys-of-small-game-development-en/fun%5Fto%5Fmake%5Fsmall%5Fgames.html?ref=gorillasun.de) That said, I'm noticing more and more parallels between generative art and game development, not only because of similarities in the algorithms and techniques that are used for the two, but also as artforms and mediums of expression - hence I might just start mentioning gamedev related things a bit more in the future. ### The Implied Web Another interesting article from HTMLHell, this time by Halvor William Sanden, about the Implied Web. It's a bit of a heavy article, but it tackles an important issue in modern web design, where pages on the web often rely too heavily on explicit cues to inform users how to interact with interface and navigation elements: [The Implied Web - HTMHellA collection of bad practices in HTML, copied from real websites.![](https://www.htmhell.dev/apple-touch-icon.png)The Implied Web - HTMHell![](https://www.htmhell.dev/images/og/advent23_21.png?s=011221s)](https://www.htmhell.dev/adventcalendar/2023/21?ref=gorillasun.de) That makes me think of my dad, he has somehow acquired the bad habit of double clicking links on the web as if they were folders on his desktop. I pointed out to him that he didn't need to do that, but it's simply ingrained in him that to open something you have to double click it. And I can't blame him for it, because from his perspective it kind of makes sense. I guess this is what the implied web is about, consistency of behaviour, where users know how to navigate and interact with things from acquired past experiences. ## AI Corner ### Gemini's Multimodal Perception When it comes to AI related things, I find that I can't keep up sometimes with all of the developments every week. Recently came across this tweet by Alexanader Chen in which he experiments with a demo put together by Grant Custer that showcases Gemini's multimodal reasoning capabilities. Basically, he feeds doodles into the model and asks it to tell him what the represented concepts are: 0:00 /0:30 1× [Link to Tweet](https://twitter.com/alexanderchen/status/1738356963753308466?ref=gorillasun.de) | [Try it for yourself](https://replit.com/@GrantCuster/gemini-vision-example?ref=gorillasun.de#README.md) ### Wacom Controversy In a recent turn of events, the company Wacom, that mainly builds drawing tablets for artists, decided to use an AI generated image for a promotional banner - which caused a severe backlash from digital artists that I are already not on friendly terms with AI generated imagery: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-08-at-12.54.49.png) [Link to Tweet](https://twitter.com/JoJoesArt/status/1743745530021191812?ref=gorillasun.de) I have nothing against AI generated imagery, when it's done ethically of course, but it simply leaves you scratching your head when you see a company like Wacom, who's main audience is digital artists that create their art by hand, use an AI generated image to promote their product. ## Gorilla's Genuary so far Well, there hasn't really been much from my end and it's been a rather rough start into the year. I've been down and sick with Covid for a third time - not as badly as the first two times - but it's still severely impeded me with everything that I've been wanting to get done over the past week. The worst part of it was the brain fog and the inability to focus on anything at all. I did manage to get the newsletter done however \*pats myself on the back\* and also powered through all of the first 7 Genuary prompts. Here's everything that I made at a quick glance - my personal challenge so far's been that all of my creations gotta be animations: 0:00 /0:10 1× #1 Particles, lots of them - for the first prompt I chose to do something in the style of [pixelfool](https://twitter.com/p1xelfool?ref=gorillasun.de) and ended up with this cute little 3D spiral. 0:00 /0:24 1× #2 No Palettes - Used as an excuse to recreate this iconic sketch by beesandbombs | Link to Original 0:00 /0:08 1× #3 Droste - that one was a bit of a curveball and I was overly ambitious with the prompt, that's also when covid really hit me and I didn't have the energy or desire to continue polishing this. So that's that. 0:00 /0:22 1× #4 Pixels - Initial Idea turned into a giraffe pattern generator. 0:00 /0:08 1× #5 Vera Molnár - the Genuary prompt to honor Vera Molnár was chosen to coincide with her 100th birthday - RIP. 0:00 /0:20 1× #6 Screen Saver 0:00 /0:33 1× #7 Progress bar / indicator / loading animation - this is actually a tiny canvas, with the individual pixels being filled out. The numbers were a bit of a hack. The thing about Genuary is that some of your creations will inevitably end up being crap, but I think that's just a part of it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/8bioeg-1.png) ## Music for Coding I'm only 17 years late to the party, but here's a blast from the past with Bloc Party, yet another find that I came across through the Youtube recommendation algorithm. I thoroughly enjoyed the music video for their track Flux, that pays homage to japanese Kaiju (gigantic monsters) movies: Bloc Party is a British pop-punk band that came together in 1999, and quickly rose to fame over the 2000s with their distinct danceable and uplifting take on the genre in comparison to their contemporaries. They faded a bit over the 2010s with multiple longer bouts of inactivity in which the members focused on their own respective side-projects. Recently they've been making a come back however, with the release of their album Alpha Games in 2022: **And that's it from me this week, while I'm jamming out to some Bloc Party tunes, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 37This week - Procedural Hydrology by Nicholas McDonald - Stolen Buttons by Anatoly Zenkov - Massive Book recommendation thread by Casey Reas - Understanding Abstract Art by LoneWick - Julian Gachadoat’s DiceGL - RevDanCatt’s Plotter Shenanigans - 37C3 +++ lots more!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2024/01/Genuary-27_1-1.png)](https://www.gorillasun.de/blog/gorilla-newsletter-37/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a fantastic week! See you in the next one, cheers - Gorilla Sun 🌸** ### Gorilla Newsletter 37 URL: https://www.gorillasun.de/blog/gorilla-newsletter-37/ Last updated: 2024-01-01T16:05:18.000Z **Welcome back everyone** 👋 **and a heartfelt thank you to all new subscribers that joined along for the ride in the past week!** > **This is the 37th issue of the Gorilla Newsletter -** a weekly online publication that sums up everything noteworthy from the past week in generative art, creative coding, tech and AI - as well as a sprinkle of my own endeavors. **With this issue I'm wishing you all an amazing start into the new year - really can't believe that we're already in 2024!** In case you missed it, last week I published a big recap for all my endeavors in 2023 as well as what's in store for the blog in 2024 👇 [Gorilla Sun 2023Aaaaand — CUT! It’s been yet another eventful year, with much generative art, many an article and so many other projects. Here’s a big recap to wrap up a great year, diving into all of the Gorilla endeavors over the course of the year!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/12/fll.png)](https://www.gorillasun.de/blog/gorilla-sun-2023/) That said, let's kick off 2024 with a mixed bag of generative goodies! 🌸 ## All the Generative Things *The best part about the holiday season is that people have a lot more time to build cool things, we start off with quite a few interesting finds in the genart and creative coding space this time around!* ### Procedural Hydrology by **Nicholas McDonald** A couple of months back I did a deep dive on Nat Sarkissian's Eucalyptus and Sagebrush - a generative artwork that revolves around the creation of stunning stylized landscapes by means of a hydraulic erosion algorithm. That's how I found my way into the interesting world of procedural terrain generation: a huge topic with a lot of research backing it due it's usefulness in several applications, from video games to terrain simulations. Last week, while browsing the r/generative subreddit I came across a post that peaked my interest in that regard, titled *Procedural Hydrology*: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-14.50.33.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-14.51.03.png) [Link to Reddit Post](https://www.reddit.com/r/proceduralgeneration/comments/18kesza/procedural%5Fhydrology%5Fmeandering%5Frivers/?ref=gorillasun.de) [Procedural Hydrology: Improvements and Meandering Rivers in Particle-Based Hydraulic Erosion Simulations – Nick’s Blog![](https://nickmcd.me/favicon.ico)![](https://nickmcd.me/wp-content/uploads/2023/12/banner_2.png)](https://nickmcd.me/2023/12/12/meandering-rivers-in-particle-based-hydraulic-erosion-simulations/?ref=gorillasun.de) Especially since it also mentions the creation of meandering rivers, referring to the natural and organic formations of rivers within a landscape, which is quite a difficult thing to achieve with code - two years ago I've actually looked into it a little, but at the time the task seemed just a little bit over my head so I quickly dropped it again. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-14.53.30.png)](https://en.wikipedia.org/wiki/Meander?ref=gorillasun.de) [Link to Wikipedia Page](https://en.wikipedia.org/wiki/Meander?ref=gorillasun.de) McDonald's project finds its beginnings 3 years ago when he released an open source C++ software for the simulation of particle based hydraulic erosion over on github, as well as an accompanying article that explains what the code does - it now stands as one of the most starred repos in that regard: [GitHub - weigert/SimpleHydrology: Procedural Hydrology / River / Lake SimulationProcedural Hydrology / River / Lake Simulation. Contribute to weigert/SimpleHydrology development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubweigert![](https://repository-images.githubusercontent.com/256092816/36f905bf-2578-46b6-b870-320572a6143a)](https://github.com/weigert/SimpleHydrology?ref=gorillasun.de) [Procedural Hydrology: Dynamic Lake and River Simulation – Nick’s Blog![](https://nickmcd.me/favicon.ico)![](https://nickmcd.me/wp-content/uploads/2020/04/hydrology.png)](https://nickmcd.me/2020/04/15/procedural-hydrology/?ref=gorillasun.de) It's mentioned that the first article isn't necessary, and you can directly dive into the newer version. Algorithmic hydraulic processes essentially try to mimic and simulate the organic erosion processes that occur in nature, where the interaction of water particles with the terrain lead to the formation of ridges and valleys. This is what I covered in my article about Nat Sarkissian's piece: [Nat Sarkissian’s Eucalyptus and SagebrushIn this post we’ll have a closer look at Nat Sarkissian’s generative FxHash token: Eucalyptus and Sagebrush. The token seamlessly bridges between visually stunning graphics and an intricate terrain generation algorithm. Additionally there’s a lot to learn on simulating brush strokes algorithmically![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/eucalyptusandsagebrush-1.jpg)](https://www.gorillasun.de/blog/eucalyptus-and-sagebrush/) These hydraulic erosion algorithms come in many shapes and flavors, depending on how complex you want the simulation to be, as there's many different ways to model the interaction between water particles and the terrain. For instance, my article doesn't account for the pooling of water in valleys and makes the assumption that water evaporates over time, whereas McDonalds approach accounts for that and further extends the concept to achieve the formation of rivers. Highly recommend the article if you want to learn more about it and implement such a system for yourself! ### Ringing Perlin Noise Effect I actually spent more time than I'd like to admit on the r/generative subreddit in the past week. Another post that I came across was asking about an interesting pattern seen on the rim of a bowl made by Greg Blanpied: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-15.20.09-1.png)](https://www.reddit.com/r/generative/comments/18rlbj4/saw%5Fthis%5Fbowl%5Fby%5Fgreg%5Fblanpied%5Fand%5Freally%5Flike/?ref=gorillasun.de) [Link to Reddit Post](https://www.reddit.com/r/generative/comments/18rlbj4/saw%5Fthis%5Fbowl%5Fby%5Fgreg%5Fblanpied%5Fand%5Freally%5Flike/?ref=gorillasun.de) One of the comments elaborated that this ring pattern can be achieved with a simple function that modulates the noise field: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-15.21.29.png) Can't be as easy as that now, can it? Naturally I had to try this for myself and quickly threw together a p5 sketch testing the idea, and... it actually works! Here's what it looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-15.23.57.png) I additionally did a little domain warping (I think that's what it's called) to have alternating brighter and darker rings, which I think looks pretty cool. I actually did something similar a while back, which was much more inefficient than this approach, by manually threshholding the noise values and assigning colors to them if they fall into a certain range - see image on the right: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/294762491_1338209389915941_3675569625174512483_n.jpg)](https://www.instagram.com/p/CgRgIS6qDvQ?ref=gorillasun.de) [Link to Insta post](https://www.instagram.com/p/CgRgIS6qDvQ?ref=gorillasun.de) ### Stolen Buttons And yet another cool project that really stood out this week was Anatoly Zenkov's *Stolen Buttons* \- a tool that snatches stylized buttons from websites that Anatoly visits: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-21.42.47.png) You can check out the entire collection of buttons here: [Stolen ButtonsEvery website I visit, I steal a button from it. Check out my stash!![](https://images.ctfassets.net/7k34737a5krf/1JZCcolnHtNmfBQO9HIUvf/38c5b972fc97b06b68aa233c1553edd8/userpic-trnsprt.png?w=180)Stolen ButtonsAnatoly Zenkov![](https://images.ctfassets.net/7k34737a5krf/4YwinRclOQQw2uiKPSSyy0/87eac751ba25efe6e5c445be43880b26/stolen-buttons-og.png?fm=jpg&w=1200&h=630&fit=fill&q=65)](https://anatolyzenkov.com/stolen-buttons?ref=gorillasun.de) ### Massive Book Thread from Casey Reas If you're still on vacation and hungry for books about creative coding, generative art and computational design, you should definitely checkout this massive thread by Casey Reas, listing some of the most important books throughout the years in that regard: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-21.52.19.png)](https://twitter.com/REAS/status/1473041398962159617?ref=gorillasun.de) [Link to Thread](https://twitter.com/REAS/status/1473041398962159617?ref=gorillasun.de) ### Understanding Abstract Art by LoneWick Another thing that's recently come to my attention were [LoneWick](https://twitter.com/LoneWick%5F?ref=gorillasun.de)'s writings and analyses of abstract and generative art - and I have to say that I've thoroughly enjoyed his perspectives. Especially this post of his in which he elucidates why it isn't actually so difficult to understand abstract art - drawing parallels to music: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-01-at-13.53.35.png) Check out the [Tweet](https://twitter.com/LoneWick%5F/status/1738439648945529231?ref=gorillasun.de) to read the rest of it. You don't need to have studied music theory to "understand" music - just like you don't have to have studied cinematography to appreciate a good movie. The same is true for visual art, architecture, and all areas of design that don't have a temporal aspect to them - just like sounds can be harmonious or dissonant, shapes on a canvas can be as well. I think the big difference here is that music and film are sufficiently powerful emotional vessels that can make you feel things whether you like it or not, whereas with a static artwork, more of an active effort is required for you to understand how it makes you feel. One artwork that immediately comes to mind here is Kazimir Malevich's *Airplane flying*, which at first glance is just a bunch of rectangular shapes on a blank canvas - but the more you absorb the artwork, the more it becomes evident that there is a vibrant harmony between the disposition of the shapes on the canvas, making it appear as if the shapes are in motion and we're capturing a singular slice of time before the shapes disappear into the ether. ![Datei:Suprematist Composition - Airplane Flying (Malevich ...](https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Suprematist_Composition_-_Airplane_Flying_%28Malevich%2C_1915%29.jpg/1200px-Suprematist_Composition_-_Airplane_Flying_%28Malevich%2C_1915%29.jpg) Airplan flying 1915 What I'm trying to say here, is that the visual arts present temporality in a different manner than the artforms where it is an inherent part of the medium. You should check out LoneWick's substack, especially his ongoing series titled Abstract Art Analysis, in which he picks out a select few artworks for each issue, to analyse and evaluate how they draw the observer's eye with their compositions: [Abstract Art Analysis 17: Perspective‘Hintperflections - Edition #11’ by Paolo Curtoni First impression: I explored the outputs of this collection before reading the description. Most of the pieces have a bold burst of color that quickly catch your eye. Something I really appreciate about all of the mints so far (enough to be representative of the full collection) is how every piece is very unique and complete in composition. I wrote a bit more about that in an![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84fe711c-08ad-48bf-b664-8629af9e3a82%2Fapple-touch-icon-180x180.png)Artletter by LoneWickLoneWick![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18984f0a-3cc6-4b93-9d9d-34f5ce57d05a_1080x1080.png)](https://lonewick.substack.com/p/abstract-art-analysis-17-perspective) ### Generative Minis 1. [**In Dynamic Existence by Fractal Kitty**](https://sophiawood.medium.com/in-dynamic-existence-3205a9bc6e07?ref=gorillasun.de): you might already know [Sophia Wood, aka Fractal Kitty](https://twitter.com/fractalkitty?ref=gorillasun.de), as the creator of Mathtober - besides being involved in mathematics, she is also a writer, poet, blogger, creative coder and generative artist, creating works that lie at the intersection of. In dynamic existence is a collection of 15 haikus and generative artworks that compliment each other. It's also worth taking a minute to explore her site, containing many more interesting writings and projects. 2. [**Chris Ried's Newsletter**](https://generative.substack.com/p/noisy-svgs-dynamic-wearables-and): aka Generative Collective, has his own Newsletter on Generative Art and Creative Coding related topics - I enjoyed browsing the list of internet content that he's curated, and is definitely something I'll follow more closely in the future. Go and check it out! 3. [Nahuel Gerth's Thought Sandbox](https://nahuelgerth.de/thoughts?ref=gorillasun.de): as the name suggests it's a space on Nahuel's website to explore ideas, concepts, reflections and brain farts. I enjoyed the couple of musings that he's published over there already. ## Pen & Plottery ### DiceGl by Julien Gachadoat Julien Gachadoat, whom you might already know as a prolific generative artist, specifically for his plotter work, recently shared a video showcasing a super creative way for creating generative art with a plotter - simply by rolling some dice: 0:00 /0:29 1× [Link to Tweet](https://twitter.com/v3ga/status/1734285242809065546?ref=gorillasun.de) I'm not entirely certain how it's done, but my hunch is that it makes use of OpenCV, an open source computer vision library, to detect two red dice against a green background. The number of white dots, revealed by the upward facing side of the die, is then counted to inform the plotter what type of tile should be drawn. What makes this even more special, is that Julien was able to show this to Vera Molnár back in November, collaboratively creating a plotter drawing with her - if you didn't know, Molnár also used dice for her very first computer-less generative systems. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-21.58.32.png)](https://twitter.com/v3ga/status/1741160912982053310?ref=gorillasun.de) [Link to Tweet](https://twitter.com/v3ga/status/1741160912982053310?ref=gorillasun.de) If it interests you, I wrote an article about Vera Molnár's early life here: [The Art of Vera Molnar 1947-1974Vera Molnar is one of the pioneers of what we know today as Generative Art. She was one of the firsts to dare and use computers for the purpose of making art. In this article we have a look at her rich artistic career and how she paved the way for the computer artists of today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/Galerie-La-Ligne-Vera-Molnar-2000x1415.jpg)](https://www.gorillasun.de/blog/the-art-of-vera-molnar/) ### RevDanCatt's Plotter Shenanigans It's long overdue that I mention RevDanCatt in the newsletter - the man truly frightens me with how much stuff he gets done on such a consistent basis 😂 what's more, is that he's also really good at documenting his work in various formats: One recent project of his that I thought was really impressive was a pen plotted landscape based off of AI generated scenery: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-13.33.44.png)](https://www.threads.net/@revdancatt/post/C1b2Y3CNEw1?ref=gorillasun.de) [Link to Thread](https://www.threads.net/@revdancatt/post/C1b2Y3CNEw1?ref=gorillasun.de) \- thread as in a post on the threads app, not a series of posts over on Twitter... X I mean. You get the Idea. He also gives us a rough breakdown of the process that converts the AI generated images into a plottable SVGs: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-13.54.01.png) A quick behind the scenes into the process. Another comment underneath the same post, I found a bit perplexing: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-13.45.37.png) Something made with AI = bad The comment makes it seem like "AI" did the entirety of the work without any creative or physical effort from RevDanCatt's side, when that is simply not the case. At this point I'm just a little tired of these kinds of absolutist stances that condemn work simply because "AI" was involved somewhere in the pipeline. On another note, this also makes me think back to one of my favorite creations of his back from 2021, in which RevDanCatt plotted a whole bunch of bees from the Google Quick Draw dataset - which I think turned out really nicely with the bronze pen on a black sheet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-31-at-13.41.49.png)](https://www.instagram.com/p/CSPz99UtnjA/?ref=gorillasun.de) [Link to Instagram Post](https://www.instagram.com/p/CSPz99UtnjA/?ref=gorillasun.de) That said, if you're into all of these creative plotter shenanigans, you should definitely follow RevDanCatt's social media accounts as well as his own newsletter here: [📙 #026 - Art Studio Management as ArtIn the last newsletter, I promised not to do a year in review; however, today, I was putting together the script for my final “Weeknotes” video of the year. Reviewing all the previous videos pulled together a handful of threads that’d been trying to get my attention for the last couple of months. From those either I’ve had an incredible epiphany, my mind is deep into coping strategies, or maybe both.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbf7afe8-faf2-45f6-a369-638b2d09f43a%2Fapple-touch-icon-180x180.png)The Dan Catt Pen Plotting NewsletterDaniel Catt![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe84e45-c786-41ab-8bbb-eacb473f41ac_1920x1920.jpeg)](https://newsletter.revdancatt.com/p/026-art-studio-management-as-art?ref=gorillasun.de) ### Generative Cross-stitching by Roni Kaufman Cross-stitching meets generative art with Roni's most recent creation, which I really wanted to include here as well: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-01-at-13.42.12.png)](https://twitter.com/KaufmanRoni/status/1741444050064994540?ref=gorillasun.de) [Link to Tweet](https://twitter.com/KaufmanRoni/status/1741444050064994540?ref=gorillasun.de) If you're looking for Genuary 2024 inspirations, you should also follow Roni on his socials to see what he's doing in that regard, where also very generously shares the code to his creations over on Openprocessing: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-01-at-16.19.19.png) [Link to Tweet](https://twitter.com/KaufmanRoni/status/1741838111712133487?ref=gorillasun.de) This year Roni chose to play Genuary on hard-mode! ## 37C3: Chaos Communication Congrees I recently learned about 37C3, the Chaos Communication Congress through a couple of tweets by [Marcel Schwittlick](https://twitter.com/schwittlick%5F?ref=gorillasun.de)'s that linked to some of the interesting talks that were held at the congress. It is an annual four-day conference on technology, society and utopia organised by the Chaos Computer Club (CCC) and addresses a number of interesting contemporary information technology topics. It does so by taking a critical-creative attitude towards technology, examining the effects of technological advances on society. For instance [Joscha Bach](https://twitter.com/Plinz?ref=gorillasun.de) gave a talk titled *Synthetic Sentience*, tackling the prospect of AI gaining conscience from a philosophical point of view: Another really interesting talk was by Robert Seidel titled Image making fatigue: The entire website is a treasure trove of information, for instance there's also a really [cool demoscene recap for 2023](https://media.ccc.de/v/c4.openchaos.2023.11.demoszene-jahresr%C3%BCckblick?ref=gorillasun.de) \- it is unfortunately in German without subtitles. ## Tech and Code ### 6 Days Spent on 1 Line of Code Catching up with the primeagen on youtube, and his explosive manner of reviewing tech articles on stream - you just gotta love that thumbnail as well - this time diving into an article that recounts the story of a singular line of code taking a whopping 6 days to be changed: Read the article here: [It Takes 6 Days to Change 1 Line of Code(A true story.) Philip (President): Our factory is underutilized by 10%. Either we start building more of our backlog or we lay people off. I’d rather keep everyone busy, build inventory, and get…![](https://phthemes.s3.amazonaws.com/1/lpmGCkGbHyh0vsId/images/favicon.ico?v=1575993674)ed weissman— Rom](https://edw519.posthaven.com/it-takes-6-days-to-change-1-line-of-code?ref=gorillasun.de) ### UI Element Design by Aaron Iker If you're looking to take the design of the buttons on your website to the next level, you should check out [Aaron Iker's codepen profile](https://codepen.io/aaroniker/pens/public?ref=gorillasun.de), which is essentially a massive resource for designs of different UI elements: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-01-at-16.12.02.png)](https://codepen.io/aaroniker/pens/public?ref=gorillasun.de) [Link to Aaron Iker's Codepen profile](https://codepen.io/aaroniker/pens/public?ref=gorillasun.de) He also shares CSS tips over on threads: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2024/01/Screenshot-2024-01-01-at-16.08.39.png)](https://www.threads.net/@aaroniker/post/C1SRy9lNlt6?ref=gorillasun.de) [Link to Thread](https://www.threads.net/@aaroniker/post/C1SRy9lNlt6?ref=gorillasun.de) ### The await event horizon in Javascript Charles Lowell draws a beautiful analogy between black holes and the `await` keyword in javascript. `await` is used for the purpose of suspending execution of a function until a Promise resolved. If this Promise is never resolved, the awaiting function will never resume and be stuck in limbo, just like things are trapped in the event horizon of a black hole. The article highlights the implications of this concept, particularly the potential problems and some approaches for mitigating it. For instance, the importance of proper Promise handling and synchronization strategies, as well as the avoidance of unnecessary deep nesting of `await` statements to minimize the risk of crossing this event horizon: [The await event horizon in JavaScriptWhy async functions in JavaScript are insufficient as a Structured Concurrency primitive![](https://frontside.com/icons/icon-192x192.png?v=de93ee3512df754fd0cc381d84527025)![](https://frontside.com/static/f41050ac2ccba19fd9dd0c46f90fc75f/db955/2023-12-11-await-event-horizon.png)](https://frontside.com/blog/2023-12-11-await-event-horizon/?ref=gorillasun.de) ## Gorilla Updates For my very first Genuary creation of 2024 I took inspiration from [p1xelfool](https://twitter.com/p1xelfool?ref=gorillasun.de), whom I've been a big fan of ever since I discovered him in the early HEN days, and attempted a retro-esque pixelated 3D animation: 0:00 /0:10 1× I've always wondered how he achieved those pixelated aesthetics in combination with 3D animations, and after a proper investigation I managed to find an approach that makes use of an up-scaled graphics buffer in p5\. It turned out to be actually quite simple and if there's interest in this I might make a little post about it - let me know! Thinking ## Music for Coding Fittingly for the first prompt of Genuary, we check out a song titled *Particle Dreams* from the Japanese indie band FujiFabric. They've been going strong ever since they came together in the year 2000 - I also thoroughly enjoyed the animated music video that accompanies the bubbly and poppy sounds of this track: **And that's it from me this very first day of the year, while I'm jamming to this tune, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 36This week Genuary 2024 Prompts - Occlusion Culling in Video Games - CSS Wrapped 2023 - Digital Diluation by Ana Maria Cabbalero - The Creative Playground by Ralph Ammer - OpenAI Prompting Guide +++ lots more!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/17d9869819d30b4b98122194566a4e51-1.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-36/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) **Cheers, happy sketching, and again, hope that you have a great start into the new year! See you in the next one - Gorilla Sun 🌸** ### Gorilla Sun 2023 URL: https://www.gorillasun.de/blog/gorilla-sun-2023/ Last updated: 2026-08-10T16:26:35.000Z **Aaaaand — CUT! That's a wrap on another amazing Gorilla year! And how quickly it has gone by - it's a little surreal to find myself writing the yearly recap again so soon when it feels like I've written the 2022 recap only yesterday. And it's been yet another roller-coaster of a year, full of ups and downs, for me personally, for the Gorilla Sun Blog, as well as the generative art and creative coding space in general.** It's always crazy to see how far the blog's come in the short span of 3 years, it might not be very impressive when compared to other pages on the internet, but you have to keep in mind that everything on here is done by a single person - moi - and I'm incredibly proud of all the hard work that I've put into it so far. It's definitely been a steep learning curve to this multifaceted endeavor of mine - from building and running a website, to writing various, vastly different kinds of content, to programming and implementing algorithmic ideas, to running a newsletter, and interviewing people, all while also trying to be an artist in some capacity, and marketing myself as such on social media; no single part of it is very straightforward and there's always several hoops that you need to jump through to get things done - it often feels like a big puzzle, where the goal is to figure out how all of these things should fall into place. I know that I don't have to do all of these things - but I simply want to, it wouldn't be as exciting if I just did one thing and one thing only, I'd get bored very quickly, and I wouldn't have been able to stick with it for as long as I did. Since I've found such a wonderfully welcoming and supportive space, it would be a waste to not live out all of these passions of mine. It is genuinely incredibly rewarding to attempt all of these things and grow as a person. I want to thank everyone that reads my writings, on the blog as well as on other platforms, and appreciates my art, by collecting it or simply by leaving a like wherever I post my creations. All of these things only come to life and gain meaning through my audience - through you. So a big heartfelt thank you. At this point, I believe that I've got a much better picture of how all these endeavors need to play into each other moving forward. When I initially made this website I wanted it to be a place on which I can share my creations and my writing, as I've always been very passionate about both of building things and documenting for others to learn from. That said, let's roll the end credits for 2023 and recap all of the noteworthy Gorilla things that happened this year. There's been some big changes to the blog, many an article, a LOT of generative art, as well as many other creative endeavors and projects that I've been involved in. I'll also let you in on some of the things that've happened behind the scenes, and to wrap up, I'll also talk about my plans for the next year. *Let's get into the nitty gritty of it all to finish off this year, shall we?* ## The Blog in 2023 A significant chunk of my time this year has gone into writing again - I still think that it's one of the best mediums to convey information, and in many ways superior to video/audio formats. And that's a hill I'm willing to die on. I've published and written significantly more than I have in 2021 and 2022, even when you combine the numbers of both years. Here's some rough numbers for 2023: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/piecespub.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/piechart.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/words2.png) I aggregated these stats with my own webcrawler! I ended up writing a decent amount this year. When I first started out in 2021, the main problem that I was facing was finding meaningful topics to write about - if you have a look at my earliest posts, they're all over the place since I was still trying to figure out what I actually wanted to write about. In 2022 I then mainly focused on writing massive tutorials/solutions for certain timeless problems, such as computing collisions between polygonal shapes, different approaches for packing shapes in 2D space, the rounding of corners of pointy polygonal shapes, programming different types of grids and tessellations - all of them being non-trivial tasks in computational geometry, pursuing them mainly out of personal interest and for the lack of comprehensive and easy to digest resources on those topics. I believe that these *big* articles are meaningful evergreen pieces of content, transcending generative art, and providing real educative value to those who need and/or want to learn about these techniques. **I'm really proud of these articles because they provide simple solutions to hard problems.** In the long run these types of resources also tend to be the best performing type of content on the blog: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-20-at-13.47.14.png) The drawback however, is that they take a significant investment of time and effort - from initially identifying an interesting problem, to finding a solution and then implementing it, as well as preparing demonstrations for each part of the process to actually putting down the ideas in written form - it can take days/weeks before you have a first rough draft for such an article. In the current climate of the internet, that primarily cares about engagement, and the consistency thereof, this doesn't work very well. It's also frustrating on a personal level when you announce something that you've been working on for a while just for it to be overshadowed by something else the very next day. For engagement purposes, and to signal social media algorithms as well as SEO metrics that my website isn't outright flat-lining, a recurring piece of content makes much more sense, but is at the same time hard to reconcile with the type of content that I've been making up until that point. That's why I tried a couple of new formats in 2023, in the quest for publishing more frequently, while also not bringing myself to the brink of burnout, and still providing value to the readers. We'll get into the details of this in the next couple of subsections. ### Goodbye Jekyll The biggest driving factor in turning the blog into more of a recurring publication was migrating to the Ghost CMS back in March: [Goodbye JekyllI’ve been thinking about moving away from Jekyll for a while now. Don’t get me wrong, I love the static site generator, I really do, it’s served me well for over two years, but certain aspects of my workflow have become very clunky, and overall I haven’t been able to be as efficient…![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/Red-Boats-Argenteuil-scaled--1---1-.jpeg)](https://www.gorillasun.de/blog/goodbye-jekyll/) I wrote a little about this back in March in my post titled "Goodbye Jekyll" - which was also the very first email that I sent out! Although Jekyll had served me well for almost two years, it quickly became very clunky to work with. It's actually a great blogging tool, which I'd probably still recommend today as a quick and easy solution for smaller blog projects. But as time went on, there were more and more reasons for me to move away from it and to find a more efficient tool that suited my needs. The biggest reason for which I wouldn't advise using Jekyll today, is that the open source project is frozen and in "permanent-hiatus" - and chances are slim that this will change at any point in the future. A secondary reason is that you'll quickly run into Jekyll's limitations when you're trying to do anything custom that exceeds statically generated blogging content. Moreover, my workflow became more and more tedious the more content I had created - Jekyll being a blogging tool, and not a content management system, doesn't help out with any of that. All of my markdown and media files lived inside of an increasingly bloated github repo, that was starting to take several minutes to rebuild whenever I made a minute change, like fixing a typo or adding a paragraph/image somewhere. Handling media files was also quite tedious, having to manually link to them in markdown to their corresponding location in the github repo. That's why I needed a CMS to help out with that - after trying a couple of alternatives I came back around to checking out Ghost. I had only heard about it briefly before, but the more I looked into it, the more it became clear that it would solve many of the problems that I was facing. And I'm really, really glad that I took the leap so quickly and pulled the trigger back then - it took me roughly two weeks to move everything over, but it was absolutely worth doing so, saving me lots of work when compared to my workflow from back then. ### Migration to Ghost In a nutshell, Ghost is a CMS specifically designed for bloggers, journalists and content creators, providing a sleek interface and dashboard as well as a stellar editor in which you can write and create your content. At the same time, if you're savvy with web dev/desing things it's very flexible and customizable, letting you use and create your own custom themes, and routing your pages as you see fit. When I decided to move over to Ghost, I modified one of the starter themes making the blog look a whole lot better than it did before: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-16.58.12.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-16.59.36.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-16.52.26.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-16.54.32.png) Old design on top, new design on the bottom. I think that the blog looks a lot better when compared to what it used to look like in the early days. The design is however not final yet and will undergo further changes in the future. All in service of the readership, to make it as easy as possible to read the content found on the blog. Another reason in favor of Ghost, is that it's actively being developed, with several new features being released every month that simply make it a better and better tool as time goes on. For instance, you can now edit your images natively in the editor - cropping, rotating, annotating, etc... all of those shenanigans. [🎁 Build with Ghost: Wrapped 2023Explore the highlights of 2023 in our final Build with Ghost issue of the year, including all the features shipped, tutorials published, and links you clicked. We also have some brand new resources and ideas to check out if you aren’t one to live in the past 📟![](https://ghost.org/favicon.ico)TutorialsTeam Ghost![](https://ghost.org/tutorials/content/images/size/w1200/2023/12/12--1-.jpg)](https://ghost.org/tutorials/build-with-ghost-wrapped-2023/?ref=gorillasun.de) It still has its limitations, but you really have to dig deep to encounter those. Overall, it provides everything that you could possibly need to run a online publication. For the foreseeable future I'm definitely sticking with Ghost.. *Disclaimer, I'm realizing that I'm gushing a bit too much about Ghost - I'm not sponsored by Ghost. In fact I pay for their pro plan that includes hosting - although self-hosting your own Ghost instance (on a digital ocean droplet for instance) is also perfectly viable solution, but entails more work and also isn't free. Their customer support is A+ btw.* Why am bringing all of this up? Because it's genuinely been a big part of my process this year, and I wouldn't have been able to put out as much work as I did without this tool. I feel like a lot more people should use Ghost - it's really great. ### The Newsletter One other really big thing about Ghost is that it makes it super easy to send out emails whenever you publish a new piece of content. Queue the Gorilla Newsletter. Prior to that, I had a Mailchimp account set up for the purpose of collecting email addresses, but at the time I never actually ended up sending out any email. In hindsight I maybe should've - but at that point I was unaware of the importance of a mailing list for building an engaged audience - an audience that is untethered from your social media following. **Hence, in search for a recurring format, having gained the ability to easily send out emails, while also understanding the importance of a mailing list; it all culminated in the creation of the Gorilla Newsletter.** In April I announced that I'd be publishing two pieces of content a week in addition to the newsletter - a tutorial on Thursdays and an Essay-like piece on Sundays. And well... that didn't go too well - I really struggled before ultimately dropping it as it wasn't doable, there was just not enough time for it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-29-at-13.27.10.png) The newsletter on the other hand was much more tangible - the fixed structure makes it much more manageable from my end to publish it on a weekly basis. The initial pain point of *What should I write about this time?* solves itself by virtue of the content. But that's not to say that it's easier to write, you still have to do your research and due diligence to report facts and incidents correctly. So far however, nobody that's been mentioned in the newsletter has complained, so I guess I'm doing something right. Drawing from social media as my main source I assume that people are generally okay with having their stuff featured. Here's a throwback to the very first issue of the Newsletter - it was quite rough around the edges: [Gorilla Recap 0First issue of the Gorilla Sun Newsletter! This week we ran a poll on how y’all learned to code, we made some #genart, built a widget, and read a couple of interesting things online about computer magazines, how LLMs work and determinants.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/image--1-.png)](https://www.gorillasun.de/blog/gorilla-recap/) The very first newsletter issue that I sent out on the 17th of April 2023\. Feels crazy that I've been doing this for 37 weeks already! There were other inspirations for the Newsletter though. Raph's weekly creative code news being one of them. Around the same time that I switched over to Ghost, Raph made the announcement that Creative Code News would be coming to an end, I thought that it would be a good moment in time to start my own version of it. Partially, it was also something that I wanted to do for myself, in an effort to stay up-to-date with everything that was happening in the generative art and creative coding space - given that there's frequent period of time in which I'm honed in a on a particular project, letting happenings in the space pass me by. It then always feels difficult to emerge from these projects and to reconnect. I didn't want to feel like I was only doing things within my own bubble anymore, and have an active reason to keep up with developments in the space - committing to the newsletter gave me the best reason to do so. With time it also became clear to me how fragmented conversations are on social media platforms, which is something that I started focusing on only recently, trying to provide a relatively complete picture of opinions on certain points of discussion that are floating around in the social media sphere. ### Tutorials Besides that there were also quite a few tutorials this year, one topic that I explored in depth were physics systems, how to program them and the different approaches to it: [Euler and Verlet Integration for Particle PhysicsIn this post we revisit our particle system, and have a first look at the Verlet Integration method, which is an alternate method for simulating particle physics. It is in many ways more robust that the regular Euler Integration method that we have employed so far.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/parts-1.png)](https://www.gorillasun.de/blog/euler-and-verlet-integration-for-particle-physics/) It actually ended up being a very intricate topic, which I would like to revisit in the future. Towards the end it was very interesting how a simple particle system can quickly turn into a soft-body physics simulation: [Programming Soft Body Physics and BlobsOne approach to modeling deformable objects in computer graphics are spring-mass systems: a technique that allows us to bring Soft Body physics to life. Picking up from the particle mesh that we created last time; in this post we’ll tackle different configurations for blob-like shapes.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/thegreattraversal-3-.jpg)](https://www.gorillasun.de/blog/soft-body-physics-and-blobs/) I also wrote about other things, like interesting organic cellular patterns that can be achieved with a recursive circle packing strategy: [A Recursive Circle Packing Algorithm for Organic Growth PatternsIn this post we have a look at a simple algorithmic idea that can produce some very interesting organic looking patterns. At it’s essence it’s a circle packing strategy, but with the added twist that these circles are connected in a tree like structure. 🌳🦠![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/growww.png)](https://www.gorillasun.de/blog/a-recursive-circle-packing-strategy-for-organic-growth-patterns/) There were also a few guides which were way overdue, like an introductions to P5JS and all of the things that can be done with it. [Getting started with P5JSIn this post we’ll have a look at p5.js, a creative coding and generative art javascript library. We’ll setup our first project, learn how to draw some shapes and get started on our creative coding journey.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/05/plantsmember-1.png)](https://www.gorillasun.de/blog/getting-started-with-p5js/) You can find all of these tutorials over on the articles page of the blog! [ArticlesFrom essays on creative coding, to technical tutorials and instructive articles on programming, the Gorilla Sun Blog boasts a wide range of content!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/site_banner_compressed-1-.jpg)](https://www.gorillasun.de/articles/) ### Towards Monetization One other feature that I really wanted to have for the blog, was the ability to place posts and articles behind a subscription/paywall, in an ongoing endeavor to make the blog finance itself at some point in the future. Which was yet another reason for choosing Ghost as my CMS, which also allows for this. One initial solution that I found in that regard is memberspace, which is a tool that can be integrated into any website - but again, I would almost always prefer a native solution without having to manage things in a different location. Another option that I considered, prior to checking out Ghost, was Substack which I actually gave a shot for a short period of time, bringing in all posts from my site using their import functionality, but there were quite a few issues to ir, since many of my pages had embeds and custom widgets that run code in them, which didn't import correctly. After exploring the platform a bit more and understanding how it worked, I came to the conclusion that it wouldn't work for my purposes. All things considered, Substack is a stellar platform when it comes to running a newsletter/online publication, for building a community, as well as connecting with other creators. It provides all the tools to this end, and I'd say that it is superior to Ghost with its existing audience that uses the platform for the creation and consumption of content. But the drawback is that it is a very rigid and standardized platform when it comes to design and structure. Not having complete control over the design of my pages, and the ability to add custom pages is really important to me. The Gorilla Sun blog is about generative art, and about building cool things with code, especially those things that run in the browser. Hence the blog needs to be artful and custom, to reflect this, and be capable of showcasing interesting things that run in the browser. But to get back to the point, in the long run, doing all of this work for free is not sustainable, nor is it realistic - there have been very kind supporters that have donated via ko-fi in the past, which I am incredibly grateful for. But it would simply make much more sense to ask for direct support in exchange for "premium" type content, which would also greatly help in justifying all of the time that I spend on the blog and further build it out as an educative and journalistic platform/outlet. One thing that I would like to do in the future, which is already in the works, is the creation of themed series of posts on certain programming and generative art topics - sort of like courses. Initially, the main goal would be to offset all of the fees associated with running the blog, such as the monthly hosting costs and the yearly domain registration fee. ### Blog Roadmap for 2024 Now the million dollar question: where's the blog headed in 2024? There's a few things that are already underway, that fell off over the past couple of months because I had to prioritize other things in the meantime, but here's a rough plan for the coming year (at least the first half of it): 1. **Revamping the design of the Blog**: the current design of the blog isn't optimal, for instance all of the main pages, like the landing page, the articles page, the about page - they all don't look very professional right now, and could really do with an overhaul. The main focus will however be the design of the content pages, I'd really like to have a custom design for each type of post, for instance a custom design for the Newsletter pages, for the Interviews, for the tutorials that often include interactive demos - and this will most likely take a significant amount of time to setup. The main difficulty of it being cleaning up the gigantic mess of a CSS file that's currently powering the design of the blog. 2. **Revision of the Content**: the more content I push, the more typos and grammatical errors find their way into the writing. Additionally, there's many older posts that could do with a complete re-write, because they're simply not up to par any more. 3. **The Gorilla Explorer:** I would also like to have a Portfolio page where visitors can explore all of my creations and artworks. I began working on this a couple of months ago, but I never managed to wrap it up, because it became more and more ambitious as I was developing, the main pain point being the amount of image files that need to be displayed. This is however something that I'm very excited to get my hands dirty with again! 4. **More Content, Tutorials, Interviews, Essays and Newsletters**: I definitely want to keep pushing new tutorials and essays, which is becoming increasingly harder the more tasks there are that need to be taken care of, so the first couple of months in 2024 might be a bit slow while I hammer out all of the other things. There is however already a couple of new interviews in the works! We're also quickly approaching the 3rd anniversary of the blog - I yet have to think about what I'll do for that occasion, ideally the new design would already be in place at that point. We'll have to see though. ## Generative Art in 2023 *I've made quite a few things this year again - overall I didn't spend as much time on coding as I did on writing, but I had many meaningful sessions in which I explored new ideas, concepts and algorithmic problems, discovering new branching paths to pursue and explore in 2024\. Here's a brief recap of some of the pieces I did.* ### 3 Group Shows This year I had the chance of participating in a couple of group shows/curations, which were really awesome experiences - creating an artwork with a set deadline is a completely different beast to just leisurely taking your time and exploring ideas. Mid 2023 I was contacted by Haiver to participate in Alba's inaugural 'Flatlands' exhibition, for which I created my piece 'The Great Traversal', a piece that I had started working on back in November of 2022, finally bringing it to completion: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-20-at-16.58.45.png) [Link to curation Page](https://www.alba.art/exhibitions/flatlands?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-20-at-16.55.09.png)](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) [Link to Project Page](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) Later I applied for an open call put out by the Kumaleon people, which gave me the opportunity to participate in the Proof of X live minting show in Tokyo - here's a pic of the setup: ![Making of Somewhere in Between](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/Untitled_deblurred.png) [Making of Somewhere in BetweenIn this post we have a closer look at my generative token Somewhere in between and the code that generates it’s graphics. Building upon the irregular grid strategy from way back when I approached rectangle divisions in a completely new manner.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/Untitled_deblurred.png)](https://www.gorillasun.de/blog/making-of-somewhere-in-between/) I also wrote a little more in depth about the project here. Fast forward a couple of months, with another open call by KUMALEON x Okazz I had the chance to participate in their fxhash 2.0 launch curation titled 'Colorful' - I set out with an ambitious idea, and got a much needed extra two weeks to complete the piece when the launch was delayed: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-20-at-16.59.37.png)](https://www.fxhash.xyz/generative/29784?ref=gorillasun.de) [Link to project page](https://www.fxhash.xyz/generative/29784?ref=gorillasun.de) All three of these were incredible learning experiences, and I'm glad I got the chance to participate in them. Here I have to mention how incredibly important it is to have a couple of projects in the pipeline at any given moment. People will at some point reach out to you, asking if you're interested in making a piece for this or that show/event, and when that happens you want to have something ready, even if it's just half-baked something, it's much much better to have a starting point than having to start from absolute zero. Moreover, it might also be a good idea to have some projects that are like 90% done for the occasions when a stellar offer comes your way with a tight deadline. ### Lots of other Ideas and Algorithms But the works I created for the group shows were only a fraction of the creations this year, here are a couple more in no particular order: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/327616915_500194082285644_3907068454279873774_n.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/329408427_3501075513468395_239117204570247395_n.jpg) Some ideas that took shape in early 2023 during Genuary - during that period I was incredibly obsessed with circles and circle packings, trying to squeeze as much as possible from the simple technique. The right picture is another project on fxhash titled Assemblage - [link to project page](https://www.fxhash.xyz/generative/24922?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/329009018_942244620254675_3946200199627057275_n.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/asd.jpeg) Sometimes there's also bigger projects that never get released. I worked on this heavily in February, but I never found the courage to put it out, although it is 95% done imo! It remains untitled as of today. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/ffa.jpg) An instagram-esque picture from the development of that piece, my trusty notebook quickly at hand! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/342088322_912144453379860_657607128580601262_n.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/7aac414ecff6525a72fb7656def02a3d.jpg) I also had an idea to extend my irregular grid algorithm - which I haven't documented yet because I haven't entirely explored it for myself at this point, but the patterns shown here emerged from a bug in my code. This also has nothing to do with graph algorithms. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/340472564_1657437971369569_5851301626377517498_n.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/QmUw7V1qm9BqEZyQf8AscoMashpAgRnXdSfSEocWC8ch7P-1.png) Blöck on EditArt.xyz - a very simple piece, whose reception really surprised me. It minted out in roughly about a day. Thanks to Piero aka pxfragile for putting together the lovely platform. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/daze-maze.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/somew.png) I also made quite a few fxhash tokens - [Daze Maze](https://www.fxhash.xyz/generative/26169?ref=gorillasun.de) on the left, my first forray into fx(params) shortly after the feature was released, and I think the first token that is WYSIWYG, as well as Somewhere in Between my project for Proof of X. 0:00 /0:12 1× I also explored SDFs again as well - spirals on a rectangular grid being something that I hadn't explored before. There's many more things I made, but I don't want to unnecessarily bloat this post with everything that I've made over the course of the year. That's what the Gorilla Explorer is going to be for, so keep your eyes peeled for it! ### On Graph Algorithms In the latter half of 2023 I mainly explored Graph algorithms, which I think is a relatively underused set of algorithms in generative art when compared to other methods like Perlin noise for instance - although the concepts and implementations thereof are not actually that complicated, here's some things I did with graph traversal shenanigans: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/patterns1ss.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/390629566_331927079503810_3969484348433308007_n.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/download--69-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/disturbance-in-the-mainframe3.png) 0:00 /0:28 1× Here's Prim's algorithm in action used as a space filling technique, gradually populating a rectangular grid. Especially in combination with tilings, that can be represented as adjacency graphs, this gives rise to many interesting patterns that might not be otherwise achievable. It's definitely going to be something that I'll pursue more in the future. I think I will release a lot more art next year in comparison to what I did in 2023\. I don't know why I didn't release that much art, in part I was heavily focused on the blog, trying to build up a decent backlog of content and finding a release schedule that works for me. Life has also been quite turbulent, looking back it feels like every day there's been something to take care of, completely unrelated to the blog and generative art. But such is life and everyone has to manage that somehow. When you have a clogged kitchen sink, it's not going to fix itself by posting about it on Twitter. It's really important to be able to find back into the groove when other things are going on in your life. ## Social Media Once you decide to go solo and mainly start working on your own projects, be it coding, writing, or any other sort of individual endeavor, you end up spending a lot of time behind your workstation, by yourself. And you don't really have much reason to really talk or interact with people until you've actually completed the work. Which is in many ways counterproductive; the work that you are creating is ultimately intended to be seen and consumed by others - and if others have no connection to you or your work, or don't even know who your are, why would they then care about what you're doing once you decide to put your work out into the world? It's undeniable that a strong social media presence and putting yourself out there is key in engaging with others, and signaling to others that you exist and creating work. I would definitely say that I'm not very good at it yet, it takes a significant amount of confidence and effort to post on a regular basis to the different social media platforms out there, which are additionally in a constant state of change as it seems . But if you want to get the word out, you have to be loud. One of my personal goals in 2024 is to put myself out there even more, posting more regularly, while also not worrying too much about what others might think about the things that I'm posting - over on Twitter I've currently got a little over 8k followers, which is a sizeable audience, and I'm incredibly grateful for everyone that thought it's worth following me and keeping up with the things that I do, but there's also some pressure that comes with it when you know that your postings will be seen by so many people. I generally don't want to unnecessarily waste anyone's time with posts that don't have anything interesting to say or show. Hoping to be more relaxed about it though in 2024. My best performing post in 2023 was actually something that I did for the second Genuary prompt "Made in 10 minutes", for which I simply recorded a timelapse of myself live-coding a piece from start to finish. I didn't really think too much about it prior to posting it to Twitter, I simply thought that it would be a cool thing to do - but it ended being something that people really thoroughly enjoyed - I think that being able to see the entire process at once is very satisfying, also seeing the different stages that the artwork goes through and how the code comes to life: 0:00 /1:00 1× [Link to Tweet](https://twitter.com/gorillasu/status/1609980230839549954?ref=gorillasun.de) Maybe I should after actually try and put in place a social media strategy for myself - I think there's a lot of things that I've coded and written at this point that would be worth sharing again in a revamped format. ## People and Projects in 2023 *Although social media can go a long way, there's nothing that beats getting to know someone face-to-face - either in person, or via a video chat - having a conversation is after all the most human way of communicating and exchanging ideas.* ### Interviews First off, I'd like to give a big thanks to all of the people that have agreed to give me a significant chunk of their time and have had a chat with me for the blog: [Anna](https://www.gorillasun.de/blog/a-conversation-with-anna-the-nft-collector/), [Tezumie](https://www.gorillasun.de/blog/interview-tezumie/), [Monk](https://www.gorillasun.de/blog/in-conversation-with-peter-bauman-demystifying-monk-antony/), [pxlshrd](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/), [w](https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/)[hitecross](https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/), and [Nerios](https://www.gorillasun.de/blog/all-eyes-on-bohet-generative-prints-on-demand/) \- thank you so much. These conversations have been incredibly rewarding and enriching experiences, exchanging ideas face-to-face and connecting over shared topics of interest is always incredibly insightful and gives you new perspectives on the space as a whole, learning from the experiences of others. With where I currently live, I don't really have the opportunity to meet people IRL that are into generative art or creative coding, which I think isn't too uncommon. I also really enjoy doing my research beforehand, and maybe catching the interviewees on some details that they might not have expected. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-14.16.59.png)](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/) [In conversation with pxlshrd](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/) Even if it isn't your goal to do interviews, it's incredibly rewarding to reach out to people, and simply tell them that you're interested in their work - and you'd be surprised how open everyone is to exchange ideas or to simply chat. This kind of "cold" calling is really the best way to make friends on the internet. To everyone that's reached out to me - thank you so much. **And if you want to talk to me, simply reach out, I'm always more than happy to do so!** I was also extremely flattered to hear on several occasions that they've enjoyed reading my blog and following along with my generative art. At the same time it makes all of the blog-work so much more worthwhile, by being able to amplify other people's voice and stories through my platform, making the blog feel a little more alive in that manner as well, making it not just my own ideas and words, but also the thoughts of others. Currently, there's two more guest whose interviews will be released early 2024. ### Guest Lecture at ZHdK This one was very exciting but also very nerve-wrecking at the same time. Sadly I don't have any pictures or recordings from the presentation. Back in mid 2022 I got a message from Josef Renner, a teacher at the Zürcher Hochschule der Künste (ZHdK) asking me if I'd be interested to do a guest lecture for the class that he was teaching. I quickly agreed, because it just seemed like an amazing opportunity to present my work and connect with some new people. I felt very honored and humbled, asking me to present my work and talk a little about the career that I'd carved out for myself. At that point it'd been the first time I was invited to give a lecture. The difficult part about it: it was in German - I can speak German fluently, but I'm not very confident about it. Moreover, it wasn't just a presentation but a full 2 hour lecture. Although I've done quite a few presentations before, preparing material for a run-time of 120 mins is very challenging. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-26-at-12.29.58.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-26-at-12.31.46.png) I'll eventually redo the presentation in English and record it at some point. Josef Renner was incredibly kind to me, meeting me at the entrance of the building, showing me around before taking me to the classroom - the university used to previously be a former dairy factory that had been repurposed - we passed by rooms with students practicing instruments and dance choreographies, and I did feel a little out of place, because I'm just a dude that writes code. But ultimately the presentation went very well. ![ZHdK, Toni-Areal | Sightseeing in Zürich](https://www.zuerich.com/sites/default/files/web_zuerich_zhd_toni_campus_1280x960_22614.jpg) It's one of my best memories of this year, Josef was very kind to invite me for this opportunity. ### Raph's Live Stream It almost feels like it wasn't this year, but Raph and I also did another code review in which we had a closer look at Nat Sarkissian's Eucalyptus and Sagebrush: [![Image](https://pbs.twimg.com/media/FsYVFzmXoAIzTxg?format=jpg&name=large)](https://twitter.com/gorillasu/status/1641022340564762625?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1641022340564762625?ref=gorillasun.de) [Nat Sarkissian’s Eucalyptus and SagebrushIn this post we’ll have a closer look at Nat Sarkissian’s generative FxHash token: Eucalyptus and Sagebrush. The token seamlessly bridges between visually stunning graphics and an intricate terrain generation algorithm. Additionally there’s a lot to learn on simulating brush strokes algorithmically![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/04/eucalyptusandsagebrush-1.jpg)](https://www.gorillasun.de/blog/eucalyptus-and-sagebrush/) Nat's code was incredibly clean and structured, which lended itself very well for such a review, after getting a hold of him he was also so kind to give us permission to do the review. Procedural terrain generation is an incredibly interesting topic and has been heavily utilised a lot in the context of video games, but can also lend itself well for the purpose of generative art. It's also been a minute since I've last checked in on the stream, life's been a bit crazy in the past couple of months, so I'm hoping that in the coming year I'll find more time for to participate in the weekly challenge again. On that note, you should [check out Raph's Birbsnest discord](https://discord.gg/PvzyN7ayw7?ref=gorillasun.de) where you'll find so many lovely people to nerd out about creative coding, among other things. ### DiGen Art Gallery in Lebanon Back in August I got a message on Twitter asking me if I'd like to create a piece for an upcoming gallery in Lebanon, and I really didn't have to think twice about it. That's how I got to know Alex and Camille, the two brains behind DiGen Art, a gallery with the mission to bring digital art closer to the MENA region. After they'd seen my little timelapse that I'd done for Genuary, they thought that it was a really good way to convey what creative coding is really about and wanted to showcase a similar piece on the DiGen homepage. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-14.42.01.png)](https://digen.art/?ref=gorillasun.de) [Link to the DiGen Art page](https://digen.art/?ref=gorillasun.de) I quickly got to the drawing board and after a couple of initial ideas, I thought it'd be best to create something in the same vein of the Genuary animation - a rotating SDF that included some aspects of the brand book that they shared with me, mainly their brand colors as well as the reoccurring arrow symbol. 0:00 /0:06 1× The final DiGen Animation Recording my hands as well as the code in sync proved to be quite challenging, and there's a also a certain choreography to how the code builds up to the final animation which is not very easy to do. It was genuinely a really fun project to work on and I'm hoping to collaborate more with them in early 2024\. You should check them out over on Insta, they're recently had their soft-launch and made some ripples in the local news: ![Photo by Lebtivity.com on December 30, 2023. May be an image of 7 people, signboard, cash machine and text.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/414880326_18404404003003529_5490798300961581113_n.jpg) ![](https://digen.art/wp-content/uploads/2023/11/hello-beirut-poster-724x1024.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/415205042_18404404321003529_1063371453206022600_n.jpg) Their gallery is in the vicinity of AUB where I did my bachelor studies, located in the area that I grew up in and spent most of my childhood. ### Helping out with the fxhash Docs The last big project to conclude 2023, which I loved being involved in: helping out with the revamp of the fxhash docs leading up to the 2.0 release. It was also quite a challenging task, the writing per se not being the most difficult part, but rather the structuring and presentation of the concepts and notions that fxhash builds upon in a logical and chronological manner. For someone who doesn't know the first thing about blockchains, NFTs and generative art, there's so many things that need to be explained prior to getting into the nitty gritty. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-30-at-15.50.08.png)](https://fxhash-documentation.super.site/?ref=gorillasun.de) [Link to docs](https://fxhash-documentation.super.site/?ref=gorillasun.de) Because fxhash has evolved so quickly over the span of two years, with a truckload of features having been added, there were a lot of things in the docs that needed to be further elaborated on as well as shuffled around. At this point there's still a few things that need to be added, related to the new Ethereum integration that introduced many new functionalities to the platform. And especially when it comes to the tools that fxhash makes available to the artists for building different kinds of tokens, there's so many things to keep track of, like the directory structure of a project, how to use randomness within your code to ensure deterministic behaviour, how to test a project in fx(lens), how to make a responsive generative artwork in the browser, etc. It's a very involved undertaking, and hopefully the docs can be of assistance in that regard to everyone who's starting out on fxhash. It was also very insightful and educative for my own sake being able to do this deep dive - I now feel much more confident going into building my own tokens. ## Lessons Learned Probably the biggest lesson I learned about myself throughout 2023 is that I want to make art, a lot of it actually - but don't necessarily want to be a full-time artist. I also want to be known as the guy that writes awesome articles about generative art and creative coding. Here's some of the tips I've picked up along the way and that I'd give to others 1. Always have some projects at the ready, that you can quickly turn into finished works. You never know, the next stellar offer might be just around the bend. 2. Work ahead of time and archive things. Sounds obvious, but especially with the Newsletter for instance, collecting interesting finds throughout the week is crucial, you can't leave it until the day before, because so many cool things will have vanished within the maws of the social media machine. 3. Reach out and talk to people. Even though the generative art thing exists to 90% online and in the social media bubble, networking is absolutely still a thing. Join a couple of chat groups, try to be active, talk to people, make friends and have fun. 4. Make your own website if you don't have one already. It's literally free real estate on the internet. Create a footprint and try to make that footprint as large of as possible. Be loud. 5. Document your work. People do read. It will come in handy when you're asked to give a talk, presentation or workshop. You'll have that information at the ready and just need to turn it into slide format. 6. Shoutout and support other people's work - it doesn't cost you anything to leave a like or to repost something, but it can have a big impact on the receiving person's end. When [Bjørn Staal](https://twitter.com/%5Fnonfigurativ%5F?ref=gorillasun.de) gave me a shoutout in one of his threads, I gained like 200 followers overnight, and that was massive. So thanks for that, Bjørn. 7. Stop being hypercritical of your own work. A particular project might suck, another one might be stellar, the important thing is that you learn from what works and what doesn't and try to refine your process, it's impossible to not get better with time if you keep churning out new works. 8. There often is no relation between the quality of your work and selling out. And you should absolutely not let it affect your mental health, moreover your self-worth is not tied to selling out. Make art for the joy of making art, for yourself, and be grateful for those that do collect your work and support you. No one owes you anything. 9. Credits for this one go to Frederik Vanhoutte and Joshua Davis, two artists that I admire: "Make the work that you want to be known for. Don't get trapped in making formula pieces because that's what you think will be popular." ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-12.12.31.png) [Link to Tweet](https://twitter.com/wblut/status/1729795418458853617?ref=gorillasun.de) ## Thank You I can say with certainty that this has definitely been one of the more challenging years of my life, and there's been quite a few rough patches throughout 2023\. With times being as turbulent as they are, with social media platforms in a constant state of upheaval, with fears of AI changing the entirety of the internet landscape it hasn't been easy to create work under these circumstances. But I think that it's only normal to have worries and to sometimes struggle with reconciling an online presence with real life, and to manage the two in parallel. The older I get, the more I feel that I'm getting a better grip on all of these things though, and looking back it feels like I've come such a long way already. I've grown as a person, emotionally and professionally. Moreover, I'm healthy and alive, and so are my loved ones, and that's all that really matters at the end of the day. Moreover, I get to do this really amazing thing and share it with you all. It goes without saying that the blog only comes to life through it's readership - again a big thank you for reading these words. Thanks for sticking around and supporting me, it genuinely means a lot to me. I find myself at a point again where there's way too many people that I'd like to thank. First off, my beautiful partner for supporting me, always pushing me to better myself, being my crutch in those moments when I find myself wanting to burn everything down to the ground, pushing me to keep going and not give up. I'd also like to thank all of my internet friends. Anna, who's always first to share the newsletter whenever it comes out on Mondays, and for being so supportive of so many artists in the space. Peter Bauman and thefunnyguys from Le Random for enriching the generative art space with their editorial efforts and supporting the newsletter. Raph for having trust enough in me to bring me on his show, in 2022 and again in 2023, it takes a lot of effort and dedication to do the long live streams that he does and I admire him for it, I certainly couldn't do it. Thanks for being a cool dude in general and for fostering the lovely birbsnest community. Also big thanks to Dave for always being the first to aid whenever someone's in need over in the help channel. Thanks again to the all the guests that have agreed to be interviewed on the blog Tezumie, Peter Bauman, Pxlshrd, Alessandro Fiore, as well as Daniel Aguilar, and Ryan Murdock whose interviews will be released early 2024\. Thanks to Alex and Camille from DiGen for reaching out to me and letting me make their website banner. Thanks to everyone who's collected one of my generative artworks on the blockchain. Everyone that's given me a shout. Everyone that's subscribed to the Newsletter. Every follower on every platform that I'm on. Everyone that's reading this. **I wish you all much love and happiness and an amazing start into the next year! Cheers, and see you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 36 URL: https://www.gorillasun.de/blog/gorilla-newsletter-36/ Last updated: 2023-12-25T11:25:03.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! This issue of the Gorilla Newsletter comes out just in time for the holiday season - on this occasion I want to wish you all and your loved ones a joyous time filled with warmth, laughter, and cherished moments! 🎄 Happy Holidays! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### Genuary 2024 Prompts are Out Ready or not, Genuary prompts for 2024 are out - and it looks like an absolutely fun list this time around again! You can find the full list over on [the Genuary page](https://genuary.art/?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-21.33.27.png)](https://genuary.art/prompts?ref=gorillasun.de) [Link to full list of Prompts](https://genuary.art/prompts?ref=gorillasun.de) If you're not familiar, it's essentially the creative coding community's version of [Inktober](https://inktober.com/faq?ref=gorillasun.de), taking place in January instead of October, in which code artists flock together for a month long coding challenge. The concept's simple: given 31 prompts - one for each day of the month - the goal is to create an artwork/code sketch each day that brings the corresponding daily prompt to life. How closely you want to follow those prompts is entirely up to you, the fun part about it being that you can be as creative as you want, interpreting things in surprising and unexpected manners. Like Inktober, it's really just one big exercise in creativity to hone your sketching skills. Some coders choose to go the extra mile, and put in place their own personal overarching constraints and/or themes; for instance you could challenge yourself to only make animations for all 31 prompts, or constrain yourself to only using a specific framework, etc... For this purpose, it's generally a good idea to prepare a little template for yourself beforehand that lets you to kickstart your sketches. If you need inspiration or want to explore creations from previous years you can do so by typing in the hashtag #genuary23 / #genuary22 / #genuary21 in the search bar on Twitter - you should also do this for your creations this year, so that people can easily look up your stuff in the future: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-21.46.00.png) Genuary is really one of the best ways to get out a lot of ideas at a rapid pace, without worrying too much about what others will think about them when you post them to your socials. It also sets you up with a boatload full of ideas that you can then pursue and develop later throughout the year - here's a couple of things I made back in Genuary 2023: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/thegreattraversal.jpg) Some of my creations back from Genuary 2023 I also made a big recap post for my favorite creations from others for 2023 - the article might take a while to load though since it embeds so many tweets: [Genuary 2023 RecapA big recap of Genuary 2023, all the sketches that I’ve made for the daily prompts as well as my personal favorites from other artists. This article contains a lot of twitter embeds, which might take a couple of seconds to load. Thank you for your patience!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/03/banner-1-.jpg)](https://www.gorillasun.de/blog/genuary-2023-recap/) On this note, as we're undoubtedly bound to see some amazing creations this year again, I've been wondering about how to best report on all of the sketches. I've been thinking of doing a weekly recap in which I showcase some of my favorite creations - which would basically come in the form of an additional weekly issue, running in parallel to the newsletter throughout January. I believe that a daily issue would be a bit too much for me and you the readers. Would love to hear your thoughts on this and if that is something you'd want! Last thing that I want to mention here - if it's your first time and Genuary seems like a daunting thing to attempt, you'd best try and join a chat group and/or discord channel to brainstorm with others and or collaborate on a couple of the prompts with another coder. I'd recommend [Raph](https://twitter.com/sableRaph?ref=gorillasun.de)'s birbsnest discord server for this and the lovely people in there who're already in full swing talking about potential collaborations. ### Generative Art Holiday Season The dust's settled now and we emerge from fxhash's launch week with a large number of new works released into the world. I couldn't resist and ended up collecting a couple of things myself: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-22.48.11-1.png)](https://twitter.com/gorillasu/status/1738531789658783810?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1738531789658783810?ref=gorillasun.de) If you want to support some of the artists, there's still quite a few stellar projects that haven't minted out at this point. Besides the hard work that has gone into the development of the platform, the fxhash team has also dedicated significant efforts into showcasing many of the releases that launched in the past week - something that completely flew under my radar were the fx(press) posts that contain interviews with some of the artists that had releases during launch week - and as an interview aficionado, I found these to be highly enjoyable, I recommend checking them out for yourself: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-22.56.31.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-22.56.48.png) fx(press) interviews with various artists | [Link to Page](https://www.fxhash.xyz/u/fx%28press%29%20/articles?ref=gorillasun.de) What's more, is that there's another group show in full swing over on Alba titled "Tiny Geometries" featuring highly textural works from 8 very talented artists - here's a sneak peek at some of the works: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-25-at-11.14.21.png)](https://www.alba.art/exhibitions/tiny-geometries?ref=gorillasun.de) "I think texture is a very important part of an artwork because it communicates beyond the visual. It provides a sort of multisensory channel that can greatly expand the experience, giving a sense of materiality." - Daniel Aguilar | [Link to Curation](https://www.alba.art/exhibitions/tiny-geometries?ref=gorillasun.de) I'm really impressed by all of the individual projects, they're all really gorgeous in their own right. And I also really enjoyed reading Haiver's accompanying essay that discusses texture in generative art a little more in detail, explaining all of what the term entails. I believe that generative artworks generally consist of two separate components: structure and texture. With structure referring to the positioning of the elements on the canvas, and texture referring to the final visual aesthetic that is applied to the elements in the composition. It can sometimes be the case that texture emerges from the positioning of the elements itself, like in Daniel Aguilar's Tetra for instance, where the placement of many tiny rectangles produces an intricate tactile aesthetic. I also think the word "finish" is more appropriate than "texture" in certain scenarios. Haiver also addresses the recently reignited conversation around Skeuomorphism in generative art, and how texture is one of the aspects that feeds into this discussion - when I work on my own projects I often find myself at a crossroads, having to make a choice between a digital aesthetic that "embraces the medium" or emulating a textured look that pretends to be tactile in some manner. But in any case, I think at this point we collectively need a little break, to lay back and recover from the madness of the past weeks, and before we launch into Genuary. ### What Games don't show You SimonDev's Youtube channel is a treasure trove of information when it comes to video game programming techniques. I initially discovered the channel a couple of months ago while researching methods for improving the speed of a javascript particle system that I was working on. At the time I found [a video of his that explains spatial hashing](https://www.youtube.com/watch?v=oewDaISQpw0&t=498s&ref=gorillasun.de) (grid lookup basically) and how to optimize it, and I had discovered a deeply insightful, elaborate and well made video that ended up helping me tremendously with the ideas that it presented. What's more is that Simon was one of the devs behind [Prototype](https://en.wikipedia.org/wiki/Prototype%5F%28video%5Fgame%29?ref=gorillasun.de), a game that I thoroughly enjoyed in my teenage years. I haven't checked in with his channels in a couple of months now, but I was delighted to see that there's been a couple of new videos, with the newest one revolving around occlusion culling; a technique that is used to make massive open worlds possible in video games: Essentially, occlusion culling boils down to only displaying the items that should really be visible to the player and there's quite a few nifty things that video games do to determine what things are hidden and don't need to be shown. Videos like this one are incredibly important - you don't often find technical information like this presented in such a digestible manner while being an enjoyable watch at the same time. I hope Simon keeps making these incredibly educative videos. ### Other Generative Things 1. [WTBS released a new episode](https://twitter.com/WaitingToSign/status/1737836326664417678?ref=gorillasun.de) featuring [the collector bre](https://twitter.com/bre?ref=gorillasun.de) 2. [**Simulating Fluids, Fire, and Smoke in Real-Time**](https://andrewkchan.dev/posts/fire.html?ref=gorillasun.de): Andrew Chan explains some of the basic concepts and methods involved in fluid simulation. 3. [Math for Game Developers](https://pikuma.com/blog/math-for-game-developers?ref=gorillasun.de): Pikuma who's another awesome creator for game dev related programming content, wrote a massive article about the math used in game development. 4. [Julian Hespenheide started a series of posts titled Occasional Knowledge](https://www.threads.net/@julian%5Fhespenheide/post/C0%5F6ZHBLooC?ref=gorillasun.de) over on Threads, which recently became accessible to people in EU. ## Weekly Web Finds ### CSS Wrapped 2023 With 2023 coming to an end, we're no seeing an influx of wrapped style posts, summarizing the important happenings of the year. The Chrome for Developers blog published an article recapitulating all of the new CSS features that were released over the course of 2023 - not only listing those new features, but also showcasing them in action as live demos: [CSS Wrapped: 2023! | Blog | Chrome for Developers2023 was a huge year for CSS! Learn about what landed in Chrome and across the web platform this year.![](https://www.gstatic.com/devrel-devsite/prod/v8332a5cec2b627575422eb634078b4a9892f3eac6f9006e54b6e9bbf0bfda91f/chrome/images/favicon.png)Chrome for DevelopersTwitter![](https://developer.chrome.com/static/blog/css-wrapped-2023/image/csswrapped_header.svg)](https://developer.chrome.com/blog/css-wrapped-2023?ref=gorillasun.de) With the amount of new features added over the course of 2023, it's safe to say that the web is going to look better than ever! And with the various browsers continuously adapting and steadily rolling out support for new and old features I think we're on track for a better web overall, where making good looking and responsive websites is becoming easier than ever for devs. Here's some promising insights from InterOp 2023 to back this: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-24-at-15.20.03.png)](https://wpt.fyi/interop-2023?stable&ref=gorillasun.de) [Link to Interop 2023](https://wpt.fyi/interop-2023?stable&ref=gorillasun.de) What's more, is that some of these new features could potentially be very useful for generative art purposes; I'm especially excited for the new trigonometric functions and the color manipulation rules that could be used to recreate creative effects with CSS only. I've had an idea for a circular type of layout for a while now, which I quickly dropped because it seemed like a tricky problem to solve when I looked into it - but should have become very manageable now with the newly added trigonometric functions. Here's two articles that I found where these things are discussed in more detail if you're curious to learn more: [Trigonometric functions in CSS | Articles | web.devCalculate the sine, cosine, tangent, and more in CSS.![](https://www.gstatic.com/devrel-devsite/prod/v8332a5cec2b627575422eb634078b4a9892f3eac6f9006e54b6e9bbf0bfda91f/web/images/favicon.png)web.devTwitter![](https://web.dev/images/authors/bramus.jpg)](https://web.dev/articles/css-trig-functions?ref=gorillasun.de) [New functions, gradients, and hues in CSS colors (Level 4) | MDN BlogLearn what’s new in CSS Colors Module Level 4, including color spaces, color functions, fancy gradients, and support for wide-gamut displays.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web DocsBrian Smith![](https://developer.mozilla.org/en-US/blog/css-color-module-level-4/css-color-functions-lvl4.png)](https://developer.mozilla.org/en-US/blog/css-color-module-level-4/?ref=gorillasun.de) This year has also been a turning point for me personally - for the longest time, I've had a big fear of CSS, feeling that it wasn't something that I could get good at. But after diving deep into understanding the different rules, how they affect each other and completing a number of simpler layouts it suddenly seems like a much more manageable task, and really isn't that much different from programming other things. 0:00 /0:23 1× Currently I'm trying to hype myself up for the redesign and a general overhaul of the blog - it's going to be a lot of work but at the same time I know it will be very rewarding for me personally and for you guys as well. ### Digital Dilution: Being There, Everywhere, Nowhere I strive to be as prolific as Ana María Caballero, somehow managing to churn out amazing art and writing very consistently. Just last week she claimed another award, namely the Future Art Writers Award with her essay titled "Digital Dilution: Being There, Everywhere, Nowhere". In the essay she examines metaverse exhibitions through Bertolt Brecht’s theories and methods of alienation. The essay can be read over in the MOZAIK e-zine, alongside a number of other deeply insightful pieces: [2023 E-ZINE — MOZAIK Future Art AwardsThis 3rd edition of the MOZAIK E-ZINE is titled “The Digital Awakening” — an arts-based exploration and interrogation of meta-futures.![](https://mozaikphilanthropy.org/wp-content/uploads/2019/12/cropped-Asset-4-270x270.png)MOZAIK Philanthropy![](https://mozaikphilanthropy.org/wp-content/uploads/2023/12/STATIC-MOSAIC_02.jpg)](https://mozaikphilanthropy.org/e-zine-2023/?ref=gorillasun.de) Bertold Brecht's alienation effect, originally *Verfremdungseffekt* in german - which I think is a beautiful word - is a concept and method used in performing arts that encourages the audience to maintain a critical and reflective distance from the events on stage rather than becoming passively and complacently immersed in the narrative. This is to say that Brecht essentially used certain techniques to break immersion on purpose such that it allows for a nuanced experience of his work. In her essay, Ana María examines virtual metaverse exhibitions through this lens, and points out that these exhibitions tend towards the other extreme, being so far removed from reality that they often incite a severe alienating effect, which doesn't allow for any emotional connection: > If spectacle imparts no connection, the visitor exists with nothing but a furthered feeling of dilution, the sensation that the self must be ever-present to be considered a valuable (and valued) participant in the digital art ecosystem. I've only explored a few exhibitions in this manner, and from what I've seen, I can say that I'm generally not a big fan. There's simply a big lack of narrative - I'd much rather experience the art on a well designed webpage, that elevates and emphasizes the art itself like a beautiful frame, rather than viewing distorted previews in an unnecessary 3D space. Metaverse exhibitions start making sense when they're intended to be immersive experiences; as explorable virtual spaces in which the artworks can be discovered according to some order such that they tie into each other - maybe even letting the viewer forget for a moment that a virtual space is being traversed. However, often it's simply just a big pile of artworks thrown together with the label of "exhibition" tapered onto it. And it's something that I've been experiencing more and more, the effect that social media has had on my personal perception of art, a certain fatigue and lethargy setting in, where I spend no more than a brief second on any image, no matter how compelling, quickly sending it on its merry way upwards, making it disappear never to be seen again in an endless stream of content that most social media platforms provide nowadays. But that's a can of worms that we'll open another day. I found the essay very, very thought provoking and thoroughly enjoyed reading it. A very well deserved award in my opinion. Kudos and congrats! ### The Creative Playground In his article "The Creative Playground", Ralph Ammer talks about the importance of creating your own structured frameworks for the exploration of ideas and concepts: [The Creative Playground - Ralph AmmerHave fun with drawing! Create yourself a creative playground we need a goal and rules. Here is why and how:![](https://i0.wp.com/ralphammer.com/wp-content/uploads/2020/07/cropped-ralph_fav_512.png?fit=192%2C192&ssl=1)Ralph Ammerralphammer![](http://ralphammer.com/wp-content/uploads/2023/11/Cage_220.gif)](https://ralphammer.com/how-to-get-started/?ref=gorillasun.de) Ammer elaborates that creative exercises are nothing more than "structured, artistic games", in which you set your own rules and goals. Exploring concepts within such a controlled environment can be one of the best ways to hone your artistic skills and working towards developing a personal voice by trying out different concepts and methods in isolation, figuring out what works and what doesn't for you artistically. Essentially, an exercise in creativity itself. I believe that the presented notions are closely related to the idea of *limitation breeding creativity* \- putting in place silly self-imposed rules can often actually have the paradoxical effect of being very liberating, in that it removes worries about medium and approach which are in this setting already fixed a priori. Exploring things in that manner eventually forces you to think outside the box: how can you make A if you can only use/do B? This reminds of an amazing TED talk by Phil Hansen, now a decade old, titled "Embracing the Shake". After years of pursuing pointillism Hansen developed permanent nerve damage in his drawing hand, causing an irreversible shake, seemingly destroying all prospects of pursuing a career as an artist. Things changed however after he embraced this new limitation of his - embracing the shake - extending his horizons beyond the one particular approach that he'd been so fervently pursuing and opening the gates for many other forms of creative expression: "Stop trying so hard to think outside of the box, get back into it" - Phil Hansen That's why I love using code for making art - it's an inherently minimal medium with it's own self-imposed limitations: the only thing you can do is type characters into a code editor, characters have to adhere to a specific syntax, and there's really only a handful of concepts that you can use, like loops and functions. These couple of things can then however be leveraged to build an infinite number of different systems, all with their own emergent properties. The next time you sit down to make art, try to make a game out of it, put in place some rules and goals. It might be the case that nothing comes from it, but you might also discover your new favorite approach to making art. ## OpenAI's Prompt Engineering Guide OpenAI recetnyl released their very own prompt engineering guide - what better way is there to learn how to use LLMs than straight from the source? [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-23-at-12.01.02.png)](https://platform.openai.com/docs/guides/prompt-engineering?ref=gorillasun.de) [Link to Page](https://platform.openai.com/docs/guides/prompt-engineering?ref=gorillasun.de) The guide outlines six prompting strategies for getting better results from the models. If you're using LLMs for any task in your life it's probably a good idea to check out the guide and step up your prompting skills: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-25-at-12.22.07.png) ## Gorilla Updates This week I released my project Hex Appeal, and I'm incredibly happy with the response from everyone - 43 editions being minted so far: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-23-at-12.41.14.png) I had just a little bit of a heart-attack in the first couple of minutes when the project first released and the first couple iterations sold. Apparently there was a bug (now fixed) where fxhash injects a null value into the hash parameter that seeds the token while the collected tokens are still being signed, which results in them generating the exact same output. At that moment I thought that I'd messed up pretty badly, heart racing, thinking that weeks of work had been for naught, simply because I didn't properly configure my project. **After a few minutes when the preview images started coming in, I sank back into my chair realizing that everything was in order after all.** With every project that I'm releasing, impostor syndrome is becoming a little less - I'm starting to feel just a little more in control over my art. The biggest tip that I can give in this regard is to really take your time, not rush an artwork, and taking in every aspect of the process, savoring it and really understanding what it is that you're trying to do and express. If you supported in one way or another, a big heartfelt thank you, it genuinely means a lot to me! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-25-at-12.12.21.png)](https://twitter.com/gorillasu/status/1736720276732231873?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1736720276732231873?ref=gorillasun.de) One other thing that I want to mention here, is that I got a mention in the yearly recap of the Build with Ghost newsletter: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-23-at-12.09.42.png)](https://twitter.com/TheRoyalFig/status/1737133158422782281?ref=gorillasun.de) [Link to Tweet](https://twitter.com/TheRoyalFig/status/1737133158422782281?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-23-at-12.10.35.png) Can you spot the Gorilla? | [Link to Recap](https://ghost.org/tutorials/build-with-ghost-wrapped-2023/?ref=gorillasun.de) Currently I'm hard at work at compiling the yearly gorilla recap, keep your eyes peeled for that one, it should come out in the next couple of days! ## Music for Coding Came across this video through their biggest fan Dave Pagurek - King Gizzard and the Lizzard Wizzard is hands down the most prolific band in recent times, releasing a whopping 25 albums in just over a decade, making it a group that should definitely be on your radar: **And that's it from me this week again, while I'm typing in these last words, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 35This week: fxhash 2.0 goes live - Processing Foundation Impact Report 2023 - Tyler Hobbs on Generative Aesthetics - 2023 Plotter Postcard Exchange - AB feat. Licia He +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/12/hex-appeal-24-.jpg)](https://www.gorillasun.de/blog/gorilla-newsletter-35/) *Previous issues of the newsletter can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) ### Gorilla Newsletter 35 URL: https://www.gorillasun.de/blog/gorilla-newsletter-35/ Last updated: 2023-12-18T11:42:21.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### fxhash 2.0 v2 After the necessary postponement, fxhash launched just a couple of days ago on the 14th and is now fully live with its Ethereum integration! Although there have been a couple of hiccups, things have gone relatively smoothly for the now multi-chain platform: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-02.34.28.png)](https://twitter.com/fx%5Fhash%5F/status/1735388045292007494?ref=gorillasun.de) Big Congrats to the fxhash team | [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1735388045292007494?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-10.23.03.png) A couple of the stellar projects that have minted on Ethereum so far. One smash hit from the first couple of days that I'd like to highlight for its virtuosity, is Piter Pasma's Tender curated drop, titled Blokkendoos. You might know him as the brilliant mind behind the [Universal Ray Hatcher](https://www.gorillasun.de/blog/gorilla-recap-7/) from a couple of months ago, and he's back with another impressive feat of generative art. By making use of a "global illumination Monte Carlo path tracer" his project generates stunning renders of glossy shapes, and does so in only 5954 characters of code, without using any external libraries - it's basically the modern day equivalent to sorcery. In one of his tweets, Piter shares the entire size optimized code as well as an example output: ![Image](https://pbs.twimg.com/media/GBapvoiXgAANUSe?format=jpg&name=4096x4096) ![Image](https://pbs.twimg.com/media/GBaqSY5WUAAkcQr?format=jpg&name=large) The Code for Blokkendoos - 5954 characters render glossy graphics in the browser without any libraries | [Link to Tweet](https://twitter.com/piterpasma/status/1735764616871845923?ref=gorillasun.de) Moreover he shares a thread in which he addresses the importance of size optimizing code, and why it isn't simply about reducing the length of a piece of code but actually has a deeper purpose to it: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.12.39.png)](https://twitter.com/piterpasma/status/1736000934923137413?ref=gorillasun.de) Piter Pasma on the importance of size optimizing code | [Link to Thread](https://twitter.com/piterpasma/status/1736000934923137413?ref=gorillasun.de) Hey also brings up the interesting notion of Kolmogorov complexity, which measures the complexity of objects by the length of the shortest computer program that produces the object as output: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.24.49.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-02.41.41.png) ### Processing Foundation Impact Report 2023 [In light of Ben Fry's resignation a couple of weeks ago](https://www.gorillasun.de/blog/gorilla-newsletter-25/), with controversial claims that put the foundation in a precarious position, we now get clarity on their entire activities throughout 2023 with the recently released impact report: [Processing Foundation Impact Report 2023Processing Foundation Impact Report 2023![](https://processingfoundation.report/favicon.ico)Processing Foundation Impact Report 2023Made with <3 by Design Systems International![](https://processingfoundation.report/social-share.jpg)](https://processingfoundation.report/?ref=gorillasun.de) Processing's remit as a foundation has grown well beyond the initial vision of the software sketchbook, and now holds the responsibility for fostering a large, inclusive, and diverse community. In 2021 the foundation received a large spike in donations from their 20th anniversary fundraiser - where several NFT platforms made it possible for code artists to donate directly with their work to the foundation. Which led to the foundation receiving a funding sum magnitudes larger than any grant money previously received: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-17-at-23.17.46.png) > With the influx of funding from our community, it was imperative to grow our core team to meet the needs of our growing community with deep focus and ensure thoughtful, equitable stewardship of foundation funds. Naturally that prompted a big change in infrastructure and management to ensure the long term financial health of the foundation - the report states that the foundation can now safely continue operations for the next 12-13 years with their current budgeting while fairly compensating the core full-time members, while also providing a breakdown of spendings in that regard. The report also shows some impressive numbers when it comes to the development of P5, which I believe to be much popular nowadays than the original Processing - especially with the commercialization of generative art via blockchain technology that demands for browser based code art - so there's definitely been progress on the development side of things: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-02.21.55.png) I applaud the transparent and comprehensive report detailing the foundations current endeavors. I believe that it is well on track, and that we'll continue to see the community grow in coming years. ### Tyler Hobbs on Algorithmic Aesthetics Monk gives us a look into the current mind of Tyler Hobbs with his newest interview for Le Random: [Tyler Hobbs on Algorithmic AestheticsUsing the essays of Tyler Hobbs as a reference point, Peter Bauman (Monk Antony) spoke to Hobbs about coded generative art’s aesthetics.‍![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/656f68737d57eab19bbc0bf2_tyler-hobbs-thin-air-1-2020-med.jpg)](https://www.lerandom.art/editorial/tyler-hobbs-on-algorithmic-aesthetics?ref=gorillasun.de) Having coined the term "Long-form Generative Art" with his seminal essay [The Rise of Long-form Generative Art](https://tylerxhobbs.com/essays/2021/the-rise-of-long-form-generative-art?ref=gorillasun.de), Hobbs has unarguably become a household name in the genart space. Regarding that Hobbs has always been very generous with information, it is interesting to catch up and see how his views have evolved in the meantime. One topic that I found particularly insightful was Monk's inquiry about Hobbs' criteria for evaluating generative art - where he provides an interesting perspective: > It needs to be worth it to see all of the images in the output set. Ideally, the work should be compelling enough for you to want to look at every single image in the output. If it's not, then you may have generated too many of them. And I believe that it's a shared struggle by generative artists; trying to strike a balance between variety and harmony, such that each individual output is interesting by itself but still ties into an overarching narrative - Hobbs' comment however goes beyond this, such that it's not only important that the code creates outputs that are interesting on their own, but also make you want to see the rest of the collection. Making long-form projects that are successful in that regard is incredibly difficult. Although I've made quite a few longform generative artworks at this point, looking back this has been one of the hardest aspects to achieve. Making long-form generative art is the opposite of a formulaic process, each project is wildly different, hence I'm not certain how one would exactly harness such a global quality to the set of outputs with making any compromises. Hobbs elaborates that it's an ideal: > Again, that's an ideal, as my own work probably falls short of that. I also really appreciate that Monk tackled some of the recent ongoing debates around digital vs. traditional aesthetics, seeing that Hobbs has experimented extensively with [the simulation of painterly aesthetics](https://tylerxhobbs.com/essays/2017/a-generative-approach-to-simulating-watercolor-paints?ref=gorillasun.de) by means of computer code himself. To address the topic, he uses a term that I believe to be quite fitting and that captures a broad range of the problematic: richness. A physical canvas is already inherently rich with texture, and trying to draw a rectangle by hand will result in something that is naturally rich with imperfections as Hobbs explains. The same thing can not be said about the pristine shapes that the machine draws onto a digital canvas, which I believe is why we see so many artists recur to the recreation of those aesthetics to make their work more interesting. I've had this experience in particular with my attempts to add 'grain' to some of my generative artworks. It's simply a method that adds random perturbations to the pixels of the canvas, which is a quick and easy way to add texture to a work, when in reality it only makes the artwork appear richer, but often doesn't add much substance. So it's definitely a mistake to use texture as a cheap trick to make things appear richer than they actually are. > I do think it is a mistake to focus on replicating specific analog media as an end. I don't think that digital work needs to pretend to be something it's not. Again, a very insightful article by Monk, continuing to provide us with standout generative art content. ## Pen and Plottery ### Plotter Postcard Exchange 2023 Over the weekend I suddenly came across a bunch of tweets tagged with #ptpx. Upon closer inspection, it turns out to be an annual event organized by [Paul Butler](https://twitter.com/paulgb?ref=gorillasun.de), in which a number of plotter enthusiasts all across the world come together for an exchange of plotter artworks in postcard format: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.05.03.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-00.59.30.png) [Link to Tweet #1](https://twitter.com/adamfuhrer/status/1736449943928185340?ref=gorillasun.de) | [Link to Tweet #2](https://twitter.com/ippsketch/status/1736488653348536584?ref=gorillasun.de) Although sign-up for this year is already closed here's a brief break-down of how it works - via a google form you indicate how many postcards you'd like to send out and will then be matched accordingly with others, whom you'll exchange postcards with - a breakdown of this from one of the previous signup pages: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-00.57.46.png)](https://buttondown.email/ptpx/archive/ptpx-2022-holiday-card-exchange-is-starting/?ref=gorillasun.de) [Link to Page](https://buttondown.email/ptpx/archive/ptpx-2022-holiday-card-exchange-is-starting/?ref=gorillasun.de) Here's two really cool examples from past years: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.08.44.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.09.19.png) [Link to Tweet #1](https://twitter.com/golan/status/1606067727898185730?ref=gorillasun.de) | [Link to Tweet #2](https://twitter.com/stombeur/status/1369246082241331204?ref=gorillasun.de) Convinced that you should invest in a plotter now? ### Arbitrarily Deterministic feat. Licia He Ken Consumer is back with another episode of Arbitrarily Deterministic, and this time he's joined by the prolific Licia He, where they gush about everything plotter related and whilst getting an insightful look into Licia's process: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-16-at-12.33.27.png)](https://podcasters.spotify.com/pod/show/kenconsumer?ref=gorillasun.de) [Link to Podcast](https://podcasters.spotify.com/pod/show/kenconsumer?ref=gorillasun.de) ### Greweb's Medieval Era Greweb's another prolific plotter wizard that recently released a project he's been working on for quite a while - generative depictions of medieval sceneries that can you can plot by yourself or be redeemed for physical plots straight from greweb: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.15.18.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.18.45.png) [Link to Tweet #1](https://twitter.com/greweb/status/1735040632509395210?ref=gorillasun.de) | [Link to Tweet #2](https://twitter.com/ULuIQ12/status/1735605771646189907?ref=gorillasun.de) What's more, is that greweb also occasionally streams his dev process on Twitch, albeit sometimes in french it makes for a great educative resource if you're looking to get into plotting - what a lot might not know is that greweb actually has aphantasia which makes things doubly impressive: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-18-at-01.17.08.png)](https://twitter.com/greweb/status/1735750432935362776?ref=gorillasun.de) [Link to Tweet](https://twitter.com/greweb/status/1735750432935362776?ref=gorillasun.de) ## Weekly Web Finds ### Examples of Great URLs Did you know that URL design is a thing? Yes it is. If you've ever tried to do a little SEO optimization, you'll know how important URLs are, not just for linking back towards your website, but also for the purpose of conveying information to users and machines alike. Jim Nielsen lists a number of websites that have well crafted URL structures or have a creative take on it: [Examples of Great URL DesignWriting about the big beautiful mess that is making things for the world wide web.![](https://blog.jim-nielsen.com/favicon.ico)Jim Nielsen’s Blog Verified ($10/year for the domain)Jim Nielsen![](https://blog.jim-nielsen.com/assets/img/twitter-card.png)](https://blog.jim-nielsen.com/2023/examples-of-great-urls?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-17-at-16.52.45.png) One example from the article that I really liked. I'm kind of glad that I ran into this resource before I'm going to tackle the redesign of the blog in 2024 (design and structure) - with the amount of pages I have right now I want to introduce a better link structure as well, and I think it's gonna be a smart thing to sit down and plan it out before doing the overhaul. For instance, if you're viewing this page in the browser you'll notice that the URL has a prefix /blog/ - which is the same for every piece of content on the blog, save the main pages. Instead, I would like this prefix to be different for different pieces of content, such as /newsletter/ for newsletter pages, /tutorial/ for tutorials, /interview/ for interviews, etc... this helps categorize the content, further clarifies what kind of content the page contains, and will help aggregate things in individual sections. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-17-at-16.57.15.png)](https://warpspire.com/posts/url-design/?ref=gorillasun.de) Jim Nielsen links to another resource back from 2010 that contains information still relevant up until today, elaborating on some of the important URL design guidelines. [URL Design by Kyle Aster.](https://warpspire.com/posts/url-design/?ref=gorillasun.de) ### You don't need Javascript for that Killian Valkhof introduces us to the rule of least power in web design - which simply means that you should try to use the least powerful language suitable for a task: if you can do something with HTML + CSS, you probably should do it with HTML + CSS instead of directly bringing in the cavalry. Now you'd think that you usually only use JS when it's really needed, but with browsers evolving there's a lot of new HTML and CSS features that can nowadays actually replace Javascript on several occasions, as Valkhof demonstrates throughout the article: [You don’t need JavaScript for that - HTMHellA collection of bad practices in HTML, copied from real websites.![](https://www.htmhell.dev/apple-touch-icon.png)You don't need JavaScript for that - HTMHell![](https://www.htmhell.dev/images/og/advent23_2.png?s=011221s)](https://www.htmhell.dev/adventcalendar/2023/2/?ref=gorillasun.de) Definitely bookmarking this one for later! Exploring the HTMLHell site a little bit more, I discovered that the article is actually part of an online advent calendar in which each day is a new resource loaded with HTML and CSS tricks and tips. I really recommend checking it out, so much good stuff over there: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-17-at-17.22.34.png)](https://www.htmhell.dev/adventcalendar/?ref=gorillasun.de) [Link to Advent Calendar](https://www.htmhell.dev/adventcalendar/?ref=gorillasun.de) ### Webkit Features in Safari 17.2 Among Web devs it's commonly agreed upon that Safari sucks. This is generally due to it lacking severely behind other browsers in terms of feature support, or having specific behaviour that requires you to build exceptions into your website's code that account for this. However it seems that a bunch of new features are now supported with latest version 17.2: [WebKit Features in Safari 17.2Web technology is constantly moving forward, with both big new features and small subtle adjustments.![](https://webkit.org/favicon.ico)WebKitJen Simmons and Marcos Cáceres![](https://webkit.org/wp-content/uploads/diagram-of-CSS-units.png)](https://webkit.org/blog/14787/webkit-features-in-safari-17-2?ref=gorillasun.de) Ideally we'd all agree to blacklist our websites from being used on Safari. ## AI Corner ### Can Machine Learning predict the price at Auctions Recently discovered a scientific article by Jason Bailey, aka Artnome, in which he tackles a really interesting topic; as the title suggests, whether AI has the capability to predict prices at auctions: [Can Machine Learning Predict the Price of Art at Auction?![](https://assets.pubpub.org/950hnhqt/61559316763143.jpg)Harvard Data Science ReviewJason Bailey![](https://assets.pubpub.org/vl32hv04/01588343989923.png)](https://hdsr.mitpress.mit.edu/pub/1vdc2z91/release/3?ref=gorillasun.de) When it comes to machine learning models, they excel at dealing with tasks that have clear input-output relationships, and in essence can be seen as massive function approximators, making them great for the purpose of predicting new data points given previous information to draw from. For instance, that's the case for LLMs that are simply gigantic statistical models into which we feed an input sequence - the prompt - for which they then generate a completing sequence of characters. This same concept can be applied to other types of data, for instance the valuation of real-estate properties, where we could train a model to predict a price, given information about the particular property. But when it comes to the valuation of things, where even we as humans struggle, how can we train AI to do so? > In describing the art market, Plattner (1998) characterized it as having two unusual qualities. First, people spend enormous sums of money on objects that are nearly impossible to value. Second, given the limited number of potential buyers, it is difficult for artists to know if there will be any demand for the work they are creating. Bailey proceeds to describe that there is actually tangible data that we can draw from and can be used for this purpose, more specifically we'd be attempting to make AI mimic how art appraisers tackle this difficult task by considering several contextual factors related to the artwork, as well as comparing it to other similar artworks that have already been sold in a recent timeframe. It is an incredibly insightful article and I really recommend reading, it doesn't get too technical, and gives further insights into the factors that play a role in the valuation of artworks, as well as how it can be approached as a machine learning task. ### In Defense of AI Art Claus Wilke wrote a refreshing article on AI art, that stands in favor of the new artform in contrast to many of the contemporary pieces on it. Wilke provides a breakdown of the different methods that currently exist and are used for the purpose of creating AI art and gives good arguments why it is no less involved than other artforms: [fxhash - In defense of AI artAn impassioned argument in favor of AI image creation as an art form in its own right.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmVm8FeryD61u5NaX2Kw71xzhmxE2wZnKyeRsgnNBvD3pq)](https://www.fxhash.xyz/article/in-defense-of-ai-art?ref=gorillasun.de) ## Gorilla Updates My project Hex Appeal is finally completed, and marks the last big project of 2023\. I'm incredibly proud and happy how it ultimately turned out, especially considering that there have been a lot of other things going on in my life at the same time. Trying to make art in the midst of moving out of my current place has been tough, doubly so when there's also been multiple other tasks in parallel that needed to be done. The project goes live in just about half an hour from writing these words: [![Image](https://pbs.twimg.com/media/GBoBdvYXYAAfVbx?format=jpg&name=4096x4096)](https://www.fxhash.xyz/generative/29784?ref=gorillasun.de) [Link to Project Page](https://www.fxhash.xyz/generative/29784?ref=gorillasun.de) This time around I didn't let impostor syndrome get to me, even though it tried really hard. The code for this is a big amalgamation of different algorithms and methods, ranging from the construction and indexing of hexagonal lattices as connected graphs, all the way to graph traversal and polygon contouring algorithms. There were a couple of tough points throughout, but I powered through, reminding myself that I don't necessarily need to find a solution to NP hard graph traversal problems when I'm trying to make art. I'll probably make a "making of" style post about it over on the blog over the Christmas days. Here's a couple of sample outputs - I'm really happy with the compositions and the textures: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/hex-appeal-27-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/hex-appeal-25-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/hex-appeal-26--1.jpg) If you enjoy this newsletter, consider picking up one or two outputs from the project to support my work! **And that's it from me this week again, while I'm typing in these last words, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 34Vera Molnár 1924-2023 - On embracing the Medium in Generative Art - Tezpole: from Meme to Internet Sensation - Genuary 2024 website is live - Compressing Hex Colors - Deepmind’s emebllished trailer for Gemini +++ lots more.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/12/img-256-.png)](https://www.gorillasun.de/blog/gorilla-newsletter-34/) *An archive of all past issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) ### Gorilla Newsletter 34 URL: https://www.gorillasun.de/blog/gorilla-newsletter-34/ Last updated: 2023-12-11T10:19:18.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## Vera Molnár 1924-2023 Vera Molnár passed away last Thursday on the 7th of December. She was one of the pioneers that paved the way for the generative artists of today. I'd argue that generative art would likely not be half as popular as it is today if it wasn't for Vera - against all odds and the scrutiny of her peers, Vera Molnar pursued the ideas that she found interesting and dared to use the machine for the purpose of making art. Deservedly, she became known as the Grand Dame of Generative Art. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-12.08.59.png)](https://twitter.com/HOLO%5Fmg/status/1732786542995800373?ref=gorillasun.de) [Link to Tweet](https://twitter.com/HOLO%5Fmg/status/1732786542995800373?ref=gorillasun.de) Her intuitive approach to making generative art is still a great inspiration to many artists today - her ideas have most definitely had a profound impact on my personal practice. "I have no Regrets. My life is squares, triangles, lines." was one of her famous lines, and in that manner I think she lived life in a way that many can only aspire to. Molnár pursued her life-long passion until the very end, and I truly believe that we'll still be talking about her impactful work for decades and centuries to come. Centre Pompidou is due to host [an exhibition of Molnár’s work](https://www.centrepompidou.fr/en/program/exhibitions?ref=gorillasun.de) in 2024. ## Embracing the Medium The discourse around skeuomorphism in generative art has been a recurring conversation in the space, and again, things heated up to some degree over the past week. This time, the conversation escalated following this tweet from the generative OG Joshua Davis: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-16.53.05.png)](https://twitter.com/JoshuaDavis/status/1732149105084727353?ref=gorillasun.de) [Link to Tweet](https://twitter.com/JoshuaDavis/status/1732149105084727353?ref=gorillasun.de) It's been my observation that more and more generative artists have leaned into skeuomorphism over the past couple of years. With the trend being set by the likes of Zancan and Nat Sarkissian, who saw much success from their skeuomorphic works putting a generative spin on the depiction of natural scenes and landscapes. With their brilliant execution these works quickly became smash hits among collectors, inspiring many other artists to follow suit and try their hand at skeuomorphic generative art. Landscapes and natural imagery have been the subject of paintings for centuries now, they're something that we can immediately identify as being *beautiful* \- nature is objectively beautiful. The same is true for certain painterly textures and painting techniques that are also automatically equated to being artful. Replicating these subjects with code can be an easy way to elicit a *wow* reaction from the audience - to whom code art is at best some sort of sorcery. I believe that a general dismay has built up towards skeuomorphism in the generative art space, not only because it's become somewhat overdone, but also due to their deceptive visual complexity. Especially when those works become critically acclaimed by non-programmers, considering that the underlying systems are in reality not necessarily that much more complex than for any other kind of work, that might not be as digestible. The deceptive complexity of these works thus becomes an issue. A solution to this is simply by educating, and I think the space is maturing in that regard, with a growing appetite for different aesthetics. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-17.45.22.png) Another problem at this point, is that the art becomes disingenuous when stylistic decisions are made for commercial success rather than artistic expression. But in that regard I think that the space is self regulating, it's just not sustainable to make art in that manner. The main argument against skeuomorphism in generative art that we've seen drive the conversation over the past week, is that it goes against the medium. For instance, when you try to simulate a brushstroke on a digital canvas you're essentially creating an illusion - zooming in, it is impossible escape the fact that the canvas is still made out of finite pixels. Why not embrace the pixel for what it is - as a unit of color on a display and work around that instead of against it? At the same time, a lot of the aspects that make "painting" great in real life are lost, like the texture of the paper, the chemical qualities of the paint and how it interacts with the paper and blends different colors, the physical properties of the brush that is used to apply the paint, etc. Although we are getting very close in that regard, some of these things can't so easily be captured with an algorithm. Now that I'm writing these words, it seems that simulating "paint" with an emotionless machine almost seems like an insult to the real practice. Why are we trying to pretend that we're painting? Who are we trying to impress? Is simulating a brush stroke with a computer more impressive than when done by hand? An essential read in this regard from the past week is the recent article by Le Random, in which Monk interviews the AGH trio that fully 'Embrace the Medium' and try to glorify the machine for what it is: [AGH on Glorifying the ComputerAGH, the trio of Kim Asendorf, Andreas Gysin and ‍Leander Herzog, spoke with Peter Bauman (Monk Antony) before their debut show in Berlin, covering the group’s formation, the digital aesthetic and glorifying the computer.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/64c99287450e318f34a75f08_sv6.svg.png)](https://www.lerandom.art/editorial/agh-on-glorifying-the-computer?ref=gorillasun.de) I found the text and the presented perspectives deeply insightful. I especially found it interesting how this artist constellation liberates them from the traditional curatorial model and makes them in that manner more autonomous. And there's something almost dystopian about their purist approach to computer art. But if you think a bit more about it however, the position becomes a bit paradoxical - were digital displays ever meant to display art? Aren't we already defying the original purpose of the computer as a number crunching machine and using it as a tool for artistic expression? Isn't 'art' all about using materials in ways that defy their intended purpose? Arguing about this feels a little bit like going back in time and asking the Suprematists why they suddenly rejected all of the previous techniques that came before, and started drawing geometric shapes and used simple colors. Why try to draw straight lines, when you can never actually achieve a perfectly straight line with a brush stroke? I understand the different perspectives, but I think that we can collectively agree that there's no single 'correct' approach to making art. Each individual will be drawn to the specific aesthetics that evoke something within them - who are we to condemn specific modalities of artistic expression. And when you tell me that a lot of people aren't fans of making generative art look painterly, it just makes me want to fight the medium even more, and particularly do those things that I'm apparently not supposed to do. Beyond that, I simply can't see myself committing to a single aesthetic at any point in the future - I have a very broad appetite in that regard, and the beauty of generative art to me is that it allows me to conjure vastly different looking things onto the digital canvas. I'd feel shackled if I'd have to commit to a single aesthetic for the rest of time. **Maybe I just don't get it yet.** Maybe I'll evolve into completely rejecting curves and paint simulations at some point - all things considered, I'm very much a genart baby compared to some of the others that have stated their thoughts on the topic. I find beauty in both ends of the spectrum, and I find myself drawn to artworks that blend between the two, where computational geometry meets skeuomorphic colors and textures. I find skeuomorphism in generative art fascinating because it is something that I can not do in real life on a canvas, nor do I have the desire to learn how to do it IRL. I find great joy in approaching it as a computational problem. It's exciting to see that there's different schools of thought emerging, and that there's an ongoing healthy discourse that's pushing artists to evolve and questions their own practice and the medium. As an artist, it's incredibly important to take pause and reflect on these things, asking yourself what it actually is that you want to achieve with your art, how you want to express it, and how it fits into the bigger contemporary picture. ## Tezpole: from Meme to Internet Sensation In the unlikely event that you haven't seen it yet - this pic from the Tezos showcase of some artworks at the Miami Art Week made the rounds over on TwitterX, leading to a couple of interesting developments: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-12.00.48.png)](https://twitter.com/nicholas%5Fdimes/status/1732609242518155565?ref=gorillasun.de) [Link to Tweet](https://twitter.com/nicholas%5Fdimes/status/1732609242518155565?ref=gorillasun.de) At first glance, I'd give the image the benefit of the doubt; maybe it's just an unfortunate angle in bad lighting, but which ever way you spin it, it just looks... sad, for a lack of a better descriptor. Maybe the intent was to go for an 'indie' or 'punk' vibe with this kind of DIY set-up, but I couldn't think of a worse place than a hotel lobby for it. The community quickly flocked together in mockery around the halfhearted showcase, baptizing it as the "Tezpole". Many pointed out the irony of it all, the tezpole being representative of how much the Tezos foundation cares about the art community that rose to existence in the 2021 HEN days. In the chaos that ensued on TwitterX the picture quickly turned into an internet sensation, with many artists making Tezpole inspired artworks, launching into an improptu Tezpole event. Strano made a lovely thread about some of the creations: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-17.49.06.png)](https://twitter.com/5tr4n0/status/1733513604610003429?ref=gorillasun.de) [Link to Tweet](https://twitter.com/5tr4n0/status/1733513604610003429?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-09.39.01.png)](https://twitter.com/VioletBondArt/status/1733285135318208920?ref=gorillasun.de) [Link to Tweet](https://twitter.com/VioletBondArt/status/1733285135318208920?ref=gorillasun.de) You'd think that's the end of the meme. What else could there be? Why of course, Tezpole now also has it's own Tezos token: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-09.40.15.png) It seems that this also had an effect on the value of Tezos overall, breaking the 1$ mark for the first time in a while: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-09.44.03.png)](https://twitter.com/jjjjjjjjjjohn/status/1733468936945930549?ref=gorillasun.de) [Link to Tweet](https://twitter.com/jjjjjjjjjjohn/status/1733468936945930549?ref=gorillasun.de) What's the take-away from all of this? I have no clue. Curation is hard... maybe? I really loved one of Sutan's tweets, in situations like this it's important to not start pointing fingers and blame anyone in particular. Events like this are often entirely at the whims of organizational factors: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-09.19.54.png)](https://twitter.com/sutanz/status/1733526668440936582?ref=gorillasun.de) [Link to Tweet](https://twitter.com/sutanz/status/1733526668440936582?ref=gorillasun.de) ## All the Generative Things There's been a couple more things happening in the generative art space that are worth pointing out. ### Genuary 2024 Website is Live As we're getting closer to wrapping up this year, Genuary is already knocking on the doors for a month-long bonanza of generative shenanigans - Piter Pasma announced last week that the official website is already up: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-12.15.46.png)](https://twitter.com/piterpasma/status/1732786523794284547?ref=gorillasun.de) [Link to Tweet](https://twitter.com/piterpasma/status/1732786523794284547?ref=gorillasun.de) | [Link to Website](https://genuary.art/?ref=gorillasun.de) If you took a straight B-line to the prompts of this year, you don't actually have to use ChatGPT to generate your prompts - Piter further elaborates in a reply to his Tweet that a proper announcement with the actual list of prompts will follow! While I'm super excited I'm also kind of nervous because I haven't done 'daily coding' in quite a while and likely very rusty. ### fxhash mainnet launch Just a reminder that as this newsletter is coming out, the fxhash mainnet is also launching where artists can start minting their projects in prepartion for the launch: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-09.48.45.png)](https://twitter.com/fx%5Fhash%5F/status/1733935270687338697?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1733935270687338697?ref=gorillasun.de) ### Compressing Hex Colors With fxhash 2.0 coming up, and with many artists opting to mint their projects onchain with fxhas's new On-Chain File System (ONCHFS), code compression is becoming a much more important topic where gas fees for onchain-ing a project essentially depend on the size of the code files. Every little code-golfing tip and trick becomes valuable in this setting, for instance the compression of hex color codes that are often used for the purpose of coloring things drawn to the canvas - Luka Piskorec points out a resource from the prolific Matt Des Lauriers in which he tackles exactly this topic: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-11.38.53.png) The proposed trick essentially converts arrays of hex colors into base64 encoded strings. This Github gist shows how it's done, with additional comments by others: [palette compressionpalette compression. GitHub Gist: instantly share code, notes, and snippets.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)Gist262588213843476![](https://github.githubassets.com/assets/gist-og-image-54fd7dc0713e.png)](https://gist.github.com/mattdesl/58b806478f4d33e8b91ed9c51c39014d?ref=gorillasun.de) ### Cytographia by Golan Levin Golan Levin is gearing up for his debut on the Ethereum blockchain with an Art Blocks Curated release in 2024 - here's a teaser for what he's been working on: 0:00 /0:18 1× [Link to Tweet](https://twitter.com/golan/status/1732228920659857814?ref=gorillasun.de) Cytographia is a generative artwork that aims to mimic illustrations of imaginary organisms - the physics and animations of the generated artworks is reminiscent of SPACEFILLER's work, but contrasts it with a distinctly realistic aesthetic. I heavily recommend checking out Golan's Tweet that I linked here, as it's part of a longer, educative thread of WIPs, dating back several weeks and detailing many parts of the process. ## Weekly Web Finds ### An Open Source Game Engine by Isadora Sophia Murder Engine is a pixel art ECS (short for Entity Component System) game engine created by Isadora Sophia - and it's entirely open source: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-10-at-13.37.38.png)](https://twitter.com/isainstars/status/1701669993367363874?ref=gorillasun.de) [Link to Tweet](https://twitter.com/isainstars/status/1701669993367363874?ref=gorillasun.de) It's built on top of MonoGame, a framework for creating cross-platform games. If you're planning to build your next pixel art video game, you might want to check it out. Here's a link to the Github repo: [GitHub - isadorasophia/murder: Murder is a pixel art ECS game engine.Murder is a pixel art ECS game engine. Contribute to isadorasophia/murder development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubisadorasophia![](https://opengraph.githubassets.com/9cae3aae85d44b956c8d3c2c2143fb2af786d37952130fcb72e7e1191817532d/isadorasophia/murder)](https://github.com/isadorasophia/murder?ref=gorillasun.de) ### Saint11's Pixel Art Tutorials Another person that's contributed to the Murder game engine's development is Saint11, who you might know from his pixel artwork on games like Celeste and Towerfall. While I've seen some of his pixel art tutorials floating around on the internet in the past, I wasn't aware that he'd posted all of them on his personal website as well! If you've ever wanted to get into pixel art or get better at it, then Saint11's website is an absolute treasure trove for this purpose: [Pixel Art Tutorials - Saint11This is my series of tutorials that I made with the help of my Patrons, they are all 512x512 pixels and were primarily focussed on twitter but eventually became it’s own thing. All these tutorials are free, but if you want to support me, you can do it on Patreon or you can buy them in a nice .zip file on Itch.io. Also, Subscribe to my newsletter! It’s free, and you’ll get direct updates in your inbox whenever there’s new content on my website.Saint11![](http://saint11.org/img/pixel-tutorials/1-bit.gif)](http://saint11.org/blog/pixel-art-tutorials/?ref=gorillasun.de) ### Critique: Google's Internal Code Review Tool If you're an avid reader of the blog then you'll probably know by now that I'm a big nerd about clean code - clean code as a meta discussion at least. Was excited to come across an article that takes a closer look at google's internal code review tool 'Critique': [How Google takes the pain out of code reviews, with 97% dev satisfactionA study of Google’s code review tooling (Critique), AI-powered improvements, and recent statistics![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6df5c8bb-6896-426e-92ae-aef74c5cff0a%2Fapple-touch-icon-180x180.png)Engineer’s CodexEngineer’s Codex![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1879909f-2d7d-49d0-a502-dc44a0a5ee27_2112x1126.jpeg)](https://engineercodex.substack.com/p/how-google-takes-the-pain-out-of) Apparently it's the case that most devs who end up using it completely fall in love with the tool, with a 97% satisfaction rate, likely due to it simplifying so many parts of the review process. The article also links to an interesting study that further elaborates: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-10-at-13.31.57.png)](https://storage.googleapis.com/pub-tools-public-publication-data/pdf/80735342aebcbfc8af4878373f842c25323cb985.pdf?ref=gorillasun.de) [Link to Study](https://storage.googleapis.com/pub-tools-public-publication-data/pdf/80735342aebcbfc8af4878373f842c25323cb985.pdf?ref=gorillasun.de) ### Raphaël Améaume's Personal Website I'm huge proponent of every creative having their own website on which they share and archive their work. Putting your thoughts into writing for others to learn from can be one of the best ways to give back to the community. Raphaël Améaume recently put together his own page and it's a stellar example of this - combining creative interactivity with a sleek design inspired by his sketchbook notes: [Index · Raphaël AméaumeI’m a freelance creative technologist with 8 years of experience crafting interactive projects on the web. I specialize in designing and implementing generative visual systems that leverage the latest web technologies.![](https://raphaelameaume.com/apple-touch-icon.png)Raphaël AméaumeRaphaël Améaume![](https://raphaelameaume.com/assets/images/social.png)](https://raphaelameaume.com/?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-10.57.08.png)](https://twitter.com/raphaelameaume/status/1732723783847362598?ref=gorillasun.de) [Link to Tweet](https://twitter.com/raphaelameaume/status/1732723783847362598?ref=gorillasun.de) ### HTML: The Programming Language... ? Yes you read that headline right. HTML-lang is a programming language entirely built on top of HTML markup language: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-11-at-10.58.00.png)](https://html-lang.org/?ref=gorillasun.de) [Link to Page](https://html-lang.org/?ref=gorillasun.de) Sharing this one for prosperity. ## AI Corner ### Google's Embellished Trailer for Gemini It seems that we can't catch a break from drama in the AI space. A couple of days ago Google announced their newest AI model called *Gemini* with a trailer that just seemed a bit too good to be true - have a look for yourself: Although the shown outputs are all verbatim outputs from the Gemini model without edits, it turns out that the showcased interactions between user and AI are heavily embellished. Certain intermediary steps have been omitted, for brevity, to obtain the actual outputs that we see in the video. It's already been heavily covered by media in the past week - but I found that this article by TechCrunch does a good job at debunking the actual inputs that need to be fed to the model to obtain the outputs presented in the video: [Google’s best Gemini demo was faked | TechCrunchGoogle’s new Gemini AI model is getting a mixed reception after its big debut yesterday, but users may have less confidence in the company’s tech or![](https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=192)TechCrunchDevin Coldewey![](https://techcrunch.com/wp-content/uploads/2023/12/wtq.jpg?resize=1200,668)](https://techcrunch.com/2023/12/07/googles-best-gemini-demo-was-faked/?ref=gorillasun.de) Calling it a 'fake' trailer might be a bit harsh, but the model definitely isn't as witty and quickfire as presented in the video. Oriol Vinyals, Google DeepMind’s VP of Research, responds to this on Twitter with the following statement: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-20.11.51.png)](https://twitter.com/OriolVinyalsML/status/1732885990291775553?ref=gorillasun.de) [Link to Tweet](https://twitter.com/OriolVinyalsML/status/1732885990291775553?ref=gorillasun.de) ### Where does AI End and We Begin? You might already know Sougwen Choung from previous Newsletter issues as the artist that draws in collaboration with her robots - she was invited to write a personal reflection in form of a guest article for the New York Times: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-09-at-12.39.31.png)](https://www.nytimes.com/2023/12/07/special-series/artificial-intelligence-art.html?ref=gorillasun.de) [Link to Article](https://www.nytimes.com/2023/12/07/special-series/artificial-intelligence-art.html?ref=gorillasun.de) ## Gorilla Updates A couple of weeks ago I had the pleasure of talking to Nerios who's building his own marketplace for generative art prints - it's an ambitions project in these Web3 times, but he's definitely on the right track with his technical know-how: [All Eyes on Bohét - Generative Fine Art Prints on DemandBohet is specialized marketplace for generative fine art prints. In this article we have a look at the platform, how it fits into the generative art space and have an in depth talk with its creator Nerios Lamaj.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/374701086_6953689004682156_8901246830301874416_n-1.jpg)](https://www.gorillasun.de/blog/all-eyes-on-bohet-generative-prints-on-demand/) Otherwise it's been another very busy week, mainly spent on admin things and writing. I've worked just a little on fleshing out my piece for the Kumaleon fxhash 2.0 Curation, but I've got to turn on the jets a bit now - mainly need to focus on colors now: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/img-259-.png) I'll have a juicy write-up for this project around launch-time as well! So keep your eyes peeled for that. ## Music for Coding If you're a fan of Bonobo (I am), you need to check out Josh Furey. I think he's severely underrated - creating mellow and meditative soundscapes with similar tonal qualities to Bonobo's stuff, his music makes you feel like you're roaming some distant lands: [Petals, by Josh Furey11 track album![](https://f4.bcbits.com/img/a2853170787_3.jpg)Josh Fureytravisaturn![](https://f4.bcbits.com/img/a2853170787_5.jpg)](https://joshfurey.bandcamp.com/album/petals?ref=gorillasun.de) **And that's it from me this week again, while I'm typing in these last words to some of these tunes, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 33This Week 📬 fxhash 2.0 Launch delayed - RCS and Le Random on fxhash - Generative Art as a Career - P5 1.9.0 - Infinite Canvas by Amelia Wattenberger - The beauty of Doom 3 Source Code +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/12/img-198-.png)](https://www.gorillasun.de/blog/gorilla-newsletter-33/) *An archive of all past issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) ### All Eyes on Bohét - Generative Fine Art Prints on Demand URL: https://www.gorillasun.de/blog/all-eyes-on-bohet-generative-prints-on-demand/ Last updated: 2023-12-06T10:47:32.000Z **Bohét is a young and budding platform, and a first of its kind - it describes itself as a specialized marketplace for generative fine art prints. Created by Nerios Lamaj it aims to streamline the process of distributing generative artworks in the form of physical prints. In this post we have a first look at the platform, and have a chat with Nerios who gives us a peek behind the scenes, telling us about the platform's inner workings.** [Bohét - Generative Fine Art PrintsA marketplace for Generative Fine Art Prints![](https://cdn.shopify.com/oxygen-v2/790/1670/3596/45304/build/_assets/favicon_white-XKR2ZTGW.svg)Generative Fine Art Prints![](https://cdn.shopify.com/s/files/1/0635/1260/9009/files/profilepic.png?v=1690919518&width=256&height=256&crop=center)](https://bohet.art/?ref=gorillasun.de) *This article is kindly sponsored by Bohét.* --- If there's one thing that I want to do on this blog, other than writing about creative coding and generative art, it's to feature cool people that build cool things. In our conversation, Nerios immediately struck me as a down-to-earth kind of guy who's currently in the process of finding a foothold in the generative art space, whilst trying to draw some more eyeballs towards the platform he's built. I believe that the best way to get to know a platform is by talking to the creators behind it. I quickly asked Nerios for an hour of his time to chat about the platform that he's built, how the idea came to be, and to further explore some of the technical aspects behind the platform. I was also curious about his programming and generative art background. As always, I love learning about the stories of creative people and sharing them with you. Although this article is sponsored, Nerios specifically asked for an honest and transparent review, and wanted me to write down my honest thoughts on the platform - as I usually would with my writing. ## Nerios' Background **Gorilla Sun: For the readers, can you tell us a little bit about yourself; how did you get started with programming and later on generative art, and what do you do these days?** Nerios: Originally I'm from Tirana in Albania, where I grew up. My background mainly lies in computer science and web technologies. Later on I moved to London for my Masters, where I mainly learned about modern technologies like the internet of things, cloud computing and big data. Then in 2020 I relocated to Berlin, where I currently work for various start-ups. As far as Generative Art goes, that started in February of 2019, when I attended a workshop by Matt DesLauriers at the FITC conference in Amsterdam. That was my very first time learning about creative coding, and the first time that I rendered a canvas element to the browser. I found it incredibly exciting, and it was a pivotal moment for me personally. Ever since, I've tried to dedicate some amount of time to this newfound passion. **GS: Matt DesLauriers makes some awesome stuff, I'm a big fan of him as well. That was right before the pandemic hit in 2020 - did that end up giving you more time to explore creative coding?** NL: Actually, during the pandemic I was in the midst of relocating to Germany, and finding a place in Berlin was difficult \[laughs\] so that entire process took like a year. After I settled down I had a lot more time again. **GS: And currently, how different is the programming that you do for your job than it is for generative art?** Nerios: It's similar, but at the same time it's very different. At work you mainly learn about the boring things like deployment, maintenance, running AWS instances, etc... but it's all still very useful when you want to work on your own smaller projects and scale them. The knowledge I had from both of these backgrounds is what allowed me to build Bohét. ## About Bohét ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-25-at-10.27.21.png) **GS: Now that you bring up Bohét, can you tell us a little more about the platform? What is Bohét, what were your initial motivations for the platform, how does it work, and how is it different from the other platforms that are currently out there?** NL: To put it briefly, Bohét is a specialized marketplace for generative fine art prints. But to elaborate, the idea took shape shortly after I got started with generative art. At the time, I printed a couple of my own works to fill the empty walls in my place, and I noticed how much I enjoyed having something that I made myself hanging in my living room. I felt that there was something there and thought that I could maybe try selling some of these prints. After a couple of months of researching and developing this idea I put together a website for myself where people could purchase prints of my work. That was back in February of this year. I've observed how generative art has become more and more popular in recent years, not only due to the NFT craze and advancements in the Web3 space, but also because more people are getting into programming. At the same time I noticed that there still seems to be a large disconnect between artists and collectors when it comes to the distribution of their work in physical form - artists usually have to set up their own pipeline to get their generative art into the hands of their collectors. It can be a challenging undertaking. After I put together my website, I heard from other artists that they wanted something like that, where they could sell 'generative' prints. That's when the idea for Bohét started: what if I can build something that makes this easier for others? And that's how that initial platform then turned into more of a marketplace. So in a way, the distinct absence of such a platform was the initial motivation for Bohét. **GS: Making prints is definitely challenging, it's something I've personally struggled with and haven't found an optimal solution to. I tried a few different websites like printful, printify, etc... but none of it really worked out. I think there's a space for this kind of platform.** NL: Yeah, after hearing that from other artists, I contemplated how this idea could become a user-facing application, and how to make the entire process as simple and straightforward as possible from both the artists' and customers' points of view. Initially it took a couple of months of experimenting to figure out how to best set up an interface like that, without exposing the algorithm of the generative artwork publicly - and I found that the best method to do this was with server-side generation of the outputs. Meaning that the artworks are generated on the server, and then sent to the user interface. And this actually has several advantages, because the code is run on the server to generate the artwork, it also eliminates inconsistencies that often occur when the code is run on different browsers and devices. What's more, running code server-side allows artists to make generative art with any kind of programming language and/or software, you're not limited to only languages that can run in the browser. ## About the Algorithm **GS: Can you tell us a bit more about the technical aspects of Bohét, how does the platform work behind the scenes? And how does it generate unique outputs for the collectors?** NL: At the core of Bohét's infrastructure is a dynamic blend of different APIs and some custom-built modules. Currently, it uses Shopify as the marketplace backend, AWS for generating the art, and implements a custom client side SSR (Server-Side Rendering) storefront using React. Shopify is a very good headless e-commerce platform, and ensures security of sensitive operations. While it serves as the foundation for transactions on the platform, the goal is to transition away from it at some point and have an in house solution to replace it. This is a long term plan however. The art is generated in the back-end, hence instead of running the code when it is requested by the front-end, which might often take some time to run depending on the complexity of the artwork, a batch of outputs is pre-generated, securely stored in an S3 bucket, and then served to the user on the front-end. And as mentioned earlier, this has a couple of advantages: 1. The source code of the generative artwork isn't exposed, and lives entirely on the server. 2. Artists aren't limited to only using Javascript and can leverage a number of different languages and software tools. 3. There is no time delay to run the code on the user's device, which might be slow depending on their specs. 4. It ensures consistent outputs no matter what browser or device is used. This consistency also guarantees that the digital representations on the site align closely with the quality and visual aspects of the physical, printed artwork, which I think also helps making it a satisfying experience when the print is received. **GS: So to put it in simple terms, you pre-generate a number of outputs from the generative artwork, store them, and later serve them through the interface when a user requests to see variations of a generator. And the generated outputs are also unique?** NL: Exactly. **GS: How large is that pre-generated batch?** NL: As a rule of thumb it's 20 times the size of the collection. So if an artist sets the edition size to a 100, we'd then generate 2000 iterations ahead of time. But in the future I'm hoping to automate this in the cloud. There's definitely challenges with this approach, especially with more traffic on the platform. For instance, currently there's a time delay between someone purchasing one edition and then cleaning it from the mapper, but with more traffic if you have two purchases that happen in quick succession this would be a problem. But right now it's also not a priority, as the platform grows these things will have to be addressed. **GS: I think it's a good problem to have, if you have a lot of traffic that's a good thing. I'm really impressed that you've built the entire thing by yourself!** NL: Yes it's a one man-show, although I have some help from my loved ones when I need it. ## About Web3 **GS: Right now I'm very deep into Web3 things, and I think a lot of the generative artists that read my blog are also in some way involved with Web3\. One of the cool aspects about Web3 is that when things are collected, it creates a unique proof of ownership on the blockchain. What are some of the considerations in that regard? Why not choose the Web3 route?** NL: Web3 has definitely had a transformative impact on generative art, and I truly acknowledge that. But I view Bohét as another parallel in this regard. With Bohét, I'm not directly trying to target an audience that is involved with Web3\. For instance, if you consider galleries, interior design studios, hotels, etc... I don't think that a lot of them really know about that space, and even if they did, it wouldn't fulfill their needs, for them it's simply about decorating spaces and hanging beautiful pieces on their walls. In the long-term those would be the audiences that I'd like to attract. At this point in time, Web3 tech isn't a part of Bohét because I don't truly see the need for it right now — which doesn't mean that I won't consider it in the future. **GS: But there definitely are some inspirations taken from the space, like the unique outputs from the generative algorithms.** NL: I'm always open to new ideas and concepts, and I often look into developments in the Web3 space to keep an eye on how new technologies advance. It definitely brings some value to Bohét, and it would definitely be the right approach and the right time to move into that direction with some of those ideas. ## About the Physical Prints 0:00 /0:10 1× **GS: What does the pipeline for the physical prints look like? When someone purchases a print on Bohét what actually happens in the background?** NL: To backtrack a bit, back when I built the initial platform for myself, I first had to explore prints and how different printing technologies worked in general, as well as the different kinds of materials and papers that are commonly used for fine art prints. Ultimately, after trying a lot of different suppliers, I settled on a print studio located in Latvia. They have a pretty good API which makes it very easy to delegate, meaning that anytime a print is ordered through Bohét it directly goes to them where the request gets reviewed. Then they check if the file has a proper resolution and dimension, and if everything is in order they also handle packaging and certification. **GS: That makes me wonder, what if some artists want to sell prints but don't necessarily want to use your printing pipeline and already have their own solution, would it be possible for them to sell their prints through Bohét?** NL: That's a very good point, and I've thought about it as well. I don't see any reason to not do this in the future. **GS: Bohét would simply have to handle the payment logistics of it. I think that could be a really cool thing, considering that a lot of artists maybe want to have control over the creation process of the physical item with their own plotters and printers.** NL: I think that can definitely be a feature when we launch the artist portal, where the artist can then indicate what type of physical is being sold. It's still very early on to have received much feedback, but the feedback that I have received, and ideas like this are very valuable in growing Bohét in the future. I think what should be prioritized initially is the artist platform, to open up many opportunities for the artists. Secondly, it's about connecting with collectors that might not know that much about generative art, and I think physical prints are a good way to introduce people to it. ## Bohét Artists **GS: You've already had two artists launch on Bohét** [**Andrew McWhae**](https://bohet.art/artists/andrew-mc-whae?ref=gorillasun.de) **and** [**EcirBaff**](https://bohet.art/artists/ecir-baff?ref=gorillasun.de)**, what was the process of onboarding them and what was it like working with them?** NL: Both Andrew and Fabrice applied through the application on the platform, and I really liked their submissions. I followed up with them via email and they were happy to share a bit more about their algorithms. Andrew's was the first art piece that I onboarded, and I really like how it brought some more color to the platform in contrast to my own creations. I ordered one myself which is hanging in my living room now. ![Current Generated image of Perpendicular artwork](https://assets.bohet.art/960x1200/artworks/perpendicular/1546.jpg) Perpendicular by Andrew McWhae on Bohét Fabrice's was also interesting, he uses [MetaFun](https://wiki.contextgarden.net/MetaFun%5F-%5FMetaPost%5Fin%5FConTeXt?ref=gorillasun.de) to create his art, and again, the distribution of his art becomes possible with Bohét. He has some other works that he'd like to share on Bohét soon, and we might explore a different way of generating them because they're Vector based. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-25-at-10.11.05.png) ![Current Generated image of Bands of Connected Filaments artwork](https://assets.bohet.art/1200x1200/artworks/bands-of-connected-filaments/1495.jpg) Bands of Connected Filaments by EcirBaff on Bohét **GS: If someone wants to apply to the platform, how would that work?** NL: Currently there's an [application page](https://bohet.art/account/login?ref=gorillasun.de) on the website where artists can send in their details by creating an account. After that I'll do a quick review and get in touch. Beginning of 2024 we'll launch a proper artist dashboard. **GS: Did you already have some submissions that you had to reject?** NL: There were a couple of submissions where the code wasn't very 'generative' and didn't produce a sufficient variety. I followed up whether it could be enhanced and provide a more varied output space, but it didn't work out. Right now this one-on-one way of on-boarding artists and artworks to the platform is working really well though. ## My Thoughts on Bohét For the past 3 years now I've been very deep in the Web3 bubble, and in many ways generative art and blockchain tech have become two inseparable concepts at this point - to me it just makes sense. The competition in this space has unarguably become fiercer, with more and more players entering the field. With the number of platforms that have emerged in recent years, it is not only become a competition for them to attract and retain an active body of collectors, it has also become a race to capture and convince artists to publish their works on one platform over the other. In the case of Bohét, trying to compete with platforms that can provide a fully digital means for distributing ownership of generative art will be very challenging. But at the same time, this brings up questions about art ownership - is digital proof of ownership sufficient to convey a 'feeling' of ownership? Or do I need to have the physical artwork hanging on my wall? I believe it to be a very individual and subjective notion, and I'd like to argue that the latter probably still rings true for many that are not familiar with Web3 tech, and even those that have extensive digital collections probably still cherish owning physical pieces. What Nerios said towards the end of our conversation really resonated with me, printmaking is a century old tradition and there's still a massive market that revolves around it. I believe that there's a distinct need for a specialized platform that can bridge the gap between generative artists and fine art prints. I believe that the best course of action for a platform like Bohét, that's just starting out, is to closely work one-on-one with artists to slowly accrue a varied selection of artworks, while at the same time putting effort into scaling its features, drawing attention to itself, and making the artist on-boarding process as seamless as possible while delivering a high quality product. Fazit is, while generative art is moving in the direction of Web3, I believe that there is a space for a platform like Bohét that provides a streamlined method for generative prints, while clearly defining what it aims to be. ## Closing Thoughts At this point, I'd like to give Nerios a big thank you, firstly for the kind endorsement - it helps greatly with keeping this blog going - and secondly, for the time that he took out of his day to talk to me. It is always impressive to see people dedicate their precious time to projects that fall outside the scope of their day jobs. I for one am excited to see where Nerios can take Bohét, and how it will evolve in the near future. [If you find this exciting, get in touch with Nerios or send in your application over on Bohét](https://bohet.art/account/login?ref=gorillasun.de). [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-25-at-10.26.11.png)](https://bohet.art/account/login?ref=gorillasun.de) [Link to Application](https://bohet.art/account/login?ref=gorillasun.de) **Yet again, we find ourselves at the end of the article; here's the mandatory call to action - if you've reached and read this far, it most likely is an indicator that you've enjoyed this article - if you did, consider sharing it on your socials, with friends and followers, it helps tremendously and tells the algorithm that this is meaningful content.** **Otherwise consider signing up to the newsletter to receive updates directly in your inbox whenever there's new content. That said, that's it from me - see you in the next one - cheers, and happy sketching - Gorilla Sun 🌸** ### Gorilla Newsletter 33 URL: https://www.gorillasun.de/blog/gorilla-newsletter-33/ Last updated: 2023-12-04T09:47:46.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## fxhash 2.0 Launch delayed until the 14th Unfortunately, fxhash's 2.0 launch has been delayed until the 14th of December when it was initially set to kick off past Friday on the 1st of December. This is entirely with regard to the new Ethereum integration that will make it possible to create and collect generative projects on the ETH chain: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-11.52.56.png) I believe it's the right call - all of the projects that were set to release can simply be rescheduled and the dev team can make sure that everything is in good shape then. It's a course of action that I wish many other companies would take when it comes to releasing their products these days. While we eagerly await the new launch date, we needn't sit and doomscroll through TwitterX, we can actually dig into some of the stellar articles that have been released on the occasion of the 2.0 launch. ### Right Click Save on fxhash In what reveals itself as a love letter to fxhash, Jason Bailey, aka Artnome, takes a step back and recounts the early days of fxhash, and how the platform leveled the playing field at a time when generative artists were still hesitant to embrace NFTs during the 2021 boom: [The Art of Radical InclusivityThe launch of fx(hash) 2.0 makes generative art more open than ever, argues Jason Bailey![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Alex Estorick![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/65677b4826215a016628f6e2_Screenshot%202023-11-29%20at%2017.56.12.png)](https://www.rightclicksave.com/article/the-art-of-radical-inclusivity-artnome-fxhash?ref=gorillasun.de) fxhash has brought forth an entirely new wave of generative artists and allowed them to find their own artistic voice. Radical inclusivity is the best way to describe this phenomenon. From my conversations with [Tezumie](https://www.gorillasun.de/blog/interview-tezumie/), [pxlshrd](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/), [Alessandro Fiore](https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/) and Daniel Aguilar (this interview is in the works), I've learned that all of them, as well as me and many others included, took generative art much more seriously because of fxhash - not only by providing an open infrastructure for distributing generative art, but also by building a community of collectors and enthusiasts, it became possible for code artists to find their voice and dedicate a considerable amount of time to the practice. In another article from RCS, Alex Estorick invites Ciphrd and Zancan to a conversation, giving us their perspectives on the platform and how it's evolved so far: [The fx(hash) Conversation | Ciphrd and ZancanThe founder of fx(hash) and the revered generative artist discuss the art of nature and the platform’s bright future![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Ciphrd and ZancanAlex Estorick![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/6564ec30690a5a9d71f2810e_Screenshot%202023-11-27%20at%2019.20.34.png)](https://www.rightclicksave.com/article/the-fx-hash-conversation-ciphrd-and-zancan-interview-generative-art?ref=gorillasun.de) Ciphrd talks about how the fxhash team has adjusted its mission over the past two years - new features are now built in response to the needs of the community. In that manner the platform isn't solely geared towards artists anymore, but also draws into consideration the needs of the collectors and curators that ultimately bring the minted generative artworks to life. In the article there's mention of a partner studio feature, and I wish there would have been some more details about it, but from the sound of it, it seems that 2024 will be an exciting time for artist and curator collaborations. Some of the other topics addressed are fx(params), the impact it had on collectors as co-creators, as well as Zancan's Garden Monoliths and the immense pressure that ensued after its massive success. Zancan concludes the article with a beautiful statement about Ciphrd and fxhash: > **Z:** Baptiste finds this creative power and beauty everywhere in things that are probably obscure to most of us. I enjoy the fact that he considers fx(hash) to be an organism that grows and interacts, conceptualizing it as an artwork. Having heard the perspectives of the platform's creator, one of its most successful artists, and the OG generative art lover himself, it is now the artists' turn to speak. In a third complementary article, a diverse set of artists is invited to speak about creating long-form generative art on fxhash: [The Emergent Artists of fx(hash)RCS hosts a special cast of generative artists who have enriched the ecosystem![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Primavera De Filippi![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/656a2eb923fd5c3102db4a23_Screenshot%202023-12-01%20at%2019.05.59.png)](https://www.rightclicksave.com/article/the-emergent-artists-of-fx-hash-interview-generative-art?ref=gorillasun.de) The article addresses some of the important conversations around the practice today, and more generally asks the artists about generative art as a disruptive medium. ### Snowfro and Ciphrd on a Symbiotic Relationship Besides the RCS coverage we also get a hefty article from Peter Bauman, in which he invites Ciphrd, Charlie, and Paul from the fxhash team and Snowfro, the creator of Artblocks, to reflect on the past years and what the future holds for the two generative art platforms: [Snowfro and Ciphrd on a Symbiotic RelationshipIn conversation with the founder of Art Blocks, Erick Calderon (Snowfro), and founder of fx(hash), Baptiste Crespy (ciphrd), Peter Bauman (Monk Antony) reflects on the trenchant moment that is November 2023 for on-chain generative art.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65686d00bda4a9ca7bf88b42_Screenshot%202023-11-30%20at%2011.07.18%20AM.png)](https://www.lerandom.art/editorial/snowfro-and-ciphrd-on-a-symbiotic-relationship?ref=gorillasun.de) One of the most exciting pieces of information to me personally is Ciphrd's mention of a white label solution to publishing generative art on your own platform: > One of our key guidelines will be to start making the tool less and less present in, let's say, the presentations artists make of their work. We’re adding a white-labeled solution that allows you to release on your own website or on your own platform without us having too much of a presence. I believe that a lot of artists would love to have a tool like that. I am a big proponent of building your own platform and customizing it to your own needs, as an artist - and more broadly as a content creator. Monk also didn't shy away from the hard-hitting questions, which I believe many are very curious about; in a space that is becoming increasingly more competitive, with other NFT marketplaces on various chains integrating generative art capabilities into their eco-systems - Monk asks the two platforms about their views on each other. They are in many ways complementary, catering to two different kinds of audiences. Whereas Art Blocks is more boutique with its curated release model, fxhash complements that setting with its openness that's allowing the space evolve organically. Code driven parameter project are the best example for this, which wouldn't have become a feature if it weren't for the pioneering projects that tried to bend the rules of fx(params). But overall, the principles of both fxhash and Art Blocks seem well-aligned, placing the needs of the artists and collectors above everything else. I'm not going to spoil much more of the article, if you haven't done so yet go and read it now. And that's an order. 🔫 ## Generative Art as a Career There's been somewhat of a larger conversation going on over on TwitterX - and as always things on Twitter are quite fragmented, here's an attempt at reconstructing it and some of my thoughts on what's been said - I believe that it's an important discussion to bring up especially at this time when many artists will be focusing on blockchain based projects. This tweet by Zach Lieberman was essentially the catalyst: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-12.48.29.png)](https://twitter.com/zachlieberman/status/1729546307973287956?ref=gorillasun.de) [Link to Tweet](https://twitter.com/zachlieberman/status/1729546307973287956?ref=gorillasun.de) Whether you're doing generative art full-time, part-time, or have been thinking to take the leap to doing it full-time: where do you see yourself in the next year or two? In the next 5 years? Do you think you can solely sustain yourself in the coming years from generative art "drops"? Some projects have the virtue of being the first of their kind, such as some of the original Art Blocks projects like Tyler Hobb's Fidenza - which I think will be used as the poster child for long-form generative art for years to come - or the early grails on fxhash for instance, that are simply beloved by the community. Projects like that have the ability to carry their own momentum. If a project doesn't stand out in some way or another, what is going to start the conversation around it? Everything that requires an artificial induction of hype to spark some form of conversation, generally doesn't have much substance to it. Things of value can grow, and stay relevant organically. And there is only so much attention that the space can dedicate to any single project, in a seemingly growing body of high quality works and in an increasingly competitive space. As a generative artist you'll also have to think about approaching the practice in a sustainable manner while standing out from the crowd. The truth of it is that only a fraction of artists are currently playing in the big leagues. And deservedly so - it takes a certain level of expertise and know-how to consistently put out quality work while retaining the interest of your audience. A common trait that I've noticed, is that most of the big artists already have many years of art-making under their belt, with existing connections and friendships, and have a deeper understanding of the art business as a whole. Naturally there are a few exceptions to the rule. The key-word here is that it's ultimately a business - passion alone will not pay the bills. If you're an individual that's trying to break into the space, what are some of the other things that you can do around your art practice that provide value and can be sustainable? In what ways other than your artworks are you manifesting yourself in the space? I wanted to write about this because Zach is addressing something that I've been thinking about more and more in the past months. And it always brings me back to thinking about the Japanese concept of Ikigai - at least in its modern/western adapted form, that adds a financial component to the picture: ![alt text](https://www.de.emb-japan.go.jp/NaJ/NaJ2206/img/ikigai_03.png) Ikigai loosely translates to 'a reason for being', which is something that everyone needs to figure out at some point in their life. At the very least, you most likely want to do something that you enjoy, that you're good at and can get paid for. The holy grail of Ikigai is reached when this something also gives back to the world in some way. Generative art is only one of my passions. I also love writing, and I love programming in general. It always feels like a breath of fresh air when I work on the blog, if it's some Javascript code that no one will ever notice, or even styling something with CSS. Looking back I'm really proud of what I've built so far, all of the words and lines of code I've written, and I feel that I'm getting better at what I'm doing - at least I don't feel as clueless as when I tried to deploy a Jekyll blog on Github pages for the very first time. This is how I want to express myself: through my art, my writing, giving back to the community and other generative artists/programmers, being able to make connections along the way all while pushing this brainchild of mine forward and hopefully turning it into something that I can live off and dedicate the entirety of my time to. What I'm trying to get at with all of this, is that even if making generative art is one of your greatest passions, being a full-time artist might not be your Ikigai. In an alternative life I would've liked to be a musician, you know, touring the world and all that stuff, but I simply don't think that I could've handled the stress of performing and traveling. Even though it would've been my dream job, I would have at the same time been very miserable. I'm incredibly happy with the things I'm doing these days. Iskra Velitchkova and Frederik Vanhoutte, two artists that I hold a lot of respect for, touched upon this topic with their words: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-13.49.50.png)](https://twitter.com/pointline%5F/status/1730549001399705796?ref=gorillasun.de) [Link to Tweet](https://twitter.com/pointline%5F/status/1730549001399705796?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-12.12.31.png)](https://twitter.com/wblut/status/1729795418458853617?ref=gorillasun.de) [Link to Tweet](https://twitter.com/wblut/status/1729795418458853617?ref=gorillasun.de) There's many more avenues in creative coding and generative art that can be explored - try to find your own Ikigai, without shoehorning yourself into doing only one thing. ## All the Generative Things If you've made it through all of my ramblings, here's your medal 🎖️ besides the postponement of the fxhash 2.0 launch there's been a few more noteworthy things in the creative coding scene that I want to cover. ### New Version of P5 is released Firstly, the newest version of P5 is out now, with several new features by many contributors: 0:00 /0:18 1× [Link to Tweet](https://twitter.com/davepvm/status/1729941961337938244?ref=gorillasun.de) You can read about the release notes here: [Release v1.9.0 · processing/p5.jsWhat’s Changed In this release, p5.js added draggable() to let you move around elements, added imageLight() to get 3D lighting from images, added computeNormals(SMOOTH) for custom smooth 3D geometr…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubprocessing![](https://opengraph.githubassets.com/35a8fda563f2566dc0257519d03b82607915b9a5e89bf6bc52d5ffec64e8e2ac/processing/p5.js/releases/tag/v1.9.0)](https://github.com/processing/p5.js/releases/tag/v1.9.0?ref=gorillasun.de) The contributions mainly revolved around WebGL fixed and additions as well a revamp of many sections of the docs. ### Bro gets the Codes If you've followed along with Bjorn Staal's viral Entangled project from the past newsletter issue, you'll know that he's been asked by many to share his code - and well, tongue in cheek he obliged, turning the code itself into a work of art: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-12.09.45.png)](https://twitter.com/%5Fnonfigurativ%5F/status/1729411738708107743?ref=gorillasun.de) [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1729411738708107743?ref=gorillasun.de) ## Weekly Web Finds ### Evolving the Infinite Canvas Amelia Wattenberger is a web designer and tool maker. She generally explores innovative manners in which data can be represented and how we interact with it through creative interfaces. This time she's back with an insightful piece on infinite canvases and how to leverage them for creative visualizations: [Evolving the infinite canvasAmelia Wattenberger’s personal website![](https://wattenberger.com/favicon.svg)Amelia Wattenberger![](https://wattenberger.com/dogs/norwich%20terrier.png)](https://wattenberger.com/thoughts/evolving-the-infinite-canvas?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Beyond using infinite canvases, I believe that the current state of the web has grown too comfortable with the user interfaces that we're used to, when there's so many interesting alternative ways to enhance user navigation. Even on something as simple as a blog, instead of a vertical list of posts, what if we use an infinite canvas to showcase the post cards? What if we show a graph to visualize the link structure of the website, visualizing how posts link to each other? The caveat is that it requires a lot of work to create these kinds of interfaces, making them behave smoothly, comply with SEO standards, and be responsive on different devices. I would love to see more websites embrace creative interfaces however. This isn't Amelia's first appearance on the newsletter, people that make cool things are usually repeat offenders on here. A couple of weeks ago I mentioned a writing app that she put together that allows the profiling of sentence lengths in a given text, in that manner visualizing the rhythm of the text. You can check out the [writing assistant tool here](https://sentence-length.netlify.app/?ref=gorillasun.de) as well as a write up about how it works here: [Getting creative with embeddingsAmelia Wattenberger’s personal website![](https://wattenberger.com/favicon.svg)Amelia Wattenberger![](https://wattenberger.com/thoughts/embeddings-math/sentence-lengths-app.png)](https://wattenberger.com/thoughts/yay-embeddings-math?ref=gorillasun.de) I can't express how inspiring her stuff is - it makes me want to drop everything and just get started on building a web app of some sorts. ### Designing a SIMD Algorithm from Scratch What are SIMDs? SIMD is an abbreviation that stands for Single Instruction Multiple Data, and essentially refers to a type of parallel computing architecture that performs multiple operations on multiple data elements simultaneously, by means of a single instruction. One example of a SIMD machine that I think most people have heard of is the GPU - have you ever wondered how the GPU actually executes multiple instructions at the same time? Miguel Young de la Sota breaks down all of the technicalities behind SIMDs in this beefy article: [Designing a SIMD Algorithm from Scratch · mcyoung![](https://mcyoung.xyz/public/favicon.ico)![](https://mcyoung.xyz/og/simd-base64-6a027223891aaa9d3e2ca80f88949fcaadfbafe4.png)](https://mcyoung.xyz/2023/11/27/simd-base64/?ref=gorillasun.de) Besides the in-depth writing, while we're already talking about creative user interfaces, I really love the mini-map on the right-hand side of the page. It's a really nice way for user navigation. A mini-map like that can often be found as a UI component of modern code-editors providing a more complete overview of the code's structure and allows the user to quickly jump to particular parts of the code without having to scroll up and down to find a particular function or line of code. I think it also works really well in a blog scenario, especially when it's a long article like this. When designing a blog, it's generally recommended to limit the length of lines somewhere in the range of 45 to 80 characters. This greatly improves readability of the content - when lines get exceedingly wide it becomes harder to track back to the beginning of the text and visually latch onto the next line. This has the consequence that you're left with a lot of horizontal space on the webpage, when viewed on desktop at least. The modern approach is to leverage this space for some form of navigation items that help the user find specific information on the same page. This makes me wonder if a mini-map is actually better than a Table of Contents - maybe there is a hybrid solution where the different sections are highlighted in the mini-map. *BTW: The blog's redesign is still in the works, but it will have to wait till Q1 of 2024 - lots of other things have precedence until the end of the year.* ### The Designs of Kazumasa Nagai Came across this one in the *inspirations* channel over on Raph's birbsnest discord, where there's always links to lots of interesting things on the web. This one is about the life and work of Kazumasa Nagai, a Japanese designer that I hadn't been familiar with before. As one of the most acclaimed Japanese designers, he's created the logos for Mitsubishi UFJ, Japan Railways and other major Japanese companies. Over the years he has worked on an impressive number of projects: [Readymag Stories: Kazumasa NagaiReadymag puts on display the life story and creative legacy of japanese designer and printmaker Kazumasa Nagai.![](https://readymag.com/dist/img/favicons/apple-touch-icon-144x144-precomposed.png)Readymag Stories: Kazumasa Nagai![](https://d3n32ilufxuvd1.cloudfront.net/5a1d3f6e8d0f9660e0f879e9/upload-7a1c3ee0-0736-11e8-b084-0bf2820f1934.png)](https://readymag.com/designstories/kazumasa-nagai/?ref=gorillasun.de) Kazumasa also gives some insights into the practice that I think is very valuable to designers of today: > Design in the past was more unique because designers had their own styles. design today has leveled up in terms of sense but designers are likely to follow similar patterns. it mostly works on peripheral nerves but should be more appealing to our souls, I think. The only interview with him that I could find was this one on [designculture](http://www.designculture.it/interview/kazumasa-nagai.html?ref=gorillasun.de). ### The beauty of Doom3 Source Code A couple of weeks ago Youtube suggested a video by a creator that goes under the name of Primeagen. At first I thought that the guy was a bit over the top, but I soon found myself enjoying his humorous takes on various tech and programming topics, without taking things too seriously. In the video that was recommended to me he reviews an article by Shawn McGrath, which delves into the source code of Doom 3 and explains via several examples why it is a standout example for *good* code: If you want to read it, the article was published on Kotaku: [The Exceptional Beauty of Doom 3’s Source CodeThis is a story about Doom 3’s source code and how beautiful it is. Yes, beautiful. Allow me to explain.![](https://i.kinja-img.com/image/upload/c_fill,h_80,q_80,w_80/v4sckews2f3bzf0ztbkf.png)KotakuShawn McGrath![](https://i.kinja-img.com/image/upload/c_fill,h_675,pg_1,q_80,w_1200/197xrjaz7466rpng.png)](https://kotaku.com/the-exceptional-beauty-of-doom-3s-source-code-5975610?ref=gorillasun.de) One aspect of good code that the author touches upon, is that it's self-documenting: function and variable names should be revelatory of their intent, and comments should only come into play to point out special scenarios or clear up ambiguity. We've talked about this in previous issues of the newsletter, and basically, as Martin Sosic mentions in his article "[On the Importance of Naming in Programming](https://wasp-lang.dev/blog/2023/10/12/on-importance-of-naming-in-programming?ref=gorillasun.de)": *90% of clean code is just naming things correctly*. Which is in direct correlation to comments. So next time you're about to write a comment to explain a function, ask yourself if you can rename the thing to make it self-explanatory, and if you can't you probably want to make some changes to the function such that it doesn't bite off more than it can chew. ## AI Corner ### The Busy Person's Intro to LLM's At a first glance this might just look like another one of those Youtube videos that try to give an introduction to Large Language Models, but the difference here is that it's by Andrej Karpathy himself: If you're not familiar, he's by now considered a titan of the industry, having worked at most of the successful AI companies over the years, and after taking the lead over at Tesla working on the AI for self-driving cars, he's now joined OpenAI again. One famous text that he's written and that I find myself coming back to every now and then is 'The Unreasonable Effectiveness of Recurrent Neural Networks' which is a bit technical, but I recommend checking it out for yourself: [The Unreasonable Effectiveness of Recurrent Neural NetworksMusings of a Computer Scientist.![](https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=http://github.io/2015/05/21/rnn-effectiveness/&size=128)![](http://karpathy.github.io/assets/rnn/diags.jpeg)](http://karpathy.github.io/2015/05/21/rnn-effectiveness/?ref=gorillasun.de) ### ChatGPT Data Leak In a new study from DeepMind, a kind of silly method has been discovered for the purpose of extracting verbatim training data from ChatGPT: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-04-at-08.38.44.png)](https://chat.openai.com/share/456d092b-fb4e-4979-bea1-76d8d904031f?ref=gorillasun.de) [A full transcript of this example prompt can be found here](https://chat.openai.com/share/456d092b-fb4e-4979-bea1-76d8d904031f?ref=gorillasun.de) The model is simply prompted to repeat a certain word forever, but instead of doing so, after having repeated the word a certain number of times it will start generating other text that seems to be memorized training data - this can in some cases reveal sensitive information. This data extraction attack was disclosed to OpenAI 90 days prior to the release of the paper, so I had no luck of replicating the results. It is scary however to know that attacks like this are possible: [Extracting Training Data from ChatGPT![](https://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/extracting-training-data-from-chatgpt.html&size=128)Milad Nasr\*1![](https://not-just-memorization.github.io/images/chatgpt-extract_fig1poem.png)](https://not-just-memorization.github.io/extracting-training-data-from-chatgpt.html?ref=gorillasun.de) I wonder what other types of prompts can be used to break the LLMs and circumvent their generative behaviour. ## Gorilla Updates I'm still hard at work on my piece for the KUMALEON curation. The delayed launch date will give me a couple of much needed days to get the project over the finish line. Having built an interesting system, the most fun part of it is being able to explore the output space and playing with the code, which I now have time engross myself in. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/Screenshot-2023-12-02-at-14.15.35.png)](https://twitter.com/gorillasu/status/1730603195024461982?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1730603195024461982?ref=gorillasun.de) Right now I'm still trying to hone in on a final aesthetic, which is usually the thing that takes the most time: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/GATKV_eWYAACKQ3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/12/GATKV_RWsAE9ITo.jpg) ## Music for Coding This week I discovered Emancipator's music. Combining electronic elements with orchestral sounds, layered on top of hip-hop drum beats, Adam Douglass paints beautiful soundscapes that take you somewhere else - the music has similar ephemeral qualities to Tycho and Bonobo's work, but is in many ways more laid back: After thinking to myself that I'm recognizing some elements of Nujabes in Emancipator's tracks, I discovered that they have actually collaborated on several occasions: In an interview when asked about advice for aspiring artists, he states the following: > **DA:** Never stop creating. That might seem obvious, but it’s easy to get complacent or fall into a rut where you feel like you’ve defined yourself as an artist and keeping going along those lines. I think it’s always important to never stop creating. Try to have fun- make music for yourself first and there will be other people who like it. [INTERVIEW: Emancipator - Allston PuddingWe chat with Doug Appling ahead of Emancipator Ensemble’s show at Paradise.![](http://allstonpudding.com/favicon.ico)Allston PuddingGeorge Greenstreet![](http://allstonpudding.com/wp-content/uploads/2015/10/emancipator.png)](http://allstonpudding.com/interview-emancipator/?ref=gorillasun.de) **And that's it from me this week again, while I'm typing in these last words to some of these tunes, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** *If you're still hungry for more Generative art things, you can check out the most recent issue of the Newsletter here:* [Gorilla Newsletter 32📬 Bjorn Staal breaks the Internet - Kubikino: Generative Geometric Faces - Juhani Halkomäki Soft Body Physics 2.0 - Fxhash Discord Artist Studio - R1B2’s Circle of Life - Operator on Human Unreadable +++ lots more![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/11/img.png)](https://www.gorillasun.de/blog/gorilla-newsletter-32/) *An archive of all past issues can be found here:* [Newsletter - Gorilla SunWeekly recap of Gorilla Articles, Art and other interesting things from the world of generative art and creative coding.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w1200/2023/07/a-glimpse-into-the-core-1.jpg)](https://www.gorillasun.de/tag/newsletter/) ### Gorilla Newsletter 32 URL: https://www.gorillasun.de/blog/gorilla-newsletter-32/ Last updated: 2023-11-27T09:31:00.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## Bjorn Staal breaks the Internet Last week, Bjorn Staal broke the internet with what might go down as the most viral creative coding tweet in history: 0:00 /0:35 1× [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1727322594570027343?ref=gorillasun.de) Although this browser window trick is not an entirely new concept, I don't think that there has been an exploration that makes use of multiple windows at the same time. And Bjorn really knocked it out of the park with the execution, making the two windows interact seamlessly. As far as I understand it, this magic is made possible by exploiting the browser's local storage, which allows one to share data between different window instances: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-18.33.23.png)](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage?retiredLocale=de&ref=gorillasun.de) [Read more about local storage here](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage?retiredLocale=de&ref=gorillasun.de) It can be used for all sorts of shenanigans when you require data to persist across sessions or different windows. One of which is these multi-window experiments. After Bjorn posted his tweet it seemingly opened the floodgates for an avalanche of experiments around this idea. My favorite ones that I came across were Wes Bos webcam experiment and Raven Kwok's Nyan Cat just to showcase a few: 0:00 /0:11 1× [Link to Tweet](https://twitter.com/wesbos/status/1727722358465523721?ref=gorillasun.de) 0:00 /0:09 1× [Link to Tweet](https://twitter.com/RavenKwok/status/1097875458882818048?ref=gorillasun.de) In the aftermath however Bjorn addressed some of the downsides of his tweet going viral: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-27-at-10.18.08.png)](https://twitter.com/%5Fnonfigurativ%5F/status/1728402718606151867?ref=gorillasun.de) [Link to Tweet](https://twitter.com/%5Fnonfigurativ%5F/status/1728402718606151867?ref=gorillasun.de) And I completely agree with all of Bjorn's thoughts throughout the thread - he has no obligation to share any part of his code. I think it's completely fine to ask about ideas, techniques, pointers for search queries to look up specific notions to be able to figure out things on your own, but I generally think it's a bit rude to ask for code directly - it's a bit like asking someone for their homework. If you want to learn more, Ken was quick to grab a hold of Bjorn for an episode of the Arbitrarily Deterministic podcast. You can listen to the recording here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-18.28.24.png)](https://podcasters.spotify.com/pod/show/kenconsumer/episodes/AD45---Bjrn-Staal-e2cbe18?ref=gorillasun.de) [Link to AB Podcast](https://podcasters.spotify.com/pod/show/kenconsumer/episodes/AD45---Bjrn-Staal-e2cbe18?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-27-at-10.13.17.png)](https://twitter.com/%5Fnonfigurativ%5F/status/1729058563140812836?ref=gorillasun.de) [Link to Bro](https://twitter.com/%5Fnonfigurativ%5F/status/1729058563140812836?ref=gorillasun.de) ## All the Generative Things Besides the multi-browser window shenanigan pandemonium that we witnessed last week, there's been quite a few notable things in the space last week as well. I genuinely don't know how anyone is supposed to keep up with everything that's going on these days - let's dig right into it. ### Kubikino by Carolina Melis and Enrico Penzo With all of the things going on in the past couple of weeks, this project might not have gotten the attention it deserves - from concept, to execution, to the stellar promotional posts, everything about Kubikino is incredibly polished: 0:00 /1:18 1× [Link to Tweet](https://twitter.com/artblocks%5Fio/status/1728141620611322283?ref=gorillasun.de) Kubikino is a collaboration between artist Carolina Melis and creative coder Enrico Penzo. It is a generative system that creates abstract representations of faces out of individual geometric shapes, all while animating the generative process with an intricate choreography of geometric motions. You can read more about the conceptual and implementation details on the accompanying website, that breaks up all of the individual steps involved in the creation of the Kubikino faces. It is always a treat when artists go out of their way to create resources like this that document their endeavors: [Kubikino Generative Art NFTs Home Page - Kubikino.comWelcome to the Kubikino Generative Art NFTs Home Page. Learn about the project’s history, inspiration and compositional elements.![](https://images.squarespace-cdn.com/content/v1/63b12c81773e1f2e1fb029aa/2a9fb825-2b64-4054-9337-421ccd458a6f/favicon.ico?format=100w)kubikino0![](http://static1.squarespace.com/static/63b12c81773e1f2e1fb029aa/t/642dccf5b202492b0627002a/1680723189983/fav_ku_Tavola+disegno+1.png?format=1500w)](https://www.kubikino.com/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-14.46.11.png) One of the inspirations that lies at the root of the project is Bruno Munari's 1966 book 'Design as Art' in which there is a section titled 'Variations on the Theme of the Human Face' which is in essence an explorative exercise in design: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-14.58.07.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-14.58.01.png) I haven't read the book but it seems to be an important read for everyone that wants to practice graphic design. Obviously Kubikino also draws inspiration from other artists of the past, becoming a modern homage to all of them. ### Juhani Halkomäki Soft Body Physics V2.0 Juhani's back at it again making cool physics simulations, returning with a much stabler blob simulation: 0:00 /0:33 1× [Link to Tweet](https://twitter.com/JuhaniHalkomaki/status/1727751160897946020?ref=gorillasun.de) Having tried my hand at simulating blobs I can say that this is really impressive, seeing how stable the collisions are and without having the blobs protrude into each other or glitching out at the boundaries. In the comments of the tweet he gives a hint at how it's done: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-11.50.05.png) ### Fxhash 2.0 and Discord Artist Studio There's only a couple of days left until fxhash kicks off with 2.0, and it looks like the first week of December is going to be absolutely bonkers, especially with the number of projects that are set to release according to the launch calendar: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-27-at-09.57.14.png) If you're curious about all of the new things that are planned and some of the new releases, you might want to give a listen to the most recent WTBS episode featuring Ciphrd and Adam Berninger from Tender:: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-14.12.55.png)](https://twitter.com/WaitingToSign/status/1727702641969344894?ref=gorillasun.de) [Link to Tweet](https://twitter.com/WaitingToSign/status/1727702641969344894?ref=gorillasun.de) One exciting change that I think is super cool, is the revamp of the fxhash discord, making it much much less cluttered than it was before. Additionally, there's a new forum channel called 'artist-studio' where artists are invited to create their own thread in which they can share WIPs and discuss everything related to their genart endeavours: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-18.21.00.png) From the official announcement on the discord. I have to yet make my own thread, but it's definitely on my list this week: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-18.21.49.png) ### Foundation x Highlight.xyz Another big news in the generative art space, is the recent announcement for a partnership between the two NFT marketplaces Foundation and Highlight.xyz, with plans to bring generative art to Foundation's *Worlds*: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-11.53.24.png) [Link to Tweet](https://twitter.com/foundation/status/1726716555931832384?ref=gorillasun.de) But what actually is Foundation's *Worlds*? In essence, it's a curatorial blockchain tool that streamlines collaborations between curators and artists: [The World is yours | FoundationWorlds is now its own smart contract, and in this new architecture, each world is represented as an NFT.![](https://foundation.app/apple-touch-icon.png)Foundation![](https://images.ctfassets.net/9tp4nbs38ooy/13N8Ms09vPpPc0Z7EJqczx/1d46a2e4114f440e47cf6716f6731c60/Blog_Hero.gif?fit=fill&q=90&w=1920)](https://foundation.app/blog/the-world-is-yours?ref=gorillasun.de) If you want a short version, Kaloh summed it up pretty well in one of his recent Tweets: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-15.18.15.png)](https://twitter.com/Kaloh%5Fnft/status/1728407781844087077?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Kaloh%5Fnft/status/1728407781844087077?ref=gorillasun.de) What does this partnership entail and what does this mean for generative artists? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-15.22.17.png) You can read all about the partnership in this article: [Generative Art is Coming to Foundation WorldsWe’re excited to announce that Highlight is teaming up with Foundation to provide generative artists with more expansive tools.![](https://images.mirror-media.xyz/publication-images/vjJLDqibRjokIE0BFqpXG.png?height=512&width=512)![](https://images.mirror-media.xyz/nft/NBfPovG2j5nQ9wf7Ef6Km.png)](https://highlight.mirror.xyz/Zf3tcBxwTWkHTEQs%5FInoqpz8yejsucDKTef68wvrByg?ref=gorillasun.de) We'll know more about everything in December when things kick off. It's definitely an exciting time for being a generative artist, and equally as a digital art curator. ### R1B2's Circle of Life I've been a big fan of R1B2's ever since I came across The City, a collaboration between him and Laxraven on fxhash. R1B2 returns with their most recent project titled Circle of Life, releasing it on Alba just a few days ago: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-16.59.54.png) Originating from a single initial point, organic patterns start growing outwards colonizing the empty canvas until it is entirely covered. After a while older cells die and wither away, making room for a new cycle to repeat the process. This meditative and ephemeral characteristic of the little digital organisms is further amplified by the generative ambient drones that are also produced by the piece. I found it difficult to pull myself away from the screen once the artwork took its course. Due to popular demand, R1B2 made a write-up detailing some of the code that went into the making of the piece: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-16.56.11.png) [Making of “Circle Of Life” – R1B2![](https://www.r1b2.com/wp-content/uploads/2022/01/cropped-r1b2logo2-270x270.jpg)R1B2![](https://www.r1b2.com/wp-content/uploads/2023/11/ezgif-4-c48df4a512.gif)](https://www.r1b2.com/2023/11/25/making-of-circle-of-life/?ref=gorillasun.de) I'm humbled to have sparked the initial idea in R1B2, but he genuinely elevated the concept and took it in a different direction, especially in combination with the generative ambient music. I can only recommend taking a couple of minutes to watch the animation unfold. ### Operator on Human Unreadable by Le Random When I talked to Monk and asked him about who he thinks are some of the artists in the generative art space that are making transformative and meaningful work, he was quick to mention Operator with their mixed media project Human Unreadable that blends between blockchain tech and performance. The article is an absolute treat, Ania Catherine and Dejha Ti dive deep into the conceptual inspirations behind Human Unreadable: [Operator on Human UnreadablePeter Bauman (Monk Antony) explores an emerging conceptual shift in on-chain generative art, signaled by the postmodern generative choreography of Operator’s Human Unreadable. Monk then speaks to the duo about the historical influences of the 2023 Lumen Prize-winning project.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/6557d39af38c6d58f87bc4db_f31a982c1f2b8991ebdbf345b0d69615.png)](https://www.lerandom.art/editorial/operator-human-unreadable?ref=gorillasun.de) Here's also a link to the interview I did with Monk: [In conversation with Peter Bauman - Demystifying Monk AntonyPeter Bauman is one of the most prolific writers working at the intersection of generative art and Web3\. He’s the brain behind Le Random’s editorial section, and is responsible for building out a comprehensive timeline on genart history.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-09.46.46.png)](https://www.gorillasun.de/blog/in-conversation-with-peter-bauman-demystifying-monk-antony/) ## Weekly Web Finds ### JavaScript Naming Conventions are Important One thing that's always bothered me about Javascript is the language's use of camelCase as the de facto standard naming convention, when snake\_case is so much more readable in comparison (imo). [Yossi Kreinin makes a good argument against camelCase](https://yosefk.com/blog/ihatecamelcase.html?ref=gorillasun.de), not only reducing it to an issue of readability: > The annoying part of this is the *slowdown*. "Um, how should I spell this name?.." There are actual *capitalization trade-offs* here. Programming is almost exclusively about making decisions and choosing trade-offs. It's quite tiring, really. Nobody wants to be making some more pointless decisions on the way just for the fun of it. In a couple of my Javascript projects I've trying adopting snake case but I quickly reverted back to camelCase because it felt unnatural and out of place when interacting with other things in Javascript (like the DOM) that are natively camelCase. It also reminded me of my Python days, and how I spent many hours stuck in dependency hell wrestling with packages... But to actual resource I wanted to share, an article by Vladyslav Zubko where he addresses naming conventions in Javascript, enumerating some of the considerations when it comes to naming certain types of objects and functions: [JavaScript Naming Conventions are ImportantIt is no secret that developers have to ponder over numerous everyday tasks. Part of their thoughts…![](https://res.cloudinary.com/practicaldev/image/fetch/s--eWZ6RXEZ--/c_limit,f_png,fl_progressive,q_80,w_180/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j7kvp660rqzt99zui8e.png)DEV CommunityVladyslav Zubko![](https://res.cloudinary.com/practicaldev/image/fetch/s--W_trV-4p--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3xojtztw3irukh9b91rw.png)](https://dev.to/what1s1ove/javascript-naming-conventions-are-important-45n?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) A couple of the listed standards I knew, and a bunch of them were new. I'm generally a huge proponent of following your own naming convention when you're working on a personal projects; finding a system that makes sense to you can go such a long way in making the code more readable for your future self. I'm still in the process of figuring this one out. ### Ahmad Shadeed on CSS Nesting Following a previous appearnace on the Newsletter, Ahmad Shadeed returns with another stellar article on CSS, this time walking us through everything we need to know about CSS Nesting on the occasion of the feature becoming supported on all major browsers this year: [CSS NestingLearn about native CSS nesting with practical examples.![](https://ishadeed.com/assets/favicon-32x32.png)Photo of Ahmad ShadeedAhmad Shadeed![](https://ishadeed.com/assets/css-nesting/twitter-card.jpg)](https://ishadeed.com/article/css-nesting?ref=gorillasun.de) CSS Nesting essentially refers to the act of placing (nesting) one CSS class within another, which has a couple of cool effects and can in many cases make the stylesheet less convoluted. If you enjoyed this post, you should definitely also check out a previous post of his in which he documents the process of rebuilding the TechCrunch website's layout from scratch with modern CSS: [Case Study: Rebuilding TechCrunch layout with modern CSSRebuilding TechCrunch with modern CSS.![](https://ishadeed.com/assets/favicon-32x32.png)Photo of Ahmad ShadeedAhmad Shadeed![](https://ishadeed.com/assets/rebuild-techcrunch/twitter-card.jpg)](https://ishadeed.com/article/rebuilding-techcrunch-modern-css?ref=gorillasun.de) ### Understanding Git If you've ever wondered how git actually works, here's an article that explains what goes on behind the scenes: [Understanding Git: The history and internalsIf you’re a developer who has been putting off understanding how Git works under the hood, then this guide is for you. For those of us who get by with only knowing a few commands, Git can be a little mystifying:![](https://graphite.dev/favicon/apple-touch-icon.png)Kenneth DuMez![](https://www.datocms-assets.com/85246/1699565417-screen-shot-2023-08-17-at-8-40-16-am.png)](https://graphite.dev/blog/understanding-git?ref=gorillasun.de) What's more interesting, is that Linus Torvalds actually built git in the short span of 5 days back in 2005 following a licensing dispute with bitkeeper, the software that was used for version control at the time. It has since been discontinued in 2016\. The article links to another resource that covers the happenings leading up to the conception of git: [After controversy, Torvalds begins work on “git”Software project will help him manage Linux kernel![](https://idge.staticworld.net/ifw/IFW_logo_social_300x300.png)InfoWorldRobert McMillan![](https://idge.staticworld.net/ifw/IFW_logo_social_300x300.png)](https://www.infoworld.com/article/2669670/after-controversy--torvalds-begins-work-on--git-.html?ref=gorillasun.de#:~:text=week%20after%20a-,licensing%20dispute,-forced%20Torvalds%20to) > Torvalds was unsure how much of a disruption the new source code management system will represent for kernel developers. Torvalds has already put his kernel development work on hold for a week to work on git, but he said the real cost would be measured by how much the new software would slow down the numerous maintainers that contribute to the kernel. ## AI Corner ### Sam Altman returns as the CEO of OpenAI Following last weeks OpenAI drama in which the board of directors essentially fired Sam Altman, in what you could describe as a 'boardroom coup', things have come to somewhat of a conclusion with Sam Altman returning as OpenAIs CEO. This was due to Altman's good standing with the community and the other OpenAI employees, garnering a big backlash in response to the sudden change in management: [Sam Altman to return as CEO of OpenAIWhat a wild five days.![](https://www.theverge.com/icons/apple_touch_icon.png)The VergeNilay Patel and Alex Heath![](https://cdn.vox-cdn.com/thumbor/e1hDmaFnkTzTEgHgRI0xIDGut0E=/101x185:4515x3038/1200x628/filters:focal(1543x1247:1544x1248)/cdn.vox-cdn.com/uploads/chorus_asset/file/25096231/1778705449.jpg)](https://www.theverge.com/2023/11/22/23967223/sam-altman-returns-ceo-open-ai?ref=gorillasun.de) The verge claims that the human struggle of this entire issue is still not completely resolved and that investigations are still taking place to figure out exactly what led to these events. ### Github Copilot in the CLI Another exciting piece of new AI tech is Github's copilot for the terminal, where you can now simply type in the command that you need in natural language and let copilot make suggestions for shell and git commands: [GitHub Next | Copilot for CLIGitHub Next Project: Ever having trouble remembering that shell command or this obscure flag? Don’t worry: we’re building GitHub Copilot assistance right into your terminal![](https://github.githubassets.com/pinned-octocat.svg)GitHub Next![](https://githubnext.com/assets/images/og/project/copilot-cli.png)](https://githubnext.com/projects/copilot-cli?ref=gorillasun.de) You can learn more about it in the docs here: [About GitHub Copilot in the CLI - GitHub DocsGitHub Copilot in the CLI can help you by providing either command suggestions or explanations of given commands.![](https://docs.github.com/assets/cb-345/images/site/favicon.png)GitHub Docs![](https://github.githubassets.com/images/modules/open_graph/github-logo.png)](https://docs.github.com/en/copilot/github-copilot-in-the-cli/about-github-copilot-in-the-cli?ref=gorillasun.de) ## Gorilla Updates I've worked hard in the past week to make progress on my project for the fxhash launch, and I've had a couple of breakthrough with the hardest portions of the algorithm finally coming to a completion: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-26-at-17.53.42.png) In its current state the algorithm is a bit of a spaghetti mess (basically an absolute spaghetti mess). An initial hexagonal lattice is first turned into a connected graph and then broken up into random portions, which can be done with Prim's algorithm. I explored this in depth a couple of weeks ago. We essentially drop in the Prim algo at different tiles and let it run for a couple of iterations, creating a skeleton of sorts, a spanning tree essentially. The hardest part now is to find the contour of the group of hexagonal tiles that are covered by the skeleton, but there's a couple of neat properties in that regard that we can exploit to find the the vertices that lie at the boundary, then we can simply traverse these vertices to create the contour. And that's where I'm currently at, I still have roughly 8 days to bring the project to completion until the 4th of December, but I'm hoping to have it ready very soon. Might need to do a couple of sprints to get it in shape till then. Here's a couple more WIP posts that I quite enjoyed, one effect that I really like is applying a slight deformation to the hexagonal lattice giving it somewhat of a 3D look: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F_ppMKIXMAA9fgx.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F_oaz3eXgAA4zTR-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F_oYPfVXUAAml5T-2.jpg) Some WIPs, will be sharing a lot more over on Twitter in the coming days. **And that's it from me this week again, while I'm typing in these last words, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 31 URL: https://www.gorillasun.de/blog/gorilla-newsletter-31/ Last updated: 2023-11-20T10:38:35.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### p5.brush officially released I might have jumped the gun last week, as Alejandro hadn't made a proper announcement for the library yet - but it's official now: p5.brush is out for everyone to use and experiment with: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-18-at-13.35.02.png)](https://twitter.com/acamposuribe/status/1724759035809853567?ref=gorillasun.de) [Link to Tweet](https://twitter.com/acamposuribe/status/1724759035809853567?ref=gorillasun.de) | Check out the thread, Alejandro provides explanations and usage examples of all the things you can do with the library ### Ten Moments in South American Generative Art History Monk is back Bright Moments Buenos Aires with another stellar article for LeRandom. Presenting the poster he'd prepared for the IRL event in written form, the article recounts ten important moments in south American generative art history. From the creation of the Pintura Generativa group by pioneers in 1959, up until the inception of HEN in 2021, south American minds have had a profound impact on the evolution of generative art: [Ten Moments in South American Generative Art HistoryAfter consulting with artists and contacts, Le Random’s Peter Bauman (Monk Antony) compiled a poster for Bright Moments Buenos Aires, designed by Qian of Bright Moments. The poster memorializes these ten moments in South American generative art history. The moments can also be found in a permanent s…![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/6554c9612d94b4af03488a13_concret-a4-1948.jpg!Large.jpg)](https://www.lerandom.art/editorial/ten-moments-in-south-american-generative-art-history?ref=gorillasun.de) Besides this, the Timeline has also been steadily growing with new moments frequently being added: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-08.49.40.png)](https://twitter.com/MonkAntony%5Ftez/status/1725216462753726744?ref=gorillasun.de) [Link to Tweet](https://twitter.com/MonkAntony%5Ftez/status/1725216462753726744?ref=gorillasun.de) You should also check out Monk's TwitterX profile, it's been a treasure trove for generative art content (duh), and I always discover some new things when I check in - one of them is a digitized version of Cara McCarty's book *Information Art: Diagramming Microchips 1990 -* published by the Museum of Modern art, it'sa catalogue showcasing the diagrams for different kinds of microchips, highlighting the emerging artful patterns: [Information art : diagramming microchips 1990 — Are.naInformation art : diagramming microchips (1990) Exhibition Catalog![](https://d2hp0ptr16qg89.cloudfront.net/assets/127302a/arena-mark.svg)![](https://images.are.na/eyJidWNrZXQiOiJhcmVuYV9pbWFnZXMiLCJrZXkiOiIxNjM1NTA4My9vcmlnaW5hbF8wZGEyNWJkMDFlY2Q1Nzg1YzM3MWI2NjM0N2ZjNjc4Zi5wbmciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjEyMDAsImhlaWdodCI6MTIwMCwiZml0IjoiaW5zaWRlIiwid2l0aG91dEVubGFyZ2VtZW50Ijp0cnVlfSwid2VicCI6eyJxdWFsaXR5Ijo5MH0sImpwZWciOnsicXVhbGl0eSI6OTB9LCJyb3RhdGUiOm51bGx9fQ==?bc=0)](https://www.are.na/block/16355083?ref=gorillasun.de) ### Herbert W. Franke's Digitized Archive The Herbert W. Franke Foundation honors his life's work by releasing a complete archive of his non-fiction manuscripts in digitized format: [Herbert W. Franke | ZKMThe »Herbert W. Franke Archive« at the ZKM | Karlsruhe collects documents and records from over 60 years of scientific and artistic activity.![](https://zkm.de/sites/all/themes/r17/images/zkm_icon_152x152.png)ZKM![](https://zkm.de/sites/default/files/bild/franke_digital-einstein_1973.jpg)](https://zkm.de/en/herbert-w-franke?ref=gorillasun.de) Note: the manuscripts are mainly in German. [The entire archive can be found here.](https://portal.daten.zkm.de/archive/herbert%5Fw%5Ffranke/manuskripte?page=7&ref=gorillasun.de) The breadth of topics that Herbert W. Franke wrote about is astounding, ranging from philosophical text about computation and speculative texts about the future of technology, to technical books about computer graphics, as well as other science topics like cave exploration. Truly a brilliant mind - RIP Herbert W. Franke. Besides this, there was also an announcement that a generative art history conference is in the works for May 2024 - if you're in Berlin or nearby at the time you might want to keep this one in mind: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-09.09.23.png)](https://twitter.com/postanika/status/1726009843863986625?ref=gorillasun.de) [Link to Tweet](https://twitter.com/postanika/status/1726009843863986625?ref=gorillasun.de) Whether you're familiar with Herbert W. Franke's work or not, you might also want to check out this long thread by SuzanneNFT in which she recounts some of the important events and moments of Herbert W. Franke's lifetime: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-09.22.39.png) [Link to Thread](https://twitter.com/nf%5Fsuzanne/status/1725896331108270369?ref=gorillasun.de) ### Olga Fradina's Naïve on Art Blocks Curated One notable project of the past week was [Olga](https://twitter.com/Olga%5Ff2727?ref=gorillasun.de)'s generative art debut *Naïve*, releasing straight out of the gate as an Art Blocks curated project. Just as beautiful as the piece itself, I found Olga's story fascinating, from working on newspapers in the 90s, to starting a career in interior design, Olga's always had a deep love for technology and digital art. After discovering NFTs in 2021 she immediately fell in love with the concept, and felt that it could be a good way to realize herself as a digital artist. This was however also when Russia began their attacks on Ukraine - Olga pushed through this difficult time by dedicating herself to making art. Generative art and NFTs having become two inseparable concepts in recent years, it wasn't long before Olga also explored that avenue further. After feeling initially intimidated, it wasn't long before she tried her hand at making her own generative art. This leads us to the present day with her releasing Naïve - in an interview with Art Blocks she recounts her entire story: [Spectrum: In Conversation with Olga Fradina on Naïve | Art BlocksRead the latest Spectrum interview with generative artist Olga Fradina. In this conversation, we hear more about her project, Naïve, her artistic practice, and the discovery of the blockchain as an artistic medium.![](https://assets-global.website-files.com/62fe95d11738cfa39c3573b0/634ed02d05e56b505a01497f_favicon.png)Art Blocks![](https://assets-global.website-files.com/62fe95d11738cf95c53573dd/655627c94e843dcb62e44b82_Olga%20Fradina_header.png)](https://www.artblocks.io/info/spectrum/in-conversation-with-olga-fradina-on-naive?ref=gorillasun.de) One sentence in the interview resonated deeply with me: > Now I’m in this great period of time where you can “play outside the rules,” act emotionally and intuitively, and sometimes make quite bold decisions. It reminds me of those first days when I had just started exploring creative coding and generative art for myself - explorations were accompanied by a certain lightness, I was just playing for the sake of playing and having a blast while doing so. Many of the ideas that I had in those early days, still drive the art that I make today and are in a constant state of evolution. ![Image](https://pbs.twimg.com/media/F_JZZ9xWkAEc8TI?format=jpg&name=large) If you want to learn a little more about Naïve, Olga also published a thread over on TwitterX, recounting the different phases her generative artwork went through: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-01.01.43.png) [Link to Thread](https://twitter.com/Olga%5Ff2727/status/1725540138069975202?ref=gorillasun.de) ### RCS on +GRAPH Naturally the weekly roundup of generative art news wouldn't be complete with RCS' journalistic endeavors, shedding light on the artists behind Feral File's +GRAPH plotterized group show and voicing their thoughts in this interview: [The Power of the PlotterFeral File’s new exhibition, +GRAPH, celebrates the art of generative drawing![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Jason Bailey![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/6553635168f20440ddb84ca3_Screenshot%202023-11-14%20at%2012.08.33.png)](https://www.rightclicksave.com/article/the-power-of-the-plotter-generative-art-aleksandra-jovanic-julien-gachadoat-feral-file-graph-interview?ref=gorillasun.de) One important notion that's tackled throughout is the relationship between artwork and complexity of the code - one of the most valuable lessons I learned early on in the game was that interesting code-art doesn't necessarily require highly complex code. Aleksandra Jovanic puts it succinctly: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-09.49.32.png) Although my personal toolbox is ever expanding as time goes on, the core component of every new idea is usually only a few lines of code that try to do something differently while building on top of the previous code. ### DEVSPOETICS on Mark Webster's Cosmic Poems Another project that I completely missed in the past weeks was Mark Webster's Cosmic Poems. It was brought to my attention through an awesome thread by [DEVSPOETICS](https://twitter.com/deuspoeticus?ref=gorillasun.de) who wrote beautifully about it placing it in juxtaposition with other pieces of concrete poetry: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-09.58.49.png)](https://twitter.com/deuspoeticus/status/1720873152874439016?ref=gorillasun.de) [Link to Tweet](https://twitter.com/deuspoeticus/status/1720873152874439016?ref=gorillasun.de) ## Weekly Web Finds And here's your weekly mixed bag of interesting content I've found on the internet ### Art is a Two-Way Street Lux, an accomplished pixel artist, writes about how art making has become less and less of an individual experience in the advent of modern social media, and explains the impact that it's had on the dynamic between the artist and their audience: [Art is a Two-Way StreetArt can be a private experience, but, now more than ever, it rarely is. Art witnessed only by its creator effects no change except in how it makes the artist feel in creating or viewing it. Others cannot be inspired by it. No matter their preferences, the viewer cannot learn![](https://pixelparmesan.com/content/images/size/w256h256/2020/07/android-chrome-256x256.png)Pixel ParmesanLux![](https://pixelparmesan.com/content/images/2023/09/pizza_2x_twitter_card_large.png)](https://pixelparmesan.com/art-is-a-two-way-street/?ref=gorillasun.de) Sometimes it's difficult to grapple with the public's perception of your creations, especially when it doesn't align with your own thoughts - but as an artist you have to keep in mind that your art doesn't exist in isolation, it's an on-going discourse that you're having with your audience and other artists: > Have consideration for those that engage with your work, or don't, but art is a two-way street; it's a dialogue between the creator, the consumers, and other artists alike. What you choose to release, and subsequently how you choose to maintain and engage with that work over time is as much a part of your offering as the work itself. Here's another equally interesting article of theirs back from February of this year that I think is another important read for all the artists here: [Cartridge Mindset: Just Do it Right the First TimeThe expectation that the content we consume is final and unchanging has been undermined for some time now—it’s not out of the ordinary to notice the album art for a song on Spotify has changed, or even that parts of the song itself have been modified. The succession of![](https://pixelparmesan.com/content/images/size/w256h256/2020/07/android-chrome-256x256.png)Pixel ParmesanLux![](https://pixelparmesan.com/content/images/2023/02/pizza_2x_twitter_card_large.png)](https://pixelparmesan.com/cartridge-mindset/?ref=gorillasun.de) ### A coder considers the waning days of the Craft I thought I would be in for a juicy doomer essay on "The waning days of the craft" but I have to honestly say I was a bit disappointed. The article is unnecessarily long, and ultimately points out how AI is going to render programming as a craft obsolete, although it doesn't provide any concrete examples other than anecdotes of AI being use to solve some rather simple tasks: [A Coder Considers the Waning Days of the CraftCoding has always felt to me like an endlessly deep and rich domain. Now I find myself wanting to write a eulogy for it.![](https://www.newyorker.com/verso/static/the-new-yorker/assets/favicon.ico)The New YorkerCondé Nast![](https://media.newyorker.com/photos/654bf23c9d37df3d9f9cd353/16:9/w_1280,c_limit/231120_r43375.jpg)](https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) I just don't see it. I don't really see how LLMs will replace professional devs and programmers anytime in the near future. Writing code, in any setting, is not just about writing code, there's so many human aspects to it that AI models are still terrible at. Even for the purpose of writing I feel that they're not really that great - in the time and effort it'd take me to craft a sharp prompt that will get me the result I want, I could have probably written the result myself. Do I think they're amazing coding/writing assistants? Yes, definitely, and I've incorporated LLMs to some extent in my own practice, whenever I know that I'm looking up something that is general and objective enough that an LLM most likely has an internal representation of it, I will always consult the smart chatbots before falling back to traditional internet search. The thing I will agree with in the article, is that also I believe that AI tools will have a profound impact on the next generation of programmers - acting both as a catalyst for those who in the process of learning, and as a coding assistant that will greatly boost programmer's productivity. ### 67 Weird Browser Debugging Tricks Most of my programming these days is geared for the web, but I rarely use all of the tools that modern browsers provide to debug web projects - in part this is due to the frightening UI of the dev tools. Although I've slowly been getting more comfortable with the debugger, this article points out many things that I didn't know before: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-11.13.31.png)](https://alan.norbauer.com/articles/browser-debugging-tricks?ref=gorillasun.de) [Link to Article](https://alan.norbauer.com/articles/browser-debugging-tricks?ref=gorillasun.de) ### URL Fundamentals Explained Have you ever wondered what the difference between a URL, URI, URN, and URC is? Well, you can now put an end to the uncertainty with this article: [URL explained - The FundamentalsIn this post, I’ll try to explain the syntax and use of an URL and the difference between URI, URL, URN, and URC. URL explained # This will be our example for this post: https://username:password@www![](https://ittavern.com/favicon.ico)ITTavern.comwop![](https://ittavern.com/images/previewimages/ittavern.png)](https://ittavern.com/url-explained-the-fundamentals?ref=gorillasun.de) Besides explaining the differences it also explains the structure of a URL and the different parts it's made out of. ### HTML First HTML first is a set of principles aimed at "substantially widening the pool of people who can work on web software codebases**"** \- written by Tony Ennis it sets in place a couple of guidelines for writing good HTML and leveraging some of it's capabilities tobuild web software: [HTML FirstPrinciples to make building web software easier, faster and more inclusive.![](https://html-first.com/apple-touch-icon.png)![](https://image.thum.io/get/width/1200/crop/630/https://html-first.com/og-image?t=1)](https://html-first.com/?ref=gorillasun.de) Tony Ennis has written a couple of other interesting posts as well: [Comparing the learning curve of tag-based markup languages with javascript | Tonyennis.com![](https://tonyennis.com/apple-touch-icon.png)Tonyennis.com![](https://image.thum.io/get/width/1200/crop/630/http://new.tonyennis.com/og-image/M3WoiPA5P-comparing-the-learning-curve-of-tag-based-markup-languages-with-javascript)](https://tonyennis.com/blog/M3WoiPA5P-comparing-the-readability-and-learning-curve-of-html?ref=gorillasun.de) ## AI Corner ### Sam Altman fired from OpenAI *If you haven't seen it yet, here's a recap of the entire OpenAI drama that happened over the past weekend.* In a seemingly surprising turn of events, the OpenAI's CEO Sam Altman has been let go this past Friday. OpenAI later published a statement on their official site, in which they try to explain the vague reasons for the decision: > Mr. Altman’s departure follows a deliberative review process by the board, which concluded that he was not consistently candid in his communications with the board, hindering its ability to exercise its responsibilities. The board no longer has confidence in his ability to continue leading OpenAI. You can read the statement here: [OpenAI announces leadership transitionChief technology officer Mira Murati appointed interim CEO to lead OpenAI; Sam Altman departs the company. Search process underway to identify permanent successor.![](https://openai.com/favicon.ico)![](https://images.openai.com/blob/9eb94b23-a383-4771-884f-cc1d88e296bd/brand-guidelines.png?trim=0%2C0%2C0%2C0&width=1000&quality=80)](https://openai.com/blog/openai-announces-leadership-transition?ref=gorillasun.de) Sam Altman posted the following in response to him being let go on such a sudden notice: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-18-at-13.30.35.png) [Link to Tweet](https://twitter.com/sama/status/1725631621511184771?ref=gorillasun.de) Greg Brockman, now fromer President of OpenAI, was also taken aback by this sudden unceremonious decision from the board of directors, promptly and deliberately resigning from his position: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-18-at-13.29.07.png) Greg Brockman later provided a precise recount of the events: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-18-at-13.31.16.png)](https://twitter.com/gdb/status/1725736242137182594?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gdb/status/1725736242137182594?ref=gorillasun.de) This was far from the being the end of it however. After Brockman's subsequent resignation, with string of other resignations from other employees in the aftermath, and with talks about starting their own company, the board of directions began negotiations around bringing back Altman as the CEO. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-20-at-11.34.42.png)](https://www.theverge.com/2023/11/19/23968162/its-the-endgame-for-sam-altmans-potential-return-to-openai?ref=gorillasun.de) [Link to Page](https://www.theverge.com/2023/11/19/23968162/its-the-endgame-for-sam-altmans-potential-return-to-openai?ref=gorillasun.de) If you'd like to read more about this, the Verge covered the happenings of the situation in real time over the course of the weekend: [Sam Altman fired as CEO of OpenAIMira Murati will be the interim CEO.![](https://www.theverge.com/icons/apple_touch_icon.png)The VergeJay Peters and Alex Heath![](https://cdn.vox-cdn.com/thumbor/Kk7ZxepdJyIYSFFpuog__0Ihce8=/0x0:8256x5504/1200x628/filters:focal(4128x2752:4129x2753)/cdn.vox-cdn.com/uploads/chorus_asset/file/25065879/Sam_Altman_keynote_OpenAI_DevDay.jpg)](https://www.theverge.com/2023/11/17/23965982/openai-ceo-sam-altman-fired?ref=gorillasun.de) [OpenAI board in discussions with Sam Altman to return as CEOAltman is “ambivalent” and wants governance changes.![](https://www.theverge.com/icons/apple_touch_icon.png)The VergeAlex Heath and Nilay Patel![](https://cdn.vox-cdn.com/thumbor/0WsTyokb2oPJLLBJL9iuCTHZCdw=/0x0:4607x3097/1200x628/filters:focal(1954x1188:1955x1189)/cdn.vox-cdn.com/uploads/chorus_asset/file/25095378/1797579060.jpg)](https://www.theverge.com/2023/11/18/23967199/breaking-openai-board-in-discussions-with-sam-altman-to-return-as-ceo?ref=gorillasun.de) ### Lyria Releases Despite the drama there has also been a new announcement that I think many a music maker will find super exciting - last Google's Deep Mind released their new Lyria model, what they describe as the world's 'most sophisticated' music generation system to date. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-19-at-23.12.22.png) [Link to Tweet](https://twitter.com/demishassabis/status/1725058847943876900?ref=gorillasun.de) I've explored a couple of music generation models a couple of weeks ago, but they still seemed quite lacking in comparison to the image generators - but Lyria seems like a massive step up in that regard from what is shown in the demo videos - you can read about all the new things in this official post: [Transforming the future of music creationAnnouncing our most advanced music generation model and two new AI experiments, designed to open a new playground for creativity![](https://deepmind.google/static/icons/google_deepmind_48dp.5b470587fe7d.svg)Google DeepMind![](https://lh3.googleusercontent.com/msr-Fc99rrkeoQkZ6rLTKnof3RTqo5oo9D2_xPyqtpp0mAMqqkn-x3mPy2dD0My1g7w-cysBQzHU_iWF4mlblU4EgQRcMNKoBUgPdmdmEoyekFJEnA=w1200-h630-n-nu)](https://deepmind.google/discover/blog/transforming-the-future-of-music-creation/?ref=gorillasun.de) Deep Mind is also partnering with Youtube, giving some Youtubers the chance to take Lyria for a test drive with the Dream Track tool that they bring up in the post. Dream Track can generate 30 second long clips of music from an input prompt, primarily for the purpose of accompanying Youtube Shorts. I'm excited to see how this will turn out. ### ## WIPs for the fx(hash) 2.0 Kumaleon Curation I'm happy to announce that I'll be part of the Kumaleon x Okazz curation that partnering with fx(hash) for the 2.0 launch. After the awesome experience I had with lovely Proof of X folks over in Japan, and at the same time being a huge fan of Okazz's work, it simply was a no-brainer to quickly send in my application for their open call that popped up on my timeline a couple of weeks ago. I'm super stoked! [![Image](https://pbs.twimg.com/media/F_Tfw8eaYAA_9K8?format=jpg&name=4096x4096)](https://twitter.com/KUMALEON%5F/status/1726252494878331264?ref=gorillasun.de) [Link to Announcement](https://twitter.com/KUMALEON%5F/status/1726252494878331264?ref=gorillasun.de) The theme of the curation this time around is 'Colorful', although it was a bit of a short notice, I've already turned on the heat for the idea cooker: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-19-at-22.28.06.png) [Link to Tweet](https://twitter.com/gorillasu/status/1725914055716536781?ref=gorillasun.de) Although the idea's simply a hexagonal lattice, with some further subdivisions, the Twitter numbers indicate that folks were really into it! Hexagons are inherently really beautiful shapes that can quickly convey a shifting isometric perspective when divided into 3 equal rhombus shapes. And the last time that I released something that incorporated hexagonal shapes was my Crayon Codes project 'Behind the Canvas' back in February of 2022. Plan's to keep it lighthearted and colorful, but I still have to think about ways to make the individual tiles geometrically more interesting. One idea was connecting two tiles that are some distance away from each other, which proved to be quite tricky - here's an early attempt: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/img-129-.png) A different playful palette. The occasional boxes/lines that you can see in the WIP above were simply for debugging purposes, with the purpose of connecting two hexagons and creating larger, diamond shaped polygons - however, after implementing the code for that idea I'm not entirely certain if it is actually more interesting than the initial output: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/img-130-.png) Connecting hexagons to create diamond like shapes. Conceptually I think it's cool, but at the same time it feels emptier than the previous one. The diamond shapes felt a bit repetitive after a while, making me wonder if I could fit other polygonal shapes on such a grid (throwback to my irregular grid idea), which led me down another deep rabbit hole: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/img-131-.png) Rather than using a hexagonal lattice, a grid of triangles makes much more sense and makes it possible to pack all sorts of isometric kinds of boxes. The code for this ended up being quite gnarly, and took a rough 6 hours of coding to figure out to put together (I'm a bit rusty okay?) but I think there's a lot of potential here. This one's probably going to be an exploration for a later date however. Happy to have a working prototype already though. I'll be sharing a lot more in the coming days - keep an eye out on TwitterX! ## Music for Coding If the word 'retro-futurism' had a physical manifestation it would be Neon Nox's music. Whether you're going for a late night cruise, doing a night-time coding session, or a vigilante on a mission to avenge your family - this is the perfect soundtrack to it: Neon Nox is a Swedish synthwave producer who takes a lot his musical inspiration from ’80s films, TV shows and video games. > Jon “Neon” Nox is a fictional character that is based on Gerry Conway’s comic character Punisher, I always liked the idea of a vigilante who has nothing to lose and is in a search for a killer who murdered his family. I really like idea of having an alter ego that can create stories connected to music. You can learn more about the artist behind Neon Nox in this interview by Synthian: [Synthian | Retro’s Not Dead: In conversation with synthwave master Neon Nox![](https://synthian.net/wp-content/uploads/2020/09/s.png)Retro’s Not Dead: In conversation with synthwave master Neon Noxadmin![](https://synthian.net/wp-content/uploads/2023/11/Press-photo-3-33%C2%A9-Fabienne-Zahnd-52x52.jpg)](https://synthian.net/2018/10/10/retros-not-dead-in-conversation-with-synthwave-master-neon-nox/?ref=gorillasun.de) **And that's it from me this week again, while I'm typing in these last words to some of these tunes, I bid my farewells — hopefully this caught you up a little with the events in the world of generative art, tech and AI throughout the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously \- it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 30 URL: https://www.gorillasun.de/blog/gorilla-newsletter-30/ Last updated: 2023-11-13T11:17:06.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### Hachures by Matt DesLauriers Matt DesLauriers masterfully combines pen plotters and erosion algorithms to create stunning and scribbly topographic maps in his most recent piece titled *Hachures*: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-07.55.06.png)](https://twitter.com/miminguyenmimi/status/1717847992059711596?ref=gorillasun.de) [Link to Tweet](https://twitter.com/miminguyenmimi/status/1717847992059711596?ref=gorillasun.de) Hachures was one of the pieces presented at Paris Photo 2023, as a part of the "*In Conversation With"* curation by Mimi Nguyen - an overview of the other projects can be found here: [In Conversation With | VerseShowcased within the digital sector of the Paris Photo 2023 art fair, NGUYEN WAHED presents In Conversation With, a group exhibition that traces the evolution o![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2Faf2ad97f-e6f7-41f3-942c-6f8d856fcdf0.jpeg@jpeg)](https://verse.works/exhibitions/in-conversation-with?ref=gorillasun.de) I'm a huge fan of Matt DesLaurier's work and incredibly inspired by his approach to generative art in general, hence I was delighted to see a short 'Verse Meets' in which he explains how *Hachures* came to be, how working with plotters is at the same time limiting but also creatively liberating, and his fascination with generative topography: Terrain generation is a fascinating branch of computer graphics, and ever since I did my deep dive into Nat Sarkissian's generative artwork 'Eucalyptus and Sagebrush' it's been something that I've wanted to revisit and explore for myself, but I never really got back around to it: [Nat Sarkissian’s Eucalyptus and SagebrushIn this post we’ll have a closer look at Nat Sarkissian’s generative FxHash token: Eucalyptus and Sagebrush. The token seamlessly bridges between visually stunning graphics and an intricate terrain generation algorithm. Additionally there’s a lot to learn on simulating brush strokes algorithmically![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/eucalyptusandsagebrush-1.jpg)](https://www.gorillasun.de/blog/eucalyptus-and-sagebrush/) and the simulation of natural processes for the creation of topographically realistic landscapes is . What's even more impressive is the algorithmic process behind this piece ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.18.06.png) ### A library for generative brush strokes You might know Alessandro as the creator of [Pensado a Mano](https://www.fxhash.xyz/generative/slug/pensado-a-mano-1?ref=gorillasun.de), one of the very first manually *code driven* fx(hash) projects. Over the last week he's posted regular updates on a library that he's been working on: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.37.27.png)](https://twitter.com/acamposuribe/status/1722606744881525090?ref=gorillasun.de) [Link to Tweet](https://twitter.com/acamposuribe/status/1722606744881525090?ref=gorillasun.de) Simulating water colors was one of the first things that I experimented with when I got into generative art, which might be a good point to re-share the by now legendary Tyler Hobbs article on the topic: [A Guide to Simulating Watercolor Paint with Generative Art — Tyler HobbsA simple, generative approach to designing an algorithm that captures the messiness and character of watercolor paints. This post utilizes Processing, but any basic graphics tools will suffice.![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Tyler HobbsA Guide to Simulating Watercolor Paint with Generative Art![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/t/5ebd679dd1251c68e8ef77cf/1589471151718/linear-2000.png?format=1500w)](https://tylerxhobbs.com/essays/2017/a-generative-approach-to-simulating-watercolor-paints?ref=gorillasun.de) And it seems that the library is already in shape and ready to be used: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-08.11.38.png)](https://twitter.com/acamposuribe/status/1723747872879915362?ref=gorillasun.de) [Link to Tweet](https://twitter.com/acamposuribe/status/1723747872879915362?ref=gorillasun.de) You'll probably want to check in with Alejandro later on details about the library, but the repo is already up here: [GitHub - acamposuribe/p5.brush: p5 custom brushes libraryp5 custom brushes library. Contribute to acamposuribe/p5.brush development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubacamposuribe![](https://opengraph.githubassets.com/8a9ef05f10ada46a45cba9ffcd82c018e78fa9e3fb470157b0521e6f62a224c6/acamposuribe/p5.brush)](https://github.com/acamposuribe/p5.brush?ref=gorillasun.de) With a companion website that details its usage here: [\*p5.brush - Brush that canvas!Cargo![](https://static.cargo.site/favicon/c3-favicon.ico)Brush that canvas!![](https://freight.cargo.site/w/1000/i/E1480373808014545875016115918775/screenshot-1105631247.jpg)](https://p5-brush.cargo.site/?ref=gorillasun.de) And while we're talking about vritual brush strokes - I also have to share Juhani's exploration in that regard: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-09.06.31.png)](https://twitter.com/JuhaniHalkomaki/status/1723815809854673195?ref=gorillasun.de) [Link to Tweet](https://twitter.com/JuhaniHalkomaki/status/1723815809854673195?ref=gorillasun.de) It seems that Juhani is only capable of putting out one banger after another. ### Alba is Launching The ETH based generative art platform is back, and after a long summer full of curated projects they are now ready a proper launch opening up the platform for all artists to mint their works: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-09.08.03-1-1.png)](https://twitter.com/AlbaDotArt/status/1722924999164518504?ref=gorillasun.de) Check out their announcement post in which they detail some of the improvements that have been implemented since the beta group shows | [Link to Tweet](https://twitter.com/AlbaDotArt/status/1722924999164518504?ref=gorillasun.de) > We’ve addressed numerous UX issues brought up in the beta, and we’ve added pre-built starter templates for working with the most popular libraries and languages. We’re just getting started here, so expect a lot more improvements soon. Exciting times for generative artists! This said I'd like to shamelessly plug my own work on Alba 'The Great Traversal' - it's still got some remaining unsold editions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/29d510ce-a7bf-491d-9899-9eb4569d4714-0x539bf52af03501a8c127e9f03f097f607ab913b4d73c961ff4ab3492ad4bb134.webp)](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) [The Great Traversal on Alba](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) [Alba - The Great TraversalIs our path in life predetermined or are we the masters of our own fate? The great traversal combines point distributions and curved paths to bring to life interesting interwoven compositions. The traversers make their way through the canvas based on a simple principle - at every position the close…![](https://www.alba.art/apple-touch-icon.png)The Great Traversal![](https://alba-preview-images.s3.eu-west-1.amazonaws.com/29d510ce-a7bf-491d-9899-9eb4569d4714-0x539bf52af03501a8c127e9f03f097f607ab913b4d73c961ff4ab3492ad4bb134.png)](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) ### Genuary 2024 And to wrap up, here's a quick intermission by Piter Pasma - Genuary 2024 is knocking on the doors: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.03.13.png) I am in no way, shape, or form ready for it :) ## Pen and Plottery At the intersection of generative art and physical media - I'm not entirely certain if this section will have a permanent spot on the newsletter in the future, but on some weeks I simply come across a lot of plotter based projects, as well as works that aim to do something generative that goes beyond the digital canvas. I like to be creative with my titles, and here the title of this section "Pen and Plottery" is inspired the 2012 indie game title "Sword and Sworcery" - and for some reason I've been thinking about this game a lot: [Five years of Sword & Sworcery: the history of a weird and beautiful gameFive years ago, Craig D. Adams was riding a Toronto streetcar home after a long day at work, when he looked up from his phone and was confused about where he was. That evening, Adams — an artist…![](https://cdn.vox-cdn.com/images/verge/2.0/verge-icon-196x196.v503bbf1f91b9b655a6b9bb5bd0c3c9efff02826a.png)The VergeAndrew Webster![](https://cdn.vox-cdn.com/thumbor/19pnsufwFSHgCKEaS8y29HDIGkw=/0x192:1024x768/1600x900/cdn.vox-cdn.com/uploads/chorus_image/image/49155637/SSnSEP_0020-1.0.0.png)](https://www.theverge.com/2016/3/24/11297534/superbrothers-sword-and-sworcery-retrospective?ref=gorillasun.de) I never finished the game actually, but it's deeply carved into my memory - it was the very first indie title that I played that didn't try to adhere to regular video game mechanics, but much rather aimed to be a piece of art. It won numerous awards when it came out: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-09.56.24.png) Maybe one day when I'm not stretched as thin as these days I'll write some more about indie games, and maybe even have time to play some more. But anyway, onto the actual things I wanted to showcase here! ### Fictional Lullaby - A dev story by Licia He Licia He wrote a thread about her most recent generative project Fictional Lullaby that will release with +GRAPH, Feral File's throwback to their first GRAPH group show: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-17.58.00.png)](https://twitter.com/Licia%5FHe/status/1723690404409663594?ref=gorillasun.de) Link to Thread The thread is accompanied by a much more in depth write-up over on her website in which she captures the entire process and inspirations behind the piece - the article is profoundly insightful and a must read: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.00.17.png)](https://www.eyesofpanda.com/project/fictional%5Flullaby/?ref=gorillasun.de#intro) Write-up for Fictional Lullaby What's more is that many of the examples in the article are generative, meaning that you can refresh them by means of a button click and generate different variations for them. It was a lot of fun exploring the page with these interactive examples! ### Plotter Stop Motion Jamese Merill, another artist participating featured in +GRAPH, and the creator of the stellar tokens ORI and Runaway has making some really cool stop motion plotter animations: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-12.08.19.png)](https://twitter.com/toThePixel/status/1721878920352432197?ref=gorillasun.de) [Link to Tweet](https://twitter.com/toThePixel/status/1721878920352432197?ref=gorillasun.de) I only tried my hand at stop motion once, and I can tell you that it is a lot of work! James makes it look so easy: 0:00 /0:15 1× ### The Chromatic Typewriter by Tyree Callahan The Chromatic Typewriter is as the name suggests an invention that turns a typewriter into water painting machine: [The Chromatic Typewriter by Tyree Callahan - HomeliThe thought of fusing typewriters with paint first came to Tyree Callahan while he was putting the finishing touches on a watercolour painting. He decided to feed this watercolour through an old Olivetti typewriter in…![](https://homeli.co.uk/favicon.ico)HomeliHomeli![](https://homeli.co.uk/wp-content/uploads/2014/06/The-Chromatic-Typewriter-by-Tyree-Callahan.jpg)](https://homeli.co.uk/the-chromatic-typewriter-by-tyree-callahan/?ref=gorillasun.de) > The thought of fusing typewriters with paint first came to Tyree Callahan while he was putting the finishing touches on a watercolour painting. He decided to feed this watercolour through an old Olivetti typewriter in order to add text through the painting, and this action suddenly inspired him to transform a 1937 Underwood Standard typewriter into The Chromatic Typewriter. Although maybe not the most practical device to create waterpaintings, it is still a very interesting concept, repurposing the typewriter for a different artistic goal. ### On/Off Screen by Vertical Crypto Vertical Crypto presents their upcoming group show; running from the 17th to the 22nd of November in the heart of London they're featuring 6 stellar generative artists: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.08.01.png) Presenting a mix of artworks displayed via digital and physical mediums, the aim is to highlight the interplay between the two and how they complement each other. ### Spacefiller Quilts Just as I sent out the newsletter last week, I came across a tweet by Spacefiller, announcing that they were working on generative quilts for their shop: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-06.58.15.png)](https://twitter.com/spacefillerart/status/1721240451418931289?ref=gorillasun.de) [Link to Tweet](https://twitter.com/spacefillerart/status/1721240451418931289?ref=gorillasun.de) Spacefiller is a duo from Seattle that've cemented themselves in the generative art scene with their distinct style, creating insane physics based plant growth simulations: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-07.03.44.png)](https://spacefiller.space/livingwall/?ref=gorillasun.de) [Link to Page](https://spacefiller.space/livingwall/?ref=gorillasun.de) You might want to check out their work for a whole lot of inspiration. ## Weekly Web Finds ### Shaders in CSS Cheng Lou operates at "the intersection of art and bad performance" with this whacky github repo that he put out into the world: [GitHub - chenglou/pure-css-shaders-art: At the intersection of art and bad performanceAt the intersection of art and bad performance. Contribute to chenglou/pure-css-shaders-art development by creating an account on GitHub.![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubchenglou![](https://opengraph.githubassets.com/dd80b47eab3f7c02fc5f583a06d2330c0bd724875eed11528776f7d4a9058e86/chenglou/pure-css-shaders-art)](https://github.com/chenglou/pure-css-shaders-art?ref=gorillasun.de) Yes, you read that right - CSS Shaders. By nesting a grid of HTML

tags within an SVG disguised as an img, these CSS "shaders" then basically enable animated graphics within a github README: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-07.13.52.png) A game-changer in the github README meta, you'll most likely want to give it a try. ### Tailswind CSS: It looks Awful, and it Works Adam Watham, the creator of Tailwind CSS recently gave a humorous talk at Railsworld (the biggest Ruby on rails conference) about his brainchild: After presenting a disgusting piece of HTML code littered with with representational tailwind classes, he makes the case that Tailwind is not as bad as it looks - he does so via an insightful live coding session. ### Why Cities: Skylines 2 performs poorly A deep dive into why the city building sim game Cities: Skylines 2 performs poorly. And when I say deep, I mean deep. Paavo really doesn't cut the game any slack and dissects it thoroughly unveiling all the inefficiencies that cause the poor performance - for instance the teeth controversy: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-09.50.27-1.png) Apparently the game renders fully modeled teeth of every character in the game (it's a city sim so there's thousands of them at any given time) at any given moment. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-09.53.24.png)](https://www.reddit.com/r/CitiesSkylines/comments/17gfq13/the%5Fgame%5Fdoes%5Frender%5Findividual%5Fteeth%5Fwith%5Fno%5Flod/?ref=gorillasun.de) [Link to Thread](https://www.reddit.com/r/CitiesSkylines/comments/17gfq13/the%5Fgame%5Fdoes%5Frender%5Findividual%5Fteeth%5Fwith%5Fno%5Flod/?ref=gorillasun.de) There's been numerous threads on reddit about it as well. It's an interesting read and an interesting deep dive, to me at least. ### Kurt Vonnegut's 8 Rules for Writing I'm not a fiction writer, but I've done a decent amount of writing over the past 3 years and I'll take every piece of advice that I can get on the topic, even if it doesn't directly apply. I came across Kurt Vonnegut's 8 rules for writing which I found profoundly interesting, as they're not immediately obvious ones: [Kurt Vonnegut’s 8 Rules for Writing – for the Playwright – London Playwrights![](https://londonplaywrightsblog.com/wp-content/uploads/2019/07/cropped-Add-a-heading-2-270x270.jpg)London PlaywrightsKimberley Andrews![](https://londonplaywrightsblog.com/wp-content/uploads/2019/07/pen-1024x866.jpg)](https://londonplaywrightsblog.com/kurt-vonneguts-8-rules-for-writing-for-the-playwright/?ref=gorillasun.de) I think his rule 'Start as close to the end as possible' also translates very well to tutorials and newsletters - don't spend too much time setting up and tell the reader what they came looking for, whether it's a story or an educational piece of information. ## AI Corner ### Real-time Diffusion model Sparks Controversy A new kind of model has been making the rounds - the Latent Consistency Model makes almost real time image to image translation possible: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.19.50.png)](https://twitter.com/radamar/status/1718783886413709542?ref=gorillasun.de) [Link to Thread](https://twitter.com/radamar/status/1718783886413709542?ref=gorillasun.de) [GitHub - radames/Real-Time-Latent-Consistency-Model: Demo showcasing \~real-time Latent Consistency Model pipeline with Diffusers and a MJPEG stream serverDemo showcasing \~real-time Latent Consistency Model pipeline with Diffusers and a MJPEG stream server - GitHub - radames/Real-Time-Latent-Consistency-Model: Demo showcasing \~real-time Latent Consis…![](https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg)GitHubradames![](https://repository-images.githubusercontent.com/711319439/5233ddba-25bd-4e80-85fd-4e1957ef1acb)](https://github.com/radames/Real-Time-Latent-Consistency-Model?ref=gorillasun.de) Moreover it can be easily run by users on their own machines. I don't know the full backstory of the controversy but apparently a tweet that showcased the capabilities of LCMs in translating a rough digital sketch into a fully fleshed out artwork apparently sparked some outrage: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-12-at-18.22.09.png)](https://twitter.com/Rahll/status/1723100959436410961?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Rahll/status/1723100959436410961?ref=gorillasun.de) I feel that this harsh response is unwarranted, the demo is interesting and simply showcases the possibilities of the real time application - the same was already possible before with any of the big image generating models, just not as fast. This is not to say that I dismiss the shady practices that go into training these models - I've stated this several times already. Martin Nebelong goes the extra mile to outline how to set this up in this Tweet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-13-at-11.47.08.png)](https://twitter.com/MartinNebelong/status/1723432424053317816?ref=gorillasun.de) [Link to Tweet](https://twitter.com/MartinNebelong/status/1723432424053317816?ref=gorillasun.de) ## Gorilla Updates ### Hot off the Press A couple of days ago I had the pleasure of talking to Alessandro Fiore, a fellow generative artist who's created an impressive body of work in the short time span of two years: [In Conversation with Alessandro FioreA conversation with Alessandro Fiore, an Italy based generative artist. He recounts his re-discovery of creative coding and gives insights into his approach to generative art today. We tackle several generative art related topics.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-19.54.35.png)](https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/) Alessandro took his paternal leave during COVID as a chance to rediscover generative art for himself, seeing fx(hash) take off at the same time just made the stars align in a very special way. Contemporarily he takes inspiration from traditional Italian abstract and geometric painters, adapting their ideas and turning them into generative sketches. Check out our conversation and go give Alessandro a follow on Twitter! ### Fresh off the Easel Continued working on this piece and people seemed to enjoy it quite a bit - I still haven't arrived at a final aesthetic yet but I think that I'm honing in to something: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/img-76--1.jpg) I quite enjoyed this mixed, almost incomplete aesthetic - although I still want to fill the at least some of the empty rectangles in some manner, maybe with hachures or grid-like patterns. I also have another idea for the grid, but I'll need to check when I have time to do that. The rest of this month leading up to December seems like it's going to be a bit crazy! ## Music for Coding Another album from the Japanese treasure box - this time I'd like to feature Nomak, a sample based music maker that creates relaxing yet engaging mixes, blending sample with rap. I don't often listen to stuff with lyrics while working, but these mixes really didn't feel distracting at all. If you enjoy artists like Nujabes you'll definitely also like this one: **And that's it from me this week again, while I'm jamming out to some these tunes, I bid my farewells, and I hope this caught you up a little bit with some of the events in the world of generative art, tech and AI in the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** ### In Conversation with Alessandro Fiore URL: https://www.gorillasun.de/blog/in-conversation-with-alessandro-fiore/ Last updated: 2024-08-28T13:36:26.000Z **I recently had the pleasure of speaking with Alessandro Fiore, a generative artist and creative coder based in Italy. When he's not busy being a dev team-lead or being a parent, Alessandro spends most of his free time creating awesome generative art.** Over the past two years he's released over a dozen generative art projects on several platforms and quickly risen to become a prolific generative artist in the space. In our conversation we talk about his re-discovery of creative coding and generative art after a long break, the approach that he's adopted and allowed him to drastically evolve his style in such a short time period, as well as some of the traditional and abstract Italian painters that he draws inspiration from. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screen-Shot-2023-11-07-at-10.25.07-fullpage-1.png)](https://www.fxhash.xyz/u/whitekross?ref=gorillasun.de) The numerous projects that Alessandro has created on fx(hash) | [Link to his Profile](https://www.fxhash.xyz/u/whitekross?ref=gorillasun.de) ## Background and getting into Generative Art **Gorilla Sun: How did you get into generative art? And how did you start with programming initially?** Alessandro Fiore: Yeah, I do programming professionally. Currently I'm team lead for one of the dev teams at Hootsuit; it's a company that does online social media services. A SaaS (software-as-a-service) basically. I've worked with them for about 5 years now, and that's essentially my day-job. Then there's the other one, that's taking up as much of my time as the official one \[laughs\] It's interesting, I actually started programming because of creative coding. I've always been interested in coding technologies, web design, and stuff like that, back when I was at university. I didn't study computer science however, I actually studied Sociology. But because of this passion I got into Flash and Action Script, which later on led me to Processing. There was a big overlap between the communities that were involved with those languages. That was around 2007-2009\. That's also when I started programming professionally and didn't have much time for it anymore. So I forgot almost everything. I still followed the creative coding community from the sidelines, but I wasn't a part of it directly, up until a couple of years ago when I discovered NFTs and fx(hash). That's when I picked up P5 for the first time, and it ended up being so much fun. **GS: How do you find the time to do generative art while maintaining your job at the same time? And have you had thoughts about doing generative art full-time?** AF: The night is full of resources \[laughs\] But on a more serious note, I work from home, so I try to squeeze in some creative coding whenever I find the chance. At night, or during work breaks, I'll try to have a quick lunch and then work on some ideas. Doing generative art full-time would be a game changer, but there's so many things to consider to take this big of a step. I don't really trust the current market, nor my art enough currently. There's undeniably an economic aspect to it, but having a family and duties towards them, right now it's not a priority and it doesn't feel like the right time for it. Currently generative art is an outlet for me to express myself creatively, it's something I've missed a lot in the past years and that I really needed mentally. It allows me to express something that's inside of me, and is something that I can't really do in my job. But I don't know, the future is unpredictable. Maybe at some point. **GS: How different is the programming you do for your job from programming your generative art?** AF: It's completely different. Of course I can be creative in my job; there's often situations where I can come up with creative solutions to certain programming problems, which is not so different in creative coding where it's also about problem solving. But on the other hand creative coding is very liberating - I don't need to write tests, I don't need to write user-stories, and it's always so much fun when you run into a bug, that isn't really a bug, and could actually become a feature. To that extent it's completely different, it's a completely different way of iterating on your code. **GS: Earlier you made a distinction between the terms Creative Coding and Generative Art? What is Creative coding to you? Is it a more general term? I'm interested in these semantics.** AF: I think Creative Coding is a more general term. Creative coding doesn't necessarily need to be generative or involve randomness and noise. It's simply making something creative with code. **GS: How did you discover fxhash and NFTs in general?** AF: That was during the pandemic - I was still following many people in the creative coding scene during that time, like Marius Watz, and Leander Herzog. At some point I came across a tweet about fx(hash), and it struck me as something really new and interesting. I decided to give it a try. At the time I was on parental leave because my first son was born - and the thing about becoming a father is that you don't get to sleep much \[laughs\], but you also end up having a lot of time on your hands. So the these three months gave me the chance to fully explore all of this stuff - then I started working again, but I continued with generative art in my own time. ## Stylistic Progression and Process **GS: Looking at your fx(hash) pieces I've noticed that there's a clear progression from piece to piece - not just stylistically, but also conceptually. It's especially apparent in 'Anabasis' that seems like a departure from your initial explorations.** AF: Anabasis was the first project where I tried to create something with the direct intention of it being an fx(hash) release. I thought that to progress I needed something different, which lead to this kind of textured work; whereas previously I had still been porting some of my older Processing ideas to P5\. Anabasis is actually a greek word, but I pronounce in an Italian way - it means as much as 'uprising' or 'rebellion'. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/anabasis.png)](https://www.fxhash.xyz/generative/slug/anabasis?ref=gorillasun.de) [Anabasis on fx(hash)](https://www.fxhash.xyz/generative/slug/anabasis?ref=gorillasun.de) I don't exactly remember the process, but it was very explorative - I kept experimenting until I reached this texture that I ended up liking a lot. My process has changed quite a bit since then, now I'm a bit more self-conscious about my practice. In the beginning it was a bit more casual, where I would just explore different styles and ideas until I found something interesting to focus on. Now I try to pursue specific ideas, in contrast to before, where I would just randomly explore without a specific goal in mind. But of course the path to a finished piece is never straightforward, there's always bumps and forks in the road that lead you down different paths. **GS: I get that, it's similar for me, it's more productive to do it in that way. In part I think it's also because there's more eyeballs on the art, so you can't just make whatever.** AF: It's a more focused and less naive approach, channeling your efforts in a specific direction rather than exploring by trial and error. But at the same time maybe something gets lost in that approach. The 'naive' approach might be more natural and you might find more interesting things. But at this point I like to be more targeted with my art. ## Inspiration and Titles AF: Right now I'm very passionate and inspired by Italian artists from the 60s - 70s, one of them is Lia Drei, her stuff is very geometric and not that difficult to replicate with code. My goal is not to copy of course, but simply to take inspiration. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-07-at-10.20.37.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-07-at-10.22.29.png) Lia Drei's Bio | One of her Artworks titled 'Triangles on Yellow' **GS: I found it a difficult exercise to capture the essence of different art styles with code. I tried my hand at Suprematism, and although it's very simple geometric shapes, there's something very human about the positioning on the canvas that can't be easily captured.** AF: That's what I find really interesting about professional painters - they have a generative mind. The paintings are not generative and you know that, but their concepts are generative and can serve as inspiration. The hard part is to capture that essence. In particular the optical art that I'm trying to replicate right now, you can see some examples on my Twitter. It's very simple but also very effective. I find triangles in general incredible, they're simple shapes but very flexible - you can make a lot out of them simply by changing a couple of parameters. Currently that's something I want to explore. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F9bfNG0XMAAVuxq.jpg)](https://twitter.com/whitekross/status/1717805771248026012?ref=gorillasun.de) [Link to Tweet](https://twitter.com/whitekross/status/1717805771248026012?ref=gorillasun.de) **GS: There's something inherently beautiful about the simple geometric shapes: lines, circles, and triangles, they're all fascinating in their own way.** **Besides that, how do you find inspiration? I was looking at your piece 'Damn everything but the circus' and the title was really intriguing and fits the art very well. What's the story there?** AF: That one actually borrows a lot of code from Anabasis. I wanted to make something that felt vintage, reminiscent of the 20s and 30s with a sense of nostalgia - when those shapes appeared on the canvas they reminded me of circuses and clowns. **On a completely unrelated note I was reading an article about the writer E.E. Cummings and the quote just fit the piece perfectly.** “Damn everything but the circus! ...damn everything that is grim, dull, motionless, unrisking, inward turning, damn everything that won't get into the circle, that won't enjoy. That won't throw it's heart into the tension, surprise, fear and delight of the circus, the round world, the full existence...” E. E. Cummings [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/clown.png)](https://www.fxhash.xyz/generative/11730?ref=gorillasun.de) Damn Everything but the Circus! | [Link to Project](https://www.fxhash.xyz/generative/11730?ref=gorillasun.de) I like to play with titles - sometimes there's a relationship to the piece, sometimes there isn't. The original code-name for the project was 'The Clown', but I thought the quote was a better match and was more fun. As a side note here, the title had an exclamation point at the end, so for a while the URL for the piece was broken before fx(hash) implemented URL slugs. **GS: I often end up with multiple different names for each project, and it becomes difficult to settle on one ultimately.** **You have this cool trilogy of pieces titled *Saturday Nights alright for Fighting*, *Annihilate this Week*, and *One of these Days*, can you tell us a bit more about them?** AF: They're all based off of song titles! *Saturday Night's alright for Fighting* is a song by Elton John - I don't actually know if I can use it as a title for my piece because of copyright but it's there now \[laughs\] > Short intermission here - I looked into the copyright regarding the usage of song titles and I think it's okay to use it as a title, considering that it's for a different kind of artwork. It only becomes a problem if it creates confusion around the original piece of art - and I genuinely don't think Elton John cares. Elton John's explosive Saturday Night's alright for fighting At the time I was seeing a lot of these weekly 'posting events', like Fidenza Fridays, or Meridian Thursdays, and Anti-cyclone Saturdays. This trend gave me the idea for a piece that changes based on the day of the week that it's viewed in. Technically the piece isn't very complicated, it's a simple flow field, but I wanted to make something that felt explosive and conveys a feeling of 'fighting'. During weekdays the piece has a relatively strict layout, but then changes every weekday, gradually becoming more explosive, until it reaches its peak on Saturdays. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/thurs.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/friday.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/satrr.png) Thursday, Friday and Saturday outputs for 'Saturday's alright for Fighting' The project was more successful than I had anticipated. With the second project I wanted to take this concept further, asking myself 'what if I try to compress all of the layouts into a single output?' - which is essentially the idea behind 'Annihilate this Week'. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/annihilate.png)](https://www.fxhash.xyz/generative/14670?ref=gorillasun.de) [Annihilate this Week](https://www.fxhash.xyz/generative/14670?ref=gorillasun.de) As for the third one, I wasn't entirely certain if I should have released it, because it was maybe too similar in style to the previous two, but I really wanted to wrap up the trilogy. In 'One of these days' the token picks a certain day to change it's aesthetic, where it becomes bolder, more chaotic, and more colorful. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/simple.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/bolder.png) 'One of these days' is definitely my favorite one in the trilogy! | [Link to Project](https://www.fxhash.xyz/generative/16408?ref=gorillasun.de) I never really talked about these things in detail, I don't really like writing about my pieces because I don't think I'm a good writer. But sometimes it's necessary, because pieces like that need a better explanation. You are an excellent writer and I love when you explain your pieces, I'm not able to do that kind of deep dive with text into my art. **GS: thank you Alessandro! The thing is, when I write about my art I often start understanding more - I often have to explain things that I thought trivial at first.** **I think it's a really good exercise, even if you don't end up publishing your writing, it still gives you new insights into your own process.** AF: I love when artists write about what they do, not just in generative art but also in the traditional arts. I try to read a lot of books written directly by the artists themselves, where they talk about their process. Something I read recently is by an abstract Italian painter that's been mostly active in the 80s, 90s - Georgio Griffa. I like his way of using colors and his compositions that are minimal and playful. He mostly writes in a more philosophical manner about his art. [Eleven cycles of painting. Undici cicli di pittura - Giorgio GriffaCycles of painting reflections of an artist “It seems that among the historic avant-garde movements, and even before them, the various cycles of a work were often developments on each other. A sort of progression exemplified perfectly by Mondrian’s tree. In my case, there is nothing…![](https://en.allemandi.com/assets/img/favicon.png)Allemandi Editore![](https://en.allemandi.com/spool/og__id1109_crop800x800c_t1623737344__1x.jpg)](https://en.allemandi.com/libro/9788842225393?ref=gorillasun.de) [Art review: the abstract painter Giorgio GriffaThe infinite fascinates this abstract artist, says Jonathan Evens![](https://www.churchtimes.co.uk/apple-icon-180x180.png)Tuesday 07 November 202329 March 2018![](https://www.churchtimes.co.uk/media/5643806/mark-blower-180129-giorgio-griffa-camden-arts-centre-0033-edit-20180319162107370_web.jpg?anchor=center&mode=crop&width=600&height=314&rnd=131667972250000000)](https://www.churchtimes.co.uk/articles/2018/29-march/books-arts/visual-arts/art-review-the-abstract-painter-giorgio-griffa?ref=gorillasun.de) ## On long-form generative art **GS: About long-form projects, what's usually the hardest part of making a long-form generative artwork?** AF: That's easy to answer, it's making every output of the generative artwork interesting. It's okay if some outputs are better than others, and of course there's also personal preference involved, but balancing the parameters such that all outputs are somewhat on the same level is definitely the hardest part. I think fx(params) helps with that, but at the same time - it might be an unpopular opinion - I'm personally not a big fan of it. For me it's about having an artistic fingerprint, the risk I see with using params is that a certain kind of output might be more interesting to collectors and end up dominating the final collection. With non params pieces rare outputs are so much more special, with params you're not giving generative artworks the chance to unfold in that way. I really like the concept of giving more power to the collectors and allowing them to contribute to the output, but it's not really what I want to explore right now. I like verse's approach though, where the collectors can save their favorite iterations and then mint one of those. Maybe in the future I will explore params more. **GS: Making a params piece is a different kind of challenge to traditional long-form projects I think - you have to be careful with which parameters you end up exposing to the collectors.** ## The Community **GS: Who are some of the artists in the genart space that inspire you and that you'd like to give a shoutout to?** AF: It's still the same people from when I got into Processing, like Marius Watz, Robert Hodgin, [Erik Natzke](https://www.eriknatzke.com/art?ref=gorillasun.de) among many others. The use of colors by Marius Watz was something I've always been impressed by. And then recently of course I've become a big fan of Tyler Hobbs, not only because of Fidenza, but also because of his way of thinking about art that inspires me. And also Matt DesLauriers. Some others are [rudxane](https://twitter.com/rudxane1?ref=gorillasun.de), and [Volatile Moods](https://twitter.com/VolatileMoods?ref=gorillasun.de), I really like the stuff he's been doing recently, I think it's really great. The most interesting part about the community to me is this dynamic of people inspiring each other. Of course some people are more in the spotlight than others, but I really like that everyone is learning from each other, and there's this spirit of collaboration. It's a really vibrant space to explore. **GS: The creative coding community is one of the friendliest communities I've been part of in my time on the internet.** AF: Yeah it's incredible, I was completely hooked after the first Genuary, everyday there was something completely new and cool, and I was just baffled with how people made something everyday for which I would probably need weeks \[laughs\] The feeling of being part of something like that is very nice. ## Concluding Thoughts To wrap things up, I'd like to give a big thanks to Alessandro, not just for taking the time to talk to me, but also for sharing his story, his ideas, and his thoughts on some of these topics. I found all of it very fascinating, and it is always very insightful to get a peek into the brain of other generative artists. **And yet again, we find ourselves at the end of the article; here's the mandatory call to action - if you've reached and read this far, it most likely is an indicator that you've enjoyed this article - if you did, consider sharing it on your socials, with friends and followers, it helps tremendously and tells the algorithm that this is meaningful content.** **Otherwise consider signing up to the newsletter to receive updates directly in your inbox whenever there's new content. That said, that's it from me - see you in the next one - cheers - and happy sketching - Gorilla Sun 🌸** ### Gorilla Newsletter 29 URL: https://www.gorillasun.de/blog/gorilla-newsletter-29/ Last updated: 2023-11-06T08:21:42.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### Cloudscapes with Volumetric Raymarching Let's kick things off with something that I've been eagerly awaiting - Maxime Heckel returns with another stellar article, a deep dive into Volumetric Raymarching and how it can be used for creating beautiful shader cloudscapes in real-time: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-03-at-11.45.07.png)](https://twitter.com/MaximeHeckel/status/1719372655923486966?ref=gorillasun.de) [Link to Tweet](https://twitter.com/MaximeHeckel/status/1719372655923486966?ref=gorillasun.de) > One fascinating aspect of Raymarching I quickly encountered in my study was its capacity to be tweaked to render **volumes**. Instead of stopping the raymarched loop once the ray hits a surface, we *push through* and continue the process to sample the *inside* of an object And just like before the article is a true treasure trove of information and resources: [Real-time dreamy Cloudscapes with Volumetric Raymarching - Maxime Heckel’s BlogThis article is a deep dive into my experimentations with Volumetric rendering and how to leverage it to render beautiful raymarched cloudscapes in React Three Fiber and WebGL. In it, I walk you through everything from the basics of Volumetric Raymarching to the techniques used in video games to ren…![](https://blog.maximeheckel.com/static/favicons/apple-touch-icon.png)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/f9781a850ffb38fa7c4fe345d54ae92a.png?v1)](https://blog.maximeheckel.com/posts/real-time-cloudscapes-with-volumetric-raymarching/?ref=gorillasun.de) Also make sure to check out Maxime's earlier articles - resources like this one a far and few between and deserve every possible spotlight. ### Ana María Caballero's Paperwork During a creative tour de force across different venues around the world, Ana María Caballero invited her audience members to leave her a single word in written form on a slip of paper after each performance. Having gathered these 'distilled, private moments of human connection' as her in her Bright Moments bio captures so beautifully, they serve as the foundation for her most recent piece titled 'Paperwork', released in collaboration with BM, and brought to life with the Emprops platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-13.55.58.png) For those who're not familiar with Emprops yet, it's a relatively new platform that's been making ripples over on Twitter in recent weeks - the platform is a first of its kind really: blending between prompt based generative AI and a long-form approach, it makes collectible long-form AI art possible. Here the term Emprops is an abbreviation for 'Emergent Properties'. The only resource that I could find which provides insight into how the platform works is by Claus Wilke, published as an fx(text): [fxhash - Is it AI art if a human designed it?I made an end-run around an AI generative art platform to release art that doesn’t actually use AI for its image generation. However, because I couldn’t entirely turn off the AI, it leaves a trace in visible image artifacts. Is the result AI art? Is it not? Should you collect it if you collect AI ar…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmTaB947JLkNgvSa5n4z4Fz1uADRYRFdHr1FZqRZpLprWN)](https://www.fxhash.xyz/article/is-it-ai-art-if-a-human-designed-it?ref=gorillasun.de) And as far as I understand it, the platform allows the artist to create an AI generated collection based off of a prompt. Generative image models usually incorporate some form of noisy input which leads them to be able to generate various different outputs that still 'align' with the same original input prompt. Here's an example: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-23.17.36.png)](https://emprops.ai/projects/found-images-i?page=1&size=20&ref=gorillasun.de) A project on Emprops titled Found Images I Moreover, it's also possible to feed images into Stablediffusion (the model that Emprops makes use of), making it possible for generative artists to place a *traditional* code based generative artwork at the helm of this pipeline and feed these outputs into stablediffusion, in addition to some prompt that further modulates the resulting images in some way, Claus Wilke present a good visualization of this in his article: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-23.41.14.png) Returning from our excursion into the Emprops platform - this is how Ana María's Paperwork comes to life. LeRandom, having also taken part in Bright Moments Buenos Aires and exhibited their extensive collection of generative art; they gave Ana María the opportunity to use an entire page on the site as a blank canvas to do with as she wishes - she decided to showcase the 100 one-word notes that her audience wrote down after her performances, subsequently serving as inputs for the 100 Emprops outputs of paperwork: [Ana María Caballero’s PaperworkGiven the open-ended prompt to manipulate a Le Random editorial page as a blank canvas, Ana María Caballero shares the intimate infrastructure of her project, Paperwork.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomAna María CaballeroAna María Caballero is a first-generation Colombian-American poet and artist.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65424ec28bd99c550e5004db_detail_AMC__mi%CC%81stica_-min.png)](https://www.lerandom.art/editorial/ana-maria-caballeros-paperwork?ref=gorillasun.de) The aesthetic inspiration for Paperwork stems from an Origami bird that one of the audience member left her: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-06-at-00.06.02.png)](https://twitter.com/CaballeroAnaMa/status/1720790738571493826?ref=gorillasun.de) [Link to Tweet](https://twitter.com/CaballeroAnaMa/status/1720790738571493826?ref=gorillasun.de) ### fx(hash) gearing up for 2.0 Last week fx(hash) dropped a big update thread detailing everything that's coming for their 2.0 release in December: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-11.10.26.png)](https://twitter.com/fx%5Fhash%5F/status/1720508869942899181?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1720508869942899181?ref=gorillasun.de) It's impressive that almost all features we know and love on TEZ are also coming to ETH. If you're an artist you probably also want to get a head start and get in on that launch calendar (coming out the same day that this newsletter finds its way into your inbox): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F-B0tfDa8AEBn-A.jpg) It looks like it's definitely going to be a crazy first December week! ### ComplexCity by John F. Simon John F. Simon's ComplexCity is a generative artwork that finds it's beginnings 20 years ago, originally created as an autobiographical ode to life in New York city. Today it releases as a generative on-chain project on Artwrld via the ArtBlocks engine. Nato Thompson from RCS does the heavy lifting for us in this interview: [The Interview | John F. Simon Jr.The creator of ComplexCity is bringing software art to the blockchain with Artwrld![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)John F. Simon Jr.Emily Edelman![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/653fd9f0c68da956f1192e52_Screenshot%202023-10-30%20at%2016.29.29.png)](https://www.rightclicksave.com/article/the-interview-john-f-simon-jr-artwrld?ref=gorillasun.de) Simons touches on several important topics, how the internet has made it easier than ever to make meaningful connections without needing to be in specific physical location to do so, how blockchain tech has revolutionized the distribution of digital artworks, and how coding is a form creative writing: > The instructions in a program say what they do, but in their binary form, running on a computer, they do what they say. Coding is creative writing because the writing creates. ### Studio Yorktown's Journal As a big fan of Bruce's generative art and approach in general, I was excited to see him publish a 'Journal' section over on his site: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-10.58.48.png)](https://twitter.com/StudioYorktown/status/1720465871133393050?ref=gorillasun.de) [Link to Tweet](https://twitter.com/StudioYorktown/status/1720465871133393050?ref=gorillasun.de) The writing is as thoughtful as you'd expect from Bruce - philosophically inspired, and without being specifically aimed at generative artists, there's many insights that'll make you rethink your creative process. You can give them a read here: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-06-at-00.31.46.png)](https://www.studioyorktown.com/journal?ref=gorillasun.de) [Link to Journal](https://www.studioyorktown.com/journal?ref=gorillasun.de) ### Generative Embroidery Something I've been seeing a lot more of recently are generative embroideries, mixing a generative approach with a physical medium. Anna Wolf has recently started sharing her lovely creations, and has already shared quite a few interesting stitch compositions: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-06-at-00.25.20.png)](https://twitter.com/NftEconomist/status/1712557335275872521?ref=gorillasun.de) [Link to Tweet](https://twitter.com/NftEconomist/status/1712557335275872521?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F9h-D3QWgAA7EK0.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/F8-gdGqWoAACmPj.jpg) Link to Tweet [#1](https://twitter.com/NftEconomist/status/1718261865417957471?ref=gorillasun.de) | [#2](https://twitter.com/NftEconomist/status/1718993999501910217?ref=gorillasun.de) Coincidentally I also came across a creation by Luis Fraguada, something made back in 2006: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-03-at-11.47.11.png)](https://twitter.com/luisfraguada/status/1719731434359767464?ref=gorillasun.de) [Link to Tweet](https://twitter.com/luisfraguada/status/1719731434359767464?ref=gorillasun.de) I'm wondering if this could become a new mainstream physical avenue for generative art - who's building the newest plotterized sewing machine to automate the process? ### How graphic designers are creating their own AI tools Stan Cross from WePresent wrote about 6 generative artists that share the common denominator of having built their own digital design tools: [WePresent | How graphic designers are creating their own AI tools.Where some artists fear AI, other graphic designers are making their own AI tools. Here, six designers share their fascinating tools. Explore now.![](https://wepresent.wetransfer.com/apple-touch-icon.png)How graphic designers are creating their own AI tools.![](https://images.ctfassets.net/adaoj5ok2j3t/2GEwWgUBiSgkbe4xVv5nDv/a5ab9cf3ed76d8452a46b3cacf5a1cf7/wepresent-design-tools-Sofia_Crespo_WIP_Still-header.jpg?w=1200&fm=jpg)](https://wepresent.wetransfer.com/stories/diy-design-tools-for-graphic-designers?ref=gorillasun.de) Although I love the article and the insights that it provides into the artists' processes, I feel that there's a little bit of a disconnect between the title and the rest of the text - some of the presented artists don't actually use AI within their approach to making generative art. It's a bit like saying all generative art is AI art, which isn't the case. It's a lovely read nonetheless. ## Weekly Web Finds ### The hardest problems at the Intersection of Tech and Society Mario Klingemann shared a tweet in which he draws attention to a recent piece by the MIT Technology Review: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-13.26.38.png) Having been asked what he thinks is the 'hardest unsolved problems that lies at the intersection of technology and society' he gave the following answer: > I believe that one of the hardest problems in artificial intelligence, which still has not been solved satisfactorily, is humor. Once machines actually grok how humor works and are not just involuntarily funny sometimes like they are now, they will have achieved true intelligence. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-13.24.38.png) And it makes sense, humor is a profound social phenomenon that requires a deep understanding of cultural, social, and individual factors - context us something that is hard to achieve with AI. Moreover it is also highly subjective, and an avenue in which AI is still performs very poorly. Trying get to the crux of it might bring us closer to 'true' artificial intelligence. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-13.30.03.png) ChatGPT's answer to 'What is Humor?' Here's a link to the piece, there's other interesting answers by other leading characters. I also really like the creative interface: [What are the hardest problems in tech we should be more focused on as a society?We asked prominent people in their field to weigh in on the underserved issues at the intersection of technology and society. Here’s what they said.![](https://www.technologyreview.com/2023/11/01/1081939/big-questions-problem-solving-bill-gates-jennifer-doudna-lina-khan/static/media/favicon.1cfcdb44759a0f93ddf5feb5405dd4cc.ico)MIT Technology ReviewThe Editors![](https://wp.technologyreview.com/wp-content/uploads/2023/11/Screenshot-2023-11-01-at-15.52.05.png?resize=1200,600)](https://www.technologyreview.com/2023/11/01/1081939/big-questions-problem-solving-bill-gates-jennifer-doudna-lina-khan/?ref=gorillasun.de) ### How Video-games render Fur I recently came across Acerola's channel and he's quickly become one of my favorite Youtubers. Not only are the videos very entertaining but they also teach you a lot about the tech behind video games - and I believe that lot of it carries over into generative art: In this particular video Acerola takes a deep dive into the computational difficulties of rendering hair and fur in video games, and presents some of the strategies that have been conceived for it. ### CSS is Fun again CSS is undergoing a quiet renaissance, with new features being added regularly nowadays one might even dare say that CSS has become fun again - with many previously tedious tasks becoming easier than ever. Jeff Sandberg tackles this in his essay: [CSS is fun againCSS has been undergoing a quiet renaissance lately. Lots of big features which previously required an external tool to use, are now native parts of the language, and its growing more and more all the time. If you haven’t used CSS in a long time, for whatever reason, now is the time to take a look ag…![](https://pdx.su/favicon.svg)Jeff Sandberg](https://pdx.su/blog/2023-10-25-css-is-fun-again?ref=gorillasun.de) ### A Visual Guide to CSS Selectors In a related note, here's a comprehensive visual guide to CSS selectors by Sébastien Noël on fffuel: [CSS Selectors: A Visual Guide & ReferenceVisual guide to CSS selectors, including pseudo-classes (:nth-child, :hover,...), functional pseudo-classes (:not, :is,...) and pseudo-elements.![](https://fffuel.co/images/favicon/favicon.svg)fffuel![](https://fffuel.co/images/covers/css-selectors.png)](https://fffuel.co/css-selectors/?ref=gorillasun.de) If you've felt overwhelmed by the number of CSS selectors out there, and need a quick lookup for it, this is your solution. Furthermore, fffuel also boasts a massive list of different CSS tools that are worth checking out. ### Why you should never nest you Code We resume our excursion into writing clean code, this time addressing the topic of nesting that often sits at the root of convoluted pieces of code. Reading nested structures can often quickly become a nightmare, the deeper you get the more memory you have to allocate in your brain to keep track of what the code is trying to do: CodeAethetic's video tackles some solutions to this end, such as extraction, where inner parts of nested blocks are isolated within their own functions, and inversion, where return blocks are checked for first instead of appending them as else clauses towards the end of a daisy-chain of if statements. This makes me curious, what are some of your favorite tricks to writing clean code? I never really thought about trying to optimize how I write code, but I'm realizing that having some standardized personal approach could go a long way, especially when I want to find my way back into older projects. ## AI Corner ### xAI releases Grok Elon Musk is up to no good again, recently announcing the release of X's very own Large Language Model: > *Grok \[...\] is modeled on "The Hitchhiker's Guide to the Galaxy." It is supposed to have "a bit of wit," "a rebellious streak" and it should answer the "spicy questions" that other AI might dodge* [Elon Musk Debuts ‘Grok’ AI Bot to Challenge ChatGPT - Slashdot“xAI, Elon Musk’s new AI venture, launched its first AI chatbot technology named Grok,” reports CNBC. Two months into its “early beta” training phase, it’s “only available to a select group of users before a wider release” — though users can sign up for a waitlist. Elon Musk posted that the…![](https://slashdot.org/favicon.ico)Slashdot![](https://a.fsdn.com/sd/topics/ai_64.png)](https://slashdot.org/story/23/11/05/2111254/elon-musk-debuts-grok-ai-bot-to-challenge-chatgpt?ref=gorillasun.de) What's interesting is that the model has access to Twitter data, which might lead to it behaving differently in comparison to the other big LLMs. But at the same time, it will also be locked behind the X Premium pay-wall. ### Understanding LLMs from 0 to 1 Ever wanted to really understand how LLMs work? A good starting point is AlphaSignal's ongoing series on the topic: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/11/Screenshot-2023-11-05-at-11.41.08.png)](https://alphasignalai.beehiiv.com/p/understanding-llms-0-1?ref=gorillasun.de) [Link to Article](https://alphasignalai.beehiiv.com/p/understanding-llms-0-1?ref=gorillasun.de) There's only two parts to it so far, but it's very approachable - the first part of the series focuses on tokenization and embeddings, which are some of the essential methods required to feed text into machine learning models. ## Music for Coding [Lamp (ランプ, *Ranpu*)](https://en.wikipedia.org/wiki/Lamp%5F%28band%29?ref=gorillasun.de) is a japanese indie band that was formed in the 2000s. In 2004 they released their second album titled *For Lovers* (恋人へ), and although it sold less copies than their first release it became a fan favorite over the years. It's pretty difficult to categorize their style of music, since it's a mix of many different elements borrowed from jazz, pop, and also has some heavy bossa-nova undertones. They're still active up until the present day, having released their ninth album just last month on the 10th of October 2023, titled *Dusk to Dawn* (一夜のペーソス). **And that's it from me this week again, while I'm jamming out to some these tunes, I bid my farewells, and I hope this caught you up a little bit with some of the events in the world of generative art, tech and AI in the past week.** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Cheers, happy sketching, and hope you have a great start into the new week! See you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 28 URL: https://www.gorillasun.de/blog/gorilla-newsletter-28/ Last updated: 2023-10-30T10:14:51.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things Lots of stuff this week - let's get started! ### Concrete to Generative Let's kick things off with another stellar piece of content by Le Random - this time authored by [Virginia Valenzuela](https://twitter.com/vinnythesnail?ref=gorillasun.de). She recounts the story of south America's 1940s Art Concret movement, and how it sits at the root of early generative art in the late 1950s with pioneering artists like [Eduardo Mac Entyre](https://en.wikipedia.org/wiki/Eduardo%5FMac%5FEntyre?ref=gorillasun.de) and [Miguel Ángel Vidal](http://www.artnet.de/k%c3%bcnstler/miguel-angel-vidal/?ref=gorillasun.de): [Concrete to Generative: “Real Space” Explorations in South AmericaVirginia Valenzuela explores generative art’s roots in South American concrete art.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65364cc6a52464f1155f8e15_vibraci-n-al-infinito-1953.jpg!Large.jpg)](https://www.lerandom.art/editorial/concrete-to-generative-real-space-explorations-in-south-america?ref=gorillasun.de) I've always found it fascinating how art movements of the past found their beginnings: > Beginning in 1930s Argentina and Uruguay, artists were engrossed with the pursuit of a universal concept of beauty, one that rejected romance and metaphor. Instead, it relied on mathematical and scientific truths. I believe that there's many lessons to be learned from the ideologies and guiding principles of past art movements, they're not completed chapters in history, but rather tangible approaches to making art from which we can still draw a cornucopia of ideas today. It also gives me confidence in my own art practice that is rarely emotionally inspired - *exploring ideas* lies at the foundation for me. The Art Concret movement aims to *reject romance and metaphor*, Suprematism aims to *reduce art to its fundamental elements*, Cubism aims to *deconstruct and reassemble into abstract geometric forms*. All of these ideas are still viable today, and maybe more appreciated than they have ever been before. If we've learned anything, art exists for itself, and it is perfectly fine to make art for the sake of art. In other related news, they also shone spotlight Jared Tarbell this week in a nice thread, an important figure when it comes to generative art: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-14.44.38.png)](https://twitter.com/lerandomart/status/1717488220349366711?ref=gorillasun.de) [Link to Thread](https://twitter.com/lerandomart/status/1717488220349366711?ref=gorillasun.de) Support Le random and their mission. ### Bright Moments Buenos Aires And while we're already talking about the art scene in South America, a notable event that is currently taking place in that part of the world is Bright Moments Buenos Aires: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-14.46.10.png) [Link to event Calendar](https://www.brightmoments.io/buenosaires?ref=gorillasun.de) They've got an impressive lineup of people for the workshops and talks, if you're currently over there you might want to check it out (not sure about the details for participating) - we'll certainly be seeing more of it on Twitter in the coming days! What's also exciting is the fx(hash) powered live-minting event - one stand out piece that I've come across a couple of times on social media already is Kali's COSMIK: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-14.53.16.png) Live-minting basically means that you can mint a generative fx(hash) token right on the spot at the venue, which became much more exciting with fx(params) that allows collectors to configure their own individual outputs. Kali's piece takes this further by being a hands-on interactive piece where the collector can draw sprawling neon shapes directly onto a gigantic canvas - here's a demo posted by Kali himself: 0:00 /0:26 1× [Link to Tweet](https://twitter.com/kali%5Fshade/status/1712638049216024984?ref=gorillasun.de) Also check out Julian Puppo's piece that takes a similar approach to parametrized live-minting: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-15.38.08.png)](https://twitter.com/julian%5Fpuppo/status/1717205955513893345?ref=gorillasun.de) [Link to Tweet](https://twitter.com/julian%5Fpuppo/status/1717205955513893345?ref=gorillasun.de) ### fxhackathon winners announcement Aand while we're talking about fx(hash) - they recently announced the winners of the fx(hackathon) that ran for quite a while and brought force quite a few super innovative pieces of generative art: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-15.40.34.png)](https://twitter.com/fx%5Fhash%5F/status/1717268265188380729?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1717268265188380729?ref=gorillasun.de) What's more is that we'll also get a closer look at each one of the projects in the coming weeks with some commentary by the judges - really excited for that: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-15.42.02.png) I have yet to experiment with code-driven parameters, but some ideas are already cooking. ### Processing Community Day Belgrade In a different part of the world - the creative coding Avengers assembled for the Processing Community day in Belgrade. You're probably already familiar with them as they've had multiple cameos throughout the past newsletter issues and other articles on the blog: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-15.54.19.png)](https://twitter.com/alexis%5Fo%5FO/status/1717645900539957340?ref=gorillasun.de) [Link to Tweet](https://twitter.com/alexis%5Fo%5FO/status/1717645900539957340?ref=gorillasun.de) ### Graph 2.0 by Feral File And if Aleksandra hasn't been up to enough shenanigans yet - she's also taking part in Feral File's +GRAPH a sequel to 2022's -GRAPH, a group show that primarily revolves around plotter based pieces: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-15.57.08.png)](https://twitter.com/pointline%5F/status/1716834778253873388?ref=gorillasun.de) [Link to Tweet](https://twitter.com/pointline%5F/status/1716834778253873388?ref=gorillasun.de) The lineup is definitely something to look forward to. Some of the artists have already made some teasers for the pieces that will be part of the final curation: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-16.01.35.png)](https://twitter.com/v3ga/status/1717229278855860637?ref=gorillasun.de) [Link to Tweet](https://twitter.com/v3ga/status/1717229278855860637?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-16.01.02.png)](https://twitter.com/Licia%5FHe/status/1717988241738019098?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Licia%5FHe/status/1717988241738019098?ref=gorillasun.de) While looking into it I also came across this tweet by Licia He in which she points towards some resources for learning how to use plotters - especially for the purpose of water color drawings, one being an interview with her from 2020: [How to Watercolor Paint with a Robotic Drawing Machine: An Interview with Licia HeWhen I first started plotting my generative designs, I initially turned to Instagram to find other plotter artists. One of the first people I ended up following was Licia He who has tuned her Axidraw into creating stunning generative watercolor paintings. In this interview, Licia gives a breakdown o…Dirt Alley DesignMichelle Chandra![](https://www.dirtalleydesign.com/cdn/shop/articles/licia_he_watercolor_painting_blue_cropped.jpg?v=1600881725)](https://www.dirtalleydesign.com/blogs/news/how-to-watercolor-painting-with-a-robotic-drawing-machine-an-interview-with-licia-he?ref=gorillasun.de) And another by Lars Wander on watercolor pen plots: [Watercolor (Pen) Plots![](https://larswander.com/favicon.ico)![](https://larswander.com/img/posts/watercolor-plots/flow-wiggles.webp)](https://larswander.com/writing/watercolor-plots/?ref=gorillasun.de) Lars Wander on making watercolor pen plots. ### Anna Carreras on Spanish mainstream TV Anna Carreras shared a clip ffrom Spanish mainstream TV in which she tlaks about generative art, and it's a really lovely watch - she added English subtitles to follow along: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-10.58.09.png)](https://twitter.com/carreras%5Fanna/status/1717848168333983868?ref=gorillasun.de) [Link to Tweet](https://twitter.com/carreras%5Fanna/status/1717848168333983868?ref=gorillasun.de) 0:00 /2:06 1× We need more video content like this about generative art, the scene still largely exists in a Twitter bubble, with other small communities dispersed across the internet. I think that would be one of the strongest ways to reach a wider audience. ### Face-tracking Shenanigans After sharing Steve's Makerspace posenet physics shenaningans - I coincidentally came across a couple of works that make use of face tracking for creative applications - one by the OG Golan Levin: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-11.02.05.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-11.05.26.png) [Link to Tweet](https://twitter.com/golan/status/1716304117054812531?ref=gorillasun.de) | Daniel Schiffman links to another template in the replies of the tweet that uses ml5 for this purpose. If you want to experiment, that's your starting point. At the same time Yiwen Lin has also been experimenting with face tracking: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-11.06.35.png)](https://twitter.com/yiwen%5Flin/status/1716849332903702532?ref=gorillasun.de) [Link to Tweet](https://twitter.com/yiwen%5Flin/status/1716849332903702532?ref=gorillasun.de) He was inspired by Rare Volumes interactive portrait installations: [SK-II Future X Smart Stores - Rare VolumeA collection of interactive video walls that generate realtime responses to visitors’ emotions.![](https://rarevolume.com/rv-content/uploads/2020/01/rv_favicon.png)Rare Volume![](https://rarevolume.com/rv-content/uploads/2020/01/rv_facebook_1200x630.jpg)](https://rarevolume.com/work/sk-ii/?ref=gorillasun.de) ### P5JS New Version Release And to close off this week's generative art news we also get a new version of P5 with quite a few new features: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-11.09.00.png) [Link to Tweet](https://twitter.com/4444ian/status/1717600756025762013?ref=gorillasun.de) ## Shoutout from Anna A couple of weeks ago I did an interview with Anna - the prolific NFT collector that's made it her mission to support as many artists as possible in the Tezos NFT and generative art space - if you haven't read that post yet, here's a link: [A conversation with Anna the NFT collectorAnna began collecting NFTs on the Tezos blockchain in May 2021 at the peak of the HEN boom. She has since grown an impressive following and become one of the biggest forces of positive change in the space. This is her story.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-17-at-09.10.59.png)](https://www.gorillasun.de/blog/a-conversation-with-anna-the-nft-collector/) Last week she honored me with a post in her biography series where she regularly gives shoutouts to content creators in the space - and I was honestly flattered by the response to the post and the kind words that people left in the replies: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-28-at-12.56.31.png) Thank you Anna for the contributions you do to the space! ## Weekly Web Finds ### The Internet Archive by Neal Agarwal After breaking the internet with his (impossible) password game, Neal Agarwal is back with another super cool webpage - this time he presents notable moments of internet history by presenting certain artifacts that have remained over the years: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-08.00.35.png) The first emoji set in 1997 [Internet ArtifactsBrowse through the old internet![](https://neal.fun/favicons/internet-artifacts.png)![](https://neal.fun/share-cards/internet-artifacts.png)](https://neal.fun/internet-artifacts/?ref=gorillasun.de) Starting from the first spam email, to early web photos and gnarly webcams, up until the Impossible Quiz in 2007 - it's a whirlwind tour of nostalgia. I definitely had a bunch of fun going through the entries and learning something new along the way as well. If you have a couple of minutes check it out. Neal Agarwal's projects make the internet a better place. ### The 5 Levels of Readable Code After sharing an article titled [On the importance of Naming in Programming](https://wasp-lang.dev/blog/2023/10/12/on-importance-of-naming-in-programming?ref=gorillasun.de) last week - in which Martin Sosic argues that readable code boils down to choosing meaningful variable and function names - I went down a little bit of a rabbit hole on code readability when I came across another article that presents a different approach to evaluating code readability: [The 5 Levels of Readable CodePhoto by Greyson Joralemon on UnsplashRecently I’ve been thinking a lot about code readability. What does it mean for a piece of code to be readable? Is it p…![](https://carlosschults.net/img/apple-icon-180x180.png)Carlos Schults / BlogCarlos Schults![](https://carlosschults.net/img/levels.jpg)](https://carlosschults.net/en/fivel-levels-readable-code/?ref=gorillasun.de) Carlos Schultz proposes an objective model that divides code readability into 5 tiers of complexity - starting from the basics, like using meaningful names for your variables and functions, to more abstract concepts, I can't necessarily say that it's a good or bad framework - Schultz points out towards the end that the article is meant as a conversation starter in any case. *I knew that code readability was a big topic* \- what I wasn't aware of were the vastly different opinions on the subject matter and that there's so many different approaches to framing the problem - for instance, I also found an interesting article by Typical Programmer back from 2018 titled 'What does code readability mean' that tries to get to the root of the problem: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-07.11.11.png)](What does code readability mean?) What does code readability mean? | [Article by Typical Programmer](What does code readability mean?) I'm not currently involved in any larger code projects - except my own endeavors, which can hardly be called large code projects - but I do run into the issue of unreadable code, especially when I'm trying to read a piece of code that I've written some time ago. Usually the more time goes by the more unreadable it becomes 😅 One thing that I found enlightening from Schultz's article is the notion of 'magic numbers' that I often succumb. Magic numbers are basically hard coded numeric values in the code that aren't descriptive in any manner: [What are magic numbers and why do some consider them bad?What is a magic number? Why do many programmers advise that they be avoided?![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a)Stack OverflowAdam Davis![](https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon@2.png?v=73d79a89bded)](https://stackoverflow.com/questions/47882/what-are-magic-numbers-and-why-do-some-consider-them-bad?ref=gorillasun.de) Carlos Schultz has written a number of other posts on the topic that I also found interesting if you want to check them out for yourself: [How To Reduce Cyclomatic Complexity: A Complete GuideEditorial note: I originally wrote this post for the LinearB blog. You can check out the original here, at their site. While you’re there, take a look at th…![](https://carlosschults.net/img/apple-icon-180x180.png)Carlos Schults / BlogCarlos Schults![](https://res.cloudinary.com/dz5ppacuo/image/upload/v1617641333/reduce-cyclomatic-complexity/reduce-cyclomatic-complexity-1038x437.jpg)](https://carlosschults.net/en/reduce-cyclomatic-complexity/?ref=gorillasun.de) So it seems that code readability is a bit of meta science that definitely tickles my nerd fancy - but then again I don't know if readability really matters that much when it comes to creative coding and generative art, if you're not collaborating with someone else. ### The Economics of Porgramming Languages How do programming languages come to be? Who are the people that create programming languages? Why do they make programming languages? And most importantly - how do they fund their endeavors? All of this is addressed in another stellar talk from Strange Loop 2023 is by Evan Czaplicki, creator of the Elm programming language, in which he talks about the Economics of creating a programming language and the hardships of it: ## AI Corner ### Data Poisoning generative Image Models Nighshade has made the headline of quite a few major news sites in the past week - it's a new tool that allows artists to add invisible changes to the pixels of their artworks which could potentially be detrimental to generative image models if they're fed in as training data: [This new data poisoning tool lets artists fight back against generative AIThe tool, called Nightshade, messes up training data in ways that could cause serious damage to image-generating AI models.![](https://www.technologyreview.com/2023/10/23/1082189/data-poisoning-artists-fight-generative-ai/static/media/favicon.1cfcdb44759a0f93ddf5feb5405dd4cc.ico)MIT Technology ReviewMelissa Heikkilä![](https://wp.technologyreview.com/wp-content/uploads/2023/10/poison-corrupts4.jpg?resize=1200,600)](https://www.technologyreview.com/2023/10/23/1082189/data-poisoning-artists-fight-generative-ai/?ref=gorillasun.de) This is mainly aimed at generative text to image models - the technique that makes this *poisoning* attack possible is apparently called an adversarial perturbation - and as far as I understand aims at confusing the generative model in such a manner that it can't differentiate between different things with clear certainty anymore: ![a table contrasting the poisoned concept "Fantasy art" in the clean model and a poisoned model with the results of related prompts in clean and poisoned models, "A painting by Michael Whelan," "A dragon," and "A castle in the Lord of the Rings"](https://wp.technologyreview.com/wp-content/uploads/2023/10/dos-11.jpg?w=1047) Essentially asking for an image of a dragon would then simply lead to colorful pixel mess. The authors state: > We show that a moderate number of Nightshade attacks can destabilize general features in a text-to-image generative model, effectively disabling its ability to generate meaningful images. I'm not entirely certain if this is related to the one pixel attack that I shared in a previous issue of the newsletter. Although it's a cool idea, I'm not entirely convinced of the efficacy of this - my hunch is that researchers at the companies behind the generative image models probably have means to detect this kind of tampering. ### Managing AI Risks by Geoffrey Hinton Geoffrey Hinton has been a strong proponent of AI regulations in recent years with the big strides that have been made in the field. On Twitter he announces a new paper, titled [Managing AI Risks in an Era of Rapid Progress](https://managing-ai-risks.com/?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-08.24.21.png)](https://twitter.com/geoffreyhinton/status/1717967329202491707?ref=gorillasun.de) [Link to Tweet](https://twitter.com/geoffreyhinton/status/1717967329202491707?ref=gorillasun.de) > In this short consensus paper, we outline risks from upcoming, advanced AI systems. We examine large-scale social harms and malicious uses, as well as an irreversible loss of human control over autonomous AI systems. In light of rapid and continuing AI progress, we propose urgent priorities for AI R&D and governance. ### Andreessen's Techno Optimist Manifesto The Andressen saga resumes - he is back with another piece of writing titled Techno Optimist Manifesto: [The Techno-Optimist Manifesto | Andreessen HorowitzWe are told that technology is on the brink of ruining everything. But we are being lied to, and the truth is so much better. Marc Andreessen presents his techno-optimist vision for the future.![](https://a16z.com/wp-content/uploads/2023/04/favicon-180x180-1.png)Andreessen HorowitzMarc Andreessen![](https://a16z.com/wp-content/uploads/2023/10/Tech-Optimist_Facebook-11.jpg)](https://a16z.com/the-techno-optimist-manifesto/?ref=gorillasun.de) If you've followed the newsletter for a while you probably know my thoughts on this. ![](https://i.imgflip.com/84aats.jpg) ## Gorilla Updates You've already seen the sketch in the header - a continued endeavor from last week, in which I combine domain warping with grid like structures: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-30-at-08.30.06.png) I took this a bit further by making the individual rectangles more interesting, breaking them up into smaller parts and interpolating between colors: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/F9jPdbAXsAAYuqQ.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/F9mXbT1XEAAMlxs.jpg) Left without grain, right with grain. And I'm really happy with how it turned out - it feels very *retro* in some way and at the same time also feels very Gorilla Sun. And although I feel very confident about the compositions and aesthetic, I'm again at a point where I'm not entirely certain if I should go with the grainy route or not. Thoughts? And that's about as much sketching I could get in this week. ## Music for Coding Seth Haley makes music under the alias of 'Com Truise' - a spoonerism of the of the name of American actor Tom Cruise. Com Truise makes his debut in 2010 with his release title Cyanide Sisters; previously having made music under other pseudonyms, it was the Com Truise project that started to generate buzz - later signing with the famous electronic label Ghostly International. Another artist that has a completely unique sound - Com Truise makes heavy use of retro-futuristic, synth driven, elements to create lush sonic tapestries with a nostalgic charm, that never fail to transport me into a different era: > *“I think the main thing that separates me from some of my peers is that I didn’t necessarily want to sound like I was writing ’80s music. I wanted to take the technology used in that decade and try to make something new with it.”* — Com Truise **And that's it from me this week again, while I'm jamming out to some Com Truise I bid my farewells.** **Hope this caught you up a little bit with the events in the world of generative art, tech and AI of the past week! And I hope you have a lovely rest of the day and a great start into the week - I definitely am!** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Otherwise - Cheers, happy sketching, and see you in the next one - Gorilla Sun 🌸** ### Gorilla Newsletter 27 URL: https://www.gorillasun.de/blog/gorilla-newsletter-27/ Last updated: 2023-10-23T11:32:41.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things We've quite a few interesting developments again over the course of the past week - let's dive in 👇 ### ONCHFS by Fxhash Fxhash drops the mic yet again, and surprises us with a big new feature: ONCHFS. What disguises itself as a bit of a tongue twister is actually an impressive piece of web3 technology - as an alternative to IPFS, minting projects on fxhash can now be done fully on-chain: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-08.24.31.png)](https://twitter.com/fx%5Fhash%5F/status/1714360008182546931?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1714360008182546931?ref=gorillasun.de) What's so cool about an on-chain file system? It opens up so many new possibilities and creative ways to make generative tokens on fxhash. Although both are decentralized methods of storing files, the immediate first improvement over IPFS is that you no longer have to worry about pinning your files to ensure that they're available in the future - by virtue of being written to the blockchain they're essentially always pinned. What's more, as a consequence of ONCHFS being designed in such a manner that it can easily be served via the HTTP protocol, files can reference other files stored with ONCHFS. That also means files on one blockchain can reference assets stored on **other blockchains.** [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-08.24.01.png)](https://twitter.com/VES3L/status/1714526798971650320?ref=gorillasun.de) [Link to Tweet](https://twitter.com/VES3L/status/1714526798971650320?ref=gorillasun.de) Just 24 hours later many cool projects had already been minted, fxhash also published a thread talking about that: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-08.40.57.png)](https://twitter.com/fx%5Fhash%5F/status/1714779937020993729?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1714779937020993729?ref=gorillasun.de) What's also worth mentioning here is landlinesart1 project titled [Blockchain Automaton](https://www.fxhash.xyz/generative/slug/blockchain-automaton?ref=gorillasun.de) that was a very early attempt at on-chain generative art for fxhash: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-08.39.15.png)](https://www.fxhash.xyz/generative/slug/blockchain-automaton?ref=gorillasun.de) Link to Blockchain Automaton ### reGEN by Artblocks Another valuable use-case of blockchain technology that's noticeably become more prominent in recent years is the ease of revenue splitting with smart-contracts. Not only for collaborations between artists, and/or the creation of web3 [breadfonds](https://www.gorillasun.de/blog/how-to-set-up-a-breadfond/), but especially when it comes to charitable causes - the donation process is greatly simplified: artists now only have to indicate that a percentage of earnings needs to be sent towards the charity's wallet address. This way the money doesn't have to go through a middle-man anymore, it goes directly and securely to the charitable organization. Looking beyond the problem that in some parts of the world it might still be quite difficult to cash out cryptocurrencies - I think that it's one of the use-cases that speaks favorably about blockchain tech amidst much of the bad rep it gets in other regards. Now even if artists don't have a large profile, they can contribute to a good cause and use their art as a force of positive change. And we've seen this on several accounts already. This past week we observe Art Blocks use generative art as an instrument to raise funds against Alzheimer, with a lineup of 5 pieces from 5 stellar artists: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-08.56.17.png)](https://twitter.com/artblocks%5Fio/status/1713933457309528185?ref=gorillasun.de) [Link to Tweet](https://twitter.com/artblocks%5Fio/status/1713933457309528185?ref=gorillasun.de) You can read more about the initiative in this article by RCS covering the important facts: [reGEN | Generative Artists Fighting Degenerative DiseasesArt Blocks unites creators and collectors in the fight against Alzheimer’s disease![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Generative Artists Fighting Degenerative DiseasesAlex Estorick and Ana María Caballero![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/6532ba7e0aa2cade0f12903b_Screenshot%202023-10-20%20at%2018.35.26.png)](https://www.rightclicksave.com/article/regen-generative-artists-fighting-degenerative-diseases-artist-interview-alzheimers?ref=gorillasun.de) ### Sketchbook A by William Mapan If I missed any other important news this week - blame's on [William Mapan](https://twitter.com/williamapan?ref=gorillasun.de). In the past days, every second tweet in my timeline had something to do with Mapan's newest release on Verse - Sketchbook A: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/generate-preview_f3dbdc5c-7ea7-403c-bbea-ed6222ab01fb.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/generate-preview_f66d5ebb-11f2-4f23-8378-23e3f2d45209.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/generate-preview_5be77570-995b-4137-addb-760b75f68f85.jpg) [Some outputs from the Sketchbook A generator. There's other colors, but I really enjoyed these pink ones. You can try out the generator for yourself here (you need a verse account however)](https://verse.works/collections/sketchbook-a-by-william-mapan?outputHash=58a14360e484340e206269d1dd244ac085eb6e6382d47a33a1d6195325a871e1&ref=gorillasun.de) If you haven't caught wind of it yet - how? Besides Sotheby's auction of the Goose earlier this year, this is arguably one of the wilder #genart events that we'll experience - with auctions for the mint passes reaching astronomic price tags during the bidding wars on verse, as well as record breaking numbers of iterations generated by users on their interface: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-21-at-12.54.16.png)](https://twitter.com/chilltulpa/status/1715064925138116945?ref=gorillasun.de) [Link to Tweet](https://twitter.com/chilltulpa/status/1715064925138116945?ref=gorillasun.de) The way minting an iteration from Sketchbook A works is by means of a mint pass: being a holder makes you eligible for minting an iteration from the generator (that is if you can get your hands on one these mint passes). On verse you can then play around with the generator and produce as many outputs as you like, save the ones you particularly enjoy and then ultimately decide on the output that you'd like to eternalize as your token. In this manner an interesting collector curated collection emerges in a way that we haven't really seen before: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-09.10.33.png)](https://verse.works/collections/sketchbook-a-by-william-mapan?outputHash=11b0aa05f701124ddd1adcfb18207ee2f2805f6cae5d290371b378cf7b7f312c&ref=gorillasun.de) Not all passes have been minted at the time of writing this | [Link to Collection](https://verse.works/collections/sketchbook-a-by-william-mapan?outputHash=11b0aa05f701124ddd1adcfb18207ee2f2805f6cae5d290371b378cf7b7f312c&ref=gorillasun.de) What's more is that Sketchbook A is the first piece in William Mapan's two part series titled Intimacy. Le Random, always on top of these things, already squeezed in an interview with Mapan, asking questions about the motivation and meaning behind this series: [William Mapan on Breaking the MediumWilliam Mapan converses with Peter Bauman (Monk Antony) about the deep connections he maintains with his algorithms.‍![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/652fb04b2ca334ad997c4af8_IMG_2608.JPG)](https://www.lerandom.art/editorial/william-mapan-on-breaking-the-medium?ref=gorillasun.de) Sketchbook A reflects Mapan's intimate relation with his art, his audience, and draws them in even closer by giving them full control over the final collection. In fact, it's actually not the first time that Peter and William Mapan talk to each other, here's a RCS piece that dates back to the early days of fxhash, focusing in part on Mapan's stellar piece Dragons: [Generative Art and the Decentralization of CreativityPeter Bauman detects an emerging paradigm of communal art practice![](https://assets-global.website-files.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Foteini Valeonti and Alex Estorick![](https://assets-global.website-files.com/61e6c06a23cb13bf76051194/625588561a1e6cd887219206_Screen%20Shot%202022-04-12%20at%2015.08.34.png)](https://www.rightclicksave.com/article/generative-art-and-the-decentralization-of-creativity?ref=gorillasun.de) It's interesting to see how Mapan's ideas have evolved over the past two years. Other details can also be gathered from this [Twitter space](https://twitter.com/verse%5Fworks/status/1715418948416545174?ref=gorillasun.de). ### Loackme on Dithering Loackme's back at it again, doing what he does best - dithering stuff! He recently released a stunning piece on Foundation titled 'that cycle, it's endless'. At first glance it might just seem like a couple of spheres rotating around a central point, but a closer look will reveal that the shadowy spheres are subject to a different kinds of dithering. Loackme talks about how it's achieved in this thread of his: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-09.29.16-1.png)](https://twitter.com/loackme%5F/status/1715017117760692496?ref=gorillasun.de) [Link to Tweet](https://twitter.com/loackme%5F/status/1715017117760692496?ref=gorillasun.de) I think it's a really creative way of using the effect. Usually dithering is applied in a global manner to the entirety of the pixel array that makes up an image or a frame - doing it on a per object basis is really cool. He also mentions that the idea was inspired by a game titled [Return of the Obra Dinn](https://en.wikipedia.org/wiki/Return%5Fof%5Fthe%5FObra%5FDinn?ref=gorillasun.de) (it's been on my to-play list for way too long now) - it's from the same creator of the stellar indie game [Paper Please](https://en.wikipedia.org/wiki/Papers,%5FPlease?ref=gorillasun.de), Lucas Pope. Digging a bit further into the topic, I found this thread from 2017 in which Lukas documented his approach to dithering during the development of the game: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-09.39.03.png)](https://forums.tigsource.com/index.php?topic=40832.msg1363742&ref=gorillasun.de#msg1363742) [Link to Thread](https://forums.tigsource.com/index.php?topic=40832.msg1363742&ref=gorillasun.de#msg1363742) Here's also another tutorial that takes inspiration from the game, and also tackles dithering with shaders: [Ultra Effects | Part 9 - Obra DitheringSea shaders on the seashore![](https://danielilett.com/favicon.ico)Daniel Ilett: Games | Shaders | TutorialsDaniel Ilett![](https://danielilett.com/img/tut3/part9-banner.jpg)](https://danielilett.com/2020-02-26-tut3-9-obra-dithering/?ref=gorillasun.de) ### Quentin Hocde on Codrops Quentin is not only a very talented generative artist, but he's also got a track record for making really cool websites. It's notoriously difficult to make things look good when you're attempting anything more involved than a standard website - Quentin has really mastered his craft in that regard, recently being featured on the Codrops roundup for cool websites: [Inspirational Websites Roundup #51 | CodropsA fresh collection of carefully chosen websites that stand out for their exceptional design.![](https://codrops-1f606.kxcdn.com/codrops/wp-content/themes/codropstheme03/favicons/apple-touch-icon.png?x86483&v=2)CodropsManoela Ilic![](https://codrops-1f606.kxcdn.com/codrops/wp-content/uploads/2023/10/UI51.jpg?x86483)](https://tympanus.net/codrops/2023/10/20/inspirational-websites-roundup-51/?ref=gorillasun.de) They cover some really cool websites in their roundups - if you're looking for inspiration that's the resource you'll probably want to consult. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-11.25.24.png)](https://quentinhocde.com/?ref=gorillasun.de) [Check out Quentin's site here.](https://quentinhocde.com/?ref=gorillasun.de) The presentation of the projects he's worked on is also very stylish - here's his collaboration with Joanie LeMercier where they joined forces to create a cloud machine with plottable outputs as the first fxhash redeemable: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-11.30.34.png) [Link to project page.](https://quentinhocde.com/project/nuages-possibles/?ref=gorillasun.de) Aaaand luckily I still caught this before sending out the newsletter - go show Quentin some love by voting for his website for awwwards (I talked about Awwwards in last week's newsletter): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-13.29.56.png)](https://twitter.com/QuentinHocde/status/1716415064037535837?ref=gorillasun.de) [Link to Tweet](https://twitter.com/QuentinHocde/status/1716415064037535837?ref=gorillasun.de) ### Steve's Makerspace motion controlled physics game When I still was a young lad, my mom would often take us on Friday afternoons to the store for some grocery shopping. While she was doing that, we would usually hang out in the kids section and check out the toys that they had there. We're talking 2004-2005 here. One of those days, lo and behold, they had set up a large TV screen plugged into a PS2 alongside the newly released eyetoy. And you could try it out for free. I can remember that day very vividly because the concept completely blew my mind at the time - they had a bunch of different games, in one of which you had to wave around your hands frantically to fend off little ninjas that were trying to attack your virtual self on the screen. This past week I saw a tweet by Steve, aka Steve's Makerspace, that brought back a lot of nostalgia: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-11.39.55.png)](https://twitter.com/SteveMakerspace/status/1713552374596239585?ref=gorillasun.de) [Link to Tweet](https://twitter.com/SteveMakerspace/status/1713552374596239585?ref=gorillasun.de) Combining PoseNet with P5Play he creates a little interactive physics game in which he can use the outline of his body to interact with the circles on the screen. PoseNet is a neural network that does Pose estimation, basically creating a skeletal outline for the body of subjects present in the input video feed. If you want to learn how to recreate this - Steve also makes video tutorials on most of his creations: Go give him a follow on Youtube! ## Weekly Web Finds ### On the Importance of Naming in Programming Naming variables and functions is something that every dev struggles with at some point in their career. Martin Sosic argues that 90% of writing clean code boils down to naming things correctly, and goes on a deep dive into what that actually means. It turns out that the two are actually reciprocal - one cannot exist without the other: > The thing is, **you can't give a good name if you don't have clean code behind it**. So a bad name is not just a naming mishap, but often also an indicator of problematic code behind it, a failure in design. Code so problematic, that you don’t even know what to name it → there is no straightforward name to give to it, because it is not a straightforward code! [On the Importance of Naming in Programming | WaspIn stories, you will often find the motif of a powerful demon that can be controlled only by knowing its true name. Once the hero finds out that name, through cunning dialogue or by investigating ancient tomes, they can turn things around and banish the demon!![](https://wasp-lang.dev/img/favicon.ico).wasp (beta)Martin Sosic![](https://wasp-lang.dev/img/on-importance-of-naming-in-programming/variables-naming-pet-white.png)](https://wasp-lang.dev/blog/2023/10/12/on-importance-of-naming-in-programming?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Martin provides several examples of badly named things and walks us through his process of fixing them. I love this article - incredibly insightful. Now go an give your variables some good ass names. ### Return to Office is Bullshit Last week I came across this article that talks about how RTO - short for Return to Office - is a whole lotta BS: [Return to Office Is Bullshit And Everyone Knows It - Dhole MomentsI quit my job towards the end of last month. When I started this blog, I told myself, “Don’t talk about work.” Since my employment is in the rear view mirror, I’m going to b…![](https://i0.wp.com/soatok.blog/wp-content/uploads/2021/11/cropped-cropped-soatok-johis-responsive.jpg?fit=192%2C192&ssl=1)Dhole MomentsView Archive →![](https://i0.wp.com/soatok.blog/wp-content/uploads/2023/10/BlogHeader-2023-ReturnToOffice.png?fit=1200%2C675&ssl=1)](https://soatok.blog/2023/10/02/return-to-office-is-bullshit-and-everyone-knows-it/?ref=gorillasun.de) Before we talk about the article, can we take a moment and appreciate what a spicy mix of content this blog is? Software, Security, Cryptography, and Furries. You read that right. Furries. Digging around a bit more in Dhole Moment's about section, the author Soatok took some time to explain how this constellation of different topics emerged: > First, it’s my blog, I do what I want with it. 😛 Jokes aside - I can really appreciate people with a good amount of backbone: > Second, **representation matters**. People who feel nervous being open and authentic about *who they are* (especially junior developers) will feel even more pressure to remain hidden (to their own detriment) if no one is relatable to them. > So, I promise, I’m not being loud about my identity or interests to spite you. I’m doing it to comfort people like me. And that distinction matters. Behind every blog there's an identity, and the internet would be a very boring place if everything was clinically corporate. I've often thought about writing about some of the other things that I like. Besides coding and generative art, I enjoy a lot of other things in life: music, chess, fitness, and sometimes I'm also a little bit of an otaku. How do you reconcile all of these things under one Umbrella? What would people think if I simply started posting about my favorite chess openings starting tomorrow? Or if I started writing about training methods to increase your max deadlift? That's why I totally get Dhole Moments, and I love it. Alright, that said, this marks the end of this brief intermission - what I actually wanted to talk about is the article about RTO. Having worked fully remote since 2014, Soatok did not have to get used to working from home when COVID-19 forced everyone to adopt this new lifestyle. Things changed however when his company tried to enforce an RTO policy, even for employees that worked remotely prior to the pandemic. This didn't leave Soatok much choice - he explains why these draconian measures are going to fail in the longterm. I thoroughly enjoyed the article, and there's a lot more articles worth going through - even if you don't know anything about cryptography, or furries, it's all written in a very approachable manner: [Programmers Don’t Understand Hash Functions - Dhole MomentsProgrammers don’t understand hash functions, and I can demonstrate this to most of the people that will read this with a single observation: When you saw the words “hash function”…![](https://i0.wp.com/soatok.blog/wp-content/uploads/2021/11/cropped-cropped-soatok-johis-responsive.jpg?fit=192%2C192&ssl=1)Dhole MomentsView Archive →![](https://i0.wp.com/soatok.blog/wp-content/uploads/2021/08/blogheader-hashfunctions.png?fit=1200%2C675&ssl=1)](https://soatok.blog/2021/08/24/programmers-dont-understand-hash-functions/?ref=gorillasun.de) [Going Bark: A Furry’s Guide to End-to-End Encryption - Dhole MomentsGovernments are back on their anti-encryption bullshit again. Between the U.S. Senate’s “EARN IT” Act, the E.U.’s slew of anti-encryption proposals, and Australia’s ne…![](https://i0.wp.com/soatok.blog/wp-content/uploads/2021/11/cropped-cropped-soatok-johis-responsive.jpg?fit=192%2C192&ssl=1)Dhole MomentsView Archive →![](https://i0.wp.com/soatok.blog/wp-content/uploads/2020/11/blogheader-goingbark.png?fit=1200%2C675&ssl=1)](https://soatok.blog/2020/11/14/going-bark-a-furrys-guide-to-end-to-end-encryption/?ref=gorillasun.de) ### Oort a Programming Game Last week I discovered the "programming game" called Oort. You basically play the game by writing Rust code. And it seems that it's not for the faint of heart, not just because you need to know Rust to play but also because the required knowledge to play the game can get quite technical. Before investigating the game a bit further I had a look at some reddit comments about it: > I got up to the third equation of kinematics and I think I'm too dumb for this. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-22-at-22.39.05.png)](https://oort.rs/?ref=gorillasun.de) [Link to Oort](https://oort.rs/?ref=gorillasun.de) So, what's this all about? In Oort you essentially control a fleet of spaceships (with code) where the objective is to shoot asteroids that approaching your ship, or a planet that you're defending. Again, you have to program all of this, how your ships move, how they detect approaching Asteroids, and how missiles track down and blow up the approaching asteroids. You basically have to code the AI that controls your fleet. Oort makes you make the game. To take things even further, there's PVP! In this setting players' fleets will be pitted against each other in a planetary defense scenario and ranked on a leader-board depending on how well they perform. What I really enjoyed here are the write-ups that some of the contestants made explaining their strategies and approaches: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-22-at-22.53.18.png)](https://github.com/rlane/oort3/wiki/Tournament-Writeup-2023%E2%80%9009%E2%80%9011?ref=gorillasun.de) Flow field cameo | [link to writeups](https://github.com/rlane/oort3/wiki/Tournament-Writeup-2023%E2%80%9009%E2%80%9011?ref=gorillasun.de) I don't know how many of you actually know how to code in Rust, but if you do, you might want to give Oort a shot. I might actually give it a shot, could be a good reason to pick up Rust. ### CSS Relative Color Syntax The CSS relative color syntax is a powerful new way for manipulating colors, shifting their hue, changing their saturation, etc. [CSS relative color syntax - Chrome for DevelopersCreate new colors based on another color’s channels and values.![](https://developer.chrome.com/images/meta/apple-touch-icon.png)Chrome for DevelopersAdam Argyle![](https://wd.imgix.net/image/vS06HQ1YTsbMKSFTIPl2iogUQP73/NJussb4uxzLcabHjaQ2m.png?auto=format&w=1521)](https://developer.chrome.com/blog/css-relative-color-syntax/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Unfortunately it's only available on Chrome 119 and on Safari 16.4 and up at this point. But you still might want to check it out in before it gets more support. ## AI Corner ### Let's not Celebrate Being Wrong Although generative models have been met with resistance in the creative fields, due to some of the dubious practices of som of the large companies that make these models possible, they have also been celebrated to some extent for opening many venues and creative applications that weren't possible before. When we talk about the output of generative AI, we often use the term describe them as hallucinations. This label might work when the goal is to generate a bunch of funny images, but the word 'lie' might be more appropriate when it comes to spreading misinformation. Sam Altman, CEO of OpenAI, recently stated that these hallucinations are *more feature than bug*: [OpenAI’s Sam Altman tells Salesforce’s Marc Benioff that AI ‘hallucinations’ are more feature than bugThe public face of generative AI told the head of Salesforce Inc. on Tuesday said AI hallucinations are more a feature of the technology than a bug.![](https://mw4.wsj.net/mw5/content/images/favicons/apple-touch-icon-180x180.png)MarketWatchWallace Witkowski![](https://images.mktw.net/im-851023/social)](https://www.marketwatch.com/story/openais-sam-altman-tells-salesforces-marc-benioff-that-ai-hallucinations-are-more-feature-than-bug-1c035c52?ref=gorillasun.de) If we want to build reliable AI models we'll have to come up with solutions that address this problem. We've already seen many problems of making these powerful tools accessible to the public (check out past Newsletter issues). And there's still a lot of misunderstanding of how these models actually work. If you ask ChatGPT to tell me about it some fictitious paper there's a good chance that it will just make things up and provide an answer, even if that paper doesn't exist. ChatGPT is really good at producing answers that *look correct*. It does not however understand what it is actually telling us, even though it might seem like it. At best it's just a gigantic and impressive statistical model. Oliver Bown from The MIT Press speaks up on this topic with a fascinating article tackling what makes human creativity so special and how we are still far from reaching that with generative AI models: [“Hallucinating” AIs Sound Creative, but Let’s Not Celebrate Being WrongThe term “hallucination,” which has been widely adopted to describe large language models (LLMs) outputting false information, is misleading. Its application to creativity risks compounding that.![](https://thereader.mitpress.mit.edu/apple-touch-icon.png)The MIT Press ReaderThe MIT Press Reader![](https://thereader.mitpress.mit.edu/wp-content/uploads/2023/10/ai-lead.jpg)](https://thereader.mitpress.mit.edu/hallucinating-ais-sound-creative-but-lets-not-celebrate-being-wrong/?ref=gorillasun.de) > That’s because LLMs are not models of brains, but of *language itself*, its patterns, structures, and probabilities. At heart their job description is incredibly simple: Given some text, they tell us what text comes next. ### New Words by Ryan Murdock I was recently checking what [Ryan Murdock](https://twitter.com/advadnoun?ref=gorillasun.de) has been up to, probably better known as Adverb on Twitter and as the creator of the original text-to-image "Big Sleep" notebook. I found that he's been back at it, joining forces with Joel Simons, and using AI for creative purposes - this time using LLMs to create new words that express things for which we currently don't really have simple, one word descriptors. Here's an example from their project page: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-12.47.17.png) I have definitely felt bambooged a couple of times in my life. Also, screw that red underline my editor is putting underneath bambooged. You can check the project page out here if you want to learn more: [New WordsNew Words. An art/research work by Joel Simon & Ryan Murdock.![](https://joelsimon.net/favicon.ico)![](http://www.joelsimon.net/imgs/new-words/preview.jpg)](https://joelsimon.net/new-words.html?ref=gorillasun.de) ## Gorilla Updates ### Hot off the Press This time around I interviewed pxlshrd - and we have a lovely conversation in which we connected on so many shared interests. We ended up talking a lot of music, especially about about how it inspires his process for making generative art: [In conversation with pxlshrd - Between Music and GenartPxlshrd is a generative artist that draws inspiration from music. Having created an impressive number of generative pieces on fx(hash), he has a lot of insights to share on the process. This is the story of pxlshrd.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-14.36.33.png)](https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/) We talked about many other topics, such as the story behind his Tender piece "Rückkopplung", and how he the piece magically came together in a couple of moments after being stuck for a long time. Check it out, and check out pxlshrd's stuff, it's all really awesome! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-23-at-13.02.40.png) Why aren't you subscribed yet 🔫 do it | thanks for the shoutout CCDDBB! ### Fresh off the easel My best ideas always come in a very short period of time. This one was such a sketch: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/UNWAVER.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/download--81-.jpg) Deformed and way grid patterns. I often think about grid patterns, and ways to reinvent them in novel manners. This time I wanted to deform the grid in an organic manner, something I've never done before - how do you do this without a shader? The way I did it was by splitting the rectangles into individual vertices at their corners, we don't modulate the position of these vertices per se, but rather we'll first split up the rectangle edges/borders into segments made out of several points - then we modulate their position. With a sine way you then get a nice wavy pattern, almost like a flying carpet. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-21-at-10.30.00-1.png) I shared a few of them over on Twitter if you want to check it out. ## Music for Coding I freaking love this band - I love their sound, I love their bandname, and I love how creative their music videos are. Although I can't understand the Norwegian lyrics, the music still speaks to me. I first discovered them back in 2016, at a time where I was struggling with a statistics course in uni and at the same time was dealing with a lot of teenage aggressions. I really enjoyed their most recent music video - although it induced some claustrophobia, it's a banger: **And that's it from me this week again, while I'm jamming out to some Kvelertak I bid my farewells.** **Hope this caught you up a little bit with the events in the world of generative art, tech and AI of the past week! And I hope you have a lovely rest of the day and a great start into the week - I definitely am!** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Otherwise - Cheers, happy sketching, and see you in the next one - Gorilla Sun 🌸** ### In conversation with pxlshrd - Between Music and Genart URL: https://www.gorillasun.de/blog/in-conversation-with-pxlshrd/ Last updated: 2024-08-28T13:36:44.000Z **Pxlshrd is a sound engineer and musician turned generative artist. With a deep love for music and sound, pxlshrd draws most of his inspiration from an audible realm, subsequently translating his ideas onto the digital canvas by means of code. Having created an impressive number of generative pieces on fx(hash) - he's become a prolific artist in the space.** You might better know pxlshrd as the creator of "Breeding Grounds" and the more recent "Rückkopplung" that was released in conjunction with Tender. After seeing the stunning outputs of Rückkopplung I reached out to pxlshrd asking if he'd be up to have a chat with me - and reading these words, you can probably tell what his answer was. We instantly connected over a shared interest and love for music, having started out with generative art in a similar manner - a means to create visualizations for our musical endeavors. We spent a large portion of our conversation talking about the importance of music to him, and how it's become an integral part of his process. Furthermore we talk about the stellar Rückkopplung, the story of it's inception and the message that it tries to convey. Lastly we also touch upon the difficult topic of valuing art and what effects it has on the artistic process. That said, thank you pxlshrd for the time and conversation - here goes the conversation. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/breeding-grounds.png) Breeding Grounds | [Link to Token](https://www.fxhash.xyz/generative/11073?ref=gorillasun.de) ## Background **Gorilla Sun: A short while after you had released your generative token collaboration with Mikkel Hartmann "Pause", you were invited to be on the Arbitrarily Deterministic podcast. In the episode you mention that prior to getting into generative art and the NFT space you had a long career as a sound engineer. How did you make the transition to generative art?** pxlshrd: By profession, I'm a sound engineer, and I've been making music since I was 12 - besides that I've also done photography and graphic design in parallel. When the pandemic started, it was a turning point in my life. I told myself that I'd use this break to get rid of all the things that I didn't want to do anymore - sometimes when you're doing live sound for a show you end up with 16-hour days, and that was just a bit too much for me. Just like you I started creating sketches as a means to visualize my music. I have hundreds of musical sketches on tape lying around, and I just wanted to get them out there somehow - fx(hash) seemed like the perfect place for that. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-12.28.59.png) pxlshrd's earlier pieces on FxHash feature hauntingly beautiful tracks | Greetings From Habitable Zones In my first projects I’ve used Hydra Synth for the animations and after a while I started making static pieces with p5js. Creating static pieces requires a clear and confident vision on how to best capture their essence - much like saying "here's the output, and that's what this piece is about", I find it beautiful to work in such a manner. It's just a completely different way of thinking about the meaning of a generative system. **GS: How did you discover** fx(hash)**? through Twitter?** It was a tweet or comment by ciphrd, a few days after fx(hash) had launched. **GS: At that point had you done any Tezos NFTs prior to that?** Yeah, I actually had a couple of different aliases back then for different things, one of them was [headphaser](https://teia.art/headphaser?ref=gorillasun.de) where I did 3D stuff with Blender. There was absolutely no interest for it, although I was quite fond of them. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-12.41.21.png) Now I don't do anything under that alias anymore. At that point, pxlshrd was just a side project for weird animated gifs. **GS: How did pxlshrd start? Did you learn coding just for fx(hash)?** PS: I knew about generative art, but I started coding with the launch of fx(hash). **GS: You've done an impressive number of projects in the short period of two years!** ## On Generative Music **GS: working as a sound engineer, you probably needed to know your way around computers. Have you ever attempted making generative music?** PS: I did dabble a little bit in generative music, experimenting with [vcvrack](https://vcvrack.com/?ref=gorillasun.de) \- never with real euroracks - it was a fun experiment in [Klangkunst](https://en.wikipedia.org/wiki/Sound%5Fart?ref=gorillasun.de) (Sound Art), but it was hard for me to see it as real music. Though, I’ve used algorithmic composition in [Indistinct Places](https://www.fxhash.xyz/generative/20578?ref=gorillasun.de). Initially intended as “loading screen music”, it became an essential part of the piece later in the process. **GS: Because it's not as structured as handcrafted compositions?** PS: That too - but mainly because I couldn't really express myself with scripted music, I need to have a guitar or keyboard in my hands, something that lets me directly interact with it and allows me to rely on my intuition. **GS: I understand what you mean - making music is a very emotionally engaged activity, with generative music you can't rely on intuition as much.** PS: Yeah exactly, it's very interesting but I don't see it as music - it feels more like visual scripting... but with sound. **GS: What do you think about Brian Eno's Music for Airports?** PS: I mean it's a classic, I never listened to it deeply - although I'm a big fan of ambient music. Most of the time I listen to tape ambient stuff, where you make use of tape loops, multiple tape machines and send recordings back and forth between them. There’s a tiny label called [“Seil Records”](https://seil-records.com/?ref=gorillasun.de). I really vibe with almost all of their releases. **GS: What do you think about AI-generated music? I've been noticing more and more AI-generated playlists popping up on YouTube.** PS: I actually experimented a bit with one of those AI music platforms a few weeks ago - typing in something like "Boards of Canada wobbly tape soundscapes" and I thought that the generated results were quite decent. Although I haven't come across those playlists, I guess it's kinda cool - if you have a specific type of music in mind, just like [Boards of Canada](https://en.wikipedia.org/wiki/Boards%5Fof%5FCanada?ref=gorillasun.de), and you want to hear more like it when there aren't really any other similar artists or tracks with the same vibe, you could just let AI generate it for you. But it's going to raise the same ethical questions just like AI-generated images did. **GS: One of my favorite artists is** [**Tycho**](https://de.wikipedia.org/wiki/Tycho%5F%28Musiker%29?ref=gorillasun.de) **\- there really isn't anything that comes close to his music.** PS: Yeah, i really like it too! Tycho's early stuff is very inspired by Boards of Canada, but it really is its own thing. I discovered Tycho’s first album like 20 years ago on MySpace \[laughs\] **GS: Another thing I'm curious about - I believe that there's a big overlap between coders and musicians. Many coders that I meet and talk to are also coincidentally musicians. Maybe it's a sort of confirmation bias, but I find that there's a lot of parallels between the two practices.** **When you play an instrument, like the guitar or the keyboard, it's a very geometrical way of operating, that requires you to think about scales and patterns, which is not so different from generative art.** PS: There's a track by Boards of Canada titled "Music is math" - and music really is math, when you break it down. Making music boils down to combining different sounds, selecting specific note sequences, and you end up making something bigger out of those components. It's similar in generative art, where you combine a variety of methods and different algorithms, and end up with something that is more than the sum of its parts. But I don't think there is much difference in other creative practices, it's all based on the same foundation - on your experiences, what comes from the outside, and what it does with your mind and body - it all boils down to translating those ideas and feelings “onto paper” in a different way - so they're all just tools to express yourself. **GS: That's interesting, I haven't thought about drawing parallels to other creative practices.** ## Audible Mood Boards **GS: Let's backtrack a bit - when you minted your earliest works on fx(hash) why did you decide to do so alongside a musical track? Does the music add to the experience?** PS: When you put together music and visuals, it often opens up another dimension, giving rise to something that is more than the sum of the parts - and at the same time conjures a very specific feeling and/or mood. I use this as a sort of vibe check to push my projects forward. Starting with an initial idea, which can be a feeling, a concept, something abstract like human behavior or even black holes in space - I then ask myself *what would that sound like?* while searching for music that aligns with this initial idea. If it ends up reinforcing the feeling that I'm trying to convey, it usually is an indicator that I'm on the right track. It tends to be this back and forth between the visuals and the music, which drives the idea forward. **GS: On your** [**portfolio**](https://www.pxlshrd.xyz/?ref=gorillasun.de)**, you have a bunch of spotify playlists, are those the tracks that you listen to while making your art?** PS: Exactly - I really enjoy putting together these playlists. They're quite varied, there's all kinds of genres on there. I also try to arrange them in a logical manner, such that the transitions from one track to the other somehow make sense. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/playlist.png)](https://open.spotify.com/playlist/52y7LSknW9h6o5ZZgPt2Kw?ref=gorillasun.de) [Link to Playlist](https://open.spotify.com/playlist/52y7LSknW9h6o5ZZgPt2Kw?ref=gorillasun.de) **GS: so overall your process tends to be more on the explorative side of things?** PS: I never have overarching concepts when I start out, because I find that to be too constraining. But you do need an initial idea, like a specific technique that you'd like to explore for instance. In the initial phase, it's really important that you're open to receiving any and every idea that might strike, without constraining yourself with some pre-conceived notions. **GS: In an article by Tyler Hobbs he states that one of the best things you can do, is to sit down and create new work, sometimes it's also okay if turns out to be garbage, after a few attempts you'll eventually find something interesting. So you try to explore and not force yourself too much.** PS: Exactly! Trying to be as intuitive as possible is really the best way to make something bigger. That reminds me of jam sessions with bandmates and friends, where we improvise on ideas and things just come out of intuition. Naturally, we would also record it so that we can listen back to it afterwards and use some fragments from those jams as foundations for writing new songs. [Reflections on Five Years of Making Art Through Programming — Tyler HobbsI recently passed the five year anniversary of when I started making generative art. This was also approximately when I decided to get “serious” about making art. It’s hard to take an exact count, but I think I’ve made 600+ generative works at this point. I think I’ve done okay for myself.![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Tyler HobbsReflections on Five Years of Making Art Through Programming![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/5c1293aa898583f6dba04dba/5cda214dc83025bdd41e87f6/1655157562477/banner.png?format=1500w)](https://tylerxhobbs.com/essays/2019/reflections-on-five-years-of-making-art-through-programming?ref=gorillasun.de) **GS: Since you're bringing up the notion of improvisation - in Jazz for example, although you have a lot of freedom, at the same time it's still very structured, working inside of a structured framework that guides you. What are some of the things that help you stay on track with your projects?** PS: I have my toolbox of algorithms and techniques, like specific line drawing methods, that I've iterated on and that keep evolving with time. In a way that would be similar to the repertoire of a Jazz musician. Backtracking a bit, the reason why I didn't start earlier with generative art was my assumption that code doesn't allow for an improvisational approach - intuition is really important to me - but after a while, I noticed that having a toolbox lends itself for that purpose. **GS: Do you think you'll make animated pieces with music again at some point in the future?** PS: I think about it all the time, but coding animations is just something so different. Every time I start on something, I lose interest really quickly. But I really love animated pieces - I'm a big fan of [Kim Asendorf](https://www.fxhash.xyz/u/Kim%20Asendorf?ref=gorillasun.de). I think his ability to grasp the "Zeitgeist" is unmatched. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-13.46.33.png)](https://www.fxhash.xyz/u/Kim%20Asendorf?ref=gorillasun.de) [Kim Asendorf on fx(hash)](https://www.fxhash.xyz/u/Kim%20Asendorf?ref=gorillasun.de) **GS: Will you attempt something in that style at some point?** PS: Probably not, I'm more into organic-looking textures for my own animations. ## The story behind Rückkopplung [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/R-ckkopplung_oojSxBcfZ1exH8ZHFqHES9RhVwCKfygwhH51WutVxdpWNPnxAwU-2-.jpg)](https://www.fxhash.xyz/generative/slug/ruckkopplung?ref=gorillasun.de) [Rückkopplung | Link to Token](https://www.fxhash.xyz/generative/slug/ruckkopplung?ref=gorillasun.de) **GS: You mentioned over on Twitter that you learned shaders for the purpose of Rückkopplung, how did that happen? Did you experiment with shaders prior to that?** PS: With Rückkopplung, I wanted to try my hand at abstract expressionism. The initial idea started with the canvas API, and the final project still heavily relies on it. But it bored me at some point because all outputs looked the same, so it didn't really make sense to me as a long-form piece - I put it aside and worked on other sketches that were more promising at the time. It must've been my 50th or 60th attempt at using shaders, after having tried countless times before to no avail. I finally had a breakthrough and it clicked for me. I was implementing something like a liquefy effect on another project and thought that it could work well with the Rückkopplung idea - to maybe give it a more painterly texture. So I did that, and the texture turned out really nice, but the initial problem remained where all of the outputs still looked the same. That really bothered me and in a fit of anger I started typing all sorts of things into the coordinates of the texture; adding in sines and tangent functions, and changing a bunch of variables. Then I refreshed... and there was Rückkopplung! I thought to myself "Wow, that's it!" - and the project had gone from a boring idea to 95% finished in just a few moments. The following months I simply worked on the micro-details and palettes. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/early-output---before-shader.jpeg) An early output from Rückkopplung **GS: At what point did the feedback effect come into play?** PS: That's actually the technique that I discovered during those couple of minutes! **GS: That's fascinating! I also really loved the description of the project, did the story evolve alongside the project?** PS: When the echoing patterns emerged after that magical moment, I didn't know what the piece was trying to tell me. It took a few weeks for me to fully grasp what it was reflecting. That’s the beauty of creating without boundaries - stuff just happens and only later do you unravel the workings of your subconscious. Sometimes life feels like one big feedback loop. Your reactions to certain situations often follow a specific pattern, and you only become aware of this pattern once it repeats itself enough. You realize that it's something you've been doing your entire life, throughout similar kinds of situations. You always tell yourself that the *next time* you'll react differently, but you never do, as if you're stuck inside of a feedback loop. > "Rückkopplung" translates from German as "feedback," and refers to the process wherein a system's output affects its input – creating a loop of influence that guides self-regulation and adaptation. When applied to the realm of human behavior, this feedback mechanism both reinforces the occurrence of patterns, and empowers us to evolve what is returned from the past - **excerpt from Rückkopplung's description.** **GS: That's beautiful; and I can relate - I've found myself in many peculiar situations, thinking to myself that I could have reacted differently, but then it happens again and I only realize when it's too late. It's frustrating, but such is human nature.** [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-14-at-23.17.02.png)](https://en.wikipedia.org/wiki/I%5FAm%5Fa%5FStrange%5FLoop?ref=gorillasun.de) [Feedback is also an interesting concept in psychology and philosophy | I am a Strange Loop](https://en.wikipedia.org/wiki/I%5FAm%5Fa%5FStrange%5FLoop?ref=gorillasun.de) **So in a way, making Rückkopplung was a little like therapy?** PS: All of my projects are - it's a bit egoistic, but each project is a way of processing something, or to find new meaning in things. I rarely talk about this in the descriptions or on Twitter (X), because most processes are just too personal. I try to let “the Art speak” and my audience decide what they see and feel. But this was my interpretation of the echoing patterns in Rückkopplung. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-14.41.00.png)](https://twitter.com/pxlshrd/status/1694413238128038360?ref=gorillasun.de) [A thread that highlights a few moments that happen throughout the output space of Rückkopplung](https://twitter.com/pxlshrd/status/1694413238128038360?ref=gorillasun.de) **GS: The NFT space doesn't lend itself well to speaking out about personal problems that you might have in life. It generally tends to be toxicly positive.** **What's more, is that you quickly get forgotten when you take a short mental health break from social media.** PS: It only takes a couple of days for people and the algorithm to forget about you. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-15.06.29.png) There's been some discussions about this over on Twitter, here Frederik Vanhoutte's humorous take on it | [Link to Tweet](https://twitter.com/wblut/status/1712816477252817009?ref=gorillasun.de) **GS: You need to constantly feed the machine.** PS: In generative art we are at an advantage though, we always have some outputs to share. ## Market Dynamics and the Value of Art **GS: Do you ever get influenced by market dynamics? If a token of yours sells out immediately, or if it doesn't sell out, does that influence how you view your art?** PS: For me these are two different worlds and I try to make a clear cut between them. The only thing I consider when I work on a long-form generative system is the edition size - I think about everything else once the creative work is finished. Ultimately I'm still influenced in some way, anyway. But I generally don't make artistic decisions based on the market. I don't want to look back in the long-term and realize that I made decisions because of these external influences. It doesn't feel right to me. **GS: I can relate to that when it comes to edition sizes and burning unsold editions. I did burn editions of some of my earlier projects, but then I stopped because I don't see the point of artificially limiting the edition sizes.** **Ok, you have to consider the secondary market - if there's un-minted editions it's automatically less valuable, and I understand that perspective, but to me it doesn't make my art less valuable. But maybe that's a dumb way of going about it if you want to be financially successful in the space.** PS: It's totally dumb \[we both laugh\] but ultimately you want to make art. **GS: The money is nice, but it's always primarily been about making art. It's a difficult topic.** PS: It is, it's not that I don't care. I want my collectors to also have some financial value with time, and I do my best to be a good artist - but ultimately it's not in my hand to decide what the market thinks about my art. **GS: I always believed in providing value through the writing that I do over on the blog, and the NFTs as a means to support that. My art only has the value that is contextually attributed to it, which can fluctuate a lot.** **That's why I've always tried to provide value and give back in other ways, by means of informative and educative content.** PS: Yeah, i think that’s a great way of “giving value” to your works! Art is a very individual thing, the biggest value of Art to me is what it teaches me about myself and what I can convey through it to my audience. If my work manages to resonate with even one person or alter their way of thinking, then I’m truly the happiest person on Earth! To me that goes above and beyond its financial value. ## Origin of pxlshrd and Shoutouts **GS: On the AB episode you had a lot of fun beating around the pronounciation of your artist name pxlshrd? Is it "pixel-shard" or "pixel-shred"?** PS: It actually was meant to be "pixel-shred", Ken from AB and Will from WTBS started pronouncing it as "pixel-shard", I really liked it, so I just went with that. But it doesn't matter to me \[laughs\] **GS: Finally, is there someone that you'd like to shoutout?** PS: Maybe a bit unusual but it would have to be Louis from the fx(hash) dev team. They’re always helpful, kind and find quick fixes for all kinds of bugs related to my fx(hash) projects. Just a gem of a human! ## Closing Statement Closing words from pxlshrd: Thanks a lot for having me and keep up the great work. I admire what you’re doing and it’s important that we have people like you in our little space!” It was a pleasure talking to pxlshrd, and I'm grateful for the time he took out of his day to have this chat with me. Our conversation has definitely made me think about my approach to making generative art, even though I take a similar explorative approach to it, I seldomly take the time to look back and reflect on my creations. I think I should do that more often. I also really feel like listening to some Tycho and Boards of Canada now. **And yet again, we find ourselves at the end of the article; here's the mandatory call to action - if you've reached and read this far, it most likely is an indicator that you've enjoyed this article - if you did, consider sharing it on your socials, with friends and followers, it helps tremendously and tells the algorithm that this is meaningful content.** **Otherwise consider signing up to the newsletter to receive updates directly in your inbox whenever there's new content. That said, that's it from me - see you in the next one - cheers, and happy sketching - Gorilla Sun 🌸** ### Gorilla Newsletter 26 URL: https://www.gorillasun.de/blog/gorilla-newsletter-26/ Last updated: 2023-10-16T08:30:41.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the generative things ### The Nature of Code - Neuroevolution If you haven't caught wind of it yet - Daniel Schiffman has been working hard on a new version of his highly acclaimed book "The Nature of Code" - what's more is that we get a completely new chapter on top of a revised version! This last chapter is all about Neuroevolution: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-12-at-11.46.58.png) [Link to Tweet](https://twitter.com/shiffman/status/1711092570711810518?ref=gorillasun.de) Now you might ask, what's Neuroevolution? Essentially, it's a method that allows a neural network to train itself by interacting with a given environment - not through traditional reinforcement learning methods, but rather by borrowing concepts from the realm of genetic algorithms. By unleashing multiple neural networks on our task, we select the best-performing ones and use them as a template for the next generation of neural networks. [What's more is that you can actually already read the chapter!](https://nature-of-code-2nd-edition.netlify.app/neuroevolution/?ref=gorillasun.de) *If you enjoy the book, you should also consider supporting it by getting a copy! There aren't many resources like it for creative coding. Not sponsored - just a great piece of writing.* This also reminds me of this video by Code Bullet where an evolutionary algorithm is used to teach an agent to play the infuriating platformer Jump King: ### A Missive from Qubibi *I never seem to find things in a timely manner - but regardless, I thoroughly enjoy reading artist statements and interviews even after a while. There's always something to be learned from them.* With Feral File's SOURCE exhibition having come to a conclusion I came across a piece of writing by Qubibi that I thought was really worth sharing. Not having been able to participate in their talk series, Qubibi asked if he could write something instead, and Feral File prompted him on the importance of duration in his work, more specifically in his highly acclaimed Mimizu series - a piece that has been continuously exhibited at different venues in recent years, after he shot to fame with his first solo exhibition at the MuDA - the museum of digital art in Zürich. His response: [A Missive from the Artist Qubibi Around the Exhibition SOURCE - Feral File - Close-UpsQubibi, also known as Kazumasa Teshigawara, is one of the artists featured in the exhibition SOURCE, now on view on Feral File. Since qubibi was unable to participate in the talk series around this exhibitions, he asked if he could write something instead. Feral File sent him the below prompt, and q…![](https://feralfile.com/assets/FeralFile.png)Feral File![](https://feralfile.com/assets/feralfile-og.png)](https://feralfile.com/journal/close-up/a-missive-from-the-artist-qubibi-around-the-exhibition-source?ref=gorillasun.de) After reflecting on his artistic journey and the influences that steered the evolution of the Mimizu series he provides some new insights that are complementary to the bits of information that can be found in some of the other interviews he's done. He states that he often needs to look back, after the work is already done, to understand how a piece came to be. I believe that it is something many an artists can relate to: > *I often have reasons but not ideals, and when it comes to motivations (and whether they even exist), the only way for me to figure them out is to walk backwards from the outcomes. Do you see now why the question gave me such pause? ;)* There's something about Qubibi's writing that's just very authentic and grounded - it might be because his writing is in part translated from Japanese, but that just adds to its charm. I actually took a brief dip into Qubibi's artistic genius with my article "Style, Voice and Identity in Generative Art" in which I talk a little bit about the Mimizu series and how it came to be: [Style, Voice and Identity in Generative ArtWhat is style? As an artist, what makes you, you? Moreover, how do artists find their own stylistic voice? Especially when it comes to generative art? In this article we have a look at the art of Shvembldr, Qubibi, and Aleksandra Jovanić![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/asdasdasd-1.jpg)](https://www.gorillasun.de/blog/style-in-generative-art/) In a nutshell, Mimizu makes use of Turing patterns to create stunning compositions with earthy textures. Initially conceived as an animated screensaver-esque program, it soon evolved into a generator for still frames that capture moments of a larger organic whole. *And while we're talking about Feral File, you should also check out their current exhibition ["Truth"](https://feralfile.com/exhibitions/truth-gkx?ref=gorillasun.de) \- an interesting thread on all of the featured artworks:* [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-23.14.05.png)](https://twitter.com/FeralFile/status/1713616082227908799?ref=gorillasun.de) [Link to Tweet](https://twitter.com/FeralFile/status/1713616082227908799?ref=gorillasun.de) | [Link to Exhibition page](https://feralfile.com/exhibitions/truth-gkx?ref=gorillasun.de) ### Node to Node by Kate Vass Galleries The FOMO is kicking in real bad this time around seeing all of the stunning generative art that is being exhibited at the Node to Node venue in Paris: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-23.54.23.png)](https://twitter.com/Julien%5FEspagnon/status/1712879438260486381?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Julien%5FEspagnon/status/1712879438260486381?ref=gorillasun.de) I mentioned it a couple of Newsletters ago, but this past week they kicked off the Node to Node exhibition, featuring some of the most prolific generative artists currently leading the space: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-23.58.25.png)](https://twitter.com/KateVassGalerie/status/1712740354372288647?ref=gorillasun.de) [Link to Tweet](https://twitter.com/KateVassGalerie/status/1712740354372288647?ref=gorillasun.de) The prolific collector that goes under the alias of lemonde2d on Twitter, played a crucial role in making the exhibition happen - providing physical pieces directly out of his own collection to be exhibited at the venue. If you want to take part at least in some form, you can do so through the [number of Twitter spaces](https://twitter.com/i/spaces/1lDxLPdPwMbxm?ref=gorillasun.de) that have been already been and will still be held in the coming days with the participating artists. You should also check out Iskra Velitchkova's thread on her piece at the exhibition "The Fallopian Visitor" at the exhibition which I found profoundly interesting: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.05.43.png)](https://twitter.com/pointline%5F/status/1712414001697853889?ref=gorillasun.de) [Link to Thread](https://twitter.com/pointline%5F/status/1712414001697853889?ref=gorillasun.de) ### Le Random - Il(lumina)ting Marfa Two weeks ago I shared [abnormality](https://twitter.com/joshripple?ref=gorillasun.de)'s awesome recap of the Marfa weekend - if you didn't check it out yet, you should: [Art Blocks Marfa 2023A fun & crazy generative art event.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F384d0f19-b947-4014-8774-db68ad0593ef%2Fapple-touch-icon-180x180.png)The Culture Projectabnormality![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061f41ce-e1a7-420f-b2ef-e0cf05bcc153_2957x1642.jpeg)](https://thecultureproject.substack.com/p/art-blocks-marfa-2023) This week Le Random brings in [Nathaniel Stern](https://twitter.com/nathanielstern?ref=gorillasun.de) to shine light on one particularly captivating installation that was on display at the event - [Jason Ting](https://twitter.com/%5Fjzlabs?ref=gorillasun.de)'s Lumina: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-00.16.29.png)](https://twitter.com/lerandomart/status/1712418537917059544?ref=gorillasun.de) [Link to Tweet](https://twitter.com/lerandomart/status/1712418537917059544?ref=gorillasun.de) First covering the Lumina installation, Nathaniel also provides a comprehensive picture of Marfa's rich cultural history, prior to becoming the home of the yearly ArtBlocks gathering - placing Ting's lights in juxtaposition with other physical works, like James Turell's Skyspaces, and [Donald Judd's ](https://chinati.org/collection/donald-judd/?ref=gorillasun.de)[100 aluminum blocks](https://chinati.org/collection/donald-judd/?ref=gorillasun.de) that ask equally profound questions: > *Lumina* succeeds in folding us in, rolling us out and having us look, listen, feel, touch and sense our very togetherness. It is a meditation on, and reflection of, the smaller and more care-full moments in IRL-digital life. [Il(Lumina)ting MarfaArtist and writer Nathaniel Stern meditates on Jason Ting’s Lumina against the backdrop of Marfa’s art-rich history and natural wonders.![](https://assets-global.website-files.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random![](https://assets-global.website-files.com/6411e594fbd274173bf8c35c/65212766715f2d58c1555a8a_IMG_9712.jpg)](https://www.lerandom.art/editorial/illuminating-marfa?ref=gorillasun.de) **One can only strive to be as good a writer as Nathaniel is.* In other news from Le Random, it's also worth checking out their TwitterX profile from time to time as they share interesting threads - this time around putting Lauren Lee McCarthy in the limelight: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-08.12.09.png)](https://twitter.com/lerandomart/status/1712759923312836657?ref=gorillasun.de) [Spotlight thread on Lauren Le McCarthy, creator of p5js](https://twitter.com/lerandomart/status/1712759923312836657?ref=gorillasun.de) ### Re—tain - Private alpha kicks off Re—tain has been quietly in the works over the course of the past weeks, and kicked off alpha testing this past Friday - if you haven't signed up for early access, you might want to do so now - simply shoot them a message over on TwitterX: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-16.31.23.png)](https://twitter.com/re%5Ftain%5Fxyz/status/1711833724579459274?ref=gorillasun.de) [Link to Tweet](https://twitter.com/re%5Ftain%5Fxyz/status/1711833724579459274?ref=gorillasun.de) I have yet to get my project in shape, but having had a first look at their interface it seems very promising. ### Volumetric Raymarching by Maxime Maxime's back working on a follow up article to his previous masterpiece titled "[Painting with Math: A Gentle Study of Raymarching](https://blog.maximeheckel.com/posts/painting-with-math-a-gentle-study-of-raymarching/?ref=gorillasun.de)", this time his endeavors revolve around volumetric raymarching - and it looks like it's going to be another big one: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-16.35.26.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-16.35.54.png) I can't wait to dig into it once it comes out! If you're still looking for more content you might also enjoy this video that I discovered through another retweet by Maxime, where Visionary 3D takes it upon themself to build a ray-tracing engine in the short span of 7 days: I think at some point I'll also need to do a proper post on the difference between raymarching, raycasting and raytracing. ## Awwwards 2023 Another one of those things that I discover a week too late - if you were similarly unfamiliar, Awwwards is a yearly conference that revolves around everything related to webdesign. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-14-at-22.07.35.png)](https://conference.awwwards.com/high-res/?ref=gorillasun.de) [Link to conference page](https://conference.awwwards.com/high-res/?ref=gorillasun.de) where you can find a run-down of the invited speakers. Held in a different city every year, things went down in Amsterdam this past week - and I only discovered it through Richard Ekwonye who was invited to give a talk about his work. And deservedly so - remember his stellar article on Bézier curves? [Bézier Curves - and the logic behind them | Richard EkwonyeThe logic behind Bézier Curves used in CSS animations and visual elements.![](https://blog.richardekwonye.com/apple-touch-icon.png)Richard EkwonyeRichard Ekwonye![](https://www.blog.richardekwonye.com/images/bezier-curves-cover.jpg)](https://blog.richardekwonye.com/bezier-curves?ref=gorillasun.de) If you're a nerd for design things you should definitely check out the Awwwards Youtube channel, where they share talks from past years - it's simply a treasure-box for inspiration: ## Geometry to Algebra and Back again [Jack Rusher](https://twitter.com/jackrusher?ref=gorillasun.de) is back with another stellar talk at the [Papers we Love conference](https://pwlconf.org/?ref=gorillasun.de). Last year he kicked his talk off with the tame statement that "Everyone is programming wrong" - this year he tells us that we can't math: "Everyone is doing mathematics wrong": In *Geometry to Algebra and Back Again* he provides us with a whirlwind tour of the past 4000 years of mathematics - describing how we, in part discovered, but also created mathematics out of necessity, inventing notation system to be able to put these abstract notions into writing and ultimately shaping the intricate and vast field that exists today - all through the lens of a number of papers. Jack also put together a little website for the talk where you can find a complete transcript: [Geometry to Algebra and Back Again4000 Years of Papers![](https://t1.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://jackrusher.com/pwl-2023/&size=128)Jack Rusher![](https://jackrusher.com/pwl-2023/slides/a_slide-1.png)](https://jackrusher.com/pwl-2023/?ref=gorillasun.de) Arguably it's one of the most interesting and at the same most enjoyable talks I've listened to in the past couple of years. Once you've watched the talk - go and catch up with the one from last year *Stop Writing Dead Programs*: ## Pen and Plottery *From now on, if I find enough material, I might also include a little section on Plotter related things. There's a couple of people that are doing some really interesting things these days, but I don't want to be annoying and tag them week in/week out.* ### Apophenies by Cory Haber Resuming from last newsletter's shoutout, Cory Haber's Apophenies launched this past week - but the work is yet to be done! Over the course of the next year Cory will work on creating the 100 plotter paintings with a second show concluding this literal long-form endeavor: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.15.07.png)](https://twitter.com/brtmoments/status/1713248188860133503?ref=gorillasun.de) [Link to Tweet](https://twitter.com/brtmoments/status/1713248188860133503?ref=gorillasun.de) Check out Cory's profile to see some more pics from the launch party as well as some videos of the gigantic plotter in action. ### Greweb's Plotteries Greweb's profile consist of a mixture of plotter and gardening content, more heavily leaning towards the former. I don't know how he does it, but he churns out so many plots in such a consistentl manner, all while the actual sketches are impressive in their own right. His latest endeavour has been a plotterized approach to inktober, creating a little sketch for each of the prompts that have elapsed so far and subsequently bringing them into the physical realm by running them through his plotter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.21.33.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.21.15.png) Day 10 & 14 | Fortune and Castle | [Link to Greweb's Profile](https://twitter.com/greweb?ref=gorillasun.de) ## Weekly Web Finds *And there is no shortage of other interesting things in the world of tech either this week - yet again I've found a couple of interesting tutorials and articles!* ### An Interactive Intro to CRDT's Have you ever wondered how collaborative online applications like google docs, notion or figma work? CRDTs make this technology possible - short for Conflict-free Replicated Data Type - this wonderful interactive article by Jake Lazaroff eases you into them and goes pretty deep into the details: [An Interactive Intro to CRDTs | jakelazaroff.comCRDTs don’t have to be all academic papers and math jargon. Learn what CRDTs are and how they work through interactive visualizations and code samples.![](https://jakelazaroff.com/favicon.ico)Jake Lazaroff![](https://jakelazaroff.com/og/an-interactive-intro-to-crdts.png)](https://jakelazaroff.com/words/an-interactive-intro-to-crdts/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) In a nutshell: > It’s a kind of data structure that can be stored on different computers (peers). Each peer can update its own state instantly, without a network request to check with other peers. Peers may have different states at different points in time, but are guaranteed to eventually converge on a single agreed-upon state. CRDTs are especially interesting because I can think of a plethora of creative use-cases. ### Strong static typing, a hill I'm willing to die on... In light of some of the controversy surrounding Typescript in the past weeks, the discussion around strongly typed languages vs. dynamically typed ones has become more and more pronounced - in this article Tom Hacohen takes the strong stance in favor of strongly typed languages and why they overall lead to better softwared and better developer experience: [Strong static typing, a hill I’m willing to die on...This is a post about strong static typing, why I feel strongly about the topic, and some of the ways we utilize the Rust type system at Svix.![](https://www.svix.com/blog/static/favicons/favicon.ico)Svix![](https://www.svix.com/blog/static/images/generated/strong-typing-hill-to-die-on/cover-IT6ATRYD.png)](https://www.svix.com/blog/strong-typing-hill-to-die-on?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.58.14.png) I think I should do a deep dive into Typescript at some point, maybe an idea for a new blog post? ### Easy Light-Dark Mode Color Switching Implementing a theme toggle on your website is relatively straightforward, although it takes some manual digging through your CSS code and adding in a toggleable variable for the colors of your elements. A good starting point for that is Ryan Feigenbaum's excellent and comprehensive article: [The Complete Guide to the Dark Mode ToggleThis complete guide to the dark mode toggle includes best practices for implementing a color mode switcher on your website using custom variables, prefers-color-scheme, and more, all with a very pretty demo!![](https://ryanfeigenbaum.com/content/images/size/w256h256/2023/07/haze-ball.png)Ryan FeigenbaumRyan Feigenbaum![](https://ryanfeigenbaum.com/content/images/2022/08/richard-horvath-_nwaetf6qo0-unsplash_2000_1125.jpg)](https://ryanfeigenbaum.com/dark-mode/?ref=gorillasun.de) This might get a whole lot easier in the future with a dedicated CSS function devised solely for that purpose: [The Future of CSS: Easy Light-Dark Mode Color Switching with light-dark()A function that computes to the first color if the used color scheme is light or unknown, or to the second color if the used color scheme is dark.![](https://www.bram.us/favicon.ico)Bram.usView more posts![](https://www.bram.us/wordpress/wp-content/uploads/2023/10/css-light-dark.png)](https://www.bram.us/2023/10/09/the-future-of-css-easy-light-dark-mode-color-switching-with-light-dark/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Essentially, the *light-dark(, )* function accepts as input two colors and automatically sets the corresponding one depending on the theme that is set. Now you might say that the function is quite limited, as it only allows for two color schemes, and the above article also addresses this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-09.33.38.png) Overall I think it's really cool though - might be time to pimp your portfolio/blog with such a toggle! ### QX82 Retro Javascript Engine Bruno Oliveira put together a javascript library for the purpose of emulating the feel of retro game engines and allows you to create games and experiences in that style: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-10.02.02.png) [There's a couple of examples and demos over on the website](https://btco.github.io/qx82/?ref=gorillasun.de), if that's something that interests you. What's more, is that it is open source, so if you want to modify it for your own purposes you can do so as well! ### The Soviet-Era, Z80-based Galaksija Dared to Be Different I also found this IEEE article very charming, blending retrocomputing nerdery with a bit of history - felt like a time-capsule into a different era of computing. It recounts the story of the Galaksija micro-computer, a tiny DIY computer, made exactly from the parts that Yugoslavia could import from Western Europe. With this tiny wondrous machine being reissued, the author Stephen Cass wasted no time in putting in his order - with an indefinite delay on shipping he then takes matters into his own hands: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-16-at-10.04.04.png)](https://spectrum.ieee.org/yugoslavia-diy-microcomputer?ref=gorillasun.de) [Link to Article](https://spectrum.ieee.org/yugoslavia-diy-microcomputer?ref=gorillasun.de) ### FTX: The fraud was in the Code I wasn't aware that the FTX trials were in full swing - but it seems that the fraud was evident from the code. Molly White recounts the happenings of the trial and how code is being presented at court as a piece of evidence: [The FTX trial, day four: The fraud was in the codeThe jury got a taste of code review as they examined a falsified “insurance fund” and the infamous FTX → Alameda Research “backdoor”.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd0fccb-0afe-4b9f-ac1f-5cfcc7c45e4d%2Fapple-touch-icon-180x180.png)Molly WhiteMolly White![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33b15ea1-a6e3-4342-9410-34f8eea18393_1444x1146.png)](https://newsletter.mollywhite.net/p/the-fraud-was-in-the-code?ref=gorillasun.de) ## AI Corner ### Neural Algorithmic Reasoning And another article from the Gradient that I just had to share - NAR is a new field of machine learning that seeks to combine the power of neural networks with the algorithmic precision of classical algorithms. One of the key challenges in NAR is that neural networks are typically trained to perform specific tasks, while algorithms are more general and can be applied to a variety of problems. NAR wants to borrow ideas from the world of traditional computing with the aim of making neural networks more generalizable. [Neural algorithmic reasoningIn this article, we will talk about classical computation: the kind of computation typically found in an undergraduate Computer Science course on Algorithms and Data Structures \[1\]. Think shortest path-finding, sorting, clever ways to break problems down into simpler problems, incredible ways to org…![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)The GradientPetar Veličković![](https://thegradient.pub/content/images/2023/09/profile.png)](https://thegradient.pub/neural-algorithmic-reasoning/?ref=gorillasun.de) It seems that a promising approach is to train neural networks on datasets of algorithm traces. An algorithm trace is a sequence of steps that an algorithm takes to solve a problem. By training on algorithm traces, neural networks can learn to perform the steps of an algorithm without having to be explicitly programmed. ### Self-Assembling Artificial Neural Networks Although a full-fledged research paper, it reads quite easily and kind of fits the topic of Neuroevolution that I shared earlier with Daniel Schiffman's new chapter. Self-assembling artifial neural networks are essentially NNs that can wire and configure themselves internally, adapting to new tasks or situations that they may face: [Towards Self-Assembling Artificial Neural Networks through Neural Developmental ProgramsBiological nervous systems are created in a fundamentally different way than current artificial neural networks. Despite its impressive results in a variety of different domains, deep learning often requires considerable engineering effort to design high-performing neural architectures. By contrast,…![](https://static.arxiv.org/static/browse/0.3.4/images/icons/apple-touch-icon.png)arXiv.orgElias Najarro![](https://static.arxiv.org/static/browse/0.3.4/images/arxiv-logo-fb.png)](https://arxiv.org/abs/2307.08197?ref=gorillasun.de) ## Gorilla Updates ### Hot off the Press - Demystifying Monk Antony A couple of days ago I had the chance to speak with Peter Bauman, aka Monk Antony on Twitter - the person behind Le Random's editorial section. He's been putting some of the best pieces of writing in the genart/Web3 space and I just had to reach out to him and ask if he'd be up for a chat. We ended up talking for over an hour - about the early days of FxHash, how the initial group behind Tender met through the FxHash discord, and how that led to him becaming the writer for Le Random in the following months. [In conversation with Peter Bauman - Demystifying Monk AntonyPeter Bauman is one of the most prolific writers working at the intersection of generative art and Web3\. He’s the brain behind Le Random’s editorial section, and is responsible for building out a comprehensive timeline on genart history.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-09.46.46.png)](https://www.gorillasun.de/blog/in-conversation-with-peter-bauman-demystifying-monk-antony/) If you didn't know, Le Random is currently in the process of building out the most comprehensive timeline on generative art history that you can find on the web. This timeline is complimented by an impressive editorial section with excellent writings by Peter, as well as other commissioned pieces. If you're in any way remotely interested in generative art, or the artistic side of Web3, you should definitely follow Le Random's endeavors, all past and future content that they're in the process of putting out - and most of all, check out Peter's writing on their website. ### Fresh off the easel Lots of sketching this week - even managed to explore two different ideas, albeit being super short on time with work and family. This section ended up being much longer than usual. In part I spent much more time on sketching, trying to get some material into publishable shape regarding that FxHash is gearing up to it's 2.0 release and Re--tain just started alpha testing their platform. One of my ideas involved circle packings, Delaunay triangulations and graph algorithms. Initially I wanted to explore the concept of maximal circle packings, basically turning a graph into a circle packing diagram where you place a circle on each vertex of the graph such that circles placed on vertices that share an edge are tangent to each other. But that turned out to be quite a complicated problem and the research paper on the topic are way above my head. I'm still actively thinking about it but it's gonna have to wait for now, and I'll write about it eventually. Instead I ended up with these interesting patterns: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/inorganimkum.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/inorganicum.jpg) Delaunay triangulations with a slightly scribbly aesthetic. I enjoyed these sparse outputs Basically a circle packing turned into a Delaunay triangulation. And there are a couple of cool things that can be done with this as the foundation - basically any type of graph algorithm can now be used to traverse this triangulation, if you treat it as a graph that is. A couple of stylistic variations that I thought ended up looking really interesting is this synthwave-esque one: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/download--80-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/distrubbb.jpg) These triangulations are simply drawn twice to the canvas, the second time offset by a small amount yielding this optical effect, as if they were vibrating in some manner. In this idea I also explored MSTs - short for Minimum Spanning Trees - for the first time, I did previously implement Prim's algorithm for maze generation, but back then it was a little simpler as the graph was confined to an underlying rectangular grid. Here it's a bit trickier to turn the triangulation into a graph. The code is a mess, but it works. None other than Kjetil Golid himself chimed in over on Twitter in response when to one of the initial outputs that I shared, asking whether I was really using MSTs or not, and it turns out that I was doing something wrong in the code: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-14-at-15.40.04.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-14-at-15.40.25.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-14-at-15.40.39.png) So that was definitely the highlight of my week - thanks [Kjetil](https://twitter.com/kGolid?ref=gorillasun.de)! | [Link to Tweet](https://twitter.com/gorillasu/status/1712026303300264252?ref=gorillasun.de) The give-away for Kjetil were the crossing edges - the branches of a minimum spanning tree actually never cross! And if you think about how an MST is constructed that absolutely makes sense. I do feel a bit overwhelmed with all of the directions that I could take this sketch in though - maybe I will actually end up making a couple of variations. The other idea that I pursued was much simpler, exploring layering and colorations - but folks seemed to really love them - or the TwitterX algorithm decided to give me a subtle boost because I've been a bit more consistent with my posting again - who knows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/capriccio3.png) I really enjoy the interplay between the blurry and colorful background shapes with the more solid black mazelike strokes in the froeground. I don't know where this is going yet, but I really enjoy it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/capriccio2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/coloratio25.jpg) Portrait aspect ratio also works really well. I have some other ideas where to take this, but I'm not entirely certain if it's gonna looks nice or not. We'll see in the coming week. ## Music for Coding What a criminally underrated hidden gem! Fittingly titled *Into the Dream*, it's the perfect soundtrack for a dreamy Sunday afternoon. Created by Hugo Harrison, a UK based musician and producer who makes music under the alias of Vanilla. Blending hip-hop beats with sampled elements of soul, jazz, and funk - his tracks are the audible equivalent of gorgeous landscape paintings, relaxing and immersive at the same time: I also found the album artwork particularly beautiful - in the video the colors of the radial slices transition through different shades. I couldn't however find out who created it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-15-at-22.13.34.png) It is indeed - I love that this final section of the newsletter is giving me an excuse to discover new music every week! **And that's it from me this week again, while I'm jamming out to some jazzy Vanilla tracks I bid my farewells.** **Hope this caught you up a little bit with the events in the world of generative art, tech and AI of the past week! And I hope you have a lovely rest of the day and a great start into the week - I definitely am!** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Otherwise - Cheers, happy sketching, and see you in the next one - Gorilla Sun 🌸** ### In conversation with Peter Bauman - Demystifying Monk Antony URL: https://www.gorillasun.de/blog/in-conversation-with-peter-bauman-demystifying-monk-antony/ Last updated: 2024-08-28T13:36:55.000Z **Peter Bauman, aka Monk Antony over on Twitter, is the brain behind Le Random's editorial content section. Driven by a deep love for the arts and history, Peter is churning out an impressive number of excellent editorial pieces every week - interviewing leading artists in the space on a regular basis. Currently he is also responsible for building out the most comprehensive timeline on generative art history to date.** Peter Bauman has spent most of his adult life in Asia - living for 12 years in Hong Kong where he's worked in teaching and in finance, and having acquired two masters degrees in international relations he is no stranger to research and writing. After finding his way into Web3 through the FxHash discord and becoming one of the founding members of Tender, he became more and more involved with the community. He made his Web3 writing debut with a Tender editorial piece on [Erik Swahn's Farbteiler](https://www.fxhash.xyz/generative/slug/farbteiler?ref=gorillasun.de), one of the earliest projects on FxHash. In our conversation we talk about the early days of Tender, how it crystallized from a group of like-minded people on the FxHash discord that all shared an interest in generative art. We also talk about what writing in the Web3 space is like, and have a closer look at the process behind putting together the massive timeline that is being put together by LeRandom. Additionally, we discuss the generative art framework that Peter put in place for the analysis of generative art - how it has been received by people, some of their input on it, and how it might evolve in the future. ### Tender and the early FxHash Days **Gorilla Sun: Initially, I was going to ask you about yourself and your background - but then I discovered that you'd done an episode with WTBS in which you already do so. I thought that it would be more interesting to try and find some new insights, stories and anecdotes that might be interesting to the readers.** **\[**[**WTBS episode with MonkAntony**](https://podcasters.spotify.com/pod/show/waitingtobesigned/episodes/Telling-the-Story-of-Generative-Art-Interview-with-MonkAntony-e254gc0?ref=gorillasun.de)**\]** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-10-at-11.29.31.png) Peter Bauman in conversation with WTBS, pre Le Random's Launch **In the interview you mention that things really took off after you wrote the Tender editorial on Farbteiler. Maybe you could tell us a little about the incidents that led from writing that piece to becoming a founding member of Tender - and at the same time talk a little about how the initial group of people behind Tender came together?** MonkAntony: That's probably something that a lot of people are curious about. It started with [Adam Berninger](https://twitter.com/ajberni?ref=gorillasun.de), who is the main founder of Tender. Some of the other people that were involved at the very beginning were [Trinity](https://twitter.com/Trinity%5Fxyzz?ref=gorillasun.de) from WTBS, and [cosimo](https://twitter.com/cosipiovasc0?ref=gorillasun.de) who's now part of the FxHash team, essentially through the FxHash discord. As far as I remember, I think cosi and Trinity reached out to me via DM asking if I wanted to pick a project and write about it, and writing a piece was pretty much how you joined Tender back then. After Adam had curated those first 30-40 projects, that's where the others came in by writing editorials about some of them. [Farbteiler - TENDEREach Farbteiler is a rectilinear, mostly self-avoiding walk, dividing the space of the canvas with dotted grids using colors from Johannes Itten’s Farbkreis. Everything is inside and everything is outside.![](https://tender.art/favicon.ico)TENDER![](https://gateway.fxhash2.xyz/ipfs/QmdVkL9Cj7whcaFLQFCxMPn5JCZpZnaqVsZ9iviZLtUYhu)](https://tender.art/project/farbteiler?ref=gorillasun.de) That was in December of 2021, a month or two after FxHash had launched. The first project that came to my mind was Farbteiler because it was one of my favorite early projects. It was a fairly easy choice to join, and I think I was pretty lucky that they'd asked me. Within a month I'd written the piece, and then things continued with the Tender discord. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-10-at-10.58.54.png) Erik Swahn's Farbteiler on FxHash **GS: thanks for elaborating, I've been curious about that for a while now. You also mention in the interview that when you first discovered the NFT scene you felt that there were some aspects that were a bit unauthentic.** **And I think I know what you mean with that; when I first discovered the NFT scene for myself, it was a bit difficult to fully commit to things because I really couldn't tell what people's motivations and intentions were, alongside NFTs getting a bad rep, I just tried to be cautious. What was this experience like for you?** MA: When I first came into NFTs, maybe like a lot of people, it wasn't through the lens of generative art. You look at the entire landscape by joining all of these different chat groups, discords and communities, maybe you even participate, or you simply watch silently from the sidelines. A lot of the times with these different kind of communities, once you actually looked beyond the surface, it felt pretty superficial - there wasn't really much to dig into or talk about... with a PFP project, what do you actually talk about after 3 months? 6 months? 2 years? What do you talk about day in day out? Whereas, with FxHash there's new releases everyday, there's always new artists to discover, there's so much to learn about the movement in general. There was more than enough to talk about right-away. And it felt authentic. When I joined the FxHash discord, I felt a genuine sense of community, from a group of people that were interested in learning about something new, learning about generative art - especially from people that knew more, the early leaders in the space. That was the first time in Web3 where I felt a community aspect that actually worked and felt real - even more so when I joined the early Tender discord, a bit similar to the (famous) FxHash price-discussion channel, without any of the price discussions - it was only about artists and art. Being part of those two communities were learning experiences, that it was in fact possible to build genuine communities in the space, which is a difficult and rare to be honest. **GS: FxHash provides something of substance to it's audience, it's not just about NFTs, but also about programming, building things on the blockchain and pushing blockchain use-cases forward. For instance, people are creating some really innovative things with the new code driven params that you don't really see anywhere else.** ## Enter Le Random **GS: skipping forward a bit - how did the idea for Le Random start?** MA: The idea for Le Random finds its beginnings with [thefunnyguys](https://twitter.com/thefunnyguysNFT?ref=gorillasun.de); soon after the editorial piece for Farbteiler was published in February of 2022, he got in touch with me and said that he had a project in mind that we could maybe work on together. Then over the course of the following months we started a long-term chat about art - and back then in February I don't even think that "Le Random" had a name yet. Then thefunnyguys and co-founder Zack worked to raise funds and I joined in November. [Le Random: An Origin StoryOn March 8, we publicly announced the launch of Le Random, a digital generative art institution that aims to collect, contextualize, and elevate on-chain generative art.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Randomthefunnyguysthefunnyguys is in charge of the overall direction of Le Random and spearheads its acquisitions.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/6488a7b7268915b6e59cf377_64624d1caac27eb80112baab_nft-min.webp)](https://www.lerandom.art/editorial/le-random-an-origin-story?ref=gorillasun.de) Article by thefunnyguys on the original motivations behind Le Random. **Gorilla: besides that who're the other folks behind Le Random?** MA: In total there's 4 people that are core team members at Le Random. We have our co-founder Zack, who’s responsible for operations, and takes care of keeping the lights on behind the scenes. Besides that there's thefunnyguys and [Conrad (nemocake/@DISPUTED on Twitter)](https://twitter.com/DlSPUTED?ref=gorillasun.de) who're responsible for the collection, and adding new pieces on a regular basis. I take care of the editorial side of things, the content, the timeline, and Twitter stuff. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-11.58.01.png)](https://twitter.com/lerandomart/status/1709534874917359639?ref=gorillasun.de) A few days after I talked to Peter, Le Random announced one of their largest aquisitions to date! [Check out the thread here.](https://twitter.com/lerandomart/status/1709534874917359639?ref=gorillasun.de) But there's also an overlap; things are definitely not siloed. Conrad helps out with some of the things we tweet out, and I try to help with the collecting as well. But generally that's what we focus on. **GS: that's interesting, I didn't know that Conrad was involved, although I do see him pop up quite frequently on my Twitter timeline. All of this makes me feel like I need to get more on discord.** MA: these days I don't know how people do discord anymore, I'm not on discord anymore really. In 2021-22 I was fortunate to have some time to be a bit more involved, but now I wouldn't know how. ## The Timeline and Writing in Web3 [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-10-at-11.26.50.png)](https://timeline.lerandom.art/?ref=gorillasun.de) [You can explore the entire timeline over on Le Random's website.](https://timeline.lerandom.art/?ref=gorillasun.de) **GS: Earlier this year I wrote a little piece about** [**Vera Molnar's early life**](https://www.gorillasun.de/blog/the-art-of-vera-molnar/)**, and that was quite a difficult article to write because information on the internet is quite dispersed when it comes to events from a pre-internet era.** **What's your process for building out the timeline, finding and putting together information in a meaningful manner? And what does that look like behind the scenes?** MA: I actually started working on the timeline a year ago, even before I had joined Le Random - sort of in an ad-hoc manner. Reading books about generative art, I started noting down the events that I would come across by their corresponding year. Being something that I had already worked on for a bit, with Le Random we talked about really wanting to delve into the history of generative art and decided to turn it into a bigger project. The foundation for the timeline was laid by those first couple of books that I read. 1. *When the Machine Made Art by Grant Taylor* 2. *Computer Graphics–Computer Art by Herbert W. Franke* 3. *Art of the Electronic Age by Frank Popper* 4. *Digital Currents by Margot Lovejoy* All of this began November of last year (2022) - the website wasn't live until June however, so I had quite a few months to start working on it and do research; it was the main thing that I was doing while we were still building out the website. The process has been pretty monumental. There's been quite a few exhibitions back then, most of which aren't documented in any way, which makes it difficult to go into the details - sometimes you come across some obscure corner of the internet, where you find an exhibition catalogue, which then turns out to be a gold-mine of information. So as you said, the difficulty does not only lie in finding the information but also being detailed about it. What's more is that each period of time presents it's own challenges. That's why I've been doing it decade by decade for the most part, right now wrapping up the 80s. When all of it's done, there's probably going to be several hundreds of these moments, each one of them is like writing a mini research paper, which takes time in it's own rights. For the most part I try to use primary sources, but if there's respected secondary sources I'm also happy to draw from them directly, like [Herbert Franke's book Computer Graphics - Computer Art](https://www.amazon.de/Computer-Graphics-Herbert-Werner-Franke/dp/0714815039?ref=gorillasun.de) for instance, or [When the Machine made Art](https://www.amazon.de/-/en/Grant-D-Taylor/dp/1623567955?ref=gorillasun.de) is also a good one. At this point the timeline is roughly 70% finished. Whenever I'm not busy working on some other content for Le Random I try to do a few moments of the timeline each day. That's mainly how I've been doing it these days. It's a big task, and to even finish something that takes this much time you really have to love it and intrinsically be interested in it, otherwise there's no way you can finish. Luckily I'm obsessed with it, and it energizes me to just work on it - that's how I've been able to keep the momentum for so long. So I know that I'll be able to finish it in these coming months. And I really do appreciate you and some of the other people in the community that have recognized the amount of work that has gone into it. That also definitely also helps maintain the motivation. **GS: I really appreciate the work that you do, and it shows that a lot of time and passion goes into the content. I know from personal experience how much time it takes to research and write out these things.** MA: Same to you, the newsletter that you put out, I know, again, from personal experience, that that must take time. **GS: the newsletter is still quite young, but it feels like it's worth the time, based off of the responses I've gotten so far, it seems that people are really into it.** **On the flip-side, it's also sometimes a bit difficult when you put out something that you've worked on a lot, and it doesn't end up garnering much interest. How do you personally deal with that?** MA: Oh, I have plenty of experience with that. Maybe one fortunate aspect of this job is that I don't have much time to dwell on things. If I do release something and it doesn't get the response I was hoping for I'll maybe think for a few minutes about why it didn't, maybe the piece was too long, or maybe even the tweet about it was too long, or too short... or maybe it was tweeted out at a bad time, and people were busy with other things. It's often hard to say, and you try to make your best guess, but what's important is to just stick with it, learn what you can from these experiences and then to continue. Luckily I'm in a position to do that and not even have the opportunity to dwell too much. \[laughs\] **GS: that's a really good way to go about it. Now that you mention it, I've also noticed that whenever a piece gets too long, it often performs worse than if it were shorter.** MA: Yeah that's true, people can get a bit overwhelmed with longer pieces. I doubt that every single word gets read by every single reader, but I do know some people that enjoy it all. So it' s a tough balance - there maybe is a hard limit. **GS: if it's a topic that has a lot of meat to it, sometimes things need to be lengthier if you want to do it justice.** ## Demystifying Generative Art **GS: You've written this wonderful article titled Demystifying Generative Art, it's quickly become one of my favorite pieces of writing on generative art.** [Demystifying Generative ArtPeter Bauman (Monk Antony) develops a framework for appreciating and analyzing generative art through an investigation of the movement’s locus of artistic intent.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64b80a26a2fd5b2f287e7e39_Screenshot%202023-07-19%20at%205.06.29%20PM.png)](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) **I like thinking about generative art, on a conceptual level, how to asses and analyze different works, I believe that it helps us better understand what we're actually doing and why we deem certain works more interesting or valuable than others.** **I've thought a lot about which category I personally would fall into, in your proposed framework - and I'd have to say that I tend towards the resultist end of the spectrum. Ultimately, the output is the tangible thing that people will interact with - it's the only connection that they can have with the concept and even the process. If the piece doesn't exist then they also can't experience any of the other aspects of it.** **To go further on this, I might even say that the concept doesn't matter that much; it is often the case that generative artists have an exploratory approach where they arrive at the artwork by seeking and finding. A different perspective here would be that the concept and the process are contained within the result, essentially making the result a proof of concept and a proof of process. There isn't really a question here - but maybe you could tell us a bit more about the framework and your thoughts on this.** MA: I find it fascinating how people have been responding to the article. My original motivation for writing it was seeing a lot of discussions about appreciating generative art, but there weren't that many pieces that addressed the topic. There are a few academic papers on it, but they usually tend to be more focused on the process. There are obvious exceptions like Zach Lieberman and Tyler Hobbs for instance. Tyler Hobbs has also written about it, out of annoyance at people focusing too much on the process. [Intellectualism Has Hampered Generative Art — Tyler Hobbs“We can hardly imagine giving up the intellect. To be an intelligent person has been the thing from the beginning. But the intellectual way and the inspired way are two different ways. If you are an artist the intellectual way has to be given up. If someone says this work is brilliantly conceived![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Tyler HobbsIntellectualism Has Hampered Generative Art![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/t/5c4f404f8a922d4e313c8048/1548697684594/EssayHeader_2.jpg?format=1500w)](https://tylerxhobbs.com/essays/2018/intellectualism-hurts-generative-art?ref=gorillasun.de) Seeing that iconic figures like Zach Lieberman, Tyler Hobbs and Casey Reas seemingly disagreed when asked the same question and felt so vastly different about the practice - further motivated me to explore the topic. I wanted to find a way to use parts of what they were saying in a more complete manner, and find a framework for thinking about generative art and appreciating it. Concept and context I believe are obvious add-ons to process and result - as for autonomy, that element was actually one of the first things that I started thinking and writing about. After writing about Farbteiler, I did some more theoretical writing for RCS: [Generative Art and the Decentralization of CreativityPeter Bauman detects an emerging paradigm of communal art practice![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Alex Estorick![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/625588561a1e6cd887219206_Screen%20Shot%202022-04-12%20at%2015.08.34.png)](https://www.rightclicksave.com/article/generative-art-and-the-decentralization-of-creativity?ref=gorillasun.de) > At the other end, generative art is inherently free of artist control. The generative artist cedes control to an autonomous system. The question of how much control they cede depends on whether they are a short-form or long-form generative artist. What's unique to generative art in Web3 is the decentralization of creativity, and I wanted that aspect to be included in the framework. To some artists this is very central to their work, like [Qubibi](https://twitter.com/qubibien?ref=gorillasun.de) or [Harvey Rayner](https://twitter.com/harvey%5Frayner?ref=gorillasun.de). \[chuckles\] There's other artists that I've interviewed, that I would definitely call autonomous, but they even replied saying that "I am not". So I understand that the framework isn't perfect, there's plenty of people who told me that they haven't found where they belong on the framework, clearly into none of those five elements at least. And I understand that, the framework was never meant to be like these are the 5 elements and there's nothing else. It's understandable to feel uncomfortable being categorized and grouped into a specific camp so I understand wanting to resist the framework, as well as thoughts about expanding it. At the same time, all of these different and varied approaches are what make this multi-disciplinary practice so interesting, allowing for so many ways to think about it at the conceptual level. **GS: I think it's the case that a lot of artists aren't entirely certain about what they want to be or what they are actually doing, it's more of a search. It definitely is the case for me.** MA: I think that is very common. DEAFBEEF talked about this as well; a cornerstrone of his practice is experimentation and iteration, and I think that's really common. Coding just lends itself to this iterative approach. [DEAFBEEF on (Im)permanenceDEAFBEEF reflects on themes such as the tension between permanence and impermanence in his work HASHMARKS, released through Bright Moments. He also ruminates with Peter Bauman (Monk Antony) on celebrating the singularity of the present plus finding agency in life and art.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/650aa9a53c2b2cc68d890e81_Screenshot%202023-09-20%20at%209.09.56%20AM.png)](https://www.lerandom.art/editorial/deafbeef-on-impermanence?ref=gorillasun.de) If there were to be more parts added to the framework, it would make sense to include an element that captures the iterative and experimental nature of programming. I made a stab at this in the DEAFBEEF interview, maybe an *experimentalist* category would make sense but it's maybe not the most descriptive term. Do you think that might better capture your approach? But you already said you tend towards Resultism. I think it's healthy that people are thinking about these things and trying to make the framework better, that I in no way consider complete. Even when I first started I did get a lot of feedback on it already, from people that I respect so much in the space, like Golan Levin, Zach Lieberman, etc. Now whenever I interview someone I try to squeeze in the question about it and see where they lie on the framework. What's more, is that it also helps explain to people outside of the space why certain works are important; for instance you can't only look at the aesthetics of the 60s plotter works, from Vera Molnar for example, and judge it based on that - you also have to consider the context, and how difficult every single thing they were doing at the time was. It's a work in progress, in the long term my aim is to write detailed deep dives about each one of the elements in the framework. But that's gonna take some time \[laughs\] **GS: completely agree and super excited for when these will come out. I think there maybe also needs to be a distinction between which side on the mirror you're on, if you're someone that creates art vs someone that collects/appreciates/looks at the art from the outside.** MA: That's definitely something I've thought about as well, and I probably have to clean that aspect up and somehow clarify it in the framework. ## On AI Art **GS: this makes me wonder, what do you think about AI art? do you consider it generative art?** MA: I definitely think that AI art is generative, but at the same time it's a very broad topic. In a way it's that classic Philip Galanter "artist ceding control to an autonomous system", and I certainly think of AI as autonomous systems, with different degrees of autonomy. But I would certainly consider it generative. [Decoupling Generative Art with Philip Galanter‍Peter Bauman (Monk Antony) reflects on Philip Galanter’s classic 2003 definition of generative art before briefly speaking with the artist, Texas A&M professor and theorist about the definition twenty years later.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64df883d54b968a39c3b4508_Once%20upon%20a%20flower%20A-0X02_Linda%20Dounia.png)](https://www.lerandom.art/editorial/decoupling-generative-art-with-philip-galanter?ref=gorillasun.de) I'm also aware that people have different views on the amount of time that goes into the creation of AI artworks, and I know that some artists look down on AI art, at least on prompt based work. There maybe is a conception that it's easy to do, and that maybe there's not much 'craft' involved in the creation of AI artworks. As someone who's worked a little bit with tools like midjourney I certainly think that you need a certain talent. Overall I feel positively about AI art because it's giving more people the opportunity to make art. Again, some people think that that's a negative but I believe that it's a positive. **GS: Things have certainly become a lot more accessible in comparison to just a couple of years ago, but I still think there's a distinction to be made between artists that create and train their own models as compared of the prompting practice.** **In generative art you usually build the system and then you harness it. When it comes to prompting you often work with models that can't be modified anymore, so it's a different kind of generative art.** I agree that there are levels of sophistication, artists like [Ivona Tau](https://twitter.com/ivonatau?ref=gorillasun.de), or [Sofia Crespo, ](https://sofiacrespo.com/?ref=gorillasun.de)that use datasets and train their own models. You hope that the collectors recognize the extra effort that these artists put in, and I think they deserve all of the more recognition. ## Origin of Monk Antony **Gorilla: where does your Twitter handle Monk Antony come from?** I really love history, history in all forms. At night I listen to history podcasts that help me go to sleep, and I'm always watching history documentaries - "Monk Antony" is a bit of a play on the name Mark Antony (Marcus Antonius), a political leader in the first century roman empire. Basically, it's a nod to my love of history, and obviously there's some relation there to art history and the work I do at Le Random. It's not like it's a 20 year old nickname from when I was a kid, but it is the only handle/username since I've been in the space. **Gorilla: what about your profile picture on Twitter?** That's a one of one by Karan ([Karan4d](https://objkt.com/profile/karan4d/created?ref=gorillasun.de)). He just sent it to me, maybe 18 months ago now, airdropping one of ones to some of his collectors, and that just happened to be the piece he sent to me. I really love the colors in it, I'm a sucker for that sunset color palette with pinks and blues. And the person in the image kind of looked like a monk as well, so I decided to just go with that. I didn't want to have a traditional pfp or whatever, this one was a little special, an artwork sent directly to me by the artist. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/blue-men-717.png) [Link to Token](https://objkt.com/asset/KT1ByUbaevRLBXKRrVPc1VFesQmjcwPJGgC3/6?ref=gorillasun.de) ## Artists to keep an eye on **Gorilla: Who are some of the artists in the space that you think are doing transformative work?** I like artists who are already thinking about doing things beyond the blockchain, beyond a hundred or a thousand outputs - artists like operator are really interesting, there's a lot of conceptual levels to their work, like they did with human unreadable, which isn't just an ArtBlocks curated project but has a choreographed score and a performance attached to it. That kind of work is really interesting. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/455000005.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/455000006.png) [Human Unreadable by Operator](https://www.artblocks.io/collections/curated/projects/0x99a9b7c1116f9ceeb1652de04d5969cce509b069/455?ref=gorillasun.de) Another one is [0xhaiku](https://twitter.com/0xhaiku?ref=gorillasun.de), a Japense artist, and I love what he does, adding an interesting physical element he was going around Tokyo with a sort of receipt printer, where you could mint an NFT from him and he'd hand the receipt afterwards. These conceptual pieces that are thinking about what we can do in the space in a more interesting way and go beyond the blockchain, I find those to be some of the most interesting works. Besides that there's also artists like Rhea Myers and Maya Man, who's work aims at using the medium to criticize the medium itself. I think works like that will be lasting, when we look back there's kind of a lot of noise right now, but I think some of those artists will be what we remember. At least I will. [Rhea Myers on Code as Cultural MaterialArtist, hacker and writer, Rhea Myers, discusses her thoughtful contributions to the group exhibition GEN/GEN: Generative Generations and more with Peter Bauman (Monk Antony). Myers unravels her artistic practice, touching upon code-as-narrative, “Blockchain Aesthetics” and the dialogue between her…![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/651160dab888ea4eb749020a_1-toejectadiskundermacos_1.webp)](https://www.lerandom.art/editorial/rhea-myers-on-code-as-cultural-material?ref=gorillasun.de) [Maya Man on Generative MeaningMaya Man, an artist focused on contemporary identity culture on the Internet, sat down with Peter Bauman (Monk Antony). Using Man’s exhibition and project I’m Feeling Lucky on Verse as a jumping off point, they discuss horoscope culture as a belief system, finding meaning in randomness, the role of…![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/6501758cbd0d59041f18d53c_Maya%20Man_I%27m%20Feeling%20Lucky.png)](https://www.lerandom.art/editorial/maya-man-on-generative-meaning?ref=gorillasun.de) ### ## Concluding Thoughts It was an absolute pleasure to talk to Peter, and I am very grateful that he took the time out of his busy day to talk to me. He's one of the truly knowledgeable people in the space, thinking about generative art, in it's current state and where it's heading in the future, at a conceptual level like few others do. I really recommend following his endeavors over at LeRandom and exploring the timeline for yourself. **Yet again, we find ourselves at the end of the article; here's the mandatory call to action - if you've reached and read this far, it most likely is an indicator that you've enjoyed this article - if you did, consider sharing it on your socials, with friends and followers, it helps tremendously and tells the algorithm that this is meaningful content.** **Otherwise consider signing up to the newsletter to receive updates directly in your inbox whenever there's new content. That said, that's it from me - see you in the next one - cheers, and happy sketching - Gorilla Sun 🌸** ### Gorilla Newsletter 25 URL: https://www.gorillasun.de/blog/gorilla-newsletter-25/ Last updated: 2024-08-15T08:04:31.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## Ben Fry resigns from the Processing Foundation We start off with some hard-hitting news. This past week, Ben Fry, one of the creators of Processing, announced his resignation from the Processing foundation: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-06-at-09.58.11.png)](https://twitter.com/ben%5Ffry/status/1709400641456501020?ref=gorillasun.de) [Link to Tweet](https://twitter.com/ben%5Ffry/status/1709400641456501020?ref=gorillasun.de) Unarguably a shocking announcement to many, this decision came seemingly out of nowhere. In the unfolding Twitter thread, Ben Fry elaborates on why he came to this decision: > Last fall, with urging from Casey, who was planning to leave, I tried to return to an active role with the Board. It was a strange experience; I was soon shocked to learn that the Foundation spent nearly $800,000 last year. $0 of that went to Processing 4\. This year, the proposed Foundation budget is around $1.2 million. But for Processing, there is budget for just two people: one developer, one community lead. The announcement sparked quite some controversy and discussions in the community - being that many donors have contributed significant sums towards the foundation over the years. It definitely raises questions about how that money is being spent. Is processing, and by extension P5, largely maintained and developed by open source hobbyists, when there's enough money to have a dedicated development team at the foundation? Ben Fry's tweet doesn't however provide enough context or information to make a complete picture of the circumstances. This prompted responses from the other board members Casey Reas, LaurenLee McCarthy, and Daniel Schiffman: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-14.18.05.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-14.22.16.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-14.19.17.png) [Link to Casey Reas' Tweet | ](https://twitter.com/REAS/status/1710381588658454749?ref=gorillasun.de)[Link to Lauren Lee McCathy's Tweet](https://twitter.com/laurenleemack/status/1709951991311737100?ref=gorillasun.de) | [Link to Daniel Schiffman's Tweet](https://twitter.com/shiffman/status/1710411876029349985?ref=gorillasun.de) Golan Levin also spoke out about it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-14.23.07.png) [Link to Golan Levin's Tweet](https://twitter.com/golan/status/1710518477792952583?ref=gorillasun.de) It is sad to see Ben Fry leave under these circumstances, he's undoubtedly made massive contributions to the worlds of computational design, creative coding and generative art as a whole. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-06-at-10.27.23.png) [The threads on the hackernews posting of Ben Fry's Twee](https://news.ycombinator.com/item?id=37760363&ref=gorillasun.de)[t](https://news.ycombinator.com/item?id=37760363&ref=gorillasun.de) also shine an interesting perspective on things from people that might not be as closely involved with porcessing, p5 and creative coding in general. I have no particular stance on this - I am grateful for everything the Processing Foundation does, the lovely and welcoming community it's built and continuously ## All the Generative Things Besides that, it's actually been quite an eventful week, full of new articles and interesting projects to check out! To be frank, last week has been absolutely bonkers! I always tell myself to not overdo it with the Newsletter, but I just end up finding so many things that I think need to be included... while I'm at the same time probably missing a lot of things as well. ### MIT Media Lab Lunch Lectures A bit late to the party since - I only discovered a couple of days ago that, throughout this past month of September leading into the first two October weeks, the Future Sketches Group from the MIT Media Lab is holding a lunch lecture series for everyone to join in on and learn from: [Lunch Lectures: Computational Typography – MIT Media LabJoin the Future Sketches group on Fridays from 12 – 1pm ET for the Lunch Lectures Fall 2023 edition about Computational Typography![](https://www.media.mit.edu/static/images/icons/apple-icon-180x180.7c705d989dde.png)MIT Media LabVera van de Seyp![](https://dam-prod2.media.mit.edu/thumb/2023/08/10/lunchlectures%20(10).png.1400x1400.png)](https://www.media.mit.edu/posts/lunch-lectures-computational-typography/?ref=gorillasun.de) Before you succumb to FOMO like I did when I saw that I'd missed these lectures - rest assured, the sessions have been recorded and will be linked to on their page once they've been edited! This lunch lecture series was already done once this past February, with a different overarching theme Generative AI and artistic practice - you can find the recordings here: [Lunch Lectures: Generative AI and Artistic Practice – MIT Media LabJoin the Future Sketches group on Fridays from 12 – 1pm ET for the Lunch Lectures Spring 2023 edition about Generative AI and artistic practice.The Future…![](https://www.media.mit.edu/static/images/icons/apple-icon-180x180.7c705d989dde.png)MIT Media Lab![](https://dam-prod2.media.mit.edu/thumb/2023/01/25/lunchlectures-futuresketches.jpg.1400x1400.jpg)](https://www.media.mit.edu/events/future-sketches-lunch-lectures/?ref=gorillasun.de) ### Arbitrarily Deteministic x Lisa Orth Ken has been on a roll this past few weeks - this time he's back at it, joined by the prolific Lisa Orth - check out the episode here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-09.38.33.png) [Link to Episode](https://podcasters.spotify.com/pod/show/kenconsumer/episodes/AD041---Lisa-Orth-e2a7ti8?ref=gorillasun.de) They talk about a variety of code related topics, about Lisa Orth's upcoming release with Feral File (more on that in the next section) - and it's overall just a really fun conversation to listen to. Had a blast listening to it while working on this newsletter! ### Feral File - TRUTH Shining some light on Lisa Orth is also the perfect opportunity to share the upcoming Feral File exhibition that she's taking part in, alongside an impressive roster of other artists: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/F7m63NhbcAAr4Jc.jpg) [Link to Feral File](https://feralfile.com/exhibitions/upcoming?ref=gorillasun.de) Truth is the newest upcoming Feral File exhibition, a group show of 8 stellar generative artists all of which created work around, curated by none other than [Adam Berninger](https://twitter.com/ajberni?ref=gorillasun.de) who's doing incredibly work in this regard, giving artists the chance to present their works in a meaningful manner: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-09.47.02.png) [Link to Tweet](https://twitter.com/FeralFile/status/1708903463235490004?ref=gorillasun.de) ### Vitreous by Charlotte Dann Charlotte Dann is one of the other artists taking part in this upcoming Feral File exhibition with her project titled Vitreous. I've come across quite a few outputs of the project while scrolling down on my timeline, and it's aesthetics always made me stop and take a moment to have a closer look. Blurry and muted gradients tracing the circumference of the voronoi-esque background blobs in the background, standing in contrast to the more geometric and accentuated inorganic lines in the foreground makes for captivating compositions - link to a thread about Vitreous as well as an interview about the process that lead to the creation of the compositions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-10.17.06.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-10.21.45.png) [Link to Thread](https://twitter.com/FeralFile/status/1709651490275500229?ref=gorillasun.de) ### TinyCode > Brevity is the Soul of Wit - Shakespear You might remember Frank Force from the newsletter of two weeks ago, where I featured his generative Pottery FxParams project - he recently gave a talk about Tiny Code for Js GameDev summit - you can find the entire talk here: Frank points out an amazing paltform for the purpose of tiny coding with Javascript: Dwitter! If you're familiar with tsubuyaki processing over on Twitter, Dwitter is essentially a dedicated platform for this purpose - where you can share these tweet sized codes and the browser will automatically run and visualize them once posted: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-10.38.00.png) [Dwitter.net](https://www.dwitter.net/?ref=gorillasun.de) Frank talks in detail about how the platform works and also breaks down some dweets to give some examples. I think that this is also a good chance to pitch an article that I've written last year about Tsubuyaki Porcessing and some of the tricks that people use to make tiny tweet sized P5 programs: [9 Tips for Tsubuyaki ProcessingTsubuyaki processing has become a popular and fun little challenge on Twitter. In this post I’ll be going over some character saving tricks that can come in clutch when you’re out of ideas for reducing the size of your code!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tsubuyaki.jpg)](https://www.gorillasun.de/blog/9-tips-for-tsubuyaki-processing/) ### Eko33 on early computer art I found this thread by Eko33 interesting because he points towards characters that you wouldn't directly associate with having contributed to the generative art movement, but have actually made important contributions that pushed the field forward: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.24.05-1.png)](https://twitter.com/Eko3316/status/1709842189939818894?ref=gorillasun.de) [Link to Tweet](https://twitter.com/Eko3316/status/1709842189939818894?ref=gorillasun.de) Important thing to note here - click on the ALT text icon in the lower left corner of the images to reveal the name of the people depicted in the attached images! Aaaand while I have your attention - how about signing up to the newsletter? If you're viewing this in the browser and aren't subscribed to the newsletter yet - consider doing so! It's free!You'll receive this entire publication directly in your inbox every Monday, as well as other articles, essays, tutorials and interviews occasionally throughout the week! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ## Pen & Plottery Coincidentially, there's been a number of things revolving around works made with plotters this past week - hence it makes sense to bundle them in their own individual section. ### Le Random interview with Sougwen Chung I mentioned Sougwen Chung in last week's newsletter, showcasing her amazing innovative plotter work, that was featured as a part of the GEN/GEN: Generative Generations exhibition at the Gazelli Art house. Peter Bauman wasted no time to getting a hold of Sougwen and talking to her about her practice and how she collaborates with the machine to create art: [Sougwen Chung on “Us in Another Form”Multidisciplinary artist Sougwen Chung delves into her unique contributions to the exhibition GEN/GEN: Generative Generations, the evolving discourse on human-machine interconnections and more with Peter Bauman (Monk Antony).![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/651d7454552d4c520ec7b091_SWC.png)](https://www.lerandom.art/editorial/sougwen-chung-on-us-in-another-form?ref=gorillasun.de) Throughout their conversation Sougwen elaborates how her work is influenced by the ideas of the Japanese avant-garde Gutai group that was formed in 1954, that took a radical approach towards art making. As always, an incredibly insightful interview. What's more, is that Le Random recently made their largest acquisition to date, adding 11 iconic pieces to their ever growing collection - the list goes here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-10.55.03.png) [Link to Thread](https://twitter.com/lerandomart/status/1709534874917359639https://twitter.com/lerandomart/status/1709534874917359639?ref=gorillasun.de) ### Cory Haber - Apophenies Sougwen Chung is not the only artist that makes stellar work with plotters - Cory Haber knocks it out the park with Apophenies that is launching in a few days with Bright Moments. Cory Haber spent the better part of the past 5 years in the attempt to create oil paintings with plotters - the digital works released with Bright Moments will be accompanied by physical instantiations of the artworks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-11.03.20.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-11.01.46.png) [Link to Cory Haver's tweet](https://twitter.com/Cory%5FHaber/status/1708807613146607619?ref=gorillasun.de) | [Link to Bright Moments' tweet](https://twitter.com/brtmoments/status/1704961128051380716?ref=gorillasun.de) ### Gestures of the Generative Painter I also came across a tweet by Licia He pointing out a beautiful article that discusses painterly textures in generative art, and why so much effort has been spent on the recreation and simulation thereof. [Gestures of the Generative Painter - OutlandGenerative art’s expressivity is less about imitating painterly gestures than devising a system to produce them.![](https://oh.imgix.net/wp-content/uploads/2021/09/cropped-outland-icon.png?auto=format%2Ccompress&fit=crop&ixlib=php-3.3.0&max-h=192&max-w=192)OutlandBrian Droitcour![](https://oh.imgix.net/wp-content/uploads/2023/10/licia-he-Sparkling-Goodbyoe-04-2023.png)](https://outland.art/generative-painting/?ref=gorillasun.de) The article by Brian Droitcour, Editor-in-chief of Outland, delves into the history of digital brush strokes and tries to analyse where our obsession with skeuomorphic looking pen/brush strokes stems from: > For centuries, art critics have attributed to visible brushwork a vitalist force. The trace of the artist’s hand is an imprint of the artist’s soul, identifying the work of art an expressive act. Licia He's perspective on this is also interesting - she attempts to invent new digital art supplies rather than recreate existing ones: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-11.59.55.png) [Link to Tweet](https://twitter.com/Licia%5FHe/status/1710346412683047379?ref=gorillasun.de) ## MOMA Postcards You've probably seen this, because it's been all over the news - but MOMA launched their tezos powered digital Postcards: [HELLO WORLD | The MoMA PostcardA new project from The Museum of Modern Art celebrates co-creation on the blockchain![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)The MoMA PostcardMadeleine Pierpont![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/651c17bcfbdcad5e31ba3161_Screenshot%202023-10-03%20at%2014.31.33.png)](https://www.rightclicksave.com/article/hello-world-the-moma-postcard-digital-artists-interview?ref=gorillasun.de) It's essentially an experiment in decentralized art making powered by the Tezos blockchain, and arguably one of the coolest projects this year. It took me a bit to understand how it works, after looking into it I found this thread by Autonomy that clarifies the procedure of participating and creating your own postcard: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.29.22.png)](https://twitter.com/AutonomyWallet/status/1710298241701384465?ref=gorillasun.de) Link to Thread Basically, to sum up the steps for creating a postcard: 1. [Sign up to the waitlist on the MOMA website here](https://www.moma.org/calendar/exhibitions/5618?ref=gorillasun.de), you'll get invited once it's your turn, postcards are being distributed in limited quantities for now. 2. You start by minting a blank postcard - I have no information on what the interface looks like or where you can find it. 3. Activate the postcard via the Autonomy app. If you don't have it, you need to download it. Again no info what that looks like. 4. Now you can design a stamp by filling out a 10x10 pixel grid with a color palette provided by MOMA - similar to 8bidou I guess. 5. After you've done so you need to sign the stamp, basically layering your stamp with a digital signature. 6. You insert your stamp on the postcard, pinning the artwork on IPFS, interacting with the blockchain and eternalizing the stamp onto the postcard. 7. Postcards are essentially fractional tokens, owned by several people at a time. Once you finish your stamp and add it to the postcard, you send the postcard to another person (can be done via regular messaging apps) who then repeat these steps and keep forwarding it until the entire card is filled out. I hope that this clears it up a little. Let me know if you have more info on this! I also really enjoyed this tweet by Cabline: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.50.33.png) [Link to Tweet](https://twitter.com/cabline1/status/1709560477972340741?ref=gorillasun.de) ## Versum is shutting Down Another sad news that I want to relay this week is Versum's announcement that they're shutting down, gradually over the coming weeks. We're informed about this by their official statement: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.51.58.png) [Link to Thread](https://twitter.com/cabline1/status/1709560477972340741?ref=gorillasun.de) The Versum team further states their gratitude towards the community: > This wasn't an easy choice, but it's a necessary step for various reasons, which we won't delve into here. We want to take a moment to express our heartfelt gratitude for your unwavering support, participation, and enthusiasm. > You've made Versum a vibrant space for artists, collectors, and Tezos NFT enthusiasts alike. Your creativity and engagement have been the lifeblood of this marketplace, and for that, we are eternally grateful. The current climate is harsh, amidst this bear-market Tezos isn't doing that great. Over on the discord there were some further clarifications about the financial issues revolving around this decision: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.56.02.png) Versum was a platform focused primarily on Art, I can still remember Andre's excitement when he got on sableraph's twitch stream talking about the platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-09-at-12.58.59.png) It is unlikely that someone with massive financial means is reading this newsletter, but if you do know someone that would be interested in investing in a talented team of developers with a passion for art - consider getting in touch with them. ## Weekly Web Finds Besides this mixed bag of Generative Art and Web3 things there's also a few other cool things I came across on the internet this week. ### Learning to Program - The HARD Way I quite enjoyed this video by Theodore Bendixson giving arguments why sometimes it's necessary and beneficial to do things the hard way, especially when it comes to programming - certain knowledge and expertise can only be acquired in that manner: The original motivation behind Theodore's video is a comment that he received on one of his updates regarding the video game that he was developing, pointing out that it was taking him a long time to code up his game-engine when he could have simply used a commercial one. I can relate on many points, it is an incredibly experience to figure out things by yourself. Maybe a slightly hard-headed way to look at things, but having that *eureka* moment when you finally figure out a problem that you've been stuck on for a while is simply invaluable. Instead it can often be the case that you rob yourself by simply using a tool that is already available. I'm curious, what are some of your programming experiences where you finally figured it out after repeatedly running into a brick wall? ### Next.js vs Remix: An In-depth case study I only know very little about Next.js and have actually never heard of remix, but both of them are react frameworks that provide the building blocks to create fast web-applications. In this post by Prateek Surana he compares the two by creating a Twitter clone and comparing the two on several criteria, like performance and the experience he had building an app with them: [Next.js 13 vs Remix: An In-depth case studyA detailed comparison of the features Next.js 13 and Remix Run by building a Twitter Clone app in both frameworks.![](https://prateeksurana.me/favicons/safari-pinned-tab.svg)![](https://prateeksurana.me/img/nextjs-13-vs-remix-an-in-depth-case-study.png)](https://prateeksurana.me/blog/nextjs-13-vs-remix-an-in-depth-case-study/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) ## AI Corner ### A brief note on predatory monetization schemes using open source AI models This week, the Newsletter's banner image is AI generated, made with Dall-E 3, OpenAI's powerful generative image model that is made readily available with the bing browser. The only reason for my experimentations being that it is free to use. I generally think that you should not pay for websites that offer AI services - at this point at least - in many cases they are built on models that have been open sourced, and often don't add much to the table other than providing a nice interface. If you spend a little bit of time you can usually find public google colab notebooks that can help you solve whatever task you were looking for, whether it be automatic audio transcription from a sound file, neural network powered translation of some text, or the synthesis of pretty images. You can in most cases find open source models that allow you to do that FOR FREE. I feel that this needs to be said, because the number of predatory monetization schemes in this regard have recently emerged. If you find a service that you genuinely think is worth the money I absolutely have nothing against that, I just urge everyone to do their due diligence before reaching for their credit card information. ### Current State of the Art AI Image Generators Pivoting off of the previous point - each time I check back in to see how far the current state-of-the-art image generators have come, I'm left utterly speechless. Now more than ever. Looking past all of the problems that come in tandem with these image generators - it is still incredibly impressive technology. Show this to AI researchers from 50 years ago, they wouldn't be able to comprehend what they're looking at. Back in the 80s we were predicting silly things like flying cars and hoverboards - I'd argue that what we've reached is multitudes more impressive than that. Is it art? Is it generative art? That's a topic that needs a lengthy discussion to be addressed and can't be simply answered with a yes or no. I posted some images that I generated with Dall-E 3 over on Twitter and Instagram picturing gorillas sitting in meadows, with the sun rising behind them, simply as an ode to my internet handle: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/_2f6fcd05-3a92-4e2f-8e99-aec7e2446c0b-2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/_55872c8b-62e1-49dd-89fc-22ad50f01e84.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/_de294225-a0ac-421c-92be-73530552e02f.jpg) I've always loved a painterly style, especially oil on canvas in an impressionist style, with thick brush strokes and bright, saturated colors. I've been thinking about the ethical problems of AI art quite a bit in the past weeks, and over on Instagram I got this comment from David Matthew which I wanted to share here as well as I believe it brings an important perspective, and I think my reply shows my position on the matter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-08-at-15.24.48.png) The problem with AI generated works are the companies that make it so readily available as a monetized service, having trained their models on datasets that have been acquired by dubious means, without any respect to the artists that have dedicated their lives to the craft. Maybe I will write about this in more detail in a future post. ### Chatbot Hallucinations are poisoning Web Search An interesting adverse effect of AI powered chatbots is that these conversational threads that users are having with LLMs are being indexed by search engines, to the great detriment of the rest of the search results: > The age of [generative AI](https://www.wired.com/tag/artificial-intelligence/?ref=gorillasun.de) threatens to sprinkle epistemological sand into the gears of web search by fooling algorithms designed for a time when the web was mostly written by humans. [Chatbot Hallucinations Are Poisoning Web SearchUntruths spouted by chatbots ended up on the web—and Microsoft’s Bing search engine served them up as facts. Generative AI could make search harder to trust.![](https://www.wired.com/verso/static/wired/assets/favicon.ico)WIREDCondé Nast![](https://media.wired.com/photos/651dec583f56c202434baa79/191:100/w_1280,c_limit/business_chatbot_search_engine_lies.jpg)](https://www.wired.com/story/fast-forward-chatbot-hallucinations-are-poisoning-web-search/?ref=gorillasun.de) I don't know if there's a solution for this other than simply cutting these results from search for now (or forever) but it also forebodes a grim future where a lot of resource will be replaced by LLMs. In some ways I am a little concerned for my writing and the work that goes into the blog. Only time will tell though. ## Gorilla Updates Not much to report from my end this week, been mainly writing, and only got the change to do a little bit of sketching at the beginning of the week. When this newsletter goes out and you're reading this I'll probably already be working on some new stuff - it's about time I put out some new things (I know I keep saying that but this time I'm actually tracking down some banger ideas for reals (fosho bro, fosho)). One thing I worked on was refactoring my hachure code and rethinking how I structure sketches with polygon intersections, decoupling the different parts of the code that take care of creating the polygons, drawing them to the canvas, checking for instersections and subsequently filling out these regions with hachures. It was fun task to think about, but I'm gonna need quite a few hours to actually implement it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/rand.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/download_73.png) Hachure code reimagined. Instead of relying on the rendering context's clip function I now compute individual intersection between the hachure lines and the boundary of the shape, allowing me to add some add some fuzz to the hachure lines - lending for a more organic look. I also found that it produces this cool optical illusion where things look as if they're in a way out of focus when chaotic hachures are juxtaposed with clean and parallel hachure lines: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/download_74.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/download_75.png) Out of focus? ## Uma's crocheted Tinies And here's a very special announcement - something that I'm personally stoked about - Uma launches her tiny Etsy store! [TiniesByUma - EtsyShop Tiny yarn creations to brighten your day! by TiniesByUma located in Heidelberg, Germany.![](https://www.etsy.com/images/apple-touch-icon.png)Etsy![](https://i.etsystatic.com/isla/0ef8a6/62436854/isla_fullxfull.62436854_ekvovc4w.jpg?version=0)](https://www.etsy.com/shop/tiniesbyuma?ref=gorillasun.de) A few months ago my partner picked up a new hobby - crocheting with yarn. It quickly turned into a passion and an obsession, finding herself creating a variety of different cute little crocheted creatures and characters: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/il_1588xN.5376874332_3wf2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/il_1588xN.5425055041_j2ms.png) [TiniesByUma - Tiny yarn creations to brighten your day!](https://www.etsy.com/shop/tiniesbyuma?ref=gorillasun.de) I have no idea how she does it, I only know that it's quite difficult to make shapely spherical things with yarn. If you think they're cute, and if you'd like to own some for yourself - check out the Etsy store where you can get one or two. Looking at them sitting on the desk always cheers me up - feels like I have tiny little helpers to get me through all of the tasks that lie in front of me throughout the day: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/F6YbKHnWEAAdQsm.jpg) ٩(⊙‿⊙)۶ Crocheting is in a way generative art, right? Once again, I ask for your support - if you've read this far, consider signing up to receive the newsletter directly in your inbox every Monday! It's Free! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ## Music for Coding Bon Iver is one of those bands that I've heard a lot about and come across on multiple occasions, but never really actively listened to. I changed that this past week, and I'm extremely happy with that decision. Bon Iver is one of those musical phenomenons that has a completely unique feel to it, you can't really compare it to anything else out there, and it transports you to completely different places. Although here I'm only linking to [Bon Iver's eponymous 2011 album](https://en.wikipedia.org/wiki/Bon%5FIver%5F%28album%29?ref=gorillasun.de), you should definitely also check out the other ones, because they're all stellar. Bon Iver won the Grammy Award for Best Alternative Music Album in 2012, and again, it's one of those albums that you should have listened to at least once in your life - on day I compile a list of all of these albums - Justin Vernon's enthralling voice in harmony with the folk-y instrumentation is just something else: If you only have time for one track, then listen to Holocene. You've probably heard it on the radio before though. **And that's it from me this week again, while I'm jamming out to some Bon Iver I bid my farewells, hope this caught you up a little bit with the events in the world of generative art, tech and AI in the past week! And I hope you have a lovely rest of the day and a great start into the week - I definitely am!** **If you enjoyed it, consider sharing it with your friends, followers and family - more eyeballs/interactions/engagement helps tremendously - it lets the algorithm know that this is good content. If you've read this far, thanks a million!** **Otherwise - Cheers, happy sketching, and see you in the next one! - Gorilla Sun 🌸** ### Gorilla Newsletter 24 URL: https://www.gorillasun.de/blog/gorilla-newsletter-24/ Last updated: 2023-10-02T11:45:31.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### Agglo by Leander Herzog on Verse A recent project that I found sincerely captivating was Leander Herzog's **Agglo**. Combining a minimal, yet colorful aesthetic, with intricately repeating patterns, captivating visuals emerge: 0:00 /0:35 1× [Screen capture from the project's Verse page](https://verse.works/collections/agglo-by-leander-herzog?ref=gorillasun.de) | It feels as if I'm watching a machine that's become sentient - there is something strangely organic about the shifting motions in Agglo. Mimi Nguyen from Verse wrote a beautiful piece on the project, showcasing some of Leander's intentions behind the project: > It embodies a calculated, technical approach aimed at the creation of compositions within a straightforward system grounded in elementary code, yielding intricate results. Its genesis does not stem from real-world inspirations or specific imagery but represents a technical pursuit. [Dissecting Complexity: In conversation with Leander Herzog | VerseIn the heart of Manchester, the School of Digital Arts (SODA) played host to an intriguing display that garnered attention from both art department students, fa![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2Fb4240d3d-d830-4201-ab70-184495d3cb31.png@jpeg)](https://verse.works/journal/dissecting-complexity-in-conversation-with-leander-herzog?ref=gorillasun.de) Agglo is impressive on multiple levels, especially the fact that iterations collected by the same wallet will end up syncing with each other, such that they run synchronously (synced shifting motions) when displayed side by side - playing into a broader theme of connectedness. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-07.51.15.png) I recommend checking out Leander's Twitter where he shares some tidbits / behind the scenes of this projects. Imo, it's simply a really great piece of generative art - it looks beautiful, the underlying system is intricate and interesting, and it extends beyond itself to do more than just being a pretty piece of generative art. All of that, while still being simple and comprehensible to both artists and audience. The token goes live on the same day this newsletter lands in your inbox, if you'd like to pick up an edition, as part of Verse's exhibition - **Hyperconnections**. I recommend checking out the other pieces, as well as the other interviews that Verse has done with the participating artists. [Hyperconnection | VerseVerse is pleased to present Hyperconnection, an exhibition that delves into a multifaceted exploration of digitality, deeply rooted within the contemporary tech![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2F4075e9cd-c368-4f1a-b698-01a20b3570bb.png@jpeg)](https://verse.works/exhibitions/hyperconnection?ref=gorillasun.de) ### GEN/GEN Generative Generations | Gazelli Arthouse Generative Generations is Gazello Arthouses latest exhibition running from the 7th of September to the 8th of October at their Mayfair location in the heart of London. The exhibition features work from 6 generations of generative artists, and features and impressive roster: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-08.27.14.png)](https://gazelliarthouse.com/exhibitions/174-gen-gen-generative-generations/?ref=gorillasun.de) [Link to exhibition page](https://gazelliarthouse.com/exhibitions/174-gen-gen-generative-generations/?ref=gorillasun.de) What's more is that a number of interviews with the participating artists were published: RCS talked to Darien Brito, Sougwen Chung, Ernest Edmonds and Licia He. LeRandom got hold of Rhea Myers for an in depth talk with her. RCS kicks of their article by asking the artists about their pieces in the exhibition: [The Generations of Generative ArtA groundbreaking exhibition uncovers new histories of human-machine interaction![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Jason Bailey![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/6504bdea1b7e0bcd3d1b5e15_Screenshot%202023-09-15%20at%2021.26.09.png)](https://www.rightclicksave.com/article/the-generations-of-generative-art-interview-gazelli-art-house?ref=gorillasun.de) I was particularly impressed by Sougwen Chung's work after having a closer look on her website - her work involves programming a robot to mimic her drawing motions and recreating by means of a plotter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-09.19.07.png) [From Sougwen Chung's Homepage](https://sougwen.com/project/drawing-operations?ref=gorillasun.de) | From concept to execution - stellar! Another question that was posed revolved around the definition of generative art. Although nuanced answers were given, they all agreed on one point: being a generative artist involves creating, designing and fine-tuning a system. Ernest Edmonds points to a paper that I hadn't previously seen, co-written by him alongside Margaret E. Boden titled ['What is Generative Art?'](https://creativecoding.soe.ucsc.edu/courses/cmpm202%5Fw20/texts/Boden%5FEdmonds%5FWhatIsGenerativeArt.pdf?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-09.24.55.png) Rhea Myers' work lies at the intersection of culture and technology. She has found an interest in the blockchain as a cultural medium very early on: [Rhea Myers on Code as Cultural MaterialArtist, hacker and writer, Rhea Myers, discusses her thoughtful contributions to the group exhibition GEN/GEN: Generative Generations and more with Peter Bauman (Monk Antony). Myers unravels her artistic practice, touching upon code-as-narrative, “Blockchain Aesthetics” and the dialogue between her…![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/651160dab888ea4eb749020a_1-toejectadiskundermacos_1.webp)](https://www.lerandom.art/editorial/rhea-myers-on-as-cultural-material?ref=gorillasun.de) As always Peter Bauman steers the interview in a meaningful direction and asks interesting questions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-09.35.22.png) Whether you're physically in London or not, I highly recommend checking out GEN/GEN and all of the featured artists. ### On Craft, Art & Programming We also get another treat from LeRandom. This time Mark Webster aka motiondesign01 picks up the pen for us. With a varied body of work ranging from organic neural drawings to more blocky, ascii aethetics - Mark Webster is a powerhouse of generative art: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-10.07.16.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-10.07.08.png) [Mark Webster on Twitter](https://twitter.com/motiondesign%5F01?ref=gorillasun.de) In the essay, Mark addresses several points that revolve around programming, how it is related to crafts and art and how generative art is a modern embodiment of these practices. He argues that contemporarily the notion of craftsmanship is often hastily overlooked when assessing and attributing value to pieces of art - something that has become increasingly important with modern art-forms. In generative art for instance, the artist-programmer occupies a special place somewhere in between the two realms of art and crafts: [On Craft, Art & ProgrammingArtist Mark Webster suggests that in order to better understand art’s value, we must be willing to consider the function of craft, including elements of skill less visible or immediate.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/6511d138d32b407756f7296e__ht_wip_07.jpg)](https://www.lerandom.art/editorial/on-craft-art-programming?ref=gorillasun.de) In many ways the modern programmer is a craftsman - after all, learning how to write meaningful code, is an endeavor that requires a considerable effort and dedication to be acquired. At least in my own experience, I've always felt more like a builder and a maker of things, rather than solely being an artist. A wonderful piece of writing that is informative, yet also leaves you with something to ponder on. Looking forward to more essays in the same style! And if you're a fan of LeRandom - I've got a surprise for you later this week! 👀 ### Arbitrarily Deterministic New Episode Arbitrarily Deterministic is back with another episode! And Ken pulled a real sneaky one on us this week... not gonna spoil it here - just go give it a listen and you'll know what I mean: In this episode we also get a peek into Ken's interesting plotting practice - something that I think many weren't aware of - and Ken actually makes some absolute bangers! Here's one of the stunning pieces: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/nft.jpg) [Improper Pandemic Era Facewear](https://foundation.app/@kenconsumer/fynmn/1?ref=gorillasun.de) from the [When Each Body Pulls On Each](https://foundation.app/collection/fynmn?ref=gorillasun.de) collection Highly entertaining episode - check it out! ### ArtBlocks Marfa 2023 Recap by The Culture Project One newsletter that I love seeing in my inbox [The Culture Project](https://substack.com/@thecultureproject?ref=gorillasun.de) by [Josh Ripple aka Abnormality on Twitter](https://twitter.com/joshripple?ref=gorillasun.de). This week they shared a big recap of the Artblocks Marfa weekend - a great way to get a feel for what the event was like: [Art Blocks Marfa 2023A fun & crazy generative art event.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F384d0f19-b947-4014-8774-db68ad0593ef%2Fapple-touch-icon-180x180.png)The Culture Projectabnormality![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F061f41ce-e1a7-420f-b2ef-e0cf05bcc153_2957x1642.jpeg)](https://thecultureproject.substack.com/p/art-blocks-marfa-2023) Really lovely post, thanks so much for making the write-up! ### Kate Vass on Generative Photography Although it didn't get many likes, I found this thread on generative photography highly interesting! > Inspired by Max Bense's 'Aesthetica' Jäger defined the term generative photography. It refers to a methodical creation of aesthetic states through predefined programs, employing photo-chemical, photo-optical or photo-technical operations & merging natural mediums with math tools ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-11.26.12.png) [Link to Thread](https://twitter.com/KateVassGalerie/status/1707802874351149404?ref=gorillasun.de) Would love to see a more in depth post on this - maybe that could be an endeavor for the blog? ## Mathober & Divtober 2023 Hacktober kicked off last week - this week we have some other takes on the trend that was started by the infamous inktober - the Maths world, and the CSS crowd join in on the fun with Mathober an Divtober. The Mathober prompts are selected by Sophia Wood aka Fractal Kitty, and can be found on her webpage: [Mathober 2022 – Prompts!Mathober 2022 prompts![](https://i0.wp.com/fractalkitty.com/wp-content/uploads/2020/08/logo200-1.jpg?fit=100%2C100&ssl=1)Fractal Kittyfractalkitty![](https://i0.wp.com/fractalkitty.com/wp-content/uploads/2022/09/image.png?fit=1033%2C1200&ssl=1)](https://fractalkitty.com/2022/09/17/mathober-2022-prompts/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-11.51.42.png) Essentially, you can interpret the prompts as loosely as you want and in any medium of your choosing. Fractal Kitty does so on form of doodles, but you alternatively also do them with code and the like. I'd also recommend checking out some of the lovely creations over on her website. Divtober actually seems a little more daunting than Mathober, because the prompts are intended to be interpreted in form of a single CSS div - I have no idea how - but I think a lot of it has to do with the *::before* and *::after* pseudo elements: [#divtober 2023One single div illustration for each day in October.![](https://a.singlediv.com/images/favicon.ico)](https://a.singlediv.com/divtober2023/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-12.03.12.png) Here's some 2022 creations from Lynn Fisher (the organizer behind divtober) from 2022: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Fgb2ITbVsAEY8_2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Fgb2I40VIAACYZC.png) How do you do this with CSS??? ## Reaction Diffusion and other Primers Every now and then, this Japanese Twitter account pops up in my timeline - each time sharing tutorials on various algorithms that are generally geared towards the purpose of generative art. I'm don't think the most recent post is new, but still worth sharing. This time it revolves around the Reaction-diffusion algorithm, a method for the creation of interesting organic patterns - also often referred to as Turing patterns: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-11.07.40.png) The article isn't super in depth but it enumerates some of the methods with which reaction-diffusion can be achieved. What I want to point out is that they have quite a few posts that are superb as primers for many generative art techniques - [they can be found on their notion index page here](https://kyndinfo.notion.site/Sketching-with-Math-and-Quasi-Physics-837e231967134bb5a8307bb9f41c8ea1?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-11.45.12.png) [On Turing patterns from Wikipedia](https://en.wikipedia.org/wiki/Turing%5Fpattern?ref=gorillasun.de) ## Weekly Web Finds As always, there's also been a lot of interesting thing in the world of tech - some of which I included here👇 ### Bun Hype, better than Yarn? Bun is a new JavaScript runtime and package manager that has been gaining a lot of hype lately. It is claimed to be faster than Node.js and to have a number of other advantages, such as built-in support for TypeScript and JSX: [Bun hype. How we learned nothing from YarnHere we go again, making the same mistake. I’m constantly reminded that every 5 years the amount of…![](https://res.cloudinary.com/practicaldev/image/fetch/s--eWZ6RXEZ--/c_limit,f_png,fl_progressive,q_80,w_180/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j7kvp660rqzt99zui8e.png)DEV CommunityThe Jared Wilcurt![](https://res.cloudinary.com/practicaldev/image/fetch/s--HAhKVmqK--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xvcsrnmgvtkie225ejdl.png)](https://dev.to/thejaredwilcurt/bun-hype-how-we-learned-nothing-from-yarn-2n3j?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) In the article Jared Wilcurt argues that Bun is not actually much better than Yarn, another JavaScript package manager that was hyped up a few years ago. Although Yarn had a couple of new features that didn't exist in npm when it was first released, it was quickly overtaken again by npm again in all of those regards. Wilcurt predicts that Bun will ultimately meet a similar fate to Yarn. ### A (more) modern CSS reset 4 years after having written his post titled [A Modern CSS Reset](https://andy-bell.co.uk/a-modern-css-reset/?ref=gorillasun.de) \- Andy Bell is back with an updated version: [A (more) Modern CSS Reset - Andy BellI wrote A Modern CSS Reset almost 4 years ago and, yeh, it’s not aged overly well. I spotted it being linked up again a few days ago and thought it’s probably a good idea to publish an updated version. I know I also have a terrible record with open source maintenance, so I thought \[&hell…![](https://hankchizljaw.imgix.net/apple-touch-icon.png?sat=-100&con=100)Andy Bell](https://andy-bell.co.uk/a-more-modern-css-reset?ref=gorillasun.de) If you're not familiar with CSS resets - it's basically the shortest possible CSS code to reset all styling - this is useful when you want to get rid of the styles that browsers apply by de ### State of HTML 2023 The state of HTML is essentially a survey that everyone can participate in - the result of which ultimately inform browsers and standards groups on what features to prioritize and build into their roadmap: [State of HTML 2023Take the State of HTML survey![](https://survey.devographics.com/apple-icon.png?61e2db30c3ccc786)![](https://assets.devographics.com/surveys/html2023-og.png)](https://survey.devographics.com/en-US/survey/state-of-html/2023?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Might be worth the time to participate. ### 10 Github repositories to achieve Javascript mastery I've been spending a lot of time on DEV since there's quite a few interesting reads over there every week - this past week I really enjoyed this list of useful repositories to learn Javascript things: [🚀 10 Github repositories to achieve Javascript mastery 🧙‍♂️🪄✨TL;DR This article contains a list of 10 Github repositories that are going to be useful…![](https://res.cloudinary.com/practicaldev/image/fetch/s--eWZ6RXEZ--/c_limit,f_png,fl_progressive,q_80,w_180/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j7kvp660rqzt99zui8e.png)DEV CommunitySumit Saurabh![](https://res.cloudinary.com/practicaldev/image/fetch/s--5nC5Ea1k--/c_imagga_scale,f_auto,fl_progressive,h_500,q_66,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0oxxqp1e3ab3aivbsu5g.gif)](https://dev.to/novu/10-github-repositories-to-achieve-javascript-mastery-50hk?ref=gorillasun.de) Ranging from concepts to practical tips, there's a little bit of everything in there. ## ## AI Corner ### ChatGPT can now see, hear, and speak! If you're a ChatGPT Plus user, your model just got a whole lot more powerful you can now interact with it via audio and images: [ChatGPT can now see, hear, and speakWe are beginning to roll out new voice and image capabilities in ChatGPT. They offer a new, more intuitive type of interface by allowing you to have a voice conversation or show ChatGPT what you’re talking about.![](https://openai.com/favicon.ico)![](https://images.openai.com/blob/9c95036b-c2f5-4af8-a9c4-ed6c411f77e4/chatgpt-can-now-see-hear-and-speak-alt.jpg?trim=0%2C0%2C0%2C0&width=1000&quality=80)](https://openai.com/blog/chatgpt-can-now-see-hear-and-speak?ref=gorillasun.de) These new voice and image capabilities are powered by two new models: a speech model that allows ChatGPT to generate and understand human speech, and a vision model that allows it to recognize and process images. From a point of view of accessibility these additions seem really useful. When it comes to images however I'm not sure if it can be very useful when asked to reason about the real world - as they showcase in their post, where they post a picture of some type of defect component and ask about it - but apparently some people have seen some success already in that regard, [taking in screenshots from figma and transforming that into functioning code for instance](https://twitter.com/mckaywrigley/status/1707796170905661761?ref=gorillasun.de). [Incredible Ways to Use ChatGPT VisionThese new image capabilities unlock a whole new world of ways to use ChatGPT.![](https://wgmimedia.com/wp-content/uploads/2023/05/cropped-wgmi_logo-270x270.png)WGMI MediaDils![](https://wgmimedia.com/wp-content/uploads/2023/09/Incredible-Ways-to-Use-ChatGPT-Vision.jpg)](https://wgmimedia.com/ways-to-use-chatgpt-vision/?ref=gorillasun.de) ### An introduction to the problems of AI consciousness A splendid article from Nick Alonso on the problematics that arise around the discussion of AI consciousness. The first issue at hand is putting a definition on consciousness, what is it actually? Is it some emergent property of the chemicals in our brain? If we can't tell what it is, and don't have a clear definition of it how can we determine if an artificial agent has attained consciousness? What are the necessary and sufficient conditions for consciousness? [An Introduction to the Problems of AI ConsciousnessOnce considered a forbidden topic in the AI community, discussions around the concept of AI consciousness are now taking center stage, marking a significant shift since the current AI resurgence began over a decade ago.![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)The GradientNick Alonso![](https://thegradient.pub/content/images/2023/09/new_title-1.png)](https://thegradient.pub/an-introduction-to-the-problems-of-ai-consciousness/?ref=gorillasun.de) Moreover, even if we could create a conscious AI, there are a number of ethical and social problems that would need to be addressed. For example, what rights should conscious AI have? How should we ensure that conscious AI systems are aligned with human values? How should we prevent conscious AI systems from becoming too powerful? ### Getting Emotional with LLMs increases performance A recent paper titled [Large Language Models Understand and Can Be Enhanced by Emotional StimuliEnhanced by Emotional Stimuli'](https://arxiv.org/abs/2307.11760?ref=gorillasun.de) explores the effect of emotional input prompts on the quality of LLM's responses - and apparently getting emotional with your words can improve their performance: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-02-at-12.29.09.png) The tested on a variety of tasks ranging from text summarization to question answering. I've noticed this as well, giving positive and negative feedback after responses from ChatGPT like *'Ok good job!'* or *'This is actually trash'* usually yields a better result on the LLM's second attempt - somehow as if it it's becoming more focused on the task at hand after the feedback it gets. A more digestible write-up for this can be found here: [Getting Emotional With Large Language Models (LLMs) Can Increase Performance by 115% (Case Study)Deep dive into why Emotional Intelligence is important for increasing Large Language Models’ (LLMs) performance.![](https://global-uploads.webflow.com/64808cc9f88d76f4355b870a/64fe290bafdbd91630306223_favicon-32x32.png)Cool God wearing sunglasses, God of Prompt logo![](https://global-uploads.webflow.com/64808e3805a22fc1ca46ffe9/65156a278c2f09f736ae1607_EMOTIONSMATTER_LLMS.webp)](https://www.godofprompt.ai/blog/getting-emotional-with-large-language-models-llms-can-increase-performance-by-115-case-study?ref=gorillasun.de) ## Gorilla Updates ### Hot off the Press - In Conversation with Tezumie This past week I put on my interview hat again and reached out to Tezumie asking if he'd be up for a chat. At this point in time, Tezumie has published over a dozen generative projects across platforms like FxHash, 256ART and the renown ArtBlocks. What's more, is that stylistically his piece have slowly evolved from a more abstract style towards the pursuit of representing natural scenes - I wanted to know more about that and how he does it. We ended up talking for more than an hour, connecting on several points about generative art, programming long-form pieces for the blockchain, as well as the intricacies of it. [In Conversation with TezumieTezumie is a prolific generative artist that has built an impressive and varied body of work in the short span of 2 years. Besides this he is deep in the throes of developing his own browser based - AI enhanced - code editor. This is a conversation with Tezumie.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/nature.jpg)](https://www.gorillasun.de/blog/interview-tezumie/) Additionally, what really caught my attention and made me want to reach out to Tezumie, was his newest endeavor that he'd been sharing about on Twitter: the development of aijs. Aijs is essentially an AI enhanced browser based code editor that integrates a ChatGPT panel into it's interface. I found it super intriguing and wanted to know more about the development of such a tool. I like people that branch out and do different things - coding a tool like a code editor is vastly a different kind of project compared to programming a generative sketch. ### Fresh off the easel This week I made a piece for Objkt.com's open call for ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-01-at-19.35.27.png) [Link to Tweet](https://twitter.com/objktcom/status/1707013675909836900?ref=gorillasun.de) The latter part of the tweet (which is cropped here) states that they're looking for a fun and colorful piece... and if you're asking for colorful, then you'll get colorful! I ended with something that I'm really proud of - I decided on the title 'Outwards': 0:00 /0:12 1× It's essentially many SDFs playing into each other to create this dueling, outward traveling spirals. Oh did I mention that it's a perfect loop? If you want to help me out maybe hop over to Twitter and give it a like - I don't actually know if that will influence Objkt.com's final decision (it might, who knows?) - [here's a link to my post!](https://twitter.com/gorillasu/status/1707478127079731241?ref=gorillasun.de) ### Gorilla makeover And I've spent quite a few hours diving into CSS hell - in an attempt to clean up the big messy CSS sheet that I've created over the course of the past weeks. It's actually quite a tricky thing, especially coming up with meaningful names for the different classes. A new addition to the design is this little TLDR card that Ill include at the beginning of each section - I know that my writing is quite wordy - so to make things a little easier, I thought it'd be beneficial to have a quick summary for those who don't have the time to read all of my ramblings. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/10/Screenshot-2023-10-01-at-19.43.11.png) New TLDR card - still needs some work. ## Music for Coding Poolside's mixtapes absolutely SLAP! The grooves on this just hit differently - and just like the cover art, the tropical beats instantly put you into a good mood. Really worked well for this past week as it seems that the summer temperatures are slowly coming to an end: **And that's it from me this week again, hope this caught you up a little bit with the events in the world of generative art, tech and AI in the past week!** **If you enjoyed it, consider sharing it with your followers, friends and family on your socials! It helps A LOT! Otherwise, Cheers and happy sketching \~ Gorilla Sun 🌸** ### In Conversation with Tezumie URL: https://www.gorillasun.de/blog/interview-tezumie/ Last updated: 2024-08-28T13:37:07.000Z **Over the span of the past two years, Tezumie has quickly risen to be a prolific generative artist. With artworks published on FxHash, 256Art, and ArtBlocks he's built an impressive body work. Tezumie's portfolio spans a wide variety of artistic styles - ranging from abstract geometric compositions, to Skeuomorphism and Neo-precisionism.** In our conversation I ask him about his background, how he found his way into generative art, his process and approach to making generative art, as well as how his style developed since his debut. Tezumie's current endeavor is the development of AIJS, a browser based, AI enhanced p5js-esque code editor, that seamlessly integrates ChatGPT into its UI. In the latter part of the article we talk about the development of the editor, some of it's features and some of the challenges of building such a tool. Talking to Tezumie was a real joy - we talked for around an hour, and that hour just flew by so quickly - we connected and related on so many points, it was delightful. That said - let's get into it 👇 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/0.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/frontier.png) [Entangled #0](https://256art.com/project/entangled?ref=gorillasun.de) & [Frontier #0](https://256art.com/project/frontier-2?ref=gorillasun.de) > I've always loved making art, it's been my hobby my whole life, mostly the creation aspect of it. I never really thought of myself as an artist, but I just liked the process of making something - you start with absolutely nothing and you end up with something that tells a story - [Interview with 256Art](https://256art.com/artist/tezumie?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.16.58-1.png) [Tezumie's bio from 256Art](https://256art.com/artist/tezumie?ref=gorillasun.de) ## Getting into Generative Art **Gorilla: In an interview with 256Art, you mention that you started out with visual scripting in Unreal Engine and Blender at a young age - later you went to college for a little while - before and after you'd completed your military service - I wanted to ask you about your college experience; is that how you ended up getting into programming, and later on into generative art?** When I went to college, I never actually got to do any programming. I did my generals, as well as some other required courses... but I never actually got to coding. And it was driving me crazy. After a year I realized that this wasn't for me - I couldn't learn that way. I found that it was much easier to learn on my own. **Gorilla: In college I initially had a really hard time. I didn't like programming at all - later on I fell in love with it through creative coding and generative art.** Yeah, that's exactly how it was for me with visual scripting. When you just look at lines of code and try to make sense of them, it can be really intimidating when you're just starting out. Especially when you don't know what you're looking for. Later on I discovered Daniel Schiffman's tutorials - and wow, this guy can teach \[laughs\] If it wasn't for his videos I probably would have never gotten into it. Looking from the outside in, coding is just really intimidating. With generative art you can see what you're doing, and I think that having some form of visual feedback makes things a lot more approachable. **Gorilla: I think that Daniel's videos were a gateway for a lot of people into generative art. In the interview you also recount that a while after you'd left the military a friend contacted you to design the patch for your former unit, you mention that doing so played a role in reigniting your passion for art making - how did that event lead you to getting into generative art?** When you're growing up, you don't think about art as a job, you think of it like going to the lake - it's just something fun to do. When they reached out to me and asked me to design their unit patch I had a lot of fun doing it. I started using the Krita app, and that was in a way really liberating; there's no hassle with buying supplies and all of the tools are available to you right from the get-go. That somehow opened it all back up to me. The same person that had asked me to do the unit patch, then also talked to me about wanting to get into NFTs, knowing that I was into "tech and computer stuff". That's when I started looking into them as well. One thing lead to another, discovering fxhash and Tezos NFTs via Twitter, I somehow ended up in the fxhash discord - at a time where I didn't really know what generative art was \[laughs\] Then I found the pure-spider template with which I did a number of little drawings just for the fun of it. And that's how Tezumies came to be. I wasn't planning on making any money with it at the time, just thinking that it would be a fun little experiment. After I released that project, I still didn't really know what generative art was, nor did I know what anyone else was doing on the platform. [GitHub - PureSpider/fxhash-pfp: A template to develop generative layered images on fxhashA template to develop generative layered images on fxhash - GitHub - PureSpider/fxhash-pfp: A template to develop generative layered images on fxhash![](https://github.githubassets.com/pinned-octocat.svg)GitHubPureSpider![](https://opengraph.githubassets.com/a9be59fcdf85bb71ab86f8e362d94240510baa6dd8a96a347f1f2fc7e12a92ae/PureSpider/fxhash-pfp)](https://github.com/PureSpider/fxhash-pfp?ref=gorillasun.de) **Gorilla: is that how the name Tezumie came to be?** Initially it was only meant for my first release. It's a play on words, combining the blockchain with the pfp characters. I really liked the name, and it felt fun to tie my first creation with my name - hence I made my account name Tezumie as well! It's also the result of me wanting to stay anonymous, both for privacy and a bit of insecurity about sharing my art publicly. **Gorilla: A lot of things changed for you after discovering fxhash** Yeah, that's pretty much what I do full-time now - coding and making art. It's like a dream. I don't make a lot of money, but I love doing it! ## On Long-Form Generative Art **Gorilla: you've made quite a few long-form generative pieces up until this point, can you tell us a bit more about that?** I did 8 releases on FxHash (excluding the pfp projects), then I came in contact with 256Art where I was lucky to be voted in as an artist - back then artists had to be voted in by the community - which lead up to the release of Entangled. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.15.41.png) [Tezumie on FxHash](https://www.fxhash.xyz/u/Tezumie?ref=gorillasun.de) After that I didn't have a release for about 8 months. **Gorilla: why is that?** I don't really know - for a while I was just learning and exploring new things. During that time I was actually waiting for Assembly to go through the Artblocks approval pipeline. I also didn't really want to release anything, because at that point I had learned so many new things from my previous projects - coming back to some of my code I felt that I could redo it in a much better manner, with all of the things that I'd learned, that is. I ended up having 4 projects ready, that I released shortly after Assembly came out. **Gorilla: I can relate, sometimes you get paralyzed with multiple ideas that all could be projects in their own right. You end up not getting anything done. That's maybe why it starts taking longer and longer to complete projects the further you are down the line.** That's exactly how it is for me. Sometimes you'll learn a small thing while trying to solve something for another project, and then that sparks something which makes you want to iterate on. Chasing those threads, you often forget about what you've actually been working on. Coming back to them is always difficult. **Gorilla: What's usually the hardest part of making a long-form generative Artwork for you?** That's a tough question. It would probably be figuring out a "good" way to do things. Usually there's a hundred different ways to accomplish the same task, of which some might be better than others. Often, the second problem, after you've got things to work, is that the code ends up being a terrible spaghetti mess. So it's both of those things in combination that's difficult to accomplish - problem solving while keeping your code organized. **Gorilla: and what about randomness, how do you go about controlling it and ensuring that there's enough variety in you projects?** That's another tough one. I try a different approach in every single project. The feedback I got in my Artblocks release was really helpful in that regard where I was advised to let up on the parameters of my project a little. [Assembly by Tezumie | Art BlocksAssembly by Tezumie. A generative art project of 300 different outputs. Released Jul 26, 2023, 5:00 PM UTC![](https://www.artblocks.io/apple-touch-icon.png)Art BlocksTezumie![](https://media-proxy.artblocks.io/0x99a9b7c1116f9ceeb1652de04d5969cce509b069/445000017.png)](https://www.artblocks.io/collections/presents/projects/0x99a9b7c1116f9ceeb1652de04d5969cce509b069/445?ref=gorillasun.de) Originally, Assembly was a lot more strict in it's output space, in which most outputs had a pale shade for a background; giving the code more freedom in that regard allowed for a larger variety of outputs. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/445000014.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/445000018.png) Assembly #14 & #18 But that was also a bit difficult for me, making these adjustments sometimes takes away from your vision. With that feedback in particular, I really did have to make that adjustment - otherwise the collection would have ended up very homogeneous. **Gorilla: I've had similar experiences. Sometimes I post WIPs that I'm not really super into, but those are often the ones that perform the best.** I get that as well. Oftentimes, the outputs that I'm the most proud of are not the ones that garner interest from the collectors. Other times, people really like outputs that I was actually planning on cutting from the project. But ultimately it's necessary and helps tailor the output space of the project. **Gorilla: personally I have a preference for geometric patterns that are neatly aligned, visually I simply like them. In the genart space I feel that people are more into chaotic compositions that feature overlapping shapes and the like. Making things like that is difficult for me, because it always feels like I have to overcome something inside of me to do so.** Yeah, you kind of have to find a balance - where you make something that both you and your audience enjoy. While making something you probably only think about what you personally enjoy. Feedback like that is really important. **Gorilla: Circling back to your artblocks release, what was the submission process like?** When I joined, I believe that they were doing a lot of internal changes, which might have contributed to things being a bit slow. Overall it was pretty simple though, you can't really mess it up. They have extensive documentation for each of the steps that you have to go through. After submitting your project you'll be in contact with a couple of people that will give you feedback and help get the project ready. It took like one or two weeks for each one of the different steps - the hard part was not changing things in the project while waiting \[laughs\] ## Abstractionism vs. Skeuomorphism **Gorilla: stylistically your more recent projects have gone into a more skeuomorphic direction, what lead you to explore that? Is it inspired by the trend in the generative scene where more artists are exploring this direction?** Generative art usually tends to be more abstract; when I first started out I didn't really get it. Stuff from Pollock for example - it kinda just looks like paint splatters and swirls \[laughs\] - but after a while you start appreciating his art. After a while you can differentiate between his different pieces, and they don't just look the same. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/eyJidWNrZXQiOiJzaW5ndWxhcnQtd2Vic2l0ZS1wcm9kIiwia2V5IjoiYXJ0d29ya3NcL3YyXC9jcm9wcGVkXC8yMDEwN1wvbWFp.jpg) Programming natural scenes is a different kind of challenge - the code for these projects is often more structured compared to abstract compositions. The abstract stuff tends to be more exploratory, but with nature it becomes a strange challenge to make something that is instantly recognizable. The first generative artwork that I saw, that attempted a natural scene was by [Tenebris](https://twitter.com/TenebrisVia?ref=gorillasun.de). I later discovered Zancan through them. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/the-woodcarver.png) The Woodcarver's apprentice by Tenebris Talking to Tenebris about Zancan's work made me want to try doing more nature. And now it's become my favorite thing to code - also from the perspective of the audience I think it's easier to understand in comparison to abstract art. It's easier to connect with something familiar, and nature is inherently and recognizably beautiful. It's fun to try to mimic things. On Frontier it was really fun to see how much I had learned, in comparison to my first one. I think it's the one that I'm the most proud of. One thing that didn't make it into the final project, was mouse interaction that allowed you to move things around. What's cool is the wind parameter that affects the placement of the items. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/488.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/482.png) [Outputs from Frontier](https://256art.com/project/frontier-2?ref=gorillasun.de) **Gorilla: Frontier has a different style than your previous skeuomorphic projects - it's a bit reminiscent of low-poly aesthetics.** Aesthetically, the previous projects weren't really innovative just making use of the basic P5 style - shapes simply consist of outlines and fills. When I had the system in place, I was asking myself how I could make it visually more interesting, and somehow expand on the looks a little bit. Styling things is really hard. The inspiration for it was [Grant Riven Yun](https://twitter.com/GrantYun2?ref=gorillasun.de), who started this movement of Neo-precisionism. [Precisionism](https://en.wikipedia.org/wiki/Precisionism?ref=gorillasun.de) has been around for a while - but in a nutshell, it's simply flat colors, no outlines, and you try to reduce elements to basic shapes. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.33.31.png) Yun put a more *digital* spin on it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.13.44.png) [It seems that Grant Riven Yun has also taken his art to the blockchain](https://hypebeast.com/2022/7/grant-yun-interview-nft-neo-precisionism?ref=gorillasun.de) That's what made me ditch the outlines and simply make use of flat shading with high contrast colors. I found the juxtaposition of this highly geometric style within the context a natural scenes really interesting. **Gorilla: from a technical point of view, how do you go about creating these scenes? How do you create multiples of items in the scene? Is it an object-oriented approach?** I've tried different approaches, before Frontier I simple drew elements in the scene with parametrised functions; in Frontier I started using classes to represent the different elements, each of which contains it's own member variables. **Gorilla: And how do you go about the positioning of elements? Is it some form of noise?** Actually yeah - it's basically a noise line that's repeated from top to bottom while changing some parameters. Back then I made a cool little tool to visualize this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-28-at-12.56.01.png) A private sneak-peek into the system behind Frontier. ## Concept vs. Result [Demystifying Generative ArtPeter Bauman (Monk Antony) develops a framework for appreciating and analyzing generative art through an investigation of the movement’s locus of artistic intent.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64b80a26a2fd5b2f287e7e39_Screenshot%202023-07-19%20at%205.06.29%20PM.png)](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) Most likely, every generative artist that I meet from now will be subject to this interrogation. **Gorilla: when appreciating/creating generative art, what's more important to you: output, process or concept?** I'd mark them from first to last. Output, process, concept. To me the concept always evolves along with the piece - when I have to reflect and ask myself why I did something, I often kind of have to come up with the concept after the fact. Even though I might have had the concept in my head - I never really thought about it. It just kind of comes automatically. **Gorilla: I feel the same way. Whenever I finish a project and I get to the point of minting it on the blockchain, I end up finding myself in front of that description box - asking me to say something about my piece. It always feels like "Okay, now I have to make up something about how I got inspired and stuff". Sometimes it feels a little bit like I'm lying.** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-30-at-17.32.28.png) It do be like that sometimes | [link to Tweet](https://twitter.com/Yazid/status/1707926634031165585?ref=gorillasun.de) \[laughs\] Exactly! It's weird, the art comes together naturally, and when you try to put it into words it feels a bit forced. It can feel disingenuous, but when you think about it, it's really not, there's always a reason for why you did or didn't do something. It boils down to interviewing yourself and searching for those reasons. When I finish a project I often have to ask myself "why did I do this? what does this mean to me?" You know, descriptions are important to people, providing them with a reference point to connect with your art. Especially with art blocks, I was very nervous - Assembly was just an exploration that happened, and that's what I initially put in the bare description. The artblocks people wanted more details however. The concept in context of generative art is a bit like poetry to me, and I'm not a poet. **Gorilla: that's a beautiful way to put it. I definitely feel more like I'm a builder - I make things. So there isn't really a concept. Maybe in a way building a concept becomes poetry.** There's probably a lot more than those three categories though. Moreover, the idea of generative art is probably vastly different from person to person. The same goes for collecting, like I said earlier, in the beginning I didn't really get abstract art, but now some of my favorite pieces fall into that category. Fragments of a Wave by Ryan Bell for example. It's amazing how he did it, but the outputs are stunning too, both of these things play into it - and with that piece I don't even know what the concept is \[laughs\] thinking of it, I can't even remember the description. I just really loved how it looked. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.11.08.png) [Fragments of a Wave by Ryan Bell on FxHash](https://www.fxhash.xyz/generative/slug/fragments-of-a-wave?ref=gorillasun.de) **Gorilla: Do you generally care about the intricacies of the code behind a piece?** From an artistic point of view, no. But I'm definitely always impressed when I can't wrap my head around how something was done. ## AIJS - AI powered Code Editor [*You can check out the editor for yourself here.*](https://aijs.io/?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-29-at-15.08.51.png) AIJS in action! **Gorilla: What was the original inspiration for AIJS?** I wanted to figure out how I could add AI to an editor - chatGPT just makes a lot of things easier and if you're not using it you're going to be left in the dust nowadays. The first thing I did was simply adding in the chat interface, and that was really easy. Then I wanted to take it a step further, asking myself "what if it can correct your code?" I made so that you can highlight a piece of code and it will fix it for you. Going off of that, I also wanted it to be able to teach you. In the editor you can now create your own courses, all while storing the context of the course in the chat history such that it can answer questions about each of the lessons and it will have reference to the material. It's actually not as complex as it sounds - it doesn't need to make an API request until you ask the question, when you do it has reference to the 10 previous chat references. An unintended and unexpected outcome of this was that you can actually make it continue the course after it's done - you can ask it for another lesson and it will just want to make one based on the previous material. **Gorilla: how does this work, do the API calls have a cost attached to them?** They do, but at this point it's basically pennies - like 20 cents a month. It's a bit weird how they calculate the cost, because it depends on the token length of the API call, so what I just described with the chat history would be more pricey because each call would have to reference all of that memory. Right now I'm simply using my own API key, when there's more users I'll probably have to build in a way for people to use their own API keys. I'm trying to think of a way to keep it free to use and that seems like one way without having to show ads. **Gorilla: How are you hosting the editor?** It's hosted on Firebase. I've never done anything with a server and a backend, so this is how I'm learning, and firebase is really simple. It's got everything all in one place - the domain, the storage, the server, it's all there. **Gorilla: for a first time doing this it's really impressive.** I actually haven't done HTML before this \[laughs\] **Gorilla: what were some of of the challenges of making the editor?** The biggest challenge for this, something that you don't really think of when you start out, is that there isn't really a file system in the browser that works for this type of thing. There's a few simple ones but they don't really do everything that you need for a code editor. So I had to make my won file system which kind of turned into its own library now. But making it was definitely hard, there's a lot of things that you need to account for. Another thing I'm still running into issues with is bundling. Basically combining all of the code into something that can run in the browser, there's tons of bundlers that do that for you, but doing it directly in the browser there doesn't seem to be any. Or at least I couldn't find any. Overall most of the challenges came from it being something that runs in the browser, but at the same time it was a really fun challenge. And the issues I'm running into I've noticed are also something other online code editors struggle with. **Gorilla: on another note, do you make use of ChatGPT for coding/debugging?** Oh yeah, I use it all the time. It makes life so much easier, because you just write a simple script of and then you can simply query it for particular functions. You still have to know how to code, but it's just too powerful not to use. I'm sure there's purists that will disagree with me. ## Shoutouts **Gorilla: Lastly, is there anyone you'd like to shoutout? Someone that inspires you?** Honestly, out of all the people I've met and worked with, I'd have to say [Tib](https://twitter.com/ShaikTibout?ref=gorillasun.de). He's the creator of 256Art and he's an amazing guy, does everything from front-end to back-end, and he's built such a wonderful community. And even though it's a bear market and things are kinda slow, if you get in the discord now, you'll find that it's such a friendly place to be in. He also has his own Artblocks and FxHash series. So I definitely have to give him a shoutout, he's a great mentor. ## Concluding Thoughts Thanks so much Tezumie for taking the time to talk to me, it was a wonderful chat, incredibly insightful and inspiring. I had a lot of fun connecting on so many points, and just talk freely about generative art for an hour. [Support Tezumie](https://twitter.com/Tezumies?ref=gorillasun.de) by checking out his tokens, maybe collect one or two if you can - also check out AIJS and drop Tezumie some feedback in his discord if you do! **Otherwise, that's a wrap! If you enjoyed this post, consider signing up to the newsletter to receive updates whenever I publish new content - otherwise, consider sharing the post with your friends and followers that share an interest in generative art and creative coding.** **More eyeballs on the blog helps out tremendously! Thanks for reading, and happy coding - cheers, until next time! Gorilla Sun 🌸** ### Gorilla Newsletter 23 URL: https://www.gorillasun.de/blog/gorilla-newsletter-23/ Last updated: 2023-12-19T23:10:29.000Z **Welcome back everyone** 👋 and big thanks to all new subscribers - thanks for joining along for the ride! > **This is the weekly Gorilla Newsletter** \- we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy - Gorilla Sun 🌸 ## All the Generative Things ### KilledByAPixel's Generative Pottery Pottery meets generative art in [Frank Force](https://twitter.com/KilledByAPixel?ref=gorillasun.de)'s latest FxHash token titled fxPottery, and I'd argue that it's one of the most creative use cases for FxParams that I've seen to date: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.12.38.png) [Link to Generator](https://www.fxhash.xyz/generative/28924?ref=gorillasun.de) | Generative Art meets Pottery The FxParams editor allows you to mold a spinning piece of wet clay, just like you would in real life, simply by means of mouse interaction. The colors and texture of the final virtual ceramics can then be set via additional toggles. Collectors have already been quite creative with their mints: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.27.11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.27.03.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.26.51.png) FxParams allows for a completely different The project was minted as part of the FxHackathon, which comes to a close just one day after this newsletter comes out: ### Landlinesart Anfractuous Another FxHackathon piece that's been making ripples over on TwitterX is [Landlinesart](https://twitter.com/landlinesart1?ref=gorillasun.de) Anfractuous: > The title is quite literally a visual description of the work, as anfractuous means: characterized by windings and turnings; sinuous; circuitous. Balancing smooth and easily recognizable large forms with small fragmented details. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.42.31.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-09.42.02.png) [Link to Generator](https://www.fxhash.xyz/generative/slug/anfractuous?ref=gorillasun.de) | Still have to mint my own ticket! The interplay of large scale structure with more granular subdivisions allows for varied and interesting compositions - couple with the creativity of the minters an incredibly varied collection comes to life. FxParams has indubitably brought forth a new form of generative art - the collector is now no longer just someone that clicks the mint button, but has to actively involve themself in the creation process of their token. Moreover, the new code driven parameters have greatly improved the user friendliness of the entire minting process - a million toggles can be a bit overwhelming; with a more exploratory approach it becomes much more approachable. FxHackathon comes to a close just a day after this newsletter comes out on the 26th of September: [fxhash — fxhackathon 2023: co-creation interfaces onboardingBuilding custom minting interfaces with fx(params)![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://www.fxhash.xyz/api/og?title=Generative%20art%20on%20the%20blockchain)](https://www.fxhash.xyz/events/fxhackathon-2023:-co-creation-interfaces/onboarding?ref=gorillasun.de) What was you favorite project? Working on something yourself? ### Artblocks' Marfa Weekend Another important generative art event this past week has been Artblock's Marfa Weekend - and from the pictures it seems that it's been the biggest gathering to date, with many a generative artist pilgrimaging to Marfa: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.06.33.png)](https://twitter.com/artblocks%5Fio/status/1706120474831229291?ref=gorillasun.de) [Link to Tweet](https://twitter.com/artblocks%5Fio/status/1706120474831229291?ref=gorillasun.de) Many more pics were shared over on TwitterX. ### LeRandom feat. Michael Spalter LeRandom is a treasure trove of generative art history, showing up week after week and building up an impressive body of work. This week they're joined by Michael Spalter to go over the latest additions to their generative Art Timeline that covers the latter part of the 1960s in generative art. Together with his spouse Anne, Michael Spalter is currently in possession of the *world’s largest private collections of early computer art, comprising over 1000 works from the second half of the twentieth century*. The collection can be viewed in digital form over at their website: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.34.56.png)](https://spalterdigital.com/artworks/?ref=gorillasun.de) [Link to Website](https://spalterdigital.com/artworks/?ref=gorillasun.de) Throughout the Twitter space, Michael Spalter provides invaluable insights into some of the timeline's moments, recounting anecdotes that you probably can't find anywhere in written form on the internet: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.38.03.png)](https://x.com/lerandomart/status/1705153520058487264?s=20&ref=gorillasun.de) [Link to Tweet](https://x.com/lerandomart/status/1705153520058487264?s=20&ref=gorillasun.de) | Conversation starts at 8 minutes in. LeRandom also interviewed DEAFBEEF about his newest Bright Moments piece HASHMARKS: [DEAFBEEF on (Im)permanenceDEAFBEEF reflects on themes such as the tension between permanence and impermanence in his work HASHMARKS, released through Bright Moments. He also ruminates with Peter Bauman (Monk Antony) on celebrating the singularity of the present plus finding agency in life and art.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/650aa9a53c2b2cc68d890e81_Screenshot%202023-09-20%20at%209.09.56%20AM.png)](https://www.lerandom.art/editorial/deafbeef-on-impermanence?ref=gorillasun.de) In other news, LeRandom also asked an interesting question: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.41.15.png)](https://twitter.com/lerandomart/status/1705280736318697761?ref=gorillasun.de) [Link to Tweet](https://twitter.com/lerandomart/status/1705280736318697761?ref=gorillasun.de) At least in my reality, P5 takes the top spot. P5 isn't just a library, but it's also grown into community that strives to make creative coding more accessible, inclusive and democratizing code literacy for the arts. At the same time it made the sharing of sketches much easier in contrast to before - now you could directly code your ideas in the browser and share them with people around the world, in contrast to what was possible previously with Processing. ### Node to Node by Kate Vass Galerie If you're in Paris between the 13th and 22nd of October, you might want to stop by Kate Vass' newest exhibition titled Node to Node: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-11.05.03.png) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-11.05.25.png)](https://twitter.com/KateVassGalerie/status/1703849207214305685?ref=gorillasun.de) [Link to Tweet](https://twitter.com/KateVassGalerie/status/1703849207214305685?ref=gorillasun.de) With a focus on generative art in a physical medium, it will showcase artworks from a variety of artists in different branches of generative art: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-11.06.00.png)](https://twitter.com/KateVassGalerie/status/1703849207214305685?ref=gorillasun.de) [Link to Tweet](https://twitter.com/KateVassGalerie/status/1703849207214305685?ref=gorillasun.de) ### The Omega Code by Joshua Davis Recently I've been hearing a lot about No Man's Sky again - especially after Starfield's lackluster release. What does this have to do with generative art? Well, the OG Joshua Davis aka praystation posted this tweet a couple of days ago: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.52.34.png) Fueled by nostalgia praystation follows up with another tweet stating that he'll be documenting the entire process of recoding the artwork over on his discord channel: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.56.22.png)](https://x.com/JoshuaDavis/status/1705330254502371712?s=20&ref=gorillasun.de) [Link to Tweet](https://x.com/JoshuaDavis/status/1705330254502371712?s=20&ref=gorillasun.de) And if you want to have a peek into the mind of Joshua Davis and how he approaches such a recode you should definitely check it out: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.57.54.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-10.57.38.png) [Link to discord](https://discord.com/invite/praystation?ref=gorillasun.de) ### New Beginner Processing Course Daniel Shiffman released a new beginner processing course over on WatchNebula - it is a paid course \- but if I know one thing, it's that Daniel's material is definitely worth the couple of bucks: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-25-at-11.03.03.png)](https://twitter.com/shiffman/status/1704192188119142666?ref=gorillasun.de) [Link to Tweet](https://twitter.com/shiffman/status/1704192188119142666?ref=gorillasun.de) Generative artist and creative coder [Melissa Rodriguez](https://twitter.com/hellomelissarod?ref=gorillasun.de) also participated in making the course. ## Painting with Maths: A Gentle Study of Raymarching The highlight of the week for me is this deep-dive into Raymarching by Maxim Heckel. Inspired by none other than Inigo Quilez - a repeat offender on this newsletter - Maxim set out to learn the technique behind Inigo Quilez 3D shaders: Raymarching! > I was very intrigued by the perfect blend of creativity, code, and math involved in this rendering technique that allows anyone to sculpt and paint entire worlds in just a few lines of code [Painting with Math: A Gentle Study of Raymarching - Maxime Heckel’s BlogA compilation of my Raymarching and Signed Distance Field learnings and work. In it, I teach you how to leverage those techniques along with lighting models, smoothmin, soft shadows, and some math to create beautiful 3D raymarched scenes ranging from abstract shapes to infinite realistic-looking lan…![](https://blog.maximeheckel.com/static/favicons/apple-touch-icon.png)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/0a0f06ee0730b9fca4b945e653fd9374.png?v1)](https://blog.maximeheckel.com/posts/painting-with-math-a-gentle-study-of-raymarching/?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Beautifully written and comprehensive form start to finish. If you only have time to read on article this week, this should be it! I'd also like to point out that the blog's design is superb! And a lot of thought has been put into it - I especially liked the search box that even has an experimental AI chat bot that can answer questions about the site itself: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-23-at-11.44.07.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-23-at-11.47.00.png) The cherry on top is that Maxim even wrote about implementing this chat bot in detail: [Building a magical AI-powered semantic search from scratch - Maxime Heckel’s BlogAn end-to-end walkthrough on how to build a semantic search from your own MDX or Markdown based content using Postgres vector similarity search and OpenAI’s text embeddings and chat completion APIs.![](https://blog.maximeheckel.com/static/favicons/apple-touch-icon.png)Maxime HeckelMaxime Heckel![](https://blog.maximeheckel.com/static/og/7f8d98e02e9e4610b7fa85a210a0464d.png?v1)](https://blog.maximeheckel.com/posts/building-magical-ai-powered-semantic-search/?ref=gorillasun.de) Chatbot on the Gorilla Sun blog? 🤔 ## Hacktoberfest 2023 It's that time of the year again - it's Hacktoberfest! Starting on the 26th of September (just a day after this newsletter comes out): > Hacktoberfest is a month-long celebration of open-source projects, their maintainers, and the entire community of contributors. Each October, open-source maintainers give new contributors extra attention as they guide developers through their first pull requests on GitHub Having grown from 676 participants in 2014 to 147,000 participants all around the world last year, Hacktoberfest has without a doubt become the largest global celebrations of open source software. All details for participating can be found over on the official website: [Hacktoberfest 2023Hacktoberfest: a month-long celebration of open-source projects, their maintainers, and the entire community of contributors.![](https://hacktoberfest.com/_next/static/media/favicon.c57c9d0f.svg)Hacktoberfest 10![](https://hacktoberfest.com/_next/static/media/opengraph.e5fafe07.png)](https://hacktoberfest.com/?ref=gorillasun.de) There's also a page that details how to host an event - in case you have a repository that you need some help with, this is probably the perfect time. If it's your first time participating and still have no clue where to start after reading the official docs, check out this guide that provides some useful tips: [Hacktoberfest 2023: The Complete GuideHacktoberfest is a great way to start with open-source development. But it can be daunting if you are…![](https://res.cloudinary.com/practicaldev/image/fetch/s--eWZ6RXEZ--/c_limit,f_png,fl_progressive,q_80,w_180/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j7kvp660rqzt99zui8e.png)DEV CommunitySaurabh Rai![](https://res.cloudinary.com/practicaldev/image/fetch/s--8VeWPKCY--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/723s3y5aujdvqn3x7w2h.png)](https://dev.to/srbhr/hacktoberfest-2023-the-complete-guide-1lkj?ref=gorillasun.de) And to pitch a repo that you can contribute to check out the P5. ## Weekly Web Finds This week we have a quite juicy selection of articles mainly revolving around JS things - all about functions, executions contexts and hoisting, as well as polyfills. ### The Complete Guide to Javascript Functions Javascript functions come in many different flavors, and in many cases they're not just reusable blocks of code - when you're just starting out it might be a bit overwhelming to get a grip on *when* to use *what* kind of function. In this chunky guide, Ekaterina Mitagvaria covers concepts ranging from a beginner level to a more advanced: [The Complete Guide To JavaScript FunctionsOne of the most important features of JavaScript is functions and today I will cover the vital topics…![](https://res.cloudinary.com/practicaldev/image/fetch/s--eWZ6RXEZ--/c_limit,f_png,fl_progressive,q_80,w_180/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j7kvp660rqzt99zui8e.png)DEV CommunityEkaterine Mitagvaria![](https://res.cloudinary.com/practicaldev/image/fetch/s--o4mG7bBH--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohghxltlm5tifzqy2tql.png)](https://dev.to/catherineisonline/the-complete-guide-to-javascript-functions-304g?ref=gorillasun.de) It's not "A" complete guide, but "The" complete guide! Jokes aside, even if you've been using Javascript for a long time, there's always merit to checking out how other people think about a certain topics - there's always something new to be learned. Towards the end of the guide Ekaterina brings up function currying, something that I didn't know about before. ### Ultimate Guide to Hoisting, Scopes and Closures If you're still hungry for more, here's a guide to hoisting, scopes and closures in JS - if you're a JS dev, these concepts have probably caused you many a gripe throughout your career. Tyler McGinnis explains that the key to mastering all of these concepts, is understanding JS execution contexts and how they function: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-24-at-17.16.37.png)](https://ui.dev/ultimate-guide-to-execution-contexts-hoisting-scopes-and-closures-in-javascript?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) [Link to article](https://ui.dev/ultimate-guide-to-execution-contexts-hoisting-scopes-and-closures-in-javascript?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) Tyler also built a little [tool that allows the visualization of execution contexts](https://ui.dev/javascript-visualizer?ref=gorillasun.de). ### Polyfills gone Rogue The 6th installment in Marvin Hagemeist's "Speeding up the Javascript Exo-system" series, in which he investigates why many npm packages depend on 6-8x more packages than they need to. He finds that most of these are unnecessary polyfills, which are libraries that provide support for older browsers and versions of JavaScript. Polyfills can be useful, but they can also slow down your application and make your node\_modules folder bloated: [Speeding up the JavaScript ecosystem - Polyfills gone rogueMany popular npm packages depend on 6-8x more packages than they need to. Most of these are unnecessary polyfills and it’s one of the key reasons node\_modules folders are so large. The eslint ecosystem seems to be most affected by this.![](https://marvinh.dev/apple-touch-icon.png)Polyfills gone roguemarvinhagemeist![](https://marvinh.dev/media/me-twitter.jpg)](https://marvinh.dev/blog/speeding-up-javascript-ecosystem-part-6/?ref=gorillasun.de) After making suggestions on fixing this issue, mainly be being more mindful about what polyfills you add to your project, he concludes with this quote from the creator of the Erlang programming language: > You wanted a banana but what you got was a gorilla holding the banana and the entire jungle - Joe Armstrong ### Minh Le on artificially reducing the ping A short and funny clip from 2015, in which one of the co-creators of counter strike reveals a hilarious story from the development of the game: 0:00 /0:56 1× ## AI Corner ### Why AI will save the World Couple of days ago I came across this Tweet by Jamie Joyce: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-24-at-15.08.08.png)](https://twitter.com/JustJamieJoyce/status/1689508672131698688?ref=gorillasun.de) [Link to Tweet](https://twitter.com/JustJamieJoyce/status/1689508672131698688?ref=gorillasun.de) Doing such a large scale debate in a spreadsheet is a bit of an oddity - there might be better apps for this. Besides this it made me aware of the article Why AI will save the World written by Marc Andreessen, published on the Andreessen Horrowitz venture capital firm website: [Why AI Will Save the World | Andreessen HorowitzThere’s a full-blown moral panic about AI right now. But the real risk is losing the race to global AI technological superiority.![](https://a16z.com/wp-content/uploads/2023/04/favicon-180x180-1.png)Andreessen HorowitzMarc Andreessen![](https://a16z.com/wp-content/uploads/2023/06/AI-Saves-The-World_Yoast-FB.jpg)](https://a16z.com/ai-will-save-the-world/?ref=gorillasun.de) After I first read the article, I felt just a tad bit confused. The writing is a bit lackluster - Andreessen says a lot without saying anything... simply romanticizing the idea of AI from every possible point of view, without addressing the negatives, of which there's plenty: [Why AI may not save the World — LessWrongMarc Andreessen, founder of legendary VC firm a16z, recently wrote an article titled ‘Why AI Will Save the World’. This post is my reply to him and w…![](https://res.cloudinary.com/lesswrong-2-0/image/upload/v1497915096/favicon_lncumn.ico)Alberto Zannoni![](https://res.cloudinary.com/lesswrong-2-0/image/upload/v1654295382/new_mississippi_river_fjdmww.jpg)](https://www.lesswrong.com/posts/iZRmTenmdA9nNYjux/why-ai-may-not-save-the-world?ref=gorillasun.de) I just feel really annoyed by the article - not just by the condescending tone that the text exudes - but also because it's written from a completely one sided, subjective point of view, not providing any supporting arguments to any of the claims that are being made. Sam Harris interviewed Andreessen on the "Making Sense" podcast, and it just made clearer that his understanding of AI is limited: Another example is Andreessen on Web3: In that manner, he's a bit of a polarizing personality: Ultimately, it strikes me as a bit strange that a large scale debate is being done around the article, when it's not really a great piece of writing about the future of AI. But what do I know, I'm not a billionaire. ### AI generated Optical Illusions First off, credit where it's due - the TwitterX user that started all of this is [MrUgleh](https://twitter.com/MrUgleh?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-24-at-13.59.24.png)](https://twitter.com/MrUgleh/status/1702508790837330388?ref=gorillasun.de) [Link to Tweet](https://twitter.com/dreamingtulpa/status/1705220398239920302?ref=gorillasun.de) In the past couple of days these AI generated optical illusions have gone incredibly viral, going as far as escaping the Twitter bubble and making headlines over on Wired: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-24-at-14.03.07.png) [What an AI-Generated Medieval Village Means for the Future of ArtSpiral Town, which has jumped from Reddit to X to everywhere, is helping to usher in a hopeful but increasingly dangerous era of artificiality.![](https://www.wired.com/verso/static/wired/assets/favicon.ico)WIREDCondé Nast![](https://media.wired.com/photos/650a13146fa72f327e793e83/191:100/w_1280,c_limit/spiral_hero_2-800x450.jpeg)](https://www.wired.com/story/artificial-intelligence-medieval-village/?ref=gorillasun.de) If you're interested in making similar optical illusions, it's done with controlNet and Dreaming Tulpa has compiled a Twitter thread with detailed instructions on how to go about creating these optical illusions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-24-at-14.20.49-1.png) [Link to Tweet](https://twitter.com/dreamingtulpa/status/1705220398239920302?ref=gorillasun.de) | A guide to creating AI generated optical illusions by TwitterX user Dreaming Tulpa If you have a good enough GPU your starting point is this github repo that provides the stable-diffusion model in addition to a webui for prompting purposes: [GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UIStable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui development by creating an account on GitHub.![](https://github.githubassets.com/pinned-octocat.svg)GitHubAUTOMATIC1111![](https://opengraph.githubassets.com/b356853bb0b51acaaa66be13a6f4b28e93e30e4a8b1b7dddcd38333b3b1fb908/AUTOMATIC1111/stable-diffusion-webui)](https://github.com/AUTOMATIC1111/stable-diffusion-webui?ref=gorillasun.de) Stable Diffusion Webui ### MetaAI's AudioCraft Something I'm personally super excited about is MetaAI open sourcing their model for generating sounds: AudioCraft! Labeled as a one-stop shop for multiple generative audio tasks it comprises 3 models: MusicGen, AudioGen and EnCodec. MusicGen and AudioGen are models that generate sound based off of an input text prompt, where MusicGen is specifically aimed at generating music, in contrast to AudioGen that is mainly aimed at generating general purpose sounds like cars honking, animal sounds, etc. EnCodec, on the other hand, is a model that improves the quality of these generated sounds. In combination, these three models work in tandem to generate high-quality audio. [AudioCraft: A simple one-stop shop for audio modelingAudioCraft is a simple framework that generates high-quality, realistic audio and music from text-based user inputs after training on raw audio signals as opposed to MIDI or piano rolls.![](https://static.xx.fbcdn.net/rsrc.php/v3/y4/r/WUJbsVI4ruF.png)![](https://scontent.xx.fbcdn.net/v/t39.2365-6/364044687_188110547422666_6558067645303623389_n.jpg?_nc_cat=100&ccb=1-7&_nc_sid=ad8a9d&_nc_ohc=BG9ffWm0ihoAX-quODs&_nc_ht=scontent.xx&oh=00_AfA6HkWVS_bBnhiEJXCq6UJ1z0bwEJpAScXyeXL3EXX4qg&oe=652BB91F)](https://ai.meta.com/blog/audiocraft-musicgen-audiogen-encodec-generative-ai-audio/?ref=gorillasun.de) This was actually one of my research topics when I was a graduate student, it's exciting to see that so much progress has been made in that regard. I'd love to write more about this topic, and generative AI in general - maybe in that way I'd have an excuse to get into that space again. ## Gorilla Updates ### A Conversation with Anna A couple of weeks ago I had the chance to have a chat with Anna and ask her a couple of question about NFTs, how the Tezos NFT space has evolved with time, and what it's like to be an avid collector: [A conversation with Anna the NFT collectorAnna began collecting NFTs on the Tezos blockchain in May 2021 at the peak of the HEN boom. She has since grown an impressive following and become one of the biggest forces of positive change in the space. This is her story.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-17-at-09.10.59.png)](https://www.gorillasun.de/blog/a-conversation-with-anna-the-nft-collector/) Having collected hundreds of NFTs at this point, Anna's primary joy comes from supporting artists in their endeavors. She also enjoys discovering new artists and showcasing their works: "Art is meant to be seen" she says. ### Redesigning the Blog I've also continued working on the redesign of the blog - what started as an afternoon project quickly turned into something that took several weeks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-23-at-10.22.27.png) There's now an option to toggle Dark Mode! Designing web pages is hard - not just because CSS is a doozy - but also because it's really hard to make things look good, coherent, and at the same time follow good web practices. You don't want to know how much time I spent picking fonts and adjusting font sizes. Here's a hot take 18px is way too small of a font-size. Make 20px the new standard and put opticians out of business. ### Sketches I've been playing around a little more with maze generation algorithms and found that they're an equally effective method for space filling and creating distinct regions, when the individual mazes compete for the same underlying grid. Here's a video to demonstrate this: 0:00 /0:28 1× The next Idea that I had was finding the contours of these regions and turning them into individual polygonal regions: 0:00 /0:22 1× This allowed me to create this cool patterns, where the polygonal regions are shrunk a little to create a margin between them. Sometimes at the corners this shrinking procedure has the effect that it creates small loops which I thought looked nice: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/schema3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/download--69-.png) Still needs more work, but I think it'll be my next token on FxHash. ## Music for Coding I often listen to big playlists over on Youtube, if I hear something that really stands out I'll usually look up the artist behind the track and listen to some more of their stuff. One track that I enjoyed in particular this week was Void by oDDling - : oDDling has many more fantastic tracks that can be listened to in this compilation: **And that's it from me this week again, hope this caught you up a little bit with the events in the world of generative art, tech and AI in the past week!** **If you enjoyed it, consider sharing it with your followers, friends and family on your socials! It helps A LOT! Otherwise, Cheers and happy sketching \~ Gorilla Sun 🌸** ### A conversation with Anna the NFT collector URL: https://www.gorillasun.de/blog/a-conversation-with-anna-the-nft-collector/ Last updated: 2023-09-21T12:30:03.000Z ## Introduction A couple of days ago I had the chance to talk to [Anna](https://twitter.com/ArtMonochrome1?ref=gorillasun.de), an avid Tezos NFT collector that's been part of the space right from the start. Over the course of two years Anna has accrued an impressive following of almost nine thousand followers on TwitterX, and has collected hundreds of NFTs at this point - mainly in support of smaller artists that are trying to make it in the NFT space. Mid-august I reached out to Anna over Twitter DMs, asking if she'd be willing to do an interview for the blog. She happily agreed, but informed me that it would have to be in French - in English she could only do it in writing. I told her that it's not a problem, since I do speak a little french and that I'd have my partner, who is more fluent than me, at the ready to help whenever I'd struggle to find the right words. Going into the call I had little idea what to expect, but I was met with a very cheerful voice - after making my excuses about my broken french she told me not to worry about it, and we didn't waste much time to get into the questions that I had prepared. ## Background and getting into NFTs **Gorilla: To many people in the Tezos NFT scene your name is most likely already a familiar one, but for the readers, could you tell us a little bit about yourself and how you got into collecting NFT art?** Anna: Before May 2021 I had absolutely no connection to the Artworld - that is when I discovered NFTs through the medias. For several years, I worked in part as a fitness coach, and on the weekends I had jobs at nightclubs. Prior to that I had absolutely no connection to art, nor did I know much about art - save for the big names like Picasso, Monnet, etc. But I think everyone knows those. To be frank, I also didn't really have an interest in art \[laughs\] Discovering NFTs, I found it an opportunity to break into this world - and try to understand art a little more. Seeing NFTs all over the news on TV and in magazines, I told myself that there's a couple of things that I needed to do. Especially since they could be purchased and collected, and that, for a relatively affordable price. On Tezos that is - I've never collected on other chains. Passing by galleries in real-life I'd know that those works weren't something I could afford. But now I could actually own pieces for myself, and have my own collection. **Gorilla: This started with hicetnunc in 2021? Prior to that you hadn't been active on social networks?** Anna: Yes, back then, when I joined the space, that was the only platform that existed on Tezos - typing the term "NFT" into Twitter that's what popped up. It was a really beautiful platform. [Hic Et Nunc Brings True Spirit Of Web Art To The Here And Now — ArtnomeI am pretty busy these days as an unofficial spokesperson during NFT mania’s rise, so I don’t get to write as often as I’d like to. I see my role as pointing people to cool new developments at the intersection of art and tech and making sure we celebrate those people too often overlooked in the de![](https://images.squarespace-cdn.com/content/v1/59413d96e6f2e1c6837c7ecd/1499608745349-XAAWNTJWTFUP9Q4N1OSG/favicon.ico?format=100w)ArtnomeJason Bailey![](http://static1.squarespace.com/static/59413d96e6f2e1c6837c7ecd/595a40576b8f5bb92c16fc18/60574be18479842a9f10cddc/1616340797591/Web_Art.png?format=1500w)](https://www.artnome.com/news/2021/3/21/hic-et-nunc-revives-the-true-spirit-of-web-art-through-nfts?ref=gorillasun.de) An Artnome article discussing hicetnunc when it first became popular. And no, not at all. I didn't really like social networks, to me there tends to be too much aggressivity and narcissism on them. Nonetheless, that's how it started for me and how I got to know so many beautiful people in the space. **Gorilla: hence it was the accessibility of Tezos NFTs that enticed you?** Anna: Yes, in a way - at the same time, NFTs were a means for me to help others. By being a collector I could now financially support many small artists that were trying to make it. Coming from a working-class family, I know what it's like to not have money. I've always loved helping people, and now I'm lucky to be able to do that in that space by being a collector. **Gorilla: For me things also started with hicetnunc. Discovering it very early on, I decided to give it a shot and mint some pieces on the platform. It changed a lot of things for me. It also felt a little bit like I was part of a revolution - things have changed a lot since then.** Anna: I miss hicetnunc a lot - it's a completely different epoch now. One of the first names that I saw praising and promoting hicetnunc was [Joanie LeMercier](https://twitter.com/JoanieLemercier?ref=gorillasun.de), onboarding more people to the platform and to Tezos. I think we have to give him credit for that, from my perspective at least. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-17-at-10.17.30.png)](https://twitter.com/JoanieLemercier/status/1393207208507285506https://twitter.com/JoanieLemercier/status/1393207208507285506?ref=gorillasun.de) [Link to Tweet](https://twitter.com/JoanieLemercier/status/1393207208507285506?ref=gorillasun.de) ## First NFT and Monochrome Art **Gorilla: What was the first NFT that you have collected?** Anna: When you sent me the questions ahead of time I tried finding the first one - but you know, I'm not the queen of technology \[chuckles\] - I went back to the very first page of my Objkt profile but I'm not certain which one it is, because things are not in order anymore. On my linktree I have three links: ArtMonochrome1, ArtMonochrome2 and ArtMonochrome Colors. At one point I asked my friend NFTBiker to help me transfer all of the NFTs from ArtMonochrome1 (where I had my first NFT) to ArtMonochrome2 - and now I'm not entirely certain about the order anymore. So I couldn't find it, but it was around mid-may 2021, probably the 15th I think. > *Here I put on my blockchain detective hat and checked Anna's transaction history - the very first NFT she collected was a piece titled [Outcast](https://objkt.com/asset/hicetnunc/129263?ref=gorillasun.de) by GAN artist [Nico Black](https://twitter.com/%5Fnicoblk?ref=gorillasun.de) \- minted on the 13th of June 2021 and collected by Anna on the 15th of June 2021* ![https://ipfs.io/ipfs/Qmcbv4epzGJn6h9Rn4KGekGGE8tY8AyFAP5qXdxqquYjD2](https://ipfs.io/ipfs/Qmcbv4epzGJn6h9Rn4KGekGGE8tY8AyFAP5qXdxqquYjD2) **Gorilla: You mainly collect monochrome pieces, what significance does monochrome art have for you?** Anna: When I started my collection I wanted to set myself apart in some manner - that doesn't mean that I have a special attraction towards monochrome pieces when compared to colorful pieces - I just wanted to differentiate myself and find my place in the space. I found that not many people were doing exclusively monochrome collections. I also do have a small colorful collection as well. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-17-at-10.43.06.png) Anna's color collection ## Evolution of the NFT Space **Gorilla: As a collector, how has the NFT space evolved since you joined?** Anna: *\[mulls it over for a second\]* I find that a lot of artists haven't been supported, many smaller artists in particular. After the big boom in 2021, many people joined the space and I believe that it's become more difficult to find a foothold the bigger the space grew. **Gorilla: Today I have the impression that marketplaces have become more exclusive and boutique in comparison to before.** Anna: Initially the space was convivial and friendly, now it often feels like I find myself inside a supermarket. Things feel a bit more artificial and manufactured, where many people care more about selling than making beautiful art. Things have shifted more towards revolving around the financial aspect of things rather being about the art. ## Interest in Generative Art **Gorilla: You also have a big interest in generative art, collecting it and promoting many generative artists on Twitter. What is generative art to you?** Anna: What intrigues about generative art, as someone who doesn't know the first thing about how it works, is the mix between algorithms, technology and art - and I find it beautiful that this combination exists. I find it amazing how coders can make art with code. I watched some videos about coding on Youtube but it's incredibly complex, I don't understand it. For instance, I find Vera Molnar's work fascinating, what she did during her epoch was incredibly impressive. **Gorilla: Vera Molnar started the generative art revolution.** Anna: She began with dice? *Anna asks out of curiosity*. **Gorilla: As far as I understand, she began executing her algorithmic ideas without computers - letting the throw of the dice decide particular placements of lines and points in her early compositions.** Anna: That's impressive. **Gorilla: At the same time there were a lot of people that frowned on what she was doing.** [The Art of Vera Molnar 1947-1974Vera Molnar is one of the pioneers of what we know today as Generative Art. She was one of the firsts to dare and use computers for the purpose of making art. In this article we have a look at her rich artistic career and how she paved the way for the computer artists of today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Galerie-La-Ligne-Vera-Molnar-2000x1415.jpg)](https://www.gorillasun.de/blog/the-art-of-vera-molnar/) ## Important NFT moments **Gorilla: What were some of the important moments of the NFT space for you?** Anna: Not a moment per se, but what I love about the space, is the mutual support that artists show each other. For instance, even if they can't support each other financially by collecting - they can still do so with small gestures, like re-tweeting each others' posts. It might seem like a silly little thing, but a re-tweet actually goes such a long way - it shows interest - ultimately, art is meant to be seen. I know that ultimately the goal is to sell, but not everyone can always buy. This show of solidarity is one of the most important aspects of the space. In a way, in my experience, it feels like a big family where you never feel alone. I'm also grateful for all the friends and connections I've been able to make in the space, especially through events like Art Basel and NFT Paris. One other thing that I also love, is to discover new artists and their works. Do you know [ganarchitecture](https://twitter.com/ganchitecture?ref=gorillasun.de)? I discovered them when they had just started out on Twitter and I was their first follower. Of course they got as far as they did because of their work, not through me, but it's a wonderful feeling to have been there right from the start and to see how far they've come. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Byblo-s.png) [Byblös - The Citadel](https://objkt.com/asset/KT1AmcbtSACeteJHjEhim9FFK5CW8ajrNTio/14?ref=gorillasun.de) | Artwork by [Ganchitecture](https://objkt.com/profile/ganchitecture/?ref=gorillasun.de) Throughout my life I've had the support of a lot of people to get to where I am today, and this is my way of giving back, continuously trying to showcase smaller artists that are trying to make it. Even if I'd lose all of my NFTs I wouldn't feel bad, because I'd know that I helped a lot of artists and made them happy. ## Advice for budding collectors **Gorilla: What advice would you give to those interested in becoming collectors?** Anna: I believe that everyone can become a collector, even on a small budget - on Tezos you can find so many beautiful pieces for a relatively low price. Especially during some of the events that are conjured up by the community sometimes, you can get some stunning artworks for less than a dollar. What's important is to be honest in the things that you do and support each other. Even though the space has expanded, it's still a microcosm all things considered. > If you want to get started collecting art on Tezos yourself - I've written this introductory guide on the topic, covering concepts from how blockchains work up to installing a Tezos wallet and collecting your first piece: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-14-at-10.53.02.png)](https://www.fxhash.xyz/article/a-beginner's-guide-to-collecting-art-on-tezos?ref=gorillasun.de) [I've written about how to get started on Tezos in this fxtext](https://www.fxhash.xyz/article/a-beginner's-guide-to-collecting-art-on-tezos?ref=gorillasun.de) ## Favorite Artists **Gorilla: Who are currently some of your favorite artists? Would you like to shoutout some of them?** Anna: That's difficult to answer because there's too many, but to name a few: [@annaxmalina](https://twitter.com/annaxmalina?ref=gorillasun.de) [@i\_dianov](https://twitter.com/i%5Fdianov?ref=gorillasun.de) [@wblut](https://twitter.com/wblut?ref=gorillasun.de) [@Eko3316](https://twitter.com/Eko3316?ref=gorillasun.de) [@Kopfgestaltung](https://twitter.com/Kopfgestaltung?ref=gorillasun.de) [@kerimsafa](https://twitter.com/kerimsafa?ref=gorillasun.de) [@HOXID\_](https://twitter.com/HOXID%5F?ref=gorillasun.de) [@gorillasu](https://twitter.com/gorillasu?ref=gorillasun.de) [@ganbrood](https://twitter.com/ganbrood?ref=gorillasun.de) [@\_\_Sean\_Luke\_\_](https://twitter.com/%5F%5FSean%5FLuke%5F%5F?ref=gorillasun.de) [@s0mfay](https://twitter.com/s0mfay?ref=gorillasun.de)[@\_0\_0\_0\_9\_](https://twitter.com/%5F0%5F0%5F0%5F9%5F?ref=gorillasun.de) [@Poppel20](https://twitter.com/Poppel20?ref=gorillasun.de) [@williamapan](https://twitter.com/williamapan?ref=gorillasun.de) [@chepertom](https://twitter.com/chepertom?ref=gorillasun.de) There's many more! Someone that I'd like to shoutout in particular, is [@BaltazarGarden](https://twitter.com/BaltazarGarden?ref=gorillasun.de) which I find is often underappreciated - he makes generative art with dice! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-21-at-14.10.34.png) Check out [https://www.baltazargarden.art/](https://www.baltazargarden.art/?ref=gorillasun.de) An artist and collector that I like a lot is [@NFTBiker](https://twitter.com/NFTBiker?ref=gorillasun.de)! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-21-at-14.08.25.png) If you don't know NFTBiker - he's one of the most prolific toolmakers in the Tezos NFT space! ## Closing Thoughts Anna is a beautiful and honest soul in the NFT space, and the space is better for having her in it. Promoting small and large artists alike, helping them get discovered, and collecting as much as she can. Thank you, Anna, for taking the time to talk to me and let me put together this interview - it was a pleasure. **And that's a wrap, hope you enjoyed it!** **If you did, consider sharing it with your followers, friends and family on your socials. Otherwise, consider signing up to the newsletter to get notified whenever there's new content on the blog. Cheers and happy collecting \~ Gorilla Sun 🌸** ### Gorilla Newsletter 22 URL: https://www.gorillasun.de/blog/gorilla-newsletter-22/ Last updated: 2023-12-19T23:10:46.000Z **Welcome back everyone 👋 And welcome to all new subscribers that signed up - thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Newsletter - we have a look at everything noteworthy from the past week in generative art, creative coding, tech and AI. As well as a sprinkle of my own endeavors. Enjoy!** ## Genart Updates ### Kaloh's Podcast feat. Artnome I'm a massive fan of Artnome and all of the things that he does in the space. I was super excited when I saw that Kaloh did a podcast episode with him. Jason Bailey has done some of the most wonderful interviews with important figures in the generative art space, like [Jared Tarbell](https://www.artnome.com/news/2020/8/24/interview-with-generative-artist-jared-tarbell?ref=gorillasun.de) and the elusive [Manolo Gamboa Naon](https://www.artnome.com/news/2018/8/8/generative-art-finds-its-prodigy?ref=gorillasun.de) to name a few. In the podcast Jason Bailey tells us about his beginnings, how he got into Art from a young age, then working in tech for a while, until he later made his return with the Artnome blog and being one of the early advocates of digitally collectible art in the web3 age: [Protect your NFTs! ft ArtnomeListen now (51 mins) | Artnome is a thought leader in the NFT art space, promoting technology, artists, and blockchain art since 2017\. He founded artnome.com, Right Click Save and Club NFT![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-180x180.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4427b7c-b97e-488f-b800-e63bb1361735_1400x1400.png)](https://www.kaloh.xyz/p/protect-your-nfts-ft-artnome?utm%5Fcampaign=post&utm%5Fmedium=web&ref=gorillasun.de) As always, fantastic work from Kaloh - looking forward to more podcast episodes. ### Maya Man - I'm Feeling Lucky Maya Man creates work that tackles the topic of identity culture on the internet - essentially how we interact with content on the internet, it's consumption or creation, and how it affects our identity on the internet. In her latest exhibition on Verse she tackles the topic of Astrology, specifically horoscopes and how they constitute a modern belief system in the age of the internet: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-13.43.11.png) "I’m Feeling Lucky **focuses on the contemporary culture of astrology and how it asks us to make sense of ourselves through its structures.*" Deriving meaning from horoscopes in many ways parallels the meaning that we attribute to randomly generated outputs from generative systems. The Verse write-up is beautifully done, and gives further insight into the exhibition: [I’m Feeling Lucky | VerseVerse is delighted to present I’m Feeling Lucky, an exhibition and installation of Maya Man’s most recent generative work. Continuing her explorations of femini![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2Fe0eccb74-881b-4f90-95c6-4da598893dca.jpg@jpeg)](https://verse.works/exhibitions/I-am-feeling-lucky?ref=gorillasun.de) Another separate interview with Maya Man can be found here: [In Conversation with Maya Man: I’m Feeling Lucky | VerseMaya Man discusses her upcoming show, ‘I’m Feeling Lucky’ with Leyla Fakhr. The title of the exhibition directly references the ‘I’m Feeling Lucky’ button that![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse.works/image/w1400/static%2F37ea2951-9c07-4f7e-97db-cbcd0d26ccbf.jpeg@jpeg)](https://verse.works/journal/in-conversation-with-maya-man-im-feeling-lucky-2?ref=gorillasun.de) As the title suggests, Maya Man's work was inspired by Google's "I'm feeling lucky" button. This button would directly take you to the first search result corresponding to the search query you'd entered in the text box - this element of chance, in the search engine that arguably changed how the entirety of humanity functions in this day and age, sparked the idea for Maya Man's exhibition. ### Maya Man on Generative Meaning by LeRandom I actually became aware of the exhibition via Peter Bauman's interview over on LeRandom: [Maya Man on Generative MeaningMaya Man, an artist focused on contemporary identity culture on the Internet, sat down with Peter Bauman (Monk Antony). Using Man’s exhibition and project I’m Feeling Lucky on Verse as a jumping off point, they discuss horoscope culture as a belief system, finding meaning in randomness, the role of…![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/6501758cbd0d59041f18d53c_Maya%20Man_I%27m%20Feeling%20Lucky.png)](https://www.lerandom.art/editorial/maya-man-on-generative-meaning?ref=gorillasun.de) He goes into more detail with Maya Man, asking her about finding meaning in randomness, the religious undertones that her works have, and how she approaches her process of creating new works. Every week LeRandom blesses my timeline from anew with a stellar piece on generative art. And if that wasn't enough the timeline also got another update, resuming where the previous portion left off in the mid 60s, now covering the latter half of that era: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-14.24.59.png)](https://timeline.lerandom.art/?ref=gorillasun.de#/chapter-4) [Link to Timeline](https://timeline.lerandom.art/?ref=gorillasun.de#/chapter-4) ### The Aesthetics of Experimental Chance in Artistic Practice Another article that I found super interesting this week was by Paula Brailovsky, over on [The Island](https://www.theisland.io/?ref=gorillasun.de). It's a stellar read, delving into randomness as an important component in art-making, not just in generative art but over the years in general. > Then there is the subject of this essay: experimental chance. This type of chance is not gestural, expressionist or accidental, but is rather rooted in experimentation and observation. It involves setting down a particular set of instructions and parameters and observing the results. [Between Randomness and Control: The Aesthetics of Experimental Chance in Artistic PracticeAn essay by Paula Brailovsky commissioned by The Island![](https://uploads-ssl.webflow.com/640ef74e7e743e5810bc2efd/641059cd79db60c3862adeb6_X_Logo_B%26W_Final_Fond%20noir.jpg)![](https://uploads-ssl.webflow.com/640ef74e7e743e5810bc2efd/640ef74f7e743e977cbc2f47_Menu%20Close%20Icon.svg)](https://www.theisland.io/articles/between-randomness-and-control-the-aesthetics-of-experimental-chance-in-artistic-practice?ref=gorillasun.de) I never thought about it this way; that there's different kinds of randomness. Not from a technical point of view, where we'd frame randomness as different kinds of probability distributions, but with regard to their intent and in the manner that they're applied. This is maybe something that I need to be more intentional about in future works. ### Eko33's Terra Incognita Following his release "Neural Sediments" on ArtBlocks, Eko33 returns with a new collection on SuperRare titled "Terra Incognita". In the interview with Paloma Rodriguez he dives into his background, the inspiration that he draws from mid-century design, and his art practice is an attempt at bridging the gap between disparate things, be it between the modern and the old, or between art and technology: [Curated Conversations: Eko33SuperRare Labs Curator Paloma Rodriguez discusses Eko33’s ArtBlocks “Neural Sediments” drop, inspiration from Alberto Burri and František Kupka, and the creative process behind “Terra Incognita 00.”![](https://insights.superrare.com/hubfs/favicon-1.png)Superrare Labs IncPaloma![](https://insights.superrare.com/hubfs/TerraIncognita00_mint%20(1).png#keepProtocol)](https://insights.superrare.com/discovery/curated-conversations-eko33?ref=gorillasun.de) The interview is super insightful, providing a deeper look into the mind of Eko33 and how ideas rooted in cognitive science, sociology, and ethnography drive the development of his generative pieces. I find it fascinating how his works further these conversations with a modern medium. Eko33 also made a thread in which he details the ingredients that generate the imagery seen in Terra Incognita: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-14.56.47.png) [Link to Tweet](https://twitter.com/Eko3316/status/1702291844728594607?ref=gorillasun.de) ### William Mapan's Process Following last week's spotlight where we had a look at William Mapan's process, in an interview with Cactoid Labs for the new work that he's creating for LACMA - this week Mapan gives us a little behind the scenes showing us how the different layers in his artwork build up to the final output: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-11.43.18.png)](https://twitter.com/williamapan/status/1701982094509920721?ref=gorillasun.de) [Check out the Tweet for a video showcasing the different layers](https://twitter.com/williamapan/status/1701982094509920721?ref=gorillasun.de) ## Unity Controversy I think this issue deserves a section of it's own. Earlier this year we've seen platforms like Twitter and Reddit make drastic changes to their business/pricing models - leading to some severe responses from their user-bases. Last week, Unity followed suit and updated their pricing model as well, ensuing a massive backlash from the entire gaming industry. Starting from the top, the problem begins with this announcement from Unity: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-09.46.05.png)](https://twitter.com/unity/status/1701650081403842851?ref=gorillasun.de) [Link to Tweet](https://twitter.com/unity/status/1701650081403842851?ref=gorillasun.de) [The post in which they detail all of their changes](https://blog.unity.com/news/plan-pricing-and-packaging-updates?ref=gorillasun.de). Essentially, Unity is introducing a run-time fee based on each individual install of games that make use of the unity run-time. The unity run-time being the software that gets packaged alongside games built with unity and lets them run on the user's device. This fee is only applied to games that exceed a specific threshold number of installs and revenue generated: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-10.15.31.png) Depending on the Unity plan that you're subscribed to a different run-time fee will be applied: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-10.17.08.png) Now that already brings up an interesting set of problems. For instance, malicious actors could simply keep reinstalling a game multiple times over and in that manner accrue charges for the developers. Unity argues that they already have a fraud-detection system in place to counteract this. They also state that they have means to detected pirated copies of games using the unity run-time. Chaos ensues. At first glance this might not seem like such a bad thing, what's 20 cents after all? But in reality it's actually a significant chunk of money once a a studio hits $200,000 - which is roughly the wage of 2-3 devs not considering other costs. Besides this, it's also a betrayal of trust: Unity shows that they can simply change their contract and enforce devs to pay for the games that they've built with their engine. Just like building a castle on sand, a lot of trust for Unity has been lost over the past couple of days. But this is only the tip of the ice-berg, there's been a lot of things happenings behind the scenes that have come to light that added fuel to the fire. Such as controversy around some members of Unity's board of directors selling large shares of their Unity stock just days prior to this announcement. Frey Holmier which you might be familiar with, being an employee at Unity has been very outspoken about the changes and succinctly summarizes the issues at hand: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-11.03.52.png) The latest update on this issue was Unity issuing an apology just a couple of hours ago: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-11.01.33.png) It's a rare occurrence to see large companies seemingly implode over the short course of a couple of days due to questionable business decisions, simply because of corporate greed, but this one takes the cake. It's uncertain if Unity can recover it's reputation after this. ## Interesting Reads ### Typescript Drama Besides the Unity problem, there's also been to a lesser extent some controversy around Typerscript. Last week, Turbo 8 announced that they would be dropping Typescript in favor of Javascript: [Turbo 8 is dropping TypeScriptBy all accounts, TypeScript has been a big success for Microsoft. I’ve seen loads of people sparkle with joy from dousing JavaScript with explicit types that can be checked by a compiler. But I’ve never been a fan. Not after giving it five minutes, not after giving it five years. So it’s with great…![](https://world.hey.com/dhh/avatar-df6405b0f7fafda980fd38b04c334bec936aef69)![](https://world.hey.com/dhh/avatar-df6405b0f7fafda980fd38b04c334bec936aef69)](https://world.hey.com/dhh/turbo-8-is-dropping-typescript-70165c01?ref=gorillasun.de) What is Turbo? Why are they dropping Typescript? And why did this upset the community. [Turbo](https://turbo.hotwired.dev/?ref=gorillasun.de) is a popular framework that reduces the amount of custom JS that needs to be written for webpages of all kind: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-16.34.22.png) It's creator stated that Typescript will be remove because it: > pollutes the code with type gymnastics that add ever so little joy to my development experience, and quite frequently considerable grief. Things that should be easy become hard. This lead to some backlash from the community, where many feared that this sudden change would break a lot of the packages that rely on Turbo: [Ruby on Rails creator removes TypeScript from Turbo framework, upsets community • DEVCLASSRuby on Rails creator David Heinemeier Hansson has removed TypeScript from the forthcoming version 8 of the Turbo \[…\]![](https://devclass.com/wp-content/uploads/2018/08/cropped-favicon-270x270.png)DEVCLASSTim Anderson![](http://devclass.com/wp-content/uploads/2018/03/Great-were-going-to-get-DevOps-ed-So-15-years-of-planning-processes-for-the-bin.jpg)](https://devclass.com/2023/09/07/ruby-on-rails-creator-removes-typescript-from-turbo-framework-upsets-community/?ref=gorillasun.de) Some articles were written in defense of typescript, astating it's importance and what it's benefits are: [Refusing TypeScript is a signal that you don’t care about code qualityA few days ago, David Heinemeier Hansson announced that Turbo 8 is dropping TypeScript . I’m okay with that because I don’t even know what Turbo 8 is. However, over the past few years, some frontend programmers have tried to sell me the idea that “TypeScript is useless, just use tests”. I thi…![](https://vitonsky.net/favicon.ico)Robert Vitonsky![](https://vitonsky.net/files/49e466ad97eb1db0c7f8e4fa914a59c62638edec7d50d0795194ff929a0e5d4d.png)](https://vitonsky.net/blog/2023/09/08/typescript-and-code-quality/?ref=gorillasun.de) I'm far removed from the world of Typescript - but I found this interesting nonetheless. ### lodash Issue Bankcruptcy What happens when your opensource github repo has way too many open issues? You declare bankcruptcy: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Picture1-1.webp) And that's excatly what the popular lodash utility library did this past week - closing several hundreds of open issues. And that's maybe not so bad after all and makes room for future improvements that matter rather than chasing loose ends that hinder meaningful progress: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-15.01.44.png) ### Kyle McDonald's Amends project It's already been one year since the Ethereum merge, however the impact that the blockchain has had on the environment still remains to be addressed. A year ago, media artist Kyle McDonald create his project amends.eco in an attempt to alleviate this issue - however a year later it still remains to be sold: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-15.04.24.png) ### The bug that caused the UK air traffic meltdown Here's something completely different, but nonetheless super interesting. James Hayden does a deep dive into the bug that cause one of the largest air traffic outage in over a decade - leading to the cancellation of over a 2000 flights. It's a very technical read, but very enjoyable at the same time: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-15.08.09.png)](https://jameshaydon.github.io/nats-fail/?ref=gorillasun.de) [Minimal and stylish design.](https://jameshaydon.github.io/nats-fail/?ref=gorillasun.de) ## AI Corner ### Optical Illusions A couple of days ago my timeline was full of these cool AI generated optical illusions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-16.11.26.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-16.10.12.png) My initial guess was that it's some sort of spiral/checkerboard pattern being fed into a generative image model, and it seems that that is in fact so: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-18-at-16.13.11.png) I might experiment with it this week - visually, it's one the coolest thing I've seen in a while in the AI art space! ## Gorilla Updates I actually managed to make quite a bit of art this week and also work some more on the new design of the blog - but it turns out that it's taking more time than anticipated. Saturday morning I returned to my irregular grids just to get the creative juices flowing. Layering two instances, I somehow ended up with this composition that I think turned out really nice - there's something very childish and playful about it, like it's made of lego blocks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/F6IlkAMW0AAbVOG.jpg) I have some ideas for taking this further, with some animated elements but that's entirely dependent on how much time I can invest this week in sketching. Earlier this week I spent some time exploring maze generation algorithms, such Prim's algorithm and Recursive backtracking that generate completely different patterns. I also learned about the River Factor, and how it determines the overall shape of a maze. A low river factor indicates many short dead ends, giving the maze a rather spikey appearance, whereas a high river factor leads to mazes that have long corridors and few short dead ends - example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/prim.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/mazerb.png) Spikey Maze generated with Prim's algorithm vs. longer and winding corridors with recursive backtracking I also did some circular sketchbook-looking sketches with arcs that I thought were interesting - they remind me of Aleksandra Jovanic's work in a way: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/jumble-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/jumbled2-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/jumbled.png) Jumbled Arcs And I worked a tiny bit on my other project that's been on hiatus for a while now: 0:00 /0:23 1× A glimpse into the core ## Music for Coding > Laura Lee and Mark Speer were planning to fly to Latin America, but when the right visa didn’t come through, and the airline gave them 24 hours to rebook their trip, they hastily switched to Thailand. On their trip through Bangkok, Cha-am, and Chiang Mai, the future bassist and guitarist for Khruangbin became enamored with what they called “noodle house music” Khruagbin mixes retro soul sounds, with flavors of surf, and psychedelic elements - all that with with some traditional Thai undertones, it's good vibes through and through: **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art of the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Newsletter 21 URL: https://www.gorillasun.de/blog/gorilla-newsletter-21/ Last updated: 2023-12-19T23:10:53.000Z **Hey everyone 👋 and welcome to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Recap - a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI.** **Hope you have a good stay!** --- ## Genart Updates Another week has passed, and yet again there's many interesting things happening in the genart space! Here's everything that I found worth sharing with you! ### Interview with Dr A Michael Noll At the top of the list, we have yet again Le Random with another piece of stellar genart content, this time interviewing none other that generative art pioneer Dr A Michael Noll: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-10.47.16.png)](https://twitter.com/lerandomart/status/1699756211350978970?ref=gorillasun.de) [Link to Tweet](https://twitter.com/lerandomart/status/1699756211350978970?ref=gorillasun.de) You can listen to the interview in it's entirety here: [Timeline Ch 4 (1960s): Dr A Michael Noll - Le Random AudioWe are beyond thrilled to speak with who we consider to be a critical founder of computer art and perhaps the first person to create digital graphic art.Peter Bauman (Monk Antony) spoke with Dr. Noll about:-The inspiration to make art with compute…![](https://www.buzzsprout.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCRVpVcGdVPSIsInB1ciI6ImJsb2JfaWQifX0=--324252d3ecc7f5df8468e7d522a0e070cd629065/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDem9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2QzNKbGMybDZaVWtpRFRZd01IZzJNREJlQmpzR1ZEb01aM0poZG1sMGVVa2lDMk5sYm5SbGNnWTdCbFE2QzJWNGRHVnVkRWtpRERZd01IZzJNREFHT3daVU9neHhkV0ZzYVhSNWFWVTZEMk52Ykc5eWMzQmhZMlZKSWdselVrZENCanNHVkE9PSIsInB1ciI6InZhcmlhdGlvbiJ9fQ==--03f0833fc1f2cde5411f21322468d38f12bbd9e9/LR%20Logo.jpg)Buzzsprout![](https://www.buzzsprout.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCRVpVcGdVPSIsInB1ciI6ImJsb2JfaWQifX0=--324252d3ecc7f5df8468e7d522a0e070cd629065/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDem9MWm05eWJXRjBTU0lJYW5CbkJqb0dSVlE2QzNKbGMybDZaVWtpRFRJMU1IZ3lOVEJlQmpzR1ZEb01aM0poZG1sMGVVa2lDMk5sYm5SbGNnWTdCbFE2QzJWNGRHVnVkRWtpRERJMU1IZ3lOVEFHT3daVU9neHhkV0ZzYVhSNWFWVTZEMk52Ykc5eWMzQmhZMlZKSWdselVrZENCanNHVkE9PSIsInB1ciI6InZhcmlhdGlvbiJ9fQ==--d796079ecfd153255dd28ac0c84b8b16b80b5513/LR%20Logo.jpg)](https://www.buzzsprout.com/2243493/13547211?ref=gorillasun.de) Dr. Noll recounts his early days at Bell labs, where he was exposed to probably one of the first instances of computer art - seemingly by chance: while a colleague was testing their program, the machine produced an output with a bunch of "jumbled lines". The colleague cheekily called it "computer art" in reference to the abstract art that was at the time becoming more popular. Noll, inspired by this incident, decided to deliberately create such machine generated compositions and continued down that line by making plotter drawings. Simply because it was a fun thing to do as he states. Later on, this led to other ideas, such as the famous Mondrian experiment, in which Noll recreated the famous "composition with lines" - the majority of people that were asked which was which, were not able to tell the difference. Later, it even became [a published paper](http://thekidsroad.com/assets/images/blog/blog-content/mushup-remix/Noll%5FMondrian.pdf?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-10-at-16.58.41.png) Throughout the interview Dr. Noll informs us of his story in a very eloquent manner - it's a must-listen! One thing that Dr. Noll said which I found very beautiful was the following sentence: > When you don't write it up, and tell other people, it is lost. \[...\] Publish. Tell the world, don't just sit there doing it. Write, publish, write. Noll stresses how important it is to record things and put them in writing, it's the one thing we can do to combat the passing of time. Besides this, I also recommend checking out the other article that [Peter Bauman](https://twitter.com/MonkAntony%5Ftez?ref=gorillasun.de) published this week: [Timeline Chapter 1: Ten Top MomentsChapter 1 of our story is the longest in breadth, covering the period before 1850, which we call the “Pre-Modern Era.” Spanning tens of thousands of years, Chapter 1 surveys the advancements in art, mathematics, science and computing history that led to the modern era of generative art.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le RandomPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64f875f0fa5286bb1d7f1cd0_Screenshot%202023-09-06%20at%201.51.48%20PM.png)](https://www.lerandom.art/editorial/timeline-chapter-1-ten-top-moments?ref=gorillasun.de) ### A conversation with William Mapan Another fantastic interview this week is by Cactoid Labs, a conversation with [William Mapan](https://twitter.com/williamapan?ref=gorillasun.de) who is currently creating work for the LACMA (Los Angeles County Museum of Art) collection. In the interview Mapan tells us about his diverse background, and how his different interests later on converged into the generative art that he makes today: [Remembrance of Things Future: A Conversation with William Mapan, Artist Experimenting on the BlockchainCactoid Labs curator and co-founder Lady Cactoid recently sat down with artist William Mapan to explore his process, the stories behind the art he currently has on view at the museum’s Stark Bar screens, and the work he is creating in dialogue with LACMA’s permanent collection for the project Rememb…![](https://unframed.lacma.org/sites/default/files/lacma_favicon.ico)UnframedLady Cactoid![](https://unframed.lacma.org/sites/default/files/field/image/William_Mapan_Bio_HeadShot.jpg)](https://unframed.lacma.org/2023/09/06/remembrance-things-future-conversation-william-mapan-artist-experimenting-blockchain?ref=gorillasun.de) He is also asked about the masterful use of color in his artworks. He states that one important part of his process, is the translation of the coded artwork onto paper, while at the same time trying to achieve the different gouache pigments by means of mixing primary colors: > Things come too easily. If I am at the art store, I could simply say, oh, I like this color, I am going to buy it. But if I do that, I don’t build a relationship with the color. I like to go deeper, to understand my colors. Color has been a weak point in my own art, that's my own sentiment at least. I often find myself falling back onto familiar and pre-defined palettes as a sort of safety cushion. Creating intriguing color systems has been on my to-do list for a long time now. ### ARTxcode New Artists ARTxCode is a creative studio and generative art agency that aims to represent and nurture a variety of different artists. They already boast an impressive roster of generative artists, such as [Martin Grasser](https://twitter.com/martingrasser?ref=gorillasun.de), and [Lars Wander ](https://twitter.com/larswander?ref=gorillasun.de)among others. This past week they announced that they'd be joined by two new faces, namely [Sasha Styles](https://twitter.com/sashastiles?ref=gorillasun.de) and [Linda Dounia](https://twitter.com/LindaDouniaR?ref=gorillasun.de). [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-07.00.10.png)](https://twitter.com/artxcode%5Fio/status/1699516715783102903?ref=gorillasun.de) [Link to Tweet](https://twitter.com/artxcode%5Fio/status/1699516715783102903?ref=gorillasun.de) | [Link to Twitter Spaces](https://twitter.com/i/spaces/1eaKbrjwrQaKX?ref=gorillasun.de) Besides the Twitter space ArtxCode also published two individual interviews with the artists over on their website. They provide an in depth look into their practice Sasha stiles has been making ripples with her innovative trans-disciplinary work on poetry and AI. Her interest in working with AI models started long before the current LLM craze took off, at a time when no one was really experimenting with language models for the purpose of creative writing. In the interview she recounts how she first discovered this new world, the tools that she initially used and how they evolved as well as how she approached this new creative practice: [Sasha Stiles on Philosophy, Technelegy, and the Future of Literature — ARTXCODESasha Stiles, a Harvard and Oxford graduate, resides near New York City. She is a first-generation Kalmyk-American poet, language artist, and AI researcher exploring the intersection of text and technology. Stiles has made a name for herself through her pioneering experiments with generative literat![](https://images.squarespace-cdn.com/content/v1/5f3d21d4566e5c1a731605bf/1602261196656-NEJPTCZ1N90QUTI44ABF/favicon.ico)ARTXCODEarltcollector![](http://static1.squarespace.com/static/5f3d21d4566e5c1a731605bf/5f502f58dec00e605636a598/64c9b37f1621257f826f9bfa/1694022789515/Screenshot+2023-08-12+at+5.49.07+PM.png?format=1500w)](https://www.artxcode.io/journal/sasha-stiles-interview?ref=gorillasun.de) Besides diving into the world of creative coding with tools like p5js and processing, Linda Dounia also discovered the creative possibilities of AI models. Coming from a background in design, GANs were a completely new approach to creating interesting and surprising work. In the interview she addresses a whole slew of important points, such as creative burnout, how to come out of it as well as avoiding being pigeonholed into a certain art direction: [The Ever-expanding World of Linda Dounia — ARTXCODELinda Dounia is an artist, designer, and curator examining the intricate interplay between tangible and intangible structures through her expansive creative practice that celebrates the art of craft-making in dialogue with technology with acrylic, ink, pastels, vector, video, GANs, and more recently![](https://images.squarespace-cdn.com/content/v1/5f3d21d4566e5c1a731605bf/1602261196656-NEJPTCZ1N90QUTI44ABF/favicon.ico)ARTXCODEarltcollector![](http://static1.squarespace.com/static/5f3d21d4566e5c1a731605bf/5f502f58dec00e605636a598/64eeb0c14faa3c75889cf52f/1694039879987/the+owl.jpeg?format=1500w)](https://www.artxcode.io/journal/linda-dounia-interview?ref=gorillasun.de) Kudos to ArtxCode for the lovely interviews! I recommend checking out their journal, the interviews with previous artists on their roster are also quite interesting. ### Piero's 16 SQRS [Piero, aka pifragile](https://twitter.com/pifragile?ref=gorillasun.de), returns with another bear market project - another minimal and experimental Tezos NFT platform. As it's name suggests [16 sqrs](https://16squares.xyz/?ref=gorillasun.de) revolves around the idea of making art simply by making use of 16 squares and placing them in various manners around the canvas. What's cool is that it's fully on-chain! As of now, the small marketplace has seen roughly 100 mints: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-07.46.23.png)](https://16squares.xyz/?ref=gorillasun.de) [Link to Platform](https://16squares.xyz/?ref=gorillasun.de) ### Landlinesart WIP - Draw your own curves Another generative project that caught my eye this week was [landlinesart](https://twitter.com/landlinesart1?ref=gorillasun.de) sneak WIP post for a new FxpParams project. It's essentially a curve editor where the user can create their curvy compositions: > yes, you can draw your own curves. [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/A2OQjwzGa1](https://t.co/A2OQjwzGa1?ref=gorillasun.de) > > — landlinesart (@landlinesart1) [September 6, 2023](https://twitter.com/landlinesart1/status/1699463535867433099?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) FxParams is getting out of hand! ### Tezumie's aijs Code Editor Besides making some stellar generative art, [Tezumie](https://twitter.com/Tezumies?ref=gorillasun.de) has now taken it upon themselves to build a code editor that's geared towards that purpose. This is especially exciting to me personally, because I've been looking to switch from Atom to something new for a while now, maybe this could be it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-08.37.36.png) [You can check out the editor here](https://twitter.com/aijs%5Feditor?ref=gorillasun.de) ### Chris McCully on LUTs LUTs, short for *Lookup Tables*, are essentially structures that take a number input and spit out another number in response. Chris McCully wrote an FxText about them, demonstrating some creative applications that they can be used for especially with regard to color blending: [fxhash - LUTs in Gen ArtA quick tutorial using 1D LUTs with p5.js and a fragment shader![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmePpwkbiabSY5zzLP3XZGfPXPqxzSq6awYNCBe9d3gGm2)](https://www.fxhash.xyz/article/luts-in-gen-art?ref=gorillasun.de) ### MAKIO135 returns to Twitter One other thing I wanted to share, is that Lionel Radisson aka Makio135 is back on Twitter after what seems to have been a little hiatus. The SVG wizard is back at it again making some stunning generative art: > I'm back 👋 [pic.twitter.com/62uscyueeP](https://t.co/62uscyueeP?ref=gorillasun.de) > > — Lionel Radisson (@MAKIO135) [September 3, 2023](https://twitter.com/MAKIO135/status/1698415812262899920?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Interesting Reads ### Rebuilding the TechCrunch layout with modern CSS A super interesting deep dive into how Ahmad Shadeed redesigned the tech crunch layout, walking us through his thought process by first analyzing the previous TechCrunch layout and then moving on to trying out different CSS approaches to solve some of it's problems: [Case Study: Rebuilding TechCrunch layout with modern CSSRebuilding TechCrunch with modern CSS.![](https://ishadeed.com/assets/favicon-32x32.png)Photo of Ahmad ShadeedAhmad Shadeed![](https://ishadeed.com/assets/rebuild-techcrunch/twitter-card.jpg)](https://ishadeed.com/article/rebuilding-techcrunch-modern-css?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) The more I'm learning about CSS, and after having put together a couple of my own layouts, the more I'm realizing that there isn't really a standard approach to implement things. Especially when it comes to non-standard layouts, a lot of *hacks* will be involved - but then again, can we really call them hacks if there is no standard approach? When coding with other proper programming languages, you can usually feel that you're doing things wrong. Either because the code is becoming bloated, or things have to passed around in a backhanded manner, and there's something off about the flow of the program. In CSS that hasn't been the case - because properties interact with each other, the flow of execution is a bit masked. For me at least, it always feels a little bit like an unorganized mess... but at the same time, it also always feels really good when my layout finally snaps into place. Brandon Smith wrote a really interesting piece in 2017, arguing against the rest of the world that CSS is awesome - and it's a really interesting perspective that also reveals some important notions on how one should reason while writing CSS: [CSS is Awesome | CSS-TricksI bought this mug recently for use at work. Being a professional web developer, I decided it would establish me as the office’s king of irony. The joke on it![](https://css-tricks.com/favicon.svg)CSS-TricksBrandon Smith![](https://css-tricks.com/wp-json/social-image-generator/v1/image/255923)](https://css-tricks.com/css-is-awesome/?ref=gorillasun.de) > **\[...\] never be more explicit than you need to be**. Web pages are responsive by default. Writing good CSS means leveraging that fact instead of overriding it ### Measuring Software Developer Productivity Being productive has been a big topic in my personal life recently, and for the most part I simply try to *go with the flow* \- that doesn't mean that I don't make to-do lists and soft deadlines by which I want to have completed certain projects/tasks. I've thought about ways to measure my productivity, and at an individual level this has boiled down to tracking how many words I write every day, usually aiming for a specific number (1000-2000). Other things are not as easy to track, usually things that lie of the design side of things. Things are done when they are done. I came across this article from McKinsey & Company that proposes and explains a nuanced evaluation model for companies to measure software developer productivity, at an individual level and across the teams that they might be part of: [Yes, you can measure software developer productivityMeasuring, tracking, and benchmarking developer productivity has long been considered a black box. It doesn’t have to be that way.![](https://www.mckinsey.com/next-static/images/mck-touch-icon-180x180.png)McKinsey & CompanyChandra Gnanasambandam![](https://www.mckinsey.com/~/media/mckinsey/industries/technology%20media%20and%20telecommunications/high%20tech/our%20insights/yes%20you%20can%20measure%20software%20developer%20productivity/yes-you-can-measure-software-developer-productivity-1171809295-thumb-1536x1536.jpg)](https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/yes-you-can-measure-software-developer-productivity?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) ### The worst Porgrammer I know And while we're on that topic - sometimes productivity metrics are not indicative of the an employees worth. [Daniel North](https://twitter.com/tastapod?ref=gorillasun.de) writes about how the *Worst Programmer* that he knows, was actually one that improved the entire team as a whole: [The Worst Programmer I KnowThe great thing about measuring developer productivity is that you can quickly identify the bad programmers. I want to tell you about the worst programmer I know, and why I fought to keep him in the team.![](https://dannorth.net/favicon.ico)Dan North & Associates Ltd![](https://dannorth.net/2023/09/02/the-worst-programmer/dilbert-bug-free-software-1024x311.gif)](https://dannorth.net/2023/09/02/the-worst-programmer/?ref=gorillasun.de) ### Two years for developing an MMO After becoming frustrated with the repetitive tedium that most AAA MMORPGs have become, Lukas Meisegeier set out to create his own. He recounts 2 years of developing his own game and addresses some of the challenges that he encountered - in particular, making the game look good and marketing it to a broader audience: [Two years for developing an MMOThe story of developing Raiding.Zone![](https://raiding.zone/favicon.png)Raiding.Zone![](https://raiding.zone/images/retrospective/prototype.jpg)](https://raiding.zone/docs/posts/retrospective/?ref=gorillasun.de) One thing on my bucket list is making my own game at some point in the future. But that's gonna have to wait for now. ### Modernization conflicts intent I have a love-hate relationship with Stackoverflow. The platform has helped me overcome numerous roadblocks as a programmer, however, when first joining the platform as an inexperienced student, I found that the overzealous nature of the platform can sometimes lead to bad experiences. Although I can't blame the users - having tried to actively answer questions for a while, I've also experienced the huge influx of low quality questions and Jan shultke brings up a important issue, regarding the case when answers become outdated due to syntactical discrepancies, I found this very interesting. Programming languages change with time, sometimes new features are added to a language, and syntactical practices then become obsolete with time. This has the effect that the modern version of a programming language provides a different way for writing specific pieces of code. In those scenarios is it acceptable to edit a Stackoverflow answer that is written with old syntax? [When do modernization edits conflict with the author’s intent?I regularly find myself "modernizing" C++ questions and answers by adding notes or changes based on more recent versions. For example, an edit might add lines 02 and 03: /\* 01 \*/ std::find(![](https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon.png?v=b73aa18f2881)Meta Stack OverflowJan Schultke![](https://meta.stackoverflow.com/Content/Sites/stackoverflowmeta/Img/apple-touch-icon@2.png?v=6de7587d1583)](https://meta.stackoverflow.com/questions/426288/when-do-modernization-edits-conflict-with-the-authors-intent?ref=gorillasun.de) ## AI Corner ### Times' 100 Most influential People in AI 2023 Time magazine compiled a list of the 100 most influential people in AI today. This doesn't only include the CEOs that sit at the helm of DeepMind and OpenAI, but also individuals that grapple with some of the ethical and moral implications of advancements in AI. For this purpose the list is split into 4 categories: Leaders, Innovators, Shapers, Thinkers. The list allows you to click on the different profiles leading to a short bio describing their involvement: [The 100 Most Influential People in AI 2023Here’s who made the 2023 TIME100 AI list of the most influential people in artificial intelligence.![](https://time.com/img/favicons/favicon-180.png)Time![](https://api.time.com/wp-content/uploads/2023/09/T100AIHeader_final.jpg?quality=85&w=1200&h=628&crop=1)](https://time.com/collection/time100-ai/?utm%5Fsource=twitter&utm%5Fmedium=social&utm%5Fcampaign=editorial&utm%5Fterm=tech%5Fartificial-intelligence&linkId=233683503) AI is unarguably becoming more mainstream. Thinking back on learning about ML and AI in 2019, things have changed a lot in such a short time-span. At the time I was also getting into making art with GANs and even trained a couple of my own models, but when I discovered creative coding and generative art, that just resonated more with me. I just find the 'traditional' - for a lack of a better word - of making art with computers much more exciting. Maybe at some point in the future I'll return to making AI art. ### Text-to-CAD The gradient is back with a new article, tackling a new avenue in which prompt based models could, at the same time, lead to meaningful advancements but also cause some serious problems. CAD models, short for Computer Aided Design, refer to 3D blueprints, like figurines for instance, that can be passed to 3D printers. These models are usually created by means of 3D modeling softwares, such as Blender and Maya. As you can imagine, this is not an easy task, it's essentially a modern form of sculpting items. Recently there's been efforts to adapt models for the purpose of generating these CAD models based off of an input prompt: [Text-to-CAD: Risks and OpportunitiesIn the realm of AI-powered text-to-CAD, there’s promise, but also a surge in subpar designs. Can we steer this technology towards better outcomes?![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)The GradientReggie Raye![](https://thegradient.pub/content/images/2023/09/shutterstock_2022003737.jpg)](https://thegradient.pub/text-to-cad/?ref=gorillasun.de) ## Gorilla Updates This week I have been deep in the throes of redesigning the blog: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-11.00.56.png) I've discovered that I do enjoy web design, now that I have a better grasp of CSS concepts, while at the same time I've become more comfortable working with the Ghost CMS. However, as I explained earlier, CSS can be frustrating sometimes if the goal is a layout that is customisable. Why the redesign? Mainly because I haven't been entirely happy with the current layout of the post/article template - I feel like the table of contents on the right side is taking up too much space and distracting from the main text on the page. The emphasis should be on the text. That's why this table of contents will soon be packaged inside of an expandable side-bar, alongside some navigation options. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-11.03.47.png) I also spent some time sketching and had some fun working on some SDF things again, the post I made about it on Twitter also really took off - becoming one of my most successful tweets in a while. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-11.04.07.png) [Check out the animated version on Twitter](https://twitter.com/gorillasu/status/1700227245455872445?ref=gorillasun.de) ## Tip of the Week I guess today's Newsletter is a special CSS issue, because our Tip of the week is this cool tool that lets you create smooth CSS box shadows - by layering several of them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-11-at-11.06.10.png) ## Music for Coding I first heard about this band through one of my lab mates in uni. Fast forward a couple years and I'd completely forgotten about the band until their album popped up again in my recommendations. Beautiful progressive rhythmic shuffles in combination with minimal clean electric guitar work produces some really nice soundscapes, that were perfect for figuring out some new algorithmic ideas this week: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Newsletter 20 URL: https://www.gorillasun.de/blog/gorilla-newsletter-20/ Last updated: 2023-12-19T23:10:59.000Z **Hey everyone 👋 and welcome to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Recap - a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI.** **Hope you have a good stay!** --- ## Genart Updates It's been another fantastic week for creative coding and generative art! There haven't been this many relevant updates in a single week since the beginning of the newsletter! ### LeRandom - Generative Art Timeline Ch. 4 LeRandom's generative art timeline is starting to take shape! We're entering the 1960s - arguably one of the most important eras that shaped the field of generative art in the way that we know it today: [Le Random - Generative Art TimelineExplore the 70,000-year history of generative art through hundreds of milestones and ten chapters.![](https://timeline.lerandom.art/favicon.ico)Le Random![](https://timeline.lerandom.art/img/og-image.png)](https://timeline.lerandom.art/?ref=gorillasun.de#/chapter-4) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-01-at-21.22.36-1.png) My knowledge of the early days of generative art is at best hazy, and I really don't know much about what happened in the 80s and 90s. Seeing the important events and characters of that era listed out in a chronological manner really helps fill out these empty patches. When I wrote about [Vera Molnar's early life](https://www.gorillasun.de/blog/the-art-of-vera-molnar/), it was quite a challenging task to find and collect information from different sources dispersed across the internet. Sifting through dozens of interviews, it seemed like I was piecing together a puzzle. LeRandom's efforts to this end are invaluable. I'm looking forward to the following chapters and to more articles that tackle the historical and philosophical aspects of generative art, as an artform. ### Melissa Wiederrecht's 'Is it Art?' Something that completely flew under my radar where two posts from Right Click Save, one written by herself and another an interview with her. Formulating every sentence as a question, Melissa put together a beautiful piece of writing. She rattles at the very foundation of what we consider digital art in this day and age, and the chain of questions slowly reveals itself as an introspective into some of the experiences she's made navigating the digital and genart space over the course of her career. She raises questions about the medium, about the process, about social media, and so many more things that I believe many a digital artist has grappled with at some point: [Is It Art?Melissa Wiederrecht goes in search of the meaning of generative art![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Luke Hespanhol![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64e3ca658e1525ab70851d64_Screenshot%202023-08-21%20at%2021.34.39.png)](https://www.rightclicksave.com/article/is-it-art-melissa-wiederrecht-generative-art?ref=gorillasun.de) Complementary to this, RCS published an interview with Melissa diving into her artistic background: from early beginnings, where she began to invent her own drawing systems at a young age, up until the present day where she has developed her own unique generative identity: [The Interview | Melissa WiederrechtThe artist explores the space between generative art and identity with Whitney Hart![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Melissa WiederrechtLuke Hespanhol![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64e6693ee5e7c3424be2c02e_Screenshot%202023-08-23%20at%2021.16.53.png)](https://www.rightclicksave.com/article/the-interview-melissa-wiederrecht-generative-art?ref=gorillasun.de) Melissa Wiederrecht is currently one of the most prolific generative artists in the space, churning out one stunning artwort after another. Many lessons can be learned from these two posts, I highly recommend having a look at both of them. ### Tracing the Line - Vetro Editions Following their stellar handheld Augmented Reality Experience - A.R.E - this November Vetro Editions returns with another collaboration with Generative Hut. This time round, their new book revolves entirely around the pen-plotter, it's historical and contemporary use in generative art, all while featuring some of the artists that have made heavy use of the wonderful machine: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-04-at-09.22.43.png) [Link to Tweet](https://twitter.com/VetroEditions/status/1697165912070136306?ref=gorillasun.de) | [Link to Book](https://vetroeditions.com/products/tracing-the-line?ref=gorillasun.de) Who doesn't love watching plotters work their magic? This isn't a sponsored segment - I just think that Vetro Editions has made some fantastic generative art books. Hence the shoutout. In my meagre genart book collection I already have two of theirs: their previous A.R.E book, as well as Matt DesLauriers' Meridian Artbook for which they acted as a publisher. ### P5Js gets some Updates This week there's also two new things worth mentioning regarding the lovely P5 library. Firstly, a P5 text library built by Arthur Cloche that brings a whole slew of new text manipulation functions to the table. If you've ever worked with text in P5, you'll know that the methods that come out of the box are a bit clunky. Stretching and curving text are two new things that can be done with Cloche's library which p5 doesn't natively support, and are not very straightforward to achieve if you set out to code them from scratch: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-04-at-09.25.05.png)](https://twitter.com/ArthurCloche/status/1696072577372881236?ref=gorillasun.de) [Link to Tweet](https://twitter.com/ArthurCloche/status/1696072577372881236?ref=gorillasun.de) | [Link to Repository](https://github.com/amehowc/p5.variableFont?ref=gorillasun.de) Another update is Justin Wong's GSOC (Google's Summer of Code) contribution, that adds hardware acceleration to P5's filter function. The filter() function is notoriously slow due to the per pixel operations that it has to compute, but this is no longer so - by making use of the GPU it's now blistering fast! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-04-at-09.26.13.png)](https://twitter.com/davepvm/status/1697584024594612693?ref=gorillasun.de) [Link to Tweet](https://twitter.com/davepvm/status/1697584024594612693?ref=gorillasun.de) | [Link to Repository](https://github.com/processing/p5.js/pull/6324?ref=gorillasun.de) ### Alba Concludes it's beta phase Alba concludes it's beta phase, with 27 beautiful pieces minted on the Ethereum blockchain, and takes a little break before opening up for everyone to mint their projects on the platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Screenshot-2023-09-04-at-09.28.19-1.png) [Link to Tweet](https://twitter.com/davepvm/status/1697584024594612693?ref=gorillasun.de) ### Now There's None of You Left by Xalted One stunning piece of generative art from the past week is Xalted's newest project titled *Now There's None of You Left* over on fxhash: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/now_theres_none_of_you_left.jpg) [Link to Project](https://www.fxhash.xyz/generative/slug/now-there's-none-of-you-left?ref=gorillasun.de) Asking about the process over on Twitter, Xalted pointed me to a writeup for his previous project. The work is done Cables.gl, which is a node based webgl environment. It seems that it is a quite effective tool for the purpose of generative art: [fxhash - The Making of “In a Moment, a Thousand Years”A brief overview of the process behind the making of ‘In a Moment, a Thousand Years’.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmctSvA6FBQfja7duTnEtBasv2tdB9T7WsiAdHZnjCMoVv)](https://www.fxhash.xyz/article/the-making-of-%22in-a-moment-a-thousand-years%22?ref=gorillasun.de) Xalted explains how the varied compositions emerge from the layering of intersecting shapes and then feeding color into them. ## Interesting Reads We also have quite a chunky list of interesting reads and things to watch this week! ### Snake Game inside of a QR Code You've probably heard about code golfing, but have you ever heard of a game in a QR code? Inspired by MattKC's video [Can you fit a whole game into a QR code?](https://www.youtube.com/watch?v=ExwqNreocpg&ref=gorillasun.de), Elisha Hollander set out on a mission to actually make it a reality. Recently they finally managed to bring down the size of their snake recreation, coded in x86 assembly, down to 75 bytes. After making ripples on the r/programming subreddit, this also prompted a feature over on the Hackaday page: [It’s Snake, In A QR Code, But SmallerWe’re not sure that many of you have recognised the need in your life for an x86 machine code program encoded into a QR code, but following on from someone else work \[donno2048\] has created a…![](https://hackaday.com/wp-content/themes/hackaday-2/img/hackaday-logo_1024x1024.png?v=3)HackadayJenny List![](https://hackaday.com/wp-content/uploads/2023/08/qr-snake-featured.jpg)](https://hackaday.com/2023/08/03/its-snake-in-a-qr-code-but-smaller/?ref=gorillasun.de) The original video: ### Factorio, Mutation, & Lossiness While we're on the topic of video games, here's an article by Ryan Fleury on Factorio. I never played Factorio myself, but I've watched quite a few letsplays, and it looks like a really intricate, fun and engaging experience. Factorio is essentially a strategy game in which you build different kind of factories to process materials, transform them, then deliver them to other factories to produce other kinds of resources and so on. Ultimately feeding these resources into the construction of units to fend against the creatures of the foreign planet that you find yourself on. And apparently Factorio has a lot of parallels to programming. In a way playing the game feels like programming. Ryan Fleury elaborates that Factorio has a lot to do with the concept of "data tranforms". One way of thinking about programming, is that it can be seen as an act of transforming one kind of data into a different kind of data. Several problems can emerge when handling data, such as lossiness and throughout issues. Building your factories and conveyors in Factorio have similar emergent properties:s [Factorio, Mutation, & LossinessOn Factorio, the high-level term “data transforms”, how data transforms are practically implemented, and tradeoffs to consider in various implementation styles.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1512c3be-bed5-4a80-9654-f3e45f9f1ad2%2Fapple-touch-icon-1024x1024.png)Hidden GroveRyan Fleury![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F017460fc-a1a7-4a13-97e0-f45a05c03a4e_1226x772.png)](https://www.rfleury.com/p/factorio-mutation-and-lossiness?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) ### Shining a Light on the Digital Dark Age Every few weeks or so I take some time to clean up the folders that I have sitting on my desktop, and it always takes me more time than expected. It's just always the case that I've accrued way more files than I initially thought, and often there simply isn't a good way to organize them. Data preservation is also a real problem at a much larger scale. While humanity churns out *content* at an exponentially increasing rate,what efforts are directed towards the preservation and longevity of this data? It's already difficult to find things from just a few years back - in another decade or two we might see more and more parts of the early internet vanish forever. For instance, in 2019 MySpace succumbed to irreversible data loss during a server migration, losing millions of songs and images that once lived on the platform. Adrienne Bernhard shines light on this growing problem, and discusses some of the efforts that are currently being done to counteract it: [Shining a Light on the Digital Dark AgeWithout maintenance, most digital information will be lost in just a few decades. How might we secure our data so that it survives for generations?![](https://static.longnow.org/2022/06/favicon.png)Long NowAdrienne Bernhard![](https://static.longnow.org/2023/07/digital-dark-age-.jpg)](https://longnow.org/ideas/shining-a-light-on-the-digital-dark-age/?ref=gorillasun.de) ### Paypall Password Pandemonium Max Levchin, co-founder of Paypall, recounts arriving in America for the first time, after having fallen in love with cryptography. Seemingly by chance he comes across Shamir's secret sharing method, later on implementing it as a mechanism for unlocking the Paypall servers. Shamir's secret sharing is essentially a method for transmitting information between a group of friendly actors, such that the secret can only be decoded when N people of that group put their keys together. Levchin tells the story of what could have potentially been a *company ending* incident: [Shamir Secret SharingIt’s 3am. Paul, the head of PayPal database administration carefully enters his elaborate passphrase at a keyboard in a darkened cubicle of 1840 Embarcadero Road in East Palo Alto, for the fifth time.…![](https://64.media.tumblr.com/avatar_d8954d88b503_128.pnj)Tumblr![](https://64.media.tumblr.com/d129d184982c0de25c1c78ad95ea9ed7/0664a96740bb1a37-df/s16x16u_c1/9e901c695143b9e9efc5244ebf6ca175dcf5f58e.pnj)](https://max.levch.in/post/724289457144070144/shamir-secret-sharing-its-3am-paul-the-head-of?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) ### Words of Advice from Bjarne Stroustrup I also wanted to share these insightful words from Bjarne Stroustrup, whom you might know better as the creator of C++. His advice to younger programmers is *to not overspecialize and diversify your skillset*: ## AI Corner ### R.I.P. Doug Lenat Doug Lenat was a titan in the field of AI. Over the past 40 years Lenat founded and directed of the [Cyc](https://en.wikipedia.org/wiki/Cyc?ref=gorillasun.de) project, an ontology that aims to capture all of the rules that describe how the world works in an attempt to *codify common sense reasoning* for the purposes of AI models. Although never becoming a huge commercial success, but an increasingly important effort now that we are etching our way towards general artificial intelligence. Gary Marcus, a collaborator and friend of Lenat talks about the efforts that have gone into Cyc and Lenat's vision for Cyc: [Doug Lenat, 1950-2023AI has lost a giant![](https://substackcdn.com/icons/substack/apple-touch-icon-1024x1024.png)Marcus on AIGary Marcus![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb322d9e-ee38-46af-90c7-711fd4ef7179_200x250.jpeg)](https://garymarcus.substack.com/p/doug-lenat-1950-2023) Together they wrote a final paper titled [Getting from Generative AI to Trustworthy AI: What LLMs might learn from Cyc](https://arxiv.org/ftp/arxiv/papers/2308/2308.04445.pdf?ref=gorillasun.de). ### ChatGPT and Emotional Outsourcing Kelly Weirich tackles the topic of emotional writing using LLM's like chatGPT and the generally negative sentiment towards it. When writing something like a congratulatory message, a message of condolences or even a love letter, it is often difficult to find the right words to express these sentiments in written form. With a tool like ChatGPT however this is not an issue anymore, as long as there is not indication that you used such a model. Is it morally wrong to use LLM's for this purpose? Does the intent change because the emotional challenge was outsourced to the machine? Or is it just lazy to do so? Weirich addresses all of these points in what I find to be an important discussion: [ChatGPT and Emotional Outsourcing - Prindle InstituteWhat’s the harm?![](https://www.prindleinstitute.org/apple-touch-icon.png)Prindle InstituteKelly Weirich![](https://www.prindleinstitute.org/wp-content/uploads/2023/03/DALL%C2%B7E-2023-03-22-10.32.01-abstract-pencil-and-watercolor-of-robot-using-typewriter.png)](https://www.prindleinstitute.org/2023/03/chatgpt-and-emotional-outsourcing/?ref=gorillasun.de) ## Gorilla Articles **Just a short announcement for this section:** *I'm going to be reducing the frequency of weekly posts in the coming months, from 2 posts a week to a single one. This in part due to some other projects that I need to work on, and partly because I want to work on improving the blog as a whole, and there simply isn't enough time to work on both writing new articles and developing the blog. I hope that this will help with being more consistent about my posting schedule from now on.* ## Gorilla Sketches I did a lot of sketching this week, some of my sketches I already shared over on Twitter, as well as some other things that I can't show just yet. One of the things I did was this recreation of an older idea, with a new twist. Instead of letting random grid walkers expand limitless (as long as there is space), instead their overall length is capped, making it very reminiscent of the original snake game: 0:00 /0:06 1× A tricky part was figuring out how to make snakes on this grid unstuck when they get their head has nowhere to go. I still need to think about that a little. ## Music for Coding The Youtube recommendation algorithm did it's thing again and recommended this gem! Altin Gün is a Türkish psychedelic-folk-rock band from Amsterdam. Drawing inspiration from the [Anatolian rock](https://en.wikipedia.org/wiki/Anatolian%5Frock?ref=gorillasun.de) scene of the 60s and 70s, the band blends between oriental Türkish sounds and 70s rock. I thoroughly enjoyed their album Gece from start to finish: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Newsletter 19 URL: https://www.gorillasun.de/blog/gorilla-newsletter-19/ Last updated: 2023-12-19T23:11:04.000Z **Hey everyone 👋 and welcome to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Recap - a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI.** **Hope you have a good stay!** --- ## Genart Updates ### Decoupling Generative Art Peter Bauman strikes again with another article for LeRandom, this time joined by Philip Galanter. Philip Galanter, associate professor at Texas A&M University teaching generative art, physical computing and complexity theory, among others, developed an interest in generative systems from a young age, and has subsequently dedicated a large part of his career to generative art and the study thereof. In 2003 he published a paper titled [*What is Generative Art? Complexity Theory as a Context for Art Theory*](https://www.philipgalanter.com/downloads/ga2003%5Fpaper.pdf?ref=gorillasun.de)in which he constructs a framework for understanding what generative art means and all of the practices that it encompasses. Although generative art has changed quite a bit in the past two decades, the paper still provides a comprehensive picture of the modern Artform. The interview covers some of his theories: [Decoupling Generative Art with Philip Galanter‍Peter Bauman (Monk Antony) reflects on Philip Galanter’s classic 2003 definition of generative art before briefly speaking with the artist, Texas A&M professor and theorist about the definition twenty years later.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art InstitutionPeter BaumanPeter, an arts writer, is responsible for Le Random’s editorial branch.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64df883d54b968a39c3b4508_Once%20upon%20a%20flower%20A-0X02_Linda%20Dounia.png)](https://www.lerandom.art/editorial/decoupling-generative-art-with-philip-galanter?ref=gorillasun.de) Before questioning Galanter on his career and his generative art theories, Bauman also starts us off with a short but interesting analysis of the term generative art and how generative systems are contemporarily perceived. ### Julian Hespenheide's FSM [Julian Hespenheide](https://www.julian-h.de/?ref=gorillasun.de) is currently one of the artists that stands at the forefront of generative art. I discovered Julian's work the first time over on Instagram, and I was instantly mesmerized by the morphing ASCII animations. With the release of his second project for [Bright Moments](https://twitter.com/brtmoments?ref=gorillasun.de) this past July - he recently published a complementary article that details the inner workings of the piece, and recounts some of the inspirations and techniques that culminated in the final work. You can find the article for FSM - short for Finite-state machine - over on fxtext: [fxhash - FSM. Notes on the work or: An attempt to explain everything and nothingAn attempt at unwrapping the layers: Today I’d like to invite you on a lengthy but hopefully interesting explanation of where my newest algorithmic piece FSM comes from and what some of its details are. If you are curious enough and would like to dive deep, I think now is a good time to grab your fa…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmV4eeJFd5BkRRLryHFpiyCyHYeiT7PrLTAxWZutbDkMvK)](https://www.fxhash.xyz/article/fsm.-notes-on-the-work-or%3A-an-attempt-to-explain-everything-and-nothing?ref=gorillasun.de) It's a long read, but it's very enjoyable and insightful from start to finish. And I'm all about that. Returning to Javascript to code up a preliminary version of FSM, at the time titled STATEMACHINES, Julian quickly approached the limits of what can be done with a CPU when things are animated. As always, shaders were the answer. After some initial struggles things finally clicked and a shader version of FSM started to take shape. I'll leave the rest to Julian's article, that details how the nifty emergent system works behind the scenes. ### Rückkoplung Another project that completely flew under my radar is pxlshrd's new generative piece titled "Rückkoplung" - the German term for feedback. And the way that it blends colors in such an organic manner; it's one of the best pieces that I've seen lately. Pxlshrd composed a little poetic thread that gives a glimpse into how the compositions in Rückkoplung are created: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-26-at-12.00.54.png)](https://twitter.com/pxlshrd/status/1694413238128038360?ref=gorillasun.de) [Link to Tweet](https://twitter.com/pxlshrd/status/1694413238128038360?ref=gorillasun.de) In a similar manner to Julian Hespenheide, pxlshrd also got his hands dirty and learned shader coding for this project, and I'd love to see a *making of* type of post for the project in the near future. As always, this reminds me that I should really get back on learning shader coding. --- ## Interesting Reads ### On Domain Repetition While we're on the topic of shader coding - Inigo Quilez is back with a new article about Domain Repetition, a shader technique that makes it possible to repeat shapes and tile them infinitely with fairly little code. The tutorial goes pretty deep and also addresses some of the problems that arise: [Inigo QuilezArticles on computer graphics, math and art![](https://iquilezles.org/favicon.png)Inigo Quilez![](https://iquilezles.org/logo.jpg)](https://iquilezles.org/articles/sdfrepetition/?ref=gorillasun.de) If you want to get into shader coding Inigo Quilez has some of the best resources in that regard. ### Bezier Curves and the logic behind them First off, [Richard Ekwonyé](https://www.richardekwonye.com/?ref=gorillasun.de) has one of the best looking sites that I've seen all year. Secondly, he's recently written a wonderful piece on Bézier Curves, explaining the logic that makes them possible and how they're a scaffold for what many a designer/programmer probably knows as an easing function. Yes, easing functions are nothing more than specific configurations of Bézier curves - I never thought about it that way before, but it makes sense. The article also provides many interactive examples that you can play with: [Bézier Curves - and the logic behind them | Richard EkwonyeThe logic behind Bézier Curves used in CSS animations and visual elements.![](https://blog.richardekwonye.com/apple-touch-icon.png)Richard EkwonyeRichard Ekwonye![](https://www.blog.richardekwonye.com/images/bezier-curves-cover.jpg)](https://blog.richardekwonye.com/bezier-curves?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) If you want to learn more about Bézier curves I also recommend [Freya Holmier](https://twitter.com/FreyaHolmer?ref=gorillasun.de)'s stellar video on the topic from last year: It's one of my favorite videos of all time; while breaking down the logic behind Bézier curves into small and digestible bits, you're spoon-fed all of the relevant pieces of information via gorgeous visualizations, making it incredibly easy to understand the underlying mathematical concepts of Bézier curves. ### Interactive Code Snippets on any webpage Not an interesting read per se, but this an incredibly relevant github repo for every blog/website that revolves around programming in one form or another. Similarly to the embeddable javascript widget that I built a while back, this widget lets you include executable code snippets in your posts with ease: [GitHub - rameshvarun/blog-cells: Add interactive code snippets to any blog or webpage.Add interactive code snippets to any blog or webpage. - GitHub - rameshvarun/blog-cells: Add interactive code snippets to any blog or webpage.![](https://github.com/fluidicon.png)GitHubrameshvarun![](https://opengraph.githubassets.com/5314e5443a9a641d6185670b7443dd4b2216f578d7a8590c49f2d5568cb6c4ec/rameshvarun/blog-cells)](https://github.com/rameshvarun/blog-cells?ck%5Fsubscriber%5Fid=2268013406&ref=gorillasun.de) I also like the slick design of the codebox, I still have to check if it's more lightweight than the widget that I've concocted myself however. If you want to build something like this yourself, my writeup can be found here: [Building an Embeddable Javascript WidgetIn this tutorial we’ll cover how to create a vanilla javascript widget that can be embedded on websites, and is capable of executing javascript safely in an iframe.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-3.png)](https://www.gorillasun.de/blog/building-an-embeddable-javascript-widget/) ### ### The Case for Software Criticism Although software is an integral part of our existence in the 21st century, we haven't really adopted a culture of software criticism in the same way that we contemporarily do it for other kinds of technology. For instance, we have car connoisseurs, and a car is arguably a comparably complex piece of engineering. Sheon Han from WIRED makes the case for software criticism, why it's important and goes into some of the reasons as to why we haven't developed such a culture yet: [The Case for Software CriticismSoftware may be the defining cultural artifact of our time. So why isn’t there a culture of critical analysis around it?![](https://www.wired.com/verso/static/wired/assets/favicon.ico)WIREDCondé Nast![](https://media.wired.com/photos/63f6c2ced35154c5a1727fc0/191:100/w_1280,c_limit/ideas_software_criticism_programming_culture.jpg)](https://www.wired.com/story/software-criticism/?ref=gorillasun.de) Sheon Han points out that software criticism is still relatively young when compared to other fields that have had a much longer timespan to ripen. I do think however that we're at an inflection point, especially with the younger generations being much more tech-literate. For example; I do notice a lot of criticism in the video-game space, where developers are held to an increasingly higher standard with every passing year. ### A Complete Guide To Building a Hand-Wired Keyboard An to wrap up the Interesting Reads section I wanted to share this - if you've ever wanted to build your own keyboard from scratch, here's the instruction manual: [A Complete Guide To Building a Hand-Wired KeyboardA complete and easy to follow guide detailing how to select components, design, customize and build a mechanical keyboard.![](https://www.crackedthecode.co/apple-touch-icon.png?v=693ad)Cracked the Code — Adventures in electronics, tinkering and retro computing.— Written by Ben Chapman![](https://www.crackedthecode.co/a-complete-guide-to-building-a-hand-wired-keyboard/hand-wired-keyboard-with-rgb-leds-completed_cover.jpg)](https://www.crackedthecode.co/a-complete-guide-to-building-a-hand-wired-keyboard/?ref=gorillasun.de) ## AI Corner ### One Pixel Attack Image classification models mainly rely on examining the pixel structure of images to determine what the content of the given image is. While training models on large datasets of images, they will pick up on cues that help them make their decisions and internalize these cues as abstractions in their internal state. For instance specific textures can be indicative of certain entities, like the black and white stripes of a Zebra. But how robust do these models end up being? Do they actually learn to recognize these patterns in a smart way? What happens if we change the color of a singular pixel in the image? Will the model still be able to correctly classify the image? There's this famous trick called the *one pixel attack*, where we change the color of a single pixel in the image and can this way deceive the classification model. Devansh goes into how this works and how it actually succeeds at deceiving the model: [Why does changing a pixel break Deep Learning Image Classifiers \[Breakdowns\]Understanding the phenomenon behind adversarial perturbation and why it impacts Machine Learning![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c0787a9-667a-40fd-b9a6-9be50c98e268%2Fapple-touch-icon-1024x1024.png)Artificial Intelligence Made SimpleDevansh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8213015-d6e1-4a9b-8a04-f3bbf9fa73c0_640x620.png)](https://artificialintelligencemadesimple.substack.com/p/why-does-changing-a-pixel-break-deep) ### AI Reveals the Most Human Parts of Writing And another article from WIRED, this time by Katy Ilonka Gero, highlighting how large language models, packaged in the form of chatbots, have been a transformative tool in the hand of writers. Rather than letting the machine take the lead, it becomes a writing assistant that can provide some guidance during difficult passages or when writer's block is especially hard to overcome. I've also used ChatGPT quite a lot, especially when I want to bounce off some new ideas quickly and see what the machine has to say about them, maybe generating some sentences that spark something. I never end up using what the LLM generates, because it's simply too generic, but sometimes I find interesting bits and pieces that spark ideas and structures for writing sentences in a way that I wouldn't have come up with myself. The article goes into all of this: [AI Reveals the Most Human Parts of WritingWhen do writers want help finding inspiration? And when do they want full control? Computers could expose the true future of the medium.![](https://www.wired.com/verso/static/wired/assets/favicon.ico)WIREDCondé Nast![](https://media.wired.com/photos/638950f41857496878b1b1eb/191:100/w_1280,c_limit/artificial-intelligence-human-writing.jpg)](https://www.wired.com/story/artificial-intelligence-writing-art/?ref=gorillasun.de) ### ## Gorilla Articles This week I published the 3rd installment of the *3 generative artists* series. This one features Shvembldr, Qubibi, and Aleksandra Jovanic, with a focus on the distinct generative voices that they've acquired over the course of their careers. The article tries to lay open the aspects that make their approaches so unique and distinguishable, and hopefully provides some insights into building your own generative identity: [Style, Voice and Identity in Generative ArtWhat is style? As an artist, what makes you, you? Moreover, how do artists find their own stylistic voice? Especially when it comes to generative art? In this article we have a look at the art of Shvembldr, Qubibi, and Aleksandra Jovanić![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/asdasdasd-1.jpg)](https://www.gorillasun.de/blog/style-in-generative-art/) As an artist, what makes you, you? I preface the article with a short discussion about what the term *style* actually means in the arts. Style doesn't solely refer to a collection of perceptible attributes belonging to a piece of art, but rather, it also encompasses the imperceptible, such as the process according to which the art was created, the message that the artist tries to convey, as well as the inspirations that influenced the conception of an artwork. Generative art is an artform that makes it incredibly difficult to categorize individual pieces, not just because there's a multiplicity of different tools, programming languages and algorithmic techniques, but also because they allow us to express our ideas in such varied ways. From this angle, generative art becomes that much more fascinating. ## Gorilla Sketches I've had a new idea this week, well not really new, it's been at the back of my mind for a while and I finally found the time to make it real: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/strange.png) It's a strange kind of grid, and it probably doesn't look like much at this point, but there's actually many parts of the code that can be played with and tweaked. It's been a while that I'm this excited about a sketch! At the same time I also had an interesting conversation with Julian over on TwitterX, around why it's sometimes so difficult to push through the final stretch of a project and it's always easier to get started on something new instead: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-28-at-11.14.56.png)](https://twitter.com/gorillasu/status/1695200819262435627?ref=gorillasun.de) [Link to Tweet](https://twitter.com/gorillasu/status/1695200819262435627?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-28-at-11.15.32.png) ## Tip of the Week You can now use Python in excel! That means you that you can use your favorite Python libraries directly in excel for every kind of number crunching that you'd like to do: [Announcing Python in Excel: Combining the power of Python and the flexibility of Excel.Since its inception, Microsoft Excel has changed how people organize, analyze, and visualize their data, providing a basis for decision-making for the…![](https://c.s-microsoft.com/favicon.ico?v2)TECHCOMMUNITY.MICROSOFT.COMMicrosoft Excel![](https://techcommunity.microsoft.com/t5/image/serverpage/image-id/499578iCFBE95FA3B9C3DDE/image-size/original?v=v2&px=-1)](https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439?ref=gorillasun.de) ## Music for Coding When I'm coding, writing and working I need to listen to something uplifting and ambient, you know, something that makes me feel like I'm spending a day at the beach with my friends. That's why I love Tycho's music so much, it has exactly that effect - it teleports me back home. I'm always on the lookout to find artists that exude a similar vibe, and recently I came across the music of Christopher Willits. Signed by the same label he creates lush and dreamy ambient tracks that are perfect to listen to while working on a piece of code: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Style, Voice and Identity in Generative Art URL: https://www.gorillasun.de/blog/style-in-generative-art/ Last updated: 2023-08-24T12:13:28.000Z **As an artist, what makes you, *you*?** This is an incredibly tough question to answer - but to find a leverage point, there's this ephemeral thing called *style*. And that darned word can mean so many different things - all at once. Formally, when referring to a singular artwork, it's the characteristics that allow us to recognize what *kind* of artwork it is, and in other words, allows us to categorize said artwork. Wikipedia, as well as many other sources, borrow Ernst Gombrich's succinct words to define the term. In 1968 the renown art historian wrote: > In the visual arts, style is "\[...\] any distinctive, and therefore recognizable, way in which an act is performed or an artifact made or ought to be performed and made." To that end, style isn't just a collection of attributes and/or characterizations associated with a particular piece of art; but it is more than that, it's *a way of doing - a process*. [An excerpt of Gombrich's writing can be found here.](https://monoskop.org/images/1/19/Gombrich%5FErnst%5F1968%5F2009%5FStyle.pdf?ref=gorillasun.de) Categorization based on perceptible traits helps us construct a meaningful analysis framework for the art styles of past eras. Especially for classical and formal art styles that had to obey a number of set rules. For modern and contemporary art this might be a relatively constricted perspective however. In the age of the machine we have access to so many more tools that allow artists to express themselves in such a multifarious manner, that the lines between categories become increasingly blurry. When referring to individual contemporary artists, a slightly more descriptive term might be the term "*fingerprint"*. This comprises an artists' technique, their creative approach, the ideas and messages that they try to express, as well as the choice of the perceptible components like color, shape/form, structure and composition. Seeing that an artistic fingerprint is comprised out of so many different variable components, it is in essence an ever evolving beast that grows and changes shape as new works are completed. It is something that transcends the individual artwork and communicates across an artists' entire body of work. --- Generative art is one such artform where it is difficult to categorize the individual artworks that have emerged in recent years. There's just to many factors that need to be considered when doing so. Generative systems often yield large, if not infinite, output spaces that comprise a wide variety of different compositions. Simultaneously, we also have the inner workings of these systems, that are often concoctions of different algorithmic methods that work in tandem to produce the final output. Do we judge the system? Or do we completely ignore it and simply focus on the outputs? Given these two schools of thought, how do we create an analysis framework? *Luckily, this is not the question that I'm trying to answer today - because I wouldn't know where to start.* A thoughtful piece on this topic is Peter Baumann's article titled Demystifying Generative Art over on LeRandom: [Demystifying Generative ArtPeter Bauman (Monk Antony) develops a framework for appreciating and analyzing generative art through an investigation of the movement’s locus of artistic intent.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art Institutiontwo articles![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64b80a26a2fd5b2f287e7e39_Screenshot%202023-07-19%20at%205.06.29%20PM.png)](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) In this article I'd like focus what style means in generative art. Being the 3rd installment of the 3 generative artists series, I'd like to amplify the voices of Shvembldr, Qubibi and Aleksandra Jovanic and showcase the unique generative voices that they have developed over the years. All of them have been big inspirations to me on my genart journey. Stylistically they cover a lot of ground, and I believe that there's a lot of lessons to be learned by inspecting their careers as artists as well as how they arrived at the art that they're making today. > "Art is the most intense mode of individualism that the world has known." - Oscar Wilde ## Shvembldr - Be Different, take Risks The first artist that I want to have a closer look at today is [Shvembldr](https://twitter.com/shvembldr?ref=gorillasun.de). Having produced a large body of work since he discovered generative art for himself in 2018, I'd argue that he's become one of the modern pioneers in the space. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/concept.webp) "CONCEPT" by Shvembldr In an interview with [Marcelo Soria-Rodriguez](https://twitter.com/msoriaro?ref=gorillasun.de), an accomplished generative artist in his own right, Shvembldr makes the following statement after being asked about his artistic influences: > I have a bit of a strange character - I want very much not to be like anyone else (this does not always work), so I try not to be guided by other artists when I create something, and if I use an idea or a technique, I try to remake it beyond recognition. I often use as references the work of artists who wrote with their hands rather than digital. The only name that escapes Shvembldr is [Manolo Gamboa Naon](https://www.katevassgalerie.com/manolo-gamboa-naon?ref=gorillasun.de). But like... who isn't inspired my Manolo? [Slowing down with... ShvembldrA short interview with generative artist Shvembldr.![](https://www.iillucid.com/content/images/size/w256h256/2021/04/iillucid-logo----icono---white-bg-60x60.png)i·illucidMarcelo Soria-Rodriguez![](https://www.iillucid.com/content/images/2021/07/shvembldr---iillucid-banner.jpg)](https://www.iillucid.com/slowing-down-with-shvembldr/?ref=gorillasun.de) Shvembldr's words resonate deeply with me. I've always thought that it's good to have a rebel mindset, and attempt to approach things from a different angle. A good example for a group of artists that did things differently, are the early pioneers of generative art, like Vera Molnar for instance - I'd like to think of her as one of the early rebels. She was all in on generative art, even though some of her contemporaries looked at her practice with dismay. That didn't stop her however from making the art that she wanted to make: > I put things on the wall to see them and when people came they would look to the side so as not to get some kind of terrible eye affliction from looking at them. And on the other hand, it made me stronger. - [In conversation with Hans Ulrich Obrist](https://vintage.hu/wp-content/uploads/2019/03/Molnar-Vera-HUO-interview.pdf?ref=gorillasun.de) At that point in time there was no generative art that could be used as a reference point; it was completely new ground. Her and other pioneers like Frieder Nake and Manfred Mohr invented a completely new type of *visual research* for themselves*.* This led to the influential early geometric compositions that still inspire generative artists many decades later. If you're familiar with Shvembldr, you've probably heard of his recent struggles - if you have the time read up on his story, and if you have social outlets maybe you can bring some attention to it and support his cause: [Art is crimeStart selling your art and pay all your taxes, and you will be declared a criminal.![](https://www.art-is-crime.com/apple-touch-icon.png)Art is crime![](https://art-is-crime.com/og_image.png)](https://www.art-is-crime.com/?ref=gorillasun.de) Shvembldr discovered generative art for himself in 2018 while working on a small Javascript game for work; random positioning of elements led to interesting compositions that were visually pleasing, and could even be used for audio visualization. [His first instagram post is one such experiment.](https://www.instagram.com/p/BtI4VtsnxZw/?ref=gorillasun.de) This is not so different from how I got into generative when I was looking into ways to create visualizations that I could use to supplement my music. After hicetnunc made it possible to mint interactive NFTs in 2021, Shvembldr discovered a new vehicle for the monetization of his creations. He took the leap and pursued this endeavor full-time. Later he had his first big break with his [Blocks of Art project](https://www.artblocks.io/collections/curated/projects/0xa7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270/74?ref=gorillasun.de) on the then young ArtBlocks platform, becoming one of the most successful generative artists in the NFT space. However, his entire existence was flipped upside down on the 10th of February 2022, when the Latvian police arrested and froze all of his assets. Having accrued almost $9M dollars through the sale of his NFTs on various platforms, transferring such a large amount of money to a bank in his home country raised the suspicions of the Latvian authorities. As of writing this article Shvembldr is still under investigation, even though he has carefully collected and publicly shared every possible kind of evidence that shows how he has acquired his funds. Yet, there is still no conclusion to the absurd situation he has been thrown into. You can see updates on Shvembldr's situation on the same site that I linked above. Shvembldr took a leap of faith with generative art, gave it his all, and in my book, deserves every penny of the money that he made. Who could have predicted this ridiculous outcome? I hope Shvembldr's struggles come to an end sooner rather than later. If you have an outlet or channel through which you can bring attention to this issue, please do so. To make art means to take risks. To accomplish anything meaningful really, you have to take risks. > Art is an adventure into an unknown world, which can be explored only by those willing to take risks - Mark Rothko Taking risks doesn't mean that you have to get shot with a .22 caliber like the performance artist Chris Burden did in 1972 - it means to step outside of your comfort zone, to work with a new medium that might feel clunky, to make something that your audience might not immediately *click* with. > I'm not sure I want my art to be understood. I want my art to be imaginative and inspiring. I want everyone to interpret it in their own way when they look at it. - [Shvembldr interview with Jeff Davis](https://beta.cent.co/artblocks/+59s9p0?ref=gorillasun.de) Taking risks means to do things differently. Just like Shvembldr did. [Risk is an Indispensable Ingredient for Creative GrowthWhy artists need to take chances![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumChristopher P Jones![](https://miro.medium.com/v2/resize:fit:1200/0*UsjBJ9Zw7IL1Tz3k)](https://christopherpjones.medium.com/why-artists-should-take-risks-475486d00eab?ref=gorillasun.de) Kate Vass the Art Curator, echoes the words of Shvembldr and has similar views on finding inspiration as an artist - in an interview with LeRandom she says: > I am always interested in new approaches, concepts and art forms. Those things are rarer nowadays, as the internet can kill any creativity. I always advise artists not to look around too much, as it’s known to erase original ideas by simply being influenced by things you look at or see elsewhere. Each new project, is an opportunity to reinvent yourself. Try to draw inspiration from unusual sources, there's inspiration everywhere, especially when it comes to generative art, don't limit yourself to only studying algorithmic artworks from other generative artists. Push boundaries. > I want to have my own way. I know it's presumptuous, but that's how I like to proceed - Shvembldr ## Qubibi - Finding inspiration in the Mundane One artist that draws inspiration from unusual sources, and at the same time makes a kind of generative art that sits in a league of it's own, is [Qubibi](https://twitter.com/qubibien?ref=gorillasun.de). > I want generative art to be an act of quietly watching over the clashing of rules and chaos. In recent years, Japanese generative artist **Kazumasa Teshigawara,** operating artistically under the alias of **Qubibi**, has risen to become somewhat of superstar in the generative art space. Long before generative art became as popular as it is today, Qubibi was already experimenting with code as an artistic medium: > I started creating my work which is a recent style, not because I had a passion for ”generative art” nor because I chose to do ”generative art”. I was just interested in a certain phenomenon, and as I began to create works of art, I came to realize that this is called "generative art". That's all. At that time, generative art was not as popular as it is today. [‘Have you ever seen a dancing worm?’ qubibi in conversation with Artnome | VerseThe new project is “wiwizn”. I like print samples in printmaking. When you go to an exhibition of print artists, they show various attempts at color for a singl![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse-journal.ghost.io/content/images/2022/07/artifact.png)](https://verse.works/journal/have-you-ever-seen-a-dancing-worm-qubibi-artnome?ref=gorillasun.de) Qubibi pursued the ideas and phenomenons that interested him, not generative art as an art direction per se. In a Marie Kondo-esque manner, maybe the only real way to find your own unique artistic voice, is to seek out the concepts and aesthetics that bring you joy and give you fulfillment, rather than pursuing more elusive things, i.e. an art movement as a whole. A generative artist is still just an artist, and generative art is still just an artform - maybe generative art isn't your own personal final frontier. One of those phenomenons that Qubibi particularly enjoyed were Turing-esque patterns that emerged after experimenting with an altered version of a reaction diffusion algorithm. The algorithm has become quite a popular method among generative artists of today becoming a widely adopted technique in genart. He likened them to "Zebra stripes/sea shell patterns" in his interview with verse, and subsequently tried to make these patterns his own. Qubibi released his first artwork in 2010, titled *Hello World -* a phrase that represents every programmer's first step into the world of code. And as far as I understand, *Hello World* was meant to be a sort of screensaver software that would run indefinitely, endlessly generating morphing organic patterns: Although Qubibi was quite active in the Japanese scene in following years, his first big break in the western world was 8 years later in the form of his first [solo exhibition at the Museum of Digital Art in Zürich](https://muda.co/qubibi/?ref=gorillasun.de) (which sadly closed in 2020 due to the pandemic) showcasing his works over the years. Qubibi then proceeded to take the Tezos NFT space by storm with his highly acclaimed Mimizu and Wiwizn series. The Mimizu series is brought to life with an evolved form of the same code that originally powered Qubibi's hello world program. In essence, it is a collection of still frames, each of which captures an individual ephemeral moment of his generator. One of the inspirations for this collection were Japanese curiosity stores that specialize in selling a variety of insects - the warm and earthy textures in Mimizu are in many ways evocative of this, as if each individual artwork represented a strange and rare bug. Mimizu literally translates to 'Earthworm' in English. ![image](https://qubibi.super.site/_next/image?url=https%3A%2F%2Fassets.super.so%2F46ee9e7f-58bd-4a9a-b08a-1dd3ee837ca7%2Fimages%2F3cde216c-cc48-4132-8d42-e38c59019d34%2Fmmz213r4.jpg&w=3840&q=80) Qubibi wrote about some other inspirations that lead to the textures: [Eight months of MIMIZUI would like to tell you the story of how MIMIZU was born as a way to regroup and begin anew![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)Mediumqubibi![](https://miro.medium.com/v2/resize:fit:1036/1*0CVAkdJK40eksPtH-O6yPw.png)](https://medium.com/@qubibi/mimizu-december-cfdbf04d6418?ref=gorillasun.de) Qubibi's Wiwizn series aims to be a symbolic inversion of it's spiritual predecessor Mimizu. Wiwizn draws inspiration from printmaking, where artists often show alternative versions of the artwork that are colored differently: > When looking at works printed in various colors, the boundaries become blurred and the range of viewpoints widens as the colors change, and the interpretation becomes more than one. It means people who see the work gain the artist's point of view. Wiwizn is in this manner a literal and symbolical inversion of Mimizu, even the titles are inversions of each other - if you noticed, they're the same word, just flipped upside down. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-20-at-03.10.11.png) The narrative that Qubibi spans across his body of work is wonderful in so many ways, visually and symbolically it nourishes me with inspiration. While I find myself drawn in by the warm, almost innocently childish textures of his artworks, there's also some mysterious ingredient that eludes me, that I cannot fully comprehend. It were as if I'm making contact with an alien creature that doesn't obey the laws of our universe. Qubibi is in a continuous conversation with his Art, giving himself and his practice the freedom to freely evolve. The lesson here might be to allow yourself to draw inspiration from any and every source around you, no matter how far removed it might be from the realm of art. There's beauty in everything. Even in something as simple as an Earthworm. Just do whatever feels right to you. Finally, in an interview with Kaloh, Qubibi's advice to emerging generative artists: > **We have no choice but to follow our aesthetic awareness without worrying about surroundings.** We have to create subjectively. [The Fascinating Story Behind Qubibi – Personal Interview \[2022\]Read my personal interview with Qubibi, also known as Kazumasa Teshigawara, an artist and designer, born in Tokyo.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-1024x1024.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3e330758-b727-4876-909d-47b871769c0a_1348x1346.png)](https://www.kaloh.xyz/p/the-fascinating-story-behind-qubibi?ref=gorillasun.de) And here's a couple more interviews with Qubibi that you might enjoy reading: [An Interview with QubibiThe legendary generative artist shares his vision of a brave new NFT world with Toshiaki Takase![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Melissa Wiederrecht![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/63d15d9260518f169d59bf7e_mmz213r3%20copy.png)](https://www.rightclicksave.com/article/an-interview-with-qubibi?ref=gorillasun.de) [GatherArt - Gather InfoWho are you? Kazumasa Teshigawara. I started qubibi to continue my work of creating. “MMZ 211 N” by Qubibi You have a very interesting backstory written on your website. What would you …![](https://i0.wp.com/gatherart.org/wp-content/uploads/2022/09/cryptopixels873.png?fit=192%2C192&ssl=1)GatherArt![](https://i0.wp.com/gatherart.org/wp-content/uploads/2022/11/mmz184.png?fit=615%2C872&ssl=1)](https://gatherart.org/2022/11/qubibi-interview/?ref=gorillasun.de) ## Aleksandra Jovanić - Ask Questions ...and answer them! Just like Qubibi, [Aleksandra](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de) has developed a very unique and recognizable style over the years. Today, she is one of the women that stands at the forefront of generative art. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/herb.png) [Herbarium #988](https://www.fxhash.xyz/gentk/FX0-780706?ref=gorillasun.de) Drawing inspiration from scientific diagrams and illustrations of the 18th and 19th century, her artworks add a modern touch bringing them to life with subtle animation. She says that she wants 'to wake up the artwork', and I think that's beautiful. In an interview with Unit London, for her new release titled Breathe she's asked about her process: > My approach is built on sequences of asking questions, how an idea can be improved or how something can be done, answering /visualising through code, and then asking a new set of questions. I keep doing this until I’m satisfied with the outcomes. In the process of deconstructing or simplifying a problem and coming up with solutions, the first step is to build from the most basic geometries. [Breathing Life into Generative Art with Aleksandra Jovanic | Unit LondonJoin us in delving deeper into Aleksandra Jovanic’s unique approach to mathematics, geometry and generative code.![](https://res.cloudinary.com/unit-london/images/w_192,h_192,c_fill,g_auto/f_webp,q_auto/v1663174187/cropped-favicon-512-2/cropped-favicon-512-2.png?_i=AA)Unit LondonPhoebe![](http://unitlondon.com/wp-content/uploads/2023/04/002.png)](https://unitlondon.com/2023-04-24/breathing-life-into-generative-art-with-aleksandra-jovanic/?ref=gorillasun.de) Asking your own questions can be one of the best ways to drive forward a project and develop ideas into more complex things. *What would it look like if I did this?* *What happens when I add this line of code? What happens when I change this number?* Again, this reminds of the early visual research that the genart pioneers did. Aleksandra's approach isn't an isolated incident however, I see other generative artists follow a similar approach: > Each time I work on a generative collection, I write down lists of questions to ask myself to help refine my process and act as a kind of 'quality control'. I have quite a few of them now and was thinking of maybe typing them up as an fxtext piece for fellow artists. Thoughts? 🤔 [pic.twitter.com/qbUYnQBwT9](https://t.co/qbUYnQBwT9?ref=gorillasun.de) > > — Bruce @ Studio Yorktown (@StudioYorktown) [October 8, 2022](https://twitter.com/StudioYorktown/status/1578644226841006081?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Asking questions can help you narrow down the scope of a project, remove the components that don't work, and incorporate new elements that add something, slowly building out the complexity of the project in a controlled manner. Just like Aleksandra asks herself questions to develop a piece, she also tries to ask her audience questions. In the [accompanying summary that she wrote after completing her Chromatlas series](http://aleksandrajovanic.com/chromatlas/?ref=gorillasun.de) she elaborates on another inspiration for her works: > The other important theme and the one I often return to, at the core of Chromatlas is– human psychology. It stems from my fascination and an insatiable curiosity for topics like **apophenia** – the tendency to perceive a connection or meaningful pattern between unrelated or random things or **illusions** What seems like a collection of grounded scientific diagrams, incorporate forms, symbols, proportions and numbers that are in actuality an act of deception. She lets the viewers draw their own hypothesis as to what the patterns that emerge could mean. Aleksandra has unarguably taken her generative practice down a unique direction, crafted a very unique generative aesthetic and at the same time built an impressive portfolio. I highly recommend checking out all of her creations if you're looking for inspiration. Maybe you can attempt to create your own generative pseudoscientific diagrams afterwards! ## Concluding Thoughts Looking back at the artists that I've mentioned, what all of them seem to have in common, is that they found and drew inspiration from places that spoke to them and sparked something inside of them. Inspiration comes in many forms, be it as an Earthworm or a mid-century scientific diagram. Moreover, pursuing the aesthetics and phenomenons that inspire you can be one way to find your unique generative voice. What's important is that you stay true to yourself and make the things that you enjoy making. Ultimately, making art is about having fun. --- **And that's it from me this week again, hope this was as fun to read as it was to write, and that you learned something new!** **If you enjoyed this article, consider sharing it with your followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Newsletter 18 URL: https://www.gorillasun.de/blog/gorilla-recap-18/ Last updated: 2023-12-19T23:11:11.000Z **Hey everyone 👋 and welcome to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Recap - a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI.** **Hope you have a good stay!** --- *First things first - I turned 27 just yesterday! Thank you all for the warm wishes over on TwitterX, you really made my day! I'm incredibly grateful for all the lovely people I've got to interact with through creative coding, generative and the internet!* ❤️ *I'm hoping to make many more internet friendships in the future.* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-19.56.38.png) This was my fourth trip to Tunisia. Luckily it wasn't as hot as last summer 🥵 Now I feel full of energy and excited for what's to come. Got lots of things in the works already! Second order of business - we're doing some minimal rebranding, the Gorilla Recap is now titled Gorilla Newsletter, as that more accurately encapsulates what it's slowly evolved into over the past weeks. Although there's still a short segment on my own endeavors every week, the main aim is to capture important happenings from the past week in the genart space, as well as an assortment of interesting reads. ## Genart Updates ### The Power of Processing On the occasion of Casey Reas' 923 Empty Rooms launching at Bright Moments in Berlin this past week; Alex Estorick from RCS had the chance to interview both Casey Reas and Lauren Lee McCarthy, the creators of Processing and p5js respectively: [The Power of ProcessingCasey Reas and Lauren Lee McCarthy explore the future of social software with Alex Estorick![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Melissa Wiederrecht![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64da7c8e46601cb3cbc5038a_02_DSC05205-2.jpg)](https://www.rightclicksave.com/article/the-power-of-processing-casey-reas-and-lauren-lee-mccarthy-interview-generative-art?ref=gorillasun.de) The interview goes into detail on the design implications of p5js and processing, that they're not just tools to make generative visual things, but rather vessels for building a community, and at that, a community that is as inclusive as possible. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-16-at-16.39.46.png) Both Processing and p5js were meant to be transformative and disruptive vessels, that sought to be boundary pushing in several ways; by making code, as a creative medium, more accessible to a larger group of people and secondly by redefining what it actually means to be a creative coder. The interview was definitely the highlight of the week for me! ### Dmitri Cherniak's Lightyears Another thing that caught my attention was the mini-documentary for Dmitri Cherniak's new project caught my attention: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-20.13.13.png)](https://twitter.com/dmitricherniak/status/1691627163508748455?ref=gorillasun.de) [Link to Video](https://twitter.com/dmitricherniak/status/1691627163508748455?ref=gorillasun.de) Earlier this year Dmitri Cherniak made waves, not just in the genart space, but in the entire art world when [Ringers #879, aka The Goose, was auctioned off at Sotheby's for a whopping $6.2M](https://www.sothebys.com/en/articles/dmitri-cherniak-ringers-879-goose-lays-6-2m-golden-egg-at-generative-art-auction?ref=gorillasun.de) \- and he's already back with a new mesmerizing project titled *Light Years*. [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-20.15.16.png)](https://twitter.com/dmitricherniak/status/1693662194360107099?ref=gorillasun.de) [Link](https://twitter.com/dmitricherniak/status/1693662194360107099?ref=gorillasun.de) What's special about Light Years, besides the mesmerizing outputs, is that it's inspired by the great László Moholy-Nagy and at the same time backed by his estate. The documentary shows us how Dmitri is allowed direct access to the private archives of Nagy and working closely with Daniel Hug that is currently in charge of the estate. The video is really fascinating - go watch it. We need more high quality video content like this for generative art! ## Interesting Reads This week I've come across some really nice articles that I thought were really worth sharing, covering generative art, making it as a writer on the internet and thinking out loud about improving the Twitter Algorithm 👇 ### On Sketching by Tyler Hobbs With Tyler Hobbs you get some of the best pieces of advice on tackling a career as a generative artist. I was delighted to see him publish a new article this week on the topic of sketching and how ideas develop over time: [On Sketching (and the Life-Cycle of Artistic Ideas) — Tyler HobbsI find that many gardening metaphors apply to artistic creation. For example, harvest season is not a year-round event. First you prepare the soil, then plant the seeds, and then care for the plants as they develop over time. Artistic ideas follow a similar path. They grow best in a rich soil, forme![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Tyler HobbsOn Sketching (and the Life-Cycle of Artistic Ideas)![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/5c1293aa898583f6dba04dba/64dd7712b8925851b5b25e1a/1692372587538/banner-1.jpg?format=1500w)](https://tylerxhobbs.com/essays/2023/on-sketching?ref=gorillasun.de) I've mentioned this a couple of times throughout various blog posts, but one of my favorite pieces of writing on generative art is Tyler Hobbs essay titled reflections on 5 years of Generative Art. He addresses a many of the hardships that come with it and how to approach it in a manner that allows to preserve some of your sanity. One invaluable piece of advice that he provides in the essay is that new works emerge by putting in the time, and that it's okay to make try out new things even if they ultimately end up as a crumpled paper in the trash bin. In this new article, he reiterates on the concept of sketching as a practice that doesn't necessarily always need to produce masterpieces. But rather, as a selection process where you weed-out the duds from the ideas that might have potential and later on down the line grow into larger projects. He also says that it's really important to set yourself up for success with an easy to boot up template that lets you save your code and output at the same time - even though I have my own template, it could use some (many) improvements. I also highly recommend checking out the Tweet where there's a lot of interesting comments, questions and discussions from the community: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-17.05.29.png)](https://twitter.com/tylerxhobbs/status/1692573719720260082?ref=gorillasun.de) [Link to Tweet](https://twitter.com/tylerxhobbs/status/1692573719720260082?ref=gorillasun.de) Here I'd also check out Tyler's other essays that are all wonderful pieces of writing. I'll also pitch my own essays on the topic, which can maybe give you some different perspectives: [Creative Coding: The New EraCreative coding is a new interdisciplinary art form that bridges the gap between technologists and artists. This article explores what it means to be a code artist, what it means to make art with code, and how we approach this new discipline today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/newerabanner2.png)](https://www.gorillasun.de/blog/creative-coding-the-new-era/) The longest piece I've written to date - it took a couple of months to organize my ideas for this one. [The Importance of Sketching with CodeSketches are more than just little artworks that you hack together in your bedroom. They’re ongoing conversations that you have with the yourself and the machine. It’s important to explore them, gain new perspectives and ultimately contribute to something larger than yourself.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/banner.jpg)](https://www.gorillasun.de/blog/the-importance-of-sketching-with-code/) If you feel like a quick and inspirational bite, this one's for you. ### How I make six figures on Substack by Emma Gannon I don't generally like sharing articles with these kinds of headlines - because this newsletter isn't really about making money, as much as it is about coding and making art. However, as someone that's been doing quite a bit of writing over the past two years, I found Emma Gannon's success story incredibly inspirational. It's not one of those 'get rich quick' kind of posts - she goes into the nitty gritty of her 14 year long career as a writer on the internet and provides a gigantic list of tips and advice: [How I make six figures on SubstackIt’s been a surprising/thriving 18 months on here, so here’s some stuff I know.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F69a3b18f-b1c3-4735-9978-560fe06e2fa3%2Fapple-touch-icon-1024x1024.png)The Hyphen by Emma GannonEmma Gannon![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8f124f-bdd2-4bb6-b283-2422f71570f9_2064x1453.jpeg)](https://thehyphen.substack.com/p/how-i-make-six-figures-on-substack) For the first point on her list she echoes the words of Bill Gates, back from an article he wrote in 96, stating that **Content is King**. Although the landscape has drastically changed since the early days of the internet, the phrase still rings true up until the present day - content with *substance* is what drives the internet forward, it's essentially an intellectual service that you provide to your audience. A content creator provides information, knowledge, ideas and entertainment in exchange for their audience's time and money; and it's never been easier to monetize engagement in this current day and age. Gate's original article can be read here: [“Content is King” — Essay by Bill Gates 1996Ever wondered where the phrase “Content is King” stemmed from?![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)MediumHeath Evans![](https://miro.medium.com/v2/resize:fit:650/1*_OALo10h5SSLzQl7-72Tgw.jpeg)](https://medium.com/@HeathEvans/content-is-king-essay-by-bill-gates-1996-df74552f80d9?ref=gorillasun.de) Looking at the social media space today, Gates' thinking was in many ways ahead of it's time. Without the intent to glorify the man - reading his words, it seems to me that he had a visionary understanding of the internet. Which explains the success of his endeavors. Emma Gannon shares many more pieces of invaluable information throughout her article, hence why I highly recommend reading it if you are someone that creates content on the internet. ### Making the Twitter Algorithm better I can't tell if Elon is delusional, or brilliant. I can't tell if him being copiously active - in a seemingly haphazard manner - on the platform that he's acquired, is daring and avant-garde, or simply plain out dumb. I believe that if you hold this much power, you should be a bit more careful with the words that you share with the rest of the world. But maybe, actually something good can spring from this brazen approach to running his business - if he actually follows through on the promises that he's making. Since my last post [The Current State of Social Media](https://www.gorillasun.de/blog/the-current-state-of-social-media/), I've spent many idle moments to think on what Human Friendly Algorithmic Dopamine mechanisms could look like, and even though I'm still very far from having a definitive idea on the subject, I believe that a big step towards that end would be transparency. I recently came across this tweet from a twitter user I've shared on the newsletter before, when we dove into the factors that have an impact on your tweet rankings. This time they return with suggestions on improving said algorithm: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-18.49.07.png)](https://twitter.com/NFT%5FGOD/status/1691617711569109011?ref=gorillasun.de) [Link to Tweet](https://twitter.com/NFT%5FGOD/status/1691617711569109011?ref=gorillasun.de) I can't vouch that all of the suggestions are actually good ones, but it's good to get the discussion started again. If you want to learn more and you're curious about how the Twitter algorithm functions - the version that was open sourced earlier this year at least - I've written about it in this article: [Everything we learned about the Twitter Algorithm so farElon Musk’s decision to open-source the algorithm that powers Twitter after acquiring in October of 2022, is a monumental event in social media history. In this post we’ll dive into everything that we’ve about the inner workings of the code so far.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/akshar-dave-mkTqZN1NzhY-unsplash-1-.jpg)](https://www.gorillasun.de/blog/everything-we-learned-about-the-twitter-algorithm-so-far/) ## AI Corner ### Scientific Discovery in the Age of Artificial Intelligence This one's a research paper, but it's a worthwhile read. It details some of the emergent methods how AI tools are being incorporated into scientific research methods - for instance for the purpose of data analysis or automated component design: > AI systems can enable efficient, intelligent and highly autonomous experimental design and data collection, where AI systems can operate under human supervision to assess, evaluate and act on results. The article juxtaposes the benefits of these methods with some of their deficiencies: [Scientific discovery in the age of artificial intelligenceNature - The advances in artificial intelligence over the past decade are examined, with a discussion on how artificial intelligence systems can aid the scientific process and the central issues…![](https://t2.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://www.nature.com/articles/s41586-023-06221-2.epdf?sharing_token=VNBCL-B5z7x9yroz7VHXjtRgN0jAjWel9jnR3ZoTv0NZ6DLC7sCSFQ-fnesQT80MG5tIwXOiTkbck2M8kGB2OXNe_nMse2r__TenJJwQRyiWRVae4mZzA-YquCQg9JAzwBK1UiBZQkjUqHME4HBPT-c4BOt-he7EpCkSUxM_2xo=&size=128)Nature![](https://media.springernature.com/full/springer-static/image/art%3A10.1038%2Fs41586-023-06221-2/MediaObjects/41586_2023_6221_Fig1_HTML.png)](https://www.nature.com/articles/s41586-023-06221-2.epdf?sharing%5Ftoken=VNBCL-B5z7x9yroz7VHXjtRgN0jAjWel9jnR3ZoTv0NZ6DLC7sCSFQ-fnesQT80MG5tIwXOiTkbck2M8kGB2OXNe%5FnMse2r%5F%5FTenJJwQRyiWRVae4mZzA-YquCQg9JAzwBK1UiBZQkjUqHME4HBPT-c4BOt-he7EpCkSUxM%5F2xo%3D&ref=gorillasun.de) This can have important implications for a variety of fields, making me wonder if in the future a fully autonomous type of AI research can be made feasible. As of now, these methods still require human supervision to be of any use. ### Google's Project IDX Google announced a new online code editor that runs fully in the cloud. It's aimed specifically for the development of apps. One big draw of the editor is integrated support from AI tools. I have used ChatGPT for debugging purposes and for quickly brainstorming ideas; however I have yet to try tools like google co-pilot: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-21-at-19.32.32.png) I signed up for the PaLM2 developer API many weeks ago, but it seems I'm still on the waitlist. I really want to try out code generation/completion plugins very soon. I think it could be a different creative coding avenue to explore, where it gets easier to break *writer's block* while exploring ideas. You can sign up for the IDX waitlist here: [Project IDXProject IDX is an entirely web-based workspace for full-stack application development, complete with the latest generative AI (powered by Codey and PaLM 2), and full-fidelity app previews, powered by cloud emulators.![](https://idx.dev/apple-touch-icon.png)Project IDX![](https://cdn.raster.app/google/idx/AfEGWyeSKl?ixlib=js-3.7.0&width=1200&height=630&compress=false&q=85&s=9da0a8f7e17838c341fe30f15b699317)](https://idx.dev/?ref=gorillasun.de#introduction) I don't know how long it takes to get an invite however 🤞 ## Tip of the Week Besides posting awesome works of generative art, Yazid also provides much needed perspective. Genart is already a difficult endeavor in and of itself, having to learn the mechanics of social media while constantly marketing yourself in some manner just makes things so much harder. One reply to his Tweet that stood out was by Rik Oostenbroek: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-16-at-14.47.05.png)](https://twitter.com/Yazid/status/1691621554957017134?ref=gorillasun.de) [Link to Tweet and it's replies](https://twitter.com/Yazid/status/1691621554957017134?ref=gorillasun.de) Do not let your emotional well-being be affected by meaningless algorithmic metrics. These things are at best random. I have definitely experienced self-doubt from not receiving the reaction that I was expecting on work that I poured my heart into. Ultimately your work speaks for itself. Sit down and have fun. That's all there is to it. --- ## Music for Coding You might know Jake Bowen as one Periphery's guitarists. When he's not shredding the guitar he also makes electronic music. His album Isometric was one of the first instrumental electronic pieces that I fell in love with, and it just resonates with me so much more all these years down the line: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Recap 17 URL: https://www.gorillasun.de/blog/gorilla-recap-17/ Last updated: 2023-12-19T23:11:17.000Z **Hey everyone 👋 and welcome to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride!** **This is the weekly Gorilla Recap - a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI.** **Hope you have a good stay!** --- ## Genart Updates ### Fxhash $5M Seed Raise The biggest news this week is from FxHash - closing a $5 million seed raise! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-14-at-02.49.56.png)](https://twitter.com/fx%5Fhash%5F/status/1688927210059763713?ref=gorillasun.de) [Link to Tweet](https://twitter.com/fx%5Fhash%5F/status/1688927210059763713?ref=gorillasun.de) FxHash has most certainly been an instrumental vessel in democratizing generative art, not only by providing generative artists with a platform to monetize their endeavors, as well as drawing the attention of the public eye, but also by building a respectful and friendly community where artists can grow together. FxHash has unarguably cemented it's place as a part of genart history - and I'm excited for the future of the platform. Big congrats! Here's also some words straight from Cosimo over on the FxHash discord: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-14-at-02.19.10.png) Kaloh also recently started a fantastic podcast keeping us all up to date on genart and web3 things - the most recent episode features Ciphrd himself, sharing his thoughts about the current state of the platform and it's future in light of this seed raise: [Raising $5M for fxhash 2.0 and future plans ft. CiphrdListen now | Kaloh’s Podcast | Ciphrd, aka Baptiste Crespy, is a generative artist and the founder of fxhash, an open generative art platform on the Tezos blockchain.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-1024x1024.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb892f8b6-66e4-4615-8ea1-452268b78626_1400x1400.png)](https://www.kaloh.xyz/p/raising-5m-for-fxhash-feat-ciphrd?ref=gorillasun.de#details) ### Kate Vass on Rethinking Art Collecting We get another stellar article from LeRandom, this time authored by LeRandom's lead that goes under the alias of [*thefunnyguys*](https://twitter.com/thefunnyguysNFT?ref=gorillasun.de), a conversation with Kate Vass. Kate Vass launched her Galerie in 2017; located in the heart of Zürich, it now features pieces from the current leading names in the genart and blockchain space. She states that showcasing contemporary work is important, as it is essentially a looking glass into the complexities of our everyday existence. She recounts the initial inspirations for launching her gallery, some of the challenges of exhibiting modern artforms, and also gives insight into the behind-the-scenes of some of the works that have been featured: [Kate Vass on Rethinking Art CollectingKate Vass, founder of Kate Vass Galerie in Zürich, visits with thefunnyguys in an effort to uncover her motivations and vision for this space.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art Institutionthefunnyguysthefunnyguys is in charge of the overall direction of Le Random and spearheads its acquisitions.![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64d36e5f6afb9df9597ad7c1_Inside%20Manolo.jpeg)](https://www.lerandom.art/editorial/kate-vass-on-rethinking-art-collecting?ref=gorillasun.de) Kate Vass also has some insightful words for aspiring artists: > I am always interested in new approaches, concepts and art forms. Those things are rarer nowadays, as the internet can kill any creativity. I always advise artists not to look around too much, as it’s known to erase original ideas by simply being influenced by things you look at or see elsewhere. To an extent I agree with this - I've experienced this myself, sometimes I don't pursue new ideas because I feel that they are too similar to something that I've already seen. But maybe these ideas should be pursued nonetheless, with your own personal touch they might just transform into something original. If not, you can always move on. And if the interview hasn't quenched your thirst for art history, you can continue reading this piece that recollects 10 of the most influential moments that have shaped Generative Art as we know it today: [10 Moments from Generative Art Timeline Chapter 2: The Modern Era 1850-1949 by le random. — Kate Vass Galerie10 Moments from Generative Art Timeline Chapter 2: The Modern Era 1850-1949 by Le Random https://timeline.lerandom.art/#/chapter-2![](https://images.squarespace-cdn.com/content/v1/63a2ce0664014f2264b055d4/b4810c88-d1fa-459d-8192-b19fb0735719/favicon.ico?format=100w)Kate Vass GalerieKate Vass![](http://static1.squarespace.com/static/63a2ce0664014f2264b055d4/63a30045ca07762bafe72033/64bbec1f03afcb331e17ab9d/1690042499993/Lerandom+spaces.png?format=1500w)](https://www.katevassgalerie.com/blog/lerandom?ref=gorillasun.de) The creators of LeRandom were also joined by Kate Vass in a live Twitter space to discuss these 10 moments - [you can find a recording of the space here](https://twitter.com/i/spaces/1OyJAVVzbAzxb?s=20&ref=gorillasun.de). ### Hyundai ArtLab My fellow generative artist, the prolific [Aleksandra Jovanić](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de), joins forces with [Ivana Dama](https://www.ivanadama.com/home?ref=gorillasun.de) to create an exclusive artwork for the Hyundai Artlab: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-09-at-13.49.00.png) The Hyundai Artlab's mission is to bring together artists and audiences from various fields that lie at the intersection of art and technology; and this by featuring artworks that explore this modern intersectional practice. Previous artists on their roster include Katja Novitskova, Sougwen Chung, and Zach Lieberman. This time around, instead of commissioning a single artist, they brought together two artists from different areas of expertise to collaborate on an artwork. The article explains the involvement of both parties, and how the two of them created Data Waves - an experiment that merges aspects of data science and generative art: [Generating Ecosystems: Code, Language, and SoundTwo artists merged their respective practices to interpret the decentralized, ever-evolving spirit of the Artlab ecosystem. Their process was quite literal.![](https://artlab.hyundai.com/favicon.svg)Hyundai ArtlabAleksandra Jovanić & Ivana Dama![](https://cdn.sanity.io/images/se13eur7/production/1d9b644bd6e7aae54d7476166076ff744e7ab8bd-1920x1080.gif?rect=0,36,1920,1008&w=1200&h=630)](https://artlab.hyundai.com/editorial/generating-ecosystems-code-language-and-sound?ref=gorillasun.de) It's a very interesting read - Aleksandra and Ivana also share some insights into their creative pratice that I found very inspiring. ## Interesting Reads Here's some interesting reads for the tech and algo nerds 👇 ### Getting Creative with Embeddings Amelia Wattenberger is back at it again with her creative writing tool, in which she explores text analysis in a novel manner. Rhythm is an aspect of writing that I don't see often utilized outside of poetry and prose, but it has a profound effect on the readability of your text. Even in technical writing - I find that a lot of it tends to be incredibly dry, by virtue of the subject matter. But it doesn't have to be, and it shouldn't. In her article she details the motivation for her tool, explains how it can help you become a better writer by exploring text, and details some of the technical aspects under the hood where she harnesses the power of AI in a really cool way AI: [Getting creative with embeddingsAmelia Wattenberger’s personal website![](https://wattenberger.com/favicon.png)Amelia Wattenberger![](https://wattenberger.com/thoughts/embeddings-math/sentence-lengths-app.png)](https://wattenberger.com/thoughts/yay-embeddings-math?ref=gorillasun.de) [You can try the app for yourself here.](https://sentence-length.netlify.app/?ref=gorillasun.de) ### The game of set In this video Catherine Hsu, assistant professor at Swarthmore College, shows us the game of Set - a deceivingly simple looking game that poses many mathematical questions. Set is a game about pattern matching: players try to identify sets of 3 cards, such that this set fulfills several different criteria. And this as a game of speed, where sets need to be identified by the players as quickly as possible. This already brings up many questions, for instance how many cards need to be revealed until we can guarantee the occurrence of a set? Catherine goes into detail on all the mathematical intricacies of the game in the Numberphile video: ### Insights into Stack Overflow’s traffic Apparently there's been some misinformation floating around about StackOverflow's traffic dropping by 50% compared to last year - here's a post directly from the source, stating that this is in fact not accurate: [Insights into Stack Overflow’s trafficWe’re setting the record straight.![](https://149351115.v2.pressablecdn.com/wp-content/uploads/2017/03/cropped-SO_Logo_glyph-use-this-one-smaller-270x270.jpg)Stack Overflow BlogDes Darilek![](https://149351115.v2.pressablecdn.com/wp-content/uploads/2023/08/blog-general-announcement.png)](https://stackoverflow.blog/2023/08/08/insights-into-stack-overflows-traffic/?ref=gorillasun.de) There has been a drop in traffic, but only by a 5% due to various factors. It does however make me wonder if people are using StackOverflow less with powerful LLMs and language models on the rise: > The surge in generative AI, like the rise of any other disruptive technology, should cause us to reflect, challenge, and question how we measure success. The future of the internet and the modern tech landscape isn’t going to be measured by web traffic alone—it’s about the quality of content, trust in the content, and the communities of experts and human beings curating the content. I've used ChatGPT and Bard occasionally for debugging purposes, or when I want a quick answer on a specific topic that would most likely take me some time to sift through links, but it really isn't a substitute to domain experts that can provide tailored feedback. ### The case of the extra 40 ms A Netflix engineer recounts the story behind an unusual bug that only occurred on a specific device - along the way we get a behind-the-scenes (pun intended) into the pipeline that powers Netflix in the background. John Blair walks us through how he tracked down and ultimately identified the root cause of the bug: [Life of a Netflix Partner Engineer — The case of extra 40 msBy: John Blair, Netflix Partner Engineering![](https://cdn-static-1.medium.com/_/fp/icons/Medium-Avatar-500x500.svg)Netflix TechBlogNetflix Technology Blog![](https://miro.medium.com/v2/resize:fit:811/1*TftatmXUCJnKtnyKisOCrQ.png)](https://medium.com/netflix-techblog/life-of-a-netflix-partner-engineer-the-case-of-extra-40-ms-b4c2dd278513?ref=gorillasun.de) ## Gorilla Articles - The current state of Social Media In recent years social media has become an instrumental tool for me to share my own creations with the rest of the world. I thought that I was slowly getting a hang of things: posting relatively regularly, playing into what the algorithm likes, and generally becoming more comfortable with the social platforms that I'd been active on. Slowly but surely my *world* view has changed though - social media has *changed*. It's been on my mind a lot, consequentially motivating this think-piece on the issue: [The Current State of Social MediaSocial media has changed significantly over the past two decades: from networks that aimed to connect people, to content-centric devices that mainly care about engagement and user retention. Many issues arise that are not immediately evident to the user.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://images.unsplash.com/photo-1592495989226-03f88104f8cc?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGdyYXBofGVufDB8fHx8MTY5MTQ5ODI0M3ww&ixlib=rb-4.0.3&q=80&w=2000)](https://www.gorillasun.de/blog/the-current-state-of-social-media/) Social media platforms have turned into dopamine machines that try to maximize engagement by whatever means work best for this purpose - engagement formulas I like to call them. The human connection aspect isn't in the foreground anymore. I tackle this issue in the article. There's a lot of nuance to this which makes it quite a difficult topic to write about, but I believe it turned out pretty good. Ciphrd left me an interesting comment, an observation that I hadn't fully thought about: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-14-at-04.27.29.png) Which makes me wonder if the future has space for human-friendly dopamine strategies that can make social media fun and engaging, while at the same time refraining from being exploitative and manipulative. But maybe these two criteria are not entirely compatible, and human-friendly algorithms are merely wishful thinking. I'll think about it more and get back to you in form of another article. I leave you with this interesting article I found after researching the issue some more: [Dopamine, Smartphones & You: A battle for your time - Science in the Newsby Trevor Haynes figures by Rebecca Clements “I feel tremendous guilt,” admitted Chamath Palihapitiya, former Vice President of User Growth at Facebook, to an audience of Stanford students. He was responding to a question about his involvement in exploiting consumer behavior. “The short-term, dopami…![](https://sitn.hms.harvard.edu/favicon.ico)Science in the Newsadmin![](https://i1.wp.com/sitn.hms.harvard.edu/wp-content/uploads/2018/04/CoverImage.png?fit=1096%2C871&ssl=1)](https://sitn.hms.harvard.edu/flash/2018/dopamine-smartphones-battle-time/?ref=gorillasun.de) Let's see how the social media landscape develops in the coming years. If you have any thoughts on the issue don't hesitate to leave a comment or shoot me a DM over on the former birdsite. ## Gorilla Sketches Only a little sketching this week - continued working on this sketch from previous weeks. The main change here is that there's two types of arc shapes now: a first type that act as *obstacles*, they can't be intersected by subsequent arcs that are place, and a second type of arcs that can overlap. This creates a nice interplay of shapes imo, but there's still work to be done on the positioning strategy, to be able to create a variety of different layouts: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/sys2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/sys.jpg) I also continued working on my particle system with Verlet integration. In the previous article we went deep into how Verlet integration works, but we didn't actually do much with it. For instance, we didn't really talk about how we compute boundary collisions, resolve particle-particle collisions, or handle mouse interaction. These turned out to be quite tricky to get *right,* hence I'm gonna need a little bit more time before the article on those ideas is ready. But here's a little sneak peek: 0:00 /0:22 1× I also had a new idea for generating pattern sequences that I still need to explore a bit, but I believe that there's something there that has potential: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/patternus-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/genpatt.png) Doesn't look like much just yet, but I've got some vague ideas floating in my brain already. I'm hoping to do more sketching this week! ### Tip of the Week - Branchless Programming Not a new video per se, but the Youtube recommendation algorithm did it's thing and now it's found a spot in this newsletter - I've never thought about it, but sometimes there's ways to structure and rewrite your code such that you avoid unecessary if/else statements, that can introduce a computational overhead. Especially when run inside of a for loop: Overall, when it comes to interpreted languages there isn't much to be gained from eliminating certain branches in your code. But for low-level languages you can actually squeeze out some more performance in certain scenarios - here's an additional cool article on the topic: [Branchless programming. Does it really matter?Branchless programming is a programming technique that eliminates the branches (if, switch, and other…![](https://res.cloudinary.com/practicaldev/image/fetch/s--t7tVouP9--/c_limit,f_png,fl_progressive,q_80,w_192/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/devlogo-pwa-512.png)DEV CommunityJobin Johnson![](https://res.cloudinary.com/practicaldev/image/fetch/s--wwh92Uwj--/c_imagga_scale,f_auto,fl_progressive,h_500,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqndr2euz8dram83d7p7.jpg)](https://dev.to/jobinrjohnson/branchless-programming-does-it-really-matter-20j4?ref=gorillasun.de) ## Music for Coding And to wrap up this week's newsletter, some music to listen to while coding. This time I wanted to feature one of my favorite indie Japanese artists that goes under the alias of [*In the blue shirt* \- Ryo Arimura-san](https://twitter.com/Arimuri?ref=gorillasun.de) creates wonderfully upbeat, sample based tracks that instantly put me in a good mood. It's a wonderful unique, bubbly and happy vibe that I haven't felt with anything else really: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/groups-2-1.png) ## Sign up for Gorilla News Newsletter every Monday, tutorials every Thursday and the occasional Sunday essay! Directly in your inbox! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ### The Current State of Social Media URL: https://www.gorillasun.de/blog/the-current-state-of-social-media/ Last updated: 2023-08-08T15:11:32.000Z **Social media is changing in a fundamental way.** This sentiment of mine isn't solely sparked by the metamorphosis that ~~Twitter~~ X is currently undergoing - but it's something that I've become more and more aware of in recent years. It's an uneasy feeling really, when a big part of your current livelihood depends on platforms that are seemingly more and more fragile every passing day. Social media platforms have lost a quintessential characteristic that defined them in the past - social media isn't social anymore. Previously labeled as social *networks*, the goal of *connecting people* has largely been abandoned, especially by the platforms that have established rather large user bases over the past two decades. Today platforms that are entirely dedicated to this purpose are an exception. Discord for instance. Networking, virtually socializing as well as making new connections; all of those initial promises have long been forgotten. There has been a massive paradigm shift. Social media platforms cease to be communication-centric devices, that provide individuals with the tools to connect and communicate, but rather, vessels for constant and uninterrupted content distribution. You still have to connect with other users on these platforms for you to consume content, but *becoming connected* has largely become a secondary aspect, and not the primary purpose. Ian Bogost's thought provoking article [*The Age of Social Media Is Ending*](https://www.theatlantic.com/technology/archive/2022/11/twitter-facebook-social-media-decline/672074/?ref=gorillasun.de)on the Atlantic, illustrates it as follows: > \[...\] connection as a primary purpose has declined. Think of the change like this: In the social-networking era, the connections were essential, driving both content creation and consumption. But the social-media era seeks the thinnest, most soluble connections possible, just enough to allow the content to flow. It's hard to pin-point, exactly *what* platforms have transformed into over the years, and equivalently, what they're trying to become in the future - because they do so many different things. It's unclear what the primary purpose of many of them has become at this point. Look at Twitter for example, under it's new *management* it's unambiguously trying to become an everything app. A super app that lets you do... well, everything. Post your opinions, trade stocks, and at the same time order yourself some food, why not? To be fair, Twitter is probably not the best example these days. However, one reason that allows platforms to get away with such drastic transformations is by virtue of having amassed such ridiculously large user bases, that are in many ways dependent on those platforms. When your livelihood depends on such a platform, you're most likely not going to pull the plug just because of some annoying new feature. You'll adapt somehow and weather the tides. One example thereof is Instagram, ceasing to be an image-centric platform, when the short-form video format became increasingly popular, after some initial backlash people simply gave in. I believe that the growing ambiguity around the nature of social media platforms can largely be attributed to the mechanisms that constitute their inner workings. Being primarily focused on the generation and maximization of revenue, by whatever means necessary, some truly predatory and manipulative algorithmic strategies have taken shape over the past two decades, and all of that under the guise of being a service for the user. It's unclear how things will develop in coming years, what new *trends* will emerge and how the major players in the field will adapt these new strategies. But to me it's clear - these issues need to be addressed more, need to be talked about more, and a conscious effort needs to be done against them. This is a loaded topic, but let's try to address one thing at a time. ## The Identity Crisis of Social Media Platforms TikTok cracked the code when it comes to engagement - the simple concept of an endlessly scrolling video feed taps into something primal in our psyche, by design, it intermittently, but continuously, triggers the reward system in our brain, rewarding every upward swipe with another video. Just like you would train a pet with treats and positive reinforcement when they did a trick. The concept is simple, but it works. Other platforms quickly scrambled to replicate this micro-entertainment scheme, as if it were the Krabby Patty formula for user engagement and retention. After TikTok rose to an insane level of popularity, we observed most other major platforms implementing some sort of endlessly scrolling video feed. *If you can't beat'em, join'em.* I challenge you to show me a platform that serves video content, and doesn't implement an endlessly scrolling feed. Youtube added shorts. Former Twitter loads an endlessly scrolling feed of videos whenever you watch a video on mobile, so does Facebook, and even Reddit. Probably many more that I'm missing here. I remember a time when it was actually quite difficult to post video content on Instagram. This has drastically changed though, when the platform changed it's entire identity to revolve around short-form video with it's reels feature. There was a big backlash at the time: [‘Stop trying to be TikTok’: Why users hate the new InstagramInstagram is refocusing its content towards videos trying to chase TikTok’s success - but users think it’s a betrayal of what the app used to be.![](https://www.euronews.com/favicon.png)EuronewsGiulia Carbonaro![](https://static.euronews.com/articles/stories/06/88/39/12/1000x563_cmsv2_3c392f04-15f0-5b89-8923-77aeafd45302-6883912.jpg)](https://www.euronews.com/next/2022/07/26/stop-trying-to-be-tiktok-how-instagrams-copycat-strategy-has-backfired-with-loyal-users?ref=gorillasun.de) But it's important to see the issue from Instagram's perspective and play the devil's advocate for once - would the platform have been able to survive if it didn't implement this trendy new engagement formula? *Betray* is a strong word - sure, you make a portion of the user base unhappy by changing how your platform works; but at the same time you're staying on top of the competition, preventing users from leaving to another platform that has this particular feature and at the same time attract new users that want that feature. Instagram continued to grow by half a billion users since 2020 after implementing reels. [Head of Instagram says Instagram is no longer a photo sharing appIt’s leaning into algorithms, video, and entertainment.![](https://www.theverge.com/icons/android_chrome_512x512.png)The VergeMitchell Clark![](https://cdn.vox-cdn.com/thumbor/KWWCs2n9-4JXnyLiYjL06VxFAKA=/0x0:3206x2032/1200x628/filters:focal(1603x1016:1604x1017)/cdn.vox-cdn.com/uploads/chorus_asset/file/21698434/Reels_IOSX_3.png)](https://www.theverge.com/2021/6/30/22557942/instagram-no-longer-photo-app-video-entertainment-focus?ref=gorillasun.de) Similarly, in 2022 Facebook's main feed has been revamped to look and feel more like TikTok, with the aim to appeal more to younger audiences. As mentioned, this isn't an isolated incident, and I believe that we'll see this happening more often in the future, where platforms undergo complete overhauls to adapt and implement the newest, most engaging formulas. Rather than having an Eco-system of apps that have a distinct, definite and clear-cut purpose, it'll feel much more like a soup of different things. And it already feels like that to me. In other news, we still have Meta trying to be somehow innovative with it's gimmicky Metaverse. But that hasn't been working out so well. At this point in time, it's not certain if the concept will actually ever come to fruition, since there doesn't seem to be much interest in the concept: [The metaverse: Not dead yetTwo years ago, the metaverse was hyped as the Next Big Thing in tech. Nowadays, Generative AI has grabbed all the headlines. But don’t count out the concept of interconnected virtual worlds just yet.![](https://idge.staticworld.net/ctw/computerworld-logo300x300.png)ComputerworldMatthew Finnegan![](https://images.idgesg.net/images/article/2023/01/metaverse-100936528-large.jpg?auto=webp&quality=85,70)](https://www.computerworld.com/article/3697812/metaverse-not-dead-yet.html?ref=gorillasun.de) This raises question: why is engagement so important to these platforms? Why do they go to such lengths to adapt the formulas that retain users the best, even going as far as to completely change their identity? ## The Masses as the Product To understand why connecting users is no longer a priority to so many of the major platforms, one has to understand how these massive open broadcast channels are monetized and generate revenue. Rather than the user simply being a user, ***the user is now also the product***. Engagement is what fuels these platforms, it's the lifeblood that keeps them alive. While these platforms give you the chance of reaching millions of people at any given instant, at the same time, your existence on the platform is being sold to advertisers and offered to other users. The main way that social media platforms generate revenue is directly via advertisers paying to have their content displayed to users of the platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-05-at-13.58.54-1.png) Revenue of major social media platforms in 2021 The more time you spend on the platform, the more ads you will see, the more likely it'll be that you click on an ad and maybe even make a purchase thereafter. That's why it's so important to keep you scrolling, and keep you consuming content for as long as possible. This is not the only way that you generate revenue for these companies though. Not just by looking at the ads, but also simply by existing on these platforms: the way that you interact with the platform, the accounts that you follow, the content that you like and bookmark, the posts that you engage with - all of that information is tracked and provides insights into what kind of person you are, as well as the things that you might be interested in, which in turn can provide important indications on what products or services you are most likely to purchase. All of this information can then be sold as targeted advertisement to third party companies that are looking to advertise their products: [How Facebook (Meta), X Corp (Twitter), Social Media Make Money From YouIf you’re not paying for the product, the product is you. That’s a truism that’s especially suited for social media and its foundation for generating revenue.![](https://www.investopedia.com/static/1.378.0/icons/favicons/mstile-310x310.png)InvestopediaFull Bio![](https://www.investopedia.com/thmb/4VbJ_aMOCQ48kLMVl9jFQ6ugmPs=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/GettyImages-1256442767-c11cffce58b34647a539eae6da7b1300.jpg)](https://www.investopedia.com/stock-analysis/032114/how-facebook-twitter-social-media-make-money-you-twtr-lnkd-fb-goog.aspx?ref=gorillasun.de) A different form of monetization that has become popular in recent years, are premium subscriptions to the platform, that unlock certain perks and additional benefits for the paying users. For instance, one perk that Twitter blue subscribers obtain is an algorithmic boost to their tweets, which prioritizes tweets made by premium users in search and rankings - disregarding for a moment that this is a morally and ethically questionable monetization practice, it plays out to the same principle of monetizing the user-base, for the user-base. In the future, premium Twitter users also get the chance to earn money from ad impressions that may appear underneath their tweets. That's yet another way to attract more people: the platform as a means to earn money. This one could actually be a good change - if it weren't for the fact that you had to pay to play. You need to be a premium subscribed to obtain your payout, otherwise it's held hostage. And a slight variation on the previous monetization strategy: giving users the ability to sell subscriptions to other users, in exchange for access to premium content. This isn't an entirely new concept. Initially Twitter stated that they would not take a cut from these subscription fees, but that will probably change later on. This is also happening on Instagram, and a couple of other platforms. Teach a man to fish, and he will feed you a lifetime... Wait, that's not how the saying goes, or does it? Where does that leave the user though? When the platform revolves more around generating revenue, in whatever way it can, rather than being true to it's original purpose, then it takes away a lot from the user experience. All of these features are not in service of the user, maybe they are advertised as such, but they merely exist because they have the potential to generate revenue for the platform. And ultimately this has a detrimental effect on the platform as a whole. That's why I believe that these things need to be well thought-through before they're added in as features. [Social media prioritizes profit over peopleLike any other student, a part of my daily routine is checking my phone constantly, whether it’s to text someone or see an update on one of my favorite sports teams. However, I find that of everything that I use on my phone, social media takes up the majority of the time. From TikTok to \[…\]![](https://i0.wp.com/www.michigandaily.com/wp-content/uploads/2021/03/cropped-michigan-daily-icon.png?fit=192%2C192&ssl=1)The Michigan DailyTom Muha![](https://www.michigandaily.com/wp-content/uploads/2022/10/RGBSocialMedia2.png)](https://www.michigandaily.com/opinion/social-media-prioritizes-profit-over-people/?ref=gorillasun.de) In some ways I find this similar to developments that are unfolding in the video-game space, where predatory monetization tactics have in many ways completely altered the identity of certain franchises that were previously beloved for their game play and their story in equal parts. One major example is the Diablo franchise, the first and second installments being some of the most popular games in the early 2000s... and well, it's not been going too well with the most recent one. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-05-at-14.28.20.png) When a large part of the product becomes centered around the monetization aspect of things, this has a drastic effect on the rest of the product: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-05-at-14.31.28-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-05-at-14.25.49-1.png) **Where am I trying to go with this?** In video games, a product that primarily revolves around immersion, story-telling, game-play, and consequentially *the user having fun*; the adverse effects of monetization strategies can quickly become apparent as they are detrimental to the overall experience. When it comes to social media platforms, these things aren't as clear, the lines become more blurry, as to what is acceptable and tolerable. However there still is a perceived effect: the identity of the platform changes. The nature of the content that is shared on the platform changes and as well as the way that users interact with the platform. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-07-at-18.53.44.png) I swear, I wrote this Diablo analogy before I saw the tweet 😂 ## Content Creation: A Game of Psychological Warfare *The direct consequence of engagement formulas, as well as the monetization of engagement is a change in the type of content that is incentivized.* Who would've thought, but I'm actually going to use Youtube as a positive example in this case. One of Youtube's algorithmic metrics to gauge the quality of a video is watch-time: > Watch time is the total amount of minutes viewers have spent watching your videos. It's a key metric because **YouTube elevates videos and channels with higher watch times in their search results and recommendations section** \- [Hubspot Blog](https://blog.hubspot.com/marketing/youtube-analytics?ref=gorillasun.de) The outcome of this, is that interesting videos can exist on the platform. There's still a lot of trash in the mix, but at the very least thought provoking content has a fighting chance among the 500 hours of video content that is uploaded every minute to the platform, and can survive in the long run. As a side-note, I actually think that the Youtube recommendation algorithm is really good. A metric that indirectly encourages interesting content makes it possible for creators in all sorts of different niches to exist. For instance, two of my favorite channels are [3blue1brown](https://www.youtube.com/@3blue1brown?ref=gorillasun.de) and [Numberphile](https://www.youtube.com/@numberphile?ref=gorillasun.de). I also occasionally enjoy a 40 minute long lore video on some obscure video game. It's true that Youtube ultimately still has many other problems, but at least there's one metric that has the potential to promote meaningful content and the organic growth thereof*.* When the only metric that matters is engagement, creators are incentivized to lean into cheaper tactics, and play into content strategies that maximize that metric. In most cases this manifests itself in the form of the exploitation of one or more cognitive bias of the human brain. Some individuals more susceptible to it than others, it is all with the aim to inflate the numbers that signal the algorithms whether a piece of content is engaging or not. The reality of today is that algorithmic metrics dictate the value of content. The metrics are more important that the essence of the content. [The Evolution of Social Media MetricsA brief history of social measurement As social media strategies and methodologies have evolved, we’ve seen a similar evolution in how brands and agencies develop their social measurement frameworks. In the first few years, a lot of the focus was around ‘Fans’ and ‘Fan growth’ reflecting the ’gold r![](https://static.licdn.com/aero-v1/sc/h/al2o9zrvru7aqj8e1x2rzsrca)James Lubbock![](https://media.licdn.com/dms/image/C5112AQF6DqrDvtwAJQ/article-cover_image-shrink_720_1280/0/1520247552931?e=2147483647&v=beta&t=DBHDsA7gqMW1ow-VboUSkaHnRJuS2mrk3kn7Tc5Qqxw)](https://www.linkedin.com/pulse/evolution-social-media-metrics-james-lubbock?ref=gorillasun.de) A piece of content doesn't survive by virtue of what it is, but rather, by means of playing into the metrics that will artificially amplify it and keep it alive. This is why emotional content does so well for example, especially when it's controversial or even toxic, it will incite people to engage somehow, be it to fight the subject matter or ridicule it. The algorithm doesn't know, nor does it care, if this interaction healthy or not - it only cares that some form of interaction is taking place. Naturally that's just the tip of the iceberg. The root of the problem is that over the course of the past two decades, companies have crafted these hyper efficient and addictive engagement machines that directly play into the human psyche, without actually understanding the repercussions that these methods might have in the future. [The surgeon general’s wake-up call for social networksWe have enough data to make good recommendations for platforms, lawmakers, parents and children.![](https://www.theverge.com/icons/android_chrome_512x512.png)The Verge![](https://cdn.vox-cdn.com/thumbor/h8ZeMSORy2t487QU4NCw9_88D7o=/0x0:2040x1360/1200x628/filters:focal(1020x680:1021x681)/cdn.vox-cdn.com/uploads/chorus_asset/file/23951344/STK040_VRG_Illo_N_Barclay_4_facebook.jpg)](https://www.theverge.com/2023/5/24/23735741/surgeon-general-social-network-mental-health-report?ref=gorillasun.de) ## Concluding Thoughts There's been the tiniest amount of progress in the form of congress hearings and law makers starting to become aware of the impact of social media. But at the same time it's sad how far behind we are in the regulation of these things. While lawmakers are grappling with whether or not an app 'accesses devices on the home WIFI' the real danger lies many layers of of abstraction deep. Here's some ideas to make things better in the future: - **Algorithmic Regulations:** in many ways it's the wild-west out there when it comes to the algorithms that power the mainstream social media platforms of today. There's laws and regulations for literally everything else in the world, but when it comes to these matters, that are arguably shaping the future generations of humanity, there's a big and gaping void. We need people in charge that have an understanding of the current issues, the implications and effects of predatory metrics, and that can put in place meaningful directives on how these algorithms are allowed to operate. - **Downscale and Transparency**: maybe super apps are the future, but at this point why do we need an app that does everything, when there's a beautiful and varied eco-system where everyone can choose the service that they like? Social media platforms need to be more transparent on what they're trying to achieve and held accountable. Similarly social media platforms are becoming too large for their own good, for instance, more than half of the world's population is on Facebook. I believe that downscaling could solve a lot of the problems, I'm not certain if that will eventually happen however. There's another great article on this by Ian Bogost on this topic: [People Aren’t Meant to Talk This MuchBreaking up social-media companies is one way to fix them. Shutting their users up is a better one.![](https://cdn.theatlantic.com/_next/static/images/apple-touch-icon-152x152-aafde20dd981a38fcd549b29b2b3b785.png)The AtlanticIan Bogost![](https://cdn.theatlantic.com/thumbor/9D1Q3H2Hp_SnT1O-e5S0CNHj6NU=/3x37:2499x1337/1200x625/media/img/mt/2021/10/GettyImages_508416243/original.jpg)](https://www.theatlantic.com/technology/archive/2021/10/fix-facebook-making-it-more-like-google/620456/?ref=gorillasun.de) - **Awareness and Transparency:** Stop being the product. Switch to a service that doesn't try to manipulate you, or at the very least be aware of how you are being exploited. And stop falling for the tricks. If you have friends and family members, younger siblings and kids that maybe aren't as tech savvy as you, make an effort to have a conversation with them. Things that might be evident to you, might've never crossed their mind. --- Social Media has become an indispensible part of my existence on the internet, most of the people that find themselves on this very blog, do so by following a link that I might've shared over on Twitter. Maybe even you, find yourself here through a link that I've posted over on the birdsite. The words that I write only become alive in the mind of the reader. Otherwise it’s just a bunch of dead bytes floating around on some distant server. The letters that I'm typing into the editor right now only hold meaning when they're read - this blog only lives through it's readership. My mission is to inspire, document my journey, share my learnings and findings, and have my ideas proliferate in some manner on the internet. And social media platforms have been instrumental in achieving these goals - for that I am immensely grateful. What do you think about these issues? Is social media changing for the worse or the better? What will social media look like in 5 years? In 10 years? --- **As always, I hope you've enjoyed this post, I definitely had a lot of fun writing it!** **If you did, consider sharing it on your socials, or signing up to the newsletter to get updates whenever new content is posted on the blog. It helps a lot! Otherwise, cheers \~ Gorilla Sun 🌸** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/groups-2-1.png) ## Sign up for Gorilla News ### Newsletter every Monday, tutorials every Thursday and the occasional Sunday essay! Directly in your inbox! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ### Gorilla Recap 16 URL: https://www.gorillasun.de/blog/gorilla-recap-16/ Last updated: 2023-12-19T23:11:23.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly Gorilla Recap, a newsletter in which I go over everything that I found noteworthy from the past week in tech, generative art, creative coding and AI. Hope you have a good stay!** --- ## Genart Updates ### Teztalks with Re—tain [Re—tain](https://re-tain.xyz/?ref=gorillasun.de) is gearing up to be the next big thing on Tezos - and will arguably become a valuable part of the generative art ecosystem on Tezos. Co-founder [Piero](https://twitter.com/pifragile?ref=gorillasun.de), that you might already know as the creator of [EditArt](https://www.editart.xyz/?ref=gorillasun.de), talks us through all of the important points in this TezTalk: What I found really exciting is that Re—tain doesn't aim to be a platform with a million features, but rather, a genart-centric platform that streamlines the minting experience for artists, while at the same time addressing some of the pain points that generative artists run into when publishing new projects. What I'm most intrigued by at this point, is what the minting experience will be like. Apparently it will be different than what we've seen from FxParams and EditArt: the collector will still be involved in shaping the final mint, but as far as I understand it, not directly via inputting values or adjusting sliders. Overall, I'm very excited to see what they've got in store for us. If you want to learn more about Piero, as well as EditArt, here's a little interview I did with him a while ago: [All Eyes on EditART - Interview with PieroIn this post we have a look at EditART, a hip new platform on the Tezos blockchain that revolves around customisable generate NFTs. We also ask it’s creator, Piero, a couple of questions to wrap it up.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-38.jpg)](https://www.gorillasun.de/blog/editart-marketplace-interview-piero/) ### Alba Stranger Skies Group Show Alba is back with yet another stellar group show: Stranger Skies! Kicking off the same day that this newsletter lands in your inbox: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-07-at-10.08.38.png) Excited to see some of my fellow generative artists participating: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-04-at-18.27.34.png) Alba is slowly but surely accumulating an impressive roster of projects and artists - you might want to launch your own project once the curated shows come to an end and the platform goes live for the public. ### Per Kristian Stoveland Had to share this one, considering that the trailer is so beautiful - [Per Kristian Stoveland, aka Perkwerk](https://twitter.com/perkwerk%5F?ref=gorillasun.de), generative artist and that you might know as the creator of *The Harvest* is teaming with [Rik Oostenbroek](https://twitter.com/RikOostenbroek?ref=gorillasun.de), and [Erick Calderon](https://twitter.com/ArtOnBlockchain?ref=gorillasun.de), the creator of [Artblocks](https://twitter.com/brtmoments/status/1687208855275720707?ref=gorillasun.de), for a new generative art series in collaboration with Red Bull Racing: 0:00 /0:30 1× [The Velocity Series](https://twitter.com/perkwerk%5F?ref=gorillasun.de) ### 923 Empty Rooms And since we already mentioned [Artblocks](https://twitter.com/brtmoments/status/1687208855275720707?ref=gorillasun.de), here's [Casey Reas](https://twitter.com/brtmoments/status/1687208855275720707?ref=gorillasun.de) newest project, a collaboration between [Bright Moments](https://twitter.com/brtmoments/status/1687208855275720707?ref=gorillasun.de) and [Artblocks](https://twitter.com/brtmoments/status/1687208855275720707?ref=gorillasun.de). As the title of the project suggests, there will 923 mints representing the different combinations that the colorforms below can be combined into: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-07-at-10.24.04.png) I'm curious to see what the final mints will end up looking like when they get released! 0:00 /0:43 1× --- ## Interesting Reads ### The resonance of Generative Art - Interview with Zach Lieberman Another excellent article from [Peter Bauman](https://twitter.com/MonkAntony%5Ftez?ref=gorillasun.de) on [LeRandom](https://www.lerandom.art/?ref=gorillasun.de), this time in conversation with Zach Lieberman, asking him about some of his personal first inpirations in the generative art space, before pivoting into a discussion about the evaluation of generative art. Peter analyses this topic in an earlier article, [Demystifying Generative Art](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) in which he groups generative artists and collectors into a couple of different camps: Systemists, Resultists, Conceptualists, etc. each one of them placing an emphasis on a different part of the generative artwork when it comes to it's evaluation. Zach finds that the output is the only thing that matters, the only thing that should matter to the viewer at least: [Zach Lieberman on the Resonance of Generative ArtResonance can refer to qualities of sound and acoustics as well as the power to evoke deep emotions. Peter Bauman (Monk Antony) speaks with Zach Lieberman, artist, MIT professor and co-founder of openFrameworks, about generative art’s relationship to music as well as its ability to make us feel some…![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art Institutiontwo articles![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64ca454a9bd32727847bccd3_Zach%20Lieberman_color%20block%20study.png)](https://www.lerandom.art/editorial/zach-lieberman?ref=gorillasun.de) ### A history of collecting digital objects at the V&A A brief recollection of the digital collectible and how it's meaning has changed over the years. Generative art has played an incredibly important role in this timeline, as it is a fundamentally different kind of art, in contrast to what was previously known. Is it sufficient to hang a plotter drawing on a wall? Is it a sufficient representation that captures all aspects of the artwork? Similarly, when it comes to new technology, or timely applications, how should these be captured and presented in the future when they have served their purpose and/or have become obsolete. This article addresses these ideas: [A history of collecting digital objects at the V&A · V&AA timeline of collecting, from the earliest acquisitions of computer art in 1969 to the complex digital works in the collection today![](https://www.vam.ac.uk/assets/favicon/android-chrome-192x192-398cc4833cb1a1be4bc7bdf8a4b1c64c8e1f4c35b26c67e27f25ff61b8c33f22.png)Victoria and Albert Museum![](https://assets-cdn.vam.ac.uk/2023/08/03/07/28/19/3334824e-3159-4c5e-9be5-93f17d80fd6a/640.jpg)](https://www.vam.ac.uk/articles/a-history-of-collecting-digital-objects-at-the-va?ref=gorillasun.de) ### On Curation by Yusuke Shono Yusuke Shono shines some light on the other pieces exhibited at the Proof of X exhibition: *Blockchain as a Medium for Art* \- showcasing 10 different approaches to that central topic. New kinds of conversations emerge when artists interact with blockchain technology, giving rise to interesting explorations and conversations that tackle the capabilities, and limitations, of the tech: [On Curation | Yusuke ShonoIn the first of a series of curatorial essays for RCS, the architect of Proof of X shares his vision for blockchain as a medium![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Yusuke ShonoDerek Beaulieu and Alex Estorick![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64cbbae1c68248980e74b495_4_PIV_Default%20Punks.jpg)](https://www.rightclicksave.com/article/on-curation-yusuke-shono-proof-of-x-digital-art?ref=gorillasun.de) ### Demystifying TypeScript Discriminated Unions This post dives into Typescript discriminated unions - I've personally never heard about this feature, nor did I know what they are and had to look it up: > At a high level, a discriminated union is a type that can represent multiple possible data structures, and each variant is associated with a unique tag or discriminator. The tag helps the compiler determine which specific variant is currently being used, ensuring type safety and avoiding runtime errors related to incorrect type assumptions. It's an interesting feature that showcases the capabilities of Typescript: [Demystifying TypeScript Discriminated Unions | CSS-TricksTypeScript discriminated unions are types where a key or value can be used to differentiate between the keys and values of several types at once.![](https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/07/star.png?fit=180%2C180&ssl=1)CSS-TricksAdam Rackis![](https://css-tricks.com/wp-json/social-image-generator/v1/image/362091)](https://css-tricks.com/typescript-discriminated-unions/?ref=gorillasun.de) I think it's about time that I learn Typescript. ### Kim Asendorf Artist Spotlight by Abnormality Abnormality wrote an excellent article on Kim Asendorf and his experiments in digital expressionism - how he started out with glitch art and then later on found his own digital voice in the generative art space minting projects on the Tezos and Ethereum blockchain: [Artist Spotlight Vol 7 - Kim AsendorfA look into Digital Expressionism Art.![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F384d0f19-b947-4014-8774-db68ad0593ef%2Fapple-touch-icon-1024x1024.png)The Culture Projectabnormality![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1a405fea-cd4d-4511-a628-c74936896c0b_1100x220.png)](https://thecultureproject.substack.com/p/artist-spotlight-vol-7-kim-asendorf) ### Building through a bear Market Zack, better known as the SVP of SuperRare, one of the largest NFT platforms on bitcoin, speaks out about the difference of building web3 tech in this current bear market vs. the previous one - as well as some of the lessons learned over the course of the past 5 years in the space: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-06-at-17.15.36.png) [Link to Tweet](https://twitter.com/SuperRareRoses/status/1687482206812303360?ref=gorillasun.de) --- ## AI Corner ### Bruce Sterling on the Art of Text-to-Image Generative AI In this lecture at the AI for All conference in Eindhoven, the prolific and influential science fiction writerBruce Sterling tackles the current state of AI, with a focus on text-to-image generators that have become increasingly popular in 2022 - demonstrating the scale of the industry that has emerged around this new tech, showcasing the endless capabilities of these models as well as some of the silly problems that they still struggle with at this point: A transcript of the talk can also be found here: [Bruce Sterling on the Art of Text-to-Image Generative AIAuthorized transcript of Bruce Sterling’s lecture during the TU Eindhoven conference AI for All, From the Dark Side to the Light, November 25, 2022, at Evoluon, Eindhoven, co-organized by Next Natur![](https://networkcultures.org/wp-content/themes/inc-home/library/images/apple-icon-touch.png)Bruce Sterling on the Art of Text-to-Image Generative AIGeert Lovink![](https://networkcultures.org/wp-content/uploads/2023/05/22-anatomy-hand-e1684372330645.jpg)](https://networkcultures.org/blog/2023/05/17/bruce-sterling-on-the-art-of-text-to-image-generative-ai/?ref=gorillasun.de) Throughout, Bruce shows many an example of interesting AI generated imagery. ### AI-powered smart NPCs A new application that's recently been seeing more attention, has been smart NPCs for video games. These smart NPCs come in the form of a plugin for Unreal Engine 5: [Replica unveils AI-powered smart NPCs for Unreal EngineReplica Studios is unveiling AI-powered smart NPCs for the Unreal Engine platform. Those NPCs can chat with players using OpenAI.![](https://venturebeat.com/wp-content/themes/vb-news/img/favicon.ico)VentureBeatDean Takahashi![](https://venturebeat.com/wp-content/uploads/2023/05/replica-4.jpg?w=1200&strip=all)](https://venturebeat.com/games/replica-unveils-ai-powered-smart-npcs-for-unreal-engine/?ref=gorillasun.de) *How does this work?* Instead of having pre-programmed and scripted responses to dialogue options, NPCs can now be talked to freely, and reply in a manner to address your statements and questions as a real person would. This is done by having an LLM sitting in the background generate the NPC responses and bringing them to life with an AI voice generator. This allows you to talk freely and dynamically to any NPC that might roaming around the virtual world. And this works relatively well at this point, obviously there's still many things to figure out when it comes to context as these models will often deviate from the main point. Here's a demo of this in action The implications of this are incredible, we'll likely see a wave of next-gen games that implement this and add a completely new layer of depth to the overall experience. --- ## Gorilla Articles ### Euler and Verlet Integration for Particle Physics Another installment in our physics system series in which we have a first look at Verlet Physics. We ease ourselves into the Verlet integration method by first examining Euler integration, the method that we've inadvertently used up until this point. Along the way we'll also discover that there's quite a few problems with how the way that we've been programming physics so far, and that we're actually quite far from simulating forces accurately. Why that is, becomes clearer throughout the article: [Euler and Verlet Integration for Particle PhysicsIn this post we revisit our particle system, and have a first look at the Verlet Integration method, which is an alternate method for simulating particle physics. It is in many ways more robust that the regular Euler Integration method that we have employed so far.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/parts-1.png)](https://www.gorillasun.de/blog/euler-and-verlet-integration-for-particle-physics/) We conclude the post with a comparison between Verlet and Euler integration, demonstrating that Verlet integration is in many ways much more accurate than Euler integration. This week we'll probably pick up from where we left off and create some soft bodies with the Verlet method. It was also really cool to see Gustavo reach out on Twitter, telling me that he liked the post. It always makes me happy when I build on top of other people's resources and I can do them justice: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Screenshot-2023-08-07-at-11.28.34.png) Message from Gustavo! 🙌 --- ## Tip of the Week Drawing a rotated rectangle is a bit of tricky problem if you've never done it before. There's a couple of ways to do it, I've touched upon the topic in this previous post of mine: [An Algorithm for Polygon IntersectionsIn this post we’ll work our way towards an algorithm that can compute convex polygon intersections. We’ll also a method for intersections between axis-aligned rectangles, a function that can determine the intersection of two line segments, as well as a point in polygon test.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/thumb2.png)](https://www.gorillasun.de/blog/an-algorithm-for-polygon-intersections/) The easiest way to do so, is probably by first positioning the vertices of the rectangle around the origin given the dimensions of the rectangle, and then rotating these vertices by an angle, or alternatively with a matrix transform to then translating them to the position that you want them to be at on the canvas. An different method that I just recently figured out is the trigonometric approach, in which we cheat a little bit and place four points on an ellipse to delineate the rectangle. The problem here is that if we want this rectangle to be at an angle, we need to rotate the ellipse, which requires some gnarly trigonometric equations that are a bit tricky to figure out. So here they are: ``` function slantedEllipse(pos, radX, radY, ang, slant){ let x = pos.x + radX * cos(ang) * cos(slant) - radY * sin(ang) * sin(slant); let y = pos.y + radX * cos(ang) * sin(slant) + radY * sin(ang) * cos(slant); return {x: x, y: y} } ``` radX and radY are the horizontal and vertical radii of the ellipse. Slant is the angle that the ellipse is slanted by. --- ## Music for Coding Might not be everyone's cup of tea, but been listening a lot to F.O.O.L. - which is on the heavier side of electronic music. I mainly listen to this when I'm at the gym, taking care of my abused back, but it also works really well for writing code. This track has quickly become one of my favorites, the intro also being somewhat reminiscent of Polyphia: --- **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week!** **If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/groups-2-1.png) ## Sign up for Gorilla News Newsletter every Monday, tutorials every Thursday and the occasional Sunday essay! Directly in your inbox! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ### Euler and Verlet Integration for Particle Physics URL: https://www.gorillasun.de/blog/euler-and-verlet-integration-for-particle-physics/ Last updated: 2026-07-27T10:55:43.000Z **I never thought that this series would grow to this length - but the more I learn about this topic, the more I find things to write about. Starting from what seemed like a very trivial sketch - some circles bouncing around on the canvas - I actually ended up learning so much about simulating physics, about collision detection, optimizations for computing collisions faster, how springs work, how to connect particles with springs and create meshes, and even taking a dip into soft body physics.** *And now, what if I told you that there was a completely different approach to doing all of these things?* That the way we implemented our particle system in it's current state, was just one of the different approaches in which things can be done? And that the system we created is actually flawed in many ways? Yes, there's actually many issues that still remain and that we're going to tackle throughout this article. First we'll go over what we've done so far, again, but this time around examine it from a mathematical point of view. And while we're at it, we'll also identify some problems that exist in this system. In the second part of this article we'll then talk about Verlet Integration, a different numerical method to compute the movement of particles on the canvas. It might seem like a scary term at first, but it's actually not that complicated, it just requires us to do a little bit of setup to get there. Overall, it isn't even very difficult to implement. One important aspect of Verlet Integration is it's *numerical stability* \- we'll see what that means towards the end of the article - making it excellent for scenarios where we have a number of interconnected particles: for instance when we're trying to model soft body physics! That's why it's worth looking into, to help us and make our future soft body simulations more accurate, more robust and overall much smoother! Another thing, before we start - I want to give a gigantic shoutout to this amazing video from Gustavo, who creates educative computer science and game dev content on the Pikuma Youtube channel. I genuinely don't know why it's only got roughly 10k views, it deserves many more. It's a bit of long watch, but really worth it. I learned a lot from it. Thank you Gustavo! Gustavo explains all of the concepts that we're also gonna tackle so beautifully and in the very best order that they could be explained - starting with the Regular Euler Integration approach and then moving on towards Verlet Integration. I definitely recommend watching it, it helped me understand things a lot better. [Also go follow Pikuma on Twitter](https://twitter.com/pikuma?ref=gorillasun.de) for more content like this! That said, let's get into the tutorial 👇 ## Euler Integration Let's have a look at how we've computed the movement of particles in our system, so far. Essentially, the future position of a particle on the canvas, can be determined by means of it's current position, it's velocity and an acceleration term, in addition to other forces that act upon the velocity in a similar manner to the acceleration. I go over what velocity and acceleration are in this post if you're not up to speed: [An Algorithm for Particle Systems with CollisionsIn this post we will program a particle system in p5js from scratch. We’ll mainly dicuss object oriented programming and delve into the necessary physics concepts to compute collisions, all while implementing a full particle simulation with P5JS.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/yayoi3.png)](https://www.gorillasun.de/blog/an-algorithm-for-particle-systems-with-collisions/) But to recap, the velocity of a particle is a vector that indicates the direction that it is moving in, as well as the speed that it is moving at. The acceleration is a term that indicates how the velocity is changing over time. If we're speeding up, or slowing down basically. The new position of a particle is calculated by adding the velocity vector to it's current position. The formula that describes this is simply the addition of the two vectors: \\( P\_{n+1} = P\_{n} + V\_{n} \\) Similarly, velocity is defined in terms of acceleration - the new velocity becomes the current velocity plus the acceleration vector: \\( V\_{n+1} = V\_{n} + a\_{n} \\) If you're like me and can understand this better as code, it would look as follows: ``` position.x = position.x + velocity.x position.y = position.y + velocity.y velocity.x = velocity.x + acceleration.x velocity.y = velocity.y + acceleration.y ``` In p5js, the wonderful framework that we use to visualize things, we have the convenient vector class that makes things a bit easier, and cuts the number of lines of code that we have to write in two: ``` position = p5.Vector.add(position, velocity) velocity = p5.Vector.add(velocity, acceleration) ``` This way of computing the future position of a particle is called **Euler Integration**! It is one of the simplest ways to compute the movement of particles on the canvas, and is also very often used for video games, because of it's simplicity. With just a few lines of code we can make particles move around on the canvas! ### The Problem with Euler Integration **But what are we actually doing here? Why is it called Euler Integration? What are we integrating after all?** As the video by Gustavo illustrates so beautifully, a particle moving in space is actually a continuous phenomenon - computers however, are discrete machines. We can only represent continuous phenomenons as discrete approximations. A particle moving through space from point A to point B, actually physically moves from point A to B, occupying all of the space that lies between these two points as time passes. Just like a puck gliding over an air hockey table. In our Javascript simulation, the particle doesn't behave like that though. The particle jumps forward in incremental and discrete steps towards it's destination. We are updating it's position by addition of a velocity vector, a discrete quantity, after all. We only perceive this as a smooth motion because these steps are generally minuscule, obfuscating the fact that they're discrete steps and creating the illusion of a smooth motion. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/Continous-Motion.png) To put it simply, approximating a continuous function with discrete numeric steps, is usually known as integration. An since it's only an approximation, a problem arises: an error gradually accumulates over time. This error can sometimes become more and more apparent the longer we let our particle simulation run. This might not be a big deal when it comes to creative coding and generative art, where we usually aim to make a chaotic and fun-to-watch particle chaos, but in other scenarios this is problematic. Let's see why this is, and demonstrate it with a simple sketch - let this run for a while and observe the behavior of the particles: What is happening here? Why does the particle keep bouncing higher and higher over time? Euler Integration is a method that gains energy over time. This is due to the approximation error that arises: every time that we calculate the new position of the particle, we're actually overshooting the actual real value by a little bit leading to an offset. This manifests itself by the particle bouncing higher and higher over time. And this isn't ideal, we don't want things to get more volatile over time. ### Semi-implicit Euler Integration There's actually a hack to make this system lose energy over time instead. In fact it's what we've been doing all along in the previous versions of our particle system! Let me explain! In the previous tutorials, we would add forces directly to the particle's velocity, such as the particle's acceleration and gravity. This is technically correct, but not exactly the proper way of doing things. Normally, in Euler integration, all external forces are first combined, for instance the gravitational force, and then used to determine the acceleration of the particle. The acceleration being the sum of the external forces, divided by the mass of the particle. This resulting acceleration can then be added on to the current velocity, to determine the future velocity, which in turn lets us compute the new position of the particle. These steps essentially constitute the update() function of the particle, and would look as follows: ``` update(sumOfForces){ this.acceleration = p5.Vector.div(sumOfForces / this.mass) this.position = p5.Vector.add(this.position, this.velocity) this.velocity = p5.Vector.add(this.velocity, this.acceleration) } ``` An exactly in this order! Order is important! Note that the new position of the particle is computed before we update it's velocity. This is the proper order of computations in the Euler integration method. Doing things in this manner however, will lead to an accumulating error that makes particles gain energy over time as we mentioned before - and is reflected by an ever increasing velocity, which in turn makes the particle speed up more and more over time. Have a look at this example that demonstrates two different approaches, where the first particle **on the left**, uses the exact update function as shown above, using the proper Euler integration method. The second particle **on the right**, is updated in the same manner as in the preceding tutorials, where we update the velocity with a seperate addForce() function - that adds external forces directly to the particle's velocity. We observe two very different behaviors: But wait a second, there aren't really any external forces applied to the particles, other than the gravity vector that we've initialized at the beginning of the setup function. So why does the second particle keep bouncing in place, and doesn't exhibit any increase in height over time, like the first one? **It's due to the order of operations.** We've essentially flipped the order of the velocity update and the position update, computing the new velocity of the particle before we compute it's new position. This ends up being *the semi-implicit Euler method*, and results in a particle behavior that doesn't gain energy over time - in fact, it does the opposite, the accumulated error leads to an undershooting of the actual position of the particle, losing energy over time. Therefore, if we were to flip these two lines in the draw loop, we'd obtain the same behavior of the regular Euler method, and the particle would also end up gaining height over time: ``` ourParticle.addForce(gravity) ourParticle.update() ``` Here, same code, just the two lines of code flipped: Even though we did inadvertently end up implementing the semi-implicit approach, it's always better to write things in a clear and readable manner. The update function for a particle that implements the semi-implicit Euler method would look as follows: ``` update(sumOfForces){ this.acceleration = p5.Vector.div(sumOfForces / this.mass) this.velocity = p5.Vector.add(this.velocity, this.acceleration) this.position = p5.Vector.add(this.position, this.velocity) } ``` Computation of position and velocity have a different order now. Simply placing the velocity update before the position update. Hence, the order of things matters a lot! Here's the same example again, but rewritten in a nicer way: ... **Hold up a sec!** If the semi-implicit Euler method should be losing energy over time, why does the second particle maintain the same bounce height? ### A Clarification on our previous Implementation Well, that's actually because this is a very *special case of the semi implicit Euler method*: when the initial velocity of a particle is a zero vector, then it will actually not lose energy over time and end up conserving it. We'll actually exactly hit the mark and have the particle bounce up to it's original height every time. Have a look at this example, where we pass in a random vector as the particle's initial velocity as we create it, it will actually bounce lower and lower, and after a while come to a full stop: Phew, glad we solved this mystery! The reasons why an initial zero velocity leads to conservation of energy are a bit more elaborate, but I'm just going to side step that for now! I looked into it a bit, and it seems that in this special case the particle ends up being a [Hamiltonian system](https://en.wikipedia.org/wiki/Hamiltonian%5Fsystem?ref=gorillasun.de), which is essentially a special kind of system that conserves it's energy as already mentioned. --- *And just to make sure that things are clear:* It's important to understand that in the particle systems that we've programmed previously, it might have seemed that we did things correctly, but you'd notice that if we were to let things run long enough, everything would eventually end up coming to a standstill. This can end up being a bit confusing, hence I really recommend playing with the formulas for yourself, and trying to recreate the simple bouncing particle sketches from scratch to get a feel for this. Why am I bringing this up? Because I don't want you to mistake the previous sketches for accurate physics simulations, where it might've seemed that we've created a realistic gravitational pull directed towards the bottom of the canvas. **This is in fact not what is actually happening.** In a friction-less world, a ball would keep bouncing forever. In our case the particle didn't stop bouncing because of friction though - we didn't implement any friction - it stops bouncing merely because it was losing energy due to the integration method that we were using, causing an accumulating error. I hope this makes sense. It felt necessary to clarify this, to be able to move forward with a better understanding of what we are actually doing. ### Updating our system with a time-step component Up until this point, the little physics simulations that we've created have an apparent animation speed that is directly tied to the frame rate of the draw loop. Increasing this frame rate, would also lead to an increase in the speed of the animation, and vice versa. And this isn't ideal, we'd much rather have the speed of the engine be independent from the frame rate. For instance if we run the previous sketches at 30 frames per second, rather than 60 frames per second, then the simulations would only progress half as fast. So, how do we solve this and make the speed of the simulation independent from the frame rate? Well, there's actually another variable that goes into the formulas for computing the position and velocity of a particle in movement. **Delta Time:** a time increment that scales the acceleration and velocity in the velocity and position update statements respectively. This time increment variable usually represents the time elapsed since the beginning of the previous frame and the beginning of the current frame. Essentially the formulas then become: \\( P\_{n+1} = P\_{n} + V\_{n} \* \\Delta t \\) \\( V\_{n+1} = V\_{n} + a\_{n} \* \\Delta t \\) This scaling ensures that the simulation progresses at a consistent rate, regardless of the frame rate. P5 already provides this delta time variable out of the box in milliseconds, and we'd simply have to scale it, dividing it by a factor of 1000: ``` let dt = deltaTime / 1000 particle.update(sumOfForces, dt) ``` Then we can simply pass it in as another input to the particle's update function. And in action this would look as follows, for instance here's a sketch at the native frame rate: And here's the same sketch at a very choppy 10 fps: Note here that we had to make some changes to the overall numbers, for instance we reduced the mass of the particle and cranked the force of the gravity, otherwise things would overall be very slow. And that concludes everything I want to say about Euler Integration, I think that we're ready to tackle Verlet Integration now! ## Verlet Integration If you've got a solid grasp on everything that preceded then the rest should be a walk in the park! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/7ujqix.jpg) In a nutshell, Verlet Integration is a different approach to computing the future position of a moving particle, without us requiring to explicitely store the velocity of that particle. Yes, that's right, with Verlet Integration we can do without the velocity variable, because we can actually estimate with a nifty formula - in which we only need to remember the previous position of the particle. We'll deduce this formula from the semi-implicit form that we had a look at earlier. So instead of explicitly storing the velocity of the particle and manipulating it, we'll now store the current position of the particle, it's previous position as well as it's acceleration. Let's see how this works! Backtracking a bit, and returning to the formulas for the semi-implicit Euler Integration method, we have: \\( V\_{n+1} = V\_{n} + a\_{n} \* \\Delta t \\) \\( P\_{n+1} = P\_{n} + V\_{n+1} \* \\Delta t \\) Note how in the semi-implicit form the new position depends on the new velocity. These same position update formula, for the previous position of the particle would look as follows - simply going back one step in time, as indicated by the suffixes of the variables: \\( P\_{n} = P\_{n-1} + V\_{n} \* \\Delta t \\) We can rewrite this in terms of the current and previous position: \\( V\_{n} = \\frac{P\_{n} - P\_{n-1}}{\\Delta t} \\) This means that the current velocity can actually be deduced from the old and the current position. Ok, this is great! How does that help us find the next position of the particle though? Let's rewrite the formula for the next position, substituting the \\( V\_{n+1} \\) term: \\( P\_{n+1} = P\_{n} + ( V\_{n} + a\_{n} \* \\Delta t ) \* \\Delta t \\) And from before we know that \\( V\_{n} \\) can be written in terms of the old and previous position, hence we'd obtain the following: \\( P\_{n+1} = P\_{n} + ( \\frac{P\_{n} - P\_{n-1}}{\\Delta t} + a\_{n} \* \\Delta t ) \* \\Delta t \\) Let's clean this up a bit and we get: \\( P\_{n+1} = P\_{n} + P\_{n} - P\_{n-1} + a\_{n} \* \\Delta t^2 \\) And more concisely: \\( P\_{n+1} = 2P\_{n} - P\_{n-1} + a\_{n} \* \\Delta t^2 \\) And as you can see, this formula doesn't require any velocity term for the computation of the next position of the particle! ### Implementing a Verlet Particle The hard part's done - armed with this new formula we can now implement our Verlet Particle. First, let's add a member variable in which we'll store the old position: ``` class Particle{ constructor(position){ this.position = position // initially we'll set the old position to the current position this.oldPosition = this.position // we can also pass this in as an input this.mass = 1 this.radius = 15 } } ``` As for the update function, we'll now implement Verlet integration: ``` update(sumOfForces, dt){ this.tempPosition = this.position this.position = p5.Vector.add(p5.Vector.sub(p5.Vector.mult(this.position, 2), this.oldPosition), p5.Vector.mult(sumOfForces, dt*dt)) this.oldPosition = this.tempPosition } ``` Here we need to first store the current position in a temporary variable, since it will become the old position after we've computed the new current position. Then we have a gnarly line in which we simply apply the formula that we concluded with in the previous section to compute the new position of the particle, and finally we set the old position to the temporary value that we stored earlier. ### Boundary Checks with Verlet Integration So we have one little problem left when it comes to checking if the particle is within the bounds of the canvas. Previously we'd simply point the velocity of the particle into the opposite direction when we hit a canvas boundary. Now we don't have an explicit velocity vector anymore and can't use that exact method anymore to make our particles bounce off of the boundaries. But we can sidestep this by computing the velocity temporarily, by subtracting the old position from the current position and then using that velocity to cheat a little bit. We'll essentially reflect the old position around the current position of the particle, in a way pretending that we are coming from beyond the canvas boundary. And that would look as follows: ``` constrain(){ let velocity = p5.Vector.sub(this.position, this.oldPosition) if(this.position.x < 0){ this.position.x = 0 this.oldPosition.x = this.position.x + velocity.x }else if(this.position.x > 400){ this.position.x = 400 this.oldPosition.x = this.position.x + velocity.x }else if(this.position.y < 0){ this.position.y = 0 this.oldPosition.y = this.position.y + velocity.y }else if(this.position.y > 400){ this.position.y = 400 this.oldPosition.y = this.position.y + velocity.y } } ``` And in action our final Verlet simulation: You can see here that Verlet Integration also suffers from a loss of energy over time, but maybe not as harshly as the semi-implicit Euler Integration method. ### Numerical Stability At the very start of this article, I mentioned that Verlet Integration is numerically more stable than Euler Integration. Let's put this to the test and compare the two methods - let's see how quickly the two lose energy in comparison to each other: Well it seems that there isn't much difference here really. Bummer. But wait, we're not actually doing this the right way! This energy loss and the accumulating error have a lot to do with the size of the time increment. The larger this time increment, the quicker this accumulated error will become apparent. That means if we were to make this time step smaller, we'd be able to make more accurate predictions. How do we do this though? We simply run our simulation several times per frame, dividing the time increment by the number of simulation steps. Let's compare the methods again - but this time let's run the update step 10 times every frame, the draw loop would look as follows now: ``` function draw() { background(220); let dt = deltaTime/1000 for(let n = 0; n < 10; n++){ verletP.update(gravity, dt/10) verletP.constrain() eulerP.semiImplicitUpdate(gravity, dt/10) eulerP.constrain() } verletP.display() eulerP.display() line(0, 200, 400, 200) } ``` And in action: Here I also give the Euler particle a random starting velocity to give the Verlet particle a fair chance, because the Euler particle would simply bounce forever if it's initial velocity is zero as mentioned before. In this scenario you can see that Verlet integration conserves energy much, much better than the Euler method! In both cases, this means that our simulation will be more accurate for more time steps, but comes at the expense of a computational overhead. Ultimately it will boil down to your application and how accurate you need/want things to be! ## Concluding Thoughts In this article we covered Verlet Integration, and also extensively discussed the regular Euler Integration method that is most commonly used for simulating simple particle system, as well as other applications. We also discussed some of the problems with it, such as the accumulating error that leads to a gain or loss of energy over time and discussed how to make things more accurate by running the simulation over smaller time steps. In the next post we'll discuss how to do collisions and springs with the Verlet integration method and then also revisit soft body physics. **As always, I hope you enjoyed this post, I definitely had a lot of fun writing it. If you did, consider sharing it on your socials, or signing up to the newsletter to get updates whenever new content is posted on the blog. It helps a lot! Otherwise, cheers and happy sketching \~ Gorilla Sun 🌸** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/08/groups-2-1.png) ## Sign up for Gorilla News ### Newsletter every Monday, tutorials every Thursday and the occasional Sunday essay! Directly in your inbox! Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ### Gorilla Recap 15 URL: https://www.gorillasun.de/blog/gorilla-recap-15/ Last updated: 2023-07-31T23:15:37.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly Gorilla Recap, a newsletter in which I go over everything that I found noteworthy from the past week. Hope you have a good stay!** --- *Before we start - since this newsletter is meant to be something to enjoy in your inbox every Monday, I'm making an effort at improving it in that regard. For instance, no more embedded tweets that can't be displayed in an email - instead screenshots that link to their respective tweets by clicking on them. Let me know if there's any other improvements to make this a better experience!* That said, let's get into some cool tech, genart and AI things of the past week! 👇 ## Overflow AI This is arguably the most exciting news for me personally this week! StackOverflow is bringing out it's own AI chatbot! All while staying true to the original mission that StackOverflow promised - keeping the developer community at the center! Essentially, the chatbot will provide responses to your questions while also citing the answers that it uses to provide reponses to your questions - I think that this is HUGE! What's bothered me about ChatGPT is that there's no way of telling what the source of the answer is, even if it is in many cases a patchwork of some internal representations. Now I can actually credit something tangible when I do end up using a snippet of generated code, and at the same time feel much more comfortable about it while doing it! This enhanced search experience is also planned to be delivered as an integration to IDEs like Visual Studio Code, as well as Slack. You can check out the entire roadmap here: [Announcing OverflowAILet’s highlight the new features and products we announced today from the stage of WeAreDevelopers.![](https://149351115.v2.pressablecdn.com/wp-content/uploads/2017/03/cropped-SO_Logo_glyph-use-this-one-smaller-270x270.jpg)Prashanth ChandrasekarStack Overflow Blog![](https://149351115.v2.pressablecdn.com/wp-content/uploads/2023/07/blog-overflowai-v1.png)](https://stackoverflow.blog/2023/07/27/announcing-overflowai/?ref=gorillasun.de) ## Interesting Reads Some juicy reads from the past week 👇 ### Reviving dead social Media One of those great links from the Ghost newsletter, and a very fitting one at that. It seems that the landscape of social media platforms is in a constant state of upheaval, and I've certainly been struggling with making a decision on how to navigate the rising tides moving forward. A couple years back it wasn't as difficult as it seems now, just make an account, make good content and play by the rules of the algorithm. And with consistency you'll very likely end up with a decent amount of engagement. Well, it's no so easy anymore, things *feel* a lot more random these days. It's almost like social media platforms don't know what they want anymore. Emily Rochotte paints a beautiful picture of the current identity crisis that social media platforms find themselves in today and also illustrates some approaches to navigate these turbulent waters in addition to finding success on them: [Reviving dead social media | The Content TechnologistAutomation killed the social media star. How can creators embrace evolving social media algorithms without chasing their audience away?![](https://www.content-technologist.com/content/images/size/w256h256/2020/12/content-technologist-icon--1--1.png)Emily RochotteThe Content Technologist![](https://images.unsplash.com/photo-1554177255-61502b352de3?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fHNvY2lhbCUyMG1lZGlhfGVufDB8fHx8MTY5MDIzODg3N3ww&ixlib=rb-4.0.3&q=80&w=2000)](https://www.content-technologist.com/dead-social-media-engagement-revival/?ref=ghost.org) Authenticity and emotions matter more than ever. ### Beware of NPM Malware You probably download NPM packages without giving it a second thought. And that's fine, the likelihood that you'll download a package that contains some sort of malware is quite low - roughly 0.007222% according to an article on The New Stack: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-31-at-00.22.27.png) [Is npm a Hotbed of Malware?WhiteSource, a leading open source security provider, says npm, one of the most widely used JavaScript package managers, is a playground for malicious actors.![](https://thenewstack.io/favicon.ico)Steven J. Vaughan-NicholsThe New Stack![](https://cdn.thenewstack.io/media/2022/02/5f4533f7-digital-g1161e2fb8_640.jpg)](https://thenewstack.io/is-npm-a-hotbed-of-malware/?ref=gorillasun.de) And the average indie dev, hacking away in their bedroom is often not the target of elaborate malware schemes, but rather, researchers and devs working at larger companies handling sensitive and valuable data on a daily basis. What sounds like a plotline from a dystopian movie becomes a very real threat - a North Korean state-backed hacking syndicate known as the 'Lazarus Group' attempts infiltration of sensitive devices with elaborate malware schemes. This excellent article by [Feross Aboukhadijeh](https://socket.dev/blog/social-engineering-campaign-npm-malware?ck%5Fsubscriber%5Fid=1131868666&ref=gorillasun.de) goes into the details: [Social engineering campaign targeting tech employees spreading through npm malware - SocketThe Lazarus Group launched a sophisticated social engineering campaign targeting developers in the cryptocurrency and cybersecurity sectors, using compromised accounts and malware-laden NPM packages.![](https://socket.dev/apple-touch-icon.png)Socket![](https://cdn.sanity.io/images/cgdhsj6q/production/46125e26e3c1fd1e6686d368ebff8bcbc09f7173-1024x1024.png?w=1000&fit=max&auto=format)](https://socket.dev/blog/social-engineering-campaign-npm-malware?ref=gorillasun.de) ### Putting the "You" in CPU Not a read for the faint of heart - Lexi Mattick explains how programs run on your computer, from start to finish, in this e-book-esque series of articles. How can you pass up on something that starts off as strong as this: > I would’ve killed for one solid article explaining what I learned, so I’m writing the article that I wished I had. Even if you know exactly how computers work, or at least think that you know how computers work, this one's a must read: [Putting the “You” in CPUCurious exactly what happens when you run a program on your computer? Learn how multiprocessing works, what system calls really are, how computers manage memory with hardware interrupts, and how Linux loads executables.![](https://cpu.land/favicon-on-dark.png)Putting the "You" in CPU![](https://cpu.land/banner.png)](https://cpu.land/?ref=gorillasun.de) I wish someone would have shown me this when I took my first computer architecture course. ### Google's Proposal for a Web Environment Integrity API Last week I also came across [this scary tweet](https://twitter.com/nearcyan/status/1684242509847822336?ref=gorillasun.de) \- a *proposal* from Google about integrating a Web Environment Integrity API into their browsers. Despite it being a proposal, an apparent prototype already exists in chromium: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-31-at-01.53.48.png)](https://twitter.com/nearcyan/status/1684242509847822336?ref=gorillasun.de) So what does this WEI API do? It essentially allows browsers to monitor and fingerprint the entities that are operating the browser. This is to ensure that these entities play by the same rules as others, for example, as a measure against automated means of cheating in browser games. At least that is my understanding of it. A more detailed explanation can be found here: [Google’s nightmare “Web Integrity API” wants a DRM gatekeeper for the webIt’s just a “proposal,” but it’s also being prototyped inside Chrome right now.![](https://cdn.arstechnica.net/wp-content/themes/ars/assets/img/material-ars-db41652381.png)Ron AmadeoArs Technica![](https://cdn.arstechnica.net/wp-content/uploads/2020/07/android-spying-760x380.jpg)](https://arstechnica.com/gadgets/2023/07/googles-web-integrity-api-sounds-like-drm-for-the-web/?ref=gorillasun.de) ### The Bull Case for Digital Art An [interesting thread](https://twitter.com/nf%5Fsuzanne/status/1685563671538475008?ref=gorillasun.de) I found by Twitter user SuzanneNFTs, highlighting some of the factors that make digital NFT art attractive for the younger generation, and is in many ways already primed to value as well as be more open to purchasing and owning digital assets: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-31-at-01.52.58.png)](https://twitter.com/nf%5Fsuzanne/status/1685563671538475008?ref=gorillasun.de) ## AI Corner ### Why transformative Artificial Intelligence is really, really hard to achieve I've already touched upon the risks of AI moving itself into a position of unhalted growth in previous issues of the Gorilla Recap. There's a big dichotomy around this very issue currently, some think that it's a genuine concern and that we are very near to the singularity if we don't carefully monitor advancements in the AI space, others argue that we are still nowhere near achieving general intelligence, and that most models at this point are still only imitating and regurgitating patterns that they have been trained on. An excellent article by Arjun Ramani and Zhengdong Wand published by The Gradient tackle this topic, arguing that the world is just too complicated for us to assume that advancements in theoretical AI, such as the current text generation models (that have become incredibly popular in recent months), can be considered powerful enough to be transformative on a larger scale: [Why transformative artificial intelligence is really, really hard to achieveA collection of the best technical, social, and economic arguments Humans have a good track record of innovation. The mechanization of agriculture, steam engines, electricity, modern medicine, computers, and the internet—these technologies radically changed the world. Still, the trend growth rate…![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)Arjun Ramani and Zhengdong WangThe Gradient![](https://thegradient.pub/content/images/2023/06/babel.jpg)](https://thegradient.pub/why-transformative-artificial-intelligence-is-really-really-hard-to-achieve/?ref=gorillasun.de) > \[...\] myriad hurdles stand in the way of widespread transformative impact. These hurdles should be viewed *collectively*. Solving a subset may not be enough. Solving them all is a combinatorially harder problem. ### Why AI is a Threat to Artists Even though I find recent AI advancements really exciting, it also poses a very real risk to many types of creatives, especially to those who create and produce visual and written content - as those two fields have seen the largest leaps in advancement in recent years. I often find that the space is advancing so fast that the attention is immediately shifted to the new technologies when we haven't even decided on regulating the tools from yesterday. Paris Marx, host of the wonderful podcast **Tech won't save us** is joined by [Molly Crabapple](https://mollycrabapple.com/?ref=gorillasun.de), an accomplished and prolific illustrator to discuss all of these matters and voice her concerns: [Why AI is a Threat to Artists w/ Molly Crabapple - Tech Won’t Save UsAre AI image generation tools really democratizing art? Molly Crabapple explains why art is innately human, what’s lost by having AI take over making art, and what risks image generation presents for working-class artists.![](https://www.techwontsave.us/favicon.ico)Tech Won't Save Us![](https://techwontsave.us/assets/img/social/twsu_social.png)](https://www.techwontsave.us/episode/174%5Fwhy%5Fai%5Fis%5Fa%5Fthreat%5Fto%5Fartists%5Fw%5Fmolly%5Fcrabapple?ref=gorillasun.de) Check out the other episodes as well, really an excellent podcast! Molly Crabapple also wrote an op-ed for the Los Angeles Times on the same topic which I found to be a very important read: [Op-Ed: Beware a world where artists are replaced by robots. It’s starting nowAIs can spit out work in the style of any artist they were trained on — eliminating the need for anyone to hire that artist again.![](https://www.latimes.com/apple-touch-icon.png)Molly CrabappleLos Angeles Times![](https://ca-times.brightspotcdn.com/dims4/default/32e0622/2147483647/strip/true/crop/1200x630+0+85/resize/1200x630!/quality/80/?url=https%3A%2F%2Fcalifornia-times-brightspot.s3.amazonaws.com%2F3b%2F33%2F5879349b474e8e21cd7a1a4b66b7%2Fhomepage-ai-art.png)](https://www.latimes.com/opinion/story/2022-12-21/artificial-intelligence-artists-stability-ai-digital-images?ref=gorillasun.de) ## Gorilla Articles ### Programming Soft Body Physics and Blobs We continue making cool things with our particle system: last week we discussed how springs work and put together a particle and spring mesh - this week we double down on this and have a look at making squishy and bouncy blobs. Turns out that fine tuning them is quite tricky and there's a number of configurations in which they can be wired together. This tutorial walks you through this process, shows some improvements to the particle system so far and also goes over some possible configurations for our blob shapes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-08-01-at-00.24.15.png) There hasn't been a second article this week, as I've gotten quite sick and bedridden over the weekend, in addition to helping my family move across the country. But I'm on the mend now and already working on the posts of the coming week! So keep your eyes peeled for that! ## Gorilla Sketches I got a decent amount of sketching in towards the beginning of the week, returning to an idea that I did some months ago actually - a sketch that revolved around computing the collisions between arc shapes and subsequently being able to pack them on the canvas. Back then I would trace the arc shapes with tiny line segments and then compute the intersections of those to determine if the two arcs intersected. This time I wanted to do it the proper way however, and actually compute the intersections of those arcs which turns out to be a bit tricky, requiring you to first determine if the two circles that the arcs fall on intersect and then check if those points of intersection fall into the angular range that the arcs cover. I managed to do it ultimately however: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-08-01-at-00.36.24-1.png)](https://twitter.com/gorillasu/status/1683771736859328512?ref=gorillasun.de) [You can view an animated version of this here](https://twitter.com/gorillasu/status/1683771736859328512?ref=gorillasun.de) This ultimately lead to recreating the original arc packing sketch: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-08-01-at-00.37.56.png) It's not much, but it's honest work. And alter integrating it into the circular sketch that I started working on in the previous week - combining a more chaotic system with elements that retain some structure. You know, threading that fine line of system and chaos in generative art: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-08-01-at-00.38.54.png) Excited to see where this will go! ## Tip of the Week I don't use it as often as I used to anymore, but FFMPEG is one of those very useful tools that you should have in your trickbag as a creative coder. Whether you need to convert between different media formats, or need to shave off a couple of MBs from a gif to get it within some platform's size limit - FFMPEG got your back. The caveat is that it's not the easiest command line tool to use - with it's hundreds of different flags and options, that can be mixed and matched in various ways, it can quickly become difficult to actually figure out how to perform a specific task. ffmprovisr to the rescue. I wish I had found this site many moons ago, rather than having to scour different forum and stackoverflow posts to find the correct command, It provides commands alongside detailed explanations for the flags that are being used: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-31-at-00.03.07.png)](https://amiaopensource.github.io/ffmprovisr/?ref=gorillasun.de) [https://amiaopensource.github.io/ffmprovisr](https://amiaopensource.github.io/ffmprovisr/?ref=gorillasun.de) Alternatively you can also give my personal beginner's guide a shot: [A Simple Guide to FFMPEGFFmpeg is an essential tool for creative coders. Here’s a primer on using FFmpeg, and showcase of some of it’s capabilities.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ffmpeg.png)](https://www.gorillasun.de/blog/a-simple-guide-to-ffmpeg/) ## Music for Coding This week I thoroughly enjoyed these fantastic soundscapes from Ben Böhmer, a german producer and musician that blends sounds in a magical manner to the like of Tycho, Bonobo and Christian Löffler. If you want something for a moody and rainy train ride through a grey and brutalist German landscape, this hits the spot: **And that's it from me this week again, hope this caught you up a little bit with the events in the world of tech, AI and generative art in the past week! If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Programming Soft Body Physics and Blobs URL: https://www.gorillasun.de/blog/soft-body-physics-and-blobs/ Last updated: 2026-08-10T16:20:59.000Z **This post is a direct continuation of the previous article *Spring Physics, Particles and Meshes*. If you haven't read that one yet, then I recommend checking that one out first before coming back here.** [Spring Physics, Particles and MeshesSprings are an integral concept to physics, fundamental components used in many applications, coming to life with Hooke’s Law from the 17th century. In this post we have a look at how to code and simulate such springs and extend a previous particle system with them.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-23-at-17.11.05.png)](https://www.gorillasun.de/blog/spring-physics-and-connecting-particles-with-springs/) All about spring physics and combining them with particles to create bouncy meshes. Links to all previous posts in the series can be found here as well. **In this post we'll talk in more detail about soft body physics, explore some of the different shapes that can be constructed with particles and springs, and discuss some approaches to creating different kinds of squishy blobs.** --- We concluded the last post by creating a spring mesh - a structure that consists of a number of particle instances connected by springs in a very particular manner. But that's just the tip of the iceberg, a rectangular mesh is only one of the possible shapes that we can create with the system that we've built so far. There's many more interesting structures that can be constructed by chaining together particles with springs in particular manners, each of them presenting a different behavior depending on it's particular skeletal structure. One very popular shape in creative coding and generative art are blobs, and it's actually a really tricky problem to configure them to your liking. We'll get into more detail on this later on. The direct inspirations for this article are two wonderful blobby sketches from two awesome creative coders - [Roni Kaufman](https://twitter.com/KaufmanRoni?ref=gorillasun.de): > Experimenting with blobs [pic.twitter.com/AdvA3jSCCb](https://t.co/AdvA3jSCCb?ref=gorillasun.de) > > — Roni Kaufman (@KaufmanRoni) [June 21, 2022](https://twitter.com/KaufmanRoni/status/1539196005178015745?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And [Juhani Halkomaki](https://twitter.com/JuhaniHalkomaki?ref=gorillasun.de): > [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Inflate/deflate/gm [pic.twitter.com/WBUpwgQqrh](https://t.co/WBUpwgQqrh?ref=gorillasun.de) > > — Juhani Halkomäki (@JuhaniHalkomaki) [February 27, 2023](https://twitter.com/JuhaniHalkomaki/status/1630098615749300224?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Juhani's sketch even inspired Daniel Schiffman to make a video on the topic: Dan uses the famous toxiclibs library by [Karsten Schmidt](https://genart.social/@toxi@mastodon.thi.ng?ref=gorillasun.de) to create the cute and bouncy character that you see in the thumbnail. If you don't feel like coding all of the parts of the code from scratch like we're doing, and want a solid library to handle the involved physics for you, then toxiclibs is probably the way to go. Dan also talks a little bit about the historic significance of toxiclibs in creative coding. In this post however, we'll be creating some very bouncy and deformable blob shapes by making use of the physics system that we've built over the course of the past 4 articles. Here's what we'll be making: Let's get into it 👇 ## Improvements Before we dive straight into coding our soft body blobs, I'd like to first make a number of improvements to the particle system that we've put together so far! We'll make some modifications to the boundary collisions as well as the mouse drag functionality that make them more accurate, and we'll also add our grid lookup back in! ### Improved Boundary Collisions On my last Twitter post in which I announced the previous article, I got a comment by [Galo](https://twitter.com/GaloAndStuff?ref=gorillasun.de) \- another awesome creative coder and generative artist - with an idea for improving the function that prohibits particles from leaving the canvas, indicating that there's a better way to handle boundary collisions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-26-at-14.08.14.png) Do we call them X posts now? The way that we've done it so far: when it's registered that a particle's radius exceeds one of the boundaries of the canvas, we simply invert the velocity of the respective horizontal or vertical component, depending on which boundary has been crossed. This comes with the side-effect that the particle sometimes gets stuck on the edges in a jittery and glitchy manner. A better way to do this, is by applying an opposing force to the particle when it hits the boundary, giving it a soft and smooth push in the opposite direction that it's coming from. Since we already added such a function to our particle class that accepts as input a force vector and adds it to the velocity of our particle, we'd only need to alter our checkEdges() function slightly and pass in a vector pointing pointing inwards towards the canvas. Here's what this new behavior looks like in action with some random particles dispersed on the canvas: Btw, Galo is also a certified blob scientist: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/blobsgalo.png) This interactive piece fills the window with ever growing blobs [https://www.someblob.art/](https://www.someblob.art/?ref=gorillasun.de) ### Improved Mouse Drag We can also make some improvements to the code that takes care of dragging and dropping the particles. The previous behavior was a bit wonky, where it would only move the particle along with the mouse while the mouse was being dragged. If we pressed a particle, without moving the mouse, the particle would simply jump back towards the position that the attached springs drag it to. We don't want that, instead, even if we are not moving the mouse we'd like the particle to stay at the position of the cursor. Let's get rid of the previous code and make some modifications to the Particle class, adding the dragging behavior to the particle class itself - for this we need to add a new member variable: ``` this.dragging = false ``` Simply a boolean flag that indicates that the particle is being dragged. Now, we need to give the particle two new functions that take care of toggling this flag when the mouse is pressed and the cursor is within the radius of the particle: ``` mousePressed() { if (dist(mouseX, mouseY, this.pos.x, this.pos.y) < this.radius) { this.dragging = true; } } mouseReleased() { this.dragging = false; } ``` In the particle's *mousePressed()* function we check if the cursor is inside of the particle's radius, if that is the case we can set it's *dragging* flag to true. As for the *mouseReleased()* function, we reset the *dragging* flag to false again. In the particle's update function we take care of what happens when the particle's dragging flag is set to true. We run a different behavior if that is the case: ``` updateState(newPos) { if(!this.dragging){ this.addForce(this.acceleration); this.limitVelocities() this.pos.add(this.velocity); }else{ this.velocity = p5.Vector.sub(createVector(mouseX, mouseY), this.pos); this.pos.add(this.velocity); } } ``` In the case that it is being dragged, we register the offset between the mouse coordinates and the current position of the particle - this then actually becomes the new velocity of the particle. This is important because once we release the particle we kind of want it to retain some amount of velocity and keep traveling into the direction that we were dragging it, and not simply lose all momentum and sit wherever we released the mouse. Then we also need to set the position of the particle to this velocity such that the particle follows the cursor. Lastly, we use P5's inbuilt mousePressed() and mouseReleased() functions to loop over all particles and trigger the particle's mouse functions: ``` function mousePressed() { for (let i = 0; i < particles.length; i++) { particles[i].mousePressed(); } } function mouseReleased() { for (let i = 0; i < particles.length; i++) { particles[i].mouseReleased(); } } ``` And in action this works as follows: You might have noticed, I also made an additional change to the checkEdges() function, such as not to kill the entire momentum of a particle when it collides with the boundaries: ``` checkEdges() { if (this.pos.x - this.radius < 0) { this.pos.x = this.radius; this.velocity.x *= -.25; this.addForce(createVector(1, 0)) } else if (this.pos.x + this.radius > width) { this.pos.x = width - this.radius; this.velocity.x *= -.25; this.addForce(createVector(-1, 0)) } if (this.pos.y - this.radius < 0) { this.pos.y = this.radius; this.velocity.y *= -.25; this.addForce(createVector(0, 1)) } else if (this.pos.y + this.radius > height) { this.pos.y = height - this.radius; this.velocity.y *= -.25; this.addForce(createVector(0, -1)) } } ``` There probably is still a better way to do this. Here I'm essentially combining both behaviors from earlier. ### Adding the Grid-lookup back In And to make things run faster, we'll also add our grid look-up back in. This is important because the soft body blobs will end up being made up out of a large number of particles. We'll just use the very basic form of the grid lookup, without all of the other mini optimizations that we discussed in the spatial hashing article: [Optimizing Particle Systems with a Grid Lookup and Spatial HashingIn this post we have a look at a method with which we can greatly improve a collision detection system. Using a lookup grid we can greatly reduce the number of required checks between particles. We will also look at some methods to optimize this lookup grid.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/circs.png)](https://www.gorillasun.de/blog/particle-system-optimization-grid-lookup-spatial-hashing/) For your convenience, here's the entire grid class: ``` class Grid { constructor(canv_wid, canv_hei, s) { this.cellSize = s; this.numCols = Math.ceil(canv_wid / s); this.numRows = Math.ceil(canv_hei / s); this.cells = []; for (let x = 0; x < this.numCols; x++) { this.cells[x] = []; for (let y = 0; y < this.numRows; y++) { this.cells[x][y] = []; } } } addParticle(particle){ let col_idx = Math.floor( particle.pos.x / this.cellSize); let row_idx = Math.floor( particle.pos.y / this.cellSize); this.cells[col_idx][row_idx].push(particle) particle.gridCell = { col: col_idx, row: row_idx } } removeParticle(particle) { let { col: col_idx, row: row_idx } = particle.gridCell let cell = this.cells[col_idx][row_idx]; let arr_idx = cell.indexOf(particle); cell.splice(arr_idx, 1); } getNeighbors(particle) { let top_left = [ floor((particle.pos.x - particle.radius) / this.cellSize), floor((particle.pos.y - particle.radius) / this.cellSize), ] let bottom_right = [ floor((particle.pos.x + particle.radius) / this.cellSize), floor((particle.pos.y + particle.radius) / this.cellSize), ] let neighbors = [] for (let i = top_left[0]; i <= bottom_right[0]; i++) { for (let j = top_left[1]; j <= bottom_right[1]; j++) { if (i < 0 || j < 0 || i >= this.numCols || j >= this.numRows) continue let c = this.cells[i][j] for(let p of c){ // don't add the particle itself if(p != particle) neighbors.push(p) } } } return neighbors } } ``` Simply drop it into your code and make sure to add the particles to the grid when you create them with `grid.addParticle(particle);`. In the draw loop, while checking for collisions between particles, we then just fetch the neighbors of a particular particle from the grid and pass those as input into the `checkCollision()` function: ``` let neighbors = grid.getNeighbors(p) p.checkCollision(neighbors) ``` Make sure to loop over this array in the *checkCollisions()* function, instead of the global particle array. Lastly we just need to update the grid at the end of every draw loop by removing all particles and adding them back again: ``` for (let p of particles) { grid.removeParticle(p) grid.addParticle(p) } ``` And a complete example goes here: The code here needed to be minified to be able to run in the widget. Feel free to copy it over to your editor of choice and auto-formatting it for readability purposes. ## Soft Body Physics Alright, I think that's enough foreplay for now. Let's get to the main topic: Soft Body Physics! In the most recent post we actually already had a stab at soft body physics when we created a mesh out of particles and springs! In physics a soft body is some type of material that can undergo significant deformations but still retain it's overall structure, just like the mesh that we made: Here's the mesh sketch again, but with all of the improvements that we've covered in the previous sections. There's multiple approaches to creating soft bodies in physics simulations, in our case we're using a mass-spring system; as the name suggest, it makes use of a wireframe of connected particles and springs to model the overall shape of the body. In this way we already have seen a good method for creating rectangular and block-y shapes, simply by arranging the particles in a grid like manner and then connecting each particle with all of it's neighbors using springs. Naturally, the diagonal springs here need to be a bit longer. So, the question now is, how do we arrange the particles and springs to create more organic shapes? Like a deformable blob for instance, that almost behaves like some sort of jelly? There isn't really a straightforward answer to this, because it depends on what kind of material you want to simulate, and how you want your blobs to ultimately behave. In the coming sections we'll first create a class for our blob and then experiment a bit with different configurations. ### The Blob Class It only makes sense to also model our blob as an object. It's two main member variables are arrays that store references to it's constituent particles and springs. Let's start with the constructor: ``` class Blob{ constructor(){ this.particles = [] this.springs = [] } } ``` We'll leave the particles and springs array empty for now and set up a separate function *makeParticlesAndSprings()*, devised specifically for the purpose of populating these later on. We also need two more functions for our blob shape - one to handle the physics, compute collisions and apply the spring forces to the particles: ``` run(){ for(let s of this.springs){ s.update() } for(let p of this.particles){ let neighbors = grid.getNeighbors(p) p.checkCollision(neighbors) p.checkEdges(); p.updateState(); p.limitVelocities() } } ``` And another one to draw the particles and springs to the canvas: ``` display(){ for(let p of this.particles){ p.display() } for(let s of this.springs){ s.display() } } ``` And that's already a big chunk of our blob's functionality. Now we simply need to think about configuring the springs and particles in a meaningful manner. ### Blob Configurations If you've checked out Roni's tweet where he showcases his blob sketch, and went one tweet deeper, you'll have seen a sneak peek behind the scenes where Roni shows what's going on behind the scenes: > Debug view version of the same video: it's all particles and springs [pic.twitter.com/KCXKNvRhLb](https://t.co/KCXKNvRhLb?ref=gorillasun.de) > > — Roni Kaufman (@KaufmanRoni) [June 21, 2022](https://twitter.com/KaufmanRoni/status/1539282929679056898?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Let's observe what's going on here. The blobs in this case are essentially circles, spanning a number of particles around their circumference, connecting each particle with it's previous and next neighbor, as well as the particles one step further. There's also a central particle that is connected to all the other particles on the circumference, seemingly holding everything together. Alright, that's a starting point! Let's try to recreate this - to do so let's add a couple more variables to our blob class: ``` constructor(startPos, radius, detail){ this.startPos = startPos this.radius = radius this.detail = TAU/detail this.particles = [] this.springs = [] } ``` A start position around which we'll center our particles, a radius that determines the size of this circle, and a detail variable, which is simply an integer that specifies the number of particles that we want to place evenly spaced out around on this circle. All three of these are passed in as inputs to the Blob's constructor. Now we'll add the other function that we already mentioned earlier - *makeParticlesAndSprings()* that takes care of placing the particles on the circle: ``` makeParticlesAndSprings(){ for(let a = 0; a < TAU; a+=this.detail){ let x = this.startPos.x + this.radius * cos(a) let y = this.startPos.y + this.radius * sin(a) let p = new Particle( new createVector(x,y) ) this.particles.push(p) grid.addParticle(p) } for(let n = 0; n < this.particles.length; n++){ let p1 = this.particles[n] let p2 = this.particles[(n+1)%this.particles.length] this.springs.push( new Spring(p1, p2, dist(p1.pos.x, p1.pos.y, p2.pos.x, p2.pos.y), .25) ) } particles.push(...this.particles) } ``` Nothing too crazy here, we just compute the coordinates of the particles the standard trigonometric way, converting from polar coordinates to their Cartesian counterparts, which we use to create the particle and add it to the Blob's designated array, as well as the lookup grid. Then in another loop we go over the particles one by one and connect them to their immediate consecutive neighbor with a spring. The rest length of these springs is the distance between the particles' positions on the initial circle. The stiffness parameter can be anything really, here I chose a moderate value of .25\. We add these springs to the blob's *springs* array. And finally we also store references to the blob's particles in the global particle array that we use to check for mouse interactions. Not having added a central particle yet, let's see what this looks like by creating two blobs and drawing them to the canvas: Ah well... pretty poopy. We get two particle chains that promptly collapse into themselves, since there aren't any constraints that push the particles to try and maintain the structure of the initial shape. Let's add the central particle and the springs that connect it to all other particles, as well as another spring connection to neighbors one step further away, just like in Roni's sketch: ``` let centerParticle = new Particle(new createVector(this.startPos.x, this.startPos.y)) this.particles.push(centerParticle) grid.addParticle(centerParticle) for(let p of this.particles){ this.springs.push( new Spring(p, centerParticle, this.radius, .2) ) } ``` And in action this looks as follows: And that's much better already! ## Different Configurations One thing that I didn't like about this blob configuration is that it can fold into what looks like a taco, when the central particle is dragged around too quickly: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/download--66-.png) My blob don't jiggle jiggle, it folds. I don't really like that, and overall these blobs are also not as squishy as I would like them to be, they stay relatively round at any given moment. What if we drop this central particle again, and do it a bit differently - for instance, what if we hide another smaller circle of particles inside of the outer one? That's actually pretty nice, the blobs are much more deformable in this scenario, and kind of try to return to their original shape when they don't collide with anything else. We can also add more springs in between the two particle rings in an attempt to make them less jiggly: That's also not bad. Can we get a similar behaviour without an inner ring of particles? And instead add more springs to the original outer ring making it more rigid? Here we're simply adding springs with increasingly distant neighbors to each particle, but with decreasing stiffness, dividing the stiffness factor with the loop variable. This has the effect that the skin of the blob doesn't fold that drastically anymore at any given point. Now what if we combine both ideas in one: I'm not entirely certain if this is better than the other ideas individually, but *better* here is quite a subjective term since it all depends on what you want to do with these blobs. I'll leave it here, maybe you can come with some cool cofingurations or even completely different approaches to modeling these blobs such that they have new and interesting behaviors. Let me know! ## Closing Thoughts In this post we had a look at soft body blobs, and how to go about making them. Even though it's not an incredibly difficult task from a programming point of view, there's a lot of room for improvement and fine-tuning the particle-spring systems to get interesting behaviors. Furthermore there might more constraints that we can add to our blob shapes to make them behave in a more natural manner, for instance we could enforce them to maintain a consistent volume - however at this point I have no idea how I would go about doing that. Although I'm already exchanging ideas with some folks on the topic! 👀 If there's any particular direction you'd like me to take this in the next installment, let me know in the comments or shoot me a DM over on my socials! **That's it from me, let me know what you thought about this article in the comments 👇 otherwise consider sharing the post with friends and family on your socials, as well as signing up to the newsletter to receive updates whenever there's new content. Cheers, happy coding \~ Gorilla Sun 🌸** ## Sign up for Gorilla Sun A blog about making art with code. Here you can find tutorials and articles on Creative Coding, Generative Art, and Computational Design. Subscribe Email sent! Check your inbox to complete your signup. No spam. Unsubscribe anytime. ### Gorilla Recap 14 URL: https://www.gorillasun.de/blog/gorilla-recap-14/ Last updated: 2023-12-19T23:11:28.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly Gorilla Recap, a newsletter in which I go over everything that I found noteworthy from the past week. Hope you have a good stay!** --- Just to kick things off, and since I've already covered the bird site events a number of times, I feel like it's my duty to report on it again... let's have a look at it, shall we? Very soon, Twitter will be no more. I'm not certain what it will be called, but the antepenultimate letter of the alphabet just doesn't roll off the tongue as nicely as the familiar 'Twitter'. I feel that I'm witnessing the plot-line for a dystopian future: [Twitter is being rebranded as XThe bird site may lose its logo on Monday.![](https://www.theverge.com/icons/android_chrome_512x512.png)The Verge![](https://cdn.vox-cdn.com/thumbor/GH2jjmaWBnbAuEBJv_IaTW2hUGE=/0x0:1600x1600/1200x628/filters:focal(800x800:801x801)/cdn.vox-cdn.com/uploads/chorus_asset/file/24805464/F1x5VdQX0AA9Sgt.jpeg)](https://www.theverge.com/2023/7/23/23804629/twitters-rebrand-to-x-may-actually-be-happening-soon?ref=gorillasun.de) Out of all the previous changes to the bird-site this seems like the worst one yet... I'm not entirely certain if I will continue using *Twitter* if this continues. I genuinely enjoy the interface, especially with how relatively easy it is to post media on the platform. I like it because things are familiar. If there's going to be continuous drastic and erratic changes to the platform I'll probably stop posting on there as much, even though it is an integral part of the blog. A big chunk of traffic on the blog comes from the links that I tweet out, and has been the primary channel of communication for a long time now. Well, only thing that can be done at this point is to wait and see how things will go down. ## Genart Updates ### The Human Shader Project Why learn Shader programming if you can become the Shader? That was the idea behind Inigo Quilez's Human Shader project, where the pixel values of the canvas are computed by means of a distributed human effort. > Hello, I present you with the Human Shader, a project where anybody can participate and help create the first ever human-brain-only powered shader and mathematical image! Please join us and be part of history![https://t.co/Y5uSUpyKNc](https://t.co/Y5uSUpyKNc?ref=gorillasun.de) [pic.twitter.com/QxkWw5gNZF](https://t.co/QxkWw5gNZF?ref=gorillasun.de) > > — inigo quilez (@iquilezles) [July 18, 2023](https://twitter.com/iquilezles/status/1681400126034808833?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Every person that chooses to participate, claims a pixel and then needs to compute the RGB values of that pixel using a worksheet - essentially simulating what the shader would have done for that pixel. Yours truly has claimed the pixel with coordinates (30, 31) - initially making a wrong calculations, leading to a wrong RGB color... correcting it later however. Inigo decided to keep the other errors in however, saying that he found them 'cute'. Keep your eyes peeled for his coming youtube video on the experiment. ### N=12 group show on Feral File 12 generative artists join forces under the guidance and curation of Aaron Penne - the group exhibition N=12 places an emphasis on the "wonderfully silent dialogue" that happens behind the scenes of each piece. > N=12 is now open to view on Feral File! > ✨ Collecting begins July 20 ✨[https://t.co/AD3Y4UHmBT](https://t.co/AD3Y4UHmBT?ref=gorillasun.de) > > I worked with 12 artists across 7 timezones who shared their code and artistic processes for several months, creating generative artworks with a dozen distinct fingerprints [pic.twitter.com/cpKxL06ms5](https://t.co/cpKxL06ms5?ref=gorillasun.de) > > — Aaron Penne (@aaronpenne) [July 13, 2023](https://twitter.com/aaronpenne/status/1679503633099157504?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [You can learn more about the individual pieces and read Aaron's statement on the exhibition page.](https://feralfile.com/exhibitions/featured?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-24-at-11.22.44.png) ### Re—tain - New Genart Platform on Tezos Coming to you from the makers of [Editart.xyz](https://www.editart.xyz/?ref=gorillasun.de) and [diyframe.xyz](https://diyframe.xyz/?ref=gorillasun.de), Piero and Andre Fuchs joined forces with Bruce (aka Studio Yorktown) to bring you a new generative art platform on Tezos. [The main page is already up](https://re-tain.xyz/?ref=gorillasun.de) and accepting submissions for early access - both for artists, and collectors! ![Image](https://pbs.twimg.com/profile_banners/1640299453163741184/1680180921/1500x500) Can't wait to see what the three of them have cooked up! [Go give them a follow on Twitter ](https://twitter.com/re%5Ftain%5Fxyz?ref=gorillasun.de)for their official announcements! ## Interesting Reads ### Demystifying Generative Art My favorite read of the week is by far this analysis by Peter Bauman - instead of trying of making an analysis of the factors that make generative art 'interesting' or 'good', instead we lay the foundations for a framework of analysis that allows us to make such an informed analysis. For instance, the age old question re-emerges: What is more important, the system operating in the background? Or the final output that is ultimately presented to the public? Or are they equally important? Or is it neither, and it's the concept that's the most important aspect of an artwork? The article discusses all of these angles of approach: [Demystifying Generative ArtPeter Bauman (Monk Antony) develops a framework for appreciating and analyzing generative art through an investigation of the movement’s locus of artistic intent.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art Institutiontwo articles![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64b80a26a2fd5b2f287e7e39_Screenshot%202023-07-19%20at%205.06.29%20PM.png)](https://www.lerandom.art/editorial/demystifying-generative-art?ref=gorillasun.de) ### Interview with Piter Pasma If you've been following this newsletter, or are active in the generative art scene in any way, then Piter Pasma probably doesn't need an introduction. Also having played an important part in the N=12 exhibition, and having made ripples in the generative art world with his Universal Ray Hatcher, an interview with Right Click Save is well deserved. The interview goes dives deeper into Piter's beginnings from the demoscene to the early genart days on the Tezos blockchain and hicetnunc: [The Interview | Piter PasmaAs a new group exhibition of the Generative Artists Club marks the start of Feral File 2.0, one of its stars speaks with Alex Estorick![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Piter PasmaAlex Estorick![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64b561ca62105f678539fde6_Screenshot%202023-07-17%20at%2017.43.53.png)](https://www.rightclicksave.com/article/the-interview-piter-pasma-generative-art?ref=gorillasun.de) ### The Story Behind the Source Camille Roux and Matthieu Segret, both prolific generative artists, released their new project *The Source* \- a beautiful piece of generative art that takes a stab at watercolor textures and the creation of colorful patterns. The write-up showcases some behind-the-scenes processes that lead to the creation of the artwork: [The story behind The SourceThe year-long journey: from project kickoff to gm.studio drop![](https://immutablecollective.art/content/images/size/w256h256/2022/04/logo-pink---1000px.png)Immutable CollectiveCamille Roux![](https://immutablecollective.art/content/images/2023/06/GPTempDownload.JPG)](https://immutablecollective.art/writing/the-story-behind-the-source/?ref=gorillasun.de) ![](https://immutablecollective.art/content/images/2023/05/The-Source-0x008753198944811d24dd80e94808dbbe9662530092b9009dc03ceaef1e6a46c5-2.png) ### GUMBO Mathias Isaksen is back with another banger project that's been in the works for quite a while: GUMBO. He details the past 6 months of development in this Twitter thread, sharing WIP images for every step of the progress: > G(u)m(bo)! > > To celebrate tomorrow's launch at [@artblocks\_io](https://twitter.com/artblocks%5Fio?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), I present to you all: The story of Gumbo. Those who have followed the development these last 6 months will probably find most of this very familiar🕵️ starting with the first and most recent Gumbo: [pic.twitter.com/1jNdTpMbvp](https://t.co/1jNdTpMbvp?ref=gorillasun.de) > > — Mathias Isaksen (@st4yhome\_art) [July 18, 2023](https://twitter.com/st4yhome%5Fart/status/1681285139525935105?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### The story behind Mark Knol and the SMOLSKULLs Not a new article, but I recently saw it floating around on Twitter again and since I haven't shared it on here yet, I thought that I might as well. Another very inspirational and insightful peek into the mind of an important persona in the generative art scene - an interview with Mark Knol and the story behind the SMOLSKULLs, one of the earliest hits on FxHash: [fxhash - The story behind Mark Knol and the SMOLSKULLsToday I’d like to share an exciting conversation with Mark Knol. He is one of the most popular artists in the generative art Tezos community, and his Smolskulls can be seen all around this blockchain these days. He has published generative art for a while across multiple platforms - hit et nunc, fxh…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/Qmbv87Xxh8H1VSSHpPvXYMc4y55dEUn4xCUphZV9P5zqLU)](https://www.fxhash.xyz/article/the-story-behind-mark-knol-and-the-smolskulls?ref=gorillasun.de) ### ## Gorilla Articles ### Spring Physics, Particles and Meshes Fourth installment in the physics system series that we started a while ago, this time we have a look at springs and how they can be simulated with code. Spoilers: we're going to be using Hooke's Law. Combining springs and particles we also now have a useful framework for creating dynamic and bouncy meshes: [Spring Physics, Particles and MeshesSprings are an integral concept to physics, fundamental components used in many applications, coming to life with Hooke’s Law from the 17th century. In this post we have a look at how to code and simulate such springs and extend a previous particle system with them.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-23-at-17.11.05.png)](https://www.gorillasun.de/blog/spring-physics-and-connecting-particles-with-springs/) I got some comments already on some further improvements, and directions into which I can take it next. For instance, we could try adapting this to 3D, as well as taking a dive into Verlet Integration, which is an alternative approach to coding a particle system. ### Gorilla Explorer I worked some more on my Portfolio / Project Explorer. Re-implementing it from the ground up with Vue.js. There's still things that I think I can do better, and probably need some shuffling around, but I'm quite happy with the state that it's in right. Also makes me realize that this is the first time that I'll publish an interactive app to the interwebs, hoping for some feedback on it when it goes live: > Update on portfolio viewer (calling it Gorilla Explorer lol) ✨ > > Re-implemented everything from the ground up with Vue.js. Still quite some work left to bring this over the finish line but overall v happy with the progress, but definitely learnt a lot putting this together! 🤓 [pic.twitter.com/aFVfO7nv7O](https://t.co/aFVfO7nv7O?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [July 19, 2023](https://twitter.com/gorillasu/status/1681653700736024578?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also have plans to repurpose it for other things, like a learning tool for instance. ## Gorilla Sketches - A Glimpse into the Core This week I actually found some time to explore some new ideas, and as thing go, ultimately leading to something completely different. You already got a *glimpse* of it in the header image. I present **A Glimpse into the Core!** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/core10.png) It's still a work in progress but I feel like I'm honing on something interesting. This one isn't very technical, but I just wanted to make something fun that looks cool. I went through many ideas in quick succession, you can see some more variations in my recent Twitter posts: > Searching 🔍🧐 [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/WavZtMrWm8](https://t.co/WavZtMrWm8?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [July 21, 2023](https://twitter.com/gorillasu/status/1682330328898125824?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![Image](https://pbs.twimg.com/media/F1pCazwXgAAUgnj?format=jpg&name=large) ## Music for Coding This week I'm including one of my personal favorite bands: Snarky Puppy! At this point, I don't know how many times I've watched/listened to this rendition of their song Lingus - but it still hits all the same every time. I got the chance to see them live in 2018, Cory Henry wasn't with them at the time, but I got to see him a couple months later doing a solo show. But anyway, listen to this astounding piece of music, it will give you good vibes guaranteed: **And that's it from me this week again, hope this caught you up with all genart news of the past week! If you enjoyed it, consider sharing it with followers, friends and family on your socials, that share interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content on the blog. Cheers and happy sketching \~ Gorilla Sun 🌸** ### Spring Physics, Particles and Meshes URL: https://www.gorillasun.de/blog/spring-physics-and-connecting-particles-with-springs/ Last updated: 2023-08-03T12:58:00.000Z **And another installment in the physics system series that I started a couple of weeks ago. I didn't anticipate writing this many posts on the topic, but I kept finding interesting things to extend the system that we've built thus far. In this post we'll have a look at springs: elastic connections with which we can tie together two particles. We'll also revisit a concept that I've covered in the early days of the Gorilla Sun Blog: Hooke's Law! Lastly we'll also have a look at creating dynamic and bouncy meshes with our springs and particles.** --- A couple of days ago I was brainstorming new topics to write about, and my mind circled back to the particle system. I felt like there was a lot more there to unpack. For instance, how could I make the system more interesting? In it's current state the particles have a bit of a sad existence: although they can repel each other, there really isn't much more that they can do. What if we repurpose them and give their existence a new meaning. What if we tried to connect these particles, with a link, or an edge of some sorts? What would that end up looking like? And how would you even code something like that? Now, the particles aren't only impacted by collisions with other particles, but an additional force comes into play, dragging, pulling and pushing it in various ways. The edge itself in this case also has some physical properties: it has a rigidity and an elasticity and needs to be able to exert a force on the particles that it's connected to. I'm making it sound more complicated than it actually is, but that's all of the things that we'll need to consider before we get started. Here's the previous articles to get you up to speed: [Programming a Particle System with ChatGPTYou’ve probably heard about ChatGPT, and you’ve probably heard that it can write code. In this post we’re taking it for a spin and explore a practical example - we’ll make it code a full-fledged particle system from scratch! Let’s see what the best prompts are for this purpose!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-76.png)](https://www.gorillasun.de/blog/programming-a-particle-system-with-chatgpt/) A fun and lighthearted exploration of the capabilities of ChatGPT for creating different kinds of particle systems in P5JS [An Algorithm for Particle Systems with CollisionsIn this post we will program a particle system in p5js from scratch. We’ll mainly dicuss object oriented programming and delve into the necessary physics concepts to compute collisions, all while implementing a full particle simulation with P5JS.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/yayoi3.png)](https://www.gorillasun.de/blog/an-algorithm-for-particle-systems-with-collisions/) Coding a particle system from scratch covering all the necessary concepts from object oriented programming to simulating and coding physics. [Optimizing Particle Systems with a Grid Lookup and Spatial HashingIn this post we have a look at a method with which we can greatly improve a collision detection system. Using a lookup grid we can greatly reduce the number of required checks between particles. We will also look at some methods to optimize this lookup grid.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/circs.png)](https://www.gorillasun.de/blog/particle-system-optimization-grid-lookup-spatial-hashing/) A method for optimizing the previously programmed particle system, allowing us to crank up the number of particles and creating very large systems. And here's what we'll make in this post: You can rerun the sketch a couple of times to see variations, as well as click and drag the particles around the canvas. ## The Particle System so Far Thus far we've put together a neat little object oriented particle system: particles are self-sufficient entities that can move around on the canvas and can detect other particles, colliding and bouncing off of them. Later on, we also added in a grid-lookup which speeds things up significantly, allowing us to draw a relatively large number of these particles to the canvas. To briefly summarize, in the first post, we created the heartpiece of our code: the particle class. It allows us to instantiate several particle objects. This particle class has a number of member variables that describe it's position and movement, where the movement is described by a velocity and acceleration vector. In every iteration of the draw loop we update the position of the particle according to these vectors and simultaneously check for collisions with other particles which can in turn affect the values of these vectors. Furthermore, since we don't necessarily know which particles are currently in the vicinity, we theoretically need to check for a collision against all other particles. This can get quite slow. A smarter way to do this, is by only checking for particles that actually are in the vicinity, and a convenient structure that allows us to do so is a grid (lookup). This grid divides the canvas into several cells, and at any given moment, a particle can only touch upon a few of these cells. Hence we only need to fetch the particles that are also currently in these cells and check for collisions against those. From a bird's eye view, this is already all there is to it. Naturally implementing this is a different beast, which you can learn about in the previously linked posts. ## Springs and Brush Strokes This is a topic that is near and dear to my heart, since it's one of the first things that I studied when I found my way into creative coding, and I've touched upon springs in this previous article from way back when: [Simulating Brush Strokes with Hooke’s Law in P5JS and ProcessingHooke’s Law is generally found in physics and concerns the behaviour of springs, however it can also come in handy for simulating brush strokes programmatically.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-23-at-16.16.56-1.png)](https://www.gorillasun.de/blog/simulating-brush-strokes-with-hookes-law-in-p5js-and-processing/) I came across a sketch on OpenProcessing by a Japanese user going by the name of *Bun.* The sketch revolved around drawing pretty convincing and realistic brush strokes. I thought that this was super cool and dove straight into the code, discovering that there was also an accompanying tutorial for it. Now, the million dollar question is, what do these brush strokes have to do with springs? Well, the brush in this case is actually simulated by means of a spring that's dragged behind the cursor, all while depositing 'ink' on the canvas. The ink in this case simply being many circles that vary in size depending on how fast the brush is being dragged. To simulate this spring we make use of a formula from a dude name Robert Hooke. We'll get into what this formula is about in the next section! ## Hooke's Law So what's Hooke's Law? In the 17th century Robert Hooke formulated a very neat way to represent linear elasticity. It's essentially a principle in physics that describes the relationship between the deformation of a spring (the change of its length) and the forces applied to this spring. It states that the force required to extend, or compress, a spring from it's natural rest length, is directly proportional to the amount of displacement from said rest length. Mathematically this relationship can be expressed with the following formula: \\( F = -k\*x \\) Here, F is the force applied to the spring, k is the spring constant, basically the stiffness parameter, and x is the amount of displacement. Here, the negative sign is required, because the force of the spring counteracts the external force and pushes in the opposite direction. We'll see how this translates to code in just a second. ## Connecting Particles with Springs Let's implement what we've discussed in the previous section, starting off with a spring class that we'll subsequently use to connect two particles: ``` class Spring{ constructor(particleA, particleB, restLength, stiffness){ this.particleA = particleA this.particleB = particleB this.restLength = restLength this.stiffness = stiffness } } ``` The first two member variables of our spring class are self-explanatory, simply references to the two particles that the spring is connecting with each other. To correctly simulate the behavior of a spring, we need to make use of the positional information of the two particles that it's connected to. The other two parameters specify the length of the spring at rest as well as a stiffness factor. The rest length of a spring is the length of the spring when it is in its undeformed, unstretched, or uncompressed state, its the natural length that the spring assumes when there are no external forces applied to it. Generally, springs naturally counteract the external forces exerted on them and try to return to their rest length. The stiffness factor is one such parameter. It determines how strongly the spring counteracts these external forces: the stiffer a spring the more reluctantly it will deviate from it's rest length, and the more force has to be exerted on it to make it deviate from it's rest length. Now, let's see how this works - here's the update function of our spring class, again making use of P5's useful vector class and functions: ``` update() { // 1 let d = p5.Vector.sub(this.particleA.pos, this.particleB.pos) // 2 let dst = d.mag() // 3 var deformAmount = dst - this.restLength; // 4 var restorativeForce = this.stiffness * deformAmount // F = -kx // 5 let f = p5.Vector.mult(p5.Vector.div(d,dst),restorativeForce) // 6 this.particleA.addForce(p5.Vector.mult(f,-1)); this.particleB.addForce(f); } ``` There's a couple of parts to it, let's go over them step by step: 1. We compute the distance between the two particles, simply by subtracting their positional vectors from each other. 2. We turn this quantity into a positive value: we can conveniently use the mag() vector function which computes the following sqrt(d.x . d.x + d.y . d.y). 3. We compute the amount of deformation (extension or compression), by subtracting the distance between the particles from the length of the spring at rest. The sign of this value in this case indicates if the spring is compressed or extended. 4. Hooke's Law: we compute the force that the spring has to exert to counteract the particles pull on the spring, which simply is the stiffness of the spring multiplied by the amount of deformation. 5. Here we compute the force vector that we have to apply to the particles, essentially the force that the spring exerts on these tow particles. This force vector is the normalized distance vector (the direction of the force), scaled by the restorative force given by Hooke's Law. 6. Lastly we apply the force to the particles, for this we'll give the particles an additional function into which we can pass in a vector and apply it to their velocities. Here we also need to invert one of them to point in the opposite direction, simply by multiplying by negative one. The *applyForce()* function looks as follows: ``` addForce(f) { this.velocity.add(f.div(this.mass)); }; ``` Here we also take the mass of the particle into consideration. And that's already pretty much it, here's a complete minimal example (no grid lookup): In P5's setup function we create N particles and then loop over them connecting each two consecutive particles. At the beginning they might be at random positions on the screen, but the springs will swiftly bring them together. ## Damping Factor You might notice that there's an issue here, the particles will simply not stop wiggling around since the spring can never really reach and stay in it's equilibrium position. We can remedy this with a damping factor that we'll add as a new member variable: ``` // at the end of the spring's update function let dampingForce = p5.Vector.mult(p5.Vector.sub(this.particleA.velocity, this.particleB.velocity),this.damping) this.particleA.addForce(p5.Vector.mult(dampingForce,-1)); this.particleB.addForce(dampingForce); ``` We essentially create a force that counteracts the velocity of the two particles. In real life this would happen naturally as there's all sorts of friction that would slow down the particles. Here we need to introduce such a behavior manually, slowly dissipating the oscillations over time. The damping factor should only be a small value here, relative to the stiffness of the springs. Adding in this snippet, we get: And that's a much smoother behavior now. ## Creating a Mesh Now we can take this a bit further and create a full fledged mesh with what we have, simply by wiring up the particles with springs. Let's start simple, and say we have four particles, we'd connect each one of them with all other particles: The diagonal springs need to have a little bit of a longer rest length in comparison to the other springs connecting consecutive particles. Assuming that the springs of all consecutive particles are of the same length, these diagonal springs will be the diagonals of a square, and the formula for their length is the rest length of the shorter springs times the square root of 2\. In our case since the shorter springs have a length of 50, then the diagonals have a length of 50\*sqrt(2), which is slightly more than 70. Naturally we can also form a rectangle or any other rectangular shape, and the system will naturally come to a resting position. Here we assign random rest lengths to the connecting springs: But we don't end up with a pretty square shape like before. Now let's extend this and make a larger mesh. Again, we don't actually need to modify any parts of the particles or spring class, we just need to wire things up in a grid-like manner. All of this is done in the setup function in which we create the particles and springs: ``` N_PARTICLES_X = int(random(2,7)) N_PARTICLES_Y = int(random(2,7)) let xspc = (WID-PAD*2)/N_PARTICLES_X let yspc = (HEI-PAD*2)/N_PARTICLES_Y let particle_grid = [] for(let x = 0; x < N_PARTICLES_X; x++){ let column = [] for(let y = 0; y < N_PARTICLES_Y; y++){ column.push(new Particle(new createVector(PAD+x*xspc, PAD+y*yspc))) } particle_grid.push(column) } for(let x = 0; x < N_PARTICLES_X-1; x++){ for(let y = 0; y < N_PARTICLES_Y-1; y++){ springs.push(new Spring(particle_grid[x][y], particle_grid[x+1][y], 50, .13)); springs.push(new Spring(particle_grid[x][y], particle_grid[x][y+1], 50, .13)); springs.push(new Spring(particle_grid[x][y], particle_grid[x+1][y+1], 50*sqrt(2), .13)); springs.push(new Spring(particle_grid[x][y+1], particle_grid[x+1][y], 50*sqrt(2), .13)); } } for(let y = 0; y < N_PARTICLES_Y-1; y++){ springs.push(new Spring(particle_grid[N_PARTICLES_X-1][y], particle_grid[N_PARTICLES_X-1][y+1], 50, .13)); } for(let x = 0; x < N_PARTICLES_X-1; x++){ springs.push(new Spring(particle_grid[x][N_PARTICLES_Y-1], particle_grid[x+1][N_PARTICLES_Y-1], 50, .13)); } for(let x = 0; x < N_PARTICLES_X; x++){ for(let y = 0; y < N_PARTICLES_Y; y++){ particles.push(particle_grid[x][y]) } } ``` This looks complicated, but it's actually very straightforward. We instantiate the initial positions of the particles in the shape of a grid on the canvas, depending on the number of particles that we want to have vertically and horizontally and store them in a 2D array. Then we loop over this array and wire up the particles, connecting each particle with it's right neighbor, bottom neighbor and the particle to the bottom right of it. The bottom particle is also connected to it's top right neighbor. We do this for all particles except those in the last row and column as they don't have these neighbors. For these we need an extra loop to connect them. Lastly we simply copy over the particles into the simple array that we use to iterate over the particles in the draw loop. We don't need the 2D array anymore. And that's pretty much it, now we can see various types of meshes emerge: I had to minify the code for the snippet to work, but you can simply copy it over into the p5 editor or OpenProcessing and auto-format the code to play with it. ## Mouse-drag for Particles Let's also quickly add in the ability to drag particles with the mouse and see how the meshes behave in that scenario - for this we need two flags and also need to modify p5's inbuilt mouse listeners: ``` function mousePressed() { for (let p of particles) { let distance = dist(mouseX, mouseY, p.pos.x, p.pos.y); if (distance <= p.radius) { dragging = true; dragParticle = p; break; // Stop checking the rest of the particles } } } function mouseDragged() { if (dragging && dragParticle) { dragParticle.pos.x = mouseX; dragParticle.pos.y = mouseY; } } function mouseReleased() { dragging = false; dragParticle = null; } ``` There's probably a better way to do this, but sufficient for now: ## Closing Thoughts It kind of blows my mind that with relatively little such an interesting system emerges. The beauty of emergence: the mesh doesn't really know that it exists, it's simply the particles and springs working in tandem to create this intricate and dynamic structure. I think this is a good point to end this, a next step might be to take this into 3D, or creating more complex mesh-like structures with springs, and combining them with other attractive forces, etc. **As always, I hope you enjoyed this post, I definitely had a lot of fun writing it. If you did, consider sharing it on your socials, or signing up to the newsletter to get updates whenever new content is posted on the blog. It helps a lot! Otherwise, cheers and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Recap 13 URL: https://www.gorillasun.de/blog/gorilla-recap-13/ Last updated: 2023-12-19T23:11:33.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly Gorilla Recap, a newsletter in which I go over everything that I found noteworthy from the past week. Hope you have a good stay!** --- ## Twitter Creator Payout Program Why do I write so much about Twitter on here? Over the past two years twitter has become my main social media outlet, and although it isn't the best platform for organic growth, it's been good for the type of content that I create. Besides that, most creative coding, genart, and tech folks are on Twitter - hence, it is (used to be) a great way to connect with people. These days it seems that I'm having much more meaningful interactions over on Mastodon though. Whereas the bird site finds itself in a constant state of upheaval - hot off the press, we have an announcement regarding a [Creator Ads Revenue Sharing Program](https://twitter.com/Twitter/status/1679572360695824384?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-11.37.09.png)](https://twitter.com/Twitter/status/1679572360695824384?ref=gorillasun.de) Oh btw, I'm so done with Twitter Embeds - for everything that's not a video I'll include a screenshot from now on with a link to the original tweet. In case that the site completely burns down I'll still have the image data. Getting paid for being a creator on Twitter doesn't sound so bad, right? Feels like a step in the right direction. Ah, but hold up, there's a catch - let's have a look at the requirements to be elligible for this revenue sharing program: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-11.46.02.png) Ah, there we have it. You have to pay money to potentially have the chance to make some money from this revenue sharing program. There's some more things about here that aren't immediately evident. For instance, you're not getting for the impressions per se, but rather for ad impressions underneath your tweets. Moreover, only Twitter blue subscribers count towards these ad impressions. If you're familiar with how ad impressions, you'll know that one impression is at most only a couple of cents. This video by Jon Cartwright summarizes this entire fiasco very well: > this site sucks [pic.twitter.com/mCwX6P4h1v](https://t.co/mCwX6P4h1v?ref=gorillasun.de) > > — Jon Cartwright (@JonComms) [July 14, 2023](https://twitter.com/JonComms/status/1679835348250112000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Still, I'm not entirely certain on how things will go with this. Maybe against all odds this will actually work out somehow? Anyway, enough of Twitter now. ## Gorilla Discourse Forum Last week I asked on Twitter if folks would be interested in a forum for the blog. Although there weren't that many votes, the response was overall a bit mixed: > Quick question - would there be interest in a forum section on the blog? For asking questions about code/creative coding/genart related topics? > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [July 13, 2023](https://twitter.com/gorillasu/status/1679451967624556548?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And understandably so, I also have my doubts about the usefulness of such a forum - do we really need another place to discuss code related things? There's already quite a few places where this can be done, my favorite being Raph's birbsnest which is a wonderful little community, then there's like another dozen other discord servers that also revolve around code related things, like the official p5 server, the fxhash server, praystation's server, just to name a few. Why did I think that the forum would be a neat thing to have? Before I looked into how to set up the discourse I came across this post: [✨ Introducing Discourse on Ghost - Reimagining the integration!🚀 I’m thrilled to announce Discourse on Ghost - a powerful (open source) tool that allows you to create a seamless and engaging community experience on your Ghost Publication! Discourse has rich discussion capabilities that allow you to create a truly immersive and interactive community experience…![](https://global.discourse-cdn.com/business4/uploads/ghost2/optimized/2X/f/f381b3b952df5ad42fe691a8b14aa7f0c96c461a_2_180x180.png)Ghost Forumvikaspotluri123![](https://global.discourse-cdn.com/business4/uploads/ghost2/original/2X/8/8d4e1be1543b3ed506f105953a0d062b84797e42.png)](https://forum.ghost.org/t/introducing-discourse-on-ghost-reimagining-the-integration/36844?ref=gorillasun.de) Essentially an integration that provides a single-sign-on SSO solution for Ghost and Discourse, meaning that, if you sign in to the Gorilla Sun Blog you also automatically get logged in to the discourse forum. I think this is really convenient for the user and eliminates the hassle of having to go through a sign up in yet another place. It keeps things in the same space. Now, unfortunately this is not feasible the way that I have Ghost set up, I'm not self-hosting my Ghost blog, hence I can't easily make the required configurations for this. Should I switch over to self-hosting the blog then? Imo the negatives outweigh the positives - for instance I wouldn't know what I'd be doing and I'd probably break a lot of things, and the associated hosting costs would probably end up a bit higher. I'll probably practice it a little bit in the coming weeks and then reassess how I feel - self-hosting at some point in the distant future seems inevitable. Although the SSO solution isn't possible, I did however end up spinning up my own discourse instance on a digital ocean droplet, I got enough free credits to have it up for two months now, so let's see how this goes. [You can find the forum here](https://forum.gorillasun.de/?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-11.15.35.png)](https://forum.gorillasun.de/?ref=gorillasun.de) Sign up a make a post if you feel like it! ## Genart Updates Some updates from the world of genart and creative coding! ### NFT Show Europe IRL highlight of past week was without a doubt the NFT show europe event held in Valencia, I wasn't there physically but I saw that folks had a good time over on Twitter: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-14.11.29.png)](https://twitter.com/loackme%5F/status/1680135379523960832?ref=gorillasun.de) Genart panel at NFT Show Europe in Valencia One really cool thing that caught my attention was [Mekhno](https://twitter.com/mekhno%5Fart?ref=gorillasun.de)'s little live minting setup: an ipad + a mini printer for his project **a reveure!**, check out his profile for some videos of the printer in action: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-14.10.45.png)](https://twitter.com/mekhno%5Fart/status/1679755041521934338?ref=gorillasun.de) Also thanks Mekhno for a spot on the allowlist! Here's my iteration, simple but beautiful: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/a-reveure.png)](https://www.fxhash.xyz/gentk/FX1-73890?ref=gorillasun.de) [a reveure! #46](https://www.fxhash.xyz/gentk/FX1-73890?ref=gorillasun.de) ### Highlight Launch Announcement Another contender enters the arena: Highlight, a new generative art platform on Ethereum. I believe that it'll be open access right from the get go, and having had a sneak peek behind the scenes 👀 I have to say, that I'm really impressed by the interface so far: > The first fully open access generative art platform on Ethereum. > > Launching 7.26 > > 👇 [pic.twitter.com/upLaMWlGPP](https://t.co/upLaMWlGPP?ref=gorillasun.de) > > — Highlight (@Highlight\_xyz) [July 13, 2023](https://twitter.com/Highlight%5Fxyz/status/1679544111714410505?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I'll most likely cover it more detail in the coming days! ### Le Random Chapter 2 of the Genart Timeline We enter the modern era with Le Random's beautiful timeline page, in addition to a number of new articles that are very worth reading: > Catch up over the weekend ⛱️ > > 🔲 [@MonkAntony\_tez](https://twitter.com/MonkAntony%5Ftez?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s Generative Art Timeline: Chapter 2 (The Modern Era)[https://t.co/HC8E5myAf3](https://t.co/HC8E5myAf3?ref=gorillasun.de) > > 🔲 [@speciesofvalue](https://twitter.com/speciesofvalue?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s "Generations of Verse"[https://t.co/YA2mQLxEur](https://t.co/YA2mQLxEur?ref=gorillasun.de) > > 🔲 [@verse\_works](https://twitter.com/verse%5Fworks?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) \+ [@harvey\_rayner](https://twitter.com/harvey%5Frayner?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) \+ Le Random's "A Conversation with Harvey… [pic.twitter.com/OS6miWUhMB](https://t.co/OS6miWUhMB?ref=gorillasun.de) > > — Le Random (@lerandomart) [July 14, 2023](https://twitter.com/lerandomart/status/1679821409705422848?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I particularly enjoyed this post on generative poetry, catching us up on past attempts up to the modern approaches that different artists take: [Generations of VerseElisabeth Sweet touches on the history of generative poetry and its impact to this day.![](https://uploads-ssl.webflow.com/640f56f772eeb36cc6880d91/649ae401f36b063c6f847f38_lr-icon.png)Le Random — A Digital Generative Art Institution![](https://uploads-ssl.webflow.com/6411e594fbd274173bf8c35c/64aee2b33c07c03a6f3b31fd_image1-min.jpg)](https://www.lerandom.art/editorial/generations-of-verse?ref=gorillasun.de) ## Interesting Reads Besides new things I also came across these interesting reads this week. ### How the Slowest Computer Programs Illuminate Math’s Fundamental Limits Came across this article while scrolling through the comments to a hilarious reddit post: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-14.22.03.png) The article talks about "Busy Beavers", and if that doesn't strike a bell, then we're in the same boat. Essentially, busy beavers are maximally inefficient computer programs that are still fully functional and capable of terminating. What's so interesting about these slow programs? Well, it was discovered that these types of programs actually have some connections to some of the open problems in mathematics. One of the most interesting reads I've come across in a while: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-14.27.59.png)](https://www.gorillasun.de/p/8534f8ce-1fdf-4288-be2b-78fda6d60719/) ### Everything you always wanted to know about Mathematics An approachable maths book? Blasphemy! Well Brendan W. Sullivan create such a beautiful book, and from the first couple of pages the book already makes you feel gain new insights: > This maths book is trending on Hacker News! > > I took a quick look and realized how great of a book this is to learn how to think mathematically. > > It's 700 pages long and very approachable compared to other maths books. [https://t.co/Ra2EtO3ET9](https://t.co/Ra2EtO3ET9?ref=gorillasun.de) [pic.twitter.com/geBx0Zccdo](https://t.co/geBx0Zccdo?ref=gorillasun.de) > > — elvis (@omarsar0) [May 25, 2023](https://twitter.com/omarsar0/status/1661733108247580675?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I'm saving this one for some upcoming long train rides. 🔖 ## Gorilla Articles ### A Recursive Circle Packing Algorithm for Organic Growth Some weeks ago, I don't remember exactly how, I came across [a sketch by Kevin Workman](https://happycoding.io/tutorials/p5js/creating-classes/bonsai-tree?ref=gorillasun.de) on his page Happy Coding - [fantastic site btw](https://happycoding.io/?ref=gorillasun.de) you should definitely check it out - in which he creates a mini Bonsai tree with a recursive circle packing procedure. I haven't seen circle packing done in that manner, hence I immediately dug into the code and also made a writeup for it: [A Recursive Circle Packing Algorithm for Organic Growth PatternsIn this post we have a look at a simple algorithmic idea that can produce some very interesting organic looking patterns. At it’s essence it’s a circle packing strategy, but with the added twist that these circles are connected in a tree like structure. 🌳🦠![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/growww.png)](https://www.gorillasun.de/blog/a-recursive-circle-packing-strategy-for-organic-growth-patterns/) Super happy with how the tutorial turned out, the response over on Twitter was stellar. Haven't had a tweet pop off like that in a while: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-17-at-14.45.55.png) ### 3 Generative Artists - Consistency and Momentum In the second post of the week we continue our *3 generative artists* series, we have a look at words of wisdom from Jared Tarbell, Tyler Hobbs and Kwame Bruce aka Studio Yorktown - intermingled with my personal experiences and anecdotes: [3 Generative Artists - Consistency and MomentumPutting in the effort day after day and latching on to those fleeting moments of inspiration can go a long way to set yourself up for success. Advice from accomplished generative artists Jared Tarbell, Tyler Hobbs and Bruce aka Studio Yorktown.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/aa-1.jpg)](https://www.gorillasun.de/blog/3-generative-artists-3-pieces-of-advice/) Which artists would you like to see in the next installment? Leave me a comment! ## Music for Coding Another one of those obscure Japanese 70s funk albums: uber funky bass lines, intricate drum patterns, soaring brass melodies and gnarly electric guitar licks to top it off. It's got it all - maybe not very calming but it works quite effectively for turning on the burners when you're coding on a deadline. **And that's it from me this week again, hope this was a fun read and hope to see you in the next post! If you enjoyed it, consider sharing it with friends and family on your socials that have an interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content, cheers and happy sketching \~ Gorilla Sun 🌸** ### 3 Generative Artists - Consistency and Momentum URL: https://www.gorillasun.de/blog/3-generative-artists-3-pieces-of-advice/ Last updated: 2023-07-16T14:39:48.000Z **In this second installment of the 3 generative artists series, we have a look at another batch of accomplished artists and the pieces of advice that they give to aspiring coders. The overarching theme of this article is *consistency and momentum:* the journey to becoming a better version of yourself is woven in threads of persistency and deliberate effort.** We'll have a look at words of wisdom from Jared Tarbell, Tyler Hobbs and Kwame Bruce aka Studio Yorktown. ## Jared Tarbell - Program Something Every Day The first time I learned about Jared Tarbell's work, was while researching interesting generative algorithms and stumbling across his transcendent [substrate algorithm](http://www.complexification.net/gallery/machines/substrate/?ref=gorillasun.de): ![computational crystal substrate](http://www.complexification.net/gallery/machines/substrate/substratePRN.jpg) A very simple system, that can create intricate, mind boggling patterns. Till today, I think it is one of my favorite computer generated artworks. Jared Tarbell has been at it for decades, arguably pioneering a era of generative art at the start of the 2000s - Jared Tarbell hasn't done many interviews, but this one with Artnome is an insightful window into his character and process: [Interview With Generative Artist Jared Tarbell — ArtnomeAt its best, art is transcendent and sublime. However, few artists can regularly create works that evoke feelings of awe and wonder on that level in its viewers. Even fewer artists have managed to do this by writing code on a computer, a tool which many consider to be at odds with natural beauty, an![](https://images.squarespace-cdn.com/content/v1/59413d96e6f2e1c6837c7ecd/1499608745349-XAAWNTJWTFUP9Q4N1OSG/favicon.ico?format=100w)Jason BaileyArtnome![](http://static1.squarespace.com/static/59413d96e6f2e1c6837c7ecd/t/5f42c2e285783706be3763ce/1598211592345/12647ec4427e16c13b1a19fda327b7f2.jpg?format=1500w)](https://www.artnome.com/news/2020/8/24/interview-with-generative-artist-jared-tarbell?ref=gorillasun.de) > “How do you become a good programmer and create meaningful work?” My advice is always this. Just program something every day, even if it’s something simple. You can just do a little bit every day, even just 15 minutes. I think that this is one of the best pieces of advice that you can give to someone that's just starting out. Slowly getting comfortable with writing code, making it an effortless process. The same way that writing in your native language probably isn't a big challenge. Making foreign symbols and statements become more and more familiar. Soon you'll notice that the difficulty shifts from writing code, to reasoning about underlying problems that you want to solve with code. And not just for beginners; even if you're already a long way down the road, it helps keeping the gears oiled. I remember doing something similar back during uni days. Every time that I'd encounter a difficult piece of code or reading in an assignment, I'd challenge myself to read it every day until the due date. The first couple of times I'd just be as clueless as if I hadn't read it. I don't know what exactly happens in my brain when I do this, new connections get established, neurons getting connected in new ways, some brain patterns getting reinforced. After a few rounds, I'd simply start to understand it a little better, until it'd finally click. That was essentially my strategy for understanding the formula of the vanilla Fourier transform. By the end of it I felt that I had a much deeper understanding of it. It's one of the most fulfilling feelings to me, to understand something after breaking your head over it for several days and weeks at a time. When you find things difficult, you just keep doing them until they're easy. Here's another example. When I started working on the first couple of posts for this blog, it was a massive struggle. From trying to find topics to write about, to doing the research and acquiring the necessary knowledge to then adequately address these topics and somehow produce a relevant and meaningful piece of writing... being a "blogger" seemed like an insurmountable mountain. Painstakingly typing in one word after another into the editor, re-reading whatever I'd written, finding that it was an incoherent mess of word vomit, rewriting everything from scratch several times over, then finally deciding that it was done - for better or for worse - and ultimately hitting that publish button with a mixed bag of self doubt and impostor syndrome. And all of this many times over. I've gotten a lot more comfortable with the entire process at this point. But only because I've subjected myself to the *process* so many times. Behind the scenes, there also lies a big folder of posts, all in various states of completion, that will likely never see the light of day. But it wasn't a waste of time, each single one of them was a meaningful learning experience. And naturally, it's the same when it comes to writing code and sketching. Maybe another way to frame this: it's about becoming comfortable with being uncomfortable. Building a habit, and automating some of the associated mental processes can a go a long way. > You’d be surprised how good of a programmer you are by the end of the first month of doing something like that. Program something every day. Do it. ## Tyler Hobbs - Putting in the Time Sometimes the most daunting thing is sitting your butt down and getting started on that idea that's been living at the back of your mind like a little devil. Pestering you, wanting to be made real. Beside Zach Lieberman, another one of my very first generative art idols was Tyler Hobbs. You probably know Tyler Hobbs as the creator of the pivotal generative blockchain project [Fidenza](https://tylerxhobbs.com/fidenza?ref=gorillasun.de): ![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/1623457826739-RFS8YBP06I1W5WW2CSCG/tyler-hobbs-fidenza-612.png) A piece of writing of his that had a lasting impression on me, was his essay titled Reflections on Five Years of Making Art Through Programming: [Reflections on Five Years of Making Art Through Programming — Tyler HobbsI recently passed the five year anniversary of when I started making generative art. This was also approximately when I decided to get “serious” about making art. It’s hard to take an exact count, but I think I’ve made 600+ generative works at this point. I think I’ve done okay for myself.![](https://images.squarespace-cdn.com/content/v1/5c12933f365f02733c923e4e/82010657-a1a2-4580-9977-db29b2bb340c/favicon.ico)Reflections on Five Years of Making Art Through ProgrammingTyler Hobbs![](http://static1.squarespace.com/static/5c12933f365f02733c923e4e/5c1293aa898583f6dba04dba/5cda214dc83025bdd41e87f6/1655157562477/banner.png?format=1500w)](https://tylerxhobbs.com/essays/2019/reflections-on-five-years-of-making-art-through-programming?ref=gorillasun.de) Every now and then I still find myself coming back to it, especially when I'm frustrated or stuck on some piece of code that doesn't seem to be going anywhere: > What I've been surprised to find is that "ideas" aren't really important. What is important is putting in time at the studio (or at the desk in your bedroom). When I physically make myself sit down and do something, new work comes out. Many years ago I approached art in a completely different way than I do today. At that time I wasn't making any generative art, I was however actively trying to become a better musician. A big part of my daily practice routine back then, and arguably the most enjoyable and rewarding one, was trying to compose a little melodies. It's very similar to daily sketching actually - you come up with and idea and then you try to bring it to life as a visual or audible manifestation. There's a lot of parallels between the two, which is probably why I didn't find creative coding so foreign to begin with. Well, where am I trying to go with this anecdote? Some days I'd come up with a relatively interesting tune *imo*, other days, I simply wasn't able to find that spark that led to an interesting sequence of notes. And on those days, I'd usually beat myself up over it, leaving me with a taste of disappointment for the rest of the day. > I can even start with a premise like "this will be garbage, and I'm okay with that". After two or three rounds of garbage, something neat from the spirit realm happens to appear on my paper or screen and then I know what to work on. At the time, I didn't understand, that the quality of those ideas didn't really matter. What mattered was that I was actively trying to mould my ideas and turn them into reality. Practicing this process and getting better at it. A side effect of this is, that you're also getting the *not-so good* ideas out of the way, making space for new things. It's unreasonable to think that you're gonna make something interesting every time you sit down to create. Ideas don't matter that much. What matters more, is spending time with these ideas, harnessing them, what potential they might hold, discarding them and moving on to other things if they don't work, returning to older garbage ideas, combining them with new garbage ideas and turning them into slightly less garbage ideas. You get the point. And this isn't just about generative art, it's applicable to every passion you have. It's about showing up, and putting in the time. ## Bruce Studio Yorktown - Momentum, a hidden super power [Bruce](https://twitter.com/StudioYorktown?ref=gorillasun.de) has quickly risen to be a household name in the generative art scene, you might know him from his generative blockchain projects Sabler, [Tesseract](https://www.fxhash.xyz/gentk/FX0-707613?ref=gorillasun.de) and more recently [Perpendicular Inhabitation](https://www.fxhash.xyz/generative/24169?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/as3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/asss.png) [Perpendicular Inhabitation](https://www.fxhash.xyz/generative/24169?ref=gorillasun.de) and [Tesseract](https://www.fxhash.xyz/gentk/FX0-707613?ref=gorillasun.de) I really admire his work - not only the stunning outputs, but also the mindset behind them: the unwavering consistency of aesthetic coherency in his work is something I find really fascinating. It's an aspect that I struggle to capture in my own creative work. Bruce often also shares his thoughts on his process, recently he posted this very insightful post: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-15-at-17.41.17.png) I can relate to Bruce's statement a lot. I find that I have moments where ideas are just flowing seamlessly, proliferating and spawning even more ideas. When these moments come, it's important to latch on to them, and not let them go to waste. I found that some of the magic of those moments can be stored in written form in a notebook, but it doesn't hit the same way. Naturally, it helps to put yourself in a position from which it becomes easy to catch these moments of increased inspiration, and make it easy to convert them into meaningful work. I've found that I have a couple spikes throughout the day in which I'll get a lot more done than during the entire rest - and usually the work that I produce during those times is also qualitatively much better. For me, it's that one darned hour in the evening during sunset... and I'll be damned if I don't catch it. Inspiration comes and goes in waves. And when that wave comes, you have to be ready to catch it. ## Concluding Thoughts To summarize all of the above: showing up every day, putting in the hours, and at the same time being mindful about the process is a good way to set yourself up for success. I can personally vouch that these pieces of advice work, be it for generative art, or other creative work, like writing or making music. **If you have thoughts on these topics I'd love to hear them, leave a comment or shoot me a message. Otherwise that's it from me, cheers and happy sketching! If you enjoyed reading this, consider sharing it on your socials or alternatively signing up to the mailing list and receiving updates whenever there's new content \~ Gorilla Sun 🌸** ### A Recursive Circle Packing Algorithm for Organic Growth Patterns URL: https://www.gorillasun.de/blog/a-recursive-circle-packing-strategy-for-organic-growth-patterns/ Last updated: 2026-09-23T21:05:30.000Z Rule based systems are one of the quintessential pillars of generative art, where sets of predefined rules coalesce into a multitude of different patterns and designs. Arguably, the most famous example for this is John Conway's Game of Life, a cellular automaton that gives rise to an infinite number of different patterns, emerging from a simple set of rules. Building and playing with such a system is one of the most satisfying and fulfilling aspects of creative coding - an exploratory approach to coding is encouraged, and code tweaking is rewarded with new, exciting and unexpected results. In this manner the question '*What if?*' becomes the overarching narrative that drives the sketch forward. What if I add this constraint? What if I add another rule here? What if I add a random offset there? You'll only know what you'll get by adding in these rules and running the code. The other day I came across such a rule based system, that immediately sparked a lot of exciting ideas. For a while now, I'd been searching for an algorithm, or a strategy, that could generate organic patterns without being overly complicated. And that's exactly what I stumbled across. --- *All credit here goes to* [*Kevin Workman*](https://happycoding.io/?ref=gorillasun.de) *who came up with the idea for the* [*2021 Genuary prompt *One process grows, another process prunes**](https://genuary2021.github.io/prompts?ref=gorillasun.de). It's a simple concept, but the resulting patterns are really impressive. At it's core it's a type of circle packing procedure, with the added twist that circles are placed in a propagative manner, growing a tree-like structure outwards starting from an initial node. You can find the original implementation on his website Happy Coding, where he's collected many more of his sketches and tutorials - I really recommend checking it out, as it's a treasure box of creative coding and p5js material: [p5.js Example - Bonsai TreeUse recursion to create a digital bonsai tree.![](https://happycoding.io/images/favicon.png)Happy Coding![](https://happycoding.io/tutorials/p5js/creating-classes/images/bonsai-tree-1.png)](https://happycoding.io/tutorials/p5js/creating-classes/bonsai-tree?ref=gorillasun.de) That said, let's first see what this sketch is about and then dive into the nitty-gritty of the implementation! Here's what we're going to put together: ## The Idea The idea is pretty straightforward: starting from an initial node, we place a new node somewhere in it's vicinity, such that the original node becomes a parent node to the newly placed one. Now, both the original node, and the newly placed one have the ability to place further nodes in their vicinity. These nodes can then in turn place new nodes, and so on. Just like a tree that grows new branches, we *grow* a structure of connected nodes outwards populating the space on the canvas The important thing here, is that nodes can only be placed in such a manner that they don't overlap or intersect other nodes that already exist on the canvas. Naturally, we also need to include a stopping criteria, to determine when this system should stop growing; either when the entire canvas has been filled, or when the individual *branches* have reached a certain maximum length. And that's essentially the core idea that powers a large multitude of different patterns - depending on how we end up dialing in the parameters of this system: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/download--58-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/organism.png) Some stylistic explorations For instance, we could set conditions on the size of the circles, such that newly placed nodes need to be smaller than their parent nodes. This would result in a pattern where branches decrease in size as we move outwards. We could also play with the colors of the nodes, such that child nodes inherit a slightly darker shade of their parent node's color. There's a **lot** of room for experimentation! ## Tree Data Structures **How do we approach this idea from an algorithmic point of view?** Well, the resulting patterns don't just resemble *trees*, but they can actually also be represented as trees. Let me explain what that means. Trees are very versatile data structures for a number of different applications: > *In* [*computer science*](https://en.wikipedia.org/wiki/Computer%5Fscience?ref=gorillasun.de)*, a *tree* is a widely used* [*abstract data type*](https://en.wikipedia.org/wiki/Abstract%5Fdata%5Ftype?ref=gorillasun.de) *that represents a hierarchical* [*tree structure*](https://en.wikipedia.org/wiki/Tree%5Fstructure?ref=gorillasun.de) *with a set of connected* [*nodes*](https://en.wikipedia.org/wiki/Node%5F%28computer%5Fscience%29?ref=gorillasun.de)*. Each node in the tree can be connected to many children (depending on the type of tree), but must be connected to exactly one parent,*[*\[1\]*](https://en.wikipedia.org/wiki/Tree%5F%28data%5Fstructure%29?ref=gorillasun.de#cite%5Fnote-Subero%5F2020%5Fp.-1) *except for the root node, which has no parent (i.e., the root node as the top-most node in the tree hierarchy) -* [*Wikipedia*](https://en.wikipedia.org/wiki/Tree%5F%28data%5Fstructure%29?ref=gorillasun.de) This one takes me way back to my undergrad days, when I was still learning about different kinds of data structures - I remember struggling a lot with linked lists initially, when we were tasked with implementing one from scratch in Java. Based on the above explanation, a tree data structure boils down to connecting a number of nodes in a parent-child relationship. In this manner, we don't actually have to explicitly define this tree, nor does it exist as a tangible entity in our code, but rather, it emerges through a bunch of connected nodes. This will hopefully become clearer in the coming sections. The best way to approach this, is in an object oriented manner, in which we create an abstract Node class that can store a reference to it's parent node, as well as an array of references to it's child nodes. A tree is actually a special kind of graph structure, where nodes can only ever have one parent node. Otherwise it would be a completely different beast. Armed with this node class, we can then create as many instances as we want and wire them up in a tree like structure. That way we can store their individual positions and sizes, but more importantly give them useful functionality to draw them to the canvas and allow them to spawn their own child nodes. ## A Recursive Placement Procedure To grow our tree, we could simply store all nodes in a separate array, pick a node at random from that array, and then try to append a new child node to the selected one. If it's not possible to do so, we simply try another random node and so on. But this isn't that efficient, because once the tree grows larger, most of the nodes that lie somewhere towards the center, would already be surrounded by other nodes. Hence there wouldn't be much point in trying to attach new nodes to them, since there's no space anyway. A better strategy for growing our tree, is the way that Kevin did it in his original implementation. Instead of trying to grow random nodes in the scene, we'll try to grow the root node (growing here means attaching another node), if this fails (due to lack of space), we pick one of it's already existing children (if it has any), and try to grow this child node instead. If that fails, we pick a child of that child node and repeat the procedure. In this manner, we're iteratively traveling down a *branch* of the tree. This can be done very elegantly in a recursive manner, such that we always end up traveling outwards towards the outermost child nodes. I believe that this way the tree grows in a much even manner. This recursive procedure can be split into two distinct functions, one that creates a child node and attempts to place it, and another one that takes care of the traversal and calling the recursive step when the placement fails. In the placement function we have to compute a number of things: an angle, a distance value and a size parameter, to determine where the node should be placed with respect to it's parent node. We also need to check for collisions between the to-be-placed node and already existing nodes. There are a couple of things that we also have to consider here. For instance, as the tree grows larger, the number of checks that we have to make will grow exponentially. This can get really slow at some point. For aesthetic reasons, we also don't want nodes to intersect the edges that connect already existing nodes on the canvas, which requires an additional separate check. We'll talk more about this in a bit. ## The Algorithm Alright, now we can get to work and implement this algorithm! ### The Node Class Let's begin with the Node class that constitutes the heart piece of our sketch. ``` class Node(parentNode, position, radius, depth){ constructor(){ this.parentNode = parentNode this.childrenNodes = [] this.position = position // of the form {x: x, y: y} this.radius = radius this.depth = depth this.id = idCounter++ } } ``` Let's see what we have got here. Each node stores a reference to it's parent node, holds an array of children nodes - which will create later on - as well as information about it's position and size. There's two additional parameters here, a depth variable that tracks how far down we are in the tree - we'll use it to check if we've reached a certain depth, in the case that we want to limit the maximum length of the branches. Furthermore, we also give the node an id via a global counter that gets incremented whenever a new node is created. This one we'll use during collision checks to conveniently avoid checking a node against itself. Another function that we can also already cover here, is the function that draws the node to the canvas: ``` this.display = function(){ if(this.parentNode != null){ line(this.position.x, this.position.y, this.parentNode.position.x, this.parentNode.position.y) } ellipse(this.position.x, this.position.y, this.radius) } ``` It's simply an ellipse, in addition to a line that goes from the center of the current node to the center of it's parent node. Naturally for the root node this isn't possible as it doesn't have a parent node, hence we need to check for that with an if statement. ### The Recursive Procedure Now to the meat of the sketch. As mentioned earlier, we'll implement the recursive step in two parts: a function that can create new nodes and tries to place them, and another one that repeats the placement process for an already existing child node if the prior function fails. Let's start with the latter: ``` this.grow = function(){ let canGrow = this.attemptGrowth() if(!canGrow){ let randChild = random(this.childrenNodes) if(randChild){ randChild.grow() } } } ``` Basically, we have another function called attemptGrowth() - we'll have a look at it in just a second - which returns a boolean value, indicating if a child node has been appended or not. If the result is truth-y, then we simply terminate. If the contrary is true however, then we select an already existing child node from the array of child nodes of the current node (if there are any) and call revursively repeat this procedure for the selected node. The code of the placement function attemptGrowth() looks as follows: ``` this.attemptGrowth = function(){ if(this.depth>0){ let angleFromParent = random(TAU) let distFromParent = random(minBranchLength, maxBranchLength) let childSize = constrain(this.radius*random(.8,.95), 2, 70) let childPosition = { x: this.position.x + distFromParent * cos(angleFromParent), y: this.position.y + distFromParent * sin(angleFromParent) } let child = new makeNode(this, childPosition, childSize, this.depth-1) // check for intersections here let placeable = true for(let n = 0; n < allNodes.length; n++){ if( child.intersects(allNodes[n]) || this.boundaryCheck() ){ placeable = false return false } } // attach the new node // and append to if(placeable){ allNodes.push(child) this.childrenNodes.push(child) return true } } } ``` There's a few things here that we need to address. Firstly we want to compute some values that indicate how the node, that is-to-be-placed, should be placed. We do this by calculating an angle and a distance value, convert from polar coordinates to Cartesian coordinates, and then store them. After selecting a radius for the child node, we can create a new node object with these parameters. In the implementation by Kevin, the procedure for checking for intersections is also done in a recursive manner. But here I'm cheating a little bit and using a loop. Whenever we attach a new node, we'll actually also store a reference to it in a separate array, such that we can conveniently loop over this array and check for collisions. This comes at the cost of using more memory, but has the advantage that it allows the existence of multiple root nodes, if we want to have multiple trees in the scene that we don't want to overlap. We can still do it in a recursive manner later, by storing references to the root nodes. To check for collisions between nodes we simply check if the distance between their centers is less than the sum of their radii. Circle collisions are the easiest type of collision to compute. Overall, this strategy is quite flexible, later on we can try to do it a bit differently, for instance, we could try to attach new child nodes at the extremities first and then travel backwards instead of attaching nodes at the first possible occasion close to the center. ### A preliminary example Let's take what we've got so far and put it all together: In p5's setup function we're creating a single node which we'll use as the initial root/source node. We'll set it's parent to null, since it's not attached to any other node yet. In the draw function we now simply need to invoke the grow() function of the source node, and the magic procedure that we describe earlier will start placing nodes, growing our first tree like structure. ## Node / Edge Collision There's a couple of things in the above sketch that I think we can improve on; for instance I don't like that circles can overlap the edges that exist between some of the nodes. For this we'd have to compute collisions between circles and line segments. However, since we don't have to actually determine the points of intersection between the node circles and the edge segments, we can simplify this and compute the point distance of the center of the node to the edge segment, which I believe is computationally slightly simpler and less taxing. I'm not going to go cover the math here and just show you how it's done. We recur to this trusty old [resource by the legend Paul Bourke](http://paulbourke.net/geometry/pointlineplane/?ref=gorillasun.de), who's probably documented every type of intersection in existence: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-14-at-20.50.31.png) An implementation for it can be found in [this stackoverflow answer](https://stackoverflow.com/a/1501725?ref=gorillasun.de): ``` function dist2(v, w) { return sq(v.x - w.x) + sq(v.y - w.y) } function distToSegmentSquared(node, edge) { p = node.position v = edge.p1 w = edge.p2 var l2 = dist2(v, w); if (l2 == 0) return dist2(p, v); var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; t = Math.max(0, Math.min(1, t)); return dist2(p, { x: v.x + t * (w.x - v.x), y: v.y + t * (w.y - v.y) }); } function nodeEdgeCollision(p, v, w) { return sqrt(distToSegmentSquared(p, v, w))} ``` And integrate into our sketch we'd get: Basically, whenever we create a new child node, we also create an edge object represented by it's starting and end point (the center of the current node and it's parent) of the form \`{ p1: {x: x, y: y}, p2: {x: x, y: y} }\` and store it in a separate global array called edges. While trying to attach a new node to the tree, we can loop over this array and check if this new node intersects any of the existing edges - just like we check for intersections with other nodes. ## Edge / Edge Intersection Now if you run this sketch a couple of times, you'll notice that there's still another issue. It's a bit subjective, but I also don't particularly like it when edges cross each other. To avoid this we'd need an additional line segment intersection test, a function that accomplishes this can be found in [this stackoverflow answer](https://stackoverflow.com/questions/9043805/test-if-two-lines-intersect-javascript-function?ref=gorillasun.de): ``` // returns true if the line from (a,b)->(c,d) intersects with (p,q)->(r,s) function edgeIntersect(edge1, edge2) { let [a,b] = [edge1.p1.x, edge1.p1.y] let [c,d] = [edge1.p2.x, edge1.p2.y] let [p,q] = [edge2.p1.x, edge2.p1.y] let [r,s] = [edge2.p2.x, edge2.p2.y] var det, gamma, lambda; det = (c - a) * (s - q) - (r - p) * (d - b); if (det === 0) { return false; } else { lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; return (0 < lambda && lambda < 1) && (0 < gamma && gamma < 1); } }; ``` And in action: Now we have much more control over the resulting pattern. When it comes to performance, this isn't quite that efficient, since we need to go over all other nodes and edges whenever we place a new node. A solution for reducing the number of necessary checks by implementing a grid lookup, I've covered how this works in this article: [Optimizing Particle Systems with a Grid Lookup and Spatial HashingIn this post we have a look at a method with which we can greatly improve a collision detection system. Using a lookup grid we can greatly reduce the number of required checks between particles. We will also look at some methods to optimize this lookup grid.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/circs.png)](https://www.gorillasun.de/blog/particle-system-optimization-grid-lookup-spatial-hashing/) If you want to challenge yourself and implement it with this sketch, go for it! I'll cover this in a second post, as this one is already getting quite lengthy. ## Concluding Thoughts For the final code I added in a loop in the setup function to place a number of initial nodes such that they don't overlap: So overall, besides being a really cool algorithm I also noticed that it's a much faster strategy for circle packing. You don't necessarily have to draw the connections between the circles, nor do you have to make the circles shrink the further you travel from the root node - and I think you'd get something that is visually very close to a regular circle packing algorithm. I think that way it's also a bit faster, because instead of trying random positions on the canvas - which are slowly populated by circles - we're actually trying to place circles in places where there potentially is free space. Starting the recursive procedure from the child nodes - backwards - towards the root could also potentially be an interesting exploration. **There's more things in Kevin's code that I didn't cover here, for instance, there's the ability to prune a branch, which I find visually really cool. I'll cover that in the next post hopefully. That said, this one's a wrap. Big shout-out to Kevin and his lovely website! Cheers, happy sketching, and if you enjoyed this post consider sharing it on your socials \~ Gorilla Sun 🌸** ### Gorilla Recap 12 URL: https://www.gorillasun.de/blog/gorilla-recap-12/ Last updated: 2023-12-19T23:11:40.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly Gorilla Recap, a newsletter in which I recap everything that I found noteworthy from the past week. Hope you have a good stay!** --- This week we start with a bang - humbled to share that my entry for the Web3Writers contest was selected for the first prize! > 🏆 Congratulations to our competition [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) winners! 🎉🚀 > > 🥇 First Place: [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > 🥈 Second Place: [@\_stc](https://twitter.com/%5Fstc?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > 🥉 Third Place: [@sriceart](https://twitter.com/sriceart?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Thank you for sharing your knowledge and passion. You're all stars! Keep up the great work![#Web3Writers](https://twitter.com/hashtag/Web3Writers?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Articles in comments 👇 [pic.twitter.com/DygC7DZ7YF](https://t.co/DygC7DZ7YF?ref=gorillasun.de) > > — Temple Wallet (@TempleWallet) [July 10, 2023](https://twitter.com/TempleWallet/status/1678446609544224770?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Congrats also to Agoston Nagy and Srice for their brilliant articles! ## Twitter more Volatile than Ever In light of the recent erratic changes on Twitter, that seem to be completely at the whims of Elon's spurs of the moment, there seems to be a second surge of migrations from Twitter to other platforms. Especially with Meta's new threads app slowly rolling out. I would have liked to give it a try at this point, but unfortunately it isn't available in the EU region yet due to data privacy regulations. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-11-at-13.41.17.png) But it seems that an astounding number of people have already joined the new platform: [Instagram’s Threads surpasses 100 million usersBut will the users stick around?![](https://www.theverge.com/icons/android_chrome_512x512.png)The VergeJay Peters and Jon Porter![](https://cdn.vox-cdn.com/thumbor/gxb8H-BEvx3Ws1bMzj9boMhNmb8=/0x0:2040x1360/1200x628/filters:focal(1020x680:1021x681)/cdn.vox-cdn.com/uploads/chorus_asset/file/24774109/STK156_Instagram_threads_2.jpg)](https://www.theverge.com/2023/7/10/23787453/meta-instagram-threads-100-million-users-milestone?ref=gorillasun.de) Meanwhile, I make my return to the pachyderm. The only reason that I stopped posting on Mastodon in recent months, as well as other platforms despite my best efforts sometimes, is because it's just a lot of work. Each platform has some different posting and formatting guidelines which can be a bit time consuming. Besides that, I would really love to see the actual cage fight between Elon and Zuckerberg, simply because it would be unreal. Seeing how Zuckerberg works out, all of my money is on him: [Mark Zuckerberg is ready to fight Elon Musk in a cage matchThe ball is now in Musk’s court.![](https://www.theverge.com/icons/android_chrome_512x512.png)The Verge![](https://cdn.vox-cdn.com/thumbor/dykMrzvhezn33MZ09QuzuPgn3iI=/0x0:1440x1440/1200x628/filters:focal(619x499:620x500)/cdn.vox-cdn.com/uploads/chorus_asset/file/24742194/350457055_218583294315389_8997521909640967870_n.jpg)](https://www.theverge.com/2023/6/21/23769263/mark-zuckerberg-elon-musk-fight-cage-match-worldstar?ref=gorillasun.de) Is this the end of Twitter? Will Zuckerberg figuratively, and literally, deliver the knockout punch? ## Genart Updates And yet again, there's been many new things in the world of generative art! ### P5 frameBuffer Released I've seen Dave mention this a couple of times already, and he has previously also created a [framebuffer library](https://www.davepagurek.com/programming/p5-framebuffer/?ref=gorillasun.de) specifically for this purpose - but now it's finally part of P5, which is wonderful news. Once I give it a try I'll definitely make a post about it: > p5 now includes support for framebuffers! If you use WebGL mode, this is like a more efficient createGraphics (this sketch [https://t.co/VcgV7cI79j](https://t.co/VcgV7cI79j?ref=gorillasun.de) uses 120 of them and runs decently on a phone!) and also lets you access 3D depth info. Stay tuned for tutorials and resources! 👀 [https://t.co/xcwsEH9hDL](https://t.co/xcwsEH9hDL?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [July 11, 2023](https://twitter.com/davepvm/status/1678604404730249216?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### 1988 Interview with Sonya Rapoport Sonya Rapoport didn't directly make art with computers but rather used computer printed documents as an artistic medium, she states: > \[... \]my work is an aesthetic response triggered by scientific data. The format is computer print-out, a ritualistic symbol of our technological society. Mark Webster points out this interesting interview with her from 1988 in which she's asked about computer art, her thoughts on it and how it will be regarded in the future: > Sonya Rapoport | 1988 Interview[https://t.co/4hfuz5rIwc](https://t.co/4hfuz5rIwc?ref=gorillasun.de) > I particularly like her take on the future of computer art. [pic.twitter.com/sTdQd3CZwG](https://t.co/sTdQd3CZwG?ref=gorillasun.de) > > — mark webster 🪸 (@motiondesign\_01) [July 6, 2023](https://twitter.com/motiondesign%5F01/status/1676886801229783040?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) More of her work can be seen here: [Computer Printout Drawings – Sonya Rapoport Legacy Trust![](http://www.sonyarapoport.org/wp-content/uploads/2015/11/icon.png)![](https://i0.wp.com/www.sonyarapoport.org/wp-content/uploads/2018/05/Sonya_Rapoport_Kludge20.jpg?resize=20%2C20&ssl=1)](https://www.sonyarapoport.org/project-type/early-computer-paper/?ref=gorillasun.de) Excerpt: In early 1976, artist Sonya Rapoport chanced on a box of discarded computer printouts in the basement of the UC Berkeley Math Department, a find which eventually led to her reinvention as a digital artist. ### FxHackathon workshops resumes Two new workshops were held over on the FxHash discord! '**Creative inputs as parametric space**' lead by Alejandro, creator of the innovative piece Pensado a Mano, and '**Concept Development. How to Tell a Story**' by Anika Meier. They will soon be available on the FxHackathon page, here: [fxhash — fxhackathon 2023: co-creation interfaces onboardingBuilding custom minting interfaces with fx(params)![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://www.fxhash.xyz/images/og/og1.jpg)](https://www.fxhash.xyz/events/fxhackathon-2023:-co-creation-interfaces/onboarding?ref=gorillasun.de) If you feel inclined to participate in the hackathon, you can also find all important information over on that page. ## Interesting Reads of the Week ### Lessons from the Catastrophic Failure of the Metaverse It's hilarious that Meta thought this was a good idea, and I'm not sure if Meta actually knew what they were building. What's the actual use-case? It just seemed like an arbitrary mish-mash of VR spaces that you could visit. There was no appeal and no interest and that was reflected in the number of users. The Nation paints a good picture of how things went down: [Lessons From the Catastrophic Failure of the MetaverseDid the “creative class” learn anything from buying into a product that was obviously destined to flop?![](https://www.thenation.com/wp-content/uploads/2020/09/n-logo.png)The NationKate Wagner![](https://www.thenation.com/wp-content/uploads/2023/07/metaverse-146KB-getty.jpg)](https://www.thenation.com/article/culture/metaverse-zuckerberg-pr-hype/?ref=gorillasun.de) ### Harvey Reiners Quasi Dragon Studies Harvey Reiner's quasi dragon studies is one of the most interesting generative art projects that makes use of blockchain tech to create something really unique. Essentially, individual iterations of his token don't just exist as unique iterations by themselves, but rather, they can be combined into larger pieces. He goes into the details of this in the write-up: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-11-at-13.27.56.png)](https://medium.com/@harvey.rayner/quasi-dragon-studies-a-composite-generative-art-series-and-experimental-model-for-web3-community-1eea74a9deeb?ref=gorillasun.de) ### An Interview with Richard Bourne Mentioned this one already in previous issues, but now the full conversation is up on the tubes: It was really invigorating seeing Richard talk about his sketching practice, his excitement about OpenProcessing as a platform, and how it's a way for him to live out this passion. It definitely left a mark on me. ### A different kind of indie mobile game I'm not entirely certain under which category to place this, but I found this really cool and inspiring. I have a sweet spot for minimalist video games with a creative take on a simple concept - and this trailer just hit the sweet spot. > I have secretly been working on a twisty mobile platformer, which will be releasing later... this month. Anyone likes circles? ⚪️v⚪️ [pic.twitter.com/eFKqrcApPX](https://t.co/eFKqrcApPX?ref=gorillasun.de) > > — Nicolai (@nicolaigd) [July 5, 2023](https://twitter.com/nicolaigd/status/1676694689288794113?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## AI Corner ### Chat GPT releases it's Code Interpreter ChatGPT Plus users get access to a new powerful feature: the Code Interpreter. It's basically a tool dedicated to executing code based off of prompts, for instance, you can drop in an excel sheet with some data, and ask it questions about this data. It'll then create the code to compute and provide answers to your questions. But that's just one example, it has many more use, for example data visualization as well as image processing cases and [this article provides a nice run-down](https://levelup.gitconnected.com/the-magical-chatgpt-code-interpreter-plugin-your-personal-programmer-and-data-analyst-f8cd69e8323b?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-11-at-14.18.35.png)](https://levelup.gitconnected.com/the-magical-chatgpt-code-interpreter-plugin-your-personal-programmer-and-data-analyst-f8cd69e8323b?ref=gorillasun.de) I'm most likely going to check it out and have a post up about it as well. ## Gorilla Articles Last week I took a little vacation to rest, recharge and also reduce my social media usage a little bit - and I feel incredibly replenished, and excited to get resume work on some articles that are in currently the pipeline! Even though I took a breather I did work on a post that I think came together really well: an introduction to the Vue framework! [An Introduction to VueVue is an excellent framework for creating intricate and reactive user interfaces, while maintaining a manageable code base. In this article we cover the core concepts and build a minimal app to showcase Vue’s features.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Brown-Modern-Minimalist-Simple-Blog-Post-LinkedIn-Sponsored-Content.png)](https://www.gorillasun.de/blog/an-introduction-to-vue/) In past issues of the Gorilla Recap I've already mentioned that I had been working on a little tool that will serve as a personal portfolio, and after asking some of the folks over on the birbsnest discord for advice I was pointed towards Vue as being a good solution for this purpose. And after getting into it, it definitely made the code much easier to manage. That's why I didn't want to lose any time and put together a little introductory guide that summarizes all that I have learned so far. In the post I go over Vue's component based architecture and how the framework makes it easy to put together an intricate interface. ## Gorilla Sketches I only did a little sketching this week, but had an idea of combining hexagonal tilings with hachure patterns - something I haven't tried before. Additionally I wanted to see what it would look like if I filled the space in between the hachures with colors in a gradient like manner, I think there's something worth exploring here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/hexagpon.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/haxdronn.jpg) Not sure where this one is going yet, but it's an interesting exploration. Besides that I also tried my hand at a skeuomorphic landscape sketch, which still needs some more work before I'll post more about it, but I'll give a sneak-peek here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/landscape.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/groups.jpg) Generative landscapes, made out of thousands of tiny lines. Hope to get in a lot of sketching this week though - and that said, I leave with these beautiful words from Bruce: > To dance with creativity means hearing whispers of self-doubt and self-criticism. It is a rhythm, a flow, often an end-step in the act of creation. In this tango, missteps become growth, while stumbles turn into lessons. A reminder always, to be kind to ourselves and the process. > > — Bruce @ Studio Yorktown (@StudioYorktown) [July 11, 2023](https://twitter.com/StudioYorktown/status/1678667896296288258?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Music for Coding Tycho released a new single! And it absolutely slaps! Literally! It's a bit different from his previous stuff, but in a really good and funky way. Give it a listen: **And that's it from me this week again, hope this was a fun read and hope to see you in the next post! If you enjoyed it, consider sharing it with friends and family on your socials that have an interest in this nerdy stuff. Otherwise, consider signing up to get notified whenever there's new content, cheers and happy sketching \~ Gorilla Sun 🌸** ### An Introduction to Vue URL: https://www.gorillasun.de/blog/an-introduction-to-vue/ Last updated: 2023-07-10T19:18:15.000Z **In the past two weeks I invested a considerable amount of time on learning the Vue Javascript framework. This post is to document what I've learned so far, and to provide a gentle and approachable introduction to the framework for those interested in learning it as well.** Although I'm still far from mastering it I believe that I now have a good enough grasp of the core concepts that make Vue an excellent framework for creating involved user interfaces. This article is therefore split into two parts - firstly, an explanation of Vue is from a theoretical point of view, followed by a gentle introductory example in which we'll build a simple app to highlight some of Vue's features and how they work together. The only requirements to follow along with this post are some familiarity with HTML and JS, and how they work together to create the behavior behind webpages. ## What is Vue Vue is a Javascript framework aimed at simplifying the creation of user complex interfaces. When doing things with vanilla JS things can often quickly get out of hand, and you'll end up with bloated code that is not maintainable. How many times to you need to fetch something by it's DOM id when you simply want to update a value displayed on your page? Well, no more, because Vue is intended to be the silver bullet to this imperative manner of doing things. Vue takes a declarative approach to doing things. This means, that instead of manipulating the DOM directly, we actually just tell Vue what we want to do, and it takes care of the logic for us. Vue is also reactive, and will take care of passing around values between different elements in our interface, depending on how we wire things up. This sounds too good to be true, however, this way of writing code comes with it's own set of challenges. For me personally, I found it a bit tricky to get used to writing code in that manner, but once you get the hang of it, it should be a walk in the park. I don't want to waste too much time telling you *what* Vue is, and would much rather *show* you what Vue is. How it works, and how it improves on implementing things with vanilla JS. You'll understand what Vue is along the way. ### Good ol' Imperative Javascript Let's say we want to make a very simple single page web app: a single button that tracks how many times it's been clicked. How would we do this with vanilla Javascript? Here's what this would look like: Count is: 0 Let's start with the minimal html: ```

``` And the Javascript would be: ``` document.addEventListener('DOMContentLoaded', function() { var count = 0; var countBtn = document.getElementById('countBtn'); var countDisplay = document.getElementById('countDisplay'); countBtn.addEventListener('click', function() { count++; countDisplay.textContent = count; }); }); ``` Luckily there's event listeners in Javascript that allow us to create this behaviour. Here we simply fetch the button element by it's id from the DOM, after the DOM has loaded, and then attach the event listener to it such that it's triggered when the button is clicked. When this happens the variable counter is incremented, and is assigned to the textContent of the button variable. Hmmm, okay... that works, but there's a few things that we need to address. That's already quite a lot of code for something very basic, that doesn't even do much. Besides, we also have our HTML and Javascript in two separate places: which means, if we were to make a change to one of the two, we'd also have to update the html/javascript counter piece. The more complex the interface, the longer the code, the more tedious making changes will become. Let's try to recreate this exact example with Vue and see how the framework streamlines the creation of interactive elements in the page. After considering a couple of different examples, for instance a login form, I decided on borrowing this example from [vuejs.org](https://vuejs.org/guide/introduction.html?ref=gorillasun.de#what-is-vue), with some modifications. It's simply the shortest and most digestible example to give a preliminary showcase of vue. ### On the order of things The biggest challenge of writing this article was deciding on the ordering of how to present the different vue concepts. Vue features are quite intertwined, hence as a beginner it's tricky to immediately get a complete picture of things when you get exposed to a chunk of foreign code right off the bat. We'll try to do things in an incremental and hands on manner. It's also important to note here that there's multiple different syntactical ways to putting together the code for a vue app - I'll try to stick to the most straighforward manner of doing things, the one that 'clicks' for me at least. Also noteworthy here - we'll be working with Vue 3, which works quite a bit differently from Vue 2\. I'm not certain however if these differences matter at a beginner level however. ## Vue Components Ok, enough foreplay - let's get straight into it. In this second part we'll create our first vue app from scratch, using the previous vanilla javascript example as a starting point. The main ingredient of creating vue apps are *components* \- you can think of them as individual building blocks that allow us to create the different parts of a complex UI. These *components* usually represent the individual elements in our web page's DOM. Moreover, vue components are reusable and self-contained units of code that encapsulate the functionality, structure, and styling of specific parts of a user interface. Organizing these components in a parent-child-like relationship, allows us to model intricate interactions between different parts of the interface and have them communicate with each other in a meaningful manner. For instance, several smaller components can make up more complex, larger components. The two main advantages of this modular approach are, firstly, a reactive UI where data and functionality is encapsulated within the different individual components, and secondly, an underlying codebase that isn't an atrocious spaghetti mess, but rather something that is much more manageable - in contrast to the vanilla js approach where things can get hairy really quickly. Both of there advantages stem from vue's declarative manner of doing things. What this means, will become clearer throughout the coming sections. Even though Vue is one of the easier frameworks to learn, it still has some concepts that require a little bit of getting used to. At some points it might seem like it's its own programming language. Let me show you the ropes now, and it shouldn't be too difficult to get a grasp of what such a component operates. ### Our first vue app Creating a vue app boils down to three lines of code: 1. Making an HTML container that will serve as a container for our vue app `
` 2. Creating the app in a script tag/file `let app = Vue.createApp({});` 3. Mounting the vue app that we just created into it's designated container `app.mount('#app')` With this knowledge let's recreate our clicker counter with vue. This time the actual HTML in the body of our page will be much simpler - actually, we're going to leave it empty for now; there's a better way to create the HTML button with Vue. Besides the container into which we'll mount our app, we also need a script tag where we'll place all of our Vue code: ```
``` And the Vue code to create the app: ``` let app = Vue.createApp({}) app.mount('#app') ``` The mount() function simply attaches the Vue app to the DOM such that it renders when we access the page. Okay, in the next sections we can actually start writing some Vue code! ### Root component and Vue Template Syntax How do we create our HTML button now? As you might have noticed, the createApp() function actually takes an input parameter. Here we simply passed in an empty object, but in reality this is the root component of our Vue app, that serves as the top level component and entry point of the entire application. In what follows, we'll see that Vue components are mainly modeled as JS objects, that encapsulate certain, Vue specific, options (object properties basically) that define these components' appearance and functionality. In this case passing in an empty object didn't introduce any appearance nor functionality. So nothing will actually render yet. We'll also get acquainted with a few of these options in the coming sections. At the very top of these component objects you'll most often see a property called *template*, which will contain a string consisting of HTML code that represents the corresponding DOM element of a particular component. It's essentially a blueprint for the component's HTML that will be rendered into the DOM where we place the component. For instance, in our case: ``` vue.createApp({ template: ` ` ` }) ``` Now this would actually render the template option of our root component into the div with the id *app*. What's important to note here is that we generally use backticks to define this template string, as HTML itself sometimes contains single and double quotes. For example, if we assign a class or id to as tag attributes. While using backticks we don't have to worry about escaping these symbols. The backticks also come in handy, because we'll be using some of Vue's template specific statements. These can be used to inject values or functionality into our template string. Another thing worth mentioning here, is that this template code can be encapsulated as a separate file called SFC, short for Single File Component. This becomes useful when the template code becomes lengthy. In that case, for clarity's sake it makes more sense to store it separately. ### Reactive Data and Component Methods This is a good point to introduce two other, frequently used Vue component options. The first one is known as the *data* function and is declared in the following manner, usually right after the template option: ``` let app = Vue.createApp({ template: ` `, data: function(){ return { count: 0 } } }) ``` The *data* function should always return an object. This object is essentially a representation of the internal state of the component. For instance, our clicker counter button should be able to remember the number of times that it has been clicked over the course of it's life time. The best way to do this is by storing this click count as a property in the returned data object. Now you'll also notice that we made a change to our template HTML - we added the count variable inside of two pairs of nested curly braces. **It's also known as handlebar syntax, or alternatively mustache syntax, if you need to google it at some point.** What is does, is that it'll automatically convert the double curly brace statement into the value that the count property of the data object contains - which has an initial value of 0\. We mainly use this syntax for accessing the values from properties return by the data function, but there's some other Vue object options for which we can use it as well. **What's special about this data object, is that it's reactive**. Meaning that, if the count variable is incremented, decremented, or changed is some way or another, it'll be automatically reflected in the HTML without us having to imperatively access the element in the DOM and update it. That's super convenient in so many scenarios, right? Next we'll tackle how to increment our count variable whenever the button is clicked. We'll also do this in a self contained manner within our component, without having to fetch the button element by it's id. Queue the methods option: ``` let app = Vue.createApp({ template: ` `, data: function(){ return { count: 0 } }, methods: { incrementCount: function(){ this.count++ } } }) ``` The methods option essentially represents the functionality of a component. This option is in essence an object that contains functions as properties, which can be used in our component to perform computations or add behavior, like updating the template HTML, upon certain events. Just like the code that gets executed during regular vanilla event listeners. In our case, we'd like to increment the count property when the button is clicked. Hence we'll create a function that does just that. Notice how we also need to reference the *count* variable with the *this* keyword. In an OOP flavored manner we need to point Vue towards the correct instance of the variable that lives within the component object. How do we actually trigger this method when the component is clicked? We'll have to tell the button element to listen for a click. With Vue we can create this event listener with the *v-on directive*. A Vue directive is kind of just like an HTML attribute, in that it gets added to an HTML element in it's opening tag, but with the special behaviour that it gets parsed by Vue instead of being rendered to the DOM. To listen to a click event, we simply add this statement *@click=incrementCount*. This simply triggers the incrementCount method when the button is clicked (the @ symbol here is a shorthand for the v-on directive). We'll talk in more detail about Vue directives in the next section, but for this part I simply want to show you the syntax. To put all of what we covered so far into action - we get a relatively unimpressive looking click counter button: Inspecting the HTML in this case doesn't actually do much, as Vue will automatically convert the code to the final HTML - viewing the page source however, should make it possible to see what's happening underneath. ### Vue Directives To conclude this quick speed-run of Vue basics, let's have a look at directives! As mentioned above, they're essentially a way to extend HTML beyond it's usual functionality. They can be used to add specific behavior and functionality to our components in a declarative manner, and in a way mimicking HTML tag attributes. We've already seen the *@* symbol, which is actually just a shorthand for the *v-on* directive, that can be used to attach a click event listener to our DOM elements. We could have equivalently written it like this: ``` ``` Where the *click* event is already built into Vue as a click event listener. We can naturally replace the click statement with our own custom events - but that's a tag bit more complicated, so we'll leave it for another time. Another directive that we could have used in our button is the *v-text* directive, which is a convenient way to set the HTML content of a div. For example, instead of using Vue's handlebar syntax for our button we can equivalently do it in this manner: ``` ``` The count variable is inserted into the component template via the v-text directive. I believe that having multiple ways of doing things in vue adds a little to it's complexity but also makes it more flexible in many ways. And yet another directive is the v-show directive which can be used to show directives based on certain conditions. ``` ``` So this is really cool, and highlights another cool thing that can be done in the Vue, evaluating expressions directly in the template! There's many more directives that can be used for all sorts of purposes. I believe that the added declarative functionality from these directives is one of the hardest parts to master in Vue, but also makes many things much more straightforward. It'll take a little bit of time to figure out how to use all of these directives effectively, but with a little practice it shouldn't be too difficult. At this point I recommend recreating this small vue app by yourself, if you feel so inclined, it'll help understanding what follows where we'll create a more complicated app! ## Towards a more intricate Interface Most interfaces have more than just a single button, and often require different parts of the interface to communicate with each other in some manner. This is the aim of this section. We'll reuse the button that we've put together over the previous sections and will create an interface that holds several of these buttons. For this purpose we'll reorganize our code a little bit and learn how to create a more intricate interface with several components. ### Chaining Components At this point in time, we've created a self contained clicker counter component that sits directly at the root of our app. How do we go about making this button reusable as a Vue component? What's the *Vue* way of doing things? The first step is to clear up our root component, and turn it into a container for the interface that we're planning on building. Let's set the button component code aside for a second. Instead of having it at the root, we'll start off with something that looks like this: ``` let app = Vue.createApp({ template: ``, components: ['buttons'] }) app.component('buttons', { template: `
Here go the buttons.
` }) ``` Alright, there's already a lot to unpack here. Let's focus on the root component object that is fed to vue's createApp() function for a second. The template for the root component's HTML contains a *buttons* tag... if you're acquainted with HTML, you'll notice that this isn't actually a valid tag that exists in HTML, as opposed to the singular form of the word, *button*, that is. **Last I heard, you couldn't just invent new HTML tags. Well, Vue actually lets us create our own tags! Let me explain how this works!** In what preceded we talked a lot about components, but we haven't actually created any so far. Well, save the one that needs to sit at the root of the app. There's multiple ways to create components in Vue, the most straightforward being via the *app.component()* method. In contrast to the createApp() function, this one takes two inputs: a label/name for the component, as well as an object that specifies the component's options - which we've already discussed extensively at this point. Besides the top level container at the root of our interface, we've also created a component that will serve as a container for multiple buttons: ``` app.component('buttons', { template: `
Here go the buttons.
` }) ```

I like leaving the root component as simple as possible, even if it introduces another layer between top layer component and those at the very bottom. But that's just personal preference.

Here we're creating a new component called *buttons*, which will simply be a container that holds several buttons (we'll add these in a just a minute). For now this component has a very bare-bone template, simply a div with some text in it. By having created a component with the name *buttons*, Vue actually allows us to use this identifier as an HTML tag. Using the component's name as a tag inside of the root component's template, it'll conveniently and automatically replace this custom tag with the HTML inside of the component's template. In simpler terms: **Vue components can be used like custom HTML tags. Using such a custom tag in the template of another component, replaces it with the content of it's own template string.** This was a bit of a mouthful to explain, but I hope it makes sense. Additionally, we can also give the root component an option called *components* which indicates what child components we want to use inside of it: ``` app.component() ``` This isn't necessary in our case, Vue would still automatically understand what the buttons tag is referring to, but it's good practice nonetheless and might be required sometimes. Alright, now we've seen another super powerful feature of Vue - let's make use of it for creating multiple buttons! ### Multiple Buttons Now let's create a new component and feed it the button component object that we've created earlier: ``` app.component('clickerButton', { template: ` `, data: function(){ return { count: 0 } }, methods: { incrementCount: function(){ this.count++ } } }) ``` The only caveat here is that we should not give components names that are identical to already existing HTML tags. That would cause problems, hence, instead of using the label *button* for our component, we'll name our component *clickerButton*. Yes, I know, very imaginative. We can now repeat the same process as before and insert our custom button as an HTML tag inside of our buttons container component: ``` app.component('buttons', { template: ``, methods: { incrementCount: function(){ // need to do something different here now } }, props: ["count"] }) ``` Here we don't actually require the data option anymore since we are receiving the count variable as a prop from the parent. The buttons component also needs to change, to send a variable downstream to a child component we can use the v-bind directive, which essentially binds a data property to a child element: ``` app.component('buttons', { template: ``, data: function(){ return { globalCounter: 0 } } }) ``` It's called v-bind because this is done in a reactive manner, when the *globalCounter* of the parent is updated, an updated value will also be passed down to it's children. ### Child to Parent Component Communication Now that we've set up our *clickerButtons* to receive a value from the parent, we also need to send a message back to the parent when one of the buttons is clicked. For this we can set up another method, in which we'll call a special Vue function called $emit(): ``` app.component('clickerButton', { template: ` `, methods: { incrementCount: function(){ console.log('hi') this.$emit('counterUpdate') } }, props: ["count"] }) ``` The `emit` function is a special method in Vue that allows us to send a message to the parent component, it's essentially like an event propagated to the parent. This emit function takes a string label and as second input what we call a payload - a value that is passed alongside the event label. In the parent we now need to listen for this event, which can also be done with a a click event listener via the v-on directive and a corresponding method that triggers when this event is registered - not how the event to listen for is simply the name of the emitted message: ``` app.component('buttons', { template: ``, data: function(){ return { globalCounter: 0 } }, methods: { handleChildEvent(payload) { console.log(payload) this.globalCounter++ } } }) ``` And there we have it, in action this would behave like that: ## Closing Thoughts Although we've just scratched the surface of the Vue iceberg, I hope this article sheds some light on the framework and hopefully gets you started on your own Vue apps. It took me a couple of days to get a hang of Vue and how its features are intended to be used together. At the same time it was also a very fun challenge recreating one of my own vanilla JS concoctions with Vue. I think it's the best way to learn Vue. We've covered the features of Vue quite broadly, and as mentioned there's always a multiplicity of different ways to do things - it really ultimately boils down to what you want to create and how it should behave. Although in certain cases there is a proper approach to things, you shouldn't get hung up on that when starting out. Vue is intended to be a progressive framework, and makes it easy fix things later on if there's a better way to do things. One last note, I also found that chatGPT is quite potent at answering Vue related questions - for instance you can simply state what you'd like to accomplish, and it will give you some potential solutions on how to do it. For instance: 'In Vue, how do you emit a message from a child component to a parent component?' and it'll provide you a potential answer. It isn't always perfect, but it's good enough most of the time. It's especially useful when you don't really know what you're doing yet and would like some way-pointers on achieving particular goals. **That said, I hope you enjoyed reading this post as much as I enjoyed writing it! If you do end up giving Vue a shot after this, shoot me a message or tag me when you share your creation. Otherwise consider sharing this post on your socials, or with friends and family that have an interest in programming. It helps out a whole bunch. Cheers and Happy coding \~ Gorilla Sun 🌸** ### Gorilla Recap 11 URL: https://www.gorillasun.de/blog/gorilla-recap-11/ Last updated: 2023-12-19T23:11:45.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** --- Is this the last nail in the coffin for Twitter? The announcement that caused the largest outrage this week, was one by the man in charge over at the bird site - putting in place a rate limit on all users of the platform: > To address extreme levels of data scraping & system manipulation, we’ve applied the following temporary limits: > > \- Verified accounts are limited to reading 6000 posts/day > \- Unverified accounts to 600 posts/day > \- New unverified accounts to 300/day > > — Elon Musk (@elonmusk) [July 1, 2023](https://twitter.com/elonmusk/status/1675187969420828672?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Essentially, the largest part of the userbase - I assume that only a fraction of people using twitter are actually paying for Twitter blue - is now limited to 1000 tweets per day. After the initial wave of outrage hit, Elon quickly pulled the brakes and upped the limit to 8k, then to 10k tweets a day. Although data scraping is a genuine concern, for various reasons, this doesn't seem like the right solution to combat it. Especially when the main goal of a social media platform like Twitter is to retain user engagement for as long as possible. These limitations could be especially detrimental for smaller brands and artists that rely on the platform for their outreach. Even if these measures are just temporary I've already seen quite a few people pull the plug, and either completely abandon the bird site, or at least create accounts on some of the competitor platforms. It's unclear at this point what this means for the future of Twitter, Elon probably has all of the numbers and has a good picture of how this change affected the platform - but I think it's unlikely that this will be the end of the bird site; too many people are just too dependent on it at this point. ## Genart Updates ### FxHash coming to Eth Not just Twitter but also FxHash dropped some big news this week - FxHash is coming to Eth! > fxhash 2.0 > — a multichain future > > Today, we're super excited to share some major news with you! We've started working on a significant platform expansion built around integrating Ethereum & on-chain minting. > > Let's talk about what the fxhash 2.0 future looks like 😎⬇️ [pic.twitter.com/00z8qErpCD](https://t.co/00z8qErpCD?ref=gorillasun.de) > > — fxhash (@fx\_hash\_) [June 29, 2023](https://twitter.com/fx%5Fhash%5F/status/1674436332536623110?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) It's a bit difficult to gauge what this means moving forward - especially what impact this will have on Tezos. Although there's been some mixed feelings about the announcement, it's overall been positive. It even garnered acknowledgement from Arthur Breitman, one of the creators of Tezos: > One of the most successful Tezos dapp of all times is adding support for Ethereum. It's a natural choice to offer to their users, and it's a great way to onboard new artists and collectors to the advantages of using Tezos. Congrats to the team! [https://t.co/DIR51lubcV](https://t.co/DIR51lubcV?ref=gorillasun.de) > > — Arthur B. 🌮 (@ArthurB) [June 29, 2023](https://twitter.com/ArthurB/status/1674463593860067329?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Really enjoyed this thread by Astam, where they go into some of the implications of a multi-chain platform, and how this might affect Tezos, in a positive manner: > Yesterday [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) announced they are bringing in Ethereum minting / buying / selling later this year > > A 🤔 move for a culture that was at times anti-ETH > > Thoughts on what is going on & what it means for the generative art space 🧵 (plus some 🔥 fxhash art) > > 1/11 [pic.twitter.com/1dZWtIfaAl](https://t.co/1dZWtIfaAl?ref=gorillasun.de) > > — Astam (@astamcloud) [June 30, 2023](https://twitter.com/astamcloud/status/1674782863080972288?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### FxHackathon first workshop Simultaneously, the first workshop for the FxHackathon was held by Ciphrd last week on the discord, where he presented some of the new features - I have yet to find the time to start working on my piece but I've already got some cool ideas. Here's something christopher Choffel is working on that I thought is pretty cool: > Continued prototyping for [#fxhackathon](https://twitter.com/hashtag/fxhackathon?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Got a LOT to do,. You can probably guess where I'm going, even though it still very early. Still very unsure what the output could look like, need to code more![#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/KTWQdugDtc](https://t.co/KTWQdugDtc?ref=gorillasun.de) > > — Christophe Choffel (@ULuIQ12) [July 2, 2023](https://twitter.com/ULuIQ12/status/1675541934188773379?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Deca Artist Pages roll out Recently I got a message from [twitter user pravijn](https://twitter.com/pravijn?ref=gorillasun.de) who pointed out that I had an artist page on Deca, which I could claim by connecting my wallet. I haven't used Deca in the past, but it's probably the best way to see your entire body of work across different platforms on Tez and Eth - and in terms of presentation it's really awesome to see all of my works side by side! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-03-at-10.56.10.png) Check out [my page](https://deca.art/gorillasun?ref=gorillasun.de) \- maybe also give me a follow over there to get notified of future drops! I still need to clean up the page and make some boards as well! ### Tezos turns 5 > 5 years 🌮🌮🌮🌮🌮 raise a toast to many more years of innovation! 🍻 [#TezosAnniversary](https://twitter.com/hashtag/TezosAnniversary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > What do you think is the coolest innovation on Tezos? Share below! 👇 [pic.twitter.com/17h5sxl6PF](https://t.co/17h5sxl6PF?ref=gorillasun.de) > > — Tezos (@tezos) [June 30, 2023](https://twitter.com/tezos/status/1674764735777239040?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Interesting Reads ### Ty Vek's Self Trilogy Ty Vek's trilogy 'self' released on FxHash, and it completely flew under my radar. The three pieces id, superego and ego revolve around Freud's model of self and give it's three forms a digital manifestation. The write-up on fxhash is an incredible read: [fxhash - Notes: Self (Id, Superego, Ego)A statement discussing the concept and release mechanics of the Self Trilogy.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmZwtTzSqkG1QapBGW2DpbkmJsT9n875igcHAHJ5i4iEmt)](https://www.fxhash.xyz/article/id/1306?ref=gorillasun.de) Speculations about Ty Vek's identity also still remain. ### Matt DesLauriers - Computer Archeology Matt DesLauriers with another banger of a thread, in which he goes down a computer drawings history rabbithole: > After seeing Frederick Hammersley's 1969 "Computer Drawings" at LACMA this week, I went down a rabbit hole of computer archeology. 🖨️ [pic.twitter.com/eKz7g9PGWO](https://t.co/eKz7g9PGWO?ref=gorillasun.de) > > — Matt DesLauriers (@mattdesl) [June 30, 2023](https://twitter.com/mattdesl/status/1674892967880843265?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Gorilla Articles ### 3 Generative Artists - 3 Principles A little bit of a different article compared to the usual stuff that you find on the blog - but I wanted to write about some of the lessons that I've learnt from reading and watching interviews and talks by established generative artists. I think there's a lot merit to inspecting their processes and how their brains are wired, and maybe borrow and incorporate these ideas into your own workflow. I'm playing with the idea of turning this into a series, in this pilot we have a look at Zach Lieberman, Frieder Nake and Saskia Freeke - all three of which have important words to give: [3 Generative Artists - 3 PrinciplesIn this post we have a look at 3 principles from 3 great generative artists: Zach Lieberman, Frieder Nake and Saskia Freeke. Generative art as a budding artform has many angles of approach, and what better way to gain a deeper understanding of it than learning from the greats.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/quiltgen8.png)](https://www.gorillasun.de/blog/3-generative-artists-3-principles/) ### Making of Somewhere in Between I also got around to documenting the ideas behind my project Somewhere in Between. I believe that the code has some interesting conceptual notions, particularly geometric ideas that are interesting and if you want to explore subdivision of rectangles (and convex polygons): [Making of Somewhere in BetweenIn this post we have a closer look at my generative token Somewhere in between and the code that generates it’s graphics. Building upon the irregular grid strategy from way back when I approached rectangle divisions in a completely new manner.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Untitled_deblurred.png)](https://www.gorillasun.de/blog/making-of-somewhere-in-between/) The allowlist has been updated and the remaining tickets are now available for minting, if you'd like to pick up one still now's your chance: [Somewhere in Between — fxhash“Somewhere in Between” is part of the interactive minting experience at Proof of X with KUMALEON, Tokyo, 2023 - Blockchain as a new Medium for Art held at The Face in Daikanyama. Somewhere in Between![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmcdYj9zWhSnxRzCpZZABPoc1L66i43kj1JhgXHtydBDpp)](https://www.fxhash.xyz/generative/27652?ref=gorillasun.de) ## Gorilla Sketches ### The Great Traversal released on Alba I didn't actually get to work on any sketches this week, as I've been quite busy with some other projects already - however, last week my token The Great Traversal released on Alba and so far 57 iterations have been minted! Thank you everyone who picked up an iteration! > And it's live! ✨ [@AlbaDotArt](https://twitter.com/AlbaDotArt?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Link 👇 [pic.twitter.com/ClduvXvitZ](https://t.co/ClduvXvitZ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 28, 2023](https://twitter.com/gorillasu/status/1674085349151199236?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [Still minting here](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de)! ### Gorilla Explorer Not a sketch per se, but tangentially related - I resumed work on my portfolio page, which is shaping up to be something really cool. It's taking much more time than initially anticipated, but I'm hoping to deliver something very polished for everyone to explore all of my works of the past couple of years. You will also likely see this explorer in another form - not going to reveal too much about it yet, but I've got some ideas. A detailed write up about it, will also be posted sometime soon - most likely concurrently with it's release. After refactoring the entire structure of the tool several times, the code ended up being a complete spaghetti mess. Those timelines at the bottom of the explorer weren't very straightforward to put together, and doing it with vanilla javascript wasn't the best idea in hindsight. This is why I'm in the process of recoding the entire thing from the ground up with the vue.js framework. > Currently doing a complete recode of this with vue.js - all while learning the framework on the go. > > The declarative aspect of it is proving to be a bit tricky, but the code's much much less of a spaghetti mess now. That said, would you guys be interested in a post about vue? [https://t.co/qxEowpHE2U](https://t.co/qxEowpHE2U?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 30, 2023](https://twitter.com/gorillasu/status/1674884031559655427?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The code has become much cleaner this way, and at the same time it's become much more manageable to make changes if I choose to do so in the future. So, keep an eye open for it in the coming weeks. ## Music for Coding This week I discovered the Future Funk genre for myself, and I think that it absolutely *slaps*! I particularly enjoyed this playlist titled Usagi Dreams, with it's funky bass and upbeat rhythms - puts me in the perfect mood for coding! **And that's it from this week again! If you enjoyed this newsletter consider sharing it on your socials, and with friends or family that might be interested in these topics! Cheers and happy sketching \~ Gorilla Sun 🌸** ### Making of Somewhere in Between URL: https://www.gorillasun.de/blog/making-of-somewhere-in-between/ Last updated: 2023-07-02T17:44:10.000Z **In this article I'll give you a peek behind the scenes for my generative token Somewhere in Between, from initial ideas and inspirations and to the complete project that lives on FxHash now. Somewhere in Between was minting as a part of the live minting event *Blockchain as a new Medium for Art* at The Face in Daikanyama, Tokyo. A collaboration between FxHas, Kumaleon and Proof of X.** 0:00 /0:32 1× The live minting setup at The Face in Daikanyama ## Initial Inspirations You've most likely already seen some tweets about it over on the bird site - and at this point probably want me to shut up about it - but I'm really proud of how the project ultimately turned out in the end! It's the first time that I have a piece somewhere out there in the real world on a huge screen, it's by far my biggest W this year - so far! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-25.png) The open call over on the fxhash discord. Early May I saw this announcement on FxHash's discord about a collaboration with Kumaleon. Kumaleon had reached out some months prior about an opportunity on ETH, but at the time I had to decline, since the chain was still proof of work. I didn't want to pass on this one however - hence I quickly filled out the form and sent it on it's merry way. Come early April and I got mentioned in a tweet by Proof of X that I was on the roster of participating artists. I didn't waste much time and pretty much got started instantly on some ideas for a sketch - I got out my sketchbook and quickly put down some rectangular scribbles. ## Irregular Grids For some reason, after I came up with my irregular grid strategy in 2021, I never really ended up using it that much in my sketches: [An Algorithm for Irregular GridsA step by step tutorial to constructing a variety of irregular grids![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/blo-x8-2-.jpg)](https://www.gorillasun.de/blog/an-algorithm-for-irregular-grids/) A familiar starting point. It's essentially a rectangle packing algorithm, that doesn't actually need to compute collisions. Well not in an algebraic manner at least. Even though it is a cornucopia of different grid patterns, simply by tweaking the input parameters, I never got around to using it that much. For this project however I had decided that it would be the foundation upon which I would build the rest of the sketch. And it already felt like I've got something going there: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/colorsofspring.png) In this version I'm layering two irregular grids on top of each other, where the top layer is sparser than the bottom one. A simple trick to immediately get more intricate patterns. I didn't end up using this in the final sketch however. In the past months I even rehashed the entire algo to produce even more intricate patterns, with shapes that aren't necessarily rectangles, but still block-y in nature. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/bo-o-gg.png) There's a lot more going on in this sketch than in the irregular grid code from before. But maybe you have a good guess about how I generated these patterns? I don't want to share too much about it yet at this point because I want to experiment with it a bit more before I share the idea behind it, but it's growing to be one of the favorite things that I've ever made. ## A creative solution to slicing Rectangles There's many ways to split rectangles into smaller polygons, but I wanted to do it in a different and new way, and that had a 'generative' component at it's core. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img-25-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img-18-.png) Initial iterations of the code. Here connections could still originate from the corners of the rectangle, something that doesn't occur in the final version. You can also notice that there's lines that overlap, due to a wrong calculation on my part. What I really like about these is the origami like quality, somehow resembling folder cardboard paper in a way. This geometric idea began as a simple drawing in my notebook, in which I placed some nodes/connections (not entirely sure what to call them) on the borders of a rectangle, and connected them in such a manner that they don't intersect each other. Visually, that produced pleasing patterns in which the rectangles were subdivided into smaller convex polygons that were neatly adjoined to each other. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/IMG_2559-1-1.jpg) The initial doodle that was the inspiration for the sketch. I did also experiment with the circular shapes and positioning them inside the rectangles, but it didn't feel like the right place for them. Definitely a future endeavor though. On paper, this was easier to do than in code. One idea would have been an object oriented approach, where each rectangle is an object that holds an array of nodes, that in turn are also objects storing their individual positions - in addition to references to the other nodes that they are connected to. An additional flag indicates if the node is connected or vacant. I didn't want to go down the object oriented approach however, and wanted to do it in a different way. Many doodles down the line, I finally had a *Eureka* moment of some sorts, when I remembered a video by Nils Berglund that I had seen some weeks prior. The final approach ended up being one in which we unwrap the rectangle's boundaries into a 1 dimensional array - which is entirely sufficient to represent how the nodes are connected. Let me explain what that actually entails in the following sections. ### Tokarski's Room For this I'd like to backtrack and talk about a relatively unrelated topic: Tokarski's room. There's a bit of a long backstory to what Tokarski's room is and the mathematical question that it poses, but to briefly summarize it: there are certain shapes of rooms, polygonal or not, in which two points can exist such that these two points don't illuminate each other. This is under the assumption that light travels in form in the form of directional rays, and that there is no diffraction of light. Tokarski came up with a very particular polygonal shape, in which there is a singular spot that remains completely dark. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-02-at-15.37.59.png) The original paper from Tokarski. Unfortunately all of the sites I could find were paywalled. Nils Berglund's video explains how Tokarski came up with that shape, and he does so via analogy to a billiard table. Not a regular billiard table per se, but rather one that has the shape of a right angled triangle. A cool trick to predict the trajectory of a billiard ball is by *unfolding* the billiard table by reflection along it's boundaries. Drawing a straight line between the initial position of the ball and where you want it to go essentially shows you the initial direction that it has to be pushed in. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-02-at-15.33.45.png) Isn't this super cool? I think that with a little bit of practice it should be possible to conjure up reflections of a real billiard table and gain a competitive edge on your friends during billiard night. But maybe that's what the pros already do? Now, the special thing about this triangular billiard table, is that there are certain points which can not be reached when starting from specific other points. For instance you can't return to the blue corner, if you start at a blue corner. And the same is true for the red corner. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/Screenshot-2023-07-02-at-15.45.06.png) This is due to the fact that the other corners would be blocking your way. This is also hypothetical, because IRL this wouldn't be possible anyway. And this is essentially how Tokarski constructed his unilluminable room, by chaining together polygonal regions until there was a particular spot that could not be reached from a certain starting point. I recommend watching Nils' video, he does an amazing job at explaining the idea, as well as checking out his Youtube channel that, is a treasure trove of these kind of geometric notions: ### Unwrapping Rectangles and Creating Connections **What does my idea have to do with Tokarski's room? Nothing, really.** Nils' video simply inspired a creative solution to my problem. To connect the nodes on the boundaries of our rectangles we don't actually need to know where they are located, since they are evenly spaced around the boundaries, we can compute their positions later on based on the dimensions of the rectangle itself. To represent how they're connected we can make do with a simple 1 dimensional array of integers, where each entry in this array represents one of the nodes, starting from the top-left corner of the rectangle and traversing the boundaries in clockwise order. This means that the indices in the array represent the nodes in clockwise order, and we can create a simple mapping to which other node each node is connected by storing the corresponding indices. **In this manner we are unfolding the rectangle into a lower dimension. That is the extent of the inspiration from Tokarski's room.** To aid our understanding, let's have a look at an example. Imagine we have a rectangle that spans three by three cells in our irregular grid (the irregular grid being a discrete grid of cells). This means that the rectangle has 2 nodes on each boundary, 8 in total since the corners themself cannot be vacant nodes. The array would look as follows: ``` // we can initialize this array with a one-liner [-1, -1, -1, -1, -1, -1, -1, -1] ``` I chose the negative integer 1 to indicate that a node is vacant. Now let's assume that the first node is connected to the 5-th node, we can do so pointing the two corresponding array entries to each other: ``` // indexing begins at 0 [4, -1, -1, -1, 0, -1, -1, -1] ``` And in this manner we have established connectivity between the first and the fifth node. An important thing here, is that when we add new connections, we have to make sure that these new connections don't create lines that intersect with the already existing connections. If we were to go down the object oriented approach, then we would have to manually check for these intersections, which I've written about in a section of this post if you're curious about it: [An Algorithm for Polygon IntersectionsIn this post we’ll work our way towards an algorithm that can compute convex polygon intersections. We’ll also a method for intersections between axis-aligned rectangles, a function that can determine the intersection of two line segments, as well as a point in polygon test.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/thumb2.png)](https://www.gorillasun.de/blog/an-algorithm-for-polygon-intersections/) Determining if two polygons intersect boils down to checking if two of their constituent lines intersect. Our array already provides a way to check for intersections however! When creating the subsequent connections, we simply check if any of the array entries in between the two new connection nodes are not equal to -1; if there is at least one, then we can't establish that connection because it would lead to crossing lines. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/IMG_2560-1-1.jpg) And this is essentially the core idea of the generative sketch. ### Determining polygonal regions Now the cherry on top, is that this array is also sufficient to determine and isolate the different polygonal regions that emerge. Determining these polygonal regions is necessary to create the different clip regions and filling them in with patterns. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img-354-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img-353-.png) The idea here is again very simple. The code however became quite gnarly. For the polygonal regions we need to also take into consideration the corners of the rectangle, which we'll add into the array and represent with the special numbers from -2 to -5\. It'll be important to be able to distinguish between the different corners, starting from the top-left, and moving along in a clockwise order. The number -1 still indicates that a node is vacant: ``` // -2 represents a corner of the rectangle [-2, 4, -1, -3, -1, -1, -4, 0, -1, -5, -1, -1] ``` But you might have noticed that this also threw off the ordering of our nodes, and that they're not mapping to each other in a correct manner anymore, so we need to offset them as well, simply by adding the number of corner insertions: ``` // offsetting the connection indices [-2, 7, -1, -3, -1, -1, -4, 1, -1, -5, -1, -1] ``` And now the array is correct again. So, how does this 1 dimensional array inform us about the polygonal regions? The best way to imagine this is by doing a contour walk on the rectangle with it's connections. Let's start traversing the array from the top-left corner. We create a new polygon, similarly as a 1d array that stores the nodes and corners that determine it's vertices. The traversal algorithm consists of the following rules: 1. Traverse the connectivity array from left to right. 2. When we encounter a number that is not equal to -1 we add it to the polygon array. 3. When we encounter a non-negative number we jump to the corresponding index in the array and resume traversing from there. 4. When we reach the end of the array we loop around. 5. When the same number is encountered a second time we stop traversing. We store the polygon array, and repeat these steps starting from the polygon's second vertex. 6. When we reach the same node that we did our initial traversal from, we end the procedure. 7. Remove duplicate polygons. So this is quite confusing, and it was also quite confusing to implement, but it works. This is essentially sort of a contour traversal done on a 1 dimensional array. You can have a look at the messy code by inspecting the token over on FxHash. And again, this probably makes much more sense by having a look at one of the diagrams that helped figure this out. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/IMG_2563-1.jpg) Contour walk on the different polygonal regions. And the pseudocode: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/IMG_2564-1.jpg) I took me a few attempts to figure this one out, but ultimately I was able to implement it. What I think is special about this, is that it should theoretically work for every convex polygon, but then it requires extra computation to compute the absolute coordinates of the connections. ### Computing the absolute coordinates of the nodes This was also tricky to do. Since the connectivity array has no knowledge of where the nodes are, we need to go through some extra steps to determine where they are located on the rectangle, based on it's dimensions. This will be the only code that I show in this article, because it was especially ugly - and I think there's something beautiful about that: ``` for (let n = 0; n < this.connections.length; n++) { let connection = this.connections[n] if (connection > -1) { let startX = 0 let startY = 0 if (n - (this.dimX - 1) < 0) { startX = this.vrts[0].x + n * gridSpacingX + gridSpacingX startY = this.vrts[0].y } else if (n - ((this.dimX - 1) + (this.dimY - 1)) < 0) { startX = this.vrts[0].x + this.dimX * gridSpacingX startY = this.vrts[0].y + (n - (this.dimX - 1)) * gridSpacingY + gridSpacingY } else if (n - ((this.dimX - 1) * 2 + (this.dimY - 1)) < 0) { startX = this.vrts[0].x + this.dimX * gridSpacingX - (n - ((this.dimX - 1) + (this.dimY - 1))) * gridSpacingX - gridSpacingX startY = this.vrts[0].y + this.dimY * gridSpacingY } else { startX = this.vrts[0].x startY = this.vrts[0].y + (this.dimY - 1) * gridSpacingY - (n - ((this.dimX - 1) * 2 + (this.dimY - 1))) * gridSpacingY } } } ``` ## Final touches Unintentionally I called my custom line drawing function twice in the main loop, and that actually resulted in a beefier look overall, which I ended up liking much more than the original variation. It gave the lines a heftier look overall. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img-1-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/img.png) Sometimes there's also stroke colors that aren't pure black, which gives the overall composition a slightly dreamier look. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/canvas.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/canvasss.png) Selecting colors for this project was tough. But looking back I think I found some nice palettes that work well for the different compositions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/cactus.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/07/ccaca.png) Grids can also be densely packed by selecting a larger grid scale via one of the fxparams sliders. ## Closing Thoughts It was an honor to have my piece displayed at Proof of X. In many ways it felt unreal to have a piece of mine somewhere so far away on such a big screen, and at the same time have people interact with it and tweak it's parameters. I would have also loved to the try out the new live update feature that FxHash released just a few days prior to launch, but it don't think that the piece allowed for it anyway. I did however account for a fast and animated reload of the sketch whenever the parameters were updated by making use of Javascript generators. I also wrote about them here if you're interested in that: [Javascript Generators for Animated Generative SketchesIn this tutorial we’ll have a look at javascript generators and how they can be used for animating the drawing phase for our generative sketches. We’ll cover everything from syntax to actually implementing a simple example using p5’s draw loop.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-365--1.png)](https://www.gorillasun.de/blog/javascript-generators-for-animated-generative-sketches/) Also huge thanks to all of the collectors that got an iteration of the publicly minting half! I'm planning on opening up the remaining iterations in the coming days, so if you haven't had a chance to get one yet 👇 [Somewhere in Between — fxhash“Somewhere in Between” is part of the interactive minting experience at Proof of X with KUMALEON, Tokyo, 2023 - Blockchain as a new Medium for Art held at The Face in Daikanyama. Somewhere in Between![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmcdYj9zWhSnxRzCpZZABPoc1L66i43kj1JhgXHtydBDpp)](https://www.fxhash.xyz/generative/27652?ref=gorillasun.de) **And that's it for this article, I hope you enjoyed reading it as much as I enjoyed writing it \~ Cheers and happy sketching \~ Gorilla Sun 🌸** ### 3 Generative Artists - 3 Principles URL: https://www.gorillasun.de/blog/3-generative-artists-3-principles/ Last updated: 2023-07-15T15:27:28.000Z **In this post we'll have a look at the principles, rules, mottos - whatever you want to call them - of some of the greats of generative art. Initially I had a much longer list, but to do things justice it makes sense to discuss things in a bit more depth. That's why I'll break up this list into several parts - in today's article we'll talk about Zach Lieberman, Frieder Nake and Saskia Freeke. Let's get started!** --- A big part of writing these articles, is the research that happens beforehand. And that's often my favorite part. I get to indulge myself in reading and learning new things. And I don't have to conjure words from the ether onto my text editor just yet. One of the most enjoyable kind of reads are interviews! I find them really exciting, because you can never really tell what the person being interviewed will answer. There's a certain surprise factor to it - when someone's put on the spot, that's when you get the most genuine answers out of them. Furthermore, when it comes to learning things, what better way is there than to look towards those that came before and have poured tens of thousands of hours into the topic that you want to learn about - usually the kind of people that get interviewed. This is what this series is going to be all about, in the context of generative art ## Zach Liebermann - Always be Iterating Soon after discovering P5 for the first time and looking for tutorials about it, I came across a number of Zach Liebermann's videos on Youtube - various talks and interviews that he had given on creative coding. The first one that I watched, and that had a lasting impression on me: This one is by far my favorite talk by Zach. Besides his stunning artworks, and his impressive daily coding practice, I was also quite impressed by his notion of poetic computation. That the act of writing code is in of itself an art practice. Finding beauty in writing code. It unlocked a completely new perspective for me. Katrina Allick an alumn from the school of poetic computation touches upon this exact notion in [a medium article of hers](https://medium.com/sfpc/what-is-poetic-computation-2284fcf7086c?ref=gorillasun.de): > In class we broke down our ideas of poetic computation and my favorite definition had to be subjectivity into instruction. Art takes its form through code, whether that be actual subjective meaning or aesthetic or actual instruction - Katrina Allick In a way, this detaches the term *coding* from the world of tech and makes it transcend into other fields. Makes it transform into other shapes. Anything can be creative coding really. For instance, Sol LeWitt's instructions that produced wall art, there was no computer involved, I would argue that it is creative coding. Likewise Vera Molnar's early works from the 50s, the was no computer involved, but there was a clear system in place for the creation of the *graphics.* Returning to Zach, he is probably one of the most hardcore daily coders out there. Maybe only surpassed by Saskia Freeke - we'll talk about her in a bit. Zach lives by his own personal motto *Always be iterating* \- in the talk that I linked above, he points out that this is the quintessential principle central to his coding practice. > What I do, is I don't try to make something new every day, I iterate. I take the same sketch and I rework it, and I try to change it enough, to make it feel like something new. And I believe that this is in many ways a necessity in today's social media landscape, where the algorithms expect some form of content from you every day. Trying to reinvent yourself every day is probably not going to work. Building upon previous work, in comparison, seems much more manageable. Zach also presents one of his favorite books - an old Japanese one, titled *The Art of Computer Designing by Osamu Satu*. The last sentence in the book states: > The work of past ages accumulates, and is remade again. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/9409ckr58is61.jpg) Written in reference to all the brilliant minds that influenced Osamu-san and inspired his work and the book. In this way, Zach also points out the importance of learning from the work of those who came in the past, to build upon their ideas, reverse engineer them and transform them into something new. Which is another form of *iterating*. **Always.** **Be.** **Iterating.** ## Frieder Nake - Think the Image, don't make the Image Frieder Nake pioneered what we know today as *generative art* by sheer coincidence. He was tasked with writing the software for one of the plotter machines that the Computing Center at the University of Stuttgart had newly acquired, the Zuse Graphomat Z64\. He was still a student at the time and didn't really have an idea on how to approach such a task... but evidently he managed just fine in the end. [‘Think the image, don’t make it.’ Frieder Nake in conversation with Mark Webster and Julien Gachadoat | VerseFrieder Nake, Mark Webster, and Julien Gachadoat in conversation with Mimi Nguyen.![](https://verse.works/favicon/apple-touch-icon.png)Verse![](https://verse-journal.ghost.io/content/images/2022/11/image-2.png)](https://verse.works/journal/mark-webster?ref=gorillasun.de) One of his famous phrases, that he states in many of his interviews, is *Think the image, don't make the image*. But what does that actually mean? The best explanation I could find in that regard is a research paper by [Susan Grabowski from the Universtiy of Bremen On Algorithmic Thinking, Art Education, and Recoding](https://revistas.ucp.pt/index.php/jsta/article/view/7292?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Screenshot-2023-06-29-at-16.25.45-1.png) Frieder Nake places the system at the middle point. Making images with computers becomes a mental exercise in creating systems. After all if you can describe how something was made in minute detail, then you can most likely implement these steps to make the image. This also means that we never think just about a single image, but rather about classes of images that can be generated by a system. > This is a most important aspect of algorithmic art. This kind of artistic activity is interested in classes of images, i.e. in infinite sets of images! The individual image is reduced to an instance only of the class it belongs to. We may like or dislike one or the other of the productions resulting from executing an image generating algorithm - Susan Grabowski We think pictures. We don't think **about** nor **of** the pictures. [There is a radical difference in the phrasing here](https://www.museumsfernsehen.de/the-art-of-being-precise-frieder-nake-in-conversation/?ref=gorillasun.de). To elucidate, [the computer artist paints with their eyes closed](https://verse.works/journal/mark-webster?ref=gorillasun.de). In stark contrast to the traditional artist that paints with their eyes open. The idea becomes as much of an artwork as the final output, it is the combination of the two where computer art comes to life and can be appreciated. What does this mean for the budding computer artist? I believe that an important exercise to making computer art, is one that happens away from the keyboard, where you try to conjure up systems in your mind and think about how they could be implemented. More contemporarily, it's about shapes, specific textures and the recreation thereof. When the artist then returns to the computer, and an attempt is made at translating between formless thought and tangible code, computer art starts to take shape and come to life. I'd like to add something [Kjetil Golid stated in an interview](https://www.artnome.com/news/2020/10/11/interview-with-generative-artist-kjetil-golid?ref=gorillasun.de) with artnome: > \[...\] a lot of times, I think of maybe a process or some sort of way of doing things, and I don’t really manage to imagine how it will look, and those are the most interesting cases, I think, where you actually have to program it in order to see what it will look like. So maybe *thinking the image* doesn't actually always mean that you need to be able to visualize what something will necessarily look like. Again, the conceptual system lies at the center. Personally, I'd like to approach my work more from that angle in the future. **Think the image, don't make the image.** ## Saskia Freeke - Break your own Rules Saskia Freeke is an absolute generative art powerhouse - running on a 7 year daily coding streak, she began making one artwork a day, everyday, since the first of January 205\. I can barely make it through Genuary by the skin of my teeth, I have no idea how she does it. A talk of hers that I really recommend watching is one she gave at the frontend united conference: There's many lessons packed into her talk; how to constantly try new things, and how it sometimes can be an uncomfortable but rewarding feeling to do so, how to come up with new ideas, to explore new features, put new rules into place, and to break your own rules. > It's also about breaking rules sometimes, because I like structure, I like grids, it's really hard sometimes to get out of this. That sentence really resonates with me. I often find myself trapped by my own rules, in a way preventing me from exploring other shapes, patterns or color combinations. Similarly to Saskia, I also really like grids and the neat positioning of shapes on the canvas - which is why I've spent so much time on learning to compute different kinds of collisions, and packing algorithms. Not exploring new ways of doing things, limits how much one's aesthetic can evolve beyond it's current state. To know what you don't like, and what doesn't work for you, you'll have to try it at least once. I've also always been a bit afraid of relinquishing too much control to the algorithm. Giving the output space too much freedom in a sense - but in that manner I've also been throttling the potential for beautiful iterations that could come to life. Sometimes you need allow chaos to take the stage, take a back seat and let the algorithm do it's own thing. **Break your own rules.** ## Closing Thoughts And that's it for this post, there's a lot more to be said here, many more lessons to be learned from each one of these artists. I will definitely write about other greats and what they have to say about generative art, and about the process of making generative art itself. I leave you with this post from Yazid, with a quote from Andy Warhol: > [pic.twitter.com/luD9fekuna](https://t.co/luD9fekuna?ref=gorillasun.de) > > — Yazid (@Yazid) [June 29, 2023](https://twitter.com/Yazid/status/1674354548331413511?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) **Cheers, and happy coding! If you enjoyed this post consider sharing it on your socials, otherwise subscribe to the newsletter to get notified of new content when it comes out \~ Gorilla Sun 🌸** ### Gorilla Recap 10 URL: https://www.gorillasun.de/blog/gorilla-recap-10/ Last updated: 2023-06-26T19:34:48.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** ## Genart Updates This week has been bonkers again, as there's a number of new things that I think are worth sharing. Obviously this is never an exhaustive list, because there's always too many things to cover in one newsletter - if there's some other cool stuff I missed, let me know in the comments at the end of this post! ### 7k on Twitter! 🤯 This week my Twitter account reached 7000 followers! 🥳 That's an absurd amount of people to be followed by - a big heartfelt ***Thank you!*** to each one of you! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Screenshot-2023-06-26-at-19.51.37-1.png) What will this profile look like in a year from now? Who knows 🤷‍♂️ I'm not very good at celebrating these milestones - I genuinely think that the best thing to do, is to double down and keep working on improving the quality of the weekly posts, the website and my generative art. You could argue that it's just a number - what's the difference between 6000, 7000 and 8000? From an outside perspective there isn't much difference. However, seeing so many people interested in the things I do gives my work so much more meaning and purpose, and helps me keep going even when things are difficult and tricky. But ultimately, it's still just a number - so, instead of celebrating a number, cheers to creative coding and generative art instead! And to many more months, years and decades full of creative coding and generative art! Thanks for being part of this journey 🙌 And now to some actual ***content*** 👇 ### Le Random Launches [LeRandom](https://www.lerandom.art/?ref=gorillasun.de) describes itself as a digital institution for the discovery and appreciation of on-chain generative art - and they just published their site this past week: > 🗣 Exciting news! 🎉🎉🎉 > > We couldn’t be more thrilled to share the launch of our full website today. > > Welcome to your new resource for appreciating, discovering and elevating on-chain generative art. > > 👇 link and 🧵 [pic.twitter.com/EkLEKn0e2z](https://t.co/EkLEKn0e2z?ref=gorillasun.de) > > — Le Random (@lerandomart) [June 22, 2023](https://twitter.com/lerandomart/status/1671909648876679170?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) What I'm most excited about is their upcoming timeline of generative art history, it seems like it will be a very nice explorative tool: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-28.png) They also already published a couple of posts - especially enjoyed this interview with Casey Reas: [Casey Reas on the History of Generative Art - Part 1In Part 1 of this three-part series, the Le Random team speaks with Casey Reas: artist, UCLA professor and co-founder of Processing and Feral File. We discuss the history of generative art: the overlooked importance of experimental video art, unexpected catalysts of the movement and more.![](https://assets.website-files.com/640f56f772eeb36cc6880d91/64346500e1dbbd80828e8825_ezgif.com-resize%20(2).png)two articlesLe Random — A Digital Generative Art Institution![](https://assets.website-files.com/6411e594fbd274173bf8c35c/6488a4099249a8dbaeed0045_6482609718c9e34f6b82053d_reas_rgb_3_6.webp)](https://www.lerandom.art/editorial/reas-history-1?ref=gorillasun.de) ### Arbitrarily Deterministic interviews Matt DesLauriers [Kenconsumer](https://twitter.com/KenconsumerE?ref=gorillasun.de) strikes again with another banger episode of his podcast, this time he's joined by [Matt DesLauriers](https://twitter.com/mattdesl?ref=gorillasun.de) \- a force of nature in the generative art space. You might know Matt from two of his works in recent years Meridian and Folio. Both of them stunning pieces. If you're not familiar though, then I really recommend this episode of [Arbitrarily Deterministic](https://podcasters.spotify.com/pod/show/kenconsumer?ref=gorillasun.de): > Did I have fun talking to [@mattdesl](https://twitter.com/mattdesl?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ? > Yes. > I love talking to people smarter than me. > You can listen to the whole conversation via your favorite podcast spot. I'll provide the Anchor link below. > Thanks again for coming on Matt. It was an awesome time. [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#podcast](https://twitter.com/hashtag/podcast?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/yhaIooV3xA](https://t.co/yhaIooV3xA?ref=gorillasun.de) > > — kenconsumer (@KenconsumerE) [June 23, 2023](https://twitter.com/KenconsumerE/status/1672133655001432065?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Fxhash Redeemables, Joanie Lemercier's Nuages and fxhackathon 2023 FxHash is steadily chugging along, rolling out new features. In the last fxfam discord call they announced a new feature called Redeemables, which essentially is a fxhash native method to automate the distribution of IRL merch/prints/items that are tied to generative tokens. > Redeemables > > A versatile framework that links generative artworks with onchain and offchain actions. Sell prints, merchandise, and enable collectors to claim a deeper experience of your artwork. > > Let's unpack the power of redeemables below ⚡️🧵 [pic.twitter.com/HJyIDVBptM](https://t.co/HJyIDVBptM?ref=gorillasun.de) > > — fxhash (@fx\_hash\_) [June 20, 2023](https://twitter.com/fx%5Fhash%5F/status/1671179667330711556?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) It's still in development, but Joanie gets the chance to take it for a spin with his first drop on FxHash: *Nuages*. Aided by Quentin Hocde, another awesome generative artist, they created some beautiful stippled clouds - each minted iteration obtains a real life plot. Due to the pointilist style these plots take quite some time to be created, in the ballpark of 10 hours. If that isn't enough FxNews yet, then there's more! FxHash is kicking off a hackathon centered around fxparams, and to be precise the hackathon will revolve around building interactive minting interfaces on top of fxparams. This has been pioneered by Piter Pasma's Universal Rayhatcher and Alejandro Campos pensado a mano, both of which gave a lot of freedom to the collector in shaping their custom iterations. If that sounds something you'd want to participate in, check it out. At the very least you might have a look at some of the workshops that will be held: > fxhackathon > \- build custom minting interfaces with params > > fxhash invites you to participate in a six-week hackathon centered around developing custom minting interfaces for fx(params). > > For full details, dates, & prizes: [https://t.co/AHMnpXK6Kp](https://t.co/AHMnpXK6Kp?ref=gorillasun.de)[#fxhackathon](https://twitter.com/hashtag/fxhackathon?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > More in thread ⤵️ [pic.twitter.com/uZJMHFZnHC](https://t.co/uZJMHFZnHC?ref=gorillasun.de) > > — fxhash (@fx\_hash\_) [June 23, 2023](https://twitter.com/fx%5Fhash%5F/status/1672333835110076417?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Jesus Christ, it's Richard Bourne... on Raph's stream! If you've frequented openprocessing at all in recent years, then you've most likely came across a user by the name of Richard Bourne - that has by now become a bit of a legendary poweruser, and has without a doubt the largest number of forks on the entire platform: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Screenshot-2023-06-26-at-18.58.45.png) A whopping 12k sketches! What's more is that Raph actually managed to get a hold of the legendary poweruser! He'll be live on stream with Raph tomorrow at 16:00 CEST - and if that isn't enough yet, Sinan, the creator of Openprocessing, will also be a cohost of the episode! If my writing style in this section hasn't conveyed - I'm super excited! Also if you missed it, [Sinan was on the show last week](https://www.twitch.tv/videos/1851162809?ref=gorillasun.de) \- it was a very interesting conversation around Openprocessing, how it came to be and what's in store for it in the future: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Screenshot-2023-06-26-at-19.01.20.png) Last week on Raph's stream! ## Interesting Reads I've got quite a few reads for you this week! ### Various *Making Of*s With the wonderful Proof of X exhibition coming to a close, it just feels right to include some articles by my fellow generative artists that also participated! Conatus shared a tweet in which they give a shout out to some of the Proof of X artists' writings - I wasn't aware that quite a few of my fellow gen artists also made write ups about their projects, new and old, hence I'd like to showcase them here: > [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 内のfx(text)に”.r🜨tation”の作品解説や裏話を投稿しました。[https://t.co/Lekm5sNAM1](https://t.co/Lekm5sNAM1?ref=gorillasun.de) > > この機会に、今回出展されている、[@proofofx\_](https://twitter.com/proofofx%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) with [@KUMALEON\_](https://twitter.com/KUMALEON%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ✖️[@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 出展アーティストの方のfx(text)の記事について、勝手ながら少し紹介させていただければと思います⬇️⬇️[#proofofx](https://twitter.com/hashtag/proofofx?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxtext](https://twitter.com/hashtag/fxtext?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > — .𝒄𝒐𝒏𝒂𝒕𝒖𝒔 (@ConatusLab) [June 23, 2023](https://twitter.com/ConatusLab/status/1672171074908475392?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Making of Generative Glasses by [C4RCO](https://twitter.com/c4rc0?ref=gorillasun.de): [fxhash - How Generative Glasses were madeAfter 4 months of coding the Generative Glasses is ready! I gained a lot of experience along the way and I really liked the creation process, so now I’m sharing with you how it was made…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmeVy9dqmBA7SoMbMLfdD6nU4SP92zJvY5x2RvfsFYLihV)](https://www.fxhash.xyz/article/how-generative-glasses-were-made?ref=gorillasun.de) Making of Astronomic Comics by [Frank Force aka killedByAPixel](https://twitter.com/KilledByAPixel?ref=gorillasun.de): [fxhash - Astronomic Comics – Generative Comic BooksAstronomic Comics generates space themed comic book pages entirely from code and basic drawing functions. In this post I give some background behind the piece, explain how the features work, and share some of my favorite results.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmZgCT521XSBfKvoBLrfkxsp6DzanfJbrEMU3QS1PFerRr)](https://www.fxhash.xyz/article/astronomic-comics-generative-comic-books?ref=gorillasun.de) Making of Rotation by .[conatus](https://twitter.com/ConatusLab?ref=gorillasun.de) \- it's in japanese but translating the page with your browser works just fine: [fxhash - .r🜨tation.r🜨tationの日本語版の説明(+補足、+裏話)になります。この文章は全文日本語で暗号化されています。![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmdTaTwzbf5AoPHJifeZuL2yM4qVEzZWrP6RgamcNiYgYP)](https://www.fxhash.xyz/article/.rtation?ref=gorillasun.de) [Samuel Yan](https://twitter.com/SamuelAnn0924?ref=gorillasun.de) also wrote about his generative Koi ponds: Similarly [eziraros](https://twitter.com/s%5Fr%5Fr%5Fz%5F?ref=gorillasun.de) published a write up on their stunning piece as well: [『台灣建築記憶』の話|ezirarosezirarosです。よろしくお願いします。 最近作ったジェネラティブアート作品『台灣建築記憶』が、2023年6月17日から6月25日(日)まで『Proof of X - Blockchain As A New Medium For Art -』で展示されます。 今回はこの作品を紹介しようと思います。 作り始める前に 5月にfxhashのDiscordサーバーでこのメッセージを見ました。三週間ぐらい完成できるかと心配していたが、やっぱりこのチャンスを見逃したくない!と申し込みフォームを送りました。 「Blockchain As A New Medium For Art」というテ![](https://assets.st-note.com/poc-image/manual/note-common-images/production/icons/android-chrome-512x512.png)ezirarosnote(ノート)![](https://assets.st-note.com/production/uploads/images/109058179/rectangle_large_type_2_deb277a045570ffc97cad5241bc0113f.png?fit=bounds&quality=85&width=1280)](https://note.com/s%5Fr%5Fr%5Fz%5F/n/n8e0ed2bee22a?p=1&ref=gorillasun.de) I might have missed some, let me know - thanks for the lovely write-ups! ### How to (Really) Make It in Web3 The [Vertical Crypto Art](https://twitter.com/verticalcrypto?ref=gorillasun.de) residency is a learning program with the goal of fostering new talents in the Web3 space, I found these statements from their graduates on their post-residency endeavors highly motivatin: [How To (Really) Make It in Web3For graduates of the VCA Residency, community is key to success as a crypto artist![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)María Paula Fernández![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/6435b1354674c8b6abdabdd3_799695101817041L.png)](https://www.rightclicksave.com/article/how-to-really-make-it-in-web3?ref=gorillasun.de) Maybe that even sounds like something for you, check it out! ### In Conversation with Per Kristian Stoveland [Spectrum: In Conversation with Per Kristian Stoveland | Art BlocksWe had the opportunity to interview generative artist Per Kristian Stoveland (perkwerk). In this conversation, we hear more about his project, The Harvest, his artistic practice, and the discovery of NFTs and the crypto art world.![](https://assets.website-files.com/62fe95d11738cfa39c3573b0/634ed02d05e56b505a01497f_favicon.png)Art Blocks![](https://assets.website-files.com/62fe95d11738cf95c53573dd/63bdc97c18897a82fa9df912_hero_StovelandPerKristian.jpg)](https://www.artblocks.io/info/spectrum/in-conversation-with-per-kristian-stoveland?ref=gorillasun.de) I keep discovering interviews with important folks in the generative art/creative coding scene - really feels like I should make some sort of index at this point 🤔 ### Alejandro Campos' Gen Art Journey Alejandro Campos talks about his creations in this thread, coming from a background in Architectural design, his generative art sets itself apart with a very distinct feel to other stuff that I see contemporarily: > Story time. > A GenArt Journey > > In May 2022, I published my first [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) project, 'Maps of Life'. > > Let's recap these 13 hectic months of coding and art experiments![#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > 🧵👇 [pic.twitter.com/KiDV9S98cB](https://t.co/KiDV9S98cB?ref=gorillasun.de) > > — Alejandro (@ratchitect) [June 25, 2023](https://twitter.com/ratchitect/status/1672955986770812929?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Edward Hopper's Art And to conclude this section - something genart unrelated. I'm a big fan of Edward Hopper's Nighthawks and always found the conversation around the artwork very interesting. Apparently the lack of an entrance to the diner seems to have some deeper philosophical meaning - whereas others claim that the entrance is just off to the right side of the canvas. What do you think? Hopper has a lot of other stunning artworks that are showcased throughout this Twitter thread: > Why Edward Hopper is (probably) the greatest ever American artist: [pic.twitter.com/QNPQvBw8pz](https://t.co/QNPQvBw8pz?ref=gorillasun.de) > > — The Cultural Tutor (@culturaltutor) [June 20, 2023](https://twitter.com/culturaltutor/status/1670984927351848962?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## AI Corner ### Scary applications of ML I found this video highly interesting - Enzo Avigo talks about two scary applications of machine learning. One of them is the translation of brain activations into images, essentially constituting a method to read minds. How accurate it is, is questionable, but with enough data I have no doubt that it can be relatively accurate. A second one is the estimation of someone's position in a room, solely via the WiFi signal, meaning that everyone already has a surveillance camera built into the home. > We’re basically done. [pic.twitter.com/wju8TU1mBg](https://t.co/wju8TU1mBg?ref=gorillasun.de) > > — Enzo Avigo (@0zne) [June 23, 2023](https://twitter.com/0zne/status/1672210835043676163?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Ivona Tau on long-form generative AI Ivona Tau also spoke about this topic in [this Twitter space](https://twitter.com/i/spaces/1zqKVPerEzZJB?s=20&ref=gorillasun.de): > What is long-form generative AI? > > Similarly to “traditional” generative art, instead of crafting a single piece, you design a system/ train a model that is able to create images according to your vision. It adds an element of serendipity as collector becomes the first human to… [pic.twitter.com/I8sA4j2lvN](https://t.co/I8sA4j2lvN?ref=gorillasun.de) > > — Ivona Tau (@ivonatau) [June 22, 2023](https://twitter.com/ivonatau/status/1671862656288845826?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Gorilla Articles ### Gorilla on Tender's front page Another big thing (for me at least) that happened this week was FxHash retweeting my post in which I look back on two years of making art on the platform (and on the blockchain in general): > Talk about an important read 🔖 > > In Making Generative Blockchain Art on fxhash: A brief Retrospective, [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) details important lessons & wisdom learned from nearly 2 years of creating art on the platform.[https://t.co/xaTZ3K9XtM](https://t.co/xaTZ3K9XtM?ref=gorillasun.de) > > Found on the [@tender\_art](https://twitter.com/tender%5Fart?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) homepage under the… > > — fxhash (@fx\_hash\_) [June 22, 2023](https://twitter.com/fx%5Fhash%5F/status/1671674809036709889?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Following the lead at the end of their quote tweet, I traced my post back to the front-page of [tender](https://tender.art/?ref=gorillasun.de) \- it's an incredible honor to find my article on their front page: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-29.png) ### Optimizing Particle Systems with a Grid Lookup and Spatial Hashing I resumed working on the Particle System code that we started almost a month ago now, the aim of this follow-up is to optimize our system and be able to add many more particles than we were able to before: > It's Thursday, which means new tutorial is up on the blog! 📬✨ > > This time we continue with the particle system that we started working on in the last tutorial, and greatly improve it's performance with a grid lookup!🔨 > > Link 👇 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/gkjwpn5U6z](https://t.co/gkjwpn5U6z?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 22, 2023](https://twitter.com/gorillasu/status/1671837552733483008?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [Optimizing Particle Systems with a Grid Lookup and Spatial HashingIn this post we have a look at a method with which we can greatly improve a collision detection system. Using a lookup grid we can greatly reduce the number of required checks between particles. We will also look at some methods to optimize this lookup grid.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/circs.png)](https://www.gorillasun.de/blog/particle-system-optimization-grid-lookup-spatial-hashing/) ## Gorilla Sketches This week I only had little time again to work on some new sketches, and I don't really know where it's going yet - but it always feels god to reiterate on a previous idea and be able to visualize quickly and more efficiently than before. Just a simple triangle packing idea: > [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/haB14VOjaH](https://t.co/haB14VOjaH?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 20, 2023](https://twitter.com/gorillasu/status/1671051312631357441?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Besides that I also worked heavily on my portfolio over the weekend, it's starting to feel like one of those things that I simply have to power through to get it done - but I'm very happy with the system that I've put in place and it should allow me to document my work in a much more organized manner in the future: > Ok I ditched the borders and went with a more elegant design - also added an icon list at the bottom, makes it easier to find specific projects. Finding stuff from 22-21 and annotating it is going to be a non-trivial task though 😅 [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/QfNpX67fs7](https://t.co/QfNpX67fs7?ref=gorillasun.de) [pic.twitter.com/hPSc9SDWJv](https://t.co/hPSc9SDWJv?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 25, 2023](https://twitter.com/gorillasu/status/1673026000177750017?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Hoping to wrap it up soon and have it out in the world for everyone to play with! --- 'The Great Traversal' is coming to Alba in less than 2 days - I'm super excited, if you collect on eth you don't want to miss this one! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Screenshot-2023-06-26-at-21.30.47.png) [Check out the project page here](https://www.alba.art/projects/the-great-traversal?ref=gorillasun.de) --- ## Music for Coding Do you sometimes feel like a rabbit that hunts tigers? yes? I do too - and I've got just the right album for you! Jokes aside, the sounds on this are easily among the top 5 things I've heard in past years: **And that's it from me again this week - cheers, happy coding, see you in the next post, and consider sharing this one on your socials, or with friends and family \~ Gorilla Sun 🌸** ### Optimizing Particle Systems with a Grid Lookup and Spatial Hashing URL: https://www.gorillasun.de/blog/particle-system-optimization-grid-lookup-spatial-hashing/ Last updated: 2023-07-26T16:29:58.000Z **In this article we pick up from where we left off in the previous tutorial on particle systems. The main bottle-neck of our primitive collision system is the number of checks that have to be made to determine if two particles collide. In this naive approach, each particle is compared against each other particle, which is a rapidly increasing number of checks, the more particles there are in the scene. In this post we'll have a look at a method to optimize this.** To recap the previous post; last time we dealt with the fundamentals of object oriented programming, to create a *system* with multiple entities that can interact with each other according to our specifications. We also implemented the physics involved in making our particles move around on the canvas, such that they fall towards the bottom of the canvas, and collide with the boundaries of the canvas as well as each other. Here's what we'll have put together by the end of this tutorial - (might not display in email): ## On Algorithmic Complexity Before we try to optimize our particle system it's probably best to have a look at algorithmic complexity - what that actually means - and how to asses whether a piece of code is considered efficient at what it does, or not. In the case of our particle system, as we crank the number of particles in the scene we'll quickly reach a threshold where it takes the CPU more time to execute one iteration of the draw loop, than the duration of a single frame. Say we have two particles in the scene, we would just have to make a single check. Now say we have four particles in the scene, how many collision checks do we have to make to determine if any two particles are colliding? The first particle would have to be checked against the other three, the second one against the third and the fourth, and the third one against the fourth. So 6 checks in total. Now let's crank up the number of particles even more, what if we have 20 particles? That would be 190 checks, for 50 particles 1225 checks, and so on. And that's assuming that we've implemented our code in an efficient manner, our final code from the last time doesn't actually remember that particles that have already been checked against each other, hence there's multiple duplicate checks as well. At a larger number of particles, this will cause noticeable visual stutter/lag as the browser is playing catch-up with the frame rate, never really making it in time. Moreover, Javascript is not the fastest language out there. When working with the java-like processing language, instead of P5, we can get away with a lot more inefficiency, due to it being a compiled language, as opposed to it's browser compatible younger sibling P5. ### Towards a more efficient approach Well, how do we make this more efficient? I talked about the powerful grid lookup method in a previous article: [A Simple Solution for Shape Packing in 2DShape packing is a popular type of sketch in gen-art, but is often trickier than it might seem when you try to pack anything more complicated than a simple circle. In this post we’ll have a look what goes into collision detection as well as a strategy to pack any arbitrary shape in 2D.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Ahmad MoussaGorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/banner2.jpg)](https://www.gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d/) Back then however, it was in the context of a static sketch - this time around we're dealing with moving particles that can update their positions, which is slightly trickier. We can make an optimization to our procedure based on a simple observation: if two particles are very far apart, we don't need to check if they collide - we only need to check for collisions between particles that lie in each other's vicinity. For this we need some way to determine what particles are close to each other and which aren't. One strategy in that regard is a grid lookup. A grid lookup divides the canvas into smaller rectangular patches, where each patch knows which particles it currently contains. This way we only need to check into which patch a particle falls into, fetch the other particles that are currently in that patch and compare against them. I believe that this is also frequently called spatial hashing, where the canvas (or the scene in the case of a video game), is divided into several bins/buckets, each of which has knowledge about which particles/entities it contains. Spatial hashing doesn't necessarily have to be done with a grid, but can frequently make use of some other data structure. Now, let's get started on implementing a grid lookup! ## Implementing a Grid Lookup The best way to represent our grid is by modeling it as another object: ```javascript class Grid { constructor(canv_wid, canv_hei, s) { this.cellSize = s; this.numCols = Math.ceil(canv_wid / s); this.numRows = Math.ceil(canv_hei / s); this.cells = []; for (let x = 0; x < this.numCols; x++) { this.cells[x] = []; for (let y = 0; y < this.numRows; y++) { this.cells[x][y] = []; } } } } ``` There's a few things that we need to do in the constructor to set up our grid. The constructor takes as inputs the dimensions of the canvas as well as a size parameter which determines how large the grid patches are - this parameter will be important later on. Here you might notice that these rectangular patches are also called *cells*. I'll use both terms interchangeably. Next we need to determine how many columns and rows of patches there need to be to cover the entire canvas. This is done by dividing the respective canvas dimensions by the cell size parameter. We are taking the ceiling of this computed value to ensure that the entire canvas is covered by cells. In this manner we have essentially created a 2 dimensional array of cells that cover the canvas. Each cell itself is an array that will in the future contain a number of particles. ### Adding and Removing Particles This grid is only useful if we can also add and remove particles to/from it. We'll do this via member functions: ```javascript addParticle(particle){ let col_idx = Math.floor( particle.pos.x / this.cellSize); let row_idx = Math.floor( particle.pos.y / this.cellSize); this.cells[col_idx][row_idx].push(particle) particle.gridCell = { col: col_idx, row: row_idx } } ``` Depending on the particle's position we need to compute into which grid cell it falls. We do so by dividing it's coordinates by the cell size, and then floor that number to an integer such that we can use it as an index to access the grid. Then we simply push that particle to the array of particles that represents the corresponding grid cell. There's also another special thing that we need to do here, we have to add a new property to our particle object called *gridCell* \- the particle itself also needs to know in which grid cell it falls into, this is important for us to fetch nearby particles to check for collisions. Hence, we simply add the indices of the grid cell as a property to the particle. Now removing a particle is done in a very similar manner: ```javascript removeParticle(particle) { let { col: col_idx, row: row_idx } = particle.gridCell let cell = this.cells[col_idx][row_idx]; let arr_idx = cell.indexOf(particle); cell.splice(arr_idx, 1); } ``` Here we destructure the particle's gridCell property - which we created when we added it to the grid - into a column and row index. We'll also get the index of this particle in the particle array of the cell and make use of the splice function to remove it. ### Getting a Particle's Neighbours Now for the main purpose of the grid, fetching a given particle's neighbors: ```javascript getNeighbors(particle) { let top_left = [ floor((particle.pos.x - particle.radius) / this.cellSize), floor((particle.pos.y - particle.radius) / this.cellSize), ] let bottom_right = [ floor((particle.pos.x + particle.radius) / this.cellSize), floor((particle.pos.y + particle.radius) / this.cellSize), ] let neighbors = [] for (let i = top_left[0]; i <= bottom_right[0]; i++) { for (let j = top_left[1]; j <= bottom_right[1]; j++) { if (i < 0 || j < 0 || i >= this.numCols || j >= this.numRows) continue let c = this.cells[i][j] for(let p of c){ // don't add the particle itself if(p != particle) neighbors.push(p) } } } return neighbors } ``` We essentially need to determine all the cells that the given particle is touching - for this we need to consider it's radius. We find the column and row indices for the cell that the particle's top leftmost part falls into, as well as the indices of the cell where it's bottom rightmost part falls into. Then we loop over all the cells in between, because these could potentially have particles that we're colliding with. We fetch all of the particles that are inside of these cells and return them in form of an array. ### Changes to the main draw loop The draw loop needs to account for our grid lookup: ```javascript function draw() { background(220); for (let p of particles) { let neighbors = grid.getNeighbors(p) p.checkCollision(neighbors) p.updateState(); p.display(); p.displayDirection(); } for (let p of particles) { p.checkEdges(); } // reset the grid by removing all particles and adding them again for (let p of particles) { grid.removeParticle(p) grid.addParticle(p) } } ``` The checkCollision() function of each particle now accepts an input parameter, which is simply a list of particles - it's neighboring particles. The function itself didn't change overall except that it now loops over this list instead of all other particles. We also check for the canvas boundaries in a separate step after collisions have been resolved. We want to make sure that the particles never leave the canvas, as it would throw an error when we try to look up a particle that is outside of the canvas boundaries. Lastly, and very importantly, we need to account for the movement of the particles, there's a chance that they will end up in different grid cells every frame. This can simply be solved by removing all particles from the grid and then adding them again. This can however also be done at the end of a particle's update function: ```javascript grid.removeParticle(this) grid.addParticle(this) ``` ### The grid lookup in action And here's all of what we covered in action, click and drag your mouse across the canvas to generate new particles: If you're on firefox this sketch might run just a little bit slow at a very large number of particles \~5k, whereas it runs decently on the other common browsers like Chrome and Brave. ## Comparison with the naive Approach So how much faster is this method to the naive approach in which we loop over all other particles? Let's do a little test and compare the average time it takes the draw loop to compute one iteration of our system. Not a super accurate test by any means, but simply using javascript's console.performance() function I measured the time to compute all of the functions related to computing and drawing the particles: ```javascript function draw(){ // other code let start = performance.now(); // particle code goes here let end = performance.now(); sumFrameDuration += end - start // other code if(frameCount > 1200){ console.log(sumFrameDuration/1200) noLoop() } } ``` I ran both the naive approach from last time as well as the one with the grid lookup method on 5000 particles, for a duration of 20 seconds and 60 FPS. The naive approach takes roughly 203 ms per frame, whereas the grid lookup only takes roughly 4 ms! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-97.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-98.png) That is much, much faster! ## Further Improvements ... ? There's a few things that we can do to further improve this - starting with the obvious ones: 1. We only need to check for collision with the canvas boundaries if the particle is in one of the grid cells located at the border of the grid. 2. We also only need to update a particle's grid cell if it's new position falls into a new grid cell. We can account for both of these things in one swoop by modifying the code in our draw loop: ```javascript for (let p of particles) { let neighbors = grid.getNeighbors(p) p.checkCollision(neighbors) p.updateState(); } for (let p of particles) { let px = ( p.pos.x / grid.cellSize ) | 0 let py = ( p.pos.y / grid.cellSize ) | 0 if( px == 0 || px == grid.numCols-1 || py == 0 || py == grid.numRows-1 ){ p.checkEdges(); } if( px != p.gridCell.col || py != p.gridCell.row){ grid.removeParticle(p) grid.addParticle(p) } p.display(); } ``` We can also save a couple of micro-barks by using a nifty bit shifting trick to floor the numbers. ### Computing Square roots The Euclidian distance requires the computation of a square root, this is not efficient and can quickly add up to a significant overhead. Thing is, we don't actually have to compute the square root, we can do without it and substitute with an alternative measurement that works just as well and doesn't require a square root - the squared distance: ```javascript function squareDist(p1, p2) { return (p1.x - p2.x)**2 + (p2.y - p1.y)**2 } ``` For this we also need to modify the calculation of the collision resolution: ```javascript checkCollision(otherParticles) { for (let n = 0; n < otherParticles.length; n++) { let other = otherParticles[n] if (this != other) { let distance = squareDist(this.pos, other.pos); let minDistance = (this.radius + other.radius)**2; // squared sum if (distance <= minDistance) { // everthing here stays the same // Repulsion force needs to be divided by square of mass this.pos.sub(p5.Vector.div(repulsion, this.mass**2)); other.pos.add(p5.Vector.div(repulsion, other.mass**2)); } } } } ``` I'm also not certain if the other p5 vector operations are the fastest out there, so there might be some merit in improving those as well. ### Duplicate Collision Checks There's a fantastic series of videos on this very topic - particularly for game development - by SimnDev on Youtube, the linked video is the second part in which he talks about optimizing his grid lookup method with various tricks: One of them is a simple query counter to avoid duplicate collision checks. We add a counter to the grid class and a counter to each particle. The grid's counter gets initialized to 0, whereas the particle counters are initialized to a value of -1. Now in the method that fetches a particle's neighbors, we increment this counter indicating that a new query has been made. Before we add a particle to the array that will be returned we check if it's query counter is equal to the current query's value, if it is then we have seen this particle already. Otherwise we haven't encountered it yet and add it to the array, and also update it's query counter: ```javascript let neighbors = [] let queryId = this.queryIds++ // the grid's query counter for (let i = top_left[0]; i <= bottom_right[0]; i++) { for (let j = top_left[1]; j <= bottom_right[1]; j++) { if (i < 0 || j < 0 || i >= this.numCols || j >= this.numRows) continue let c = this.cells[i][j] for (let p of c) { // don't add the particle itself and check query id if (p != particle && queryId != p.queryId ) { neighbors.push(p); p.queryId = queryId; // assign new query id } } } } return neighbors ``` ### Other ideas There's some more ideas here: 1. Replacing the for ... of loops with imperative loops could also have some merit as it seems that imperative loops are slightly faster. But then we would also have to manually access the arrays which I'm not certain would ultimately win us any time. Worth a try though. 2. Choosing the optimal cell size is also very important, as it balances between the accuracy of the collision detection and the speed of the overall procedure. I think that a cell size that's slightly larger than the largest diameter of any particle is best in this case. But if you have wildly varying particle sizes then a different value might be better. ### Improved Grid Performance I did another test, this time with 10k particles at 60fps for 20seconds, and with all of these small improvements we shave off 2ms on average, which I think is pretty good all things considered. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-99.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-100.png) The improved grid lookup vs the unimproved grid lookup At a larger number of particles we will probably notice an even larger difference, at lower particle numbers we might actually be a bit slower due to all of the checks adding an overhead instead of making things faster. And here you can try it for yourself - the difference is most likely not very noticeable though: ### Considerations I ended up spending much more time on this than I initially anticipated, finding myself descending an optimization rabbit hole. Here I have to ask myself though - what's the point of all of this? What is an actual use case of a large particle system in Javascript? I don't actually know; this could be useful for a browser based video game in which we have to determine collisions between entities in the game, but then again, it would have to be a very special type of game to require such a large number of particles/entities/units. In that case you should probably consider using something other than JS. If it has to be in the browser then a shader is probably the way to go, otherwise you'd just use a compiled language that just inherently runs faster than JS. That aside, it's still an interesting problem worth exploring, even though the upper bound of this grid lookup method is reached fairly quickly it's still useful for many things, for instance something I did with random walkers where I had to find nearby nodes quickly: > Grid lookup implemented ✅ much much faster now! 🚀 [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/YT5kRtRyDY](https://t.co/YT5kRtRyDY?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 8, 2023](https://twitter.com/gorillasu/status/1666785582721167360?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Closing Thoughts For the sake of completeness here's the code for the three versions that we ultimately ended up with - the naive approach, the grid implementation, and the improved grid implementation: [Different particle system implementationsIf you want to test these for yourself - otherwise check the openprocessing sketchesparticle\_system.zip230 KBdownload-circle](https://www.gorillasun.de/content/files/2023/06/particle%5Fsystem.zip "Download") This has been a very satisfying learning experience, and I might just try to build my own little game in the coming weeks - it's been something that I've wanted to do for a while now, and a little shmup (shoot em up) doesn't seem so complicated anymore. **That's it from me, let me know what you thought about this article in the comments 👇 otherwise consider sharing the post with friends and family on your socials, as well as signing up to the newsletter to receive updates whenever there's new content. Cheers, happy coding \~ Gorilla Sun 🌸** ## ### Gorilla Recap 9 URL: https://www.gorillasun.de/blog/gorilla-recap-9/ Last updated: 2023-12-19T23:11:52.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** You may have noticed already but I've shuffled the sections around a bit again, I'm still in the process of figuring out how to best structure this newsletter - and depending on how many interesting things I can find every week the sections might still change, until I can find a good rhythm and a meaningful layout! ## Genart Updates It's been a wild week again - here's noteworthy events from the world of generative art and creative coding 👇 ### Dmtri Cherniak's 'The Goose' auctioned off at Sotheby's for 6.2M The biggest event of the past week by far! Dmitri Cherniak's Goose was auctioned off at Sotheby's for a whopping 6.2M: > [#AuctionUpdate](https://twitter.com/hashtag/AuctionUpdate?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): One of the most important works of post-blockchain generative art,[@dmitricherniak](https://twitter.com/dmitricherniak?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)’s Ringers #879 (The Goose) has just sold for $6.2 million, making it the 2nd highest generative art sale of all time. [#SothebysGRAILS](https://twitter.com/hashtag/SothebysGRAILS?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/dKyqxGbAIZ](https://t.co/dKyqxGbAIZ?ref=gorillasun.de) [pic.twitter.com/zkxoP21M9e](https://t.co/zkxoP21M9e?ref=gorillasun.de) > > — Sotheby's Metaverse (@Sothebysverse) [June 15, 2023](https://twitter.com/Sothebysverse/status/1669441570863566875?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This also ensued a wave of covers and spin off artworks as homages to the Goose: > There are, most certainly, an almost infinite number of ways to wrap a string around a set of generative plants. > A maximalist-post-minimalist tribute to [@dmitricherniak](https://twitter.com/dmitricherniak?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)’s Ringers "The Goose" #879 ✨ [https://t.co/IjYn4FMSxY](https://t.co/IjYn4FMSxY?ref=gorillasun.de) [pic.twitter.com/pa7Mw33exf](https://t.co/pa7Mw33exf?ref=gorillasun.de) > > — zancan 🌿 (@zancan) [June 17, 2023](https://twitter.com/zancan/status/1670215944520474624?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Dmitri Cherniak's statement after the auction is also very worth reading: > Computer and code-based art is an art form that has been around for almost a century with very little fanfare. It is an extremely fascinating art form and has a rich history. It has been despised at many points throughout its history and its innovators were harassed. I am not an… > > — Dmitri Cherniak (@dmitricherniak) [June 16, 2023](https://twitter.com/dmitricherniak/status/1669668978904506368?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Proof of X kick off in Tokyo Proof of X kicked off this past Saturday - and even though I'm not physically there, it was still humbling to see all of the hard work that went into it! I had the honor to participate with a token of mine 'Somewhere in Between' for the FxHash live minting section of the exhibition. Here's a sneak peek: > Here's what the live minting room looks like! ✨ > > Kind of surreal to have my piece on such a large screen somewhere so far away! [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [@proofofx\_](https://twitter.com/proofofx%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Also big thanks to everyone who'se collected some more editions since yesterday! 🙌 [pic.twitter.com/nEGBMYAX7o](https://t.co/nEGBMYAX7o?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 18, 2023](https://twitter.com/gorillasu/status/1670420029056196609?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Many more pics were shared over on Twitter Also, if you want to hear my stupid voice you can do so in the Twitter space that will be held on the 21st of June at 2:00 PM CEST/8:00 PM JST via the Proof of X twitter account - there should be an announcement about it soon! > On my 1st trip to Tokyo, got to know that [#ProofOfX](https://twitter.com/hashtag/ProofOfX?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) was happening, and it was a great experience to attend and try params. Great work [@KUMALEON\_](https://twitter.com/KUMALEON%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) team ! [pic.twitter.com/XxICl6MgQA](https://t.co/XxICl6MgQA?ref=gorillasun.de) > > — Saurabh (@saurabhdhiman) [June 18, 2023](https://twitter.com/saurabhdhiman/status/1670376378007691271?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Alba's Group Show 'FLATLANDS' - 3 months in the Making I'll make some more announcements over on Twitter in the coming days - I'm super excited to be part of Alba's first group show. Working with Haiver was a real pleasure - check out all of the details 👇 > 1/ For three months I've been curating an online group show of generative art called FLATLANDS. The show explores questions around the two-dimensional picture plane, flatness, texture and skeuomorphism. > > It releases on [@albadotart](https://twitter.com/AlbaDotArt?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) starting Tuesday and runs through June 30th 🥳 [pic.twitter.com/vk2KZRXg0b](https://t.co/vk2KZRXg0b?ref=gorillasun.de) > > — Haiver (@HaiverArt) [June 16, 2023](https://twitter.com/HaiverArt/status/1669733124735893505?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The dedicated page for the group show is also already up, with some beautiful words from Haiver: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-27.png) ### Processing Community Catalogue The processing community catalogue has been slowly rolling out over the past few weeks and arriving to members of the community - look at this chonky orange unit: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/IMG_2452.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/IMG_2444-1-1.jpg) It's been such a joy flipping through the pages and seeing so many familiar names and artworks, you can check out the online version of it here: [20th Anniversary Processing Community Catalog : Processing Foundation : Free Download, Borrow, and Streaming : Internet Archive“What does being a part of the Processing community mean to you?” In response to this question from our community of contributors, we’ve created a…![](https://archive.org/images/glogo.jpg)Internet Archive![](https://archive.org/services/img/processing-community-catalog-2021)](https://archive.org/details/processing-community-catalog-2021) ## Interesting Reads of the Week ### What is Archetype by Kjetil Golid - A Thread Twitter user aramunu compiled a in depth thread about all of the aspects that make Kjetil Golid's *Archetype* an impressive feat of generative art: > Archetype explores the use of repetition as a counterweight to unruly, random structures. As each single component look chaotic alone, the repetition brings along a sense of intentionality, ultimately resulting in a complex, yet satisfying expression - Kjetil Golid > 1/ What is Archetype by [@kGolid](https://twitter.com/kGolid?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and what makes it so special? > > Amidst all the monster generative art sales and the upcoming Sotheby's auction, I thought I would share some of my insights [pic.twitter.com/BOfP0iVkEC](https://t.co/BOfP0iVkEC?ref=gorillasun.de) > > — aramunu.eth (.tez) (@aramunu) [June 10, 2023](https://twitter.com/aramunu/status/1667601922772090880?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Writing - An act of Seduction Substack recently released a Twitter-like section to their platform called Substack Notes. And it's been an interesting alternative space, Substack as a platform primarily revolves around written content - and that it reflected in Notes, giving rise to a new type of short form writing. Laurie Stone uses it as an interesting literary vessel: [Laurie Stone is using Notes to seduce new readersIn Notes, the ultimate goal is not attention or likes; it is to form deep relationships between writer and reader![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31585c04-97f0-42e1-84f0-a9b064b71d0b%2Fapple-touch-icon-1024x1024.png)On SubstackHamish McKenzie![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-video.s3.amazonaws.com%2Fvideo_upload%2Fpost%2F128356558%2F1d6cea25-78d4-4112-8fc5-63b23b3f9a89%2Ftranscoded-00001.png)](https://on.substack.com/p/lauriestone-notes) ## AI Corner ### ChatGPT and the Intelligence Explosion Emergent Garden is a youtube channel that I recently discovered and that makes some banger videos a la 3blue1brown - in this one he goes over recent advancements in AI - many of the animations in the video were made with help from ChatGPT: ### An Interview with Ivona Tau Ivona Tau talks about working with AI, GANs and Neural Networks - the interview goes in depth about her practices and how she envisions the future of AI in it's current form: > 🔔🎬 The wait is finally over! > > My full interview with the trailblazing AI artist, [@ivonatau](https://twitter.com/ivonatau?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), is now live on Art Bytes! > > Dive into Ivona's world of generative art, AI research, and universal memories. Be ready to have your perceptions of Art and AI challenged! [pic.twitter.com/zQfbvBorrJ](https://t.co/zQfbvBorrJ?ref=gorillasun.de) > > — Eko33 (@Eko3316) [June 17, 2023](https://twitter.com/Eko3316/status/1669972393748570112?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Gorilla Articles ### A Beginner's Guide to collecting Art on Tezos This week we got an article that's not been posted on the blog itself, but rather on FxText - my submission the the Temple x FxHash #Web3Writers contest. You might already be well versed in navigating the Tezos eco-system, but for anyone that isn't this article serves as a starting point. So, if you know someone - send them this! [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-26.png)](https://www.fxhash.xyz/article/a-beginner's-guide-to-collecting-art-on-tezos?ref=gorillasun.de) [A Beginner's Guide to Collecting Art on Tezos](https://www.fxhash.xyz/article/a-beginner's-guide-to-collecting-art-on-tezos?ref=gorillasun.de) I'll have the article up on the blog as well once the contest concludes! Another post that I really enjoyed here was [Agoston Nagy](https://twitter.com/%5Fstc?ref=gorillasun.de)'s entry: [fxhash - Tezos Art CommunitiesThis article introduces some earlier phases and the current state of web3 art communities, platforms and marketplaces in the Tezos ecosystem. It is focusing on sharing novel visual arts with experimental aesthetics that emerged out of the rapidly changing landscape.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/Qmcnj4YezweA28uRKioYzhigzbHRgmFR3K4CB5oms3nL1v)](https://www.fxhash.xyz/article/tezos-art-communities?ref=gorillasun.de) It takes a little bit of a historic approach to the current marketplaces on the Tezos eco-system, which I found quite interesting! ### Javascript generators for animated generative sketches A big part of my sketches recently have been generators - a convenient way to visualize the drawing process of the initial phase of a sketch. Completing my FxHash project 'Somewhere in Between' recently felt like the perfect moment to reiterate on the topic and make a proper write-up: [Javascript Generators for Animated Generative SketchesIn this tutorial we’ll have a look at javascript generators and how they can be used for animating the drawing phase for our generative sketches. We’ll cover everything from syntax to actually implementing a simple example using p5’s draw loop.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-365--1.png)](https://www.gorillasun.de/blog/javascript-generators-for-animated-generative-sketches/) If you want to learn more about generators, here's an in depth post from last year: [An Introduction to Javascript GeneratorsIn this post we’ll go over everything that you should know about Javascript Generators. Javascript generators are a versatile feature of ES6 and allow for interesting programming strategies, that otherwise wouldn’t be possible.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner--1---1-.png)](https://www.gorillasun.de/blog/an-introduction-to-javascript-generators/) ## Gorilla Sketches This week I didn't have too much time to spend on sketching but I got a few sessions in - yesterday I made a little succulent sketch for sableRaph's weekly creative coding challenge: > Had some time again to make a submission for [@sableRaph](https://twitter.com/sableRaph?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s [#WCCChallenge](https://twitter.com/hashtag/WCCChallenge?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) yesterday! The topic was succulents this time around 🪴🪷 > > Code sketch vs notebook sketch - if you can draw it you can code it! [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/F8n4Fb1Mxy](https://t.co/F8n4Fb1Mxy?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 19, 2023](https://twitter.com/gorillasu/status/1670730920331034627?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And just today I started work on a new project - it doesn't have a specific purpose just yet but I don't want to lose momentum - feeling really inspired and motivated from my recent releases: > New [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) \- redo of a triangle packing idea from way back when, with some additions: > > 1\. Code can limit the acuteness of the triangles > 2\. I can set the margin between packed shapes > 3\. Triangle vertices are sampled from an underlying grid [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 📐 [pic.twitter.com/0K5c6wYau8](https://t.co/0K5c6wYau8?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 19, 2023](https://twitter.com/gorillasu/status/1670769143581220865?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The vision for this one, still a very early #WIP: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/IMG_2454.jpeg) I find that sketching out things on paper is the best way to visually test if ideas are interesting. ## Tip of the Week Struggling with finishing projects? Do like Presstube and sign a contract in blood with yourself: > Finishing things (especially personal projects) can be very hard. I have had issues with it my whole life > > Just found this contract signed IN BLOOD from me to me, from when I was working on Lemon Princess > > It had been dragging on but I shipped within 48 hours of signing > > ✍️🩸✅ [pic.twitter.com/HLhmR5gWbi](https://t.co/HLhmR5gWbi?ref=gorillasun.de) > > — Presstube / James Paterson (@presstube) [June 15, 2023](https://twitter.com/presstube/status/1669389937597087906?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I think that we all struggle with procrastination. ## Music for Coding If you haven't listened to Tycho - then do your ears a favour and put this one on. Again one of those things that you should have listened to at least once in your life. I've been a big fan of Tycho for years, and his music helped through some tough times of my life: **And that's it from me again this week - cheers, happy coding, see you in the next post, and consider sharing this one on your socials, or with friends and family \~ Gorilla Sun 🌸** ### Javascript Generators for Animated Generative Sketches URL: https://www.gorillasun.de/blog/javascript-generators-for-animated-generative-sketches/ Last updated: 2026-08-10T17:11:18.000Z **Sometimes generative artworks need a little bit of time to produce their final graphics. Rather than having the viewer and potential collector wait until these graphics have been drawn to the canvas, it can be beneficial to provide some visual feedback which indicates that the piece is in fact being generated ⚙️** This can be done in form of a loading screen, or alternatively and more popularly as a live visualization of how the artwork is coming together. Contemporarily, many generative artworks include such an initial phase where the piece assembles itself. I'm a big fan of this method, as it gives a glimpse into the inner workings of the algorithm and how it works. 0:00 /0:30 1× Animated drawing procedures of the generative tokens Eucalyptus and Sagebrush and The City If you've ever wondered how a piece like Eucalyptus and Sagebrush or The City are drawn live in your browser, then this article is for you. We're going to have a look at a nifty javascript feature called generators, which can be coupled with p5's draw loop to create a live drawing animation. It's a bit tricky how this works, but by the end of this post we'll have a good grasp on how to implement our own animation generators as well as converting our previous sketches to do so. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/euc.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/ooFgyEKo3txj5ZKhv7zy981K5cT6rPUERVmukF7LQBhAQB6tVWk.png) Eucalpytus and Sagebrush by Nat Sarkissian - The City, a collaborative project by r1b2 and Laxraven ## On JS Generators In very simple terms, generators are basically functions that can be paused. This behaviour is useful in many situations, for instance if you want to perform some computation, be able to halt this process to do some other computation in the meantime, and resume when ready again. Most commonly you'll see generators to define custom iterable and iterable-like behaviour. I've already written in depth about generators in a post from last year: [An Introduction to Javascript GeneratorsIn this post we’ll go over everything that you should know about Javascript Generators. Javascript generators are a versatile feature of ES6 and allow for interesting programming strategies, that otherwise wouldn’t be possible.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner--1---1-.png)](https://www.gorillasun.de/blog/an-introduction-to-javascript-generators/) This time around however we'll focus on using it in conjunction with a draw/animation loop. Let's get started 👇 ### Generator Syntax Let's start with the syntax! A generator is very similar to a regular function, with the distinction that you add an asterisk symbol directly after the function keyword: ```javascript function* someGenerator(){} ``` Same thing if you store the generator as a variable: ```javascript let someGenerator = function*(){} ``` Adding the asterisk symbol tells javascript that a function is in fact a generator. This doesn't do anything just yet, more important is the code that we'll put inside of our generator function. ### yield keyword and the next function The secret sauce to Javascript generators is the yield keyword. Similarly to the return keyword in a regular function, it is used to extract values from a function to an external scope. However, invoking the yield keyword doesn't terminate the function's execution, it only halts it. This is better understood with an example: ```javascript function* numberGenerator(){ let counter = 0; while(true){ yield counter counter++ } } ``` This is a bit of an odd chunk of code to start with, but it immediately showcases a cool use case of generators. In this generator's body we created a while loop that is set to... drumroll - true! Frightening stuff really; but if we use it right then we've actually created quite a powerful thing - and infinite sequence generator! How do we actually use this now? If we call this generator as we would a regular function, not much is actually going to happen. We have to inform the generator that we actually want it to start executing and yield a value: ```javascript // first we create an instance of our generator // storing it as a variable let generatorInstance = numberGenerator() // we invoke the next() function on this generator to get a value out of it console.log(generatorInstance.next()) // prints an object to the console ``` By virtue of being a generator, it has an inbuilt function called 'next()'. This function prompts the generator to execute it's code until it reaches a yield keyword, when it does, it pauses it's execution and returns a small object with two properties. ```javascript Object { value: 0, done: false } ``` The first property is labeled 'value' and the other is labeled 'done'. The value property contains the actual value that the generator extracted, whereas the done property is a boolean that indicates wether the generator has finished it's execution by being truthy. If there are still remaining yield statements in the generator it would be falsy. In our case the generator produces a value of 0 and indicates with a falsy boolean that it isn't done yet. Now the cool thing is that we can call this next function as many times as we want: ```javascript console.log(generatorInstance.next().value) // prints 0 console.log(generatorInstance.next().value) // prints 1 /* Here we can execute some other code The generator will remember where it left off */ console.log(generatorInstance.next().value) // prints 2 ``` Since our generator will virtually never run out of numbers to yield, we can invoke it as many times as we want. This is useful if we want to have an infinite counter. And this already covers the most important aspects of javascript generators! ### Multiple yield keywords Another thing to note, is that a generator can have multiple yield statements throughout it's body, for instance: ```javascript function* twoTake(a, b){ yield a + b; yield a * b; } let gen = twoTake(2, 3); console.log(gen.next().value) // prints 5 console.log(gen.next().value) // prints 6 ``` On the first next call we'll get the result from the first yield statement which performs an addition, the second call you'd produce the result from the multiplication. Having multiple yield statements in a generator will come in handy in a bit. ### Generators are Iterables Although generators may seem like they are functions at first glance, they should actually be treated as iterables. Iterables in javascript are essentially collections of elements that have an inbuilt method for being looped over, I go over this in much more detail in my previous article, where I also discuss how arbitrary objects can be turned into iterables: However the important notion for us here is that generators have the super useful property to be passed to a for ... of loop, for example: ```javascript function* zeroToTen(){ for(let n = 0; n <= 10; n++){ yield n } } for(let num of zeroToTen()){ console.log(num.value()) } ``` Alright, this covers the most important notions of generators, onto using it alongside P5's draw loop! ## Consuming a generator in a draw loop Now let's use our newly acquired knowledge to make some art! Starting with a very simple P5 sketch that draws some elements to the canvas: ```javascript function setup(){ createCanvas(400, 400) } function draw(){ background(0); for(let n = 0; n < 100; n++){ fill(random(255),random(255),random(255)) ellipse(random(400), random(400), random(100)) } noLoop() } ``` Here we're simply scattering some circles at random across the canvas. This happens instantly, we don't actually get to see how these circles are being drawn one after another, even though the code is actually doing that. This is because the canvas only gets drawn once every iteration of the draw loop. However we can trick the draw loop, by not drawing all of the circle at once but rather do it iteratively with a generator. Now we can take this loop, put it inside of such a generator function, and interrupt it with a yield statement after every drawing of a circle: ```javascript let circleGen; function setup(){ createCanvas(400, 400) background(0); circleGen = generateCircles() } function draw(){ let nxt = circleGen.next() if(nxt.done){ console.log('DONE') noLoop() } } function* generateCircles(){ for(let n = 0; n < 100; n++){ fill(random(255),random(255),random(255)) ellipse(random(400), random(400), random(100)) yield 1 // doesn't matter what we yield here actually } } ``` What's important here: 1. We only draw the background once in the setup function 2. Create the generator instance variable globally such that: we can initialize it in the setup, and invoke it in the draw loop 3. Perform the drawing routine in the generator function 4. Call noLoop() when the generator yields a truthy done property And here's what this looks like in action: ## Nesting Generators Sometimes we want to draw our artwork in several phases, for instance we'd first like to draw some background elements, then the main graphics and finally some other details. For this purpose we would split our code into different functions, we can also do this with generators where we chain them together. Here we would create a main generator function that iterates over the smaller subroutines, for example: ```javascript let mainGen; function setup(){ createCanvas(400, 400) background(0); mainGen = mainGenerator() } function draw(){ let nxt = mainGen.next() if(nxt.done){ console.log('DONE') noLoop() } } function* mainGenerator(){ let backGen = backGenerator() let frontGen = frontGenerator() for(let i of backGenerator()){ yield 1 } for(let i of frontGenerator()){ yield 1 } } function* backGenerator(){ for(let n = 0; n < 100; n++){ fill(random(255),random(255),random(255)) ellipse(random(400), random(400), random(100)) yield 1 } } function* frontGenerator(){ rectMode(CENTER) for(let n = 0; n < 100; n++){ fill(random(255),random(255),random(255)) rect(random(400), random(400), random(100)) yield 1 // doesn't matter what we yield here actually } } ``` And in action: ## Animation Speed and FrameRate The number of times that the draw loop is executed within the span of a second is tied to the frame rate. The default value being 50 frames per second. Hence we can slow down and speed up our drawing animation by controlling the frame rate in P5: ```javascript frameRate(25) // put this in the setup function ``` For values larger than 60 fps you might notice that the animation isn't getting any faster anymore. This is due to the frame rate being capped at the refresh speed of your monitor/display, most of which have a refresh rate of 60 fps. There is a workaround however by manually forcing a redraw: ```javascript function draw(){ // generator stuff here setTimeout(redraw, 10) } ``` P5 has a function called redraw(), which when invoked makes the draw loop proceed. By calling this function at the end of the draw loop with the setTimeout function we can make it trigger early and essentially overriding the frame rate. It's important to note here however that it won't magically make your code run faster if you're drawing a lot of graphics to the canvas. It just makes it seem that things are being drawn faster to the canvas. ## Skipping yields Now that we have this elaborate drawing system in place, sometimes we don't actually want to wait for the graphics to be generated, we'd much rather have it generated all at once. For instance when we're testing our code locally and are still in the process of developing a piece, or when the preview images for fxhash are being generated, there we also don't need an animated drawing procedure. One way to do so would be by providing alternative non-generator functions right off the bat, but that would mean a lot of additional code that essentially does the same thing. Alternatively we could iterate over the mainGenerator at the end of the setup function all at once and skip the drawing code in the draw loop via a boolean toggle, or we can even code in a toggle for each and every yield statement. Since our yield statements aren't actually functional, meaning that they don't return any data that we'll make use of in an external scope then we don't need to actually execute them: ```javascript function* generateGraphics(){ for(let n = 0; n < 100; n++){ // draw something here if(!isPreview){ yield 1 } } } ``` If you feel that the drawing animation is slow and you'd like to draw things in batches, you can also for instance only trigger every second or third yield: ```javascript function* generateGraphics(){ for(let n = 0; n < 100; n++){ // draw something here if(n%2 == 0){ yield 1 } } } ``` ## Closing Thoughts And that concludes all that I know about generators and using them to create animated drawing procedures. Hope this is useful to you, and if you end using these techniques tag me on Twitter so that I can feature your creation on here! Here's something cool I did with a generator: > Grid lookup implemented ✅ much much faster now! 🚀 [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/YT5kRtRyDY](https://t.co/YT5kRtRyDY?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 8, 2023](https://twitter.com/gorillasu/status/1666785582721167360?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) **And that's it from me, cheers, and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Recap 8 URL: https://www.gorillasun.de/blog/gorilla-recap-8/ Last updated: 2023-12-19T23:11:58.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** This week again there's been a lot of new stuff! 👇 ## Genart Updates ### Creative Code News #100 [Tune in tomorrow to Raph's twitch stream for the last issue of CC News.](https://www.twitch.tv/videos/1839295084?ref=gorillasun.de) It'll be a little celebration in which Raph looks back on over two years of curating updates and news from the world of generative art, creative coding and computational design. You should join the discord as well, it's by far the most welcoming creative coding community on the internet! ### Non Fungible Conference Lisbon - Feels Like Home Past week NFC Lisbon took place, with a live minting event titled [Feels like home](https://www.feels-like-home.xyz/?ref=gorillasun.de) with some stunning pieces from Elsif, mjlindow, and Leonardo Solas among others. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Qmf6i4vGq9HpN4YywG9pVFbEzGzgB3K9a4bgEm9EfkfapE.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/QmeSCjYTKDB6eVU3M8fCw6SY9ZmChk638574whHUrgM5ss.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/QmUoAYLbYwHNuaTQSz7VwSp3gvfUP1k7vH1F6MNtYEj6fh.png) Slice of Life by Elsif, Rooted by mjlindow, and Before the Strom by Leonardo Solas Kaloh attended the conference and covers everything that you need to know about the conference in his newsletter, check it 👇 [In Case You Missed It - Non Fungible Conference 20236 artists and artworks worth sharing + a bonus upcoming collection…![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47b8413-1777-4daa-b2de-3d90a724a692%2Fapple-touch-icon-1024x1024.png)Kaloh’s NewsletterKaloh![](https://substackcdn.com/image/fetch/w_1200,h_600,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc55b82b-459b-4e5e-bf28-9fb60ba7e6af_400x400.jpeg)](https://www.kaloh.xyz/p/in-case-you-missed-it-non-fungible?ref=gorillasun.de) ### ### Alba launch and first collections [Alba](https://www.alba.art/?ref=gorillasun.de) had a smooth launch last week and saw the release of it's first two generative collections. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-7.png) It's going to be a wile month full of releases in the coming month, so keep an eye out for that. I'll talk a little more about my upcoming Alba piece later in the newsletter 👇 ## Interesting Reads of the Week ### Anna Lucia and the Quilters of Gee's Bend Anna Lucia talks about her biggest project to date, a generative collaboration with the Quilter's of Gee's Bend: [Anna Lucia and the Quilters of Gee’s BendAs generative art collides with quilting, the artists discuss their masterpiece of co-creation with ARSNL![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Abigail Miller![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/64763f348b694b6d754f4331_Screenshot%202023-05-30%20at%2019.23.27.png)](https://www.rightclicksave.com/article/anna-lucia-and-the-quilters-of-gees-bend-interview?ref=gorillasun.de) Essentially each iteration of her project doesn't only exist as a token on the blockchain, but also as a real quilt IRL, and the patterns are simply stunning: > Today, a tangible masterpiece from the “Generations” project by [@annaluciacodes](https://twitter.com/annaluciacodes?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) has found its way to the [#RFCCollection](https://twitter.com/hashtag/RFCCollection?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > This physical quilt, the counterpart to the digital Generation #430, is truly spectacular! > > Read more below👇 > > (1/5) [pic.twitter.com/tARfZiRgo3](https://t.co/tARfZiRgo3?ref=gorillasun.de) > > — Pablo (@pablorfraile) [June 7, 2023](https://twitter.com/pablorfraile/status/1666532769063743491?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Andrew Ng and Geoffrey Hinton chat about the future of AI What actually happens in the human brain when we reason about the real world? How close are we to creating a simulation of the human brain? Do LLMs like ChatGPT and Bard actually *understand* the text that they generate? Andrew NG and Geoffrey Hinton discuss all of these topics in their chat: > Had an insightful conversation with [@geoffreyhinton](https://twitter.com/geoffreyhinton?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) about AI and catastrophic risks. Two thoughts we want to share: > (i) It's important that AI scientists reach consensus on risks-similar to climate scientists, who have rough consensus on climate change-to shape good policy.… [pic.twitter.com/TXT9wgv2TR](https://t.co/TXT9wgv2TR?ref=gorillasun.de) > > — Andrew Ng (@AndrewYNg) [June 11, 2023](https://twitter.com/AndrewYNg/status/1667920020587020290?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) They argue that it is crucial for the research and AI community to come to a consensus: what it means to *understand* something, and if the current AI models are capable of doing so. ### Zancan on the Tezos eco-system There's a big disconnect between the Tezos foundation and the community. In this Twitter thread Zancan calls on the community to voice their concerns, gripes and worries with the current state of Tezos: > [@Tezos](https://twitter.com/tezos?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), > I'd like to start a thread about you. > A honest thread, open to Q&A, where people can share their worries/facts/gossips/whatever > I hope that you can answer and that nobody trolls the thread (please). > — > I've been loyal to [@tezos](https://twitter.com/tezos?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for reasons that have to do with social… [https://t.co/QlAh989h65](https://t.co/QlAh989h65?ref=gorillasun.de) > > — zancan 🌿 (@zancan) [June 11, 2023](https://twitter.com/zancan/status/1667919709826678784?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-6.png) fridgebuzz captures my exact thoughts in their reply ## Gorilla Sketches This week was full of generative - working on two projects in tandem was a bit stressful, therefore there have been no articles. But we're back to our regular scheduling this week! I already have several cool posts in the pipeline! ### Conundrum of Color This week I learned a lot about colors - more specifically, *that I suck at choosing colors*. Color selection for generative art is tough; most palettes that you can find on the web aren't well suited for this purpose, well at least for my sketches... or maybe, like I said, I'm just very bad at picking colors. In the future I might try a different approach, where I spend time on colors first and build the sketch around a given palette, rather than leaving it as a final step in the overall process. On the other hand, it's easy to quickly grow tired of your working palette - so only one way to find out. In other news, I surprised myself with how much art I've already made this year - besides all the blog work that I've been trying to keep up with. It's important to look back sometimes and give yourself a little pat on the shoulder: > I thought I didn't make much art this year... [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 🤔 [pic.twitter.com/gACtchAiQy](https://t.co/gACtchAiQy?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 10, 2023](https://twitter.com/gorillasu/status/1667521808327737344?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Proof of X - Somewhere in Between I put the finishing touches on this project and Gah! the colors really bugged me out in the end - but I think I ultimately found a good selection. As I kept refreshing the piece while working on it, the more I started to dislike the colors, which lead me down a slippery slope of endlessly tweaking colors to no avail. I am really happy with the current state it's in, and I need to remind myself to look at it not from a hyper critical perspective - and most importantly, to give your eyes a little break when you start to hate the color palettes ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-329-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-324-.png) I'm also very happy with the emerging geometric patterns, the algorithm that splits the rectangles into different polygonal regions actually does something really cool - I'll eventually share it in a 'making of' post. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-322-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/img-323-.png) Using a stroke color that isn't pure black can have a nice **hazy* effect on the final composition. I'm really really excited to mint this one and see what collectors ultimately put together with the FxParams editor! ### Alba - The Great Traversal In the meantime I've also continued working on my Alba project and submitted it for review - Haiver who's organizing the group show has helped me tremendously with some invaluable feedback! And I'm pretty stoked about, it'll be my very first piece on ETH, and since it's become a clean chain there's nothing in the way of this genesis. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/0x778a548eca1d549d6d6c994a5ee7708d8b14fb71a0c0c0fdce809de880e1e94b.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/0xb77c708c72ca5004eb15c65f1092897e6a2a6fbe288ced6c88ecdf15985f31a0.png) Random walkers consume points from a Poisson disk distribution. Combined with Hobby curves they form interesting squiggly paths! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/0x2eaf0b5594bed4c145b9b1e53aa5d157b6023708d4fb58c2aafd9176f65d086a.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/0xfb8721f01bb90ceda6e3b6d1cb445c7d3670da3e3d70a2e1c8285a83479e2bce.png) ## Music for Coding Really enjoyed this playlist while coding this week - if you're looking for something serene that teleports to a sunlit office somewhere in the rainy north, then this playlist is for you: **That's it from me again this week! Thanks for reading, cheers, and happy coding \~ Gorilla Sun 🌸** ### Gorilla Recap 7 URL: https://www.gorillasun.de/blog/gorilla-recap-7/ Last updated: 2023-06-05T12:11:50.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** This week again there's been a lot of new stuff! 👇 ## Piter Pasma's Universal Rayhatcher It's probably one of the best times to be alive for learning how SDFs work. If you haven't heard about it yet, [Piter Pasma's Universal Rayhatcher](https://www.fxhash.xyz/generative/slug/universal-rayhatcher?ref=gorillasun.de) has been making the rounds as one of the most innovative uses of FxParams: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/ray.png) Universal Rayhatcher #9 What is the Universal Rayhatcher you ask? Well simply put, it's Piter Pasma's ray hatching framework, repurposed as an fxparams piece where collectors have to write their own SDF code to shape the final iteration. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-5.png) One of the parameters is the SDF code itself. > This is my answer to the question: What is the least restrictive set of parameters for fx(params)? > 1/12 My subscribers, mostly generative art enthusiasts, I want to shine a spotlight on an under-appreciated project. A new chapter in the generative art and creative coding narrative is being crafted, led by [@piterpasma](https://twitter.com/piterpasma?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). [pic.twitter.com/irt9DET4FX](https://t.co/irt9DET4FX?ref=gorillasun.de) > > — Shvembldr (@shvembldr) [May 29, 2023](https://twitter.com/shvembldr/status/1663178459399503877?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The entry point for this project is quite steep, which lead to a number of SDF whizzs to write about how they went about creating their iterations, Claus Wilke wrote two articles in that regard: [fxhash - Rayhatching a UFO sceneA deep dive into how to create the SDF for a UFO flying over a landscape, using Piter Pasma’s Universal Rayhatcher project.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmPMT86Waxbkc6auKJneAajiGvwXMhaGrewYgSMRppFgVy)](https://www.fxhash.xyz/article/rayhatching-a-ufo-scene?ref=gorillasun.de) [fxhash - How StrangerintheQ used rayhatching to create a castleA systematic deconstruction of output #317 of Piter Pasma’s Universal Rayhatcher project, “castle” by StrangerintheQ.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmYxHJUMriRfpcfqSGJseZnT2iCdEcujzFAhhkxNJws63b)](https://www.fxhash.xyz/article/how-strangerintheq-used-rayhatching-to-create-a-castle?ref=gorillasun.de) Two posts by Claus Wilke And another by antiforma on some SDF operations: [fxhash - Revolving, twisting and transforming SDFs!A collection of ideas and techniques for crafting and manipulating SDFs to use with Piter Pasma’s Universal Rayhatcher project.![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmdJgWf9rRcrAarWz7Gu3i5ZbCmwYJ5G2EmyrovNbVasc8)](https://www.fxhash.xyz/article/revolving-twisting-and-transforming-sdfs!?ref=gorillasun.de) The full-documentation for the project can be found here - maybe you can come up with an interesting creation and shoot Piter a message: [fx\_what\_is\_this.mdGitHub Gist: instantly share code, notes, and snippets.![](https://gist.github.com/fluidicon.png)Gist262588213843476![](https://github.githubassets.com/images/modules/gists/gist-og-image.png)](https://gist.github.com/tripzilch/9042195ae6f62901909ff7c99aeb8fcc?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Untitled.png) Universal Rayhatcher #346 [Piter talks about the motivations behind the project in this podcast](https://www.youtube.com/watch?v=4gI4Pr0PhVY&ref=gorillasun.de). ## Generative Art Updates The Universal Rayhatcher hasn't been the only thing that's happened in the gen-art world though! ### Raph's Creative Code News *Every Tuesday is the news day!* Creative code news is rapidly approaching it's 100th installment (this week will be it's 99th), and you probably don't want to miss it! Raph briefly announced that he'd be going on a little break afterwards, with plans to bring back creative code news in a different form. You can catch the stream here 👇 [Creative Code News #98 - sableraph on Twitchsableraph went live on Twitch. Catch up on their Art VOD now.![](https://static.twitchcdn.net/assets/favicon-32-e29e246c157142c94346.png)Twitch![](https://static-cdn.jtvnw.net/cf_vods/dgeft87wbj63p/77a82968dd2642d1d332_sableraph_40760187448_1685462404/thumb/thumb0-640x360.jpg)](https://www.twitch.tv/videos/1833253621?ref=gorillasun.de) Seriously, check it out! Raph was also recently invited to the Arbitrarily Deterministic podcast (hosted by [kenconsumer](https://twitter.com/KenconsumerE?ref=gorillasun.de)) alongside Casey Reas, where they talk about everything Processing - from the early days, till the present day and the community that it's become: ### Alba.art Launches New generative art platform! [Alba art](https://www.alba.art/?ref=gorillasun.de) is launching this week, a new and budding generative art platform on the Ethereum blockchain - a la FxHash, it aims to streamline the process of minting generative art on the Ethereum platform: > Introducing Alba. The open platform for on-chain generative art on Ethereum. > > We believe that everyone should be free to share their art with the world, and we're on a mission to build the best platform to give artists that power. > > Our artist beta program is launching today 👇 > > — Alba.art (@AlbaDotArt) [March 6, 2023](https://twitter.com/AlbaDotArt/status/1632657084176007168?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I already had a chance to try out how it works behind the scenes and I really love it! As opposed to FxHash, on Alba one can create 'draft' projects that remember the information that you fill out. In this manner you can take your time filling preparing your projects, couple this with a slick interface, and suddenly it becomes really easy to ensure that your project is working as intended. ### Flowers and Sky Jeff Clark released his token Flowers and Sky on FxHash: > Thank you again everyone for your interest in my project that was released yesterday. > 🌻 > I'm very grateful to you all and wish you a wonderful weekend. > 🌷 > Here is Flowers and Sky #72 owned currently by [@crypt0biwan](https://twitter.com/crypt0biwan?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/JAozGtnMjX](https://t.co/JAozGtnMjX?ref=gorillasun.de) > > — Jeff Clark (@JeffClark) [June 2, 2023](https://twitter.com/JeffClark/status/1664716287388315649?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) He's been consistently sharing WIPs since early May and it's been really fascinating to see how it ultimately came together: > Lots to do but it's starting to come together[#wip](https://twitter.com/hashtag/wip?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#abstractart](https://twitter.com/hashtag/abstractart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/tAgzmB8D56](https://t.co/tAgzmB8D56?ref=gorillasun.de) > > — Jeff Clark (@JeffClark) [May 10, 2023](https://twitter.com/JeffClark/status/1656096390693416961?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/FxkDUSCXgAADKHA.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/FxkDUtMWwAI0NOF.jpg) My iterations of Flowers and Sky - #241 and #243 ## Reads of the Week ### React, Visualized If you've been wanting to learn React.js, this is the resource that you've been waiting for: [React, visualized – react.ggReact, Visualized – A gentle introduction to React, but visualized.![](https://react.gg/favicon.png)Pizzafy![](https://react.gg/img/visualized-og.jpg)](https://react.gg/visualized?ref=gorillasun.de#top) Starting from a bit history, the webpage explain why react was created and quickly dives into the intricacies of it, and it does so with many interactive examples! ### Website Structure and SEO I'm a bit of a nerd about SEO - to me it's always been a little bit of an esoteric science because you can't prove with 100% certainty that some changes on a website actually improved it's SEO rankings. In my experience at least. Hence, I'm always curious to learn about more SEO tricks, for instance I never considered that the structure of a website might have an impact on serach rankings - but apparently it does. This article covers the topic in depth: [How to Structure Your Website’s Architecture for SEOEmbrace your inner planner.![](https://ahrefs.com/blog/wp-content/themes/Ahrefs-4/images/favicons/apple-touch-icon.png)SEO Blog by AhrefsChris Haines, Si Quan Ong![](https://ahrefs.com/blog/wp-content/uploads/2023/05/how-to-structure-your-website8217s-architecture-by-chris-haines-general-seo.jpg)](https://ahrefs.com/blog/website-structure/?ref=ghost.org) ## Gorilla Articles Every week you get two Gorilla Articles! 🗞 ### An Algorithm for Particle Systems with Collisions Following up the article from two weeks ago about creating a particle system with ChatGPT, I thought that it would be interesting to dive into the intricacies of such a system a little bit more in depth, and attempt to code our own little system from scratch. Programming and visualizing physics is probably one of the most satisfying things that you can do with P5 - especially because it doesn't end up being that much code: [An Algorithm for Particle Systems with CollisionsIn this post we will program a particle system in p5js from scratch. We’ll mainly dicuss object oriented programming and delve into the necessary physics concepts to compute collisions, all while implementing a full particle simulation with P5JS.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/yayoi3.png)](https://www.gorillasun.de/blog/an-algorithm-for-particle-systems-with-collisions/) What's more is that this is just scratching the surface, there's so many different directions that we could take this sketch, for instance we could add elasticity to the particles, or make them more rigid, add repulsive forces to them, etc.. Additionally there's several interesting optimization methods that are worth looking into, such as implementing a grid lookup, which allows us to check for collisions much more efficiently. ### An introduction to the Javascript Spread Operator The spread syntax is probably one of my favorite features of JS. In my second article of the week I made a run-down of all the possible ways in which it can be used - and while doing my research I kept discovered more and more interesting applications of the versatile operator: [An Introduction to the Javascript Spread OperatorIn this post we have a look at the Javascript spread syntax, a powerful feature that was introduced with ES6 and which trivializes many tasks that deal with handling iterables.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/spread-synt1.png)](https://www.gorillasun.de/blog/introduction-to-the-javascript-spread-operator/) Whether you need to copy arrays, or merge them, the spread operator got you covered! I love Javascript. ## Gorilla Sketches Picked up an old project again, and getting it ready for something later this month. Want to make sure that everything is in place with this one before I announce what it's for: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/FxYXtBdaUAALv5j.jpg) Alba 🤫 > I started working on this one last December - feels really good to come back to it now 🎨🖍️ [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/3L26GfYjxZ](https://t.co/3L26GfYjxZ?ref=gorillasun.de) [pic.twitter.com/ntHdMR9IRg](https://t.co/ntHdMR9IRg?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 30, 2023](https://twitter.com/gorillasu/status/1663475711779258368?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also continued working on my piece for Proof of X, and it's been coming together in such a nice way: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/FxeK056WAAEEDKo.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/dense.png) An initial irregular rectangular grid vs. the almost complete sketch. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/feelscomplete2-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/feelscomplete-.png) Some more variations \~ really happy how this one is coming together! Need to start wrapping it up for Proof of X! Really love the cartoon-y aesthetics of it! ## Music for Coding This week I enjoyed kokoroko's chill jazzy vibes - if you enjoy layed back saxophone sounds this one's for you! **And that's it from me again! See you on Thursday where we continue working on our particle sketch, until then cheers and happy coding! \~ Gorilla Sun 🌸** ### An Introduction to the Javascript Spread Operator URL: https://www.gorillasun.de/blog/introduction-to-the-javascript-spread-operator/ Last updated: 2023-06-04T13:28:59.000Z **Javascript is a fascinating language - it's very versatile but can sometimes also be frustrating. In this post, we'll have a look at the spread syntax, another one of those features that was introduced with ES6 and that I don't see being used so often - although it can be pretty potent in the right situations.** The spread operator is used in conjunction with the various types of iterables, and depending on the setting, it can trivialize certain tasks simply by using it alongside some of the other syntactical sugar that exists in JS. For instance, it makes it possible to copy and merge arrays in as little as a single line of code! We'll get to that in a minute. The spread operator is quite fascinating, it's usefulness isn't immediately evident since it can be employed in many places that you wouldn't expect or even think about - we'll tackle some of those syntactical intricacies as well throughout the sections. ```javascript let brain = [...ideas] ``` ## The JS Spread operator As it's name suggests, the spread operator in javascript allows us to expand the elements of an iterable into places where multiple elements are expected. This is done via the spread syntax - the spread operator being represented by three consecutive dots, preceding an iterable: `...nameOfIterable`. Iterables in javascript come in many forms, such as arrays, strings and objects to name a few. Let's have a look at an example, assume we have the following array of numbers: ```javascript let arr = [1,2,3,4,5] console.log(arr) // prints [1, 2, 3, 4, 5] ``` Here we're simply printing the entire array to the console. Now what if we preceded this array by the spread operator? ```javascript console.log(...arr) // prints 1 2 3 4 5 ``` What happened here? Why did it print the numbers individually and not as an array? The console.log() function is a bit special in that it accepts an arbitrary number of input parameters. Using the spread operator we're essentially passing the contents of the array as individual inputs to the console.log() function - we're spreading the array elements over the function's input parameters. ```javascript console.log(...arr) // prints 1 2 3 4 5 console.log(1, 2, 3, 4, 5) // the same effect ``` On a first encounter the spread syntax might seem a little bit odd, since it's an unusual symbol, as opposed to other operators that might be more familiar. And at first glance it might not seem very useful, but we'll cover some really interesting use-cases throughout the upcoming sections. Before we move on - I just want to showcase a super cool use-case: we can quickly find the maximum or minimum numbers in an array by using the spread syntax alongside the `Math.max()` and `Math.min()` methods: ```javascript let arr = [100, 5, 201, 200, 2] let maxNum = Math.max(...arr) // 201 let minNum = Math.min(...arr) // 2 ``` ## Cloning Iterables How do you make a copy of an array in Javascript? The most straightforward method is probably via the good old for loop: ```javascript let arr = [1, 2, 3, 4, 5] let copyOfArr = [] for(let i = 0; i < arr.length; i++){ copyOfArr.push(arr[i]) } ``` If you're feeling fancy, you can alternatively also use the map() array method: ```javascript let copyOfArr = arr.map(x => x) ``` I love for loops, but they're a bit annoying to write out sometimes. Using the spread operator is probably the shortest syntax to make a copy - look how neat the code is in this case: ```javascript let arr = [1, 2, 3, 4, 5] // spreading arr into an array literal let arr2 = [...arr] ``` Just as a heads up - when dealing with nested arrays, the spread syntax will only create a shallow copy of the array - have a look at this example: ```javascript let nestedArr = [[1],[2]] let copyOfNestedArr = [...nestedArr] // adding to an inner array modifies both copies copyOfNestedArr[0].push(3) console.log(nestedArr, copyOfNestedArr) // [[1,3],[2]] and [[1,3],[2]] // adding to the top-level array only changes one copyOfNestedArr.push(1) console.log(nestedArr, copyOfNestedArr) // [[1,3],[2]] and [[1,3],[2],1] ``` Just to explain this really quickly - in programming, the term **deep copy** usually refers to the act of cloning an object, such that the new object is it's own independent instance, with it's own independent copy of the data in memory, without reference to the original instance. A **shallow copy** on the other hand only immitates the data's structure but points to the same data in memory - hence if a shallow copy were to be modified the original would also change. This is often the case with nested structures, like arrays within arrays and objects within object. *So, keep that in mind!* Additionally, [the spread operator might be a little less performant](https://stackoverflow.com/a/55843172/6688750?ref=gorillasun.de) as opposed to a regular for loop. But if you're not copying millions of elements then the difference is most likely negligible. And as mentioned earlier, copying things this way also works for objects! For example: ```javascript let obj = {x: 1, y: 2}; let copyOfObj = {...obj}; ``` Instead of square brackets we use the curly brackets ## Strings to Arrays and Iterables to Objects Depending on what type of iterable we use the spread operator on, we'll achieve some other effects. Strings for instance are also iterables, the spread operator thus provides an efficient method for quickly turning a string into an array of individual characters: ```javascript let str = '12345' let arrStr = [...str] ``` Another cool thing that can be done is converting iterables to objects: ```javascript let arr = [1, 2, 3] let obj = {...arr} console.log(obj) // {0: 1, 1: 2, 2: 3} let str = `123` let strObj = {...str} console.log(strObj) // {0: "1", 1: "2", 2: "3"} ``` The keys of the resulting object are then simply integers starting from 0. ## Merging Arrays and Objects The spread operator also allows us to concatenate two arrays in a similar manner: ```javascript let arr1 = [1, 2, 3] let arr2 = [4, 5, 6] let concatenatedArr = [...arr1, ...arr2] // [1, 2, 3, 4, 5, 6] // we can also insert elements before, after and in between let customArr = [0, ...arr1, 3.5, ...arr2, 7] ``` And this also works for objects! We can merge objects like this: ```javascript let obj1 = {a: 1, b: 2} let obj2 = {c: 3, d: 4} let obj3 = {...obj1, ...obj2} console.log(obj3) // prints {a: 1, b: 2, c: 3, d: 4} ``` Careful here though, if the two objects have a property with the same key, then only the last occurence will be considered and added to the resulting merged object. ```javascript let obj1 = {a: 1, b: 2} let obj2 = {b: 3, c: 4} let obj3 = {...obj1, ...obj2} console.log(obj3) // prints {a: 1, b: 3, c: 4} ``` This can however also be a useful behavior! If you want to clone or merge an object, while modifying only a specific property, it can be done as follows: ```javascript let obj = {x: 1, y: 2, z: 3} let modifiedCopy = {...obj, z: 4} // {x: 1, y: 2, z: 4} ``` ## Rest Parameters while Destructuring Destructuring iterables in Javascript is a topic in and of itself, but in a nutshell destructuring happens in the following manner: ```javascript let arr = [1, 2, 3] let [a, b, c] = arr ``` This is kind of like using the spread operator, however here javascript automatically understands that we want to spread the elements of the array onto the given variables, without actually using the spread syntax. Creating variables in this manner is called a *destructuring assignment*. Again, this also works for objects: ```javascript let obj = {a: 1, b: 2}; let {a, b} = obj; console.log(a, b); // prints 1 2 // is equivalent to: // let a = obj.a; // let b = obj.b; ``` Note that in the case of an object the variable names actually need to be the same as the property keys. If you want other variable names, it's done in this manner: ```javascript let obj = {a: 1, b: 2}; let {a: x, b: y} = obj; console.log(x, y); // prints 1 2 ``` To get to the point, if you ever need to separate the first couple elements of an iterable from the trailing rest, it can be destructured alongside the spread operator in the following manner: ```javascript let arr = [1,2,3,4,5] let [a,b,...rest] = arr console.log(a,b,rest) // prints 1 2 [3,4,5] ``` This is cool because it allows us to simultaneously copy and object and exclude a specific property: ```javascript let obj = {a: 1, b: 2, c: 3} let {b, ...objCopy} = obj console.log(b, objCopy) // prints 2 {a: 2, c: 3} ``` The trailing parameter in this setting is also called a *rest* parameter. Note that this rest parameter needs to be placed in the last position for it to work. ## Parameter Merging I'm not entirely certain if this is the correct term for this technique, but a somewhat obscure application of the spread operator is merging multiple input parameters as a single input parameter: ```javascript function mergeParams(...params){ return params } console.log(mergeParams(1, 2, 3)) // prints [1, 2, 3] ``` Here the rest operator needs to be the last input parameter in the signature as well. This one's a bit out there, but you never know... it might come in handy someday. ## Optional/Conditional Spreading The most unusual application of the spread syntax, is one I came across in a post by [Enmanuel Durán](https://twitter.com/duranenmanuel?ref=gorillasun.de): [Two exceptional use cases for the spread operator you may not know ofSpread operator is one of the most commonly used elements in the javascript toolbox, this mini-article will show you a couple of highly productive and efficient uses for the spread operator.![](https://enmascript.com/favicons/icon-512x512.png)Enmanuel Durán![](https://enmascript.com/images/2019-09-20-spread-operator-uses.png)](https://enmascript.com/articles/2019/09/20/two-exceptional-use-cases-for-the-spread-operator-you-may-not-know-of?ref=gorillasun.de) Essentially, we can give objects optional properties by making use of the spread operator: ```javascript const isDog = true; const obj = { key: 'value', ...(isDog && { woof: true })}; } ``` Here's also [a reddit discussion](https://www.reddit.com/r/javascript/comments/d6uot1/two%5Fexceptional%5Fuse%5Fcases%5Ffor%5Fthe%5Fspread%5Foperator/?ref=gorillasun.de) about wether this is good or not, what do you think? ## Closing Thoughts In this post we've tackled the JS spread operator and several of it's use cases. If you want to learn another lesser used feature of Javascript you might also want to check this other post I've written on Javascript Generators: [An Introduction to Javascript GeneratorsIn this post we’ll go over everything that you should know about Javascript Generators. Javascript generators are a versatile feature of ES6 and allow for interesting programming strategies, that otherwise wouldn’t be possible.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner--1---1-.png)](https://www.gorillasun.de/blog/an-introduction-to-javascript-generators/) **That's it from me again - see you in the next post, until then cheers and happy coding \~ Gorilla Sun!** ### An Algorithm for Particle Systems with Collisions URL: https://www.gorillasun.de/blog/an-algorithm-for-particle-systems-with-collisions/ Last updated: 2024-08-28T13:41:20.000Z **Last week we had fun creating particle systems in collaboration with ChatGPT. Turns out that the large language model is actually quite good at P5JS... when you feed it the right prompts, and iteratively nudge it into the right direction. Today we'll take a seat in the cockpit and write our own particle sketch from scratch.** In the previous post we didn't go into too much detail on how such a particle system works, for a matter of fact, we didn't look at the code at all, took a backseat, and allowed ChatGPT to do all of the heavy lifting. This time around however, we'll delve into the intricacies of coding such a system from the ground up! [Programming a Particle System with ChatGPTYou’ve probably heard about ChatGPT, and you’ve probably heard that it can write code. In this post we’re taking it for a spin and explore a practical example - we’ll make it code a full-fledged particle system from scratch! Let’s see what the best prompts are for this purpose!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-76.png)](https://www.gorillasun.de/blog/programming-a-particle-system-with-chatgpt/) Last week's post - a fun way to ease yourself into particle systems In this post we're going to tackle a number of topics: how to model a particle system with the object oriented paradigm, how to simulate physical forces like velocity and acceleration, and how to compute and resolve collisions between particles within this system. Basically, we'll be learning quite a bit about computing collisions and the physics involved. Here's what we'll have put together by the end of this article 👇 ## Preamble The best resource on this topic is by far [Daniel Schiffman's The Nature of Code](https://natureofcode.com/book/chapter-4-particle-systems/?ref=gorillasun.de). It covers all of the necessary basics that are required for putting together a particle system, starting from vectors and forces, all the way to implementing a full particle system using an Object Oriented Approach. The Nature of Code is not only one of the best resources on particle systems, but moreover an essential read for every creative coder. Check it out, it's free, and if you like it maybe even get your own copy and support Dan! If *The Nature of Code* already exists, then what's the point of this article? The aim of this article is to demonstrate one possible method for implementing such a particle system, with a focus on the computation and simulation of collisions. Many different kinds of systems can emerge depending on the way in which we implement the forces that act upon the particles in this system. This article sets the scene for creating a simple particle based sketch, in a future post we'll have a look at more complex methods to improve this system and make it more interesting. Let's get started! ## What is a Particle System? The term Particle System finds it's beginnings with a paper authored by William T. Reeves: [Particle Systems – A Technique for Modeling a Class of Fuzzy Objects](https://www.lri.fr/~mbl/ENS/IG2/devoir2/files/docs/fuzzyParticles.pdf?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image.png) A beautiful graphic from the paper In the paper he describes a method for creating *fuzzy-objects*, where groups of particles can collectively evoke the illusion of certain shapes or substance. At the time, this method was primarily used in the film industry for the purpose of creating special effects, like fire and smoke: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Image-1.png) William T. Reeves worked at the Lucas Computer Graphics Division. [A stillframe from the movie Star Trek II: The Wrath of Khan](https://www.youtube.com/watch?v=52XlyMbxxh8&ref=gorillasun.de). The cone of fire that can be seen on the planet's surface is created with a particle system. As it's name suggests, a particle system consists of a non-singular number of particles. And usually, these particles interact with each other in some way to create an interesting effect. Hence the term *system*. In this setting a particle is a small object/entity; think of it as a speck of dust, a grain of sand, or even a pebble. Usually each particle in such a system has it's own individual state, as well as it's own properties that allow us to determine how it behaves at any given moment in time. Depending on the individual state of each one of these particles, the overall system can have [various emergent properties](https://www.youtube.com/watch?v=16W7c0mb-rE&ref=gorillasun.de). Just like different types of sand feel different to the touch. When wet, some types of sand can even become malleable enough to be shaped into all sorts of forms. Today, particle systems find their way into most VFX for Movies, Video Games, as well as simulations for scientific research. Although we're only going to concern ourselves with a simple toy-sized exampled of such a particle system, it's nonetheless a very interesting problem. ## An Object Oriented Approach In this section we'll quickly speed-run the Object Oriented Programming Paradigm for those who aren't familiar with it. It will be the foundation upon which we'll build our particle system. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/06/Class-3--1.png) In a nutshell, the object oriented paradigm allows us to structure data in a meaningful manner. ### What's the Object Oriented Paradigm In essence particle systems revolve around the simulation of interactions between a large number of particles. This means that each individual particle needs to be able to remember it's own current state, how it should interact with other particles given certain conditions, and have the ability of reacting accordingly. One useful approach for this purpose is the [object oriented paradigm](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming?ref=gorillasun.de), or for short OOP. As the name suggests, in OOP we use *Objects* to model different entities in our program. Objects are essentially containers that can hold a number of variables, and represent a certain state that an Object finds itself in. They can also have functions to simulate potential interactions with other Objects. And we will essentially model our system with the Object oriented paradigm, such that each particle is an object. We'll represent their properties with the variables that these objects hold. For instance, we can have a variable that represents the current position of a particle (think x and y coordinates), another variable that keeps track of the direction this particle is moving in, and yet another one that describes the speed that it's moving at, etc... then we can also have functions that perform a number of tasks that need to be performed frequently; for instance, checking for collisions with other particles, or updating the value of the descriptive variables when the state of the particle changes. ### A preliminary Example What's cool about OOP is that the code is highly reusable! Generally, in OOP we write blueprints for the different objects that we want to model. These blueprints are also better known as *Classes*, that can be *instantiated* to represent individual objects (see graphic above). In other words, an Object is an *instance* of a particular class. This allows us to instantiate however many particles we want to have in the our system. This is all a bit abstract in written form, and the lingo can be a bit confusing if it's the first time you hear about these things, hence it's probably better to have a look at a tangible example. Have a peak at the following code: ```javascript class Particle{ constructor(pos){ this.pos = pos; } updateState(newPos){ this.pos = newPos; } printState(){ console.log(this.pos); } } ``` A simple example of a particle class Here we create a simple Particle class that will serve as a blueprint for the particle Objects in our sketch later on. I want to point out here that there's multiple ways to create Javascript classes - however, since it's introduction with ES6, doing so by means of the *class* keyword has become the most popular way. Similarly to declaring a function in Javascript, the class keyword expects to be followed by an identifier. What this identifier is, is ultimately up to us, and in this case it makes sense to call our class **Particle**. What's special here, is the convention of capitalizing class names - we also don't require parenthesis like we would for declaring a function. Let's have a look at the content of our Particle class' body now. Right off the bat, *functions* inside a class are called *methods* and make do without the function keyword. What's more is that a class requires a special *constructor* method to be present. This method gets automatically triggered when we create a new instance of the class, and is essential for initializing the instance. It effectuates all of the necessary setup. For example, when we create a new particle, we want to give it a particular starting position on the canvas, which is done by passing in the coordinates as an input parameter to the constructor. Here's what initializing a new instance of our Particle class would look like: ```javascript let pos = {x: 200, y: 200} // arbitrary coordinates let particle = new Particle(pos) ``` Alternatively we can also use p5 vectors to represent coordinate pairs. The *new* keyword, preceding the name of our class, indicates that we want to create a new instance. Take note of the input signature, it should be identical to the constructor's signature, and automatically triggers the constructor of the class. Now the variable *particle* holds an instance of the particle class - it is essentially a Particle Object. ### Member variables and functions Another thing that you might have noticed in the constructor function is the special *this* keyword. When we precede a variable with the this keyword we indicate that the variable belongs to the class. These variables are remembered throughout all parts of the class and can be invoked from anywhere within it. For example, earlier when we create the Particle class we also created a little function called printState() which simply prints the current position of the particle to the console when we invoke it. We did this simply by accessing this.pos which we created earlier when we created the instances. ```javascript let pos = {x: 200, y: 200}; // arbitrary coordinates let particle = new Particle(pos); particle.printState(); // prints the coordinates ``` Variables preceded by the *this* keyword are called member variables. Similarly, methods that belong to a class can also be called member functions, and, as shown in the example above, can be invoked by prepending the identifier of the variable that holds the instance. We can also access member variables in this manner from an external scope: ```javascript let pos = {x: 200, y: 200}; // arbitrary coordinates let particle = new Particle(pos); console.log(particle.pos) // same effect as invoking printState() ``` This concludes our brief introduction to OOP. There's a lot more to be said about, but what we covered is sufficient for the purposes of putting together the particle system that we want to build. ## Simulating Physics Now that we've covered OOP, we also need to talk a little bit about how to simulate physics programmatically. We're essentially trying to model tangible two dimensional entities that behave in a somewhat physically accurate manner, this requires us to implement the forces that occur IRL in nature and that generally cause things to *move* around. For this reason, we'll have to talk about velocity and acceleration. To understand these concepts a little bit better let's make a little sketch to help us visualize what's going on. Let's start with a simple P5 sketch with only one particle: ```javascript let particle; function setup() { createCanvas(400, 400); particle = new Particle(new createVector(200, 200)); } function draw() { background(220); particle.display() } class Particle{ constructor(pos){ this.pos = pos; } updateState(newPos){ this.pos = newPos; } display(){ ellipse(this.pos.x, this.pos.y, 10) } } ``` We declare the particle as a global variable and invoke it's display function in the main draw loop. We'll gradually add complexity and more behaviors to our particle class in the coming sections. ### Velocity and Acceleration Right now, when we display our particle not much is going on yet, the particle simply *exists* at it's starting position. We'd actually like it to move around, particularly, we'd like it to fall towards the bottom of the canvas, as if there was a gravitational force pulling it downwards. For this purpose we need to give our particle two more properties, namely **velocity** and **acceleration**. By setting the velocity and acceleration of our particle to specific values and letting them act upon it's position, we can make it move around on the canvas. What is a particle's velocity though? And what is acceleration? Imagine you're riding a bicycle. Your **Velocity** describes how fast you're going, and it also tells us in which direction you're going. If you're riding forward at a steady speed, your velocity is positive. But if you're riding backward, your velocity is negative because you're going in the opposite direction. ![](https://media.tenor.com/uV8In8sq3rEAAAAC/%D8%A6%D8%A7%D9%84%D8%A7%D9%86.gif) Velocity acts upon the position of an object, whereas acceleration acts upon the velocity of an object. **Acceleration** on the other hand, is how quickly your speed or direction changes. Let's say you're riding your bike and you start pedaling harder. That means you're accelerating because you're increasing your speed. Acceleration can also happen when you slow down or stop suddenly. It's like when you're riding your bike and you hit the brakes really hard. In this sense, velocity is a force that acts upon the position of an object, and acceleration is a force that acts upon the velocity of an object. Both are necessary to accurately simulate the movement of an object. Additionally, both have a direction and magnitude, and can as such be represented as vector quantities - which means that we can use the inbuilt [P5 vector functions](https://p5js.org/reference/?ref=gorillasun.de#/p5.Vector) to make this task a little bit easier. Let's modify our Particle class to include these forces: ```javascript constructor(pos){ this.pos = pos; this.velocity = new createVector(random(-1,1), random(-1,1)); this.acceleration = new createVector(random(-1,1), random(-1,1)); } ``` The initial velocity is a random vector, meaning that the particle is moving in a random direction when it spawns on the canvas. The acceleration on the other hand is a vector that has a small value for it's y component and a zero value for x. This simulates a fake **gravity* effect. Now we can apply these two forces to the position of our particle to make it move: ```javascript updateState(){ this.velocity.add(this.acceleration); this.pos.add(this.velocity); } ``` Since there is nothing preventing the particle from leaving the canvas yet, you might have to rerun the sketch to see the particle. ### Canvas Boundary Collision We don't want our particle to leave the canvas and wander off into the aether beyond, but rather we'd like it to collide with the boundaries of the canvas and bounce off of them. For this we'll create a function in which we'll update it's velocity and acceleration accordingly. At this point it makes sense t0 give our particle a specific radius such that we can accurately determine it's collision with the canvas boundaries: ```javascript constructor(pos){ this.pos = pos; this.velocity = new createVector(random(-1,1), random(-1,1)); this.acceleration = new createVector(random(-1,1), random(-1,1)); // random radius within a range this.radius = random(5, 15); } display(){ // size of ellipse is the radius ellipse(this.pos.x, this.pos.y, this.radius) } ``` And the function that will check for collisions with the canvas boundaries: ```javascript checkEdges() { if (this.pos.x - this.radius < 0) { this.pos.x = this.radius; // Prevent from leaving the canvas from the left side this.velocity.x *= -1; } else if (this.pos.x + this.radius > width) { this.pos.x = width - this.radius; // Prevent from leaving the canvas from the right side this.velocity.x *= -1; } if (this.pos.y - this.radius < 0) { this.pos.y = this.radius; // Prevent from leaving the canvas from the top this.velocity.y *= -1; } else if (this.pos.y + this.radius > height) { this.pos.y = height - this.radius; // Prevent from leaving the canvas from the bottom this.velocity.y *= -1; } } ``` We simply need to check for each one of the four boundaries if the radius of our particle exceeds this boundary. As we mentioned earlier, the velocity of our particle represents the direction that it is moving towards, and since the canvas boundaries are aligned with the x and y coordinate axes we can simply flip the sign of the particle's respective velocity component to make it move into the opposite direction. For example, when a particle collides with the bottom of the canvas we will simply flip the y component of it's velocity, making it move upwards again. And in action this looks as follows: Not incredibly mind-blowing what we've got so far, but we've got a good system in place. Next we'll work on adding multiple particles. ## Multiple Particles and their Collisions In this section we'll modify our sketch in such a way that it can support multiple particles. This requires us to define how these particles should interact with each other. Right now, if we were to add more than one particle, they would simply ignore each other and not interact in any meaningful way. Instead of just creating a singular particle, we'll now introduce an array that can store multiple particles at once: ```javascript let N_PARTICLES = 50; let particles = []; let WID = 400; let HEI = 400; function setup() { createCanvas(400, 400); for(let n = 0; n < N_PARTICLES; n++){ particles.push( new Particle( new createVector(random(WID), random(HEI)) ) ); } } ``` And in the draw loop we will simply loop over all of the particles to update their individual positions and determine if they're colliding with the borders of the canvas: ```javascript function draw() { background(220); for(let p of particles){ p.checkEdges(); p.updateState(); p.display(); } } ``` Now the sketch is already much more interesting: An interesting thing we can do here is visualizing he velocity of each particle: ### Collisions between Particles Computing collisions between two particles is slightly more difficult than computing the collision between a particle and the boundaries. For the boundaries we could get away with simply directing the particle in the opposite direction - when two particles collide however, we need to consider at what angle they are colliding, as well as how fast they're moving when they meet. In this setting we are concerned with the *collision response* of the two particles. The collision response is essentially the behavior of the particles when they collide. This behavior can be vastly different depending on how we model the physics of our system, for instance if we want our particles to be elastic, or rigid, or even a mix of both, etc. Just like in the real world, you'll observe a different response when you drop a book flat on the floor as opposed to a bouncy ball. To resolve the collision between two particles correctly we need to compute a number of things: 1. **Relative Velocity**: the relative velocity is essentially the difference in velocities between the two particles. It informs us about how fast the two particles are approaching each other and is necessary to determine the strength of the impact. This lets us calculate how rapidly the two particles will part ways again. 2. **Collision Normal**: the collision normal is a perpendicular to the collision surface and is necessary to determine in which direction the particles will move after colliding. 3. **Impulse Magnitude**: the impulse magnitude is the strength of force applied to the particles after collision. ### Computing the Collision Responses Now let's add a function that A. checks for collisions and B. computes the collision response between the two particles subsequently updating the velocity of the particle: ```javascript checkCollision(){ for(let other of particles){ if(this != other){ let distance = this.pos.dist(other.pos); let minDistance = this.radius + other.radius; if(distance <= minDistance){ // Calculate collision response let normal = p5.Vector.sub(other.pos, this.pos).normalize(); let relativeVelocity = p5.Vector.sub(other.velocity, this.velocity); // divide by two, we'll explain why in a bit let impulse = p5.Vector.mult(normal, 2 * p5.Vector.dot(relativeVelocity, normal) / 2); // Update velocities this.velocity.add(impulse); other.velocity.sub(impulse); } } } } ``` Here we can make heavy use of p5's inbuilt vector functions. We'll add a new function to the particle class called checkCollision(). In this function we will loop over all of the other particles and compute the distance between their positions, if this distance is less than the sum of their radii then we can ascertain that a collision has occurred. When a collision occurs we'll have to compute the collision response, which is constituted of the forces that we discussed earlier. Hold up... there's something not right here. Even though the particles bounce off of each sometimes, it will not always work correctly and they'll get stuck on each other. Let's visualize their velocities again and see what's happening: Because this is just a numeric simulation it can happen that two particles will interpenetrate each other. When this happens it can lead to a faulty calculation of the relative velocity and in turn make it such that they become stuck on each other. To remedy this we will add an additional force that pushes the two particles in opposite directions when they're close to each other, preventing them from getting stuck on each other. ```javascript // Apply repulsion force to prevent sticking let repulsion = p5.Vector.mult(normal, minDistance - distance); // Apply repulsion force this.pos.sub(repulsion); other.pos.add(repulsion); ``` The repulsion force is added here. And now things should be behaving more accurately: ### The Mass of Particles So far we have worked under the assumption that all particles have the same mass, even when they're of different size. Mass represents the *amount of matter* contained in an object, and mass affects the forces the impact of the forces exerted on an object. The more massive an object the more force we need to move it; following Newton's second law. Let's update our calculations to reflect this! First let's add another member variable to represent the mass of a particle: ```javascript constructor(pos){ this.pos = pos; this.velocity = new createVector(random(-1,1), random(-1,1)); this.acceleration = new createVector(random(-1,1), random(-1,1)); // random radius within a range this.mass = random(1,5) this.radius = this.mass*3; } ``` And in our calculations we just need to divide certain values by the mass of the particle, diminishing the impact of the forces on the velocity of the particle: ```javascript checkCollision(){ for(let other of particles){ if(this != other){ let distance = this.pos.dist(other.pos); let minDistance = this.radius + other.radius; if(distance <= minDistance){ // Calculate collision response let normal = p5.Vector.sub(other.pos, this.pos).normalize(); let relativeVelocity = p5.Vector.sub(other.velocity, this.velocity); let impulse = p5.Vector.mult(normal, 2 * p5.Vector.dot(relativeVelocity, normal) / (this.mass + other.mass)); // Apply repulsion force to prevent sticking let repulsion = p5.Vector.mult(normal, minDistance - distance); // Update velocities this.velocity.add(p5.Vector.div(impulse, this.mass)); other.velocity.sub(p5.Vector.div(impulse, other.mass)); // Apply repulsion force this.pos.sub(p5.Vector.div(repulsion, this.mass)); other.pos.add(p5.Vector.div(repulsion, other.mass)); } } } } ``` And visually we obtain the following effect: This is now much more like real life where things don't just keep bouncing around forever, because the particles will gradually lose their velocity as they collide. Later we should also reflect the loss of this momentum when they collide with the boundaries, but I believe that this is a good stopping point for now. ## Closing Thoughts Although our sketch is working relatively well thus far, there's many more things that we can add here to make it much more interesting - we'll cover these optimizations in the post of next week. We'll have a look at how to implement a grid lookup to improve the speed at which collisions are determined and some methods for improving our collision resolutions to simulate different effects, like elasticity and restitution. We'll also add mouse interaction to the sketch, such that we can spawn particles by pressing the mouse, and additionally implement other types of attractive and repulsive forces that can be applied to the particles in our system. **Until then, cheers and happy sketching \~ Gorilla Sun** ## ## ### Gorilla Recap 6 URL: https://www.gorillasun.de/blog/gorilla-recap-6/ Last updated: 2023-12-19T23:12:07.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** This week I released a new token on FxHash - **2D or not 2D**! 0:00 /0:04 1× 2D or not 2D #17 collected by Alessandro Fiore Big thanks to everyone that collected an iteration so far! 🙌 I was hesitant about releasing the token initially but then I decided that I will not let the pile of unfinished projects get any bigger and pulled the trigger! And I'm super happy that I did! In this Newsletter you're getting a mini making-of. The initial idea for the project came up while prototyping my [EditArt piece Blöck](https://www.gorillasun.de/blog/making-of-block/), where I had a simple idea for partitioning a rectangular region into slanted slices: > Partitions [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/SN5x9N6nLJ](https://t.co/SN5x9N6nLJ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 27, 2023](https://twitter.com/gorillasu/status/1640412281421832194?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I decided on a different grid-based strategy for Blöck however. A little bit down the line I returned to the partitioning idea, and explored some visual ideas. For instance I doubled up the slice quadrilaterals, achieving a sort of 2.5D effect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/FsULaLbXwAAdbmv.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/FsUMQ-SWIAEF9_x.jpg) After refactoring the entire code, I thought it would be interesting to have the slices move up and down inside their respective partition containers - which looked pretty cool: > They're alive! No idea where this is going 🤔 [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/k3iLG4iFyg](https://t.co/k3iLG4iFyg?ref=gorillasun.de) [pic.twitter.com/sPT7A9r8Bb](https://t.co/sPT7A9r8Bb?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 28, 2023](https://twitter.com/gorillasu/status/1640810750087254049?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I love making stuff that looks like 3D when it's just 2D tricks. Soon after that though, I dropped the project for almost a month, and got busy with other things. Earlier this month I got around to working on it again: > Next [#fxparams](https://twitter.com/hashtag/fxparams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)? Coming back to this with fresh eyes after a month it looks solid, few bugs in there but shouldn't be too difficult to sort them out 💁‍♂️ [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/lIJus5WGF6](https://t.co/lIJus5WGF6?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 8, 2023](https://twitter.com/gorillasu/status/1655568200845647877?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Until I finally felt that it was *complete* enough to be published: > Motion [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/8E8gofg0wQ](https://t.co/8E8gofg0wQ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 25, 2023](https://twitter.com/gorillasu/status/1661686268193828864?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-81.png) Tom coming up with a banger name for the sketch 😂 In other news Yazid shared a post yesterday that really resonated with my own feelings: > I’m notoriously slow af w/ my art. > > I procrastinate, chase random curiosities down many rabbit holes, get rly mechanical/in the weeds… I can also end up hating my art (or myself) & walk away. > > This one took weeks. And it’s still buggy as hell. But damn am I fking proud of it rn. [pic.twitter.com/HZXKQWOOS2](https://t.co/HZXKQWOOS2?ref=gorillasun.de) > > — Yazid (@Yazid) [May 28, 2023](https://twitter.com/Yazid/status/1662757970911047680?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Making art is an emotional challenge. I'll often have too many ideas for my own good, and in the attempt to pursue multiple threads I'll start to lose myself and not get anything done. For this reason, I find that it's a massive effort to work on the same thing again when it's just so easy to start a new project instead. Makes feel a little bit better about myself when I read such words coming from someone whose art I really admire. ## Gorilla Articles ### Programming a Particle System with ChatGPT This week I played a lot with ChatGPT and tried to use it as my personal sketching assistant; turns out that it's actually pretty good at making P5 sketches. The practical example that I decided to pursue was an interactive particle system, and after trying different approaches I ended up with the following: > Asked chatGPT to help me make a little particle based sketch 👇 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/AtJ508AHkY](https://t.co/AtJ508AHkY?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 23, 2023](https://twitter.com/gorillasu/status/1660994637895442433?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Later I compiled a little post summarizing my explorations, showcasing the prompts that I used to put together the final sketch. If you want to try this experiment for yourself and steer ChatGPT to create an interesting p5 sketch: [Programming a Particle System with ChatGPTYou’ve probably heard about ChatGPT, and you’ve probably heard that it can write code. In this post we’re taking it for a spin and explore a practical example - we’ll make it code a full-fledged particle system from scratch! Let’s see what the best prompts are for this purpose!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-76.png)](https://www.gorillasun.de/blog/programming-a-particle-system-with-chatgpt/) ### A brief FxHash Retrospective After releasing my latest token, I looked back on all of the projects that I have released on FxHash so far, and it made a little bit nostalgic: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/image-1.png) 16 FxHash projects I rarely take the time to reflect on my previous works and all the experiences that I've made along the way, hence I wrote a little retrospective to commemorate this 16th FxHash release: [Making Generative Blockchain Art on FxHash: A brief RetrospectiveThis post is a brief retrospective in which I look back onto the past two years of making code based blockchain art. I tackle some lessons that I’ve learned, some of the emotional struggles that I’ve experienced and conclude with some tips to grapple with this fast paced environment.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/scribble2.jpg)](https://www.gorillasun.de/blog/generative-blockchain-art-retrospective/) In the post I tackle a couple of topics, like grappling with the emotional challenges that come alongside making generative art, as well as some things that I believe I could have done better. I believe that I've grown a lot as a coder and as an artist since these early FxHash days - at the very least I feel much more comfortable now putting work out into the world than I did before. ## Gorilla Sketches Another week of heavy sketching - not just for the newly released token but also for a couple of upcoming projects. One of them for Proof of X, which I'm already really excited about: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/all-the-simple-things-10.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/all-the-simple-things5.png) All the simple things - WIP Sketch in preparation for Proof of X ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/proofofx.png) Same artwork at a larger scale. The second project is for a new upcoming platform - I'm not certain if I can reveal too much about it at this point - but it's got something to do with the Poisson disk sampling I shared recently: > Got two big projects coming out in the next weeks! ✨Here's a [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) from one of them that uses Poisson disk sampling as it's foundation! [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 🐟 [pic.twitter.com/GzwxbafnDq](https://t.co/GzwxbafnDq?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 28, 2023](https://twitter.com/gorillasu/status/1662870490833375232?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) More about this one in the coming days! Can you guess what it's going to be? ## Interesting reads of the week This week we treat ourselves to a couple of articles on generative Art! ### Draw this Seed! Alejandro Campos released a really innovative FxParams token that allows you to *draw* onto the canvas and then mint whatever you created. In his article he explains how he made it possible: essentially the canvas needs to be encoded as a string and then passed in a parameter, such that the minted piece re-generates what has been drawn. [fxhash - Draw that seed!Pensado a mano explores the intersection of Generative Art and Hand Drawing. The collector, by drawing a predefined number of shapes on canvas, creates a unique hand-crafted seed that generates the final artwork. That is the only customisable param, thought by hand, which interacts with various rand…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmbfwitKnpZWHS4jmonCCioiBrkGM4jE9HgDwoQmkrtS84)](https://www.fxhash.xyz/article/draw-that-seed!?ref=gorillasun.de) The technicalities behind **Pensado a Mano* > (gm) > fx(params) = "Draw your Seed" > Plottable edition (example below) > > Should I launch this?[#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ?[#madewithcode](https://twitter.com/hashtag/madewithcode?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/U7VCywhLvl](https://t.co/U7VCywhLvl?ref=gorillasun.de) > > — Alejandro (@ratchitect) [May 6, 2023](https://twitter.com/ratchitect/status/1654850158247526403?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Juhani Halkomaki - Feature Article in Stir World It is always a joy to see Juhani's art grace my timeline - here's a well deserved feature article on his art in the Stir world Magazine in which he talks about his background, process and inspirations: [Juhani Halkomäki: Exploring a digital arts practice that builds on creative codingThe artist Juhani Halkomäki shares anecdotes from his digital art practice, and explains how he came to focus on his art while working in technology.![](https://www.stirworld.com/images/favicon.ico)STIRworld.comManu Sharma![](https://www.stirworld.com/images/article_gallery/noisy-mountain-feels-like-hills-made-of-soundwaves-2022-digital-illustration-juhani-halkom-auml-ki-stirworld-230513061821.jpg)](https://www.stirworld.com/see-features-juhani-halkomaki-exploring-a-digital-arts-practice-that-builds-on-creative-coding?ref=gorillasun.de) A closer look at Juhani's practice - a must read! ### The Algorithm behind Buizen Not from this week, but still very worth reading - Misha Heesakkers gives us a peak into the inner workings of the algorithm and maths behind his generative token Buizen: [fxhash - Behind the algorithm: Buizen - Generating tubes with arc tangent mathWelcome to my article series ‘Behind the algorithm’ where I try to write about the work that gets into the artwork. I started this series for my generative prints but recently I dipped my toes into generative art NFTs on fxhash where I launched two generative tokens, “Kralen” and “Buizen”. In this a…![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/Qmc6hnnkNBHeXBgQPDHaBEr6RQnVXSJ2tXCRrcxPMjnQub)](https://www.fxhash.xyz/article/behind-the-algorithm%3A-buizen-generating-tubes-with-arc-tangent-math?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/image-2.png) ## Tip of the Week Not a programming tip this time around, but nonetheless something quite interesting to me. It's about varying the length of you sentences to create a perceived rhythm in your writing. You might've noticed but I've been writing quite a bit these days, and sometimes I'm utterly stuck on certain paragraphs and sentences. Often it's because I can't find the correct wording/phrasing to express a certain idea, other times the paragraph just doesn't *flow* well. Now I'm starting to wonder if it has to do with the *rhythm* of my writing. > Just shared this with a young writer because really it can never be shared enough. [pic.twitter.com/JUjMPQQZJR](https://t.co/JUjMPQQZJR?ref=gorillasun.de) > > — Mira Crisp (@misscrisp) [December 6, 2019](https://twitter.com/misscrisp/status/1202792895448662016?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Amelia Wattenberger made a tool for exactly this purpose 👇 > ✨ what if we could focus on editing the flow of our writing? ✨ > > Well crafted writing has rhythm - it sings, it dances. It switches between long, detailed sentences and short, punchy ones. It dives from lofty, abstract ideas to tangible, concrete sensations. [pic.twitter.com/wxwjIZ0n9R](https://t.co/wxwjIZ0n9R?ref=gorillasun.de) > > — Amelia Wattenberger 🪷 (@Wattenberger) [May 24, 2023](https://twitter.com/Wattenberger/status/1661379524976599044?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Music for Coding Really enjoyed this playlist this week - gave me a lot of good vibes, perfect tunes for starting your summer and clearing up that morning brain-fog: **And that's it from this week! See you next week, and until then cheers, and happy coding \~ Gorilla Sun 🌸** ### Making Generative Blockchain Art on FxHash: A brief Retrospective URL: https://www.gorillasun.de/blog/generative-blockchain-art-retrospective/ Last updated: 2023-05-28T12:16:19.000Z **It's November 2021, the HEN community is going through a major upheaval, and at the same time I'd just heard about a new platform on the Tezos blockchain, with a fairly strange name: FxHash.** Apparently it was a platform on which you could mint generative tokens. Essentially generative art projects where collectors would obtain their own unqiue variation when pruchasing an edition. Fast forward a little bit and the platform quickly takes the generative art scene by storm. In combination with the low gas fees on Tezos, and being open for everyone could to mint their project, FxHash was a gateway for many generative artists to start monetizing their creative sketching practice, that many of them had already been doing anyway on a daily basis. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/cacography.jpg) Cacography #137 collected by zhong From a technical point of view, creating a project for FxHash was not so different from making your usual Javascript based sketch, you now just had to paste in a little script into your index.html and use the provided randomness function, such that the outputs were deterministic. I quickly joined in on the fun, made two lighthearted sketches, and published them on the platform not thinking too much of it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/furb51.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/wisp350.jpg) Furbol #51 collected by Yazid and Wisp #350 collected by n x 0 It took a fairly long time for both of them to mint out, both of them a whopping 1000 editions - at the time 1000 editions didn't seem like too absurd of a number, since it would be quite impossible for the code to generate the exact same artwork twice. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-80.png) Furbol minted out on December 8th of 2021 And the platform was still young at the time, with a large influx of new creators/collectors that were just picking up whatever was still minting, simply for the excitement of being part of this entire experience. At the time of writing this post I've released quite a few tokens on FxHash, 16 projects to be precise: > 16 [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) projects [pic.twitter.com/uid6LNmurQ](https://t.co/uid6LNmurQ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 26, 2023](https://twitter.com/gorillasu/status/1662061161431310339?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Looking back I'm starting to wonder if I do actually have a *style*? If you can call *chaotic* and *colorful* a style - I often get kind comments saying that the piece gives them Gorilla Sun vibes, and that actually makes me really happy. But beneath the colorful and bubbly vibes of each one of these projects hides a learning experience. Some projects came together easily, some were steep mountains to climb. And I'm still on the pursuit of the project that will make me go *I couldn't have done this better -* but maybe that's just wishful thinking. I'm proud of myself though, I've tried to reinvent myself with each project, in an attempt to strike at something new, either from a technical or aesthetical point of view. I'm also really happy that I managed to publish as many projects as I did. These were the lucky ones. RIP to all the other projects that are still waiting for me at the depths of my dusty external hard-drives ☠️ 0:00 / 1× My latest FxHash project - 2D or not 2D Let's have a look at some of the lessons that I've learned working on these projects and publishing them on FxHash. ## Analysing your past Projects My most recent obsession in the past months has been the game of chess. Even though I still make stupid mistakes, I believe that I've got a good grasp of the game now. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/image.png) On a side-note, would you be interested if I wrote about chess for a change? Lots of interesting algorithmic problems there as well. One crucial exercise to get better at chess is the analysis of your previous games. Not only the ones that you lose, but also those in which you came out on top at the end. In each game, it's important to isolate the different move sequences, and pinpoint those crucial moments that turned the tides in, or against your favour. When it comes to making art, especially code-based art, I often feel that it's a similarly thin line that needs to be threaded, where there are moments in the process that can make or break the entire project. I believe one quality that makes out a good artist, is being in tune with this process, such that firm steps are taken towards the realization of the ultimate vision. Naturally there's a preliminary exploratory phase as well, but once that's completed it shouldn't be too difficult to hone in on the conclusion of the project. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/vestige-1-.jpg) Vestige #81 collected by cagrimmet In my experience, certain projects come together quickly and nicely, but more than often I feel like I'm trying to keep my balanced on a tightrope, from which I could fall off at any given moment. Being able to dial into this razor-sharp mindset, at will, is something that I want to get better at - sometimes I want to be able to push aside the distraught artist and bring in the focused engineer. That's why it's important to look back at past projects, and objectively assess what went wrong, what went well, and how to draw meaningful conclusions from these experiences: > 🚨 Big sorry, but I will have to delay the mint till tomorrow. Thanks to [@meezwhite](https://twitter.com/meezwhite?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I was made aware that the sketch doesn't display properly on safari. > > I've fixed the problem in the meanwhile, but I will have to wait until tomorrow's opening schedule to re-mint! 🙏 [https://t.co/rFPBwALw4g](https://t.co/rFPBwALw4g?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [August 7, 2022](https://twitter.com/gorillasu/status/1556247689217597442?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Naturally, this isn't limited to the technical difficulties that are sometimes unavoidable. ## Dealing with Negative Emotions Making art is a tough business. I'd be lying if I said that this journey has been a walk in the park. Some projects have caused me a lot of emotional distress - especially when closing in on a release date, it seems that impostor syndrome kicks in quite hard. > Sometimes I get imposter syndrome. But then I remember that nobody really knows what the hell they're doing. [pic.twitter.com/1ZvoNzUBcv](https://t.co/1ZvoNzUBcv?ref=gorillasun.de) > > — Jeff / ippsketch (@ippsketch) [April 27, 2022](https://twitter.com/ippsketch/status/1519312121556881408?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Another thing is the negative emotions that come in tandem with unmet expectations. This is maybe a little bit silly, but every time I release a new token, I have this little voice at the back of my head, cheering me on: *This is the one! This is gonna be the project that'll make you a genart superstar!* \- but that doesn't happen, simply because the world doesn't work this way. You become a superstar by consistently putting out good work, and honing your skills. It's not just about one project, it's about your entire body of work, as well as all the other auxiliary things that give meaning and value to your work. Now you could point at artist X and coder Y that had massive success from the get go with their first projects, but in most cases that's because they already knew what they were doing, either from the art or code side of things. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/exotic_quarpet_3240x5040-2--1.jpg) Exotic Quarpets #57 collected by Melissa Rodriguez Sure, there will always also be a wunderkind that is simply very talented, and with a pinch of luck they'll be at the right place, at the right time. The early days of HEN and FxHash were crazy and exciting, and it was fabulous to have lived them - but at the same time they might have given me somewhat wrong expectations about a career in the genart space. Making and publishing projects on the platform is probably the tiniest fraction of the work. In this hyper fast paced environment there's no time to feel bad. You gotta pick yourself up quickly and get started on new work. However, sometimes I didn't manage to do so, letting important opportunities pass me by, falling behind on communication, and not engaging with the community nearly as much as I should have. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/img-56-.jpg) Neo Supremus #2 collected by twilliability I haven't been the most successful artist on the platform. And maybe that's because I haven't been a very methodical artist - my stuff is all over the place - and in that regard an accurate representation of the internal state of my mind on most occasions, constantly jumping from one idea to another. Without context it's probably very confusing to follow along all of the things that I'm trying to do. Instead of making small incremental changes to past ideas, slowly evolving them over time, I often take large leaps, unnecessarily leaving good ideas behind, and starting work on something new, when there simply isn't room for more. Some folks that I really admire in that regard are [Bruce aka Studio Yorktown](https://twitter.com/StudioYorktown?ref=gorillasun.de), [Aleksandra Jovanic](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de), and [Jeff ippsketch](https://twitter.com/ippsketch?ref=gorillasun.de) \- their work is incredibly consistent, as standalone projects and across the entirety of their works. Well, the one thing that I've been consistent about has been my blog work. Even more so lately, trying to stick to the biweekly posting schedule - and somehow I've actually been managing to do so. ## Connecting with your Collectors **To preface this section, if you've ever collected one of my works - I'd like to express my endless gratitude 🙏 it's made a gigantic difference in my life!** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/img-57--1-.jpg) Assemblage #49 collected by nftartcards This one took me a long time to learn. Starting out as a *blockchain artist* (that's the best way to put it) in the early HEN days, my conception of the collector's role, as a part of your artwork's lifecycle, had been tainted a bit. This was in part due to the anonymity of actors on the blockchain, and equally due to the initial flipper culture that was prevalent at the time, where tokens were regarded as financial assets rather than artworks. In those days I didn't really consider myself an artist, even though I was making art - the setting wasn't implying it. Later in the early days of FxHash this also gave me inhibitions to engage with the many collectors that picked up my first couple of projects on there. I had the messed up notion that I couldn't and shouldn't be friends with my collectors - I didn't want anyone to feel that they had to collect my piece just because we were friends. If that makes sense. In essence I didn't want anyone to feel that they owed me to collect one of my pieces. But in reality, it couldn't be further from the truth - the folks that collect from you are your biggest fans. Connecting with them and interacting with them by means of the artwork makes it the connection so much more special. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Screen-Shot-2023-05-28-at-12.46.23-fullpage.jpg) My meager FxHash collection - I collect sporadically. Another thing here, is that I haven't been a good collector myself. Most of your gen art collectors will at the same time be your gen art friends, and friends are there to support each other. From the start I've been hyper focused on creating new work, such that I neglected that part of the practice quite severely. I'm slowly trying to change that, but I'm still not a very good collector. ## Tips for building Generative Tokens At many points along this journey I've felt like I was in way over my head. From a technical point of view, there was a lot that I had to learn - even though I studied programming, coding for the web wasn't my strong suit. Here's a few things that I think are important when you set out to put together a generative token for FxHash: 1. **Keep it Simple.** From personal experience there's rarely any benefit to artificially adding complexity to your code, nobody cares - it's the final output your code produces that everyone's going to see. Maybe some curious soul will actually have a glance at your code, but you shouldn't be trying to impress anyone. 2. **You're making art, not building a Software.** I'm guilty of this one, on many occasions, even in my latest token. Adding in a lot of optional toggles and button presses is probably not a good idea when you're trying to make art. It can quickly become confusing to the collector what you're actually trying to do. Just because something is a technical possibility, doesn't mean that it needs to be added as a f*eature*. One example is my piece Microcosm, which just had way too much stuff going on. 3. **Having Intent.** Vera Molnar claims that her art wasn't symbolic nor was it meant to convey a specific message. However I'd argue that it still had very clear intent and purpose, through it's aesthetics and through the process with which she created her art. Even though she didn't want to send a message, she still made a statement. When making art, it can be beneficial to ask yourself 'What am I trying to convey?' and find something in your artwork that you might not have seen in it before. > All the simple things 4 🐞 [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) notebook debugging session! [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/J5COqWi4z8](https://t.co/J5COqWi4z8?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 23, 2023](https://twitter.com/gorillasu/status/1660938201018531840?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) As for the process itself, there's also some things that can be helpful: 1. **Having a sketchbook.** Doodling on paper is just so much easier, faster and less frustrating than aimlessly writing code sometimes. I found it to be the best antidote to being stuck, or when I've run out of ideas. The strokes of the pen always manage to pull new shapes from the aether. I'll then use these as starting points for new sketches. 2. **Having a Checklist.** Whenever you run into a bug - note it down! Whenever you mess up - note it down! The next time you're about to publish a token, you can quickly run through your checklist to make sure that all of these issues are not going to repeat themself. 3. **Sticking to a schedule.** I recommend setting up a schedule for yourself - if you don't have one for your creative coding yet. It helps tremendously with getting work done when you impose a soft-deadline on specific tasks. You just can't tweak a project endlessly, life needs to go on. But you also need to be realistic about your goals, this schedule shouldn't be anxiety inducing, but rather a timeline for you to lean on. 4. **Planning ahead.** This directly plays into the previous point. For the first couple of months on HEN and FxHash I could get away with not planning anything ahead of time but now that's just not possible anymore if I want to be consistent about the blog and my generative art, I need to start working on things ahead of time. And that's about it! I hope you enjoyed this retrospective, maybe you've made similar experiences, or actually completely disagree with me on some points I brought up - best way to let me know is by leaving a comment. There's a lot more to say about this entire journey, but this feels like a good point to make a cut. **I'll see you in the next post! Cheers, happy coding and sketching \~ Gorilla Sun 🌸** ### Programming a Particle System with ChatGPT URL: https://www.gorillasun.de/blog/programming-a-particle-system-with-chatgpt/ Last updated: 2023-05-26T09:07:32.000Z **If you haven't been living under a rock then you've probably heard about ChatGPT. What's more is that the large language model is also capable of generating code. This post is about using the AI chat-bot to develop a particle system in P5JS, and test if it's capable of making adjustments to a simple sketch based on our prompt inputs.** **What is ChatGPT? Can it generate code? Explain simply and briefly.** ChatGPT is an AI language model developed by OpenAI. It is designed to generate human-like responses to text-based prompts or questions. It has been trained on a vast amount of data from books, articles, websites, and other written sources to understand and generate natural language. Regarding code generation, ChatGPT can assist with generating code snippets in various programming languages. You can provide descriptions or ask for specific code examples, and ChatGPT can generate code for you. \[...\] it may not always be perfect or error-free. \- ChatGPT Arguably, the code generating aspect is the most intriguing part to me, and immediately makes me wonder about a number of things - how good is it really at writing code? Does it understand the code that it comes up with or is it just regurgitating things it has been trained on? Can we make adjustments to the code by guiding it with our prompts? Here's what we'll try to create: > Asked chatGPT to help me make a little particle based sketch 👇 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/AtJ508AHkY](https://t.co/AtJ508AHkY?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 23, 2023](https://twitter.com/gorillasu/status/1660994637895442433?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This post is intended as a lighthearted exploration of what we can do with ChatGPT in this regard. For the purposes of the examples in this post I used the GPT 3.5 version of ChatGPT. I was told that much better results might be possible with GPT4 - so if you have access to that you might just give it a spin. ## What are Particle Systems? You know what? We might as well ask ChatGPT while we're at it: ***What is a particle system? One short paragraph.*** **A particle system is a computer graphics technique used to simulate and animate large numbers of individual particles.** These particles have properties such as position, velocity, size, color, and lifespan, and can be manipulated to create various visual effects like fire, smoke, explosions, or fluid simulations. Particle systems are commonly employed in video games, movies, and other visual applications to enhance realism and generate dynamic and interactive visual elements. – ChatGPT Actually one of the best resources to learn how to program a particle system is by none other than the creative coding OG Daniel Schiffman: An introduction to programming particle systems with P5JS. A very useful library for making visualizations, animations, and simulations with Javascript is P5JS - which is exactly what we're going to ask ChatGPT to use. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-69.png) I present my new coding assistant: ChatGPT! Additionally, there's a number of interactive widgets throughout the text for you to play with and that reflect ChatGPT's responses. To prevent this page from eating up too much memory I disabled auto-play on most of the sketches, to run them simply hit the play button at the top of each one. Particle systems also involve a lot of loops, which might time out if they're left unattended - in that case simply restart them with their corresponding play button. ## Initial Prompt Let's start simple and just ask it straight away if it can generate a particle system in P5 👇 > **Can you program a particle system in p5js?** Kind of impressive! But hold on... that looks familiar! It's very similar to what Daniel Schiffman put together in his video tutorial on the same topic. The example from the corresponding chapter in his [book Nature of Code](https://natureofcode.com/book/chapter-4-particle-systems/?ref=gorillasun.de) is also very similar: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-71.png) Daniel Schiffman programming a particle system on his youtube channel The Coding Train ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-70.png) Particle System Chapter from the book The Nature of Code As we're going to see, it turns out that ChatGPT is actually pretty good at making P5JS sketches! Considering that GPT-3.5 was trained on a big chunk of the entire internet, it is likely that it has seen many thousands of P5JS sketches. A good portion of this sketch corpus probably consists of particle systems, or particle-system-like systems, lots of them likely forks of Dan's example. So it probably didn't have much trouble piecing together the necessary code from it's internal representations. But that's just my assumption, we don't actually know exactly what GPT has been trained on. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-77.png) Fair enough The challenging part is yet to come though, let's see how good ChatGPT is at modifying and evolving the code from here on out! ## Adding Physics The particle sketch that it provided doesn't implement any physics yet. The particles don't interact with each other, there's no collisions between them nor with the boundaries of the canvas. Let's ask chatGPT to make these changes one at a time: > **Can you add physics to it? And make the particles stay within the canvas please.** Careful with these loops, they will slow down after a while due to too many particles being spawned. > **Can you make the particles collide with each other?** This collision behavior is a bit odd, I'd like it if it was a little bit smoother actually such that the particles don't get stuck on each other. I also want there to be a maximum number of particles, so that it doesn't become very slow over time. Let's see if we can ask ChatGPT to fix that. > **Make it such that there is a maximum amount of particles that shouldn't be exceeded. g vCan you also make the particles not get stuck on each other?** OK, not bad! Not bad at all, we asked for the changes and ChatGPT delivered. Note here that I didn't even look at the code when I made my requests, I simply based my suggestions off of what I saw when I copied the code over and ran it in the P5 editor. ## Spawning Particles with the Mouse Now let's see if we can spawn new particles with a mouse press! > **Can you make the particles have different sizes and colors? Can you also add in a function that spawns new particles when the mouse is pressed?** You might notice here that the particles sink through the bottom of the canvas after they sit there for a bit, let's fix that. I also actually want the oldest particles to disappear and have the mouse continuously spawn new ones. > **There's a problem where the particles sink through the bottom of the canvas, can you prevent that? Also when I spawn new particles with a mouse press, make it such that the oldest particles disappear to make space for new particles.** Sometimes ChatGPT doesn't get it right from the first try. Let's adjust the prompt and try to draw attention to what we actually want. > **Can you also make it such that the particles don't leave the canvas from the sides or from the top? Can you make the collisions more accurate such that the particles don't overlap? Also mouse presses still don't spawn particles when the maximum amount of particles is reached, can you fix that as well?** Much better. ## Optimizations Let's also see if ChatGPT can make this code run faster - in this aprticle system the number of collision checks grows exponentially the more of them are added, since each particle needs to be checked against every other particle to determine if they in fact collide. ### Grid Lookup ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-72.png) Well, dang! Didn't expect ChatGPT to know about grid lookups! As it mentioned, a grid lookup is a method to speed up the collision procedure. Using an invisible grid in the background we check which cells the particles occupy and only check it against particles in neighboring cells that it overlaps, then we only need to make a fraction of the checks. I wrote in depth about how to make such a grid lookup for a circle packing procedure in this article if you want to learn more about it: [A Simple Solution for Shape Packing in 2DShape packing is a popular type of sketch in gen-art, but is often trickier than it might seem when you try to pack anything more complicated than a simple circle. In this post we’ll have a look what goes into collision detection as well as a strategy to pack any arbitrary shape in 2D.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/banner2.jpg)](https://www.gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d/) Now let's see if the ChatGPT's grid lookup actually works - note I had to minify the code here for the widget to work: Color me impressed! It works, and it works well! Here's also what it had to say about the changes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-73.png) ChatGPT's explanation of it's grid lookup code. ### Collision Resolution The particles are however still overlapping a bit, let's see if we can ask it to fix that again. It's been a bit inconsistent in that regard. > **Again, well done! But can you please make the collisions more accurate? Can you make it such that the particles don't overlap each other anymore?** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-74.png) Alright, alright - now I feel like it's just trying to flex on me. First time I hear about collision resolution, no idea what it is but let's see how it behaves: Ok so this is also really cool! It's like the particles are a little bit elastic as well now. When you spawn a bunch of them it almost seems like there's a little sea of particles forming. ### Verlet Integration Next I asked it what other techniques there are to improve the sketch, and it answered with a bunch of stuff: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-75.png) Let's see if it can actually implement the first one it suggested: > **Thanks for the info, I didn't know about any of these! Can you modify the code and implement "Verlet Integration"?** > **Uh... OK interesting, but I don't think that's the correct behaviour. Now the particles are just jumping erratically all over the canvas. Can you fix that?** > **That's even worse. OK maybe no need for Verlet Integration, can you remove that from the code again and return to what we had before?** > **That is still broken. Can you go back to the exact version of the code that you provided in your 9th answer?** You'll notice that this isn't actually the code from the 9th answer LOL. Ok - let's call it a day on this chat, and boot up a fresh one. It's just gotten stuck and doesn't want to go back to what we actually had before. I couldn't get it to go back to the working piece of code that we had. Maybe there's some exact prompt with which we can achieve this, but I'm too impatient to keep waiting for it to regenerate the entire code on every question. ## Adding an Attractive Force Here I essentially started from a new chat and pasted in the code from before after the prompt: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-79.png) Starting from a new chat. I don't know what the best practice is pasting in code, if the back ticks are necessary or not or if they have any effect on ChatGPT's response. > **In the following code can you add an attractive force to the cursor when I press the space bar? Such that the particles flock towards the cursor and follow it. Make it smooth please!** > **Ok that's working really nicely! There's an issue thought where the new particles don't collide with the old particles, can you fix that?** Again, the collision behavior wasn't very consistent, and kept changing over the prompts, but it was able to always make it work somehow - here I guess you gotta pick the one that you like the most. ## Concluding Thoughts Overall this entire prompting session took roughly 2 hours. I did however experimented for a couple of hours previously to get a feel for how things work. My main take aways here are: 1. **The initial prompt is incredibly important.** If it provides something that already works well then you have a good chance at tickling something more out of it 2. **Choice of words is important**. It is actually very sensitive to the words that you choose. For instance you get a different starting sketch if you ask it *can you program* instead of c*an you generate*. 3. **Use clear language, avoid abstract terms**. I had some fun prompting with before, telling it to create a *beautiful* p5 sketch, but that doesn't really work - the model doesn't know what *beautiful* actually means, it's a subjective thing. Asking for a particle system on the other hand, it knows exactly what we want. 4. **Don't ask too much of it.** Simple improving questions to guide it in the right direction work well. Starting from a chunky and elaborate initial prompt is often too much for it. 5. **Asking again works sometimes!** Sometimes you just need to ask it a second time and it'll make the correct changes. 6. **Going back doesn't really work.** It doesn't really understand how to undo changes. 7. **When it's stuck, it's better to start from a new chat.** It's a bit odd but it's ability to remember things from the current chat can sometimes also be a little bit detrimental. As if it has some sort of inertia that's a bit difficult to steer. 8. **Positive feedback like 'Well done!' and 'Good Job!' seem to somehow work?** It's just based off of a feeling, but in my mind it's basically telling it that it did well and maybe it'll take note and conjure new answers in a similar manner to which it did before. But those are just my thoughts after playing with it for a while. Would love to see what you can come up with. Hope you enjoyed this little experimental post about sketching with ChatGPT! Now I'm actually really excited to write a little tutorial on how to code a Particle System from scratch, with physics and all that Jazz - especially with the grid lookup and the collision resolution method! **Cheers, happy coding \~ Gorilla Sun** 🔆🐵 ### Gorilla Recap 5 URL: https://www.gorillasun.de/blog/gorilla-recap-5/ Last updated: 2023-12-19T23:12:12.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** It's been a very busy week again! Among other things, I started working on a portfolio page for the blog, where I can showcase all of my projects. Demos in the attached tweets: > Continued working on my portfolio page ✨ > > Trying to add a navigation element, but the small icons look a little silly 🤔 I prefer the bold titles a lot more. [https://t.co/TqgQ82kpGa](https://t.co/TqgQ82kpGa?ref=gorillasun.de) [pic.twitter.com/DI6Os7fQFi](https://t.co/DI6Os7fQFi?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 18, 2023](https://twitter.com/gorillasu/status/1659268902751281164?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Instead of going the usual route and using a grid, or a masonry layout, I decided on doing it a little bit differently where each project is showcased as it's own card in a draggable carousel viewer. Similarly to the articles page, here we're also using the [glide.js](https://glidejs.com/?ref=gorillasun.de) library for the cards. The image slideshows within the cards are however custom made, using the [w3schools tutorial](https://www.w3schools.com/howto/howto%5Fjs%5Fslideshow.asp?ref=gorillasun.de) as a strating point. After I making a little prototype I quickly realized that there needed to be some sort of navigation to indicate how many projects there are overall and to allow the user to jump between the different projects, even if they're not chronologically adjacent. It ended up being a little bit esoteric, but I like how it indicates how many entries there are for every month: 0:00 /0:17 1× Putting this together without having to manually type out all of the HTML code was also a challenge, I thought it would be best to load in a JSON file in which each project is it's own object. Each month being represented by an array of project objects: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-58.png) Structuring JSON files and how you parse them within your code is tricky. The main problem with doing it this way, is that if any change is made to the strucutre of the JSON file, the JS code that parses it and constructs the HTML from it will easily break. I also still have to add a navigation element that allows toggling between different years. Is that the best way to do things? I'm not actually sure, but I'm thinking of making an offline version where I can also browse my code alongside each project. My hard drives have become a bit of a mess, and when I look back in 10 years I want to be able to find things, hence the importance of being a bit more organized about the archival side of things. Additionally, collecting all my projects will also take some time. In other news, Proof of X made an announcement: I'll be part of their upcoming live minting exhibition, a collaboration with [FxHash](https://twitter.com/fx%5Fhash%5F?ref=gorillasun.de) and [Kumaleon](https://twitter.com/KUMALEON%5F?ref=gorillasun.de)! Super stoked about it, and I've already started working on my sketch! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-57.png) ## Gorilla Articles This week's post was quite an important one: Getting started with P5JS! The entire blog wouldn't exist if it wasn't for the wonderful P5 library, and hence this post is kind of long overdue. We go over everything required to get started with P5, it's aimed at complete beginners and I tried my best to explain things in such a manner that even someone who doesn't know the first thing about programming can follow along. If you know someone that wants to get into creative coding and generative art, send this one their way: [Getting started with P5JSIn this post we’ll have a look at p5.js, a creative coding and generative art javascript library. We’ll setup our first project, learn how to draw some shapes and get started on our creative coding journey.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/plantsmember-1.png)](https://www.gorillasun.de/blog/getting-started-with-p5js/) There was no Sunday post, not because I didn't work on one, but because I didn't publish it. I caught up with family over the weekend and didn't have enough time to polish the essay. Sometimes my writing is a bit all over the place, especially now that I'm trying to post twice a week. But keep your eyes peeled, it'll be out sometime throughout the week. ## Gorilla Sketches I continued working just a little bit on my Tetrons sketch, trying to add a little bit of visual interest to the piece: > 🌃[#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/txaTfwqirq](https://t.co/txaTfwqirq?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 15, 2023](https://twitter.com/gorillasu/status/1658151626803228682?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The piece isn't quite there yet but I'm happy with the progress that I've made on it: > Sunday evening [#WIP](https://twitter.com/hashtag/WIP?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/ID2YpfKa6M](https://t.co/ID2YpfKa6M?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 21, 2023](https://twitter.com/gorillasu/status/1660366888730349568?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I'll most likely release it on FxHash very soon! Besides this sketch I also started working on my drop for Proof of X - a little bit of different take on my irregular grids: > All the simple things 2 ✨🌊 [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/UsXWUxp4rj](https://t.co/UsXWUxp4rj?ref=gorillasun.de) [pic.twitter.com/qMtE6V2tgR](https://t.co/qMtE6V2tgR?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 22, 2023](https://twitter.com/gorillasu/status/1660617346753470466?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) In the coming days you'll be seeing a lot more sketches! ## Interesting Reads of the Week ### P92 - A decentralised Twitter clone by Meta It's not certain yet when this app will be released but apparently Meta is working on a Twitter clone: [Meta is working on a decentralized social appMeta confirmed that it is working on a decentralized text-based social app that is internally codenamed as P92.![](https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=192)TechCrunchIvan Mehta![](https://techcrunch.com/wp-content/uploads/2022/10/meta-distorted-glitched.jpg?resize=1200,675)](https://techcrunch.com/2023/03/09/meta-is-working-on-a-decentralized-social-app/?ref=gorillasun.de) And while we're at it, there's been some more changes to the Twitter algorithm - mainly concerning the weights that influence the tweet ranking component of the pipeline: > First, here are the new weights for ranking > > Every time a user engages with your tweets, you gain points on that tweet > > More engagements, more ranking > > As you can see, replies now have a bigger impact > > Getting your profile clicked is also big [pic.twitter.com/IBVowdq8rw](https://t.co/IBVowdq8rw?ref=gorillasun.de) > > — NFT God (@NFT\_GOD) [May 21, 2023](https://twitter.com/NFT%5FGOD/status/1660410005806358529?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### The inner JSON Effect A fund and interesting read by TJ Mott recounting a new employees first experience at a company that had adapted a strange JSON-like system for their workflow: [The Inner JSON EffectJake eagerly stepped into his new job, grateful for more experience and new challenges, craving to learn new software stacks and see what his new company had to teach him about the world of software. They told him he’d be working on some websites, dealing with JavaScript, Node.js, JSON, and the lik…![](https://thedailywtf.com/favicon.ico)The Daily WTFTJ Mott![](https://thedailywtf.com/images/tj-mott.jpg)](https://thedailywtf.com/articles/the-inner-json-effect?ref=gorillasun.de) ## Tip of the Week On Mastodon I came across this cheat-sheet by Julia Evans that shows the different effects of bitwise operations: [Julia Evans (@b0rk@jvns.ca)Attached: 1 image how bitwise operations are used (I’d love to hear what folks find confusing about this one — still trying to work on the explanation here)![](https://mastodon.social/packs/media/icons/apple-touch-icon-1024x1024-db6849588b44f525363c37b65ef0ac66.png)Mastodon![](https://cdn.masto.host/socialjvnsca/media_attachments/files/110/391/772/302/871/529/original/09edbf0dc481cd67.png)](https://mastodon.social/@b0rk@jvns.ca/110391772625054741?ref=gorillasun.de) At the same time I also saw this reddit post where OP made a webapp that allows you to play with the different bitwise functions: > [A while ago, I created a web app to help me understand how bitwise operations work by visualizing results. It allows you to click on 0s and 1s to flip bits and see how the numbers change. I'm curious about what you think could be added or improved there. Any comments are greatly appreciated.](https://www.reddit.com/r/programming/comments/13ejv0z/a%5Fwhile%5Fago%5Fi%5Fcreated%5Fa%5Fweb%5Fapp%5Fto%5Fhelp%5Fme/?ref=gorillasun.de) > by [u/Grabowskyi](https://www.reddit.com/user/Grabowskyi?ref=gorillasun.de) in [programming](https://www.reddit.com/r/programming/?ref=gorillasun.de) Bitwise operations stonks! ## Things to Watch If you ever wanted to get into shader coding, then this video tutorial by [kishimisu](https://twitter.com/kishimisu?ref=gorillasun.de) is a must watch - it explains everything from the ground up and along the way you'll also put together a little 2D SDF sketch: > I've published my first youtube tutorial about shader coding! > > I used manim and shaders for the animations, and the entire voiceover is AI-generated (for audio quality reasons) > > My channel will focus on computer graphics, digital art and machine learning:[https://t.co/bfUZhVSHZu](https://t.co/bfUZhVSHZu?ref=gorillasun.de) [pic.twitter.com/Z2SL2kIxKr](https://t.co/Z2SL2kIxKr?ref=gorillasun.de) > > — kishimisu (@kishimisu) [May 20, 2023](https://twitter.com/kishimisu/status/1659937063163101184?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) If you wanna give kishimisu a follow, they make all sorts of cool stuff actually - like this neural network powered hangman game: > I've implemented a CNN that predicts handwritten characters with which you can play the hangman game > > Still fully using [#glsl](https://twitter.com/hashtag/glsl?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) fragment shaders! > > You can switch the display mode to see the neural network in action > > Try it yourself! [https://t.co/b2Dl7VJSBp](https://t.co/b2Dl7VJSBp?ref=gorillasun.de) [pic.twitter.com/btmDLaZ0oC](https://t.co/btmDLaZ0oC?ref=gorillasun.de) > > — kishimisu (@kishimisu) [May 15, 2023](https://twitter.com/kishimisu/status/1658151216919003136?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Music for Coding I discovered this album last December and it's quickly become one of my favourite pieces of music ever. Another one of those albums where you just have to click to know if the music actually matches the cover art - and in this case it absolutely does. It's one of those albums that you have to have listened to at least once in your life - my personla highlight of the album is an electric guitar Samba rendition of the Star Wars theme: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-59.png) And that's it from for this week! Cheers, and happy sketching \~ Gorilla Sun! ### Getting started with P5JS URL: https://www.gorillasun.de/blog/getting-started-with-p5js/ Last updated: 2026-07-27T10:36:25.000Z **P5 is a wonderful little library, and I believe that everyone should learn how to use it! If you're a bonafide programming whizz, a designer by trade, or someone that wants to take their first steps into the world of coding - P5 is for you!** *I present to you a complete guide for getting started with p5.js!* I've used P5 extensively over the course of the past 3 years and created so many different things with it. It's been my gateway into the world of creative coding and generative art, and I'm so happy that I discovered it when I did. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/tesselations1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/foamy2.jpg) Two sketches I made with P5 Besides allowing me to express myself artistically, it also introduced me to a wonderful community of creative and inclusive minds. In this manner, P5 is not just a library or a tool, it's also a [community](https://p5js.org/community/?ref=gorillasun.de). Whether you're an absolute beginner or have already dabbled a little bit in P5, this post is for you. We'll go over setting up a project, how P5 works behind the scenes and also have a look at all of the things that we can do with P5. ## What is P5JS? Why should I learn it? [P5 is a Javascript library](https://p5js.org/?ref=gorillasun.de) for creative coding and generative art. *What is creative coding? And what is generative Art? Good questions!* Creative Coding is a programming practice where the goal is to create a variety of different media artifacts. These can come in form of **sketches**, artworks that are worthy of hanging in museums, and even as interactive experiences. Although in many ways still a niche, creative coding has become much more popular in recent years as a modern art practice. [Creative Coding: The New EraCreative coding is a new interdisciplinary art form that bridges the gap between technologists and artists. This article explores what it means to be a code artist, what it means to make art with code, and how we approach this new discipline today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/newerabanner2.png)](https://www.gorillasun.de/blog/creative-coding-the-new-era/) Creative coding is a new interdisciplinary art form that bridges between art and technology. Generative Art is one category under the umbrella term of creative coding, for which P5 is incredibly useful. In generative art the main goal is to create stunning visuals with code, algorithms and math: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/bo-o-gg.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/flows5-1.png) Generative Art Why should you learn creative coding? Creating things is a beautiful part of the human experience. In a world that is increasingly more digitized it just makes sense to also use new technology, especially programming, for the purpose of making art. P5 makes the creation of beautiful visuals very straightforward and allows the quick prototyping of ideas. This is why we also often call it *sketching* with code. [The Importance of Sketching with CodeSketches are more than just little artworks that you hack together in your bedroom. They’re ongoing conversations that you have with the yourself and the machine. It’s important to explore them, gain new perspectives and ultimately contribute to something larger than yourself.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/banner.jpg)](https://www.gorillasun.de/blog/the-importance-of-sketching-with-code/) Making art with code. What an absurd thing. Count me in! ## How do I make a P5 Sketch? Let's have a look at the different platforms that allow us to create P5 sketches. Here we've got a couple of different options, each of which has it's own set of advantages. You'll be surprised how easy it actually it is! ### Online Sketching in an online editor is one of my favorite ways to make quick prototypes, and to share ideas, as well as code examples, with others. There's two popular platforms to do so, the [P5 Editor](https://editor.p5js.org/?ref=gorillasun.de) and [OpenProcessing](https://openprocessing.org/?ref=gorillasun.de). #### The P5 Editor The official P5 editor is the most straightforward way to create sketches, and also allows you to store your sketches online such that you can access them in the future: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-41.png) The P5 Editor What I like most about it, is how easy it is to quickly iterate on ideas via the **duplicate** option in the menu. When you make something that you like, and feel like you want to keep coding - without messing up what you've already achieved - then you can quickly hit the duplicate button and continue with a fresh copy. You can then see your previous sketches in a little sketchbook-like list: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-87.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-88.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-86.png) Duplicating a sketch and viewing your sketch list What's more, the P5 editor puts great care into being accessible. If you know someone that relies on a tool like a screen reader, they should not have any problems working with the p5 editor! #### Openprocessing OpenProcessing is the P5 editor's older sibling, that has many more features, and in a way is like a social network for creative coders. It puts great emphasis on discoverability and sharing sketches with others. You can follow other coders, heart their sketches and even fork their creations to remix them with your own additions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-45.png) On the activity tab you can see whenever one of the users or curations you follow have created a new sketch, or if they left you a comment. And you can also view what other folks are up to, and what sketches they have created: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-47.png) Richard Bourne - the most prolific sketcher on the platform. There's just way too many things that you can do on there to enumerate here. If you end up liking it consider getting a Plus membership, it comes with some additional perks, like setting your sketches to private for instance. ### Offline Working offline is best when you're working on larger projects, where you might have to break up your code into multiple files, import other javascript libraries and when you're not ready to share your code online yet. #### Your own coding environment Working on P5 projects offline can be done by [downloading an offline copy of the P5 library](https://p5js.org/download/?ref=gorillasun.de), and including it in your project folder. You'll then import this library inside your HTML page as a script file, alongside the CSS stylesheet, and optionally, other necessary JS files if any. The project folder structure and the HTML would look as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-53.png) Setup for running a P5 sketch offline. My favorite code editor for this purpose has been Atom up until now - although, sadly, support for it has been discontinued last year. I like Atom because it's simple and lightweight, and additionally has useful plugins. One of my favorite plugins is one that automatically detects hex colors in the code and highlights them with the color that they represent: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-48.png) But I might make the switch over to VSCode soon, a lot of creative coding folks that I know use it and works well for them: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-50.png) You can of course also run P5 within a node project, if that's your jam. #### P5JS mode of the Porcessing Editor Another way to run P5 sketches offline, that requires minimal setup is [the downloadable processing editor](https://processing.org/download?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-52.png) The Processing Editor supports a P5.JS mode And that pretty much sums up all of the different ways that you can run P5 sketches. Pick your favorite one and get started! ## Javascript for P5 P5 is a library written in the Javascript programming language; even though it provides many convenient tools for creating graphics, our sketch will still ultimately boil down to being a piece of Javascript code. That's why we have to talk a little bit about Javascript. Javascript is a scripting language that runs in your browser. It's become the backbone of the internet today, and almost every page that you visit online has some JS code running in the background. A webpage usually consists of three parts: HTML code, a CSS stylesheet and some JS code. HTML tells the browser what elements exist on a given webpage, CSS takes care of what these elements should look like and how they are positioned with respect to each other, and Javascript takes care of the functionality and interactivity on that page. ### How does Javascript run on a webpage? The most common way that you'll see Javascript embedded on a webpage, is through the ` ``` Inside of this page's body we find a button and an inline script (js code is placed directly inside of the script tag), that adds functionality to this button. When you press the button you should get a little popup that tells you **Button clicked!**. Try it for yourself: Click Me In this sense, a P5 sketch is just a simple webpage that runs our sketch code as a script. The P5 library itself is also just javascript code, that gets loaded in at the very beginning of the page's execution such that we can use the tools that it provides within our sketch. If you have a look at the different editors that we mentioned earlier, you'll see that all of them work in this manner: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-91.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-89.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-90.png) ### How much Javascript do I need to know? You don't need to be a coding whizz to take your first steps with P5 - it's in fact one of the best ways to learn and to get better at coding. However, to kickstart your creative coding journey it's best to learn just a little bit of Javascript as well as some of the basic concepts that are used in programming, such that you become able to translate your ideas into sketches. At least I would recommend to get comfortable enough with the terminology and programming lingo, such that you can search and research specific problems that you encounter by yourself via search engines. Googling is an integral component of every programmer's coding practice. A good, but slightly heavy resource that covers everything JS related to sketching with P5 is this one: [JavaScript basicsp5.js is a client-side JS platform that empowers artists, designers, students, and anyone to learn to code and express themselves creatively on the web. It is based on the core principles of Proces…![](https://github.com/fluidicon.png)GitHubprocessing![](https://opengraph.githubassets.com/dc64db0c05505063f2d15e7b8946938df8a481b253edf6f827c5e54a2e8c0712/processing/p5.js)](https://github.com/processing/p5.js/wiki/JavaScript-basics?ref=gorillasun.de) > I've also been working on my own complete Javascript course for a while now, and it'll be up soon, so keep your eyes peeled for that! Consider subscribing to the newsletter if you want to be notified about it! ## Anatomy of a P5 Sketch Alright, we've already covered quite a bit of new ground. We've had a look at the structure of a P5 project, how a script runs on a webpage and the platforms on which we can run our sketches. Now let's have a closer look at how a P5 sketch script actually works. Generally, every P5 sketch consists of two main functions: the setup function and the draw function. When you boot up a new sketch in any one of the aforementioned P5 editors, they'll usually already come with these two functions prepared, and sometimes will even have some more code inside of them. They are essentially the two main ingredients of every P5 sketch. In this section we'll first have a look at what functions are, how they work, followed by a more detailed discussion of the setup and draw functions, how they work and how we should use them! ### What's a function? Functions are like mini-recipes. They take as input some ingredients and return a processed version of these ingredients. We use them in our code to process data, and break down complex tasks into smaller more manageable steps. In a way, functions are like mini-programs! In Javascript a function takes the shape of a labeled container, which stores some lines of code. These lines of code get executed (run by the browser) when we invoke (write out) the label/name of this container. This looks as follows: ```javascript function someFunc(){ // code goes here // more code here } // calling the name of the function executes the code inside of it someFunc() ``` *Oh, and btw, the lines of code that are preceded by two forward dashes are comments. These lines are ignored when the code is run, and are only in place to provide more information for the person reading the code.* To tell Javascript that we're creating a function, we need to use the `function` keyword. We follow the `function` keyword with a name of our choosing, usually a name that is descriptive of what the code inside that function does. We follow up with a set of parenthesis and curly braces. These are mandatory. The curly braces delimit the body of the function, and the code that we want the function to execute should be placed inside of this body. Inputs to the function are passed through the parentheses, we can specify arguments in between them that we would like to pass to this function. The special thing about the setup() and draw() functions is that we don't need to explicitly call them inside of our P5 sketches. When we run the sketch.js, the setup and draw functions get triggered automatically by P5, even in the case when they are empty or completely missing from our script. That's why they are a little bit special. You usually also shouldn't call them explicitly as that would throw an error. What's important, is what we put inside of these functions. ### The Setup Function The `setup()` function is triggered once at the very beginning when the sketch is run. And as it's name suggests, inside it's body we put all of the code that we want to execute once at the very beginning of the script. Usually, this includes another function that comes out of the box with P5, and that is the createCanvas() function. This function creates the canvas element on our webpage, basically the rectangular surface onto which we'll draw our graphics later on. The createCanvas() function requires two input parameters, which consist of two numbers that specify the width and height of the canvas: ```javascript function setup(){ createCanvas(400, 400); } ``` ### The Draw Function The draw() function is run after the setup function has completed all of it's work, and the special thing here is that it will be executed over and over again as long as the script is running, an error occurs, or you explicitly interrupt it somehow. This behavior is intended and makes animations possible in P5, here's an example of an animation: We also call this the **draw loop**. We can control how many times the draw function is executed per second by setting the frame rate with the frameRate() function during setup. The default value here is the frame rate of your display (60 frames on most monitors). Creating animations in p5 is an entire science of itself and usually involves a fair bit of math and trigonometry to control how shapes need to moving around on the canvas. But at the same time, having such fine-grained control allows you to create really interesting animations. One function that we'll often see inside of the draw() function is the background() function. It's a method that simply applies a color to the entire canvas. In the context of an animation it is very important to fill the entire canvas with a color and reset it that way, otherwise we would see the drawn shapes stack on top of each other every frame. Here's what this looks like: One last thing to add here, is that if we've set out to create a static artwork that has no moving parts, then technically the draw() function isn't required. We could do everything inside of the setup() function, even drawing stuff to the canvas, and leave the draw() function empty or completely omit it. ### Global Variables and Helper Functions Besides the setup and the draw function, we often need variables that are accessible throughout the entire scope of the code, such that we can change and update their values over the course of execution and subsequently feed them as inputs into other functions, or alternatively use them as unchangeable constants that act as hyperparameters and dictate the overall behaviour of the sketch. These variables are usually declared and sometimes also initialized at the very beginning of the sketch, preceding the setup() function. Frequently we also need to create other functions, to avoid creating huge blocks of code inside the setup and draw functions, and to make our program a little bit more granular and distribute the code over other functions. ## Drawing with P5JS Now let's have a look at the functions that P5 provides us with. Overall we can classify them into two categories: functions that draw something to the canvas, and functions that change the style of what is drawn to the canvas. To learn more about these functions, you can check out the official p5.js documentation where you can find an exhaustive list: [reference | p5.jsp5.js a JS client-side library for creating graphic and interactive experiences, based on the core principles of Processing.![](https://p5js.org/assets/img/favicon.ico)p5.js![](https://p5js.org/assets/img/p5js.svg)](https://p5js.org/reference/?ref=gorillasun.de) ### Drawing Functions P5 provides a number of functions that let us draw basic shapes to the canvas. For instance the `rect()` and `ellipse()` functions, which as their names suggest, draw rectangles and ellipses to the canvas. Both functions require us to pass values into their parameter lists. The first two parameters for both the `rect()` and `ellipse()` functions are the coordinates on the canvas where we'd like P5 to draw the shapes, followed by one or two other parameters that specify the dimensions of these shapes. Here's an example: If we pass three input parameters, the rect() function will automatically draw a square shape, applying the third parameter as width and height, the ellipse function will draw a circular shape. Otherwise the third and fourth parameters specify the width and height of the shape separately. We can also achieve more interesting shapes by creating a path, and specifying the individual verticex coordinates of a shape: This is just to give you a taste of what is possible with P5, the possibilites are really endless. ### Styling Functions Now, what if we want to change the color of these shapes? What if we want to draw them without a black outline? We can do this as well by making use of some of the styling functions that p5 also provides. For instance, we can change the color of a shape by using the fill() function: To color a shape in p5 we simply call the fill() function before drawing this shape, then P5 will automatically know that the color we passed to the fill() function should be applied to that shape. Color? What color? We just passed some numbers to the fill() function. In P5, and in code in general, colors have number representations specfying the RGB components of that color. Just like mixing primary hues on a palette to obtain new colors, the computer does the same by mixing specific amounts of Red, Green, and Blue. The numbers that represent the RGB components specify how much of each color is present in the final mix, so for instances if we want to get a pure Red color, we would pass `255, 0, 0` to the fill function. In the context of RGB values the number `255` is the maximal amount. `0` on the other hand specifies the absence of that color. P5 also supports other colorModes like HSB, and alternatively we can also pass hex color codes as strings to the coloring functions. How to work with colors in P5 is also a topic that we could talk about extensively. Besides the fill function that changes the entire color of a shape, we can also change the color and thickness of the shape's outline using the `stroke()` and `strokeWeight()` functions respectively: Now something strange happened here. We only specified that we wanted a thicker stroke weight of 5 before the second shape that we drew to the canvas. Why did the first shape also get a thicker outline? This is because the draw() function is actually looping, even though there is no animation. Calling strokeWeight() at the very bottom of the draw function would have the same effect and apply a thicker stroke to both shapes. ## The Canvas Rendering Context Under the hood P5 uses the Javascript canvas rendering context, and in a way acts as a wrapper around the drawing functions that the rendering context provides - making them much easier to use. The canvas element was introduced by Apple in 2004 with HTML5, and essentially represents a bitmap onto which we can draw with various funtions. In essence, when we call the `createCanvas()` in p5js, it creates an html `` element and attaches it to the document - the webpage that we're working on. Then it fetches the rendering context and makes use of it whenever we call any of the P5 functions. In this sense, we can technically do everything that P5 does without using P5, simply by using the rendering context... why would we use P5 then? Well, because it makes a lot of things easier, for example drawing a line in P5js can be done with a single line of code: ```javascript line(x1,y1,x2,y2) ``` In comparison to the rendering context where it takes quite a bit more code: ```javascript ctx.beginPath(); // Start a new path ctx.moveTo(30, 50); // Move the pen to (30, 50) ctx.lineTo(150, 100); // Draw a line to (150, 100) ctx.stroke(); // Render the path ``` P5 adds a layer of abstraction on top of the rendering context methods that makes them much easier to use. Some features that exist in the rendering context are not part of P5 yet, but luckily we can mix and match and get access to these features by invoking the rendering context. This is a bit advanced if it's your first time working with P5, hence you don't need to really worry about this for now. ## Your Next Steps There's a large body of resources, and many content creators out there that'll teach you creative coding with P5, some of these creators and resources are: 1. [The Coding Train](https://thecodingtrain.com/?ref=gorillasun.de) by Daniel Schiffman and his book [The Nature of Code](https://natureofcode.com/?ref=gorillasun.de) 2. [Raphael de Coruville's Birbsnest and his weekly creative coding challenge](https://twitter.com/sableRaph?ref=gorillasun.de) \- one of the best ways to improve in a fun way all while getting a free code review. Also check out [that creative code page](https://thatcreativecode.page/c5550ef2f7574126bdc77b09ed76651b?ref=gorillasun.de) which lists some of the popular creative coding techniques and cool algorithms that can be used for creative coding. 3. [Stevesmakerspace Youtube Channel](https://www.youtube.com/watch?v=PHySrgK7sj0&ref=gorillasun.de) that mainly revolves around making cool things with P5. 4. This awesome thread by [Adam](https://twitter.com/generativelight?ref=gorillasun.de): > YOU are going to make a piece of generative art right now in 10 minutes. > > No watching tutorials, no downloading software. Just your browser and 21 lines of code. > > By the end you’ll have a basic, but fun abstract generative art collection like this. [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/JmZ5IMagly](https://t.co/JmZ5IMagly?ref=gorillasun.de) > > — Adam genlight (@generativelight) [April 28, 2022](https://twitter.com/generativelight/status/1519759169045381127?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And there's many many more - shoot me a message if you've found a cool resource and I'll add it here! Make sure to also check out some of the posts on this blog, there's quite a few tutorials on here at this point! [Tutorial - Gorilla SunLearn Creative Coding and Generative Art. Each tutorial discusses a particular algorithm or programming technique for the purpose of creating interesting visuals.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla Sun![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/examp.jpeg)](https://www.gorillasun.de/tag/tutorial/) And that's about it! I hope you enjoyed this post and it was helpful to get you started on your creative coding journey. Let me know if it did and shoot me a DM with your first creation over on [Twitter](https://twitter.com/gorillasu?ref=gorillasun.de). **Cheers, and happy sketching \~ Gorilla Sun 🌸** ### Gorilla Recap 4 URL: https://www.gorillasun.de/blog/gorilla-recap-4/ Last updated: 2023-12-19T23:12:22.000Z **Hey everyone 👋 and hello to all new subscribers that joined since last week! Thanks for signing up and joining along for the ride! This is the weekly newsletter, in which I recap everything noteworthy from the past week. Hope you have a good stay!** This week a post by Bjørn Staal made the rounds on Twitter: > One thing I miss from the [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) scene pre-NFT's was how much more knowledge, techniques and code was shared. Since there was nothing to gain (financially) people had less to loose. I think we can choose to keep this very valuable part of the culture alive for the benefit of all > > — 𝕭𝖏ø𝖗𝖓 𝕾𝖙𝖆𝖆𝖑 (@\_nonfigurativ\_) [May 12, 2023](https://twitter.com/%5Fnonfigurativ%5F/status/1656953190762389507?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) To some extent I can sympathize with Bjørn's argument, it does *feel* like there's less educative material going around. This is just a *sentiment* however - plenty of coders are still creating and sharing resources on a regular basis. There's just been so many new things over the past 2 years, that the educative type of material has been drowned out by the noise. NFTs did have a profound and transformative effect on the generative art scene. On the one hand, it made monetization easier than ever, encouraging coders to hanker down, work on their projects and focus more on the producing new works. On the flip-side, it did impact the open source culture in a negative way, where bad actors would simply rip sketches from OpenProcessing or the online P5 editor, and mint them for a quick buck. The space has matured quite a bit however; it's become much more difficult to sell a random piece if there's no cred it. The community also quickly chimed in, providing many counterexamples to the claim and explanations why this sentiment might have grown stronger recently: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-85.png) Piter sums it up pretty accurately: it's that the scene got **much** larger, maybe that's why there's a perceivable dip in the *educative resources to people in the space ratio*. I think it's on the upswing again though - been seeing a lot more educative material again lately. And speaking of resources, I gotchu covered 👇 ## Gorilla Articles ### Recreating Vera Molnar's Homage to Paul Klee After diving deep into [the life of Vera Molnar](https://www.gorillasun.de/blog/the-art-of-vera-molnar/) two weeks ago I couldn't resist trying to recreate one of her iconic works, her Homage to Paul Klee. While researching the piece I cam across a recode by Golan Levin that takes an interesting approach to the piece: [Recreating Vera Molnár’s Homage to Paul KleeIn this tutorial we’ll recreate Vera Molnar’s homage to Paul Klee. We learn how to draw patches of slanted lines to the canvas, a strategy for enumerating all possible combinations, and at the same time have a look at a recode from Golan Levin.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/recc.png)](https://www.gorillasun.de/blog/vera-molnar-homage-to-paul-klee/) I also took a stab at recreating the analogue version of the sketch: > Recreating Vera Molnár's "À la Recherche de Paul Klee" with code ✒️ [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Recreation left - OG right [pic.twitter.com/uLSYfuKzUg](https://t.co/uLSYfuKzUg?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 11, 2023](https://twitter.com/gorillasu/status/1656607764515356672?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### A closer look at EditART During the weekend I published a feature piece about EditART, a young and independently run NFT platform on Tezos, that's been taking off over the past couple of weeks. I believe that it's important to spread the word about these platforms as they encourage a more diverse eco-system. We also asked it's creator Piero a couple of questions: [All Eyes on EditART - Interview with PieroIn this post we have a look at EditART, a hip new platform on the Tezos blockchain that revolves around customisable generate NFTs. We also ask it’s creator, Piero, a couple of questions to wrap it up.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-38.jpg)](https://www.gorillasun.de/blog/editart-marketplace-interview-piero/) ## Gorilla Sketches I resumed work on this sketch of mine, refactored the code a little bit and added some details - it should soon be ready for FxHash: > Look at these cuties! ✨ [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/OgIFtG1V0g](https://t.co/OgIFtG1V0g?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 9, 2023](https://twitter.com/gorillasu/status/1656003650408308737?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Interesting Reads ### Generative Art Is Stupid This article by Ian Bogost caught my eye, in it he discusses the difference between generative systems and the new wave of *everything generators*, and why there's still a lot of merit to creating systems for specific purposes: > When you type something into ChatGPT or DALL-E 2, it’s like throwing a coin into a wishing well and pulling the bucket back up to find a pile of kelp, or a puppy, in its place. [Generative Art Is StupidAnd that’s how it should be.![](https://cdn.theatlantic.com/_next/static/images/apple-touch-icon-152x152-aafde20dd981a38fcd549b29b2b3b785.png)The AtlanticIan Bogost![](https://cdn.theatlantic.com/thumbor/u-HoVVM0M_SOrk-qkE4SETawaj0=/0x102:4792x2598/1200x625/media/img/mt/2023/01/Generative_AI_01/original.jpg)](https://www.theatlantic.com/technology/archive/2023/01/machine-learning-ai-art-creativity-emptiness/672717/?ref=gorillasun.de) ### Artists enable AI art - shouldn't they be compensated? The Gradient is one of my favorite sites for thought provoking articles on AI topics. In this post Devansh Lnu goes into the nitty gritty of how large companies acquire datasets for their models, as well as the ethics behind the process: [Artists enable AI art - shouldn’t they be compensated?The debate around artist compensation in AI art, and some possible solutions to the problem![](https://thegradient.pub/content/images/size/w256h256/2018/02/icon.png)The GradientDevansh Lnu![](https://thegradient.pub/content/images/2023/02/pasted-image-0.png)](https://thegradient.pub/should-stability-ai-pay-artists/?ref=gorillasun.de) ### Generative Quiltmaking Anna Lucia has worked on a new generative piece that is based on the Gee's Bend quiltmakers practice: > Over the last year, I've had the incredible honor to dive deep into the rich history of the Gee's Bend quiltmakers and develop a generative system inspired by their work. > > This journey has resulted in GENERATIONS, which will finally go live next week [@arsnlart](https://twitter.com/arsnlart?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)🧵! [pic.twitter.com/2BT1iWA4zu](https://t.co/2BT1iWA4zu?ref=gorillasun.de) > > — Anna Lucia (@annaluciacodes) [May 9, 2023](https://twitter.com/annaluciacodes/status/1655855294193303554?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### All about them Convolutions An informative post by [kynd](https://twitter.com/kyndinfo?ref=gorillasun.de) on [convolutions and how they work](https://kyndinfo.notion.site/Convolution-ad2fd129ccfa4d358c9683a20e383ad5?ref=gorillasun.de): [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-40.png)](https://kyndinfo.notion.site/Convolution-ad2fd129ccfa4d358c9683a20e383ad5?ref=gorillasun.de) ## Tip of the Week Want to add GIF export to your Javascript or P5 sketches? Check out Matt DesLauriers' gifenc library: [GitHub - mattdesl/gifenc: fast GIF encodingfast GIF encoding. Contribute to mattdesl/gifenc development by creating an account on GitHub.![](https://github.com/fluidicon.png)GitHubmattdesl![](https://opengraph.githubassets.com/3f1e4fa82cf6fd8fefd26891ece1fd531e4d7d05816e803ac764dba92ca82a05/mattdesl/gifenc)](https://github.com/mattdesl/gifenc?ref=gorillasun.de) Alternatively you can use the new [saveGIF() function](https://p5js.org/reference/?ref=gorillasun.de#/p5/saveGif) that has been added to P5 not so long ago by [Jesús Rascón](https://twitter.com/jesi%5Frgb?ref=gorillasun.de) \- and uses gifenc under the hood! > Spent the day adding GIF export to the Tetron sketch. Tried a million things, but then came across [@mattdesl](https://twitter.com/mattdesl?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) gifenc library - worked like a charm! ✨ > > The attached gif is created and exported in the browser - no exporting frames and no ffmpeg! [pic.twitter.com/G5iLA7joNi](https://t.co/G5iLA7joNi?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 10, 2023](https://twitter.com/gorillasu/status/1656371660679704594?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Music for Coding And the YouTube recommendation algo keeps delivering with awesome music, this week I particularly enjoyed the album ***Tomorrow is nearly yesterday and everyday is stupid*** by Crywank - and I genuinely can't decide what I like more, the title or the cover artwork: **And that's it again for this week's recap! See you next week \~ Gorilla Sun** ### All Eyes on EditART - Interview with Piero URL: https://www.gorillasun.de/blog/editart-marketplace-interview-piero/ Last updated: 2023-05-13T14:54:57.000Z **All the cool kids are on [EditART](https://www.editart.xyz/?ref=gorillasun.de) right now. The new and budding NFT marketplace made a bit of splash in the gen-art space over the past couple of weeks. Let's have a look at what EditART is all about, with some words from it's creator [Piero](https://twitter.com/pifragile?ref=gorillasun.de) at the end!** Even though the platform released in September of 2022, recently we've seen quite a bit of newfound interest, with some of the major players in the genart NFT space flocking to release their tokens on the platform. Such as [Aleksandra Jovanic](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de), [Loackme](https://twitter.com/loackme%5F?ref=gorillasun.de) and [Juhani Halkomaki](https://twitter.com/JuhaniHalkomaki?ref=gorillasun.de), among others. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/daemons121449.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/ruudukko-2328x2328.jpg) [Daemons](https://www.editart.xyz/series/KT1C3oxpzeAVRRBLQC8ssj4pftVY9rYc7uE8?ref=gorillasun.de) by Aleksandra Jovanic and [Ruuduko](https://www.editart.xyz/series/KT1CFtfZPPDrtvN9aSH18NEGQX3iqMMDq7YT?ref=gorillasun.de) by Juhani Halkomaki ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/QmWLMmcTeEoftkNwqmNnuAFKCLLhiJE6ygP4UjimrTio9q.png) [Shadows](https://www.editart.xyz/series/KT1BNAXdkkbjifrjTCM1LUbUvkG1r5AnDT1T?ref=gorillasun.de) by Loackme The best way to describe editART is as an aesthetically minimal, indie alternative to FxParams. Similarly to the latter, it's a generative art NFT marketplace, where the minter can customize and tweak the generative artwork before committing to a particular iteration. Let's see how EditART puts a new spin on the customizable gen art NFT genre 👇 ## What's special about EditART? EditART is very straight-forward. The minting interface consists of *exactly* 5 sliders. No more, no less. Oh, and did I mention that they're unlabeled? It's up to the artist if they want to include an explanation for what each slider does, alternatively they can leave it up to the collector to figure it out for themselves by simple trial and error. I believe that the esoteric nature of these sliders, in combination with the minimal interface adds to the excitement of creating a your personal custom iteration. First you get to play, and then you get something to take home with you. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-39.png) It doesn't get much more minimal than this, does it? I've recently had the feeling, that FxHash is getting a little bit too complicated. Especially when it comes to selecting the parameters for an FxParams piece. Originally, collecting was as easy as clicking a button; with parametrized pieces the minting process now requires a time investment where one needs to figure out the parameters and then configure them. I feel that it takes away from the surprising nature of the original minting experience a little bit - but maybe that's just me. This also brings up new considerations for the artists, where they need to decide which variables should be revealed to the world as tweakable parameters, and which should remain hidden within the code. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-36.png) FxParams minting interface. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-37.png) EditART minting interface. On EditART this is simplified by a layer of abstraction. As the collector you get to play a little with the sliders, visually getting a feel for what they do, without seeing the numbers that they modify. It's just a little bit less visually taxing. Moreover, the collector transcends the simple role of someone who clicks the mint button, and becomes a co-creator of the minted iteration. This is an inherent feature on the platform, where each iteration indicates it's original co-creator. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-35.png) Co-Creators eternalize themself as part of the iteration. Being the OG minter on EditART is also associated with 5% of royalties from secondary sales. This is also possible on FxParams, but on EditART it feels like there's a bit more emphasis on this aspect of the minting process. Overall, EditART's existence is beneficial to the current Tezos NFT scene. Having different, and nuanced platforms is important - it puts things into perspective, and encourages a varied eco-system of platforms. At the same time, it gives artists more tools to work with, and collectors more options to choose from. ## Interview with Piero [Piero](https://twitter.com/pifragile?ref=gorillasun.de), aka pifragile on Twitter and creator of EditART, is a super down to earth guy. When I created my token [Blöck](https://www.gorillasun.de/blog/making-of-block/) for the marketplace he made the minting process a super enjoyable experience. I shot him a couple of questions afterwards in preparation for this article: > **Tell us a little bit about yourself. How did you get into Generative Art?** My name is Piero, I started coding when I was 12, then kinda lost interest in my teenager years, but soon found back in my 20s when i decided to start studying computer science. I have been interested in crypto since 2017. My way into generative art I found in early 2021 when I heard about NFTs and I started hacking together some GIFs in Python. Soon I realised how satisfying creative coding was because it adds a whole new layer to the otherwise sometimes quite dry coding world. I had finally found a way to express myself visually that I had never known before. > **I scrolled down on your timeline, you started working on EditART in September 2022 - what were your initial inspirations? Was Crayon Codes an inspiration?** The launch of EditArt was in September 2022, but the work started early 2022\. I realised that the bear market could be an opportunity to learn how to code Tezos smart contracts and so I just started and never stopped :) Of course I wanted to have a meaningful project and after some iterations I came up with the idea of customizable generative art. The only thing like this that I had seen before was [ETH Block Art](https://ethblock.art/?ref=gorillasun.de). But I wanted to do it way simpler. Firstly because I like simplicity a lot and second because I wanted to build something that was feasible for one person to finish in a reasonable time. > **What were some of the challenges of smart contract programming? I've been wanting to learn that myself, but I never seem to find the time for it.** I would say the main challenge is that you have to work very precise and do really thorough testing as there will be money flowing through this contract and also there is no possibility to fix bugs once the contract is live. Other than that I found that SmartPy offers a really neat python interface which makes the development super fun. > **Did you know about FxParams at the time? FxParams was anounced mid November, do you think you had some influence there?** No, I had no idea about fx(params) when I launched EditArt. I cannot say if there was any influence, but the idea wasn't new or groundbreaking, so probably fx(hash) just had the same idea at the same time. > **How is EditART different from FxParams? Why specifically 5 sliders?** > fx(params) vs [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Now that fx(params) is live, I want to share my thoughts on what differentiates the two platforms. > > TL;DR > fx(params) is flexible and complex, while EditArt is simple and intuitive. > > A thread. > > — Piero (pifragile) (@pifragile) [March 22, 2023](https://twitter.com/pifragile/status/1638497009605791744?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Piero's thoughts on the differences between FxParams and EditART The tweet says it all :) What I can add is that EditArt is WYSIWYG. Also I tried to make the reloading after a slider change as smooth as possible. > **EditART reminds me a lot of early HEN, in a way the interface feels familiar. Is there also some connection there?** HEN was certainly an inspiration. Generally I love everything that reminds me of the excitement I felt when I first started exploring the internet in the early 2000s and I definitely got that feeling with HEN. > **What's in store for EditART? What are your plans for the platform?** The experiences that I make while building such a platform as a one-man-show are invaluable and I definitely want to keep going and learning. At the moment EditArt is not making any profit, so I still have to work for clients to pay my bills. Of course my dream would be that EditArt will pay my bills some day. This will take some time, so the plan is to build a solid platform, build trust in the community and be in the right spot when the next bull run hits 😉 > **I saw that you're also working with Andre Fuchs on a new platform, how is that going? Are there any details you can share at this point?** At this point I can't say too much. We were very happy about the interest in the new platform by the community and are currently looking for funding. For me personally, having heard many stories of founders with burnout, I have to make sure that it will not be too much, now that EditArt is taking up quite some of my time. I still want to be doing this in 10 years ☺️ > **Thanks for the answers Piero!** ***Want to release you own token on EditART? [Shoot Piero a message on Twitter](https://twitter.com/pifragile?ref=gorillasun.de)!*** ## Blockchain Tech enables Independent Devs Recently I came across a tweet by Galo who is putting together his own little tezos powered print shop: > more print shop progress... [pic.twitter.com/49C2qRVh0Z](https://t.co/49C2qRVh0Z?ref=gorillasun.de) > > — itsgalo 🗯 (@GaloAndStuff) [May 11, 2023](https://twitter.com/GaloAndStuff/status/1656759458414882828?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Galo's own little tezos powered print shop I believe that we've forgotten a little bit how amazing this tech is. Especially when it comes to the Tezos blockchain, the barrier to entry is quite low: it boils down to taking the time and learning [how to program smart contracts](https://wiki.tezosagora.org/learn/smartcontracts?ref=gorillasun.de). This alternative system to traditional payment processing enables many new ideas, new marketplaces and nuanced interactive blockchain experiences that go beyond the simple concept of effectuating a purchase in an online store. Amongst all the ugly parts of web3, the scams, the meme coins, the crypto bros, the FOMO and the WAGMI, we should place initiatives that try to reimagine the web as we know it, on a pedestal and celebrate them. Just like Piero's initiative. Kudos! Looking at the past, OG HEN started out as the idea of a single developer. It's inception has arguably been the most transformative event that has happened to the Tezos blockchain, giving rise to a massive community that is still going strong till today. Along comes FxHash and joins the arena as a new player. Again the idea of a single dev evolves into one of the largest marketplaces on the entire blockchain: > I have been working on an open platform to mint Generative Tokens on the [@Tezos](https://twitter.com/tezos?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) blockchain. > > I will release the beta this week. > > Follow this account if interested -> [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/vlu8Yp7t37](https://t.co/vlu8Yp7t37?ref=gorillasun.de) > > — ciphrd (@ciphrd) [October 24, 2021](https://twitter.com/ciphrd/status/1452217584028430345?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The beginning of FxHash Then we also saw some smaller, more specific platforms like 8bidou and typed.art, that also made some ripples in their own way. All of this is to say, that if you have an idea you should try to realize and see what comes of it. I've got a few ideas myself, the only thing standing in my way now, is to actually get my hands dirty and learn how to write them smart contracts. ## Closing Thoughts In this post we've had a closer look at EditART, talked about it in the context of blockchain tech and made a few comparisons to the closely related FxParams. We also had a few words with it's creator Piero about how he found his way to take the leap and put together the platform. You know what to do - go check out EditART, and maybe grab a piece or two while you're there! I'll also have a new piece up there very soon, here's a little teaser: > Blöckbuster [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Always fascinates me how ideas evolve over time! ✨⬆️ [pic.twitter.com/7WjLJakBJr](https://t.co/7WjLJakBJr?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 5, 2023](https://twitter.com/gorillasu/status/1654438240919736320?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Hope you enjoyed! If you did consider signing up to the newsletter to receive updates about new content when it gets released - just hit the bottom in the lower right corner of the window! 👉👇📬 **Cheers, and happy sketching \~ Gorilla Sun** ### Recreating Vera Molnár's Homage to Paul Klee URL: https://www.gorillasun.de/blog/vera-molnar-homage-to-paul-klee/ Last updated: 2023-05-17T13:25:20.000Z **In this recode tutorial we'll recreate Vera Molnar's piece "À la recherche de Paul Klee" from 1970\. For these recodes, there's no exact recount of how the original code was implemented, we can only rely on observation of the piece to deduce what could have been.** ## Looking for Paul Klee While diving into Vera Molnar's life as one the pioneers of generative art, one of her artworks that struck me as particularly interesting was her homage to Paul Klee from 1970, titled **À la recherche de Paul Klee**. After recreating Frieder Nake's homage to Paul Klee last year, it only made sense to also have a go at this one. > A little [#RecodeRethink](https://twitter.com/hashtag/RecodeRethink?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) étude! Homage to Frieder Nake's 'Homage to Paul Klee'! > > I think I got pretty close 🤔 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Original on the left 👈 and recreation on the right 👉 [pic.twitter.com/l6gA4YfEJ7](https://t.co/l6gA4YfEJ7?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [November 9, 2022](https://twitter.com/gorillasu/status/1590371621344538624?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) What's intriguing about this piece is that Vera did several versions of it. An initial analogue, hand-drawn one, following her machine imaginaire methodology, and another digital version later on, using computers at the beginning of the 1970s. Each one of them is charming in it's own way. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/vera-molnar-paul-klee-pen-2000x1333.jpg) Vera Molnár. A la Recherche de Paul Klee (Searching for Paul Klee) (detail). 1971\. Felt tip pen on paper. The Anne and Michael Spalter Digital Art Collection. © 2017 Vera Molnár. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/vera-molnar-paul-klee-plotter1-2000x1333.jpg) Vera Molnár. A la Recherche de Paul Klee (Searching for Paul Klee) (detail). 1970\. Ink on paper, plotter drawing. The Anne and Michael Spalter Digital Art Collection. © 2017 Vera Molnár ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/110314_restliche-3mm-LR-30000-dpi-Gain-100-00-ms-0-00-cm-1-3-e1622201991216-2000x1768.jpeg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Molnar-Klee-2000x1996-1.webp) Full versions. There also exists a color version, but I'm not certain if it was created during the same period of time or later on: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/51234154141_8ccaaf9d40_4k.jpg) À la recherche de Paul Klee (197?) Color Version It is incredibly vexing that there isn't much information about each one of these artworks, and in what order they were made. Hachures and line patterns are still a very prominent thematic in generative art today: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/FuuSvexWcAM7k1-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Fvs1JbOWAAQNwNf.jpg) Ruuduko by [Juhani Halkomaki](https://twitter.com/JuhaniHalkomaki?ref=gorillasun.de) \- Oddity by [Julien Gachadoat](https://twitter.com/v3ga?ref=gorillasun.de) Maybe it's due to the fact that lines are one of the basic shapes, that every graphics drawing library is capable of producing. But that also makes me wonder if generative art today would be different today if it hadn't been for these pioneering ideas in the 60s. ## Canvas and the Grid As always, let's first set up the canvas in our p5 project: ```javascript const WID = 1000; const HEI = 1000; const PAD = 100; let buff; function setup(){ createCanvas(WID, HEI) buff = createGraphics(WID, HEI) // the rendering context, we'll need it in just a bit bctx = buff.canvas.getContext('2d') buff.background(255) buff.stroke(0) } ``` Here we're using a graphics buffer, this makes things a little bit more organized. As for the grid, my favorite method for creating them, is one where the loops are dimension agnostic. This means that we declare the number of horizontal and vertical grid cells as hyper-parameters, then compute the width and height of the grid cells based off of the overall width and height of the canvas (plus/minus padding if any). The nested loop itself has nothing to do with the dimension of the grid or the canvas, and simply iterates over the number of rows and columns. Positioning of the cells becomes a separate calculation: ```javascript // Number of horizontal and vertical grid cells const GRID_X = 10 const GRID_Y = 10 // Since the number of cells match up with the dimensions of the canvas // We get cells that have equal width and height const GRID_X_SPC = (WID-PAD*2)/GRID_X const GRID_Y_SPC = (HEI-PAD*2)/GRID_Y function drawGrid(b){ b.push() // The loops have no information about the size of the cells // Simply how many cells there are for(let x = 0; x < GRID_X; x++){ for(let y = 0; y < GRID_Y; y++){ b.push() // The correct position of the cells can be computed as follows b.translate( x * GRID_X_SPC + PAD, y * GRID_Y_SPC + PAD ) /* code that draws the patch goes here */ b.pop() } } } ``` Here we use p5's translate function to position the individual grid cells, as it'll make dealing with coordinates a little easier down the line. ## Golan Levin's Molnar Patches While researching this particular, piece I came across a [recode by Golan Levin](https://editor.p5js.org/golan/sketches/yBgIKsxj%5F?ref=gorillasun.de). If you don't know Golan, you gotta check out the OG. He has a really interesting strategy to recreate the artwork, which we'll examine in more detail over the next sections. Golan's method essentially splits the rectangular patches into two right angled triangles, and draws diagonal lines inside of these triangles. These diagonals connect the two sides that sit at the base of the right angle, and are parallel to the hypotenuse. To achieve this, he utilizes the map() function that already comes out of the box with p5js. His magical function: ```javascript function molnarRect(b, x, y, w, h) { var x1 = x; var x2 = x + w; var nDiagonals = round(10 * pow(random(0, 1), 0.85)); for (var i = 1; i <= nDiagonals; i++) { var px = map(i, 0, nDiagonals, x1, x2); var py = y + h; var qx = x1; var qy = map(i, 0, nDiagonals, y + h, y); b.line(px, py, qx, qy); } for (var i = 1; i <= nDiagonals; i++) { var px = map(i, 0, nDiagonals, x2, x1); var py = y; var qx = x2; var qy = map(i, 0, nDiagonals, y, y + h); b.line(px, py, qx, qy); } } ``` Golan Levin's line drawing function from the recode sketch. The first magic line in here, is the one that determines the number of lines to be drawn. Before multiplying and rounding the randomly generated number, he raises this random number by a specific coefficient. He probably found that a value of .85 hits the sweet spot and produces balanced patterns that come close to Vera Molnar's original artwork. ```javascript var nDiagonals = round(10 * pow(random(0, 1), 0.85)); ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/0.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/5.png) Coefficients of 0, 1, and 5 respectively for the randomly generated number. This number is then used inside the loop condition to determine how many lines need to be drawn: ```javascript for (var i = 1; i <= nDiagonals; i++) { var px = map(i, 0, nDiagonals, x1, x2); var py = y + h; var qx = x1; var qy = map(i, 0, nDiagonals, y + h, y); b.line(px, py, qx, qy); } ``` The map() function in p5, as it's name suggest, maps from one range to another. And in that manner we can position the lines across the width and the height of the rectangle in an even manner, such that they are parallel to the diagonal of the rectangle. Here x1 and x2 are the corrdinates of the left and right side of the rectangle, respectively. To prevent a monotonous pattern that only flows in one direction we also flip the coordinates of the sides at random: ```javascript if (random(1.0) < 0.5) { x1 = x + w; x2 = x; } ``` It's easier to understand this by looking at an example. In isolation, and only for one of the two triangles the function would produce the following patterns: Applying this to an entire grid of rectangular patches we would see the following patterns: What's cool about this function is that: 1. It works for arbitrarily sized rectangles. We'll mainly be dealing with rectangles that only take up half the size of a single patch. 2. The diagonals at the very edge of the two triangles line up and overlap, producing a thicker and more pronounced main diagonal. Which is also something that occurs in Molnar's original artwork. We still need to figure out the actual logic to generate the different patches that make up the final artwork, but the main piece of the puzzle has already been set. ## Patch Logic Essentially, Golan identified that there's 4 different types of patches: 1. A patch that is split vertically into a left and right half. 2. A patch that is split horizontally into a top and bottom half. 3. A patch that has an L shape with two overlapping rectangles. 4. A patch with one rectanglular shape and a triangular shape. In this manner, each patch consists of two *halves*. There's also random chance that one of these two halves isn't drawn, this has the effect that the grid ends up being spacious. The code for this can quickly get quite beefy, as there's many branches. To decide which type of patch we want to draw we can make use of a random variable: ```javascript var patternRand = random(0, 1); if (patternRand < 0.25) { // draw patch type 1 } else if (patternRand < 0.5) { // draw patch type 2 } else if (patternRand < 0.75) { // draw patch type 3 } else { // draw patch type 4 } ``` Inside each one of these conditional branches we then need to account for the different variations of this particular patch type. For instance in the case where the patch is split horizontally, Golan uses the following code: ```javascript var cellRand = random(0, 1); if (cellRand < 0.45) { molnarRect(xL, yT, cellW2, cellW); // L only } else if (cellRand < 0.9) { molnarRect(xC, yT, cellW2, cellW); // R only } else if (cellRand < 0.99999) { molnarRect(xC, yT, cellW2, cellW); // Both molnarRect(xL, yT, cellW2, cellW); } else if (cellRand < 1.0) { // Neither } ``` Which essentially lists out the four potential outcomes, with a very low chance for the last two options where both or neither rectangles are drawn. Putting it all together we get: ## Closing Thoughts I also recreated the analogue version of the artwork, which turned out nicely in it's own way, but doesn't come very close to the original: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/red.jpg) Recreation of the Analogue Version I initially wanted to write about this version but there's quite a few things here that will require their own explanations - and they're already in the works! Anyway, I hope you enjoyed! And if you did consider sharing this post with friends or on social media, alternatively you can check out some of my other posts! ### Gorilla Recap 3 URL: https://www.gorillasun.de/blog/gorilla-recap-3/ Last updated: 2023-12-19T23:12:29.000Z **Hey everyone 👋 there's been quite a few new subscribers to the newsletter! Thanks for signing up and joining along for the ride! This newsletter goes out every Monday, and sums up everything Gorilla that's happened in the past week.** --- It seems that just like a work of art, a website is never really finished. > Another little visual update! ⬆️📅 Custom little blockquote! > > I had the feeling that the text was getting a bit too cluttered with all the quotes, adding a little bit of separation like this makes it look a lot tidier. [pic.twitter.com/GybO3znepG](https://t.co/GybO3znepG?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 3, 2023](https://twitter.com/gorillasu/status/1653703572092010496?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) One of the posts from last week had quite a few quotes from other sources, which I included as screenshots. Visually that didn't really work well, hence I made this custom block-quote to make things a little bit more readable. Readability has been my main concern with all of the changes in the past weeks; I want to make it as easy as possible for folks to digest the stuff that is post on the blog. Although there's some style guidelines that blogs should generally follow, they're not necessary applicable in every context. For instance, you should use a font-size of 20px, larger fonts are easier to read. You should use serif fonts, because they're marginally easier to read as well. Line width shouldn't exceed 600px, or the text becomes hard to read. But now the text is so large and clunky that the user has to scroll every couple of lines, which is kind of bad when you're trying to explain something technical that requires a least a few sentences to be explained. I feel like I've arrived at a balanced layout at this point. What do you think? Let me know if there's anything that could make the posts easier on the eyes. ## Gorilla Articles We got 3 posts in total this week! As promised in last weeks newsletter, I published a post on Vera Molnar, with a specific focus on her earlier life and the events leading up to her working with computers for the first time. I learned a lot while researching, and had a lot of fun doing so feeling immensely inspired afterwards. [The Art of Vera Molnar 1947-1974Vera Molnar is one of the pioneers of what we know today as Generative Art. She was one of the firsts to dare and use computers for the purpose of making art. In this article we have a look at her rich artistic career and how she paved the way for the computer artists of today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Galerie-La-Ligne-Vera-Molnar-2000x1415.jpg)](https://www.gorillasun.de/blog/the-art-of-vera-molnar/) For the Tech-Thursday post (let's call it Tech-Thursday shall we?), we have a look at how to build a little Linktree-like page where you can showcase all of your social media links: [Goodbye Linktree - Building a Beautiful Linktree Clone from ScratchIn this post we’ll learn how to build our own personal Linktree clone. Throughout, we’ll have a look at the CSS flexbox and how it can be used to create responsive designs. A complete example is included at the end.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-32.png)](https://www.gorillasun.de/blog/building-a-linktree-clone/) As for Sunday, we have a little bit more of a philosophical piece on why Sketching with Code is a fundmanetally important practice! I've recently gotten into a better headspace, fixed my sleeping schedule (sorta) and been able to put more thought into my sketches. I haven't spent much more time on sketching per se, but I've been trying to go to make the sessions really count when I do. Which made me think of all the facets there are to sketching, and why it's an wrothwhile endeavour to pursue: [The Importance of Sketching with CodeSketches are more than just little artworks that you hack together in your bedroom. They’re ongoing conversations that you have with the yourself and the machine. It’s important to explore them, gain new perspectives and ultimately contribute to something larger than yourself.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/banner.jpg)](https://www.gorillasun.de/blog/the-importance-of-sketching-with-code/) ## Gorilla Sketches Initially, [Blöck](https://www.gorillasun.de/blog/making-of-block/) was actually supposed to be an animated piece. But I was under a bit of a time crunch, and wasn't able to figure it out. Blöck turned out fantastic however and I'm happy about that. For the animation, I wanted the grid to expand and contract in a sort of organic manner. I tried a couple of things and found a method that I like, which actually doesn't need that many lines of code. > Blöckbuster [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Always fascinates me how ideas evolve over time! ✨⬆️ [pic.twitter.com/7WjLJakBJr](https://t.co/7WjLJakBJr?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 5, 2023](https://twitter.com/gorillasu/status/1654438240919736320?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also spent a considerable amount of time last week on pinterest, searching for inspiration and patterns. I came across this beautiul quilt by Bauhaus textile artist Gunta Stötzl: ![A colorful quilt by Bauhaus textile artist Gunta Stötzl](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/072389cd10290a29ba63ebcbbabdc3d6.jpg) Art quilt by Gunta Stötzl I love it! The colors, the patterns, the composition. Everything about it just works for me. Now I need to know how this could be recreated a generative manner. Evidently, it's a grid, but how do we choose the color for each patch? When you create a physical quilt you probably start from one of the top corners and work your way downwards, and you make color selections based on previous colors. Some colors become more likely to be chosen others become less likely. Can I emulate this with weighted random probabilities that determine which colors get select? Here's my experiment from yesterday: > Had an idea that plays with weighted random probabilities, and the emerging patterns are actually really cool! [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 🎨 [pic.twitter.com/Fi1ZD1bSK1](https://t.co/Fi1ZD1bSK1?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 7, 2023](https://twitter.com/gorillasu/status/1655263181025968129?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) It's nowehere near Gunta Stötzl's quilt, but I feel like I'm getting somewhere. ## Interesting Reads ### ### Twitter per post Micropayments More news about Elon and his plans for Twitter. One of his ideas is a *per article micropayments*, basically paywalled content where people have the option to purchase single posts for a fee, instead of having to subscribe. The article debunks why this isn't a good idea and why it doesn't work. [Micropayments. Elon Musk thinks he’s got a “major win-win” for news publishers with…micropayments.After all, who would news companies rather trust their revenue to than the guy who calls them a “relentless hatestream”?![](https://www.niemanlab.org/favicon.ico)Nieman LabJoshua Benton![](https://www.niemanlab.org/images/jbenton_micropayments_dollar_bills_cut_into_pieces_coins_cut_in_b48ef610-c875-40aa-8714-35353b68b61e-700x382.jpg)](https://www.niemanlab.org/2023/05/micropayments-elon-musk-thinks-hes-got-a-major-win-win-for-news-publishers-with-micropayments/?ref=gorillasun.de) > Rolling out next month, this platform will allow media publishers to charge users on a per article basis with one click. > > This enables users who would not sign up for a monthly subscription to pay a higher per article price for when they want to read an occasional article.… > > — Elon Musk (@elonmusk) [April 29, 2023](https://twitter.com/elonmusk/status/1652349875017879552?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Running a successful Newsletter Since starting this newsletter last month, I've been actively looking into other newsletters, just to see what they're doing. I came across Substack's **Grow** series, where they showcase some of the succesful writers on the platform and what they did to get to that point. Rob Henderson states that consistency and sticking to a schedule is one of the most important things: [Grow: How academic Rob Henderson spun a side hustle into a primary income by sharing his ideasRob Henderson is a faculty fellow at University of Austin who says Substack is a primary source of income and a testing ground for ideas and his forthcoming book![](https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F31585c04-97f0-42e1-84f0-a9b064b71d0b%2Fapple-touch-icon-1024x1024.png)On SubstackOn Substack![](https://substackcdn.com/image/fetch/w_1200,h_600,c_limit,f_jpg,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8e2994f-bc0b-4925-a85a-3ad6fa65d5f3_5824x4192.png)](https://on.substack.com/p/grow-series-28-rob-henderson) Three posts a week has been tricky but I'm slowly finding the groove of things, planning ahead is key! > Trying to stick to a release schedule with new posts every Thursday and Sunday + Newsletter on Mondays 😬 proving to be a bit tough but let's see how it goes! > > The plan is to write a technical post every Thursday, and something a bit more journalistic on Sundays 🤔 > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 27, 2023](https://twitter.com/gorillasu/status/1651581678601601026?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### The self-hating Web Developer In a post from 2015 Joe recounts his career as a web dev and his falling out with the craft, because it was deemed to be a lesser form of programming. Towards the end of the post he summarizes his advice in one sentence: ***Find something that you think is interesting and pursue it both passionately and unapologetically.*** [The self-hating Web Developer by JoeQuery](https://joequery.me/code/the-self-hating-web-developer/?ref=gorillasun.de) ## Tip of the Week This week I learned about the [Flesch reading ease test](https://en.wikipedia.org/wiki/Flesch%E2%80%93Kincaid%5Freadability%5Ftests?ref=gorillasun.de). It's a way to measure how readable English text is and is calculated with the following formula: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-33.png) The formula then produces a number that indicates how readable a certain text is: *higher numbers mean it's more readable, lower numbers are less readable*. There's [this online tool](https://www.experte.com/readability-checker?ref=gorillasun.de) with which you can crawl your blog and check how readable each one of your pages is: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-34.png) ## Music for Coding Discovered this one in the recommended section while listening to Hyakkei's Okurimono album from last week. [TOTORRO](https://totorro.bandcamp.com/album/come-to-mexico?ref=gorillasun.de) is an Mexican instrumental math rock band: And that's it for me this week! See you on Thursday! Cheers and happy sketching! ### The Importance of Sketching with Code URL: https://www.gorillasun.de/blog/the-importance-of-sketching-with-code/ Last updated: 2026-06-19T08:56:33.000Z **Creativity is a strange thing. It comes and goes in waves, and is heavily influenced by the circumstances in your life.** But what is creativity really? If we were to break it down to a fundamental component, then we'd end up with the unitary building block that is an idea. Ideas are the raw material with which new creative works are developed; just like building something with Lego blocks, new things emerge when you combine different ideas. And the modern world as we known it, is built on ideas. What are technological advances if not conceptions brought to life? When you write code and conjure visuals onto the canvas, you're essentially pulling something from the ether and giving it life. It's a beautiful thing really, you made something that didn't exist before. And now it does. It's probably one of the most satisfying aspects of this type of creative work. Moreover, you've made something that has purpose: you've asked a question and you've made an attempt at answering it. What I'm trying to say is that, sketching is a fundamentally important practice, just like making art in general. These little ideas that you hack together in your bedroom, on the train or during your lunch-break, they're not so different from the ideas that power the most important technologies of our time; it's worth exploring them, saving them and cherishing them in due time. ## Planting a Seed It always fascinates me how ideas evolve over time. Not just in short time-spans, but also over longer periods of time. No matter how trivial an idea that you have, you never know what it can potentially grow into in the future. When you make a sketch, you basically conjure up a new concept, but at the same time, you're also planting a seed that might carry fruit at some point in the future, be that in the near future or many years down the line. Zach Lieberman talks about this notion in an [interview with \_creativelives](https://www.instagram.com/p/CWYRqVrtTjt/?utm%5Fsource=ig%5Fweb%5Fcopy%5Flink). He brings up the importance of **having a sense of time**. Ideas don't just develop over the course of a single project but across the span of your entire body of work. While creating new work you'll discover the things that you enjoy, that you'll start reusing, making your own, and incorporate into your overall repertoire. At the same time though, you'll also discover things that you don't like, gradually excluding them from your kit. In a sense this all contributes towards you building an individual style, by addition and subtraction of elements, components, media, and most importantly ideas that you enjoy exploring. I recently had this experience, of an idea **coming to fruition**, while working on a sketch of mine. Maybe you remember, but around the same time last year I published a post called [An algorithm for Irregular Grids](https://www.gorillasun.de/blog/an-algorithm-for-irregular-grids/), where I discuss a strategy to create a variety of different irregular grids. The key idea then, was an underlying binary boolean grid, which I use to position a variety of rectangular shapes, that slowly fill out and consume the grid. This led to many interesting sketches that I'm really proud of: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/1mod.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/2mod.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/3mod.png) Different takes on my irregular grid code. I don't know why I didn't try it earlier, but recently I returned to my code and tried adapting it for more interesting shapes (they're still block-y), and it worked really well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/download--16-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/irreg5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/irreg4.png) Irregular block shapes on an irregular grid. Irregular Grids v2. However, *there was more!* *Just one step further!* *Just one step further and I unlocked a entirely new output space:* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/pattrns.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/quads.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/traversadis.png) Pushing the idea even further, we can get even more intricate shapes. Recently, I've enjoyed thinking about it this way: **Sketching is a practice where you're solving problems that you don't have yet.** ## Thinking in Systems A couple of months ago I was showing my mother outputs from a sketch asking her what she liked about it and what she didn't, just to get another set of eyes on my piece and get some help developing it further. At one point she asked: *Can you go back? I liked the previous one much more.* And I told her that I can't, that those were basically gone forever. She was incredibly sad about that. Now I try to keep track of the random seed in a more conscious manner. We often joke that creative coding lies at the intersection of art and technology. ![](https://s3.amazonaws.com/media-p.slid.es/uploads/2274085/images/10017294/Screenshot_2022-11-19_at_19.23.35.png) [Pixelfool on Twitter.](https://twitter.com/PixelfoolNFT?ref=gorillasun.de) But it really isn't wrong to describe it that way. I often discover new things that could be technically useful, when I initially set out to make something artsy with the goal to create a visually interesting composition. Patterns transcend art and technology; after all, everything is patterns. For instance, in case of the sketch that I showed earlier, I can very well see this generative algorithm be used as a dungeon generator of some sort: ![A maze like/dungeon like 2D structure. Digital art, computer generated.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/blank-1.png) Looks like a dungeon for an indie game, right? Albeit this isn't the pinnacle of technological use cases, I felt that I had found a parametric system that spans an interesting output space. In the advent of long-form generative art this has become more and more important - the ultimate goal ceases to be output curation - but rather, the entire output space and the system itself become the artwork. Approaching the sketching practice in a system oriented manner brings along an entirely new set of considerations and challenges. How differently do we think nowadays about the sketching practice? It's a very individual question, but for me personally, the idea always lurks at the back of my mind, telling me that what I'm currently working on could have the potential to become such a long-form system. It's not an entirely new way of thinking though. Even before the newfound web3 potential, artists thought about systems. That's why it's called **generative** art after all; every output is unique and different. I recently dug into [the past of Vera Molnar](https://www.gorillasun.de/blog/the-art-of-vera-molnar/), and she always began with a system from the get-go. And that even before she worked with computers for the first time. ## A Dialogue with the machine A sketch is an ongoing conversation that you're having with the computer. You input your thoughts, in form of code, and it answers with what it thinks this thought should evaluate to. Sometimes it's capable of seizing an accurate representation of your thoughts, other times bits of information are lost in translation, and the machine returns a flawed interpretation. One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist. Stephen Hawking There's interest in these flawed results though. These flaws are the essence that push the overall discourse ahead. It would be a boring dialogue if the machine knew exactly what you wanted right from the get-go. These flaws give reason for you to double down, and adjust your input such that the machine is nudged into the right direction - whatever this direction might be. Just like steering a very complicated vehicle. The catch here, is that you also don't have a crystal clear image of what you're looking for, hence the machine is assisting you in your endeavor of finding what it is that you're looking for. But it could also be just as likely that you don't know what your ultimate destination is. That you're just a passenger, sightseeing different places that you'd like to visit in the future. Sketching is finding, exploring and discussing with the machine, yourself and others when you share your ideas on the internet. It's important to play a role in this conversation, to express yourself, and leave a mark. ## Sketching is Happiness There's nothing that I enjoy more in life than having some music in my ears, punching in some lines of code into the editor, and see what the output window spits out. In an age where attention spans are increasingly shorter, coding is an incredibly effective antidote. It's something that actively engages my brain and often doesn't require much effort on my behalf to find my way into ***the zone***. In that state I'm in control, I have an empty canvas that I can paint whichever way I want. And if I do end up making mistakes, there's always the **ctrl+z** shortcut to go back in time. Actively engaging in the sketching practice has helped me understand myself better. My brain works in weird ways, I often don't know how I jump from one idea to another, but looking back at the different stages that a sketch went through always helps me bring in just a little bit of order into this distraught mess. Sketching with code is fun. I **strongly** recommend it. And that's it for this time. If you enjoyed this post consider signing up to the newsletter, and get notified whenever new content is released. Otherwise consider sharing this post on social media and letting Google know that this is good content. Cheers, and happy sketching! *Another post that you might like* 👇 [Creative Coding: The New EraCreative coding is a new interdisciplinary art form that bridges the gap between technologists and artists. This article explores what it means to be a code artist, what it means to make art with code, and how we approach this new discipline today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/newerabanner2.png)](https://www.gorillasun.de/blog/creative-coding-the-new-era/) ### Goodbye Linktree - Building a Beautiful Linktree Clone from Scratch URL: https://www.gorillasun.de/blog/building-a-linktree-clone/ Last updated: 2023-05-12T14:43:51.000Z **Everyone and their mom is using Linktree nowadays. I've used it for a long time myself, since it seemed like the trendy thing to do: having a list of links in your Twitter and Instagram bios to refer folks to the other platforms that you're active on.** What always bothered me about it though, was that further styling options were locked behind a paywall. To be frank, I never thought that it was worth the couple of bucks just to get a flashy list of links, so I never did. Although their analytics did show that I would get some clicks on occasion. Ultimately, you're left with a very bland list of links. I don't know why it took me so long to try and make my own, but I finally did! And it was easier than expected! CSS isn't really that complicated; you just need a handful of tricks to make this list happen and make it flashy. While we're at it we'll also make it responsive, and get it up and running for free via Github pages. Let's get started! Here's a video of what we'll make: > Goodbye linktree 👋 made my own! > > Would there be interest if I wrote about how to make a little list like this + hosting it on github pages? [pic.twitter.com/7nDIXc9gnC](https://t.co/7nDIXc9gnC?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 28, 2023](https://twitter.com/gorillasu/status/1651967732231880706?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Alternatively you can also check out the about page of this site to see the final product in action! The only requirement here is basic knowledge of HTML and CSS, the explanations I'll provide! You can basically regard this post as a mini CSS lesson. ## HTML and CSS Skeleton Let's get a really simple webpage going. The HTML code that we'll start with: ```html
This is some text to be displayed, it's information about you.
``` Not much to see here yet, except for a couple of nested divs in the body tag. We can go ahead and already assign class names to each one of them to indicate their function. We're essentially creating a flex box container that will hold the elements of our page. A flex box is a convenient CSS layout model that makes it easy to create responsive behaviour, as it will automtically handle how space is distributed among it's children elements. [Basic concepts of flexbox - CSS: Cascading Style Sheets | MDNThe Flexible Box Module, usually referred to as flexbox, was designed as a one-dimensional layout model, and as a method that could offer space distribution between items in an interface and powerful alignment capabilities. This article gives an outline of the main features of flexbox, which we will…![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS%5FFlexible%5FBox%5FLayout/Basic%5FConcepts%5Fof%5FFlexbox?ref=gorillasun.de) Inside this flex box, one of the divs will be an about section, where we'll present information about ourselves, and the other one will contain the actual list of links. We've preliminarily put some text into our divs to better see how these flex boxes are behaving. We can now create the CSS that makes this happen: ```css .flex-container { display: flex; flex-direction: row; } .about { flex: 1; border: 2px solid black; } .link-list { flex: 1; border: 2px solid black; } ``` In the flex-container class: 1. `display: flex` simply tells the browser that this div is a flex-box 2. `flex-direction: row` signals that we want the items inside our flex box to be aligned side by side. This is actually already the default value, but it never hurts to be explicit about these things. As for the two divs: 1. `flex: 1;` the flex property is actually a shorthand that controls several values. In this case we are simply telling the browser that this flex item should take up as much space as possible and shrink/grow proportionally to the window size. 2. `border: 2px solid black;` simply adds a black border to the div. This is just a simple trick used for debugging purposes so that we can see what's going on. [![Stackoverflow Answer explaining what the flex attribute does.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-14.png)](https://stackoverflow.com/a/37386525/6688750?ref=gorillasun.de) A good Stackoverflow answer explaining what the flex attribute does. If we run this, we'll end up with a very simple webpage at this point, on the right you can see what it would look like without the flex attribute added to our two divs: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-13.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-15.png) With flex: 1 on the left and without flex: 1 on the right. ## Responsive behavior via CSS Media Queries Now what we would like to happen, is that one of the two flex items should go on top of the other one when the window goes below a certain width (when the window becomes tall/narrow). We don't actually need any complicated Javascript for this, there's a really cool CSS trick called media queries: [Using media queries - CSS: Cascading Style Sheets | MDNMedia queries allow you to apply CSS styles depending on a device’s general type (such as print vs. screen) or other characteristics such as screen resolution or browser viewport width. Media queries are used for the following:![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/CSS/Media%5FQueries/Using%5Fmedia%5Fqueries?retiredLocale=de&ref=gorillasun.de) A media query that checks if the window width has become less than a certain value would look as follows: ```css @media only screen and (max-width: 600px) { /* whatever you want to happen in this case goes here */ } ``` In our case we want the list of links to go on top of the about section, or maybe even have the about section disappear completely when viewed on a mobile device. We can achieve this with the following lines of code: ```css @media only screen and (max-width: 600px) { .flex-container { flex-direction: column-reverse; } } ``` When the window's width goes below 600 pixels the media query will set the flex-direction of the flex-container to column-reverse, essentially stacking the div with the list of links, on top of the about section (right to left basically). It also automatically switches back to a row direction when the screen becomes large than 600 pixels again. Here's what this looks like in action: 0:00 / 1× ## Styling the List Now we can work on styling our list. I simply tried to emulate a similar design to what linktree is doing: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-16.png) What I especially liked was the little thumb in the Openprocessing entry, I wanted something like that but for all of the links. We'll get to that in just a second, but let's first create and populate our list in HTML. ```html ``` Again, the classes we added here don't exist yet, so there will be no visual impact. We simply get something that looks like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-17.png) The style: ```css .link-list { flex: 1; border: 2px solid black; padding: 1em; } .styled-list { list-style: none; list-style-type: none; padding: 0; margin: 0 auto; } .list-item { border: 2px solid black; margin: .5em 0; text-align: center; } ``` Don't worry about trying to follow along with the code, I'll include a complete example at the very end. For now just try to understand what all of the CSS attributes do. Let's see what we did here: 1. We created two new classes `styled-list` and `list-item`, corresponding to the two classes that we added for the `ul` (unordered list) and `li` (list item) tags in the HTML respectively. 2. `list-style-type` and `list-style` both do the same thing, they simply remove the little dot that preceeds the list items. We also set the `padding` to 0, otherwise we'd be left with a list that has an indent on the left side. 3. To center the list inside of the containing div we can use `margin: 0 auto;` which sets the top and bottom vertical margin of the list to 0, and centers the element horizontally on the page as the margins will be equal on both sides with respect to the containing div. 4. As for the individual list items we'll also add a border, and give them margins on the top and bottom to space them out a bit. We also want the text inside of them to be centered which can be achieved with the `text-align` attribute. 5. As for the div that contains the list itself we want to give it a little bit of padding so that the list items don't touch the outer border. With all of this in place we'd end up with a list that would look as follows: 0:00 / 1× Alright, we're already getting closer! ### Styling the List Items We'll continue styling the list, and now add icons to our links. For this, we'll have to split our list items into two parts, one that will hold the icon and another that will display the link text. For this we need to create two new divs in each list entry, the HTML will look like this: ```html
  • /* more list tags here */
``` We'll also apply classes to these two divs to be able to style them. Now the trick here is to make each list entry a mini flex box, where we align the icon on the right side, and make the text take up the remainder of the space. We'd end up with CSS that would look as follows: ```css .list-item { /* from before */ border: 2px solid black; margin: .5em 0; text-align: center; /* don't need this anymore */ display: flex; flex-direction: row; padding: .5em; } .link-list-icon { flex: 0 1; border: 2px solid black; padding: .5em; margin-right: .5em; } .link-list-text { flex: 1 0; display: flex; justify-content: center; border: 2px solid black; padding: .5em; } ``` 1. The list-item class becomes a flexbox with row direction. 2. The link-list-icon becomes a flex item that is allowed to shrink but not grow. In this manner it will sit at the left side of the list. 3. The link-list-text becomes a flex item that is allowed to grow but not shrink. In this manner it will take up the remaining horizontal space. We also make it a flex box and use the justify-content attribute to center the text (we could also do this with the text-align attribute though) 4. We add paddings and margins to make it look nice. 0:00 / 1× ### Adding List Icons To add the cute little icons we'll use [fontawesome](https://fontawesome.com/search?o=r&m=free&ref=gorillasun.de). Here you can either download the individual icons that you need or create an account and make a kit. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-18.png) The latter is what I did, and allows us to simply drop a script tag in our page's head to get access to the icons. ```html ``` Then we can simply add icons directly in the HTML like this: ```html ``` In the fontawesome explorer you can simply search through the free icons that are available. Our list looks now as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-19.png) I also added some styling to make the list look nicer. ```css .list-item { border: 2px solid black; margin: .5em 0; text-align: center; display: flex; flex-direction: row; padding: .5em; border-radius: 10px; } .link-list-icon { flex: 0 1; padding: .5em 1em .5em .5em; margin-right: .5em; font-size: 20px; border-right: 2px solid black } .link-list-text { flex: 1 0; display: flex; justify-content: center; padding: .5em; font-size: 20px; } ``` Also while we're at it, let's limit the width of the list and center it horizontally in it's parent: ```css .styled-list { list-style: none; list-style-type : none; padding: 0; max-width: 400px; margin: 0 auto; } ``` ### Making the Links Clickable We also need to make the links clickable and have them behave like buttons. For this we can wrap the list items with the anchor tag : ```html
  • ``` And we obtain clickable list entries: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-20.png) We also want to remove the coloration and the underline of these links, which can be done as follows: ```css .styled-list > a { text-decoration: none; color: black; /* or whatever color you want */ } ``` ## Making the List Sticky When the window has a landscape aspect ratio and the content on the left is being scrolled, we want the list of links to remain on screen and not disappear upwards. There's two ways to do this. ### Sticky to Top The CSS ingredients for this particular behavior are: ```css .link-list { flex: 1; padding: 1em; position: -webkit-sticky; /* this is for Safari */ position: sticky; top: 0; align-self: flex-start; /* necessary */ } ``` The combination of ***position: sticky;*** and **align-self: flex-start;** make it such that the list of links stays stuck to the top of the window even when the lefthand side is scrolled. We can temporarily manually set the height of the about section to a large value, like 4000px for instance, and see what happens: 0:00 / 1× ### Sticky and Centered There's a different way of making the flex item sticky if you want it to be centered vertically as well inside of it's flex item container. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-21.png) This looks a bit cleaner imo, but the CSS for it is a bit gnarlier: ```css .link-list { flex: 1; padding: 1em; align-self: flex-start; position: sticky; top: 0; display: flex; height: 100vh; margin: 0 0; justify-content: center; } .styled-list { list-style: none; list-style-type : none; padding: 0; margin: auto 0; width: 100%; max-width: 400px; } ``` Essentially, we're setting the link-list div that is wrapped around the actual list, to take up the entire vertical space of the window (the view port) with the attribute `height: 100vh`. Alongside `position sticky;` and `align-self: flex-start;` we can now vertically center the list inside of this div with `justify-content: center`; and `margin: auto 0;` ### De-sticking the list with a media query Now we also need to account for the sticky position attribute when the window becomes narrow and essentially disable it. We'll simply use another media query and set the position of the list to relative: ```css @media only screen and (max-width: 600px) { .link-list { position: relative; } } ``` Now we'll get something that functions like this, also added some text for starters: 0:00 / 1× ## Other Stylistic Stuff ### Text and Headings We can add some dummy text to the about section now, as well as a simple heading: ```html

    About Me

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.

    At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

    ``` To style this we'll use a child combinator. The child combinator is represented by the larger than symbol, and in this case specifies, that the p and h1 tags that occur in divs with the about class should have a specific style applied: ```css .about > p { font-size: 20px; font-family: sans-serif; line-height: 28px; } .about > h1 { font-size: 60px; font-family: sans-serif; line-height: 70px; } ``` Nothing fancy here, just a regular sans-serif font, cranking up the font-size to 20px (it's good practice to use a larger font-size, makes things more readable). Same thing for the heading! ### Limiting the text width One other thing that I'd like to do here is limiting the width of the about section; text doesn't look good and becomes much less readable when it becomes too wide. Similarly to earlier where we limited the width of the list, we can use the max-width attribute again: ```css .about { flex: 1; padding: 1em; max-width: 600px; margin: auto auto; } ``` Also setting the margins to auto so that they sit nice and centered. And while we're at it, we'll also set the width of the entire flex-container, such that the text and list don't sit too far apart from each other: ```css .flex-container { display: flex; flex-direction: row; max-width: 1180px; margin: 0 auto; } ``` ### Hover Animation We can go a step further and also animate our links when someone hovers over them with the following CSS snippet: ```css .styled-list li { transition: ease .3s; } .styled-list li:hover { box-shadow: 4px 4px #FF8600;; } ``` 0:00 / 1× ### Background Image We can also set a pretty background image very easily, we simply apply it directly to the body of the page: ```css body { padding: 0; margin: 0; background-image: url("background.jpg"); background-repeat: no-repeat; background-size: cover; } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-22.png) ## Complete Code You can find everything we covered in this Github repository and use it as a template to get started and make your own thing: [GitHub - AhmadMoussa/Linktree-CloneContribute to AhmadMoussa/Linktree-Clone development by creating an account on GitHub.![](https://github.com/fluidicon.png)GitHubAhmadMoussa![](https://opengraph.githubassets.com/f262a0fe5f65e8a6e7559403aad59cd285a9ae4d47d58110ed3aa0dff5913dd7/AhmadMoussa/Linktree-Clone)](https://github.com/AhmadMoussa/Linktree-Clone/tree/main?ref=gorillasun.de) ## Hosting the List on Github Pages After uploading your files to a fresh github repo, you'll want to head over to Settings > Pages > Branch > Select Main and hit save. Then give it a couple of minutes and refresh the page. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-29.png) After a few, you should see a notification pop-up at the top of the page, clicking on the link you should now see that you [link list is live](https://ahmadmoussa.github.io/Linktree-Clone/?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-26.png) Hope you enjoyed this post and that you'll use this as starting point to put together your own little linktree-like website! Happy coding, cheers, and check out some of my other posts! ### The Art of Vera Molnar 1947-1974 URL: https://www.gorillasun.de/blog/the-art-of-vera-molnar/ Last updated: 2023-05-06T19:16:12.000Z **When it comes to early generative art, one name that resonates is Vera Molnár's. She has been at the forefront of computer-generated art since the late 1960s, at a time when the concept of computer art was not something that was previously heard of. With her enormous influence on the field, she has cemented her name as the grande dame of computer art.** Even though there's many resources that recount Vera Molnárs life, and the events of her artistic career throughout years; most of them only provide brief snapshots into specific periods of her life. The main challenge in putting this article together, was finding a logical and chronological recount of the events; drawing a complete picture from excerpts from the many interviews that she has done over the years proved to be tricky. A complete list of the referenced material can be found at the very end. ## Art before the Machine Throughout her life, Vera Molnar has made a lot of art, and has amassed a large body of work over the years. Working with computers for the first time in 1968 was a pivotal moment, not only for her career but equivalently for the field of generative art as a whole. Hence, we'll first have a look at her artistic career and influences leading up to that moment, which will help us better understand her approach to working with computers later on. ### Early Life Vera Molnar was born in Budapest in 1924 and showed an interest in the arts from a young age. In [a conversation with Barbara Nierhoff from 2006](https://vintage.hu/wp-content/uploads/2018/04/Molnar.pdf?ref=gorillasun.de), she provides a good recount of her earliest childhood experiments and how she discovered an ***algorithmic*** method towards art. At the age of ten, she would spend many an evening drawing the view of Lake Balaton from her parents home: Every time she drew the scenery, she used the same five colors: green for the meadow leading to the water, blue for the lake, brown for the mountain range on the other side of the lake, blue for the sky and orange for the sunset. From the machine imaginaire to the machine reelle by Barbara Nierhoff Growing tired of the repetitive color scheme she decided to change it up with a self-imposed system: As time went on, Vera Molnar experienced a rising sense of dissatisfaction at the close resemblance between her depictions of the familiar landscape, which prompted her to start using adjacent colors in the paint box for each visual element. Thus, at this young age, she had already conducted her first systematic investigation guided by principles that still inform her work today. From the machine imaginaire to the machine reelle by Barbara Nierhoff Vera Molnar was thinking like a programmer, before she knew what a computer was. This systematic approach to art making, that came to her in a seemingly natural manner during her childhood, would later become the principal method with which she creates her artworks, before and after using computers as the primary medium. In [an interview with artnet](https://news.artnet.com/art-world/vera-molnar-venice-biennale-2098046?ref=gorillasun.de) she adds to a similar childhood recount "**It’s not far from my mindset now**". From 1942 to 1947 she pursued an art degree at the School of Fine Arts in Budapest where she studied painting, art history and aesthetics. In [an interview with Amelia Spalter for Brown University](https://browninterviews.org/i-was-born-a-second-time-with-the-visualization-of-the-screen-brown-interviews-vera-molnar/?ref=gorillasun.de) Vera explains that she had already decided to be an artist during her teenage years: **What was your family's reaction when you told them of your plans to go to art school?** I remember one morning when I was 16, I said, “Mom, there are some things that I want to tell you: First, I don’t want to play piano, I want to paint. I don’t want to go to church. I don’t want to wear glasses. And finally… I want to make my life in France.” My poor mother, it hit all at once. But she was an intelligent woman. She told me, “All right, well, there is one thing that is non-negotiable, it’s the glasses. You have bad myopia, and you will get crushed by a car. The rest we will talk about when you come back from school. Now put on your glasses.” And she was right, I still wear my glasses. “I was born a second time with the visualization of the screen.” – Brown Interviews Vera Molnár It's important to note here, that Vera Molnar did her studies during a time of political upheaval in the world. The national-socialist ideology did not really agree with the concept of modern art, and was at the time labeled as ***degenerate art***. There was not much room for geometry and figurative compositions. The sudden switch from national-socialism and communism, and the radically different view on art that now accepted when it was previously frowned upon most likely contributed to Vera Molnar's perspective, and not to care too much about what people thought about art. During this time Vera Molnar discovered Cubism and found respite in it: **Did growing up in such a turbulent, often depressing political era contribute to your desire to work in the abstract?** It happened little by little. I painted like a young wealthy girl — portraits of my mother, of a cow — but without passion. And then, I encountered Cubism, which was a decisive moment for me. Cubism, as a painting style that is figurative but constructive at once, helped me. So, I wasn’t entirely giving up nature, but I stayed in the abstract, even though I didn’t know Cubist icons like Mondrian or Malevich yet. Cubist painting pushed me to where I am today. “I was born a second time with the visualization of the screen.” – Brown Interviews Vera Molnár Later she obtained a stipend to continue her studies abroad. At the time her primary choices were either Paris or Moscau, however ultimately she was sent to Rome. In good humor she says that *such is life*. She had absolutely no interest in the paintings of the renaissance however, in an conversation with Sabine Saschl from Museum Haus Konstruktiv she says: ***I thought that I would go crazy if I saw one more artwork from Giovanni Bellini. I wanted to see Picasso.*** Shortly after that she moved to Paris in 1947, with her future husband to be, François Molnár, who would also proceed to become one of her main collaborators in the coming years. ### Arriving in Paris 1947 In the same interview with MHK, Vera Molnar reminisces about arriving in Paris for the first time. She states that in a way she was reborn that day. In fluent German she says: **Da fing die Geometrie an!** Which means as much as "***That's when the geometry started!***" - the same evening after seeing the Notre-Dame de Paris for the first time, she felt incredibly inspired and put together a number of geometric drawings. [In conversation with Jo-Lawson Tancred from Artnet](https://news.artnet.com/art-world/vera-molnar-venice-biennale-2098046?ref=gorillasun.de), she explains: **“I had never seen such a grand thing before.” The encounter brought to life an impulse that had lain dormant during her classical training at the Budapest College of Fine Arts.** That very same evening she produced a set of highly geometric drawings of the cathedral’s façade, marking a turning point. “I still didn’t know what I was looking for, but I’d eliminated what I was not looking for,” she said. "Meet Vera Molnár, the 98-Year-Old Generative Art Pioneer Who Is Still Making Visionary Work in a Paris Nursing Home" - by Jo Lawson-Tancred In the MHK interview she further elaborates: **In my mind I had ideas that were a mixture of Picasso, Paul Klee, Mondrian... I wanted to make something like that.** In Paris her favorite coffee shop was Le Select in le Montparnasse (it still exists - give it a visit if you find yourself in Paris), where she met other renown contemporary artists like Brancussi, Fernand Leger and Victor Vasarely as well as allegedly Kandinsky. Although that last name on the list might be an inaccuracy; even though Kandinsky lived in Paris, he died in 1944. In an interview with Hans Ulrich Obrist (more to that one later), she states that she also met Malevich in France, however I also don't understand the timeline on that one, Malevich died in 1935 when Vera arrived in Paris in 1947\. Maybe she visited France before, but then again she would still have been a young girl at the time. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-8.png) ### Molnar's Art from 1947 to 1960 Vera Molnar created her first geometric images in 1946 - a series of 12 abstract drawings titled **Arbres et Colines**, which translates to ***Trees and Hills*** in English. The artworks are minimalist and figurative representations of natural scenery, where the composing elements are reduced to the bare minimum. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/thumb_large2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-73.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/thumb_large.jpg) After some back and forth she decided however to [completely abandon the depiction of nature and focus on geometric shapes](https://www.espacedelartconcret.fr/sites/default/files/2021-04/dpresse%20Vera%20Molnar%5F12.04.21%20-%20web.pdf?ref=gorillasun.de). The artworks that followed from the same period of time were highly abstract: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/VM_1947_Oval-with-Point_2041_hi-res.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/d7hftxdivxxvm.cloudfront.webp) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/IMG_0067.jpg) Ovale avec un Point - Oval with a point 1946 (right) | Deux formes Ovales - Two oval shapes 1947 (middle) | Hommage to Picasso 1948 (left) One of her big influences during these days was Sonia Delaunay, who she would visit regularly and become close friends with: **Who was your greatest influence as a young artist?** The first female artist whom I met and who had a huge influence on me was Sonia Delaunay, when I was in France. My husband and I arrived in France in 1947, and we were hungry and had no money. Once a week, always on a Wednesday, we could go to Sonia Delaunay’s house \[to show her our art,\] and there was tea and as many little cakes as we wanted. Her art was magnificent, elegant, beautiful, sort of like what is showcased today at Galerie Thaddaeus Ropac. My work was dirty, and not done very well. But she told me, “**This young lady, she will go far, if she works very hard.**” I thought to myself, “**If Sonia Delaunay tells me that, then… wow.**” “I was born a second time with the visualization of the screen.” – Brown Interviews Vera Molnár - by Amelia Spalter This shows how meaningful just a couple of words can sometimes be. Would Vera have pushed as far as she did if she hadn't been encouraged by Sonia Delaunay at the time? She proceeded to create a homage to Sonia's work: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/vera-water-color-1.jpg) [Spalter Digital Art Collection](https://spalterdigital.com/artworks/hommage-a-sonia-delaunay/?ref=gorillasun.de) [An important component of Vera Molnar's art practice during this time was collaboration with her husband](https://www.holo.mg/dossiers/vera-molnar-weaving-variations/timeline-1950-1960/?ref=gorillasun.de). Their close friend [Francois Morellet](https://de.wikipedia.org/wiki/Fran%C3%A7ois%5FMorellet?ref=gorillasun.de) (himself an accomplished artist) described them as **un peintre a deux tetes* \-* a painter with two heads. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-72.png) Dossier Holo I highly recommend taking the time to read through all of the links that I'm including throughout the text to get the full picture, as it's not entirely possible to include all of her endeavors from this period of time in one article. Vera Molnar's artistic career throughout the years is incredibly rich, multifaceted and is tightly interconnected to the endeavours of her contemporaries. There's many lessons to be learned. In the 1950s she continued to experiment with systematic approaches towards art making, which in a way were preparatory experiments to what would follow in the next decade. I was surprised that it was quite difficult to find pictures of her artworks from this period of time, and after extensive research the extent of Vera Molnar's entire body of work is still a bit unclear to me. I did however find enough material to showcase this era: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/IMG_2600-scaled.jpg) Carres (Squares) 1951 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/vera-new-2_8_20-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/IMG_2601.jpg) Carres concentriques 1958 (left) | Carrés Concentriques B (Concentric Squares B) 1955 (right) The rectangle would later proceed to become the most important shape in her aesthetic. ### Machine Imaginaire and GRAV Vera Molnar's art was heavily influenced by constructivist principles. Constructivism is an art movement in which art is to be **constructed** rather made, and in turn actually finds it's origins with [collages from Picasso that inspired Vladimir Tatlin during a visit](https://magazine.artland.com/art-movement-constructivism/?ref=gorillasun.de). In the same year, Vladimir Tatlin would proceed to become a founding figure of the constructivist art movement: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-4.png) For Vera Molnar and her contemporaries this was a little bit different, although parallels can be drawn, the key-word for them was the term ***research***. Treating art as a continuous investigation of techniques for the creation of patterns and shapes. [A text by Barabara Nierhoff](https://vintage.hu/wp-content/uploads/2018/04/Molnar.pdf?ref=gorillasun.de) provides a quote by Pierre Descarques (I couldn't find the original source), he states: They do not compose anymore; their works have neither a beginning nor an end; they experiment by applying possible combinations, such as statistics, probability, chance, mobility, etc. A quote by Pierre Descarques mentioned in Barbara Nierhoff's text. This provides context for her most famous work of that era: ***la*** **machine imaginaire**. In the 1960s, prior to working with computers she invented her imaginary machine, a new and conceptual way for making art that paved the way for the rest of her career, and equivalently was an important pivot for generations of generative artists to come. In the same conversation with Barbara Nierhoff she explains the idea behind the **machine imaginaire**: In order to process my research series in a systematic way, I initially applied a technique I called machine imaginaire. I imagined I had a computer. I created a program and then, step by step, I realized simple, limited series which were self-contained, and thus did not skip any shape combinations From the machine imaginaire to the machine reelle by Barbara Nierhoff This concept is best understood by having a look at the resulting compositions: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/6303882707d3dbb518e262af_Screen-Shot-2022-08-22-at-15.41.50.png) Vera Molnar, Draft for cover of Pierre Barbaud, *La Musique Algorithmique*, c. 1968\. Courtesy Vera Molnar Archives (used with the artist’s permission). The design features a reproduction of Molnar’s collage,[ *Quatre éléments distribués au hasard*](https://www.centrepompidou.fr/en/ressources/oeuvre/cez6op?ref=gorillasun.de),1959 A little bit of a different explanation of the **machine imaginaire** can be found in a recent interview with her by Right Click Save, that elucidates the thought process behind her method: [An Interview with Vera MolnarThe pioneering artist speaks to Zsofi Valyi-Nagy about NFTs, generative art, and the machine imaginaire![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Valentino Catricalà![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/630371e22764636d16d0f04e_Screen%20Shot%202022-08-22%20at%2014.08.41.png)](https://www.rightclicksave.com/article/an-interview-with-vera-molnar?ref=gorillasun.de) In essence the ***machine imaginaire*** is a set of rules that she put in place and then realized by hand. Naturally, randomness was already a component in her work at the time. Seeing the above composition, it's difficult to distinguish it from her early works that were actually generated by computers. At the same time she became a founding member of the Research Group for Visual Art (“Groupe de Rechereche d’art Visuel” or GRAV) alongside her contemporaries Morellet, Julio Le Parc, and Jesus Rafael Soto, as well as her husband Francois (and other artists of the era, different resources provide different lists of names). The primary mission of GRAV was the investigation of collaborative approaches to kinetic and interactive installations, as well as how they could make the viewer an active participant of the art. Essentially, what we know today as interactive art installations. [A good recount of their activities and their manifesto can be found here](http://dada.compart-bremen.de/item/collective/2?ref=gorillasun.de). ***If there is a social preoccupation in today’s art, then it must take into account this very social reality: the viewer.*** They did however leave the group only a few months later due to disagreement on what they believed research to be. The dispute was primarily on Francois' part but Vera left in solidarity. [A short passage of the lettre that Francois wrote on the occassion of separating from the group can be found here](https://www.deniserene.fr/online/?ref=gorillasun.de) (in french though). ### Discovering Computers When she was asked about how she first heard about computers, in the interview with MHK she tells the tale (translated from german): I heard about it. Such things don't exist at all in Art. Sometimes you don't know how things come to you. Then I talked to someone about it, and I read about it. And I had this crazy idea that I could use it for Art From the machine imaginaire to the machine reelle by Barbara Nierhoff It took three applications to the dean of Sorbonne before she was granted access to a computer that was originally reserved for the purpose of scientific computing. [In a conversation with Hans-Ulrich Obrist](https://vintage.hu/wp-content/uploads/2019/03/Molnar-Vera-HUO-interview.pdf?ref=gorillasun.de), a [swiss art curator](https://de.wikipedia.org/wiki/Hans%5FUlrich%5FObrist?ref=gorillasun.de), she provides a more detailed account of her attempts to get access to the computer: ![A screenshot of Vera Molnar's conversation with Hans Ulrich Obrist](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-24.png) In conversation with Hans-Ulrich Obrist This newfound medium would soon completely transform Molnar's process, which she would later refer to as "entering in a dialogue" with the machine. The first computers at the time did not have a display or screen of any sort. Working with them was arduous and there was a delay between handing in the code and getting the results back, usually three days later. Even though she did enroll in a Fortran course, and was even able to create punching cards, I believe that Francois helped her with this endeavor - in the beginning at least. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/IMG_0475.jpg) Interruptions 1968 Interruptions is Molnar's very first computer generated artwork. ![A screenshot of Vera Molnar's conversation with Hans Ulrich Obrist](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-6.png) In conversation with Hans Ulrich Obrist ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/vera-1-scaled.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/vera-2.jpg) Du Cycle: Segments et leurs Croisements No. 1 & No.2 resepctively (Of the Cycle: Segments and their Intersections) 1969 ![Interruptions à recouvrements (Interruptions with Overlaps) 1969](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/DSC_8400-copy.jpg) Interruptions à recouvrements (Interruptions with Overlaps) 1969 I would genuinely love to have a peek at the code that created these pieces from the late 1960s. What did it look like? How was randomness implemented? How did you draw lines? How did you pass this information to the plotter? Why have all these questions never been asked in the many interviews that were done? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/HOLO-Dossier-Vera-Molnar-Variations-Inclinaisions-1971-B-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/DSC_8397-copy1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/folio-for-inclinaisions-scaled.jpg) Inclinaisons 1971 - Study for Inclinaisons 1971 - Study for inclinaisons ### Backlash This new way of making art with computers was met with resistance. Even if they didn't say it out loud, many of her artistic contemporaries were not very fond of her experiments: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-25.png) **These experiments provoked her peers, whom she remembered as being “scandalized!—I had dehumanized art.”** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-7.png) Undeterred by this however, Molnar continued to work with computers. ## In conversation with the Machine Fast forwarding a couple of years, the first computers with screens were installed in 1974\. And it was a game-changer for Vera Molnar: I think the screen was invented for me. The scientists didn’t need it, because they could wait a day to see their calculations. But to see a square that transforms itself bit by bit into a trapezoid, the screen is crucial. “I was born a second time with the visualization of the screen.” – Brown Interviews Vera Molnár - by Amelia Spalter In the artnet interview she states: **It changed everything** Being able to see what your computer produced on the spot accelerated the entire process. Vera Molnar started calling it the ***"conversational"*** method, a term most likely borrowed from french where the word **conversationnel** would rather mean **interactive**. In comparison to the blind computing approach, as it was called at the time, the screen now provided an interface between the user and the computer. The [in depth piece by the dossier HOLO](https://www.holo.mg/dossiers/vera-molnar-weaving-variations/inclinaisons-1971/?ref=gorillasun.de) discusses this aspect of her work in detail. Having access to a screen is something that we take for granted in our life today, when just a few decades prior such things were imaginable. Vera Molnar remembers these days with great fondness: **I argue in my dissertation that the advent of interactivity was the most significant milestone in Molnar’s career, though it’s been overlooked in both studies of her work and in the history of computing more broadly.** When I asked her about the screen in our very first conversation, a shaky phone call in August 2017, I could hear her beaming as she said, “The IBM 2250!” She recalled her first time using the screen like a sort of rebirth, akin to moving to Paris at age 23\. Vera Molnar - Weaving Variations - by Zsofi Valyi-Nagy on HOLO Albeit having access to this modern technology, Vera continued to work with paper and using at the primary method to plan out her ideas and sketches, she says "I always had a mini atelier in my handbag" ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-9.png) SKETCH FOR “CARRES SUR FOND VERT (25B)”, 1970 graphite and colored pencil on graph paper, 10 7/8 x 16 1/2 inches (27.6 x 41.9 cm) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-10.png) CARRES SUR FOND VERT (25B), 1970 oil on canvas, 31 1/2 x 31 1/2 inches (80 x 80 cm) signed and dated on reverse ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/1-_ypyAE1W5djeqUt5RQJAQA.webp) ### 1% Randomness In the 1970s Vera began thoroughly exploring this newfound medium, and in a way started doing what many generative artists still do till today. **Harnessing Randomness.** The idea of incorporating randomness in her work is inspired by a phrase from Gogins, she states it in german in the MHK interview: ***Beauty sat on my lap, and suddenly I was not hungry anymore.*** What she tries to say is that she quickly tired of the orderliness and regularity of the shapes that the computer produced. I can relate to her very well when she says "I can't easily explain why, but I thought it would look more interesting if I inserted a little irregularity". There's this misconception that art always has to have some deeper meaning, or that the elements in an artwork need to be symbolic of something, but for Vera Molnar it was never like that - she simply enjoyed creating and searching for patterns and ideas. In this manner she created her arguably most famous series (Dés-)Ordres which in english means (dis)order and is referential to that idea: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/DSC_8402-copy1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/DSC_8406-copy1.jpg) (Dés-)Ordres 1974 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/1-jzmErBtOIPUF52NQj3oKtA.webp) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/-dims4-default-67d1487-2147483647-strip-true-crop-5142x3492-0-0-resize-2048x1391--quality-90--1.jpeg) 1% de désordre 1976 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-11.png) ### Intuition and Surprise For Vera, the computer enriched her practice immensely. Having created art for the past two decades in a systematic manner, there wasn't much room for that thing called intuition... and in a way she didn't need to have intuition, since the rules of her systems already predicted how to proceed. Vera on intuition and randomness With the computer she could continue working in this way by using randomness. She makes clear that when she talks about randomness, she doesn't mean it in the same manner that the dadaist movement operated, where the ideology was that anything could be art. To her, randomness was a tool that helped her converge towards outputs that she liked and often couldn't have conjured by using her imagination alone. That is not very different from how many generative artists operate today. It’s a paradox. That using computers dehumanises art. The opposite is true. Because it’s thanks to all this technology, we can get very close to what we have imagined. That otherwise we might not have found. Vera Molnár: the computer art goddess Vera Molnar had a clear stance on the question of "Who is making the Art? The computer or the artist" - it's a dialogue between the two. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/IMG_3728.jpg) À la Recherche de Paul Klee (Looking for Paul Klee) 1971 By then she had also started to incorporate the little surprises whenever they occurred. The computer will eventually produce unexpected results, when you don't know what exactly you're looking for: And on the other hands, mistakes are also good surprises. Something comes that you had’t wished for at all. Ultimately the intuition of an artist is the ‘random walk’ of the computer. \[...\] I adore taking little side routes, I adore allowing myself to be disturbed. I don’t like obedience. Vera Molnár: the computer art goddess ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image-12.png) ### Searching for hidden rules A fond memory that she has of her father, was when he taught her to draw football players on the margin of newspaper pages. But there was a catch: the entire drawing had to be done with a single line. She would use this idea later on several times throughout her works, being inspired by other artists that did similar line drawings like Paul Klee and Picasso. The idea of hidden rules, governing and restricting the process with which the art is created, is a central topic of her work. Posing question and asking **what if?** is one of the best ways to come across new ideas and synthesize new works in that manner. ## Closing Thoughts ***“There was a time in my life when I was just François Molnár’s cook, and between courses I made my small squares,” is how she put it. “Now I’m going to Venice. It’s a big thing.”*** Doubtlessly, Vera Molnar has played a significant role in shaping the generate art landscape as we know it today. From her novel systematic approach to art-making all the way to her first experiments with computers and plotters, her work stands as an inspiration to many till today. There's much more to her career past the 1980s, which I might cover in a second part sometime soon. This was a genuine joy to put together and I thoroughly enjoyed researching all of the details. I hope you enjoyed reading it as much as I did writing it. ***“I have no regrets. My life is squares, triangles, lines” — Vera Molnár*** If you want to read more about generative art I recommend this article I wrote not so long ago: [Creative Coding: The New EraCreative coding is a new interdisciplinary art form that bridges the gap between technologists and artists. This article explores what it means to be a code artist, what it means to make art with code, and how we approach this new discipline today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/newerabanner2.png)](https://www.gorillasun.de/blog/creative-coding-the-new-era/) Cheers! Happy coding! ## A list of Links Here's a list of links for all the excerpts throughout the text. They are roughly in order of importance (wealth of information). Check all of them out, it's something that I could lose myself in for hours on end. ### Main Resources The best video interview of Vera Molnar is with Sabine Schaschl representing Museum Haus Konstruktiv, where the explains the important ideas behind her process. It is however in German and sadly has no subtitles: [Vera Molnar im Gespräch mit Sabine Schaschl, Paris 2014Museum Haus Konstruktiv | Vera Molnar | (Un)Ordnung. (Dés)Ordre.5.2\. – 10.5.2015 | kuratiert von Sabine Schaschl und Evelyne BucherKamera Felix von Muralt |…![](https://www.youtube.com/s/desktop/fa273944/img/favicon_144x144.png)YouTube![](https://i.ytimg.com/vi/HkA0hg_-j50/hqdefault.jpg)](https://www.youtube.com/watch?v=HkA0hg%5F-j50&ref=gorillasun.de) Five other resources that were instrumental: - [One of her best interviews was a conversation that she had with Hans Ulrich Obrist](https://vintage.hu/wp-content/uploads/2019/03/Molnar-Vera-HUO-interview.pdf?ref=gorillasun.de). - [A really elaborate and in-depth recount of many periods of her life was this page on HOLO by Zsofi Valyi-Nagy](https://www.holo.mg/dossiers/vera-molnar-weaving-variations/?ref=gorillasun.de). - [In conversation with Barbara Nierhoff for Vintage Galeria Budapest](https://vintage.hu/wp-content/uploads/2018/04/Molnar.pdf?ref=gorillasun.de). - [In conversation with Jo-Lawson Tancred for Artnet](https://news.artnet.com/art-world/vera-molnar-venice-biennale-2098046?ref=gorillasun.de). [“I was born a second time with the visualization of the screen.” – Brown Interviews Vera Molnár — Brown InterviewsVera Molnár, considered by many scholars and historians to be the world’s first female digital artist, began her career in the mid-1940s. Born in Budapest, Hungary in 1924, \[…\]![](https://browninterviews.org/wp-content/uploads/2020/06/cropped-Screen-Shot-2020-06-23-at-11.52.17-AM-270x270.png)Brown InterviewsAmelia Spalter![](https://browninterviews.org/wp-content/uploads/2022/07/vera_BUI.jpeg)](https://browninterviews.org/i-was-born-a-second-time-with-the-visualization-of-the-screen-brown-interviews-vera-molnar/?ref=gorillasun.de) ### Other Resources [BPR Interviews: Vera Molnár - Brown Political ReviewVera Molnár, considered by many scholars and historians to be the world’s first female digital artist, began her career in the mid-1940s. Born in Budapest, Hungary in 1924, Molnár started creating art at eight years old and went on to obtain BFAs in both Art History and Aesthetics at the Budapest Co…![](https://brownpoliticalreview.org/wp-content/uploads/2018/04/cropped-black-logo-270x270.jpg)Brown Political ReviewAmelia Spalter![](https://brownpoliticalreview.org/wp-content/uploads/2020/05/Vera_Photo.jpg)](https://brownpoliticalreview.org/2020/05/bpr-interviews-vera-molnar/?ref=gorillasun.de) [An Interview with Vera MolnarThe pioneering artist speaks to Zsofi Valyi-Nagy about NFTs, generative art, and the machine imaginaire![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)Johnny Dean Mann![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/630371e22764636d16d0f04e_Screen%20Shot%202022-08-22%20at%2014.08.41.png)](https://www.rightclicksave.com/article/an-interview-with-vera-molnar?ref=gorillasun.de) [Vera Molnárrecreating the past / SFPC summer 2020![](https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/RTP_SFPC_SUMMER20/research/Vera_Moln%C3%A1r.html&size=128)RTP\_SFPC\_SUMMER20Rachel R. Roe-Dale![](https://paper-attachments.dropbox.com/s_013DB7A0D9E30117C8096C36F8F64A8ADF66951D1478630A53A9FAFDE491890E_1590581953133_Screen+Shot+2020-05-27+at+3.18.33+PM.png)](https://murilopolese.github.io/RTP%5FSFPC%5FSUMMER20/research/Vera%5FMoln%C3%A1r.html?ref=gorillasun.de) [Founding Mother of Computational Art Vera Molnar Gets Her DueArtist Vera Molnár features in MoMA’s new exhibition on art and technology, “Thinking Machines: Art and Design in the Computer Age.”![](https://www.surfacemag.com/app/themes/magazine/favicon.ico)SURFACEMin Chen![](https://images.surfacemag.com/app/uploads/2017/09/18130537/Galerie-La-Ligne-Vera-Molnar-1024x724.jpg)](https://www.surfacemag.com/articles/vera-molnar-in-thinking-machines-at-moma/?ref=gorillasun.de) [Molnár, Vera (1924-)![](https://www.orlando-gmbh.ch/wp-content/uploads/2019/04/logo_favicon.png)Galerie Orlando GmbH![](https://www.orlando-gmbh.ch/wp-content/uploads/2019/04/logo.gif)](https://www.orlando-gmbh.ch/kuenstler/vera-molnar/?ref=gorillasun.de) [Vera Molnár - MonoskopWiki for Arts and Studies![](https://monoskop.org/favicon.ico)Monoskop![](https://monoskop.org/images/thumb/5/5f/Vera_Molnar_1961.webp/350px-Vera_Molnar_1961.webp.png)](https://monoskop.org/Vera%5FMoln%C3%A1r?ref=gorillasun.de) ### Image Resources The best resource to find images for Vera Molnar's works is the Anne and Michael Spalter Digital Art Collection: [Vera Molnar - The Anne + Michael Spalter Digital Art CollectionVera Molnar (also known by her maiden name, written Gaks Vera a.k.a GV) is a Hungarian-born artist, born in Budapest in 1924\. She is considered a pioneer of digital and algorithmic art and many have designated her the first female digital artist. Steeped in a pictorial legacy characteristic of Easte…![](https://spalterdigital.com/wp-content/uploads/2018/09/cropped-spalter-digital-icon-new-270x270.png)The Anne + Michael Spalter Digital Art CollectionTwitter![](https://spalterdigital.com/wp-content/uploads/2015/07/vera.jpg)](https://spalterdigital.com/artists/vera-molnar/?ref=gorillasun.de) [Another interesting resource I found was this PDF](https://static1.squarespace.com/static/5e3f1213ef4feb2a835408ff/t/5e52a7a829ef9101746e5fa8/1582475184949/Vera%5FMolnar%5F2019.pdf?ref=gorillasun.de). ### Gorilla Recap 2 URL: https://www.gorillasun.de/blog/gorilla-recap-2/ Last updated: 2023-12-19T23:12:35.000Z **Has it already been 3 weeks since we started this newsletter? How time flies smh...** This week I rolled up my sleeves and made some improvements to the blog. I didn't really like how the header of each post was relatively huge, and changed that in favor of a more compact and information rich outline: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/05/Image.png) New post header, feels much better. Browser was also complaining that the grey font didn't have enough contrast against the background. Not good for accessibility. Additionally, now we also got an automatically generated list of headings that should make navigation a little easier. If you noticed, in the past I used to include a little index at the beginning of each post, which would take me a couple of minutes to write out and link up, but there's no need for that anymore. I do need to go back through the old posts though to remove them though. > Another addition: Automatically generated table of contents based on the heading structure! Using Tocbot 🪛 > > I think it looks much cleaner this way! [https://t.co/ZT07FfGsmT](https://t.co/ZT07FfGsmT?ref=gorillasun.de) [pic.twitter.com/II39m0qKVk](https://t.co/II39m0qKVk?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 25, 2023](https://twitter.com/gorillasu/status/1650820328912764929?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This list of headings is generated with [Tocbot](https://tscanlin.github.io/tocbot/?ref=gorillasun.de)! A little JS tool that can be easily integrated on any page, try it out on your own blog! [TocbotTocbot - Generate a table of contents based on the heading structure of an html document![](https://t1.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://github.io/tocbot/&size=128)![](https://github.com/tscanlin/tocbot/actions/workflows/node.js.yml/badge.svg)](https://tscanlin.github.io/tocbot/?ref=gorillasun.de) But wait... there's more! I also got rid of linktree and built my own little about page. Not sure why I didn't do this way earlier 🤔 > Goodbye linktree 👋 made my own! > > Would there be interest if I wrote about how to make a little list like this + hosting it on github pages? [pic.twitter.com/7nDIXc9gnC](https://t.co/7nDIXc9gnC?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 28, 2023](https://twitter.com/gorillasu/status/1651967732231880706?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Thursday post will be about how to make a little list like this! It's actually just a couple of lines of css with some flexbox magic! --- In other news it was [Openprocessing](https://openprocessing.org/user/272186/?ref=gorillasun.de)'s 15th birthday! What a wonderful website, I remember finding myself for the first time on the explore page and seeing all the fascinating creations that people had made. I lost myself there for a couple of hours just playing around with the sketches and taking notes on all the things that I wanted to learn how to make. > 🌟Today marks the 15th year of [@openprocessing](https://twitter.com/openprocessing?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 🌟 > As I googled through its screenshots today, it is hard not to get emotional... 👇🧵 > > I had no idea I launched the OP in the same month as [@Github](https://twitter.com/github?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). It was one of the only few code-sharing platforms online, with one big difference:… [pic.twitter.com/ZbV9uKvAVg](https://t.co/ZbV9uKvAVg?ref=gorillasun.de) > > — OpenProcessing (@openprocessing) [April 24, 2023](https://twitter.com/openprocessing/status/1650554731805257737?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Gorilla Articles & Sketches - This week we only got one new post up, but it's a good one! I've been wanting to learn how to turn my sketches into SVGs purely with Javascript, without using any external libs. After asking some gen-art friends about their strategies, Julien Gachadoat chimed in with a complete example of how he does it. There's some super interesting stuff in there, check it here: [SVG export for P5 and the JS Rendering ContextIn this post we’ll thoroughly discuss what SVGs are, how they can be displayed on web pages, how we can algorithmically generate them, and how we can export them from our sketches.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/FsvJbXpWwAItCDp.jpg)](https://www.gorillasun.de/blog/svg-export-for-p5-and-js-rendering-context/) - Expect another post tomorrow, where we put on our art-history hats and dive into the art of Vera Molnar! I wanted to stick to my new biweekly release schedule (Thursday and Sunday), but Vera just did so much cool stuff during her career that it just wouldn't feel right to not provide a complete picture. Hence, see you tomorrow! ## Interesting Reads of the Week ### RCS: An interview with Dmitri Cherniak There's also been plenty of cool stuff otherwise! This week I read this Right Click Save interview with Dmitri Cherniak where he recounts the early days of generative art in the NFT space: [An Interview with Dmitri CherniakThe artist discusses the moment generative art went mainstream with Jason Bailey![](https://uploads-ssl.webflow.com/61e6c06923cb13538305118c/61f7a07940feca493cb825ed_android-chrome-512x512.gif)RCS![](https://uploads-ssl.webflow.com/61e6c06a23cb13bf76051194/642aaf57c09000275077cf0c_Screenshot%202023-04-03%20at%2012.49.48.png)](https://www.rightclicksave.com/article/an-interview-with-dmitri-cherniak?ref=gorillasun.de) Reading interviews of other generative artists makes me feel incredibly inspired, and I immediately want to get back to working on my own pieces. I haven't been making as much art as I would've liked to in the past weeks since I've been focusing more on the blog and getting it up to speed. I'm very happy with it now though. There's only a couple more things on my list that need to be done and then I'll dedicate myself to making art again. 🤞 ### ‘Godfather of AI’ quits Google with regrets and fears about his life’s work Back in 2018 I was wrapping up my masters. At the time my studies mainly revolved around ML and AI for the purposes of sound processing. I also did a little bit of image processing, because the models used for these two tasks had a lot of similarity. That is to say that I had a pretty good understanding of the state of ML at the time. The GAN paper that came out in 2014 for instance, was ground-breaking and enabled solutions to many tasks that we didn't think possible with regular algorithms. I wouldn't have guessed that the space would adavnce this much however in just a couple of years. I'm not scared of the tools themself at this point, but I'm frightened with the pace at which things have developed. If someone as knowledgeable about the field as Geoffrey Hinton is concerned with the state of things, then these worries must be Justified: [Nobody wants to be another Oppenheimer.Geoffrey Hinton who won the ‘Nobel Prize of computing’ for his trailblazing work on neural networks is now free to speak about the risks of AI.![](https://www.theverge.com/icons/android_chrome_512x512.png)The VergeThomas Ricker![](https://cdn.vox-cdn.com/thumbor/K4HGr7tZ6Si8NkmGOOqH8kpgzkU=/0x0:5846x3898/1200x628/filters:focal(2923x1949:2924x1950)/cdn.vox-cdn.com/uploads/chorus_asset/file/24624360/1166103223.jpg)](https://www.theverge.com/2023/5/1/23706311/hinton-godfather-of-ai-threats-fears-warnings?ref=gorillasun.de) ## Tip of the Week This week I learned a bit more about CSS combinators, that allow you to set up style relationships between different classes and tags. For instance, if you have class called ***content*** that represents the main div of page and want a certain class in this div to have specific style you can do it in the following manner: ```css .content { // some style here } .content .text { font-size: 20px; } ``` This is called the descendant combinator, since the .text style will be applied to any tags with a .text class, no matter in how many other divs they are nested. There's also the child combinator that does the same thing, but only applies the style to direct children: ```css .content > .text { font-size: 20px; } ``` CSS just got a bit less mysterious to me. [Combinators - Learn web development | MDNThis is the last section in our lessons on selectors. Next, we’ll move on to another important part of CSS — the cascade, specificity, and inheritance.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building%5Fblocks/Selectors/Combinators?ref=gorillasun.de) ## Music for Reading and Coding If there's one thing that Youtube does right, then it's its music recommendation algorithm. This week I rediscovered this instrumental Japanese album that I had completely forgotten about. ***Okurimono*** is a japanese term that means as much as ***gift*** in english, so you might as well treat your ears and give this one a listen: ### SVG export for P5 and the JS Rendering Context URL: https://www.gorillasun.de/blog/svg-export-for-p5-and-js-rendering-context/ Last updated: 2023-05-06T08:55:20.000Z **This post is about adding SVG export functionality to your P5 and vanilla JS (using the rendering context) sketches. If you want to import SVG files into your P5 sketch and need some help, then check out this post:** [Working with SVGs in P5JSP5JS doesn’t offer native SVG support, there is however a way to run P5 in an ‘SVG’ mode using zenozeng’s SVG runtime. Running P5 in this SVG mode also requires a lot of interaction with the DOM, which we’ll discuss in this post.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/bannerp.jpg)](https://www.gorillasun.de/blog/working-with-svgs-in-p5js/) **Otherwise read on!** ## Preamble Here's a bit of context. Last month I released my token Blöck on [editART](editARt.xyz/), and its reception was stellar! > Blöck out! 🎉 [#editart](https://twitter.com/hashtag/editart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Thanks everyone for collecting! 🙌🙏 [pic.twitter.com/DkRwIHtvqU](https://t.co/DkRwIHtvqU?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 10, 2023](https://twitter.com/gorillasu/status/1645220370734096384?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) After all editions had found a new home in their respective collectors' wallets and the dust had settled, I got some heartwarming Twitter mentions where people shared their co-creations. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner-4-.jpg) One of them was by Marius Watz, where he states that the token could have been close to perfect if it would have had the functionality to export SVGs: > Picked up these three beauties from [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s Blöck series on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) this weekend. Loving the tight composition and easy experimentation. (SVG export would have been perfection.)[https://t.co/PRnupA7QqZ](https://t.co/PRnupA7QqZ?ref=gorillasun.de) [pic.twitter.com/lvFhZ6AqhC](https://t.co/lvFhZ6AqhC?ref=gorillasun.de) > > — Marius Watz (@mariuswatz) [April 11, 2023](https://twitter.com/mariuswatz/status/1645687989610192897?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Feedback like that is incredibly important to me. I promptly added the request to the top of my to-do list and started looking into it. I've actually been meaning to figure out *how-to-SVG* since last year when I worked on a token with [Pouya](https://twitter.com/pouyabashirii?ref=gorillasun.de), but never got back around to it. Well, no better time than now! The SVG format has several advantages to normal PNG, JPEGs and other raster based encoding formats: 1. It is resolution agnostic. It can be scaled to any size without loss of resolution. 2. It is a lossless format, and usually come with small file sizes. 3. It can be used to plot tokens, which is probably the most popular use-case. 4. Has access to SVG filters which can achieve cool effects. All of these qualities make it an attractive format to add to your project's list of possible exports. If you're familiar with the SVG format and simply want a quick answer on how to do it, then you can directly jump to [the last two sections](#creating-svgs-with-javascript) of the post. Otherwise, keep on reading! ## On SVGs Let's first discuss the SVG format a little, and have a look at how these scalable vector graphics function internally. ### What is the SVG format I already wrote a little about the SVG format in a previous post of mine *Working with SVGs in P5 (the post I linked at the very top)*: > SVG stands for 'Scalable Vector Graphic', which is immediately revelatory of two important properties: scalability and resolution independence. Unlike other pixel based formats, being Vector based, SVGs are not bound to an underlying pixel raster and can thus be scaled to arbitrary sizes, without loss of quality. Vector graphics aren't graphics per se; under the hood, they're made out of a string of instructions that *describe* the graphics a browser would render, if we were to pass it these instructions. In turn, the browser translates these instructions into a graphic that can be displayed on a webpage. These instructions are usually written in the XML markup language. Unlike proper programming languages, like Javascript, Markup languages can't be used to achieve anything functional. Instead, markup languages are used to control the structure and formatting of the content. In the case of SVGs, XML allows us to describe 2D graphics. Here's an example of XML code that describes a simple SVG: ```xml ``` At first glance, XML looks very similar to HTML. Even though both function on the basis of tags, there are some differences between them. HTML is generally used to structure the content and layout of web pages. In contrast, XML's main aim is the description of data. Additionally, XML allows the creation of custom tags, whereas HTML has a predefined number of tags. The above example shows the basic structure of an SVG where we're drawing a simple 50x50 red circle in a 100x100 viewport. There's a couple of things happening here: - The `` declaration specifies the version of XML being used and the character encoding. This tag isn't always required but it's good practice to include it for things to function properly. - The `` element is the root element of the SVG file and defines the width and height of the SVG viewport. The **xmlns** attribute is used to specify the namespace and is important to include here, it allows us to make use of a lot of useful tags for the purpose of drawing different shapes. We'll talk more about namespaces in a bit. - The `` element defines a circle with a center point at (50, 50) and a radius of 40 units. The `fill` attribute specifies the color of the circle as red. Now that we know what an SVG looks like behind the scenes, let's have a look at some of the methods to actually display SVGs on a webpage before we dive into the more complicated task of creating an SVG programmatically. ### Displaying an SVG on a Webpage There's a couple of different ways with which you can conjure an SVG onto your web page👇 #### Inline SVG The easiest method is probably the **** tag that was introduced with html5, and which should be supported by all major browsers nowadays. Here's an example: ```html SVG Example ``` This is called inline because it is created directly inside of the HTML code. In this manner I can even show you the red circle by adding this tag in the HTML of this post: #### Using an iFrame Another method would be by passing the SVG wrapped as an HTML document into an iFrame using the **srcdoc** attribute: ```html SVG Example

    SVG Example

    ``` Tip: you can also specify percentages as coordinates, which will be relative to the size of the viewport. In this case I set the viewport to 100% such that it fills out the entire width of the text column it's in: #### Using the img/object tags If your HTML can access external files then you can simply create your SVG in a vector graphic software and save it as it's own file with the **.svg** extension. To get it inside your HTML you can then use the **** and **** tags: ```html alt text goes here ``` The `` and `` tags are both HTML elements used to display images on web pages, but they work in slightly different ways. The `` tag is used to embed static image files and is simple to use and efficient, but it does not support interactive features or scripting. The `` tag on the other hand is more flexible and can be used to embed a wide range of media types, including images, videos, and other HTML documents. It supports interactive features and scripting and allows you to specify fallback content if the media file cannot be loaded or if the user's browser does not support the media type. ```html alt text goes here ``` #### As CSS background We can also create an SVG by passing it in css as background-image: ```css .element { background-image: url('data:image/svg+xml;utf8,'); } ``` Alternatively you don't have to pass in the entire svg, but can link to a file as well: ```css .element { background-image: url('path/to/your/svg/file.svg'); } ``` ### Converting other image formats to SVG There are some methods to convert PNGs, JPEGs and other raster based formats to the SVG format. However, they are a little backhanded, and very often end up not being not very accurate. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-63-1.png) Trying to convert a complex graphic, such as a photograph, into a vector graphic, defies the purpose of the SVG format. Fine details, textures and gradients can not be easily represented with SVGs, and if we tried to do so, we'd end up with an incredibly bloated SVG code. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-64.png) Some vector editing softwares provide this kind of conversion already like Adobe Illustrator and Photoshop; you can try it for yourself in [Adobe's online converter ](https://www.adobe.com/express/feature/image/convert/svg?ref=gorillasun.de)(you need to create an account however). ## Creating SVGs with Javascript Earlier we've had a look at a couple of different methods to inject SVGs into our HTML page. Now, what if we don't have the SVG yet when we run the page? Or we don't want to write this SVG code manually? What if we wanted to create the SVG dynamically and in a generative manner? **One solution for this would be by using Javascript!** I recently asked a couple of Twitter friends about their strategies for this problem. [Ismalhelio](https://twitter.com/ismahelios?ref=gorillasun.de) says: > I just create everything from scratch using js. Create an svg object and add the properties, groups, geometry… i do that in order to be able to plot the output the way I want. With layers and all that Hence, one method to creating an exportable SVG version of the sketch would be by mirroring the rendering context's drawing functions, and simultaneously appending elements to an SVG. The plotter master and gen-art OG [Julien Gachadoat](https://twitter.com/v3ga?ref=gorillasun.de) does exactly this. > Pathways (0,0) [pic.twitter.com/RgheFuGrds](https://t.co/RgheFuGrds?ref=gorillasun.de) > > — Julien Gachadoat (@v3ga) [April 6, 2023](https://twitter.com/v3ga/status/1644008379830923267?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Julien makes stunning generative art! He chimed in and provided me with a complete example as well! Essentially, he creates his own SVG renderer that has analogous functions to the p5 drawing functions, which he invokes whenever he draws something to the canvas: ```javascript // In the setup rendererP5 = new RendererP5(width,height,{canvas:c}); rendererSVG = new RendererSVG(width,height); rendererP5.begin("my-p5"); rendererSVG.begin("my-svg"); // ... other stuff ... // When drawing the graphics rendererP5.line(x1,y1,x2,y2); rendererSVG.line(x1,y1,x2,y2); ``` There's a little bit of setup that we've got to do first to get something like this working. ### Creating the SVG Element The key function here is the **document.createElementNS()** function. Similarly to the **document.createElement()** function, that you might already be familiar with, and which can be used to create an element in your HTML document, the function **createElementNS()** allows us to create a new element with a specified namespace (hence the letters NS). [Document: createElementNS() method - Web APIs | MDNCreates an element with the specified namespace URI and qualified name.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS?retiredLocale=de&ref=gorillasun.de) Read more about the method here. We mentioned namespaces earlier, but what are they? And why do we need one to create SVGs? Namespaces are used to group related code elements under a single name, usually this helps with organizing code, and in the case of XML and HTML it allows the two tag vocabularies to coexist without the occurrence of naming conflicts. In other words, the namespace helps the browser distinguish between the SVG tags and the HTML tags. Julien's code is very elaborate and specifically made for larger projects, hence let's put together a minimal example using his ideas as starting point. We can create the SVG element as follows: ```javascript elmtSvg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); elmtSvg.setAttribute("class", "renderer"); elmtSvg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); elmtSvg.setAttribute("id", 'my_svg'); elmtSvg.setAttribute("version", "1.1"); elmtSvg.setAttribute("viewBox", "0 0 400 400"); elmtSvg.setAttribute("width", "400"); elmtSvg.setAttribute("height", "400"); document.body.appendChild(this.elmtSvg); ``` Here we create the svg element and store it inside a variable called `elmtSvg` and then via the setAttribute method that exists in JS out of the box, we set the required attributes. There's quite a bunch of them, but we only need to do this once. The SVG namespace is essentially a URI: [URI - MDN Web Docs Glossary: Definitions of Web-related terms | MDNA URI (Uniform Resource Identifier) is a string that refers to a resource.![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Glossary/URI?ref=gorillasun.de) > The SVG namespace is represented as a Uniform Resource Identifier (URI) because it is a globally unique identifier that is used to identify the namespace and distinguish it from other namespaces. URIs are used to uniquely identify resources on the web and can be thought of as addresses for those resources. > In the case of SVG, the URI identifies the XML namespace used by the SVG specification. This allows for SVG elements and attributes to be correctly interpreted and rendered by web browsers and other software that supports the SVG standard. By using a URI as the namespace identifier, the SVG specification ensures that there is no confusion with other XML namespaces that may be used in a given document or application. And in this manner we would already have created an SVG element, even though we can't see it yet, because it's empty. If we inspect the HTML of our sketch however, we will see that it is there: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-65.png) Example inside the p5 editor, the svg lives in the DOM even though it isn't visible. ### Drawing to the SVG The next step would be to actually draw to the SVG. In this context, when we say *draw to the SVG*, we actually mean that we will create new elements and append them to the body of the SVG element that we created earlier. It's easiest to explain this by showing an example: ```javascript function drawSVGLine(elemtSvg, x1,y1,x2,y2){ line = document.createElementNS("http://www.w3.org/2000/svg", "line"); line.setAttribute("x1",x1); line.setAttribute("y1",y1); line.setAttribute("x2",x2); line.setAttribute("y2",y2); elemtSvg.appendChild(line) } ``` For convenience we'll wrap this code inside a function such that we can invoke it as many times as we want. Therefore, drawing a line for instance, boils down to the same steps we did before: 1. Creating the line element with the name-spaced **createElementNS()** function, passing along the SVG namespace URI. 2. Setting the required attributes. In the case of a line it is the coordinates of the end-points. 3. And lastly we have to append this new element to the SVG that we created before. Now if we were to run this we wouldn't actually see a line, because we didn't set a stroke color. It would be transparent just like the background of our svg element. We can fix this by setting the `stroke` attribute to a specific color before appending: ```javascript lineSvg.setAttribute("stroke", "#000000"); ``` And that should do the trick! There's many shapes, that are supported by the SVG format; I recommend this resource as starting point to learn more: [Basic shapes - SVG: Scalable Vector Graphics | MDNThere are several basic shapes used for most SVG drawing. The purpose of these shapes is fairly obvious from their names. Some of the parameters that determine their position and size are given, but an element reference would probably contain more accurate and complete descriptions along with other…![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Basic%5FShapes?ref=gorillasun.de) Learn more about some of the basic SVG shapes. ### Creating your own Renderer With this you should be equipped with enough information to put together your own little renderer that can construct SVGs in a manner that suits your needs. Julien's renderer is very elaborate and supports most if not all possible shapes that you can also create with P5. And the way that it's done is pretty neat; the renderer is actually it's own class with several helper functions that aim to reduce redundancies. For instance, we have a multi purpose appending function that takes as input an arbitrary element and appends it to the body of the main SVG: ```javascript drawElmt(svgElmt){ this.elmtDraw.appendChild(svgElmt); } ``` Then whenever a particular element is created we can invoke this function to append it. There's also functions that handle groupings as well as nested groupings of SVG elements by keeping track of them within a stack-like array. If you want to learn more about SVG groups, there's this really cool resource on the topic by Sara Soueidan: [Structuring, Grouping, and Referencing in SVG — The, , and Elements![](https://www.sarasoueidan.com/apple-touch-icon.png)![](https://www.sarasoueidan.com/assets/images/logo/sara-illustration.png)](https://www.sarasoueidan.com/blog/structuring-grouping-referencing-in-svg/?ref=gorillasun.de) ### Saving the SVG To export the SVG we make use of the Blob object in javascript. Following Julien's manner of doing this: ```javascript svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); var svgData = svgEl.outerHTML; var preface = '\r\n'; var svgBlob = new Blob([preface, svgData], {type:"image/svg+xml;charset=utf-8"}); ``` Since we created our SVG via the html **** tag, we need to go through some extra steps to bundle it up as a standalone SVG element. For this purpose we need to set the **xmlns** attribute of the outermost root **** tag. This is to specify that the document is in fact an SVG. Next we want to get the entire tag by fetching it through the **outerHTML** property, which in contrast to the **innerHTML** property, that is probably more commonly used, returns the body of an HTML element in addition to the tag of the element itself. We can use the Blob object to get our SVG out of JavaScript. This object is like a container that can hold different data types, including our SVG. To create a Blob object that holds our SVG, we need to use the Blob constructor and give it an array of data that includes the `` tag, the SVG code itself, and specify that the data in the blob is an SVG. This way, we can save the SVG code as a file. And finally to download the SVG: ```javascript var svgUrl = window.URL.createObjectURL(svgBlob); var downloadLink = document.createElement("a"); downloadLink.href = svgUrl; downloadLink.download = name; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); ``` We create a virtual download link, point it to the blob object, momentarily append this download link to the page, then simulate a click on this link to make the browser download the SVG and then detach the link from the page again. Neat, right? You'll probably want to trigger this code when a specific button is pressed, which can be done with an event listener or the **keyPressed()** function that comes with P5 out of the box. Here's an example of all that we've discussed so far: ### Converting SVGs to Canvas Elements One final thing that we might want to do with our SVG, is to convert it into a canvas element with varying resolutions. For this Julien had a nice link as a comment in his code, point to: [How to render a SVG string/file onto a canvas and export it to PNG or JPEG with a custom resolution (preserving quality) in JavaScriptLearn how to easily render an SVG string into a canvas and then export it to PNG or JPEG with the size that you want without losing quality.![](https://cdn.ourcodeworld.com/assets/icons/mstile-310x310.png)Our Code WorldCarlos Delgado![](https://cdn.ourcodeworld.com/public-media/articles/export-svg-png-jpeg-javascript-60e8bd76016dd.jpg)](https://ourcodeworld.com/articles/read/1548/how-to-render-a-svg-string-file-onto-a-canvas-and-export-it-to-png-or-jpeg-with-a-custom-resolution-preserving-quality-in-javascript?ref=gorillasun.de) You can check out the post for the details, but essentially it boils down to encoding the SVG as image data with the **encodeURIComponent()** function and then setting it as the **src** attribute of an img that gets rendered to our canvas: ```javascript // 1. Fetching the rendering context of the canvas we want to draw to let canvas = document.getElementById('myOutputCanvas'); let ctx = canvas.getContext("2d"); // 2. Creating an Image let img = new Image(); // 3. Rending this image in the canvas img.onload = function() { ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height); } // 4. Setting the source of the image to our SVG as encoded Data URL img.src = "data:image/svg+xml;charset=utf-8,"+encodeURIComponent(`\r\n${svg.outerHTML}`); ``` The width and height of this canvas will determine the dimensions of the SVG. P5 provides a useful createGraphics() function to create an offscreen canvas which you could use for this purpose. I wrote a bit more about this graphics buffer element here: [The P5 Graphics BufferIn this post we’ll have a look at the P5JS graphics buffer and how to effectively use it in your P5 sketching practice. We’ll also create a variation of the 10 PRINT pattern that repeats seamlessly.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/bannerg.png)](https://www.gorillasun.de/blog/the-p5-graphics-buffer/) ## Closing Thoughts And that's about it! If you end up putting together your own little set of functions to export SVGs and find something interesting let me know. An interesting additional thing in Julien's code is that it also supports p5 push() and pop() like operations as well as the translate() and rotate() functions via matrix operations. I might cover them in a future post! Another resource that I want to point out here is SVGKit, which is a library that can mirror rendering context operations and outputs SVGs, I haven't tried it myself yet but it seems like a viable alternative if you don't want to write your custom code: [SVGCanvas![](https://sourceforge.net/favicon.ico)Jason Gallicchio![](https://svgkit.sourceforge.net/logo.png)](https://svgkit.sourceforge.net/SVGCanvas.html?ref=gorillasun.de) Thanks for reading! Cheers and happy coding! ### Gorilla Recap 1 URL: https://www.gorillasun.de/blog/gorilla-recap-1/ Last updated: 2023-12-19T23:12:40.000Z Hey everyone, it's Monday, and that means it's time for the weekly Gorilla Recap! I'm actually following through on it! So, here's what I did last week, the new articles that are up on the blog, sketches I worked on and other interesting reads from the past week. > Hey everyone, I'm starting a weekly newsletter! 🗞️📫 > > The first issue of Gorilla Recaps is out not! Read it here and let me know what you think 👇[https://t.co/LvNLFuWl5L](https://t.co/LvNLFuWl5L?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 17, 2023](https://twitter.com/gorillasu/status/1647868816649592833?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) You should definitely also check out @sableRaph's weekly creative coding newsletter (If you're reading this you probably already do): > A warm welcome to this week's instalment of Creative Code News, coming to you this week from sunny Los Angeles! 🌴[https://t.co/zlCTb0ze7t](https://t.co/zlCTb0ze7t?ref=gorillasun.de) > > Make sure to follow and check back every Tuesday for new issues! 📰 [pic.twitter.com/WYmD3SU8tf](https://t.co/WYmD3SU8tf?ref=gorillasun.de) > > — Raphaël de Courville (he/him) 𓅬 (@sableRaph) [April 19, 2023](https://twitter.com/sableRaph/status/1648569213626515457?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This week's header is by yours truly. # Gorilla Articles and Sketches 1. Beginning of this week I worked on an implementation of the Quickhull algorithm, which can be used to compute the convex hull of a set of points. Incredibly useful for real-life problems, but I have yet to find a use for it in my creative coding. I summarized the required steps to implement the algo in this post: [Quickhull Algorithm for Convex HullsOne method for finding the convex hull of a point set is the Quickhull algorithm. It makes use of the divide and conquer paradigm, and builds the convex hull in a recursive manner. This post is a break-down of a Quickhull implementation.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner-2-.jpg)](https://www.gorillasun.de/blog/quickhull-algorithm-for-convex-hulls/) > Implemented the Quickhull algo. It recursively finds the convex hull of a set of points! [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#programming](https://twitter.com/hashtag/programming?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/UORl0okhpZ](https://t.co/UORl0okhpZ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 17, 2023](https://twitter.com/gorillasu/status/1647915804359360512?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 1. I also finally found the time to have a look at the open-sourced Twitter code, which I've been meanign to do for a while. It's fascinating to see how a modern social media platform like Twitter operates behind the scenes. It is also interesting to discuss how such an algorithmic pipeline influences free speech on the platform, and if it is even possible to have completely untainted freedom of speech in that manner: > New post is up on the Blog! 🔖 This time around we'll inspect the Twitter algorithm, and see what it does behind the scenes! > > 🤫 Don't tell Twitter, but the link is in the replies... Why in the replies? Well, only one way to learn why the algorithm doesn't like URLs 👇 [pic.twitter.com/VJuRxUTPzK](https://t.co/VJuRxUTPzK?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 24, 2023](https://twitter.com/gorillasu/status/1650443283187879936?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [Everything we learned about the Twitter Algorithm so farElon Musk’s decision to open-source the algorithm that powers Twitter after acquiring in October of 2022, is a monumental event in social media history. In this post we’ll dive into everything that we’ve about the inner workings of the code so far.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/akshar-dave-mkTqZN1NzhY-unsplash-1-.jpg)](https://www.gorillasun.de/blog/everything-we-learned-about-the-twitter-algorithm-so-far/) 1. I continued working on this sketch of mine. I took the grid based contour walk code that I implemented two weeks ago and patched it in, and am now able to determine individual Tetris-like regions, rather than just the illusion of segmented regions that was previously made by filling the grid in with rectangles. I'm pretty happy with this generative system so far, and I think I can now start working on some textures and fill experiment with fillin out the different regions with patterns. > Probably doesn't look like much in comparison to the previous version -- however, now each individual region is it's own polygon -- in contrast to before where it was just a bunch of rectangles! [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/79lVPkvWeh](https://t.co/79lVPkvWeh?ref=gorillasun.de) [pic.twitter.com/9ap9q9mUa1](https://t.co/9ap9q9mUa1?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 20, 2023](https://twitter.com/gorillasu/status/1649010384584540163?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # Interesting Reads of the Week 1. Up until now I have been under the impression that one should be active on as many social media platforms as possible to maximize one's growth. However, now I'm coming around to thinking that this might not be so, and might actually be counter productive in the larger scheme of things, and might in a way even stifle your goals. I recently read this post on creator science by Jay Clouse, he writes: > \[...\] – we're all competing for a finite amount of global attention. And there are people who are putting way more time and effort into learning the ins and outs of that game – that's why they're winning! [The game within the game (why your growth may be slow)The fastest way to build an audience is to focus on doing one platform really well. I am absolutely convinced of this. It’s not the only way to build an audience and I’m not passing judgment that it is the best way – but I’m convinced that, objectively, the fastest way![](https://creatorscience.com/content/images/size/w256h256/2022/07/White-bg-circle-1600px.png)Creator ScienceJay Clouse![](https://creatorscience.com/content/images/2023/02/creatorscience_fallback_shadow-3.png)](https://creatorscience.com/game-within-game/?ref=gorillasun.de) 1. The controversy on AI generated imagery continues. Last week we observe an AI generated image win the Sony World Photography prize. The photographer says that he did it to provoke debate. [Photographer admits prize-winning image was AI-generatedGerman artist Boris Eldagsen says entry to Sony world photography awards was designed to provoke debate![](https://static.guim.co.uk/images/favicon-32x32.ico)The GuardianJamie Grierson![](https://i.guim.co.uk/img/media/078000b0fe3db3d5b3ab33e6c56f42cd614b1119/0_315_498_299/master/498.jpg?width=1200&height=630&quality=85&auto=format&fit=crop&overlay-align=bottom%2Cleft&overlay-width=100p&overlay-base64=L2ltZy9zdGF0aWMvb3ZlcmxheXMvdGctZGVmYXVsdC5wbmc&enable=upscale&s=86bd70cce86c5220314c7ea7c85b024e)](https://www.theguardian.com/technology/2023/apr/17/photographer-admits-prize-winning-image-was-ai-generated?CMP=fb%5Fgu&utm%5Fmedium=Social&utm%5Fsource=Facebook&fbclid=IwAR1WNBRDR6zPO16vhnk0Q3uWFTy9pHyzOFCYLOGYDQtSSmUbXjFY2RMX-g4#Echobox=1681750767) Last year we saw something similar on a smaller scale, where an AI generated image won the Colorado State Fair's Art contest, sparking a huge backlash from other artists with accusations of cheating. [An A.I.-Generated Picture Won an Art Prize. Artists Aren’t Happy.“I won, and I didn’t break any rules,” the artwork’s creator says.![](https://www.nytimes.com/vi-assets/static-assets/ios-ipad-144x144-28865b72953380a40aa43318108876cb.png)The New York TimesBy![](https://static01.nyt.com/images/2022/09/01/business/00roose-1/00roose-1-facebookJumbo.jpg)](https://www.nytimes.com/2022/09/02/technology/ai-artificial-intelligence-artists.html?ref=gorillasun.de) I would argue that the issue could potentially be solved by opening a new separate category for AI generated art, and put in place a meaningful method to judge and compare these submissions fairly. In the case of the photography contest, I'm not certain how much this stunt actually pushes the debate forward, except that better measures need to be put in place to avoid such deceptive attempts in the future. By analogy, this makes me wonder where the line falls regarding photoshop and the post-processing of images. Because technically, one could edit their photos at an atomic pixel-level and essentially reshape an image from the ground up into something completely different... how different is that from using a neural network to upsample these pixels? The problematic that emerges here, is that I don't really see an obvious way in which these images could be judged. It would take a jury that has some technical know how, or is at least to some extent acquainted with the tech, to adequately judge these submissions. But then again, I don't know how subjective the final verdicts of these contests generally are after all. 1. Amy Goodchild with another banger article on her blog. She recreates Sol Lewitt's wall drawings using chatGPT: [Midjourney takes on Sol LeWitt’s Wall Drawings — Amy GoodchildSol LeWitt’s ‘Wall Drawings’ aren’t actually drawings at all but, rather, instructions for drawings. These instructions have been implemented in many ways, by many different people, revealing how they are both prescriptive and ambiguous. Control over the final output lies somewhere between the ins![](https://images.squarespace-cdn.com/content/v1/5f33cddd6aff255aabb0c6cd/1598285066323-AE6AS241FTS6QP3C4OA6/favicon.ico)Amy GoodchildAmy Goodchild![](http://static1.squarespace.com/static/5f33cddd6aff255aabb0c6cd/5f37d09b551f154577577f01/6436c6ee39541628db228906/1681745235939/295+-+g.png?format=1500w)](https://www.amygoodchild.com/blog/midjourney-sol-lewitt?ref=gorillasun.de) 1. Jeff aka ippsketch with another process thread that I thoroughly enjoyed. I just love his stuff; it's simple but relatable, and at the same time always technically involved. For this one he draws inspiration form a book-cover: > 1 hour sketch ⚪️🔵🔴🟡 > I've started keeping notes and screenshots while I work. It's fun to go back and watch how a work develops. The step-by-step development of this sketch is documented in the thread below. > 1/10 [pic.twitter.com/QAWFV0n2Mu](https://t.co/QAWFV0n2Mu?ref=gorillasun.de) > > — Jeff / ippsketch (@ippsketch) [April 18, 2023](https://twitter.com/ippsketch/status/1648300644707467264?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) On this note, I also bought a book last week while at a book-thrift-store (is that a thing?). I have yet to dig into it, but I'm already quite excited about it! Here's a sneak peak: > I bought a book last week! It'll come in handy when I need some inspiration! 🔖 [#bauhaus](https://twitter.com/hashtag/bauhaus?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/gqLCj4dlvl](https://t.co/gqLCj4dlvl?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 24, 2023](https://twitter.com/gorillasu/status/1650439391876198400?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # Tip of the Week Serving responsive images over the web! One thing I have struggled with since I started with the blog was how to efficiently serve the images in my posts. Some of my posts have a large number of them in addition to GIFs and videos, hence it can quickly add up and slow down the overall page load speed. Nowadays I try to avoid the lossless PNG format and use JPEGs wherever I can, but there's an even better way to save on bandwidth, and that's the html srcset property: [Responsive images - Learn web development | MDNThat’s a wrap for responsive images — we hope you enjoyed playing with these new techniques. As a recap, there are two distinct problems we’ve been discussing here:![](https://developer.mozilla.org/favicon-48x48.cbbd161b.png)MDN Web Docs.logo-m{fill:var(--text-link)}![](https://developer.mozilla.org/mdn-social-share.cd6c4a5a.png)](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia%5Fand%5Fembedding/Responsive%5Fimages?ref=gorillasun.de) With the srcset property we essentially provide the browser with multiple different versions of the same image to choose from depending on the window's size and the resolution of the display. # Music for Coding This week I really enjoyed listening to 53 thieves while coding and writing: # Memes of the Week ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/IMG_2197.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/tabletop_roleplaying-1.png) > [pic.twitter.com/1uHAIrAGRq](https://t.co/1uHAIrAGRq?ref=gorillasun.de) > > — LaurieWired (@lauriewired) [April 22, 2023](https://twitter.com/lauriewired/status/1649850649805479936?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And that's about it! See you in next week's recap! Let me know what you think in the comments, and if you liked this newsletter recommend it to a friend! ### Everything we learned about the Twitter Algorithm so far URL: https://www.gorillasun.de/blog/everything-we-learned-about-the-twitter-algorithm-so-far/ Last updated: 2023-05-06T13:51:57.000Z **Be you a fan of Elon, or not, I think that the decision to open source the algorithm is a monumental event in social media history.** To-date, we've never seen anything like it. Generally the inner workings and source-code of social media platforms are kept under lock and key and are shrouded in secrecy. And that for a good reason: it simply wouldn't be in the companies' favor for users to understand how their algorithms work, and what mechanisms are in place to drive interactions, maximize screen-time and keep users engaged for extended periods of time. Although we're only getting a portion of the entire algorithm, it's surprising to see Elon actually follow through on his plan to open-source the code. In this post we'll cover everything that we have learned about the algorithm so far, have a look at the technologies that are used throughout the twitter pipeline, as well as the factors that make a good tweet. I'm quite late to the party as there's already been a number of changes and updates to the code, but let's walk through everything step by step: > Sharing another update on the changes we’ve made to our open source repos this week and a preview of what’s next 🧵[https://t.co/sF9ebF0s2X](https://t.co/sF9ebF0s2X?ref=gorillasun.de) > > — Twitter Engineering (@TwitterEng) [April 14, 2023](https://twitter.com/TwitterEng/status/1646999381521096704?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Preamble Late March of 2022, prior to Elon actually acquiring the site, he posted a poll on the platform itself asking if the source code should be made public: > Twitter algorithm should be open source > > — Elon Musk (@elonmusk) [March 24, 2022](https://twitter.com/elonmusk/status/1507041396242407424?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The poll ended with over 1.1 million votes, where 82.7% percent were in favor of open sourcing the code. This sparked a large debate and many articles were subsequently published on the topic, [speculating about the future of the platform and it's implications](https://time.com/6167099/twitter-employees-elon-musk-free-speech/?ref=gorillasun.de). Elon himself stated at the time: > I invested in Twitter as I believe in its potential to be the platform for free speech around the globe, and I believe free speech is a societal imperative for a functioning democracy. After a long back and forth, [acquiry of the platform was concluded in October 2022](https://www.bbc.com/news/technology-63402338?ref=gorillasun.de). It wasn't however until a year later (last month) after making the initial poll, that the [algorithm was actually open-sourced](https://github.com/twitter/the-algorithm?ref=gorillasun.de) and became accessible to the public. And which will be the main topic of discussion of this article. Twitter states: > The goal of our open source endeavor is to provide full transparency to you, our users, about how our systems work. If you're curious about the Twitter 'Algorithm', but feel that you need just a little bit more context on what an algorithm actually is, then read on. Otherwise you can skip ahead to the sections where we actually discuss the algorithm. ## Algorithms are not black magic > What is an Algorithm? Maybe this is a little bit of a silly question, but if someone asked you, could you give a clear and concise answer to this question? And would your answer be in line with other people's answers? We live in an age, where algorithms are made out to be like they're some sort of sorcery or black magic. Especially now that a lot of modern softwares incorporate components that make use of ML (Machine Learning) and AI (Artificial Intelligence). In their article on the open-sourcing of the Twitter algorithm, [CNN business paints a really blunt picture of what software developers do](https://edition.cnn.com/2022/04/19/tech/twitter-algorithm-open-source-elon-musk/index.html?ref=gorillasun.de): > Even those who can understand the code that goes into an algorithm don’t necessarily understand how it works. Consider, for example, how there’s often little more than a basic explanation from tech companies on how their algorithmic systems work and what they’re used for. The people who build these systems don’t always know why they reach their conclusions, which is why they’re commonly referred to as “black boxes.” This description really bothers me. Makes it seem like software devs don't really know what they do after all, and reinforces the stereotype that programmers just press buttons until things somehow magically work. When we refer to a system as a "black box" it usually means that when we peer inside of it, the internal representations are unintelligible to humans. That doesn't necessarily mean that we don't understand how and why they reach their conclusions. Fact is, computer code isn't black magic: it's a craft just like any other. I'm all on board for companies having to explain how their software products work, and have them held to a specific standard of transparency, but it's a two way street. Explaining how code works is often not a straight forward thing to do, simply because there's so many small atomical steps involved that contribute to a larger complex system. It's not that software devs don't know what their system does, it's just not an easy feat to have a complete mental model of such a huge system. Another recent can of worms that I'm unwilling to open, is the ridiculous TikTok congress hearing. It was a really hard watch, and is just one example of the gigantic disconnect that exists in our world today. If you're a congress-member in session for securing the country's data privacy, you should've at least done your homework and have a basic understanding what an app is and how it works. Just one out of many moments in the TikTok congress hearing. And just to be clear, I'm not in any way trying to side with TikTok here. Generally, I'm not a fan of these short-form video content platforms and how most social media platforms are metamorphosing into TikTok clones. ## Algorithms and Computer Code ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/image-3.png) [Meme Sauce](https://www.reddit.com/r/ProgrammerHumor/comments/61dfob/algorithm/?ref=gorillasun.de) Simply put, an algorithm is a set of instructions that accomplishes a certain task when executed. This instruction set can then be given to the computer to actually complete this particular task. Usually, the coder/programmer/software developer is the person that writes these instructions, in form of computer code and using a specific programming language. In a very rudimentary manner, programmers are similar to carpenters. Just like a carpenter designs and creates items from wood, that are then assembled into furniture, a programmer drafts and develops computer code that later becomes part of a larger software or system. Both professions require a lot of attention to detail, a slight mistake can have significant consequences down the line. It's important to note here that a single software often consists of multiple smaller algorithms, each of which solves a particular problem. Just like Santa's little helpers that do all sort of things, from taking care of the reindeers, to assembling the toys. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-16.png) Even chatGPT knows what it is! It's maybe a bit of a stretch to compare an algorithmic system like Twitter's recommendation system to a cookie recipe. A cookie recipe has like what, 5 steps maybe? If you get premade cookie dough then you really just have to put them in the oven and turn on the oven. The computer is not a smart thing. When you tell a person that they need to mix together the ingredients, they understand the implications; that they first need to get a bowl, then they have to put the individual ingredients in this bowl, then stir until a certain consistency is reached, and so on. The computer does not function in this manner. Writing code requires the programmer to explicitly and meticulously declare all of the individual instructions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-17.png) Computers are not smart after all. With all of this said, I think we've sufficiently set the scene and are ready to have a look at some parts of the Twitter code and see what they accomplish! ## The Recommendation System > Most of the recommendation algorithm will be made open source today. The rest will follow. > > Acid test is that independent third parties should be able to determine, with reasonable accuracy, what will probably be shown to users. > > No doubt, many embarrassing issues will be… [https://t.co/41U4oexIev](https://t.co/41U4oexIev?ref=gorillasun.de) > > — Elon Musk (@elonmusk) [March 31, 2023](https://twitter.com/elonmusk/status/1641874582473695246?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) One portion of the code that has been open-sourced so far constitutes the recommendation system. With the recommendation system we refer to the brain that powers the home-timeline's 'For You Feed'. Twitter's engineering team released a [complementary article](https://blog.twitter.com/engineering/en%5Fus/topics/open-source/2023/twitter-recommendation-algorithm?ref=gorillasun.de), where they explain in detail how the this algorithm works. It's actually genuinely super interesting to see the chain of different methods that go into such a pipeline. > c'mon twitter algorithm! daddy needs a new pair of shoes! [pic.twitter.com/xrfHFJ3aHz](https://t.co/xrfHFJ3aHz?ref=gorillasun.de) > > — Cameron Bradford (@camerobradford) [September 22, 2020](https://twitter.com/camerobradford/status/1308247062551683072?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) In their article they call this recommendation system the home-mixer (as it is named in the source code), which builds your feed whenever you open the home timeline or refresh it. The article uses a fair bit of technical jargon, and does a good job at staying hazy on some points, but I'll try to translate to the best of my ability. One of the best technical recaps I have found on the topic was by Sumit Kumar, which reiterates on the everything but in greater technical detail. Give it a read when you're done here. [Twitter’s For You Recommendation AlgorithmTwitter has open-sourced a majority of its recommendation algorithm. It offers an exciting opportunity for researchers, industry practitioners, and RecSys enthusiasts to take a close look at how Twitter computes the recommended feed for the For You page. This article described Twitter’s end-to-end r…![](https://blog.reachsumit.com/apple-touch-icon.png)xxxxSumit Kumar![](https://blog.reachsumit.com/posts/2023/04/the-twitter-ml-algo/featured-image-preview.webp)](https://blog.reachsumit.com/posts/2023/04/the-twitter-ml-algo/?ref=gorillasun.de) In the article they explain that their recommendation pipeline consists of three main stages. We'll have a look at each one in the order that they get invoked whenever the home-mixer gets to work. Although a lot of the methods that are used throughout their pipeline have already been released in form of technical publications, this is the first time that we can see how each component fits into the big picture. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/image-4.png) Twitter's Recommendation System ### Candidate Sourcing Candidate Sourcing is the procedure that gathers all of the tweets that could be of interest to a certain user. This is a mix of 1500 tweets from accounts that you follow, as well as accounts that you don't follow. These two sources are labeled as In-Network and Out-of-Network sources respectively. For most social media platforms it makes sense to represent users internally as a connected graph, where users are represented as nodes and follows are represented by edges between these nodes. Hence the term **Network**. I'm not entirely certain what the nodes and edges look like and exactly how much data they hold, but there's more than a decade of research behind the data structures and algorithms that power Twitter. Over the years they've released a number of papers for methods that they use internally to traverse and find data on this network. Most notably are the two algorithms [RealGraph](https://www.ueo-workshop.com/wp-content/uploads/2014/04/sig-alternate.pdf?ref=gorillasun.de) and [GraphJet](https://www.vldb.org/pvldb/vol9/p1281-sharma.pdf?ref=gorillasun.de), which will discuss in this section. #### In-Network Sources To aggregate Tweets from people that one follows, the RealGraph framework is used. RealGraph is a method that can estimate the likehood of a certain user interacting with a certain Tweet based off of a history of previous interactions. The interactions are stored within the directed edges between users. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-18.png) It gets a lot more technical if you have a look at the paper, but essentially this internal graph representation is quite intricate, there's different types of edges depending if the two users follow each other or it's only one directional, or wether they only interact but don't follow each other, etc. And in turn that determines what features get stored on these edges. This system has probably changed a lot since the paper has been released, but it gives some meaningful insights into how you should be using Twitter if you want to be seen and heard by people: you have to interact with others and incite interactions from them (replies, liking, retweeting, etc.). The network remembers. Later on, these edge features are then passed to a logistic regression model to estimate if a particular tweet is likely to incite interaction from a user, and thus helps rank the relevancy of these tweets. Logistic regression is essentially a statistical model that can predict the likelihood of something happening given some other information. This part of the pipeline is apparently in the process of being redesigned however. Sumit Kumar also points out that Twitter makes use of Google's PageRank algorithm to estimate user's overall influence on other users, however I don't fully understand where it fits into the picture. [Twitter calls it TweepCred](https://github.com/twitter/the-algorithm/blob/main/src/scala/com/twitter/graph/batch/job/tweepcred/README?ref=gorillasun.de) (a tweep is a twitter user, hence short for twitter user credibility). > In the Tweepcred project, the PageRank algorithm is used to determine the influence of Twitter users based on their interactions with other users. The graph is constructed by treating Twitter users as nodes, and their interactions (mentions, retweets, etc.) as edges. The PageRank score of a user represents their influence in the network. #### Out-of-Network Sources To aggregate tweets from sources that a user doesn't follow Twitter makes use of their GraphJet engine. GraphJet evolved from it's predecessors [Cassovary](https://github.com/twitter/cassovary?ref=gorillasun.de), a previous big graph processing library, as well as their initial user recommendation system [WTF (Who to Follow)](https://web.stanford.edu/~rezab/papers/wtf%5Foverview.pdf?ref=gorillasun.de). In addition to the technical details, the GraphJet paper recounts a chronology of previous systems, why they were abandoned, how the system was redesigned from scratch multiple times over and how everything ultimately culminated in the GraphJet engine. This GraphJet engine can then be used to effectuate a number of different queries, one of which generates a list of tweets that a user might be interested in. Albeit the cornucopium of technical intricacies, the strategy behind the aggregation of such a list is conceptually simple: potentially interesting tweets are found by performing a random walk on the graph. The catch here is that the 'random walk' through the graph isn't *entirely* random; there's actually a bunch of rules at play in the background and it's called a SALSA query. Don't bring out the tacos just yet, [SALSA stands for **S**tochastic **A**pproach for **L**ink-**S**tructure **A**nalysis](https://en.wikipedia.org/wiki/SALSA%5Falgorithm?ref=gorillasun.de) and is another PageRank method that can determine the relevancy of traversed tweets. The special thing about GraphJet is that it can do all of this in real-time, which is an impressive feat considering that 400 billion events have to be processed at any given moment. > Our first approach is to estimate what you would find relevant by analyzing the engagements of people you follow or those with similar interests. We traverse the graph of engagements and follows to answer the following questions: > > - What Tweets did the people I follow recently engage with? > - Who likes similar Tweets to me, and what else have they recently liked? Tweets fetched by this GraphJet query however only make up roughly 15% of the entire 'For You Feed', the majority of the Out-of-Network tweets are collected through another type of representation called [SimClusters](https://www.kdd.org/kdd2020/accepted-papers/view/simclusters-community-based-representations-for-heterogeneous-recommendatio?ref=gorillasun.de) (Similarity Clusters), which basically refers to groupings of users that share similar interest, the Twitter team describes them as follows: > SimClusters discover communities anchored by a cluster of influential users using a [custom matrix factorization algorithm](https://github.com/twitter/sbf?ref=gorillasun.de). There are 145k communities, which are updated every three weeks. Users and Tweets are represented in the space of communities, and can belong to multiple communities. Communities range in size from a few thousand users for individual friend groups, to hundreds of millions of users for news or pop culture. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/image-5.png) The largest SimClusters on Twitter. ### Ranking Tweet ranking happens via two machine learning models, a light ranker called E**arlybird** consisting of a logistic regression model and a heavy ranker that is a massive neural network called **MaskNet**. As their names suggest, the latter is computationally more expensive than the former. What isn't explained very clearly is where these rankers are employed in the pipeline and in what combination. I assume that the light ranker is used during the search for candidate tweets to evaluate their fitness in the search index, whereas the heavy ranker is used once the list of 1500 candidate tweets has been agregated, filtering out the most relevant ones to be served. However I could be wrong on this one, and apparently it seems that the light-ranker will also be reworked/replaced soon by a newer version. A detailed resource for this portion of the algorithm is this in depth article by Pasha Kamishev. In his article he dives into the code, reviews specific portions and questions the purpose of different the parts: [Twitter Algorithm Review - part 5 - looking at the codeA descent into madness![](https://substackcdn.com/icons/substack/apple-touch-icon-1024x1024.png)PashaNomicsPasha Kamyshev![](https://substackcdn.com/image/youtube/w_728,c_limit/0zO4g1kbiMQ)](https://pashanomics.substack.com/p/twitter-algorithm-review-part-5-looking) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-21.png) #### The Light Ranker - Earlybird > The Earlybird light ranker is a logistic regression model which predicts the likelihood that the user will engage with a tweet. It is intended to be a simplified version of the heavy ranker which can run on a greater amount of tweets. Logistic regression is essentially a statistical model that predicts a binary outcome, such as yes or no. And in this case we are trying to predict whether a given tweet is relevant or not. This prediction is based on the relationship of a number of given independant variables, which in our case are static and real-time tweet features. The static features of a tweet consist of it's language, if it has a link, if it has an image, etc. Real-time features on the other hand are number of likes, retweets, replies, etc. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/image-6.png) #### The Heavy Ranker - MaskNet The heavy ranker is one of the final stages of the funnel and is explained in the [github's readme](https://github.com/twitter/the-algorithm-ml/tree/main/projects/home/recap?ref=gorillasun.de): > The model receives features describing a Tweet and the user that the Tweet is being recommended to \[...\]. The model architecture is a parallel [MaskNet](https://arxiv.org/abs/2102.07619?ref=gorillasun.de) which outputs a set of numbers between 0 and 1, with each output representing the probability that the user will engage with the tweet in a particular way. Without going into how neural networks work internally, you can think about them as prediction models that can take one, two or many inputs and then return multiple ouputs as well. In this case we're feeding a bunch of information about the candidate tweet, and a bunch of information about the user that we want to present this tweet to, into the model. The model then spits out a bunch of numbers that estimate the likelihood of the user interacting in different ways with the tweet, which is subsequently combined into a final score. If this final score exceeds a certain threshold the tweet proceeds to the next stage of the pipeline, otherwise it gets discarded. This model should be fairly accurate as there's plenty of training data already since every little interaction gets recorded by Twitter. Why is it called [MaskNet](https://arxiv.org/abs/2102.07619?ref=gorillasun.de)? It's a special type of neural network that has been specifically developed for the purpose of estimating click-through rate, not by Twitter per se, but they adapted a version for their own purposes. The claims of Twitter's algorithm being a 'black box' are most likely referring to this stage of the pipeline. Neural Networks in general are considered black boxes, not because we don't understand how they work, but because we don't have a good explanation on how they arrive at particular outputs. We are however making progress in this regard with efforts like [explainable AI](https://cloud.google.com/explainable-ai?ref=gorillasun.de). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-22.png) ### Heuristics and Filtering The last step in the pipeline is a set of filters that further cleans-up the list of potential tweets that will be served to the viewer: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-23.png) Naturally we could still talk in much more detail about part of the pipeline, at this point however we've covered the full extent of the Twitter pipeline and all of it's intricacies. ## On Tweeting - Discovered Best Practices Besides revealing how the different components of the pipeline are chained together, the code also gives insight into the factors that affect the ranking of tweets. Factors that us tweeps can influence, and use to our advantage to increase the reach of our tweets. The different features of a tweet are weighted differently, and can have a drastic effect on whether your tweet will be seen or not. Jacky Chou took a gander at the relevant portion of the code and provides a cheat sheet of best practices: > The Twitter algorithm cheat sheet aka ranking factors for dummies. Bookmark this tweet so you can refer to it later. > > Given replies/comments are 1x boost. > > Positive factors: > 1\. Likes, 30x > 2\. Retweets, 20x > 3\. Images or videos, 2x > 4\. English UI (0.5x), tweet (0.2x) > 5\. Follows… [pic.twitter.com/V3HDcHGACK](https://t.co/V3HDcHGACK?ref=gorillasun.de) > > — Jacky Chou (buying niche sites up to $1m) (@indexsy) [April 1, 2023](https://twitter.com/indexsy/status/1642127498036264961?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Overall the biggest influencing factors are likes and retweets which give a massive boost to your tweet's score. This makes me wonder if I should start liking my own tweets immediately as soon as I post them or not? Because that is something that I haven't been doing 🤔 Besides that it's important to provide a complete tweet that has some grammatically correct text, an image, doesn't go overboard with hashtags, doesn't contain a URL etc. It's important to note here that these boosts aren't exactly multiplicative factors: > Don't think so actually, because comments/replies are 1x, wouldn't make sense for it to be 0 impact, especially after my experiment:[https://t.co/VkhYNh7K9L](https://t.co/VkhYNh7K9L?ref=gorillasun.de) > > — Jacky Chou (buying niche sites up to $1m) (@indexsy) [April 2, 2023](https://twitter.com/indexsy/status/1642334996555001856?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) These things might change however in the future depending on community feedback. > 10\. In the current light ranking model (Earlybird), tweets with images & videos seem to get a nice 2x boost → [https://t.co/gbC5sh86MW](https://t.co/gbC5sh86MW?ref=gorillasun.de) > > However, this is an old model that Twitter is planning to rebuild completely, so things might change → [https://t.co/asg23uoh4S](https://t.co/asg23uoh4S?ref=gorillasun.de) [pic.twitter.com/hgZXR1xWz5](https://t.co/hgZXR1xWz5?ref=gorillasun.de) > > — Steven Tey (@steventey) [April 1, 2023](https://twitter.com/steventey/status/1642000105212444674?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Aftermath and Implications What is the aftermath of open-sourcing the Algorithm? What have we actually learned about how Twitter works? A great read for this is a post by The Atlantic: [The New ‘Transparent’ Twitter Isn’t Very TransparentElon Musk offered a rare look into the social platform’s algorithm. Experts say you shouldn’t take it too seriously.![](https://cdn.theatlantic.com/_next/static/images/apple-touch-icon-152x152-aafde20dd981a38fcd549b29b2b3b785.png)The AtlanticCaroline Mimbs Nyce![](https://cdn.theatlantic.com/thumbor/ZdZbVChgeiXElRrf23d1HjTbU-U=/0x102:4792x2598/1200x625/media/img/mt/2023/04/twitter_algorithm_2/original.jpg)](https://www.theatlantic.com/technology/archive/2023/04/elon-musk-twitter-algorithm-code-public/673642/?ref=gorillasun.de) Many parts of the puzzle are still missing, what we got is a highly redacted version of the code that actually powers Twitter. It is a bit unclear at this point how this will affect the future of the platform, if it will actually incite change or if Twitter will keep doing their own thing behind the curtain. Skepticism remains high among researchers as we're not getting a whole lot to work with: > But none of the code Twitter released tells us much about potential bias or the kind of “behind-the-scenes manipulation” Musk said he wanted to reveal. “It has the flavor of transparency” \[...\] [What did Twitter’s ‘open source’ algorithm actually reveal? Not a lot. | EngadgetThe code Twitter released omitted important details about how “the algorithm” actually works, according to engineers who have studied it…![](https://s.yimg.com/kw/assets/favicon-160x160.png)Engadget![](https://s.yimg.com/uu/api/res/1.2/itcHdZj8M9Y4BYdnZvnimw--~B/Zmk9ZmlsbDtoPTYzMDtweW9mZj0wO3c9MTIwMDthcHBpZD15dGFjaHlvbg--/https://media-mbst-pub-ue1.s3.amazonaws.com/creatr-uploaded-images/2022-11/47874440-65d5-11ed-be9c-500249f673ee.cf.jpg)](https://www.engadget.com/what-did-twitters-open-source-algorithm-actually-reveal-not-a-lot-194652809.html?guccounter=1&guce%5Freferrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce%5Freferrer%5Fsig=AQAAALjxFlsUa4tevsEaOCv8HIPkpw%5FO3znh1048jXhQceJoicnhLLEImhCYh14p3aNlEf4-KdBHQCHhckwfCk7%5FBVq6K9rvrKZDOQbETLUYuDBkpV51Pv-y-YAOpwfTAfOlvMlg3YI7zBmsQbqLHkH0C0tTrN97wMhbkhBpx0EkJZSj&ref=gorillasun.de) This comes alongside changes in the pricing of the API, rendering it unaffordable to many. Independent devs and researchers will no longer be able to use these services: > $100 a month for hobbyists? That's not hobbyist tier pricing, lmao. RIP Twitter. > > — Dumpster Fire (@VanFlip10x) [March 30, 2023](https://twitter.com/VanFlip10x/status/1641558035717029889?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [Twitter announces new API pricing, posing a challenge for small developersFree, basic, and enterprise tiers are offered.![](https://www.theverge.com/icons/android_chrome_512x512.png)The VergeJon Porter / @JonPorty![](https://cdn.vox-cdn.com/thumbor/l0_-U17tDi8ziXYkFrU9UCkzXCM=/0x0:3000x2000/1200x628/filters:focal(1500x1000:1501x1001)/cdn.vox-cdn.com/uploads/chorus_asset/file/23926015/acastro_STK050_06.jpg)](https://www.theverge.com/2023/3/30/23662832/twitter-api-tiers-free-bot-novelty-accounts-basic-enterprice-monthly-price?ref=gorillasun.de) It seems that most changes to the platform and it's auxiliary services in the past months have been centered around boosting revenue, rather than being a service to those who use the platform. Moreover, the snapshot of code that we've been granted access to brings up many ontological question. For instance, a big problematic that I see with ranking tweets is that it clashes with the idea of bolstering free speech, which I thought was the whole point, and that Musk is trying to make the platform all about. For instance, a tweet that contains a link is ranked lower than an identical one without a link... what's the correlation here? Shouldn't it be more about what it is linking to rather than it including a link? Wouldn't it be better to look at the domain authority of the linked resource rather than condemn the tweet alltogether from the start? And this problematic is not just limited to the *has\_link* ranking criteria, but applies to the other ones as well. Why should a Twitter Blue user have their tweets boosted and have more reach that way? How does this agree with the idea of free speech? [Elon Musk’s Free-Speech Charade Is OverNow that the mogul has swung Twitter to the right, conservatives no longer believe that social-media policies violate the First Amendment.![](https://cdn.theatlantic.com/_next/static/images/apple-touch-icon-152x152-aafde20dd981a38fcd549b29b2b3b785.png)The AtlanticAdam Serwer![](https://cdn.theatlantic.com/thumbor/rLkzCsNvm8YDiPDmaYLtRj1DPgo=/0x41:1952x1058/1200x625/media/img/mt/2023/04/original/original.jpg)](https://www.theatlantic.com/ideas/archive/2023/04/elon-musk-twitter-free-speech-matt-taibbi-substack/673698/?ref=gorillasun.de) ## Concluding Thoughts Although the open-sourced portion of code gives some insights into the inner workings of Twitter, it is ultimately not certain what other things go on behind the scenes and if this is actually the same code that Twitter uses in production. Although the tech being cutting-edge and impressive, I have the impression that it is incredibly bloated and convoluted. I have absolutely no idea how they're able to maintain any of it. > No doubt, many embarrassing issues will be discovered. [pic.twitter.com/r3rgFJ1HHa](https://t.co/r3rgFJ1HHa?ref=gorillasun.de) > > — Ron Pragides  (@mrp) [April 1, 2023](https://twitter.com/mrp/status/1642189698306306050?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Additionally, I have concerns about the future of the platform. I use Twitter to communicate with the outside world, and to share my writings, art and creations. Many have already left Twitter in favor of other platforms, like the decentralised Mastodon: [Getting Started with MastodonMastodon is where all the cool kids are right now. If you’ve been meaning to join the Twitter alternative and don’t know where to start, then this post got you covered. We’ll go over how to sign up to Mastodon and how everything on the platform works.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/thumb-1--1--1.png)](https://www.gorillasun.de/blog/getting-started-with-mastodon/) Albeit all of this, I think I will stick around for now and assess once there's new developments. You'll always find me on this blog, so there's no worries about that. As always, thanks for reading! If you enjoyed reading this post you might also enjoy: [Creative Coding: The New EraCreative coding is a new interdisciplinary art form that bridges the gap between technologists and artists. This article explores what it means to be a code artist, what it means to make art with code, and how we approach this new discipline today.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/newerabanner2.png)](https://www.gorillasun.de/blog/creative-coding-the-new-era/) ### Quickhull Algorithm for Convex Hulls URL: https://www.gorillasun.de/blog/quickhull-algorithm-for-convex-hulls/ Last updated: 2026-07-31T12:02:24.000Z ## On Convex Hulls Let's begin with the assumption that we have a set of points on a 2 dimensional plane. Now we'd like to roughly approximate the area that these points occupy and find the smallest possible **convex** polygon that encloses these points. How would we do this? What actually is a convex polygon? Convex polygons are shapes that bulge outwards in every direction. Meaning that if you were to pick any two random points inside of such a shape, you would be able to draw a straight line that connects these two points, without having this line cross any of the shape's boundaries. Circles for example, are convex shapes, just like triangles, rectangles and really any [regular polygon](https://en.wikipedia.org/wiki/Regular%5Fpolygon?ref=gorillasun.de). ![A circle, rectangle and triangle, that contain lines to show that they are convex.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/convexshapes.png) Regular polygons are convex shapes. Concave shapes, on the other hand, are shapes that have at least one dent, where a straight line would end up crossing the boundaries of that shape. For instance, a crescent shape would be considered concave: ![A crescent shape as an example of a concave shape.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/canvas.png) Example of a concave shape. Convex hulls are super useful for solving a variety of different real life problems, generally because in many scenarios they have useful and advantageous properties. For instance, convex shapes are **closed under intersection**, meaning that the intersection of two convex shapes is in turn also always a convex shape. These properties make it super easy to compute certain operations on convex shapes (we will see an example later). ![Multiple shapes positioned on a grid exemplifying the intersections between convex shapes.](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/convexintersections.png) The intersection of two convex shapes is also a convex shape. But let's get back to our example. In this manner, the convex hull is the smallest possible convex polygon that contains all of the points in the set. If the points in our set were tangible entities in the real world, we could simply find their convex hull by spanning a rubber band around them, such that it spans the outermost points of the set. But lest you want to implement an entire physics simulation to accomplish this approach, there's a number of established methods for this purpose. In the next sections we'll have a close look at the inner workings of the Quickhull algorithm, that can be used to compute the convex hull of a set of points! ## Quickhull Algo Pseudocode Similarly to the [Bowyer-Watson Triangulation Algo](https://www.gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation/) that we implemented last year, this time around we'll also start from a [snippet of pseudo-code that can be found on Wikipedia](https://en.wikipedia.org/wiki/Quickhull?ref=gorillasun.de). If you'd like to give it a shot, and try to implement the pseudo-code by yourself before reading on, now's your chance! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-56.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-57.png) [Quickhull Algorithm Pseudocode from Wikipedia.](https://en.wikipedia.org/wiki/Quickhull?ref=gorillasun.de) Otherwise give the following two functions a quick read 👇 the entire algo consists of two functions. The first of them is kind of a setup function that is required to get ball rolling: ``` Input = a set S of n points Assume that there are at least 2 points in the input set S of points function QuickHull(_S_) is _// Find convex hull from the set S of n points_ Convex Hull := {} Find left and right most points, say A & B, and add A & B to convex hull Segment AB divides the remaining (_n_ − 2) points into 2 groups _S1_ and _S2_ where _S1_ are points in _S_ that are on the right side of the oriented line from _A_ to _B_, and _S2_ are points in _S_ that are on the right side of the oriented line from _B_ to _A_ FindHull(_S1_, _A_, _B_) FindHull(_S2_, _B_, _A_) Output := Convex Hull end function ``` The second function, is the one that actually constructs the convex hull: ``` function FindHull(_Sk_, _P_, _Q_) is _// Find points on convex hull from the set Sk of points_ _// that are on the right side of the oriented line from P to Q_ **if** _Sk_ has no point **then** **return** From the given set of points in _Sk_, find farthest point, say _C_, from segment _PQ_ Add point _C_ to convex hull at the location between _P_ and _Q_ Three points _P_, _Q_, and _C_ partition the remaining points of _Sk_ into 3 subsets: _S0_, _S1_, and _S2_ where _S0_ are points inside triangle PCQ, _S1_ are points on the right side of the oriented line from _P_ to _C_, and _S2_ are points on the right side of the oriented line from _C_ to _Q_. FindHull(_S1_, _P_, _C_) FindHull(_S2_, _C_, _Q_) end function ``` If you noticed, there's a bit of an odd thing happening towards the end of the second function... it makes a call to it's own function signature?! The Quickhull algorithm is [recursive](https://en.wikipedia.org/wiki/Recursion%5F%28computer%5Fscience%29?ref=gorillasun.de). Recursion in programming refers to a technique where a function calls itself to solve a problem. Recursion is usually used when a larger task can be split up into several smaller sub-tasks that mirror the problematic of the original task. Solving these smaller tasks ultimately culminates into solving the bigger overarching problem at hand. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/ozymandias_2x.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/tabletop_roleplaying.png) [Comics by Ozymandias](https://xkcd.com/1557/?ref=gorillasun.de) Suppose you want to tidy up a messy room; to make this more manageable we could start by cleaning each corner individually before we move on to another. For each individual corner, you could then in turn start by clearing the elevated surfaces such as the shelves and desks first, then move on to surfaces closer to the ground. Equivalently, each surface can be split into smaller regions to clean and so on, until the task becomes small enough that it no longer makes sense to divide it further sub-tasks. That is roughly how recursion works. This way of solving problems is also often referred to as the [Divide and Conquer](https://en.wikipedia.org/wiki/Divide-and-conquer%5Falgorithm?ref=gorillasun.de) paradigm. Where we divide a problem into smaller tasks, conquer these smaller sub-tasks and then combine their solutions into a larger solution for the overall problem. The Quickhull algorithm is a recursive divide and conquer algorithm. ## Algorithm Breakdown Now that we've set the scene and covered the necessary related concepts, let's discuss the code a little bit more in detail. The initialization steps in the first function: 1. Given a set of points **S**, we'll find the two points **A** and **B**, that have a minimum and maximum x coordinate among all points in the set. These two points are with certainty part of the convex hull, because they make up the horizontal extremities of the set. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/points1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/leftright.png) The leftmost and rightmost in the set are on vertices of the convex hull. 1. The line that connects these two extremities, splits the entire set of points into two halves. Here it's important to point out (pun not intended) that this line needs to be treated as a directed line, such that the two halves can be specified as the point sets that lie to the right of the directed line AB and the point set that lies to the right of the directed line BA. Computing the point sets in that manner will make things easier in the subsequent steps of the procedure. These two halves will serve as starting point (I swear pun not intended) to get the recursive procedure going, where they will be split into smaller and smaller point sets. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/line.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/halves.png) The two horizontal extremes form a line with which we can split the set into two halves. Starting out with the initial line and these two smaller point sets, the second function beings the recursive procedure: 1. Given a line (formed by two points that we'll call Q and P) as well as a set of points, where all the points in the set are positioned on one side of the line, we find the point that is furthest from this line. We call this point C. 2. This point lies on the extremity of the original set and is also essentially a vertex of the convex hull polygon. 3. With this new point we form a triangle with the two end points of the line. This triangle splits the given set of points into three subsets. 4. The set of points that falls inside of the triangle can be disregarded as none of these points could possibly be part of the convex hull. 5. The other two sets of points need to be processed recursively as they still contain points that belong to the convex hull. The first set being those points that fall on the right side of the directed line from point P to C and the other on the right side of the line going from C to Q. Here's a visualization of this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/line-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step22.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step33.png) Visualization of the steps in the recursive function. Essentially, starting a line, we find the furthest point towards that line, construct two new lines that connect that point with the endpoints of the previous line (forming a triangle). Then we repeat this procedure for the two new lines and the remaining points that fall outside of the triangle, until no points are left. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step1-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/step5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/final-1.png) Full Quickhull example. If recursion is new concept to you then that might be the hardest part of the process, here's a cool introduction: Before we get to implementing the procedure however, let's first discuss some necessary helper functions. ## Point Line Test An important part of the procedure is determining on which side of the line the points fall, which is required to subsequently split the point set into two smaller halves. We'll do this in a separate subroutine. There's a relatively simple formula for determining if a point is to the right or left of a line: \\( (x\_{1}-x)(y\_{2}-y)-(x\_{2}-x)(y\_{1}-y) \\) Where {x1, y1} and {x2, y2} are the coordinates of the end points of the line and {x, y} are the coordinates of the point that we are checking against. In code that would be: ```javascript // Source: https://stackoverflow.com/a/22668810/6688750 let d = (line.pt1.x - pt.x) * (line.pt2.y - pt.y) - (line.pt2.x - pt.x) * (line.pt1.y - pt.y) ``` This formula produces a number, where the sign of this number determines on which side of the line the point falls. If the number is positive the point falls on one side, if it is negative it falls on the other. If the value is zero then it means the point falls right on the line. A good [explanation for this point line test can be found here](https://math.stackexchange.com/questions/274712/calculate-on-which-side-of-a-straight-line-is-a-given-point-located?ref=gorillasun.de), including it as a screenshot as well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/banner-3-.jpg) Explanation of the point line formula. Then a complete function to split a given set of points into two halves would be: ```javascript function splitPoints(pts, line) { // Empty arrays that we'll fill with the two halves let S1 = [] let S2 = [] // Check formula for given point for (let n = 0; n < pts.length; n++) { let pt = pts[n] let d = (line.pt1.x - pt.x) * (line.pt2.y - pt.y) - (line.pt2.x - pt.x) * (line.pt1.y - pt.y) if (d < 0) { S1.push(pt) } else if (d > 0) { S2.push(pt) } } // Return the two new sets return [S1, S2]; } ``` In this manner we return the two halves in an array for the subsequent steps. ## Point Line Distance Another important function here is determining the distance from a given point to the line. I didn't reinvent the wheel for this either and used [the code from this SO answer](https://stackoverflow.com/a/1501725/6688750?ref=gorillasun.de), where we end up with the following functions: ```javascript function dist2(v, w) { return sq(v.x - w.x) + sq(v.y - w.y) } function distToSegment(p, v, w) { var l2 = dist2(v, w); if (l2 == 0) { return dist2(p, v); } var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; t = max(0, min(1, t)); return sqrt(dist2(p, { x: v.x + t * (w.x - v.x), y: v.y + t * (w.y - v.y) })); } function distancePointLine(pt, line) { return distToSegment(pt, line.pt1, line.pt2) } ``` To find the furthest point from the line, we need to loop over all of the points in the given set: ```javascript function findFurthest(S, line) { let maxD = 0 let idx = -1 for (let n = 0; n < S.length; n++) { let d = distancePointLine(S[n], line) if (d > maxD) { maxD = d idx = n } } return idx } ``` I think an important optimization that we can do here is combining this procedure and the previous one into one, such that we simultaneously halve the set and at the same time find the furthest points on both sides of the line. If you're a math whizz, and have ideas on how to do this, let me know. Alternatively, we could also use a data structure to not have to check all points and find the furthest one faster. Otherwise, I thought that it was adequately fast for my meager creative coding purposes. ## Implementation Now we can finally write the main code, and implement the entire procedure. To visualize things I'll be using the [p5 library](https://p5js.org/libraries/?ref=gorillasun.de), which provides a couple of functions that make it very straightforward to draw shapes to the canvas, such as points, lines, polygons and also lets us color them with different colors. Let's first setup a couple of things, like a procedure that can generate some random points to have our Quickhull algo run on: ```javascript let hullPts = [] let N_POINTS = 100 // number of points to be placed let randomPoints = [] // create the canvas with p5 and make some random points function setup(){ createCanvas(800, 800) randomPoints = placeRandomPoints(N_POINTS) } // samples N random points inside of a circle function placeRandomPoints(N){ let pts = [] for(let n = 0; n < N; n++){ let r = 300 * sqrt(random()) let theta = random() * TAU let x = 400 + r * cos(theta) let y = 400 + r * sin(theta) pts.push({x: x, y: y}) } return pts } ``` With a little bit of trigonometry we uniformly sample random points inside of a circle that has a diameter slightly smaller than the overall canvas size. This method for sampling points is exemplified in this tweet by Yazid: > PSA: How to get a uniform distribution of random points in a circle [pic.twitter.com/9ep9JT1kup](https://t.co/9ep9JT1kup?ref=gorillasun.de) > > — Yazid (@Yazid) [October 20, 2022](https://twitter.com/Yazid/status/1583031608382103553?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) We also set up an empty array in which we will store the points that are part of the convex hull. Now we can write the first function that creates the initial line from the horizontal extremes and creates the first split of the set: ```javascript function quickHull(){ // sort the array by X coordinate randomPoints.sort(function(a, b){return a.x - b.x}); // retrieve left-most and right-most points let leftMost = randomPoints[0] let rightMost = randomPoints[N_POINTS-1] // add points to the hull hullPts.push(leftMost) hullPts.push(rightMost) // create the directed lines let splitLine1 = new makeLine(leftMost, rightMost) let splitLine2 = new makeLine(rightMost, leftMost) // compute the two halves let splits = splitPoints(randomPoints, splitLine1) // begin the recursive steps findHull(splits[0], splitLine1) findHull(splits[1], splitLine2) } // line object for convenience function makeLine(pt1, pt2){ this.pt1 = pt1 this.pt2 = pt2 } ``` There's a bunch of things going on here already. The most convenient method for finding the horizontal extremities of the set, is by sorting the points with their respective x coordinates. Then we can simply select the first and last element in that sorted array. We will add these to the empty array that holds the vertices of the convex hull polygon. Next, we make use of a line object that we create for convenience purposes, and create, **not one, but two lines**. Remember, the direction of the line is important. Creating two separate lines, we can conveniently bake that direction in through the point order, which is simply reversed in the second line object. To get the two halves of the point set, we will make use of the function that we discussed in the [point line test](#point-line-test) section, which conveniently returns two new sets. That being done, we're ready to start recursing! At the end of the initial function we invoke the second recursive function, which takes as input a line object and one of the two halves: ```javascript function findHull(S, line){ // Check for an empty set of points if(S.length == 0){ return 0 // base case terminates the function }else{ // index of the furthest point from the line let idx = findFurthest(S, line) // add this point to the convex hull hullPts.push(S[idx]) // create two new lines that form a triangle with the original line let triLine1 = new makeLine(line.pt1, S[idx]) let triLine2 = new makeLine(S[idx], line.pt2) // create the new subsets // made of the points that lie outside of the triangle let triSplit1 = splitPoints(S, triLine1) let triSplit2 = splitPoints(S, triLine2) // recurse on the two new sets findHull(triSplit1[0], triLine1) findHull(triSplit2[0], triLine2) } } ``` The first thing that we need to do, to avoid an infinite recursion error, is to check for the base case where the set of points that is passed into the function is empty. In that case we simply terminate the function and invoke a return statement. Otherwise there's a couple of things that we need to do. Firstly we'll have to find the point that is furthest from the line among the points in the given set, for this purpose we'll use the code that we discussed in the previous section. We can safely add this point to the array that holds the vertices of the convex hull. We create two new lines that form a triangle with the given line, and then also compute the two new sets of points that fall outwards of this triangle. Finally we can make the recursive call where the function calls itself by invoking the findHull() function on those two new sets. Lastly, because the Quickhull procedure doesn't return the polygon points in order, we require a final additional step that can achieve this. This is relatively straight-forward by virtue of dealing with a convex polygon. We'll simply sort the polygon vertices in clockwise order around the centroid by the respective angular value that they form with this centroid: ```javascript function sortPointsByAngle(pts){ const center = pts.reduce((acc, { x, y }) => { acc.x += x / pts.length; acc.y += y / pts.length; return acc; }, { x: 0, y: 0 }); // Add an angle property to each point using tan(angle) = y/x const angles = pts.map(({ x, y }) => { return { x, y, angle: Math.atan2(y - center.y, x - center.x) * 180 / Math.PI }; }); // Sort your points by angle const pointsSorted = angles.sort((a, b) => a.angle - b.angle); return pointsSorted } ``` Another property of convex shapes is that their centroid always falls inside of it's boundaries, if our shape were concave on the other hand we would not be able to do this. Now we can simply draw this shape with the beginShape() and endShape() functions in p5. ## Discussion and Concluding Thoughts The quickhull is only one many methods for finding the convex hull. Other algos for the same purpose are the [Graham Scan](https://de.wikipedia.org/wiki/Graham%5FScan?ref=gorillasun.de), [Chan's Algorithm](https://en.wikipedia.org/wiki/Chan%27s%5Falgorithm?ref=gorillasun.de) and the [Gift-Wrapping Algorithm](https://de.wikipedia.org/wiki/Gift-Wrapping-Algorithmus?ref=gorillasun.de). Let me know if you want me to cover these as well in the future! Hope you learned something new and enjoyed this post! If you did, you might also enjoy this post on the Bowyer-Watson algorithm and a less technical on Triangulations and the related Voronoi Diagrams: [Bowyer-Watson Algorithm for Delaunay TriangulationThe Bowyer-Watson algorithm for Delaunay triangulation is maybe one of the easier methods to implement and understand for obtaining a Delaunay Triangulation.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/color_triangulation.jpg)](https://www.gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation/) [Delaunay Triangulation and Voronoi DiagramsThis is the first in a series of blog posts on Delaunay triangulation. This first part explains the task at hand and possible strategies to create a Delaunay Triangulation.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/mountains.jpg)](https://www.gorillasun.de/blog/delaunay-triangulation-and-voronoi-diagrams/) Otherwise, that's it for this one. Consider sharing this post on social media with frinds and family, it helps out a lot! And if you want come and say hi over on Twitter or leave a comment below! Cheers, happy coding! ### Final Project Part 2 URL: https://www.gorillasun.de/blog/final-project-part-2/ Last updated: 2026-08-05T11:26:47.000Z _This post is for paying subscribers only._ ### Final Porject I URL: https://www.gorillasun.de/blog/final-porject-i/ Last updated: 2026-08-05T11:26:38.000Z _This post is for paying subscribers only._ ### Glossary URL: https://www.gorillasun.de/blog/glossary/ Last updated: 2026-08-05T11:26:28.000Z _This post is for paying subscribers only._ ### Outline URL: https://www.gorillasun.de/blog/outline/ Last updated: 2026-08-05T11:26:20.000Z _This post is for paying subscribers only._ ### Sending MIDI Signals from Python to Ableton Live - 2023 URL: https://www.gorillasun.de/blog/sending-midi-signals-from-python-to-ableton-live-2023/ Last updated: 2023-05-06T09:07:12.000Z A couple of years ago, I saw a video by Andrew Huang where he makes music with videos of fireworks. He uses a software that takes as input the pixel values of the individual frames of these video while they're playing, converts them to MIDI signals and then get sent to his modular synth. Since I don't own a modular synth, the next best was Ableton Live, with which I could potentially simulate a similar setup. This required me to somehow automate the process of sending MIDI information over to Ableton. There isn't much info on this on the internet, but after a little digging I was able to piece together all the components that I needed. For this purpose, I also created a [github repo](https://github.com/AhmadMoussa/Python-Midi-Ableton?ref=gorillasun.de) that takes you through the necessary steps to have a python script trigger a synth in Ableton Live. To date, it's become my most starred github repo! Let's get started! ## Requirements - Naturally you'll need to have installed python on your device. - After verifying that you have installed it correctly, install this package via pip: `!pip install python-rtmidi` - And we'll also need a software like Ableton that has the ability to receive external MIDI signals and process them. - **On windows** we will also need this software: [LoopMIDI by Tobias Erichsen](http://www.tobias-erichsen.de/software/loopmidi.html?ref=gorillasun.de) to create virtual MIDI ports. rtmidi is a python package that makes it easy to create MIDI signals with a couple of lines of code and send them to open ports on our device. Ableton Live however doesn't have a feature where such ports can be created, we need an additional software to do so, one of them for windows is LoopMIDI. On mac there is a native method for doing so already, hence we don't need to install anything. Later on we just need to send a MIDI message from our script to the port that we've created, and configure Ableton such that it is listening to that port and receive the MIDI messages. ## Setup on Windows Creating a new port with LoopMIDI is as simple as running the executable and then clicking on the small + button in the lower left corner. You'll see a new entry pop up in the list of ports. And voila, we have created a port! ## Setup on Mac On a mac we only need to install the rtmidi python package, since there already is a native method to create virtual MIDI ports. For this purpose bring up your search bar by hitting the **cmd + space** buttons, and type in 'Audio MIDI Setup' ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-45-1.png) Then you should see this window pop-up: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-46.png) We don't actually care for anything in here, we're gonna head over to the options that will show on top of the screen, select 'Window > Show MIDI Studio' and select it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-47.png) This will bring up a new window that looks as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-48.png) Now double click on IAC Driver and we get yet another window: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-49.png) This manager will allow us to create virtual MIDI ports! By hitting the small plus button under the box we can create as many ports as we like, then we can also change the name of it and we also need to apply these new settings. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-50.png) In the next section we'll see how to send a signal over from python to these ports. ## The Python Script Create a new and empty python file somewhere in a directory on your machine. In that script we'll have to write a couple lines of code: ``` # import time and rtmidi package import time import rtmidi ``` The first is to simply import two packages, namely time and rtmidi. rtmidi requires the time package to function. Now that we've imported them we can create the rtmidi handler that we'll use to manipulate MIDI signals: ``` # the function call rtmidi.Midiout() creates the handler that we'll use to send midi signals midiout = rtmidi.MidiOut() ``` Next we can check if our port exists and can be detected by rtmidi: ```python # check and get the ports which are open available_ports = midiout.get_ports() # let's print the list of ports and see if ours is among them print(available_ports) ``` In the console/terminal we should now see a list of ports being printed, depending on your machine and what apps are running there might already be some entries in there. But what's important is to see if a port with the same name that we just created exists, so something along the lines of "LoopMIDI Port" or "IAC Port". Now you'll want to remember the position of that port in the list, because we'll need it to access the port from our script: ``` # Attempt to open the port if available_ports: midiout.open_port(0) // number here should match list index ``` In this condition, if the list of port has any entries we'll try to open one (the one that we just created). And now we should be ready to send MIDI information to that port! ## Sending MIDI Signals If you got this far, great! Now we need to create the midi note that we will send to the port. This is done in the following manner with rtmidi: ``` # This is how you create a midi note, the specs are: [command, note, velocity] note_on = [0x90, 60, 112] note_off = [0x80, 60, 0] midiout.send_message(note_on) ``` MIDI signals are essentially a set of commands that can be created following certain specifications. More formally a MIDI command consists of a series of numbers that indicate a certain instruction that will be executed when received by a MIDI device. rtmidi allows us to create such a command simply by creating an array consisting of three values. The first being the event type, here we wrote 0x90 indicating a 'note on' event. The second value indicates the pitch of the note. MIDI notes span from 0 to 127, where a value of 60 would indicate a middle C note. And lastly, we indicate the velocity of the note, which is essentially the intensity with which we are playing the note. Analogically, velocity can be portrayed by how hard you're pressing down on a piano key. On the following line of code you can see another set of values, indicating the 'note off' event, which we will need to turn indicate that we are done playing the middle C note that we just sent over the port. Notice that here we indicate a velocity of 0\. [You can read more about this in the documentation](https://www.music.mcgill.ca/~gary/rtmidi/?ref=gorillasun.de). After creating both 'note on' and 'note off' events we can proceed to sending the notes over to the port. This is simply done by invoking the handler and using the send\_message() function, where we pass the 'note on' message. On windows, if you switch to the LoopMIDI window you'll see that the value in the 'Total Data' column for the respective port will have increased, which means that the note has been received. In the last line we simply send the MIDI message to the port. And generally when we send a note on message we also need to follow it up with a note off message to turn it off again: ``` #Here you need to insert a short delay before turning the note off to make sure that the note_on signal was received time.sleep(0.5) midiout.send_message(note_off) print('END OF CODE!') ``` And that's pretty much all there is to it! ## Configuring Ableton Live The final step is to configure Ableton such that it can receive our MIDI signals and trigger an instrument with them. In Ableton we'll have to click a couple of buttons. First jump to your preferences and go to the Link MIDI tab. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-51.png) In the last section, under 'MIDI ports', you should see two entries called either 'Loop MIDI' or 'IAC Driver' (depending on your OS). There should be an in and an out entry. For the 'in' entry, toggle on the 'on' checkbox in the 'track' column. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-52.png) After that create a new MIDI track and make sure it has an instrument loaded. Next you'll want to arm the track, set it to auto and set the 'MIDI from' field to the 'Loop MIDI' or 'IAC Driver' port. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-53.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-54.png) Now if you run the script, it should have trigerred the midi note and you should've heard a sound! And that's about it, thanks for reading! Happy music making! ### Gorilla Recap 0 URL: https://www.gorillasun.de/blog/gorilla-recap/ Last updated: 2023-12-19T23:12:47.000Z **Hey everyone, this is the first issue of Gorilla Recaps! Let's kick off this newsletter and make it a weekly thing, where I tell you about a couple of cool things I found and did on the internet!** --- Last week [I asked how my Twitter friends learned to code](https://twitter.com/gorillasu/status/1645780240252170241?ref=gorillasun.de), and the results were surprising! I definitely would have thought that more people studied it in school, but it turns out that the majority of folks are actually self taught! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-4.png) The poll ended with a whopping 613 votes! However, in retrospect I could have maybe structured the poll a bit better. I got a few replies stating that they were self-taught prior to online learning being a thing. Go check it out, there are some really cool stories in there! > I learned Casio BASIC in 2000-2001\. Then much later [@roma\_mile](https://twitter.com/roma%5Fmile?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) tried to teach me C, with underwhelming results. > > It’s really when I came across [@ProcessingOrg](https://twitter.com/ProcessingOrg?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) in 2012 that it clicked for me! Eternal thanks to [@v3ga](https://twitter.com/v3ga?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)’s Processing Paris workshop ❤️ [pic.twitter.com/nlLmqLZ5e0](https://t.co/nlLmqLZ5e0?ref=gorillasun.de) > > — Raphaël de Courville (he/him) 𓅬 (@sableRaph) [April 11, 2023](https://twitter.com/sableRaph/status/1645904325263360000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Gorilla Articles & Tutorials - Last Sunday I released a token on [editART.xyz](https://www.editart.xyz/?ref=gorillasun.de), a new and budding generative art platform on the Tezos blockchain. The reception of the token was overwhelmingly positive, so much so that I quickly put together a 'Making Of' post that explains the generative process behind it. You can read it here: [Making of BlöckIn this article we’ll have a look at the making of Blöck, a customisable generative token on editART, a new genart platform on the tezos blockchain. From how I came across the platform by chance, to my sketching up initial ideas for the token, and ultimately releasing it on the platform!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-14-.png)](https://www.gorillasun.de/blog/making-of-block/) > Blöck #82 by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > It seemed almost impossible to commit to a Blöck piece given all the amazing variations to choose from. > > After trying out 1001 random seeds for a specific configuration I liked, I minted my first co-created piece on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#editart](https://twitter.com/hashtag/editart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/IXE3ivfLzJ](https://t.co/IXE3ivfLzJ?ref=gorillasun.de) > > — 𝔪𝔢𝔢𝔷 🌴 (@meezwhite) [April 10, 2023](https://twitter.com/meezwhite/status/1645363323943223296?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) - Halfway throughout the week, I went on a little excursion, where I built my own embeddable widget that acts as a tiny runnable code editor with a console attached. It was an interesting learning experience, that required a fair amount of DOM manipulation. If you ever want to build your own, keep this post in mind, it might come in handy: [Building an Embeddable Javascript WidgetIn this tutorial we’ll cover how to create a vanilla javascript widget that can be embedded on websites, and is capable of executing javascript safely in an iframe.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-3.png)](https://www.gorillasun.de/blog/building-an-embeddable-javascript-widget/) ## Interesting Reads of the Week 1. In the early 2000s, I would always be excited to visit my uncle. He was really into computers at the time, and whenever we did visit he had a stack of computer magazines ready for me, most of which contained accompanying CDs with demos of games that I could take home with me.As someone who was a part of the industry, Technologizer recounts the history of the computer magazine and paints a vibrant picture of how this era is coming to an end: [The End of Computer Magazines in AmericaThe April issues of Maximum PC and MacLife are currently on sale at a newsstand near you—assuming there is a newsstand near you. They’re the last print issues of these two venerable computer magazines, both of which date to 1996 (and were originally known, respectively, as Boot and MacAddict). Start![](https://www.technologizer.com/wp-content/uploads/2018/05/technologizer-favicon.png)Technologizer by Harry McCracken#![](https://www.technologizer.com/wp-content/uploads/2023/04/compmags-1.jpeg)](https://www.technologizer.com/2023/04/15/the-end-of-computer-magazines-in-america/?ref=gorillasun.de) 1. "You're probably not using chatGPT to it's full potential, here's ten things that you can do with it 👇" am I the only that's getting really tired of these Twitter threads? This tweet by Dan Hollick was refreshing in that it tries to explain how these LLMs (large language models) actually work, and not just spreading FOMO with how I'm missing out on making bank with chatGPT: > How does a Large Language Model like ChatGPT actually work? > > Well, they are both amazingly simple and exceedingly complex at the same time. > > Hold on to your butts, this is a deep dive ↓ [pic.twitter.com/s4j8SLbTv2](https://t.co/s4j8SLbTv2?ref=gorillasun.de) > > — Dan Hollick 🇿🇦 (@DanHollick) [April 13, 2023](https://twitter.com/DanHollick/status/1646509271843225600?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 1. I haven't used Mastodon as much as I would've liked to, but when I do I always find cool educative toots and nuggets of information. This Toot thread by Pikuma gives one of the best explanations on determinants that I've ever read, if you haven't fully grasped the concept in the past or need a little refresher, this one will do the trick: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-5.png) [Read the toot here](https://mastodon.social/@pikuma@mastodon.gamedev.place/110199850270109474?ref=gorillasun.de). ## Tip of the Week Last week I spent a considerable amount of time going through my older blogposts and checking if there were any issues with them, and essentially SEO optimizing them. One way of doing so, is by inspecting a page's Core Web Vitals. These are measurements that tell search engines if your pages are behaving well, load fast are responsive and all that good stuff really. Having healthy core web vitals I believe increases your search rankings. What's the point of all my material, if it isn't gonna show up in people's searches after all? After using Google's Page Speed Insights for a couple of hours I got quite annoyed with how slow it was at estimating my page's performance, and after some research I discovered that chromium based browsers have a tab in the dev tools called 'Lighthouse' that does exactly what Insights does, measuring the vitals and indicating potential issues: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/image-1.png) --- And that's it for this first issue of Gorilla Recaps! I'll try to keep it tech-y and classy with cool nuggets of info from here on out. Let me know what you think about this format, what you'd like to see in the future, which parts you think you could do without, etc. If you find cool things you can also send them to me to include them! Cheers! Happy Coding! ### Building an Embeddable Javascript Widget URL: https://www.gorillasun.de/blog/building-an-embeddable-javascript-widget/ Last updated: 2023-04-25T13:07:44.000Z In this tutorial we'll build this little widget: A couple of days ago, I was working on a new post, where I thought that it would be nice to have a little sandbox widget, in which I could showcase the different examples that occur throughout the text. Essentially I wanted the reader to be able to run the Javascript snippets, and have the option to edit these snippet and re-run them. I started looking for existing tools that could do something like that. But either I'm dumb and I've lost all ability to google anything, or there aren't really any widgets that do exactly this. The one that I found, that was the closest to what I had in mind was [Runno](https://runno.dev/?ref=gorillasun.de). It's actually really cool, supports a couple of different run-times, and would have been what my widget of choice if I didn't end up making my own. Another option obviously would have been [codepen](https://codepen.io/trending?ref=gorillasun.de) and [jsFiddle](https://jsfiddle.net/?ref=gorillasun.de), and somehow overwrite the HTML page with the console's output. But that was a bit too clunky, and I didn't want to clog up my page with external embeds that bump up the page load overhead. A widget that I really like, is the [p5 widget by toolness](https://github.com/toolness/p5.js-widget?ref=gorillasun.de), that I've used on several occasions in my tutorials. It simply lets me drop in a script tag in the markdown editor, and it automatically replaces itself with the editor + canvas widget at the script location. I wanted something like that, but with a console instead of the p5 canvas! Building something like that can't be too difficult, right? Well, let's get to it! # To build a JS Sandbox Besides Codepen and jsFiddle, that are mainly geared towards showcasing interesting things that can be done with html, css and javascript, there's also platforms like [codeacademy](https://www.codecademy.com/learn?ref=gorillasun.de), [freecodecamp](https://www.freecodecamp.org/?ref=gorillasun.de), [udemy](https://www.udemy.com/?ref=gorillasun.de) and [coursera](https://www.coursera.org/?ref=gorillasun.de), all of which have a hands on approach to teach programming, completely contained within the browser. This is done via an interface that asks the user to solve code problems to advance through the lessons. Then we also have more specific pages - that you might already be familiar with if you've read more than just this post on the blog - such as [openprocessing](https://openprocessing.org/?ref=gorillasun.de) and the [p5 editor page](https://editor.p5js.org/?ref=gorillasun.de), that let you run p5 code and display sketches inside an accompanying canvas. To begin, it's probably a good idea to understand how websites like the aforementioned ones allow the execution of Javascript code written by the user before we attempt to build our own simple little widget that can to some degree achieve the same. After googling for a while, I came across this [incredibly helpful post by Mike West](https://web.dev/sandboxed-iframes/?ref=gorillasun.de) that elucidates some of the security concerns, that you need to keep in mind when allowing the user to run Javascript code on your website. Besides that it also shows how to create your a sandboxed environment in which Javascript code can be safely run. This post will serve as the foundation for our widget. I also found two other resources on the topic, but I didn't hark further into them because the two of them use react and babel, which I have no experience with. The first one is by Krasimir Tsonev and shows how to [build an interactive javascript playground](https://krasimirtsonev.com/blog/article/build-your-own-interactive-javascript-playground?ref=gorillasun.de) and another [blog post by Matija aka Joy of Code](https://joyofcode.xyz/create-a-coding-sandbox?ref=gorillasun.de) that also shows how to do this. My goal was to make something purely with javascript, that behaves like the p5 widget from toolness and that can be easily hosted as a file on github. I wanted my widget to work the same that th p5 widget did. It's incredibly simple, you just drop a script tag in your post's html/markdown file. Then whatever p5 code exists inside this script tag will be shown in the widget's editor pane and become runnable with a button. In my case, instead of the canvas, I wanted there to be a console that shows the output of the js code in the editor pane when it's executed. In retrospect, I could have saved myself a lot of time by searching for terms like 'build a javascript sandbox' and/or 'make a javascript playground'. My initial search queries were something along the lines of 'embeddable javascript console' which also leads to interesting threads, but doesn't exactly satisfy what I'm looking for. Although, I did come across a useful SO answer detailing a function that I ended up using. It shows how one can ['monkey patch' the console output into an html div](https://stackoverflow.com/a/19636527/6688750?ref=gorillasun.de). It'll come in hangy for simulating the console in our widget. Ultimately, the widget ended up being a patchwork of code from different sources. # The evil eval() and sandboxed iFrames I had a gander at the aforementioned pages' html code, a commonality between is that the div - where the result of the code is shown - is generally wrapped inside of an iFrame element. That's odd... why use an iframe? I thought that I could just use the convenient eval() function in javascript, run the user's code snippet and then send the result of the snippet to be displayed in a simulated div console. TIL [the eval() method is problematic for a couple of reasons](https://www.digitalocean.com/community/tutorials/js-eval?ref=gorillasun.de), and poses a big security risk when run server side. For instance, imagine you're prompting a new user to enter their username and instead of doing so, a bad actor decides to craft a malicious string that is actually an infinite loop in disguise. If this username ends up being evaluated, it would potentially lead to the entire server crashing. Well... then how do all of those websites happily run user submitted code when it's actually a bad idea to use the eval() function? iFrames! This security issue can be circumvented by using an iFrame with the sandbox attribute! The sandbox attribute creates a restricted and contained environment for the user's code to run in. This is where the post by Mike West comes into play, where he explains the purpose of sandboxed iframes: > We're as secure as we can be if we follow the [principle of least privilege](http://en.wikipedia.org/wiki/Principle%5Fof%5Fleast%5Fprivilege?ref=gorillasun.de), and block each and every feature that isn't directly relevant to functionality we'd like to use. The result is that we no longer have to blindly trust that some piece of embedded content won't take advantage of privileges it shouldn't be using. It simply won't have access to the functionality in the first place. Alright, so an iFrame with the sandbox attribute it is! One problem remains however, one that we can't really do anything about. Users are still capable of submitting code that could potentially run infinitely, wether it's done on purpose or by accident, there isn't really anything that we can do against it. There is no way of verifying if a loop will stop or not, it is in fact an [NP hard problem](https://stackoverflow.com/a/15543936/6688750?ref=gorillasun.de). Well, it's gonna make the user's window freeze and they'll have to force quit it. Alright, I think we've done sufficient prep work, and it's time to get started with actually building our widget. # The HTML skeleton & preliminary CSS Let's begin with the basic components of our widget. We need three things, an element into which we can type, an element that will display the console output of the evaluated javascript code, and a button that connects the two and sends a message between the editable area and the simulated console area. HTML has useful tag for the purpose of inputting characters called `[textarea](https://www.w3schools.com/tags/tag%5Ftextarea.asp?ref=gorillasun.de)`, and for display the result we'll use an iFrame. Our HTML skeleton would thus look something like this: ```html
    ``` Not much to see here yet. There is an iFrame but since it has no content it's gonna be blank for now. Let's first add a little bit of style to make this look just a little bit better: ```css .widgetContainer { display: flex; flex-direction: row; } .buttonAndInput { display: flex; flex-direction: column; } .logFrame { border:1px solid #999999; margin:2px; padding:3px; flex: 1 0; } .textArea{ border:1px solid #999999; margin:2px; padding:3px; flex: 1 0; resize: horizontal; } .runButton{ border:1px solid #999999; margin:2px; padding:3px; } ``` The HTML with the class attributes: ```
    ``` We'll make the container a horizontal flexbox, and additionally we'll group the button and the textarea together inside a div that's a vertical flexbox. This would now look as follows: Editor Pane Run And now we also need a file that structures the iFrame's content: ``` Evalbox's Frame
    ``` There's also script tags in both files that we'll need to make the main window communicate with the iFrame. # Communicating with the iFrame We'll need to write a little bit of Javascript and add an eventListener that detects if the button was pressed, so that we can send the content of the textarea over to the iFrame: ```javascript function evaluate() { var frame = document.getElementById('sandboxed'); var code = document.getElementById('code').value; frame.contentWindow.postMessage(code, '*'); } document.getElementById('safe').addEventListener('click', evaluate); ``` The evaluate() function simply fetches the iFrame and textarea elements from the DOM by their ids, gets the value of the textarea, and then sends it over to the iFrame with the convenient [postMessage() function](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage?ref=gorillasun.de) that allows cross origin communication between the the two windows. We add this function as a triggerable event to the button when it's clicked. In Mike West's tutorial, he also covers the case where the iFrame sends back an alert to the main window, but we don't need that for our purposes. In the iFrame's script tag we need also need to add some Javascript code to receive the message from the main window: ```javascript window.addEventListener('message', function (e) { var mainWindow = e.source; try { eval(e.data); } catch (e) { console.log('eval() threw an exception.'); } }); ``` We attach an event listener to the iFrame that triggers whenever it receives a message. This message containing the code that the user has written inside of the textarea, it should then be evaluated with the eval() method. We also wrap this eval() inside of a try and catch block to except errors. Ultimately how you want the iFrame to behave is entirely up to you, but for my purposes I only want it to really do anything when the user makes use of the console.log() command. There's some more Javascript that we need to add here, which additionally outputs the evaluated result to our `pretend` console, which is the div with id `log` in our iFrame. We can do this with the monkey-patch code from this [SO answer](https://stackoverflow.com/a/19636527/6688750?ref=gorillasun.de), that overwrites the effect of the console.log function: ```javascript (function () { var old = console.log; var logger = document.getElementById('log'); console.log = function (message) { if (typeof message == 'object') { logger.innerHTML += (JSON && JSON.stringify ? JSON.stringify(message) : message) + '
    '; } else { logger.innerHTML += message + '
    '; } } })(); ``` Putting all of this together we get something that works like this: And this is basically already it if you're just looking for a simple editor+console. But there's a couple more things that we need to think about before this can be shipped as a widget. # Ace Code Editor Writing code in the bland text area doesn't look very appealing. We'd much rather have it styled, and have the editable area also notify us of potential errors that the user might have entered. Another look at the HTML code of the editor panes/divs aforementioned websites, we can see that the majority of them make use of codeMirror, such as codepen, jsFiddle, openprocessing and the p5 editor, whereas the educative platforms like codeacademy and freecodecamp make use of Monaco. Both Code Mirror and Monaco are tools that can turn a textarea into full fledged code editors running in the browser. There's a third one, namely the ace editor, which I ultimately ended up using (for no particular reason). To make it happen I found [this post](https://allenhwkim.medium.com/convert-textarea-to-an-editor-18cf80d1424a?ref=gorillasun.de) that provided the secret sauce. Essentially, we first need to import the ace editor's JS that will power the editor pane: ```html ` })(); ``` # Github Repo and Usage You can also find this widget on github: [GitHub - AhmadMoussa/JS-Console-Embed-Widget: A simple embeddable javascript editor + console widgetA simple embeddable javascript editor + console widget - GitHub - AhmadMoussa/JS-Console-Embed-Widget: A simple embeddable javascript editor + console widget![](https://github.com/fluidicon.png)GitHubAhmadMoussa![](https://opengraph.githubassets.com/b54cf5dfe2b21a369dacdfa1bc311e5c17c2c534580d6f1174e0b7acec4747e3/AhmadMoussa/JS-Console-Embed-Widget)](https://github.com/AhmadMoussa/JS-Console-Embed-Widget?ref=gorillasun.de) To use it yourself you need to fetch two scripts: ```html ``` And to use the widget you simply drop it anywhere in your html or markdown file enclosing the code that you want to showcase: ```html ``` And that's a wrap! Let me know if there's any mistakes or improvements that could be done to the widget. Otherwise, if you enjoyed this post consider sharing it with a friend or linking to it on your social and website, it helps out quite a bit! Cheers, and happy programming! ### Functions URL: https://www.gorillasun.de/blog/functions/ Last updated: 2026-08-05T11:26:09.000Z _This post is for paying subscribers only._ ### Arrays URL: https://www.gorillasun.de/blog/arrays/ Last updated: 2026-08-05T11:25:58.000Z _This post is for paying subscribers only._ ### For Loops URL: https://www.gorillasun.de/blog/for-loops/ Last updated: 2026-08-05T11:25:47.000Z _This post is for paying subscribers only._ ### Boolean Logic and Logical Operators URL: https://www.gorillasun.de/blog/boolean-logic-and-logical-operators/ Last updated: 2026-08-05T11:25:35.000Z _This post is for paying subscribers only._ ### Operators URL: https://www.gorillasun.de/blog/javascript-fundamentals-3/ Last updated: 2026-08-05T11:25:25.000Z A description goes here _This post is for paying subscribers only._ ### Anatomy of a Webpage URL: https://www.gorillasun.de/blog/javascript-fundamentals-2/ Last updated: 2026-08-05T11:25:09.000Z A description goes here _This post is for paying subscribers only._ ### Getting Started with Javascript URL: https://www.gorillasun.de/blog/javascript-fundamentals-1/ Last updated: 2026-08-05T11:24:54.000Z Welcome to the first part of this course on learning Javascript _This post is for paying subscribers only._ ### Making of Blöck URL: https://www.gorillasun.de/blog/making-of-block/ Last updated: 2023-05-06T09:42:08.000Z In this article we'll have a look at the making of [Blöck](https://www.editart.xyz/series/KT1JRLJVnSM5JhqByAunX7Ck4FdVfRcKHGyj?ref=gorillasun.de), a customisable generative token on [editART](https://www.editart.xyz/?ref=gorillasun.de), a new genart platform on the tezos blockchain. > Blöck out! 🎉 [#editart](https://twitter.com/hashtag/editart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Thanks everyone for collecting! 🙌🙏 [pic.twitter.com/DkRwIHtvqU](https://t.co/DkRwIHtvqU?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 10, 2023](https://twitter.com/gorillasu/status/1645220370734096384?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Starting from how I came across the platform by chance, to my sketching up initial ideas for the token, and ultimately releasing it on the platform! ## Initial Inspiration Blöck finds it's beginning with a tweet from generative artist [loackme](https://twitter.com/loackme%5F?ref=gorillasun.de): > Announcing a new project on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Shadows > 100 ed, 3 tez > > Customize your mint using 5 sliders![https://t.co/yVQiJTeqoL](https://t.co/yVQiJTeqoL?ref=gorillasun.de) [pic.twitter.com/SOjklQ4Zs9](https://t.co/SOjklQ4Zs9?ref=gorillasun.de) > > — loackme (@loackme\_) [March 25, 2023](https://twitter.com/loackme%5F/status/1639600788744949760?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) If you haven't come across yet, on Twitter or elsewhere: it's a new generative art platform on the Tezos blockchain developed by Piero aka [pifragile](https://twitter.com/pifragile?ref=gorillasun.de). Similarly to [FxParams](https://www.gorillasun.de/blog/enter-fxhash-params/), FxHash's new parametric method of minting, on editART the collector also tweaks the artwork prior to minting, essentially becoming a co-creator of that specific iteration. This is done via 5 mandatory sliders, each of which controls a specific parameter in the code. After checking out loackme's token, and exploring the platform a bit more, I found myself on the [github page](https://github.com/pifragile/editartSimpleTemplate?ref=gorillasun.de) that contains instructions and the template for creating projects on editART. I quickly cloned the repo and started playing with the template, and testing out ideas in the sandbox. The process was relatively streamlined, what I found really is that the sandbox takes a link to your project running on a local server, making it really simple to test things without having to install anything. ## First Ideas After a little bit of brainstorming I decided to reiterate on some partitioning code that I had written last year, which resulted in the following sketch: > Partitions [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/SN5x9N6nLJ](https://t.co/SN5x9N6nLJ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 27, 2023](https://twitter.com/gorillasu/status/1640412281421832194?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I felt that this idea was solid, but ultimately I couldn't find any interesting mapping between the 5 sliders sliders and sketch parameters. I decided that I was going to leave the partitioning idea for another day, and found myself coming back to experimenting with grids. One consideration for the token, was that I wanted it to be aesthetically simple, and somewhat fit in with the already existing projects on editART, like loackme's and Piero's tokens. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-1.png) What's more, is that grids are an idea that I always find myself coming back to when I don't really have a game-plan. Blöck is actually similar to a sketch I did back in Genuary 2023, but I didn't want to repeat myself and reuse the irregular grid code that I had already used so many times: > My kid could have made that [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary26](https://twitter.com/hashtag/genuary26?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/J0TQf3Ef7c](https://t.co/J0TQf3Ef7c?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [February 2, 2023](https://twitter.com/gorillasu/status/1621115661316677633?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Starting out from a fresh slate, in the attempt to make something that looked like a checkerboard, this pattern manifested itself on my canvas: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/canvas3.png) The code for this is pretty straightforward: ```javascript let PAD = 100 // padding between grid and canvas border // number of tiles horizontally and vertically let X = 12 let Y = 12 // horizontal and vertical dimensions of the tiles let x_spc = (canvas_size - PAD*2)/xs let y_spc = (canvas_size - PAD*2)/ys // loop that computes the actual positions and draws the tiles for(let x = 0; x < X; x++){ for(let y = 0; y < Y; y++){ /* code that fills and colors the tiles with patterns goes here */ if(y>0 && (x+y)%2 == 0 ){ pg.rect( PAD + x * x_spc, PAD + y * y_spc-y_spc, x_spc, y_spc*2 // multiply by two ) }else if(y==0 || y==ys-1){ pg.rect( PAD + x * x_spc, PAD + y * y_spc, x_spc, y_spc ) } } } ``` The trick that creates the grid is checking whether the sum of the tiles' horizontal and vertical index is even or odd: when this sum is odd we draw a long tile, otherwise we don't. Except if it's a tile at the very top or the very bottom of the grid, then we do draw it. This way we get this nice interweaving raster. Here's some variations: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/interesting.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/thonk2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/think.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/canvas3-1.png) If we were to only check for the vertical index we wouldn't get the alternating pattern: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/oddity.png) But this idea was still a bit too simplistic for the purpose of a generative token. ## A different kind of Grid Looking back at the code, I don't remember why I did it, but I replaced the outer loop's update rule/increment statement, whatever you wanna call it, with a random increment: ```javascript for(let x = 0; x < X; x+= random([.5, 1])){} ``` This breaks the sketch and leaves horizontal gaps in the grid because the conditional statement in the loop's body doesn't trigger anymore: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/canvas7.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/canvas6.png) This however sparked an idea: what if the update rule increments the loop counter with differently sized steps at every iteration? I tried this with the vertical increment of the inner loop first, obtaining this pattern: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/attemp11.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/attemp1.png) We essentially modify the loop such that it jumps several steps ahead at any given iteration: ```javascript for(let y = 0; y < Y; y+=stepy){ pg.rect( PAD_X + x * x_spc, PAD_Y + y * y_spc - y_spc*stepy + y_spc, x_spc, y_spc*stepy) // in this case there's only 3 possible increments // but the steps can be anything for different variations stepy = random([1,2,3]) } ``` In this setting we also need to calculate the correct size of the rectangles. Additionally, to make the increments fill out the entire height of the grid, we also need to detect the last upcoming iteration, which can be done by checking if the loop's stopping condition would trigger in the next iteration. In that case we simply set the increment to the smallest possible step value: ```javascript if(y + stepy >= ys){ stepy = 1 } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/fillup.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/closeup.png) Now we can repeat the same idea for the outer loop, and we end up with a grid that looks as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/bll.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/coolGrid.png) Aesthetically, I didn't mind that the first row and column were always of the same height and width. So I just kept that in, and later on it isn't actually that noticeable anyway. There's however one more thing that I did to make the pattern even more interesting. There's a random chance for the drawn rectangles to be split up vertically or horizontally into smaller rectangles. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/blo-cks.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/final-params.png) And that's pretty much all of the ingredients that went into the making of this particular type of grid. I encourage you to experiment with something like this if you want to spice up your grids, there's still many things that I could have modified to add additional variety. But this seemed like an adequate system for potentially 100 iterations. ## Hachure Lines I absolutely love hachures. Probably better to refer to them as hatch lines in this case. They instantly give things a more 3 dimensional aesthetic, depending on their orientation and the density of the lines. Restricting the hatch lines to the rectangles' boundaries can be done with the rendering context's clip() method. Which is most likely one of my favourite tricks. I discovered the method when I created my [token for crayon codes](https://openprocessing.org/crayon/28?ref=gorillasun.de) February of last year (2022), and wrote about it a bit more [here](https://www.gorillasun.de/blog/making-of-behind-the-canvas/). [Crayon codes](https://openprocessing.org/crayon?ref=gorillasun.de), ahead of it's time, as the first platform to implement a co-creation mechanism, it just felt right to come back to this clipping idea. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/crayon.png) Essentially, when invoking the clip() method after drawing a shape, either with rendering context functions, or any of the shape functions in p5 (which make use of the rendering context under the hood anyway), whatever follows the clip() function will be restricted and `clipped` to that shape. This means that we just need to draw some hachure lines to the canvas and have them occupy space on the canvas underneath the respective rectangle. The function that draws the hachure lines functions as follows: 1. Select an angle, randomly or from an array of quantized angular values (depending on the angle mode) 2. Compute the diagonal length of the rectangle. If the selected angle is coincidentally the same as the digonal's slant, then the hachure lines need to be at least that long to span the entire rectangle. 3. Select a distancing value at random, this variable will determine how close the hachure lines are to each other. 4. With trigonometry, compute the coordinates of the two points that form the extremeties of the line that has a slant and length equal to the values that we computed in step 1 and 2\. In less complicated terms, we basically draw a slanted line, that has a slant equal to the angle we selected in step 1, and a length equal to the diagonal length of the rectangle. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/diag1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/diag2.png) 1. With linear interpolation we step from one of the two extremities towards the other (with a distance equal to the distancing value we selected in step 3), drawing a perpendicular at each step. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/hach1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/hach2.png) 1. Finally we clip this pattern to the previously drawn rectangle. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/clip1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/clip2.png) I will probably make a more detailed breakdown of this hachur-ing code soon. Adding this into the code we end up with a grid that looks as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/rectangul.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/rectangul2.png) # Parameters and Stylistic Choices Choosing what aspects of the sketch were controlled by the parameters was a bit tricky, but I think I found a good balance at the end. One slider was dedicated for the angle of the hachure lines, as these had a significant visual impact on the overall composition: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-5-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-6-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-7-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-8-.png) I also figured that the grids of dots overlaid on the rectangles might not be everyone's jam and hence on of the toggles controlled the amount of these overlays that occur throughout the iteration: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-8--1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-9-.png) These dots were an idea that I learned from a tweet by [Matt DesLauriers](https://twitter.com/mattdesl?ref=gorillasun.de), where it makes it seem like there's more than 5 colors even though it is just a dithered optical illusion: > Dithering with two primary colours sometimes creates the expected 'mixed' optical/perceived colour, like RED+BLUE=PURPLE and RED+YELLOW=ORANGE. But mixes like BLUE+YELLOW I perceive as gray. > > Is there a name for this phenomena? And ways to calculate/simulate the optical mixing? [pic.twitter.com/vrMFAJJhJh](https://t.co/vrMFAJJhJh?ref=gorillasun.de) > > — Matt DesLauriers (@mattdesl) [March 14, 2023](https://twitter.com/mattdesl/status/1635657738712694784?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Another slider controls the number of vertical and horizontal subdivisions of the grid, and subsequently controls how visually complex the overall pattern is: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-10-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-11-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl--ck-12-.png) I'm always surprised that collectors are more drawn towards the simpler ones, rather than the more cluttered outputs that I personally prefer. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl-ck-19-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Bl-ck-18--1.png) Some of the simplest iterations that were minted. Blöck #41 by Lisa Orth and Blöck #7 by Pifragile. Then there's another slider that controls the random seed as well as the position of the block on the canvas, which is kind of just a slider that I added for fun, as I found that offsetting the grid creates an interesting negative space patch on the canvas. What I thought was also important, is the order of the sliders. For instance, the random seed should definitely sit at the top, as it modifies the entire sketch and would undo the effect of the other sliders. With the minimal interface it would be difficult to find those again. ## Release and Concluding Thoughts If you made it this far, thank you for reading! And if you're one of the collectors, then thanks a million for collecting, co-creating, and bringing Blöck to life on the Tezos blockchain. All the positive feedback I got from folks on different platforms is incredibly encouraging, and brings back a lot of the creative joy that I found in the early days of my generative art journey. All iterations of Blöck sold out in less than 12 hours, and collectors overall really enjoyed playing with the parameters. I think the simple interface of editART is really nice, and a bit reminiscent of the esoteric and minimal interface of early HEN that many people fell in love with. Here are some things Twitter friends have said about the token: > Blöck #82 by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > It seemed almost impossible to commit to a Blöck piece given all the amazing variations to choose from. > > After trying out 1001 random seeds for a specific configuration I liked, I minted my first co-created piece on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#editart](https://twitter.com/hashtag/editart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/IXE3ivfLzJ](https://t.co/IXE3ivfLzJ?ref=gorillasun.de) > > — 𝔪𝔢𝔢𝔷 🌴 (@meezwhite) [April 10, 2023](https://twitter.com/meezwhite/status/1645363323943223296?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > The last collection of [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) is a majestic equilibrium Between textures and computer windows. [pic.twitter.com/Sme29rpVkz](https://t.co/Sme29rpVkz?ref=gorillasun.de) > > — Eggs of Unknow Fox ☮️ (@EggsUnknow) [April 10, 2023](https://twitter.com/EggsUnknow/status/1645359702673375233?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Back co-creating on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). > This time, textured, off centre and on purpose. Refreshingly simple and pleasant. 😊 > > 🖼️ Blöck #92 by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/E0d6Hczode](https://t.co/E0d6Hczode?ref=gorillasun.de) > > — João Pescada (@jpscd) [April 10, 2023](https://twitter.com/jpscd/status/1645255701520953346?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Minting Blöck by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) over on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). At 3tz and so easy to play around with, it made me smile. Nice work, Ahmad! :) [https://t.co/3mxii13m3e](https://t.co/3mxii13m3e?ref=gorillasun.de) > > — Marius Watz (@mariuswatz) [April 9, 2023](https://twitter.com/mariuswatz/status/1645054300580724739?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > very nice, params saved. can't wait to mint this beauty! [pic.twitter.com/kKGizMHXWu](https://t.co/kKGizMHXWu?ref=gorillasun.de) > > — ktorn (@ktorn) [April 8, 2023](https://twitter.com/ktorn/status/1644803162661076992?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Blöck #80 and #98 - [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Nice work! The co-creation aspect is a lot of fun and I love the minimalist implementation on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). [pic.twitter.com/VBrSVbqyK4](https://t.co/VBrSVbqyK4?ref=gorillasun.de) > > — lonemallard.tez (@crypto\_mallard) [April 10, 2023](https://twitter.com/crypto%5Fmallard/status/1645229973945434113?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And that's a wrap! Big big thanks to [pifragile](https://twitter.com/pifragile?ref=gorillasun.de) for putting together the platform and helping out a lot along the way to get the token published! Go show him some love on social media and check out the platform! > Blöck sold out quickly on [@editart\_xyz](https://twitter.com/editart%5Fxyz?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Congrats to [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for the wonderful piece and many thanks to all collectors. Happy to welcome 28 new co-creators to the platform :)[#editart](https://twitter.com/hashtag/editart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/aDCsi4eQTz](https://t.co/aDCsi4eQTz?ref=gorillasun.de) > > — Piero (pifragile) (@pifragile) [April 10, 2023](https://twitter.com/pifragile/status/1645394741335592960?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Thanks for reading, and happy creative coding! Cheers! --- If you want to read more, check out this article I wrote about FxParams: [Enter FxParams: Customisable Blockchain ArtIt’s only been a couple of days since FxParams launched, but we’ve already seen quite a few tokens hit the market that make use of it, as well as some discussion and brainstorming sessions in the discord on potential future improvements. Let’s see what FxParams is all about!![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/bannerstonks2.png)](https://www.gorillasun.de/blog/enter-fxhash-params/) Otherwise, if you want to support my writing and work consider sharing a link to this post on your social media or with friends and family. Sharing links to the blog helps out a bunch, it essentially tells search engines that there's good content on my blog. I also have a piece up on FxHash that's still minting if you'd like to collect another token: [Daze Maze — fxhashA recursive homage to the iconic 10 print pattern. This one started as a late night exploration starting from a simple snippet of code, iteratively adding complexity to it until I was able to generat![](https://www.fxhash.xyz/apple-touch-icon.png)fx logo![](https://media.fxhash.xyz/w_1200/QmVjqn7Qv7MhiyNLW5QqQACUQMrePDu8MFbNMXFmQH4dKW)](https://www.fxhash.xyz/generative/26169?ref=gorillasun.de) ### Nat Sarkissian's Eucalyptus and Sagebrush URL: https://www.gorillasun.de/blog/eucalyptus-and-sagebrush/ Last updated: 2024-09-05T08:14:52.000Z **In this post we'll have a closer look at** [**Nat Sarkissian**](https://twitter.com/%5FNatSarkissian?ref=gorillasun.de)**'s generative FxHash token** [**Eucalyptus and Sagebrush**](https://www.fxhash.xyz/generative/23549?ref=gorillasun.de)**. The token was released on January 12th as a part of the** [**Cure3**](https://twitter.com/Cure3Exhibition?ref=gorillasun.de) **exhibition:** > Once again, my mind is back in the hills. It's been surprising to discover how much they've influenced me. I'm excited to release "Eucalyptus and Sagebrush" this Thursday as part of the Cure3 event. [pic.twitter.com/l3okAJOkCd](https://t.co/l3okAJOkCd?ref=gorillasun.de) > > — Nat Sarkissian (@\_NatSarkissian) [January 9, 2023](https://twitter.com/%5FNatSarkissian/status/1612571451214946306?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This post is complementary to [Raph](https://twitter.com/sableRaph?ref=gorillasun.de)'s twitch livestream on the 24th of March 2023, where we go over the token in depth: > So many [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) masterpieces deserve a closer look! Join [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and [@sableraph](https://twitter.com/sableRaph?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) live on Twitch tomorrow for an Insider's guide to generative art and creative code. > > In this episode of fx(review) we will explore the Art & Code of 'Eucalyptus and Sagebrush' by [@\_NatSarkissian](https://twitter.com/%5FNatSarkissian?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/vjUCxGlhCo](https://t.co/vjUCxGlhCo?ref=gorillasun.de) > > — Raphaël de Courville (he/him) 𓅬 (@sableRaph) [March 23, 2023](https://twitter.com/sableRaph/status/1638871904277889024?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) You can watch the VOD [here](https://www.twitch.tv/videos/1774217050?ref=gorillasun.de) as well as on Raph's Youtube sometime in the future! ## Generative Landscapes Generative landscape sketches have become one of the most popular type of generative art over the course of the past two years, especially in the context of blockchain art. In part, this surge of popularity can be attributed to the work of artists like [Zancan](https://twitter.com/zancan?ref=gorillasun.de), who has seen great success in that regard. Zancan's [Garden Monoliths](https://www.fxhash.xyz/generative/slug/garden-monoliths?ref=gorillasun.de), for instance, now stands as the token with the all time highest cumulative transaction volume on FxHash, having aggregated over a million Tezos in secondary sales. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zancan2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zancan3.png) Garden, Monoliths #16 and #19 Respectively On the flip-side, more and more budding generative artists are attempting this style for themself, simply because a lot of algorithms have been devised for the purpose of creating natural scenes. Many noise algorithms and random number generators can be effectively utilized for the simulation of terrain formation as well as the positioning of wilderness, vegetation and plant growth. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/river-prairie.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/riverscape.png) [River Prairie by Brian Gawlik](https://www.fxhash.xyz/generative/14607?ref=gorillasun.de) and [Riverscape by Tezumie](https://www.fxhash.xyz/generative/13189?ref=gorillasun.de) I've attempted landscape sketches myself in the past. I haven't done one for fxhash (yet - but it's coming - probably). I did a sketch back in August 2022 where I tried to simulate grass simply by drawing many short lines to the canvas, where the lines towards the bottom of the canvas are slightly larger and longer, to convey an illusion of distance and depth. Later I also had a pebbly river flow through this landscape: > Smol blobs instead of circles, I think it sells the idea of pebbles a bit more 🤔 [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#craetivecoding](https://twitter.com/hashtag/craetivecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/YzTUXZSw0j](https://t.co/YzTUXZSw0j?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [August 21, 2022](https://twitter.com/gorillasu/status/1561320809792143361?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I never returned to this particular project however. Another one that I did recently during Genuary 2023, wasn't initially intended to be a landscape piece, but it reminded me of a mossy meadow, hence I tried to lean into it a little bit more: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/img-359-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/img-354-.png) Voronoiscapes ## Eucalyptus and Sagebrush With [Eucalyptus and Sagebrush](https://www.fxhash.xyz/generative/slug/eucalyptus-and-sagebrush?ref=gorillasun.de), [Nat Sarkissian](https://twitter.com/%5FNatSarkissian?ref=gorillasun.de) puts his own spin on the genre: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/examp1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/examp2.png) Eucalyptus and Sagebrush #1 and #8 My immediate thought after seeing the artwork for the first time was: 'How? How do you make something generative look so natural?' The delicate generative brushwork and the interplay between colors - that results in an intricate shading of the terrain - is reminiscent of an impressionist style from an era long past. In impressionism the goal is not to recreate the scene as it exists in reality, but rather, the artist attempts to capture an *impression* of the subject. Nat says in the token's description: > Each iteration of this algorithm feels, to me, like a glimpse out of a car window on a drive up the coast, a pause on a cool morning hike, or a memory of tearing through sharp underbrush with good company. In impressionism there is a great focus on lighting and how the illumination interacts with the scene. Often this occurs in combination with delicate and fine brushstrokes, where the coloring of these strokes tries to emulate the incidence of light with different surfaces. Claude Monet is arguably the most acclaimed artist to grace this artistic style: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/maxresdefault-1.jpg) Impression, Sunrise by Claude Monet A focus on light, brushwork and coloring can also be seen in Nat's work, especially when we look at it from a distance: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-29.png) > Stylistically and texturally, I drew from landscapes rendered in oil pastels, placing thousands of tiny circles, alluding to the effect of depositing particles of color onto paper. In Eucalyptus and Sagebrush, what I can't really put my finger is how the terrain is generated, and subsequently how the brushstrokes are placed and colored to create an illusion of shading. It looks very natural, especially when you look at it from a distance. Perlin noise by itself gives you very lumpy shapes, which can work in the right setting, but terrain is usually a bit more shapely, jagged and pointy. Another thing that is a mystery to me is how the illumination works. How are the tips of the trees colored differently, and only from the direction of the light-source? That's what I'm hoping to have figured out by the end of this article. Hence, the aim of this post is to analyse what goes on behind the scenes in Eucalyptus and Sagebrush, and how the different components of the code work together to create such lush and natural sceneries. ## Height Maps I had a gander at the code and to my surprise found an extremely tidy and readable project. To make things a bit more approachable, and to be able to understand what the variables and parameters in the code do, it was important for me to be able to run the sketch offline. I obtained a local copy of the code with the [wget command line tool](https://www.gnu.org/software/wget/?ref=gorillasun.de). For most examples throughout the text, we'll lock in the same seed that is used for the token's preview on fxhash, except when noted otherwise. This makes it easier to see the effects of variable changes as we go over the code. Nat's project is based on the popular P5 library, making use of it's convenient functions to process values and draw the graphics to a canvas element. Usually, a natural starting point for figuring out projects like this is the sketch.js file, where the centerpiece is the setup() function that ties the entire project together. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-23.png) The first couple of lines are pretty standard, after initializing a bunch of hyper-parameters, we enter the setup function where we set the fxhash randomness seeds, and create the canvas as well as the graphics buffer, which I assume is in place for responsive resizing purposes of the browser window. The first two lines for which we'll have to do some digging are: ```javascript setupHeightMap() setupLightMap() ``` I have a vague idea what height maps are, but haven't really used them before (on purpose at least). I also can't immediately tell how it ties into the narrative of the sketch, when my initial assumption was that the colourful strokes that make the graphic are positioned with some form of perlin noise generated map. But it turns out that Nat is actually using something much more elaborate than that. Both of the setupHeightMap() and setupLightMap() functions can be found in the map.js file. I did a little bit of research to figure out what heightMaps are generally used for and how they can be created, and we'll go into more detail in the next section, but essentially, height maps serve the purpose of terrain generation, where they specify the elevation of the terrain at any given point. Height maps can then be further shaped into more convincing landscapes by passing them through subsequent algorithms (more on that in the next section as well). But first things first, how do we create a height map? And what data structure can be used to represent such a height map? To answer the latter, a height map can simply be defined as a 2-dimensional array of numerical values, where the entry of each cell symbolizes the elevation at the given coordinate, where the coordinate is the x and y indices of the array entry. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/043-ue4-heightmap-guide-02.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/heightmap-1.gif) Large scale and small scale heightmap. As for the creation process, a good introduction to the topic is this [fantastic resource](https://www.redblobgames.com/maps/terrain-from-noise/?ref=gorillasun.de) by none other than [redblobgames](https://twitter.com/redblobgames?ref=gorillasun.de), who has written extensively about algorithms for game development. I highly recommend checking out all of his writings. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-22.png) Heightmaps are usually created by combining several noise maps at different frequencies. Image from Redblobgames. Theoretically, we could just generate a 2D array of random values with Perlin Noise or Simplex Noise, and use those as a starting point for our terrain, for a better foundation though, we usually combine multiple noise maps at different frequencies, which is exactly what the prepareHeightMap() function does. Let's have a look at the code! The prepareHeightMap() function can be found as the first function within the map.js file. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image.png) To begin, the parameters mapW and mapH, as they suggest indicate the size of the heightMap and they're both fixed to a value of 100\. The size of the heightMap has actually no influence on the number of strokes drawn (we'll see later that that's a separate variable), but rather on how much of a noise field the resulting terrain will span. If we set these parameters to something small, then we're only sampling from a very small range of noise values. Here's what this would look like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2x2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/10x10.png) mapW=2, mapH=2 | mapW=10, mapH=10 respectively In this case no noticeable elevation is generated, but I actually find these minimal ones quite charming as well. Next up, Nat initializes some random variables that will define the frequency and intensity of three different noise distributions: ```javascript let mapScale = random(0.15, 1); let sustain = map(mapScale, 0.15, 1, 0.6, 0.2); let noiseDist = [ [1, 1 * mapScale], [sustain, 2 * mapScale], [pow(sustain, 2), 4 * mapScale] ]; ``` We're not actually going to create these noise distributions individually, nor store them in arrays. We'll simply loop over the dimensions of the grid and use the parameters we just initialized to sample from these distributions and aggregate the resulting numbers to obtain our height map. This nested loop, stripped down to the bare minimum, looks as follows: ```javascript for (let i = 0; i < mapW; i++) { for (let j = 0; j < mapH; j++) { let nx = 0; for (let k = 0; k < noiseDist.length; k++) { nx += norm( sNoise.noise2D( i * noiseScale * noiseDist[k][1] * 2, j * noiseScale * noiseDist[k][1] * 2 ), -1, 1) * noiseDist[k][0]; } let ns = constrain(pow(map(nx, 0, noiseTotal, 0, 1) * 1, 1), 0, 1); } } ``` For those who aren't familiar with [Simplex noise](https://en.wikipedia.org/wiki/Simplex%5Fnoise?ref=gorillasun.de), it is essentially a better and improved version of [Perlin noise](https://en.wikipedia.org/wiki/Perlin%5Fnoise?ref=gorillasun.de). It doesn't come out of the box with P5, but Nat included it in a script file. As for the norm() function that processes the sampled Simplex noise values, it's also a P5 function and works in a similar fashion to the map() function, which you might be more familiar with. The norm() function always maps from the specified range (2nd and 3rd parameter) to a \[0, 1\] range. Since the sum of these sampled values can exceed the upper bound of that range, we need to additionally map it to a \[0, 1\] range in a subsequent step based on the total. ```javascript let noiseTotal = 0; for (let i = 0; i < noiseDist.length; i++) { noiseTotal += noiseDist[i][0]; } ``` And in this manner we've created the height map and could technically store it in an array for later use. There's however a couple more lines within this nested loop that process the values of our height map. Instead of going over each line by itself I'll add comments to the code to explain what they do: ```javascript // clamps the number of values behind the decimal point ns = floor(ns * 100000)/100000; // maps the height map value to an angle in the range [TAU, 2 * TAU] ns *= TAU * 2 * map(j, 0, mapH, 1, 0.5); // we find the highest and lowest point in the height map and store them let y = map(j, 0, mapH-1, 0, targetSz); y += map(ns, 0, 2 * TAU, 0, 1) * terrainHt; if (y < minY) { minY = y; } if (y > maxY) { maxY = y; } // finally store the heightmap value row.push( ns ); // since we are already in a nested loop we can do some other stuff // like allocating values for an erosion and deposition map // which will be used in the erosion algorithm of the next section. let erodeAmt = 0.1; let depositAmt = 0.001; erodeMapRow.push(erodeAmt); depositMapRow.push(depositAmt); ``` Now that we've created our height map, we can move on to turning it into a shapely terrain with an algorithm that is better known as Hydraulic Erosion! ## Terrain Generation and Hydraulic Erosion Terrain generation is a well researched topic in computer graphics, for which a [whole slew of algorithms](https://www.cs.cmu.edu/~112/notes/student-tp-guides/Terrain.pdf?ref=gorillasun.de) has been devised. One field of application where it predominantly occurs is in graphics for video games. Some examples are age of empires (2 is one of my favorite childhood games), skyrim as well as the civilzation series. All of which have pretty convincing terrains. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/age-of-empires-2-coop-900x506.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4i894i3hsw521.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3822891-604ffdb290aa3civ6_nfp_screenshots_etemenanki_03.jpg) Age of Empires 2 | The Elder Scrolls 5: Skyrim | Sid Meier's Civilization 6 Here's what Eucalyptus and Sagebrush would look like with the terrain shaping algorithm toggled off: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/duller.png) Erosion Algorithm toggled off. The generated landscape in this case is much duller, flatter, and the ridges aren't as pronounced as they were before. The terrain overall isn't as shapely. So, what's going on in this terrain shaping algorithm? And how does the height map we just created tie into this? To be more specific the particular algorithm that Nat used is called [Hydraulic Erosion](https://jobtalle.com/simulating%5Fhydraulic%5Ferosion.html?ref=gorillasun.de). At the very end of the prepareHeightMap() function we found a couple of lines that looks as follows: ```javascript erode(hMap, 10000 * areaAdj, 1, 4); erode(hMap, 10000 * areaAdj, 1, 4); erode(hMap, 10000 * areaAdj, 1, 4); erode(hMap, 10000 * areaAdj, 1, 2); blurMap(hMap, 1, 0.2); ``` This means that the height map is being passed to this erode() function several times as well as a blurring function apparently. We can find this function in the erosion.js file. A larger comment sits at the top of this file, where Nat mentions that his implementation finds its beginnings with [Sebastian Lague's Unity/C# code](https://www.youtube.com/watch?v=eaXk97ujbPQ&ref=gorillasun.de): > Hydraulic erosion is a relatively well known idea in terrain generation. This implementation started with Sebastian Lague's Unity/C# implementation. Other than porting it to JavaScript and adapting it to the data structures I had in place for this project, I modified somewhat significantly. I removed the erosion brush concept. I modified the scale of a few of the parameters such as sediment capacity, erosion speed, deposit speed, etc. I added functionality to carry the color of the sediment in the rain drops in order to cause the terrain to be colored by the erosion effect. Comments like this fill my heart with excitement. For one, we're one step closer to figuring out what's happening in the sketch, and additionally we've already learned a little bit about a new algorithm. Now Nat has got me curious: what's this erosion brush concept? What is sediment capacity? Erosion Speed? Deposit Speed? And more importantly how does the algorithm process the height map that we just constructed? Before we dive into these technical concepts, let's have a look at how erosion occurs in nature. A definition from [natural geographic](https://education.nationalgeographic.org/resource/erosion/?ref=gorillasun.de): > Erosion is the geological process in which earthen materials are worn away and transported by natural forces such as wind or water. Examples of interesting formations caused by wind and water erosion are the Paria Plateau in the Vermillion Cliffs, as well as Raouche rocks at the lebanese coast which I've seen so many times during my childhood: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/TheWave.JPG) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Jm-small.jpg) Vermillion rliffs and Raouche rocks In our case, we'll be more interested in hydraulic erosion, which generally is the process by which water transforms terrain over time. This is mostly caused by rainfall, but can also be caused by ocean waves hitting the shore or alternatively the flow of rivers. One resource that helped [Sebastian Lague](https://www.youtube.com/c/SebastianLague?ref=gorillasun.de) figure out hydraulic erosion for his own attempt was [Hans Theobald Beyer's bachelor thesis](https://www.firespark.de/resources/downloads/implementation%20of%20a%20methode%20for%20hydraulic%20erosion.pdf?ref=gorillasun.de) on this very topic, which describes a particle based approach for the erosion of a height map: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-25.png) [Hans Theobald Beyer, a particle based approach to heightmap erosion](https://www.firespark.de/resources/downloads/implementation%20of%20a%20methode%20for%20hydraulic%20erosion.pdf?ref=gorillasun.de) The first paragraph of the fifth chapter gives a good overview of the erosion algorithm. It is summarized as follows: > It is a particle based approach in which single drops are placed onto the map, run downhill and move material depending on their carry capacity and speed of motion. The drops are simulated in 2.5D, which means the drop is considered to be always at ground level and it only saves its position in two dimensions. Also the drops do not interact and are not simulated with physical principals. The special feature of this algorithm is that the particles move the same distance every simulation step although they are not bound to the grid. The simulated time per step is not consistent. Therefore this simulation is not suitable to simulate a fluid visually, its purpose is to simulate the impacts of water on the terrain. He adds: > The goal of the algorithm is to provide optically appealing erosion marks from running water on small scale as well as large scale terrain. The technical paper is actually very approachable and every step is clearly explained, so I recommend reading it for yourself if you are interested in learning more. But otherwise here's a brief explanation of how Nat's simulation works. The entire simulation can be done in a large nested loop, where the outer loop iterates over the number of rain drops we want to simulate, and the inner one simulates how long we want the trajectory/path of the raindrop to be: ```javascript for (let j = 0; j < nDrops; j++) { // stuff here for (let i = 0; i < maxIterations; ++i) { // stuff here // there are a bunch of stopping conditions here } } ``` After choosing a random position on the heightmap, where we want the raindrop to land, we're gonna want to simulate it traversing and rolling down the heightMap. These raindrops are then going to carve out shapely ridges and deposit sediment at the bottom of valleys. A good visualiztion for what this looks like over the course of the simulation can be seen in [Job Talle's write up](https://jobtalle.com/simulating%5Fhydraulic%5Ferosion.html?ref=gorillasun.de) on the same algo: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/img-1-.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/img-2-.jpg) Job calls the raindrops 'snowballs' instead. To figure out where the raindrop needs to go, we first need to compute the gradient at the current position of the raindrop. The gradient here, is a vector pointing in the direction of 'least resistance', meaning that in most cases the raindrop will be rolling downwards, and maybe sometimes a little upwards if it reaches a valley and has some momentum. For this purpose Nat devised a separate function called calculateHeightAndGradient(mp, posX, posY) that takes in the current position of the drop as well as the height map: ```javascript function calculateHeightAndGradient(mp, posX, posY) { // flooring the coordinates to use them as grid indices let coordX = floor(posX); let coordY = floor(posY); // the fractional part stored separately let x = posX - coordX; let y = posY - coordY; // values of the surrounding grid entries let heightNW = mp[coordX][coordY]; let heightNE = mp[coordX + 1][coordY]; let heightSW = mp[coordX][coordY + 1]; let heightSE = mp[coordX + 1][coordY + 1]; // bilinear interpolation let gradientX = (heightNE - heightNW) * (1 - y) + (heightSE - heightSW) * y; let gradientY = (heightSW - heightNW) * (1 - x) + (heightSE - heightNE) * x; let ht = heightNW * (1 - x) * (1 - y) + heightNE * x * (1 - y) + heightSW * (1 - x) * y + heightSE * x * y; return [gradientX, gradientY, ht]; } ``` What's happening here? Firstly, because the raindrops don't always exactly land on the grid and can have a fractional part in their coordinate values, we'll want to remove this fractional part and store it separately. This can be done by simply flooring the coordinate values and then subtracting them from the original value again. We need the floored values to access the height map array and get the four grid entries that surround our raindrop. We need the elevation value of these entries to estimate the gradient. This is done with a formula called [bilinear interpolation](https://en.wikipedia.org/wiki/Bilinear%5Finterpolation?ref=gorillasun.de), and essentially takes into consideration where the raindrop falls in between the grid entries. If it is closer to the top-left cell for example, then the values of that cell are weighted more heavily against the values of the other 3 cells. Here the same is done for the height value as well. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-1.png) Bilinear interpolation formula Additionally, the direction of the raindrop is computed as a combination of the old direction and this newly computed one, by interpolating them with an inertia parameter. Nat fixed this parameter to 0.5. Now that we have a way to simulate the raindrop traversing the height map we still need to make it pick up and transport material in form of sediment, as well as define conditions for when to drop it off, such that it spreads it across the height map as it traverses it. This part of the procedure is a bit complicated and there's rather a lot of variables that need to be kept track of, but I'll try to keep it simple and not get lost in the details. The heart piece of the nested loop is the condition that determines if new sediment needs to be picked up, or alternatively if some amount of sediment needs to be dropped off: ```javascript if (sediment > sedimentCapacity || deltaHeight > 0) { // deposit else{ // erode } ``` Here the variable *sediment* is how much material the current raindrop is holding, whereas the variable *sedimentCapacity* represents how much material the drop can contain at any given moment, it is calculated as a function of several other factors: ```javascript let sedimentCapacity = max(-deltaHeight * speed * water * sedimentCapacityFactor,minSedimentCapacity); ``` These factors being the drop's speed, how much water it still holds as well as how much distance it has traversed (difference between current height and previous height). The second clause in the condition simply triggers when the drop rolls upwards, which can determined by a positive change in height. As for the deposition code, we need to calculate how much of the carried sediment needs to be deposited: ```javascript let amountToDeposit = deltaHeight > 0 ? min(deltaHeight, sediment) : (sediment - sedimentCapacity) * depositSpeed * depositMap[_nodeX][_nodeY]; sediment -= amountToDeposit; ``` The calculation differs based on the condition that triggered the deposition. If we're rolling upwards, we deposit an amount equal to how much we traveled upwards, or the entire sediment that is currently held if the distance is greater than that amount. Otherwise, if the deposition is triggered by a sediment amount exceeding the capacity, we drop off an amount that is a function of the deposition speed and the entry in the deposition map that we created earlier (while creating the height map). This value is set to 0.001 and basically scales the sediment amount that is dropped off. This amount is then distributed to the four neighbouring cells again with bilinear interpolation. In the case of erosion, we don't actually only pick up sediment from the four neighbouring cells, but rather from all cells within a given radius. How much sediment is taken is based on an *influence* parameter: ```javascript let influence = 1.0 / sq(dropRadius + 1); let amountToErode = min((sedimentCapacity - sediment) * erodeSpeed, -deltaHeight) * erodeMap[_nodeX][_nodeY] * influence; ``` Again, here the amount to erode is either the distance that is traversed or the remaining capacity scaled by the speed (if that is less than the distance traversed), multiplied by the erodeMap parameter which is set to 0.1 as well as the influence parameter that depends on the size of the erosion radius. And I believe this is the gist of the erosion algorithm, I tried to simplify everything as much as possible. There is still many more parameters that take part in the overall procedure; I could probably play and break the code for hours on end. Maybe I will do a separate article on this hydraulic erosion algorithm in the future and attempt to break it down in more detail. ## Pre-computing the Scribbles So let's backtrack a little bit. We've explored the prepareHeightMap() and the erosion() functions, and have acquired a general understanding of how they work. Now let's jump back to the setup() function where we left off, and see how the eroded height map is used to position the colorful scribbles that make up the graphics. Directly after having prepared the height map, we can see another group of variables being declared: ```javascript // number of scribbly strokes to be drawn let nShapes = 8000; // number of trees and bushes let nCircles = nShapes * 0.2; // threshold condition for drawing the plants/trees/bushes let treeToScrubThresh = random(0.18, 0.28); let plantThresh = constrain(random(0.3, 0.5), 0.3, 0.45); let plantSide = random([-1, 1]); let plantSlopeLeniency = random(0.01, 0.1); ``` These are quite important as they represent the number of scribbly strokes as well as the amount of scribbly vegetation that will be drawn to the canvas. Zeroing either one of the parameters has the following effect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/0shapes.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/0nCircles.png) nShapes=0 | nCircles = 0 respectively Additionally, a couple of parameters represent thresholds that control the placement of the vegetation. Now there's actually a bunch of loops, each one being responsible for a particular type of item in the scene. We'll first have a loop at the second one which allocates the scribbly strokes that make up the terrain. Also keep in mind that right now we're just creating the objects and not actually drawing them yet to the canvas. Inside of this loop we have: ```javascript // pick a random coordinate to draw a scribble let x = random(targetSz); let y = random(targetSz); let z = y + 10; // z index required to sort for the top down drawing order // floor and constrain the picked coordinate to get the corresponding height map entry at that point let i = constrain(floor(map(x, 0, targetSz, mapTrim, mapW - 1 - mapTrim)), 0, mapW - 1); let j = constrain(floor(map(y, 0, targetSz, mapTrim, mapH - 1 - mapTrim)), 0, mapH - 1); let ns = hMap[i][j]; ``` Next we have a couple of interesting lines: ```javascript x += cos(ns) * warpSz; y += sin(ns) * warpSz; y += map(ns, 0, 2 * TAU, 0, 1) * terrainHt; ``` These lines add a slight visual swing/waviness to the scribbly field. We can accentuate this more by cranking the warpSz parameter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/warpSz-0.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/warpSz-50.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/warpSz-200.png) warpSz=0 | warpSz=50 | warpSz=200 respectively The next line is a rather important one, the best way to show what it does is by zeroing it out: ```javascript let nrm = _normalize(hMapNormal(i, j)); // 0 ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zeroangle.png) It determines the actual orientation of the scribbles. Let's see what the function hMapNormal() does: ```javascript function hMapNormal(i, j) { let _i, iDir = 1; let _j, jDir = 1; return _createV( (hMap[_i][j] - hMap[i][j]) * iDir, (hMap[i][_j] - hMap[i][j]) * jDir); } ``` I'm not 100% certain of this one, but I think I have an idea of what is happening here. I believe that this calculation is called [finite differencing](https://gamedev.stackexchange.com/a/89826?ref=gorillasun.de) and essentially computes the gradient vector at the given coordinates on the height map. The computed gradient vector, in this case, is essentially also a normal vector to the surface. Adding half a rotation, this normal vector is then used to determine the slant of these scribbles. The two parameters minStrokeLength and maxStrokeLength determine how long the drawn scribbles end up being, we can plug in different values here for a different style: ```javascript let minStrokeLen = 15; let maxStrokeLen = 30 * 0.8; let nScribbles = max(1, floor(map(pow(abs(y - z), 1), 0, pow(abs(terrainHt) + abs(warpSz), 1), 1, random(1, 3)))); ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/min-1-max-10.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/min-5-max-15.png) minStrokeLen = 1, maxStrokeLen=10 | minStrokeLen = 5, maxStrokeLen=15 respectively As for the nScribbles parameter, it determines how many layers of strokes there are within one scribble, hardcoding these values to different numbers we obtain different aesthetics: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/nScribbles-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/nScribbles-10.png) nScribbles=1 | nScribbles = 10 respectively The variable nScribbles is then used as an upper bound for the iterations of another loop in which we will actually create the different scribble objects and store them: ```javascript for (let k = 0; k < nScribbles; k++) { let r = constrain( map(nrm2, 0.0001, 0.0008, maxStrokeLen, minStrokeLen), minStrokeLen, maxStrokeLen ); let scribble = new SketchyEllipse( x, y, 5, r * random(0.9, 1.1), random(1, 2) ); } ``` We can also play a little here and see what aesthetic effect the variable r has on the sketch: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r-5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r-50.png) r=1 | r=5 | r=50 respectively It is essentially the length of the scribbly strokes, and apparently the nrm2 value that was computed earlier determines where the length falls within that range. The nrm2 being another normal vector to the heightmap. The parameter before must then be the width: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/w-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/w-3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/w-20.png) w=2 | w=3 | w=50 respectively Here Nat chose to fix it to a medium value of 5. ## Scribbly Pen Simulation A lot of thought has also gone into how the individual scribbles are composed . Here's the token with a reduced number of scribbles, making it easier to see their individual shape: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/reducednumber.png) 500 scribbles instead of 8000\. It's easier to see the shape of the scribbles this way. I already had a hunch about how the scribbles are drawn. The code confirms it though. The scribbles actually consist of many small points, that are stored within an array called 'points', which also is a member variable of the scribble object. What interests me is getting an insight into how these points are positioned. A closer look at the sketchyEllipse's constructor reveals the following code: ```javascript let nSubSteps = max(2, round(rx / hatchDensity)); for (let i = 0; i < nSubSteps; i++) { let x = map(i, 0, nSubSteps - 1, -rx, rx); let ht = ry * sqrt(1 - sq(x) / sq(rx)) this.points.push({x: x, y: ht}); this.points.push({x: x, y: -ht}); } ``` However, that's not all there is to it, Nat actually put together a really convincing scribble simulator! This loop creates the points that make up the scribble and stores them in an array, but that doesn't draw them to the canvas just yet. For that we'll have to go and have a look at the sketchyShape() class. The object oriented paradigm is used for the code that handles the different scribbles: the SketchyEllipse() class - that was used to create the terrain scribbles - extends another class and inherits functionality from it: ```javascript class SketchyEllipse extends SketchyShape { constructor(cx, cy, rx, ry, hatchDensity, outline) { super(); //other stuff } } ``` In the SketchyShape class we can find the code that makes use of the precomputed points array to actually draw the scribble. The way that this works is really cool, we actually simulate a pen tracing these points rather than just drawing the points densely close to each other. The pen in this manner, is represented by a vector: initially positioned at the first point in the array, we iteratively nudge this pen in the direction of the following point: ```javascript let targetPoint = this.points[this.penTargetIndex]; let dx = targetPoint.x - this.pen.x; let dy = targetPoint.y - this.pen.y; let ax = dx * this.acc; let ay = dy * this.acc; this.penV.x += ax; this.penV.y += ay; ``` What's cool here is **how** we move the pen in the direction of the next point. Instead of doing it in a linear manner, there's an accuracy parameter that controls how accurately we are nudging the pen in the direction. Changing this parameter we can get some interesting variations: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/acc-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/acc-0.004.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/acc-0.001.png) this.acc = 2 | this.acc = 0.004 | this.acc = 0.001 respectively There's a bunch of other parameters that control the behaviour of the pen, one of them being a density parameter, that determines how many points are drawn when we nudge the pen forward (the pen doesn't draw lines, but rather many points in between the path points): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/density-.01.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/density-5.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/density-15.png) density = .01 | density = 5 | density = 15 respectively Overall, this is an incredibly genius way to go about drawing the scribbly strokes, and it shows how much care went into the details. The other shapes in the scene, the trees for example, use this same strategy; a number of other classes also inherit from the SketchyShape class, but are setup with slightly different parameters. ## Light Map and Colours One last thing to address here is the colour selection mechanism, how it ties into the light map and how it creates such beautiful shadings of the terrain. Let's exiting the shape drawing classes, and find ourselves back inside of the setup function where we're precomputing the scribbles. We can see that the colours of the scribbles are selected based on the corresponding value in the light map at a given position: ```javascript let dt = lMap[i][j]; let lightValue = norm(dt, -1, 1); let c = paletteColor(lerp(landValue, lightValue, abs(lightValue - 0.5) * 2)); scribble.setColor(color(red(c),green(c),blue(c),64)); // slightly transparent colors ``` We used the light map value to find the index of a specific color in the palette array. How is this light map computed? We have to visit the map.js script file one final time for this: ```javascript function prepareLigthMap() { for (let i = 0; i < mapW; i++) { let row = []; for (let j = 0; j < mapH; j++) { let nrm = _normalize(hMapNormal(i, j)); let dt = _dot(nrm, lgt); row.push(dt); } lMap.push(row); } } ``` It seems we're computing a dot product of some sort. At the very beginning of the sketch we've declared a variable that represents the angle of the light source: ```javascript lightAngle = -PI / 2 + (random(1) < 0.5 ? -1 : 1) * PI / 3; lgt = _normalize(_createV(cos(lightAngle), sin(lightAngle), 0)); ``` This angle is necessary to compute the light map. The values of the light map are essentially the dot product between the surface normals of the height map and the angle of this light source. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/0-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/-PI-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/-PI.png) Angle of the light source at 0, -PI/2 and -PI respectively. Insane right? With the seed fixed, we can change the angle of this light source, almost making it seem as if we're viewing the scene at different times of the day. The question is, why do we need to compute the dot product? > The vector dot product (or inner product) of the normalized vectors *N* and *L* is a measure of the angle between the two vectors. The smaller the angle between the vectors, the greater the dot-product value will be, and the more incident light the surface will receive. | [The Cg Tutorial](https://developer.download.nvidia.com/CgTutorial/cg%5Ftutorial%5Fchapter05.html?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-2.png) The dot product is required how large the angle between the light source and the surface normal at a specific point on the height map. Using this dot product to select the colors then makes it so that steeper surfaces angled towards the light source are assigned brighter colors, whereas surfaces not facing the light surface are assigned darker colors. ## Closing Thoughts Nat's piece isn't just visually stunning, it also is an amazing feat of generative art. It was a genuine joy to dig through the code and figure out how the different components work together. I hope this breakdown is as much an inspiration to you as Nat's code was to me. Big shoutout to Nat, go show him some love on social media and check out his other tokens on fxhash! Yes, he's got more amazing stuff! Hope you enjoyed reading this! What project would you like me to tackle next? Leave me suggestions in the comments below or over on Twitter. Lastly, consider signing up to the mailing list to get updates whenever there's new content, as well as sharing this article with a friend (it helps out a lot)! - Otherwise, happy sketching! Cheers! ### Enter FxParams: Customisable Blockchain Art URL: https://www.gorillasun.de/blog/enter-fxhash-params/ Last updated: 2023-04-25T13:22:50.000Z It's only been a couple of days since FxParams launched, but we've already seen quite a few tokens hit the market that make use of it, as well as some discussion and brainstorming sessions in the discord on potential future improvements. Overall it's been an exciting couple of days! > Are you working on an fx(params) project right now? With the launch coming up quickly on March 20th, we can't wait to see what you're creating 🎨 > > Please share your WIPs here! > > & If you haven't already, get started w/ these tools 🛠️[https://t.co/WFINnOeg1c](https://t.co/WFINnOeg1c?ref=gorillasun.de) > > — fxhash (@fx\_hash\_) [March 17, 2023](https://twitter.com/fx%5Fhash%5F/status/1636766415326949378?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Let's see what FxParams is all about! # What is FxParams? Generative tokens (GTs) on fxhash consist of html/css/javascript files that are stored on ipfs (inter-planetary file system); when someone mints an iteration of your token a hash is created, stored on the Tezos blockchain and subsequently injected into your token to seed it's randomness and generate a unique artwork for the collector. In this setting, the coder needs to make sure that this specific hash always generates the same output for the collector. The way that this has worked, up until now, is that the collector usually has no knowledge in advance of what the token that they will receive looks like, because the seeding hash is chosen at random. In the early days of FxHash, the only indicator of what a token looks like was the token's preview that had it's own hash assigned. Later on, a 'variations' button was added that allowed the exploration of different hashes and their resulting artworks. FxParams changes this formula. FxParams essentially is a new, alternative way to minting tokens on FxHash, both for the artist and the collector. Using FxParams, the artist can decide to expose certain variables that influence and steer the final aesthetic of the generated artwork. Through an interface provided by fxhash, these 'public' parameters are intended to be tweaked by the collector, essentially allowing them to model a unique iteration to their liking and personal preference, before they hit the mint button. Sounds cool, right? It's worth mentioning here that this concept has been pioneered by [Crayon Codes](https://openprocessing.org/crayon?ref=gorillasun.de), which is has sadly been frozen for a while. There's still a little bit of randomness involved though: the final hash is still randomly assigned, meaning that the parameters that aren't exposed to the collector will still end up having random values assigned. This has been a little bit of a controversial and confusing point among artists and collectors, and we'll go into more detail on that in just a bit. This is already a lot to take in and brings up a ton of questions. Firstly, what implications does this have for the traditional method of minting tokens? Will it fall out of fashion, or will both methods be able to coexist harmoniously? What creative shenanigans are artists going to do with FxParams? How is this going to affect final collections? Will they naturally balance themself out or will collectors gravitate towards specific aesthetics? Additionally, what does that mean for the secondary market and market dynamics? Collecting FxParams pieces happens via a new ticketing system, which we'll also have a look at! # A closer look at FxLens First things first, what changes on the artist's side of things with FxParams? Creating an FxParams piece changes the workflow a little bit, but FxHash has also thought about that and created a tool to make this process easier. I've tried FxLens out for myself over the past couple of days, in an attempt to get my token ready for the hash, and found that it was relatively easy to get into! FxLens is essentially a node project, that you can run locally in your browser and use as a sort of wrapper around your token. When you run this node project you'll see a neat sidebar with toggles, sliders, and drop-down menus for the different parameters, as well as your sketch in the main content area: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-32.png) My favorite part about it so far is the live-reload (or auto-apply) feature. When I save my code or change the parameters in the side-bar I can immediately see the changes being applied. So you don't necessarily need to use it for FxParams pieces but can also use just use it for regular GTs. I saw that a couple of people in the discord had trouble getting set up, so here's what I did to run my p5.js sketches with fxlens: 1. Make sure you have node installed ([on mac easily done with homebrew](https://formulae.brew.sh/formula/node?ref=gorillasun.de), no idea on windows - sorry windows people). I already had node updated to the last version since I needed it for some other stuff, hence I was already good to go. 2. Run the commands described in the [fxlens documentation](https://www.fxhash.xyz/doc/artist/fxlens?ref=gorillasun.de) to get your project file set up. You should already be able to run this, but there isn't going to be any sketch there yet. 3. If you're not using any external libraries you can skip to step #6, otherwise [download the p5.min.js file](https://p5js.org/download/?ref=gorillasun.de) and drop it in the public folder. 4. Make sure to link the scripts in the index.html file. 5. Rinse and repeat for other libraries that you want to include or need for your project. Also make sure to link them! 6. If you're not using p5 you can just run all of your stuff in the index.js file. If you do, create your sketch.js file (also in the public directory) that will contain your p5 code, link it in the index.html as well, and then you can just go about business as usual. 7. When you feel ready for testing your sketch locally, pull up the terminal, navigate to the fxlens directory and run the following command: 'npm start'. A browser window should open, and if you did everything correctly you should see a sidebar with the parameters and your sketch in the main content area. 8. Having the browser's dev console open can help you figure out if there's other problems. 9. When you feel ready for minting your project, you can interrupt the project from your console (ctrl + c) and use the command 'npm run build' to create a zip file of your project. In the folder 'dist-zipped' you should find this zip file which you then can simply drag into fxhash's sandbox for testing purposes or minting it when it's ready. Note - you should always be careful downloading random npm packages, because there is never a guarantee that they aren't malicious malware. With fxhash though I have no such worries. Alternatively, if you don't want to use fxlens you can also just use the fxparams boilerplate (the script file that handles adding the parameters to the url), and perhaps build your own tool to explore these parameters. Otherwise you can always try out your zipped project in the fxhash sandbox. As for the params themself, similarly to features, they should be declared inside an array of the following form: ```javascript $fx.params([ { id: "parameter_1", name: "This is the first parameter", type: "number", options: { min: 0, max: 100, step: 1 }, }, { id: "parameter_2", name: "This is the second parameter", type: "number", options: { min: 0, max: 10, step: 1 }, }, { id: "option_list", name: "These are options", type: "select", //default: "pear", options: { options: ["ONE", "TWO", "THREE"], } } ]) ``` For you to use them inside of your code you need to get them out of this array, which can be done with another fx flavored function: ```javascript parameter_1 = $fx.getParam("parameter_1") // get the parameter by it's id ``` There's a bunch of stuff to play with, so I recommend getting it set up and experimenting for yourself, for instance you can lock parameters with the small lock icon next to each one, which makes them remain the same if you hit randomize parameters. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-1-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-6.png) # Hash Override Ideas Here's another important point to address! Once I got to the point where my token was ready for minting, I realized that my collectors would still end up with a different token than what they had dialed in. Now you're probably going to say "Wait what? What's the point of the parameters then?" What's important to understand here, is that the parameters that were chosen stay the same when the collector mints the piece, but the overall randomness would ultimately be different because a different hash than the example hash will be assigned to the minted token. While dialing in the parameters to your liking you're just working with a tentative example hash that you can also refresh. Meaning that the random() and noise() calls that aren't controlled by any sort of parameters would end up generating different values. I felt that this behaviour would be a bit odd in my case, since my token was all about the patterns that collectors could come up with. I wanted the collector to get EXACTLY what they see after dialing in the parameters. After brainstorming a bit with folks in the fxhash discord, there's actually a couple of tricks to lock in the exact artwork that the collector has created, essentially overriding the operation hash that is injected at mint time. ### Locking in the seeds with P5 If you're working with p5js you can seed the piece with the inbuilt randomSeed() and noiseSeed() and make the seed numbers available as parameters. So before dialing in the parameters of their choosing, they can lock in the seed numbers that ensure that they will get exactly what they see! But there's a couple of problems with this approach, in this manner duplicate mints become possible. For one, it might just happen by coincidence that two collectors choose the same seed numbers as well as the same parameters, resulting in the exact same mint. I think it's unlikely though that two collectors would set the seeds to the same numbers, making the range of the seed numbers something very large would probably also disincentive people from choosing popular numbers like 7, 33, 42, etc. which was a suggestion by Liam Egan in the discord: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-5.png) A second problem here, is that the chosen parameters become public after minting, they are appended to the hash and can be seen in the address bar of the browser. Which makes it possible for someone to copy these values and recreate the exact same token. But I don't see a reason why collectors would want to do this, except if they wanted to purposefully be malicious, or disrupt the composition of the overall collection. A call these things 'problems', but they aren't really. What's important here is being transparent and making the collectors understand that duplicates are a possibility and could occur. ### Using your own prng function Besides locking in the randomness seed as a parameter, an alternative approach would be by doing it under the hood and seeding the randomness with your own prng function: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-3-1.png) For example you could reuse the fxhash code itself to reseed yourself based off of one of the parameters, or you could do something more intricate that combines multiple parameter values obtain a seed. If you have thoughts on this, leave a comment! I guess, it boils down to creating parameters, and coding your token in such a manner that that the parameters have a strong enough influence on the aesthetic, where the random hash isn't of concern anymore. We'll see how this changes in the future! ### Other Considerations Some other unrelated consideration and thoughts I had while creating my token: 1. How many parameters are too many parameters? 2. How to choose a preview? For the first point, a big portion of collectors aren't programmers themself, which you should keep in mind when creating your parameters. You should try to make it as easy as possible for the user to understand what specific parameters do, and probably make these parameters have a strong visual impact on the piece. For the second point, in the case of a regular fxhash token, choosing a preview boiled down to selecting an honest hash that is representative of the average output of your code. With 'honest' I mean purposefully not choosing an outlier that is rare to occur, because the collector doesn't have the option for rerolling their hash multiple times. Later on this became less of a problem once the 'variations' button was added that allowed to explore different iterations. As for previews in fxparams I feel like you can purposefully go for a fancier iteration to showcase what your token generator is capable of. # Collecting FxParams Pieces From the collector's POV, the issue of the hash changing has caused some confusion and some clarifications had to be made: > I see a lot of people confused about fx(params) and the fact that their final mint doesn’t look like what they were seeing after tweaking parameters. > > The reason for that is that the hash of the minting operation is still involved. Basically it’s fx(hash,params), not fx(params). > > — loackme (@loackme\_) [March 23, 2023](https://twitter.com/loackme%5F/status/1638837483679936514?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Revdancat even wrote [a guide for collectors](https://www.fxhash.xyz/article/params-a-user's-guide-for-collectors?ref=gorillasun.de) to help them understand how collecting fxparams pieces works and to help them increase their chances at getting a mint that they will enjoy (GTs where the seed isn't manually fixed) One cool tip presented in his article is rerolling the example hash several times to get a feel for what the mint will potentially look like Additionally, collecting fxparams tokens is a little bit different from collecting a normal token. When you collect a params piece, you essentially collect a mint ticket. Once obtained, you can use this ticket to mint your iteration. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-35.png) This mechanism is in place to avoid unecessary stress at mint time. Things can get a bit crazy on fxhash, whenever there's a new hot drop there's often only a couple of minutes or less before it's completely sold out. It would be insane to expect anyone to play with the parameters in such a short amount of time. This ticketing system also introduces a couple of new mechanisms that are related to the sale, purchase and holding of these tickets. When the artists creates their FxParams token, they also need to set a grace period for these tickets. What is this grace period and what is it for? Theoretically, with the ticketing system in place, collectors could simply never exchange these tickets for an artwork and just hold on to them for whatever reason. Maybe it's a really sought after drop, and a ticket for this drop could potentially be of significant financial value. To disincentivise these tickets never being converted into art, after a certain amount of time, a grace period, a tax is applied to the holding of this ticket: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-4.png) If the owner of this ticket fails to pay the tax or fails to list it on the marketplace, this ticket will be foreclosed. Meaning that it cannot be used anymore. [More details about mint tickets](https://www.fxhash.xyz/doc/collect/fxparams-mint-tickets?ref=gorillasun.de). I think this is cool (question mark), and I'm not sure if traders would actually opt to hold on to tickets when they could just create the artwork and and list it? What implications this will have on market dynamics is outside my field of expertise, but I'm sure it's gonna have some effects on that as well. > 🎛️ How to exchange a [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxparams](https://twitter.com/hashtag/fxparams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ticket for an artwork. > > 1\. Open your [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 👉 collection > 2\. Select 👉 tickets > 3\. Select 👉 [#mint](https://twitter.com/hashtag/mint?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) iteration > > 4\. Customize the artwork to your liking and select 👉 mint. > (You might need to scroll down to see the mint button) > 5\. Done ✅ [pic.twitter.com/KJe4FoFzLD](https://t.co/KJe4FoFzLD?ref=gorillasun.de) > > — AndreFuchs.tez (@AndreFvchs) [March 23, 2023](https://twitter.com/AndreFvchs/status/1638835321050677249?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # FxParams Token so Far OK enough tech talk, let's have a look at some FxParams pieces that have been minted so far: > [#FxParams](https://twitter.com/hashtag/FxParams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) is fun! Collected YYYSEED by [@revdancatt](https://twitter.com/revdancatt?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and a pico punk by [@aebrer](https://twitter.com/aebrer?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/eR9Jrh0W1H](https://t.co/eR9Jrh0W1H?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 22, 2023](https://twitter.com/gorillasu/status/1638491553202315264?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The first FxParams drop by revdancatt: > WHOO! YYYSEED is sold out, the first fx(params) project, 1,000 mints, thank you everyone. > > To celebrate here's the User's Guide: [https://t.co/vhpF1uWklM](https://t.co/vhpF1uWklM?ref=gorillasun.de) > > I would have had it sooner but ChatGPT was down. I joke, I joke, there's lots of screenshots and words. > > — Rev Dan Catt (@revdancatt) [March 22, 2023](https://twitter.com/revdancatt/status/1638583154599501832?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) A surprise drop by Tyler Boswell: > So fun waking up to see all the Agave & Patchwork outputs that you all have created! Thank you so much to everyone who collected. Some favorites so far: > > #150 #162 > #132 #108 [pic.twitter.com/Edo8by6Oa6](https://t.co/Edo8by6Oa6?ref=gorillasun.de) > > — Tyler Boswell (@teaboswell) [March 20, 2023](https://twitter.com/teaboswell/status/1637841223909269504?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) These cute pico punks by Aebrer: > Kind of speechless! that's a wrap! thank you everyone for the support and most of all for having fun. A lot of you shared your experiences with me and honestly this made my week. > > No more mints left available, but in mid-April I will remove any unclaimed reserves and open it up [https://t.co/wn8SOTdE6u](https://t.co/wn8SOTdE6u?ref=gorillasun.de) > > — 🔺aebrer (aka Andrew Brereton) (@aebrer) [March 22, 2023](https://twitter.com/aebrer/status/1638685773204520960?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This is my blog, so here's literally shameless plug: > Daze Maze is up on the hash! [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Will be open for minting tomorrow but you can already play with parameters right now, link in replies 👇 > > Will also do a follow up tweet about how the seed is determined, did it a little bit differently! [#fxparams](https://twitter.com/hashtag/fxparams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/QeJ8Fm7rby](https://t.co/QeJ8Fm7rby?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 22, 2023](https://twitter.com/gorillasu/status/1638625094376235028?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Some stuff that hasn't been released yet: > 👀 [pic.twitter.com/B417K68Zgg](https://t.co/B417K68Zgg?ref=gorillasun.de) > > — loackme (@loackme\_) [March 20, 2023](https://twitter.com/loackme%5F/status/1637809535288066050?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > In [#fxparams](https://twitter.com/hashtag/fxparams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) (drop very soon) you will be able to set the parameters and the mint will be almost identical, but to avoid possible duplicates, the colors will vary slightly depending on the mint. Here is an example:[#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/wip7DnuQz9](https://t.co/wip7DnuQz9?ref=gorillasun.de) > > — Hevey (@HeveyArt) [March 22, 2023](https://twitter.com/HeveyArt/status/1638652906898423812?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # Closing Thoughts It's been fun looking into all of this and be a bit more involved with the fxhash community again. I'm looking forward to see how FxParams will develop in the future and how things will be refined with time. Until then, happy collecting! If you liked this post consider sharing it with your FxHash friends, sharing it on social media and maybe subscribing to the newsletter for future updates! Cheers! > The aspect of [#fxparams](https://twitter.com/hashtag/fxparams?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) that I'm really looking forward to is the ability to explore the mind of the artist: how they structure their algorithms and combine parameters. Being able to explore how various params affect one another can be very enlightening. 🔥🚀 > > Thanks [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)! > > — Jeff Palmer (@jeffpalmer) [March 21, 2023](https://twitter.com/jeffpalmer/status/1638201428182462464?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Goodbye Jekyll URL: https://www.gorillasun.de/blog/goodbye-jekyll/ Last updated: 2023-05-04T15:15:53.000Z **Goodbye Jekyll. We've had a good run. But it's time for something new.** I've been thinking about moving away from Jekyll for a while now. Don't get me wrong, I love the static site generator, I really do, it's served me well for over two years, but certain aspects of my workflow have become very clunky, and overall I haven't been able to be as efficient as much as I would have liked to be. For those who don't know what Jekyll is, it's the static site generator that has powered the gorilla sun blog over the past two years. By throwing together a bunch of markdown, css and html files, Jekyll makes a fully functional blog possible. You just need to tell it how to tie everything together and ta-da, blog achieved. Now you can host it for free on Github Pages or a service like Netlify. Initially, the attractive aspect about Jekyll was it's simplicity. When I decided that I wanted to start writing for the internet, I explored several options. One of them was wordpress. After a couple of minutes of trying to figure out the interface, I quickly gave up. It felt clunky, there was just too much going on, and it made me feel overwhelmed. I wanted something simpler. I was tired of complicated blogging engines like WordPress - Tom Preston-Werner creator of Jekyll What I needed was a homepage, an archive page and a way to easily push new blog posts. None of that extra crap. And that's when I was told about Jekyll. I messed around a little bit with the minimal mistakes template and instantly fell in love. 5 minutes later I had a fully functioning blog, AND it was online via Github pages. I didn't like the design of the minimal mistakes template however, I wanted something a little fancier and experimented with different templates, finally settling on the [Editorial template from html5up](https://html5up.net/editorial?ref=gorillasun.de). And that was essentially the design that I stuck with for the past two years. Last April I moved the blog from github pages to Netlify. Github pages' bandwidth limit wasn't enough for me anymore. I wrote a little bit about it, but to put it simply, I didn't like that there was no way to see how much bandwidth was being consumed whilst there was a soft limit of 100GB per month. What if I need more than that? After that I quickly got back to writing; roughly one larger piece a month. Being able to write things with markdown was a treat, but any sort of custom behaviour was a pain. Images as well as code snippets are a big part of my posts. Every time I wanted to have two images side by side I needed to post in the html code for a column layout, which quickly became very tedious. Another pain point with Jekyll was debugging. It was difficult to find solutions to specific issues that I had, especially when it came to changing around the structure of your blog. What's more, Jekyll isn't future proof. It's not actively being developed anymore and the main github repository is frozen. At this point, it's unclear if it will ever come out of it's hiatus, only time will tell. I have ambitious plans for the Blog, which is why I can't have such a big uncertainty reside at its foundation. # Getting Spooky I wasn't planning on making this big move as early as I did this year. But now I'm kind of glad that I've got it behind me. I'm hoping that I can focus a lot more on writing from now on. So first of all, why Ghost? Recently I made a substack account, considering if I should start writing on there instead, or maybe even publish both on the blog as well as on substack. However that way I would be stretching myself even thinner. I was looking for something simpler and not more work. I did end up importing my blog posts to see what it's like and it seems to be working well for the most part. I liked that there's an option to have members only content with paid subscriptions. Made me wonder if I could set up a similar functionality for my blog as well. After researching for a little bit, it seemed that it would require many tears as well as figuring out programming things with which I have absolutely no expertise, for example handling payments and all that stuff. Whilst exploring this idea, I came across Ghost, which I had heard of before but never really looked into it. Initially seemed to be a similar platform to substack, but I thing there's a lot more to it. Here are some things that I really like about Ghost: 1. The interface: simple and clean. It was a charm to work with from the get-go. Substack was kinda confusing, with the dashboard and your account being two different things, and another third view that is your substack page preview. In ghost previewing your pages/posts always happens in a neat little window. 2. Easy local install: I remember that I shed many a tear trying to get Jekyll to run locally. Getting ghost to run locally took only one terminal command. I will also not miss Ruby gems and them not working half of the time. 3. The Handle-bar syntax: similar to Jekyll ghost also has it's own handlebar syntax, with some additional functionality that I really like. For instance, the rowStart and rowEnd commands made it super easy to arrange a post list in from of a two colum layout. 4. I don't need mailchimp anymore: now I can automatically send out an email whenever I post new content, without having to do it from another service like mailchimp. It also allows me to manage and create groups of email recipients. I haven't used it as of now but I definitely want to have that option. Even you still want to use mailchimp there's also an integration for it. 5. Paid Memberships: at some point I want to be able to make a full-time living from the blog, having the ability to set up pay-walled content comes in handy in that scenario. 6. 0% fees: as opposed to substack that takes a cut. Ghost I just have to pay the monthly hosting fee (which increases with more members but we'll see) 7. Is in active development: there's new features on the horizon, there's a support forum and it overall seems like a healthy platform. 8. Easily customisable: the ghost handlebar syntax is very similar to Jekyll's, hence it wasn't very difficult to quickly modify one of the free templates to my liking. I like being in control of the design of things, unlike on substack. On ghost you can easily add code injections anywhere on any page if you need custom behaviour. So, now the big questions is: why not Eleventy? Hugo? Pelican? The simple answer to that; Ghost just has everything that I need, all of which comes out of the box and without requiring any wonky workarounds. Maybe in due time I will discover that Ghost has it's flaws, but we'll see! # The BIG Migration In total it took me 8 days to migrate the blog over from the old setup to Ghost. 8 days?! Yes 8 days. And that's honestly much faster than I had anticipated, and I'm actually really happy with how smoothly everything went. One of the things that I was worried about the most was being able to keep my links intact for SEO purposes. Serach engines like google and web crawlers really don't like broken links... So here's why this took 8 days: ## Day 1 Figuring out ghost and how the handlerbar syntax works, messing around with one of the free templates. Just getting a feel for things, you know? ## Day 2 to 4 Settling for one of the free templates and customizing it to my needs. Essentially, I wanted the blog to look fresh, but still be recognizably 'Gorilla Sun', if that makes sense? Starting with a template helps tremendously, because there's not a chance that I'd be able to put together a complete css stylesheet in just 8 days. I'm not a learned web dev, nor do I have the desire to be one... css scares me XD. I'm versed enough though, to be able to make changes for my desired positioning and responsiveness. One cool thing I'm using on the articles page is the glide.js library. These sliding card containers are really cool, and I think they're a really neat way to show the articles! The community tab is still a bit lacking, but it's a work in progress. Embedded tweets take so f'ing long to load that it's not funny anymore. I need to see if there's something that can be done about it, maybe caching them in some way. ## Day 5 There's no easy way to import posts from to ghost other than manually copying them over. And naturally that wasn't as seamless as I had hoped, twitter embeds were copied over as blockquotes, images for the most part did copy over except when I had them inside of divs (to arrange them side by side or as galleries), code snippets didn't always copy ver correctly, custom scripts and embeds also didn't copy over. So I went manually through 52 posts and tried to fix them as much as possible. That was a bit mind numbing; at the end I was just glad that I made it through. ## Day 6 Here's what I was dreading the most, setting up the gorillasun.de domain on ghost and changing the DNS settings in godaddy. Here's where a lot of problems can happen if not done correctly. I was expecting it to take some time and the website to be down for a while the DNS settings were propagated, but surprisingly that wasn't the case. Maybe 15 minutes later all the links were pointing to the respective pages and articles. The blog was good to go! Ghost allows you to set routing options and permalinks similarly to jekyll, so I was able to keep the old link structure for the blog posts that looked something like this gorillasun.de/blog/\[blog-post-title\]. That's one thing I really like about the ghost console, is that it makes it very easy to setup new categories and collections for different types of blog posts! ## Day 7 to 8 We had a little bit of turbulence tho, something that I didn't think through ahead of time was the links pointing to assets, mainly images that I was hosting in the same github repository that netlify was building the static site from. The images in the posts would be referred to under links that looked like this: gorillasun.de/assets/images/\[image-file-name\].jpg netlify was taking care of delivering these images properly. But changing the domain to ghost, naturallly these links were not valid anymore and pointing to assets that simply didn't exist. Maybe I handled this in a backhanded way but since I had all the assets in a big folder on my desktop yet again I went manually through all of the posts in the ghost editor and copied the images over. Some posts took much longer than others, for example my yearly recaps as well as the genuary 2023 recap had a million pictures and links that took forever to copy over. # Settling In Now almost one week has passed since we moved, a lot of things had to be fixed over the past week. There were some broken links, some missing texts in the blog posts, truncated code snippets, some css issues where content was larger than the screen, as well as some js bugs in the console that needed addressing. There's still a lot more to be done, but overall I feel like I'm handling it all better than I did when I started where I had no idea what I was doing. As of now, I've returned to writing and working on new articles that I'll be posting soon. I'm excited for the future of the blog, and I'll try to keep at it as much as possible going forward! Anyway, cheers! Happy sketching, blogging and reading! See you in the next post! > Hey everyone, big news! You might've noticed already, but the blog just got a fresh new look! > > I've been hard at work last week moving everything from Jekyll + Netlify to Ghost, and it should make things a lot easier moving forward. > > 👉[https://t.co/95dZi5gir6](https://t.co/95dZi5gir6?ref=gorillasun.de) > > 1/5 [pic.twitter.com/K56eLS4xu5](https://t.co/K56eLS4xu5?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 14, 2023](https://twitter.com/gorillasu/status/1635599488407543811?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Creative Coding: The New Era URL: https://www.gorillasun.de/blog/creative-coding-the-new-era/ Last updated: 2026-08-10T16:27:32.000Z ***Art and technology have a rich and intertwined history, constantly redefining each other, acting upon each other as catalysts to bring forth new forms of expression.*** Today, we find ourselves at a crossroads, where the gap between artists and scientists is rapidly closing, giving rise to a new species of interdisciplinaries that express themselves artistically through new technologies, and simultaneously push the boundaries of what these technologies were intended for. After a certain high level of technical skill is achieved, science and art tend to coalesce in aesthetics, plasticity and form. The greatest scientists are always artists as well Albert Einstein One avenue that lies at these crossroads is **Creative Coding**. In recent years, there's been an ever increasing number of people interested in learning how to use code as a medium for creative expression, and as a means to explore a new and exciting space that lies at the intersection of art and technology. Creative coding detaches code from its original purpose as a tool for functional problem solving, and redefines it as an instrument for artistic expression. Code based art practices have reformulated the way in which we think about art, providing us with a completely different angle of approach towards the arts, and have redefined what it means to be an artist in the communication age. Technical creativity might after all not be so different from artistic creativity. Over the course of the past 3 years I've had the pleasure of observing the journey of quite a few individuals, from taking their first steps into the world of creative coding, up until the present day where they've developed a completely unique voice and aesthetic, where most of these individuals originally stem from a field in the sciences. Furthermore, the space is advancing at an incredibly rapid pace, coding becoming a much more accessible practice by the day, with more information than you could possibly consume in a lifetime often only a search query away. From my vantage point, I'd even go as far as saying, that today, **Creative Coding** has become a perfectly viable career path. When previously only a fraction of people in the space were making any sort of financial profit, it is now easier than ever to jump in and hit the ground running. ***Well, I say this to entice you. It isn't really that simple.*** I'm bringing this point up to set a strong precedent for this surge in popularity; the financial aspect has played an important role in that regard. Indulging this narrative for a second, coding in general has undoubtedly become a much more sought-after skill in recent years. Besides simply being a trendy thing to do; the prospect of a prestigious career at a big tech company is a very enticing thought. Besides this, the rapid advancement of the web3 space has opened many an avenue for coders to profit from their abilities and expertise, while doing something that might in many ways be more self-actualising than grinding away at a 9-5 job. However, in the larger scheme of things, despite this massive growth, I'd still argue that creative coding is very much of a niche thing. At least in comparison to other communities on the internet. This might be due to the steep barrier of entry, where one needs to already be somewhat familiar with computer code to fully immerse themselves in the discipline and get involved with the various communities that exist around it, otherwise one would need to first become fluent enough in at least one programming language to bring their ideas to life. Hence, the aim of this article is to paint a picture of the modern **Creative Coding** landscape: what we actually mean when we bring up the term **Creative coding**, what it means to use code as an expressive medium, how the modern creative coder navigates this landscape, as well as the challenges that this space brings with it. Generative art is truly working with the essence of what shapes our new digital worlds. Coding is the key. Our future lives will be built with it. The artistic exploration of code and how it can be re-imagined, re-examined, and re-purposed is critical if we wish to build a healthy, human experience in the non-physical landscapes to come. The Importance of Generative Art - Tyler Hobbs I firmly believe that we've only scratched the surface of a new era of computation, where there's many new junction points between the arts and the sciences. ## What is Creative Coding? Kind of a silly question... right? If you find yourself reading this, you most likely already have some idea of what the term creative coding encompasses. However, if I were to ask you to explain and/or define creative coding in a couple of sentences, what would your answer be? How would others answer this question? Creative coding, in the larger scheme of things, consists of many different code based artistic practices. For example, a big one that has gained a lot of popularity in recent years is generative art, which in turn can be further differentiated into several sub-categories. Then there's also other niches, like live coding, interactive installations, web apps, etc. Essentially everything and anything that can in one way or another be characterized as original, inventive and creative and is in some form built with code, or facilitated by means of computer code, can fall under the umbrella term that is **Creative Coding**. That's a lot of ground to cover, and I think that a meaningful starting point here is to first try and find a clear cut definition for what creative coding actually is (in and of itself already a difficult task). This section is going to be a bit philosophical, but I believe it's worth indulging this question just for a little bit, and see how creative coding is perceived by the world nowadays, what different individuals on the internet think about it, and how it is portrayed by different sources. Let's pretend we're googling this one together. Starting with the internet's most trusted source, Wikipedia: ***Creative coding is an art form, where the goal is to create something expressive rather than functional.*** This definition is very succinct, however at the same time it's also extremely vague; what artistic practice doesn't attempt to create something expressive? I thought the whole point of art is to be expressive. But maybe this is especially important to draw attention to in the context of code and programming, because usually it is a tool employed for functional problem solving and for building useful things (that aren't necessarily expressive). Besides the Wikipedia entry, one of the top results for the search query **What is Creative Coding?** is an article with the same name by Tim Rodenbröcker, who's researched this question very thoroughly and even based his Master Thesis on it. He provides a much better definition in his article: Creative Coding is a method that uses computer programming for artistic expression. In this method, the goal is not predefined and the process is based on discovery, variation, and exploration of mostly unexpected results. What is Creative Coding? - Tim Rodenbröcker And I already like this one much more than the previous definition, because, instead of just saying what **Creative Coding** is, we're also depicting a couple aspects of the **Creative Coding** process. By this definition, in contrast to traditional programming, creative coding is of an explorative nature, where results are discovered and found during the process, rather than being sought out in a targeted manner. When I first started to learn how to code, being taught about syntax, variable types and different kinds of data structures in my first couple of programming courses at university, we were always told to try and plan out our code ahead of time in the form of pseudocode on a piece of paper, before we even attempted to write out a single line of code in the editor. This memory stands out to me, because right from the start, this idea of having a blueprint before getting to the code, was already being ingrained into me. At the time, I also didn't have the notion of **programming for fun**. This isn't to say that I didn't have fun coding at the time, there still was something exciting about it anyway, similar to the feeling that have you have figuring out a puzzle and then finally solving it. But generally, I was coding because I had to. This changed completely however when I first discovered P5, a popular javascript library for creative coding purposes. Very quickly the entire preliminary 'planning' phase wasn't required anymore. I could just get straight to coding. Even though I still use a notebook nowadays, its function has drastically changed, now mainly being home to doodles, ideas and hand-drawn scribbles to guide my P5 sketches, rather than containing meaningful blocks of pseudocode (there still is some pseudocode here and there). Another related topic, that Tim touches upon in his article, is that of **Generative Design**. Even though I wanted to hastily also subordinate **Generative Design** as another category under the umbrella term of **Creative Coding**, this is not entirely the case. Tim also makes this clear, and a good introduction to that field and what it encompasses is [this resource by Patrick Hübner](https://www.patrik-huebner.com/method/?ref=gorillasun.de), a designer working with code himself. In contrast to **Creative Coding**, which encompasses explorative code based art practices, **Generative Design** is a little bit more target oriented, the difference between the two being the end-goal. In **Generative Design** the aim is to make use of algorithms and tools to give the user control over the design process itself. Patrick describes it as such: By shifting the role of the creative from an artisan to a conductor, you enter a new world of flexible, system-driven design: In this world of Generative Design, the creative’s role changes to one of exploring the rules, defining the goals and curating the results. In this sense, one starts to co-create with the computer in a radically new way, making it a creative partner which can contribute to the creative process in new and unprecedented forms Generative Design is a new and exciting chapter in the field of communication design - Patrick Hübner The creation of these algorithmic design systems might still initially come together by means of an explorative creative coding process. Returning to creative code, a definition that Tim uses as a reference point and inspiration to form his own words, is by Mark Mitchell and Oliver C. Brown from their paper "Towards a Creativity Support Tool in Processing. Understanding the Needs of Creative Coders": Creative Coding is a process, based on exploration, iteration, reflection and discovery, where code is used as the primary medium to create a wide range of media artefacts. Towards a Creativity Support Tool in Processing. Understanding the Needs of Creative Coders - Mark Mitchell and Oliver C. Brown This definition introduces a new and very important notion: Code as Medium. It would be an incomplete discussion if we only looked at what creative coding is as an art practice without also discussing the underlying medium that it builds upon. Code is inherently a very precise tool; the same line of code, executed a million times will always yield the same result, as opposed to a painter applying paint to a canvas, it's impossible to recreate an identical brush stroke twice, simply due to the nature of the brush and the paint. Creative coding attempts to transcend the logical nature of code by creating expressive systems that are capable of reintroducing a human and imperfect touch. Another important point here, is not just what it means to practice creative code as an art-form, and what medium is being used, but also what is being created. 'Media artefacts' is probably the best term to encompass all that can be created with creative coding, as the main output is of digital nature (it can then subsequently be brought to life in physical form by means of some extra steps and devices). One last definition that I really liked, is by my good friend Raph, that serves well as a summary of all the definitions we've seen so far: Creative Coding is a loosely defined term used to describe a wide range of artistic practices that use computer code as a medium. Creative Code typically distinguishes itself from regular coding by the fact that it doesn't follow pre-defined specifications to solve problems for a user, but rather aims at expressing ideas and concepts. Artists, designers and developers use creative coding to make online experiences, generative art, interactive installations, and more. \- Raphaël de Courville Raph's definition makes me think that creative coding might be to traditional programming, what jazz music is to classical music. Especially because there aren't really any rules as to how the code needs to be written. One of the defining elements of Jazz music is improvisation, where performers will often play impromptu lines, composing on the spot over a given already known framework of chords and harmonies. In a way, each one of these definitions is a slightly more evolved version of the previous one, iteratively introducing different aspects of the creative coding process, one at a time. In this manner, creative coding is a fascinating modern form of expression based on an explorative process, that makes use of code untethered from any sort of standard, to create a broad spectrum of different digital curiosities. In the next sections we'll dive deeper into this topic: how code as an expressive medium differentiates itself from other art practices, and how creatives that work with code approach this process. ## Code as an expressive Medium - The art of writing Code Creativity is just connecting things. When you ask creative people how they did something, they feel a little guilty because they didn't really do it, they just saw something. It seemed obvious to them after a while. That's because they were able to connect experiences they've had and synthesize new things. \- Steve Jobs ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/headscratch.png) Today, Processing has arguably grown to become the most commonly used tool for creative coding purposes, P5JS subsequently revolutionising the way in which code based art is shared and distributed on the internet. Over the course of the past two decades, the two of them have played an instrumental role in giving birth to a completely new way of thinking about code, where code transcends its traditional role as a tool for functional problem solving. On the occasion of Processing's 20th anniversary, Casey Reas recounts the initial motivations that drove the creation of Processing. One sentence in his article [A Modern Prometheus](https://medium.com/processing-foundation/a-modern-prometheus-59aed94abe85?ref=gorillasun.de) stands out in particular: We also wanted to share a way of working with code where things are figured out during the process of writing the software. We called this sketching with code. A Modern Prometheus - Casey Reas In this manner Processing wasn't intended to simply be a new programming language, but much rather a medium for a completely new artistic practice, as well as a vessel that bridges between a graphic design oriented approach and an algorithmic principles based methodology, and to be employed for the creation of a variety of digital media. They likened working with processing to 'sketching' with code, where a sketch often is preliminary simplified version of the an artwork that is to be realised later with greater detail and accuracy, and where not all aspects of the final artwork have been figured out yet. **Sketching** per se is not a new concept. The masters of old have already been doing it for centuries: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/comtesse_sketch.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/comtesse_crop.jpg) **Jean-Auguste-Dominique Ingres, Portrait of Comtesse d'Haussonville, 1845* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/chair_sketch.webp) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/chair.webp) **Vincent van Gogh, Van Gogh's Chair, 1888* Would these famous paintings have turned out differently if the artists hadn't sketch them out in advance? Is the preliminary sketch an integral part of every great artwork's life cycle? These questions make me think, that the spot processing fills is of far greater importance than one would initially assume. In the world of computer art it provides a functional method to preliminary experimentation and the exploration of ideas, which is a crucial part of any art-making process. Besides code being a medium to express, accomplish and bring to life specific ideas, the act of writing code, is in itself artful. Over the past decades we've seen all sorts of different communities emerge that revolve around writing code in unusual ways, usually with the goal to concoct strange pieces of code, that one can execute for impressive outputs. Arguably the flagship example for this is c.donut: Donut-shaped C code that generates a 3D spinning donut A piece of c code, where the characters that make up the code are arranged in a donut shaped manner, that produces a 3 dimensional spinning donut made out of ascii characters. If this isn't art, then I don't know what is! Many more such examples can be seen as entries for the IOCCC, the International Obfuscated C Code Competition, where the goal is to create the most contrived and head spinning c code that does something impressive when compiled and executed. A record of all the winning submissions since 1984 can be found in this [github repository](https://github.com/ioccc-src/winner?ref=gorillasun.de). This isn't however the only example of a minimalist code-centric art practice: in recent years we've also seen Tsubuyaki-Processing, another code golfing challenge that revolves around creating processing/p5 sketches that fit within the character limit of a tweet (formerly 140, now 280) with the idea that this tweet sized code can simply be copied and executed by others. I've done [my fair share of these](https://gorillasun.de/blog/9-tips-for-tsubuyaki-processing?ref=gorillasun.de), and just like an approving "stank face" is a sign of a very particularly funky improvised jazz phrase, writing an impressive tweet sized sketch will most likely net you lots of street cred among the code golfing folks. > r=\[1,2\];setup=\_=>{createCanvas(w=600,w);s=w/9;fill('[#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)');q=w-s\*2;cc(s,s,q,q,7);};function cc(x,y,i,h,d){if(d>0){var \[o,k\]=\[i/2,h/2\];cc(x,y,o,k,d-random(r));cc(x+o,y,o,k,d-random(r));cc(x,y+k,o,k,d-random(r));cc(x+o,y+k,o,k,d-random(r))}else{rect(x,y,i,h)}} [pic.twitter.com/jkz5yxWNRU](https://t.co/jkz5yxWNRU?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 22, 2022](https://twitter.com/gorillasu/status/1517443874792353792?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I believe that the draw of these code golfing challenges, is that they are essentially displays of prowess and mastery in writing code. To be able to compress an idea into such a short snippet, one needs to have mastered the basics and fundamentally understand how code works beyond a superficial level, playing and moulding the shape of the code. And this without it being an elitist practice; from my own experience, the individuals who are really good at code golfing are usually the most humble people who simply do it for the love and joy of writing code, rather than for the sake of showing off. Another movement that places the aesthetic and expressive capabilities of code in the spotlight is Zach Lieberman's [School of Poetic Computation](https://sfpc.study/about?ref=gorillasun.de). An early catalyst for my interest in creative coding was a talk by Zach Lieberman on the very same [idea of poetic computation](https://www.youtube.com/watch?v=bmztlO9%5FWvo&ref=gorillasun.de). Early into my creative coding journey, while searching for P5 tutorials, I came across his talk on youtube. The most memorable part being the short sketch that he demonstrates as a live coded example, with the intent to show the audience what it is that he does in creative coding on a daily basis, as well as what it means to play and explore ideas with code. With a couple of lines of code Zach creates magic: by positioning many circles in a vertical manner on the canvas, and making them move from side to side in a sinusoidal fashion, the illusion of an oscillating line emerges. Plugging in different numbers into the functions that control the circles' movement and colors, various colourful squiggles can emerge. I keep finding myself coming back to that particular sketch, trying to find new ways to reinvent it and see what more I can get out of it. From one point of view, seeing Zach code up the sketch felt like watching a magician/illusionist performing, where the reality doesn't match up with the expected results. This is to show that a lot of computer graphics attempt at creating visual illusions, that you wouldn't be able to predict by simply reading the code. Amy Goodchild has a really insightful article on the topic of [Emergence and Generative Art](https://www.amygoodchild.com/blog/emergence?ref=gorillasun.de). From another viewpoint, approaching creative code in this manner is a little bit like writing poetry. Take haikus for example: the structure and form is already prescribed, but the choice of words is completely up to you. The words that you end up plugging into your sentences, and how you arrange them, can have a drastic effect on the overall mood and tone that the final poem conveys. Similarly, syntax is rigid and imperative, otherwise the code will simply not compile, however the content of the variables that guide your system is completely up to you. Depending on what data you end up plugging into your code and how you combine and chain your function calls together, will ultimately yield completely different outputs. Today, code is also a performance art, which becomes apparent when we look at a relatively recent phenomenon better known as algoraves, that are centred around live coded music and visuals. These get togethers are usually set up in such a manner that the code that generates the music is projected on a large screen visible to the audience. In this manner the code itself being written becomes part of the experience. In this setting the performers usually find themselves on stage, similar to musicians, dancers or other performance artists, writing the code in real-time in front of the audience. Ultimately, Code is a language, just like music or poetry. It can be used as a medium to express ideas, and as a vessel to bring them to life. Moreover, the act of writing code, is in and of itself also an art-form, be it to shape aesthetically pleasing structures with the code itself, or to showcase a certain level of mastery over the medium. When something is given to you as a medium or tool, is its meaning or functionality as that tool fixed? Absolutely not. What is Poetic Computation - Katrina Allick ## How is Creative coding, as an Artform, different from other Artforms? There's many established practices and conventions that exist in the world of programming, that are generally utilised to accelerate and simplify the process of building good software. And generally these practices are completely unique to code as a medium. Some of them carry over and also find their way into creative coding, the most important ones being: 1. The reusability of Code 2. Open Source culture: using other people's code 3. Versioning: A window into the past Code is inherently modular; just like lego blocks where one piece can be combined with many others to create different structures. The same is true for code, functions are like this, often built in a self contained manner with clear specifications as to what the inputs and outputs need to be, allows us to plug them into different settings and reuse them across multiple projects. Functions are just one example here, this also applies to specific lines of code. In the traditional arts this concept of modularity doesn't exist, a painter for example needs to begin new paintings from scratch every single time, whereas the coder can use snippets from older projects as footholds. In this manner, the coder doesn't only gain conceptual knowledge, but also a repertoire in form of a versatile tool-belt. Likewise, not only can the coder reuse his own code, but can also make use of code written by others. The open source movement makes this possible, where code is shared with the specific intent for it to be reused, remixed and reinvented by others within the context of their own projects. Oftentimes, instead of attempting to write a certain algorithm from scratch, it might be easier to just use an already existing library that implements a highly optimised version of that algorithm. And a third point is versioning, code makes it easy to keep a history of how a piece developed over time, simply by saving separate iterations of the code or by using a versioning tool like Github. These previous iterations can then serve as a reference point, visualising how a piece evolved over time, and can at the same time serve as a safety hook to revert back to a previous point if the current direction of the project isn't satisfactory. And these are only a few of the aspects that are unique to code, that don't generally occur in other art-forms. Now, what actually happens in the mind of the programmer while writing code? It would be very interesting to take a peak and peer into the mind of different code artists, see how their thoughts churn while coding, and what it actually feels like to them to make art with code. ## The Creative Coding Process I’ve recently been having a strong sensation that I am finding generative art, rather than creating it. Even so, when I asked other generative artists how the process feels to them, I expected that most would say it mostly feels like creation. I was completely wrong! How does it feel to make Generative Art? - Amy Goodchild ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Process22.png) In recent years, it's become a popular practice for artists to share **work in progress** posts (#WIPs) on social media, showing snapshots from rough and unfinished projects. Often, the artist's goal in this setting is to take the audience along on a journey: showing how much time and effort has been put into a project allows for a much deeper understanding and appreciation of the final artwork. Even though each individual has a completely unique trick-bag, I believe that the vibrant sketching culture, that we've seen emerge on social over the past couple of years, has reinforced certain heuristics that guide the code based artist's process. Different approaches often revolve around the methodology with which the artist develops new ideas, dictate at which rate new works are created and how these artworks evolve over time. In many scenarios, the creative coding endeavour begins as a search, an exploration even, where there's no expectation of what the output should look like. In this setting the coder assumes the role of a traveller that ventures into uncharted territory with the hope of making new discoveries. An excellent article that explores this topic in depth is by Amy Goodchild: [How does it feel to make generative Art?](https://www.amygoodchild.com/blog/how-does-it-feel-to-make-generative-art?ref=gorillasun.de). Amy poses an interesting question: creating generative art, does it feel more like **making** the art, or more like **finding** the art? Asking other creative coders on Twitter, the consensus was the latter; many feel that they find and discover, rather than mould ideas into existence. > Generative artists - does it feel more like you are creating the art or finding it? > > — Amy Goodchild (@amygoodchild) [September 22, 2021](https://twitter.com/amygoodchild/status/1440674996305735680?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) One of the replies from this thread that stands out is by Zach Lieberman, who pitches a fascinating perspective: I feel like I am a wildlife photographer trying to capture the best moments of some wild thing that keeps changing / evolving (that I created) Zach Lieberman Zach essentially lets his code have a life of his own, allowing the code to evolve in whichever manner feels right. Zach has talked extensively about his artistic process, and his personal approach to a daily creative coding practice. One of his personal rules while sketching is "prioritising iteration over novelty", and even turned this into his motto **ABI**: Always be iterating. He believes that it is through this iterative process, that can often end up being a very tedious thing, that new methods and new ideas manifest themselves: But now I feel like creativity is more about tedium, doing the same thing again and again, almost like a meditation, and that what matters are the shortcuts, the breaks, the changes, the alterations you make. Daily sketches in 2017 - Article on Medium - Zach Lieberman Saskia Freeke, who has been keeping up with a daily coding practice for the better part of the past 7 years has a similar perspective: Iteration is the key to exploring; even the slightest little change can give you new ideas. Reuse your work when you can, and try to combine elements of other earlier sketches as well. A Conversation with Saskia Freeke Another prolific creative in the space, is Tyler Hobbs. Tyler has a similar philosophy and approach to creating new works, in his article 'reflecting on 5 years of generative art' he states: What I've been surprised to find is that "ideas" aren't really important. What is important is putting in time at the studio (or at the desk in your bedroom). When I physically make myself sit down and do something, new work comes out. Reflections on 5 years of making art through programming - Tyler Hobbs Which has from personal experience also worked for me. Sometimes the goal of an 'art making' session shouldn't be to end up with a new piece at the end but rather just the act of exploring itself. This often reminds me of freeform writing, which is an exercise from the world of creative writing, sometimes also called 'writing without thinking' where the goal is to simply put pen to paper and start writing, where the important thing is not the quality of the ideas that you are writing out, but simple that you are writing. > Finding it - Discovery and experimentation is one of the most fulfilling parts of generative work. | Chris Reid, Generative Collective What I've been surprised to find is that "ideas" aren't really important. What is important is putting in time at the studio (or at the desk in your bedroom). When I physically make myself sit down and do something, new work comes out. Discovery and experimentation is one of the most fulfilling parts of generative work - Finding it Alex McLean, a successful live coder likens working with computers to the spoken language. In an interview [interview](https://origin.dazeddigital.com/artsandculture/article/16150/1/what-on-earth-is-livecoding?ref=gorillasun.de) he states that working with computers is essentially working with language machines: I think it's important to consider programming as exploration rather than implementation, because then we are using computer languages more like human languages. Any software interface can be thought of as a language, but the openness of programming allows us to set our own creative limits to explore, instead of working inside fixed, pre-defined limits. To me this is using computers on a deep level for what they are - language machines What on Earth is Livecoding? - Alex McLean Thinking about computer code more like a human language is also something Memo Akten hints at, with the idea of treating the act of writing code for the arts might be more like the spoken word rather than the written one. > Basically this 👇 (but slower - unless there's a deadline looming)[https://t.co/AMDRfESGwv](https://t.co/AMDRfESGwv?ref=gorillasun.de) > > — memo akten (@memotv) [September 23, 2021](https://twitter.com/memotv/status/1441043625547337728?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also like Tim Rodenbröcker's way of thinking about it, likening the creative process to a collaborative one where the artist engages in a dialogue with the machine: In creative coding, programmers enter into a creative dialogue with the computer. They speak to it in a language it understands (code) and formulate instructions for displaying visual objects on a surface. At first, they have little control over the computer’s behaviour. That’s perfectly okay, because surprising results always lead to new ideas and perspectives. What is Creative Coding? - Tim Rodenbröcker Other times, the explorative process isn't as unstructured as we've established up until this point. Often it is the case that there is a vague notion of what the expected output should ultimately look like, where the artist attempts to draw their vision from the spirit realm onto the canvas. However, throughout this process, a big chunk of the details are often unclear, and require to be figured out by means of experimentation and discovery. Oftentimes the expected output then manifests itself as something completely different that one could have imagined in advance. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Target.png) In this sense there is a discrepancy between the initial expectation and reality: Expectations and reality rarely line up, but I always enjoy the surprises between the two. Definitely feels like discovery/finding. Chris Lesage In code, I often find that these unexpected outputs manifest themselves in the form of bugs and implementation mistakes. If we were able to express our ideas perfectly in the form of code from the get go, then bugs wouldn't happen and consequently we would never come across unexpected outputs. But man is fallible, and perfect translation is merely an ideal. Mistakes are what make art human. This can also be seen in other art practices, an interesting example here is Jean-Auguste-Dominique Ingres' famous portrait of Countess D'Haussonville (1780), of which we've already seen the sketch earlier: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/comtesse.jpg) There's two things in this painting that don't really make sense. Can you spot them? The first one that I noticed was the reflection, which is questionable... her index finger shouldn't be visible to us, except if the mirror was somehow positioned in a skewed manner maybe. The next thing is her right arm, which must somehow be jotting out from the middle of her chest and anatomically doesn't make sense. But that doesn't matter, because the painting works. When you don't focus your eyes on these details it looks and feels right. Ingres is often praised for this. Maybe these were deliberate artistic choices after all, or details that unintentionally were **lost in translation**. My favourite way to look at these mistakes, is Bob Ross' philosophy: ***We don't make mistakes, we make happy accidents.*** --- **Stephen King:** *"We're gonna have to wrap this up pretty soon \[...\] is there anything that you've always wanted to ask me?"* **George R. R. Martin chukling:** *"Yes, yes, there is something I've wanted to ask you. How the f\*ck do you write so many books so fast?!"* **Hysterical laughter ensues**. --- The last idea that I want to touch upon in this section, is actually an analogy that stems from the world of writing, and is originally a thought from George R. R. Martin that he shares in an interview. In this analogy he states there are two different kinds of writers: **I think there are two types of writers, the architects and the gardeners.** The gardeners dig a hole, drop in a seed and water it. They kind of know what seed it is \[...\]. But as the plant comes up and they water it, they don't know how many branches it's going to have, they find out as it grows. And I'm much more a gardener than an architect. George R. R. Martin In essence he is describing two different rhythms at which writers operate. One rhythm being methodical, careful and systematic, where steps are planned beforehand and blueprints are made to minimise the surprises that could occur, and thus earning the title of an Architect. Whereas the Gardeners plant ideas like seeds, that could grow into a number of different shapes and forms over time. And I believe that this notion is also applicable to creative coding; to all types of creative professions as a matter of fact. Again I will bring up Zach Lieberman here. In an interview with \_creativelives he says, that in a way, the creative is akin to a farmer, that plants different seeds and lets them grow over time, however some of these seeds might not come to fruition until several seasons down the line. > [ View this post on Instagram ](https://www.instagram.com/tv/CWYRqVrtTjt/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) > > [A post shared by Creative Lives in Progress (@\_creativelives)](https://www.instagram.com/tv/CWYRqVrtTjt/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) He brings up this point to show the importance of having a sense of time: ideas don't just develop over the course of a single project but often transcend this scale, evolving over the course several projects. ## The Dark Side of Creative Coding ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Impostor.png) We've covered quite a bit of ground up till now: we've had an in depth look at what it means to make art with code, we've inspected how code as a medium differentiates itself from other mediums as well as what goes on inside of the mind of the code based artist. However, one point that isn't addressed enough, is the difficulties and hardships that this new discipline brings with it. As much as art and code can have a harmonious relationship, often it is also the case that a dichotomy presents itself between the technical and the artistic, where the artist then needs to somehow reconcile between the two. Let me explain. From an outsider's perspective, as well as those trying to get a foothold in the world of creative coding, it might often seem that the technical aspect of the discipline is the hard part. To someone who doesn't know the first thing about code, it might in many ways even seem like wizardry. Partially that isn't untrue, it can initially take some time to fully wrap your head around one of the many creative coding languages/frameworks. Hell, shader programming still feels like sorcery to me. Those who are good at it must have surely made a pact with the devil. But just like in other disciplines, the true difficulties will only reveal themselves once one has acquired a good understanding of the basics. Recently, for example, I have rediscovered an interest in the game of chess. When I was younger, I had the opinion that it was a relatively boring game, I didn't really understand what made it a difficult game. Ah, you just move some pieces here and here and then someone wins in the end. However it's much more than that, it's fascinating how this arguably simple set of rules coupled with two symmetrical starting positions can lead to incredibly convoluted and puzzle-like positions, just after a few initial moves a multitude of possible lines of play become possible. And I've come to find, that this battle of wits often almost feels like a battle to the death, and that playing a game of chess gives me the same dopamine rush as playing a round of COD. This is a bit of a far-fetched example, but the same is true for creative coding. When it might initially seem that learning how to code is difficult, later on different problems emerge. Once you've become fluent with a specific programming language, how do you actually make use of that skill and knowledge to create an interesting artwork? What began as a technical difficulty now suddenly towers over you in the form of something much more philosophical. Something that isn't as tangible or approachable as a programming problem, that you will probably be able to solve given enough amount of time. Something that requires intuition, an eye for aestheticism as well as a **feel** for that magical sprinkle that ultimately elevates a simple computer graphic into what one could call an **artwork**. Tyler Hobbs, who has addressed many of these issues within his essays, describes this beautifully: Now the hard part comes: you have to make something new. Not just copying a tutorial, but pulling it out of the ether. What the hell could you make that would be interesting? You fumble around until you get lucky. You take a half-baked idea, and mash at it until it's passable work. Congrats, you made something! | Reflections on 5 years of making art through programming - Tyler Hobbs This is also something that I've personally struggled with a lot. I often find it much easier to start new projects, exploring new ideas, and what they would look like on the canvas has always been the exciting part. Just like solving little puzzles, these little explorations have always been rewarding and educative in a way. However, when it comes to transforming these ideas into something more than just an exploration, it's always been a struggle. I believe that this is partially due to the absence of a clear-cut method to approach this problem. Earlier, we've already tackled some of the heuristics that different coders employ to approach the process: Zach Lieberman and Saskia Freeke believe in the concept of iteration, always iterating and evolving previous ideas, similarly, Tyler Hobbs believes that one simply has to put in the time and new art will emerge. These approaches however require the artist to have a lot of trust in them, essentially 'trusting the process', which can often be an emotional challenge. Without the guarantee of receiving an artwork at the end of the day, it can quickly become frustrating and demoralising, making these heuristics sound at best like 'just keep working on it, it'll eventually turn out fine', which I think is hardly good advice. This directly feeds into other problematics, narratives of self-doubt and feeling like an impostor. How could I possibly call myself an artist, if I can't consistently make beautiful and interesting art? Impostor syndrome is a topic that has been discussed at length in the context of the arts and creativity. Often impostor syndrome manifests itself as a feeling of personal incompetence and doubt in one's own qualifications. This negative perspective on one-self can severely hamper one's personal growth, besides the avoidance of taking risks and procrastination, it can also lead to severe burnout in the long term when one constantly pushes oneself harder and harder without ever being satisfied with the work. > Sometimes I get imposter syndrome. But then I remember that nobody really knows what the hell they're doing. [pic.twitter.com/1ZvoNzUBcv](https://t.co/1ZvoNzUBcv?ref=gorillasun.de) > > — Jeff · ippsketch (@ippsketch) [April 27, 2022](https://twitter.com/ippsketch/status/1519312121556881408?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) On the flip-side, occasionally feeling like an impostor can have some potential upsides, it can serve as fuel and motivation to improve, and produce better work than before. Essentially exploiting these feelings of self-doubt as a springboard to becoming a better artist, instead of letting them be shackles that weigh you down. Something that has helped me tremendously in that regard, which might not work for everyone, is being very stoic towards previous works of mine, judging them solely in an objective manner, almost as if it wasn't me who had created that art. In that way, I am judging the art, but not myself, if that makes any sense. After all, once you've completed an artwork and released it into the world, it doesn't need you to like it. Others will see things in it that you probably haven't. ## Creative Coding and Social Media Another pain point for many creative coders, and probably a lot of artists in general, is incorporating social media as a step of their artistic process. As mentioned earlier, it's become somewhat of a common practice for code artists to post and share updates on their works in progress (WIP), as well as tidbits about their creative processes. This is partially due to social media algorithms encouraging frequent updates from the users, but more-so because an ongoing discourse and exchange of ideas is beneficial to both artists and their audiences. The artist can actively engage with his audience, take their feedback into consideration and at the same time the audience gains a deeper understanding of the artists' vision. On the other hand this can also build an unhealthy pressure, where it almost starts feeling like an obligation to post every day. Sometimes there simply isn't anything new to post, there can't be something new and exciting every single day, the algorithm however, still expects you to conjure something up from thin air and post it. If you do post you'll be rewarded with engagement and your daily social media dopamine kick that you've somehow become addicted to. Viewing your art through the lens that is social media can often contort the perception of your own art. Social media quantifies your posts in terms of likes, retweets and overall engagement, if viewers don't engage, or quickly scroll past your posts then it deems these posts to not be very relevant, swiftly truncating the lifespan of these posts. The algorithm favours posts that provoke an immediate reaction from the viewer; content needs to be consumed instantaneously and needs to retain the viewer's attention, posting an artwork often doesn't elicit such reactions, it'll pop up in your followers' timelines, their eyes will register a pretty image, maybe look at it for a fraction of a second and then be on their merry way. Posting work that you've carefully put together over several hours or days, and not having it receive the reaction that it deserves can be extremely demoralising. *Why am I not getting many likes? Is my art bad? What am I doing wrong?* I've asked myself all of these questions before, and the blunt answer to all of them is that the number of likes simply doesn't reflect the worth of an artwork. In the larger scheme of things, it's simply a random number. If you would have posted at a different time of the day for instance, it would have been a different number. ## Concluding Thoughts Creative coding is an incredibly multifaceted discipline that finds itself at the junction point of the arts and the sciences. It is a diverse and nuanced amalgamation of different code based art practices that push the boundaries of computer code in various manners, and are also actively shaping the art of the future. In this rapidly advancing space, it's the creative coder's duty to investigate how new technologies can be utilised for the arts, and what effect these technologies will have on the evolution of the art space in the coming years. As it stands today, we are still at the beginning of a very long journey, where humanity engages in a discourse with the machine. In this context, creative coding is just one discussion out of many, but nonetheless a very important one. ## List of articles in order of appearance 1. [The Importance of Generative Art](https://tylerxhobbs.com/essays/2021/the-importance-of-generative-art?ref=gorillasun.de) \- Tyler Hobbs 2. [What is Creative Coding](https://timrodenbroeker.de/what-is-creative-coding/?ref=gorillasun.de) \- Tim Rodenbröcker 3. [Generative Design is a new and exciting chapter in the field of communication design](https://www.patrik-huebner.com/method/?ref=gorillasun.de) \- Patrick Hübner 4. [Towards a Creativity Support Tool in Processing. Understanding the Needs of Creative Coders](https://dl.acm.org/doi/10.1145/2541016.2541096?ref=gorillasun.de) \- Mark Mitchell and Oliver C. Brown 5. [A Modern Prometheus](https://medium.com/processing-foundation/a-modern-prometheus-59aed94abe85?ref=gorillasun.de) \- Casey Reas 6. [Emergence and Generative Art](https://www.amygoodchild.com/blog/emergence?ref=gorillasun.de) \- Amy Goodchild 7. [What is Poetic Computation](https://medium.com/sfpc/what-is-poetic-computation-2284fcf7086c?ref=gorillasun.de) \- Katrina Allick 8. [How does it feel to make Generative Art?](https://www.amygoodchild.com/blog/how-does-it-feel-to-make-generative-art?ref=gorillasun.de) \- Amy Goodchild 9. [Daily sketches in 2017](https://zachlieberman.medium.com/daily-sketches-in-2017-1b4234b0615d?ref=gorillasun.de) \- Zach Lieberman 10. [A Conversation with Saskia Freeke](https://datasciencebydesign.org/blog/a-conversation-with-saskia-freeke?ref=gorillasun.de) \- Saskia Freeke 11. [What on Earth is Livecoding?](https://origin.dazeddigital.com/artsandculture/article/16150/1/what-on-earth-is-livecoding?ref=gorillasun.de) \- Alex McLean ### Genuary 2023 Recap URL: https://www.gorillasun.de/blog/genuary-2023-recap/ Last updated: 2024-09-05T09:22:43.000Z Genuary has been an absolute whirlwind tour-de-force of a month! You might've already seen some posts on social media with the #genuary hashtags, have had a crack at some of the prompts or even made it through all of the daily prompts (in that case I salute you!). Genuary is a month long event where creative coders come together, roll up their sleeves and code up sketches in response to a daily prompt. In a sense, Genuary is the generative art world's answer to inktober. It's only been the 3rd Genuary so far, and overall my second time participating, but it already felt much bigger than it did last year, just from the amount of people that participated this time around! We also saw two attempts at speedrunning all Genuary prompts in one sitting, first by [Raph](https://www.twitch.tv/videos/1708134020?ref=gorillasun.de) and later also by [Daniel Schiffman](https://www.youtube.com/watch?v=QyGG15J9bAc&ref=gorillasun.de) from the coding train. The current record stands at roughly 3 hours and 45 minutes, but that might change soon! Another big thing this Genuary was #GenuaryTogether, an initiative by Raph where prompts become a group effort and can be approached as collaborative pieces. Here's the first sketch in that regard by [Raph](https://twitter.com/sableRaph?ref=gorillasun.de) and [Lionel Raddison](https://twitter.com/MAKIO135?ref=gorillasun.de): > Happy new year everyone and thank you again for 2022! 🖤 > > I'm super happy to start 2023 with the first collab of [#genuaryTogether](https://twitter.com/hashtag/genuaryTogether?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) with [@sableRaph](https://twitter.com/sableRaph?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) on the perfect loop theme 🙌[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/2FYMo4MmR9](https://t.co/2FYMo4MmR9?ref=gorillasun.de) > > — Lionel Radisson (@MAKIO135) [January 1, 2023](https://twitter.com/MAKIO135/status/1609592429878939648?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I tried my best to get a sketch in for the daily Genuary prompts, but the daily-ness of this sketching routine quickly fell apart at some point as there were some other things that I had to take care of. But that’s just life! Not gonna beat myself up about it, I ultimately managed to catch up, and overall I’m really happy with all of the sketches that I came up with, some of which I think I'll dig into more throughout the coming weeks. Sometimes the best way to go about creative coding is while being on a time crunch, that’s when the best ideas happen and you really tap into that hidden creativity compartment at the back of your head! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Fl_pNYjacAIB_55.jpg) by Cyberia on [Twitter](https://twitter.com/cyberia%5F%5F/status/1619352095143911426?ref=gorillasun.de) Here’s a rundown of my Genuary sketches alongside some commentary about the idea and inspiration for each one of them as well as some thoughts on the code that went into their making! I'll also round up my favorite sketches, at least the ones that I've seen in my feed, there have been some absolute bangers! **This article contains a lot of media and links, hence it might take a couple of seconds to load!** Here's a messy quick index to the different sections if you're interested in a specific prompt in partiular. # #01 - #10 ## #01 Infinite Loop For the very first prompt I wanted to make an animation I had already been thinking about for weeks at that point. It was a bit of an exploration until I figured out how to put it together. The initial inspiration was this infinite Mondrian loop by Feliks Tomasz that I found on giphy: I believe it was even minted as a token in the early HEN days! However, after some initial attempts, I couldn’t really figure out how to recreate this infinitely looping spiral. After searching a little more I came across another animation that I thought to be a bit more approachable: You might already have a hunch on what's going on here! Essentially, the ratio at which the squares are expanding here is better known as the ‘golden ratio’ (a very popular ratio in creative coding as well). This ratio also describes the Fibonacci sequence, where each element in the sequence is the sum of the two previous elements. Dividing an arbitrary element in this sequence by its immediate predecessor yields this golden ratio. Now, when visualising this with squares you might say that the third square is clearly larger than the sum of the two previous squares! And visually that is true, but you have to keep in mind that we’re not representing the area, but rather the length of the sides. In my first attempt I focused on recreating only one of the four quadrants of the animation, since the other 3 are just rotated mirror images. I quickly realised though that it wasn’t as straightforward as I had initially thought, I did get something going that looked pretty close, but it wasn’t really a Fibonacci sequence, just some expanding lines: I returned to a sketch that I had done just a couple of days prior to that, that actually made use of the Fibonacci formula to obtain the size of the squares. Positioning the squares in that distinct manner can be done with two parameters and a couple of if conditions that keep track of things. Now to the hard part: animating this thing somehow. The majority of examples for the Fibonacci sequence start with the two initial values 0 and 1, but it isn’t necessary to start with these two numbers, in fact you can start with any two arbitrary numbers. For example, 0 and a very small number like 1e-4, and we’d still end up with a valid Fibonacci sequence if we keep adding them up. Using the same code to draw out these fibonacci tiles, we initially get many small rectangles, so small in fact that they’re practically invisible on the canvas. To animate this, we can now simply increment the starting values of the sequence, redraw the squares and export the frame to later compile into a GIF. But there are two problems here: firstly, at which rate do these starting numbers need to be incremented for a visually constant and smooth expansion of the Fibonacci tiles? And secondly at what point do the squares line up again? The second part is important for resetting the animation and making it seamlessly loop. And I still haven’t found the answer to either one of these questions… I ended up cheating a little bit, trying out different numbers and manually checking where the animation lines up again. When the rate of expansion is slow enough it is virtually smooth. That’s also why the animation speeds up a little bit towards the end and then slows down again, I didn't actually mind it too much, thought it kinda looked like an easing function. If you have some thoughts on this please let me know! Would love to get this right! [Piter Pasma](https://twitter.com/piterpasma?ref=gorillasun.de), who's also the mastermind behind Genuary and the one who put together [the Genuary website](https://genuary.art/?ref=gorillasun.de) that lets you keep track of all the daily prompts. He kicks off with a sketch that is just absolutely bonkers: > [#GENUARY](https://twitter.com/hashtag/GENUARY?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 2023 Day 1: > Perfect loop / Infinite loop / endless GIFs[#genuary1](https://twitter.com/hashtag/genuary1?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/tzCJBJ3aaa](https://t.co/tzCJBJ3aaa?ref=gorillasun.de) > > — piterpasma (@piterpasma) [January 1, 2023](https://twitter.com/piterpasma/status/1609528153415761929?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) A second stunning loop is by [Yann Le Gall](https://twitter.com/Yann%5FLeGall?ref=gorillasun.de), where we can also already see a little sneak peek of day 12: > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 1 and 12: looping dynamic tessellation[#genuary1](https://twitter.com/hashtag/genuary1?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary12](https://twitter.com/hashtag/genuary12?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#art](https://twitter.com/hashtag/art?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#loop](https://twitter.com/hashtag/loop?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/pnBYN6X7A2](https://t.co/pnBYN6X7A2?ref=gorillasun.de) > > — Yann Le Gall (@Yann\_LeGall) [January 17, 2023](https://twitter.com/Yann%5FLeGall/status/1615403887695126531?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #02 Made in 10 Minutes Numerically this was my most successful genuary tweet! I just felt really good that day, and I already had a vague idea of what I wanted to make, basically a remix of these grid SDFs that I had already done countless times before and thought that it could be fun to make a timelapse of me coding it up. I guess, in a way, it is fascinating to see the code come together while observing how many times I scratch my chin during the process. > Made in 10 minutes! ⌛️ > > Thought it would be fun to make a little time-lapse of me coding up today's [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) sketch. Also made a little track for your listening enjoyment 🎵 Never mind all the clutter in the background lmao. > > GIF of final animation in replies 👇 [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2](https://twitter.com/hashtag/genuary2?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/8YRn8KNFgl](https://t.co/8YRn8KNFgl?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 2, 2023](https://twitter.com/gorillasu/status/1609980230839549954?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) As for the code, I'll talk a bit more about that in <>#8 SDF since it's pretty much the same concept. Definitely planning on doing more like this in the future! [Samir](https://twitter.com/smrghsh?ref=gorillasun.de) felt inspired by my tweet and also did a timelapse, where we can see that holding your chin is a viable strat for algorithmic problem solving: > Made in 10 minutes! Inspired by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) here’s a timelapse of me making it, final output in reply 👇 [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2](https://twitter.com/hashtag/genuary2?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Ua4s7eJ280](https://t.co/Ua4s7eJ280?ref=gorillasun.de) > > — samir 🧙‍♀️ (@smrghsh) [January 3, 2023](https://twitter.com/smrghsh/status/1610148807853084672?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #03 Glitch Art Never tried to make glitch art before, initially I wanted to have a stab at a pixel sorting Algorithm but didn’t end up having enough time. In this sketch I’m reusing my [irregular grid algo](https://gorillasun.de/blog/an-algorithm-for-irregular-grids?ref=gorillasun.de) from a couple of months back, with the additional twist that it’s animated and not just a static piece. Looking at the formal definition for what a glitch is, I tried to approach the prompt from a little bit of a different angle: > Glitch: a sudden, usually temporary malfunction or fault of equipment. The idea was to create some sort of machine, whose components are slowly breaking apart until complete failure is reached. Each cell in the grid holds it’s own counter that has a random chance of being incremented every frame, which is represented by a blinking 404 Error message. Once this counter reaches a specific threshold the cell turns red and can be considered defect. The overall counter (the red bar at the bottom) is made up out of the sum of all of those individual counters. > Glitch Art ⁉️ > > glitch: a sudden, usually temporary malfunction or fault of equipment [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary3](https://twitter.com/hashtag/genuary3?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/qgi7XKOZ4B](https://t.co/qgi7XKOZ4B?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 3, 2023](https://twitter.com/gorillasu/status/1610406884556656642?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Here I really liked [elsif](https://twitter.com/ElsifThen?ref=gorillasun.de)'s sketch! Pixel sorting with a beautiful motif to boot (I love generative flowers and plants): > [#genuary3](https://twitter.com/hashtag/genuary3?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) glitch art > I made some flowers with math and then partially sorted the pixels. Pixel sorting is my favorite kind of glitch art. [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/qsqrQM2Mlw](https://t.co/qsqrQM2Mlw?ref=gorillasun.de) > > — elsif (@ElsifThen) [January 3, 2023](https://twitter.com/ElsifThen/status/1610205059245301760?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #04 Intersections My initial idea for this were just some intersection lines that are looping between two coordinates on the canvas, coloring the lines whenever they intersect each other: This didn't look like much hence I decided to go a different route with something more geometric. I ended up with something that looked more like futuristic bookshelves. There were so many stunning sketches for this prompt, ultimately making my ideas feel a little uninspired in comparison. Two favourites here were by [Elliot Schultz](https://twitter.com/elliotschultz?ref=gorillasun.de): > Day 04 – Intersections.[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#blender](https://twitter.com/hashtag/blender?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#b3d](https://twitter.com/hashtag/b3d?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#geometrynodes](https://twitter.com/hashtag/geometrynodes?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#phenakistiscope](https://twitter.com/hashtag/phenakistiscope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#zoetrope](https://twitter.com/hashtag/zoetrope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#stroboscope](https://twitter.com/hashtag/stroboscope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#animation](https://twitter.com/hashtag/animation?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/teCyDOTpfZ](https://t.co/teCyDOTpfZ?ref=gorillasun.de) > > — Elliot Schultz (@elliotschultz) [January 4, 2023](https://twitter.com/elliotschultz/status/1610447639811850241?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And [Seohyo](https://twitter.com/seohyowork?ref=gorillasun.de): > Genuary Day 4: Intersection > Inspired by Sato Masahiko [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#seohyowork](https://twitter.com/hashtag/seohyowork?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#dailycoding](https://twitter.com/hashtag/dailycoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/0oE8rsVVsW](https://t.co/0oE8rsVVsW?ref=gorillasun.de) > > — seohyo (@seohyowork) [January 5, 2023](https://twitter.com/seohyowork/status/1610956241026834432?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Another contender here is [Daniel Lever](https://twitter.com/%5Fdanlever?ref=gorillasun.de). If you have a closer look at his Twitter timeline, once a year Daniel he awakens from a long slumber to unleash a generative box of Pandora full of stunning sketches. I highly recommend checking out all of his creation this Genuary. For this prompt he recreated [Jared Tarbell's iconic substrate algorithm](http://www.complexification.net/gallery/machines/substrate/?ref=gorillasun.de), which I thought was also super on point: > Day 4 — Intersections[#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#javascript](https://twitter.com/hashtag/javascript?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/SIdqyLmQTP](https://t.co/SIdqyLmQTP?ref=gorillasun.de) > > — Daniel Lever (@\_danlever) [January 3, 2023](https://twitter.com/%5Fdanlever/status/1610408821771603968?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And another three who took the prompt very literally were [Loackme](https://twitter.com/loackme%5F?ref=gorillasun.de), [Christophe Choffel](https://twitter.com/ULuIQ12?ref=gorillasun.de) and [Nicolas Barradeau](https://twitter.com/nicoptere?ref=gorillasun.de): > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Day 4: Intersections > > Took that prompt quite literally.[#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/PReeNiVNxo](https://t.co/PReeNiVNxo?ref=gorillasun.de) > > — loackme (@loackme\_) [January 4, 2023](https://twitter.com/loackme%5F/status/1610563592625229826?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > [#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Intersections > Well, just one, but a busy one![#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecodgin](https://twitter.com/hashtag/creativecodgin?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/g7Mi3o1BL6](https://t.co/g7Mi3o1BL6?ref=gorillasun.de) > > — Christophe Choffel (@ULuIQ12) [January 4, 2023](https://twitter.com/ULuIQ12/status/1610696475742470146?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > "intersections" uses a thing I did a while back (finding cycles in an undirected graph) to create intersections. [https://t.co/2lalSMH3P9](https://t.co/2lalSMH3P9?ref=gorillasun.de) > it's absolutely unstable but it's somewhat fun to play with. [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/8rk7CMwdjw](https://t.co/8rk7CMwdjw?ref=gorillasun.de) > > — Nicolas Barradeau (@nicoptere) [January 4, 2023](https://twitter.com/nicoptere/status/1610788037276958721?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #05 Debug View I tried being creative with this one, where I attempted to visualize the sketch as well as what's happening behind the scenes at the same time: The prompts that take the cake here would be [Dave Pagurek](https://twitter.com/davepvm?ref=gorillasun.de)'s and [meezwhite](https://twitter.com/meezwhite?ref=gorillasun.de)'s de-bug sketches: > [#genuary5](https://twitter.com/hashtag/genuary5?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): "debug view." Maybe not the original intention of the prompt, but hey... [https://t.co/sc1yKfZIkc](https://t.co/sc1yKfZIkc?ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/lClP2ic0Es](https://t.co/lClP2ic0Es?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [January 5, 2023](https://twitter.com/davepvm/status/1610974279348224001?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > de-bug view[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary5](https://twitter.com/hashtag/genuary5?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/oX6dqtwQC3](https://t.co/oX6dqtwQC3?ref=gorillasun.de) > > — 𝔪𝔢𝔢𝔷 🌴 (@meezwhite) [January 5, 2023](https://twitter.com/meezwhite/status/1611082711476625418?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Another two that really stood out to me where by [Alexis André](https://twitter.com/MacTuitui?ref=gorillasun.de): > [#genuary5](https://twitter.com/hashtag/genuary5?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) debug view > > Original was like 80MB for 10s so here is the lame version[#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#dailycoding](https://twitter.com/hashtag/dailycoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/6Id29D9vXx](https://t.co/6Id29D9vXx?ref=gorillasun.de) > > — Alexis André (@MacTuitui) [January 5, 2023](https://twitter.com/MacTuitui/status/1611014552665350144?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And yet again by [Elliot Schultz](https://twitter.com/elliotschultz?ref=gorillasun.de): > Day 05 – Debug view. > > This was a fun one. I've never really tried to visualise any designs this way before.[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary5](https://twitter.com/hashtag/genuary5?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#blender](https://twitter.com/hashtag/blender?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#b3d](https://twitter.com/hashtag/b3d?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#geometrynodes](https://twitter.com/hashtag/geometrynodes?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#phenakistiscope](https://twitter.com/hashtag/phenakistiscope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#zoetrope](https://twitter.com/hashtag/zoetrope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#stroboscope](https://twitter.com/hashtag/stroboscope?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#animation](https://twitter.com/hashtag/animation?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Gfy4JBsOKc](https://t.co/Gfy4JBsOKc?ref=gorillasun.de) > > — Elliot Schultz (@elliotschultz) [January 4, 2023](https://twitter.com/elliotschultz/status/1610745104066842625?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #06 Steal like an artist I'm a huge fan of Dave Pagurek’s interpolated hand-drawn SVG sketches, where one drawing morphs into another one. Have a look at this goose morphing into an angry goose! > Happy [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 1! Going to be doing all of mine in [@p5xjs](https://twitter.com/p5xjs?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) on [@openprocessing](https://twitter.com/openprocessing?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). honk! [https://t.co/to9eKv0Hyu](https://t.co/to9eKv0Hyu?ref=gorillasun.de) [pic.twitter.com/2C0jwA5QKY](https://t.co/2C0jwA5QKY?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [January 1, 2023](https://twitter.com/davepvm/status/1609563433115983873?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I think it's just a really smart and relatively straight-forward way to animate things, without actually having to go through the process of animating. Adding a slight sinusoidal wobble to the strokes gives it an even more cartoony character: > There's a few steps involved with this one, but it involves: (1) importing drawings as SVGs, (2) drawing the SVGs with offsets to make it wiggle, (3) interpolating between paths in different drawings > > — Dave Pagurek (@davepvm) [January 2, 2023](https://twitter.com/davepvm/status/1609934164601573377?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Technically, any path can morph into another given that they have the same number of vertices, which was the idea behind my sketch. I generated a couple of numbers based on coordinates in a grid, which I manually typed out in an array and then interpolated between, creating this generative counter: > Steal like an Artist [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary6](https://twitter.com/hashtag/genuary6?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > To me this means taking inspiration and remixing ideas from others. Here's something inspired by [@davepvm](https://twitter.com/davepvm?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s lovely interpolated animations! [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/6wkXumHY7M](https://t.co/6wkXumHY7M?ref=gorillasun.de) [pic.twitter.com/xr0Ac1aqJI](https://t.co/xr0Ac1aqJI?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 6, 2023](https://twitter.com/gorillasu/status/1611369443736657920?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Here I also want to mention [Neel Shivadasani](https://twitter.com/DataNeel?ref=gorillasun.de)'s kinetogram sketch, where he takes down 6 prompts in one: > I'm late to [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), but here's [#genuary1](https://twitter.com/hashtag/genuary1?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), [#genuary3](https://twitter.com/hashtag/genuary3?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), [#genuary4](https://twitter.com/hashtag/genuary4?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), and [#genuary6](https://twitter.com/hashtag/genuary6?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > A kinegram: the intersection of different slices of time of a perfect loop, resulting in a glitchy texture > > Made in glsl > > An ode to the Poemotion series by [@thinking\_forms](https://twitter.com/thinking%5Fforms?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): [https://t.co/gxKGehOoZ9](https://t.co/gxKGehOoZ9?ref=gorillasun.de) [pic.twitter.com/UHSm0VXxSI](https://t.co/UHSm0VXxSI?ref=gorillasun.de) > > — Neel Shivdasani (@DataNeel) [January 6, 2023](https://twitter.com/DataNeel/status/1611314701282975744?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #07 Sample a cooler palette from your favourite movie/album cover I was excited for this prompt at first but then felt really uninspired when it actually came to making something for it. Ideally I would have coded up some sort of color sampling algo, like k-means clustering, but decided that that was too much work and wouldn't really net me a graphic that I could later share. I decided to go back and reuse some code inspired by [Roni Kaufman's poetical computer vision project](https://github.com/ronikaufman/poetical%5Fcomputer%5Fvision?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/download--3-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/download--2-.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/totorop.png) Grave of the Fireflies | Spirited Away | My Neighbour Totoro In that manner the algo samples colors from the underlying image to alter it's style and make it appear as if it were drawn by many brush strokes. The brush strokes themself are composited from many short lines of varying thickness. ## #08 Signed Distance Functions For this one I already knew what I wanted to do, playing more with grids and sinusoidal movement similarly to what I did on the second genuary prompt, as well as many previous sketches. A little tutorial on this can be found [here](https://gorillasun.de/blog/making-of-gzork?ref=gorillasun.de). Mid-November of the past year I was playing again with these SDFs, and had a little bit of a lightbulb moment when I made the realisation that the distance of the points in the grid don’t necessarily only need to be measured with respect to another single point, but can also be measured with respect to an entire polygon positioned somewhere on the canvas. You still have find a formula for measuring this distance correctly but in that manner very interesting patterns can emerge. For example, here is an SDF where the size and colour of the points in the grid is modulated with respect to their distance to a rotating line positioned at the centre (for clarity's sake the line is drawn out here in red): Additionally, you can also combine different distance functions, or place multiple items in the scene and see which one is closest! In my genuary sketch I am drawing three lines going outwards from the center and measuring the minimum distance towrads them, obtaining a sort of rotating peace sign: > Signed Distance Function [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary8](https://twitter.com/hashtag/genuary8?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/ywdzmG495M](https://t.co/ywdzmG495M?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 9, 2023](https://twitter.com/gorillasu/status/1612469603980152835?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I think that this one was the prompt that people were afraid of the most, since SDFs are usually associated with shaders. But Piter Pasma to the rescue, he put together a super informative tutorial about the topic on the tubes! And another super cool one is by [Matthew Hughes](https://twitter.com/tasty%5Fplots?ref=gorillasun.de), where I have absolutely no idea how it was made: > Genuary Day 8: Signed Distance Functions > > Thanks to Zorro Weaver for his sdf geometry nodes[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary8](https://twitter.com/hashtag/genuary8?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#b3d](https://twitter.com/hashtag/b3d?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/gOEB8yiFPH](https://t.co/gOEB8yiFPH?ref=gorillasun.de) > > — Matthew Hughes (@tasty\_plots) [January 8, 2023](https://twitter.com/tasty%5Fplots/status/1612047166943694851?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #09 Plants A redo of a flower sketch I was working on during the beginning of December, and I think I almost like it more than the initial version: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-09_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-09_2.jpg) ![](https://gorillasun.de/assets/images/GENUARY2023/JPEGS/Genuary%2009_1.jpg) ![](https://gorillasun.de/assets/images/GENUARY2023/JPEGS/Genuary%2009_2.jpg) An absolutely stunning piece here is again by [elsif](https://twitter.com/ElsifThen?ref=gorillasun.de): > [#genuary9](https://twitter.com/hashtag/genuary9?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Plants > 🌸🌻💐[#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/HCkDEmyx2D](https://t.co/HCkDEmyx2D?ref=gorillasun.de) > > — elsif (@ElsifThen) [January 9, 2023](https://twitter.com/ElsifThen/status/1612365185242787842?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I liked this one so much I had to ask how it was made, assuming that it might use an underlying picture for flowers, similarly to what I did for genuary #7, and I believe that the ultimate texture is achieved in this manner. Elsif reveals though that is completely generative by first generating a field of geometric flowers, the same motif that they used for genuary #3: > hi, thank you! it's fully generative [pic.twitter.com/sp3QQ4NT75](https://t.co/sp3QQ4NT75?ref=gorillasun.de) > > — elsif (@ElsifThen) [February 3, 2023](https://twitter.com/ElsifThen/status/1621574762182111232?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I believe that the resulting texture is still achieved by applying an intermediary pixel sort as well as orienting the direction of the lines with a Perlin noise flow. Another cheeky sketch was by [ippsketch](https://twitter.com/ippsketch?ref=gorillasun.de): > Plants[#genuary9](https://twitter.com/hashtag/genuary9?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/ap6p1B7OK7](https://t.co/ap6p1B7OK7?ref=gorillasun.de) > > — Jeff · ippsketch (@ippsketch) [January 9, 2023](https://twitter.com/ippsketch/status/1612404525360349185?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #10 Generative Music I generally feel like more sketches should have sound accompanying them, especially animations. This one I've also thought about before, wondering what it would sound like if the collisions between rectangles produced a sound. There's a lot of playroom here, choice of musical scale, what rectangles produce what sound, tying velocity of the note to the force of impact, etc... I just did a simple thing however, adding a little bit of reverb and delay in ableton live makes it sound quite ephemeral: > Generative Music [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary10](https://twitter.com/hashtag/genuary10?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Sound On 🔊 > > Notes are triggered when the rectangles collide with each other or the borders. Notes are selected from a minor seventh chord + major 6th step (no idea what that's called). Added some reverb and delay in post! > > Beep, Boop 🤖 [pic.twitter.com/NegQwJe4rb](https://t.co/NegQwJe4rb?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 10, 2023](https://twitter.com/gorillasu/status/1612888720906063889?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The most impressive entry for this prompt was [Chris Barber](https://twitter.com/code%5Frgb?ref=gorillasun.de)'s gesture controlled music sketch: > I feel like I have the force > > genuary day 10: generative music[#genuary10](https://twitter.com/hashtag/genuary10?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/mgy8xqlT7B](https://t.co/mgy8xqlT7B?ref=gorillasun.de) > > — Chris Barber (@code\_rgb) [January 11, 2023](https://twitter.com/code%5Frgb/status/1613242831392616448?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The device is a [Leap Motion controller by ultraleap](https://www.ultraleap.com/product/leap-motion-controller/?ref=gorillasun.de) if you want to look it up or get one for yourself! (Not sponsored, sponsorships are welcome however 🤔) # #11 - #20 ## #11 Suprematism Positioning plays an incredibly important role in Suprematist compositions; to me these compositions often evoke a sentiment of fleetingness and ephemerality, as if we were only gazing upon a brief slice of a larger geometric movement. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-11_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-11_2.jpg) During the making-of my fxhash token [Neo-Supremus](https://www.fxhash.xyz/article/making-of-neo-supremus?ref=gorillasun.de) I learned a lot about trying to imitate a natural positioning of these kinds of geometric elements, and I was surprised how quickly the code came together for the gentry sketch. It’s been a minute since I looked at the code for Neo-supremus but I guess all the agonising over positioning strategies did have a lasting effect. You can read more about how the token was made [here](https://gorillasun.de/blog/making-of-neo-supremus?ref=gorillasun.de). [Anapet](https://twitter.com/AnaPetArt?ref=gorillasun.de)'s sketch really stood out to me here: > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 8 and 11\. > Signed distance functions + Suprematism.[#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary8](https://twitter.com/hashtag/genuary8?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary11](https://twitter.com/hashtag/genuary11?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genart](https://twitter.com/hashtag/genart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/UMZ8OnYDlC](https://t.co/UMZ8OnYDlC?ref=gorillasun.de) > > — AnaPet (@AnaPetArt) [January 12, 2023](https://twitter.com/AnaPetArt/status/1613351164782706689?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #12 Tesselation Generally, a tessellation is the subdivision of a 2 dimensional space with geometric shapes and forms (in that context better referred to as tiles) such that there are no gaps or overlaps between these tiles. I've done a lot of sketches that are based on this, and decided to return to one of my favourite geometric shapes, the hexagon: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-12_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-12_2.jpg) And the patterns that can emerge in this manner are truly endless. A sketch that I really enjoyed here was by [Julien Labat](https://twitter.com/JulienLabat?ref=gorillasun.de), which is also based on a hexagonal tiling, with the additional twist that they're Truchet tiles, generating a infinitely interlacing connectedness: > [#genuary12](https://twitter.com/hashtag/genuary12?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) \- tessellation > Hexagonal grid caused some headaches here…[#genuarry](https://twitter.com/hashtag/genuarry?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/sZ1eJ0eZFp](https://t.co/sZ1eJ0eZFp?ref=gorillasun.de) > > — Julien Labat (@JulienLabat) [January 12, 2023](https://twitter.com/JulienLabat/status/1613653330718334998?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #13 Something you’ve always wanted to learn Always wanted to do more with text, especially after seeing Roni Kaufman’s overarching Genuary theme. One thing I’ve always found annoying working with text in p5 is how hard it is to precisely position it. For this reason I took a little dip into opentype.js that makes this much easier by giving you access to the bounding box of the text, and hence making positioning much easier. Additional it gives you access to the vertices of the strokes that make up the letters, at various granularities, which is what I used to make the letters wiggle erratically back and forth: My favourites that day by far were from [MV](https://twitter.com/mountvitruvius?ref=gorillasun.de), and yet again [Daniel Lever](https://twitter.com/%5Fdanlever?ref=gorillasun.de) (this is slowly turning into a Daniel Lever appreciation post): > Finally got my [#genuary13](https://twitter.com/hashtag/genuary13?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ‘Something you’ve always wanted to learn’ to work 🎉 > > A soft-body solver in about 1.5kb 🍦[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/k9LPI9Yzz8](https://t.co/k9LPI9Yzz8?ref=gorillasun.de) > > — MV (@mountvitruvius) [January 18, 2023](https://twitter.com/mountvitruvius/status/1615769464045441029?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Day 13 — Something you’ve always wanted to learn > > I'd never played with differential growth before, so here's my first crack.[#genuary13](https://twitter.com/hashtag/genuary13?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#javascript](https://twitter.com/hashtag/javascript?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/exbBhZnSWW](https://t.co/exbBhZnSWW?ref=gorillasun.de) > > — Daniel Lever (@\_danlever) [January 14, 2023](https://twitter.com/%5Fdanlever/status/1614399687792168960?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Also really loved [Jeff](https://twitter.com/ippsketch?ref=gorillasun.de)'s sketch that made use of the polygon corner rounding code that I wrote about during Genuary 2022: > Something I've wanted to learn: rounded polygons[#genuary13](https://twitter.com/hashtag/genuary13?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/K8Z01IVq4P](https://t.co/K8Z01IVq4P?ref=gorillasun.de) > > — Jeff · ippsketch (@ippsketch) [January 13, 2023](https://twitter.com/ippsketch/status/1613983255623077888?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) You can learn more about the polygon rounding code [here](https://gorillasun.de/blog/an-algorithm-for-polygons-with-rounded-corners?ref=gorillasun.de). ## #14 Aesemic The term [**Asemic**](https://en.wikipedia.org/wiki/Asemic%5Fwriting?ref=gorillasun.de) is used to describe characters, lines and symbols that deceive the eye by having semblance to human writing but are ultimately devoid of any semantic meaning. I discovered that this actually is a very popular art direction and a lot of works have been made in that regard. My sketch for this prompt made use of a grid where the coordinates are slightly displaced and then connected with Bezier curves. There's also a random chance to end the current row as well as skip a line: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-14_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-14_2.jpg) I really loved Piter's sketch here, instead of faking it the way I did, he attempts at simulating the actual wrist movements that go into human hand-writing. This is actually non-trivial, and he elaborates a little in a thread underneath his artwork: > [#genuary14](https://twitter.com/hashtag/genuary14?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Aesemic > I wrote this algorithm a couple of months ago in the p5 web editor (I like it for quickly prototyping ideas), I'm using today to rewrite it so it's plain JS and outputs SVG.[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genartclub](https://twitter.com/hashtag/genartclub?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/MFCe36HN7i](https://t.co/MFCe36HN7i?ref=gorillasun.de) > > — piterpasma (@piterpasma) [January 14, 2023](https://twitter.com/piterpasma/status/1614287107211644928?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also learned that there has been research in this regard, trying to find sinusoidal formulas for approximating these hand movements and coincidentally this somehow comes very close to what Piter does in his sketch. > Huh, wow! No I hadn't seen that before, but it does look kind of similar! It was based on my own observations of handwriting and hand/wrist motion. I'll check out the paper, thanks! > > — piterpasma (@piterpasma) [January 18, 2023](https://twitter.com/piterpasma/status/1615713655361880065?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Need to investigate this more in the future! ## #15 Sine Waves This one came together pretty quickly, I've had a lot of practice with sine waves and it's really easy to make cool animations with them at this point: > Sine Waves [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary15](https://twitter.com/hashtag/genuary15?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/P4C22yOucd](https://t.co/P4C22yOucd?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 19, 2023](https://twitter.com/gorillasu/status/1616118178454675456?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Sine waves are an incredibly integral part of creative coding, and I think folks had lots of fun with this prompt since it's not very difficult to obtain interesting patterns by throwing together a bunch of trigonometric functions! Some that I liked here were again by Seohyo: > Genuary Day 15: Sine waves > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary15](https://twitter.com/hashtag/genuary15?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#seohyowork](https://twitter.com/hashtag/seohyowork?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#dailycoding](https://twitter.com/hashtag/dailycoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/jmFvNYb3Cq](https://t.co/jmFvNYb3Cq?ref=gorillasun.de) > > — seohyo (@seohyowork) [January 16, 2023](https://twitter.com/seohyowork/status/1614986235285757953?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) By Mr. Tasty Plots: > Genuary Day 15: Sine Waves[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary15](https://twitter.com/hashtag/genuary15?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#b3d](https://twitter.com/hashtag/b3d?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/sI43ZiozCJ](https://t.co/sI43ZiozCJ?ref=gorillasun.de) > > — Matthew Hughes (@tasty\_plots) [January 15, 2023](https://twitter.com/tasty%5Fplots/status/1614622014899163137?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And [Matt Perkins](https://twitter.com/nudoru?ref=gorillasun.de): > A little rain drop sketch for [#genuary15](https://twitter.com/hashtag/genuary15?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), sine waves [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/FnKYsxxCAr](https://t.co/FnKYsxxCAr?ref=gorillasun.de) > > — Matt Perkins (@nudoru) [January 16, 2023](https://twitter.com/nudoru/status/1615012655047274506?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #16 Reflection of a Reflection Reiterating on an idea from the previous year, by exploiting the property Perlin noise's mirrored-ness around the origin, one can obtain interesting [Rohrschach](https://de.wikipedia.org/wiki/Rorschachtest?ref=gorillasun.de)\-esque graphics by assigning the same stroke-width to the points that fall at the same spot in the four quadrants. Slightly displacing these points yields a faintly fuzzy texture: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-16_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-16_2.jpg) [Aleksandra Jovanic](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de) and [Roni](https://twitter.com/KaufmanRoni?ref=gorillasun.de) did their own take on twofold symmetry: > I've seen things you people wouldn't believe in Reflection of a reflection - [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 16 [#genuary16](https://twitter.com/hashtag/genuary16?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Ych6WgwQwj](https://t.co/Ych6WgwQwj?ref=gorillasun.de) > > — Alexis ||| Aleksandra Jovanić (@alexis\_o\_O) [January 16, 2023](https://twitter.com/alexis%5Fo%5FO/status/1614944027006341120?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > [#Genuary](https://twitter.com/hashtag/Genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 16 🪞 > "Reflection of a reflection" > > What do you see? [pic.twitter.com/fKd8PXXdWg](https://t.co/fKd8PXXdWg?ref=gorillasun.de) > > — Roni Kaufman (@KaufmanRoni) [January 16, 2023](https://twitter.com/KaufmanRoni/status/1615063206396891139?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And another Banger by Dave was this mind bending slap-stick sketch: > [#genuary16](https://twitter.com/hashtag/genuary16?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): reflection of a reflection. Here's a silly joke animated with some shaders. [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/aTO1GsnD62](https://t.co/aTO1GsnD62?ref=gorillasun.de) [pic.twitter.com/XAQEVsm2fh](https://t.co/XAQEVsm2fh?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [January 16, 2023](https://twitter.com/davepvm/status/1614928654781267968?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #17 A Grid inside a Grid inside a Grid [Saskia Freeke](https://twitter.com/sasj%5Fnl?ref=gorillasun.de)’s patterns were a big inspiration for this one, finding a couple of her sketches on pinterest, that had several dot patterns arranged on a grid, overlapping each other. ![](https://i.pinimg.com/564x/8f/fa/4c/8ffa4c8a00c2c7d873d63a203d5f7432.jpg) ![](https://i.pinimg.com/564x/35/19/1b/35191b12912dab28169325008832343c.jpg) Similarly the irregular grid sketch for Genuary 3rd, the idea starts with a 2D array of boolean values that are initially all set to false. Then in a loop, we choose a rectangular patch of array entries with specific height and width, assign a colour to them and mark them as true. Here a truthy value signifies that these spots are occupied. Now, a cool thing happens when we try to mark a new patch, and it collides with an already existing patch of occupied entries. In this case we obtain a patch that is either missing a chunk or can not be assigned in its entirety. In this manner we get a grid, with smaller grids inside of it that are intersecting and inside of each other. Drawing diagonal lines instead of dots on the array entries we can get some more interesting patterns as well. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-17_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-17_2.jpg) The two that I liked most that day were by two animated ones by [Laurent Malys](https://twitter.com/losylam?ref=gorillasun.de): > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 17 - A grid inside a grid inside a grid > > made with [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary17](https://twitter.com/hashtag/genuary17?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#art](https://twitter.com/hashtag/art?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/I6ZxtvvSgW](https://t.co/I6ZxtvvSgW?ref=gorillasun.de) > > — Laurent Malys 🇺🇦 (@losylam) [January 17, 2023](https://twitter.com/losylam/status/1615414077949415443?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And this one by Dave for obvious reasons: > [#genuary17](https://twitter.com/hashtag/genuary17?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): grid within a grid within a grid. hey who does that remind you of? time for Mondrian!! [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/UvwlQJC7mJ](https://t.co/UvwlQJC7mJ?ref=gorillasun.de) [pic.twitter.com/QcrOzBtwEO](https://t.co/QcrOzBtwEO?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [January 17, 2023](https://twitter.com/davepvm/status/1615324908216635394?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And this collab by [Greweb](https://twitter.com/greweb?ref=gorillasun.de) and [Agrimony](https://twitter.com/agriimony?ref=gorillasun.de): > Had the chance to collaborate with [#plotter](https://twitter.com/hashtag/plotter?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) master [@greweb](https://twitter.com/greweb?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) on [#genuary17](https://twitter.com/hashtag/genuary17?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) "grid in a grid in a grid". I wanted to try out rotating and warping each recursive grid. I think the end product came out amazing! > > Thanks to [@sableRaph](https://twitter.com/sableRaph?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for putting the event together[#genuarytogether](https://twitter.com/hashtag/genuarytogether?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/ARuJ2hkR5Z](https://t.co/ARuJ2hkR5Z?ref=gorillasun.de) > > — agrimony.eth/.tez 🦇🔊 (@agriimony) [January 17, 2023](https://twitter.com/agriimony/status/1615265321304363009?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #18 Definitely not a Grid Cheating a little bit now and then is also a big part of Genuary: to me this prompt had a bit of a sarcastic undertone, in as “Well, this definitely isn’t a grid? But maybe it is!” I was a bit behind with the prompts at this point and went on Twitter to look for inspiration, and especially loved [Greweb](https://twitter.com/greweb?ref=gorillasun.de)’s sketch that I think really fits the prompt. Using a different grid-like positioning strategy that is known as **Quinconce** positioning > Quinconce. Definitely not a grid 😁 [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#Genuary18](https://twitter.com/hashtag/Genuary18?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Weah9PoaZg](https://t.co/Weah9PoaZg?ref=gorillasun.de) > > — @greweb (@greweb) [January 18, 2023](https://twitter.com/greweb/status/1615806023301988352?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [This site](https://www.meubliz.com/definition/quinconce/?ref=gorillasun.de) gives a good definition of Quinconce patterns, translated from French: > In art and decoration, Quinconce is given to arrangements that resemble a checkerboard pattern. These kinds of ornaments are placed in the four corners of a square and add a fifth additional element in the center. This repeated pattern has the advantage of producing a symmetrical and infinitely repeating motif Essentially it is still a grid, but with every other row displaced by half of the width of the grid elements. I found a sort of hand drawn graphic that day, and wanted to recreate it by doing a little texture study. It became more of a pattern generator later on, drawing connections between the elements at random. > Definitely not a grid! [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary18](https://twitter.com/hashtag/genuary18?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Loved [@greweb](https://twitter.com/greweb?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)'s take on this prompt and google a bit what Quinconce is, then came across this graphic on the net (img #1) which I thought would look cool as a generative thingy. Generative thingies ensued 🤖 [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/JtPDCtQY8c](https://t.co/JtPDCtQY8c?ref=gorillasun.de) [pic.twitter.com/qK53eHyXry](https://t.co/qK53eHyXry?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 24, 2023](https://twitter.com/gorillasu/status/1617912501471150080?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-18_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-18_2.jpg) Later I combined the code from #17 and #18 because I wanted to see what it would look like, and it actually turned into something interesting: > Combined code from [#genuary17](https://twitter.com/hashtag/genuary17?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and [#genuary18](https://twitter.com/hashtag/genuary18?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)! Think I'm onto something [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/p1OvvPy1SU](https://t.co/p1OvvPy1SU?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 24, 2023](https://twitter.com/gorillasu/status/1617951194525335552?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-18_3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-18_4.jpg) ## #19 Black and White And again we’re cheating a little bit, technically any sketch can be disguised with black and white colors, but I wanted to sprinkle just a little bit of colour on top. Still messing around with the texture from before I combined it with the code from #16\. Instead of drawing regular p5 points using the textured circular patches from before, with the occasionally coloured circles: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-19_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-19_2.jpg) After playing a bit more with the code I ended up with a sketch that I’m probably the most proud of this month: > A Dream of Spring 🌻 [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/eo8PIiVO3X](https://t.co/eo8PIiVO3X?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [January 28, 2023](https://twitter.com/gorillasu/status/1619300086399528960?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) A super aesthetic sketch was by [Jos Vromans](https://twitter.com/JosVromans?ref=gorillasun.de): > [#Genuary](https://twitter.com/hashtag/Genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Day 19: Black and white. > > Waves[#genuary19](https://twitter.com/hashtag/genuary19?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Rk04HMeLxm](https://t.co/Rk04HMeLxm?ref=gorillasun.de) > > — Jos Vromans (@JosVromans) [January 19, 2023](https://twitter.com/JosVromans/status/1616099892530941954?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And a cool animated black and white recreation of space invaders by [Computer Museum NAMIP](https://twitter.com/ComputerMuseumB?ref=gorillasun.de): > [#genuary19](https://twitter.com/hashtag/genuary19?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Black and White in [#RETROGAMING](https://twitter.com/hashtag/RETROGAMING?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > 👾Space Invaders👾(partial) tribute in [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) (original game was B&W with color overlay at the bottom) > Credit to [@ferjerez3d](https://twitter.com/ferjerez3d?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for his random alien generator of [#genuary2022](https://twitter.com/hashtag/genuary2022?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day3 ![#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#retrocomputing](https://twitter.com/hashtag/retrocomputing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/wviYQumRs4](https://t.co/wviYQumRs4?ref=gorillasun.de) > > — ComputerMuseum NAMIP (@ComputerMuseumB) [January 19, 2023](https://twitter.com/ComputerMuseumB/status/1615971309506134016?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And another stunning creation here was a collab between [Julian Hespenheide](https://twitter.com/nodashNET?ref=gorillasun.de) and [pifragile](https://twitter.com/pifragile?ref=gorillasun.de) for #GenuaryTogether: > Day 19 of [#GENUARY2023](https://twitter.com/hashtag/GENUARY2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Black and white > > Collab with [@pifragile](https://twitter.com/pifragile?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[#genuary19](https://twitter.com/hashtag/genuary19?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) · [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) · [#genuaryTogether](https://twitter.com/hashtag/genuaryTogether?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/GW4ecf7EL1](https://t.co/GW4ecf7EL1?ref=gorillasun.de) > > — Julian Hespenheide (@julihespenheide) [January 19, 2023](https://twitter.com/julihespenheide/status/1616148605613506561?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #20 Art Deco This one was a bit unimaginative to be fair, it’s a grid of some art-deco-esque patterns, adding a shadow with the rendering context and using transparent fills for a little bit of a glow effect. Personally I just don’t find the art-deco stuff very inspiring, maybe because it feels a bit lifeless to me. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-20_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-20_2.jpg) Art Deco Sketches It did lead to an interesting animation though, after my initial sketch I wasn’t satisfied and browsed Pinterest a bit more and wanted to make something a little less angular, ending up with the patterns you can see above on the right. The animated version of this sketch looked cool, and could have equally been a submission for the black and white prompt: [Motus Art](https://twitter.com/motus%5Fart?ref=gorillasun.de) and the serial collaborator [Julian Hespenheide](https://twitter.com/nodashNET?ref=gorillasun.de) created a super cool animated art deco pattern generator as a collaboration for #genuaryTogether: > Genuary 20th "Art Deco" > Collab with [@nodashNET](https://twitter.com/nodashNET?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) as part of [#genuaryTogether](https://twitter.com/hashtag/genuaryTogether?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary20](https://twitter.com/hashtag/genuary20?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/RRkUlK2b32](https://t.co/RRkUlK2b32?ref=gorillasun.de) > > — Motus Art (@motus\_art) [January 20, 2023](https://twitter.com/motus%5Fart/status/1616491384592007205?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # #21 - #31 ## #21 Persian Rug One of my biggest projects from last year was Exotic Quarpets, an sketch revolving around generative rugs: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-3.jpg) Ideally, I would have reiterated on the project, but I remember it being a big and convoluted project. I dont't think that I could have elevated it or made any meaningful addition in one days time. I did however tackle the prompt in combination with #30 minimalism. Persian rugs have really intricate patterns, and here I really liked [Foldster](https://twitter.com/theFoldster?ref=gorillasun.de)'s very technical approach to generating these kinds of patterns: > [#Genuary21](https://twitter.com/hashtag/Genuary21?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): Persian Rug > > Good thing I already made a Persian Rug generator last year using Parametric Newton fractals over Chandni figures! [pic.twitter.com/Lmt2jTamTI](https://t.co/Lmt2jTamTI?ref=gorillasun.de) > > — Foldster (@theFoldster) [January 21, 2023](https://twitter.com/theFoldster/status/1616817529871015941?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #22 Shadows I’ve been ogling [Amit Patel](https://twitter.com/redblobgames?ref=gorillasun.de)'s, aka redblobgames, [article on 2d visibility and ray casting](https://www.redblobgames.com/articles/visibility/?ref=gorillasun.de) for a while now, and used the prompt as an excuse to code up the described ray casting algo. It was fairly easy, I was in the right headspace that day and already had already explored some line intersection code that I could reuse (thanks [Paul Bourke](http://paulbourke.net/geometry/pointlineplane/?ref=gorillasun.de)). Approaching it in an object oriented manner, it simply boiled down to creating a bunch of obstacles (polygons made out of lines) and then checking if the obstacles intersect with the rays of the caster (light source?): I wanted to see what it would look like with multiple light sources, which actually gave me a headache after a while. I had created a visual migraine. Coincidentally I came across Alexis Andre's Yayoi Kusama submission and sort of had a lightbulb moment: > [#genuary25](https://twitter.com/hashtag/genuary25?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Yayoi Kusama[#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#dailycoding](https://twitter.com/hashtag/dailycoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/rJp6u9IZPO](https://t.co/rJp6u9IZPO?ref=gorillasun.de) > > — Alexis André (@MacTuitui) [January 25, 2023](https://twitter.com/MacTuitui/status/1618228324542877696?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) My ray casting code could easily be transformed into an animated Voronoi diagram with a simple modification. First, instead of drawing the rays as lines, we draw these lines as little dots, however still creating an illusion of a line. Then, for each one of these dots, we check its distance to all of the light sources, if the distance of a dot with respect to a light source that it doesn’t belong to is less than its distance towards its own light source, we simply don’t draw that dot. This is essentially just the basic definition of a Voronoi diagram, achieved in a backhanded manner, and we end up with something that looks as follows: The sketch I loved the most that day was by Roni: > [#Genuary](https://twitter.com/hashtag/Genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 22 🔦 > "Shadows" [pic.twitter.com/uiVExCI3lW](https://t.co/uiVExCI3lW?ref=gorillasun.de) > > — Roni Kaufman (@KaufmanRoni) [January 22, 2023](https://twitter.com/KaufmanRoni/status/1617226337797967874?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #23 More Moiré What’s better than one Moiré pattern? More than one Moiré pattern, duh! A fairly simple sketch, a simple circle packing procedure that is run twice, filling two independent arrays with the positional information of the circles. These circles are then drawn to the canvas on top of each other and filled at random with two types of patterns: parallel lines or concentric circles. Making the circles sway back and forth slightly in a sinusoidal manner, accentuating the moiré effect, but also causing it to be butchered by compression on social media. I found that making the strokes a little thicker helped with that just a tiny bit. I think this sketch would look really cool on a huge screen, or projected onto the walls of a dark room for example. Could work well for an installation, with some atmospheric music playing in the background. [Darien Brito](https://twitter.com/DarienBrito?ref=gorillasun.de) wins the aesthetics prize for this prompt: > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Day 23: More More Moiré. > Inspired by the interference patterns in graphene sheets. Interesting article where I got the idea from below.[#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary23](https://twitter.com/hashtag/genuary23?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/RgNNQXSM7e](https://t.co/RgNNQXSM7e?ref=gorillasun.de) > > — Darien Brito (@DarienBrito) [January 23, 2023](https://twitter.com/DarienBrito/status/1617636884263632896?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #24 Textile Again I scoured Pinterest for inspiration because I had no idea what to make for this one, but came across some cool images searching for ‘abstract textile’, here’s two that I particularly enjoyed: ![](https://i.pinimg.com/564x/4f/b5/d4/4fb5d4901a3d3876109741bc86a2f94e.jpg) ![](https://i.pinimg.com/564x/24/49/ce/2449ce82b34b30593ad01900f77cd798.jpg) Pinterest Textile Inspiration What I ended up making looked a bit different but still had a cool effect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-24_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-24_2.jpg) [Michal Rostocki](https://twitter.com/von%5Frostock?ref=gorillasun.de)'s two tweet long pico8 infinite stack of persian rugs is an absolute masterpiece here: > "Textile" > You take a little sip of tea. The smiling merchant starts showing the rugs, and you immediately feel tired. Strange, he hasn't even started haggling. > > 2 tweets long source code below [#genuary24](https://twitter.com/hashtag/genuary24?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#pico8](https://twitter.com/hashtag/pico8?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#tweettweetcart](https://twitter.com/hashtag/tweettweetcart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#codeart](https://twitter.com/hashtag/codeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#sizecoding](https://twitter.com/hashtag/sizecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#pixelart](https://twitter.com/hashtag/pixelart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/8syI2BCP9V](https://t.co/8syI2BCP9V?ref=gorillasun.de) > > — Michał Rostocki (@von\_rostock) [January 24, 2023](https://twitter.com/von%5Frostock/status/1618011645049196544?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I could make an entire list where all sketches are just by [Daniel Lever](https://twitter.com/%5Fdanlever?ref=gorillasun.de), his genius strikes again with this animated carpet: > Day 24 — Textile[#genuary24](https://twitter.com/hashtag/genuary24?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#javascript](https://twitter.com/hashtag/javascript?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/2CDsA8Dtx3](https://t.co/2CDsA8Dtx3?ref=gorillasun.de) > > — Daniel Lever (@\_danlever) [January 24, 2023](https://twitter.com/%5Fdanlever/status/1617853361822498816?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [Lunarean](https://twitter.com/lunarean?ref=gorillasun.de) also had a couple of bangers, really liked their textile sketch that day: > Textile [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary24](https://twitter.com/hashtag/genuary24?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/EAnTNo3kqw](https://t.co/EAnTNo3kqw?ref=gorillasun.de) > > — lunarean (@lunarean) [January 24, 2023](https://twitter.com/lunarean/status/1617682582954704896?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And a stunning piece by the generative textile master [Anna Lucia](https://twitter.com/annaluciacodes?ref=gorillasun.de): > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) day 24: textile [pic.twitter.com/4D7Qd7ABJB](https://t.co/4D7Qd7ABJB?ref=gorillasun.de) > > — Anna Lucia (@annaluciacodes) [January 24, 2023](https://twitter.com/annaluciacodes/status/1617821635645407232?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #25 Yayoi Kusama Generative art has also been a gateway for me to explore art history for myself. I especially love learning about specific artists' process, understanding where their art comes from and how they initially found their inspiration. Yayoi Kusama has a fascinating story: > One day I was looking at the red flower patterns of the tablecloth on a table, and when I looked up I saw the same pattern covering the ceiling, the windows, and the walls, and finally all over the room, my body and the universe. I felt as if I had begun to self-obliterate, to revolve in the infinity of endless time and the absoluteness of space, and be reduced to nothingness. As I realised it was actually happening and not just in my imagination, I was frightened. I knew I had to run away lest I should be deprived of my life by the spell of the red flowers. I ran desperately up the stairs. The steps below me began to fall apart and I fell down the stairs spraining my ankle. Yayoi Kusama draws her very distinct style from this experience, trying to emulate the feeling of these feverish visions through her artworks. At first I wanted to create something in the style of her mushroom artworks: ![](https://i.pinimg.com/564x/87/23/27/872327cd9a9d44e05636643dd0b4daa7.jpg) However it wouldn’t have been possible to do in one sitting, especially the quadilation (is that a word) pattern in the background. What kind of algorithm can emulate such a natural seeming pattern? A Delaunay triangulation where a common edge is removed from adjacent triangles? It definitely is something that I want to tackle at some point. I ended up settling for the simpler dot pattern that occurs in most of her artworks: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-25_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-25_2.jpg) The special thing here is the slightly wobbly deformed circles, giving it a more hand drawn vibe. Tracing the circumference of the circles with many dots, and modulating their size with circular Perlin noise allows for a smooth and continuous deformation. We already saw Alexis Andre's sketch, another cool one that day was by [Yazid](https://twitter.com/Yazid?ref=gorillasun.de) who put his own spin on it with his recognizable style: > If you haven’t seen it, there’s this interesting video that goes into explaining the reason as to why dots have appeared so prominently in her work [https://t.co/WfNQBv7iSI](https://t.co/WfNQBv7iSI?ref=gorillasun.de) > > — Yazid (@Yazid) [January 26, 2023](https://twitter.com/Yazid/status/1618446431198777345?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #26 My kid could have made that What screams “this was made by a kid” more than something that is made with crayons? I leaned into that and redid a sketch back from early 2022 when I was sick and down with covid. It’s essentially also based on an irregular grid, where each rectangle is filled with scribbly hachure strokes giving it a little bit of a chaotic vibe: The innovative thing here is that I didn’t use the rendering context’s clip method, but rather, for each one of the dots that make up the scribbly strokes I checked if they fill within the area of the rectangle. I fit falls outside, it is not drawn. That way the lines have smooth circular endpoints instead of being cutoff by the clip function. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-26_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-26_2.jpg) [Juhani Halkomaki](https://twitter.com/JuhaniHalkomaki?ref=gorillasun.de) and [Fran Piaggio](https://twitter.com/fipiaggio?ref=gorillasun.de) collabed on this one sketch that uses ml5.js behind the scenes to generate scribbly and childlike drawings of cats: > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary26](https://twitter.com/hashtag/genuary26?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Prompt: "My kid could have made that" > > A collab with [@fipiaggio](https://twitter.com/fipiaggio?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) using [@ml5js](https://twitter.com/ml5js?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > We made a crayon-like brush and let [@ml5js](https://twitter.com/ml5js?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) AI draw sketches of cats. [pic.twitter.com/UTYY5eTgcj](https://t.co/UTYY5eTgcj?ref=gorillasun.de) > > — Juhani Halkomäki (@JuhaniHalkomaki) [January 26, 2023](https://twitter.com/JuhaniHalkomaki/status/1618650545719476224?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I believe that the model was originally trained on the quick draw dataset, and is called doodlenet. And again we've got Lunarean with a very painterly sketch of randomly colored ribbon-like scribbles: > Day 26: My kid could have made that [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary26](https://twitter.com/hashtag/genuary26?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/LRBt56vra0](https://t.co/LRBt56vra0?ref=gorillasun.de) > > — lunarean (@lunarean) [January 26, 2023](https://twitter.com/lunarean/status/1618409662105415680?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #27 In the Style of Hilma af Klint I did this sketch immediately after the Yayoi Kusama sketch, reusing the circle packing code with a slightly different aesthetic: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-27_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-27_2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-27_3-1.jpg) And here we have another collab with [Juhani](https://twitter.com/JuhaniHalkomaki?ref=gorillasun.de) and [Hetvi](https://twitter.com/vuisnotabot?ref=gorillasun.de): > [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary27](https://twitter.com/hashtag/genuary27?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > Prompt: "In the style of Hilma Af Klint" > Collaboration with [@vuisnotabot](https://twitter.com/vuisnotabot?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/mqX42viUDx](https://t.co/mqX42viUDx?ref=gorillasun.de) > > — Juhani Halkomäki (@JuhaniHalkomaki) [January 27, 2023](https://twitter.com/JuhaniHalkomaki/status/1618950373909340166?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #28 Generative Poetry Generating meaningful sentences is a difficult task, and extensive research has already gone into this topic. At first I just printed random letters to the canvas to see if anything meaningful would come from it, but I just ended up with something that looked like a crossword puzzle. My second idea was forming random sentences from chaining random words, I found these two GitHub repos that had arrays of many [adjectives](https://github.com/rgbkrk/adjectives/blob/master/index.js?ref=gorillasun.de) and [adverbs](https://gist.github.com/ijmacdowell/8325453?ref=gorillasun.de), and I was surprised to see that it kind of worked: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-28_1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-28_2.jpg) Poems put together by randomly chaining together adverbs and adjectives I know that it’s just random combinations of words, but a lot of meaning can actually be read into the generated poems. Even though the sentences only consist of random adverbs and adjectives they end up being very expressive, and really emphasise certain moods. There is also something very rhythmic about this type of sentence. That was the final form of the sketch, but I wonder what more can be done to control the generation process. One idea would be to somehow track the mood of the poem depending on the initially chosen words, somehow measure how positive or negative they are and then base subsequently chosen words on that, in an attempt to make the message of the generated poem a little bit more coherent. Another idea would be to generate sentences, not completely at random but with the help of a lexical tree (not exactly sure if that is what it’s called), basically choosing words based on previous words. At some point I also want to have a crack at making a context free grammar. A favourite here was [Dominikus'](https://twitter.com/dominikus?ref=gorillasun.de) attempt at finding hidden messages in a jumble of ad slogans: > [#genuary28](https://twitter.com/hashtag/genuary28?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 'Customize The Feeling!' - finding hidden meaning in 1200 ad slogans - the most ubiquitous poetry of our age.[#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/cTaNTQLRh8](https://t.co/cTaNTQLRh8?ref=gorillasun.de) > > — dominikus (@dominikus) [January 28, 2023](https://twitter.com/dominikus/status/1619373601467269122?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And this super fun one by [sleeping](https://twitter.com/speginel?ref=gorillasun.de) that brought me right back to 2016 when I first heard the pen pineapple appple pen song: > generative poetry [#genuary28](https://twitter.com/hashtag/genuary28?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > merge the words with the same suffix and prefix in style of pen-pineapple-apple-pen meme! [pic.twitter.com/wX0mjwpQyd](https://t.co/wX0mjwpQyd?ref=gorillasun.de) > > — sleeping (@speginel) [January 28, 2023](https://twitter.com/speginel/status/1619292375431680001?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #29 Maximalism I browsed Pinterest for inspiration and found a lot of things related to interior design. One picture stood out to me, that had a cool checkerboard patterned floor and a sexy orange couch: ![](https://i.pinimg.com/564x/d8/8a/46/d88a463db4a988a9644606345f5282f9.jpg) I wanted to somehow channel that aesthetic in form of a sketch, which turned out as a combination of outwardly expanding arcs and lots of alternating black and white textures: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_1-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_2-1.jpg) Initial Idea for the Maximalism Prompt These forms did feel a bit uninspired in the end and I reverted back to the circle packing code that I had already used for #25 and #27 but wanted to make it over the top and add as many patterns as I could fit. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_3-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_4-1.jpg) Reusing the Circle Packing Code The final state of the sketch then looked like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_5.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-30_6.jpg) Adding Details and Randomness I enjoyed the interplay between slightly wobbly and strokless circles and the cleaner looker cartoony ones that had thick strokes, gives it a nice contrast. I also did some variations where there's two layers of circles, borrowing that idea from #23. Reaching the final stretch we're still going strong, some cool ones for maximalism: spirograph flowers from [Emily Weil](https://twitter.com/emilyaweil?ref=gorillasun.de), a big mashup from [Yazid](https://twitter.com/Yazid?ref=gorillasun.de) and a cool video based one from [Dave](https://twitter.com/davepvm?ref=gorillasun.de): > [#genuary29](https://twitter.com/hashtag/genuary29?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): " Maximalism." Start with circle packing, a maximalist layout in [#generativeart](https://twitter.com/hashtag/generativeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), apply it to the most minimalist of elements – a line – and what do you get? A field of spirograph-ical blossoms. [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/R1zz77CVxU](https://t.co/R1zz77CVxU?ref=gorillasun.de) > > — Emily Weil (@emilyaweil) [January 29, 2023](https://twitter.com/emilyaweil/status/1619693042377854980?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > [#genuary29](https://twitter.com/hashtag/genuary29?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Maximalism > > GENERATE ALL THE THINGS[#genuary2023](https://twitter.com/hashtag/genuary2023?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/CCYz3EmKDb](https://t.co/CCYz3EmKDb?ref=gorillasun.de) > > — Yazid (@Yazid) [January 30, 2023](https://twitter.com/Yazid/status/1619996316389765120?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > [#genuary29](https://twitter.com/hashtag/genuary29?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de): Maximalism. I wanted something really busy and dense, so I started with a CC0 video of Yonge/Dundas, one of the busiest pedestrian spots in Toronto, and kept layering the moving parts of the video on top of itself again and again. [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/11DpfBtwnn](https://t.co/11DpfBtwnn?ref=gorillasun.de) [pic.twitter.com/yocCESNjrT](https://t.co/yocCESNjrT?ref=gorillasun.de) > > — Dave Pagurek (@davepvm) [January 29, 2023](https://twitter.com/davepvm/status/1619670862466289665?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And lastly an older piece by [Loackme](https://twitter.com/loackme%5F?ref=gorillasun.de): > I don't have much time to work on [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) today, but here's an output of 'a multitude' with an overload of shapes and gradients for 'Maximalism'. [#genuary29](https://twitter.com/hashtag/genuary29?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Gyb9QF9gs3](https://t.co/Gyb9QF9gs3?ref=gorillasun.de) > > — loackme (@loackme\_) [January 29, 2023](https://twitter.com/loackme%5F/status/1619649330486595587?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #30 Minimalism I almost reused the code from #26 again as I was completely out of ideas, and even though there is some slight Perlin Noise being applied to the points that make up the central grid, it's quite subtle. Ultimately I ended up liking the minimal and playful aesthetic of these carpets, as if they were straight out of a children's book: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-29_2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Genuary-29_1.jpg) Minimalist Generative Carpets A #TsubuyakiProcessing sketch is super on point for the minimalsim prompt, and Koma Tebe nails it with his sketch. I believe that it's the formula for a squircle where the curvature parameter is being interpolated: > f=0,draw=c=>{f||createCanvas(W=400,W,F=filter,C=circle),background(0),fill(W),noStroke(rectMode(CENTER)),C(w=200,w,Z=80\*(sin(f)+PI/16)+160),rect(w,w,Q=60\*cos(f+PI/2)+170),f+=PI/128,F(BLUR,50\*cos(2\*f-PI/16)),F(THRESHOLD,.4),fill(0),C(w,w,80)};//[#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary30](https://twitter.com/hashtag/genuary30?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) minim [pic.twitter.com/Oev1icJrnJ](https://t.co/Oev1icJrnJ?ref=gorillasun.de) > > — Koma Tebe (@KomaTebe) [January 31, 2023](https://twitter.com/KomaTebe/status/1620367685573038080?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And another super cute pixelated and imaginative one by [Michael Rostocki](https://twitter.com/von%5Frostock?ref=gorillasun.de), that shows a scene of flowers bending with the wind: > "Seer" > You hunch your shoulders from the chilling wind, humiliated by the Old Gods once again. This damn seer better has some meal ready. If she doesn't, she's not a seer. Or you won't make it.[#genuary30](https://twitter.com/hashtag/genuary30?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for "minimalism"[#pico8](https://twitter.com/hashtag/pico8?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#tweetcart](https://twitter.com/hashtag/tweetcart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#codeart](https://twitter.com/hashtag/codeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#pixelart](https://twitter.com/hashtag/pixelart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/ZzBnNTh74n](https://t.co/ZzBnNTh74n?ref=gorillasun.de) > > — Michał Rostocki (@von\_rostock) [January 30, 2023](https://twitter.com/von%5Frostock/status/1620166228156502019?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## #31 Remix one of your previous Works I also felt like I could skip this one as I had already remixed quite a few of the previous sketches, in addition to my brain being devoid of any new ideas as I had been catching up with 3 prompts a day at that point: Some final favourites here were by [Alexis Andre](https://twitter.com/MacTuitui?ref=gorillasun.de) and [Matteo Mauro](https://twitter.com/mattmaurostudio?ref=gorillasun.de): > [#genuary31](https://twitter.com/hashtag/genuary31?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) remix of [#genuary14](https://twitter.com/hashtag/genuary14?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#dailycoding](https://twitter.com/hashtag/dailycoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/buRQJalHkx](https://t.co/buRQJalHkx?ref=gorillasun.de) > > — Alexis André (@MacTuitui) [January 31, 2023](https://twitter.com/MacTuitui/status/1620397951511302149?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Today is my father's 72 birthday and also the last day of [#genuary](https://twitter.com/hashtag/genuary?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). To both, my father and generative art, depends the birth of my artistic journey. To celebrate this [#genuary31](https://twitter.com/hashtag/genuary31?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) / [#january31](https://twitter.com/hashtag/january31?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) , here we post one of our last artwork produced this month which is a fragment of joy. 🤍 [pic.twitter.com/pnfwysxhgT](https://t.co/pnfwysxhgT?ref=gorillasun.de) > > — Matteo Mauro (@mattmaurostudio) [January 31, 2023](https://twitter.com/mattmaurostudio/status/1620392729468633088?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) # Final Thoughts And that's a wrap! So. Much. Generative. Art. This took a while to put together, but is in no way an exhaustive list of sketches, just a round up of my personal favorites throughout the month. I probably missed quite a bunch of cool ones. If you want to explore more you can do so via the respective hashtags on Twitter, IG and Mastodon. If you enjoyed going reading this, consider sharing it with on social media, with friends or family, dropping me a like and/or a follow on social media, or alternatively checking out some of my other posts form the past! Happy creative coding, sketching or time off from creative coding (I think we need a rest after Genuary)! Cheers! ### Gorilla Sun 2022 URL: https://www.gorillasun.de/blog/gorilla-sun-2022/ Last updated: 2023-04-25T11:20:15.000Z ***Aaaaand... CUT!*** It’s been another incredibly eventful year! Yet again, there's been a lot of generative art, many an article, a whole bunch of different creative code explorations, and a number of collabs, all of which we'll have a look at in this big gorilla recap! Like last year, I'll use this *end of the year* post as a means to write a little bit more informally, generally about my Gorilla Sun endeavours throughout the year, in context with what’s been going on in my life over the past months. However, unlike the recap from last year, I'm not gonna dump all of the art I made in here, as a month by month, but rather, we'll have a look at a couple of highlights, not really in any specific order. So without much more rambling, let's get to it (by **it** I really just mean more rambling, specific ramblings XD). Here's a quick overview of the sections: 1. [The Blog: Housekeeping!](#the-blog:-housekeeping) 2. [Gorilla Articles: 2022 Recap](#gorilla-articles:-2022-recap) 3. [All about: **All about that Grain**](#all-about:-all-about-that-grain) 4. [FxReview: Digging into fxhash projects with Raph](#fxreview:-digging-into-fxhash-projects-with-raph) 5. [All the Generative Art](#all-the-generative-art) 6. [Outlook and Closing Words](#outlook-and-closing-words) ## The Blog: Housekeeping! Let’s kick things off with some stats! Considering that creative coding is a relatively small niche, in the larger picture of internet niches, the blog's been doing pretty well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Stats.png) During the holidays there’s obviously going to be a little bit of a dip in clicks and impressions since folks are probably taking a little bit of time off from coding. That’s my assumption at least. It’s interesting how these graphs can give an insight into seasonal trends. Zooming in on finer portions of the graph you can see that numbers always dip during weekends and peak on Wednesdays and Thursdays. If I were in a different niche this would probably different? Like if I were to write about hiking or cooking related topics, would I get more clicks on weekends? The most found posts via google search are [An introduction to Perlin Noise in P5js and Processing](https://gorillasun.de/blog/introduction-to-perlin-noise-in-p5js-and-processing?ref=gorillasun.de) and [Bowyer-Watson Algorithm for Delaunay Triangulation](https://gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation?ref=gorillasun.de). The article on noise being so popular is unsurprising, since it’s just a very popular technique in creative coding. I'll most likely write an improved version sometime throughout 2023\. A for the post on the Bowyer-Watson algorithm, I'm a little surprised that it's that popular. My guess is that it's of interest to comp sci students learning about computer graphics? Triangulations are incredibly useful for solving a lot of different problems. Another notable thing that happened this year, was [migrating the blog from Github pages to Netlify](https://gorillasun.de/blog/migrating-from-github-pages-to-netlify?ref=gorillasun.de). That was a bit nerve wracking, because the blog was unavailable for a couple of hours during that time, and I was afraid of what that would do to the google search rankings of the blog posts. Although, it ended up being fine in the end. The reason for migration was Github's soft bandwidth limit of 100GB, which I believe the blog was getting dangerously close to every month (although you can't really see this info anywhere). On Netlify, in addition to being able to monitor this info (we are exceeding the 100GB bandwidth limit, probably wouldn't hurt to optimise my pages a bit), I have the option to upgrade my plan anytime I would need it, alongside a whole bunch of other cool features. In other news, I also got Adsense approved at the beginning of May! Which means that I’ve been making quite the big bucks: we’ve made a whopping 20$ over the past 8 months! (Yes you read that right, that’s a 2 and one zero, so this was sarcasm). So how Adsense works, is that it lets you create different kinds of ads, along with their html code, that can then be inserted somewhere on your page. When someone visits your site, and scrolls past that ad, you get a couple of cents, if they end up clicking on the ad you get a little bit more. There's also something called page RPM that gives you a couple of cents for impressions alone (I don’t really understand how that works). The other option you have in Adsense is to let it automatically insert ads on your site, which generally just makes your pages looking like they’ve been plastered with ads every two paragraphs. It basically doesn’t look very good, is distracting, and personally I find that it’s a bit annoying. As a compromise I chose to include an ad at the very end of each post, just above the mailing list sign up form (I should start using that at some point) and the comment section. So sometimes when someone takes the time to sign up or leave a comment I get a couple of cents. I felt that it isn’t incredibly intrusive in that manner. Most folks use ad block anyway, so the best way to support the blog is generally still to either share my posts and spread the word, or directly tipping a couple of bucks to ko-fi! All in all there’s still a lot of work to be done for the blog. I’d love to overhaul and redesign everything from the ground up sometime in the next year, primarily to make things a bit slicker for the readers. I’m probably gonna have to get some help for that (my css skills are atrocious), since I'd rather focus on the writing aspect of things. Another goal is to finally get that darned print store up and running, but that’s probably a story for another day. Anyway, that’s just some random thoughts about the blog and some ideas around where it’s gonna be heading in the future. ## Gorilla Articles: 2022 Recap ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Post-Collage.jpg) I’ve mentioned this in last year’s recap already, if you google something like **How many blog posts should I write per week/month** you’ll get some unreasonable numbers like **1 post per day** or **3 posts per week**, which might work for certain niches where there’s a constant stream of new things to be discussed. However that doesn’t really work for the type of posts that I create, where it takes roughly a month to put together a larger article. Making one post per month a much more realistic goal, without compromising the quality of the content and avoiding burn out. Writing the articles (physically punching in the letters into a text editor) does take up more than a couple of hours, split across creating an initial draft, chiseling away at the different sections and then also doing several passes of revision, to make sure that the majority of sentences are easily readable and connected in a logical manner. The bulk of it however, is researching the topics and fact checking. It goes without saying, that before I post something on the blog, I try to make sure that all the information I present is factually correct. It can be difficult for certain topics, for instance, when it comes to maths and/or programming concepts, you’ll often find the same ideas explained in very different manners across multiple resources online, where these explanations aren't always in accord. Hence I find that it is my duty to filter out the important bits and present them in an unambiguous manner. I believe that this makes writing these articles even more worthwhile, the entire idea behind the blog is providing resources that I personally would have liked to find whilst researching a new topic. I don’t want to leave the reader second guessing, and want to provide a resource that feels complete and self contained, without the assumption of too much prior knowledge. Here's a rundown of the articles I've written over the past 12 months 👇 ### Shades, shapes, shapes This year it’s been a lot about shapes, how to make them, how to place them on the canvas, and how to place them on the canvas such that they don’t intersect each other. Arguably, the blog peaked in number of visitors when we made the front page of hacker news! That was really wild! I never had that many users concurrently on the blog, which caused a massive peak in the google analytics chart, and is now towering over the rest of the timeline. > We're on the front-page of hacker news! 😁😭 [pic.twitter.com/K2NZZgQ0Tw](https://t.co/K2NZZgQ0Tw?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [October 2, 2022](https://twitter.com/gorillasu/status/1576562874733891586?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 1. [An algorithm for rounded polygons](https://gorillasun.de/blog/an-algorithm-for-polygons-with-rounded-corners?ref=gorillasun.de) 2. [A simple solution for shape packing in 2D](https://gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d?ref=gorillasun.de) (Big shoutout to [Tarwin](https://twitter.com/tarwin?ref=gorillasun.de), this article mainly discussed the optimized circle packing code that he used for shape packing) 3. [An algorithm for polygon intersections](https://gorillasun.de/blog/an-algorithm-for-polygon-intersections?ref=gorillasun.de) ### Delaunay Triangulation and Voronoi Diagrams We’ve also briefly ventured into the land of triangulation and Voronoi diagrams, which turn out to be two closely related concepts from a mathematical and historical point of view: 1. [Delaunay triangulation and Voronoi diagrams](https://gorillasun.de/blog/delaunay-triangulation-and-voronoi-diagrams?ref=gorillasun.de) 2. [Bowyer Watson Algorithm for Delaunay Triangulation](https://gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Delaunay.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Voronoi.jpg) Which reminds me that there were many more ideas that I wanted to explore here, but never got to. At the time I was on a road-trip through the French Normandy with the fam, which was probably the biggest adventure I had this year: > Been on a roadtrip last week, so haven't been very active on Twitter. Returning to a crypto crash, lots of good art, Twitter drama... seems like everything is business as usual. > > Also learned about Lloyd's relaxation algo while travelling, so there's that [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/FHJh1cwitz](https://t.co/FHJh1cwitz?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [June 13, 2022](https://twitter.com/gorillasu/status/1536349815931654144?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ### Irregular Grids! The other article that made quite the rounds and that inspired a lot of other generative artists was [An algorithm for irregular grids](https://gorillasun.de/blog/an-algorithm-for-irregular-grids?ref=gorillasun.de): > Great writeup from [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) about strategies for constructing irregular grids. Always happy to see creative coders blogging about their solutions. ☄️[https://t.co/OMO6akUyPh](https://t.co/OMO6akUyPh?ref=gorillasun.de) [pic.twitter.com/utSRGcTHRd](https://t.co/utSRGcTHRd?ref=gorillasun.de) > > — Marius Watz (@mariuswatz) [July 9, 2022](https://twitter.com/mariuswatz/status/1545865439498182657?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > Added irregular grids to my project using a technique from an amazing article by [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#codeart](https://twitter.com/hashtag/codeart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/WWx9UBTW5L](https://t.co/WWx9UBTW5L?ref=gorillasun.de) > > — Chris Barber (@code\_rgb) [May 21, 2022](https://twitter.com/code%5Frgb/status/1528042828219179008?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I also wrote about hexagonal grids this year in [A guide to hexagonal grids in p5js](https://gorillasun.de/blog/a-guide-to-hexagonal-grids-in-p5js?ref=gorillasun.de) but that post didn't see much love, although it's quite the useful pattern for many different things. Otherwise, we’ve also had a look at some more concepts specific thing in p5 and javascript: 1. [An introduction to Javascript Generators](https://gorillasun.de/blog/an-introduction-to-javascript-generators?ref=gorillasun.de) 2. [The p5 Graphics Buffer](https://gorillasun.de/blog/the-p5-graphics-buffer?ref=gorillasun.de) 3. [9 Tips for Tsubuyaki Processing](https://gorillasun.de/blog/9-tips-for-tsubuyaki-processing?ref=gorillasun.de) So, knock yourself out with these posts! Looking back, I kind of don’t remember writing all of this stuff, but it's starting to amount to a considerable pile of creative coding info! As for next year, I've already got a couple of things in the works! Expect a beefy article on Bezier Curves and Splines early 2024, which is kind of 60% complete at this point in time. It still needs some polishing though. At one point I'll probably also write about Hobby curves, but their math is a bit tricky, so I don't know if I'll be able to write about them in a digestible manner anytime soon. I'm also planning on doing more 'etudes', there's a couple of cover sketches that I did this year that I think would be really interesting to cover, like Jared Tarbell's substrate algorithm, and the recode rethink piece I did "Hommage to Frieder Nake's hommage to Paul Klee". Other than that I've also got ideas for some non-technical posts that revolve around creative coding from a historical and etymological point of view, since there isn't much literature on that topic (it's sparse at least). ## All about: **All about that Grain** ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/grain.jpg) [All about that Grain](https://www.fxhash.xyz/article/all-about-that-grain?ref=gorillasun.de) is a collaborative fxtext written together with [meezwhite](https://twitter.com/meezwhite?ref=gorillasun.de)! Towards the end of July I received a lovely message from him, with a bunch of ideas regarding grainy textures in generative art, and some thoughts on the different methods with which these textures can be applied to an artwork. We put together a notion site and slowly started collecting ideas, and over the course of the following weeks we started chipping away at what later became a lengthy article to get you started with grainy textures in your own generative art. You can find it [here](https://www.fxhash.xyz/article/all-about-that-grain?ref=gorillasun.de) as an ARTKL on fxtext, as a semi fungible tezos token basically. Consider collecting one while you're at it! > This one has been in the making for a couple of weeks but it's finally ready 🥳 [@meezwhite](https://twitter.com/meezwhite?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and I put our heads together and present to you an article we wrote together: All about that Grain > > Check it out on [#fxtext](https://twitter.com/hashtag/fxtext?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 👇[https://t.co/KSOwngVwAN](https://t.co/KSOwngVwAN?ref=gorillasun.de) [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/Tw1S2UwsqM](https://t.co/Tw1S2UwsqM?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [September 13, 2022](https://twitter.com/gorillasu/status/1569723128451928064?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And there's more! meezwhite even put together an entire library for this purpose! Hop over to Github and give the [p5.grain](https://github.com/meezwhite/p5.grain?ref=gorillasun.de) library a spin! Meezwhite worked incredibly hard on the library, and is regularly updating it, so go give him a follow over on [Twitter](https://twitter.com/meezwhite?ref=gorillasun.de). And if you've discovered your own unique type of grain, have some suggestions for improvements, or you've discovered an entirely new and different method for creating grainy textures, here's [guidelines for contributing](https://github.com/meezwhite/p5.grain/blob/main/CONTRIBUTING.md?ref=gorillasun.de) to the library. Again, go support meezwhite! And keep your eyes open for more grain in 2023! ## FxReview: Digging into fxhash projects with Raph ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/stream.jpg) Without a doubt, another highlight from 2022, were the two episodes where Raph invited me on the stream to review some fxhash projects on his stream! Before we get to that, I just want to say what an awesome guy Raph is. The birbsnest discord is one of my favorite little communities on the internet, and is probably the most wholesome group of people that you could possibly find. In a way, joining in every now and then for the weekly streams feels a little like hanging out with a bunch of friends! I honestly have to say that I was a little bit nervous before each one of the streams. I'm fully aware that I'm just talking to a camera, but there's still that fear of **what if I say something dumb**, or **what if they think my accent is silly* . But that feeling went away very quickly once the streams started.* > Trying something new! Generative artist [@gorillasu](https://twitter.com/gorillasu?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and I will deconstruct [@fx\_hash\_](https://twitter.com/fx%5Fhash%5F?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) projects live on Twitch tomorrow 🎙 > > Which generative tokens would you like to see us to react to? Post your suggestions below 🤗 [pic.twitter.com/lwXRpNaVW2](https://t.co/lwXRpNaVW2?ref=gorillasun.de) > > — Raphaël de Courville (he/him) 𓅬 (@sableRaph) [June 29, 2022](https://twitter.com/sableRaph/status/1542096950836731904?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Another difficulty was preparing the projects for the review: I discovered that reading code is definitely not one of my strong suits, and is something that I have to really work on in the future. It was a little bit easier in the pilot episode, since we had picked some projects from the early era of fxhash where projects weren't as elaborate as they are now (well, zancan's code was quite beefy). In the meantime fxhash kept growing as the biggest generative art blockchain NFT marketplace. That meant that projects have become more elaborate and much more intricate (imo). Naturally, newer projects will have to rise up to that challenge to be able to compete and stand out. The second time around, it was more difficult to dissect the projects and dig into the code, all while trying to not get too nerdy about the technicalities, making for an interesting challenge. I can say however, that I really learned a lot from these two 'etudes' of trying to read and understand other folks' generative art projects. > Even though cameras, mic and internet were not cooperating in the beginning it ended up being a blast reviewing some sketches! > > Here's us nerding out about random number generation! 😁 [#fxReview](https://twitter.com/hashtag/fxReview?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/Ix8vNlRmaj](https://t.co/Ix8vNlRmaj?ref=gorillasun.de) [pic.twitter.com/H8OOX4r1Sl](https://t.co/H8OOX4r1Sl?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [December 17, 2022](https://twitter.com/gorillasu/status/1604108601903267840?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Go show [Raph](https://twitter.com/sableRaph?ref=gorillasun.de) some love and give him a follow, check out his weekly creative code news, sign up to his [patreon](https://www.patreon.com/sableraph?ref=gorillasun.de), and maybe consider joining the [birbsnest discord server](https://discord.com/invite/S8c7qcjw2b?ref=gorillasun.de)! ## Generative Art There has been a whole lot of art this year! If you want to see all of it your best bet is scrolling down on my twitter timeline or using the advanced search filters. Here I'm just gonna show a couple of highlights that I think are my favourite creations from this year! ### Microcosm [Microcosm](https://www.fxhash.xyz/generative/10999?ref=gorillasun.de) was my first generative token on the Fxhash v2 contract, and it was a doozy to put together! In a way it reminds me of cartoon-y petri dishes: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Microcosm1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Microcosm2.jpg) Microcosm is essentially a 3 in 1 sketch with the graphics buffer shenanigans that went into it. Each iteration basically holds 3 artworks, each with a different aspect ratio and different randomization. It was supposed to be sort of a middle ground between responsive aspect ratio and a fixed size aspect ratio. However in retrospect that's a bit weird, I think the way to go is to have every iteration of a token either be the same aspect ratio, or have an individually selected aspect ratio. It was an interesting experiment though 🤷‍♂️. Although the response to this sketch was really good when I first posted it on Twitter, it didn't perform so well as an fxhash token. It ultimately turned out to be a bit too repetitive and didn't have enough variety color-wise. Arguably, the most difficult part of every larger project that I've attempted so far is putting together color themes that harmoniously accentuate the different components of the compositions, since it plays such an important role in how the final collection looks as a large whole. Lessons learned, nowadays I try to invest more time into carefully selecting the colors such that the compositions feel balanced individually and as a whole compared to other iterations of the same collection (although I'm still not very good at it). ### Exotic Quarpets [Exotic Quarpets](https://www.fxhash.xyz/generative/17777?ref=gorillasun.de) is probably my personal favourite from this year! You can read the [Making of Exotic Quarpets](https://gorillasun.de/blog/making-of-exotic-quarpets?ref=gorillasun.de) if you're curious how it's made: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-1-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-2-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Exotic-Quarpet-3-1.jpg) I don't know why, but it feels like the most **Gorilla** piece that I put together this year. At the time I was trying to push myself a bit out of my comfort zone and not do everything with OOP, but rather try and do things in a more functional manner. In hindsight, I could have probably further increased the variety of the tiles, but after working on it for a couple of weeks you can get burnt out quite quickly, feeling like there's nothing more to be added. Here I also learned how important it is to regularly refactor larger projects, the larger a project becomes and the more things you try to add, the more of a spaghetti code mess it becomes. Sometimes it's better to use a coding session solely on refactoring and cleaning up without adding any new components. ### Neo Supremus [Neo Supremus](https://www.fxhash.xyz/generative/20252?ref=gorillasun.de) was another labour of love, where I dove deep into suprematist compositions, in an attempt to recreate them in a generative manner. In [Making of Neo Supremus](https://gorillasun.de/blog/making-of-neo-supremus?ref=gorillasun.de) I talk a bit about the Suprematist art movement and how I tried to emulate these compositions in code. Obtaining seemingly natural positioning of elements turns out to be quite the difficult problem to solve, I still think about it from now and then though. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Supremus-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Supremus-2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Supremus-3.jpg) I probably wrote around 20 different functions to position rectangles on the canvas, and ultimately ended up using a variation of one of the earliest ones. The more I tried to force positions to be *neat* and *pretty*, the more it felt forced and not generative. Part of the beauty of generative art is that it's of a chaotic nature: fine tuning some parameters too tightly can quickly tip the balance and prevent a sketch from reaching its full potential. Exceptionally outputs and duds are two sides of the same coin. Yes, yes I am getting very philosophical now, but these are things that I need to actively remind myself of while working on new projects. Maybe you can also find some value in these words! ### Kandinskomorphism [Kandinskomorphism](https://www.fxhash.xyz/generative/19121?ref=gorillasun.de) was essentially the spiritual predecessor of Neo Supremus. Similarly to Exotic Quarpets it also started as a submission to the birbsnest's weekly challenge. I ended up liking the sketch so much that I turned it into an fxhash project. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Image-14.png) Similarly to Neo Supremus I also struggled with the positioning of things here to consistently obtain harmonious compositions. There's something fascinating about how humans can place things seemingly at random on a canvas, but convey an illusion of structure and make elements seem deliberately positioned. Maybe that is the meaning of true randomness? ### Behind the Canvas [Behind the Canvas](https://openprocessing.org/crayon/28?ref=gorillasun.de) dates back to February, where [Sinan](https://twitter.com/msawired?ref=gorillasun.de) (the creator of [openprocessing](https://openprocessing.org/discover/?ref=gorillasun.de#/generativeart)) reached out to me, asking if I'd like to create a piece for [Crayon Codes](https://openprocessing.org/crayon?ref=gorillasun.de). And of course I was on board for it! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Behind-the-Canvas-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/behind-the-canvas-3-1.jpg) Sinan was incredibly helpful during the process, continuously providing me with feedback, making it one of the best creative code experiences from the past year. I don't really know if Crayon Codes is going to make a come back in the future, I do hope so, and maybe at some point it will. I really loved the concept behind it and what it stood for, Sinan's words from discord: > Being fast or catching the waves was never the main goal here, nor having active marketing. We always wanted to keep it small, limited, curated, authentic, and organic. Overall, I'm really happy and honoured to have been a part of Crayon Codes. And on that note, I'm super excited for fx(params) and how that is going to work once it comes out! Having the collector as an active part of the minting experience is going to be very interesting! As for Behind the Canvas, there's a bunch of cool things happening in the sketch which you can read about in [Making of Behind the Canvas](https://gorillasun.de/blog/making-of-behind-the-canvas?ref=gorillasun.de). The entire collection can be seen [here](https://openprocessing.org/crayon/28?ref=gorillasun.de). ### Galactic Morphogenesis In March I also worked on some galactic GIFs that were essentially etudes on sinusoidal motions. It's probably one of the very first creative coding tricks I've learned after watching a [talk](https://www.youtube.com/watch?v=bmztlO9%5FWvo&t=456s&ref=gorillasun.de) by [Zach Lieberman](https://twitter.com/zachlieberman?ref=gorillasun.de) where he codes up a quick demo sketch that makes use of trigonometry and time to make a quirky and wiggly little animation. I don't know why, but that little live demo really stuck with me, every so often I go back to watch it again. Unsurprisingly, chaining together several sines and cosines one can get more and more complex types of motions (think Fourier Transform, any signal can be recreated from a combination of sine waves), which is essentially what's happening in these GIFs. Using a common clock we can also sync the little animations on the borders: Currently one of them sits as the pinned tweet on my profile and is by a large margin the most liked/retweeted twitter of this year: > OK, so this took several hours to make! Entirely made with P5! 🤠 Super happy how it turned out! 😁 > > Also, posting the MP4 version at 60 FPS this time around, since the GIF really doesn't do it justice (gif version in the replies 👇). [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/5oQv5K7TqD](https://t.co/5oQv5K7TqD?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 9, 2022](https://twitter.com/gorillasu/status/1501499940714987526?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I seriously need to get back into making some animations! I've been mainly just making static artworks. Partially because it's very time consuming exporting the frames and fine tuning to reduce the size of the resulting GIF, so that Twitter compression doesn't butcher it. ### Generative Meadows This one I've been thinking about returning to, but I don't really know how it can be pushed further. > Smol blobs instead of circles, I think it sells the idea of pebbles a bit more 🤔 [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#craetivecoding](https://twitter.com/hashtag/craetivecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/YzTUXZSw0j](https://t.co/YzTUXZSw0j?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [August 21, 2022](https://twitter.com/gorillasu/status/1561320809792143361?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Meadow-2.jpg) It's based on a really simple concept to simulate a grassy meadow. Short lines are drawn, angled upwards, and randomly displayed based on an underlying Perlin noise field. The trick that really sells it, is that lines in the foreground (bottom of the canvas) are slightly longer and thicker than those that lie more distantly (towards the top of the canvas). Also slightly discoloring the lines that are more distant gives it a little bit of a blue shift (atmospheric perspective). ### Untitled Poisson Disk Traversers This has been my most recent **big** project, and I've still got plans for it. I just need to find the mojo for it again though. It's basically a field of points create by Poisson disk sampling, which is then traversed by a number of walkers that consume these points (which makes it such that they don't collide). The trail/paths created by these walkers are then drawn with Bezier and/or Hobby curves for an organic feel, with some other shenanigans to obtain a cool crayon texture. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Poisson-Disk-Traversers-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Poisson-Disk-Traversers-2.jpg) The cool thing is that there's many different traversal strategies (graph traversal methods for example) here that wouldn't work on a regular grid (throwback to the grid walker sketch from 2021), which yield different types of patterns. > Ok last ones for today! Kind of have a "Starry Night" feel to me 🤔 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/3zhfLaGKJc](https://t.co/3zhfLaGKJc?ref=gorillasun.de) [pic.twitter.com/RMp4jeLslQ](https://t.co/RMp4jeLslQ?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [December 17, 2022](https://twitter.com/gorillasu/status/1604158234994298880?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Of course the best part, as always, are the bugs! > Ah yes, no bugs at all 😂 everything working as intended! [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/EyYjwb2N9G](https://t.co/EyYjwb2N9G?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [December 20, 2022](https://twitter.com/gorillasu/status/1605219086920826880?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) So many more ideas to explore here really! ### Other Art Thingamabobs Here's some more sketches that are either unfinished WIPs, completed projects, completed projects due to abandonment or just one offs from the past year: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Hatched-Blocks-2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/kite.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Tidal-Vision-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Schism-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1ksuns.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Fuliginous.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Block-built.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/repeat-print-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Reflection-2.jpg) ## Outlook and Closing Words It's been one helluva an awesome year! So much art, so many awesome people, so many lessons learned. Over the year I've had many ups and many downs, and to be completely honest, there were many moments where I felt utterly burnt out and at my wits' end, feeling frustrated either with myself or with my art. I usually don't let any of this seep through to social media, but I'm also just human. I'm proud of myself though, picking myself up again every time and not throwing in the towel when I could have. There's been a lot of personal hardships over this year, like moving to a completely new city at the very beginning of the year, whilst trying to figure out this creative coding thing and making it work without burning myself out mentally or emotionally, also catching covid twice, and finishing up a drivers license that I had started the year before. I somehow can't comprehend that it's been an entire year again. But putting this post together really helps me tie up the year and put a closing stamp on everything. And it goes without saying, that I wouldn't have been able to do all of this without the folks that stood beside and supported me during the tough times. I also want to give a big thanks to all of my internet friends (if you're reading this then we are internet friends), that I've met through social media, Twitter, Instagram or that reached out to me after finding the blog. Additionally a gigantic thanks to all you folks on Twitter that continuously like my tweets and the art that I share over there, I see you and I notice you, and I'm incredibly grateful. Ok I'll stop here, because I could go on and on... basically, thanks everyone for everything! All that said, next year is essentially going to consist of more art, more articles, more creative coding. Basically more of everything. And with Genuary 2023 at the gates, we've already got our work cut out for us! If you've reached here, thanks a million for reading! I hope you have a happy start into the new year! Cheers and happy creative coding! ### An Introduction to Javascript Generators URL: https://www.gorillasun.de/blog/an-introduction-to-javascript-generators/ Last updated: 2023-12-07T10:44:48.000Z Generators are a bit of an obscure feature of javascript, and their usefulness might not be immediately evident. This article aims at explaining how they work and what they can be used for! We’ll first have a look at the syntax and how generators are typically implemented, followed by some use cases where generators come in really handy! We'll also briefly dip our toes into the concept of iteration, iterators and iterables. Lastly, we'll also have a look at the lazy evaluation programming paradigm and how generators are one way to implement it! # A Tale of Iterators and Iterables Generators are essentially iterators in disguise. Let me explain what that means! An iterator can be best explained as a "protocol that defines how to produce a sequence of values from an object". That's a bit of a mouthful, and it's probably best to directly have a look at an example. You're probably familiar with the **for...of** loop statement that was introduced in ES6 (not to be confused with the **for...in**): ```javascript let nums = [1, 2, 3, 4, 5] for(let n of nums){ console.log(n) } // 1, 2, 3, 4, 5 ``` It's essentially an alternative to the regular old school imperative for loop that we're used to, where we manually have to access the elements of the array we're looping over and requires us to keep track of the index. The **for...of** loop takes care of all of that for us, we just need to pass it the array taht we want it to loop over and it'll directly serve us the elements of that array without having to access them by index (as opposed to the **for...in** loop statement for example). Fun fact, the **for...of** loop can also be used for other objects such as sets and strings (and more)! Neat, right?. The object that is passed to a **for...of** loop usually needs to be an **iterable**. The important thing to understand here, is that the **for...of** loop doesn't actually loop over the object by itself, but makes use of an **iterator** function that is attached to the iterable. The **for...of** loop simply invokes that iterator function and makes use of it to generate the correct sequence of items. This means that arrays, sets, strings, etc. already have such an iterator function built into them that predicate in what sequence the **for...of** loop will go over the elements. In [exploring ES6](https://exploringjs.com/es6.html?ref=gorillasun.de), Dr. Axel Rauschmayer gives a good summary of what iterables and iterators are: > **Symbol.iterator** In essence, iterables are sequences of data that are intended to be traversed and consumed, and at the same time hold their own iterator function stored inside an object property with the identifier **Symbol.iterator**. It describes what the sequence of items should look like when it's being looped over. What javascript Symbols are is widely outside the range of this article ([learn more about Symbols](https://www.javascripttutorial.net/es6/symbol/?ref=gorillasun.de)), and isn't really of much concern for the purposes of this article, we simply need to implement this function to make an object iterable. More on that later. > An iterator is a pointer for traversing the elements of a data structure (think cursors in databases). Basically, iterators are procedures that describe how the iterable sequence is being traversed. A more formal definition for an iterator can be found on MDN, it essentially is an object that satisfies two conditions: > In JavaScript an iterator is an object which defines a sequence and potentially a return value upon its termination. Specifically, an iterator is any object which implements the Iterator protocol by having a next() method \[…\] — MDN We're gonna see what all of this means in a hands on manner throughout the next two sections! Additionally, as a matter of fact, all iterators are actually also iterables, because technically, they can be iterated over by another iterator. However, not all iterables are iterators. This is probably very confusing at this point, hang on though, it'll get a little clearer in the coming sections. I hope I have piqued your interest at this point, and you're curious to know how generators fit into the overall picture of iteration! # Generators: Iterators in Disguise! A javascript generator is a special type of synchronous function where execution can be manually halted and resumed at any given point, all the while remembering where we halted execution. Regular functions don’t have this ability, once invoked they will run until fully executed or a return statement is encountered. To best illustrate this, let’s start by having a look at the syntax! To tell javascript that a function should be a generator, we simply follow the ‘function’ keyword by an asterisk symbol. And that's that, how this syntax came to be from a historical point of view is a bit hazy. Here's an initial minimal example: ```javascript function* generator(){ yield; } ``` Our next point of interest is the **yield** keyword that you can see in the body of the generator's function. Think of it as the return keyword’s distant cousin: it is also used to get a value out of the generator function and returns it when the generator is invoked, however, unlike the return keyword, it doesn’t terminate the function instantaneously but rather just pauses it’s execution. The next time the generator is invoked again we will resume execution starting from the last yield keyword. This essentially means that the yield keyword can occur more than once throughout the generator’s body: ```javascript function* generator(){ yield 1; yield 2; yield 3; } console.log(generator().next().value) // 1 console.log(generator().next().value) // 2 console.log(generator().next().value) // 3 console.log(generator().next().value) // undefined ``` You probably also noticed that we can’t simply invoke the generator like a regular function. Calling the generator function like a regular one would actually not do anything. To actually get a value out of it we need to use the **next()** method. Invoking this method on the generator function we will obtain a little object with two properties **value** and **done**, where the former is simply the value that we are returning with the **yield** statement, and the latter is a boolean indicating if the next .next() call will return a value or undefined. You will get a generator object with a ‘value: undefined’ when there are no more yield statements to consume. ```javascript console.log(generator().next()) // {done: false, value: val} ``` If your generator accepts input parameters, these have to be passed through the **next()** method as well. In this manner, generator functions are iterators as the satisfy the two conditions that we mentioned earlier: 1. Generators are objects that implement a **next()** function. Printing out the generator object itself with **console.log(generator)** you'll see that it has a property called **next** that holds a function. 2. A generator has a return value on when it terminates. This happens when all yield statements are exhausted, and even holds true when there are no yield statements in the body of the generator function. In the coming section we'll have a crack at creating our own custom iterator functions for our objects! Generators will come in very handy for that! # Generators as Iterables! At the same time, generators also act as iterables! For example, we can simply pass our generator to a **for...of** loop to extract values from it: ```javascript function* generator(){ yield 1; yield 2; yield 3; } for(let val of generator()){ console.log(val) } // 1, 2, 3 ``` We can also do all the other stuff that we would normally be able to do with iterables, like extracting the entire sequence with a spread operator: ```javascript let seq = […generator()] ``` This implies that we can pass one generator (as an iterable) to another generator (as an iterator): ```javascript function* iterable(){ yield 1; yield 2; yield 3; } function* iterator(iterable){ for(let val of iterable){ yield val } } let a = [...iterator(iterable())] console.log(a) // [1, 2, 3] ``` This can get a bit confusing and it's probably a bit difficult to see how this is useful, but later we'll get into an interesting use case, where we can plug these generators together in a sort of modular manner and achieve lazy evaluation of values. However, let's first have a look at how to create custom iterator functions for our objects! # Custom Iterables with Generators Some objects in javascript already have iterators built-in, simply allowing us to pass them to a **for...of** loop. But what if we create a custom object, how can we turn it into an iterable that we can pass to a **for...of** loop? In this case we would have to define our own iterator and attach it to the object under the **Symbol.iterator** property that we've already discussed earlier. To demonstrate this, I'll borrow an example from an amazing talk by [Anjana Vakil](https://twitter.com/AnjanaVakil?ref=gorillasun.de): [The Power of JS Generators](https://www.youtube.com/watch?v=gu3FfmgkwUc&ref=gorillasun.de). Let's assume we have the following object: ```javascript let cardDeck = { suits: ['♥️', '♦️', '♠️', '♣️'], court: ['J', 'Q', 'K', 'A'] } ``` The expected behaviour here, when passing it to a for...of loop, would be to loop over the all of the court + suit combinations in addition to the pip cards (the cards with numbers on them). Hence 52 distinct pairs in total, and we want to do this without manually having to type all of them out. Building our iterator object from scratch, we need to follow the two conditions: - We need to implement a .next() function - We need to return an object of the form {done: true|false, value: val} Typically this is implemented in the following manner: ```javascript [Symbol.iterator] = function(){ return { next: () => { done: true, value: 'hello' } } } ``` A little bit difficult to digest on first glance. The function returns an object that holds as property the **next()** function. In turn, the **next()** function is what returns the iterator object which holds the **done** and **value** properties. This would already work if we were to pass it to a **for...of** loop, but is still a bit primitive in its current state. Here we defaulted the done value to true, because having it set to false would be problematic if we fed it to a **for...of** loop (it would loop indefinitely). We've got to add some more stuff to make this work as intended: ```javascript let cardDeck = { suits: ['♥️', '♦️', '♠️', '♣️'], court: ['J', 'Q', 'K', 'A'], [Symbol.iterator]: function(){ // indices that keep track of our position in the two arrays let suitsIdx = -1; let courtIdx = 0; return { next: () => { // simulating a nested loop here: courtIdx is only incremented // whenever suitsIdx has made a complete pass over the suits array if (suitsIdx >= this.suits.length - 1) { suitsIdx = 0; courtIdx++ } else { suitsIdx++; } // when courtIdx has made a complete path, we are done if (courtIdx > this.court.length - 1) { return { value: undefined, done: true, }; } // If the previous condition didn't trigger, we return the iterator object with the current suit/court combinations return { done: false, value: this.suits[suitsIdx] + this.court[courtIdx] } } } } } ``` Now passing this to a **for...of** loop we would have successfully generated all of the possible suit/court combinations, we would still need to work on it to generate all of the 52 combinations. Try changing the code to make it also produce the numerical cards, it's a bit of a hassle... Imagine if you had more complicated objects for which you would want to generate certain sets of combinations! The problem of adding your own iterator function to your custom objects can be made much more tractable when using generators! Let's do the same thing as we just did, with the simple difference that this time around we'll use a generator as a middle man: ```javascript let cardDeck = { suits: ['♥️', '♦️', '♠️', '♣️'], court: ['J', 'Q', 'K', 'A'], [Symbol.iterator]: function* (){ for(let suit of this.suits){ for(let i = 2; i <= 10; i++) yield suit + i; for(let c of this.court) yield suit + c; } } } ``` See how much more compact this has become?! We didn't have to deal with keeping track of any index, the syntax is a lot cleaner, much more readable, and it implicitly took care of returning the iterator object. Essentially, we mediated between iterability and our custom object via means of a generator! By adding the **Symbol.iterator** function we've provided a means for iterators to consume our iterable. Moral of the story is: the next time that you want to turn one of your objects into a custom iterable, try to use a generator to make things easier! # Lazy Evaluation with Generators All of what precedes already makes generators incredibly versatile tools, however Javascript generators really shine when it comes to lazy evaluation (also sometimes referred to as call-by-need). Here it might be useful to spend a moment and talk about what that actually means. In essence it’s a programming paradigm where the computation of values and/or evaluation of statements is delayed until is absolutely necessary. During my master studies I incidentally used generators on a daily basis, where I was working on machine learning models and training neural networks. It is often the case that machine learning datasets are quite large (ranging in the hundreds of Gigabytes), especially when you're dealing with vision models that need to be trained on image files for example. From a memory perspective, training these models can be quite challenging, even when you're working with a super high end computer. It is impossible to fit such datasets into memory. It would be much more convenient to be able to fetch just a couple of training samples at a time, feed them to the neural network, do a training pass, then discard those and fetch a new batch of samples and repeat the previous steps. And well, I think you know what I'm trying to imply. Generators allow us to do this with ease, and are much less clunky to work with than for loops in this scenario, often it the case that we want to fetch a small batch of data samples, apply some pre-processing steps to it, pass it to the neural network, do a training pass, and then every so many iterations we'd also want to evaluate how well our model is doing, and ultimately start over again and repeat these steps. Generators just make this interleaved and sequenced way of writing code super easy, as they will always wait for us when we suspend them and remember where we'e left off as well. This is however just one example of this lazy, on demand evaluation type of programming. A great resource on this lazy iteration, is James Sinclair's article [Why would anyone need javascript generator functions?](https://jrsinclair.com/articles/2022/why-would-anyone-need-javascript-generator-functions/?ref=gorillasun.de) where you will incidentally also learn a lot about Australian culture and what a Tim Tam Slam is. Let's have a look at a concrete example, say we have an array of numbers: ```javascript let nums = [0, 1, 2, 3, 4] ``` And say, we'd like to apply two operations on each element in this array, firstly add the previous value (when it exists) to the current value, and then square the result. We can attempt this with the inbuilt javascript array methods, like for example .map(): ```javascript let offsetAndSquared = nums.map((curr, n, arr) => curr+=arr[n-1] ? arr[n-1] : 0).map(curr => curr**2) console.log(offsetAndSquared) // Result: [0, 1, 9, 25, 49] / Expected: [0, 1, 5, 13, 25] ``` However this is not the intended effect, we would actually like that both actions happen in sequence on each element before they are applied to the next element. Although we could do this with an old school imperative for loop... Generators to the rescue! For this we'll create a little number generator that can give us a sequence of N numbers as an iterable: ```javascript function* number(){ let i = 0 while(true){ yield i++ } } ``` Next we'll create our own version of the map array method, but with the twist that it's a generator: ```javascript function* mapGen(iterable, mapFn){ for(let item of iterable){ yield mapFn(item) } } ``` And we'll also create a generator which remembers and adds the previous value if there is one: ```javascript function* addPrev(iterable){ let prevItem = undefined; for(let item of iterable){ yield (prevItem) ? item + prevItem : item; prevItem = item } } ``` Last but not least, we also need a function that can extract a N values from our starting iterable (the number generator), we'll call that function **take**, as in taking from the iterable, and which will act as the main iterator that starts our iterable domino chain: ```javascript function* take(n, iterable){ for(let item of iterable){ if(n <= 0) return; n--; yield item; } } ``` Now we would put together our little iterable daisy chain in this manner: ```javascript let offsetAndSquaredGen = [...take(5, addPrev(mapGen(numberGenerator, n => n**2)))] // [0, 1, 5, 13, 25] ``` This is really cool, because technically there is no limit to how many generators we can chain together, and essentially obtain new and interesting sequences in this modular approach! Could be cool for generative art purposes? # Infinite Sequence Generators If you've noticed, we've had a **while(true)** in our number generator, which is in any other scenario quite a scary statement, but thanks to the yield keyword we can rest assured that it won't run infinitely (except if we pass it to a for...of loop, but at that point it really is our fault). In essence, we've created an iterable that defines an infinite range, which could be potentially useful in certain situations, for instance when we don't know how many items/values we need in advance, we can just write a generator that defines the sequence and generate these values on demand. An example of an infinite sequence would be the fibonacci numbers: ```javascript function* () { let prev = 0; let curr = 1; while (true) { yield curr; const tmp = prev; prev = curr; curr = curr + tmp; } } ``` Now we could also recreate the usual array methods as generator equivalents, like we've already done earlier and act upon this infinite sequence in a lazy manner! This might come in handy one day. # Closing Notes I think we've covered all of the basics of generators in this article! They are a very powerful feature of Javascript which allows for a completely different approach for certain types of problems and otherwise might just be fun to play around with. One thing that needs to be pointed out here is that generators are [not supported on some older browsers](https://caniuse.com/es6-generators?ref=gorillasun.de), so make sure you account for that if you use them in your projects. If there's any more things that you think should be included, let me know in the comments down below, and if you have any questions or need any clarifications also leave me a comment. Otherwise, thanks for reading! If this was useful to you, share it with a friend! Or check out some of my other articles! It helps out a lot! Cheers, happy holidays, merry christmas, a happy new year and happy coding! Here's some further reading material: 1. [The Power of JS Generators](https://www.youtube.com/watch?v=gu3FfmgkwUc&ref=gorillasun.de) by Anjana Vakil 2. [Why would anyone need javascript generator functions](https://jrsinclair.com/articles/2022/why-would-anyone-need-javascript-generator-functions/?ref=gorillasun.de) by James Sinclair 3. [Infinite Data Structures in Javascript](https://medium.com/hackernoon/infinite-data-structures-in-javascript-eb67ecbccdb?ref=gorillasun.de) by Francis Stokes 4. [The Ultimate Guide to JavaScript Symbols](https://www.javascripttutorial.net/es6/symbol/?ref=gorillasun.de) ### The P5 Graphics Buffer URL: https://www.gorillasun.de/blog/the-p5-graphics-buffer/ Last updated: 2023-04-25T11:27:53.000Z The graphics buffer is a powerful feature of the p5 library. When I started with p5 I didn't really understand what it was used for, but now it's become an indispensable tool for me in my sketching practice. Besides creative use cases, the graphics buffer can also help with displaying your sketches nicely on different canvas resolutions. Hence, in this tutorial I want to show you everything that there is to the p5 graphics buffer. We'll go over how to create one, how to draw to it as well as how to display it correctly and how it can be used as a method to display your sketches in a window-dimension-independent manner. Towards the end I'll show you how to create the cool repeat print sketch you see above, which is done by tiling the canvas with a bunch of small graphics buffers. And by the end of this tutorial I’ll also provide you with a useful template for your own sketching purposes. ### Quick Index: 1. [Creating the Buffer](#creating-the-buffer) 2. [Displaying the buffer](#displaying-the-buffer) 3. [Drawing to the buffer](#drawing-to-the-buffer) 4. [Buffer as a texture](#buffer-as-a-texture) 5. [Mouse coordinates on the buffer](#mouse-coordinates-on-the-buffer) 6. [Seamless 10 PRINT pattern](#seamless-10-print-pattern) 7. [A graphics buffer sketch template](#a-graphics-buffer-sketch-template) ## Creating the Buffer Creating the buffer is done in a similar manner to creating the main canvas. Generally this is also done in p5's setup function that is run at the beginning of the sketch's execution: ```javascript // buffer is declared globally // so that we can access it throughout the code let buffer; function setup(){ w = 400 createCanvas(w, w) // buffer has identical dimensions to the canvas buffer = createGraphics(w, w) } ``` **createGraphics()** essentially creates another canvas element (we can also display it, more about that in a second), with its own rendering instance. This buffer is created offscreen, meaning, if we inspect the browser window of our sketch we can notice that there's another canvas element inside the body tag of our html: ```javascript ``` The display:none; css property is in charge of hiding the buffer. You can also notice that the actual width and height of the buffer is 800 pixels instead of the 400 pixels we specified, this is due to the screen's pixeldensity it's rendered in, and might be different on other screens. For this we can also specify the **pixeldensity** of the graphics buffer: ```javascript buffer.pixelDensity(1) ``` Additionally we can also use the WEBGL rendering mode if we want to create a 3D scene within the buffer rather than the regular 2D one: ```javascript buffer = createGraphics(w, w, WEBGL) ``` ## Displaying the Buffer Displaying the graphics buffer can be done by using p5's image() function. This is possible because the graphics buffer is implicitly also a p5 element that can be displayed with the image function. ```javascript // Each frame, the buffer will be drawn as an image to the canvas function draw(){ background(220); image(buffer, 0, 0); } ``` The image function can be used in a number of different ways, but usually we want the graphics buffer to cover the entire canvas, hence for our purposes we need only pass the buffer as the first parameter alongside the x and y coordinates that specify where our buffer should be drawn. In this case the buffer has the same dimensions as the canvas, hence by simply placing it at (0, 0) we can fill the entire canvas with it. The p5 image function also allows us to stretch and squeeze the buffer by specifying a width or height that is different from the original buffer dimensions. Here's an example, try moving your mouse over the canvas: I haven't used it a lot for graphics buffers but we can also use the image function for cropping purposes. This is done by passing in 8 parameters instead of 4, the first four specifying where we want to draw the cropped portion of the graphics buffer on the canvas, whereas the latter 4 specify the portion of the buffer that we want to crop out: Now, what if we wanted to cover the entire canvas with our graphics buffer, but the canvas dimensions are variable? It's often the case that the canvas dimensions aren't fixed and change when the containing browser window is resized, for example in the live view of an fxhash project, where we want the canvas to be centered and take up as much space within the browser window. There isn't one solution that fits all sketches, but when your art is dimensionless we'd want the graphics buffer to be of a fixed size all while resizing along with the canvas. For a static sketch that has a 1:1 aspect ratio we could do something like this: ```javascript let buffer; let buffer_dim = 1080; // size of the canvas let w; function setup(){ w = min(windowWidth, windowHeight) createCanvas(w, w); buffer = createGraphics(buffer_dim, buffer_dim) // function where all the stuff in the buffer should be drawn drawBufferStuff() image(buffer, 0, 0, w, w) } // p5's windowResized() function is called when the window dimensions change function windowResized(){ w = min(windowWidth, windowHeight) resizeCanvas(w, w) image(buffer, 0, 0, w, w) } ``` A helpful function in this case is p5's **windowResized()** that is triggered every time the containing browser window changes in dimensions. In this manner the canvas is of variable size, while the buffer is of a fixed size, but still resizes such that it takes up the entire canvas. When the sketch doesn't have a 1:1 aspect ratio we'll need to keep track of both width and height, my solution for this: ```javascript const BUFF_DIM = 1080; const BUFF_WID_MOD = 1 const BUFF_HEI_MOD = 1.4 const BUFF_WID = BUFF_DIM * 1 const BUFF_HEI = BUFF_DIM * BUFF_HEI_MOD let buffer; let CANV_DIM; function setup(){ CANV_DIM = min(windowWidth, windowHeight) createCanvas(CANV_DIM*BUFF_WID_MOD, CANV_DIM*BUFF_HEI_MOD); buffer = createGraphics(BUFF_WID, BUFF_HEI) // function where all the stuff in the buffer should be drawn drawBufferStuff() image(buffer, 0, 0, CANV_DIM*BUFF_WID_MOD, CANV_DIM*BUFF_HEI_MOD) } // p5's windowResized() function is called when the window dimensions change function windowResized(){ CANV_DIM = min(windowWidth, windowHeight) resizeCanvas(CANV_DIM*BUFF_WID_MOD, CANV_DIM*BUFF_HEI_MOD) image(buffer, 0, 0, CANV_DIM*BUFF_WID_MOD, CANV_DIM*BUFF_HEI_MOD) } ``` This is neat, because while working on a sketch I can try out different aspect ratios on the fly. Naturally the rest of the code is also written in manner to take these variables into consideration. And finally we still need a little bit of css to center the actual canvas on the webpage, for which we'll simply use a flexbox and treat the canvas as a flex item within it: ```javascript html, body { margin: 0; padding: 0; background: #222; overflow: hidden; } main { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: #222; display: flex; justify-content: center; align-items: center; padding: 20px; } canvas { object-fit: contain; max-height: 100%; max-width: 100%; } ``` Now this is a bit redundant, because if we were to make a sketch simply drawn to a fixed sized canvas this would also take care of centering and resizing the canvas element along with the window. ## Drawing to the buffer You've probably noticed this by now, but drawing to the buffer is done by prefixing the regular p5 drawing functions by the variable name in which we stored the buffer. For example: ```javascript function drawBufferStuff(){ buffer.background(0) buffer.ellipse(PG_WID/2, PG_HEI/2, 200) } ``` This is also true for methods like **push()** and **pop()**. A graphics buffer also has it's own rendering context attached, which can be obtained like this: ```javascript buffer_ctx = buffer.canvas.getContext('2d') ``` Another cool thing we can do here is wrapping our drawing code in buffer agnostic functions. This is useful for when we want to draw to a different buffer on the fly simply by passing in the secondary buffer as an input parameter. Here's an example: ```javascript function drawBufferStuff(buff){ buff.background(0) buffer.ellipse(PG_WID/2, PG_HEI/2, 200) } ``` When is this useful? For instance, you want to give the person that's viewing your sketch the ability to export your sketch at different sizes, and for this you could create several buffers of different dimensions or pixel densities, then momentarily draw to them, save them and go back to displaying the original buffer: ```javascript function setup(){ createCanvas(400, 400) pixelDensity(1) buff = createGraphics(400, 400) buff.pixelDensity(1) buff_highrez = createGraphics(400, 400) buff_highrez.pixelDensity(4) } function drawBufferStuff(b){ b.background(0) b.ellipse(200,200,100) } function keyPressed(){ if(keyCode === 49){ // 1 key drawBufferStuff(buff) save(buff, 'buff.png') }else if(keyCode === 50){ // 2 key drawBufferStuff(buff_highrez) save(buff_highrez, 'buff_highrez.png') } } ``` This way we don't need two functions with redundant code that effectively do the same thing, just for different buffers. Treating the buffer as an input parameter solves this. ## Mouse coordinates on the buffer A problem that you might run into while working with a buffer, is that mouse coordinates are relative to the original canvas. Stretching a buffer to fit the canvas will cause mouse coordinates to be off. Here's an example, move your mouse over the canvas, the circle will be drawn in the wrong place: To remedy this we need to keep track of the scaling factor between the original canvas and the buffer, and then scale the mouse coordinates by that number: ```javascript // needs to be recalculated whenever the canvas is resized scaleFactor = buff_size/actual_size ``` And in action this looks as follows: ## Buffer as a texture We can also use a graphics buffer as a texture and apply it to 3D shapes in the webgl mode: This will work for any shape, and is simply done by passing the graphics buffer (after you've drawn some stuff to it) to the **texture()** function, which should precede the 3d object that you're drawing. Using graphics buffers as textures I created one of my favourite sketches: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Hatched-Blocks-1.jpg) ## Seamless 10 PRINT pattern And now let's make some art! We're going to make a variation of the famous [10 PRINT pattern](https://10print.org/?ref=gorillasun.de), and make it repeat seamlessly in fixed intervals. We'll do this by manipulating a number of graphics buffers and tiling the canvas with them in a specific way. First things first, let's create the pattern: ```javascript // A small buffer let buff; let buff_dim = 100 function makeBuffer(){ buff = createGraphics(buff_dim, buff_dim) buff.background(255,0,50) buff.stroke(0,0,50) buff.strokeWeight(7) buff.strokeJoin(ROUND) for(let x = 0; x < buff_dim; x+=20){ for(let y = 0; y < buff_dim; y+=20){ if(random()<.5){ buff.line(x, y, x+20, y+20) }else{ buff.line(x+20, y, x, y+20) } } } } ``` Here we create a small buffer of 100x100 pixels and create the 10 PRINT pattern with a nested loop. The numbers I chose here are arbitrary, you can try experimenting with the size of the buffer and the length of the lines. Now let's see what it would look like if we tiled the canvas with this pattern: This already looks really interesting, but as you can see the tiles don't always line up exactly causing some of the lines to end with pointy tips. One way to line them up seamlessly would be by making adjacent tiles mirrored versions of themselves. This would work in a horizontal and vertical manner, and can be done by creating another buffer into which we draw the original tile as well as three mirrored versions of it: ```javascript let compositeBuff; function makeCompositeBuffer(){ // buffer needs to be twice the size of original buffer compositeBuff = createGraphics(buff_dim*2, buff_dim*2) compositeBuff.image(buff, 0, 0, buff_dim, buff_dim) compositeBuff.push() compositeBuff.translate(buff_dim,0) compositeBuff.scale(-1, 1) // a negative number in the scale function mirrors what follows compositeBuff.image(buff, 0, 0, -buff_dim, buff_dim) compositeBuff.pop() compositeBuff.push() compositeBuff.translate(0,buff_dim) compositeBuff.scale(1, -1) compositeBuff.image(buff, 0, 0, buff_dim, -buff_dim) compositeBuff.pop() compositeBuff.push() compositeBuff.translate(buff_dim,buff_dim) compositeBuff.scale(-1, -1) compositeBuff.image(buff, 0, 0, -buff_dim, -buff_dim) compositeBuff.pop() } ``` For mirroring the graphics buffers we can conveniently use p5's **scale()** function, which actually also accepts negative numbers as input. Passing in -1 to either one or to both parameters will mirror whatever follows along those axes respectively. Now if we tile the canvas with our composite buffer we obtain a seamlessly repeating pattern: In this manner the graphics buffer can also be used for creative purposes and not solely for displaying a sketch on the canvas. ## A complete Template And to conclude, I've put together a little template sketch to get you started incorporating the graphics buffer in your sketching practice: ```javascript let buff; let buff_high_rez; /* Effective size of the buffer */ const BUFF_SIZE = 1080; /* Change the ASPECT RATIO of your sketch with these */ const BUFF_WID_MOD = 1; const BUFF_HEI_MOD = 1; const BUFF_WID = BUFF_SIZE * BUFF_WID_MOD const BUFF_HEI = BUFF_SIZE * BUFF_HEI_MOD const CANVAS_PIXEL_DENSITY = 1 const BUFF_PIXEL_DENSITY = 1 const BUFF_HR_PIXEL_DENSITY = 4 let scaleFactor; function setup(){ w = min(windowWidth, windowHeight) wx = w * BUFF_WID_MOD wy = w * BUFF_HEI_MOD createCanvas(wx, wy) pixelDensity(CANVAS_PIXEL_DENSITY) buff = createGraphics(BUFF_WID, BUFF_HEI) buff.pixelDensity(BUFF_PIXEL_DENSITY) buff_high_rez = createGraphics(BUFF_WID, BUFF_HEI) buff_high_rez.pixelDensity(BUFF_HR_PIXEL_DENSITY) scaleFactor = BUFF_SIZE/w setupBufferStuff() } function draw(){ drawToBuffer(buff) image(buff, 0, 0, wx, wy) } function windowResized(){ w = min(windowWidth, windowHeight) wx = w * BUFF_WID_MOD wy = w * BUFF_HEI_MOD scaleFactor = BUFF_SIZE/w resizeCanvas(wx, wy) image(buff, 0, 0, wx, wy) } function exportBuffer(b){ save(b, 'img.png') } // 1 key exports main buffer | 2 key exports high rez buffer function keyPressed(){ if(keyCode === 49){ drawToBuffer(buff) exportBuffer(buff) }else if(keyCode === 50){ drawToBuffer(buff_high_rez) exportBuffer(buff_high_rez) } } /* Things you need to run once, like initialising classes for example */ let backgroundColor; function setupBufferStuff(){ backgroundColor = random(255) } /* Everything you want to draw to the graphics buffer goes here */ function drawToBuffer(b){ b.background(backgroundColor) b.stroke(255) b.ellipse(BUFF_WID/2, BUFF_HEI/2, BUFF_SIZE/4) b.ellipse(mouseX*scaleFactor, mouseY*scaleFactor, 10) } ``` You can also fork [this template](https://openprocessing.org/sketch/1711488?ref=gorillasun.de) on openprocessing. And we've reached the end of the post again! Thanks for reading! If you've enjoyed this post consider sharing it with a friend, otherwise come say hi over on Twitter! Cheers, and happy sketching! ### Getting Started with Mastodon URL: https://www.gorillasun.de/blog/getting-started-with-mastodon/ Last updated: 2023-05-12T12:29:12.000Z If you’re a frequent Twitter user and are aware of recent events then you might have also had thoughts about starting an account on an alternative social media outlet. One popular alternative that you've might seen trending on Twitter is Mastodon! I've tried it for a couple of days now, and it's been a great way to escape all of the Twitter drama for a little bit. In this post I'll summarize everything that I've learned so far and help you get started with Mastodon. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/banner-1.png) Mastodon is inherently quite a bit different from Twitter, as it's built on top of a completely different mechanism. So there's a few things that you need to be aware of to use Mastodon effectively. Social media platforms have always felt like min-max games to me; it takes a while to get good at them, but once you've got a feel for how they work it's smooth sailing. Mastodon has a slightly steeper learning curve than Twitter, but is at the same time much more flexible, in my experience at least. Here's a quick index: 1. [What is Mastodon](#what-is-mastodon) 2. [Signing up to Mastodon](#signing-up-to-mastodon) 3. [Tooting (Tweeting) on Mastodon](#tooting-%28tweeting%29-on-mastodon) 4. [The different Timelines](#the-different-timelines) 5. [The advanced web Interface](#the-advanced-web-interface) 6. [Concluding Thoughts: Mastodon vs. Twitter](#concluding-thoughts:-mastodon-vs.-twitter) 7. [More Reading Material](#more-reading-material) ## What is Mastodon Mastodon describes itself as a decentralised open source microblogging platform. Moreover it isn't really a social media networking website, but rather a software that allows you to host your very own. Oof, that is already a lot to digest in two sentences... let's break that down. Superficially, Mastodon is very similar to Twitter, you create an account, post short texts and images to a timeline, follow other users and interact with their posts. Conceptually however, there are quite a few differences that we're gonna tackle throughout the sections of this post. The emphasis here is on the words 'decentralised' and 'open source'. Mastodon isn't run by a single entity, people can spin up and host their own individual Mastodon ‘instances’ with their own set of rules. When you create an account on Twitter, you're logging into one shared network with all other Twitter users, on Mastodon your account exists on a specific server, which in turn exists within a larger network of servers that make up the entirety of the Mastodon platform. Any one of these servers could be an entry point for you, in the next section we'll talk about how to choose a specific Mastodon instance that suits your needs. So in other words, your account lives in a specific independently run Mastodon instance, which in turn exist in a larger cluster of many other such servers. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/federation-animation.gif) The Mastodon Federation This galaxy of different instances is also called the 'Fediverse' or the 'Federation', and not only encompasses Mastodon servers, but also other identities that support a communication protocol that follows the open standard. Now these different instances aren't isolated from each other, the great thing is that you can still interact with any other person on any other server. This has it's own pros and cons which we'll go into at a later point in this post. One important thing to add here is that different instances aren't automatically connected when they're created. Two instances become 'federated' after there is some form of interaction between the two for the first time, for example your instance (instance A) becomes federated with another instance (instance B) if you start following a user on that instance. Furthermore, instance federation is a propagative process, let's say that the user, that you're following on instance B, starts following another user on a separate third instance (instance C). Instance C would now also become federated with instance A, and so on. This might be the most complicated aspect of Mastodon to wrap your head around, but now that i've set the scene with a very rough general overview of what Mastodon is and how it works, let's dive into some of the details. ### Summary 1. Mastodon is a decentralised conglomerate of many independently hosted instances. 2. This conglomerate is also known as the Fediverse, and encompasses all services that are based on communication protocols that use the open standard. 3. Instances are interconnected: users on one instance can communicate with users in other instances. 4. Instances become 'federated' (connected) after an initial first interaction. This process in propagative. ## Signing up to Mastodon ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/welcome.png) Joining Mastodon means joining one of the instances that exist in the Fediverse, and choosing which one to join can be a little bit tricky. As we've already discussed, in the larger scheme of things it probably doesn't matter that much, because ultimately you will still be able to interact with the rest of the Mastodon users in the Fediverse. However some things that you should consider before choosing a server: 1. The server you sign up to determines your overall Mastodon handle 2. Different Mastodon instances are run by different individuals and/or organisations, in this manner each instance has its own set of guidelines and rules. 3. The server you choose partially determines which content you'll see on your timeline ### The server you sign up to determines your overall Mastodon handle We'll talk about handles a bit more later on when we talk about how to mention people on Mastodon, but for now just know that handles on Mastodon are composed from two parts; your chosen username in addition to the name of the instance that you signed up to, both prefixed with the @ symbol. It would look something like this **@username@instancename**. In many ways that's very similar to email addresses. For example if you're an artist you probably would preferably join an instance that overall has something to do with art like the mastodon.art instance, then your handle would be **@artistname@mastodon.art**. You probably would want a handle that reflects your social media presence and the type of content that you're intending to share. One last thing here, is that if your username of choice is already taken on a specific server, then you might be able to get it on a different server. ### Different Mastodon servers have different guidelines and content policies Now the next thing is checking out the servers rules and guidelines which can generally be found by typing in **instancename/about** into your browsers' search bar. Let's go with the same example again, let's say you're an artist and mainly use social media to promote physical products like prints of your art, some servers might not allow that or might require you to put a content warning on posts that promote merch. For example one of mastodon.art's server rules forbids any content related to NFTs, if that's something you're active in then mastodon.art might not be the right fit for you: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rules.png) This means that you're free to choose a server with a content policy that you agree with and an admin that you think is capable. ### Your server partially determines what content you get to see Lastly, the instance you join also partially determines what content you'll see. Choosing a server that is relevant to the niche you're active in might make it easier to discover content that you find interesting as well as people that you'll potentially want to interact with (the local server timeline). Additionally, I think it's very rare, but you'd also want to check that there is no federation conflict between your server and a server with your friends or people you would want to interact with. Some admins might decide that they don't want to be federated with another instance that has different content policies and/or values. ### Finding Mastodon servers Overall there's a lot of things to consider before joining a specific Mastodon instance, a good place to start is the [server list](https://joinmastodon.org/servers?ref=gorillasun.de) on the official website, which is NOT an exhaustive list of servers though. Another place to find an instance that might be a good fit for you is [this server search engine](https://instances.social/?ref=gorillasun.de). One popular server is the [flagship and oldest running mastodon instance](https://mastodon.social/home?ref=gorillasun.de) hosted by it’s lead developer [Eugen](https://mastodon.social/@Gargron?ref=gorillasun.de). It's kind of like a general purpose hub. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/servers.png) Joining multiple servers is also an option. In my case I have an account on mastodon.social and genart.social (which requires an invite). I don’t know if it’s the best way to do it or not, but in that manner I’ve reserved that handle on both of those servers. If you start an account on one server and then decide that you'd like to switch over to another instance, migrating from one server to another is also a possibility which we'll talk about in more detail later in the article. After you’ve chosen your server, you just need to enter your email, a password and verify the link they send to your email. And you’re good to go really. Next step is setting up your profile which should be a no-brainer. ### Summary 1. Choose a server that has a content policy you agree with 2. Pick a server with trustworthy admins 3. Select a server that is relevant to your niche and the type of content you intend to post 4. Check that there's no federation conflict with servers your friends are on 5. Your server determines your overall Mastodon handle ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2.png) ## Tooting (Tweeting) on Mastodon Posting and interacting with content on Mastodon is fairly similar to Twitter, there are however a couple of things that are different. First we'll go over everything noteworthy about posting content on Mastodon followed by interacting. ### Creating toots 1. Tweets on Mastodon are called Toots, some instances might also have a different lingo. 2. Toots have a limit of 500 characters instead of the 280 characters on Twitter for more nuanced conversations. 3. Instead of setting who can reply to your toots, like on Twitter, you can set the visibility of your toots. 4. You can place content warnings on your toots (think of a spoiler tag on discord). The larger character limit of toots is a breath of fresh air, sometimes it's really useful to not have to cram sentences into the 280 character limit. Another thing is that you can choose who gets to see your toots by choosing the timeline that they'll get posted to (we'll talk in more detail about the different timelines in the next section). On Twitter, if your profile is public, then your tweets are by default also public. In that manner you can only control the set of accounts that can reply to your tweets, not their visibility though. On Mastodon it's the other way around, which honestly makes a lot more sense: you can't control who gets to reply to your toots, but you can control who gets to see your toots. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/privacy-comparison.jpg) It's still an open discussion if this might be changed for Mastodon in the future, an extensive discussion about the pros and cons of this can be found in [this github issue](https://github.com/mastodon/mastodon/issues/14762?ref=gorillasun.de). It might also change on Twitter now that Musk is in charge. Who knows, I'll write an update then. As simple as these mechanics might seem, a lot of thought needs to go into designing them such that ultimately healthy interactions are incentivised. Placing a content warning on one of your toots is akin to marking your discord messages as spoilers, such that the text of the discord message is hidden and needs to be manually clicked to reveal its content. Likewise on Mastodon the person viewing your toot needs to click "show more" to be able to see the toot's content. The only difference here is that on Mastodon you can add a short text that informs the viewer what kind of content they should expect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Content-Warning-Collage.jpg) One last thing to mention here is @howtomentionpeople (pun intended). Mentioning people on Mastodon is only slightly more complex than on Twitter, because handles will change depending on what server they are on. For folks that are on the same server as you, metioning them is as simple as tagging them by their handle @username, mentioning users on other servers can be done by tagging them by their handle alongside the server name extension @username@servername. Hashtags are also a thing on Mastodon, simply prefix a word with the octothorp symbol. When you click on a hashtag it'll take you to a timeline that show you all of the tweets that use this hashtag. The important thing about hashtags is that they're the only searchable part of toots which is important if you want your toots to be discovered under a certain category. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Hashtags.png) ### Interacting with other toots Interacting with toots from other users is also a little bit different than on Twitter. On Mastodon you can reply to, favourite (like/heart) and bookmark a toot. Similarly to re-tweeting you can also **boost** a tweet, with the slight difference that there is no quote-boosting. Why? It was an intentional choice by Eugen while developing Mastodon: Additionally favouriting a toot on Mastodon is not something that will be publicly announced to other Mastodon users, nor can people who check out your profile see what you've favourited unlike on Twitter where there's an entire tab where you can stalk what someone has liked. You can still see a list of users that liked a toot by clicking on the number favourites underneath a toot. ### Summary 1. Mastodon tweets are called toots and have an extended limit of 500 characters 2. Mastodon has a content warning feature, and different toot visibility options 3. You can mention people from other servers with their full handle 4. Favouriting toots on Mastodon is more private than on Twitter, no one can see what you favourited 5. Toots can't be quoted by design, as a measure against toxic behaviour ## The different Timelines We've already talked a little bit about how Mastodon servers make up a larger conglomerate known as the 'Fediverse'. The different servers are federated (connected) in a way that allows users on one server to interact with users on other servers. The fact that you can interact with users in different groups gives rise to different timelines, which will show you different types of content. These timelines are: 1. The **Home Timeline** is your main timeline and shows you toots from all of the folks that you follow, whatever server they might be on. 2. The **Local Timeline** shows you everything that is posted to your home server, a great way to see content that is relevant to your niche. 3. The **Federated Timeline** shows you toots from all the servers that your instance is connected to, and is constantly updating itself with new toots at an incredibly rapid pace. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/the-timelines.png) If you've been on Twitter you're probably familiar with your home timeline, where you can **sometimes** see things that people you follow have posted, intermingled with random cat videos and advertisements that the Twitter algorithm thinks you might enjoy, in an arbitrary non-chronological order aimed at keeping you engaged for much longer than necessary. The different timelines on Mastodon are strictly chronological, there is no algorithm that shuffles around what you see. This is genuinely a huge thing for me, it made me realise how much time I was actually wasting on Twitter, looking at things that I didn't actually care for. On Mastodon spam and clutter is minimal, you can choose what you want to see. The local timeline shows you all of the toots from all accounts that exist on your server. The Federated timeline is special in a way that it will show you toots from all of the instances that your server is federated with, for larger servers that are federated with many others this timeline is often very busy, you'll probably seeing toots coming in faster than you can actually read them. Both of these are however also in chronological order, which has a very retro Twitter feel to it. ## The advanced web Interface Mastodon's advanced UI interface essentially turns it into a tweet deck experience, where you can create and customise a column layout each of which containing different types of content. Accessing this view is done from though the preferences tab: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/advanced-web-interface-toggle.png) And you'll be met with a view similar to this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/advanced-web-interface-example-1.png) This is very reminiscent of what tweetdeck looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tweetdeck.png) You can customise the layout by pressing the little settings button in the top right corner of each one of the different columns. In this manner you can pin, unpin and move the columns to your preference. To create and pin a new column, you can simply click on one of the timelines or a hashtag and a new column will pop up, then simply click the pin button (button might be in a slightly different location, because different instances sometimes have different styles). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/pinning.png) A cool thing is that you can also pin a specific hashtag! To follow specific users you can create a list, similar to Twitter: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/annotely_image.jpeg) ## Concluding Thoughts: Mastodon vs. Twitter In the past 1.5 years of my creative coding endeavours I’ve used Twitter extensively, having posted over 5k tweets and gained a following of almost 6k people (incredibly grateful for each one of you! 🙏). It would not have been possible for me to get this far with creative coding if I didn’t share my work on Twitter. I sometimes see Twitter getting a bad rep for being ‘Toxic’, and some spaces probably are, but I think it just depends on how you use it. Personally I’ve used it almost exclusively to share my art and my writing, and generally remained within my own twitter bubble. Moreover, Twitter has allowed me to make countless internet friends and have invaluable interactions with so many lovely people, and for that I am infinitely grateful. For the most part, the moderation team at Twitter does a good job at suppressing heinous content, which is something that can't be optimally solved with decentralised and instance specific moderation like on Mastodon. For example, nothing stands in the way of a group of people spinning up a Mastodon instance and using it as an outlet for bigotry. This in fact happened in 2019 when the far-right social network GAB migrated to it's own Mastodon server. The way Mastodon is designed does not allow for an external force to moderate that instance. Server admins can still decouple their servers from that specific instance, essentially banning any and all content propagated from the instance in question. In that manner one bad actor requires a collectively large effort to be dealt with. At this point most servers have no connection to the GAB instance, which has also been banned from being accessed through many of the apps that support Mastodon. It's a tricky problem, but if people want to post heinous content they will find a way, ultimately it's not a Mastodon problem, it's a people problem. All in all, Mastodon overall feels like a viable alternative outlet for sharing my work and thoughts, as well as interacting with others. It has a distinct indie feel to it that is really refreshing, it also makes me feel like I'm in control over what content I get to see without the mind numbing flood of superfluous information. On Mastodon you can choose what type of experience you get, whereas Twitter's algorithm is designed to keep you scrolling for as long as possible. I'm quite honestly very tired of being shown random videos, and I refuse to spend one more second of my time on content that I didn't choose to see. Lastly, on Mastodon you can rest assured that your data and activity isn't being harvested in some manner, because simply put there is no obfuscated algorithm working in the background. Furthermore, because the code is open source and accessible to everyone, even if there was something mischievous going on, it wouldn't take long for someone to uncover it. That said, I’m not planning on stopping my Twitter activity. However, relying on a single service for your entire social media outreach also feels like you're limiting yourself. I don’t think Twitter will implode overnight, and believe that people will keep using it for at least some time to come, but from now on I'll also be using Mastodon just because it feels right. ## More Reading Material Here's some more Mastodon related reading material ### Guides 1. [Official Mastodon quick start guide](https://blog.joinmastodon.org/2018/08/mastodon-quick-start-guide/?ref=gorillasun.de) 2. [Guide to Mastodon by Kev Quirk](https://kevquirk.com/how-does-mastodon-work/?ref=gorillasun.de) 3. [The Verge Guide to Mastodon](https://www.theverge.com/2017/4/7/15183128/mastodon-open-source-twitter-clone-how-to-use?ref=gorillasun.de) 4. [Guide to everything Fediverse related](https://fedi.tips/?ref=gorillasun.de) ### Tools 1. [Mastodon-Twitter cross posting tool](https://crossposter.masto.donte.com.br/?ref=gorillasun.de) 2. [Find the Mastodon handles of your Twitter followers and following](https://fedifinder.glitch.me/?ref=gorillasun.de) 3. [Trunk: a Mastodon mass following tool](https://communitywiki.org/trunk?ref=gorillasun.de) ### Miscellaneous 1. [A welcome note from Eugen Rochko](https://hackernoon.com/welcome-to-mastodon-111d9227e56a?ref=gorillasun.de) 2. [Some of Mastodon's design decisions explained](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/?ref=gorillasun.de) 3. [The Verge article about the Gab problem on Mastodon](https://www.theverge.com/2019/7/12/20691957/mastodon-decentralized-social-network-gab-migration-fediverse-app-blocking?ref=gorillasun.de) ### Tips 1. [Ten Mastodon tips by Per Axbom](https://axbom.com/mastodon-tips/?ref=gorillasun.de) 2. [How to migrate a Mastodon account from one server to another:](https://mastodon.social/@Gargron/103393780267601137?ref=gorillasun.de) If this post helped you, consider sharing it with a friend or other folks that would like to get started with Mastodon. Otherwise, thanks for reading and happy tooting! Or come say hi over on Mastodon and/or Twitter! ### Making of Neo Supremus URL: https://www.gorillasun.de/blog/making-of-neo-supremus/ Last updated: 2023-04-25T11:58:37.000Z Neo Supremus is a generative ode to Kasimir Sewerinowitsch Malewitsch's suprematist compositions. Malevitch was not only one of the most influential Russian avantgarde artists and theorists of the 20th century, but also arguably very controversial for his time. Treading in the same ranks as Kandinsky, and giving rise to the Suprematist art movement, Malevich's ideology aimed at reducing art to it's most basic and simplistic form. > Suprematists searched for the ‘zero degree’ of painting, the point beyond which the medium could not go without ceasing to be art. In order to achieve this point, simple motifs were used which best articulated the shape and the flat surface of the canvas - [Art Movement: Suprematism by Shira Wolfe](https://magazine.artland.com/art-movement-suprematism/?ref=gorillasun.de) To me, there is something very fascinating about the radical nature of the suprematist art movement. For the era that suprematism was conceived in, it was considered to be very daring. Malevich lived in a period of time where art needed to have an educational value, art couldn't just exist for the sake of art. Malevich couldn't accept that, he believed that art existed whether or not we were on board. Accused of 'formalism' and being suspected of being a spy Malevich was even imprisoned. > On September 20, 1930 Malevich was arrested and taken to prison. When he was released six months later he was given three choices: 1\. He could leave the country; 2\. He could close himself in a room and work just by himself; or 3\. He could become a realist painter - [Kazimir Malevich: Atragic Visionary by Cathy Locke](https://www.musings-on-art.org/blogs/artists/malevich-kazimir-a-tragic-visionary?ref=gorillasun.de) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/img.png) Maybe this piqued your interest in the Suprematist art movement and learning more about it! It surely did for me, being the reason why I even started this entire project. Besides the historical and political background of it all, I also simply adore the compositions from an aesthetical point of view. In the rest of the article, we'll talk about how Neo Supremus came to be as well as some of the techniques that I utilised. ## A Beautiful Mess: Structure in Chaos Neo-Supremus is a study on two of the overarching and re-occurring concepts in Malevich's compositions, namely Directionality and Positioning. It proved to be quite difficult to arrange things in a seemingly natural manner with a generative system; in a similar vein to my previous project Kandinskomorphism, this time around I also didn't rely on the comfort of an invisible underlying structure. For Neo Supremus I ended up using a collision detection system that is nowadays probably much more prevalent in video games. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage1.jpg) While trying to figure out the math behind Neo Supremus, I coded and collected a number of useful functions, most of which had something to do with computing the intersection between different kinds of shapes. I ended up with more than enough material, sufficient for a complete article in of itself, by the end of which we build up to a complete method for determining polygon intersections. The article can be found here: An algorithm for Polygon Intersections. However, Towards the end of the post, we briefly venture into the world of clipping algorithms, and I believe that I've just scratched the surface of that topic and that there is still a lot more to say. Hence there might be another future post in that regard. The article also briefly made it onto the front page of hacker news on the 2nd of October, which was a really surreal experience. I've never had so many simultaneous visits on the blog! > We're on the front-page of hacker news! 😁😭 [pic.twitter.com/K2NZZgQ0Tw](https://t.co/K2NZZgQ0Tw?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [October 2, 2022](https://twitter.com/gorillasu/status/1576562874733891586?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Movement in Directionality A common trait in Malevich's suprematist compositions is that the shapes on the canvas often follow the direction of a main axis, often indicated and accentuated by a larger central shape. This common direction shared among shapes makes it seem like the rectangles are collectively heading somewhere, such that the canvas is only capturing a fleeting moment before they depart and leave. Frequently we'll also find a complementary secondary axis, that has a lesser number of shapes alongside of it. Here are some of Malevich's famous compositions that illustrate this notion: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage2.jpg) Another piece that I think is important to mention here is Malevich's 'Airplane flying', which also was the original inspiration Neo Supremus and is in manners also a very influential and important artwork. We'll have another look at it in the next section but for now I think it gives an important hint on perspective: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/airplane.jpg) I am not certain if 'Airplane Flying' is trying to represent some sort of abstract flying machine, or if it is trying to convey an aerial view of some buildings beneath. I am tending towards the latter, since it plays into the previous notion of ephemerality I mentioned, that we're only seeing a momentary slice of an abstract imagery that is simply passing by before it's gone forever. Both of my previous statements would probably have sounded preposterous to Malevich however, his art was intended to be non-representational. Meaning that it wasn't intended to represent anything in the physical realm. > > (Oil on canvas - The Museum of Modern Art, New York ) And this is where I will stop myself, the Suprematist philosophical doctrine underlying Malevich's compositions is much deeper. Maybe after I've read and understood Malevich's The Non-Objective World I'll be more qualified to talk about this. These are just my thoughts after a couple hours of studying the compositions and trying to translate these ideas into code. ## Clusters and Positioning Emulating a seemingly natural positioning of elements was by far the hardest part of this project. And it took me an embarrassingly long time to get something in place that was somewhat consistent in that regard. I could probably spend many more hours writing code that simply positions rectangles on the canvas in arbitrary manners, and it will probably never be completely satisfactory. Here's some of the ideas that I had while trying to crack this tough nut: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/notes.jpg) At it's essence the shapes are positioned with a rectangle packing algorithm, most of the math for this I've explained in detail in the polygon intersection article I mentioned earlier, if you're curious about that. But TLDR, to check if two rectangles intersect it's sufficient to check if any two of their edges intersect, which also works in the case when two rectangles are rotated in some arbitrary manner. With a handy rectangle class in place (in hindsight it's ironic that I used the object oriented paradigm when Malevich's art was ought to be non-objective), the next task was to figure out how to create small clusters and patches of rectangles on the canvas, in a similar pleasing manner to what can be seen in Malevich's compositions, as well as other suprematist artworks of that era: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage3.jpg) I found that spawning the rectangles within triangular patches worked very well. Why a triangular patch though? Looking at some of Malevich's works I noticed that the rectangle clusters can sometimes be outlined with the trace of a triangle. Well, it doesn't always apply but it worked well for the purpose of the composition. At first I tried the same with a rectangular patch but those patterns were too obviously rectangular. Here's what I mean: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage4.jpg) In that manner, we also require a method for sampling a random point within a triangle to determine the location of the rectangles that are to be placed, this can be done with the following formula: ``` // Source: https://stackoverflow.com/a/19654424/6688750 function randomTrianglePoint(triangleVertices) { var r1 = random(); var r2 = random(); var px = (1 - sqrt(r1)) * triangleVertices[0].x + sqrt(r1) * (1 - r2) * triangleVertices[1].x + sqrt(r1) * r2 * triangleVertices[2].x; var py = (1 - sqrt(r1)) * triangleVertices[0].y + sqrt(r1) * (1 - r2) * triangleVertices[1].y + sqrt(r1) * r2 * triangleVertices[2].y; return {x: x, y: y}; }; ``` This function is quite handy to have when you need a random point within a triangle, but I found that it generated spawn points that were just a little bit too... well, random. Sometimes the points were either too close to an already existing rectangle or too far away. To tighten it up a little I ended up using points generated by a Poisson Disk sampling procedure as explained in this coding train video: So instead of picking a point at random, we now pre-emptively generate a couple evenly spaced points which we can later pick from to place our rectangles on. Constraining the points to a triangle was also not very difficult, I simply reused the 'Point in Polygon Test' code that I also covered in the polygon intersection article (which utilises raycasting to check if a point is contained within a polygonal shape). Poisson disk sampled points constrained to a triangular shape would look as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/poisson-triangle.png) Here I added the constraint that the point shouldn't be too close nor too far from the other rectangles, so that the cluster is a little bit more tightly packed. In this manner, we can simply create multiple clusters and position them on the canvas in such a manner that they don't overlap. I generally don't like using while loops because they can sometimes be dangerous when there isn't a certain exit condition, but essentially, after positioning the very first cluster, we create another cluster and attempt to place it on the canvas while checking if any of it's constituent rectangles collide with any of the already placed clusters' rectangles, until a randomly chosen number of clusters has been placed. This isn't very fast, I'm not implementing a grid look-up but since we're only dealing with a relatively small number of rectangles the overall initial delay is not noticeable. The patterns generated in this matter would look as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage5.jpg) The rectangles in the background can be overlapped, somehow as if they had a heavier weight to them and were allowed to sink to the background. Like a flock of smaller birds following the larger specimens. The other elements of the composition follow a similar positioning strategy. Ultimately I'm not very certain that this is the best way to go about it, maybe a physics simulation would have been more suitable, such that the rectangle clusters arrange themselves by means of an attractive force or some flocking mechanism. Would the resulting patterns have turned better? Only one way to find out. ## Texture and Color Yet again I recurred to my Perlin noise wobbly strokes that I've used on several occasions already, with the only difference that this time there is no random dropout in the strokes. This gave things a sort of painted style. The edges of shapes in Malevich's paintings are relatively straight and only at some points presenting a slight waviness, hence I didn't crank this effect up very much. It was a bit tricky finding high resolution scans of the artworks, but examining some examples we can have a closer look and see that there is great detail in the canvas texture and how the color is applied. Nothing special was done to the colors this time, except that I sampled them from some famous Suprematist paintings, not solely restricted to Malevich, but also some of his contemporaries. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage6.jpg) I also sampled palettes from other artworks as well as some that I already liked: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/palettes.png) As for the canvas texture, it is still something that I am actively investigating. There's something very special about the old faded oil colors on a canvas that I have no idea how to go about yet. Krankarta is doing something super realistic in that regard currently: > Boxes of colour [pic.twitter.com/qhJRs1UJ6Y](https://t.co/qhJRs1UJ6Y?ref=gorillasun.de) > > — KRANKARTA (@krankarta) [October 11, 2022](https://twitter.com/krankarta/status/1579836348877635586?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I looked into paint simulations a little bit, and it's a heavily researched field, especially with respect to drawing softwares intended for tablets and touch surfaces to emulate a realistic behaviour of color. For my purposes it doesn't have to be interactive though. Another one that recently really caught my eye in that regard was Disjoint and Disoriented back from June, a collab between Lunarean and dmarchi: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/disjoint-and-disoriented.png) What a stunning texture! And the animation is incredibly satisfying! The resulting rectangles really have that 'oil on canvas' aesthetic, with what I naively assume stems from layering lots and lots of transparent strokes and rectangles on top of each other. Not only the layering, but also the manner in which they're layered is very important! I'm not a painter, but when you're drawing with oil on canvas, it takes a certain level of mastery and a trained hand to be able to distribute the paint evenly on the canvas surface. Additionally, the artist sometimes creates new colors by mixing together two different ones on the palette, or wants to darken or lighten a color by mixing in a little bit of another color. This can't be done in an atomically perfect manner, leading to the color having slightly different shades at some points, visibly so when ultimately applied to the canvas. Going back to 'Disjoint and Disoriented', this is done masterfully, where the rectangular paint strokes have soft fluctuations in hue and lightness, really selling the effect! One very iconic article in that regard is Tyler Hobbs' A Guide to Simulating Watercolor Paint with Generative Art, which I've mentioned countless times at this point. I've experimented with that in the past, but the 'oil on canvas' texture will probably require a little bit of a different approach. ## Animation and Image Export The idea for adding an animated component to the artwork came after coming across one of Malevich's famous quotes, originally stemming from From Cubism and Futurism to Suprematism: The New Realism in Painting (1915): > A painted surface is a real, living form. What would Malevich have done if he had the chance to animate his compositions? Personally I think he would have been delighted about it. In general I think the Suprematist and Konstruktivist art movements would have been very fond of gen-art. Futurists would probably have been really into AI art. In that manner, I wanted to create something that would look good as a still but also have some interesting aspect when presented on a screen. Approaching the project in an object oriented manner from the get go had a few benefits. Each shape on screen being represented by a class, meant that it already had it's own coordinates and dimensions stored, which allowed for an easy way to make things slightly sway around and have them fade in from nothingness. > The intuitive form should emerge from nothing. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/notebook.png) It was relatively straight forward to add a function that made each shape sway back and forth. Each rectangle on screen has a three different vertex arrays: one that represents the rectangle at it's final and full size, a second one that represents the rectangle at it's full size minus a certain margin, and a third one that is used for fading the rectangle in as well as animating it later on. The first two arrays are used to make sure that the rectangles have some space between each other, essentially when their outer bounding boxes intersect they will stop growing. Without a margin we would get clusters that look like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage7.jpg) The vertices that represent the rectangle at full size are also necessary to position the clusters initially. The third vertex array on the other hand is used fade the shape in, in conjunction with a growing parameter: ``` this.grow = function() { if (this.growing) { // recompute the coordinates of the rectangle this.recomputeCoordinates(); // this.size's range is between 0 and 1 this.size += this.growSpeed; // if we reach the max range we stop growing if (this.size > 1-this.growSpeed) { this.growing = false; } // another check is done somewhere else if we intersect with another rectangle // in that case we also stop growing } }; ``` Since the shapes in the sketch consist of many little dots that outline the shapes, the animation starts becoming a little slow on canvases with higher pixel densities. To avoid that the displayed animated graphics buffer has a pixel density of 1\. Taking a snapshot of the graphics however is done on a graphics buffer with a higher pixel density. For taking a snapshot, I temporarily swap out the animation graphics buffer for the high resolution buffer for one frame, drawing everything on there, saving and then reverting to the original buffer. This happens when the corresponding key press is registered. ## Concluding Thoughts Thanks a million to everyone who collected and supported me along the way, liking and retweeting my #WIPs on Twitter! It's been endless amounts of fun, from observing and contemplating suprematist compositions, learning a little bit about art history, and trying to solve the puzzle of recreating the compositions in a generative manner. It's been a bit frustrating at times, but ultimately absolutely worth it, overall coming out on the other side as a better artist after each project. That's it for this article, cheers! And happy sketching in the meantime! ### An Algorithm for Polygon Intersections URL: https://www.gorillasun.de/blog/an-algorithm-for-polygon-intersections/ Last updated: 2026-06-19T15:11:30.000Z *Shoutout to* [*Dave*](https://twitter.com/davepvm?ref=gorillasun.de) *for all the helpful discussions over on discord!* This article initially began as a short post discussing strategies that can determine rectangle intersections and collisions, for both axis-aligned rectangles as well as arbitrarily rotated rectangles. While working on a recent project however, I discovered that this intersection test can be extended to not only return the polygonal shape that is formed by the intersection of two non-axis aligned rectangles but also that of two convex polygons. Hence I extended the post to include this information as well. We will also learn how to compute the intersection of two line segments, in addition to determining if a point is contained within a polygonal shape (point in polygon test), both of which are important components of the polygon intersection test. In that manner this post covers a lot of ground, but for the sake of completeness I didn't want to leave anything out. Lastly a note on terminology, for the most part I'll be using the words **intersection** and **collision** interchangeably, since they essentially mean the same thing: that two rectangles are touching or overlapping in some manner. Albeit this, the word **collision** implies movement on behalf of the two rectangles and is probably better suited in that context. The methods described in this post might not be the most efficient ones for larger numbers of rectangles, but make up for that in simplicity. Here's a quick index to the different sections of the article: ## What's axis-alignment? The term **axis-aligned** indicates that a shape is aligned with the coordinate axes. For example an axis-aligned rectangle would have it's edges parallel to the x and y axes. Something that isn't axis aligned can occur with a different orientation such that it lies rotated with respect to the coordinate axes. Here's an example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/axisaligned-1.png) Dealing with axis-aligned rectangles greatly simplifies certain tasks, like determining if they intersect for example. I've already mentioned this in a section of a previous article: [A Simple Solution for Shape Packing in 2D](https://gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d?ref=gorillasun.de), but axis-aligned rectangles are super useful when you need to determine collisions of some type in an efficient manner. Collision detection is a rather common problem in video games, where it's often of crucial importance that the algorithm used to determine these collisions is fast. A popular approach in video games is dividing the problem into two phases, a broad phase where we determine objects in the scene that could potentially collide, which are then doubled down on in the narrow phase where the actual collisions are detected. Axis aligned bounding boxes (rectangles) are popularly utilised as such a broad phase algorithm, because their collision is relatively cheap to compute. In the next section we'll have a look at how this works! ## Axis-aligned Rectangle Collision A rectangle can be represented by four numbers, two that represent it's **x** and **y** coordinate, usually indicating the top left corner, as well as two numbers that represent its width and height starting from that positional coordinate. The intersection of two axis-aligned rectangles can then be verified when the following four conditions are fulfilled: \\( x\_{R1} < x\_{R2} + width\_{R2} \\) **Left** bound of R1 less than **right** bound of R2 \\( x\_{R2} < x\_{R1} + width\_{R1} \\) **Left** bound of R2 less than **right** bound of R1 \\( y\_{R1} < y\_{R2} + height\_{R2} \\) **Top** bound of R1 less than **bottom** bound of R2 \\( y\_{R2} < y\_{R1} + height\_{R1} \\) **Top** bound of R2 less than **bottom** bound of R1 Reading these might be a bit confusing at first, but essentially these checks determine how the edges of the two rectangles are situated with respect to each other. In this scenario intersection along an axis can be determined with two conditions, along the x axis for example, one that checks if the left edge of R1 is somewhere to the left of R2's right edge AND one that checks if R2's left edge is somewhere to the left of R1's right edge. Combining both conditions, we're essentially checking if at least one edge of one rectangle is situated between the edges of the other rectangle, in which case the rectangles are overlapping in some manner. More generally it means that the two rectangles are covering a shared range of x coordinates at the same time. Taking either one of these conditions individually doesn't tell us much about the position of the rectangles, if both hold however we can say that they are intersecting, along the x axis at least. We then need to repeat the same along the y axis to actually determine if they're intersecting on the 2D plane. If this was confusing maybe the visual aid underneath will help: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Check-Example2.png) And now to put this idea into code! To make things a bit more manageable we'll create our own custom rectangle class such that we can later give it the ability to check for collisions with other rectangles. To represent a simple rectangle we don't need all that much as mentioned earlier, just two coordinates to store the position in addition to its dimensions. For the case of axis-aligned rectangles it makes sense to have the position coordinates of the rectangle represent the top left corner because it just makes calculations less wordy. It is also generally the default **rectMode()** in p5js: ``` // example of a minimal rectangle class function makeRect(posx, posy, wid, hei){ this.posx = posx this.posy = posy this.wid = wid this.hei = hei // function that draws the rectangle to the canvas this.display = function(){ rect(this.posx, this.posy, this.wid, this.hei) } } ``` Next up is the function that will allow us to determine if our rectangle intersects another one. The function accepts as input another rectangle object which we will need to verify how the two rectangles are situated with regard to each other: ``` this.checkCollision = function(otherRect){ if( this.posx < otherRect.posx + otherRect.wid && this.posx + this.wid > otherRect.posx && this.posy < otherRect.posy + otherRect.hei && this.posy + this.hei > otherRect.posy ){ return true } return false } ``` The check uses the exact same logic that we discussed a little bit earlier. The function will return true in case the rectangles are intersecting, and false otherwise. Let's test this with a simple example, hover your mouse over the sketch and drag it into the stationary rectangle, if everything works correctly the draggable rectangle should light up red when the two are intersecting: We could stop here, but what if we wanted to create multiple rectangles? In that case it makes sense to create a handler that keeps track of the different instances and takes care of moving them and checking for collisions between them. A handler would look something like the following chunk of code, where the rectangles are stored in a member variable belonging to the handler: ``` function makeCollisionHandler(){ this.rectangles = [] this.createRectangles = function(num){ for(let n = 0; n < num; n++){ let wid = random(100,200) let hei = random(100,200) this.rectangles.push(new makeRect(random(pad,wx-pad-wid), random(pad, wy-pad-hei), wid, hei, n)) } } this.checkCollisions = function(){ for(let n = 0; n < this.rectangles.length; n++){ let currRect = cR = this.rectangles[n] for(let k = 0; k < this.rectangles.length; k++){ let otherRect = oR = this.rectangles[k] if(cR.id != oR.id){ if(cR.checkCollision(oR)){ cR.col = color(255,0,0) oR.col = color(255,0,0) } } } } } this.displayRectangles = function(){ for(let n = 0; n < this.rectangles.length; n++){ this.rectangles[n].display() } } } ``` To check for collisions between the rectangles we need a nested loop that goes over each rectangle and checks it against the other rectangles in the array. However for a much larger number of rectangles it’s probably best to implement a grid lookup similar to what was discussed in the article "[A Simple Solution for Shape Packing in 2D](https://gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d?ref=gorillasun.de)". We can put everything we've got now together to obtain a little sketch as follows: Here I've also given the rectangles the ability to bounce around the screen in a similar manner to the famous bouncing DVD symbol: ``` this.move = function(){ this.posx = this.posx + this.xspeed this.posy = this.posy + this.yspeed if(this.posx + this.wid >= wx -pad || this.posx <= 0+pad){ this.xspeed = -this.xspeed } if(this.posy + this.hei >= wy-pad || this.posy <= 0+pad){ this.yspeed = -this.yspeed } } ``` Alright, that concludes the first portion of this article, and I believe there's already a lot that can be done with what we've covered! In the next section we'll have a look a rectangles that aren't axis aligned and build up to a strategy for computing their intersections. ## Drawing rotated Rectangles Let's first write some code that can correctly position and draw rotated rectangles to the canvas. For computing the intersections between them later on we're going to need easy access to the coordinates of the vertices that make up the four corners of the rectangle (more to that in the next section). Again we'll go ahead and do this in a object oriented manner and create a class for our rotated rectangles. ``` function makeRect(posx, posy, wid, hei, angle) { this.posx = posx this.posy = posy this.wid = wid this.hei = hei this.angle = angle this.vertices = [] } ``` For rotated rectangles it makes more sense to have the positional coordinate represent the center rather than the top left corner, which will greatly simplify rotating it's corners later on. Additionally we can assume that the rectangle is currently centered around the origin, later we simply would need to translate the coordinates to the actual position of the rectangle. Now let's fill the **vertices** array with the actual unrotated coordinates of the four corners: ``` // creates unrotated coordinates centered at the origin this.makeCoordinates = function() { this.vertices = [] // did you know that you can pass multiple values to the push() array method? this.vertices.push( { x: this.wid/2, y: this.hei/2 }, { x: - this.wid/2, y: this.hei/2 }, { x: - this.wid/2, y: - this.hei/2 }, { x: this.wid/2, y: - this.hei/2 } ) } this.makeCoordinates() ``` This might not look very nice but is probably the simplest way to go about it. A less readable alternative method to creating the corner vertices of the rectangle is by using parametric equations, a rectangle is basically a circle with four sample points: ``` for(let a = 0; a <= TAU; a+=TAU/4){this.vertices.push({x: this.wid * Math.sign(cos(a)), y: this.hei * Math.sign(sin(a))})} ``` Pick whichever one you prefer. Note that this parametric method won't take into consideration an additional angle of rotation, it would still clamp it to the corner point angles. For both of these methods we would still need an additional step to account for the angle of rotation. One way to do so is by multiplying the coordinates with a [rotation matrix](https://en.wikipedia.org/wiki/Rotation%5Fmatrix?ref=gorillasun.de), where theta is the angle of rotation: \\\[ \\begin{bmatrix} cos(\\theta) & -sin(\\theta)\\\\sin(\\theta) & cos(\\theta)\\end{bmatrix} \\begin{bmatrix}x\\\\y\\end{bmatrix} \\rightarrow \\begin{matrix}x\_{rotated} = x\_{orig}.cos(\\theta) - y\_{orig}.sin(\\theta)\\\\y\_{rotated} = x\_{orig}.sin(\\theta) + y\_{orig}.cos(\\theta)\\end{matrix} \\\] As a javascript function it would look as follows: ``` // rotate coordinates after rotation this.computeRotation = function() { // New array to store in the rotated coordinates let rotatedCoordinates = [] for (let n = 0; n < this.vertices.length; n++) { // Get unrotated vertex coordinate let vert = this.vertices[n] // Compute rotation matrix entries var c = cos(this.angle); var s = sin(this.angle); // Apply the rotation matrix var xr = c * tempX - s * tempY; var yr = s * tempX + c * tempY; // Translate the coordinates to the actual position of the rectangle var xr = xr + this.posx; var yr = yr + this.posy; rotatedCoordinates.push({ x: xr, y: yr }) } return rotatedCoordinates } ``` Now the array **rotatedCoordinates** contains the actual canvas coordinates of the rotated rectangle's vertices. Alternatively to using a matrix rotation you could also convert the coordinates to their polar equivalent, add the angle of rotation and then convert back to Cartesian coordinates. However that's many extra steps for this. Albeit a little less readable we can combine everything from before into a more compact standalone version like so: ``` function rotateRectangle(posx, posy, wid, hei, angle){ vertices = [] let [c, s] = [cos(angle), sin(angle)] for(let a = 0; a <= TAU; a+=TAU/4){ let [x, y] = [wid * Math.sign(cos(a)), hei * Math.sign(sin(a))] vertices.push( { x: x * c - y * s + posx, y: x * s - y * c + posy } ) } return vertices } ``` One final alternative that I can think of here would be the parametric equations for a squircle. [The parametric equations for a squircle can be found in section 4 of this paper](https://arxiv.org/vc/arxiv/papers/1604/1604.02174v1.pdf?ref=gorillasun.de). Although these are borderline overkill for our task. And now we can actually finally draw a rotated rectangle by looping over the previously computed coordinates: ``` this.display = function(){ let rotatedCoords = this.computeRotation() beginShape() for(let n = 0; n < 4; n++){ let v = rotatedCoords[n] vertex({x: v.x, y: v.y}) } endShape(CLOSE) } ``` This is nice because now if we wanted to change some aspect of the rectangle, like for example you wanted to modulate the width or height of the rectangle you could simply change the respective member variable and then simply call the two functions **makeCoordinates()** and **computeRotation()** and obtain the new rectangle. Here's an example: Next up is handling intersections between two such rectangles! ## Intersection of two Line Segments Why do we need to know how to compute the intersection of two line segments? Essentially, a rectangle is nothing more than a set of 4 line segments. This trivializes the rectangle intersection problem to checking wether two segments belonging to two different rectangles are intersecting. In this section our goal is to create a function that can determine the intersection of two such line segments. We will actually borrow a [line interesection function that I originally found in this stackoverflow answer](https://stackoverflow.com/a/60368757/6688750?ref=gorillasun.de). [The math behind this function was originally done by Paul Bourke in his notes](http://paulbourke.net/geometry/pointlineplane/?ref=gorillasun.de). [It has been implemented in Javascript by Leo Bottaro here](http://paulbourke.net/geometry/pointlineplane/javascript.txt?ref=gorillasun.de). This snippet has come in handy on countless occasions. It doesn't only determine if two line segments are intersecting but also returns the point of intersection of the two segments, which will come in handy later when we're trying to find the polygon that is formed by the intersection of the two rectangles. The snippet: ``` /* Line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/ - Returns the coordinate of the intersection point - Returns FALSE if the lines don't intersect Coordinates x1, y1, x2 and y2 designate the start and end point of the first line Coordinates x3, y3, x4 and y4 designate the start and end point of the second line */ function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { // Check if none of the lines are of length 0 if ((x1 === x2 && y1 === y2) || (x3 === x4 && y3 === y4)) { return false } denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) // Lines are parallel if (denominator === 0) { return false } let ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator let ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator // is the intersection along the segments if (ua < 0 || ua > 1 || ub < 0 || ub > 1) { return false } // Return a object with the x and y coordinates of the intersection let x = x1 + ua * (x2 - x1) let y = y1 + ua * (y2 - y1) return {x, y} } ``` Let's quickly go over what's happening here! Our starting point (pun intended) is writing out our lines as first degree Bezier parameters (curves). This essentially means that we're treating our lines as linear interpolation functions. [Linear interpolation](https://en.wikipedia.org/wiki/Linear%5Finterpolation?ref=gorillasun.de) is a method that allows us to find new points on a line by modulating between the start and end point of that line with a control parameter. Any point on this line can be thus be represented as a function of the two points that make up the line segment multiplied by an interpolation parameter. This interpolation parameter controls where on the segment the resulting point lies (how far from each one of the two points). Let's write that out here: \\( P\_a = P\_1 \* u\_a + P\_2 \* (1- u\_a) \\) Essentially, when the interpolation paramter is closer to 1 the resulting point will be closer to P1 and vice versa. This can also be rewritten in this manner: \\( P\_a = P\_1 + u\_a \* (P\_2-P\_1) \\) With this formula and the knowledge that our point of intersection is a point that is shared between both line segments, we need to only solve the equation where both interpolations yield the same point. This results in a problem of two equations with two unknowns, the unknowns being the interpolation parameters. Here it then boils down to refactoring the equation and plugging one into the other, this is a bit lengthy and can be seen in the code. There's also some further code that checks the case of the lines being parallel, or if they are of zero length, both of which are cases where there will never be a point of intersection between the lines. Now we can go over the both sets of edges that make up our rectangles and check in a pairwise manner if any of them intersect. While doing this we'll also store the detected intersection points and return them in an array, they will come in handy later. This member function should accept as input parameter another rectangle object: ``` /* This function returns an array containing the coordinates of the intersction points. An empty array indicates that there was no intersection. */ this.collisionCheck = function(otherRect){ // collect all points of intersection in this array let intersectionPoints = [] if(this.id == otherRect.id){ return intersectionPoints } let intersection = false for(let n = 0; n < 4; n++){ let currLine = this.edges[n] for(let k = 0; k < 4; k++){ let otherLine = otherRect.edges[k] let check = currLine.intersects(otherLine) if(check){ intersectionPoints.push(check) } } } return intersectionPoints } ``` Another thing we haven't mentioned up until now, is that it's also useful to assign an id to each rectangle instance. When checking for intersections this comes in handy since it helps avoiding senseless checks, like comparing a rectangle with itself for example. Whether this check should happen within the function or somewhere outside before it is called is a different matter. Putting the above snippets together we can make the following sketch that can visualize where two rectangles intersect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/interpoints.png) *Fork this sketch on* [*openprocessing*](https://openprocessing.org/sketch/1653803?ref=gorillasun.de)*.* With this in place we can now tackle the task of finding the intersection polygon formed by the two rectangles. If you solely need to determine that two rectangles are intersecting or overlapping you can stop here. If you need to somehow also obtain the polygonal shape that the two rectangles form there's a couple more steps that we need to go through. ## Point in Polygon Test Now that we have the intersection points, how would you go about determining the intersection polygon? In other words, how would you go about finding the vertex points that make up this intersection polygon? ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/intersectionmono.png) If you observe the figures above, or draw out some on paper, you'll notice that that the vertices of the intersection polygons always consist of the intersection points in addition to the rectangle vertices that protrude one into another. Hence we need some way to determine which vertices of rectangle #1 are contained within rectangle #2 and vice versa. You can also see that there's a special case where one rectangle is completely enclosed within the other, and in that case the method we've developed so far will not be able to determine an intersection. We will have to account for that. So we need two things, one of them is the line segment intersection code that we already covered in the previous section, in addition to a function that can determine if a point lies within a rectangle or not. The latter will then help us determine which vertices of the first rectangle lie within the second rectangle and vice versa, both of which will contribute to constructing the final polygonal shape. To check if a point lies within a rectangle, or for the matter of fact, within any polygonal shape, we can use an algorithm called ray-casting. [Daniel Schiffman](https://www.youtube.com/c/TheCodingTrain?ref=gorillasun.de) has a good introduction to ray-casting: If you watch the video you'll notice that our line segment intersection code makes a reappearance here as well! Generally ray-casting is useful in a lot of different scenarios, and naturally especially in video games! For our purposes we don't need to develop a full ray-casting example like in The Coding Train's video, we can actually check if a point is within a polygon with a relatively small but ingenious function. Similarly to the line segment intersection function we can find a [point in polygon intersection test function in this stackoverflow answer](https://stackoverflow.com/a/29915728/6688750?ref=gorillasun.de). The function was adapted from a previous C version by W. Randolph Franklin from his page [PNPOLY - Point Inclusion in Polygon Test](https://wrfranklin.org/Research/Short%5FNotes/pnpoly.html?ref=gorillasun.de). He explains everything in great detail, how the function works and how he came up with the method in the first place. The function: ``` // vs is an array of vertices, [[1,0],[1,1],[0,1],[0,0]] for example function inside(point, vs) { /* ray-casting algorithm based on https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html */ var x = point[0], y = point[1]; var inside = false; for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { var xi = vs[i][0], yi = vs[i][1]; var xj = vs[j][0], yj = vs[j][1]; var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if (intersect) inside = !inside; } return inside; }; ``` The first time I saw this function it just looked like gibberish, but it worked perfectly! Given a coordinate and a set of vertices, it could determine whether or not this coordinate was within the polygonal shape formed by the vertices. Franklin's explanation gives us an idea of how this works: > I run a semi-infinite ray horizontally (increasing x, fixed y) out from the test point, and count how many edges it crosses. At each crossing, the ray switches between inside and outside. This is called the [Jordan curve theorem](https://en.wikipedia.org/wiki/Jordan%5Fcurve%5Ftheorem?ref=gorillasun.de) This algorithm is also known as 'The crossing number algorithm' or the '[even-odd rule](https://en.wikipedia.org/wiki/Even%E2%80%93odd%5Frule?ref=gorillasun.de)'. Basically, if we take a point and draw an semi-infinite ray starting from said point outwards, we can observe how many times this ray crosses the edges of a given polygon. If this number is odd the point lies inside the polygon, if it's even it's outside. I love how this relatively difficult problem is solved by a simple observation. The main logic of Franklin's method consists of two conditions that firstly check if the y coordinate of the point lies within the y range of the edge we're testing against, and secondly we check if the point is within the half plane formed by that edge. The first condition is simple to verify: \\( (y\_i > y) \\neq (y\_j >y) \\) The second condition is a bit more involved, [a good explanation of how it works can be found here](https://math.stackexchange.com/a/274728?ref=gorillasun.de). The second check is thus: \\( x < (x\_j - x\_i) \* (y - y\_i) / (y\_j - y\_i) + x\_i \\) If both of these conditions hold we can say that the infinite ray cast out from our point crossed the particular edge we tested against. Now remember we need to keep track how many edges that ray has crossed, but since the point can only assume two states, inside or outside the polygon, we can just flip that state whenever the check is true. ## Drawing the Intersection Polygon Alright, so now we've assembled the two pieces of the puzzle and can create a function that can return the vertices of the intersection polygon. We start out by getting the intersection points where the edges of the two rectangles meet each other: ``` // Get the points where the two rectangles intersect let intersectionPoints = this.collisionCheck(otherRect) // If no intersection points then the intersection polygon doesn't exist if (intersectionPoints.length == 0) { return false } ``` Next we have to get the points of the rectangles that protrude within each other, for this we will make use of the ray-casting subroutine that we have discussed in the previous section. For our convenience we can make use of the Javascript **filter()** array method that will return a new array from the elements that pass the condition we pass as a callback function: ``` // Find points of other rectangle contained within this rectangle let otherPointsWithinThis = otherRect.computeRotation().filter(v => this.checkIfPointWithin(v)); // Find points of this rectangle contained within the other rectangle let thisPointsWithinOther = this.computeRotation().filter(v => otherRect.checkIfPointWithin(v)); ``` Now we actually have all of the points that make up the intersection polygon, but to correctly draw it with p5's **beginShape()** and **endShape()** we're gonna need them in a clockwise order. We can do this by sorting them around their center point (obtained by averaging their coordinates) by angular value: ``` // Collect all points let allPoints = [...intersectionPoints, ...otherPointsWithinThis, ...thisPointsWithinOther] // Compute center coordinate let N = allPoints.length let centerX = allPoints.reduce( (p, c) => p + c.x, 0)/N let centerY = allPoints.reduce( (p, c) => p + c.y, 0)/N // Compute angle of each point with respect to the center coordinate let pointsAndAngs = allPoints.map( p => ({p: p, ang: atan2(centerY - p.y, centerX - p.x)})) // Sort points by angular value pointsAndAngs.sort((a, b) => a.ang - b.ang) ``` Note that this works because rectangles are essentially convex quadrilaterals. For the case where the intersection is somehow not convex this approach would not work. Here's an example where we draw the intersection area and fill it with a color: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/inter.png) *Fork this sketch on* [*openprocessing*](https://openprocessing.org/sketch/1671829?ref=gorillasun.de)*.* In the next section we'll have a look at how we can extend this to the case of convex polygons. ## Beyond Rectangles: Polygon Intersections Everything we've covered so far has been done in the context of non-axis aligned rectangles. The procedure for determining the intersection polygon we've developed so far can however be extended to convex polygons, with a few modifications! Check out the code of the following sketch to see how it's done, we just have to make changes everywhere where we assumed that loops will go over 4 edges/points: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/concave.png) *Fork this sketch on* [*openprocessing*](https://openprocessing.org/sketch/1672031?ref=gorillasun.de)*.* But essentially the only difference is that our makeRect() class becomes a makePoly() class, where the constructor accepts as input a list of vertices. How you create this list of vertices is up to you, because there is no single method to create various kinds of polygons. The example above showcases the intersection of different N-gons. Technically this can also be extended to concave shapes, but it will fail in certain cases when the points can't be sorted by angular value. Remember when we sorted our points in clockwise order with respect to the center point? In a concave polygon this step isn't applicable anymore, the order is ambiguous, and leads to an incorrect intersection polygon being drawn in some cases. You might have to refresh the sketch a couple times until you get such a shape in the following example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/convex.png) *Fork this sketch on* [*openprocessing*](https://openprocessing.org/sketch/1673990?ref=gorillasun.de)*.* Rather than patching up our method in some hacky way it's probably better to use an already established method that doesn't run into this problem. The [Sutherland–Hodgman algorithm](https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman%5Falgorithm?ref=gorillasun.de) is one such method, and is actually fairly similar to the strategy we've developed so far but with the distinction that it gets the order of the vertices right while finding the vertices of the intersection polygon. [Read more about why the Sutherland-Hodgeman algorithm works well here](http://www.sunshine2k.de/coding/java/SutherlandHodgman/SutherlandHodgman.html?ref=gorillasun.de), and [a compact javascript implementation can be found here](https://gist.github.com/alenaksu/89105882bb106b228a0e850a00becba7?ref=gorillasun.de). And lastly I just want to add some links for further reading that are relevant to the topic. Another well known clipping algorithm besides the Sutherland-Hodgman procedure is the [Weiler–Atherton clipping algorithm](https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton%5Fclipping%5Falgorithm?ref=gorillasun.de), which is a little bit more complicated though. Another related topic is also [Polygon Decomposition](https://en.wikipedia.org/wiki/Polygon%5Fpartition?ref=gorillasun.de). Sometimes it's necessary to split up a concave polygon into convex chunks. Some tailored approaches are the [Mark Bayazit Algorithm](https://mpen.ca/406/bayazit?ref=gorillasun.de). A very easy to integrate [javascript implementation of the Mark Bayazit algorithm can be found here](https://github.com/schteppe/poly-decomp.js?ref=gorillasun.de), in addition to [ear clipping algorithms](https://www.youtube.com/watch?v=QAdfkylpYwc&ref=gorillasun.de). These polygon decomposition algorithms however require you to have the points of the concave shape to be in correct order. You can't just pass it a bunch of vertices and expect them to figure out the correct order of the points. In that manner you could also approach the polygon decomposition task with a Delaunay Triangulation algorithm like the Bowyer Watson, but you'd end up with many small triangles, which might not be an efficient way to partition the shape. Alright, we made it to the end! Thanks a million for reading! If you enjoyed this article consider sharing it with your friends, check out some of my other posts or come and say hello over on [Twitter](https://twitter.com/gorillasu?ref=gorillasun.de)! ### Making of Exotic Quarpets URL: https://www.gorillasun.de/blog/making-of-exotic-quarpets/ Last updated: 2023-04-25T11:58:53.000Z Exotic Quarpets began as an entry for @sableRaph’s weekly creative coding challenge. For those who aren’t familiar with the challenge, it’s basically a recurring weekly twitch stream where Raphaël reviews a bunch of sketches that are sent in by the viewers. Every week a theme is chosen around which the sketches should revolve, and for this particular week the chosen topic was ‘Quilts’. The initial version of the sketch came together pretty quickly, it was a Saturday afternoon and I was stuck on a long and boring train ride. 2 hours down the line I had put together a prototype of the sketch. What became evident at that point was that it had the potential for a large variety of different patterns. As it is often the case with long-form generative art, the hard part was not to add a lot of variety to the sketch, but to strike a balance between variety and aesthetic coherence in the outputs. This entailed spending agonizing amounts of time on tweaking the parameter space. > How it started vs how it's going 💪[#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/JPdAUexfiK](https://t.co/JPdAUexfiK?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [August 4, 2022](https://twitter.com/gorillasu/status/1555257871666905090?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Starting a New Project: Initial Versions If you’ve followed my #WIPs over on Twitter you’ll know that initial versions had an entirely different aesthetic. Strokes were thick, colors bold and the sketch had overall a more 'cartoony' feel to it. It’s important to keep an objective perspective during the ‘ugly’ phase of the sketch and push further. Seeing similar outputs after refreshing hundreds of times can quickly lead to a sentiment of resentment towards your own sketch, because rather than seeing all of the good things that you initially liked about your piece you start to hyper focus on all of the small details that you dislike. There’s a couple ways that have worked for me to beat this particular case of impostor syndrome, partially by emotionally detaching myself from the art for a bit, and also by showing it to other people who’s opinion I value but who I know to not be afraid of being blunt with me and telling me what they don’t like about the sketch. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage.jpg) That aside, I needed to make some progress and move this project forward. I usually like adding a lot of variety very early on and then chiseling away at the code until I can hone in on a more coherent aesthetic. Excluding the tiles that occur at the edges and corners for a moment, I kept adding tiles over the course of the project, and ended up with a grand total of 11 different ones ultimately, some of which can also occur in a rotated or mirrored form. For the borders and corners there is also a couple of options, technically there’s 3 distinct styles for each of the top/bottom and right/left ornamentation, but it’s a bit more complicated than that because some of them can’t occur when the grid is slim and long or alternatively wide and short. In this manner the tiles are allocated in a big ol’ nested for loop, and depending on their location in the grid assigned a pattern. A much more sensible solution to this would probably be a wave function collapse algorithm, which is something that I would love to explore in future sketches. ## Clean code: tackling redundancies ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage2-1.jpg) Writing functions for all these tiles I ended up with a lot of redundant code. Most of the tiles have shapes that extend beyond the enclosing box, for this I conveniently used the rendering context’s clip function that has come in very handy on many occasions. Without clipping some of the border tiles: I ended up having this clipping code in every tile function, to reduce this unecessary code bloat I create a base tile function which essentially does all of the operations that are shared between all the tiles. We can then pass another tile function as an input parameter for it to execute, for example: ``` function tileBase(tileContentFunction){ pg.push() pg.strokeWeight(0) // clip out a strokless rectangle fillRect(0, 0, spacing, spacing, 0, 0, 'tile', 'nostroke') ctx.clip(); // draw the context of that clip area pg.strokeWeight(sW) tileContentFunction() pg.pop() } ``` And then in the main Quarpet arrangement logic I can do something like this: ``` function tileSwitcher(idx1, idx2, param, mod, in1, in2) { if (param % mod == 0) { tileBase(function () { return makeQuiltTiles[idx1](in1, in2); }); } else { tileBase(function () { return makeQuiltTiles[idx2](in1, in2); }); } } ``` I liked this sort of functional approach, the ability to pass around functions is something that I don’t use too often. What’s also worth noting here is that I can now just dump all of the tile making functions in a large array and select from them, this means that if I want to add another new tile I just need to write it’s drawing function and add it to the array, which is kinda neat. ## Towards Skeuomorphism: Custom Lines and Strokes Up until that point I had been using solid lines for strokes, but it felt like I could still push further texture-wise. I had already written wrapper functions around the p5 ellipse() and rect() function calls such that I could add some extra functionality as well as reduce some more redundancy. For example almost every rect/ellipse call was generally preceded by a fill() call, hence putting both of them in a function seemed like the way to go. Now since I invoke that function whenever I want to draw a rectangle, I could now simply swap out the rect() call for my own custom rectangle drawing function. I wanted to try and create a sort of withered effect on the edges of the tiles that make up the Quarpet. You can see this occur in real life where the edges of weathered tiles are sort of chipped off: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tile.jpg) I attempted a couple of things that didn't look that great, but finally I settled on using something similar to what I had already attempted in a previous fxhash mint of mine, 'Vestige' ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/vestige.jpg) The strokes in this sketch are made from many small circles/points each of which has a semi-randomized size. I say semi-randomized because the stroke weight of each point is composited from a random number as well as a second one that depends on an underlying Perlin noise field. So we would end up with something that looks like this: ``` if (noise( x * 0.05 + offset, y * 0.05 + offset) < 0.305) { pg.strokeWeight(0); } else { pg.strokeWeight( noise( x * 0.02 + offset, y * 0.02 + offset) * sW / 4.5 * 3 + random(sW / 4, (sW / 4) * 2) / 2 ); } ``` Additionally, we are also using the noise field to threshold the drawn strokes. That basically means if the sampled value from the noise field drops below a certain cutoff , the line will simply not get drawn (because we set the stroke weight to 0). Essentially there's just two functions to trace all of the shapes, a parametric one for the circles and another one that draws points between two coordinates (a rectangle consists of 4 lines), and we'll obtain intricate textures like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zoom2.jpg) ## Color Selection and Color Curation Color selection and palette creation are definitely two of my biggest weak points. Predefined palettes can be very flavorful but can also quickly get boring, hence why they need to be handled with care. I must’ve spent a good number of hours putting together the color palettes until I had a few that I felt confident about. Color palettes in Exotic Quarpets are split up into three arrays: tile colors, highlight colors and background colors. A little bit similar to the Kjetil Golid’s color system in chromotome, and I think that it’s really good to have this top-level separation when they're ultimately going to be assigned at random. One thing I learned recently is the 60 - 30 - 10 color rule, which is mostly used in decorating spaces, but also translates well to gen-art compositions. Essentially, 60% of the composition should consist of a dominant color, 30% percent of a secondary color and the remaining 10% make up an accent color. This becomes easier to handle when you’ve already split your palettes up into those three categories. ``` { name: "PAPRIKA", tileColors: ['#fff1d0', '#dd1c1a',"#F24C00"], highlightColors: ['#f0c808', '#679436','#a5be00'], backgroundColors: ['#06aed5', '#f0c808','#c9cba3', '#cbf3f0','#a5be00', '#ebf2fa'], }, ``` In this manner I wrote the drawing functions of each tile to either select a tile color or a highlight color before drawing a specific shape, and since I have a wrapper around these drawing functions I can again just pass another argument and it will then make this selection. This system in place, it was still very difficult to put together palettes that worked well, but the outputs were much much more consistent, essentially ensuring that you wouldn’t run into ‘ugly’ color combinations. For example tile colors can never be too dark, and background colors can never be too bright since these colors simply don’t exist in the arrays. You could alternatively do this algorithmically by inspecting the lightness component of the colors in HSL space, but that’s just extra steps. Another thing that happens to the colors in Exotic Quarpets is that not all colors that are assigned are the same. In fact colors can get randomly de-saturated or alternatively get slightly boosted. This adds a lot of visual complexity, and also makes it a little bit more lifelike. I already mentiond this, but when you go have a look at a tiled floor and/or wall you’ll notice that the passing of time has not been as kind to some of them as to others, hence naturally some will be more weathered and therefore have a more faded color. This color de-saturation can be done by shifting the S component of the colors in HSL space, which first requires us to convert the hex codes of the colors into the HSL color space and then reverting it afterwards. These conversion functions can be easily found via a quick google. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/collage3-1.jpg) Lastly, there is a random chance that the color arrays get shifted, which means that the first item in those arrays gets removed and appended at the end of the array. This actually stems from a bug that I initially had in the code, but ended up being an effect that I really liked. > Weird bug that's shifting the colors, but I kinda dig it 🤔 [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/AtjRbt0cMh](https://t.co/AtjRbt0cMh?ref=gorillasun.de) [pic.twitter.com/jLNujuLTfN](https://t.co/jLNujuLTfN?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [July 23, 2022](https://twitter.com/gorillasu/status/1550796862420049920?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) As for putting together the actual palettes I found it best to start with a large array of colors and then iteratively remove colors, while constantly refreshing, until I converged towards a composition that felt consistently balanced. All in all, I didn’t want color selection to feel like an afterthought where I just copy in a few predefined palettes, and I think that it’s probably a good idea to spend some time doing color ‘curation’ for every individual project. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/palettes3.jpg) ## The modern artist’s struggle: Browser Compatibility Come Saturday morning 6th of August I wake up extremely early to make some final checks and mint my project on fxhash. I had to catch a long train ride shortly after and was probably locked up for the remainder of Saturday. Sometime during a layover I get a message from @meezwhite that my sketch wasn't displaying properly on Safari as well as Brave on mobile. > Minted Exotic Quarpets on [#fxhash](https://twitter.com/hashtag/fxhash?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 🥳 Token #17606 > Tomorrow at 6PM CEST it'll be open for collecting! [pic.twitter.com/vc6vFq2sXK](https://t.co/vc6vFq2sXK?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [August 6, 2022](https://twitter.com/gorillasu/status/1555776205437210624?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) After 7 long hours of train rides and running on 3 hours of sleep I had to crash a bit before I could tackle the problem. The hardest part of this was deciding on how to best approach and communicate this issue. Ignoring the problem was hardly a solution, so I had to do some debugging. Both @meezwhite and @davepvm (go give them a follow on Twitter) were of tremendous help with this! The error that was showing up in Safari's console: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/error.jpg) It took me a while to pinpoint what the problem actually was, but essentially I had a function that was making P5's loadPixels() call, which under the hood utilizes the rendering context's getImageData() function. And apparently this throws an error when the canvas has more than 4097 × 4096 pixels. This also causes issues on browsers that run on an mobile ios device as it forces them to use their WebKit: For those unfamiliar, iOS relies on the WebKit engine, which not only powers Safari but all web content on Apple's operating system. That's because, unlike macOS, iOS apps are required to use WebKit as their browser engine. This was problematic because I wrote my entire code with the thought that I'd be working with a fixed size graphics buffer, which has generally been my go to method and makes a lot of things easier, like centering and re-scaling to different window sizes. That would be all well and good if Safari didn't throw an error for the specific canvas size I've chosen. I considered a few different options but ultimately decided to just have the graphics buffer's size slightly under Safari's pixel limit, rather than having a solution where I have to manually detect if the sketch is run on Safari or ios mobile (which can be unreliable sometimes) as well as patch in a lot of exceptions for this case. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/final.jpg) ## Closing Thoughts Overall, this was a very fun project to put together, albeit there being some stressful bumps along the road. I also learned a lot this time around again, for me personally publishing projects on fxhash has had a little bit of a steep learning curve but I feel like I'm slowly improving every time I put something out into the world. Thanks a billion to all those who collected an iteration of Exotic Quarpets, it means the world to me. And if you've reached here, thanks for reading! Happy coding and collecting, cheers! ### A Simple Solution for Shape Packing in 2D URL: https://www.gorillasun.de/blog/a-simple-solution-for-shape-packing-in-2d/ Last updated: 2024-08-28T13:43:50.000Z This blog post is about the age-old creative coding problem of shape packing! Even though it might seem like a simple task at first, it is actually quite an involved undertaking. It also usually entails having a broader look at how collision detection algorithms work. In the following sections we'll work our way up to an algorithm with which you can essentially pack any sort of geometric shapes, and combinations thereof. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example2.jpg) Before we begin, I want to point out that I had a first encounter with this algo back in February of 2022\. I never completed that particular idea, but it led to an interesting packing scheme. You can see some of the artworks my code produced above. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/maplands.jpg) I also recently learned that a few others have made their own version of this idea. In June I faced a packing problem where I had to draw all sorts of geometric shapes to the canvas. I was left scratching my head at first and it took me quite a while to find a solution. While researching different methods I came across [Amy Goodchild’s](https://twitter.com/amygoodchild?ref=gorillasun.de) [writeup](https://www.amygoodchild.com/blog/maplands?ref=gorillasun.de) on a wonderful sketch of hers called "Maplands" where she used a similar strategy to what I ultimately did to implement my idea. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fruitpacking.jpg) Later on I also re-discovered [Tarwin Stroh-Spijer's](https://twitter.com/tarwin?ref=gorillasun.de) [fruit salad packing sketch](https://openprocessing.org/sketch/1533577?ref=gorillasun.de), which initially evolved from [Jeff's (aka ippsketch)](https://twitter.com/ippsketch?ref=gorillasun.de) [banana packing sketch](https://ippsketch.com/posts/non-circular-packing/?ref=gorillasun.de). I had a thorough look at Tarwin's beautifully written packing library, and a lot of the code in later sections of this post are based on Tarwin's method. Go check out the folks mentioned above, they're all awesome creative individuals! ### Discussion: 1. [Packing Algorithms in Generative Art](#packing-algorithms-in-generative-art) 2. [Strategies for Collision Detection](#strategies-for-collision-detection) 3. [Collision Detection in Video Games](#collision-detection-in-video-games) 4. [Proposed Solution](#proposed-solution) ### Getting our hands dirty: 1. [A closer look at Tarwin's Circle Packing Library](#a-closer-look-at-tarwin's-circle-packing-library) 2. [Generalizing for other Shapes](#generalizing-for-other-shapes) 3. [Compositing Shapes with Circles](#compositing-shapes-with-circles) 4. [The Shape Packing Procedure](#the-shape-packing-procedure) 5. [Complete Example](#complete-example) 6. [Closing Notes](#closing-notes) ## Packing Algorithms in Generative Art ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tripack.jpg) Packing problems come in various flavours, but generally their overarching concern is positioning items as densely as possible within a given area. Despite its deceptive simplicity, bin packing is actually an [NP-Hard problem](https://stackoverflow.com/a/19510170?ref=gorillasun.de), with it's associated decision problem (checking if the items to be packed fit in a certain area), is [NP-Complete](https://gorillasun.de/blog/rectangle-packing-an-incredibly-difficult-problem?ref=gorillasun.de). Understanding this is not necessary for what follows however. I just find it incredibly interesting though, I keep finding myself coming back to this problem thinking: "Surely this can't be this difficult!" Packing algorithms are useful for a range of real life scenarios, such as packing boxes in a warehouse, or positioning shapes on a sheet of laser cutting material such that the amount of wasted material is minimised. Packing is a heavily researched area of mathematics and fairly advanced algorithms have been developed to solve different variations of it. In generative art the primary goal of packing algorithms is often the creation of visually pleasing and interesting packing patterns. We also often don't start with shapes that have a pre-determined size (usually real life objects have a pre-determined size duh), but make them up on the go. Hence gen-art packing algorithms vary a little in that regard. I'd like to show off a few artworks that have in one another or another been made with packing algorithms. Here's two stunning artworks from [Caleb Ogg](https://twitter.com/iso%5Fhedron?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Colorshift2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Lens3.jpg) Caleb's pieces [Lens 3](https://superrare.com/0x6125e13fc97f6fc97ea14cf925211e4dc0e99f0f/lens-3-18?ref=gorillasun.de) and [Colorshift 2](https://superrare.com/0x6125e13fc97f6fc97ea14cf925211e4dc0e99f0f/colorshift-2-12?ref=gorillasun.de), part of his ongoing 'Coalesce' series, are some of the most interesting circle packing sketches I've seen in a while. Note that the images shown here (2000x2000px) don't do the originals justice which are absolutely gigantic (16000x16000px). Built on a system of circles and rings, Caleb makes use of an underlying noise field for a nifty creative effect. I especially like how Lens conveys the illusion of multiple overlapping lenses that appear to contort the coloration of the underlying circles, which is done by scaling and multiplying the underlying noise field. Excited to see where this series is heading, always a pleasure when Caleb's sketches bless my timeline. A little less recent [example](https://www.infinite.center/2015/08/08/circles-inside-circles/?ref=gorillasun.de) of a circle packing sketch is by none other than Jared Tarbell: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/javadpack.jpg) As well as this [beautiful homage](https://www.reddit.com/r/generative/comments/ibk6pf/circle%5Fpacking%5F%C3%A0%5Fla%5Ftarbell/?ref=gorillasun.de) to Jared's sketch by prolific creative coder [Dmitri Cherniak](https://twitter.com/dmitricherniak?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/dimitripack-1.webp) If you like these patterns you should also check out the [Appolonian Gasket](https://en.wikipedia.org/wiki/Apollonian%5Fgasket?ref=gorillasun.de) (alternatively Appolonian circle packing). And for good measure we also need to mention [Yann LeGalle](https://twitter.com/Yann%5FLeGall?ref=gorillasun.de) who just utterly blows my mind on a regular basis: And one of the earliest ones that captivated me and initially motivated me to explore circle packing for myself was this sketch by Piter Pasma's: > [ View this post on Instagram ](https://www.instagram.com/p/CLEl7WGH6j8/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) > > [A post shared by Piter Pasma (@piterpasma)](https://www.instagram.com/p/CLEl7WGH6j8/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) I really love this one. The squares are positioned in such a way that circles emerge in a wiggly centered wiggly line, as if an invisible force was repelling them. And indeed that invisible force is most likely an additional constraint that doesn't allow rectangles to be placed if the interesect with the phantom circles. I also really love the hachure lines that get more pronounced the close they get to the circles. All in all a really beautiful composition. And for the plotter lovers we need to also mention plotter afficionado [Gaëtan Renaudeau (aka Greweb)](https://twitter.com/greweb?ref=gorillasun.de) who's made some really gorgeous plots in that regard: > [ View this post on Instagram ](https://www.instagram.com/p/CfMciMcNtvE/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) > > [A post shared by @greweb (@greweb)](https://www.instagram.com/p/CfMciMcNtvE/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) > [ View this post on Instagram ](https://www.instagram.com/p/CfMcZ9ZtAnG/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) > > [A post shared by @greweb (@greweb)](https://www.instagram.com/p/CfMcZ9ZtAnG/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) In the next section we'll have a closer look at collision detection. We usually require a way to check for collisions between the shapes that we are packing, to see if we inserted a shape at a valid location and that it isn't intersecting or overlapping with other shapes. In this blog post we'll only consider static examples where things don't move around once they've been placed on the canvas. Collision detection however generally is a topic accompanied by moving things, as it is often the case in video games. Think of a classic game like Space Cadet Pinball, or, to give another example, top down 2D billiard simulations. What goes into making one of those games? How do we check if a ball collides with another one, or the boundary of the table? In the next section we'll talk a little about why collision detection is a difficult problem, followed by a little section about how video games approach collision detection. The video game example is relevant because it illustrates an important optimisation that we can make to speed up our packing sketches. ## Strategies for Collision Detection Collision detection is a difficult problem to solve due to the countless number of shapes that an item could possibly have. Shapes can range from simple circles and squares to something much more complicated like a convex polygon with an arbitrary number of sides, and mathematically it’s tricky to determine if two such shapes have overlapping or intersecting areas. To effectuate such a collision check you would have to define rules for every single way that two shapes could potentially intersect. This check would have to consider their orientation and shape, and finding a set of rules that can do this is just not straightforward, or even possible in some cases. There are just too many ways that two shapes could technically collide. This will become clearer as we have a look at some examples and solutions. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/circlecollision1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/circlecollision2.jpg) One of the simplest types of collisions to compute is that between two circles (or spheres if we're in 3D). This can be done by simply checking if the distance between their centers is less than the sum of their radii. This is the fundamental rule upon which you can build a circle packing algorithm and probably the reason why circle packing sketches occur with an overwhelming abundance in gen-art. A circle packing algorithm in this sense would attempt to iteratively place circles of various sizes on the canvas all the while checking if they ‘collide’ with any of the other circles that have already been drawn to the canvas. It is important to point out that this can become quite slow as the number of circles increases because for each circle we need to check if it collides with any of the other circles. Worth mentioning here again that this illustrates why we need some sort of smarter data structure to keep track of the shapes we've packed as the number of collision checks grows quadratically to the number of shapes that we've added if we're approaching it in a brute force manner. This is a common problem with many algorithms, and also many sketches in creative coding could benefit from this type of optimization. We’ll have a look at a solution later on. For starters, here's a very simple circle packing sketch: To go on a little tangent here, instead of predetermining the circle’s size we could alternatively select random positions and grow our circles outward until they hit another circle. This approach is discussed in this coding train video: Increasing the difficulty a little bit, a more complicated example is the intersection of two rectangles. The advantage of that circles and spheres have over rectangles and boxes is that they're invariant to rotation, which can not be said about rectangles. Checking collisions between rectangles is relatively easy when both of them are axis-aligned, meaning that both of them are oriented in the same manner as the x and y coordinate axes, and in simpler words tells us that they're not rotated. We would just have to check if the positional coordinate of one of them is within the area of the other, which amounts to one check per axis (2 checks in 2D). This becomes much more difficult however when they’re not axis aligned, in this case, they can be overlapping in all sorts of ways, with one corner protruding from the other rectangle. Now let’s assume we’re dealing with a scene containing all sorts of shapes: circles, rectangles, triangles, and other polygons. Let’s also add here that these shapes can have any random orientation. We would need to define a set of rules for each pair of these shapes, which just makes it an incredibly difficult task, especially since there are so many ways that two objects can touch, overlap, and intersect. Defining intersection rules between simple geometric shapes like circles, rectangles, and triangles is probably still manageable, but how would you do it for two arbitrarily shaped polygons? The next section takes a peek at how physics engines in video games solve this problem. ## Collision Detection in Video Games If you’re a gamer, then you’ve probably at least once in your life had the thought ‘those were some bullsh\*t hitboxes’. Hitboxes in video games, are essentially invisible collision boxes, you’ll also often hear the term bounding box, which essentially means the smallest enclosing box that contains a particular object (or set of points). These invisible collision boxes often only approximate the shape of 3D objects in the game world, which in turn causes collisions to not always be incredibly accurate. This sometimes leads to frustratingly unwarranted hits, even when it appears that items haven't touched, and can adversely also lead to instances where items seem to have most certainly touched without any hit being registered. The most no-brain solution for solving collision detection is probably drawing an invisible circle underneath a given shape, roughly approximating its collision boundary. In that manner we would just need to check if the collision circles of two items overlap. However this is pretty bad actually, because you’ll often end up with a lot of wasted space in between items when you’re dealing with shapes that aren’t very circular. Imagine a long and skinny shape, the bounding circle would be enormous. We can do better than this, and we'll take some inspiration from physics engines in video games for that purpose. Rectangular boxes are usually a much better fit. Physics engines in video games often need to balance between accuracy and performance. Generally, collision detection procedures are split into two phases, a ‘broad’ preliminary phase that yields shapes that are closely positioned on the canvas and could potentially be colliding, followed by a ‘narrow’ phase that doubles down on the results of the broad phase and checks if two objects are really touching. For 2D purposes, AABBs, short for Axis-aligned bounding boxes, which we've already discussed earlier are very popular for determining collisions in the broad phase, as they provide a cheap way to roughly estimate if two items are colliding. Additionally, we can throw a space partitioning algorithm on top of this broad phase so that we don’t have to check each shape against all of the other shapes, there isn't really any point in doing a collision check if things are on opposite ends of the screen. As for the narrow phase algorithm a popular choice is the SAT algorithm, short for Separating Axis Theorem, which can accurately determine if two convex polygons intersect. McroPixel has one of the best visual explanations of this: I’m not going to go too deep into this because we’re not trying to build a full-blown physics engine, but rather a packing procedure that can be extended to arbitrary shapes, and which doesn’t have to run in real time. For a really good explanation adn tutorial about all of the things I mentioned above check out [Nilson Souto’s wonderful post](https://www.toptal.com/game/video-game-physics-part-ii-collision-detection-for-solid-objects?ref=gorillasun.de), which helped me understand these concepts. ## Proposed Solution ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/meme.jpg) The solution here, basically is that everything can be trivialized to a circle packing problem. Even if we’re dealing with non-circular shapes, we just need to find a way to represent the shapes at hand with a bunch of circles. This can either be done by algorithmically tracing a shape’s outline by many small circles similar to what Amy did in her Mapland’s sketch, by manually defining those positions in a photo editing software like Tarwin did in the initial version of his fruit salad packer, or by using a more elaborate method like in Tarwin’s improved version that uses ray-casting to automatically fill a transparent png with circles. Tarwin's ray-casting code is a bit outside the scope of this post, so we'll limit ourselves to tracing simple geometric shapes algorithmically. First things first, above I have already shown a circle packing sketch, and we mentioned that it is relatively slow due to it requiring to check all of the other circles before it can place the current circle at an empty spot. We can accelerate this by utilising the space partitioning strategy similarly to what Tarwin uses in his CirclePacker library, which essentially splits up the canvas into a grid on which we will operate, such that instead of having to check circles on the entire canvas, we just need to check circles that fall into the cell that we're trying to insert into, and possibly also it's neighbouring adjacent cells. > The main optimisation is having a grid lookup - coming from the games space it just made sense to me. \[...\] For this space partitioning approach we require a grid-like data structure, where each cell has knowledge of which circles it contains, and each circle has knowledge of which grid cells it falls into. This makes the objects involved a bit more complicated to manage, and has a larger memory overhead. This overhead is incomparable however in comparison to the speed improvements we obtain. In this manner we only need to check for collisions with circles that fall into any of the tiles that the to-be-placed circle is touching, this makes the entire procedure magnitudes faster. To insert composite shapes (that are composited from multiple circles), we then only need to check if all the circles that make up a shape can be placed or not, if only one of them collides with a circle on the canvas, we need to try again. This is easier said than done however, let's tackle the code in the next section. ## A closer look at Tarwin's Circle Packing Library Tarwin's sketch uses an object called circlePacker that handles everything we described in the previous section with a few useful member functions. Let's have a look at how this works by first creating the circlePacker object and it's member variables: ``` // the circlePacker object function makeCirclePacker(wid, hei, gridDivs, gridPadding) { // width and height of the circle packing area this.wid = wid this.hei = hei // gridDivs (grid divisions) number of cells we want to split the grid into this.gridDivs = gridDivs // spacing between circles this.pad = gridPadding // actual size of the grid cells this.gridSizeX = this.wid / this.gridDivs this.gridSizeY = this.hei / this.gridDivs // array that will contain all of the circles that we'll pack // as well as other shapes composited out of circles this.items = [] /* function that creates the grid, essentially a 2d array each cell is an object that holds it's x and y coordinates as well as an array that contains all the circles that exist in this cell */ this.generateGrid = function() { const grid = [] for (let x = 0; x < this.gridDivs; x++) { grid[x] = [] for (let y = 0; y < this.gridDivs; y++) { grid[x][y] = { x, y, c: [] } } } this.grid = grid } // we still need to call the grid creation function this.generateGrid() } ``` For clarity's sake I've added a comment to each line that explains what it does and what it is used for. The grid essentially consists of a 2d array of objects, each of which knows it's own x and y coordinates, and additionally holds an array 'c' of all the circles that it contains. This grid structure will greatly facilitate and lessen the number of collision checks that we need to do while inserting a new circle. As for the functions we've got a couple, the most important probably being the calculation of the distance between two circles. For this we can use p5's inbuilt dist() function. We can also pre-emptively subtract the sum of the radi of the two circles, meaning that we later just need to check if the result is negative or not to see if the circles touch: ``` // utility to check distance between two circles this.circleDistance = function(c1, c2) { return dist(c1.x, c1.y, c2.x, c2.y) - (c1.r/2 + c2.r/2) } ``` Following this we need two fetcher functions. Firstly we require a function which, given a coordinate, can fetch the grid cell this coordinate falls into, this is needed to see which tile a circle is contained in: ``` // given an x and y coordinate, returns the grid cell it falls into this.getTile = function(x, y) { return this.grid[floor(x / this.gridSizeX)][floor(y / this.gridSizeY)] } ``` Because a circle can technically touch multiple grid cells, we also need a function that can fetch all of those cells: ``` // gets tiles that are touched by a certain circle this.getGridTilesAround = function(x, y, r) { const tl = [ floor((x - r - this.pad) / this.gridSizeX), floor((y - r - this.pad) / this.gridSizeY), ] const br = [ floor((x + r + this.pad) / this.gridSizeX), floor((y + r + this.pad) / this.gridSizeY), ] const tiles = [] for (let i = tl[0]; i <= br[0]; i++) { for (let j = tl[1]; j <= br[1]; j++) { if (i < 0 || j < 0 || i >= this.gridDivs || j >= this.gridDivs) continue tiles.push(this.grid[i][j]) } } return tiles } ``` And to put it all together we need a function that actually attempts to add new circles. The function here is called **tryToAddCircle** because it also takes in an optional parameter called **actuallyAdd**. We can use this function to either simply check if a circle fits, or to actually add that circle and grow it until it's occupying the most space it can. ``` // function that attempts to add a circle this.tryToAddCircle = function(x, y, minRadius = 5, maxRadius = 200, actuallyAdd = true) { // create a new object that represent a new circle let c1 = { x, y, r: minRadius, t: [] } while (true) { // break early if outside the circle packing area if ( c1.x - c1.r < 0 || c1.x + c1.r > this.wid || c1.y - c1.r < 0 || c1.y + c1.r > this.hei ) { return null } // Get grid cells that the to-be-placed circle touches const gridTiles = this.getGridTilesAround(x, y, c1.r) // Check against other circles in these tiles for (let tile of gridTiles) { for (let c2 of tile.c) { // get distance between circles const d = this.circleDistance(c1, c2) // check if this distance is negative ( minus padding ) // this means a collision was registered if (d - this.pad < 0) { // if there was a collision and the circle size is still minimum // there is no space for the circle to grow so we discard and try again if (c1.r === minRadius) { return null } else { // if the circle had a collision and has grown already // we either add it or return depending on the actuallyAdd toggle if (actuallyAdd) { // add to tiles, and tiles to circles gridTiles.forEach(t => { this.grid[t.x][t.y].c.push(c1) c1.t.push(`${t.x},${t.y}`) }) this.items.push(c1) } return c1 } } } } // grow the circle radius c1.r += 1 // if we reach maximum radius size we either add it // or return it if (c1.r > maxRadius) { if (actuallyAdd) { // add to tiles, and tiles to circles gridTiles.forEach(t => { this.grid[t.x][t.y].c.push(c1) c1.t.push(`${t.x},${t.y}`) }) this.items.push(c1) } return c1 } } } ``` This function looks intricate but it's flow is straight forward really. This function takes as input an x and y coordinate, a minimum and maximum radius and an optional boolean parameter called 'actuallyAdd'. When actuallyAdd is set to false we will not actually create new circles, we will simply check if a circle can fit in a certain position, and how much it can grow it's radius before it collides with another circle. We create an object to represent the current circle that we're attempting to place. In a while loop we need to do a few things, the first of which is fetching all of the grid cells that this circle intersects. We will need to loop over all of the circles within those tiles and check if our current circle collides with any of them. There are a couple of outcomes: 1. We register a collision while the circle is still at minimum radius. This means that the circle has not grown and there is no room for it to grow. We can break the while loop, return and try again with other coordinates. 2. We register a collision and the circle has a radius larger than the minimum radius that we've specified. If the **actuallyAdd** toggle is true, we need to do a couple of things. We add the circle to the circle arrays of all the tiles it falls into, add the tiles it touches to it's own tile array, and we also add it to the array of packed items of the circlePacker class. 3. If no hit is registered and the circle keeps growing, we stop when it reaches a maximum circle size and again if the **actuallyAdd** toggle is true we need to update the appropriate arrays. In case the **actuallyAdd** toggle is false we just return the circle object if it can be placed, and null otherwise. This will come in handy in the next section. Now this is really efficient, go ahead and try it for yourself, first run the **circlePacker** with with the **gridDivs** parameter set to 1 and then again run it with it set to 100\. Now slowly ramp up the circle count for both, you'll quickly see that with a finer **gridDivs** number it's way faster! ## Generalizing for Other Shapes Now what Tarwin has setup so far is a great chunk of code, because generalizing it for other shapes is only a little step away. We already discussed that we simply need to composite a shape out of several smaller circles that trace out it's form, or alternatively it's outline, to be able to pack it. In this manner we just need to check if all the circles that make up this shape are 'addeable' according to our circle-packing procedure. For this we will reuse the **tryToAddCircle** method in a loop and this time actually pass false as the **actuallyAdd** input parameter. In this manner, if any one of the checks fails we terminate the function and need to try again: ``` // function that checks if a shape can be placed tryToAddShape(circles, actuallyAdd = true) { // 'circles' here is the array of circles that makes up a specific shape for (let c of circles) { if (!this.tryToAddCircle(c.x, c.y, c.r, c.r, false)) { // if one of these circles can't be placed we return // shape can't be placed return null } } // if there were no problems then we can safely add all circles if (actuallyAdd) { circles.forEach(c => this.addCircle(c)) } return circles } ``` To actually add the circles of the shape we require another function that simply adds the circles (second part of the **tryToAddShape** function): ``` this.addCircle = function(c) { // Break early if out of grid if (c.x - c.r < 0 || c.x + c.r > this.wid || c.y - c.r < 0 || c.y + c.r > this.hei ) { return null } // Get grid cells it intersects const gridTiles = this.getGridTilesAround(c.x, c.y, c.r) // Update appropriate arrays gridTiles.forEach(t => { this.grid[t.x][t.y].c.push(c) if (!c.t) c.t = [] c.t.push(`${t.x},${t.y}`) }) this.items.push(c) return c } ``` ## Compositing Shapes with Circles With the previous code in place, we can now actually create a shape made out of circles. Let's have a look at an example, we'll be creating a rectangular shape: ``` // function that makes a rectangle from circles adapted from Tarwin's 'Shape' class function makeRectangularShape(sizeW, sizeH) { this.original = [] // original unmodified circles this.circles = [] // circles after scaling, rotating and translating // dimensions of the rectangles this.sizeW = sizeW this.sizeH = sizeH // Create circles that trace outline of the rectangle // This is a bit backhanded with trigonometric functions // https://math.stackexchange.com/a/279209/673569 this.makeOriginal = function() { for (let a = PI / 4; a < TAU + PI / 4; a += TAU / 4) { // a vertex of the rectangle let ax = this.sizeW * Math.sign(cos(a)) / 2 let ay = this.sizeH * Math.sign(sin(a)) / 2 // the next vertex of the rectangle let axn = this.sizeW * Math.sign(cos(a + PI / 2)) / 2 let ayn = this.sizeH * Math.sign(sin(a + PI / 2)) / 2 // interpolate between them (can be improved) // basically increase number of steps the longer the edge length is for (let inter = 0; inter < 1; inter += .02) { let xi = ax * inter + axn * (1 - inter) let yi = ay * inter + ayn * (1 - inter) // push circle to original this.original.push({x: xi, y: yi, r: this.sizeW/24}) } } // copy original into circles this.circles = this.original.map(c => ({ ...c })) } // scale, rotate and translate // function that's used to actually place the shape this.scaleRotateTranslate = function(scale, rotateRadians, translateX, translateY) { // reset circle array this.circles = [] // apply transforms and re-add this.original.forEach(c => { const x = c.x * scale const y = c.y * scale const r = c.r * scale // rotate and translate each x and y const x2 = x * cos(rotateRadians) - y * sin(rotateRadians) + translateX const y2 = x * sin(rotateRadians) + y * cos(rotateRadians) + translateY this.circles.push({ x: x2, y: y2, r }) }) } } ``` Shapes will consist of object that hold two member functions. The first of which is responsible for creating the circles that trace the shape, whereas the second takes care of positioning and transforming the shape. The latter is required to pack a multitude of different variations of the same shape. Making rectangles, as opposed to squares, with trigonometric functions is a bit tricky. Due to their width and height not being the same we need to use a set of parametric functions that make use of the [sign of **cos()** and **sin()**](https://math.stackexchange.com/a/279209/673569?ref=gorillasun.de). It could be done in an easier manner by defining the corner points of the rectangle and then spanning circles between those. As for the **scaleRotateTranslate** function, it's shape agnostic. It will simply take the original circles and apply the transforms according to the input parameters we've passed. ## The Shape Packing Procedure The final piece of the puzzle is to define the shape packing procedure. This is somewhat similar to the **tryToAddCircle** function, with a few changes. ``` // We need to declare a few global parameters that will determine the look of our sketch const MIN_SCALE = 5 const MAX_SCALE = 300 const SCALE_INCREMENT = 0.1 const NUM_ITEM_PLACE_TRIES = 200000 function packShapes() { for (let i = 0; i < NUM_ITEM_PLACE_TRIES; i++) { // set the shape to have a minimum size let currentScale = MIN_SCALE // random coordinates let x = random(w) let y = random(w) // random rotation let rotateRadians = random(TAU) // We need these two variables to determine let lastAdded = null let lastAddedImage = null // random rectangle dimensions let randW = random(1,15) let randH = random(1,15) // let's assume we have two types of shapes rectangles 'R' and triangles 'T' let type = random(['R','T']) let currentShape = (type=='R')?new makeRectangularShape(randW, randH):new makeTriangularShape(randW); // create it's original circles currentShape.makeOriginal() while (currentScale < MAX_SCALE) { currentShape.scaleRotateTranslate(currentScale, rotateRadians, x, y) const added = circlePacker.tryToAddShape(currentShape.circles, false) if (!added && !lastAdded) break if (!added && lastAdded) { lastAdded.forEach(c => { circles.push({ x: c.x, y: c.y, r: c.r }) }) lastAdded.forEach(c => circlePacker.addCircle(c)) shapes.push(lastAddedImage) break } else if (added) { lastAdded = [...added] lastAddedShape = { type: type, x: x, y: y, scale: currentScale, rotation: rotateRadians, sizeW: randW, sizeH: randH, triangleSizes: (!currentShape.sizeParam)?0:currentShape.sizeParam } } currentScale += SCALE_INCREMENT } } } ``` In this shape packing function, similarly to the tryToAddCircle function, we're trying to grow shapes starting from a minimum scale. We use two variables **added** to keep track of each shape, and decide if it can or cannot be placed. In a while loop we attempt to add the shape via the **tryToAddShape** function, if it can be added it will return an array of of circles, which makes the **added** variable truthy. If it is not possible to add the shape the **tryToAddShape** function will return null, which is faulty. In this case if lastAdded is also still null it means that the shape is at minimum scale and can't grow, which indicates that the location is not a good fit. Hence we break and try again. We resume similarly to the the **tryToAddCircle** function. If **added** is falsy but lastAdded is truthy it means that the shape has in fact grown, in that case we can terminate the function and add the shape, by adding all of the circles it is made of. We also need to store the positional and transform information of the shape! If added and lastAdded are both truthy, then the shape still has room to grow and we need to update the lastAdded object that stores information of the previous version of the shape. ## A Complete Example Albeit having a grid-lookup, it still takes a few moments to run the sketch, which is still better than having to wait several minutes (or hours). Here's a complete example of everything we've discussed so far: ## Closing Notes For more complicated shapes, like in Tarwin's original fruit salad sketch you have the option of compositing these circles in a photo editing software, then exporting them as array an loading them in. Alternatively you can go and give Tarwin's [circle fill algorithm](https://openprocessing.org/sketch/1546264?ref=gorillasun.de) a look. If you want to do real-time collision detection you’d better stick to an already established physics engine, like Matter.js that allows you to create all sorts of rigid bodies. I found it a bit difficult to fine-tune though, the bodies were a bit too elastic for my taste, but I didn't spend much time with it, so you might get better results! If you want to learn about collision detection between simple shapes and how to do it in p5js. [An excellent book by Jeff Thompson on this topic](https://www.jeffreythompson.org/collision-detection/index.php?ref=gorillasun.de). And that's it, if you've reached here kudos to you and many thanks for reading! If you've learned something and enjoyed this post consider sharing it with your friends, giving me a follow on Twitter or IG. Thanks again for reading and happy sketching, cheers! ### Delaunay Triangulation and Voronoi Diagrams URL: https://www.gorillasun.de/blog/delaunay-triangulation-and-voronoi-diagrams/ Last updated: 2023-04-25T16:59:37.000Z I have to confess... I've been a little obsessed with triangular shapes. This obsession actually goes back a couple of months ago, when I worked on a little sketch where I tried to pack as many triangles as possible, as closely as possible, somehow coming up with a peculiar triangle packing algorithm. While this take on triangle packing was super fun to make and nets you visually interesting results, an alternative method to split a plane into triangles would be the construction of a Delaunay Triangulation. I attached some of the artworks I've made with Delaunay triangulations to this post, as well as the sketch where this entire triangle thing started: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tri1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tri2.png) Consider this post an initiation into Delaunay triangulations and related concepts like Voronoi tessellations, as well as the many methods with which they can be achieved. So much interesting art has come from these two techniques, so much so that I believe the topic requires a little attention from everyone who wants to seriously get into creative coding. In terms of different things you can do with these techniques, we've got quite some ground to cover. Delaunay triangulations were coined after [Boris Delaunay](https://en.wikipedia.org/wiki/Boris%5FDelaunay?ref=gorillasun.de) for his research on this topic in 1934, and we'll talk a little bit more about him in one of the following sections, as well as [Georgy Voronoy](https://en.wikipedia.org/wiki/Georgy%5FVoronoy?ref=gorillasun.de), both of which actually knew each other. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/matterhorn.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/nepal.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/seceda.jpg) For now, you just need to know that for our purposes a triangulation simply means the subdivision and/or partitioning of a geometric shape into smaller triangles. Delaunay triangulations additionally also have many geometric properties that are useful for a plethora of applications across various fields, and can in many ways be used to derive a dual Voronoi diagram, and vice versa! Let's first have a look at some creative things that have been created with these two space partioning algorithms. # Creative coding with Delaunay Triangulations One artwork that really stands out, and that probably serves as a good starting point would be [Ignazio Lucenti's](https://www.ignaziolucenti.it/?ref=gorillasun.de) amazing Delaunified portraits: I find these to be incredibly visually appealing, almost like the faces are woven out of thin threads. This is done by first sampling some points on top of the portrait, where the points are more frequent over the coloured regions of the image and then connecting them with a Delaunay triangulation. As mentioned earlier, delaunay Triangulations always bring with them a dual Voronoi Tesselation, and we'll talk more about the technical aspects of this later, but for now it's interesting to have a look at some more pieces of art that also make use of Voronoi diagrams. The most mind-blowing piece I've seen using Voronoi tessellations is [Raven Kwok](https://ravenkwok.com/?ref=gorillasun.de)'s generative music video for the track Skylines by Karma Fields, which is just really brilliant on so many levels: Another artist who's really harnessed Voronoi Tesselations as an expressive medium is [Michael Kennan](https://www.instagram.com/p/CZh1f4hB98W/?ref=gorillasun.de). I remember first coming across his work on the generative subreddit, where he posted a piece titled 'Im Sturz durch Raum und Zeit': This must have been one of the earliest sketches that I've come across on the subreddit, and left me utterly clueless as to how something like that would be possible. At this point I believe that it makes use of [Lloyd's algorithm](https://en.wikipedia.org/wiki/Lloyd%27s%5Falgorithm?ref=gorillasun.de) with which you can turn a Voronoi diagram into a centroidal Voronoi diagram. More on that in a future post though. With a few modifications Voronoi diagrams also allow for interesting stippling and pointillist effects and artworks, which is a huge topic in of itself: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/stippling.png) Stippling is the creation of a pattern simulating varying degrees of solidity or shading by using small dots. And it turns out that Voronoi diagrams can be used to achieve this effect, turning a given source image into one that is made out of many dots. I think that at this point it's clear, that spending some time with Delaunay triangulations and all the related topics is a worthwhile endeavour for creating interesting artworks. Besides being aesthetically pleasing, Delaunay triangulations are also really useful for a lot of practical applications, for example terrain generation, or creating minimum spanning trees that connect rooms in a [procedurally generated dungeon](https://www.gamedeveloper.com/programming/procedural-dungeon-generation-algorithm?ref=gorillasun.de): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/room2.gif) One last thing worth mentioning here is that Delaunay triangulations are probably also great tools for creating low-poly graphics and aesthetics, as an ode to an aesthetic from an era long past where game devs had to make do with limited computational resources. Nowadays low-poly games don't always entirely use triangular shapes, [here](https://blog.displate.com/low-poly-art/?ref=gorillasun.de)'s a really cool post by Martyna Stachowiak from Displate on this aesthetic in any case. # Origins Delaunay Triangulations and Voronoi Diagrams are not only mathematically closely related but also historically. The most comprehensive resource on this relationship is Liebling's and Pournin's paper titled 'Voronoi Diagrams and Delaunay Triangulations: Ubiquitous Siamese Twins'. The very first paragraph reads beautifully: > Concealing their rich structure behind apparent simplicity, Voronoi diagrams and their dual Siamese twins, the Delaunay triangulations constitute remarkably powerful and ubiquitous concepts well beyond the realm of mathematics. This may be why they have been discovered and rediscovered time and again. They were already present in fields as diverse as astronomy and crystallography centuries before the birth of the two Russian mathematicians whose names they carry. In more recent times, they have become cornerstones of modern disciplines such as discrete and computational geometry, algorithm design, scientific computing, and optimization. I really recommend reading at the least the first two sections of [the paper](https://www.math.uni-bielefeld.de/documenta/vol-ismp/60%5Fliebling-thomas.pdf?ref=gorillasun.de) as it draws a beautiful picture of how both Delaunay triangulations and Voronoi diagrams were discovered and re-discovered over the years, in addition to some interesting anecdotes and stories around the people that explored this field of mathematics. Unsurprisingly Voronoi was actually a friend of Delone's (Boris Delaunay) father, which had a big influence on his later work and can be inferred from the title of his 1934 paper 'Sur la sphere vide. A la memoire de Georges Voronoi.' (French for: On the empty Sphere. In memory of Georges Voronoi.) At this point in time it is hard to say exactly what kind of relationship Voronoi and Delone had, and it seems like Voronoi was not actually Delone's supervisor (based on the paper I just mentioned). I genuinely couldn't find out more about it however. An additional fun fact here is that Georgy Voronoy was a student of Andrey Markov, who worked on the concept that is better known today as Markov Chains. The very first instance of Voronoi diagrams dates back much further than Voronoi's times, all the way back to the Renaissance where Renes Descartes created the first Voronoi Diagram on record. Image from the same paper: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/renes.png) Another historical record of Voronoi diagrams is the figure to the right by John Snow (not the guy from Game of Thrones), where he was able to pinpoint a defective water pump with a Voronoi diagram. That defective pump was at the root of a cholera outbreak in Victorian England. Actually a very interesting story, you can read more about it [here](https://mbeconsulting.com/lifesaving-maths-you-know-something-john-snow/?ref=gorillasun.de) and here. I'm not exactly sure of the timeline here, but Dirichlet was working with Voronoi diagrams around the same time, which is why Voronoi diagrams are also sometimes known as Dirichlet Tesselations. Voronoi then later extended Dirichlets ideas to higher dimensions. [https://mathshistory.st-andrews.ac.uk/Biographies/Voronoy/](https://mathshistory.st-andrews.ac.uk/Biographies/Voronoy/?ref=gorillasun.de) # So what's a Delaunay Triangulation? > A Delaunay triangulation for a given set P of discrete points in a general position is a triangulation DT(P) such that no point in P is inside the circumcircle of any triangle in DT(P). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example.png) Wikipedia sums up Delaunay triangulations succinctly. A valid Delaunay triangulation hence needs to satisfy the condition that none of it's vertices are inside the circumcircle of any of the triangles that make up this triangulation. In other words, given a set of points, we need to draw edges between these points in such a manner that a triangular mesh emerges. None of the initial points are allowed to be contained within the diameter of any circumcircle of the triangles that make up this mesh. Ultimately, all points should lie **on** these circumcircles, where the circumcircle is the circle centered at the circumcenter of a triangle, which is a point that is equidistant from all three vertices of the triangle. There's a number of procedures for constructing such a triangulation, one of them being the Bowyer-Watson algorithm, which I'll cover in the next post. Furthermore, as mentioned a couple of times already, we can derive the dual Voronoi diagram from this Delaunay triangulation, simply by connecting the circumcenters of adjacent triangles: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example2.png) # Voronoi Diagrams A Voronoi diagram can also be constructed without the delaunay triangulation. Given a set of points, we want to partition and assign a portion of the plane to each one of those points, in such a manner that each position in a given region is closer to that point than any other: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example3.png) And again there's a number of algorithms to achieve Voronoi diagrams, I haven't decided yet on which one to cover, but a popular sweep line algorithm is fortune's algorithm (obviously in addition to the Bowyer-Watson algorithm as an indirect approach). And that's all I've got for you this time around. Keep your eyes peeled though there's gonna be a bunch of new posts very soon on Delaunay triangulations and Voronoi Diagrams, as well as Lloyd's relaxation and weighted Voronoi stippling! Thank you for reading, and if you've enjoyed reading, consider supporting by sharing this post or following me on my social media accounts, cheers! ### Bowyer-Watson Algorithm for Delaunay Triangulation URL: https://www.gorillasun.de/blog/bowyer-watson-algorithm-for-delaunay-triangulation/ Last updated: 2026-08-10T13:06:23.000Z Before we begin with this post, I'd like to point out that a lot of research has gone into algorithms for constructing Delaunay Triangulations. The intent of this post is solely to present a somewhat straightforward and popular method for constructing such a triangulation, as well as learning some useful techniques along the way. The Bowyer-Watson algorithm is well suited for making artworks with a moderate amount of points. For creating animated or interactive triangulations I would recommend using one of the many efficient and highly optimized libraries that already exist for these purposes like [delaunator](https://github.com/mapbox/delaunator?ref=gorillasun.de). I'll include a short section how to use the delaunator at the end! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/color_triangulation-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/image_triangulation.jpg) Lastly, before we begin, you can find a highly un-optimized version of the BW algo [here](https://openprocessing.org/sketch/1587231?ref=gorillasun.de) which was essentially my initial version of the algo. This tutorial is loosely based on [Matias Savela](https://github.com/msavela?ref=gorillasun.de)'s implementation which is quite digestible and very readable, and improves on the mistakes and implementation choices that I've made during my initial attempt! With this out of the way we can dive into the algorithm. ## Wikipedia's Bowyer-Watson Pseudocode Snippet After digging a bit on how to approach the triangulation task I came across a pseudocode snippet on the [BW wikipedia page](https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson%5Falgorithm?ref=gorillasun.de). It loosely describes the required steps of the algorithm and I encourage you to read it until you've got a general idea, but it's not necessary, you can safely skip this section: ``` function BowyerWatson (pointList) // pointList is a set of coordinates defining the points to be triangulated triangulation := empty triangle mesh data structure // must be large enough to completely contain all the points in pointList add super-triangle to triangulation // add all the points one at a time to the triangulation for each point in pointList do badTriangles := empty set // first find all the triangles that are no longer valid due to the insertion for each triangle in triangulation do if point is inside circumcircle of triangle add triangle to badTriangles polygon := empty set // find the boundary of the polygonal hole for each triangle in badTriangles do for each edge in triangle do if edge is not shared by any other triangles in badTriangles add edge to polygon // remove them from the data structure for each triangle in badTriangles do remove triangle from triangulation // re-triangulate the polygonal hole for each edge in polygon do newTri := form a triangle from edge to point add newTri to triangulation // done inserting points, now clean up for each triangle in triangulation if triangle contains a vertex from original super-triangle remove triangle from triangulation return triangulation ``` If you've already got a headache after reading this snippet, then fret not, things will get clearer in what follows in this post. Albeit translating pseudocode into executable code being a very good exercise, a lot of the implementation details are left for the coder to decide on. In many ways this pseudocode snippet can be further simplified. But let's first go through the algorithm step by step! ## An Intuitive Explanation of the Algorithm Here's a little step-by-step animation to illustrate how the Bowyer-Watson algorithm functions on a very simple set of three points. The Bowyer-Watson algorithm is essentially an iterative procedure that loops over a given set of points (placed at random or purposefully), one at a time, and constructs a valid Delaunay triangulation: 0:00 /0:10 1× An initial and necessary first step here, to get things going, is to create a large triangle which will contain within it's three edges all of the points that ought to be triangulated. We call this triangle a 'super triangle'. We could technically make this triangle infinite in size, to make sure that all triangulation vertices are contained within it, however pragmatically we can make it just big enough to contain all of the points: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/0.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1.png) Having created this super triangle and placed our points we can begin constructing the triangulation. We will now iteratively go over each point that we have passed to the procedure to construct a valid triangulation. In the previous post we have discussed what makes a valid Delaunay Triangulation: > A Delaunay triangulation for a given set P of discrete points in a general position is a triangulation DT(P) such that no point in P is inside the circumcircle of any triangle in DT(P). Thus the next step is checking if any of our points fall within the circumcircle of any of the already existing triangles. Initially this is simple, since we only have one triangle (the super triangle), which certainly contains all of the points within it's circumcircle. We can mark this super triangle as invalid, and add it to an array that contains all of these invalid triangles. Again, we're still at the very beginning, hence the array will only contain the super triangle for now. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3.png) Next, we need to replace the invalid triangles by a different set of triangles that is valid. We can do so by connecting the edges of the super triangle to the initial point that we're currently iterating over. In this manner we can make sure that the point will be **on** the circumcircle of the new triangles, because it is a vertex of each one of those triangles. Later on this becomes trickier because we need to determine the boundaries of the polygonal hole that is formed in the triangulation where we, in most cases, marked several triangles as invalid. We essentially need to fill the empty spot where we figuratively 'deleted' the bad triangles, by connecting the edges of this polygonal hole to the current point we're iterating over. Before we end the current iteration we still need to delete all triangles that have been marked as invalid, and add the new triangles that we've formed by connecting the point with the edges of the polygonal hole. And we are ready for the next iteration. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/5.png) In the second iteration we will add the next point to the triangular mesh, and depending on it's position and the shape of the three triangles that we've created, it might fall into one, two or more circumcircles. If it does we need to mark those triangles as invalid, and we now need to find the polygonal hole, where we essentially deleted several triangles. The pseudocode snippet describes the polygonal hole as 'all edges in the set of bad triangles that is not shared between two bad triangles' which essentially means all the edges at the boundaries of that polygonal hole. Depending on how the code is implemented this can be more or less difficult. And again we form new triangles by connecting these unshared edges with the current point and adding these triangles to the triangulation. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/6.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/7.png) In this manner we iteratively add vertices to this triangle mesh, subdividing the initial super triangle into smaller ones, until we've ultimately achieved a valid Delaunay triangulation. In the final step we will need to remove all triangles that share an edge or a vertex with the initial super triangle, since they weren't actually part of the initial set of points. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/8.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/9.png) ## Implementation Details As mentioned earlier, a pseudocode snippet generally only tells you the major steps, but not about the smaller sub-routines that need to be incorporated to achieve these steps. For example, we should first write some robust code that can compute the circumcenter and circumcircle of a triangle since it is one of the cornerstones of this algorithm. Equivalently, implementing the vertex, edge and triangle information in a useful manner is crucial to save us many headaches along the way, especially since we need to make a large number of edge comparisons to find the polygonal hole. The computation of the circumcenter and circumcircle will be discussed in a different post !!! here !!! because it is an interesting geometric problem on it's own outside the context of the Delaunay triangulation. In the post there's a number of ways to compute the circumcenter. ## The Vertex, Edge and Triangle Classes Let's start with writing the classes for the major three components of the triangulation: a vertex class, an edge class and a triangle class. The vertex object being the most basic one, only consisting of an x and y coordinates as well as a short comparison function: ``` // Vertex object var Vertex = function(x, y) { this.x = x this.y = y this.equals = function(vertex){ return this.x === vertex.x && this.y == vertex.y } } ``` The edge object builds on top of the Vertex object. In this manner an edge essentially consists of two connected points, and can thus be represented by two vertices. It also has it's own comparison function. This function actually needs to do two comparisons to determine if an edge is equivalent to another one, because for our purposes we don't really care for the cirectionality of the edges. Meaning that an edge going from vertex A to vertex B is the same as an edge going from vertex B to vertex A. Hence we need to cover both cases: ``` // Edge object var Edge = function(v0, v1) { // The two vertices that make up the starting and ending vertex of the edge this.v0 = v0 this.v1 = v1 // Comparison function to compare this edge to another this.equals = function(edge){ return (this.v0.equals(edge.v0) && this.v1.equals(edge.v1)) || (this.v0.equals(edge.v1) && this.v1.equals(edge.v0)); } } ``` This could be further optimised by assigning an ID to each edge and vertex and keeping track of them in a lookup table, saving us costly and redundant comparison operations. A simply comparison should do for now however. Next up is the triangle object: ``` // Triangle object var Triangle = function(v0, v1, v2) { this.v0 = v0 this.v1 = v1 this.v2 = v2 this.circumCirc = calcCircumCirc(v0,v1,v2) this.inCircumcircle = function(v) { var dx = this.circumCirc.c.x - v.x; var dy = this.circumCirc.c.y - v.y; return Math.sqrt(dx * dx + dy * dy) <= this.circumCirc.r; } }; ``` For the triangle object we don't require a comparison function (because we can compare it's edges), and the circumcenter computation we've outsourced. We just need some additional functionality to check if a given vertex is within the circumcircle of the triangle or not. Which can be done by calculating the distance from a given point to the circumcenter and checking if it less than it's radius. ## The Super Triangle This seems like a very simple part of the overall algorithm, but can also be considered an interesting problem. As said earlier, we could just make a triangle gigantic enough such that it encloses all of the points. For example, we choose all of our point coordinates to fall within the region that makes up the canvas, and then make our triangle large enough to contain the entire canvas. In that case all of the points would certainly be inside the super-triangle. A more interesting and much more difficult method would be finding a triangle that is just large enough to contain all points. There might even be problems with the first approach as detailed [here ](https://stackoverflow.com/questions/3642548/infinite-initial-bounding-triangle-in-iterative-delaunay-triangulators?ref=gorillasun.de) where the final triangulation doesn't end up being quite perfectly 'Delaunay'. In this sense we are looking at a minimum bounding box type of problem, and in this case it would be a minimum bounding triangle, one such algorithm that can compute this bounding triangle can be found [here](https://link.springer.com/article/10.1007/s40314-014-0198-8?ref=gorillasun.de). But this is a bit overkill as we would first have to compute the convex hull of the set of points, which makes things overly complicated when we could simply slap a big triangle around our points. Here's Matias' method for finding the super-triangle. His function first finds the minimum and maximum vertex coordinates and then centers a triangle on top of all the points: ``` // Triangle that bounds given vertices var superTriangle = function(vertices) { var minx = miny = Infinity, maxx = maxy = -Infinity; vertices.forEach(function(vertex) { minx = Math.min(minx, vertex.x); miny = Math.min(minx, vertex.y); maxx = Math.max(maxx, vertex.x); maxy = Math.max(maxx, vertex.y); }); var dx = (maxx - minx) * 10, dy = (maxy - miny) * 10; var v0 = new Vertex(minx - dx, miny - dy * 3), v1 = new Vertex(minx - dx, maxy + dy), v2 = new Vertex(maxx + dx * 3, maxy + dy); return new Triangle(v0, v1, v2); }; ``` An alternative method which is maybe a bit more elegant, and maybe not as complicated as finding the minimum bounding triangle, is by finding the Minimum Enclosing Circle first, with Welzl's algorithm that conveniently runs in O(n) time, and then spanning a triangle around this enclosing circle. A javascript implementation of a minimum enclosing circle algo can be found [here](https://www.nayuki.io/page/smallest-enclosing-circle?ref=gorillasun.de) by Project Nayuki. Then the enclosing triangle would simply be one that is spanned on a circle with twice the diameter of the minimum enclosing circle. ## Triangulation Procedure Here's an example of how the algorithm works on a larger set of points (rerun a it a couple of times to see the procedure): With all of the previous parts in place, the remainder of the triangulation procedure becomes very straightforward! In this section we will iteratively add the triangulation vertices to the triangulation mesh and resolve the areas of conflict where vertices fall into the circumcircle of other triangles. This is done by removing the conflicting triangles, in turn creating a polygonal hole that can be patched up with a set of new triangles, by connecting the vacant edges with the current vertex in question. Doing this exactly as described by the pseudocode snippet may end up being a very inefficient way to do it, rather than comparing every triangle's edges against every other triangle's edges, we may actually just compare all edges and store the ones that are unique in a separate array to construct the polygonal hole. With these considerations, we can model our procedure as follows: ``` function triangulate(vertices) { // Create bounding 'super' triangle var st = makeSuperTriangle(getEnclosingCircle(pointList)); // Initialize triangles while adding bounding triangle var triangles = [st]; // Triangulate each vertex vertices.forEach(function(vertex) { triangles = addVertex(vertex, triangles); }); // Remove triangles that share edges with super triangle triangles = triangles.filter(function(triangle) { return !(triangle.v0 == st.v0 || triangle.v0 == st.v1 || triangle.v0 == st.v2 || triangle.v1 == st.v0 || triangle.v1 == st.v1 || triangle.v1 == st.v2 || triangle.v2 == st.v0 || triangle.v2 == st.v1 || triangle.v2 == st.v2); }); return triangles; }; ``` Essentially we first create the super triangle as discussed earlier, and add it to the triangulation to get things rolling initially. Then we add one vertex at a time and do the bulk of the procedure in the addVertex() function. As a final step we also need to remove all triangles that share an edge with the original super triangle, since it was never part of the triangulation. As for the addVertex() function: ``` // Update array of triangles by adding a new vertex var addVertex = function(vertex, triangles) { var edges = []; // Remove triangles with circumcircles containing the vertex triangles = triangles.filter(function(triangle) { if (triangle.inCircumcircle(vertex)) { edges.push(new Edge(triangle.v0, triangle.v1)); edges.push(new Edge(triangle.v1, triangle.v2)); edges.push(new Edge(triangle.v2, triangle.v0)); return false; } return true; }); // Get unique edges edges = uniqueEdges(edges); // Create new triangles from the unique edges and new vertex edges.forEach(function(edge) { triangles.push(new Triangle(edge.v0, edge.v1, vertex)); }); return triangles; }; ``` Here we can conveniently make use of the [filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global%5FObjects/Array/filter?ref=gorillasun.de) function that is applicable to arrays in javascript. The filter function creates a new array from all the elements that pass the condition that it's called upon. In this case the condition is actually another function that checks if the vertex falls into the circumcircle of the triangle, if it does we take the edges of this triangle and store them in the edges array, we'll need them in a second. If the vertex is not in the circumcircle, we can just ignore it as it is a valid triangle. Having obtained the edges, we now need to check which ones are unique, remember, as explained earlier, the edges that are not shared are those that fall onto the boundary of the polygonal hole. We do it in this manner, with the uniqueEdges() function: ``` // Remove duplicate edges var uniqueEdges = function(edges) { var uniqueEdges = []; for (var i = 0; i < edges.length; ++i) { var isUnique = true; // See if edge is unique for (var j = 0; j < edges.length; ++j) { if (i != j && edges[i].equals(edges[j])) { isUnique = false; break; } } // Edge is unique, add to unique edges array isUnique && uniqueEdges.push(edges[i]); } return uniqueEdges; }; ``` With a nested for loop we determine for each edge wether it is unique or not. In the outer loop we set a flag for the current edge, assuming that it is unique. During the nested loop where we make another pass over the array where we compare that edge to all other edges (except at the same loop index), if we find a duplicate we set the flag to false. Once this inner loop completes, we check the flag, and only in the case of it being unique we store in an array uniqueEdges which will be returned to the addVertex() function. Those unique edges then make up the boundary of the polygonal hole that needs to be re-triangulated. This iterative procedure thus eliminates all invalid triangles and re-triangulates them into smaller ones until we obtain a valid Delaunay Mesh! ## Putting it all together! And finally let's put everything together! The final code ends up being relatively long, so here's a working example using p5js (I've included everything required like the circumcircle computation as well): ## Using the Delaunator Class And lastly, I want to include a section on using the delaunator, because in most projects it's probably better to use an efficient library rather than reinventing the wheel. You can find the library [here](https://github.com/mapbox/delaunator?ref=gorillasun.de), where you're provided with a couple of options to integrate it with your project depending on your preferences and needs. I like to simply include it like this: ``` ``` And go about your P5 sketch as usual, with one little change to the createCanvas function, such that instantiate it with the SVG runtime: ``` function setup() { createCanvas(100, 100, SVG); background(255); fill(150); stroke(150); } function draw() { var r = frameCount % 200 * Math.sqrt(2); background(255); ellipse(0, 0, r, r); } ``` Similarly to running P5 in WEBGL mode, here we pass a third argument to the createCanvas() function specifying that we want to the sketch with the SVG runtime. Inspecting the page we find that instead of having attached a element to the body, we find that there's now an instead! Now all the regular functions that usually draw shapes should create SVG elements and append them rather than drawing them to the canvas! ## Creating the Grid Pouya had sent me two types of tiles within two folders, one labeled 1x1 and another labeled 2x2\. The 2x2 tiles usually had a lot more going on and didn't look right when shrunk down, this was the perfect opportunity to use my [irregular grid code](https://gorillasun.de/blog/an-algorithm-for-irregular-grids?ref=gorillasun.de). I rewrote the code to be invokable as an object like so: ``` // create the grid handler // gridDivsX and gridDivsY are the dimensions of the grid let G = new makeGrid(gridDivsX, gridDivsY) // creates the boolean grid G.setupGrid() // populates this grid with rectangles // stored in an array named rectInfo G.populateGrid() ``` Now we can easily fetch information about the grid from it's member variables! For the final sketch gridDivsX and gridDivsY are always equal, meaning that the grid will always have the same resolution on both axes. The rectangles are also always squares, I did not find a way to stretch the tiles horizontally or vertically (I also didn't think that it would look good). I'm skipping over some things here, but essentially the next step is looping over the grid and assigning each position a tile. Note that 'buff' here stands for the graphics buffer that I'm drawing to: ``` for(let n = 0; n < G.rectInfo.length; n++){ let R = G.rectInfo[n] // if the rectangle occupies patches that are larger than 1x1 // we select one of the 2x2 tiles otherwise a 1x1 one let randSVG; if(r.dimX>1){ randSvg = random(svgs2) }else{ randSvg = random(svgs) } // Calculate position and correct dimensions var x = r.posX * gSX + pad var y = r.posY * gSY + pad var wid = r.dimX * gSX var hei = r.dimY * gSY // Draw the tile buff.image(randSvg, x, y, wid, hei) } ``` Let's have a look at what we've got so far! Running the code we've written so far we'd end up with outputs that look as follows: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3.jpg) This is still very far from looking like something mintable. We need to add some strokes and colors! The SVGs already had a pre-determined color assigned to each element (the palette you see in the images above), we can use that to our advantage by mapping a new color to each one of them! ## Accessing DOM elements The tricky part of adding attributes to the tiles is finding them in the DOM. The way I ultimately did it is very straightforward. After inspecting the generated SVG a bit I noticed that most shapes are contained within a tag, which is essentially a container tag that serves to group other elements together. This essentially allows us to fetch all of those tags with the following command: ``` var g_elements = document.getElementsByTagName("g") ``` This essentially returns a list of all of these tags. Now we can go over this list and find the major types of shapes that occur, after a little bit of visual trial and error I found that there were only 5 types, mainly elements, but also , , and . We can now get each on of this with the same command: ``` var paths = g_elements.getElementsByTagName("path") ``` Now we can again go over these elements and easily access their attributes: ``` for(let n = 0; n < paths.length; n++){ paths[n].setAttribute('stroke', strokeCol) paths[n].setAttribute('stroke-width', sw) // sw is a global strokeWeight parameter var col = paths[n].getAttribute('fill') colorFlipper(paths[n], col) } ``` I also wrote a function to swap out the color with another from a palette that we determine at the beginning of the code. I'm pretty sure that this isn't the prettiest or cleanest code, but hey... it works! Let's have a look at what it looks like now after adding strokes and changing the colors: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/5.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/6.jpg) This already looks much much better! Now there's a little problem here where the strokes at the borders of the tiles is cut off, this is caused by the strokes exceeding the size of the containing viewbox. This can be resolved in two manners, either unwrapping the shapes contained in this SVG into a larger SVG with a viewbox that encompasses the entire screen, or we can simply hide it by drawing a stroked rectangle on top of it. Since I didn't understand the viewbox problem until much later on, I chose to fix with the latter solution. We can simply add some rectangle drawing code to the loop where we pick which tiles to draw: ``` // inside the for loop // Draw a colored rectangle we will place the tile on top of it buff.fill(random(palette)) buff.noStroke() buff.rect(x, y, wid, hei) // Draw the tile buff.image(randSvg, x, y, wid, hei) // Draw another stroked and empty rectangle on top buff.noFill() buff.strokeWeight(10) buff.stroke(0) buff.rect(x, y, wid, hei) ``` And we end up with something that looks like this, let's also add some colour to the background: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/7.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/8.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/9.jpg) ## SVG filters Working with SVGs also unlocks the ability to utilise SVG filters, there's a number of them each of which has it's own interesting effect. I discovered them while I was on the search on something that would allow me to add a grainy effect, which ultimately I couldn't figure out because the p5 pixel array functions don't really work in SVG mode. I came across the feTurbulence filter which allows you to deform shapes, in all sorts of manners. This effect can range from subtle to very distorted: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/10.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/11.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/12.jpg) To be able to use this filter we need to attach it to the DOM as well, I'm not very knowledgeable about where the 'correct' place is to attach the filter, but I plugged it in at the top of the main tag, like so: ``` g_tag = document.getElementsByTagName("g")[0] g_tag.innerHTML += '' ``` Then we can apply this filter to a certain shape or a grouping of shapes by adding it as attribute: ``` group.setAttribute('filter', 'url(#f)') ``` Initially I added this attribute to each individual shape in the SVG, this caused the sketch to become incredibly slow. It's much better to place all the shapes in a global tag and apply the filter to it! You can read more about the filter parameters [here](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feTurbulence?ref=gorillasun.de), but essentially the two parameters that I played with the most were the baseFrequency, which essentially controls the warbliness of the filter, as well as the scale parameter, which controls the magnitude of the effect. I only cranked these parameters a little amount, to give the shapes an almost hand drawn feel: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/13.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/14.jpg) Combining these noisy strokes with a thicker strokeWeight just felt right and gave it a playful feel. I strive to make my art look like it was made by a very talented toddler lol. ## SVG graphics buffer and clearing the canvas This issue was really frustrating because I couldn't pinpoint why the sketch was behaving the way it did. I was only able to wrap my head around it after getting some help from [@antigoon](https://twitter.com/antigoon%5F?ref=gorillasun.de) and [@dave](https://twitter.com/davepvm?ref=gorillasun.de). I don't know why it took me so long to figure out what was going on, but it's a mixture of unintuitive behaviours. In the regular P5 runtime, I have the habit of not drawing a background when drawing a graphics buffer to the canvas, since it will be drawn over what's on the canvas already. The SVG runtime works in such a way that the 'canvas' doesn't get cleared if you don't call the background() function, or alternatively the clear() method. Here the latter is mentioned in the documentation, but didn't work for me, renderer.drawingContext.\_\_clearCanvas(); however did the trick, where renderer is the canvas stored in a variable. Note that the graphics buffer also needs to be instantiated with the SVG mode for it to be compatible: ``` pg = createGraphics(size, size); ``` Drawing this buffer to the canvas in the draw loop, will result in it being attached over and over again to the DOM: ``` function draw(){ image(pg,0,0,w,w) } ``` To solve this clearing the canvas was required, with either one of the two methods I mentioned. Here's a minimal example: ``` let renderer; let pg; let pg_size = 1080; function setup(){ w = min(windowWidth, windowHeight) renderer = createCanvas(w, w, SVG) pg = createGraphics(pg_size, pg_size, SVG) pg.ellipse(pg_size/2, pg_size/2, 50) } function draw(){ // clear() didn't work for me // comment this out and halt execution // it will have added many svgs renderer.drawingContext.__clearCanvas(); image(pg,0,0,w,w) } ``` One unexplainable issue that remains, which has still got me scratching my head, is why it doesn't behave in the same manner (adding many SVGs that is), when I use a boolean toggle to halt execution after resizing the canvas: ``` let renderer; let pg; let pg_size = 1080; let resizeToggle = true function setup(){ w = min(windowWidth, windowHeight) renderer = createCanvas(w, w, SVG) pg = createGraphics(pg_size, pg_size, SVG) pg.ellipse(pg_size/2, pg_size/2, 50) } function draw(){ //renderer.drawingContext.__clearCanvas(); // clear() didn't work for me if(resizeToggle){ image(pg,0,0,w,w) resizeToggle = false } } function windowResized(){ w = min(windowWidth, windowHeight) resizeCanvas(w, w) resizeToggle = true } function keyPressed(){ if(keyCode === DOWN_ARROW){ noLoop() } if(keyCode === UP_ARROW){ loop() } } ``` My theory is that resizeCanvas() has a clear() attached to it, that prevents this behaviour. In any case it's probably best to clear the canvas in some manner before redrawing, and making sure that your SVG isn't blowing up! ## SVG Runtime vs Canvas API It really doesn't make much sense to compare the two, because you'll probably use one over the other depending on what you want to achieve. For the most part, I miss having access to the pixel array in the SVG run-time, mainly for the purpose of adding grain. There are however some ways to add grain that I'll have to explore in the future. I do love the SVG format though, it's generally small and the scalability is a big plus, especially for a generative token. I often get messages asking for high rez versions of the token, which I don't really have, giving the collector the option to download an SVG however solves all of that, they can scale it however they want, and they could also technically edit certain attributes to their liking! And that's pretty much it from me this time around again! If you enjoyed this post, consider sharing it with your friends, it helps out a lot! Or come and say hello on Twitter! Happy Sketching! ### Migrating from Github Pages to Netlify URL: https://www.gorillasun.de/blog/migrating-from-github-pages-to-netlify/ Last updated: 2023-04-25T12:00:08.000Z I recently migrated the Gorilla Sun blog from Github pages to Netlify. It seemed a daunting task at first, but it was much easier than I expected. I was worried that I'd be breaking something, or that my page would go offline and that it would negatively impact my SEO rankings in some manner. My blog is not massive, far from it, but I've been worried about scalability since the beginning, what if I suddenly get a lot of traffic and Github pages suddenly doesn't cut it anymore? It would be the worst time to try and figure out how to migrate the site to a new hosting service. Better do it now, get it over with and be prepared. Better safe than sorry. Also, this post is NOT sponsored by Netlify! (I'd be open to the idea though lol) Here's a quick index: 1. [So... why Netlify?](#so...-why-netlify?) 2. [Taking down your github page](#taking-down-your-github-page) 3. [Setting up Netlify](#setting-up-netlify) 4. [Updating your DNS settings](#updating-your-dns-settings) 5. [Recap of required steps](#recap-of-required-steps) ## So... why Netlify? Mainly because of scalability concerns. Github pages only offers one tier, which is free but imposes a number of limitations: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/limitsgit.png) Where the second point on the list is a bit of a problem, since you can't really know how close you are to the 100GB bandwidth limit. The other two limits are fine, if you're optimizing everything on your site then you should be far from 1GB anyway, and 10 builds are also more than enough. In Netlify you also get a bandwidth limit of 100GB per month, and 300 build minutes, which is also more than enough: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/limitsnetlify-1.png) What is also great is that you can see how close you are to meeting those limits. That said, Github pages is still a great option if you're just getting started, and I would definitely recommend it. In many ways it trivializes setting up your very first site. You just upload your files in a repo and you're good to go! But it's nice to have the options which Netlify provides. ## Taking down your github page The next sections explain how to migrate your blog from Github pages to Netlify. If your site isn't tied to a custom domain name, it's incredibly straightforward. If you have your website tied to a custom domain there are a few extra steps. First things first, you'll probably want to take down your github page. This can be simply done by going into the repository settings of your page, then navigating to the 'pages' tab and setting the source branch to 'None' instead of the deployment branch. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/0-1.png) DON'T delete this repository however, we'll need it for Netlify! ## Setting up Netlify Once you sign up to Netlify you'll be asked to deploy your first project. Luckily since our site already exists as a repository on github, we can simply point Netlify to build it from there! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1-1.png) We'll authorize Netlify to have access to our github, this will allow Netlify to draw the files and data on your website directly from github. In the future if you want to effectuate any change you just have to update this github repo and netlify will automatically update your page. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1.5.png) Next we select the repository that contains our page files. Depending on the type of site the 'build command' entry might differ, but Netlify should in most cases be able to pick it up automatically. In this case I am using a simple static site as an example, hence no build commands are required. If we had a Jekyll blog for example, this build command would need to be 'bundle exec jekyll serve' for example: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2.5.png) After you've done this final step you simply need to wait a couple of moments until the site is live. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3.5.png) Your site should now show up now under the 'sites' tab on Netlify: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4-1.png) Now your site should be up and ready, let's go and grab the link to it from the 'domain management' tab in your site settings: ![](https://gorillasun.de/assets/images/netlify/5.png) If you don't have a custom domain yet, you should only see one entry. This will be the link to your page, right now on your end it probably has a weird numerical string as url. You should edit this one to something more readable, basically to the name of your page: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/5-1.png) Then if everything is in order, your site should be accessible under this link. Go and check it out! If you still want to link a custom domain to your page, then read on. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/6-1.png) ## Pointing a custom domain to Netlify Now we can add our custom domain to Netlify. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/7-1.png) You'll probably get a message like this one after you enter your domain: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/8-1.png) And after clicking verify you'll get two new entries in your domain list, that have a warning message next to them. This simply means that you need to go and update your DNS information in your web registrar. Your web registrar is likely where you purchased your custom domain name. For me this is godaddy, where the DNS settings were still pointing towards github rather than netlify. So we will have to hop over there and change these entries. If you've had your web registrar set up for github pages, the DNS settings will look something like this, where the CNAME entry is pointing to the github pages url of the repository, and 4 A tags pointing towards github's IP addresses: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/9-1.png) The settings for Netlify will look something like this, where the CNAME tag points to the default subdomain url generated by netlify for the specific site that you want to point the custom domain to. Make sure to update this entry if you edit this subdomain url: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/10.png) And that's basically it. Netlify's docs talk much more extensively about this [here](https://docs.netlify.com/domains-https/custom-domains/configure-external-dns/?ref=gorillasun.de), if you need more info. Doing the migration as detailed in this post, will lead to some unavoidable downtime. This is because these DNS records need to propagate across the net, and that can take some time. Up to 48 hours in some instances, in my case however it only took around an hour (a full hour of panicking and double-checking my DNS settings lol). There are however some ways to drastically reduce this downtime, as detailed in [this comprehensive post](https://answers.netlify.com/t/support-guide-how-do-i-migrate-a-domain-to-netlify-dns-with-zero-downtime/3397?ref=gorillasun.de) on the Netlify support forum. ## Recap of required steps And to end, here's a recap of the essential steps required to effectuate the switch from Github pages to Netlify: 1. Set your Github Pages source branch to 'None', don't delete the repo! 2. Create a Netlify account and link it with your Github 3. Create a new site, and point it to the github repo as source 4. Edit the generated subdomain link into something humanly readable 5. Go to your web registrar and update the DNS settings: A: 75.2.60.5 / CNAME: yoursitename.netlify.app And that's it for this short 'how-to'. Nothing monumental, but it was pretty exciting to switch over to netlify! Thanks for reading, if you enjoyed it check out some of my other posts! ### 9 Tips for Tsubuyaki Processing URL: https://www.gorillasun.de/blog/9-tips-for-tsubuyaki-processing/ Last updated: 2023-04-25T12:00:24.000Z Initially this was supposed to be a quick post on a bunch of useful tricks to shorten the javascript code of your #つぶやきProcessing sketches. However, I really needed to dig into and research some points on my list, because I wasn't 100% sure how certain things actually worked! This made the post end up being a list of 10 #つぶやきProcessing tips, each of which is a tiny javascript lesson. ## What's #つぶやきProcessing? #つぶやきProcessing, pronounced Tsu-bu-ya-ki processing, literally translated meaning 'Tweet Processing', is a Twitter specific code golfing challenge, where you try to fit a compilable and functioning piece of P5 or processing code into a single tweet. Generally these tweets are also posted alongside the graphics that they generate. This 280 character sized challenge first emerged with Japanese twitter user [Hau-kun](https://twitter.com/Hau%5Fkun?ref=gorillasun.de) in 2019: > 唐突に [#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) というタグを作ってみる。 > > — はぅ君 (@Hau\_kun) [May 27, 2019](https://twitter.com/Hau%5Fkun/status/1133006598136139776?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) He says as much as: > I'm going to create a tag #TweetProcessing out of the blue! And in the replies he elaborates that he had been previously trying to make a rainbow sketch within the 140 character limit, and that the character limit increase had given him a lot more flexibility. And it genuinely seems tough to make anything interesting within 140 characters. Hau-kun then started tweeting many #つぶやきProcessing sketches over the course of the next months. Fast forward a bit, and lots of folks started joining in before the hashtag started to take on a life of it's own: > i=n=a=0;draw=\_=>{i||createCanvas(q=512,q);colorMode(HSB,1);v=createVector;h(i++);m=a.mult(4).add(2);stroke(i/4\*\*7,1,1);line(m.x,m.y,n.x,n.y);n=m};h=i=>{a=v((i&3)>>1,\[0,1,1\]\[i&3\]);for(j=1;j<8;){i/=4;k=i&3;l=2\*\*j++;!k?a=v(a.y,a.x):k<2?a.y+=l:k==2?a.add(l,l):a=v(l-1-a.y+l,l-1-a.x)}} [pic.twitter.com/23S3gHsm4J](https://t.co/23S3gHsm4J?ref=gorillasun.de) > > — Daniel Shiffman (@shiffman) [November 29, 2020](https://twitter.com/shiffman/status/1333117934827343872?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Hence, let's have a closer look at some tips to get you started with #つぶやきProcessing! Enjoy, it's a fun one! Here's the index: ### The Tips: 1. [Expression return values](#expression-return-values) 2. [Omitting the draw and setup functions](#omitting-the-draw-and-setup-functions) 3. [Storing functions in variables](#storing-functions-in-variables) 4. [Arrow functions](#arrow-functions) 5. [The conditional ternary operator](#the-conditional-ternary-operator) 6. [Skipping last condition in a for loop](#skipping-last-condition-in-a-for-loop) 7. [Code inside the for loop](#code-inside-the-for-loop) 8. [Multiplying a condition](#multiplying-a-condition) 9. [Multiple assignment with an array](#multiple-assignment-with-an-array) 10. [Putting it all together](#putting-it-all-together) ## Expression return values Let's start off with a tip that will come in handy in each and every one of your #つぶやきProcessing sketches! Drawing anything to the canvas requires creating it first. Since we're short for characters, we most likely don't have the luxury to make a sketch that adjusts to the window dimensions. For this reason most #つぶやきProcessing are created with a fixed canvas size: ``` function setup(){ w = 600; createCanvas(w, w); } ``` This first trick involves placing the declaration of the canvas size within the createCanvas() function, like so: ``` createCanvas(w=600,w); ``` Essentially we're assigning a value to the variable 'w' AND immediately reusing it as a second parameter for the createCanvas() function... now why does this work? It has to do with what is considered an expression and what is considered a statement in javascript: ``` // this works because w = 600 is an expression createCanvas(w=600,w); // this doesn't work because var w = 600 is a statement createCanvas(var w=600,w); ``` In general, expressions in javascript are [units of code that can be evaluated to a value](https://medium.com/launch-school/javascript-expressions-and-statements-4d32ac9c0e74?ref=gorillasun.de). Here the assignment is in fact an expression, which will return the value that was assigned. And this is by design. It also enables things like multiple assignment, for example: ``` a = x = y = 5; ``` Which could also be a useful trick to save you some characters. More on this [here](https://stackoverflow.com/q/16027247/6688750?ref=gorillasun.de). ## Omitting the draw and setup functions We generally structure our p5 sketches to have a setup function, where we do some preliminary things, and then draw our graphics in the draw loop which runs after the setup function has finished. However it is not always necessary to have both the setup and draw function. When we're simply dealing with a static image we don't require the draw function at all, and could simply write our code at the end of the setup function. This would also lets us make do without the noLoop() function call. On the other hand we could also omit the setup function, which is a little tricky because we still need to create the canvas, and the createCanvas() function should generally only be called once. A nifty trick for this is: ``` f=0; function draw(){ f++||createCanvas(w=600,w); } ``` Neat right?! On the very first draw call the expression 'f++' returns 0, which forces the sketch to check the second part of the condition, which in turn will actually create the canvas. On subsequent loops of the draw function the variable f will have been incremented, which means that it doesn't actually have to check the second part of the condition anymore. This is because values other than 0 are considered to be truthy. ## Storing functions in variables Another nifty thing we can do to save on characters is replacing a function's name with one that is shorter. This is useful when you're using some inbuilt p5 functions that have a somewhat lengthy name, for example: ``` // let's shorten the random() function // and store a reference to the random function in a variable R = random // we can now use the shortened version func(R(), R()) ``` This is another trick that had me scratching my head! I get what's happening, but why is it possible?! For this we have to have a closer look at how javascript works internally. I asked the folks in the birbsnest discord and Julien Pradet explained it very elegantly: > So when you do function draw() { }, what you actually do is storing the draw function in a variable called draw. It's done automatically. But you could also write: let draw = function draw() { }. draw() would still behave the same way. And also provided a nice example: ``` // This exists inside p5 even if it's not written this way let random = function random() { /* ... */ } // in your code let R = random; // in a sense, you're just copying the function into another variable R(); // outputs the result of the `random` ``` In conclusion he also adds: > \[...\] but beware, you're dangerously close from entering the world of functional programming. In no time, you'll be creating functions that return functions, want to curry all your functions and so on. (I'm personally in love with this way of writing code.) So there's that, go show [Julien](https://twitter.com/JulienPradet?ref=gorillasun.de) some love, he makes some cool gen-art and [streams live coding on twitch](https://www.twitch.tv/superroipatate?ref=gorillasun.de) every monday and saturday. Also join the birbsnest, it's a lovely community. ## Arrow functions On the topic of functions, that 'function' keyword takes up an awfully large number of characters. We can do better here as well and save some characters by using arrow functions! Arrow functions are a javascript feature that has been introduced with ES6, and for our purposes enable a much more compact way to write function signatures: ``` // instead of doing this function someFunc(a, b){ return a + b } // we can omit the 'function' keyword and the name of the function // and rewrite it in this manner by using the arrow function expression (a, b) => { return a + b } // we can further reduce this by removing the curly braces // and the return keyword (a, b) => a + b // to use this we can assign this arrow function to a variable let someFunc = (a, b) => a + b // which can then be called in this manner someFunc(a, b) ``` Ok a lot is happening here. Basically, arrow functions let us do without the 'function' keyword as well as the actual name of the function, instead we just specify what kind of arguments it should take, followed by the arrow symbol (equal and larger than symbols) pointing towards the body of the function. We can now also omit the curly braces, which tells js that the value following the arrow should be returned. In that way we can also omit the 'return' keyword. Now we can use this to shorten the signature lines of our setup and draw functions, ending up with something like this: ``` setup=()=>{createCanvas(w=600,w)} ``` Since the setup function doesn't take any paramteres, we can make it a parameterless arrow function by writing it with empty parentheses. However, we can make it even shorter, by declaring it such that it actually takes in a parameter, so you'll often see something like this: ``` setup=_=>{createCanvas(w=600,w)} ``` Now we could technically pass in an argument to the setup function, but the setup function is usually never called a second time from within the code, so it doesn't matter, and it saves us a character. ## Ternary conditional operator Conditional statements are also very useful and often needed to make interesting sketches. if/else statements however quickly add up to a significant amount of characters that we could save by employing the ternary operator: ``` // regular if else statement if(condition) { func1() }else{ func2 } // the ternary operator condition ? func1() : func2(); ``` It's pretty straightforward actually, the condition goes before the question mark symbol, the first option after, followed by the second condition separated by a colon. We can also obtain more complicated logic by chaining them: ``` // multiple ternary operators chained together condition ? func1() : condition2 ? func2() : func3(); ``` Notice how we can also skip the parentheses around the condition! Another thing I want to add here is that the curly braces are not always necessary, hence if for some reason you need to use an if statement, you can do it like this: ``` if(condition) doSomething(); ``` I personally don't like it, but it's a possibility. ## Skipping last condition in the for loop A for loop formally consists of three parts: an initializer, a termination condition and an iterator. In most cases we can actually make do without the third part: ``` // regular for loop for(let i = 0; i < 10; i++){} // rewritten and shortened for(let i = 10; i--;){} ``` In this case we reversed the iteration order, counting down from ten rather than starting from 0\. Why does this loop actually terminate? After completing ten iterations the variable will reach a point where it is equal to zero, in that case the for loop will check the condition and determine that it is false. Thus it will stop looping. I'm sure there are other creative ways to make use of this as well! ## Code inside the for loop Moreover, we can make use of the fact the initialization clause in the for loop only gets executed once, and the iteration clause several times. As a matter of fact, the for loop doesn't really care what you write inside of it. As long as you still fulfill the termination condition you should be fine. Let's have a look at an example: ``` f=0; draw =_=> { for( f++ || createCanvas(w = 600, w), background(220), maxNum = 10, spacing = w/maxNum, n = 0; n < maxNum; rect(n++*spacing, (n-1)*spacing, spacing, spacing ) ); } ``` This would simply draw a couple of rectangles along the diagonal. All of our setup stuff went inside the first clause of the for loop! You just need to make sure that these statements are comma separated, the last of which terminated with a semin-colon. Then we have the termination condition, as well as the iteration clause. We are actually drawing the rectangles inside this clause, and incrementing the loop variable 'n' inside of it. Remember that an expression returns it's value? Throwing all of this together we can achieve some pretty interesting stuff, here's a sketch where I use this technique and a bunch of the previous ones: Due to having a fixed canvas size you might have to copy it into the p5js editor to see it as intended. And credit where redit's due, putting code in the for loop I stumbled across through [Maxim's](https://twitter.com/MaximGifmaker?ref=gorillasun.de) awesome video on Tsubuyaki Processing tricks: Seriously go check it out, it's a really good video where goes over a number of sketches. All of which have some interesting tips and tricks! ## Multiplying conditions Another thing that comes in handy very often, is the ability to multiply conditional expressions with numbers. This is often useful when doing combinatoions and permutations of things. Let's have a look at how this works: ``` for(let i = 0; i < 10; i++){ console.log( 5 * ( i % 2 == 0 ) ) } ``` In this example the loop will print 5 when i is odd and 0 when i is even. This is because the boolean expression (i%2==0) when truthy evaluates to 1 and when falsy evaluates to 0\. This came in incredibly useful when I did this recursive grid sketch: > r=\[1,2\];setup=\_=>{createCanvas(w=600,w);s=w/9;fill('[#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)');q=w-s\*2;cc(s,s,q,q,7);};function cc(x,y,i,h,d){if(d>0){var \[o,k\]=\[i/2,h/2\];cc(x,y,o,k,d-random(r));cc(x+o,y,o,k,d-random(r));cc(x,y+k,o,k,d-random(r));cc(x+o,y+k,o,k,d-random(r))}else{rect(x,y,i,h)}} [pic.twitter.com/jkz5yxWNRU](https://t.co/jkz5yxWNRU?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [April 22, 2022](https://twitter.com/gorillasu/status/1517443874792353792?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Multiple assignment with an array Last but not least, here's another trick to assign multiple different values to several variables. This is sometimes useful when we create variables with the 'var' or 'let' keywords and don't want to declare them with a global scope. We've already seen that we can assign the same value to multiple variables like so: ``` // assign a value to several variables var a = b = c = 5 ``` However what if we want to assign different values to different values, can it be done in a single line? Yes, it can: ``` // we're going to use an array for this var [a, b, c] = [1,2,3] // and now we can simply use these variables by themselves var d = a + b + c ``` This way of assigning values is also a feature of ES6 and is called array destructuring. ## Putting it all together And finally here's a sketch where I combine a lot of these techniques that we've discussed today: > [#つぶやきProcessing](https://twitter.com/hashtag/%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8DProcessing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) 😬😵‍💫😁 > f=0,draw=(a=>{for(f++||createCanvas(w=762,w),background(0,50),noStroke(),p=w/9,N=21,n=N\*\*2,s=(w-2\*p)/N;n>0;k=millis()/w+n/3,l=w/6,c=(n=>l+l\*n),o=cos(k),fill(c(sin(k)),c(o),c(-o)),ellipse(int(n--/N)\*s+p,map(fract(n/N),0,.9,0,20)\*s+p,s-3+s\*sin(k)));}); [pic.twitter.com/iqQ7W5WQw9](https://t.co/iqQ7W5WQw9?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [May 10, 2022](https://twitter.com/gorillasu/status/1523973819924455427?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And here we find ourselves at the bottom of the blog post again! If you've enjoyed the post, share it with your friend, it helps out a lot! Otherwise come say hello on Twitter! Thanks for reading and happy sketching! ### How to set up a Breadfond URL: https://www.gorillasun.de/blog/how-to-set-up-a-breadfond/ Last updated: 2023-04-25T12:00:30.000Z In this post I will show you how to set up a Breadfond via the TEIA collab contracts. In just a second, you'll have an idea what that actually means and learn about the required steps to create your very own Breadfond. I'll begin with a little bit of context to show how this idea came to be. Here's a little index to help you through the sections: ### The Idea: 1. [A bit of context](#a-bit-of-context) 2. [Nesting collab contracts](#nesting-collab-contracts) 3. [What's a Breadfond?](#what's-a-breadfond?) 4. [Breadfunds on Tezos](#breadfunds-on-tezos) ### Setting up breadfonds on different marketplaces: 1. [Setting up a breadfond on TEIA](#setting-up-a-breadfond-on-teia) 2. [The Top level breadfond contract](#the-top-level-breadfond-contract) 3. [Recent Improvements](#recent-improvements) 4. [Breadfonds on Versum](#breadfonds-on-versum) 5. [Breadfonds on Fxhash](#breadfonds-on-fxhash) 6. [Issues and outlook](#issues-and-outlook) ## A bit of context I wouldn't be writing this post if it weren't for this tweet from [Mical Noelson](https://twitter.com/micalnoelson?ref=gorillasun.de): > There has to be better models than just collecting works I have realized. > I have been thinking for a while now, you can split sales on most platforms on tezos. I would love to make an event to promote each of us making one work and splitting the royalties with 5 to 10 artists. > > — Mical Noelson (@micalnoelson) [March 12, 2022](https://twitter.com/micalnoelson/status/1502562539699376131?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Afterwards I retweeted his tweet because I thought that it was a formidable idea and had a lot of potential. [Andrew](https://twitter.com/aebrer?ref=gorillasun.de) quickly hopped onto the bandwagon in the replies and pointed out that this would be possible via the TEIA collab contracts: > There has to be better models than just collecting works I have realized. > I have been thinking for a while now, you can split sales on most platforms on tezos. I would love to make an event to promote each of us making one work and splitting the royalties with 5 to 10 artists. > > — Mical Noelson (@micalnoelson) [March 12, 2022](https://twitter.com/micalnoelson/status/1502562539699376131?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) We discussed it a bit more, and Andrew quickly did a little test to see if it was possible to setup such a thing: > Collaboration Abomination[https://t.co/JOo7uUtZSO](https://t.co/JOo7uUtZSO?ref=gorillasun.de) > > I'm testing an idea I have for splitting. If this works, 80% of the revenue goes to me, and 20% will go to a Teia collab contract that splits between myself and my two siblings. > > Accepting the highest offer in the next 10 min lol [pic.twitter.com/iY9zUFp0I7](https://t.co/iY9zUFp0I7?ref=gorillasun.de) > > — 🔺aebrer: prefers Mastodon (@aebrer) [March 12, 2022](https://twitter.com/aebrer/status/1502725134184071173?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) And it was indeed possible! > IT WORKED! [pic.twitter.com/wffX0KlnS0](https://t.co/wffX0KlnS0?ref=gorillasun.de) > > — 🔺aebrer: prefers Mastodon (@aebrer) [March 12, 2022](https://twitter.com/aebrer/status/1502728290146136068?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Essentially, what Andrew had done here was a little proof of concept. He minted an NFT via the TEIA collab contract, which upon sale automatically sent and split a portion of the revenue between a set of wallets that he had specified. We'll get into the implications of this in the next sections. ## What actually happened here? So, what did Andrew actually do? The TEIA collaborative contract is generally used by a group of two or more creators to share revenue between them in fixed percentages. However this collab contract doesn't only split revenue generated from the sale of NFTs, but actually any amount of incoming tez that is sent to this contract. Andrew created a collab contract that splits revenue in equal shares between his own wallet address and his two siblings' addresses (33.33% each basically). Now he didn't actually mint his NFT from this collab contract, but rather used the address of this collab contract as a beneficiary within another collab contract. Essentially nesting those two contracts! Moreover, he created a "top-level" collab that sent 80% of tez to his own address and 20% towards the collab with his siblings. These 20% will then be further split into 3 equal chunks. Here's a little schematic that clarifies this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/schematic.png) ## What's a Breadfond? It's important to point out here, that this idea has an analogue in the real world, namely: Broodfonds, which is a concept originating from the Netherlands, and that literally translates to 'Breadfund' in English. In essence, the term defines a group of people that bands together to provide and enable each of it's individual members with financial support during times of hardship. There's a little wikipedia entry about them [here](https://en.wikipedia.org/wiki/Broodfonds?ref=gorillasun.de). For instance, when a member falls sick, they will receive donations (or support in other forms) from the other members of this support system until they are able to get back on their feet again. This doesn't necessarily mean that this is how a Breadfund has to behave, it can be setup in many different ways. It all depends on the participating members and the dynamic that is agreed upon. It is based on consensus. The term “Breadfond” is a mash up of the original dutch term and the english term, and what we rolled with to indicate our version of the concept. ## Translating this concept to Tezos The Breadfond collective is a Tezos version of this concept! Essentially, we will make use of the tools available on the Tezos blockchain to set up a support system that is similar to it's real world analogue (with some differences). More specifically, this will be done by making use of the collab and split contracts that currently exist on the TEIA and Versum NFT marketplaces (as well as others in the future, like fxhash i.e.). The core idea: each member of a Breadfond voluntarily relinquishes a small portion of the revenue that they generated from the sale of NFTs, and has it automatically sent to a split/collab contract. This contract in turn will automatically and evenly distribute that amount among all members that belong to this particular Breadfond. We'll discuss how to set this up in the next section. This relinquished portion can be a minuscule percentage >1%. Each user then will have a unique personal Breadfond, essentially a list of people they choose to support for whatever reason. The Breadfond collective is simply the group of people made up of all the people using a Breadfond. We've made a little [discord](https://discord.gg/nbpfU8P6XW?ref=gorillasun.de) for everyone that would like to discuss these matters further or to find a Breadfond to be part of. ## Setting up a Breadfond on TEIA Now to the nitty gritty! In this section we'll go over how a Breadfond can be set up via the TEIA collab contract. First off, you'll have to make sure that you're synced on TEIA with one of your wallets. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1-2.png) A quick note here, while creating the Breadfond, it doesn't really matter from which one of your wallets you create it, this collab will only act as an intermediary that will split whatever it receives in tez with all the beneficiaries that you add to it. You'll have to decide if you want to have these collab contracts linked to your main wallet, or linked to a separate dedicated one that holds all your collab contracts. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2-2.png) Next, go and click on the hamburger menu in the top right corner and you should be met with a menu as such: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3-1.png) Now click on collaborate and you'll be taken to a new page that might have some entries already if you've collaborated with someone before: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/5-2.png) Or alternatively is empty if you haven't done so yet: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/6-2.png) For now, we'll shift our attention towards the 'create' tab and click on it. You should see something like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/7-2.png) We can skip this for now (since there will be no core collaborators in this collab), and proceed to the next screen that allows you to add beneficiaries: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/8-2.png) Here we will click on "add address manually" and add the wallet addresses that we would like to belong to our Breadfond. You'll see something that says "\[object Object\]" which you can safely clear and replace with the addresses you'd like to add: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/9-2.png) In the shares field ideally you would put the number '1', which means that this beneficiary will receive exactly one share of the tez inbound to this collab address (except if you for some reason would like certain beneficiaries to obtain larger shares). ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/10-1.png) We can add arbitrarily many beneficiary addresses to the collab, each of which will be set to receive one share. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/11.png) To exemplify, I'll add in some of my own wallet addresses so that we can proceed: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/12.png) After we've added all of our beneficiary addresses we'll be taken to a review screen where it will show us how the percentages will be split between beneficiaries: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/13.png) Now we can hit "create collaborative contract" and verify with our wallet. It's important to note that the gas fees for creating this contract are pretty high at this point (\~5$) which is not too bad since we only have to do this step two times in total (once now, and a second time to set up the top level contract): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/14.png) After confirming the transaction we'll be taken back to our overview of collab contracts and we should be seeing a new entry that has a rather lengthy name. In this view you can choose into which collab you want to sign in. Once you're signed into one of your collabs you can click again on the hamburger menu and click on profile. If you're signed in to a collab you will be able to change the profile information of that collab. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/15.png) If you want you can update this information now. One last thing is that you should grab the address of this contract and save it somewhere, we're gonna need it in a second! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/16.png) You can find the address by clicking "more detail" in the manage view. And this essentially concludes this part of the tutorial. ## Setting up the top level Collab on TEIA In this part we're largely going to repeat the same steps that we've taken before, with some slight, but important differences. First, let's make sure that we are synced with the correct wallet that we want to create this collab contract from. This is important because we are going to mint our NFT from this wallet address. We'll repeat the same steps as before, but after arriving at the create tab of the collab contract, we're gonna want to add a core collaborator this time, instead of just skipping. And this core collaborator will be none other than ourselves, make sure that this is the wallet that you want to mint your NFT from, we will add our own wallet address (the one with which we are synced right now) into one of the core collaborator fields: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/17.png) Then in the beneficiary field we'll input the address of the Breadfond contract we created just a second ago: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/18.png) And then we proceed to the review screen again. Note that you can add a different split of shares, depending on how large a chunk of your sales you want to go towards the breadfond! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/19.png) Now you can return to your "Manage" view, sign in and edit your profile information. And that's about it regarding setup, now we're ready to mint an NFT! The next step would then be minting an NFT from the collab contract, which is relatively straightforward. You proceed as you usually would when minting an NFT on TEIA, the only difference here is, by being core collaborators, we need to sign the NFT before we can do anything with it. ## Recent Improvements One problematic aspect of being part of a breadfond is receiving an occasional trickle of tez in your wallet (breadcrumbs). This is undesirable if you want to maintain a tidy wallet and transaction history. @ztepler added a feature that allows collab admins to set a threshold value, which essentially specifies how much tez has to be accumulated in breadfond royalties before they will be dispensed to breadfond members. There is also an option to withdraw any amount of funds immediately without having to wait for it to trigger. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/withdraw.png) ## Versum breadfonds Creating breadfonds on Versum is also possible, albeit a little different. Due to KYC (Know Your Customer) issues which Versum tries to ensure for artists, TEIA KT1s are problematic. For this reason they are blocked as of now and can not be set as neither collaborator nor royalty beneficiary. However it is still possible to set up your breadfond by adding each individual address and their corresponding share in the royalties section when minting. Some might prefer doing it this way since it requires several steps on TEIA, nor has it any additional gas fees attached to it. However you would have to copy in multiple addresses in every time you want to make a breadfond piece. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/versum.png) Some discussions have been made about making this step easier by allowing to load in a list of addresses and fill out the fields automatically. ## Fxhash v1.0 breadfonds If you've recently been active in the Tezos NFT space, then you've probably heard about the launch of Fxhash. Fxhash v1.0 now also allows collaborations! [Here](https://www.fxhash.xyz/doc/artist/collaborations?ref=gorillasun.de) is the official Fxhash documentation that provides a detailed explanation of how collaboration works. Contract entry points were not immediately supported at the time of launch, but they are now, you would simply have to add the breadfond address in the primary splits field: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fxhash.png) ## Issues and Outlook There's a couple of caveats with the way that we're using the collab contracts here. One problematic point is that once created, the list of beneficiary wallet addresses is immutable. This is tricky, because what if you want to add new people to your Breadfond? Or alternatively what if someone wishes to be removed from your Breadfond? The only way right now would be to create a new collab contract alltogether. Hopefully, the more this contract nesting strategy gets used, the better the methods will get. Another issue is how the minted collab pieces are listed on TEIA. Technically being the sole core collaborator of a piece in top level contract, it should show it with your other personal mints on TEIA, but it will actually put it under the assets page of the collab contract. The same issue also occurs on Objkt.com where the collab mints are listed, but under the collab contract's address. To conclude, I believe that this is an incredibly interesting way to make use of the tools available on the Tezos blockchain. I haven't seen or heard of anything similar on other chains. And that's pretty much everything I have to say! If there are any changes or updates, I will make sure to include them here. Also big shoutout to [Andrew](https://twitter.com/aebrer?ref=gorillasun.de) and [Mical](https://twitter.com/micalnoelson?ref=gorillasun.de), and thanks for reading! ### An Algorithm for Irregular Grids URL: https://www.gorillasun.de/blog/an-algorithm-for-irregular-grids/ Last updated: 2026-09-23T15:13:41.000Z Grids, in their various shapes and forms, have been an important backbone for my sketches since I started creative coding. I'd go as far as saying that grids are a prominent generative art archetype that sits at the foundation of many works. Two influential examples from an early generative art period would be Georg Nees' 1968 work Schotter (german word for Gravel) and Vera Molnár's 1974 artwork (Dés)Ordres (french word for (dis)order): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/vera.jpeg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/nees.jpeg) **(Dés)Ordres - Vera Molnár, 1974 (left) and Schotter - Georg Nees, 1968 (right)* Grids go hand in hand with what computers do best: repetition. Grids are also by nature 'orderly'. We usually use grids and tables to neatly display information, align elements in an organized manner, as well as delimit text/numbers in such a way that it is easy for the eye to follow. However, observing these two artworks reveals a characteristic that is inherent to many generative pieces: the interplay between order and chaos. And I believe that that's one of the most fun aspects of gen-art, when you're presented with a new artwork for the first time and you have to figure out what the pattern is and where the twists and irregularities were introduced. Here I'd like to conclude this little interlude and dedicate the rest of the post towards a grid-construction algorithm that I have used extensively in the past weeks. The algo is relatively straight-forward and unoptimized, but quite versatile. Here's a little index: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1mod.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2mod.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3mod.png) ## Grids and their Variations Most of my first sketches were based on simple grids: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hieroglyphs-I.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/datastream-1.gif) They allowed me to explore concepts like [SDFs](https://gorillasun.de/blog/Making-of-Gzork?ref=gorillasun.de) and [noise fields](https://gorillasun.de/blog/Introduction-to-Perlin-Noise-in-P5JS-and-Processing?ref=gorillasun.de) (these two posts are also good starting points if you'd like to learn how to construct grids!). I have also experimented a bit with hexagonal grids and written about different strategies to construct them [here](https://gorillasun.de/blog/A-guide-to-Hexagonal-Grids-in-P5JS?ref=gorillasun.de). This leads to the next point that I'd like to discuss, that is irregular grids. When you google 'irregular grid' you get a bunch of odd looking grid layouts, some of them look like this: [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/grid.png)](https://openprocessing.org/sketch/1555978?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/recursiveregular.png)](https://openprocessing.org/sketch/1555984?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/recursiveirregular.png)](https://openprocessing.org/sketch/1555985?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/quad.png)](https://openprocessing.org/sketch/1555988?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/randomspacing.png)](https://openprocessing.org/sketch/1555982?ref=gorillasun.de) [![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/distorted.png)](https://openprocessing.org/sketch/1555993?ref=gorillasun.de) Different types of grids. Click on the images to see the code. Except for the first, each of these is an irregular grid in it's own right. **Click on the thumbnail of each grid and it will take you to it's corresponding code in the openprocessing editor**, **I would however recommend to attempt recreating these by yourself first, since I found it to be an interesting little exercise**. There is however one pattern that does not emerge in these grids, which occurred to me after reading a question by @griff420 on the birbsnest discord server: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/griffquestion.png) This is a bit tricky to explain, but it's not immediately evident how the rectangles could have been placed. In the middle we see three rectangles interlocking in a manner that wouldn't be possible to achieve by recursive subdivision. [Here is a nice article about a 'Recursive Mondrian' approach by Max Halford](https://maxhalford.github.io/?ref=gorillasun.de), who has an excellent blog btw. His approach is similar to the second and third grid examples I showed a little bit above. In such a grid it is clear where the larger rectangles were subdivided into smaller ones. However, you will never see rectangles protrude beyond the border of a larger containing rectangles. In the next section I'll give an intuitive explanation of an algorithm that can construct such an irregular grid. ## A strategy for constructing an Irregular Grid I came up with this strategy at the same time that I was working on my [grid random walker code](https://gorillasun.de/blog/An-Object-oriented-approach-to-random-walkers?ref=gorillasun.de) as well as the [mini grand canyon sketch](https://gorillasun.de/blog/Making-of-Grand-Canyon?ref=gorillasun.de). What it has in common with them is that it is also based on an initial boolean grid, which we will use to do some pseudo rectangle packing. In this case, I am calling it 'pseudo' rectangle packing, because the size of the rectangles is chosen at runtime rather than being specified at a prior time. Similar to the two previously mentioned sketches, we'll begin with a boolean grid, which basically consists of a 2D array of boolean values. Initially we'll set all of these values to true, which signifies that these spots are unoccupied. With the grid ready, we can begin placing some rectangles. We will go through the grid from the top left towards the bottom right, and depending how we arrange our loops we can do this in a row-wise or column-wise order. First, we pick a reasonable rectangle size that spans a specific area of the grid. Here it's important to note that the sizes are relative, say we are working with a 12 by 12 grid and choose a rectangle size of 3x3, this would mean that the rectangle spans 3 columns and 3 rows. After having chosen a rectangle size, we will check if the grid at the current position, as well as the positions that the rectangle would span are unoccupied. If that is so, we can place the rectangle, and mark those spots in the grid as occupied. We repeat this process while iterating over the grid. Once we are done and visualise the grid, we will notice that some unoccupied spots remain, this is due to choosing rectangle sizes that either overlapped with occupied spots in the grid or exceeded it's dimensions. Once we tackle the code we'll find that we have an implicit solution already. And this is pretty much all there is to it, we basically place some rectangles on a grid. ## A Boolean Grid Let's begin by creating the 2d boolean array! For starters we'll only consider the case where the shape of the grid is square (the final code will be able to produce any arbitrarily shaped grid however): ``` function setup(){ w = min(windowWidth, windowHeight); createCanvas(w, w); // size of the padding between grid and sketch borders padding = w/12; // number of rows and columns of the grid gridDivsX = 15; gridDivsY = 15; // actual spacing between grid points gridSpacingX = (w - padding*2)/gridDivsX; gridSpacingY = (w - padding*2)/gridDivsY; // here we populate the 2d boolean array let bools = []; for(let x = 0; x gridDivsX || y + ydim > gridDivsY){ fits = false } ``` And check if it overlaps with another rectangle: ``` for(let xc = x; xc < x + xdim; xc++){ for(let yc = y; yc < y + ydim; yc++){ if(bools[xc][yc] == 0){ fits = false } } } ``` Now if both of these checks fail and 'fits' remains true, it is safe to place the rectangle. In this case we need to mark the area that the rectangle will occupy as occupied and save the rectangle's position and dimensions for later use since we are not going to draw it immediately: ``` if(fits){ // mark area as occupied for(let xc = x; xc < x + xdim; xc++){ for(let yc = y; yc < y + ydim; yc++){ bools[xc][yc] = false } } rectInfo.push(new makeRect(x,y,xdim,ydim)) } ``` You probably noticed that we are storing the rectangle information as a custom object, which is useful if we want to store additional information with each rectangle, but is not necessary. The class in this case is quite minimal and looks something like the following: ``` function makeRect(posX, posY, dimX, dimY){ this.posX = posX; this.posY = posY; this.dimX = dimX; this.dimY = dimY; // other stuff here } ``` ## Visualising the Grid Drawing the grid to the canvas now is relatively straight forward, we simply loop over the array in which we stored our rectangle information: ``` function drawGrid(){ for(let n = 0; n ``` Here's where the gridSpacingX and gridSpacingY variables we computed at the start come into play. We need to multiply the rectangles' position and dimensions with the actual dimensions of our grid to get accurate sizes. I really like this approach, because in this manner we can stretch the grid horizontally and vertically with fairly little effort. Let's first put together everything we have discussed so far: Notice here that our strategy wasn't able to completely fill out the entire grid, and there were some empty spots left over. These spots are marked with dots. However before we tackle filling out these spots, let make this grid adjustable to different canvas sizes! This change can be effectuated by introducing a couple more variables in the setup function: ``` function setup(){ // for demonstration purposes randomSeed(0); widMod = 1 // width modifier lenMod = 1 // height modifier w = min(windowWidth, windowHeight); wx = w*widMod wy = w*lenMod createCanvas(wx, wy); // size of the padding between grid and sketch borders padding = w/12; // number of rows and columns of the grid gridDivsX = 15; gridDivsY = 15; // actual spacing between grid points gridSpacingX = (wx - padding*2)/gridDivsX; gridSpacingY = (wy - padding*2)/gridDivsY; // rest is kept the same as before } ``` Now we can control the aspect ratio of the sketch simply by specifying it with the widMod and lenMod variables. For demonstration purposes I am using a fixed seed number: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regular.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/stretch.png) If you're not a fan of the stretched out look, we can also multiply the grid divisions by the width and length mods to obtain a consistent look: ``` gridDivsX = 15*widMod; gridDivsY = 15*lenMod; ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/widcons.png) That should give you a couple of options to obtain a variety of sketches that don't always have a square aspect ratio! ## Filling out the Leftover Gaps Now on to completely filling out the grid! For this we simply need to make an additional constructGrid() call: ``` constructIrregularGrid([2,3]); constructIrregularGrid([1]); ``` And we obtain a grid that looks something like this: This works because on the subsequent constructGrid() call we are going over the same boolean grid, the spots that have already been marked as occupied will, well, still be occupied, but we get a chance to fill out those spots that are still free. And since we pass an array that only has one size the rectangles will inevitably fill a single grid cell. Now you don't necessarily need to fill it out this way and can pass in different grid sizes. ## Different grid styles We can exploit this behaviour and obtain completely different grid styles! Let's make a little modification that allows us to control the rectangle widths and heights independently: ``` function constructIrregularGrid(sizesArrX, sizesArrY){ for(let x = 0; x ``` Now we are passing in two independent arrays, one that specifies the range of widths that rectangles can have, and another one for their heights. You can obtain a variety of different grids in this manner: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/123-12.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/13-24-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/34-12.png) **\[1,2,3\], \[1,2\] - \[1,3\], \[2,4\] - \[3,4\], \[1,2\]* And that's pretty much everything that goes into this algorithm, if I stumble across any additional modifications I will make sure to include them here. If you do end up using this, and/or make anything with please @ me on Twitter when you share it! ### Making of Behind the Canvas URL: https://www.gorillasun.de/blog/making-of-behind-the-canvas/ Last updated: 2023-04-25T12:01:51.000Z If you haven't seen it on my Twitter already, this past month I've had the chance to make a sketch for Crayon Codes! I'm incredibly happy with how it turned out and with everyone's response to it! Before going into any details, I'd like to thank [Sinan](https://twitter.com/msawired?ref=gorillasun.de) for reaching out to me about this opportunity, and for his continuous feedback throughout the different iterations my sketch went through! Secondly I'd like to thank all those who've collected an edition or two of 'Behind the Canvas'! It was a joy to make, and as always I learned a lot along the way. Making a sketch where the collector could specify parameters prior to collecting, was yet another beast to conquer. Here are a few of the 70 editions that have been collected: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/16-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/27.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/31.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/50.png) You can check out the entire collection [here](https://openprocessing.org/crayon/28?ref=gorillasun.de). I think that there's a couple of cool things going on in the sketch, that from a technical and ideative point of view are worth inspecting a little bit in more detail: 1. From initial idea to final sketch 2. [Setting up our sketch with the OPC Configurator 3000](#setting-up-our-sketch-with-the-opc-configurator-3000) 3. [Creating smooth Polygons](#creating-smooth-polygons) 4. [Clipping out Regions](#clipping-out-regions) 5. [Notes on preserving sketch determinism](#notes-on-preserving-determinism) 6. [Resizing and Rescaling](#resizing-and-rescaling) 7. [Closing Notes](#closing-notes) ## From initial idea to final sketch Early February Sinan reached out to me, and sent me some of my sketches that he had seen and thought could be a good fit for the Crayon Code raster. I took a couple of days to dig up their code from my hard drive and assess which ones had enough variety to be turned into generative tokens. The ones that he especially liked were the following: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/init1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/init2.png) However I wasn't certain if it was possible for them to have enough variety to create an entire collection. And I already had made my ['scribble' sketch](https://www.fxhash.xyz/generative/1193?ref=gorillasun.de) on fxhash which explored a similar avenue. I did come up with some variations however to see if I could push the idea in a different directon: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/idea1scaled2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/idea2scaled.png) How I ultimately arrived at what 'Behind the Canvas' ended up being, might sound like a far stretch, but my brain works in mysterious ways. What Sinan liked about the two previous sketches, was the 'rug' like texture of them, and how the edges of the lines overlapped with each other. I pondered a bit on that, and wanted to see if I could somehow make a sketch that didn't convey the texture of fabric, but rather a different property. I explored some other ideas that came to mind, one of them being an attempt at emulating a tear or split in some sort of fabric. I ended up with something that looked like the following: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/proto1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/proto2.png) And from here on it's probably obvious how the sketch developed further. ## Setting up your sketch with the OPC Configurator 3000 A good starting point for figuring out how to weave the Configurator into my code were previous Crayon Code sketches, which conveniently have their code publicly visible. There's a couple of ways to do this, depending on how you structure your sketch, if it's animated or not, and how you want to incorporate the initial random seed throughout your sketch. The most fitting way to do this for my purposes, was how Okazz handled it in his 'Crack' sketch, which only draws and redraws the graphics to the canvas on three occasions: 1. An initial rendering pass 2. Whenever one of the OPC parameters changes 3. Whenever the sketch/window is resized This was important because running the sketch that I had in mind in real-time would have been very laggy, and since it doesn't have any animated components it doesn't need to do so. Hence it was sufficient to update the sketch only when the parameters changed, or when the window is resized. Let's have a quick look how their method handles this! We'll first have to make some sliders to work with: ``` /** OPC START **/ OPC.slider('seed', Math.floor(Math.random() * 1000), 0, 1000, 1); OPC.slider('parameter1', Math.floor(Math.random() * 5), 0, 5, 2); OPC.slider('parameter2', Math.floor(Math.random() * 5), 0, 5, 2); /** OPC END**/ ``` Invoking the OPC.slider() function will create a slider in the small UI widget (that you'll see in the top right corner when you run your sketch), but will also create a variable in your code which will contain the selected slider value. The created variable will then have the same name as the string that you pass to the first parameter. You also need to specify a default starting value, a minimum value, a maximum value and the step amount, in that order. For example: ``` OPC.slider('seed', Math.floor(Math.random() * 1000), 0, 1000, 1); ``` This slider will create a variable called seed, with a random starting value in the range of 0 and 1000, and gets incremented by 1 when you drag the slider. You can now use the seed variable throughout your code. Now to resume with Okazz's method we need to declare a couple more things: ``` let pSeed = seed; let pParameter1 = parameter1; let pParameter2 = parameter2; ``` We need a placeholder value for each slider. This seems redundant but will make sense when we look at the draw function call: ``` function draw() { if (seed != pSeed || pParameter1 != parameter1 || pParameter2 != parameter2) { generate(); } } ``` Essentially, we will only call the generate() function if any of the slider values have changed. Here the generate() function is where we put all of the things that render graphics to the canvas. This generate function will also be called at the end of setup and when the window is resized: ``` function setup() { createCanvas(windowWidth, windowHeight); generate(); } function windowResized() { resizeCanvas(windowWidth, windowHeight); generate(); } ``` And then we just need to update the temporary values at the top of the generate function: ``` function generate() { pSeed = seed; pParameter1 = parameter1; pParameter2 = parameter2; randomSeed(seed); noiseSeed(seed); // if you make use of perlin noise also seed noiseSeed() // other stuff } ``` It's also important that you set your random seed here at the very top, this is to ensure that the same seed produces the same sketch every time the generate() function is run. I go into this a bit more in detail in a later section, but if we wouldn't set the random seed here, on a subsequent generate() calls we would get completely different sketches. Having discussed this necessary boilerplate component, we can move on to main pat of code that actually generates the visuals. This code will be contained within the generate function, and optionally also inside other helper functions that will be called from the generate function. ## Creating smooth polygons The main portion of the sketch consists of patterned layers, each of which has an opening in the shape of a deformed circle that gives way to the next layer. I've already written about deforming a circular shape with perlin noise [here](https://gorillasun.de/blog/Radial-Perlin-Noise-and-Generative-Tree-Rings?ref=gorillasun.de), however this time I did it a little differently reusing my [smooth polygon code](https://gorillasun.de/blog/An-algorithm-for-polygons-with-rounded-corners?ref=gorillasun.de) for a slightly different aesthetic that does not require perlin noise. If you're interested you can read up on it, but it is not necessary to understand the remainder of this post. Let's begin by positioning a couple of points in a circular fashion and offsetting them slightly by a random amount: We obtain a relatively pointy shape when we connect the vertices that we positioned. Here's where we'll reuse the smooth polygon algorithm, to shave off those pointy corners: And that's the beauty of reusing and building on top of code you've previously written! Here I knew exactly what shape I wanted and how I could achieve it, and it felt really good achieving it with a simple function call. ## Clipping out regions Next we will have a look at the rendering context's [clip()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clip?ref=gorillasun.de) function. Clipping here means cutting out a certain region/portion of the canvas, such that only things inside this specific region are visible, whereas everything that falls outside of it is hidden. Let's have a look at a quick example: Basically, using the clip() function consists of first drawing a shape that will constitute the clipping region, then calling the clip() function, and thirdly drawing whatever we want to have contained within the clipping region. Note that the shape you're clipping out needs to have a stroke for this to work. If aesthetically you don't want it to have stroke you can still set strokeWeight(0) and the region won't have a stroke. In this example, we're simply clipping out a few parallel lines to obtain something that looks like a hachure. Now we can chain these clip calls one after another to have several clip regions within each other, which is essentially how the circular openings in 'Behind the Canvas' were made. Here's an example of this: The thing of note here is that on subsequent clip calls we need to draw a clip region with a fill, such that it hides the pattern of previous layers which it overlaps. So far we've only done it with simple circles, let's combine it with the irregular shape that we've made earlier: IMPORTANT! Here, to improve visual separation, prior to making the clip call, we precede the clip region by the exact same shape, that is slightly larger and has a fill. This makes sure that the previous pattern doesn't overlap with the new one and has some padding in between itself and the previous layer. If we would use shapes that have no fill, we end up with something that looks like this: Which also makes for an interesting effect, but that's for another sketch. Ultimately, chaining clip calls might not be very intuitive. but it makes for a very interesting visual effect! And maybe you already noticed, but we could substitute the drawPattern() function for any other kind of pattern and it would still work, which is neat. Another visual improvement we can make is adding a slight shadow between layers, to make it seem as if previous layers are somewhat elevated with respect to subsequent ones. We can also make use of the rendering context for this: Here it gets a bit tricky, because we need an additional clip call. I wanted to have the slightly larger shape cast a shadow, for this we can hide an identical shape underneath itself and momentarily toggle on the shadow (using the shadowBlur parameter) and then toggle it off when we don't need it anymore. Finally let us add some color to the mix: And that should cover all bases for the main portion of the sketch! I won't go into too much detail on the patterns, but for hexagonal grids you can find my tutorial on them [here](https://gorillasun.de/blog/A-guide-to-Hexagonal-Grids-in-P5JS?ref=gorillasun.de), as well an OpenProcessing sketch on the main pattern [here](https://openprocessing.org/sketch/1483294?ref=gorillasun.de). ## Notes on preserving sketch determinism This is an aspect of the sketch where you really have to make sure that everything is done correctly. Having a few fxhash sketches under my belt, I've had a good amount of practice with this, but I still do get some situations where I have to scratch my head for a bit before I can figure out what's wrong. For example, I oftentimes make a random call within a for loop that depends on a variable that, well, varies over the course of the sketch, increasing or decreasing the number of random calls that are being made. This naturally breaks the determinism of the sketch. I intend to discuss this specific issue at length in an upcoming blog post, but I will give a few examples of things that should be avoided: ``` rand = random(W/5, W/2) ``` For example we can not have random calls that depend on another variable, it needs to be agnostic and should rather be written as follows: ``` rand = random(1/5, 1/2)*w ``` And another example that is not admissible, is having a varying number of random calls: ``` for(let n = 0; n < windowWidth; n+=step){ someFunction(random()) } ``` Here we would have to make sure that this for loop makes the same number of random() calls each and every time it is executed. This is tricky because what happens when you resize your sketch horizontally? You would either have to make the increment value 'step' scale with the window width, or make this loop independent from the window width altogether. There are a couple of strategies to approach this, but it will have to wait. ## Resizing and Rescaling This previous issue leads directly into how we handle scaling and resizing of the sketch, which was also one of the more tricky hurdles to overcome. I've come to the opinion that there isn't really a universal solution to this specific problem, and it really depends on how you want your sketch to behave when you resize it. An important factor to consider here, is how we tie the window dimensions into the random elements of the sketch as we discussed before. To exemplify this, let's make the sketch, that we have coded up to this point, window scale and size agnostic. Ideally, we would like to have our sketch span across the entire canvas, but keep the main portion centred and scale regardless of the aspect ratio. Let's setup our sketch in that manner: ``` function setup() { w = min(windowWidth, windowHeight) createCanvas(windowWidth, windowHeight); // other setup stuff generate() } function windowResized(){ w = min(windowWidth, windowHeight) resizeCanvas(windowWidth, windowHeight); } function draw() { generate() noLoop() } function generate(){ randomSeed(seed) // other stuff } ``` Here we create a canvas that takes up the entire window, and we make use of p5's windowResized function that triggers when the containing window is resized to adjust the canvas dimensions accordingly. We also keep track of the minimum dimension, which we will use in a second. Additionally, we reset the random seed at the top of the generate function such that the same random calls are made whenever it is rerun. And if you've had a keen eye you will also notice that there is noLoop() statement at the end of the draw function, in which case it shouldn't be redrawn when we resize the window. The resizeCanvas() function however calls the draw() function when it is done resizing the canvas dimensions. As for the the main shape, if we base our dimensions off of a variable that is tied to the screen dimensions, we can make all the drawn shapes adjust their size when redrawn, and here's an example to show how this works: ``` function generate(){ randomSeed(seed) translate(windowWidth/2, windowHeight/2) clipLayer(w/2) } function clipLayer(size){ verts = makeShape(size); roundedPoly(ctx, vertices, 9999); } function makeShape(R) { let vertices = []; for (a = 0; a < TAU; a += TAU / 9) { rad = random(1 / 2, 1) * R; x = rad * cos(a); y = rad * sin(a); vertices.push({x: x, y: y}) } return vertices } ``` We base the radius of the blobby shape off of the minimum dimension of the canvas, and this way ensuring that it will scale along with it, when the canvas is resized. [Here is an example](https://openprocessing.org/sketch/1525688?ref=gorillasun.de) in the OpenProcessing editor where you can see this in action, just drag the middle separator and observe how it behaves! ## Closing Notes If you've reached here, thank you for reading! I believe I touched upon all the facets of the sketch that were worth mentioning. Ultimately, what I've realised from projects like this one, is how important it is to complete them, even if you ultimately aren't 100% happy with them. In other words, you can only get better at the entire process, from ideation, to coding up initial versions, to releasing your final sketch, by going through the entire process several times. I think I will be much more confident with my next projects, having more experience as well as more reusable code to back me up in the future. And again, before my writing becomes unfocused, I am incredibly grateful to everyone who has collected an edition, as well as everyone who has shown me support on Twitter in any form or shape! Thank you, and happy sketching! ### A Guide to Hexagonal Grids in P5JS URL: https://www.gorillasun.de/blog/a-guide-to-hexagonal-grids-in-p5js/ Last updated: 2023-04-25T12:01:57.000Z ## One aspect of writing these posts, that I haven't quite mastered yet, is choosing titles. Ideally, I'd like to maximise the number of people that fall into the intersection of the Venn diagram comprised of 'those to whom my content is meaningful' and 'those that end up clicking on my website'. And my post titles are usually the most important factor! This time again, it was a doozy, since hexagonal grids are transverse to multiple fields. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/jewelsbanner-2.png) ## A little bit of Terminology Depending on the context, a hexagonal grid can be called a number of different things. However, for creative coding purposes I think that the term 'Grid' is the most fitting. When I started working on this post, I wanted to call it a 'A guide to Hexagonal lattices', but in some way that is misleading. Googling the term 'hexagonal lattice' yields a bunch of research papers, that study 'lattices' in the context of [Crystallography](https://www.mrl.ucsb.edu/~seshadri/old/Chem173B/galen%5F1%5Fcryst.pdf?ref=gorillasun.de), [micro structures](https://www.sciencedirect.com/topics/computer-science/hexagonal-lattice?ref=gorillasun.de) and other fields of science that I have absolutely no clue about. So even though the term lattice literally means 'and interlaced structure', it implies some sort of functional purpose. Interestingly, John Conway coined it the [hextille](https://en.wikipedia.org/wiki/Hexagonal%5Ftiling?ref=gorillasun.de). Which also has a nice ring to it, but I couldn't find out why, when or for what purpose he gave it this name. I assume he was studying different types of tilings. Hence, for geometric purposes we could also call it a 'hexagonal tiling' or 'hexagonal tesselation'. Note that the field of [Tesselation](https://en.wikipedia.org/wiki/Tessellation?ref=gorillasun.de) is not only interesting to those looking to decorate their bathroom, but it is in fact a vast and incredibly interesting field of mathematics. You can dip your toes into it with this [Veritasum](https://www.youtube.com/watch?v=48sCx-wBs34&ab%5Fchannel=Veritasium&ref=gorillasun.de) video. Lastly, we could also call it a 'Honeycomb' due to it's resemblance to a beehive's structure. Which term do you think is the most appropriate one? Terminology aside, I've made a list of three methods that one can use for the construction of such a grid. We'll discuss each one in the following sections. Here's a quick index: 1. [Drawing a Single Hexagon in p5](#drawing-a-single-hexagon-in-p5) 2. [Constructing a Hexagonal Grid](#constructing-a-hexagonal-grid) 3. [Hexagon Spiral](#hexagon-spiral) 4. [Spiral Method Compact](#spiral-method-compact) 5. [Recursive Method](#recursive-method) ## Drawing a Single Hexagon in p5 The first step we need to tackle, is how to actually draw a singular hexagon in p5\. I believe that the most sensible approach to doing so is by using trigonometry, and a property of equilateral polygons. A regular polygon satisfies two properties: it is equiangular and equilateral. Meaning that the value of it's vertex angles are equal, and it's sides are of equal length. In this manner, the vertices of any regular polygon, with any number of sides, all lie on a [common circle](https://en.wikipedia.org/wiki/Regular%5Fpolygon?ref=gorillasun.de). We can leverage this property to construct our hexagons (or any other regular polygon for that matter). A full circle has 360 degrees, or equivalently TAU radians (TAU == 2 \* PI). Constructing any regular polygon thus boils down to splitting 360 degrees by the number of sides that the desired polygon has. In the case of a hexagon, we divide a full rotation of 360 degrees by 6, ending up with a value of 60 degrees. We can now use this knowledge to position the hexagon vertices in an equiangular manner around a circle: ``` // Function that draws a hexagon (or any other regular polygon) // centerX and centerY determine where the polygon is positioned // the radius parameter determines the size of the enclosing circle // numSides specifies the number of the polygon's sides function drawHexagon(centerX, centerY, radius, numSides){ // p5 already has some functionality for drawing more complex shapes // beginShape tells p5 that we'll be positioning some vertices in a bit beginShape() // This is where the heavy lifting happens // Make equiangular steps around the circle depending on the number of sides for(let a = 0; a < TAU; a+=TAU/numSides){ // calculate the cartesian coordinates for a given angle and radius // and centered at the centerX and centerY coordinates var x = centerX + radius * cos(a) var y = centerY + radius * sin(a) // creating the vertex vertex(x, y) } // telling p5 that we are done positioning our vertices // and can now draw it to the canvas endShape(CLOSE) } ``` Go through the code and have a look at the comments, they should explain the purpose of every statement. We make use of P5's beginShape() and endShape() to draw our hexagon. Also make sure to add the 'CLOSE' statement in the endShape() function to close up our hexagon. Here's a condensed version of the function: ``` function drawHexagon(cX, cY, r){ beginShape() for(let a = 0; a < TAU; a+=TAU/6){ vertex(cX + r * cos(a), cY + r * sin(a)) } endShape(CLOSE) } ``` Since we're only going to draw hexagons, we can also omit the numSides input parameter. Also make sure to have a strokeJoin(ROUND) somewhere in your code, otherwise the corners of the hexagon will have little pointy horns! Next up is how to draw a bunch of hexagons and arrange them into a tightly packed grid. ## Constructing a Hexagonal Grid At first I wanted to call this the 'naive' way of constructing a hexagonal grid, but I don't think it deserves to be labeled as such, since occasionally it has advantages over the following methods (depending on the sketch you might want to do it this way). I believe that the caveat here is thinking of a hexagonal grid, just as a 'grid', when it is a lot more than that! Essentially, we'll construct our grid with a nested for loop, in the same manner that we would construct a rectangular grid: Ok, so we got a grid... but it doesn't look right at all! The hexagons are arranged, just as if they were sitting on top of a rectangular grid. After all, we programmed it in the same way. We'll have to make a couple of modifications! Also note that we are dividing the value passed to the drawHexagon() function by two, since we need to pass a radius and not a diameter. First, let's horizontlly space out this grid a little more. We can do so by multiplying the increment of the inner loop by 1.5: ``` for(x = 0; x < gridWidth; x+=hexagonSize*1.5){} ``` Next up, we'll have to offset every other row. To accomplish this we can keep track of the row number with an additional 'count' variable: ``` function makeGrid(){ count = 0 // init counter for(y = 0; y < gridHeight; y+=hexagonSize){ for(x = 0; x < gridWidth; x+=hexagonSize*1.5){ drawHexagon( x+hexagonSize*(count%2==0)*0.75, y, hexagonSize/2 ) } count ++ // increment every row } } ``` Here we're using a little boolean trick to add a horizontal offset whenever the count variable is even! (so basically every other row). We could do it in the following manner: ``` if(count%2 == 0){ drawHexagon(x + hexagonSize*0.75, y, hexagonSize/2) }else{ drawHexagon(x + hexagonSize, y, hexagonSize/2) } ``` This is a bit wordy, and can be replaced by the little statement (count%2==0), which will evaluate to 1 when it's true and 0 when it's false. And since we're wrapping it in parentheses and enclosing it with arithmetic operators, it will be parsed as an integer. Hence when it is true, the offset is applied, otherwise the offset gets multiplied by zero and has no effect on the overall position. Neat, right? The overall grid looks a bit better now, but we're not quite there yet, we need to lessen the vertical distance between the rows, which can be done by dividing the vertical increment by a value of 2.3: ``` function makeGrid(){ count = 0 for(y = 0; y < gridHeight; y+=hexagonSize/2.3){ for(x = 0; x < gridWidth; x+=hexagonSize*1.5){ drawHexagon( x+hexagonSize*(count%2==0)*0.75, y, hexagonSize/2 ) } count ++ } } ``` And we end up with a neatly packed hexagonal grid! Here is a working example, try to change the hexagonSize parameter and see the grid at different scales: ## Hexagon Spirals ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/abstractvegetation.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/abstractvegetation2.png) Rather than drawing a grid in a top down, left to right manner, this method starts at a given point and paves it's way outwards spiraling around the already drawn hexagons. Here's a visualization of how this works: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/spiralgrid.gif) Here's one way to create this hexagon spiral, that simply makes use of a number of sequential for loops to do so: ``` // modified from: https://stackoverflow.com/a/2143499 function makeSpiral(centerX, centerY, size, count){ var x = 0; var y = 0; s = size/1.75 push() translate(centerX, centerY) drawHexagon(centerX, centerY, size/1.75) for(let n = 0; n ``` This is pretty straightforward, we are stepping around an initial hexagon paving our way with other hexagons outwards. We do this by incrementing two counters x and y that specify the position of the drawn hexagons (we need to multiply by the hexagon size to get the right spacing). The further out we go the more hexagons we need to draw on a line/side, this is determined by the variable 'n' in the outer loop. In this manner the count variable controls the number of hexagons that will be found on the longest outer side of the final hexagon cluster. However, if you run this snippet as is, you'll notice that the final cluster doesn't quite look right: We still need to apply a transform to the position of the drawn hexagons and skew them into the right spot. In that manner our hexagon function becomes: ``` function drawHexagon(cX, cY, r){ hx = cX + cY/2 hy = sqrt(3)/2 * cY beginShape() for(let a = TAU/12; a < TAU + TAU/12; a+=TAU/6){ vertex(hx + r * cos(a), hy + r * sin(a)) } endShape(CLOSE) } ``` And a working example of this: You still might need to add a final loop that completes the missing chunk of the honeycomb. If you want your grid to feel the entire canvas, I would opt for the grid method, since it won't draw unecessary hexagons offscreen. ## Spiral Method Compact If you don't like 6 separate for loops, we can do the same thing with only one and a tricky calculation. Here goes the compacter version: ``` // modified from: https://stackoverflow.com/a/43913544 function makeSpiral(centerX, centerY, radius, count) { var x = centerX var y = centerY var angle = TAU / 6 var side = 0 drawHexagon(x,y,size/1.75) count--; while (count > 0) { for (var t = 0; t < floor((side+4)/6)+(side%6==0) && count; t++) { y = y - radius * cos(side * angle); x = x - radius * sin(side * angle); drawHexagon(x, y, size/1.75); count--; } side++; } } ``` Essentially we're still doing the same thing! Similarly to it's little sibling, we're stepping in a spiral around our initial hexagon, gradually going outwards, but with the different that we do all of this with a single for loop! Here we also keep track of our position with the x and y variables: ``` y = y - radius * cos(side * angle); x = x - radius * sin(side * angle); ``` The variable 'side' being the indicator that tells us in which direction we need to step next (multiplied by the angle). Now the inner for loop just needs to be able to determine how many steps we need to take before we are required to increment the side variable and change direction. This is accomplished in the condition statement of the for loop and is a bit heavy to digest, so let's go through it step by step! Let's have a look at what this calculation does: ``` floor((side+4)/6)+(side%6==0) ``` The best way to explain this is by going through the first couple of iterations of the for loop. Say the 'side' variable is 0 at the very beginning, then the statement floor((side+4)/6) will evaluate to zero and the statement side%6 == 0 evaluates to 1 because it is true. In this case we will draw exactly one hexagon located straight above our initial hexagon (because 0 \* TAU/6 is 0): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2-3.png) Next we decrement the count variable and increment the side variable (note that the side variable gets incremented outside of the for loop). Repeating the same thought process we proceed: floor((side+4)/6) will again evaluate to 1\. In fact, it will evaluate to 1 for the first 5 iterations. Only on the 6th iteration will it evaluate to 2, since we need to step in the same direction twice: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/6th.png) Essentially the neat little formula in the for loop condition tells us how many steps we need to take in one direction, before we should increment the variable 'side' and make a turn paving new hexagons onto a new side of the hexagonal spiral. Why do we need (side%6==0) in the condition? Well, every loop we make around, we're gonna need one extra additional hexagon to begin a new lap around. This happens when the 'side' variable assumes a multiple of 6\. So basically, every time we complete six sides. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/conditionimg.png) And this wraps up the spiral method! This one is probably my favorite of the three methods, since it allows for some fun shenanigans in animations, especially in SDFs we can pass the spiral index of the hexagons, and have some outward, or inward going motion. ## Recursive subdivision method ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/bubblepop2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/bubblepop3.png) This is actually the first time that I write about a recursive method on the blog. So for the uninitiated, a function is denoted as 'recursive', when said function invokes itself from within itself. Naturally, if done wrong, you'll end up with your machine exploding! But when done correctly you can achieve some pretty neat results, and often feels really satisfying! Hence, to achieve a recursive hexagonal grid, we'll construct it in the following manner: ``` function recursiveHexagon(cX, cY, depth, r){ if(depth == 0){ drawHexagon(cX,cY,r) }else{ for(let a = 0; a 0){ recursiveHexagon(cX,cY,depth-1,r/2) recursiveHexagon(x,y,depth-1,r/2) } } } } ``` Generally, recursive methods consist of two parts, namely a 'base case' and a 'recursive step'. The recursive step, is simply the part where the function calls itself. The base case on the other hand serves to protect from a problem that often occurs with recursive methods. The base case prevents the recursive function calling itself in an infinite loop, and usually terminates execution, such that the pending function calls can resolve (similar to the stack in MTG). For our purposes we make use of a parameter called 'depth', that gets decremented by 1 each recursive call, by passing 'depth - 1' to the recursive call. If this depth parameter becomes zero, we stop recursing. Note, that our method actually makes 6 recursive calls! Here's how this works: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r0.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/r4.png) Hexagons have this beautiful self-symmetric property, that you approximately get another hexagon when you place a half-size hexagon at each vertex of the original hexagon! (plus one at the center) We leverage this for our recursive method, each call placing smaller hexagons at the vertices of the previous ones. Here's a working example: Here, the base case is when we reach a depth equal to 0\. If that is the case we simply draw a hexagon with a radius of r. If that is not the case, we replace our hexagon by 7 new recursive calls, that will either terminate with the base case, or keep recursing until the base case is reached. Thus, simply by setting the 'maxRecursionDepth' paramter, we can control how many subdivision we want to achieve. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rr1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rr2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rr3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rr4.png) Hope this post was useful to you and gets you started with your own hexagonal endeavors. There so much more to explore down the line with regarding tesselation and hexagonal arrangement. Even Truchet tiling is applicable! I hope you enjoyed this post, learned something new and/or got inspired! Happy sketching! Here are a couple more sketches based on hexagonal grids: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flowers.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/jap.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/jestercap.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/roses.png) Additionally, if you want a really extensive resource on hexagonal grids, that is sort of more oriented towards game development, you should definitely check out [this page by redblobgames that's been constantly updated over the course of several years](https://www.redblobgames.com/grids/hexagons/?ref=gorillasun.de#:~:text=In%20the%20pointy%20orientation%2C%20a,from%20sin%2860%C2%B0%29.&text=The%20horizontal%20distance%20between%20adjacent,is%20h%20%2A%203%2F4%20.)! ### Making of Vestige URL: https://www.gorillasun.de/blog/making-of-vestige/ Last updated: 2023-04-25T12:02:02.000Z ## A bit of history Ever since I've come across Tyler Hobbs' essay ['How to hack a painting'](https://tylerxhobbs.com/essays/2020/how-to-hack-a-painting?ref=gorillasun.de), I've been utterly obsessed with simulating watercolor-esque textures in p5\. Following the pointers in the essay and spending a long time experimenting and tweaking I think I've had some success at it. Here's one render that I'm really proud of: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/painterly.jpg) *Painterly* Some have described this texture as 'painterly', which I think is an apt description. I reused tweaked versions of this technique on several occasions, such as the 30th prompt of genuary: 'Organic looking output only using rectangles'. In some way this was a little bit of a flex, but also a demonstration of the versatility of this technique: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Furboland.png) *Organic looking output using only rectangular shapes* ## Making of Vestige This technique was the starting point for vestige. Depending on the positioning, the number of layers and the type of shape used, you can obtain various different textures. Even though it takes a moment to run, the generated backgrounds are so much more interesting than plain regular background: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/watercol-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/watercol2.png) This type of layering also enabled me to get away with bolder color choices, in that manner each Vestige is assigned two random color palettes that will be used to color the different regions of the background. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/watercolor.png) In some of them it might be a bit more obvious than others, but we partition the background in horizontal regions. Each region obtains two distinct colors, one to color the top part and another than colors the botton part: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regions.png) In each of these regions we'll draw many rectangles, and randomize their shape and size. This looks very ugly, but we're not done just yet. Next we'll have to play with the transparency of the color. In p5 the fourth argument of the fill() and stroke() function calls allow you to control this transparency. Let's try assigning a random value between 0 and 255 to this channel: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regionstransp255.png) This doesn't change much, since if only one of the drawn rectangles obtains an alpha value of 255, the other transparent layers won't affect it anymore. We need to bring this range way down so that. Here the alpha value can obtain a random value between 0 and 6: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regionstransp6.png) Afterwards we can also play a bit with the blend mode in p5, such that prior to drawing some rectangles we call a different blendMode than the default BLEND one. Here I give a 50/50 chance to using the HARD\_LIGHT and BLEND blend modes. The difference is subtle however: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regionsblend.png) And to glue everything together we need to add some grain. Now we have a noticeable difference, and obtain these silky smooth and grainy gradients: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/regionsgrain.png) ## Ancient writing System ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/25.png) *Vestige #25* However interesting, these backgrounds are a bit bland. I wanted to decorate them a little, and make them visually a bit more interesting. One of my first ideas was to add cracks and fissures reminiscent of an old, brittle wall. After initial version, my partner commented and said "What is this? Some kind of ancient writing system?", and I liked that idea so I leaned into it. Instead of utilizing regular lines or dashed ones (that can be achieved through the drawingContext), I made my own! For this process we also step through the canvas from the left to right, then in each of these sections we randomly choose a starting point for our line (we position it somewhere in the upper half of the canvas) and an end point (somewhere in the bottom half at random): ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/crackspoints.png) Then we'll draw points downwards from the starting position until we hit that second point. For now, this looks just like a line: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/crackslines.png) But now we have some options to customize it's style. Let's add some swing to it with a slight sine wave: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cracksswing.png) Next we can build in some rules to control the size of the drawn dots. We can do this with good old perlin noise: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cracks1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cracks2.png) As you notice this line disconnects sometimes and then picks up again, we can do this with a clause that checks if the returned perlin noise value at the coordinate of a certain point drops below a certain threshold. Doing so at different scales allows for different line styles. Next we can add some ornamentation, for example we could sprout some branches at random: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cracksbranch.png) Or other ornametations that briefly interrupt the flow of the line: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/crackscirc.png) And finally some ornamentations in between the lines: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cracksornament.png) Putting all of this together we can obtain a variety of outputs. I spent far too long just refreshing my browser to see 'just one more' version. Here are a few random ones: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rand.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rand2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rand3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rand4.png) ## Mint Reveals This wasn't a very technical post, but maybe it gave you some insight into what went into the making of Vestige. Vestige was minted as a [generative token on fxhash](https://www.fxhash.xyz/generative/slug/vestige?ref=gorillasun.de) and here a few more of my favorite mint reveals: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/16-2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/22.png) Vestige #16 & #22 ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/81.png) *Vestige #81* ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/93.png) *Vestige #93* Thanks for reading and happy sketching! ### An Algorithm for Polygons with Rounded Corners URL: https://www.gorillasun.de/blog/an-algorithm-for-polygons-with-rounded-corners/ Last updated: 2023-04-25T12:02:09.000Z ## Quick Index 1. [Introduction: An algorithm for rounded corners](#introduction:-an-algorithm-for-rounded-corners) 2. [Credit where credit's due](#credit-where-credit's-due) 3. [An intuitive explanation of the algorithm](#an-intuitive-explanation-of-the-algorithm) 4. [Breakdown of the algorithm](#breakdown-of-the-algorithm) 5. [Two Vectors from three Points](#two-vectors-from-three-points) 6. [Calculating the angle using the cross product](#calculting-the-angle-using-the-cross-product) 7. [Ambiguity of the cross product](#ambiguity-of-the-cross-product) 8. [Positioning the circle](#positioning-the-circle) 9. [The rendering context](#the-rendering-context) 10. [Drawing the final shape](#drawing-the-final-shape) ## Further Improvements 1. [Blindman67's method using p5 vectors](#blindman67's-method-using-p5-vectors) 2. [Dave's acceleration method](#dave's-acceleration-method) 3. [Dave's Bezier curve method](#dave's-bezier-curve-method) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Sand.gif) ## Introduction: An algorithm for rounded corners If you spent some time doing creative coding, you'll very quickly come to the realization that anything, which has a shape that is little more complicated than your average rectangle or circle, quickly starts requiring a fair amount of code to be summoned onto your canvas. This post/tutorial was initially sparked by a snippet of code that I've found on stackoverflow. In the past months, this algorithm has unlocked a number shapes and sketches for me, that I otherwise wouldn't have been able to make. In essence, the algorithm allows you to create arbitrarily shaped polygons, with any number of vertices while at the same time being able to control the roundness (or curvature) of each vertex. I came across this code when I attempted a sketch in which I wanted to round off the corners of some triangles: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/1-3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/2-4.png) In p5js there is no out-of-the-box method for doing so, except when it comes to rectangular shapes, where the 5th to 8th parameters can be used for that purpose. You could technically do it with a series of curveVertex() calls, however that strategy doesn't offer much control. Here's another sketch that I made during #GENUARY2022, which also makes use of the same algorithm, even if it might not be as obvious: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/4dunes.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/9dunes.png) You can notice that you can even mix between pointy corners and round corners, which is another thing that isn't possible with pure p5js (without writing a lot of additional code towards that end). This definitely came in clutch this Genuary. The remainder of this post will walk you through this really cool and useful algorithm, step by step. ## Credit where credit's due The code discussed in this post stems from this [stackoverflow answer](https://stackoverflow.com/a/44856925?ref=gorillasun.de) by stackoverflow user [Blindman67](https://stackoverflow.com/users/3877726/blindman67?ref=gorillasun.de). (Go give him some upvotes on his answer if you find this useful!) Blindman67 explains his strategy succinctly, and is more than sufficient for you to start using his code. But for the sake of REALLY understanding the algorithm, we'll recreate it from scratch based off of his explanation and analyzing his code! There are a number of noteworthy things going on, that are worth inspecting in more detail, and can be generalized to a number of other scenarios. ## An intuitive explanation of the algorithm We'll begin with an intuitive depiction of what the algorithm is accomplishing. The idea behind what we're trying to do is generally simple: We're going to take an imaginary circle of a certain radius, and push it as far as possible into a corner (any kind of corner, not necessarily 90 degrees) that we're trying to round. Next, we erase the lines that form the pointy corner, starting from the place where they are tangential to the imaginary circle, and close the shape again by tracing the outward facing portion of our circle. And voila, we have obtained a rounded corner with a specific radius. Seems straightforward, right? However, to accomplish this there are a number of steps that we need to follow. ## Breakdown of the algorithm Given a specific radius, the difficulty lies within finding where to exactly position the circle that rounds the corner to that radius. If we can exactly pinpoint where this circle is positioned, we can also determine where it is tangential to the lines that form the pointy corner. Those two points will determine the start and end of the arc that will form the rounded corner. Overall, given three points A, B and C that form a corner, as well as a given radius, the steps are: 1. Converting 3 points into 2 vectors 2. Calculating the angle between those two vectors 3. Calculating and locating the half-angle between the two vectors 4. Finding the distance from the circle center to the corner 5. Drawing the arc ## Two Vectors from three Points First we'll need to find the value of the angle that is formed by three points. To do so we first need to turn these 3 points into two vectors. For three points A, B and C we can find the vectors BA and BC by using the following function: ``` // p1 -> first point // p2 -> second point // v -> container that we will fill // we could also not pass v and simply return it function toVec(p1, p2, v) { // center the vector based on the coordinates of p2 (the point B in this case) v.x = p2.x - p1.x; v.y = p2.y - p1.y; // compute magnitude (length) of the vector v.len = Math.sqrt(v.x * v.x + v.y * v.y); // alternatively and more concisely v.len = Math.hypot(v.x, v.y); // normalized coordinates v.nx = v.x / v.len; v.ny = v.y / v.len; // calculate the angle v.ang = Math.atan2(v.ny, v.nx); } ``` The comments should be sufficient to understand what is happening, we also use the atan2() function to calculate the angle of the vectors with respect to the zero angle. For simplicity's sake we'll make the origin at the center of the canvas. To fill our vector containers, we can do as such: ``` function setup() { w = min(windowWidth, windowHeight) createCanvas(w, w); } function draw() { background(220); // make origin at center of canvas translate(w/2,w/2) p1 = {x: 100, y: 0} p2 = {x: 0, y: 0} p3 = {x: 0, y: -100} strokeWeight(5) point(p1.x,p1.y) point(p2.x,p2.y) point(p3.x,p3.y) v1 = {} v2 = {} toVec(p1,p2,v1) toVec(p3,p2,v2) noLoop() } // p1 -> first point // p2 -> second point // v -> container that we will fill function toVec(p1, p2, v) { v.x = p2.x - p1.x; v.y = p2.y - p1.y; v.len = Math.hypot(v.x, v.y); v.nx = v.x / v.len; v.ny = v.y / v.len; v.ang = Math.atan2(v.ny, v.nx); } ``` You might ask, why we're not doing this with p5js's inbuilt vector class? And fret not, at the end of this post well go over an alternative version where we use the class with all it's functionalities. Now that we have converted our 3 points into vector form, we can tackle computing and locating the intermediary angle between the two vectors! ## Calculating the angle using the cross product ### Explanation Getting the halfway angle is probably the trickiest part of the procedure, and requires a number of steps. There probably are multiple ways to do so (more on that later), but for starters we'll begin with the method deduced from Blindman67's code. It will require us to freshen up on our linear algebra a little bit, specifically on the cross product of two vectors. We'll be heavily exploiting the formula of the cross product to compute the value of the formed angle, as well as where it is located with respect to the two vectors. What the cross product actually represents algebraically, is a bit outside of the scope of this post. A perfect resource for understanding it can be found in the form of [this video](https://www.youtube.com/watch?v=eu6i7WJeinw&ab%5Fchannel=3Blue1Brown&ref=gorillasun.de) by [3Blue1Brown](https://www.youtube.com/channel/UCYO%5Fjab%5FesuFRV4b17AJtAw?ref=gorillasun.de) (I don't think there's a need for me to introduce his channel). The important part here is how the cross product can help us find the angle between two vectors, and what problems arise from this method. Given two vectors, we observe two angles, one that is less than 180 degrees, and another 'reflex' angle larger than 180 degrees. Our task is thus finding the angle that allows us to draw an arc, such that we can trace it and round off the pointy corner. We can only round off a corner if we select the angle that has a value less than 180 degrees. In this manner, we also need to determine the correct drawing order. We're going around the polygonal shape in a clockwise manner, but depending if the angle is concave or convex (curved inwards vs being curved outwards), we'll have to sometimes draw our arcs in a counterclockwise manner. To this end, calculating the value of the angle is not sufficient, we need an additional indicator that tells us how the second vector BC is situated with respect to the first one BA. For this we can use the cross product of BC and the perpendicular line to BA. More on that in a bit. ### The Math Generally the formula for finding the cross product, is the product of the magnitudes of our two vectors, with the sine of the angle that they form. More concretely: \\( \\Vert BA \\Vert \* \\Vert BC \\Vert \* sin( \\Theta ) \\) This means that, finding the cross product requires us to already have the angle... who's value we're trying to find. Now, if we were to somehow already have the numerical value of the cross product, we could solve for \\( sin( \\Theta ) \\), since we also already have the magnitudes of the two vectors concerned \\( \\Vert BA \\Vert \\) and \\( \\Vert BC \\Vert \\). Luckily, there is another way to find the numerical value of the cross product! It is actually equal to the determinant of the 2x2 matrix formed by these vectors. This means computing this determinant will allow us to find the angle by solving the previous formula! Computing the determinant of a matrix is done as follows: \\( v\_{1}x \* v\_{2}y - v\_{2}x \* v\_{1}y \\) Then the value of the angle can be calculated as follows: \\( \\Theta = sin^{-1}(\\frac{v\_{1}x \* v\_{2}y - v\_{2}x \* v\_{1}y}{\\Vert BA \\Vert \* \\Vert BC \\Vert}) \\) If you're not familiar with the inverse sine function, it simply does the reverse operation that a regular sine function does. So for example, a sine function will accept a value between -PI/2 and PI/2, and return a value that ranges between -1 and 1\. The inverse function will accept values between -1 and 1 and return an angle that ranges between -PI/2 and PI/2. This formula can be further simplified! Since our vectors are already normalized \\( \\Vert BA \\Vert \* \\Vert BC \\Vert \\), they will simply evaluate to 1, leaving us with: \\( \\Theta = sin^{-1}(det) \\) Which is thus simply the inverse sine of the determinant. Now let's implement this. ### The Code The code for all of what we have discussed in the previous section is relatively... tame, and can essentially be summarised in a single line! Let's have a look at Blindman67's code: ``` // compute and store our 2 vectors toVec(p2, p1, v1); toVec(p2, p3, v2); // Cross product of the two vectors - what we discussed in the previous section sinA = v1.nx * v2.ny - v1.ny * v2.nx; // Cross product of v2 and the line at 90 degrees to v1 // This is necessary and will help determine where to exactly position the center of the circle sinA90 = v1.nx * v2.nx - v1.ny * -v2.ny; // Clamping the value of sinA to avoid NaNs angle = Math.asin(sinA < -1 ? -1 : sinA > 1 ? 1 : sinA); ``` We already discussed at length the first calculation that computes the variable sinA. The second line computes the cross product of the perpendicular line to BA and the vector BC. In actuality, we don't need to create a separate vector for this perpendicular, we can simply exploit the fact that the dot product of two vectors is zero when they're perpendicular. A vector perpendicular to BA would be simply one that has it's x and y values flipped, in addition to having one of their signs flipped. For example: ``` zeroDotProduct = v1.nx*(-v1.ny) + v1.ny*v1.nx ``` Of course it also matters which coordinate's sign we flip, because it determines which perpendicular we're selecting (the one at 90 degrees or the other one at -90 degrees). If we flip the other sign, we'll would have to proceed differently in the calculations that follow. Another tricky part here, I found to be the nested ternary check inside the inverse sine function. By simply expanding it, we visually get some clarity: ``` if(sinA1){ angle = Math.asin(1) }else{ angle = Math.asin(sinA) } ``` Go ahead a try putting values lesser than -1 or greater than 1 into the inverse sine function. It'll yield a NaN value. To avoid such thing, we simply clamp the value and can be done compactly as a one liner. And if you noticed, in actuality, we have already obtained the value of the angle! ## Ambiguity of the cross product There's a couple more steps that we have to do to go through to get the correct half angle between our two vectors. We'll start with this if/else flurry to determine the orientation of our angle: ``` radDirection = 1; drawDirection = false; if (sinA90 < 0) { if (angle < 0) { angle = Math.PI + angle; } else { angle = Math.PI - angle; radDirection = -1; drawDirection = true; } } else { if (angle > 0) { radDirection = -1; drawDirection = true; } } ``` In essence, the information that we're trying to find here, is where exactly the center of the circle is located (the angle or it's reflex) as well as the correct drawing order of the arc (clockwise or counter clockwise). This is what the above if/else block takes care of. Let's for a second assume that the angle that we have calculated is sufficient, and simply halve it to find the bisector: Run the snippet a couple of times and take note of where the red line falls, it only gets it right when the angle is acute. We do not get the correct bisector when the angle is obtuse. Hence, we need another indicator to be able to determine where to position the center of the circle. For this purpose we can use the cross product of the angle formed by the perpendicular of BA and the vector BC that we previously calculated. Simultaneously observing where that perpendicular falls with respect to BC, by inspecting the sign of these two cross products we can pin point where the bisector is located. Let's examine the different scenarios that arise: #### When sinA90 < 0 and sinA > 0 When sinA90 is larger than 0, and sinA is less than 0, then we can conclude that the perpendicular lies in between BA and BC, and the vectors BA and BC form an obtuse fan. In this case we need to add PI to the angle before halving it to obtain the correct half angle. #### When sinA90 < 0 and sinA > 0 In this case the angle formed is also an obtuse fan, but the perpendicular does not lie in between BA and BC. In this case we need to subtract the angle from PI and also invert the drawing order (this is what radDirection and drawDirection are used for). #### When sinA90 > 0 In this case the angle formed is an acute wedge, and we need to distinguish the two cases where the vector BC lies in between BA and it's perpendicular aka sinA < 0 and when it's not aka sinA > 0, and in the latter case we need to invert the drawing order. If that explanation wasn't enough mental gymnastics, then feel welcome to sketch out a couple of angles and work them out by yourself. Important to keep in mind that if we were to select the other perpendicular, we then would have to flip some of the checks. #### Example Here's an example of this in action. Observe the position of BC, BA and it's perpendicular as well as the values of sinA and sinA90\. The assumed drawing order is clockwise starting from BA, going to BC: If you've followed until here, then congrats, the hardest part is past us! #### Simpler way to calculating the angle? Now these are a lot of hoops to go through for simply calculating. If you want to have a simpler way of finding that angle you can use: ``` // vectors should be normalized angle = atan2(v2.y, v2.x) - atan2(v1.y, v1.x) if (angle < 0) { angle += 2 * PI;} ``` However, this isn't sufficient to figuring out the correct drawing order of our arc. We'll go over a simpler way to our strategy later in this post. #### A visual example To conclude this section, here's a visual example of why this is necessary. If we were to ignore the correct orientation and drawing order of the arcs we would end up with weird behaviour: ## Positioning the circle The next step is finding the distance from the circlecenter to the coordinate of the corner: ``` lenOut = abs(cos(halfAngle) * radius / sin(halfAngle)); ``` Here, instead of finding the distance of the circle center F to corner point B, we're directly finding the distance from the corner point B to the tangential points E and F. For this we're making use of the formulas that can be applied for finding the length of the hypotenuse, which is designated by BF. We then have \\( BF \* cos(\\Theta) = BE \\) and \\( BF \* sin( \\Theta) = FE \\). Using these two formulas we find the formula that Blindman67 used: \\( \\frac{BE}{cos(\\Theta)} = \\frac{r}{sin(\\theta)} \\) And here we also have the value of the radius (that we specified): \\( BE = abs( \\frac{cos(\\Theta) \* r}{sin(\\theta)}) \\) One problem here is that the radius that we specified as input, might not fit into the corner. Since it could techincally be longer than the edge itself. This can be remedied with the following check: ``` if (lenOut > min(v1.len / 2, v2.len / 2)) { lenOut = min(v1.len / 2, v2.len / 2); cRadius = abs(lenOut * sin(halfAngle) / cos(halfAngle)); } else { cRadius = radius; } ``` Once this is dealt with, we can calculate the coordinates of one of the tangential points to the circle: ``` x = p2.x + v2.nx * lenOut; y = p2.y + v2.ny * lenOut; ``` Then move along the perpendicular to find the circle center: ``` x += -v2.ny * cRadius * radDirection; y += v2.nx * cRadius * radDirection; ``` Note that this also depends on the direction that we determined earlier. ## The rendering context For drawing purposes we will make use of the javascript canvas rendering context interface, which allows us to draw all sorts of shapes. You can find an extensive documentation [here](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D?ref=gorillasun.de). To do so we need to invoke the context, usually I do this in the setup function, as such: ``` function setup(){ ctx = canvas.getContext('2d'); } ``` And then we can make use of it to draw stuff: For our purposes we'll only need to use one function, namely the ctx.arc() call: ``` ctx.arc(x, y, cRadius, v1.ang + Math.PI / 2 * radDirection, v2.ang - Math.PI / 2 * radDirection, drawDirection); ``` Where the first two parameters are the coordinates of the arc center, followed by the radius in third place, and the starting and end angle in fourth and fifth position. the last input specifies if this arc is drawn in clockwise or counter clockwise manner. ## Drawing the final shape The final shape will be drawn by looping through the set of points that make up the vertices of our polygon. Here's a condensed version of this loop with the calculations omitted: ``` ctx.beginPath(); len = points.length; // initial point is the last point of the shape p1 = points[len - 1]; for (i = 0; i < len; i++) { p2 = points[(i) % len]; p3 = points[(i + 1) % len]; // Calculations go here // get the next set of points p1 = p2; p2 = p3; } ctx.closePath(); ctx.stroke() // add an outline to the shape ctx.fill() // add color to the shape ``` In this manner, the first point is actually the last vertex of the polygon. The final shape would then be drawn by first positioning all of your vertices, and storing them in an array, in the following manner: ``` vertices = [] vertices.push({x: coordX, y:coordY}) // add more vertices etc... ``` And then passing the array to the drawing function: ``` drawRoundPoly(ctx, vertices, radius) ``` The final snippet of code that you would then use, is the one provided by Blindman67\. Here's a minimal example: Also notice that you can additionally pass a 'radius' to each individual vertex to override the main radius passed to the function call. # Further Improvements First off, huge thanks to [Dave](https://twitter.com/davepvm?ref=gorillasun.de) and [Clay](https://twitter.com/clayheaton?ref=gorillasun.de) from the birbsnest for the feedback! Thanks to Dave (who's a freaking coding wizard), you're getting three additional sections here, firstly we'll update the method that we've discussed so far using the inbuilt p5 vector class and it's functionalities, and secondly we'll have a look at the solution Dave came up with for rounding off corners. He also shared a version using Bezier Curves! ## Blindman67's method using p5 vectors Rather than defining our own asVec() function, we can make use of the p5 vector class and the functions that come along with it. In that manner we declare our vector BA and BC like this: ``` p2 = points[i % len]; p3 = points[(i + 1) % len]; A = createVector(p1.x, p1.y); B = createVector(p2.x, p2.y); C = createVector(p3.x, p3.y); BA = A.sub(B); BC = C.sub(B); ``` Next we can compute the angle and the angle of the perpendicular in the following manner: ``` // need to call copy() because most vector functions are in-place BAnorm = BA.copy().normalize(); BCnorm = BC.copy().normalize(); sinA = -BAnorm.dot(BCnorm.copy().rotate(PI / 2)); sinA90 = BAnorm.dot(BCnorm); angle = asin(sinA); ``` Note that we have to call the copy() function prior to functions such as normalize() and rotate(), as they will mutate and alter the vector itself. Hence we create two normalized copies of BA and BC, since we'll need to use their magnitudes later on again. Also note how we're now calculating the dot product rather than the cross product! It's still the same calculation, but for convenience it's easier to do it in that manner. This is derived from the fact that the dot product of two vectors is equal to the cross product of one of these vectors and the perpendicular to the other vector. So we simply rotate one of them by 90 degress and compute the dot product. Same for sinA90. The rest of the code is identical to what we had before, with the exception that we're solely using the p5 vector properties and functions: This makes it a little more compact, but also less readable. ## Dave's acceleration method After asking for feedback on [Raph's](https://twitter.com/sableRaph?ref=gorillasun.de) discord and discussing the previous method a little, Dave pointed out that an alternative way to knowing the drawing order would be using the curvature vector's direction. Rather than using the positions of BA and it's perpepndicular with respect to BC, and doing this check: ``` (radDirection = 1), (drawDirection = false); if (sinA90 < 0) { angle < 0 ? (angle += PI) : ((radDirection = -1), (drawDirection = true)); } else { angle > 0 ? ((radDirection = -1), (drawDirection = true)) : 0; } ``` We can do this: ``` accelDir = BAnorm.copy().add(BCnorm) radDirection = Math.sign(accelDir.dot(BCnorm.rotate(PI / 2))) drawDirection = radDirection === -1 ``` We obtain the curvature vector by adding BA and BC, and this vector will generally always point into the direction of the circlecenter. Now we only need to determine if we need to draw the arc in a clockwise or counterclockwise direction. For this we recycle our previous check and observe where the curvature vector falls with respect to BC. The drawing order can then be deduced from the arc direction! Here's a sketch where we visualize these curvature vectors: ## Using Bezier vertices And for the final alternative method, Dave wrote [this method](https://editor.p5js.org/davepagurek/sketches/AwgpGbabn?ref=gorillasun.de) that relies on the bezierVertex() function in p5: And that's a wrap! If there are any unclear notions, mistakes or questions, feel free to leave me a comment or reach out to me on social media! If you find this post useful, consider supporting me by sharing it or following me on my social medias. Otherwise, cheers and happy sketching! ### Gorilla Sun 2021 URL: https://www.gorillasun.de/blog/gorilla-sun-2021/ Last updated: 2023-04-25T17:03:58.000Z I'm writing this as I'm scrolling down through my Twitter timeline, and it's been hands down an amazing year for me and for the Gorilla Sun Blog! I originally made this site, to have a platform through which I could share my ideas and creations, of whatever nature they may be, as well as being able to communicate with like-minded people and exchange ideas with them. And I think I have somewhat achieved that goal in the past year, through this blog and especially through Twitter and the creative coding community on there. It's been the first time that I actually enjoy using social media, feeling like I am using it for a purpose, and not simply being a consumer. I'd like to recap the past year in this post, in terms of sketching and Twitter events, with some random personal ramblings thrown into the mix. I think it will be nice to look be able to look back at all my sketches from a specific year, and see how I progressed with time, as well as how certain ideas evolved into different things. Hence, I'll use this recap as an excuse to be a little bit more personal, to present my artisitc endeavors throughout the year and how I felt while making them. Warning, I will talk a lot about the controversial NFTs, also quite a bit about cryptocurrencies, taxes and other things that have been major topics for me this year. I think that reflection is one of the best means to growth and progress, so as much as I'm writing this for you gentle reader, I am also writing this very much for myself. # Stats, stats, stats... As of writing this post, the blog has accrued more than 5000 clicks and well over 150k impressions. These numbers are more than I would have ever thought to achieve in a span of less than a year. I am really looking forward to the coming year, and I'm incredibly excited to see how far I can take this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/impressions.png) It's also been really rewarding discovering new creative coding techniques (and cool programming things in general), going down different rabbit holes, then sketching and playing around with these new ideas, and then summarizing them in form of a blog post. I've never had more fun programming, and being able to do so while providing some form of intellectual value through my posts, is very rewarding. Aside the blog, I'm also incredibly humbled by the number of people that have followed me on Twitter. Well over 2500 people at this point. All I can say, is that I will keep sketching for as long as it is sustainable! Thank you for everything! # Q1 ## January - The Gorilla Sun Blog is born The beginning of 2021 was a bit of a hazy time, I am glad I did discover creative coding when I did, as it introduced a lot of structure into my life. At the end of January, I had just handed in my Master Thesis and was waiting for my defense, which was scheduled to be in the beginning of March. Technically there wasn't much for me to do anymore, I knew my material well enough to not feel stressed about it. I had done all the hard work already. I was also in dire need for a break, and I needed to do something that was a little more interesting than painstakingly inputting formulas and symbols in a Latex editor. It was probably the first time in a while that I could unwind and take a breather from life, many can probably agree that 2020 was a very interesting year, to say the least. I must've spent two weeks just doing things that I wanted to do, without feeling guilty about it: I started learning p5, I started hacking away at my blog (I probably spent many hours just tweaking html elements that made a minuscule difference lol), I made some crappy beats in Ableton Live and I also started playing Sekiro (great game!). And here's my very first sketch: 0:00 / 1× My original motivation for learning p5 was to create visuals for my music, and you see, my first couple of sketches did end up having some music slapped onto them. ## February - To build a Blog Sometime around then I bought the gorillasun.de domain and published my site on github pages. The blog looked vastly different from how it does now, and I was still figuring out this entire Jekyll thing. I'm not a web-dev by any means, so I must have spent many hours debugging things by trial and error, to figure out why github pages wasn't displaying my site correctly. At that point I didn't know that it was actually going to be dedicated towards creative coding. But what I did realize was how difficult it would be to actually write meaningful blog posts, and produce such content on a regular basis. Slowly the euphoria that came with completing this big chapter of my life subsided, and the existential dread started creeping in again. I didn't really have anything lined up yet, nor did I have concrete plans for the future. Gunning for a PHD position at some respectable institution seemed like decent plan, but I wasn't completely sold. I stored those thoughts away in some mental compartment, and just tried to prepare for my defense for the time being. In the meantime I kept hacking away at my blog as I started looking for interesting topics that I could write about. You see, I'm a big fan of 3Blue1Brown, Veritasum and the like, and I am very well aware that it takes them weeks and months to prepare a single video, but that didn't stop my frustration from setting in very quickly. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rectanglepacking.png) I remember, one afternoon I was exploring rectangle packing as it seemed easy enough of a problem to get started with... And well, I fell flat on my face. Firstly because it was a much more complicated problem than I assumed it was (there is extensive research on the problem of bin packing), and secondly because I wanted to start and complete a blog post in one sitting, in one afternoon. In retrospect, the fatal mistake that I did here was that I started writing before I actually tried to solve the problem. My main goal at that point was to finish and post material to the blog as quickly as possible. A lot of the sources that I consulted for blogging tips even suggested aiming for a blog post every single day, which is actually quite insane. From experience over the last year, a much more reasonable goal is 3 posts a month, and that might still be a lot. The main goal should always be quality, no matter the quantity. Not much more happened that month, I just sketched a little more and composed this little tune called "Dancing with the Leaves". Have a listen while you keep reading, maybe it has a soothing effect! It's my favorite thing I made from that month. Maybe, in an unconscious manner, I channeled all of my frustration into it: 0:00 / 1× I haven't composed all that much recently, for lots of different reasons really, but I'm always proud of myself when I listen back on my stuff though. So even if impostor syndrome makes me hate my creations in the spur of the moment, my future self is always the happier for it. ## March - Here and Now Then the 3rd of March came, and the defense was over as quickly as it had begun. I didn't really celebrate or anything, I think we went out for food and then I called my parents, and naturally, they were very proud. I sketched some more that week, and composed a little more: On the 8th of March 2021, I probably made my most fortunate decision of the entire year. I minted my first piece on hicetnunc.xyz : OBJKT#1944\. At that point I hadn't yet realized how monumental of an action that was, and would change the entire course of action that I would take for the rest of the year. 0:00 / 1× Maybe it's good to give a little bit of context first. When I first joined hicetnunc I wasn't completely unaware of NFTs. I had already played with the idea of putting some stuff up on opensea in the preceding months, but I didn't really know what I was doing. I didn't even have enough funds to pay for the ETH gas fees (\~40$ at the time). And who would buy my NFTs after all? It seemed like I would be throwing 40 bucks out the window... At the same time I was messing around with the noisedeck app (a generative art synthesizer) made by [@rustysniper1](https://twitter.com/rustysniper1?ref=gorillasun.de) and @occi, who seemed to already have some success with NFTs at the time. And among others, they were some of the first gen art folks that I followed on Twitter. Definitely also check out noisedeck, it's so much fun! Then beginning of March I saw @rustysniper1 tweet about minting something on the Tezos blockchain as well as the low gas fees on there. I checked it out, and indeed I was surprised and impressed by the affordable fees. At that point I already had a way to purchase XTZ through the binance account that I had originally made to purchase some ETH. I don't know what came over me, but in what you would call a 'f\*ck it' moment, I dumped 50$ on XTZ and minted my first token. > Pixelles is now available on [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)! > > 5 editions, 5 TEZ each[https://t.co/3KkXd1qiQp](https://t.co/3KkXd1qiQp?ref=gorillasun.de)[#NFT](https://twitter.com/hashtag/NFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#cryptoart](https://twitter.com/hashtag/cryptoart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/iQI4VEW81p](https://t.co/iQI4VEW81p?ref=gorillasun.de) > > — Jess Hewitt (@rustysniper1) [March 4, 2021](https://twitter.com/rustysniper1/status/1367559837425532928?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Soon after I received a couple of tez in my wallet and had made my first couple of sales. That was incredibly exciting, as it was the first time that I made a significant sum of money from art. I must admit that at the time I was constantly and obsessively checking my wallet. Things snowballed and that #hicetnunc hashtag became a lot more relevant in the following days and weeks. I'm glad I was there, it was so much fun to be involved with the community and participate in events like the hicathon. > After contemplating of jumping on the [#cryptoart](https://twitter.com/hashtag/cryptoart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) train, I finally minted my first NFT on [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) : > > DRAGONBREATH! > > 10 editions, 1 tez each[https://t.co/EHoC4hIRAw](https://t.co/EHoC4hIRAw?ref=gorillasun.de)[#NFT](https://twitter.com/hashtag/NFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#hicetnunc](https://twitter.com/hashtag/hicetnunc?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#p5js](https://twitter.com/hashtag/p5js?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#creativecoding](https://twitter.com/hashtag/creativecoding?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/plr4r7d1On](https://t.co/plr4r7d1On?ref=gorillasun.de) > > — Ahmad Moussa || Gorilla Sun (@gorillasu) [March 8, 2021](https://twitter.com/gorillasu/status/1368841391288164355?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) I minted a couple more things that month in the same style. In total, I earned 127.7 euros in XTZ through NFTs in March. To be very honest, that is an incredible amount of money to be made from gen art. Now I really had an incentive to get on my gen art and creative coding A game! What also became very clear to me was how important Twitter was as a medium in these things, having a strong online presence is a game changer (nowadays for anything really). 0:00 / 1× 0:00 / 1× # Q2 ## April - Explorations April was cathartic. I felt like I had vaulted over that initial bump in the learning curve, and had gotten a "feel" for p5\. I explored flow fields for the first time, some interactive wedge/circle thingies (which taught me a lot about trigonometry) and I experimented a lot with linear interpolation. Lerping has remained an important tool that I use very often, even if it isn't as obvious in my more recent sketches. I discovered that there was an ocean of creative coding techniques to learn, most of which also had a technical purpose in the real world. 0:00 / 1× 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flow1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flow2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flow3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perpetuum1.gif) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perpetuum2.gif) 0:00 / 1× 0:00 / 1× Looking back at the code I wrote then is funny. It's pretty "dogshit", for lack of a better term. But that's okay, a good thing even! Means I improved. Around then, folks on Twitter also started experimenting with minting interactive pieces on hicetnunc using html and svg. Interactive sketches becoming a possibility on HEN, further reinforced the popularity of generative and interactive sketches as NFTs. You could now own something that was a little bit more alive than a png or gif file. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/field1.gif) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/field2.gif) I also shared a post with this grainy slab, which was my first post that accrued a significant amount of likes. I was genuinely a bit perplexed, because the code behind it was relatively easy. Retrospectively, it's not surprising, you will get a reaction to what you share rather than the things that you don't share. So you don't have to write incredibly complicated code to make interesting things. 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/points.png) ## May - Differential Growth and Parametric Functions May was another great month of learning. I got much better at using trigonometry in my sketches, exploring parametric functions and how they can be used to move particles along a specific path. Here's an example of the Lemniscate of Gerono, which later on became a little bit of an inside joke with [@Jeff](https://twitter.com/ippsketch?ref=gorillasun.de) and [@aebrer](https://twitter.com/aebrer?ref=gorillasun.de), aka the Lemniscate Gang (they're also both amazing creative coders). 0:00 / 1× I also explored differential growth as a submission for [@sableraph](https://twitter.com/sableRaph?ref=gorillasun.de)'s weekly creative coding challenge. At the time it felt like a little more than I could chew, but I will reiterate on that sketch very soon. I started participating in Raphaël's (another amazing creative coder and great guy in general) weekly challenge the month before, since it seemed like a super nice way to share and improve my creative coding practice, and challenge myself to learn new things. It had also given me something to look forward to every week, at a time where it wasn't really possible (nor a good idea) to go out much. Aside that, Raphaël's discord server, aka the birbsnest, is an incredibly supportive and inclusive community, I never really liked discord, but I do use it now regularly for this one server. 0:00 / 1× 0:00 / 1× 0:00 / 1× 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/moon.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/moon2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/moon3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/moon4.png) ## June - Returning to Lebanon And another great month in terms of sketching. Looking back I had a bunch of really good ideas, that I can probably take much further when I revisit them. During that month I also returned to Lebanon for the first time in over a year and a half. And I already knew that I would be returning to a very different place. August 2020 the Beirut port disaster happened, where a warehouse of highly flamable substances exploded in a massive explosion. I am glad that no one of my loved ones was hurt. But it's insane no less, something like this should not happen. And in it's current state, Lebanon is sadly not a country that can be lived in if you want to live as a dignified human being, but that's a story for another day. The coming months brought many violent protests and demonstrations against the corrupt politicians, hyper inflation ensued, making the lebanese pound a 20th of the value it once had, in addition to fuel and electricity shortages. It hurts my heart to see Lebanon in such a condition, to see all the places where I spent my youth in such a desolate state. However, it can't be said that this was entirely unforeseeable. The non-system that Lebanon operates on was bound to collapse at some point. Politicians and law-amkers in Lebanon do not achieve their rank through hard-work and merit, but rather through familial ties, bribery and corruption. How can you expect completely unqualified individuals to make meaningful decisions for an entire nation? But anyway, that is just my opinion. I have very few hopes for Lebanon in the coming years. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hieroglyphs-I-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hieroglyphs-II.jpg) 0:00 / 1× 0:00 / 1× 0:00 / 1× 0:00 / 1× I really like these sandy spirally shapes actually. I remember that at the time I kept myself from continuing on this sketch because it felt overdone? That entire shtick with circular and trigonometric stuff. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sable1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sable2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/june.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/smudge2.jpg) Highlights of this month are probably these organic looking tree rings and the purple textures that follow. I experimented quite a bit with perlin noise during this month, and tried to really explore all of the different possibilites. Perlin noise tends to introduce a more organic and life-like character to your sketches, and I think it really shows in these! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/treering2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/treering1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/texture-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/texture2.jpg) # Q3 ## July - Processing Processing and Perfect Loops I stayed in Lebanon from the 27th of June to the 24th of July. It was refreshing, but also very exhausting to spend an entire month with my father alone. I love him, but communication has never been his strong suit. I tried to sketch as much as possible during the times that the electricity was available, but it was quite annoying shaping my entire day around those times. 0:00 / 1× 0:00 / 1× I also tried to get better at making perfect loops. Looking back I used a bunch of unorthodox methods to do so, such as manually inspecting hundreds of frames (not an overexageration) to see which one would line up with the first one. I also wasn't as versed in using ffmpeg or magick, which also hampered things quite a bit. I think by now I've got the basics down to a decent extent, at least I don't have to look up that one annoying ffmpeg command over and over again haha. 0:00 / 1× 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flake2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flake1.jpg) I also spun up the processing editor during those times where I couldn't use the p5 web editor, and brushed up on my Java knowledge, which was actually kind of nice, it wasn't all that difficult to find my way back into the language. The last time I had used it was many years ago during my Bachelor's final project in which I coded a very, very bad android app. Sometimes I look back, and then I'm glad that I have those days behind me :) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hair1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hair2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/vaporwave1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/vaporwave2.png) ## August - Germany and Taxes Many cool things happened in August. I returned to Germany and finally had the opportunity to sign up for a driving school. Getting my license was something that was way overdue (I'm 90% of the way to getting my license now). Activity on hicetnunc during August really skyrocketed, a lot of folks from Ethereum came over to Tezos completely wiping out everything I had up for sale on hicetnunc, especially the interactive sketches and the pieces that I had minted in the early days of HEN (stuff with low OBJKT numbers). I also made a cover of a [@beesandbombs](https://twitter.com/beesandbombs?ref=gorillasun.de) sketch, which he then retweeted, and really drove a lot of traffic to the blog. That was definitely my highlight of the month. I also discovered that embeddable p5 widget, which allowed me to structure my tutorials in a much better way and started that entire "Making of:" series, which should have some more entries next year! 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/datahive.png) And here you can see the predecessors of my centripede series. I wanted to explore in what other ways I could exploit the canvas, other than positioning elements on a grid or on a circle in a trigonometric fashion, which seem to be two archetypes that dictate a lot of creative coding sketches. Positioning things along one of the diagonals seemd like a different approach. Then adding sinusoidal movement to the mix, where the movement itself is accentuated the closer a point is to the center. Which kind of looked like a worm of some sorts. This later evolved into an entire series of different wormlike creatures called "centripede", which is a combination of the words centipede and trigonometry. 0:00 / 1× 0:00 / 1× 0:00 / 1× 0:00 / 1× 0:00 / 1× With ETH folks and bots buying up my stuff on HEN, and having a welcome surge of XTZ in my wallet, taxes was probably something that I had to start thinking about. With a lack of clear regulations on the taxation of cryptocurrencies in Germany, specifically the sale of NFTs, I first had to research the topic quite thouroughly. Slowly I became very stressed about the issue, since it became clear to me how complicated it was. It didn't help that I had never paid taxes before, I had absolutely zero knowledge on the topic or how it should be done. I felt thrown off balance for quite a bit, but I probably over-dramatized everything in my mind (that I would go to jail for tax-fraud and what not). I knew that the first thing I needed to do, was consulting someone that was knowledgeable on the topic. ## September - Crypto Tax Hell In September I continued worrying about taxes. As said, I quickly came to the conclusion that I wasn't going to be able to figure out everything that I needed to do by myself, and I didn't want to waste too much time since some stuff appeared to be time-sensistive and should have been done already. I have no idea how lenient or strict German tax offices are about these things, but I didn't want to risk it any more. I phoned up a couple of local tax advisors and sent emails to some that I had found online, and I either got replies with "sorry, can't help" or replies with exorbitant fees for one time counselation sessions. 400 euros seemed quite steep for a counselation session, when there was no certainty if my issues would be resolved... Anyway, I did end up making progress on that front, and I will summarize everything I did and learned along the way, in detail, in another post that I've been slowly working on over the past weeks. From a point of view of sketching this month was fantastic. I created my "Imaginary Cityscapes" sketch that got an incredible response on Twitter. And there will definitely be physical prints of this sketch in the future, it's just a matter of time now. But for the time being I'm spending 75% of my time just working out logistics as well as planning a big move in the coming weeks. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ic1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ic2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ic3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ic4.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ic5.jpg) I also finished my Centripede series, that people on Twitter really liked. I ended up creating 20 different versions, most of which were auctioned off as 1/1s on objkt.com. I think my favorite part of these centripedes is the motion of the revolving dots. Essentially we're feeding the positional information of the orbs (the ones spanned across the diagonal), to a perlin noise function that controls the angle of rotation of the smaller dots, this gives them this snapping motion in some cases and also makes them perfectly loopable. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/smudge1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/smudge2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/smudge3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/smudge4.png) I also worked on random walkers, which is one of those sketches that I think every creative coder will tackle at some point during their sketching career. The tutorial and write up ended up being a big hit and I am very proud of it! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rw1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/rw2.png) 0:00 / 1× 0:00 / 1× ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fractal.png) There was also this cute 800x80 pixels challenge, which will make a return during Genuary! 0:00 / 1× # Q4 ## October - Calder Ocean and Movie Title Sequences October was another hectic month where I had to do multiple registrations regarding taxes. After consulting with multiple tax advisors, and finally finding someone that could actually answer all my questions, the first step was to register officially as a business. Even though it shouldn't have been their concern at the registration office, they made some funny faces when I explained my circumstances. After that I had regained a little peace of mind and was actually able to focus on sketching and working on the blog for a while. I think I had quite a couple of nice sketches this month, such as the Alexander Calder inspired noise fields! I'm also really proud of the submission for the #WCCChallenge, which had as topic "Movie Title Sequences", being inspired by Dave Whyte's (aka beesandbombs) outro sequence for the Queen's Gambit (great series), I attempted to make something similar in processing, also throwing some shaders into the mix and composing a little tune. Scroll down and have a watch, it's the embedded youtube video! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/discs.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hexs.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/hexs2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/trigs1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/trigs2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/leaf-squuircles.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/lines.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/slears1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/slears2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/mountains.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/MondrianStroke.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/MondrianStroke2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/canyon.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/canyon2.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/calderocean1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/calderocean2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/balloons.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/seaweed.jpg) 0:00 / 1× 0:00 / 1× ## November - Gorilla Grain, Pastel Textures and Scribbly Strokes In November I really outdid myself. Lots of gorgeous patterns, pastel-ish and watercolor-y textures as well as scribbly compositions. My impostor syndrome is kicking in hard right now. Do you ever have this fear, that you'll never have another good idea again? I know it's unresonable, but what if I've already exhausted my creative energies? What if my best stuff is already past me? I think about this very often. How do you deal with this? Genuinely curious! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tesseracts3.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tesseracts4.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tiles1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tiles2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tiles3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tiles4.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tiles5.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/spiritrealm.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/spiritrealm2.jpg) From looking at the sketches of November, you notice that I started using a certain grain method. [Rishi](https://twitter.com/DenisovichPy?ref=gorillasun.de), a cool dude from the birbsnest, aptly called this method the "Gorilla Grain" method, and I really like the ring of it. Albeit I doubt that I am the very first to perturb pixel values in that manner. I remember scrolling through the comments section of some post in the p5js subreddit and people discussing grain a couple of months ago. Then on a whim I decided to try it out to see what it does, and it actually is pretty dang good. Of course it takes a lot of fine-tuning depending on the sketch and the colors you're using. Adding different randomized values from different distributions to each one of the RGBA components of the pixels can lead to vastly different results. In a sense it can also be thought of almost like a filter that is applied to the entire canvas. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/painterly-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/painterly2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/albumcover.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribbles1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribbles192.png) A couple of people asked me if they could use it in their own sketches, and they definitely can, and you too if you want to. As stated, I don't think I invented anything new. However I did notice that suddenly there were a lot more sketches that were using grain after I posted mine, which I'm 100% attributing to the Bader-Meinhof effect, aka the frequency illusion, where when you notice something for the first time, you start noticing it more often. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribbles136.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribbles81.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flux.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/severance.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/pattern1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/pattern2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/texture1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/texture2-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/strokes1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/strokes2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/foamy1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/foamy2.jpg) ## December - Cacographies, Suprematist Composition and Japanese Stitching Patterns The reaction to my generative token "Cacography" on fxhash makes a really good ending for this year. Granted, things on fxhash have been and still are a bit crazy in general. All 222 editions of Cacograpy sold out in around 10 minutes... which is definitely what I would call "crazy". It did take me a long week and many cups of coffee to finish the sketch, but it was definitely worth it. The feature that people liked most, was that the sketch scaled effectively to different screen resolutions, which has been one of the more challenging aspects of developing sketches for fxhash. Developing a sketch for fxhash is an entirely different beast, and feels quite different than my regular sketching. I don't often think in a very "generative" manner, nor do I plan for it. I usually have a vague idea or a visual in my mind, and then I try to reach that with my code, and often cool things happen during the process. The final sketch not having ample amounts of variety to it. Baking variety into a sketch is difficult, and sometimes it just doesn't work even you try your utmost to force it. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribblefield2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribblefield1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/scribblefield3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/caco1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/caco2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/caco3.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/caco4.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/suprematism.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/suprematism2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tesselations1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/tesselations2.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cornercases.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cornercases2.jpg) I also started exploring Japanese stitiching patterns called Sashiko patterns, which unintetionally gave way to some very interesting perspectives, as well as my most succesfull post in terms of likes. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sashiko4.gif) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sashikoimg-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sashikoimg2-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sashikoimg3-1.jpg) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sashikoimg4-1.jpg) And to go out with a bang, an animation that makes use of blendmodes and colors for an interesting optical effect: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/chromacore-1.gif) # Thank You! And that's a wrap, for this year! Phew, that was a lot to collect and write! If you've reached here and you read all of my ramblings, then you have my endless gratuity. I can't wait to see what the next year brings, and I'm ready to take on the coming challenges head on. I think it will not get easier from now on, balancing the blog, sketching, my mental health, family and friends, but hey, at least I'm keeping myself busy! All of this wouldn't have been possible without the continuous support from my parents and siblings, even if they drive me crazy sometimes, as well as the endless moral and emotional support from my accomplice in crime, partner and best friend [Wiem](https://twitter.com/PhaelIshall?ref=gorillasun.de). ❤️ I'd like to shoutout a couple of people that have continuously inspired me throughout the year: [@ippsketch](https://twitter.com/ippsketch?ref=gorillasun.de), [@KaufmanRoni](https://twitter.com/KaufmanRoni?ref=gorillasun.de), [@aebrer](https://twitter.com/aebrer?ref=gorillasun.de), [@sableRaph](https://twitter.com/sableRaph?ref=gorillasun.de), [@increment](https://twitter.com/incre%5Fment?ref=gorillasun.de), [@denisovich](https://twitter.com/DenisovichPy?ref=gorillasun.de), [@*p\_robably*](https://twitter.com/%5Fp%5Frobably?ref=gorillasun.de), [@Samsara4567B4](https://twitter.com/Samsara4567B4?ref=gorillasun.de), [@wayveeee](https://twitter.com/wayveeee?ref=gorillasun.de), [@mattywillo](https://twitter.com/mattywillo%5F?ref=gorillasun.de), [@alexis\_o\_O](https://twitter.com/alexis%5Fo%5FO?ref=gorillasun.de), [@VicDoval](https://twitter.com/VicDoval?ref=gorillasun.de), [@meodai](https://twitter.com/meodai?ref=gorillasun.de), [@genwaver](https://twitter.com/genwaver?ref=gorillasun.de), [@clayheaton](https://twitter.com/clayheaton?ref=gorillasun.de), [@davepvm](https://twitter.com/davepvm?ref=gorillasun.de), [@beesandbombs](https://twitter.com/beesandbombs?ref=gorillasun.de) And many more that I'm probably missing here! Thank you, and to another great year of creative coding! ### An Object Oriented Approach to Random Walkers URL: https://www.gorillasun.de/blog/an-object-oriented-approach-to-random-walkers/ Last updated: 2024-05-26T13:06:13.000Z Today we'll take a stab at a rather popular algorithmic problem in creative coding: the random walk! Before we get into the nitty gritty, here's a quick index: ### Discussion 1. [Inspiration](#inspiration) 2. [A Closer Look](#a-closer-look) 3. [The General Strategy](#the-general-strategy) 4. [Thinking in OOP](#thinking-in-oop) ### Getting our hands dirty 1. [The Grid](#the-grid) 2. [The Random Walker Class](#the-random-walker-class) 3. [Remembering and Drawing a Path](#remembering-and-drawing-a-path) 4. [Animating a Broken Random Walker](#animating-a-broken-random-walker) 5. [The gridHandler Class](#the-gridhandler-class) 6. [Ironing out some Bugs](#ironing-out-some-bugs) 7. [The Backtracking Logic](#the-backtracking-logic) ## Inspiration The work that inspired this blog post is predominantly Kjetil Golid's work: > Each line segment is given a behavior upon creation: Move randomly, or move in a straight line when possible. The interplay between the two behaviors create some intriguing patterns. [pic.twitter.com/ar6MvTd5F9](https://t.co/ar6MvTd5F9?ref=gorillasun.de) > > — Kjetil Golid (@kGolid) [July 8, 2021](https://twitter.com/kGolid/status/1413272810324176896?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The first time I saw this, I was quite impressed by the unique style, and the variety of the generated patterns. I haven't seen anything quite like it on Twitter before. Kjetil's other works are also very refreshing and polished in general. I was immediately inspired to attempt a recreation of the sketch, and figure out the code behind it. A while later I also noticed many other works that have attempted something similar via random walks. And as is often the case with creative coding sketches, this is again one of those problems that looks like a fun challenge when observed shallowly, but hides [a monstrum of a mathematical problem](https://en.wikipedia.org/wiki/Self-avoiding%5Fwalk?ref=gorillasun.de) (graph theory to be precise) underneath. We'll brush aside this apparent simplicity for now, and tackle the task at hand with all sincerity, as always. Let's first talk through what we're trying to accomplish! 0:00 /1:20 1× ## A Closer Look To start things off, let's briefly describe the task at hand. We begin with an empty grid. To be precise, this is a grid of empty positions, that will be the foundation of everything that follows. It'll serve as the structure within which our random walkers are allowed to move. The positions that constitute the grid thus can either be occupied or vacant, depending on it having been traversed or not. The entities that will now interact, move, traverse and populate these empty positions in the grid, are called ['random walkers'](https://en.wikipedia.org/wiki/Random%5Fwalk?ref=gorillasun.de). And as the name suggests, these walkers will be navigating our grid in a random manner. We'll drop one of these random walkers at an arbitrary or at a chosen position into the grid. This position will then be marked as 'occupied' and serve as starting point for the random walker. Depending on where we dropped it in, it'll have up to four choices for directions into which it can move. Those choices being the immediately adjacent vacant positions in the grid. Once it moves to the next randomly chosen position, from among the options it has, that new position will then be marked as occupied as well. From the new position, we'll repeat this process, where we'll have at least three adjacent vacant positions to move to next. Repeating this process a number of times, like an ever growing snake, the random walker will slowly expand and populate more and more positions in the grid, marking each one as occupied once it is traversed. In the manner that we've designed this task, it is evident that the random walkers that live in our grid, are self-avoiding. Meaning that a random walker cannot traverse a spot, that it has already previously occupied, a second time. However, similar to the old game of 'Snake', our random walker might come to a halt, either if it gets cornered or wraps in on itself. This halt always occurs when the current position has no vacant adjacent positions. There's many ways to get out of this state, a popular solution being the backtracking algorithm. Backtracking sets in motion a number of steps to revert to a previous state, where the random walker wasn't stuck and attempts to resume the path from there. As opposed to Daniel Shiffman's strategy in his [video on self-avoiding walks (which is, btw, an instrumetnal watch on this topic)](https://www.youtube.com/watch?v=m6-cm6GZ1iw&ab%5Fchannel=TheCodingTrain&ref=gorillasun.de), we're approaching this in a little bit of a simpler manner. Dan's way tries to fit one single path to the entire grid, such that this path fills out all possible positions in this grid. As he mentions towards the end of his video, this is computationally quite difficult to achieve in a brute force manner. Basically, you could be waiting for quite some time, waiting for the random walker to fill out the entire grid. Our approach, similar to what Kjetil does in his artwork, is that when the random walker reaches a dead end, it won't backtrack and erase that path. But rather, it will find a previous position that lies within it's path and that has adjacent vacant positions still. But more to that in a bit, let's first discuss how one would go about implementing this. Consider the code presented my take on it, which is merely *one* way to go about this. ## The General Strategy Similarly to the sketch "Grand Canyon" in one of my previous blog posts, the grid will be made of a 2D array of boolean values. Why booleans? Essentially, we'll denote grid positions that are empty by "True" in as "Yes, true, this position is empty", and "False" positions as occupied, in as "Nope, false, no free spot here". Next, let's assume that we have a single random walker exploring this grid. As it is expanding it's path, we simultaneously toggle these grid positions from True to False as soon as they become explored. That doesn't sound too complicated, we just have to keep track of the direction the random walker is moving in. Now, here's where it gets interesting. Assume we add a second random walker the mix. This random walker will be exploring it's own path, and we'd like this to happen in a concurrent manner to the first random walker. Both should be able to move at the same time, for them to have a *fair* chance to explore as much of the grid as possible. How do we model this problem? What is the grid in relationship to the random walkers? Take a second to think about how you would solve this! Or maybe even take a couple of minutes, and try to come up with your own code that satisfies everything that's been discussed so far! ## Thinking in OOP Well this is where Object Oriented Programming, or for short OOP, comes to our rescue. We'll split up the different parts of our code into different objects, each of which will deal with an individual problem. Essentially, we'll be separating our concerns. The solution that I came up with, would essentially treat the boolean grid as a shared resource, which will be visible to each random walker when they advance their position. The grid thus will be a single object accessible to all random walkers, which in turn don't need to communicate with each other, and don't have to communicate. They can simply know valid vacant positions through the current state of the grid. Each random walker will also be an object, that holds relevant information about the random walk as well as all the functionality that involves advancing the random walk. Additionally, the benefit of having the random walker as an object, is that it will allow us to create several instances, which we'll simply spawn in random positions on the board. Hence, we'll be able to have not only 2 random walkers, but many more than that! And lastly, we'll also have an entity that takes care of communicating and scheduling between the random walkers and the grid. Not that it really matters for what we're going to do, but the [intricacies of OOP in Javascript are quite interesting](https://www.toptal.com/javascript/es6-class-chaos-keeps-js-developer-up?ref=gorillasun.de). ## The Grid We'll begin with a grid! This time however, we'll wrap our 2D boolean array inside of a function, that has a couple of properties and other functionality: ``` function makeGrid(w, h, spacing, offset){ this.w = w this.h = h this.spacing = spacing this.offset = offset this.grid = [] this.initGrid = function(){ for(let x = this.offset; x ``` The member variables h, w, offset and spacing are just our usual bread and butter that we'll use to determine the grid dimensions. The actual boolean values are now stored in the 'grid' member variable. To display this grid we also require some code: ``` function setup() { w = min(windowWidth, windowHeight) wx = w wy = w createCanvas(wx, wy); g = new makeGrid(wx,wy,8,8) g.initGrid() } function draw() { background(255) g.display() } ``` And overall we'd have some code that creates a boolean grid and displays it on the canvas: ## The Random Walker For starters, let's make a super simple walker: ``` function spawnWalker(x, y, col){ this.currX = x this.currY = y } ``` The very first things we need are an x and y coordinate to determine where the head of our walker currently is. Next let's figure out a way to make the walker move in a certain direction. Before we actually move in a direction, we'd first need to know which directions are legal moves, and then we need to determine which of these legal moves we'll take: ``` this.advance = function(grid){ opts = this.getOptions(grid) choice = random(opts) } ``` The 'advance' function shall be the heartpiece of our random walker. It accepts a grid object as input, which we'll require to check in which directions we can move. Then through a secondary helper function, we'll fetch the options that are available to us: ``` this.getOptions = function(grid){ options = [] if(grid[this.currX-1][this.currY]){ options.push({dx: this.currX-1, dy: this.currY}) } if(grid[this.currX][this.currY-1]){ options.push({dx: this.currX, dy: this.currY-1}) } if(grid[this.currX + 1][this.currY]){ options.push({dx: this.currX + 1, dy: this.currY}) } if(grid[this.currX][this.currY+1]){ options.push({dx: this.currX, dy: this.currY+1}) } return options } ``` Take a sec to see what we did here. Maybe looks like a lot, but we're checking if the adjacent grid positions are still vacant or not. If they are, we add their location to the options array which will be returned and passed to the advance function. To do these checks we can leverage the current position of the walker, and check the grid that we passed along. However, we also need to do an additional check, such that we don't exceed the bounds of the grid: ``` this.getOptions = function(grid){ options = [] if(this.currX > 0){ if(grid[this.currX-1][this.currY]){ options.push({dx: this.currX-1, dy: this.currY}) } } if(this.currY > 0){ if(grid[this.currX][this.currY-1]){ options.push({dx: this.currX, dy: this.currY-1}) } } if(this.currX < grid.length -1){ if(grid[this.currX + 1][this.currY]){ options.push({dx: this.currX + 1, dy: this.currY}) } } if(this.currY < grid[0].length-1){ if(grid[this.currX][this.currY+1]){ options.push({dx: this.currX, dy: this.currY+1}) } } return options } ``` ## Remembering and Drawing a Path An important part of the random walk logic is now complete. Next we'll have to show the path of the random walker through the grid. For this we'll need to be able to actually remember the positions that were previously occupied. We can do this by adding every position taken to an array: ``` function spawnWalker(x, y){ this.currX = x this.currY = y this.path = [] // this will help remember the path this.advance = function(grid){ // add current position to the path array this.path.push({dx: this.currX, dy: this.currY}) // move and update position opts = this.getOptions(grid) choice = random(opts) this.currX = choice.dx this.currY = choice.dy } this.getOptions = function(grid){ // get option code goes here } } ``` Having a trace of this path stored, we can now add a function that draws it: ``` this.display = function(spacing, offset){ for(let n = 0; n ``` Notice that we also need to multiply with the correct spacing and add an offset to get the correct position on the grid. This is far from complete, but for now let's start putting stuff together such that we can see what it looks like. ## A Broken Random Walker Throwing together what we have so far, we end up with: Running this, you already see something going on... mmm, you could call this a random walk (I guess). Fret not, we'll fix it in a second. For now it's working correctly with the code we wrote. The random walker moves along the grid, and stays confined to the grid. Why is crossing paths with itself though? Simply because we are not setting the grid positions to False once the random walker traverses them. This is where the gridHandler comes into play. ## The Grid Handler Class Essentially, we'll create a third object that will take care of communicating between the random walkers and the grid. It probably isn't a good idea to allow the random walker itself to modify the grid. For this sketch you could very well do it, but from a design pattern point of view, it's quite messy. Having a central authority that takes care of exchanges is just easier to manage and makes it easier to track if something goes wrong: ``` function gridHandler(grid, randomWalkers){ this.grid = grid // the grid this.randomWalkers = [...randomWalkers] // an array of random walkers // advance entire board state // checks off cells that have paths in them this.advanceGrid = function(){ // go through all the random walkers and advance each one individually for(let n = 0; n ``` The advanceGrid function takes care of advancing all of the random walkers that currently exist within the grid. We loop through the randomWalkers array that contains all of instances of random walkers, call their advance function (which we'll modify in a sec) and retrieve the position that they moved to. Using this coordinate information we'll set the grid position to False. Modifying the advance function to return the current position just add a return statement to the end of the function: ``` return {dx: this.currX, dy: this.currY} ``` And our code will behave as follows: Now it behaves much more the way we intended. Try rerunning the sketch a couple of times to see how it behaves and ends in a error. We'll get to that in a second. Try adding a couple more random walkers at different positions! What we have so far is already really great, now we just need to think about the backtracking logic! ## Ironing out some Bugs But first let's fix that error from before, we'll wrap two parts of our code in if coditions: ``` opts = this.getOptions(grid); choice = random(opts); // add current position to the path array this.path.push({ dx: this.currX, dy: this.currY }); if(choice){ this.drawnPath.push({ dx: this.currX, dy: this.currY }); this.currX = choice.dx; this.currY = choice.dy; return {dx: this.currX, dy: this.currY} } ``` This will ensure that if no choices are available, no coordinates are returned from the advance function. Next in the grid handler function: ``` this.advanceGrid = function(){ // go through all the random walkers and advance each one individually for(let n = 0; n ``` Here we'll make sure only if something is returned we attempt modify the grid positions' state. We'll also add another line to the main body of the gridHandler object: ``` // go through and set their starting positions in the grid to false for(let n = 0; n ``` Which, as the comment explains, sets the positions in which walkers are spawned. Now the error should have disappeared: ## Backtracking When do we actually need to backtrack? When we get stuck. When do we get stuck? When we have no options to advance the walker. We'll add an else statement in our advance function, that will return to a previous position in our path that still has options available to it: ``` if(choice){ this.currX = choice.dx; this.currY = choice.dy; return {dx: this.currX, dy: this.currY} }else{ this.path.pop() } ``` If you try this you'll note that nothing really happens. And that's because we also need to move the line that adds the current position to the path array, needs to be moved inside the if statement, like so: ``` if(choice){ // add current position to the path array this.path.push({ dx: this.currX, dy: this.currY }); this.currX = choice.dx; this.currY = choice.dy; return {dx: this.currX, dy: this.currY} }else{ this.path.pop() } ``` Even though this achieves backtracking, visually it does not correspond to what we want: Can't draw the path if we don't have that information stored in the path array anymore. We can remedy this with a secondary array that holds the path information but doesn't get popped: And those ugly lines can then be fixed by a simple condition in the display function: ``` if(dist(this.drawnPath[n].dx * this.spacing + this.offset, this.drawnPath[n].dy * this.spacing + this.offset, this.drawnPath[n + 1].dx * this.spacing + this.offset, this.drawnPath[n + 1].dy * this.spacing + this.offset) ``` The final code would then look like: Can't draw the path if we don't have that information stored in the path array anymore. We can remedy this with a secondary array that holds the path information but doesn't get popped: And those ugly lines can then be fixed by a simple condition in the display function: ``` if(dist(this.drawnPath[n].dx * this.spacing + this.offset, this.drawnPath[n].dy * this.spacing + this.offset, this.drawnPath[n + 1].dx * this.spacing + this.offset, this.drawnPath[n + 1].dy * this.spacing + this.offset) ``` The final code would then look like this: And hereby we stand at the end of this long tutorial! If you find any typos and/or inaccuracies let me know in the comment box below! Otherwise, happy sketching! And make sure to share this post with a friend, it helps out tremendously! ### A Simple Guide to FFMPEG URL: https://www.gorillasun.de/blog/a-simple-guide-to-ffmpeg/ Last updated: 2023-04-25T12:02:40.000Z "This file format is not supported!" If you've ever received a notification like this, and you create content on a regular basis, then this blog post is probably for you! Being a creative of any sort in this digital age, requires you to juggle a variety of different file formats across different platforms. On top of that, platforms (such as Twitter) have very strict format rules for things you want to upload, this makes it crucial to have an easy way to manage and convert different files to different formats at will. In this blog post I'll gently introduce you to ffmpeg and how it can help you with converting and editing your files! Here's a quick index of the topics we'll tackle: ### Getting started with FFmpeg 1. [What is FFmpeg?](#what-is-ffmpeg?) 2. [FFmpeg command syntax](#ffmpeg-command-syntax) 3. [File conversion example](#file-conversion-example) 4. [Command Options](#command-options) ### Generally useful FFmpeg commands 1. [Collating frames into a GIF](#collating-frames-into-a-gif) 2. [Cropping and Resizing](#cropping-and-resizing) 3. [Trimming Videos](#trimming-videos) 4. [Converting to a web safe video format](#converting-to-a-web-safe-format) 5. [Converting multiple files in a directory](#converting-multiple-files-in-a-directory) ### Additional Information 1. [Installing FFmpeg](#installing-ffmpeg) 2. [Cheat Sheet](#cheat-sheet) 3. [Reducing the size of your gifs](#reducing-the-size-of-your-gifs) 4. [End Notes](#end-notes) ## What's ffmpeg? Simply put, FFmpeg is an open source video and audio processing tool. It allows you to convert between different encoding formats, in addition to editing video and audio files in a number of ways. It's mainly designed to be a command-line interface (CLI) that you execute from your terminal (this is how we'll be using it in this blog post), however it can also be integrated as a part of other software. Know those fancy apps on your phone, that help you format your videos for IG? A lot of them probably use FFmpeg in the background. Can't blame them though, why reinvent the wheel when FFmpeg exists? It's super fast and versatile. How can WE use FFmpeg? Well, for example, you were just about to upload a GIF file to some website when it notifies you that this file format is not supported. With FFmpeg we could easily convert this GIF file into an mp4 file, or a mov file, or an avi file, etc... Video file too long? No problem we can trim it with FFmpeg. Video file size too large? No problem we can reduce it's size with ffmpeg. You get the idea! In the rest of this blog post I'll run over the most useful FFmpeg commands (especially for creatives). ## FFmpeg command syntax Before you have a heart attack, writing FFmpeg commands is actually super easy, but to elucidate how these commands are composed we'll have to have a look at the general FFmpeg command syntax: ``` ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ... ``` FFmpeg commands essentially always consists of two parts, an input stream and an output stream. With streams we generally mean input and output files, and it's improtant to note that you we can have multiple input and multiple output streams. For example, you'd like to overlay two videos and merge them into a single video file. For each one of these streams we can specify a number of conversion options that, in addition to converting between two formats, allow us to manipulate specific properties of the file. For example, you want the output file to have a secific frame rate, this could then be specified as an option. As you might've noticed, there are options that are applied specifically to the input stream, others specifically to the output stream, and others to the entire command. ## Converting files with ffmpeg The simplest and quintessential ffmpeg command would be the simple conversion command. It goes as shown: ``` ffmpeg -i input.mp4 output.gif ``` In this case we would be converting an mp4 file into a gif file. Notice the statement preceding the input file '-i', this is how an option is specified FFmpeg (also often called flags). Here we're telling FFmpeg that what follows is the input file. There are many such options in ffmpeg, each of which have their own purpose. Aside videos and gifs, FFmpeg also allows you to convert audio files! I often record my guitar with my samsung phone. It's recording app stores these files in the m4a format, which isn't supported by sound editing applications and DAWs like Ableton Live. A much more sensible format would be MP3 or WAV: ``` ffmpeg -i recording.m4a output.wav ``` Same command as before, only thing that changed are the file types! FFmpeg will automatically handle the conversion between differen file types. ## FFmpeg options You can think about options as modifiers, that depending on their function, will somehow change the output and purpose of your command. To see a list of options that are avaiable in FFmpeg, you can simply type in 'ffmpeg -h', hit enter and it will print a relatively long list of different options as well as a description of what they do. If you want to see more or ALL options you can type in 'ffmpeg -h long' and 'ffmpeg -h full' respectively. Let's have a look at some of them: ``` ffmpeg -i input.mp4 -r 25 output.mp4 ``` Say you have a video file that you'd like to turn into a GIF with a framerate of 25 fps. To achieve that, you'd add the '-r' flag in front of the output file name, along with the rate you'd like to set it to. Framerate would be one of many things that we could modify through an additional flag, and this will make much more sense in the coming next sections. If you'd like to read up on specific options and what they do, then FFmpeg has a wonderfully detailed documentation about all of them [here](https://www.ffmpeg.org/ffmpeg.html?ref=gorillasun.de#Options). --- ## Converting a series of frames into a gif/video One super useful command that I often require for my p5js sketches, is collating/combining a sequence of frames into a video/gif: ``` ffmpeg -i frame%d.png output.gif ``` By manner of using a percentage sign '%' in the input file stream, FFmpeg understands that it should be looking for multiple files that need to be processed. If you've exported them from p5js or processing, usually you'll already have them appropriately named and numbered, generally in a sequential order, something like: frame1.png, frame2.png, frame3.png, ... Here the '%d' signifies that FFmpeg should expect a sequentially increasing number in this position of the file name. You can learn more about these patterns in [this section](http://ffmpeg.org/ffmpeg-all.html?ref=gorillasun.de#image2-1) of the official documentation. [(FYI tFFmpeg calls this a slideshow if it's unrelated images, for googling purposes)](https://trac.ffmpeg.org/wiki/Slideshow?ref=gorillasun.de). Optionally you may also add the framerate flag to the command, otherwise the default framerate will be 25 fps. Naturally, you can also split up a gif into it's constituent frames by reversing the command: ``` ffmpeg -i output.gif frame%d.png ``` And if for any unorthodox reason whatsoever, you need to convert a single image into a video or gif, you can also do that: ``` ffmpeg -i img.png output.gif ``` ## Cropping and Resizing Cropping and resizing files are two things you've probably had to do at some point, and found them to be quite tedious, either using some software that isn't very versatile, or online editors that are incredibly tedious to navigate. Well, fret not, FFmpeg has your back yet again. ### Cropping For a good run-down on croppping with FFmpeg, I've foun [this stackexchange answer](https://video.stackexchange.com/a/4571?ref=gorillasun.de) to be the best. The command for cropping a file is the following: ``` ffmpeg -i in.mp4 -vf crop="out_w:out_h:x:y" out.mp4 ``` Here we're using the vf flag, which stands for 'video filter', basically applying a video filter to the output stream. This flag is followed by 'crop', which tells FFmpeg that we're using the crop video filter, and we also need to pass some parameters to this cropping filter. Here the parameters 'out\_w' and 'out\_h' stand for the width and height of the area that you want to crop out, and equivalently 'x' and 'y' represent the coordinates of the top left corner of the cropping area. Essentially you're recording a rectangular area of the input video, and you're positioning this rectangular area with the parameters passed to the filter. ### Scaling and Resizing In a similar manner we can resize an input stream as follows: ``` ffmpeg -i in.mp4 -vf scale="out_w:-1" out.mp4 ``` Here we use the 'scale' video filter. To the scale video filter we pass two arguments: a width and a height. In this case we're choosing a specific output width 'out\_w' and set the output height to '-1'. -1 essentially tells ffmpeg to calculate the correct output height, such that the output video has the same aspect ratio as the input video. Of course you can also do this the other way around '-1:out\_h' as well. Or set both width and height to different values. ## Trimming Videos Another command that I've found useful a couple of times: ``` ffmpeg -i input.gif -ss 00:00:00 -to 00:00:03 output.gif ``` Which essentially allows you to truncate the duration of a gif or video file, by setting a specific start and end time stamp in seconds. Trimming the video based on exact frames is a little bit more complicated, and is elucidated in [this stackexchange answer](https://superuser.com/a/459488?ref=gorillasun.de). ## Converting to a web safe format Displaying full size GIFs on your website is a bad idea. Their size is huge, and if things don't load quickly, it makes an immediate bad impression. A couple of weeks ago I decided to really clean up my blog and compress my GIFs into a much more manageable file format like MP4\. It worked like a charm, but then I opened my blog on my phone to see how it looks, and it turns out that certain browsers only support certain types of pixel formats. This was a problem that actually drove me a little bit mad for a while, since I couldn't pinpoint what the issue was for a while, until I stumbled upon [this blog post](https://sidneyliebrand.io/blog/converting-gif-to-web-safe-video-formats-using-ffmpeg?ref=gorillasun.de) by Sidney Liebrand, that explains a little what web safe formats are, and provides an FFmpeg command to convert to an appropriate MP4 version: ``` ffmpeg -i file.gif -movflags +faststart -pix_fmt yuv420p -vf scale="trunc(iw/2)*2:trunc(ih/2)*2" file.mp4 ``` The moveflags option is not necessary, but is nice to have, since it'll automatically make your video run once it starts loading. The yuv420p pixel format is necessary for your video to be displayed in certain browsers. And an additional necessity of this pixel format is that the video needs to be resized such that it's width and height are divisible by 2\. The [FFmpeg documentation](https://trac.ffmpeg.org/wiki/Encode/H.264?ref=gorillasun.de) offers a little explanation on this in a note called 'encoding for dumb players': > You may need to use -vf format=yuv420p (or the alias -pix\_fmt yuv420p) for your output to work in QuickTime and most other players. These players only support the YUV planar color space with 4:2:0 chroma subsampling for H.264 video. Otherwise, depending on your source, ffmpeg may output to a pixel format that may be incompatible with these players. To display your video on your website, and have it behave like a gif in disguise, is with the following html snippet: ``` ``` This is also very useful for perfectly looping GIFs. The 'loop' statement allows for seamless transitions from end to start. ## Converting multiple files in a directory This isn't really a command specific to ffmpeg, but something I've found to come in handy in a couple of situations. Let's assume we have a folder full of files that we'd like to process in some manner, and we don't want to tediously type out an FFmpeg command for each one. We can accomplish this on windows with some additional syntax as follows: ``` FOR /F "tokens=*" %G IN ('dir /b *.gif') DO ffmpeg -i "%G" "%~nG.mp4" ``` And for macOS as well as Linux: ``` for i in *.gif; do ffmpeg -i "$i" "${i%.*}.mp4"; done ``` ## Installing FFmpeg Maybe the most tedious part about getting started with FFmpeg is installing it, which will vary on the operating system that you currently have. Since there's already so many tutorials on installing FFmpeg, I didn't feel the necessity of including this info here again, but rather link to resources. Here's a good [guide](https://www.youtube.com/watch?v=r1AtmY-RMyQ&ab%5Fchannel=TroubleChute&ref=gorillasun.de) on installing FFmpeg on windows (what I'm using), just make sure that you create a new environment variable, such that you can run FFmpeg from your terminal, no matter what directory you open a terminal from. And here's a good [guide](https://www.youtube.com/watch?v=H1o6MWnmwpY&ab%5Fchannel=RickMakes&ref=gorillasun.de) on installing FFmpeg on macOs. ## Cheat Sheet I'll be honest with you, the hardest part about ffmpeg commands is remembering them. Therefore I've made a little cheat sheet of the aforementioned commands and what they do: | Use case | Command | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Help | ffmpeg -h | | Inspect File | ffmpeg -i filename.gif -hide\_banner | | Conversion | ffmpeg -i input.gif output.mp4 | | Frames to GIF | ffmpeg -i frame%d.png output.gif | | GIF to frames | ffmpeg -i input.gif frame%d.png | | Scaling/Resizing | ffmpeg -i in.mp4 -vf scale="out\_w:-1" out.mp4 | | Cropping | ffmpeg -i in.mp4 -vf crop="out\_w:out\_h:x:y" out.mp4 | | Trim duration | ffmpeg -i input.gif -ss 00:00:00 -to 00:00:03 output.gif | | Web Safe | ffmpeg -i file.gif -movflags +faststart -pix\_fmt yuv420p \\ \-vf scale="trunc(iw/2)\*2:trunc(ih/2)\*2" file.mp4 | | Multiple Files | Windows FOR /F "tokens=\*" %G IN ('dir /b \*.flac') \\ DO ffmpeg -i "%G" -acodec mp3 "%\~nG.mp3" MacOs & Linux for i in \*.avi; do ffmpeg -i "$i" "${i%.\*}.mp4"; done | ## Reducing the size of gifs This isn't a single command per se, but we'll have a quick look at some strategies that can potentially reduce the size of your gif files. I'd like to give a shout-out to two superb posts on the topic of quality and size of gif files with FFmpeg, this [one](http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html?ref=gorillasun.de) as well as this [one](https://cassidy.codes/blog/2017/04/25/ffmpeg-frames-to-gif-optimization/?ref=gorillasun.de). The topic of gifs, compression and size/quality tradeoffs are a can of worms, that better be opened in a separate future post, but for the sake of this section let's have a look at some ways to reduce the file size of gifs. One quick and dirty trick that I like a lot, is simply scaling the resolution of gif files down (which we have covered above). This tends to have a dramatic effect on the quality of the gif, but sometimes I just can't be bothered when my GIF file size is just barely above the 15mb size limit of Twitter. Shaving off those 1-2mbs can usually be achieved by scaling down around 10%. ## End notes If you've made it this far, I sincerely hope this run down of FFmpeg was useful and you learned something new! I'm planning on making another blog post about FFmpeg, where we'll use it for creative purposes and video effects, rather than just using it as a tool for conversion operations. If you've enjoyed this blog post consider sharing it with a friend! Otherwise subscribe to the newsletter for the occasional update or come and say hi on Twitter! Cheers, and happy sketching! ### Glue Gun Constructs URL: https://www.gorillasun.de/blog/glue-gun-constructs/ Last updated: 2023-04-25T12:02:45.000Z *This blog post serves as submission to [Raphaël de Courville](https://twitter.com/sableRaph?ref=gorillasun.de)'s weekly creative coding challenge! You might ask: 'Where is the code?', and well, this week's topic was 'Non-computer' so I stepped away from the keyboard for a bit and did something a little different!* For this challenge I channeled my inner child and glue gunned together these little 'constructs'. Made from scrap I ramsacked from the garage, and some stuff I found in the garden. I'm not going to lie, but it was a lot of fun making these! ## Initial Idea: Stop Motion Initially I wanted to make a stop motion video. It sounded like a fun idea, so I set up my camera in a corner of the room and had a desk lamp light the surface that I was filming. Then I edited and cut out all the parts where my hands were showing, see result: Stop motion turns out to be quite difficult to record and edit! (I really don't have the patience for editing:P). But I'm certainly going to attempt this idea again at some point in the future (after thinking through my set up a little more). ## Process Here are some pics from the process that I screen grabbed from the videos. They have a certain cozy feel to them. Otherwise there isn't much to document here, you basically put some glue on something and then stick another thing onto it and hold it for a couple of seconds. ![](https://gorillasun.de/assets/images/noncomputer/2.png) ```
    ``` ## Constructs Here are the two 'chestnut men' that I came up with. I really like the look of the filaments of the glue, hence I didn't remove it. Gives it sort of a wild look: ```
    ``` And that's a wrap, hope you enjoyed! Honk Honk! ### Making of Grand Canyon URL: https://www.gorillasun.de/blog/making-of-grand-canyon/ Last updated: 2023-04-25T12:02:49.000Z This time around we'll code up the cute minimalist sketch above! We'll have a look at some useful concepts upon which you can build a variety of different sketches. Quick index goes here: 1. [A Boolean Grid](#a-boolean-grid) 2. [Adjustable canvas size](#adjustable-canvas-size) 3. [Drawing the Grid](#drawing-the-grid) 4. [Drawing a Connected Path](#drawing-a-connected-path) 5. [Adding Detail](#adding-detail) 6. [Animating the Sketch](#animating-the-sketch) 7. [Perfectly Looping Sketch](#perfectly-looping-sketch) ## A Boolean Grid We'll start off with creating a boolean grid. This won't make much sense at this point, but it's essentially what the entire sketch builds upon. In a nutshell, the grid will determine the positions into which we're allowed to draw: ``` function setup() { w = min(windowWidth, windowHeight) createCanvas(w, w); padding = 30 spacing = 5 bools = [] for(x = padding; x ``` At this point I've covered grids countless times in my blog posts, and yet again we'll make use of one! Here we're creating a 2D array that we fill with zeroes. It's size in width and height are determined by the parameters that we specify beforehand: padding and spacing. I used to call these 'off' and 'spc' previously, but for sake of clarity these make a lot more sense. Padding is essentially the horizontal and vertical distance between the border of the canvas and the grid itself. Spacing is simply the distance between points in the grid. ## Adjustable canvas size Before we go any further into the details of this sketch, I'd like to make an adjustment to the manner in which we create the grid. What if we would like to have a grid that is not square in shape? For instance we would like to have a wide aspect ratio or portrait aspect ratio? We could do something like this: ``` w = min(windowWidth, windowHeight) wx = w wy = w createCanvas(wx, wy); ``` In this manner we can now simply add a scaling factor to either the width of the height of the canvas to get the desired shape. So for example if we want a 16:9 aspect ratio: ``` w = min(windowWidth, windowHeight) wx = w*1.6 wy = w*0.9 createCanvas(wx, wy); ``` Neat right? I've been using this trick to get differently sized images when posting to Twitter! And naturally we'll need to account for the different width and height of the canvas and modify the loop that creates the boolean grid: ``` bools = [] for(x = padding; x ``` Our code would now look as follows: This doesn't draw anything yet but bear with me! ## Drawing the Grid Now we've got the boolean grid, but we're not storing the location of the dots anywhere, we can however make use of the padding and spacing parameters as well as the dimensions of the grid to determine the positions: ``` function draw(){ for(i = 0; i ``` Running this code will draw a grid of points to the canvas now: ## Drawing a Connected Path The next thing we'd like to do, is drawing a connected path horizontally through this grid. We can do this by setting a random entry in each column to be true and then connecting these entries with lines. First things first, how do we set a random value in each column to true? We could do this during setup: ``` bools = [] for(x = padding; x ``` Making sure that we did this correctly, we'll draw an ellipse at these grid locations: Looks good! Next we'll want to connect these grid locations with a line. For this we need to remember the location of the previous true entry in the grid, we can do this with some spare variables prevI and prevJ: Now you see, this doesn't look that nice to be honest. The peaks and troughs are all over the place. It would look much nicer if this path was a little smoother and controlled. We could do this by replacing the random selection of the row index with perlin noise: ``` rez = 0.01 randomRowIndex = int(noise(x*rez,y*rez)*row.length); ``` If you're not familiar with the magical p5 noise() function have a look at [this tutorial](https://gorillasun.de/blog/Introduction-to-Perlin-Noise-in-P5JS-and-Processing?ref=gorillasun.de) I've written. The rez variable here stands for resolution, and specifies how fine we want this perlin noise to be. The lower the rez arameter, the smoother the path. We'll give as input the x and y location of the grid point, but you can alternatively feed in other variables. We'd get a result that looks as follows: This looks much better. Also notice that I adjusted the strokeWeight of the line and the points as well as the spacing in between them. This way things look much neater, to me at least. Feel free to make some changes and @ me on Twitter! ## Adding Detail This is actually already the bulk of this sketch, but we can add a couple of ornaments to make things a little bit more interesting. For example adding a little rectangle here and there that looks like a boulder: ``` if(random()>0.9){ rect( (i-1) * spacing + padding, j * spacing + padding, spacing) } ``` And some rain drops coming from the sky above the mountains. For this we'll need to check if we already drew the horizontal line, if we did we toggle the boolean variable 'below' to stop drawing rain drops: ``` if(random()>0.9 && !below && j>0){ line(i * spacing + padding, j * spacing + padding, i * spacing + padding, (j-1) * spacing + padding) } ``` And the code goes here: This already makes for some nice little images, but we can take this further! ## Animating the Sketch First we'll want to comment out the noLoop() statement in our code. Then we'll want to add a background(255) to the top of the draw loop. If we ran our sketch this way, you'll notice that the location of the rain drops will be randomized each frame, making it appear as if they are falling with a high speed. You'll also notice that the randomly placed rectangles (boulders), will jump around erratically, to fix that we can simply replace the random() statement in the if condition with noise(), for some pseudo persistence: Next we'd like to animate the mountainscae, such that perlin noise path slides from right to left, as if we were somehow sitting inside of a car filming the view of the distant mountains. Take a moment to think how you could achieve this. We've basically written our sketch in two parts, one that draws a boolean grid, where some entries are set to true, and another part that draws based on those locations. What if we were to redraw the underlying boolean grid and move those true entries by one spot to the left? Let's wrap the code that generates the grid in a function: ``` function redrawGrid(t){ bools = []; for (x = padding; x < wx - padding; x += spacing) { row = []; for (y = padding; y < wy - padding; y += spacing) { row.push(0); } randomRowIndex = int(noise(x*0.01+t,y*0.01)*row.length); row[randomRowIndex] = 1; bools.push(row); } } ``` The function also takes as input a variable t that stands for time (or basically any other parameter that increases over time), this variable will be fed into the noise function's first input. Now we simply need to call this redrawGrid() function at the bottom of the draw loop: This is awesome, now we have an endlessly looping mini mountainscape! ## Perfectly Looping Canyon The last thing I wanted to tackle, is making a perfectly loopable mountainscape. We can do so to some extent we can loop the horizontally scrolling slice by periodically resetting the increasing parameter fed to the noise function: ``` randomRowIndex = int( noise(((x + t * 100) % (wx - padding)) * 0.01, y * 0.01) * row.length ); ``` This little hack is doing a lot, and might be sufficient if you want to export a perfect loop. You would just have to rerun the sketch a couple of times until the break off point is seamless. In other scenarios that one cut-off ridge might be very prominent: If you're someone like me, the previous solution will not satisfy you. Below is the code for a version, where the loop is seamless every time. Here, we're treating the grid drawn to the canvas as a sliding window that moves over a looping, much wider grid! This wider grid is determined before anything gets drawn to the screen, and the column indexes of the true entries are stored in an array called 'noiseArray'. How do we ensure that this noiseArray loops back around? After generating a number of column indexes that is larger than the number of columns currently shown on canvas, we check if we encounter a column index that matches up with the first entry in the array. The smoothness properties of the perlin noise we're using should ensure that this is a smooth transition. The fascinating thing about making a GIF from this is that takes the viewer quite a while to figure out if the GIF is a perfect loop or not, and probably has to make a mental note of some landmark to see if it comes around again. The code goes here: Nevermind the debug information in the corner. I essentially shows the index of the first entry, the last, the length of the noise array as well as the current position. The red circle appears when it loops back around. Messing a little with the code, this can also lead to some interesting results as follows: And that's pretty much a wrap. Simple sketch, with lots of interesting concepts under the hood. If this tutorial sparks any inspiration and you end making some sketch inspired by this, please @ me on Twitter (@gorillasu). Otherwise, if you enjoyed this post share it with a friend, it helps out a bunch! That's it, cheers, see you in the next one! 😊 ### Making of Parasite URL: https://www.gorillasun.de/blog/making-of-parasite/ Last updated: 2023-04-25T12:02:53.000Z 1. Points along the Diagonal 2. Making the Points Wiggle 3. Varying point Size 4. Attenuating the Movement 5. Positioning Wireframe Joints 6. Drawing the wireframe connections 7. Final Touches 8. Squiggly Perlin Noise Movement 0:00 /1:02 1× ## Points along the Diagonal As always, let's start with some boilerplate stuff: ``` function setup() { w = min(windowWidth, windowHeight) createCanvas(w, w); } function draw(){ background(220); } ``` Very basic stuff here, we're setting up the canvas to take as much space as it has available, and ensure that it is always square in shape by setting both it's width and height to the smaller one of the two by using the min() function. Points along the diagonal can simply be drawn with a single for loop. The points' x and y coordinates will both be set to the value of x. Also as usual, we have an offset parameter 'off' and a spacing parameter 'spc' that we declare in the setup function to determine from where to where our for loop spans. Try changing them and see how the drawn points appear! ## Making the points wiggle Wiggling motion can generally be achieved with a sine wave, which we'll use to oscillate the position of the points: ``` t = frameCount/50; for(x = off; x ``` Doing it like this, you'll notice that all the points are moving side to side at the same time. However we'd like them to move in a serpent/worm like manner, we need to input something in addition to time into the sin() function to offset them differently. And we actually already have something that is unique to each point: it's position! Try plugging different things into the two sines and see how the behaviour changes. ## Varying point Size If you've read either one of my previous two tutorials this trick will be familiar to you. Here we'll increase the size of the points the closer they are to the center of the sketch: ``` d = dist(x,x,w/2,w/2) dmap = map(d, 0, w/2+off/2, 1, 0) strokeWeight(dmap*10) ``` We'll make use of the inbuilt dist() function to compute the distance of each specific point towards the center, and then map from that range to a \[0 - 1\] range. There's a little problem here though. We're not taking into account the distance of the point while it's wiggling side to side with our sin() function. We can fix this by using intermediary variables to store the location: ``` offsetAmount = 50; x1 = x + offsetAmount * sin(x + t); x2 = x - offsetAmount * sin(x + t); d = dist(x1, x2, w / 2, w / 2); dmap = map(d, 0, w / 2 + off / 2, 1, 0); strokeWeight(dmap * 10); point(x1, x2); ``` Now we'll notice that the points' size varies ever so slightly while they pass back and forth over the center of the sketch: We also added a variable 'modifier' to easily control the oscillating motion of the points. ## Attenuating the movement We can also repurpose the distance from the center to control the amount of movement that a single point will make. The closer to the center, the further out it will swing. The further from the center, the less distance it'll travel side to side. We simply recalculate x1 and x2 but also multiply by the dmap parameter. Since it is in the range of \[0 - 1\], if it closer to the center the value will be closer to 1 and we're oscillating the point near it's max offset amount. If it's closer to 0, we're moving the point side to side only at a fraction of it's max range. ## Positioning Wireframe Joints Calling it a wireframe is a generous description. Since we're essentially still in 2D this part of the sketch will simply give the illusion of being 3D. For now we'll simply position some dots equidistantly on a circle that spans around each of the dots that we've already positioned so far: ``` rad = 40*dmap; strokeWeight(5*dmap) for(a = 0 ; a< TAU; a+=TAU/3){ px = x1 + rad*cos(a); py = x2 + rad*sin(a); point(px,py) } ``` We're also going to make these points spin in the following manner: Neat right? We already have some very interesting motion going on! Here we simply plugged the frameCount value into the loop that determines the angle of the little points around the larger points, hence making them rotate. ## Drawing the wireframe connections First we'll draw the lines that connect the rotating points: ``` rad = 40*dmap; for(a = t; a< TAU+t; a+=TAU/3){ strokeWeight(5*dmap) px = x1 + rad*cos(a); py = x2 + rad*sin(a); point(px,py) prevx = x1 + rad*cos(a+TAU/3); prevy = x2 + rad*sin(a+TAU/3); strokeWeight(1) line(px,py,prevx,prevy) } ``` We can simply do so by offsetting the angle and drawing a line between these two points. More neatly we can write it like this: ``` rad = 40*dmap; div = TAU/3 for(a = t; a< TAU+t; a+=div){ strokeWeight(5*dmap) px = x1 + rad*cos(a); py = x2 + rad*sin(a); point(px,py) prevx = x1 + rad*cos(a+div); prevy = x2 + rad*sin(a+div); strokeWeight(1) line(px,py,prevx,prevy) } ``` Try changing the div parameter in the following code and see what shapes you can get! Next up will be connecting joints in between different segments, for which we'll need to remember the position of the previously drawn point: ``` rad = 40 * dmap; div = TAU / 4; for (a = t; a < TAU + t; a += div) { strokeWeight(5 * dmap); px = x1 + rad * cos(a); py = x2 + rad * sin(a); point(px, py); prevx = x1 + rad * cos(a + div); prevy = x2 + rad * sin(a + div); strokeWeight(1); line(px, py, prevx, prevy); connectx = prevx1 + rad * cos(a); connecty = prevx2 + rad * sin(a); line(px,py,connectx, connecty) } prevx1 = x1; prevx2 = x2 ``` You can see that at this point we're already starting to run out of meaningful names for our variables. The struggles of the creative coder. Either way, doin it like this we'll notice a number of problems. There is an ugly segment drawn straight across the sketch, and the lines don't allign cleanly with the previous joints: The ugly line can simply be fixed with the addition of a counter that checks if we're in the first iteration of the loop or not. Or alternatively we can check if x is equal to to 'off', that would mean that we're still in the first iteration of the loop. In that case we skip drawing the line. Additionally, we need to remember the previous radius, to make the lines connect to the joints exactly. This can be remedied by an additional variable that stores the radius: ## Final Touches ## Squiggly Perlin Noise Movement One last thing I'd like to touch upon is how you could add a little more interesting motion to the sketch. It's a very simple modification: ``` angleOffset = noise(x1/50)*TAU for (a = t + angleOffset; a < TAU + t + angleOffset; a += div) { // ... } ``` We simply add this additional modifier to the loop that determines the angle of rotation of the wireframe joints. What are we actually doing here? We are taking the variable x1 of each point and feed it to the noise function. The noise function gives an output in the range \[0, 1\] which we multiply by TAU to get a meaningful angle. And since x1 is oscillating between two values over and over again, this additionaly noisy value that we add to the angle also loops seamlessly! The entire code would look like what follows: And that's pretty much everything that went into making this little squiggly sketch. There are a few more things that I did for my Centripede sketches that differentiate it from this (which I probably will talk about in a future blog post), but roughly, it's this code that I built upon. If you enjoyed reading this, considering sharing this tutorial with your friends! Otherwise, happy sketching and cheers! ### Making of Gateway URL: https://www.gorillasun.de/blog/making-of-gateway/ Last updated: 2023-04-25T12:02:58.000Z ## Hacking a Beesandbombs Sketch Everything that follows is inspired by a sketch from [Dave Whyte (aka Beesandbombs)](https://twitter.com/beesandbombs?ref=gorillasun.de), that I discovered through the [Concinnus Twitter bot](https://twitter.com/concinnus?ref=gorillasun.de). Aesthetically the sketch is very simple, but geometrically there's a lot going on: > Discovery 35919 [#gif](https://twitter.com/hashtag/gif?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#abstract](https://twitter.com/hashtag/abstract?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#design](https://twitter.com/hashtag/design?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#geometry](https://twitter.com/hashtag/geometry?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#generative](https://twitter.com/hashtag/generative?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#retro](https://twitter.com/hashtag/retro?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#digitalart](https://twitter.com/hashtag/digitalart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) (via [@beesandbombs](https://twitter.com/beesandbombs?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)) [pic.twitter.com/6kBMs5nf94](https://t.co/6kBMs5nf94?ref=gorillasun.de) > > — CONCINNUS (@concinnus) [June 20, 2021](https://twitter.com/concinnus/status/1406552419522297858?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) We'll be using p5js to recreate the sketch, and put our own spin on it. We'll break the sketch up into digestible portions and work from there! Quick index goes here: 1. [Equidistant Points on a Circle](#equidistant-points-on-a-circle) 2. [Infinitely Looping Points](#infinitely-looping-points) 3. [Multiple Sets of Looping Points](#multiple-sets-of-looping-points) 4. [Pseudo Hexagons](#pseudo-hexagons) 5. [Fading Strokes in and out](#fading-strokes-in-and-out) 6. [Offsetting every other loop](#offsetting-every-other-loop) 7. [Aesthetic Touches](#aesthetic-touches) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/gateway.gif) ## Equidistant points on a circle The first thing we'll start with, is creating a set of points that seemingly appear in the center of the sketch, and then disappear at some distance from the center. And then re-appear and disappear again and again. As always, let's start with some boilerplate stuff: ``` function setup() { w = min(windowWidth, windowHeight) createCanvas(w, w); } function draw(){ background(220); translate(w/2,w/2) } ``` Here we're just setting up our canvas in the setup function, to make it fill the size it has available. In the draw loop we're making use of the translate() function. Passing half of the canvas size to both inputs of the translate function will shift the origin of the sketch towards the center of the canvas. Basically, the (0,0) coordinate is now located at the center of the canvas, which will make dealing with coordinates a little bit easier along the way. The next step will be drawing 6 points, that are located equidistantly on a circle. Basically we'll draw the corners of a hexagon: Pretty straight forward so far. Notice how I wrote the for loop that draws the points. Changing the div parameter allows us to draw a different number of points, that are always placed equidistantly from each other. ## Infinitely Looping Points Now for the looping aspect of these points. We'll have to gradually increase the radius of the drawn points until a certain limit, and then make them jump back towards the origin and repeat. We'll need a couple of things for that: ``` let rMax = 150; let completionPercentage = 0; let rate = 0.003; ``` A maximum radius 'rMax', a variable that tracks how far along the way we already are, and a rate that specifies how fast we are moving. Then we'll actually have to increment and reset the completion percentage: ``` completionPercentage += rate; if (completionPercentage > 1){ completionPercentage = 0; } radius = map(completionPercentage, 0, 1, 0, rMax); ``` We can achieve a looping behaviour with the above logic. The variable completionPercentage will always loop from 0 to 1, where we set it's speed with the rate variable. To actually get the corresponding radius, we'll map that \[0 - 1\] range to the \[0 - rMax\] range. That way we can simply change the rMax variable if we want our maximum radius to be larger. And in practice this would look as follows: Try changing the rMax and rate variables! ## Multiple Sets of Looping Points Next, we'll want to have multiple sets of points looping, that are differently offset from each other. We'll need to wrap the code we've written so far in another loop, and make some modifications. I'm not certain if beesandbombs does it like that (they probably don't), but I found that making use of some extra memory makes this pretty easy. We'll create an array in the setup function that'll hold the offset of the points: ``` completionPercentages = []; for(n = 0; n < N; n++){ rateOffset = map(n, 0, N, 0, 1); completionPercentages.push(rateOffset); } ``` Plugging this into our setup function, we'll essentially offset the points before they actually ever get drawn. In this manner our points will also always be equidistantly offset from each other, and we can control how many sets of points we want by setting the global variable N. The entire code would then look like this: We're kind of halfway there already. Well not really, but for the impatient amongst you, we are :). ## Pseudo Hexagons It would be quite easy to simply draw expanding hexagonal shapes now, but since there are gaps in between the lines, we'll have to think of something else. To achieve the lines I used vectors! We'll want to draw two lines that are oriented towards the two adjacent corners/points in the hexagon: ``` //vector that defines the position of the point to the right vRight = createVector( radius * cos(a + TAU/div), radius * sin(a + TAU/div) ); // The angle from the current point to the right point // we do this with the atan2 function angleRight = atan2(vRight.x - x, vRight.y - y); // length of the line drawn, we'll change this later strokeLength = 20; // the strokelength determines how far along the line towards the next point we are // basically scaling the distance vecRight = createVector( x+strokeLength*sin(angleRight), y+strokeLength*cos(angleRight) ); // And finally we draw the line line(x, y, vecRight.x, vecRight.y); ``` I hope the comments explain a little what I did here. We have to repeat these same steps for the left point. We basically find a vector that is oriented towards the two points that are right and left from the current point, and draw lines oriented towards them. The atan2() function allows us to find the angle between two sets of points, which we'll need to correctly slant the drawn lines. And the strokeLength parameter essentially allows us to control the length of the drawn lines. Try going trough it step by step, it'll make more sense that way. The code would then look like this: Doesn't look very pretty yet, but we're basically 90% done at this point. The hardest part is behind us. ## Fading Strokes in and out Yet again, we recurr to one of my favorite tricks: the Distance to the center! We'll essentially want to shrink the lines, the further they are from the center. Very simply we can do this with the inbuilt dist function: ``` d = dist(x, y, 0, 0); dWeight = map(d, 0, rMax, 5, 0); strokeWeight(dWeight); ``` We'll add this little snippet before we draw the points and lines, and we'll get them to smoothly fade into nothingness! But you'll notice that we also don't want them to immediately pop out of nothingness in the center. We'll have to add another short if statement to remedy that: ``` maxStrokeWeight = 5; d = dist(x, y, 0, 0); dWeight = map(d, 0, rMax, maxStrokeWeight, 0); strokeWeight(dWeight); minDist = 10; if(d < minDist){ dWeight = map(d, 0, minDist, 0, maxStrokeWeight); strokeWeight(dWeight); } ``` We'll set an arbitrary distance, in which the strokeWeight will be grown from 0 until it reaches it's maximum and then shrink again. We'll make heavy use of the map function again: Finally, we want to repeat the same steps for the strokeLength of the drawn lines! We can use the same code for the length of the strokes: ``` maxStrokeWeight = 5; maxStrokeLength = 10; d = dist(x, y, 0, 0); dWeight = map(d, 0, rMax, 1, 0); strokeWeight(dWeight*maxStrokeWeight); strokeLength = dWeight*maxStrokeLength minDist = 10; if (d < minDist) { dWeight = map(d, 0, minDist, 0, 1); strokeWeight(dWeight*maxStrokeWeight); strokeLength = dWeight*maxStrokeLength; } ``` And the entire code would look something like this: ## Offsetting every other loop Observing the original sketch closely, we can see that every other loop is angle a little differently. To be precise it's offset by PI/2\. We can achieve this effect in our code by simply checking if the loop index is even or odd, and then add this offset to the angle: ``` for (n = 0; n < N; n++) { if(n%2==0){ shift = PI/2 }else{ shift = 0 } for (a = shift; a < TAU+shift; a += TAU / div) { } } ``` Let's also crank up the number of hexagons: And that's pretty much the entire logic behind the sketch! Last thing we're going to is add a couple of aethetic touches! ## Aesthetic Touches Yet again, we're going to use our trusty background transparency trick for some pseudo motion blur. We'll also color the background in bright red to make our sketch extra spicy: ``` background(255,0,0,80); ``` And in practice this would look like this: And that's a wrap, if you enjoyed this tutorial, share it with your friends! It really helps, it's basically telling google that this post is useful! Anyway, cheers! And happy sketching! ### Making of Gzork URL: https://www.gorillasun.de/blog/making-of-gzork/ Last updated: 2023-04-25T12:03:03.000Z In this blog post we'll recreate my Processing 20-th anniversary fundraiser sketch, step-by-step. **If you're viewing this on your mobile, hit the stop button for the interactive widgets to view the code!** 1. [Creating a Grid](#creating-a-grid) 2. [Alternating Points and Circles](#alternating-points-and-circles) 3. [Animating the Grid](#animating-the-grid) 4. [Distance Fields](#distance-fields) 5. [Adding Color](#adding-color) 6. [Background Transparency Trick](#background-transparency-trick) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Gzork2.gif) ## Creating a Grid The great Persian Polymath Al-Khawarizmi once said: 'Grids are awesome'! well maybe he didn't, but you can't prove that. That doesn't change the fact that grids are awesome. We'll start off by coding up a grid which we'll base our code on in later steps: ``` function setup(){ w = min(windowWidth, windowHeight); createCanvas(w, w); strokeWeight(4); off = 50; spc = 10; } function draw(){ background(220) for (x = off; x < w - off; x += spc) { for (y = off; y < w - off; y += spc) { point(x,y) } } } ``` We have some boiler-plate stuff in the setup function, where we check for the dimensions of the containing window. We check if the height or the width of the window is smaller, to make sure that our sketch is always a square no matter the size of the containing window. Then we declare two variables off (for offset), and spc (for spacing) that let us manage how our grid looks. The offset specifies how large the margins are with regard to the top, bottom and sides of our sketch, determining where ou grid actually starts and ends. The spacing variable simply tells out how spaced out the points in the grid are. The two variables come into action in the draw loop. This is my preffered way of making grids nowadays. ## Alternating Points and Circles The next step would be alternating between points and circles in our grid, this isn't necessary, we could perfectly do with just points, or circles, but it adds an interesting texture. It's also a little tricky to make the grid alternate between two different shapes. We can do that with if and else statements that check if the current coordinates are even or odd: script src="//toolness.github.io/p5.js-widget/p5-widget.js"> Alternatively, we could compress the entire if statement block into a one liner with ternary operators: ``` ((x / spc) % 2 == 0)?((y / spc) % 2 == 0)?point(x,y):ellipse(x,y,5):((y / spc) % 2 == 0)?ellipse(x, y, 5):point(x,y) ``` ## Animating the Grid We can make this grid much more interesting if we add some motion to it, which will give us something that is very similar to some of my [earliest sketches from this year](https://gorillasun.de/blog/Sketch-from-Scratch-1-Colorful-checkerboard-in-P5JS?ref=gorillasun.de). We'll be modulating the strokeWeight of the draw points and circles with a sine function that takes as input their x and y coordinates, allowing us to obtain very interesting patterns: The important line here is strokeWeight(4 + 4\*sin(x/20+y/20+t)) which is doing all the heavy lifting. Here we're dividing by an arbitrary number to attenuate the effect of plugging in the x and y coordinates into the sine function. Try changing the numbers. Also try plugging in different combinations of x and y like x\*y for example and see what patterns you get! ## Distance Fields In addition to plugging a specific value or coordinate into the modulating sine function, we could plug in a distance. For example, the distance of each point to the center of the sketch: Equivalently you could add the distance to multiple points, in as follows: ``` d1 = dist(x, y, w / 2,w/2 ); d2 = dist(x, y, 100, 100); sinin = t + d1 / 20 + d2/20; ``` Plug this into the sketch and see what you get! Lastly you could also make the distance point be the location of the mouse coordinates: ``` d1 = dist(x, y, mouseX, mouseY); sinin = t + d1 / 20 + d2/20; ``` ## Adding Color Instead of using premade color palettes, I enjoy plugging sinusoidal color into the RGB components of the stroke and fill functions. My current favorite palette is the following: ``` stroke( 127.5 + 127.5 * sin(sinin), 127.5 + 127.5 * cos(sinin), 127.5 - 127.5 * cos(sinin) ); ``` This essentially bounces the RGB values in a very specific way between 0 and 255, generating pink, purple and green colors, that gradually interleave: Go ahead and try plugging in different things in each one of the sine and cosine functions to see if you get a result that you like! ## Background Transparency Trick Here's a trick that I heavily use for my sketches, exploiting the transparency of the background color, for some pseudo motion blur: ``` background(0,0,0,20) ``` The transparency component also has a range that goes from 0 to 255\. The lower you set it the more transparent the background. It's effect is hard to describe, but essentially it makes moxing shapes drawn to the canvas have colored smudgy trails. In other words, it takes stuff drawn to the canvas a little while before it disappears again. I also enjoy dark blue backgrounds over just plain black, since it visually works with the sinusoidal color palette: And that's a wrap! If you enjoyed this post share it or leave me a nice comment! If you have questions also leave me a comment! Otherwise come join me on Twitter for more updates! ### How to make Sliders in P5 URL: https://www.gorillasun.de/blog/how-to-make-sliders-in-p5/ Last updated: 2023-04-25T12:03:07.000Z ## Adding sliders to your sketches Creating a slider in p5js is straightforward: ``` let slider; function setup(){ slider = createSlider(0, 255, 100); slider.position(10, 10); slider.style('width', '80px'); } ``` The createSlider function requires 4 input values: min, max, value and step. - **Min:** the smallest value that the slider can represent, inasmuch when you drag the slider thumb all the way to the left. - **Max:** the largest value that the slider can represent, inasmuch when you drag the slider thumb all the way to the right. - **Value:** the default value of the slider, meaning the value that the slider will start with when you create it. Note, it should be in between the min and max value. - **Step:** the value by which the slider is incremented or decremented when you drag it right or left. Basically it determines the spacing between ticks that the slider will snap to. Make sure that this value is smaller than the difference between the Min and Max value, otherwise the slider isn't usable. If set to 0 the slider will move continuously from left to right. The two other lines underneath it specify it's position and it's style. ## Getting slider values Getting the slider value can be done as follows: ``` let val = slider.value(); ``` If done in the draw loop, the variable 'val' will always contain the value to which the slider is set. Here is an example sketch where we set the background color with the three sliders: ## Styling your slider The default slider style doesn't look very nice but we can easily remedy that by using Daniel Stern's awesome [website](http://danielstern.ca/range.css/?ref=css-tricks#/). It lets you customize your sliders simply by dragging other sliders that specify different attributes like color and size of the various parts of your slider. Then you simply copy paste the generated css code into the style.css file of your sketch that is referenced in the index.html of your sketch. Make sure that you add a class of your own for the generated css code: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/sliderStyle1.png) And to add the class to a specific slider you need to call this function: ``` slider.addClass("mySliderStyle"); ``` ## Styling your slider programmatically However you can also style your slider entirely by using the style() function. Here's a great example by [Allison Parrish](https://twitter.com/aparrish?lang=en&ref=gorillasun.de): The style function is super useful in this case, where it let's us set any style keyword directly. ## Updating slider position on window Resize When we want our sketches to be responsive we usually also include the windowResized() function, that triggers when the window containing our sketch is resized. The windowResized will usually look something like this: ``` function windowResized(){ resizeCanvas(windowWidth, windowHeight); } ``` Inside the windowResized() function we're calling the resizeCanvas() function and giving it as inputs the new dimensions of the screen. If you were to do this, while there is a slider on your canvas that you created earlier, you'll notice that it's going to remain in it's previous position and not update along with the new screen dimensions (happens when you click the minimize button in your browser for example). You'll have to update the slider position manually, this involves deleting the slider and then creating it again: ``` let slider; function makeSldr(){ slider = createSlider(0, 255, 127,1); slider.position(width-90, 10); slider.style('width', '80px'); } function setup(){ createCanvas(windowWidth, windowHeight) makeSldr() } function windowResized(){ resizeCanvas(windowWidth, windowHeight); slider.remove() makeSldr() } function draw(){ background(0) } ``` Here we're removing the slider element from the DOM via the remove() function, and then re-adding it to the canvas with the helper function that we created. Try it out for yourself [here](https://editor.p5js.org/AhmadMoussa/sketches/vInrssviE?ref=gorillasun.de) (try in present mode). Try commenting out the slider.remove() line and notice the difference. ## Multiple Sliders Sometimes you'll want to manage multiple parameters at the same time, with multiple sliders and you'd like them to stay in the right place when resizing the canvas. That can get very hairy very quickly. Another problem that we run into when removing the slider from the DOM and re-creating it is that it's default value is reset. This is not good, ideally we want to have the current position of the slider persist while resizing the canvas. One solution would be to create slider handler class in which we wrap the slider and can store the updated slider value: ``` let numSliders = 5; let sliders = []; function sliderHandler(minV, maxV, dflt, step, posX, posY, s){ this.minV = minV; this.maxV = maxV; this.dflt = dflt; this.step = step; this.posX = posX; this.posY = posY; this.s = s; this.slider; this.updatePosition = function(x,y){ this.posX = x; this.posY = y; } this.makeSlider = function(){ this.slider = createSlider(this.minV, this.maxV, this.dflt, this.step); this.slider.position(this.posX, this.posY); this.slider.style('width', s+'px'); } this.removeSlider = function(){ this.slider.remove() } } function setup(){ createCanvas(windowWidth, windowHeight) numSliders = 5; for(n = 0; n ``` And your setup function will look as follows: ``` function setup() { createCanvas(400, 400) /* other stuff you want to do in the setup function */ FPS = 50 frameRate(FPS) createLoop({duration:3, gif:true}) } ``` The createLoop function will automatically render your GIF at the frame rate given to the frameRate() function. Also note that the createLoop() function has a number of other options, a rundown of which you can find in the documentation [here](https://www.npmjs.com/package/p5.createloop?ref=gorillasun.de). One downside that I want to point out, is that when you try to create large GIFs with createLoop(), for example a 10 second GIF at 50 FPS, it will take a significant amount of time. And there is no indication of progress. However it's still being worked on, and might be my go to way in the future. Next up, concatenating your frames into an actual GIF! ## Converting a Series of Frames into a GIF For concatenating individual frames into a GIF we got another slew of different ways to do it. We'll first have a look at two famous CLI (command line interface) tools, namely FFMPEG and ImageMagick. And then we'll have a look at some other online and offline options like ezgif and ScreenToGif ### Command Line Interface Tools The two big contenders in this category are FFMPEG and ImageMagick, which can best be described as "Image Processing and Management" tools, and they can both be used as command line interfaces. It's also very likely that you've used one or the other before, hidden underneath the hood of some other image processing software. Personally I haven't used ImageMagick before, but I can vouch for FFMPEG. I haven't been in a "media convertion" situation where FFMPEG didn't have a command that solved my issue. I've got a full blog post for each one of these in the works, but for now I'll provide quick instructions and a quick command for each one of them. #### Using FFMPEG FFMPEG can be downloaded from [ here ](https://ffmpeg.org/download.html?ref=gorillasun.de), installation instructions can conveniently be found on [ WikiHow](https://www.wikihow.com/Install-FFmpeg-on-Windows?ref=gorillasun.de). A quick command to turn frames into a gif would be: ``` ffmpeg -i %d.jpg output.gif ``` Yes, it's as simple as that with ffmpeg. Obviously this is just the tip of the iceberg, and there's many, MANY more things you can do with it. I'll cover these in detail in a future post. #### Using ImageMagick For our purposes, ImageMagick and FFMPEG are interchangeable, they'll both let you create GIFs from a sequence of frames among other things. ImageMagick is very simple to [install](https://imagemagick.org/script/download.php?ref=gorillasun.de) (simply download the executable and make sure that the 'add PATH' checkbox is checked). A simple command to convert our frames into a GIF would be: ``` magick convert *.png output.gif ``` Neat! Hereby we've covered the two most famous command line interfaces for image processing. Another noteworthy mention here is [gifski](https://gif.ski/?ref=gorillasun.de), another CLI tool. However at this point I'm not certain if it has any advantages over ffmpeg or ImageMagick. ### Using EZGIF Ezgif.com is a simple online GIF maker and toolset for basic animated GIF editing. Granted, I've never used it to convert frames to a GIF, but it's definitely something you can do, if you don't want to bother installing anything on your device. It also has a number of other features, one of which, that I use myself a lot, is the GIF compressor/optimizer, I've almost always been able to shave a couple of megabytes from my GIFs using it. You can create your GIF on the [GIF maker](https://ezgif.com/maker?ref=gorillasun.de) tab, where you simply upload your frames: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/ezgif.png) Naturally, there is a slew of similar websites, but I don't think any of them is as easy to use as ezgif. ### Using ScreenToGif Leaving the best for last, a wonderful little software called ScreenToGif. One of the main features of ScreenToGif is it's ability to capture a portion of your screen and export it as an animated GIf. This feature alone is already reason enough to download it: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/screentogif.png) However, it also has a very polished 'editor' section, which allows you to edit each individual frame of your sequence, and select from a plethora of different export options. It's what I'm currently using to make my GIFs, never has making GIFs been easier: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/screentogif2.png) You could simply record your sketch's canvas with ScreenToGif's recording window, which is fine for WIP stuff, however the recommended way of doing it is first exporting the individual frames of your gif one by one and then loading them into the editor. And that's a wrap! If there's any other methods you'd like me to add in the future let me know in the comments. If there's any parts you'd like me to elaborate on, also let me know in the comments. Otherwise, cheers and happy sketching! ### Perlin Noise Flow Fields in Processing - Part II URL: https://www.gorillasun.de/blog/perlin-noise-flow-fields-in-processing-part-ii/ Last updated: 2023-06-30T19:55:59.000Z ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fieldColorDashedShort61.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fieldColorDashedShort62.png) In this part of the tutorial we'll tackle drawing the flow lines that go through the flow field. 1. [Selecting a starting Point](#selecting-a-starting-point) 2. [Flow Line Algorithm](#flow-line-algorithm) 3. Drawing the Flow-Field 4. [Choosing Hyper-Parameters](#choosing-hyper-parameters) ## Selecting a starting Point As Tyler Hobbs discusses in his essay, there a number of choices that we have to consider now. For example, how we decide the starting points of our flow lines. For now we'll just choose them at random. We can do so by selecting a random GridAngle from our array, like so: ```java int x = (int)random(grid.size()); y = (int)random(grid.size()); GridAngle ga = grid.get(x).get(y); ``` Alternatively we could also iterate over each grid angle and draw a respective flow line. ## Flow Line Algorithm Then from that starting point the basic strategy will be to draw a line that follows the direction of the angles that fall directly underneath it. Similarly to how a river digs it's way through soil and earth. We do this incrementally, from our starting point we search for the nearest point in the grid and get it's angle, then extend our line in the direction of that angle and repeat. ``` beginShape(); PVector vec = ga.v.copy() curveVertex(vec.x, vec.y); ``` Again, we'll make use of our good old friend the curveVertex() function to help us draw our flow lines. We take the angle from the starting point we selected, and store it in a new variable called vec, we'll extend our line from here. The next part, I'll be honest with you, is quite inefficient. And can be improved in multiple ways, but to keep it simple we'll first do it this way and then maybe improve it later. The inefficiency comes from finding the point that is closest to the current end of our line, the brute force way (which we're doing) is going through all points in the grid and finding the one that has the smallest distance to end of the flow line. For this process we'll need a couple of parameters: ```java // Used to check for the closest point in the grid float minDist = Float.MAX_VALUE; float dist = 0.0; // indices of closest point in the grid int nearestX = 0; int nearestY = 0; // stores closest point in grid GridAngle tempGA; // stylistic parameters controlling the line length int lineLength = 50; float segmentLength = 2; ``` These'll make more sense in a second. We'll start by creating three loops, the first one specifying how many times we would like to extend our flowline (hence determining the overall length of it) and then a nested loop that goes over all the GridAngles in our ArrayList: ```java for (int n = 0; n> grid = new ArrayList>(); final int xOff = 100; final int yOff = 100; final int spacing = 12; final float rez = 0.0005; final int numLines = 5000; final int lineLength = 100; final float segmentLength = 2; class GridAngle { int x, y, r; float angle; PVector v; GridAngle(int x_, int y_, int r_, float angle_) { x = x_; y = y_; angle = angle_; r = 1; v = new PVector(x + r * cos(angle), y + r * sin(angle)); } void display() { strokeWeight(2); line(x, y, v.x, v.y); } } void drawFlowLine() { GridAngle fa = grid.get((int)random(grid.size())).get((int)random(grid.size())); beginShape(); //PVector vec = new PVector(fa.x + 1 *cos(fa.angle), // fa.y + 1 * sin(fa.angle)); PVector vec = fa.v; curveVertex(vec.x, vec.y); float minDist = Float.MAX_VALUE; float dist = 0.0; int nearestX = 0; int nearestY = 0; GridAngle tempFA; for (int n = 0; n row = new ArrayList(); for (int y = -yOff; y It's entirely possible that I've used them in more programs than any other person alive. > ECTOGENESIS, 2019 [pic.twitter.com/zFFqtaO570](https://t.co/zFFqtaO570?ref=gorillasun.de) > > — Tyler Hobbs (@tylerxhobbs) [June 6, 2021](https://twitter.com/tylerxhobbs/status/1401555981402771456?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Components of a Flow Field Making a flow field essentially consists of two parts, firstly creating a grid of angles, and secondly drawing flow lines whose curvature is guided by this grid. This will make more sense in a second. Since this is a little bit loaded we'll split these two parts up into separate blog posts. The grid in this one, and the flow lines in the next one. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/grid-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/flow-1.png) The flow lines here look a bit weird, but we'll make them look much nicer along the way. ## Creating a Grid of Angles The very first thing we'll want to do is create a custom class for the angles in our grid. This will make things more convenient for us later on. If you're not used to Java syntax this might be a little confusing at first, especially if you're used to javascript (and/or python) which is very permissive with it's variable types. Generally, in java you need to specify the type of a variable when you first create it, and mixing between different variable types can lead to odd errors and unexpected behaviour that can take some time to debug. Let's start with a simple class in java: ``` class GridAngle { int x, y; GridAngle(int x_, int y_){ x = x_; y = y_; } } ``` This class doesn't do anything yet, but simply serves as an example of the syntax involved in writing a java class. The member variables are declared within the space directly after declaring the class with the class argument and class name. The constructor is designated by the class name and accepts input parameters. When creating a function, be it a constructor or any other function that accepts input parameters, you're required to specify the type of the variable by preceding it with the correct keyword, similarly to any other time you create a new variable in Java. The actual class that we're going to use has some more stuff going on, as follows: ```java class GridAngle { int x, y, r; float angle; PVector v; GridAngle(int x_, int y_, int r_, float angle_) { x = x_; y = y_; angle = angle_; r = r_; v = new PVector(x + r * cos(angle), y + r * sin(angle)); } void display() { strokeWeight(2); line(x, y, v.x, v.y); } } ``` Take a second and read through the code. Here the class simply consists of a position and an angle. Processing's vector class 'PVector' will help us when drawing the the flowlines through the grid, and also allows us to visualize the grid. Now that we have created this GridAngle class, we'll actually want to create some instances of it and store them somehow in a gridlike manner. This will require us to store our instances in an array, which is a little bit tricky in Java. Generally when creating an array in Java, you need to know it's size beforehand, to allocate the appropriate amount of space in memory. This won't work for us, since we want to have a grid that can have a different number of items depending on the parameters. ## Array Lists in Java However there is a way, using something called an ArrayList! It's essentially an array like data-structure in java, that allows easy addition and manipulation of items within it. Maybe the scariest thing about it is the way it's instantiated: ```java final ArrayList> vectors = new ArrayList>(); ``` Let's go through this step by step! The final keyword here is similar to the 'const' keyword in javascript that declares a constant. Don't worry, this won't mean that we can't modify our ArrayList anymore, simply that we can't reassign its reference. A more elaborate discussion can be found [here](https://stackoverflow.com/questions/10750791/what-is-the-sense-of-final-arraylist?ref=gorillasun.de). Next up, ArrayLists can only hold one data type, which needs to be specified in the space between the arrow brackets, so for example, if we were to create an ArrayList of integers, we would do it as follows: ``` ArrayList numbers = new ArrayList(); ``` This means we can create an arraylist of arbitrary data types, even ones we create ourselves, such as the GridAngle class we created earlier: ``` ArrayList gridangles = new ArrayList(); ``` To make this a nested ArrayList we simply create an Array List that can hold other Array Lists: ``` ArrayList> gridangles = new ArrayList>(); ``` Makes sense right? ## Populating the Grid In addition to that we'll also need a couple of other parameters and a function that actually fills this ArrayList: ```java final int xOff = 50; final int yOff = 50; final int spacing = 10; final float rez = 0.0005; ``` The function that fills our ArrayList will look as follows, and this is actually where we'll make use of Perlin Noise: ```java void createGrid() { for (int x = xOff; x row = new ArrayList(); for (int y = yOff; y> grid = new ArrayList>(); final int xOff = 50; final int yOff = 50; final int spacing = 10; final float rez = 0.005; class GridAngle { int x, y, r; float angle; PVector v; GridAngle(int x_, int y_, int r_, float angle_) { x = x_; y = y_; angle = angle_; r = r_; v = new PVector(x + r * cos(angle), y + r * sin(angle)); } void display() { strokeWeight(2); line(x, y, v.x, v.y); } } void createGrid() { for (int x = xOff; x row = new ArrayList(); for (int y = yOff; y0.8){ endShape(); beginShape(); } } endShape(); } noLoop(); } ``` This conditional statement is triggered by the random() function, which returns a random float between 0 and 1), and if this number is larger than a specific threshold (0.8 here, tune to taste), we will call the endShape() function followed by the beginShape() function again. This will randomly end the current ring and begin drawing it again. We get something that looks like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/disconnectedrings1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/disconnectedrings2.png) Our rings are starting to look a lot more like tree rings and/or fingerprints actually, but we can do better! What if we were to reduce this threshold the further we move outwards with our rings? Or alternatively we could modulate this threshold with a sine wave! Takes only a minimal modification to achieve fascinating new results! ```javascript function setup() { createCanvas(400, 400); background(255); stroke(20); strokeWeight(1); noFill(); } let scale = 50; let resolution = 0.002; let numPoints = 500; let radius = 150; let numRings = 40; function draw() { for (r = 0; r < radius; r += radius / numRings) { beginShape(); for (a = -TAU/numPoints; a < TAU+TAU/numPoints; a += TAU / numPoints) { var x = width/2 + r * cos(a); var y = height/2 + r * sin(a); var n = map(noise(x * resolution, y * resolution), 0, 1, -scale, scale); curveVertex(x + n, y + n); if(random()>0.75-0.25*sin(r)){ endShape(); beginShape(); } } endShape(); } noLoop(); } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/fingerprint.png) And this is about it, in this manner I've already given you the keys to the Lamborghini and the generative tree rings are only a step away! Feel free to experiment with this and send your creations my way! If you enjoyed this blog post, feel free to follow me on my social media where I post all of my creations! ### Smooth curves with Perlin Noise and Recreating the Unknown Pleasures Album Cover in P5 URL: https://www.gorillasun.de/blog/smooth-curves-with-perlin-noise-and-recreating-the-unknown-pleasures-album-cover-in-p5/ Last updated: 2023-06-30T19:26:55.000Z This is part three of the explorative series on Perlin Noise in p5js (and processing). In this blog post we'll have a look at making smooth curves with the curveVertex() function. We'll also be recreating Joy Division's famous album cover for 'Unknown Pleasures'! ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/uknown_pleasures-2.png) Before starting the technical aspect of this blog post, it might be interesting to have a look at the story behind the album cover and what it represents. The original album cover was designed by [Peter Saville](https://en.wikipedia.org/wiki/Peter%5FSaville%5F%28graphic%5Fdesigner%29?ref=gorillasun.de) and originates from The Cambridge Encyclopedia of Astronomy, representing radio waves from pulsar CP1919 (a highly magnetized rotating compact star that emits beams of electromagnetic radiation). Originally white with black lines, Svaille decided to invert the colors: > Saville reversed the image from black-on-white to white-on-black, against the band's stated preference for the original. "I was afraid it might look a little cheap. I was convinced that it was just sexier in black" since it represented a signal from space. I also think that it's quite awesome that the artwork holds a meaning beyond that of simply being the cover for Joy Division's album. A little more about what CP1919 is: > In simple terms, the image is a “stacked plot” of the radio emissions given out by a pulsar, a “rotating neutron star”. Originally named CP 1919, the pulsar was discovered in November 1967 by student Jocelyn Bell Burnell and her supervisor Antony Hewish at Cambridge University. As the star turns, it emits electromagnetic radiation in a beam like a lighthouse, which can be picked up by radio telescopes. Each line on the image is an individual pulse. They’re not exactly the same each time as the long distance the beam travels introduces interference. This is a great source of inspiration: data visualization as an artform! Next we'll get into recreating this album cover! ## The Sketch If you're not familiar with the curveVertex() function, it simply allows you to connect a number of coordinates, and rather than doing so with jagged line segments, it will draw a continuously smooth line through all the coordinates (maybe I will write a post about it in detail in the future). Before we start calling the curveVertex function a number of times, we'll have to indicate that we are drawing a new shape by calling beginShape() and conclude with endShape() after we have gone over all our coordinate points. The next example will make this much clearer. First let's simply draw a line with the curveVertex() function in p5js. We can do this by invoking the beginShape() statement before the for loop, step through several positions with the loop and then end the shape with the endShape() function call. There's probably a thousand different ways you could do this, and here's mine: ```javascript function setup() { windowSize = min(windowWidth,windowHeight) createCanvas(windowSize, windowSize); xOff = 50 } function draw() { background(220); beginShape(); for (i = xOff; i < width-xOff; i+=10) { curveVertex(i,200) } endShape(); } ``` We get something that looks pretty much like a simple line, however ours is made up of several small segments. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example0.png) Next let's add some Perlin noise to deform this line. We'll want to offset the y positions of the points that make up our line. An important detail we have to consider here, is what we feed to the noise function as input and how we scale it. Remember that the noise function returns smoother noise the closer the inputs are to each other. Our line is drawn by incrementing by 10 in the loop, let's see what that would look like: ```javascript beginShape(); for (i = xOff; i < width-xOff; i+=10) { curveVertex(i,height/2+noise(i)*50) } endShape(); ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example1.png) This looks decent, minus the white regions. Call noFill() in the setup function to get rid of those. We also need to multiply the noise by some number to make visible (remember noise returns a value between 0 and 1). Next we'll want to have the deformation at the center to be much more prominent than that towards the edges of the line. We can do this by scaling the deformation with respect to it's distance to the center: ```javascript beginShape(); for (i = xOff; i < width-xOff; i+=25) { var d = dist(i,height/2,width/2,height/2) curveVertex(i, height/2-noise(i*0.08)*(100-d)) } endShape(); ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/example3-1.png) This might not be the absolute best way to do it, as the deforming noise needs to be scaled inversely proportional to the it's distance from the center. Also notice that we changed the scaling factor and the number of steps of our for loop. However, you'll have to play with these yourself to find a look that you like. Next up is repeating this pattern several times, which can be done by wrapping it in another loop: ```javascript for(n = 0; n Another way to adjust the character of the resulting sequence is the scale of the input coordinates. As the function works within an infinite space the value of the coordinates doesn't matter as such, only the distance between successive coordinates does (eg. when using noise() within a loop). As a general rule the smaller the difference between coordinates, the smoother the resulting noise sequence will be. Steps of 0.005-0.03 work best for most applications, but this will differ depending on use. Hence we can simply multiply or divide the input coordinates by a number: ```javascript var n = noise(i*0.005,j*0.005) ``` And we should obtain a canvas that looks like it has a cloudy/milky texture to it, which is the desired effect and what 2D perlin noise looks like: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perlin_noise_0.05.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perlin_noise_0.005.png) 0.05 | 0.005 Depending on your use case you might want to use a different scale, 0.05 also looks good in this case (image on the right). But remember that it also depends on the stride at which we're drawing our rectangles to the canvas. Another cool thing about this is that 2D Perlin Noise is an infinite space, such that if we were to increment the input coordinates at each time step, we can obtain an infinitly scrolling effect: ```javascript //in the draw loop for(i = 0; i < height; i+=3){ for(j = 0; j < width; j+=3){ var n = noise(i*0.005 + t,j*0.005+t) fill(n*255) rect(i,j,3) } } t+=0.05 ``` Incrementing the x and y coordinates every draw loop, allows us to shift the noise landscape. This makes it seem as if we were flying above a landscape: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/infinite_scroll_perlin_noise_x_and_y.gif) ```javascript var n = noise(i*0.005+t,j*0.005) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/infinite_scroll_perlin_noise_x_only.gif) ```javascript var n = noise(i*0.005,j*0.005+t) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/infinite_scroll_perlin_noise_y_only.gif) If we were to multiply or divide it we would obtain a zoom out / zoom in effect respectively. For zooming out and zooming in respectively: ``` var n = noise(i*0.005*t,j*0.005*t) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zoom_out_multiplication.gif) ```javascript var n = noise(i*0.005/t,j*0.005/t) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/zoom_in_division.gif) Naturally, you can get more creative by plugging in different functions into the noise() function. # 3D Perlin Noise The little tricks we did above are neat, but what if we want to modulate the noise texture itself with time? That's where the 3rd parameter comes into play, here we keep the position of the perlin space the same, but modulate the color of each square via the 3rd parameter, in this sense the 3rd parameter is the z axis and is manifests itself as a change of color of each rectangle. This allows us to obtain a wobbly texture that seems to wobble back and forth: ```javascript function setup() { createCanvas(200, 200); } let t = 0 let rez = 0.05 function draw() { background(220); noStroke(); for(i = 0; i < height; i+=3){ for(j = 0; j < width; j+=3){ var n = noise(i*rez,j*rez, t) fill(n*255) rect(i,j,3) } t += 0.0003 } } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3d_noise.gif) We can also leverage this to obtain some color in our sketch, we simply create three different noise variables and plug their result into the respective r, g and b inputs of the fill() method: ```javascript let t = 0 let rez = 0.05 function draw() { background(220); noStroke(); for(i = 0; i < height; i+=3){ for(j = 0; j < width; j+=3){ var n = noise(i*rez,j*rez, t) var n1 = noise(j*rez, t, i*rez) var n2 = noise(t,j*rez,i*rez) fill(n*255, n1*255, n2*255) rect(i,j,3) } t += 0.0003 } } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/3D_color_noise.gif) And to wrap up, you could also get creative with a chromatic wash like this: ```javascript var n1 = noise(i*rez,j*rez, t) var n2 = noise(i*rez-t,j*rez, t) var n3 = noise(i*rez+t,j*rez, t) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/chromatic_wash.gif) And that's about it, in the next tutorial we'll have a look at making smooth curves with perlin noise and the curveVertex() function. ### Perlin Noise Surface Textures and Scrolling Tricks URL: https://www.gorillasun.de/blog/perlin-noise-surface-textures-and-scrolling-tricks/ Last updated: 2023-06-30T19:02:42.000Z ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Perlin-Landscape.gif) This is the second part of the explorative series on Perlin Noise in P5JS and Processing, and focuses on applying Perlin Noise to a 2 dimensional grid of items on the canvas and how we can obtain interesting surfaces and textures in this manner. We've already had a look at scrolling perlin noise across the canvas by increasing one or multiple noise parameters over time. However, creativity doesn't stop there! ## Quantizing the noise values I'm not sure if this specific technique has a name, but it essentially consists of quantizing the value from the nosie() function. When we feed grid coordinates (scaled by some scale parameter), the noise() function returns smooth and continuous values that resemble a landscape. We can use this to create interesting patterns in combination with quantization. Think about it like a real lanscape, where we shave off mountain tops that are higher that a very specific altitude, and flatten everything around it. The formal definition of quantization is: > Quantization is the process of constraining an input from a continuous or otherwise large set of values (such as the real numbers) to a discrete set (such as the integers). A simple cisual example in code: ``` function setup() { createCanvas(301, 301); t = rez = c = n = 0.008; strokeWeight(3); } function draw() { background(0); noStroke(); for (i = 0; i < height; i += 3) { for (j = 0; j < width; j += 3) { n = noise(i * rez, j * rez); //uncomment the next line to see difference between noise() and random() //n = random() if(n>0.6){ fill(255); }else{ fill(0); } rect(i, j, 3); } } noLoop() } ``` This allows us to obtain these blob like separation between the black and white areas: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perlin-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/perlin-2.png) If we were to replace the noise() function with random, we would get something that is much more similar to static noise: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/noise-1.png) ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/noise-2.png) Obviously, we are not limited to quantizing to only two distinct values, we could quantize to an arbitrary amount of values. Here I'm using ternary conditional statements: ``` function setup() { createCanvas(301, 301); t = rez = c = n = 0.008; strokeWeight(3); } function draw() { background(0); noStroke(); for (i = 0; i < height; i += 3) { for (j = 0; j < width; j += 3) { n = noise(i * rez, j * rez + t) * 3; n > 3 ? (c = 3) : n > 2 ? (c = 2) : n > 1 ? (c = 1) : (c = 0); fill(c*100); rect(i, j, 3); } } t += 0.01; } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Simple-quantized.gif) ## Landscape In this manner we could quantize the values to different colors and obtain and almost landscape like scrolling surface: ``` function setup() { createCanvas(400, 200); t = rez = c = n = 0.005; strokeWeight(3); cols = [ "#f94144", "#f3722c", "#f8961e", "#f9844a", "#f9c74f", "#90be6d", "#43aa8b", "#4d908e", "#577590", "#277da1", ]; } function draw() { background(0); noStroke(); for (i = 0; i < width; i += 3) { for (j = 0; j < height; j += 3) { n = noise(i * rez, j * rez + t) * 10; n > 9 ? (c = 9) : n > 8 ? (c = 8) : n > 7 ? (c = 7) : n > 6 ? (c = 6) : n > 5 ? (c = 5) : n > 4 ? (c = 4) : n > 3 ? (c = 3) : n > 2 ? (c = 2) : n > 1 ? (c = 1) : (c = 0); fill(cols[c]); rect(i, j, 3); } } t += 0.01; } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Perlin-Landscape-2.gif) ## Landscape + Tiling ``` function setup() { createCanvas(301, 301); t = rez = c = n = 0.02; strokeWeight(3); } function draw() { background(0); noStroke(); for (i = 0; i < height; i += 3) { for (j = 0; j < width; j += 3) { n = noise(i * rez, j * rez + t); if(n > 0.5){ fill(0); }else{ fill(127.5*127.5*sin(i*0.02+millis()/1000), 127.5*127.5*cos(j*0.02+millis()/1000), 127.5) } rect(i, j, 3); } } t += 0.08; } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/quantized-interesting.gif) ``` if(n > 0.5){ fill(127.5*127.5*sin(i*0.02+millis()/3000), 127.5, 127.5*127.5*cos(j*0.02+millis()/3000),) }else{ fill(127.5*127.5*sin(i*0.02+millis()/3000), 127.5*127.5*cos(j*0.02+millis()/3000), 127.5) } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/quantized-interesting-2.gif) ## Truchet Tiling We can also mess around with simple truchet tiling, where the angle of the line is determined by the value of the noise at that particular point: ``` function setup() { createCanvas(301, 301); t = rez = c = n = 0.02; strokeWeight(2); } function draw() { background(0); //noStroke(); stroke(255) for (i = 0; i < height; i += 10) { for (j = 0; j < width; j += 10) { n = noise(i * rez, j * rez + t); if(n > 0.5){ line(i,j,i+10,j+10) }else{ line(i+10,j,i,j+10) } } } t += 0.01; } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Perlin-Truchet-Tiling.gif) We can get more creative with this by offsetting the tiles differently: ``` if(n > 0.5){ line(i+n*10,j+n*10,i+10,j+10) }else{ line(i+10,j,i,j+10) } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Perlin-Truchet-Tiling-2.gif) Equivalently we can add more conditional statements to make this texture more interesting, and don't necessarily have to animate it: ``` function setup() { createCanvas(601, 601); t = rez = c = n = 0.022; strokeWeight(2); frameRate(30) //createLoop({duration:5, gif:true}) xOff = 50 yOff = 50 } function draw() { background(0); //noStroke(); stroke(255) for (i = xOff; i < width-xOff; i += 10) { for (j = yOff; j < height-yOff; j += 10) { n = noise(i * rez, j * rez + t); drawingContext.setLineDash([n*5,n*10]) if(i - 40 < mouseX && i + 40 > mouseX && j - 40 < mouseY && j + 40 > mouseY){ drawingContext.setLineDash([n*5,n*10]) } if(n>0.65){ drawingContext.setLineDash([n*5,1]) stroke(255,0,0) }else{ stroke(255) } if(n > 0.5){ line(i,j,i+10,j+10) }else{ line(i+10,j,i,j+10) } } } t += 0.01; noLoop(); } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/cartridge.png) Alternatively we can also animate this and add more variation: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Corrupt-Datastream.gif) **And that's is it for this article! If you've enjoyed this post consider sharing it on your socials, with friends and/or family that share an interest in creative coding - otherwise cheers and happy sketching \~ Gorilla Sun 🌸** ### Simulating Brush Strokes with Hooke's Law in P5JS and Processing URL: https://www.gorillasun.de/blog/simulating-brush-strokes-with-hookes-law-in-p5js-and-processing/ Last updated: 2023-07-23T14:17:38.000Z ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Kanji.gif) One continuous big source of inspiration for me has been Processing's [Discover Tab](https://openprocessing.org/browse/?ref=gorillasun.de), where you can browse sketches from different users and see what they have come up with. Recently one in particular caught my eye, that allows you to draw brush strokes in a style reminiscent of the far east. The behaviour of these brush strokes felt very fluid and responsive, so I dug little deeper and had a look at the code (you can view the code for every sketch on there!). The [sketch](https://openprocessing.org/sketch/755877?ref=gorillasun.de) was made by Twitter user [@BUN\_information](https://twitter.com/BUN%5Finformation?ref=gorillasun.de), and has even made a very nice tutorial for his code [here](https://openprocessing.org/sketch/793375?ref=gorillasun.de). > OpenProcessing[https://t.co/pQxLY5e50H](https://t.co/pQxLY5e50H?ref=gorillasun.de) > > GitHub[https://t.co/DZBU9LhTue](https://t.co/DZBU9LhTue?ref=gorillasun.de) > > 「解説書くならせっかくだし」と思ってOpenProcessingのTutorial Modeを使ってみたけど… > 油断するとすーぐ文章長くなりがち。そして解説になってない。英語も正しいかどうか怪しい。 > いいよもう。ふーんだ。[#Processing](https://twitter.com/hashtag/Processing?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [https://t.co/nRRqkppCIy](https://t.co/nRRqkppCIy?ref=gorillasun.de) [pic.twitter.com/kmg5xdplHs](https://t.co/kmg5xdplHs?ref=gorillasun.de) > > — BUN (@BUN\_information) [November 15, 2019](https://twitter.com/BUN%5Finformation/status/1195300719231791104?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This blog post's purpose is to explain and adapt this code for p5js. BUN divides his tutorial into 6 parts, where each part introduces new behaviour and comlexity to the brush stroke. The first part is very simple, we simply draw circles at the cursor's location and go from there: ``` function setup() { createCanvas(400, 400); } // brushSize simply is the thikness of the brush stroke let brushSize = 20; function draw() { if(mouseIsPressed) { strokeWeight( 3 ); circle( mouseX, mouseY, size ); } } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step1.gif) The second step will actually improve the drawing behaviour significantly by implementing Hooke's Law. Essentially, we're not drawing the ellipses at the exact mouse coordinates anymore, but are applying a modifiers to the coordinates. It will almost feel like the drawn ellipses are dragged behind the mouse cursor, as if they were attached to a spring, and once you stop moving the cursor, it will actually overshoot and then snap back ellastically to a resting position. I'm not a physics whizz, but I will try my best at explaining the concept. Picture an imaginary spring, where one end is attached to the circle that we're drawing, and the other end is connected to your cursor. This spring has an ellastic behaviour, when you begin dragging one end, meanwhile the other end, to which our circle is attached, will start dragging behind it. The faster you drag one end the more this spring will be stretched out and the harder the snap-back will be when you come to a rest. The trick here is to somehow simulate this behaviour, and it can be done with Hooke's Law. Hooke's Law states that the force F by which a spring is displaced can be calculated with the following formula: ``` F = k*x ``` Where x is the amount of displacement from the beginning of dragging the spring, and k is a parameter characteristic of the spring. We can actually choose this parameter, which simply signifies the elasticity of the spring. In BUN's code, we first calculate the velocity of our cursor while it is moving (velocity being a vector quantity that defines the distance traveled over some period of time). The amount of displacement is simply the distance between the moment we pressed the mouse to where we moved the mouse, and will be the x parameter in Hooke's formula. For now well simply choose k to be 0.5 for a balanced behaviour (k should be between 0 and 1). One thing to note here, is that we need to calculate the formula for both x and y coordinates, since we're moving on a 2D plane: ``` vx += ( mouseX - x ) * spring; vy += ( mouseY - y ) * spring; ``` Now, we would end up with a very erratic behaviour, where the spring seems to never come to a stop, and keeps oscillating around the cursor's rest position: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step2wrong-1.gif) This is because we ignored one variable that occurs in the physical world: friction. Friction, like the spring parameter, is a variable between 0 and 1, where values closer to 1 designated less friction and values closer to zero designate more friction. We simply multiply our velocity by this friction parameter. And we will obtain a nice behaviour. The code should look like this now: ``` function setup() { createCanvas(400, 400); } // brushSize simply is the thikness of the brush stroke let brushSize = 20; let f = 0.5; let spring = 0.5; let friction = 0.5; function draw() { /* Smoother movement than using mouse coordinates */ /* Parameters used size : Brush size spring : Spring constant(Larger value means stronger spring) friction : Friction(Smaller value means, the more slippery) */ if(mouseIsPressed) { if(!f) { // Initialize coordinates f = true; x = mouseX; y = mouseY; } // Calculate velocity /* MEMO : Use Hooke's law to make spring motion DistanceX = (X1 - X0) SpringConstant = (value between 0 and 1) AccelerationX = DistanceX * SpringConstant VelocityX = ( VelocityX + AccelerationX ) * Friction */ vx += ( mouseX - x ) * spring; vy += ( mouseY - y ) * spring; vx *= friction; vy *= friction; x += vx; y += vy; // Draw at the calculated coordinates strokeWeight( 3 ); circle( x, y, brushSize ); // AMEND: mouseX, mouseY -> x, y } else if(f) { // Reset state vx = vy = 0; f = false; } } ``` It might not be very obvious from the gif, but it's remarkable if you try it yourself. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step2-1.gif) In the third part of the tutorial, we begin making some changes to make the drawn circles look more like strokes, rather than just circles. Generally, in chinese, japanese and korean calligraphy, symbols can be drawn in different styles and different speeds, where the speed at which the calligraphy is made is a characteristic feature. When drawn slow, strokes tend to be thicker and heavier; when drawn faster, less pressure is put on the strokes and they tend to be thinner. This is what BUN tries to achieve in this part of the tutorial, drawn circles should be smaller (thinner), in the middle portion of the stroke, the start and end points of the stroke should be thicker, as more pressure is put on the brush. This behaviour can be simulated by calculating the stroke thickness as a function of the velocity. Essentially, the faster we are drawing, the higher the velocity, the thinner is our stroke. ``` v += sqrt( vx*vx + vy*vy ) - v; v *= 0.6; ``` We also need to ensure a minimum width of 1, so that the stroke doesn't completely vanish. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step3.gif) In part 4, we actually make the stroke look much more like a stroke than just ellipses. It's actually very impressive how stacking these simple rules allow us to simulate such complex behaviour. Here, instead of drawing separate circles, we'll draw lines between the points where we would have drawn circles instead, this can be done by simply adding an intermediary variable that stores the previous circles coordinates. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step4.gif) However you can see that the different line segments that make up the stroke can look a little discontinuous and jagged when drawn at higher speeds. Part 5 tries to ammend this by splitting up the line segments into multiple smaller chunks to smooth these portions. ``` for( let i = 0; i < splitNum; ++i ) { // ADD oldX = x; oldY = y; x += vx/splitNum; // AMEND: vx -> vx/splitNum y += vy/splitNum; // AMEND: vy -> vy/splitNum oldR += (r-oldR)/splitNum; if(oldR < 1) { oldR = 1; } // AMEND: r -> oldR strokeWeight( oldR ); // AMEND: r -> oldR line( x, y, oldX, oldY ); } ``` Where you can choose a value for the 'splitNum' parameter, that determines into how many subsegments you want to split your lines. ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step5.gif) We could already stop here, but the last part will put a finishing touch on our brush strokes and make them look much more realistic. In part 6 we draw multiple lines offset from each by a tiny amount and make them have variable thickness: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/03/Step6.gif) The final code will look like this: ``` function setup() { createCanvas(1000, 1000); } // brushSize simply is the thikness of the brush stroke let brushSize = 40; let f = 0.5; let spring = 0.4; let friction = 0.45; let v = 0.5; let r = 0; let vx = 0; let vy = 0; let splitNum = 100; let diff = 8; function draw() { if(mouseIsPressed) { if(!f) { f = true; x = mouseX; y = mouseY; } vx += ( mouseX - x ) * spring; vy += ( mouseY - y ) * spring; vx *= friction; vy *= friction; v += sqrt( vx*vx + vy*vy ) - v; v *= 0.6; oldR = r; r = brushSize - v; for( let i = 0; i < splitNum; ++i ) { oldX = x; oldY = y; x += vx / splitNum; y += vy / splitNum; oldR += ( r - oldR ) / splitNum; if(oldR < 1) { oldR = 1; } strokeWeight( oldR+diff ); // AMEND: oldR -> oldR+diff line( x, y, oldX, oldY ); strokeWeight( oldR ); // ADD line( x+diff*1.5, y+diff*2, oldX+diff*2, oldY+diff*2 ); // ADD line( x-diff, y-diff, oldX-diff, oldY-diff ); // ADD } } else if(f) { vx = vy = 0; f = false; } } ``` And this is about it! Many thanks to BUN for sharing his code, and I recommend giving him a follow on [OpenProcessing](https://openprocessing.org/user/187469?view=sketches&ref=gorillasun.de) or on [Twitter](https://twitter.com/BUN%5Finformation?ref=gorillasun.de) to keep up with his creations! There are actually many different algorithms for simulating brush strokes, which I might cover when I learn more about them! Cheers, if you enjoyed this post consider giving me a follow on Twitter and sharing this, until next time! ### Dashed Lines in P5JS URL: https://www.gorillasun.de/blog/dashed-lines-in-p5js/ Last updated: 2023-09-23T16:56:22.000Z ![](https://gorillasun.de/assets/images/2021-04-30-Animated-Dashed-Lines-in-P5JS/cut.gif) Okay, so this is a long one. Drawing dashed lines in P5 from scratch and animating them was a tough one, but I'm super happy with my results and stoked to share the code in this post, especially with the insights I've gained from writing this code. I highly recommend attempting to make what you see above from scratch on your own, and then come back when you hit a roadblock, otherwise enjoy the post! Let's go: 1. Dashed lines with the js drawing context 2. Drawing a line between two coordinates 3. Adding the dashed line style 4. Fixing the final protruding dash 5. Code for static dashed lines 6. Pumping forward animation 7. Cleaning up the animation 8. Final code for animation 9. Reverse Speed ## Dashed lines with the drawing Context Drawing a line in P5JS is very easy and can be done with a single line of code. You simply need to know the coordinates of the starting point and the end point: ``` line(0,0,100,100) ``` Drawing a dashed line in P5JS is also relatively easy, however requires you to invoke the 'drawingContext' as pointed out in this Github [issue](https://github.com/processing/p5.js/issues/3336?ref=gorillasun.de): ``` drawingContext.setLineDash([5, 15]); line(0,0,100,100) ``` The setLineDash() function receives an array of two parameters which specify the length of the dashes that will make up your line and the spacing in between these dashes. If you simply want to draw dashed or dotted lines this might be sufficient for you. However I wanted a little more comlpex behaviour from my lines. ## Drawing a line between two Points Drawing custom dashed lines from scratch, that have an animated behaviour, requires quite a little bit of code. What follows is my attempt at making animated dashed lines in P5JS, but is no way the optimal approach to doing so. As usual, we will heavily rely on Object Oriented programming by modeling the dashed line as a class and giving it behaviour through functions and member variables. First order of business will be drawing a line manually between two sets of coordinates. This involves finding the angle that the line forms with the x axis, which can be done with the atan2() function: ``` // angle formed by the line going from point (x1,y1) to point (x2,y2) // and the positive x-axis at the coordinate origin slope = atan2(y2 - y1, x2 - x1) ``` The atan2() function is super useful in many scenarios as it gives you the angle formed by a line and the x-axis, here we use it to find the angle of the line which we require to correctly slant the line that we will draw. Additionally, we will also require the length of the segment between the two points, the formula for that is: ``` // length of line going from point (x1, y1) to point (x2, y2) L = sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2)); ``` The result given by atan2 defines the angle of inclination of our line, which we will rotate by that angle. Essentially, we will center a circle on the point (x1, y1) with a radius equal to the length of the line (which we just calculated) and use the angle with sin() and cos() to slant the line. If you haven't already done so, go and read my post that explains rotation in detail [here](https://gorillasun.de/blog/Rotation-along-the-circumference-of-a-circle?ref=gorillasun.de). So far our class will look like this: ``` class SlopeLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) } display() { line(this.x1, this.y1, this.x1 + this.L * cos(this.S), this.y1 + this.L * sin(this.S)) } } function setup() { createCanvas(400, 400); sl = new SlopeLine(200, 200, 300, 200); } function draw() { background(220); sl.display(); } ``` Not very impressive yet, because it's essentially just doing the same thing that you could do with the line() function. Nonetheless, it involves some very important calculations that are useful for many scenarios. ## Dashed line style Now we'll tackle the main problem, achieving the dashed line style. Similarly to invoking the drawingContext, we want to be able to freely set the dash length as well as the length of the gaps between dashes. We've already calculated the length of our line, next we'll have to calculate how many segments we can fit into it: ``` numSegments = L / (segmentLength + spacing); ``` We simply divide the overall length of the line by the combined length of a dash and a gap. This calculation will not always give us a round number, and at this point we encounter our first problem, how do we split up a segment of fixed length into a number of sub-segments, whose combined length might not exactly add up to the total length of the entire segment? In actuality, we have to consider two cases, the segment and space length either add up exactly n times to fill out the segment, or they don't. If they do add up, great! Otherwise, we'll have to write some code to handle that case. Let's first have a look at what it looks like without handling that case: ``` class SlopeLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; // Calculate length this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); // calculate angle this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) // calculate number of segments this.numS = this.L / (this.segmentLength+this.spaceLength) console.log(this.numS) } display() { for(let i = 0; i < this.numS; i++){ console.log(i) line( this.x1 + (this.segmentLength + this.spaceLength)*i*cos(this.S), this.y1 + (this.segmentLength + this.spaceLength)*i*sin(this.S), this.x1 + (this.segmentLength+ this.spaceLength)*(i+1)*cos(this.S)-this.spaceLength*cos(this.S), this.y1 + (this.segmentLength+ this.spaceLength)*(i+1)*sin(this.S)-this.spaceLength*sin(this.S), ) } } } function setup() { createCanvas(400, 400); sls = []; for(i = 0; i < 20; i++){ sls.push(new SlopeLine(100, 100+10*i, 300, 100+10*i, random(1,35),random(1,35))); } } function draw() { background(220); for(i = 0; i < 20; i++){ stroke(0) strokeWeight(3); sls[i].display(); // Additionally we're gonna draw two red points to see where the line should start and end strokeWeight(5); stroke(255,0,0) point(100,100+i*10); point(300,100+i*10); } } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/dashed-dirty2.png) Here we're actually drawing a couple of lines with the dash length and in-between spacing randomized. The red points show where the line starts and where it should end. You can see that in some cases the last dash protrudes further than the second red dot. My OCD thinks that this looks very bad and that this needs to be fixed. Let's also see what it looks like if we spread these lines on an arc or around a circle: ``` function setup() { createCanvas(400, 400); sls = []; radius = 50; for(i = 0; i < 20; i++){ sls.push(new SlopeLine(200+radius*cos(TWO_PI/20*i), 200+radius*sin(TWO_PI/20*i), 200+radius*cos(TWO_PI/20*i)*2, 200+radius*sin(TWO_PI/20*i)*2, random(1,35), random(1,35))); } } function draw() { background(220); for(i = 0; i < 20; i++){ stroke(0) strokeWeight(3); sls[i].display(); // Additionally we're gonna draw two red points to see where the line should start and end strokeWeight(5); stroke(255,0,0) point(200+radius*cos(TWO_PI/20*i), 200+radius*sin(TWO_PI/20*i)); point(200+radius*cos(TWO_PI/20*i)*2, 200+radius*sin(TWO_PI/20*i)*2); } } ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/dashed-dirty.png) ## Fixing the final protruding Dash This was genuinely... chllenging, to fix. A first thought was to simply check if the length of n \* (segment length + space length) exceeds the length of the segment, and then discard the last dash. But that turned out to be quite ugly as well, as you can see here: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/discarded.png) We'll have to make a check just for the last dash, this can be done by finding the total length of all segments and spaces: ``` var check = sqrt( pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*sin(this.S)-this.spaceLength*sin(this.S), 2 ) + pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*cos(this.S)-this.spaceLength*cos(this.S), 2) ) ``` Notice that we're casting 'this.numS' to an integer, this was maybe the one thing that I was stuck on for a while. We're casting to an integer to be able to draw an exact number of segments and spaces. We're also adding 1 to the number of segments because we're stopping the previous for loop at 'this.numS-1'. Then we also subtract one length of a spacing, since we only care about where the dash ends, not where the dash and it's following space end. If we now draw a green point at this position, we obtain: ``` stroke(0,255,0) strokeWeight(5) point(this.x1 + (this.segmentLength+ this.spaceLength)* (int(this.numS)+1)*cos(this.S)- this.spaceLength*cos(this.S), this.y1+(this.segmentLength + this.spaceLength)* (int(this.numS)+1)*sin(this.S)- this.spaceLength*sin(this.S) ) ``` ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/green-dot.png) Next we just need to check if the length of the last dash exceeds the total length of the line or not, and draw the lines accordingly: ``` stroke(255,255,0) strokeWeight(3) if(checkthis.L){ line( this.x1 + (this.segmentLength + this.spaceLength)*(int(this.numS))*cos(this.S), this.y1 + (this.segmentLength + this.spaceLength)*(int(this.numS))*sin(this.S), this.x2, this.y2 ) } ``` Here you can see in yellow the final dash segments and the green point indicates where the segment would have ended otherwise. Is this the best solution? I don't know, but it works: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/clean.png) ## Drawing dashed lines If we combine everything we have so far, our class will look like this: ``` class DashLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; // Calculate length this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); console.log(this.L) // calculate angle this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) // calculate number of segments this.numS = this.L / (this.segmentLength+this.spaceLength) console.log(this.numS) // calculate length of tail this.tailL = this.L % (this.segmentLength+this.spaceLength) } display() { for(let i = 0; i < this.numS-1; i++){ //console.log(i) line( this.x1 + (this.segmentLength + this.spaceLength)icos(this.S), this.y1 + (this.segmentLength + this.spaceLength)isin(this.S), this.x1 + (this.segmentLength+ this.spaceLength)(i+1)cos(this.S)-this.spaceLengthcos(this.S), this.y1 + (this.segmentLength+ this.spaceLength)(i+1)sin(this.S)-this.spaceLengthsin(this.S) ) } var check = sqrt( pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*sin(this.S)-this.spaceLength*sin(this.S), 2 ) + pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*cos(this.S)-this.spaceLength*cos(this.S),2) ) stroke(0,255,0) strokeWeight(5) point(this.x1 + (this.segmentLength+ this.spaceLength)* (int(this.numS)+1)*cos(this.S)- this.spaceLength*cos(this.S), this.y1+(this.segmentLength + this.spaceLength)* (int(this.numS)+1)*sin(this.S)- this.spaceLength*sin(this.S) ) stroke(255,255,0) strokeWeight(3) if(check=this.L){ line( this.x1 + (this.segmentLength + this.spaceLength)*(int(this.numS))*cos(this.S), this.y1 + (this.segmentLength + this.spaceLength)*(int(this.numS))*sin(this.S), this.x2, this.y2 ) } } } function setup() { createCanvas(400, 400); dls = []; for(i = 0; i < 20; i++){ dls.push(new DashLine(100, 100+10i, 300, 100+10i, random(1,35),random(1,35))); } } function draw() { background(220); for(i = 0; i < 20; i++){ stroke(0) strokeWeight(3); dls[i].display(); // Additionally we're gonna draw two red points to see where the line should start and end strokeWeight(5); stroke(255,0,0) point(100,100+i*10); point(300,100+i*10); ``` This works, and it even works for any numbers that you give as parameters for segment length and spacing length. Except for negative numbers, which don't make sense to begin with and can be checked for in the constructor. ## Forward Motion ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Dashed-Final.gif) Next we'll want to look into conveying motion with the dashes, which is a little tricky but actually easier than you might think. We want them to flow from the start of the line towards the end, where they seemingly disappear and reappear at the beginning of the line. Since we already wrote solid code, it won't take many modifications to achieve this effect. First, we'll have to create a parameter called 'this.beginningLength', which stores the amount of displacement from the intial point. The class now becomes: ``` class AnimatedLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; // Calculate length this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); console.log(this.L) // Calculate angle this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) // Calculate number of segments this.numS = this.L / (this.segmentLength+this.spaceLength) console.log(this.numS) this.beginningLength = 0; } move(rate){ this.beginningLength += rate if(this.beginningLength>this.segmentLength+this.spaceLength){ this.beginningLength = 0; } } display() { for(let i = 0; i < this.numS; i++){ line( this.x1 + (this.segmentLength + this.spaceLength)*i*cos(this.S) + this.beginningLength*cos(this.S), this.y1 + (this.segmentLength + this.spaceLength)*i*sin(this.S) + this.beginningLength*sin(this.S), this.x1 + (this.segmentLength+ this.spaceLength)*(i+1)*cos(this.S) -this.spaceLength*cos(this.S) + this.beginningLength*cos(this.S), this.y1 + (this.segmentLength+ this.spaceLength)*(i+1)*sin(this.S) -this.spaceLength*sin(this.S) + this.beginningLength*sin(this.S) ) } var check = sqrt( pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*sin(this.S) -this.spaceLength*sin(this.S)+ this.beginningLength*sin(this.S), 2) + pow((this.segmentLength + this.spaceLength)*(int(this.numS)+1)*cos(this.S) + -this.spaceLength*cos(this.S)+ this.beginningLength*cos(this.S), 2) ) } } function setup() { createCanvas(400, 400); als = []; for(i = 0; i < 20; i++){ als.push(new AnimatedLine(100, 100+10*i, 300, 100+10*i, random(1,35),random(1,35))); } } function draw() { background(220); for(i = 0; i < 20; i++){ stroke(0) strokeWeight(3); als[i].display(); als[i].move(0.2) // Additionally we're gonna draw two red points to see where the line should start and end strokeWeight(5); stroke(255,0,0) point(100,100+i*10); point(300,100+i*10); } } ``` And we end up with something similar to this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Animation-Attempt-1-1.gif) The most important new addition is the move() function, which displaces the beginningLength parameter, which is what's pushing forward the dashed line. Once the beginningLength parameter is larger or equal to the length of a dash and a gap we reset it. The beginningLength parameter will be included in the calculation of the position of each dash. Watching this go on for a little while, you can see how unsatisfying it is to see the first dash of each line pop up out of seemingly nowhere, and equivalently we again have a problem of a protruding final dash. ## Cleaning up the Animation We need to draw the line that goes from the first red point to the beginning of the space preceding the first dash. This simulates as if the dashed line is continuously appearing from the left side, and already makes the animation look much less jumpy: ``` // Add this to beginning of display function if(this.beginningLength > this.spaceLength){ stroke(255,0,255) line(this.x1, this.y1, this.x1 + (this.beginningLength-this.spaceLength)*cos(this.S), this.y1+ (this.beginningLength-this.spaceLength)*sin(this.S) ) } ``` Now we have something that looks like this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Animation-Attempt-2.gif) Now to the truncation of the newly protruding last dash. One step towards a solution will be checking if any of the drawn dashes exceed the total length of our line, if they do, we simply don't draw them: ``` class AnimatedLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; // Calculate length this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); console.log(this.L) // calculate angle this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) // calculate number of segments this.numS = this.L / (this.segmentLength + this.spaceLength) // calculate length of tail this.tailL = this.L % (this.segmentLength + this.spaceLength) this.beginningLength = 0; this.tailLength = this.tailL; this.difference = (this.segmentLength + this.spaceLength) } move(rate) { this.beginningLength += rate if (this.beginningLength >= this.segmentLength + this.spaceLength) { this.beginningLength = 0; } this.difference = (this.segmentLength + this.spaceLength)-this.beginningLength } display() { if (this.beginningLength > this.spaceLength) { stroke(255, 0, 255) line(this.x1, this.y1, this.x1 + (this.beginningLength - this.spaceLength) * cos(this.S), this.y1 + (this.beginningLength - this.spaceLength) * sin(this.S)) } stroke(0) for (let i = 0; i < this.numS; i++) { // check if dash segment exceeds total line length var distCheck = sqrt( pow((this.segmentLength + this.spaceLength) * (i + 1) * cos(this.S) - this.spaceLength * cos(this.S) + this.beginningLength * cos(this.S), 2) + pow((this.segmentLength + this.spaceLength) * (i + 1) * sin(this.S) - this.spaceLength * sin(this.S) + this.beginningLength * sin(this.S), 2) ) // if it does, we simply don't draw it if (distCheck <= this.L) { line( this.x1 + (this.segmentLength + this.spaceLength) * i * cos(this.S) + this.beginningLength * cos(this.S), this.y1 + (this.segmentLength + this.spaceLength) * i * sin(this.S) + this.beginningLength * sin(this.S), this.x1 + (this.segmentLength + this.spaceLength) * (i + 1) * cos(this.S) - this.spaceLength * cos(this.S) + this.beginningLength * cos(this.S), this.y1 + (this.segmentLength + this.spaceLength) * (i + 1) * sin(this.S) - this.spaceLength * sin(this.S) + this.beginningLength * sin(this.S) ) } } } } function setup() { createCanvas(400, 400); als = []; for (i = 0; i < 20; i++) { als.push(new AnimatedLine(100, 100 + 10 * i, 300, 100 + 10 * i, random(1, 35), random(1, 35))); } } function draw() { background(220); for (i = 0; i < 20; i++) { stroke(0) strokeWeight(3); als[i].display(); als[i].move(0.2) strokeWeight(5); stroke(255, 0, 0) point(100, 100 + i * 10); point(300, 100 + i * 10); } } ``` And we end up with this: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Animation-Attempt-Disappearing-Last-Dash.gif) Now the protruding dash doesn't appear anymorer but we have a weird behaviour where the last dash simply disappears. We don't want that, we can fix it with an additional check and mirroring the beginningLength dash, since their lengths are proportional. ## Final Code And the final code goes here: ``` class AnimatedLine { constructor(x1, y1, x2, y2, segmentLength, spaceLength) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.segmentLength = segmentLength; this.spaceLength = spaceLength; // Calculate length this.L = sqrt( pow((this.x1 - this.x2), 2) + pow((this.y1 - this.y2), 2)); console.log(this.L) // calculate angle this.S = atan2(this.y2 - this.y1, this.x2 - this.x1) // calculate number of segments this.numS = this.L / (this.segmentLength + this.spaceLength) this.beginningLength = 0; } move(rate) { this.beginningLength += rate if (this.beginningLength >= this.segmentLength + this.spaceLength) { this.beginningLength = 0; } } display() { if (this.beginningLength > this.spaceLength) { stroke(255, 0, 255) line(this.x1, this.y1, this.x1 + (this.beginningLength - this.spaceLength) * cos(this.S), this.y1 + (this.beginningLength - this.spaceLength) * sin(this.S) ) } for (let i = 0; i < this.numS; i++) { stroke(0) var distCheck = sqrt( pow( (this.segmentLength + this.spaceLength) * (i + 1) * cos(this.S) - this.spaceLength * cos(this.S) + this.beginningLength * cos(this.S), 2) + pow((this.segmentLength + this.spaceLength) * (i + 1) * sin(this.S) - this.spaceLength * sin(this.S) + this.beginningLength * sin(this.S), 2)) if (distCheck <= this.L) { line( this.x1 + (this.segmentLength + this.spaceLength) * i * cos(this.S) + this.beginningLength * cos(this.S), this.y1 + (this.segmentLength + this.spaceLength) * i * sin(this.S) + this.beginningLength * sin(this.S), this.x1 + (this.segmentLength + this.spaceLength) * (i + 1) * cos(this.S) - this.spaceLength * cos(this.S) + this.beginningLength * cos(this.S), this.y1 + (this.segmentLength + this.spaceLength) * (i + 1) * sin(this.S) - this.spaceLength * sin(this.S) + this.beginningLength * sin(this.S) ) } else { stroke(255,255,0) var distCheck = sqrt( pow((this.segmentLength + this.spaceLength) * i * cos(this.S) + this.beginningLength * cos(this.S), 2) + pow((this.segmentLength + this.spaceLength) * i * sin(this.S) + this.beginningLength * sin(this.S), 2)) if (distCheck < this.L) { line( this.x1 + (this.segmentLength + this.spaceLength) * i * cos(this.S) + this.beginningLength * cos(this.S), this.y1 + (this.segmentLength + this.spaceLength) * i * sin(this.S) + this.beginningLength * sin(this.S), this.x2, this.y2 ) } } } } } function setup() { createCanvas(400, 400); als = []; for (i = 0; i < 20; i++) { als.push(new AnimatedLine(100, 100 + 10 * i, 300, 100 + 10 * i, random(1, 35), random(1, 35))); } } function draw() { background(220); for (i = 0; i < 20; i++) { stroke(0) strokeWeight(3); als[i].display(); als[i].move(0.2) strokeWeight(5); stroke(255, 0, 0) point(100, 100 + i * 10); point(300, 100 + i * 10); } } ``` As sanity check, it works fine with any kind of slanted lines as well: ![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/09/Circular-Final-1.gif) ## Reverse Movement One final addendum would be reversing the movement to go in the other direction. Sometimes I surprise myself with the code I write, what we have was solid enough that a simple change was all we needed to handle the reverse movement. We simply add a function that handles negative rates passed to the move function. In this case the beginningLength begins from (segmentLength + spaceLength) and decreases gradually, and is reset when it becomes 0\. The code looks like this: ``` move(rate) { if(rate= this.segmentLength + this.spaceLength) { this.beginningLength = 0; } } } moveReverse(rate) { this.beginningLength += rate if (this.beginningLength <= 0) { this.beginningLength = this.segmentLength + this.spaceLength; } } ``` And this should be a wrap. Now you can go ahead and use these dashed lines for your own sketches or build upon them! Happy creative coding! ### Rotation and Circular Positioning URL: https://www.gorillasun.de/blog/rotation-and-circular-positioning/ Last updated: 2023-05-08T07:59:38.000Z So far, in most of my blog posts we've been dealing with arrangement of elements on a grid, however, creating circular motion should be another weapon in your creative coding arsenal. This light blog post explains how to achieve it in P5JS in a number of different ways. Starting with the simplest form: rotating a point around a circle. To create a rotating point, we usually need 3 parameters: the center of the circle around which we are rotating, the radius, and the angle. To make this point actually move around the circle, the parameter for the angle needs to be a linearly increasing parameter, which, as always, is time in form of the millis() function. The snippet of code that follows the comment defines the rotating point: ``` function setup() { createCanvas(400, 400); centerX = width/2 centerY = height/2 radius = 100 } function draw() { background(220); stroke(0) point(centerX, centerY) strokeWeight(10) stroke(255,0,0) // for what follows simply replace this with the provided snippet point( centerX + radius * cos(millis()/1000), centerY + radius * sin(millis()/1000) ) // end of what you should replace } ``` The coordinates of the rotating point are defined in terms of sin() and cos(), plugging time into the two functions representing the angle(divided by some arbitrary value to slow down the animation), the visualization that we obtain looks like this: ![](https://gorillasun.de/assets/images/2021-04-22-Rotation-along-the-circumference-of-a-circle/Simple.gif) Now, If you're not very familiar with sine and cosine I recommend reading up on them in one of my previous blog posts that explains them in a little more detail [here](https://gorillasun.de/blog/Continuous-oscillating-motion-in-P5JS-with-Sine-functions?ref=gorillasun.de). In simple terms, all you need to know is that given a center point and a radius, you can draw a point on the circle (defined by this center and radius) using the sine and cosine functions for a specific angle. ``` // ---- point(centerX + radius * cos(0), centerX + radius * sin(0)) point(centerX + radius * cos(HALF_PI), centerX + radius * sin(HALF_PI)) point(centerX + radius * cos(PI), centerX + radius * sin(PI)) point(centerX + radius * cos(PI+QUARTER_PI), centerX + radius * sin(PI+QUARTER_PI)) ``` ![](https://gorillasun.de/assets/images/2021-04-22-Rotation-along-the-circumference-of-a-circle/sin_n_cos.png) ## Intuition and Math behind rotational movement You might ask now for a more detailed definition of sin() and cosine(), and how they allow you to find points on a circle. Essentially it has something to do with triangles, angles and ratios. First we should look at the definition of sine as a trigonometric function: > Sine: The trigonometric function that is equal to the ratio of the side opposite a given angle (in a right-angled triangle) to the hypotenuse. In this case we already have the angle (we simply choose one, depending where we want to position the point on the circle), and the hypotenuse (the radius), which will allow us to find the opposite side. Since we're dealing with ratios here, we still need to multiply by the radius, to find the exact position and add an offset, which is the center of the circle. This gives us one of the coordinates for our point, we repeat the same thing for the cosine. Putting them together will allow us to rotate a point around a circle. To explain it in another way, we're calculating the vertical offset from the horizontal line that cuts the circle in two parts, as well as the horizontal offset from the vertical line that cuts the circle in two equal parts, and draw a point at these coordinates. This animation from wikipedia was too compelling not to include, as it perfectly exemplifies what is going on: ![](https://gorillasun.de/assets/images/2021-04-22-Rotation-along-the-circumference-of-a-circle/Circle_cos_sin.gif) Great, now you might be either satisfied that you can position something on a circle, OR you might be more confused and still curious as to how we found out that we can do such positioning with sine and cosine. I'd like to include this excerpt from [Robert Cruikshank](https://www.quora.com/profile/Robert-Cruikshank-2?ref=gorillasun.de)'s Quora Answer: > Given the Pythagorean theorem and the definition of a circle, one can discover (and prove) that the ratio of circumference to diameter is π. > The definition of cosine and sine for arbitrary angles is just that—a definition, an invention. We chose it that way because it is useful. Likewise, I always get school kids arguing with me that 1^0 should be 0, not 1\. I explain to them that they CAN define 1^0 to be 0, it’s just that the math they get will be less streamlined, more clunky, the rules for exponents will have exceptions, etc. If all of this is still hazy, then I recommend playing around with sin() and cos() to internalize their behaviour, soon enough you'll have an intuitive understanding, and when you do, I recommend approaching the math behind it again and I promise that it will feel much easier. ## Applications This is kind of the basis for a lot of other things that you can do. For example, what would you have to do to have a 3rd point rotate around the already rotating point? The snippet I provided already has the answer to it! ``` //-------- point( centerX + radius * sin(millis()/1000), centerY + radius * cos(millis()/1000) ) stroke(255,0,255) point( centerX + radius * sin(millis()/1000) + radius/2 * sin(millis()/500), centerY + radius * cos(millis()/1000) + radius/2 * cos(millis()/500) ) ``` You need to be mindful about the speed of the new point, here I'm dividing the new point's time by 500\. If both were in sync we wouldn't observe an additional orbiting motion. Very simple, yet very powerful! ## Positioning items around a circle Let's go back a little and see how to position an arbitrary number of points around a circle in an equidistant manner. The circumference of a full circle can be expressed in either 2xPI RADIANS or 360 Degrees. Positioning an arbitrary number of points around a circle requires splitting 2xPI evenly among them. ``` numPoints = 5 for (i = 0; i < numPoints; i++) { point( centerX + radius * sin(2 * PI / numPoints * i + millis() / 1000), centerY + radius * cos(2 * PI / numPoints * i + millis() / 1000) ) } ``` In this manner we simply divide 2xPI by the number of points and multiply by the number of the current point. If you prefer doing this in degrees, P5JS has a function that allows you to set this. This concept also applies if you want to position certain elements along the arc of a circle, for example fanning out a number of lines: ``` // ------ strokeWeight(2) for(i = 0; i < 20; i++){ line(centerX,centerY, centerX+100*sin(HALF_PI+HALF_PI/20*i), centerY+100*cos(HALF_PI+HALF_PI/20*i)) } ``` ![](https://gorillasun.de/assets/images/2021-04-22-Rotation-along-the-circumference-of-a-circle/fan.png) As you can see P5JS also conveniently provides pre-defined constant that define different portions of PI (QUARTER\_PI, HALF\_PI, PI and TWO\_PI). ## Rotation in the WEBGL mode Alternatively, you could simply achieve rotation by using the WEBGL mode that provides a conveninent rotate function. This is quite fun and very easy, but allows you to create incredible cool sketches. I'm only going to brush briefly over 3D rotation, and is a topic that requires much more exploration in future blog posts. I'll showcase a simple sketch, that looks very impressive: ``` function setup() { createCanvas(500, 500, WEBGL); } function draw() { noFill(); background(255); orbitControl(); stroke(0); strokeWeight(1) for(x = 0; x ``` ![](https://gorillasun.de/assets/images/2021-04-22-Rotation-along-the-circumference-of-a-circle/3Drotation.gif) ### Hicetnunc.xyz and NFTs on the Tezos Blockchain ~ What's New April 2021 Update URL: https://www.gorillasun.de/blog/hicetnunc-xyz-and-nfts-on-the-tezos-blockchain-whats-new-april-2021-update/ Last updated: 2023-03-09T19:03:56.000Z This will be a loaded article, so hold on to your NFTs as we dive into all the recent developments of the past month! Here's a quick overview, if you're interested in reading up on something in particular: 1. UI/UX Changes 2. The Secondary Market Launches 3. HTML/SVG/P5JS/and other upload Templates 4. OBJKT4OBJKT Event 5. Copyminters and Hoarders 6. The hDAO feed 7. A new challenger arrives: Kalamint \~ Punc vs. Boutique 8. Tezos to the moon 9. Pricing your NFTs adequately and the Presstube Method 10. Weekly Livestreams 11. List of Companion sites and NFT reviews 12. Other interesting Articles, Resources and Stuff(s) ## UI/UX Changes Since it's launch, hicetnunc's UI has undergone a number of changes and revisions. The overall minting procedure is still pretty much the same as it was before, the biggest change being that there is no need to explicitely 'sync' before every action you do on the website. Once you connect your wallet and grant permission it'll stay synced with your wallet address, and it'll show it in the top right corner next to the drop down 'hamburger' menu. The sync button still exists however, you simply click the drop down menu in the top right corner, and where it previously showed your wallet address it'll show an 'unsync' button. Click it and it'll disconnect your current wallet address. 'unsync' becomes 'sync' and clicking the latter will ask you again to grant permission, now you can choose a different wallet address. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/sync.png) Another major change is that you now get to preview your NFT before minting it. This conveniently allows you to check that everything is right before minting. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/minting_updated.png) Additionally, note that the option for setting the royalties on your mints is now back. Royalties in this context basically mean that you'll get a percentage share of every subsequent sale of your NFTs. You can set this percentage between 10% and 25%. After hitting the preview button, you'll have the option to go back to fix any of the NFT details. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/preview1.png) If everything seems alright, then you can hit the 'mint' to finalize the mint. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/preview2.png) If you messed up anything, or just want to delete an NFT you've previously created, you now have the option to burn NFTs. Burning essentially means, that you'll send the NFT to a burner address that isn't owned by anyone (This is how I understand it). All of this costs almost nothing due to the cheap Tezos Gas Fees! If you're still confused about how to mint NFTs on hicetnunc.xyz then this Video series should clear up all remaining uncertainties: > Celebrating more than 10K minted objects on [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) with three video tutorials on how to get started creating [#NFTs](https://twitter.com/hashtag/NFTs?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) on the platform🤍 > Thanks to [@presstube](https://twitter.com/presstube?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) for the video tutorials👇🤖 > > 1/ Set up a [@tezos](https://twitter.com/tezos?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) wallet with [@TempleWallet](https://twitter.com/TempleWallet?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and apply for some tez w/ [@tezosnftfaucet](https://twitter.com/tezosnftfaucet?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/64zGXQCTEQ](https://t.co/64zGXQCTEQ?ref=gorillasun.de)[March 23, 2021](https://twitter.com/verticalcrypto/status/1374349022245359627?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Alternatively you can read up on it in my tutorial [here](https://gorillasun.de/blog/Getting-started-with-Tezos-and-minting-on-hicetnunc.xyz?ref=gorillasun.de) ## The Secondary Market You can now not only collect, but also re-sell previously acquired OBJKTs in your collection! This feature was rolled out quietly throughout the month an had some issues at first. The UI worked in such a manner that if someone were to offer up an NFT for sale that they've collected, while the original creator still had remaining editions of said NFT up for sale, they would essentially supersede the original creator with their offer, since the 'click to collect' button would have to be shared. This was problematic, because if someone were to re-sell 1 edition of an NFT for 100tez, when the original creator still had dozens of the same NFT up for sale at a much lower price, these would then essentially be blocked until someone bought the NFT offered for 100tez. > Some people might not have realized it yet: the secondary market on [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) is open now. > > Yes, you can sell any NFT you collected. The only problem is that the UI has not noticed that yet. > > So if the first number before the "/" is > 0, try clicking "not for sale". [pic.twitter.com/lY9pr6UsvU](https://t.co/lY9pr6UsvU?ref=gorillasun.de)[March 28, 2021](https://twitter.com/quasimondo/status/1376098068425289730?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This button introduced another problem, that caused a number of users quite the frustration. If an NFT were to sell all of it's remaining editions, the button would show 'not for sale'. This, however, didn't mean that the button was not able to be clicked. > Yes, i'll wait a bit before swapping, I just gave 20tez to someone who took 31 of my early freebies[March 28, 2021](https://twitter.com/patricktresset/status/1376163365312200706?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) This has now been fixed by showing all open offers for an NFT in it's collectors tab, with the respective price and the wallet address of the seller. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/secondary_market.png) Lessons learned, always check the price befor hitting the confirm button in your wallet! ## HTML/SVG/P5JS/and other upload Templates What first started as html encapsulated in an svg file, has become another avant garde feature of hicetnunc. Data formats such as html, svg, p5js, pdf are now supported by hicetnunc and can be minted as NFTs. This was pioneered by a number of Twitter users in parallel, a super insightiful article by Twitter user [@tarwin](https://twitter.com/tarwin?ref=gorillasun.de) can be found [here](https://tarwin.medium.com/hit-et-nunc-advanced-svg-nfts-a6040262f4d5?ref=gorillasun.de). You can find the respective templates for each supported format [here](https://github.com/hicetnunc2000/hicetnunc/tree/main/templates?ref=gorillasun.de). You'll have to replace certain parts of the templates with your own code, replace the default thumbnail.png / thumbnail.gif with your own and zip all files. This zip file will be what you upload at mint time. Amazing Right? And here's an example of what a minted interactive p5js sketch looks like. Go ahead and hover over the NFT: Maybe the next cool thing could be a convenient and customizable iframe embed code? That could allow creators to display and sell their creations easily from their own website. ## OBJKT4OBJKT On the weekend of the 26th of March, in celebration of 10k minted NFTs on hicetnunc, we've seen an event started by Twitter duo [@ameliemaiaa](https://twitter.com/ameliemaiaa?ref=gorillasun.de) and [@TaisKoshino](https://twitter.com/TaisKoshino?ref=gorillasun.de) that go under the handle [@DiverseNftArt](https://twitter.com/DiverseNftArt?ref=gorillasun.de), that encouraged users to share NFTs for free under the hastag #OBJKT4OBJKT, such that users on hicetnunc could build up their collections without a cost. Even though the event is officially over, searching the hashtag #OBJKT4OBJKT on Twitter, you'll probably still be able to find some free NFT goodies. It is also very likely that this event will make a return in the future. > To celebrate 10k [#OBJKT](https://twitter.com/hashtag/OBJKT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) mints, [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and [@DiverseNftArt](https://twitter.com/DiverseNftArt?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) are promoting a weekend of fun and celebration for all artists and collectors! > [#cleanNFT](https://twitter.com/hashtag/cleanNFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#OBJKT4OBJKT](https://twitter.com/hashtag/OBJKT4OBJKT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#NFTCollector](https://twitter.com/hashtag/NFTCollector?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#NFTArt](https://twitter.com/hashtag/NFTArt?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#NFTArtists](https://twitter.com/hashtag/NFTArtists?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#cryptoart](https://twitter.com/hashtag/cryptoart?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#lgbtqia](https://twitter.com/hashtag/lgbtqia?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#bipoc](https://twitter.com/hashtag/bipoc?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#diverse](https://twitter.com/hashtag/diverse?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#artists](https://twitter.com/hashtag/artists?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#WomenInTech](https://twitter.com/hashtag/WomenInTech?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#XTZ](https://twitter.com/hashtag/XTZ?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/1iBeju6Ltw](https://t.co/1iBeju6Ltw?ref=gorillasun.de)[March 24, 2021](https://twitter.com/DiverseNftArt/status/1374751025219899393?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Copyminters and Hoarders A problem that arose with the OBJKT4OBJKT event was that some individuals would collect multiples of certain free OBJKTs, while not being illegal, it is clearly a dick move. The main purpose being the later resale of the claimed NFTs. > Just realized that one of the guys shamelessly snatching dozens of copies of the free [#OBJKT4OBJKT](https://twitter.com/hashtag/OBJKT4OBJKT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) pieces was @sirboomcat aka tz1MHVtpYFsW7VDH1rhbhK3Krad14n6Ww8RD. > > The hint is his own NFT, [https://t.co/pZCSOvGdPg](https://t.co/pZCSOvGdPg?ref=gorillasun.de), which he minted for this reply here: [https://t.co/UQOmiyxl5o](https://t.co/UQOmiyxl5o?ref=gorillasun.de) > > 1/2 [pic.twitter.com/DsEBrBLSA2](https://t.co/DsEBrBLSA2?ref=gorillasun.de)[March 28, 2021](https://twitter.com/djangobits/status/1376278372712595464?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Copyminting is another huge issue, where someone mints an NFT/piece/artwork that is not originally theirs. Some solutions to this problem are being discussed in[this](https://github.com/hicetnunc2000/hicetnunc/issues/433?ref=gorillasun.de) github issue started byt Twitter user @quasimondo. He proposes a community regulated system that revolves around a 'trust' metric, which will be attributed to each wallet address active on the platform. The main point being that new wallet addresses will have to accrue some trust before they can freely mint on hicetnunc. Here's a short excerpt, but I also recommend reading up on it: > This is why I believe that we have to address this problem at the root - which is by preventing those first sales to be successful. A mechanism I have in mind for that is to use an escrow smart contract that acts a proxy for all sales by minters who have no sales history yet and who have not yet built up a network of trust. ## hDAO and the hDAO feed You might've noticed already that every NFT on hicetnunc has a little circle underneath it, in the lower right corner. The same circle can be found on the NFT page itself, underneath the OBJKT number, and also in the drop down menu. This circle isn't just some aesthetical UI fluff but it can actually be clicked. Clicking it underneath an NFT will trigger your Tezos wallet, clicking it in the hamburger menu takes you to the hDAO feed. ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/hdao_underneath_NFT.png) ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/hdao_on_NFT_page.png) When you click the circle underneath an NFT or from it's dedicated page, it'll trigger your wallet which will allow you to spend some of your hDAO tokens on the NFT. I'm not entirely sure what the tokens are or how they work, but once spent they essentially work as an upvote for the NFT. If someone knowledgeable would like to chime in on this, be my guest! ![](https://gorillasun.de/assets/images/2021-04-12-Hicetnunc.xyz-and-NFTs-on-the-Tezos-Blockchain-~-Whats-new%20~-April-2021-Update/hdao_feed.png) I'm not certain how many people are aware of the hDAO as of now, or if they're actually using it to search for potential purchases. This also brings up the issue of creators upvoting their own creations with their hDAO tokens, esentially boosting and skewing the rankings in their favor (if/when the hDAO feed becomes a more integral part of hicetnunc). > So what exactly are hDAO tokens on hicetnunc? What can I do with them (other than upvoting NFTs) and why do get some whenever I make a transaction on the website? Explain like I'm 5 [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [$XTZ](https://twitter.com/search?q=%24XTZ&src=ctag&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#hicetnunc](https://twitter.com/hashtag/hicetnunc?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#CleanNFT](https://twitter.com/hashtag/CleanNFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[April 15, 2021](https://twitter.com/gorillasu/status/1382764104721440771?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## A new challenger arrives: Kalamint \~ Punc vs. Boutique Kalamint was officially announced on the 19th of December as the 'first NFT marketplace on Tezos', and was scheduled for a release in January 2021\. This release was then delayed to the 18th of February, which was delayed again due to some UI problems and Kalamint didn't launch until the 23rd of March. At this point it might be a little bit silly to still call it the 'first NFT platform for Tezos', when hicetnunc had already been up and running for more than a month. Not complaining though, the more the merrier, and maybe this competition will drive both platforms to keep improving. Kalamint is vastly differently from hicetnunc, being described as a boutique NFT store vs. the spartanic hicetnunc (as described by some members of the community). One thing that I actually like about Kalamint is that they verify the creators before allowing them to mint and list NFTs, this somewhat circumvents the copyminting issue but could also be regarded as gatekeeping, as they have full control of what is being minted on their platform. But maybe they're intended to cater to different audiences, hicetnunc being much more accessible to people who just want to dip their toes into the Tezos NFT waters. In other news, Opensea has also [announced](https://opensea.io/blog/announcements/tezos-nfts-are-coming-to-opensea/?ref=gorillasun.de) the support of Tezos NFTs, however there hasn't been a clear ETA. Speculatively later this month or early next month. Meanwhile, other NFT platforms are being developed such as [tezauction](https://twitter.com/tezauction?ref=gorillasun.de), [BazaarNFTs](https://twitter.com/BazaarNfts?ref=gorillasun.de) and [DAuctionHouse](https://twitter.com/DAuctionHouse?ref=gorillasun.de), which are worth checking out. It's extremely interesting to see what the Tezos NFT landscape will look like in the next couple of months. > Give it 1 - 2 months and 2 or 3 other [#NFT](https://twitter.com/hashtag/NFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) marketplaces should be live on [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de). Check out [@BazaarNfts](https://twitter.com/BazaarNfts?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de), [@tezauction](https://twitter.com/tezauction?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) and [@DAuctionHouse](https://twitter.com/DAuctionHouse?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de)[April 14, 2021](https://twitter.com/IgnoranceIt/status/1382258791538900994?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Tezos to the Moon The NFT activity on the Tezos blockchain has catapulted the number of contract calls, surpassing previous all-time highs: > [Tezos contract calls / April 12](https://www.reddit.com/r/tezos/comments/mpi9c0/tezos%5Fcontract%5Fcalls%5Fapril%5F12/?ref=gorillasun.de)[r/tezos](http://www.reddit.com/r/tezos?ref=gorillasun.de) Hicetnunc is also still growing at a very fast rate, as of writing this post we've already surpassed 30k minted NFTs. Twitter user [@Esclaponr](https://twitter.com/Esclaponr?ref=gorillasun.de) shows some stats he has aggregated regarding the growth and activity on hicetnunc: > Largest spike in new users on [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) since I started collecting some data about the smart contract usage two days ago [pic.twitter.com/jQVBEmqh8h](https://t.co/jQVBEmqh8h?ref=gorillasun.de)[March 25, 2021](https://twitter.com/Esclaponr/status/1374910647956344834?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) Up to date graphs can be found in this repo [here](https://github.com/ries9112/NFTs-hicetnunc?ref=gorillasun.de). Alternatively you can also purchase these live updating graphs as NFTs [here](https://www.hicetnunc.xyz/tz/tz1c2iwyckUCcicx2qxqtwLEartYFEHg1pvB?ref=gorillasun.de) if you'd like to support @Esclaponr. It's safe to say that the Tezos ecosystem is brimming with life more than it ever has before. ## Pricing things adequately and the 'Presstube' method It's still not very clear to creators how to number editions and price their NFTs adequately, and what combinations thereof will help them maximising sales. After experimenting, some hicetnunc users have come up with creative strategies for selling their NFTs, one of them being the 'Presstube' method. > I didn’t coin it so it’s marginally embarrassing every time I see it called that 😝 but... > > The practice of pricing editions so that they begin accessible (even sometimes free) and then the price steps up as editions sell > > Jury’s still out on whether it’s a good idea though! Ymmv[April 4, 2021](https://twitter.com/presstube/status/1378701285101305863?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) The 'Presstube' method is essentially a specific way of pricing NFTs on hicetnunc, which rewards the early birds that swoop in and cop the first couple of editions of a freshly minted NFT. It's possible due to how the hicetnunc UI works. When you mint an NFT on hicetnunc, it appears in the feed and your creations tab, however it is not immediately up for sale. You still have to specify how many editions you want put up for sale. In that manner, you can sell different amounts for different prices. ## Weekly Livestreams There also have been regular livestreams and 'campfire chats' between involved members of the community hosted on [@verticalcrypto](https://twitter.com/verticalcrypto?ref=gorillasun.de), which are fun to watch if you'd like to get to know the people active on hicetnunc: > Decided to frame and mint part of [@hicetnunc2000](https://twitter.com/hicetnunc2000?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) history: the first Hicetnunc & friends livestream 🤍 > > featuring: [@crzypatchwork](https://twitter.com/crzypatchwork?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) , [@quasimondo](https://twitter.com/quasimondo?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) , [@presstube](https://twitter.com/presstube?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [@theAngieTaylor](https://twitter.com/theAngieTaylor?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) , [@NeuralBricolage](https://twitter.com/NeuralBricolage?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) , [@JoanieLemercier](https://twitter.com/JoanieLemercier?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) > > 20 editions here:[https://t.co/mmm5yUSH62](https://t.co/mmm5yUSH62?ref=gorillasun.de)[#NFT](https://twitter.com/hashtag/NFT?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#hicetnunc](https://twitter.com/hashtag/hicetnunc?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [#Tezos](https://twitter.com/hashtag/Tezos?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) [pic.twitter.com/DMM8tiMWI9](https://t.co/DMM8tiMWI9?ref=gorillasun.de)[April 12, 2021](https://twitter.com/verticalcrypto/status/1381735667282104326?ref%5Fsrc=twsrc%5Etfw&ref=gorillasun.de) ## Companion sites and art reviews ### Companion Sites - Tile Grid of OBJKTs based on visual similarity: [ https://here-or-there.glitch.me/](https://here-or-there.glitch.me/?ref=gorillasun.de) - Live Feed of transactions on hicetnunc: [ https://objkts.xyz/ ](https://objkts.xyz/?ref=gorillasun.de) - Tag Discovery Tool: [ https://projects.stroep.nl/hicetnunc/#discover ](https://projects.stroep.nl/hicetnunc/?ref=gorillasun.de#discover) ### NFT Art Reviews - [Pop twig: a zine devoted to aiding the discovery of art on hic et nunc](https://medium.com/poptwig?ref=gorillasun.de) - Artnome: [ hic et nunc revives the true spirit of web art through nfts](https://www.artnome.com/news/2021/3/21/hic-et-nunc-revives-the-true-spirit-of-web-art-through-nfts?ref=gorillasun.de) - [VerticalCrypto](https://twitter.com/verticalcrypto/status/1382730395930755076?ref=gorillasun.de) Shoot me a message for additions to these lists, I know I missed a lot! ## Other Interesting Articles, Resources and Stuff(s) - [How to host your own IPFS node](https://twitter.com/antic/status/1374417104489697283?ref=gorillasun.de) - [Add your personal info to your hicetnunc profile](https://twitter.com/quasimondo/status/1375788135171428356?ref=gorillasun.de) - [Not another jpeg](https://www.plummerfernandez.com/works/not-another-jpeg/?ref=gorillasun.de) - [Why would anyone buy crypto art let alone spend millions on what's essentially a link to a jpeg](https://www.salon.com/2021/04/08/why-would-anyone-buy-crypto-art--let-alone-spend-millions-on-whats-essentially-a-link-to-a-jpeg%5Fpartner/?ref=gorillasun.de) If you've reached this far, thanks for reading! Leave a comment if there's any typos or if I missed anything! ### Getting started with Tezos and minting on hicetnunc.xyz URL: https://www.gorillasun.de/blog/getting-started-with-tezos-and-minting-on-hicetnunc-xyz/ Last updated: 2023-08-23T11:09:47.000Z To get straight to the point, you essentially need these two things: 1. A hicetnunc compatible Tezos wallet 2. Some tez in your Tezos wallet And then you're ready to get started with minting on the Tezos blockchain via [hicetnunc.xyz](https://hicetnunc.xyz/?ref=gorillasun.de) (if the hicetnunc.xyz isn't loading or showing a blank page, don't panic the page is still being developed). ## Tezos Wallets There's many different wallets all with their pros and cons, 4 of which are currently suported by hicetnunc.xyz: Temple Wallet, Spire, Galleon and Kukai. ![](https://gorillasun.de/assets/images/2021-03-14-Getting-started-with-Tezos-and-minting-on-hicetnunc.xyz/hicetnuncwallet.png) Personally I use Temple Wallet because it's the first one I tried and seems convenient so far. Once you install the extension or desktop app, you'll have to create a wallet. You will be asked to set up a seed phrase and store it somewhere secure so you remember it later. This is very important, store your seedphrase securely! Otherwise you might not have access to your money anymore! Once you have your wallet set up, you're ready to receive tez in it. You can either set up an account on an exchange site like coinbase and binance, exchange some fiat currency for tez and then send them to yourself, or alternatively, have someone who already has some tez send some to you. Where the easier option is the latter. Some kind people on Twitter are actually giving out some tez for free to get you started, such as these guys [here](https://twitter.com/tezosnftfaucet?ref=gorillasun.de). Nonetheless, you'll eventually have to set up an exchange account anyway to trade in your cryptocurrency for real money. ## Minting on Hicetnunc.xyz ![](https://gorillasun.de/assets/images/2021-03-14-Getting-started-with-Tezos-and-minting-on-hicetnunc.xyz/minting.png) If you're ready to mint your first #CleanNFT and you have at least 0.08 XTZ in your wallet (it costs a small fee to mint the NFT), then you're good to go! Head over to hicetnunc.xyz, click the drop down icon in the top right corner and click 'OBJKTs (mint NFTs)'. The term OBJKT is basically hicetnunc's alias for NFTs. It'll take you to a page where you have to fill out some details about the NFT you want to mint: 1. A quirky name for your OBJKT 2. A brief description about the NFT. Also make sure to include your Twitter handle in this description, various Twitter bots are tweeting out all the NFTs that go live on hicetnunc in real time. Including your Twitter handle allows potential buyers to verify that you're the original creator. 3. And thirdly some tags relevant to the NFT. They don't do anything just yet, but will probably play a role sometime in the future for organizing the content on the website. 4. Lastly you'll have to specify how many editions you want to have of the minted OBJKT. This essentially specifies the rarity of your NFT, so set your number accordingly. This also determines how much it will cost to mint the OBJKT, each edition you mint costs you 0.08 XTZ. So minting 3 editions of your OBJKT will cost you 0.24 XTZ. Keep that in mind, lest you type in some arbitrarily large number. Now hit the 'mint' button. It'll notify that you have to 'sync' first, with a pop up window. Hit 'sync' in the upper right corner, grant permission with your wallet, then try pressing mint again. It'll ask you for another notification from your wallet to execute the transaction. The Temple wallet should show you sccuess message in the top right corner, or something else if something goes wrong. If everything went well it should have minted your NFT. ## Managing and curating your assets ![](https://gorillasun.de/assets/images/2021-03-14-Getting-started-with-Tezos-and-minting-on-hicetnunc.xyz/curating.png) After minting your OBJKT wait 2-3 minutes then click the drop down menu again, and click 'manage assets'. Your wallet is going to ask for permission. Now it should show you a page that contains your OBJKT with it's resective number (if it doesn't then wait a while longer before you try minting it again, sometimes it just doesn't mint it). Click on your OBJKT, and it should take to a page that is displaying your OBJKT in all it's glory with the information you've entered earlier below it. Your NFT is minted, but you still have to offer it up for purchase. Hit 'sync', and some new buttons should show u next to 'info' and 'owners'. Click on the 'curate' button (it could also have a different name like 'swap', depending on what the devs decide to call it). It'll make two fields apear underneath it 'objkt amount' and 'price per objkt (in tez)'. The first field will specify how many of the OBJKTs you minted you want to offer up for auction. If you minted 3 editions of your OBJKT earlier, you might want to offer up 2 of them for purchase and keep one for yourself, hence you would enter 2 in this field. In the next field you'll enter the price you want to sell each edition of your your OBJKT for. Depending on how much work you've put into your OBJKT this might vary. Keep in mind how much 1 XTZ is in USD, currently 1 XTZ is about 4 USD, so you'll have to see for yourself how much you value your art. Then just hit 'curate' and after a couple of minutes your NFT will be ready for purchase. Now go and spread the word about it on Twitter or Reddit, so that people can find your NFT and buy it. ### Beautiful tablature and sheet music with Lillypond and Frescobaldi URL: https://www.gorillasun.de/blog/beautiful-tablature-and-sheet-music-with-lillypond-and-frescobaldi/ Last updated: 2023-03-09T19:32:45.000Z ## Archiving Ideas as a musician ### My personal struggle keeping track of ideas One of the things that I've found to be very difficult over the years, is finding a good system for archiving and documenting your own musical ideas. Often I would simply make a quick phone recording (voice note) at the end of a practice session, sometimes even a short video, shot from an ungodly angle, with horrible audio quality. It's probably evident that listening back after a couple of weeks to these recordings does not really help me in remembering what I was actually playing, and the thought process at the moment of recording has also disappeared. Sometimes if I'm really desperate I manage to salvage what I can by trying to figure out the tune by ear, but If you're someone who enjoys obscure and abstruse alternate tunings then you've just made it even harder on yourself. ### Discovering Tablature Software Luckily, humanity has already found a convenient way to represent musical ideas in a symbolic way: sheet music and tablature! In addition there's a number of softwares that allow you to create them. If you're a guitarist you've probably used, or at least heard, of Guitar Pro. I remember getting a cracked copy of guitar pro 5 from one of my friends at school on a USB drive many years ago, and I was absolutely blown away. I didn't have an internet connection at home at the time, so I would ask my friend to download the tab files for me and pass them on, again via USB, over the course of a couple of days. I also remember it giving me access to songs that were way out of my playing ability at the time. Until after some time, when my desktop broke and I got a laptop. During my college days I had a notebook, in which I would religiously jot down all the jazz licks that I could come up with. But I also forfeited this habit with time, I didn't have a clear systematic way of notating my ideas and it was very obvious how things were meant to be played when I came back to my notes. Which recently led me to explore again what other tools exist for notating music. One of first that'll pop up would be Muse Score, which I tried but decided that it wasn't for me. I just couldn't get the hang of it. In guitar pro you can simply punch in the fret number on a specific fret and that's it. Muse Score being designed not specifically for guitarists is a lot more versatile, which was way too much for my purposes. I re-downloaded Guitar Pro 7, and messed around a little with the different sounds that already come with it for around a month until my free trial expired. After which I didn't really feel like breaking the bank to get a license. Finally I found something called Lillypond which peaked my interest. ## What's Lilypond? Frescobaldi? ### Markup Languages and Editors Lillypond is not a software per se, it is kind of a markup language. If you've never had to use one, you're better for it. Markup Languages can be thought of as a set of instructions that allow you to format and position elements in a document exactly the way you want. Personally, I use markup languages quite often as they're very convenient and allow you to create digital documents that look very slick. For example, I've come to prefer using Latex over MS Word. Documents made in Latex just look much better, and it makes positioning figures easier, especially when writing academic papers. Coming back from this tangent, Lillypond's primary goal is to create beautiful sheet music via a set of commands that specify what it should look like. We'll get into it in more depth in a minute. Lillypond can be used by itself, but to make easier to edit your script files you'll also want to download another software called Frescobaldi, which comes with a number of features. ### Downloading and Installing Lilypond and Frescobaldi - Download Lilypond [Here](http://lilypond.org/?ref=gorillasun.de) - Download Frescobaldi [Here](https://frescobaldi.org/download?ref=gorillasun.de) ### Setting up Lilypond and Frescobaldi ![](https://gorillasun.de/assets/images/2021-02-09-Creating-beautiful-tabs-and-sheet-music-with-Lillypond-and-Frescobaldi/Settings1.png) After installing both softwares, go ahead and open up Frescobaldi. We have to tell Frescobaldi where to find Lilypond on our device. To do that click edit then preferences. 1. Click on Lilypond Preferences 2. Click the add button 3. Look for the 'Lilypond-windows.exe' where you installed Lilypond. On windows this should be somewhere on your C drive. 4. Make sure to check 'Run Lilypond with english English messages' ### Engraving a simple sheet ![](https://gorillasun.de/assets/images/2021-02-09-Creating-beautiful-tabs-and-sheet-music-with-Lillypond-and-Frescobaldi/Sheet2.png) We start engraving our music now. We can engrave notes by simply opening the brackets and typing in the appropriate letters. ``` \version "2.18.2" ``` ### Engraving music As a guitarist that uses alternate tunings on a regular basis, Lilypond does not disappoint. I'll share the template that I use regularly and have modified over time. ``` \version "2.18.2" \score{ \relative { \tabFullNotation { \set Staff.stringTunings = \stringTuning \time 4/4 \repeat volta 2{ d16\4 (ees\4) g,\3 (bes\3) a\2 d\1 a\2 bes\3 \tuplet 3/2 {ees8\4 (f\4) g,\3} bes\2 \glissando d\2 \bar "|" f16\4 bes,\3 c\2 a'32\1 (bes\1 a16\1) c,\2 bes\3 f'\4 bes,8\6 ees\4 g,\3 f\2 \bar "|" g'4\1 (f4\1) f\1 f\1 \bar "|" \break ees16\6 d\4 bes\3 f\2 c'\1 f,\5 f'\4 g,\3 bes4\1 bes4\1 \bar "|" } \break \grace bes16\6 f'\4 g,\3 bes\3\staccato bes\6 bes8\3\staccato \grace bes16\6 bes\3\staccato c16\2 f\4 g,\3 \staccato bes\6 f8\2 \grace g'16\6 g\4 bes,\3 \bar "|" \break c\2 d\2 c\3 bes\3 bes8\3 \grace bes\6 bes\3 bes4\3 bes4\1 } } \header { piece = "Tuning: A# F A# D# F D // Capo: 3rd fret" } } \header { title = "Cotton Candy Dream" composer = "Ahmad Y. Moussa" } ``` And we obtain sheet music that looks like this: ![](https://gorillasun.de/assets/images/2021-02-09-Creating-beautiful-tabs-and-sheet-music-with-Lillypond-and-Frescobaldi/Sheet1.png) The number of ways you can format sheet music with Lilipond is insane and can be overwhelming at first. However there is an extensive documentation that is just a google search away in case you can't figure out how to do something specific. ### Creating Patterns with Grids and Sine Waves in P5 URL: https://www.gorillasun.de/blog/creating-patterns-with-grids-and-sine-waves-in-p5/ Last updated: 2023-03-09T19:05:54.000Z ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionX.gif) ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionY.gif) ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionXnY.gif) ## Continuously evolving your sketches My very first post on this website explains how to create a arbitrarily sized grid of shapes, which I think teaches a very important concept, which is 'instancing'. Thinking in an object oriented manner can go a long way when creating sketches, and can lead to having code that follows a modular structure. Once you code up a working sketch with such a structure, simply changing one parameter can lead to an entirely different behaviour. At that point you're not really 'coding' your sketch anymore, but you're 'playing' with it. ## Sketch from Scratch In this blog post I'd like to explain what's going on in this Sketch specifically: It might not be very obvious, but the secret ingredient behind the motion in this sketch are trigonometric functions. I talk a little about trigonometric functions in [this previous blog post](https://gorillasun.de/blog/Continuous-oscillating-motion-in-P5JS-with-Sine-functions?ref=gorillasun.de). ## Intuition behind the Sketch Essentially, we're creating a grid of objects, each of which holds a number of parameters and `display()` function to draw itself to the canvas. The parameters include it's position and size, and optionally also it's color. The heavy lifting happens in the `display()` function. Since every rectangle is continuously redrawn, what if we were to change their size and color over time? We could simply do so by modulating the size attribute with a sine function. But first things first, let's create the grid. ## The grid ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/grid.png) For the sake of clarity I'll brush over the code for creating the grid, however a more detailed explanation can be found [here](https://gorillasun.de/blog/Sketch-from-Scratch-1-Colorful-checkerboard-in-P5JS?ref=gorillasun.de). This snippet, that constitutes the largest part of the code, creates a 'Grid' object which holds an array of 'Square' objects. Invoking the display function of the Grid object will in turn call all the display functions of each Square object and draw them to the canvas, depending on it's position. The grid object takes care of positioning the Squares such that you can create grids with an arbitrary number of rows and columns: ``` class Square { constructor(px, py, s) { this.positionX = px; this.positionY = py; this.curvature = 1; this.size = s; this.c = 0; } display() { strokeWeight(3) rect(this.positionX - this.size / 2, this.positionY - this.size / 2, this.size, this.size, this.curvature) } } class SquareGrid { constructor() { this.squares = [] this.gridWidth = 20; this.gridHeight = 5; this.squareSize = 20; this.spacing = 24; this.positionX = width / 2 - ((this.gridWidth - 1) * (this.spacing)) / 2; this.positionY = height / 2 - ((this.gridHeight - 1) * (this.spacing)) / 2; for (let i = 0; i < this.gridWidth; i++) { let row = [] for (let j = 0; j < this.gridHeight; j++) { row.push( new Square((this.positionX + this.spacing * i), (this.positionY + this.spacing * j), this.squareSize) ) } this.squares.push(row) } } display() { for (let i = 0; i < this.gridWidth; i++) { for (let j = 0; j < this.gridHeight; j++) { this.squares[i][j].display() } } } } function setup() { createCanvas(500, 200); grid = new SquareGrid() } ``` ## Modulating the Rectangle's size As I already mentioned, since the rectangles are continuously redrawn, it would be interesting to plug something more interesting into it's 'this.size' attribute, rather than just a fixed number. For example, a sine function! We also need the `millis()` function that p5js provides to get motion out of the `sin()` function. The sine function now start oscillating between it's two bounds, that are -1 and 1, and we need to scale it accordingly to obtain any visual change, in this case I just multiply it by 14, which is adequate for the canvas and rectangle size we are using. You might have to change this number if you change the canvas size and the overall size of you drawn objects. Additionally I divide `millis()` by a value, which essentially just slows down the osciallting movement of the sine function. Otherwise it would be nauseatingly fast. ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/modulatingSize.gif) ``` class Square { constructor(px, py, s) { this.positionX = px; this.positionY = py; this.curvature = 1; this.size = s; this.c = 0; } display() { strokeWeight(3); // This Line is all that changed this.size = 20 + 14 * sin(millis() / 500); rect(this.positionX - this.size / 2, this.positionY - this.size / 2, this.size, this.size, this.curvature, this.curvature, this.curvature, this.curvature); ``` ### Sine function with respect to x coordinate Here's where things become interesting, what if we were to plug in another attribute into the sine function? For instance, the x coordinate of the drawn object? This would offset the sine function by some amount, and the size of each one of the rectangles wouldn't uniformly increasing and decreasing. Here you can see the effect: ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionX.gif) ``` display() { strokeWeight(3); // This Line is all that changed this.size = 20 + 14 * sin(this.positionX + millis() / 500); rect(this.positionX - this.size / 2, this.positionY - this.size / 2, this.size, this.size, this.curvature, this.curvature, this.curvature, this.curvature); ``` ### Sine function with respect to y coordinate What about the Y coordinate? ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionY.gif) ``` this.size = 20 + 14 * sin(this.positionY + millis() / 500); ``` #### Sine function with respect to x and y coordinate What if we were to use both X and Y coordinates? ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/positionXnY.gif) ``` this.size = 20 + 14 * sin(this.positionY +this.positionX + millis() / 500); ``` ### Adding Color Now we can apply this same concept to the color of each object. And we're not just limited to the sine function, we could alternatively use a cosine function or a combination of the two. The possibilities really are endless! ![](https://gorillasun.de/assets/images/2021-03-03-Modulating-Shapes-and-Creating-Patterns-in-P5JS-with-Sines-and-Cosines/color.gif) ``` fill(127.5 + 127.5 * cos(this.positionX + tan(millis() / 5000) + millis() / 500), 127.5 + 127.5 * sin(this.positionY + cos(millis() / 500) + millis() / 500), 120.5) ``` This is it for today's blog post, if you have any questions leave a comment, or shoot me a message directly on any of my social medias! If you enjoyed this article, consider subscribing to my mailing list, or if you'd like to support this website, consider sharing this article. ### Rectangle Packing: An Incredibly Difficult Problem URL: https://www.gorillasun.de/blog/rectangle-packing-an-incredibly-difficult-problem/ Last updated: 2023-05-07T20:47:14.000Z ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles1.png) It often happens that I have an idea for a sketch, which in my mind, seems relatively simple to implement; however, when the time comes and I'm free to start working on it, I have literally no clue where to even begin. This is usually because I severly underestimated the complexity of the problem at hand. For instance, recently I've stumbled across a number of P5JS and Processing sketches, that try to fit as many simple shapes as possible, where each shape has a different size, into an area of limited size. This is usually called packing, or more comonly known as packing problems. It seemed worthwhile to learn a little bit more about them. ## Packing Problems A little bit further down the rabbit hole, I find out that packing problems are actually a quite difficult family of mathematical optimization problems. This doesn't discourage me however, but rather makes the problem even more exciting as well as challenging. Wikipedia explains the problem much more eloquently than what I'm capable of: > Packing problems are a class of optimization problems in mathematics that involve attempting to pack objects together into containers. The goal is to either pack a single container as densely as possible or pack all objects using as few containers as possible. \[...\] Usually the packing must be without overlaps between goods and other goods or the container walls. In some variants, the aim is to find the configuration that packs a single container with the maximal density. More commonly, the aim is to pack all the objects into as few containers as possible. Essentially, we'll want to jampack the largest possible number of items into the least amount of space. This type of problem is usually studied in the context where you have multiple bins or containers which you want to fill optimally with the items at hand, however we're only going to concern ourselves with the case were we have one bin (which is not to be confused with the knapsack problem, which might be a topic for a future post). ## Why is Rectangle Packing so difficult Optimization problems are generally not my cup of tea, and even though I've had to take some courses on algorithmic complexity as well as convex optimization during my time at university, it's usually way over my head, however I will attempt to explain succinctly. Let's have look at some trivial examples. How would you optimally place a handful of rectangles, such that they take the least amount of space possible? For a small number of rectangles it's probably quiet easy to do by hand: ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example1.png) ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example2.png) ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example3.png) Now consider the case where you have to arrange more rectangles, it'll probably take you a lot more time to do so by trial and error, and you can see that some of the examples below are far from being optimal: ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example4.png) ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example5.png) ![](https://gorillasun.de/assets/images/2021-02-27-rectangle-packing/rectangles_example6.png) You can see that the complexity of the problem scales with it's size. This innocent looking problem, reveals itself to be a monstrosity of a conundrum. Another problem is, can we even check that our arrangment is optimal? Well, technically yes, however, there is no known strategy to finding that optimal solution. In fact bin packing problems are at least NP-hard, and the best we can do currently is solving them with heuristic methods that find solutions relatively quick. The literature on packing problems is quite extensive, one really interesting paper on the topic is '[A Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional Rectangle Bin Packing](http://pds25.egloos.com/pds/201504/21/98/RectangleBinPack.pdf?ref=gorillasun.de)' by Jukka Jylänki, which is a relatively old paper from 2010\. So you can see that I'm probably not going to be able to create a better algorithm than what the literature has already suggested. Another interesting paper was quite old '[The bottom-left bin-packing heuristic: An efficient Implementation](https://www.cs.princeton.edu/~chazelle/pubs/blbinpacking.pdf?ref=gorillasun.de)' from 1983 by Bernard Chazelle. And I do have a weak spot for old papers, especially when they have figures that must have taken a lot of effort to make back then. I found it through [this heated stackoverflow thread](https://stackoverflow.com/questions/1213394/what-algorithm-can-be-used-for-packing-rectangles-of-different-sizes-into-the-sm?ref=gorillasun.de) that was also inquiring about a solution for the rectangle packing problem, and is as of now more than 11 years old. ## Creating the visualizations After staring at my laptop screen for more than two hours with frustration, trying to implement some simple version of a greedy heuristic algorithm that will neatly pack my rectangles, I ultimately gave up and started looking for already implemented algorithms. ### Python rectpacker ``` from rectpack import newPacker rectangles = [(50,50),(100,50),(25,45),(80,60),(40,60),(40,30)] bins = [(200, 200)] packer = newPacker() Add the rectangles to packing queue for r in rectangles: packer.add_rect(*r) Add the bins where the rectangles will be placed for b in bins: packer.add_bin(*b) Start packing packer.pack() import matplotlib.pyplot as plt from matplotlib import patches output = [] for index, abin in enumerate(packer): bw, bh = abin.width, abin.height print('bin', bw, bh, "nr of rectangles in bin", len(abin)) fig = plt.figure() ax = fig.add_subplot(111, aspect='equal') for rect in abin: x, y, w, h = rect.x, rect.y, rect.width, rect.height output.append([x,y,w,h]) plt.axis([0,bw,0,bh]) print('rectangle', w,h) ax.add_patch( patches.Rectangle( (x, y), # (x,y) w, # width h, # height facecolor="#00ffff", edgecolor="black", linewidth=3 ) ) fig.savefig("rect_%(index)s.png" % locals(), dpi=144, bbox_inches='tight') printing the rectangle coordinates to plot them in P5JS ``` If you'd like to use different packing algorithms, you can simply import them as such: ``` import rectpack.guillotine as guillotine packer = newPacker(pack_algo=guillotine.GuillotineBafSas) ``` The framework and the list of the supported algorithms can be found [here](https://github.com/secnot/rectpack?ref=gorillasun.de) ### Visualizing it in P5JS Even though I love matplotlib, I'm not a big fan of the rectangles look, hence I've used P5JS to visualize them, which gives us some more flexibility in the appearance. ``` var listOfColors = ["#01295f","#22547b","#437f97","#64895e","#849324", "#c2a31a","#ffb30f","#fe6415","#fd151b","#fd2a30"] var rectangles = [[0, 0, 250, 250], [250, 0, 100, 200], [250, 200, 100, 200]] class Item { constructor(x, y, w, h, c) { this.x = x; this.y = y; this.w = w; this.h = h; this.c = listOfColors[int(random(0, listOfColors.length))]; } display() { strokeWeight(2) fill(this.c); rect(this.x, this.y, this.w, this.h); } } class Pack { constructor(x, y, w, h, numItems) { this.x = x; this.y = y; this.w = w; this.h = h; this.c = 0; this.numItems = rectangles.length; this.items = []; for (let i = 0; i < this.numItems; i++) { this.items.push(new Item(rectangles[i][0], rectangles[i][1], rectangles[i][2], rectangles[i][3])) } } sortByLargestArea() { while (this.items.length > 0) { console.log(this.items.length) var largestArea = 0 var largestAreaIndex = 0 for (let i = 0; i < this.items.length; i++) { if (this.items[i].w * this.items[i].h > largestArea) { largestArea = this.items[i].w * this.items[i].h; largestAreaIndex = i; } } this.itemsDone.push(this.items.splice(largestAreaIndex, 1)[0]); } } display() { for (let i = 0; i < this.items.length; i++) { this.items[i].display(); } } } function setup() { createCanvas(500, 500); packer = new Pack(0, 0, 100, 100, 10); } ``` And this pretty much sums up the post, if you've enjoyed reading this post as much as I enjoyed writing it, feel free to leave a comment or subscribing to my mailing list. Otherwise, check out some other posts, who knows, maybe you'll find something that interests you! Cheers! ### Brian Eno's Endless Music Machines URL: https://www.gorillasun.de/blog/brian-enos-endless-music-machines/ Last updated: 2023-05-08T07:50:38.000Z ![](https://gorillasun.de/assets/images/thumbnails/musicmachine.webm) > “One of my long-term interests has been the invention of ‘machines’ and ‘systems’ that could produce musical and visual experiences… \[T\]he point of them was to make music with materials and processes I specified, but in combinations and interactions that I did not.” — From “Generative Music” in A Year With Swollen Appendices ## An endless stream of ever changing music ### My journey into Ambient Music My love for ambient music started when I first listened to artists like Tycho and Jake Bowen. When listening to some of their pieces, I often feel like I'm being taken away into a distant world, entirely drawn through the narrative that the music is telling. In this captivated state I can't help but feel a deep sense of serenity and melancholy. Among others, they were maybe the first two artists that inspired me to get into electronic music myself. And I couldn't help but be mind-blown when I saw all the possibilities that modern softwares offer. For instance, I can have an entire orchestra at my disposition at any time of the day. Which makes me think how tedious it must have been for composers before our time, we now have the incredible luxury of not just being able to hear our compositions at any given instant, but we can also manipulate sound as if it were a physical entity. Lest I go on a tangent, with these modern tools many have attempted the creation of systems that are capable of generating streams of music, all by themselves, and without any further human input. The most noteworthy individual among them might be Brian Eno. ## The Origins of Generative Music ### Who's Brian Eno? Generative Music finds it's beginnings with Brian Eno, an English musician and record producer, who first got interested in Generative Music by observing wind chimes, and how they could endlessly create different sounds, without ever repeating themselves. By design, they are incapable of creating the same sound twice as they react to some current of wind that brings them into motion. This sparked in Brian Eno an idea of creating a system that was capable of continuously generating a stream of music that was ever changing. His first experiments involved playing around with tape recorders, that would play melodic parts he pre-recorded, which would musically work together when played at the same time. Playing these tape recorder at modulating speeds and different offsets made it such that an entirely new musical piece emerged that never repeated itself. ### What is Generative Music Exactly? Generative music, also known as procedurally generated music, is created by a system according to some pre-defined algorithmic rules, that are capable of arranging musical ideas in a coherent manner. This arrangement happens in such a manner that the emerging musical patterns may or may not repeat over the course of some time. Algorithmic Rules can generally mean a broad number of things, ranging from simple rules such as simple ratios and probabilities but also more complex types of sequencing and automatic composition. In this manner, the generated music is never truly 'random', it does follow specific patterns, which should not be immediately evident to the listener. ### Eno's work ## The thought process behind Eno's Work ### Evolving metaphors, in my opinion, is what artists do In his 1996 talk "Evolving metaphors, in my opinion, is what artists do." he explains that one of his inspirations were pieces of music such as 'It's gonna rain' by steve reich. It's a fairly long piece, built on a fairly simple idea. It essentially loops the same sample over and over again played back on two machines at the same time, due to the minute differences in speed between the two machines it makes it such that the sample slips in and out of sync with itself, creating very interesting textures. Whilst reading the transcript of the speech, I quickly opened Youtube and listened a little bit to the piece, and skimmed back and forth a bit. Back to the transcript, Brian gives a visual analogy. Usually when you stare at something for a long time, you start noticing things that you wouldn't have immediately noticed from a first glance. Your ear works in the same manner, if you listen to the same thing over and over again, you become infinitely more aware of the small details that are present in the repeated sample. This is what happens in Steve Reich's track, even though the sample might seem a little silly at first, it is incredibly rich with information. Brian mentions that there are sounds of pigeons on the track, which I didn't hear in my first listening. Which made me go back for a second listening, and indeed after a while you start hearing some bird like sounds, even though them being very feeble ### Moiree Patterns He gives another visual analogy, that of Moiree Patterns. Moiree patterns are interference patterns, patterns that emerge from overlapping two grid-like patterns: > Now a moire pattern is when you overlay two identical grids with one another. Here's one, here's the other. Now when I overlay them, see what happens, you get a very complicated interaction. You get something that actually you wouldn't have predicted from these two original identical sheets of paper. This is actually a very good analog of the Steve Reich piece in action. Something happens because of one's perception rather than because of anything physically happening to these two sheets of plastic which produce an effect that you simply couldn't have expected or predicted. And here's an example of a Moiree Pattern: ![](https://gorillasun.de/assets/images/2021-02-13-Brian-Enos-Endless-Music-Machines/moiree.png) ## The mechanics of Eno's work ### Musical Moiree Patterns Being inspired and impressed by Steve Reich's track and the concept of Moiree Patterns, that is, complex patterns emerging from overlapping simple patterns, he attempted to approach composition in his manner. In a similar manner to the picture that you can see above, Eno tried to overlap simple patterns and obtain a more intricate whole. Naturally, music is something that progresses as time goes on, and one can only experience a single moment of the piece at any given time, as opposed to an image, which you can observe in it's entirety at any given time. To simulate Moiree Patterns in a temporal manner, Eno recorded several different notes, each on a separate tape recorder, and configured them such that they looped at different intervals, thus creating a stream of music that seems to have an infinite number of variety as the played notes interact differently with each other over time. > Music for Airports, at least one of the pieces on there, is structurally very, very simple. There are sung notes, sung by three women and my self. One of the notes repeats every 23 1/2 seconds. It is in fact a long loop running around a series of tubular aluminum chairs in Conny Plank's studio. The next lowest loop repeats every 25 7/8 seconds or something like that. The third one every 29 15/16 seconds or something. What I mean is they all repeat in cycles that are called incommensurable -- they are not likely to come back into sync again. In a way, this is very similar to polyrhythms, but on a much larger scale, which is ingenious to me. ## Creating my own generative music system ### Using sequencers and python scripts For a while now, I've been becoming more obsessed with creating a system that can generate or at least simulate a stream of music with endless variety. However I've found it quiet difficult to find the right tools for it. For example, even though Ableton Live provides a sequencer, it doesn't allow for much control on the sequencing, such as assigning a probability to each step in the sequence, making it such that the loop doesn't repeat the exact same way every iteration. After discovering that I can send MIDI signals from a python script to Ableton I attempted writing scripts that would send random MIDI notes quantized to a scale and play them. Random MIDI notes, even if they're quantized don't sound very good, and designing intricate melodic sequences that are proceurally generated or at least procedurally conditional is very difficult. There are many more ways in which I attempted to tackle this problem, all while not having to spend any money on gear or software, which I will probably talk about in one of my future posts. Eno goes on to talk about other inspirations that he encountered in the coming years of his career, such as Conway's Game of Life (which I will definitely discuss in a future post) amongst others. The entire transcript of the talk can be found [here](https://inmotionmagazine.com/eno1.html?ref=gorillasun.de), it's a very interesting and very entertaining talk and I recommend having a look at it. ### Sending MIDI signals between Ableton and P5JS URL: https://www.gorillasun.de/blog/sending-midi-signals-between-ableton-and-p5js/ Last updated: 2023-05-07T20:47:27.000Z In this post we have a look a WebMIDI.js, a javascript library that'll allow to handle MIDI signals in p5js. This is especially useful if you want to create a visual interactive midi controller, or control you sketches with MIDI signals sent from your daw. In this post I'll show you how to do the latter. ## Importing WebMIDI.js In an earlier blog post, I explain how one can send MIDI signals from a python script to ableton live, which requires us to create a virtual port. This time around we'll also need the LoopMIDI virtual port that we have used for the python tutorial, so go ahead and download it from [here](http://www.tobias-erichsen.de/software/loopmidi.html?ref=gorillasun.de). Next we'll hop over to the web editor where we have to configure a couple of things. In the web editor, directly underneath the the large 'play' button, there is a smaller arrow button. Clicking on it reveals to use that there are other files, in addition to 'sketch.js' which we are currently editing. Click on 'index.html'. In the '' tag you can a number of lines that are importing the P5JS library for us to use. Here we can also import other javascript libraries, such as WebMIDI.js. Go ahead and add the following line in the head tag of index.html: ``` ``` ## Enabling WebMIDI The next thing we need to do is to check that WebMIDI works and that we can see the accesible MIDI ports. Inside the setup function we need to insert the following snippet of code: ``` WebMidi.enable(function(err) { //check if WebMidi.js is enabled if (err) { console.log("WebMidi could not be enabled.", err); } else { console.log("WebMidi enabled!"); } }); ``` If you run your sketch now, and the console displays 'WebMidi enabled!' then you're good so far! ## Creating the MIDI listener The next thing we have to do is creating a MIDI listener that listens to a MIDI port for signals and reacts on specific MIDI triggers. ### Setup Go ahead and fire up LoopMIDI and let it run in the background for now. Still within the setup function and inside the `WebMidi.enable(function(err){})` clause we add this snippet of code: ``` //name our visible MIDI input and output ports console.log("---"); console.log("Inputs Ports: "); for (i = 0; i < WebMidi.inputs.length; i++) { console.log(i + ": " + WebMidi.inputs[i].name); } console.log("---"); console.log("Output Ports: "); for (i = 0; i < WebMidi.outputs.length; i++) { console.log(i + ": " + WebMidi.outputs[i].name); } ``` Running this code you should get this output in the console: WebMidi enabled! --- Inputs Ports: 0: loopMIDI Port --- Output Ports: 0: loopMIDI Port ### Selecting the correct port ``` //Choose an input port inputSoftware = WebMidi.inputs[0]; //The 0 value is the first value in the array //meaning that we are going to use the first MIDI input we see //which in this case is 'LoopMIDI port' ``` ### The listener And lastly we need to create the actual listener: ``` //listen to all incoming "note on" input events inputSoftware.addListener('noteon', "all", function(e) { //Show what we are receiving console.log("Received 'noteon' message (" + e.note.name + e.note.octave + ") " + e.note.number + "."); //the function you want to trigger on a 'note on' event goes here } ); //The note off functionality will need its own event listener //You don't need to pair every single note on with a note off inputSoftware.addListener('noteoff', "all", function(e) { //Show what we are receiving console.log("Received 'noteoff' message (" + e.note.name + e.note.octave + ") " + e.note.number + "."); //the function you want to trigger on a 'note on' event goes here } ); ``` And we're good! Hit the run button and hop over to Ableton. ## Configuring Ableton In ableton we now need to create a MIDI track, arm it and set the output of it to the virtual port, which is 'LoopMidi port'. Lastly also set the input of the track to your MIDI controller, or to your computer keyboard. Now if you hit a button or key, the console in P5JS should print the corresponding note name. Now you can do all sorts of crazy stuff, making your animations react to MIDI inputs from Ableton, or from other softwares. Next blog post will have a hand on tutorial for making a sketch that is in sync with your MIDI signals. Thanks for reading! ### Continuous oscillating motion in P5JS with Sine functions URL: https://www.gorillasun.de/blog/continuous-oscillating-motion-in-p5js-with-sine-functions/ Last updated: 2023-05-07T20:46:46.000Z ## What's the problem with trigonometry? ### Everybody hates trigonometry Everybody hates trigonometry (at least at some point throughout their life), however, if you want to add specific kinds of motion, such as angular, orbiting and oscillating motions (to name a few), to your creative coding sketches, then there's no way around trigonometry. Understanding trigonometric concepts intuitively can go a long way in improving your problem solving skills. I know it did for me. ### The way it's taught... is problematic I remember studying trigonometric functions in school, and having the worst time of my life. I didn't get them, I hated them and they had no practical purpose for me in real life. But it's kind of funny that I've come around to loving them, almost eight years after having been introduced to them for the first time.In mathematics the Sine function of an angle is defined as the ratio of the opposite side of an angle to it's hypotenuse. And it's exactly this definition that I hated so much in school. It doesn't really show you all the wonderful things that you can do with the Sine function, it's just a bland non-descriptive book definition. In the next part I'll explain why the Sine function is so great and how I like to think about it. ## Sine functions are useful! ### The Sine function is a conversion of linear motion into oscillating motion The Sine function has two awesome properties. Firstly it is bounded by the interval \[-1,1\], and secondly, we can use it to convert a linear movement into an oscillating movement. You'll get what I mean with this in a second. Let's start with the definition of a Sine function: 'The Sine function of an angle is defined as the ratio of the opposite side of an angle to it's hypotenuse'. Personally, this definition is not extremely illustrative. For purposes of creative coding, the interesting property of this trigonometric function arises when you add a linearly increasing parameter to the mix. The simplest form of such a parameter that you can find in probably every programming language, is time. In P5JS you can get the current time since the moment of starting the program by invoking the `millis()` function. The `millis()` return time in milliseconds which is in fact a linearly increasing value. Plugging this value into the Sine function we'll obtain a radius that is sweeping around the circle. The animated gif below exemplifies this, and the snippet of code is what creates the animation. It looks a little messy, but I'll explain in detail in what follows. ![](https://gorillasun.de/assets/images/2021-02-06-Continuous-oscillating-motion-in-P5JS-with-Sine-functions/out.gif) The exact code for this is a little bit more complicated: ``` speed = 4000 function draw() { ellipse(200, 200, 200) stroke(255, 0, 0) line(200, 200, sin(millis() / speed) * 100 + 200, 200) stroke(0) line(200, 200, sin(millis() / speed) * 100 + 200, cos(millis() / speed) * 100 + 200) line(sin(millis() / speed) * 100 + 200, cos(millis() / speed) * 100 + 200, sin(millis()/ speed) * 100 + 200, 200) } ``` The red line that is contracting and expanding over time is drawn by the following command 'line(200, 200, sin(radians(millis()) / speed) \* 100 + 200, 200)'. The P5JS line function takes 4 arguments, the x and y coordinates of the start point and the x and y coordinates of the end point of the line. By replacing the x coordinate of the end point by a sine function we can obtain this oscillating motion. Obviously, as stated earlier we need to give some input to the sine function, which will essentially be a function of time. We call the 'millis()' function to get the current time and divide it by a speed parameter. The speed parameter is used to slow down the movement so that the sweeping radius doesn't go haywire (try running the sketch without dividing by speed). Then, the last thing you still need to do, is to just wrap the result in the already inbuilt 'sin()' function and scale it appropriately such that it appears in the correct location on the canvas (which means multiply by the radius of the circle and translate it to the center of the circle). You can also see two other lines, the sweeping radius and the line opposite to the angle formed by the radius and the red line, which is essentially the Sine. The rest of the code snippet show how to draw them. ## How to use this in context You see this is awesome, because it allows us to add a lot of interesting motion to our P5JS sketches (of course it's not limited to only P5JS). For example we can draw some points and have them move in a wavy pattern as you can see in the next animated gif. ![](https://gorillasun.de/assets/images/2021-02-06-Continuous-oscillating-motion-in-P5JS-with-Sine-functions/out2.gif) We create a number of points in a for loop and modulate their y coordinate with a sine function which will be parametrized by their position in addition to time. This yields an oscillating wave shaped string of dots. ``` function setup() { createCanvas(800, 400); speed = 2000 } function draw() { background(220); strokeWeight(2) ellipse(200, 200, 200) stroke(255, 0, 0) line(200, 200, sin(millis() / speed) * 100 + 200, 200) stroke(0) line(200, 200, sin(millis() / speed) * 100 + 200, cos(millis() / speed) * 100 + 200) line(sin(millis() / speed) * 100 + 200, cos(millis() / speed) * 100 + 200, sin(millis() / speed) * 100 + 200, 200) strokeWeight(4) for (i = 0; i < 100; i++) { point((i * 4 + 400) % 400 + 350, sin(i/10+millis() / speed)*80 + 200) } } ``` ### How to write interesting Chord Progressions URL: https://www.gorillasun.de/blog/how-to-write-interesting-chord-progressions/ Last updated: 2023-03-09T19:30:02.000Z ![](https://gorillasun.de/assets/images/thumbnails/2021-02-05-10-tips-to-spice-up-your-chord-progressions.png) The chord progression is without a doubt the underlying driving force of your song. The way I like to think about it, is that specific chords can convey very specific types of emotions, and more specifically, it's the transition between two chords what conveys a sense of emotive movement in your composition. I am well aware that this type of blog post is probably a horse beaten far beyond the point of no return, but I'll try to offer some tips that I use when I feel like I'm stuck while writing music. Let's get started! ## Remember the basics One thing that I've learned the hard way, is that adding complexity to your music, for the sake of adding complexity is usually not a good way to develop your composition. You don't really need incredibly complex harmony to create an interesting piece of music. You really don't need more than the simple old major scale to create good chord progressions, as a matter of fact if you're building your chords from a diatonic scale, it'll be unlikely that you end up with something that doesn't sound nice. Here are some examples of chord progressions that I personally use a lot: ### II-V-I Your browser does not support the audio element. ### IV-V-vi-I Your browser does not support the audio element. ### iii-IV-V-vi Your browser does not support the audio element. --- ## Melody on top of your chords Sprinkling some notes on top of your chords can add a lot of character. Notes beyond the 3rd and 5th of a chord can add a lot flavor to your progression and make it feel like you've already composed a little composition that only needs a little more fleshing out. Here are 3 variations of melodies on top of the 3-4-5-6 chord progression we have already seen earlier: ### Variation 1 Your browser does not support the audio element. ### Variation 2 Your browser does not support the audio element. ### Variation 3 Your browser does not support the audio element. --- ## Borrowed Chords Next up are borrowed chords. Inserting a chord from another mode in your progression can change the entire overall mood, and has the effect of giving a surprising audible twist. Here are some examples, with the same chord progressions from the first tip, but where we replace one of them by it's major or minor equivalent. ### I-III-IV-V Your browser does not support the audio element. ### I-V-VI-III Your browser does not support the audio element. ### I-IV-iv Your browser does not support the audio element. --- ## Trust your ears Using my ears is maybe one of the things that I forget most often. And by using my ears I mean actively listening to the music I'm working on, and trying to imagine where it wants to go. Every chord has a tendency to go somewhere, it's somehow pulling towards a different set of notes, sometimes it's not very obvious where it wants to go though. For example a simple major chord is very comfortable and doesn't seem like it's about to go anywhere, but if you try to picture where it could go you can start hearing some options. Your browser does not support the audio element. ### MIDI signals from Python to Ableton Live URL: https://www.gorillasun.de/blog/midi-signals-from-python-to-ableton-live/ Last updated: 2023-04-18T08:39:43.000Z This is an outdated post, please visit the newer version here: [Sending MIDI Signals from Python to Ableton Live - 2023A full guide to setting up an environment that allows a python script to communicate with Ableton Live via MIDI signals.![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/size/w256h256/2023/03/icon-1.png)Gorilla SunAhmad Moussa![](https://storage.ghost.io/c/e8/51/e851bb8f-1e95-43e1-83eb-1b6ae9a0791c/content/images/2023/04/Image-12.png)](https://www.gorillasun.de/blog/sending-midi-signals-from-python-to-ableton-live-2023/) --- Over two years ago, I saw Andrew Huang's video on creating music from a video of fireworks. He used a software that essentially took the pixel values of a video and converted them to midi signals that were sent to his modular synth. Since I had no modular synth (and I still don't have one), but had Ableton Live, I wanted to build somthing similar. However I had no idea how to send external triggers to Ableton or how it could receive them. I honestly didn't know where to begin with, and info on this seemed very sparse on the internet. But after a little digging I was able to piece together all the components that I needed. After that I created a github repository that guides one through the necessary steps to have a python script trigger a synth in Ableton. Which is to date my most starred github repository. It's only appropriate that I revisit it and write a more detailed blog post about it. Let's get started! ## Requirements - Obviously you need to have python installed on your pc/laptop. - After verifiying that you have python installed correctly on your machine, install this package via pip: `!pip install python-rtmidi` - Install this software: [LoopMIDI by Tobias Erichsen](http://www.tobias-erichsen.de/software/loopmidi.html?ref=gorillasun.de) - And naturally you'll also need Ableton Live installed on your device. ## Setup ### Why do I need to install rtmidi and LoopMIDI? rtmidi is a python package that makes it easy to create a MIDI signal with a couple of lines of code in a python script, whereas LoopMIDI allows us to create a virtual port. Both are essential for us to be able to send the MIDI signal to Ableton. We will configure ableton in such a way that it is going to listen to the virtual port, whereas the python script will create and send MIDI signals to that port. ### Creating a port with LoopMIDI Creating a new port with LoopMIDI is as simple as running the executable and then clicking on the small + button in the lower left corner. You'll see a new entry pop up in the list of ports. Voila, we have created a port! ### The python script Create an empty python file somewhere in a directory on your pc. Copy the following content into it: ``` # import time and rtmidi package import time import rtmidi the function call rtmidi.Midiout() creates the handler that we'll use to send midi signals midiout = rtmidi.MidiOut() check and get the ports which are open available_ports = midiout.get_ports() here we're printing the ports to check that we see the one that loopMidi created. In the list we should see a port called "loopMIDI port". print(available_ports) Attempt to open the port if available_ports: midiout.open_port(1) else: midiout.open_virtual_port("My virtual output") this is how you create a midi note, the specs are: [command, note, velocity] note_on = [0x90, 60, 112] note_off = [0x80, 60, 0] midiout.send_message(note_on) Here you need to insert a short delay before turning the note off to make sure that the note_on signal was received time.sleep(0.5) midiout.send_message(note_off) ``` There's a number of things happening in this short piece of code. First we are importing the rtmidi package that we installed with pip as well as the time module from python, we'll need it in a bit. Next we invoke check which ports exist on our device at the moment of execution and print a list of them. There should be two, one default port that already exists on our system as well as the LoopMIDI port that we created. ### But what are MIDI signals exactly? If you got this far, great! Now we need to create the midi note that we will send to the port. MIDI signals are essntially a set of commands that can be created following certain specifications. More formally a midi command consists of a series of numbers that indicate a certain instruction that will be executed when received by a MIDI device. rtmidi allows us to create such a command simply by creating an array consisting of three values. The first being the event type, here we wrote 0x90 indicating a 'note on' event. The second value indicates the pitch of the note. MIDI notes span from 0 to 127, where a value of 60 would indicate a middle C note. And lastly, we indicate the velocity of the note, which is essentially the intensity with which we are playing the note. Analogically, velocity can be portrayed by how hard you're pressing down on a piano key. On the following line of code you can see another set of values, indicating the 'note off' event, which we will need to turn indicate that we are done playing the middle C note that we just sent over the port. Notice that here we indicate a velocity of 0. After creating both 'note on' and 'note off' events we can proceed to sending the notes over to the port. This is simply done by invoking the handler and using the send\_message() function, where we pass the 'note on' message. If you switch to the LoopMIDI window you'll see that the value in the 'Total Data' column for the respective port will have increased, which means that the note has been received. ## Configuring Ableton In Ableton we'll have to do click a couple of buttons. First jump to your preferences and go to Link MIDI. In the 'MIDI ports' section you should see a entry called 'Loop MIDI' port under inputs. Click on the 'on' button under the 'track' column. ![](https://gorillasun.de/assets/images/2021-02-01-A-tutorial-on-sending-MIDI-signals-from-a-python-script-to-Ableton-Live/ableton_config1.png) After that create a MIDI track and make sure it has an instrument loaded. Next you'll want to arm the track, set it to auto and set the 'MIDI from' field to the 'Loop MIDI' port. Now run the script, and voila it should have trigerred the midi note. ### Sketch from Scratch 1 Colorful checkerboard in P5JS URL: https://www.gorillasun.de/blog/sketch-from-scratch-1-colorful-checkerboard-in-p5js/ Last updated: 2023-07-27T23:08:28.000Z ## Why you need a visual medium alongside your music ![](https://gorillasun.de/assets/images/2021-01-26-Sketch-from-Scratch-1-Colorful-checkerboard-in-P5JS/out.gif) Twitter and Instagram are primarily visual mediums and are not extremely well suited for sharing audio content. Digital artists, designers and models can get a lot of traction from posting beautiful pictures or videos, especially since it would be something that other people would want to re-tweet or share in their stories. As a musician or producer, screen recordings of your DAW playing back your track is usually not extremely aesthetically pleasing. Personally, it's been extremely difficult to find something visually interesting and also thematically appropriate to use as cover art for your social media post. ## Keeping it original Another restriction that I restrained myself with was that everything that I post had to be completely original, which naturally includes the cover art. This led me to experiment with different programming languages and tools that could technically be used for creating these visuals. I've seen a lot of posts that use touchdesigner to create visuals for their music and it's quite fantastic in that regard. Touchdesigner is a python powered node based visual programming language that's seeing a lot of use by DJs and visual performers, however I found it too difficult to use for my purposes, as I wanted something quick and simple. I also experimented with OpenGL and GLSL, all the time while reminiscing about the computer graphics class that I've taken a few years ago. But shading languages are also way overkill for simple visuals. I also attempted to use OpenFramenworks, a creative coding library in c++ and built on top of OpenGL, but I found it equivalently too difficult. ## P5JS ### What's P5JS? However recently I discovered P5JS, another creative coding library built with Javascript. What I found most exciting about it was that it had online editor where you could code up sketches very quickly and run them directly in your browser. No hassle with any downloads or installation, no dealing with a compiler on system, and tons of tutorials and sketches from other people that you can simply view and get inspired by. ### How does P5JS work? Comprehensive and exhaustive tutorials on P5JS can be found on The Coding Train's Youtube channel, and the complete P5JS can be found on the official website. Quick sketches can be spun up in the web editor. An empty sketch starts with two functions. Setup and Draw. The setup functions contains the canvas() statement that creates the (surprise!) canvas and should usually contain everything that you want to do before drawing to the canvas. When you hit the run button in the top left corner of the web editor, the setup function is executed, and then immediately after, the draw function is called. The draw function will then continuously execute it's contents, and depending on what that is, will make something appear on screen. > [ View this post on Instagram](https://www.instagram.com/p/CKnnXsFAtNQ/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) [A post shared by Ahmad Moussa (@gorilla.sun)](https://www.instagram.com/p/CKnnXsFAtNQ/?utm%5Fsource=ig%5Fembed&utm%5Fcampaign=loading) In the embedded instagram post above you can see the final product. The warbly music that's playing alongside the animation will be the topic for another blog post. ## Creating the checkerboard ### The Colors The first thing we'll want to do is grab a bunch of harmonious colors from [Coolors](https://coolors.co/generate?ref=gorillasun.de), which conveniently lets us export the hex codes. We can later on randomly draw colors from this array to color the squares in our grid: ``` var listOfColors = ["#1c77c3", "#39a9db", "#40bcd8", "#f39237", "#d63230", "#540d6e", "#ee4266", "#ffd23f", "#f3fcf0", "#1f271b"]; ``` This array is in the global scope and therefore accesible everywhere throughout the rest of the code. ### The Square Next we create a template square class which we can reuse to create each individual square in our grid. For now the square will contain it's position, it's size and it's color: ``` class Square{ constructor(px,py,s){ this.positionX = px this.positionY = py this.size = s this.c = listOfColors[int(random(0, listOfColors.length))] } ``` The move function will be empty for now, as the individual squares do not have any moving behaviour. Experiment with it though, maybe you can come up with something interesting! ### The Grid Next we create an object that creates, arranges and shows the individual squares in our grid. The tricky part about it is calculating the space between all the squares as well as their respective widths, such that the grid is always centered: ``` class SquareGrid{ constructor(){ this.squares = [] this.gridSize = 8 this.squareSize = 13 this.spacing = 16 this.positionX = width/2 - ((this.gridSize-1) * (this.spacing))/2 console.log(this.positionX) this.positionY = height/2 - ((this.gridSize-1) * (this.spacing))/2 for(let i=0; i<this.gridSize; i++){ let row = [] for(let j=0; j<this.gridSize; j++){ row.push( new Square((this.positionX + this.spacing * i),(this.positionY + this.spacing * j ),this.squareSize) ) } this.squares.push(row) } } ``` The final statement at the bottom of the display function is there to make the grid appear animated. Simply after drawing the entire grid, one cell will be selected at random and it's color will be updated by a random color from the color array. ### Setup and Draw and Voila The last thing we still need to do is instantiate the grid and we'll obtain the grid that you've already seen above. ``` function setup() { createCanvas(256, 256); grid = new SquareGrid() } ``` The entire code can run in the web editor [here](https://editor.p5js.org/AhmadMoussa/sketches/j%5FCIeN6aU?ref=gorillasun.de). If there's something that's not very clear leave me a comment below. And if you enjoyed this post consider following me on Instagram or Twitter, or alternatively shoot me an email. Cheers and thanks for reading.