Neural narratives in Python #23

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

In the previous part, our team of heroes found themselves trapped in a pocket dimension created by the malicious alien Zha’thik, a dimension made from the memories of Elizabeth Harrow so she would stay inside in a sort of dream state. The team will attempt to collapse the pocket dimension to return to the containing dimension, the so-called Mirage Wastes.

They finally prepare themselves to do something as troublesome as collapsing a pocket dimension with themselves inside.

Intense episode.

Neural narratives in Python #22

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

At the end of the previous part, we left our jaded protagonist boxing an eldritch horror while his long-dead teenage lover ran for her life.

I had no clue where Cassidy’s portal would lead, or even if it would work. I organized a session with my Writers’ Room to put together the following scene, that involved generating a couple of new characters.

Those noises are artifacts that rarely happen when generating voices. It’s odd that it happened three times in this segment, but they seemed to fit the eeriness, so I left them in. I apologize for minor errors such as using “his” when referring to Elizabeth. My brain is mostly mush at this point.

When this scene started, I had only included the main team in the dialogue, but I wanted Gideon’s deceased wife and the young version of their daughter to show up in the middle of the conversation. I had no such system implemented, so I wrote it in: a new collapsible section in the chat page that if there are characters present in the same place who aren’t involved in the dialogue, you can simply add them, and they’ll be included in the prompts to the large language model from then onwards. It was surprisingly easy to do, which I suppose is a testament to how mature the app is at this point.

Neural narratives in Python #21

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

Here’s the next episode of the eldritch show. Last time, the sadistic alien Zha’thik prepared an unfathomable feast in a non-euclidean hall. Our jaded detective decided to take the first bite, only to realize that the morphing mass had turned into the corpse of Emilia, his long-lost teenage love. Now he’s bound to face his personal horror.

Well, that was poignant. I shed tears while “playing” through it, I shed tears while editing it. That’s good.

At the final part of that scene, I needed a fight “beat,” but I didn’t have anything programmed that would provide such a thing specifically. In addition, this fight would take part in the middle of a conversation. What to do, then? Create a new Confrontation action like the Investigate, Research, and Gather Supplies ones, which are meant to be isolated, and then stitch together two dialogues? It didn’t feel right. Besides, in that case, I would need to write the summary of the full conversation to include the physical confrontation with the eldritch horror. So instead, I came up with the notion of a Confrontation Round: the account, taking about ten seconds, of a confrontation of whatever kind, given the provided context. The prompt is focused on that very subject with no distractions, as seen below:


You are to generate a detailed narrative describing a brief segment (approximately ten seconds) of a confrontation within a rich, immersive world.
Use the provided information about the player, the other characters, and the place involved.
Your narrative should be engaging, realistic, and reflect the abilities and circumstances of the participants suggested by the user-provided context.

Instructions:
1. Viability and Realism Assessment:
Carefully consider the feasibility and dynamics of the confrontation based on:
- The information about the characters, including their skills, abilities, health, equipment, and emotional state.
- The characteristics of the opponents, including their skills, abilities, equipment, motivations, and weaknesses.
- The characteristics of the location, including terrain, obstacles, and any environmental factors.
- The time of day and how it might affect the confrontation (e.g., visibility, shadows, crowd presence).
- The context for the confrontation provided by the user, including any prior events leading up to this moment.
- Potential advantages or disadvantages, such as surprise, preparation, or environmental hazards.

2. Narrative of the Confrontation:
- Write a vivid, dynamic narrative that depicts approximately ten seconds of the confrontation, focusing on the immediate actions and reactions of the characters involved.
- Include specific actions taken by the characters on either side of the confrontation.
- Describe the use of skills, abilities, equipment, tactics, and any maneuvers.
- Illustrate the interactions between the characters, including attacks, defenses, dodges, or spells.
- Convey the emotions, thoughts, and physical sensations experienced by the characters.
- Ensure the depiction is consistent with the world's lore, the characters' personal histories, and their abilities.
- Determine the immediate results of this segment of the confrontation based on your assessment.
- Be specific about any successes or failures of actions taken, including hits landed, misses, blocks, or counterattacks.
- Describe any injuries sustained, advantages gained, positions changed, or other consequences.
- Reflect any costs incurred, such as stamina lost, equipment damage, or exposure to danger.
- The confrontation doesn't need to end in this segment, unless you can clearly determine that the confrontation should conclude now.

