Okay, so first and foremost: What you are probably here for. Let’s see some generative dArt. Here are three editions for three muses.
There is one more edition, but people just going to have to discover those 30 rox when they mint.
Data-driven generative art, explained
Rox is a generative, data-driven art project minted as NFT tokens on the Solana blockchain. The rox formation machine takes in the 2021 statistics of 300 of the world’s best basketball players. For each player, it outputs a unique looping abstract painting of a basketball. The players serve as the muses for the rox, and the rox aim to become lasting digital artifacts to celebrate the muses. Rox seeks to find something beautiful in the numbers and reveal some soulfulness that transcends the quantification of value that data is almost exclusively used for.
Time for a couple of ranty, idealist thoughts. Feel free to scroll past this section if idealism isn’t your bag right now.
First, I am specifically referring to this project as rox.season.one. Yes, that does imply there will be more. I hope for more seasons, but I promise nothing. I do have a long-term goal of building a community that can come together, celebrate generative art and push it in new directions. Time will reveal all.
Second, rox.season.one will be affordable. Any future seasons will be affordable, too. All art work I ever make will be affordable. I strongly believe in making high-quality art that’s attainable for anyone — no matter what the token prices are. In the future, rox (and any of my other projects, for that matter) will never be priced at more than the cost of a date night out. I understand that affordability is relative and even this measure may be expensive for some contextually.
And third, below I will use tons of flowery language. I’m an artist and this is the work I am most proud of. I have thought long and hard about it all. I have come to see the players and their accomplishments as muses.
Art for everyone!
Okay, rox 101
- Rox are not data vis. Data vis is trying to prove or demonstrate something. Rox are dArt. They aim to find aesthetics that can be subjectively appreciated. The worst hoopers may inspire the best rox. An excellent player may not inspire the greatest piece of art.
- They are generative — but they are not random. All the random seeds used by the rox machine are derived from equations on the statistics of the 300 muses.
- The rox formation machine itself is built in Cinema 4D. It takes in a compiled CSV and uses a combination of Xpresso and Python for the logic to conjure the rox. They are rendered out with Redshift 3D Renderer and compiled down as GIFs in good old Adobe Photoshop.
- I built the basic laces structure the way I wanted it to look. I tested and tuned around dummy stats as I built. Once I was happy with my range of results, I input the data and made no further adjustments.*
- The rox exist as they are, a structure built to collaborate with the numbers and celebrate the muses. Once it was done, there was no going back. Any changes I wish I could make are irrelevant now, though they will provide guidance for future projects.
Inspiration and influences
What Art Blocks is doing is a huge inspiration for the rox. I hope so very much they see this and are proud. What Punks did informed a lot of my choices — not aesthetically but in the thinking and structure of the work.
A simple artifact can have the ability to carry with it such a strong connection to something we love. I grew up collecting basketball cards and as a teen played Pokémon cards competitively, later graduating to Magic the Gathering. I still keep my “Your name” Chansey on my fridge. Maybe one day I’ll have the balls to write fubby14 on the line.
Artifacts carry those strong connections with their owners. They are scarce not only because of some rarity charts, but also because they have been infused with meaning by the collector and the creator.
I know the power of a visual artifact and with NFTs, the door is open to explore those and build those connections. The possibilities are limitless.
Ultimately, my influences were innumerable: Hideki Tsukamoto, Kandinsky, the beauty of the Euro step, Wizards of the Coast, and Valve are just a small slice I will leave here to try to demonstrate the range.
I think the simple answer is that my favorite team made it all the way to the Finals. Great effort, Valley boys!
The depth of statistics compiled for basketball is also vast, so it gave me a lot of angles to pursue for structure.
It was probably just my subconscious, though. Realistically, I could not get the laces-as-a-cage structure for swirling strokes out of my head. I was hunting around my house muttering “Gimme the rock” at all hours of the day.
Some technical mumbo jumbo
So, what’s actually going on to make these rox? Personally, I think this is less interesting than the result, so if you’re a collector and not an artist, maybe skip this bit.
Rox are composed of 36 frames at 10 FPS, making them all 3.6-second loops. In that 36 frames, the laces structure does a full rotation. Within that structure, there are up to eight strokes that all do full rotations as well. The strokes are rotating relative to the laces, so some strokes circle twice, while some stand still. I have all kinds of fun names in my head for the different stroke types. Swimmers and floaters and speeders …
Each stroke corresponds to a stat. They are 2-pointers, 3-pointers, free throws, assists, steals, blocks, offensive rebounds and defensive rebounds. Each player has a maximum of 8 strokes and a minimum of six.
The stroke forms are built based on how close to the numerical top that muse was in any stat, with № 1 in any stat resulting in a golden stroke. So, eight golden strokes total for the 300 rox.
Further, the stroke’s weight is set based on each player’s play style and physical size. I built some very subjective algorithms to define how nimble a player was or how much of a bruiser they are. The laces are built in a similar way, but with extra weight on physical size and personal fouls.
There are some other variables. Some rox have a core, some will have gold chips floating inside, and there is another special accoutrement on only one. These extras all correspond to achievements and awards.
The camera angle is set by the muse’s random seed. The frame information is all passed through dynamic spline objects to draw the type and borders.
The rox results
I am beyond thrilled with the results. As an artist, the work emerged almost exactly as I had imagined it. To me, it feels fresh — a step in an interesting direction that’s worth exploration.
I’m not too into blowing my own horn so I will leave this section sparse. But I am quite happy.
I certainly had some issues with the data collection and compiling aspect of the work. I am 100% sure there exist some fat finger errors in my data.
Compiling the data after I had built the rox machine was probably a mistake. Doing and initial gathering and sorting of test set of data would have better set my expectations as to how best build the logic for the rox machine.
In a similar vein, I very much ended up over-building some of my logic to try to accommodate more data. Each muse has 35 unique data points. I could have still gotten a very rich result with a smaller, more precise dataset.
In addition, a smaller dataset could help obscuring the data more in the final work.
Shilling rox, I guess.
The project is done. I will see how the world receives it. Hopefully, other artists can find seeds of inspiration and collectors can find beauty and joy.
As far as the next project, I know it will be something generative with a data set. Probably not as large as this, but maybe.
I hope you like the rox and I hope this was somewhat interesting to read.
If you made it all the way to the bottom, thanks. I hope you liked it.
link to our twitter thread: https://twitter.com/sol__rox/status/1427054194666754050
– fubby14 & the entire rox team
*Full disclosure: Players who wore № 00 for the 2021 season broke the frame aspects of the rox machine on the first compile. I did have to change jersey numbers to being passed along as strings rather than integers to fix that.