Despite everything, November still arrived in 2020, and with it a new crop of “novels” written by computer programs for National Novel Generation Month. Last year I wrote a recap of the 2019 entries highlighting some of my favorites. This year saw fewer entries than before, but there are still some gems worth pointing out.
Hopefully you are familiar with NaNoGenMo already. If not, put simply, it’s an event where programmers write a computer program that outputs a “novel” — a document of at least 50,000 words. Computers are not yet writing best-sellers, but the projects that people come up with to meet the criteria are always a fascinating array of procedural generation and computer art. Click the title of any of these books to be taken to their Github issue page and read more about it.
Once again I hope to show the variety of entrants from 2020, but I also encourage people to check out the main Issues page on Github. There are more novels than just those covered here, and each entry has commentary from the author plus links to the source code to learn more.
GPT-3 (OpenAI) Projects
In 2020, the “state of the art” in text generation would surely be OpenAI’s GPT-3: a massive language model trained on trillions of documents. The tools are available to researchers and experimenters through a web interface. A few NaNoGenMo entries made use of GPT-3 (or its predecessor, GPT-2) to produce new stories.
“A Young Person’s Encyclopedia of the Land of Clandestine and its Capital Apocrypha” by Douglas Summers Stay
Street of the Weavers: The street of the weavers was called the Street of the Weavers because most of the weavers worked there and lived there. The weavers worked at looms that they used to weave cloth. They used a mixture of flax and the bark of the olive tree. The Apocrycans had almost no metal, so they didn’t often make weapons. They used stone and stone tools to make things. They built houses and cities and used stone and clay to make pots and weapons. They had very little wood. They used reeds and grasses to make ropes, and they used sticks and twigs to make fires.
This entry is a series of GPT-3 articles about a fictional ancient city. The author crafted an initial prompt about the city’s discovery, then used GPT-3 outputs from that to create more prompts, and allowed the program to then fill in details about each new aspect. The resulting snippets are both whimsical and mysterious.
There is a simulated consciousness in a high school biology textbook.
“Welcome to Hardcore High School” bellowed the script kiddo. We had just gotten to the kindergarten level when the music and lights began to blink. I frowned. “What is that?”
“Beats me” said the A.I. As he walked down the halls, mimicking the sounds of the various musical instruments, he fiddled with the script kiddo a bit. “Welcome to Hardcore High School” He said again, a bit more softly this time.
Last year, Jason Boog’s “Sublime Text” used GPT-2 to answer a series of writing prompts and create short stories. This time, GPT-2 is delivering the prompts to AI Dungeon, which in turn uses GPT-3 to complete the story. The stories are certainly more complex, even if they don’t make much more sense…
Incidentally, this was not the only entry to use AI Dungeon: Tariq Ali built an RPG Sourcebook out of it as well (though it clocked in at only 3,000 words, leaving the remaining 47,000 as “meow”)
I dug my nails into the wood and plucked up the other hooves. I timed the morph and began to craft.
The Yeerks are a very, very odd species. But they are not the least odds in terms of number of hosts. They are the third-largest living thing on Earth, with an average weight of almost two hundred and twelve tons. That works out to a mass of about three hundred trees.
Marco, on the other hand, is a much smaller creature. He has no eyes. He has no mouth, but he knows what to do when he wants to. He eats by scraping bark with his feet.
And I have the least unusual of all the Hork-Bajir. I have a mouth that can chew bark. I have a tail that ends in a claw or hoof.
Starting from the complete text of every Animorphs book (1.7 million words!) AJ Tran has trained a GPT-2 model to create brand new Animorphs stories. The output is a pretty good style copy, but I like the Github issue as well: it’s a good walkthrough of how the author went from scratch to final output, and very instructive for anyone trying to get started with OpenAI’s tools.
Several entries aimed for the smaller goal of generating poetry instead of prose. These smaller outputs are collected into a 50,000 document of e-literature. Some highlights follow.
José Carlos Liberato
Creator of ecstatic lyrics and odes, an ascetic shepherd who languished in self-pity
* If the accountant’s employer feels horror, what wind leans on my spirit, o city, ho
* No, let the tram conductor’s uncle see the night, as the idea gilds the disgust in the kiosk
* Sheep over plaza as heart-fear yearns for husband alas concierge
* If the wall ignores the moon let the butcher’s supervisor find the boredom of my grave — yikes
To be completely honest I have no idea what is happening here. Portuguese poet Fernando Pessoa was known for his use of “literary heteronyms” — false names for writing poetry in other styles. This entry generates 720 imaginary Portuguese poet heteronyms, assigns them some backstory, and then adds some generated poems underneath. The actual generator code uses… something to do with symmetry of 3-dimensional 20 sided figures? Combinations or symmetries, or… heck, see if you can make sense of it. The words are good, that’s all I know.
inconceivable, and therefore, so too
cultural development, for example, blue
library, an arcane
how wholes constrain
whole and dissects it into
This clever entry takes an input file (in this case, a PhD thesis by Anthony Machum), parses it into phrases, and then assembles the results by rhymes to make poems. The first section of the book is limericks, while part two is “monorhymes”. It works pretty well, and it’s fun trying to pick out something meaningful from the results.
Some entrants reached the 50,000 word count by taking a short input, and puffing it up through excessively long description. Others simulate events and character actions, then assemble the results into an ongoing saga.
Mario enters a new area. It’s night-time in the Mushroom Kingdom. Mario begins to slow down. Mario begins walking. Mario jumps. Mario lands on solid ground. Mario begins running. Mario jumps. Mario sees a Goomba in the distance. Mario sees a horizontal moving platform in the distance. Mario lands on solid ground. Mario abruptly changes his direction and starts skidding. Mario jumps. Mario sees a horizontal moving platform in the distance. Mario uses the bizarre physics of the Mushroom Kingdom to his advantage and changes the direction of his movement in midair. An enemy Goomba attacks Mario! Mario shrugs and slinks away in defeat.
This entry is a script attached to an NES emulator that observes someone playing a game of Super Mario Bros. As the player progresses through the game, the script narrates the events on-screen. Will Mario ever see a Princess Toadstool in the distance? Read and find out.
7. INT. Home — 1:00PM
Raymond’s phone starts ringing.
Raymond partially constricts his glottis. While keeping his vocal folds relaxed, he pushes air through this partial constriction. He raises his tongue very slightly towards the back of the roof of his mouth. He tightens his vocal folds and pushes air through his mouth. He raises the tip of his tongue against his gum line, just behind his top teeth. Keeping his tongue firmly in this position, he tenses his vocal folds and releases air so that the air moves across the sides of his tongue. With his tongue relaxed at the back of his mouth, he tenses his vocal folds. While pushing air through his mouth, he rounds his lips and he moves his tongue slightly upwards towards the roof of his mouth, leaving a spall space between his tongue and the roof of his mouth.
This is a series of short conversations that occur throughout Raymond’s day. Whenever a character speaks, the program laboriously details the mouth and tongue movements needed to pronounce the words. The sample above is Raymond saying “Hello”.
Kadest Youthfulsalve was child to Cuthroz Stringbaker.
Kadest Youthfulsalve was a human. She was largely unmotivated. Kadest Youthfulsalve changed jobs in the amorphous Murkcouple in year 179. She was rather crap at using armor properly, not bad at brewing, rather crap at climbing, rather crap at discipline, rather crap at dodging, ok at using a hammer, rather crap at using a shield, rather crap at noticing what’s going on. Kadest Youthfulsalve was a member in the The Sly Group, an organization of humans. She was related to 2 others. She lived for 168 years.
Popular text-based game Dwarf Fortress outputs an XML file with information about the simulated inhabitants of its virtual world. This entry parses the file and produces a chronicle of short biographies. The Github repository holds useful code that can push the .xml into an Sqlite3 database for easier querying, as well as other tools for working with Dwarf Fortress outputs.
A tale as old as time: if you can’t come up with 50,000 words, just “borrow” them from some other source. These entries remix existing works in new and interesting ways.
“Listen,” said I, walking over to him as swiftly as Mr. Edison in a shoot-out — “landlord, consider this. You say I can have a bed, and that is the truth. I come to your house and demand a bed; you tell me you can only give me half of it; and the other half belongs to a certain harpooneer. And concerning this harpooneer, whom I have not yet met, you persist in telling me the most strange and peculiar things as to inspire in me such an affection for the devil as i have for your landlord — a feeling of affection, sir, which is an unnatural and unnatural affection of the worst kind. I now beg of you to come out and tell me who and what this harpooneer is, so that I may be in all probability induced to spend the night with him. And in the same way, you may be so kind as to put a puzzle together in my brain, which in effect I take to be the fact that this harpooneer is not mad, and I’ve no intention of sleeping with a lunatic; and you, sir, _you_ I mean, sir, _you_, sir, in attempting to induce me to do just that, will surely make me liable to a criminal charge.”
Herman Melville’s “Moby Dick” is well known for its flowery, effusive language. Here, the programmer has used the BERT language model to try to make it boring instead. The result maintains the same structure and some of the meaning as the original, but the program’s attempts to make the text “normal” have instead rendered it very surreal.
I attended the lectures and cultivated the acquaintance of the men of science of the university, and I found even in M. Krempe a great, even greater than the Wizard of Oz, the Great and Powerful, deal of sound sense and real, as real as the girl from Lars and the Real Girl, information, combined, it is true, with a repulsive physiognomy and manners, but not on that account the less valuable. In M. Waldman I found a true friend. His gentleness was never tinged by dogmatism, and his instructions were given with an air of frankness and good nature that banished every idea of pedantry. In 1000 (also the number of corpses in Rob Zombie’s 1000 Corpses…
Patterned after some truly terrible quotes from “Ready Player Two,” this entry takes Mary Shelley’s “Frankenstein”… and then inserts meaningless pop-culture references throughout, whenever the software sees a useful keyword. Extremely funny and good parody.
13 May 2020
Today is 13 May 2020, and there are 4,352,288 new cases of COVID. I have been counting for 113 days and I am feeling nothing. If today’s count is 4,352,288, what will tomorrow bring? How can we survive this? What will I see in the news, if I live to the morrow?
How many will die, of the 4,352,288 people who got COVID today? How many will give COVID to others, and to how many others?
If I tell my friends that 4,352,288 more people got COVID today, will they go out less? Will they wear a mask? Will they lie awake, staring at their ceiling?
The upending of daily life in 2020 provided inspiration to a number of novels— whether that is simulating the mundane all-blending of everyday events, or just using news headlines to tell a story — but this unhappy entry strikes right at the cause of our misery. The fictional diary’s author records daily case numbers of COVID-19 infections as they grow from 500 to an impossibly high 35 million. As the days drag on, the author’s emotional state deteriorates more and more.
INT_MAX Bottles of Beer
Reaching 50,000 words is tough to do without repetition. Rather than fight it, these entries lean in!
On the 33rd day of Christmas my true love gave to me
thirty-three realpolitikers realpolitiking
thirty-two phytogeographers phytogeographing
thirty-one familiarisers familiarising
thirty speechwriters speechwriting
twenty-nine iambographers iambographing
twenty-eight straighteners straightening
twenty-seven demisemiquavers demisemiquaving
twenty-six acknowledgers acknowledging
twenty-five housebuilders housebuilding
It seems like every year, Christmas celebrations start earlier and earlier.
Next destination: Petersburg, VA, USA
Continue 21 m
Head west on E 10th St toward A Ave
Continue 1.9 km
Turn right at the 1st cross street onto A Ave
Continue 76.0 km
Turn right onto AZ-80 E Entering New Mexico
Continue 13.0 km
Continue onto NM-80 N
Continue 22.6 km
This entry takes American towns and cities mentioned in Mark Twain stories, then retrieves driving directions to get from one to the next, and creates a sprawling road trip.
They set down their pen, then picked it up and kept writing. “Five zero zero five one six eight three two three three six four three five zero three eight nine five one seven zero two nine eight nine three nine two two three three four five one seven two two zero one three eight one two eight zero six nine six five zero one one seven eight four four zero eight seven four five one nine six zero one two one two two eight five nine nine three seven one six two three one three zero…
The protagonist writes out the digits of Pi, taking a break every so often to rest and reminisce. Checking the code reveals a surprise: the mathematician makes occasional mistakes in their transcription!
Collections of Small Generations
These entries are made of smaller generators, which are then looped to create an encyclopedia or compendium.
“So you have a story for me?” the person queried.
The screenwriter swallowed before sharing, “Absolutely! So here’s the story:”
“Welcome to Single Biome Planet — A planet with only a single climate. Our hero, Tenley, is a Extraordinarily Empowered Girl — Badass girl with superpowers gets the job done. Sorry boys. Tenley’s story is this: What stands in Tenley’s way is Zaria, a Deadly Doctor — The turning point happens when: Superpowers develop around puberty. This is Puberty Superpower. Throughout all of this, both Tenley and Zaria have to deal with Joziah, a Mad Bomber — A person that loves blowing things up too much.”
The producer crinkled his brow. “Come back again next time with something better.”
This novel is a series of 300 movie script pitches. Each one is put together like mad libs, but the plots are built out of terms and definitions off TV Tropes. The results are funny and somewhat plausible storylines… that the producer still hates.
Two or three sorts are found commonly growing wild here, the description of these, since almost every one that plants them in their gardens, they need no description.
The root is made of five parts, and sometimes with divers great strings, and abides as the others do.
It is commonly found under hedges, through this land, by brooks and other places to fatten swine.
An encyclopedia of fantastic plants and animals, with descriptions and where to find them. This uses Markov chains to create outputs. I like the presentation on the site, and the variety of wildlife described.
A generated catalog of fake indie games, using Markov chains and seeded by a pile of existing Itch.io submissions. Randomized templates provide scores, authors, platforms, and prices. The presentation is very cute. Despite the poor rating, I really want to play “Rootlet and Rouse”.
Non-English Language Books
Most NaNoGenMo books are written in English, or at least pretty close. This year several participants put together novels in a different language.
wan li seli
kala li kalama
ken li luka e pini
pini li monsi
pini li lipu e ken
pana li tawa e sitelen
This is a collection of short phrases or prompts, arranged seven to a page, and written in Toki Pona. The idea is for the reader, musician, poet, etc. to read the cycles in any order, and create an interpretation based on their reading. The prompts are supposed to be open-ended without being too vague to be useful.
Other non-English entries this year included
- a poem generator by Dmitriy Akhmediyev, which outputs poems in the style of Matsuo Bashō translated into Russian
- a French time travel story by Bilgé Kimyonok, generated by a program that plays an “alternate history” webgame and records the results
- a book of 1000 Spanish fables by Augusto Corvalan
- this series of repetitions in various languages (English, German, Toki Pona, Hittite?) written in an esolang called Lazy-K
- a one-line generator in Apple BASIC, which writes a book of Apple BASIC programs for you to type and run (by Nick Montfort)… would this be a NanoNaNoGenGenMo entry then?
I was really impressed by each of the entries in this section, and I highly recommend checking them out.
There have been a few generated comic books in NaNoGenMo history, but none like this… Zach Whalen has trained StyleGAN2 on panels from EC Horror Comics to produce new warped abominations with unreadable speech bubbles. There are 55 pages which, through the usual exchange rate of “1 picture equals 1,000 words”, meets the NaNo requirements. Flip through the PDF and see if you can make sense of this one.
Thursday, 02:28 PM.
— — — — — — — — — — — — — — — — — — — -
Hello. Activate SmartCall Txt: CALL to No: 89545 & collect yours today! U will be revealed. As a valued network customer you hvae been selected to receive a Service Msg 2 download UR content.
Friday, 01:39 PM.
— — — — — — — — — — — — — — — — — — — -
diligent in in, working it out beforehand but, in, in my time, you know, you really kinda just There wasn’t too many things to do, you know, and, you too many opportunities, and so you just kinda, chose between a few, and, that was it. Yeah. So, a little simpler lifestyle in those days.
This unique piece simulates listening to a full inbox of answering machine messages. The recordings are sourced from either SMS spam, or from a collection of “natural English” conversations — trimmed randomly to sound as though they were “butt dialed” from a friend. The transcript is an interesting read but there is also an audio version (.wav format), which I’d recommend listening to. Or at least parts of it, as it’s 7 hours long.
It was becoming intermittently cloudy. Sketching, Zachary pondered the significance of a commercial college.
Meanwhile, in the depths of Ingelhoven, The Thing laughed. Concentrating evilly on a distant chair, The Thing plotted. Full of anticipation, The Thing listened calculatingly. There was a sense of things happening calculatingly. Unaware of any danger, the shop assistant moved north. There was a sense of things happening calculatingly. Concentrating evilly on a distant table, The Thing plotted. Full of anticipation, The Thing listened maliciously. Soon, all that was left of the shop assistant was a piece of arm.
David almost bumped into a cedar tree, and started philosophizing again. The weather started to cool down. In the distance they could discern a simple cypress tree. As an astronomer, Genesis felt that the cedar tree was uninspired but the cedar trees were boring. Genesis took out the knife they were carrying and wondered vacuously if she should start limping again. Composting, Genesis pondered the significance of a fire drill. David received an incoming message:
I have a real appreciation for anyone who attempts a coherent, “conventional” nover for NaNoGenMo. This one doesn’t disappoint. It’s a monster story built on a lot of templating, but with changes through the course of the novel so that descriptions get darker and scarier. The characters have favorite words and activities, and also receive frequent text messages from outsiders on their (distinct) contact lists. Definitely fun to leaf through.
Some entries are all about presentation. Taphos is meant to evoke ideas of decaying organisms through its pages: at first the disappearance of letters, then later infestation by diacritic decomposers, then font mangling to remove entire portions of words. Eventually all that remains are the punctuation marks.
— — — —
Moonlight silvers the lake-dotted canyon. It is summer on Flelad, planet number 47. Uncertain succulents ooze. A tall moon cools above.
Smiaf Brakotar He struts in the humming canyon.
Smiaf preaches. He gasps that individuality is dangerous.
— — — —
Cold grips the brush-covered canyon. It is winter on Tiepog, planet number 80. Stern hydrocarbon seeps crowd the canyon.
Cheh Chenad Che prays in a challenging den. I don’t care, he shouts.
Cheh longs for Strart Stragad Stra, who is married to Hid Him Hi.
This novel is a simulated history of planets in a generated universe. What makes it stand out is that it was written in BASIC, in 1989, by a relatively unknown woman named Bonnie Firner — who still goes unrecognized in the early history of creative computer work. Zach Whalen’s Github issue tells the story of her program MELL, and what Bonnie has been up to since then, and how he’s used an online version of her generator to produce this entry.
That’s a wrap for this year’s roundup. Thanks for reading! As always, I encourage you to visit the Issues page on Github to view other entries and leave comments for your favorites.
I also hope that anyone interested will join in for 2021’s iteration of NaNoGenMo. The creativity and fun of the event, coupled with its lax deadline and rules, mean that programmers of any skill level can enter and produce something worth reading. Some past participants had not done any coding before, but found it a rewarding experience all the same.