3. Tone and Style:
- Write in the third person, present tense, maintaining an engaging and immersive narrative style.
- Use rich, descriptive language to bring the scene to life, focusing on action and immediacy.
- Ensure consistency with the established world setting and the characters' personalities.

Provided Information:
Current Time: {hour} {time_of_day}
{local_information}
Facts Known:
{facts_known}
{relevant_characters_information}
----
Ongoing Dialogue:
{transcription}

Example Format:
"With a fierce battle cry, [Player Name] charges forward, swinging their sword toward [Opponent Name]..."

Your Task:
Using the above instructions and information, craft a compelling narrative that captures this intense moment of confrontation, reflecting both the actions and immediate consequences, while advancing the story in a meaningful way.
Important: do not repeat verbatim previous confrontation rounds: there should always be a progress in the confrontation.

If the segment at the end of the previous audio was anything to go by, it worked perfectly. To be honest, I was dreading creating a Confrontation action, because I thought it would be the Next Big Part of the app, but turns out that at this point of the AI revolution, LLMs are intelligent enough to “get it.”

I need a breather after this goddamn episode.

Neural narratives in Python #20

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

The last part ended with our team of heroes begrudgingly agreeing to partake in the trials of a shadowy, shady alien from the dimension they had ventured into.

For this part, I decided to implement a Grow Event button in the chat interface. Basically, the user writes the guideline for what they would like to happen at that point of the dialogue. Then, a dedicated prompt sent to a large language model will cause the AI to expand the suggested event into a literary form. There are two or three examples of that in the audio you may have listened to. Great for when you don’t want to bother behaving as both the narrator and the player character.

I’ve already played through most of the scene that will be featured in the next part. Man, it was emotionally taxing.

Neural narratives in Python #19

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

In the previous episode of this thing, our team of Earthlings, having ventured through a rift into another dimension, encountered a half-buried building in an obsidian desert. Now, they enter it. The following audio is an episode-long account of what happened.

That’s it for today narrative-wise. By the way, this is the portrait that the app generated for Zha’thik.

As I was thinking what else I could do with character memories, which are used by the large language models to roleplay the characters better, I ended up implementing a system to generate any character’s worldview, his or her personal philosophies, influenced by their bio and their experiences. That means that when the user wants to deepen the roleplaying of any of the characters at an arbitrary point of the journey, their worldview can be generated, and it will reflect the journey up to that point. Some characters could start naive, only for their worldview to change after nasty experiences. And of course, the generation of self-reflections receives all the memories as input, including any possible worldview texts.

This is the worldview generated for the brilliant scholar Elara Thorn, based on her bio and experiences up to this point:

Elara Thorn views the world as a place full of untapped knowledge waiting to be discovered, even if it means venturing into dangerous and morally ambiguous territory. Her philosophical beliefs are rooted in the idea that the pursuit of truth and understanding justifies the risks and sacrifices made along the way. She believes that knowledge is power and that those who possess it have an obligation to use it for the greater good, even if it means pushing the boundaries of conventional morality. However, her worldview is not without its challenges and doubts. As she delves deeper into the mysteries of the multiverse, Elara is faced with the harsh realities of the consequences of her actions. She begins to question whether her obsession with knowledge has blind her to the cost of her pursuit, and whether the sacrifices she’s made have been worth it. Elara’s moral standing is complex and evolving. While she believes in the importance of doing what is right and protecting those who cannot protect themselves, she also recognizes the necessity of making difficult choices in the face of unimaginable danger. She struggles with the weight of her own humanity, constantly grappling with the question of whether her actions are truly justified or if she has become a monster in pursuit of her own desires. Despite the doubts and challenges that confront her, Elara remains steadfast in her belief that the pursuit of knowledge is worth the risks and sacrifices, and that she has a duty to use her brilliance to make a difference in the world, even if it means navigating the treacherous waters of the unknown.

My Writers’ Room has come up with an intriguing concept for the next episode. I can’t wait to play it out.

Neural narratives in Python #18

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

We abandoned our heroes as they were about to approach an interdimensional rift, hoping to rescue a certain missing teenager.

Her comes a problem: although I had reworked the entire app to include an overarching Story Universe concept so that other worlds could be added, that doesn’t change the fact that the world on the other side of the rift isn’t connected to Earth, but to the Story Universe. I’m not sure how often this is going to happen in a story, so instead of programming the action of adding a new world, with its regions and areas, into the story universe, I just added that hierarchy manually in the JSON file that houses the map. As I use the app more, I’ll see if adding new worlds happens so often that it warrants programming it into the interface. What I did program was the simple notion of teleporting to another area from any area or location, as that could be useful from a storytelling perspective. A simple select to choose the area, then a button to teleport the player and his or her followers there.

The team dares to venture through an interdimensional rift, into somewhere else.

That’s all narrative-wise for today. Still twenty minutes of audio.

Being honest here, I wasn’t sure what the team might find inside the ruins. I wished I had implemented that Writers’ Room idea of mine, to rely on a little swarm of AI agents focused on aspects of storytelling so I could ask them questions about the story, and for them to elaborate on it. So I did, I programmed the Writers’ Room.

I have created a small team of AI agents. The user’s request first lands on the showrunner agent, that considers if he/she/it can handle it. If not, the showrunner delegates the task to more specialized agents, namely the story editor, the character development agent, the world-building agent, the continuity manager, the researcher, the theme agent, the plot development agent, and the pacing agent. The code provides each agent with data from other corners of the app; for example, the continuity agent receives the list of facts that one can introduce into the Story Hub to keep track of what’s going on, while the plot development agent receives all the goals, plot twists, and scenarios that have been generated in the Story Hub. It all works surprisingly well. Fun times!

Neural narratives in Python #17

I recommend you to check out the previous parts if you don’t know what this “neural narratives” thing is about. In short, I wrote in Python a system to have multi-character conversations with large language models (like Llama 3.1), in which the characters are isolated in terms of memories and bios, so no leakage to other participants. Here’s the GitHub repo, that now even features a proper readme.

Three or four days ago, the RunPod templates that render voices stopped working. At least one of them is operative again, so that’s great. In the meantime, it was off-putting enough for me to use the system with silent characters that I took advantage of the break to improve fundamental parts of the app. I’ve forgotten most of what I’ve worked on, but the point is that I’m back, so here’s more voiced narrative.

I implemented a Travel action that is only accessible when one moves from an area (such as a city) to another. The ongoing adventure in this eldritch setting had led us away from Providence toward some interdimensional rifts in the wilderness, to where a missing girl could have traveled or have been brought.

After rendering those voice lines, I realized that the travel audio should be produced in the player’s voice, not the narrator’s. Oops. Anyway, fixed for the next time.

Such long voice lines require about forty seconds in total to render. I thought that they were perfect candidates for parallelism, which Python isn’t particularly fond of, but after implementing it, turns out that the RunPod server that handles voice generation isn’t fond of multiprocessing either, so I had to revert all that programming.

My player character had some observations to make about his new surroundings.

The team gathers in the wilderness, an unusual setting for scholars and police detectives.

I usually discover new features to implement as I’m playing, whenever I realize I’d love for some functionality to be present. At times, as I was chatting, I wanted for the AI to give me a “push,” to move the narrative just a few sentences forward based on the ongoing dialogue and what it knows about the characters. So I implemented a button that injects a narrative beat. That part at 2:55 in the previous audio is an example of it.

I also had to redesign the interface of the chat page. Those buttons are showing spinners because the server is processing a speech part for that form. The first button sends the speech written above. The second button produces ambient narration, and the third a narrative beat. The part below allows the user to introduce an event; sometimes I just want to state that the characters are doing something without having to trigger a dialogue response from other characters. The event gets voiced, and injected into the transcription so the rest of the characters can react to it.

Before we continue with the narrative, which will involve the results of an Investigate action, I wanted to showcase some character portraits that the app has generated these past few days for other test stories.

It’s so strange to have gotten used to this level of quality coming from artificial intelligence. My reaction to seeing those pictures generated for a newly created character was, “Oh, that looks good. Moving on.”

Anyway, here’s the result of the Investigate action:

I considered for a while if I should create a Track action, but that isn’t different enough from an investigation, as far as I’m concerned. One of the great things of this LLM-led system is that I had no idea what was going to happen, and now it’s “canon” that Elara Thorn has found a rift, and also discovered an artifact that could guide them to rifts on either side of them.

Forgive my player character for his inability to say “vicinity” correctly. He’s way over his head.

New songs by Colours Run

If you want to know about my story with Tim Cameron and his band Colours Run, check out my previous post about it. In summary: back when I was a teen, until I was eighteen or so, I used to frequent some comedy forums named PWOT, where an English fellow by the name of Tim Cameron, and nickname of Camerhil, posted his songs. I found him brilliant. You had the sense that this guy opened his heart up to you. It’s like he felt he had little time to do that in this world, so he was in a hurry to make it somewhere with his music. In 2007 or so, along with his bandmates, he published an album, and then he disappeared to the US and was never heard from again. I never heard from him again, at least. As far as I can tell, you can’t even buy his works these days.

I used to treasure his songs, but I had lost most of them along the way. It was almost a miracle that I came across a twenty-year-old CD with about eleven songs of his, and that was all I had left. Last night, though, a kind soul gave me an early Christmas present; turns out that there are other former PWOT members out there who loved Tim’s music.

Without further ado, here are the missing Colours Run songs (apart from a few ones that are, let’s say, only for former PWOT members).

From the album Cynical Wonderful:

“On My Side”

“Pilot Light 30-04-07”

“Beautiful Waste of Time”

“Scars”

“The Traveller”

“Perpetual Motion”

“Apathy Ever After”

“Pilot Light”

“Marketplace Crisis”

“Good Night”

“Tethers”

“Song for the Doctor”

From the E.P. The Sticks:

“Old”

“The Sticks”

“Curiosity”

Doghouse Demo:

“Before the War (demo)”

“Chaos Song (demo)”

“Tethers (demo)”

Unknown:

“Pilot Light 1st Master”

“On My Side”

“Fireflies”

“The Snowline”

“Beautiful Waste of Time (demo)”

“Beautiful Waste of Time radio”

“Before the War radio”

2007 demos:

“Birnam”

“Gossamer acoustic”

“Gossamer with vocals”

“Gossamer”

“Methods of Escape (no drums)”

“Methods of Escape”

“Pilot Light 07-02-12”

“Pilot Light 30-04-07”

“Prelude in C”

“The Snowline 16-03-07”

“The Snowline”

“Wichita Lineman”

Now I have more songs by Colours Run and Tim Cameron than I ever did.

Song “Schizosaurus Rex” (Paisley Underground version) from Odes to My Triceratops, Vol. 4

In case you don’t know, this year I’ve been exploiting the amazing AI service Udio to produce songs. I’ve already made and released two full albums based on a strange story I wrote back in 2021, named Odes to My Triceratops. It follows the adventures and misadventures of a trio of friends who live in a town lost in the map. The main dude is a songwriter named William Griffin, who’s passionate and sensitive, if a bit unhinged. Another character is William’s next-door neighbor Claire Javernick, a blind redhead. Then we have Lorenzo, who’s a sentient triceratops for no justifiable reason. You can download the first two albums of this story through this link.

So yeah, a fresh new song directly to your ears, this one in the style of the relatively obscure Paisley Underground movement, which is a sort of garage psychedelic rock with a Californian vibe. I’m very fond of how this tune turned out.

Lyrics below:

A beast from the deep,
The monster under your bed.
Eyes red like the setting sun,
Claws the size and weight
Of a heavy human soul.
It can’t die; it only transforms.
It can’t be stopped,
Unless it decides to stop.

I have a portal to hell inside my throat.
It hurts, but I’m getting used to the pain.
Still, I don’t know whom I hate more:
The world, or myself.

This isn’t the story of how I died.
This is the story of how I met a girl,
We fell in love, and she betrayed me.
She didn’t do it on purpose;
She was just a dumb kid.
Besides, the darkness drove her crazy,
Almost as crazy as me.

I ain’t a poet, couldn’t hope to be,
But I’m the only person left:
A castaway in a plastic kayak,
Drifting down the River Styx
Past skeletons clinging to rocks,
Reaching out for a bite to eat.

You and I, love, we shared our lives,
We did the best we could,
But the best we could
Was a steaming pile of dogshit.

Someday I’ll make it to that faraway shore
Where eagles soar on golden wings.
There, I’ll sit and rest in my blue suit.
I’ll watch as time goes by,
Not aging a day, not losing a thing.
The memories will blur and fade
Until all I have left is me.

EDIT: I fed this post to the Google AI thing that generates podcasts out of your material. Yes, I’m writing the lyrics, you guys (who are by the way unaware of the fact that they’re AIs themselves). Check it out.

We’re Fucked, Pt. 127 (Fiction)

After an hiatus of nine months, mostly so I could tell the story of a motocross legend, my ongoing story, as long as a trilogy of novels, has returned. I wouldn’t blame if you if you’ve forgotten all about it. You can read any of its chapters on here, or listen to the existing audiochapters on here. I won’t continue producing audiochapters, though, because I have my fingers in too many pies. Anyway, let’s get rolling.


In the tomblike blackness, as if I were descending into the bowels of the earth, I keep inhaling oxygen to sustain the biological machinery of my aging body, even though every breath fills my throat and lungs with the stench of ammonia and rotten meat, a stink so overwhelming that it could knock out a woolly mammoth.

A click of a switch, followed by a whirring and the faint whooshing of air. With a buzz, fluorescent bulbs flare to life, bathing the subterranean lair in a bright glow.

“Here’s why I’m constantly up to my neck in bills,” my boss says.

At the center of the square-shaped room sits a hulking mass of metal: a shiny aluminum cylinder. No, not a cylinder, because a person-wide opening curves into the device, a path blocked now by an orange gate barrier that may have been pilfered from the streets. From the top of the machine grows a cluster of industrial piping, electrical wiring, and conduits resembling the ruptured guts of a mechanical beast.

A vibration disturbs the air like a low-frequency hum. From the opening of the spiral, through the gate barrier, danger leaks as a tangible yet invisible force; I sense the glare of a cosmic intelligence beyond my understanding.

The sight of Ramsés’ face, this swine in the guise of a man, with his middle-aged features, unkempt mustache, receding hairline, and lack of resemblance to Jacqueline or anyone I’d like to stare at, would have made me want to push him down a flight of stairs. Now, though, I’m glad he was born: he has led me to the one thing I couldn’t be arsed to search for properly.

“Hell yeah,” I say, and rub my palms. “I hate to admit it, boss, but you’ve done a great service for the universe.”

I grasp at the slippery reins of my sanity like a drowning woman clawing at pieces of driftwood. Alright, how can I destroy this reality-shattering device? The engraving of a skull and crossbones flashes in my mind: my trusty revolver, now stored in my work desk. I feel a pang of longing for its wood and steel to remind me of the glory days when I was still the main character and not the slave of others’ whims. Hey, Spike, my deformed, castrated pal, apart from wanting your own head blown into inhuman sludge, is this why you brought your revolver along? But I lack enough bullets to blast this spirally cylinder into nothing. Besides, I can’t forget the feeling of my hand being torn off that one time I relied on gunfire to defeat my foes, back when Alberto oozed from the wall in all his blobby, seething depravity to ruin my evening with apocalyptic tidings.

The stench is burning holes into my sinuses, and the hostility emanating from the machine thrums through my bones, but I approach the silvery-white shell, which reflects my blurry likeness like a liquid mirror. After rubbing my chin, I kick the device to gauge its solidity. Clang.

I was thinking of asking my boss if he had a chainsaw at the ready, when his hand, thick and beefy, wraps around my biceps, gripping tightly. He pulls me backward. Once I wriggle free, I’m tempted to punch Ramsés’ jaw with the force of my pent-up frustration and despair, which would atomize his teeth and ignite the meat of his face and pop his eyes. However, the fiend’s scraggly face, a map of the terrain of the damned, has contorted into a scowl, like a gorilla’s after I punted one of his relatives.

“Leire, what the hell are you doing?! You see an object you don’t understand, and the first thought you have is to break it?! Are you a chimpanzee?!”

My hand clenches around the ballpoint pen as if it were a dagger. The notion of impaling one of Ramsés’ eyeballs seems like a beautiful dream.

“Nah, I wasn’t planning on wrecking your stupid pipe thing, I just wanted to, you know, tap on it? Maybe I detected a kink that would be fixed by a whack on the side. Now seriously: I’ve finally found the cause of my misfortunes, the culprit to this whole ‘shredding reality’ business, and it’s been in the basement of my workplace all along! I should have known, given how this place has sucked up my soul ever since I foolishly allowed myself to be employed here. Anyway, once I find a way to obliterate this heinous contraption, this spiraling gate into insanity, the universe will be safe. Well, relatively safe, until the next asshole erects their own death machine. So let’s figure out how to acquire nitroglycerine.”

“Fuck’s sake, Leire, what are you blathering about?”

I sigh.

“Listen, boss, I can tell you haven’t grown so weary of life that you’ve been fiddling with, perhaps even fondling, an interdimensional end-of-the-world machine fully aware of the lethal stakes. You simply haven’t been notified by otherworldly monstrosities that tolerating this thing’s existence would lead to the irreversible and terminal cancerization of our fucking shithole of a world. Still, I must lay some blame on you, sir, as an accessory to this shitfest, whether through incompetence, naivete, or willful ignorance, if not sheer fucking stupidity, as long as you feel the machine’s malevolent aura attempting to smother our minds with its diabolical power. I shan’t have my newfound family squashed by a collapsing space-time continuum, so I must prevent the end of the universe, the death of everything, the grand finale of reality!”

Ramsés’ brow furrows as his jaw clenches, and I expect a torrent of insults and threats to gush from his mouth. Instead, he strokes the edge of his graying moustache, that unsanitary ornament made out of curly, coarse fibers that I wish to rip off strand by strand. His nostrils flare as he sucks in a breath to speak.

“I should have known you’re so demented that you wouldn’t think twice before assaulting delicate, irreplaceable hardware. Leire, I’m going to tell you a little story.”

“Oh my, is it story time? Can’t we skip it?”

“No, damn it. I need you to understand something about the machine.”

“Isn’t this chimpanzee too dumb to learn?”

My boss scrunches his greasy, perverted mug in annoyance. He pats his jacket, fishes out a cigarette, clamps it between his teeth, and lights it up. Then he takes a drag so deep that the tip glows red.

“Shut your trap and listen. This story starts back in the eighties or early nineties, when the internet was still a network of text terminals for academics. I was a kid then, if you can picture that. We used to visit relatives on my mother’s side, traveling out of province. In that family’s foyer hung a painting that terrified me even before I heard the adults talk about it. As soon as I stepped through the doorway, a malicious glare coming from the painting stabbed me through as if saying, ‘What the fuck are you doing in my house? Get out!’ I only dared to glance at the picture once, but in that brief look, I burned it into my memory.” My boss exhales smoke, then continues. “The painting depicted an elderly, bearded fisherman garbed in a canary-yellow raincoat. He faced the viewer, standing in a wooden dinghy surrounded by choppy seas and a stormy sky. The image seemed hyperrealistic, as if I could reach out and touch that rough water. The family that had chosen such an unsettling painting as the centerpiece of their foyer spoke of strange occurrences attached to it: a stench of rotten fish coming from the entrance, footsteps pacing up and down the hallway at night. I didn’t enjoy staying over. Anyway, one evening, as my brother and I were playing on the SNES in our cousins’ bedroom, the lights shut off. Far faster than it would have been possible, the stench of rotten fish swarmed the room. I heard the adults hurrying to the entrance, where they flipped the circuit breaker. I don’t recall how the rest of the evening transpired, but from that day on, I knew the painting was haunted.”

“Wow. This turned out to be an intriguing tale.”

“Sure. But as I grew older, I learned that the smell of rotten fish can be caused by circuit failure, as can a sudden power outage. Some heat-resistant chemical coatings release such stink before burning up. And strong electromagnetic fields mess with people’s brains, make them feel as if they’re being watched. You see what I’m getting at?”

“That you gaslit yourself into believing that you didn’t experience a paranormal event, just because you couldn’t handle the truth? Maybe the painting was haunted. Have you thought of that?”

Ramsés’ frown deepens.

“I told you I did.”

“It could have been both electricity and a ghost. Poltergeists love fucking with electrical systems. Anyway, I see far weirder stuff on the daily. Cultures across all ages have spoken of ghosts, and depicted them in similar ways. Doesn’t that count as evidence?”

“That may be the case, but it’s irrelevant to my point.”

“What did your tale have to do with this spiraling death machine, then?”

My boss throws his hands up.

“Oh, who knows!”

“Sure, we can waste time with anecdotes. After all, there’s no hurry to destroy that thing, not when the universe is about to be torn apart. Why don’t we find the painting, burn it with gasoline, then piss on its ashes? Not that we’d need to bother, because the world will be ending soon.”

Ramsés flicks his cigarette, sending a clump of ash to the floor.

“I suppose I must spell it out for you: the machine’s electromagnetic field messes with your already screwed-up head. You’re hypersensitive to it. Don’t bother me with this nonsense about the end of the world. Take a seat and calm down.”



Author’s note: today’s songs are “Closer” by Nine Inch Nails, and “Paranoid Android” by Radiohead. I keep a playlist with the myriad songs I’ve mentioned throughout this series. Check it out.

I’ve missed you, Leire, you fucking nutcase. I hope I can get back in the groove of this story soon.

By the way, Ramsés’ story is straight out of my childhood. The original experience is even wilder when it comes to what my relatives told about how the painting changed.

Speaking of spirals, the anime adaptation of Junji Ito’s masterpiece about obsession and spirals premieres tomorrow. Check out the clip below:

I’ve fed this chapter to the Google AI thing that generates podcasts out of any material. Check out the result: