Poetix

February 14 is Valentine’s Day for many; this year, it’s also Ash Wednesday for Western Christians, both Orthodox and unorthodox. Universally, it is Harry Mathews’s birthday. Harry, who would have been 94 today, was an amazing experimental writer. He’s known to many as the first American to join the Oulipo.

Given the occasion, I thought I’d write a blog post, which I do very rarely these days, to discuss my poetics — or, because mine is a poetics of concision, my “poetix.” Using that word saves one byte. The term may also suggest an underground poetix, as with comix, and this is great.

Why write poems of any sort?

Personally, I’m an explorer of language, using constraint, form, and computation to make poems that surface aspects of language. As unusual qualities emerge, everything that language is entangled with also rises up: Wars, invasions, colonialism, commerce and other sorts of exchange between language communities, and the development of specialized vocabularies, for instance.

While other poets have very different answers, which very often include personal expression, this is mine. Even if I’m an unusual conceptualist, and more specifically a computationalist, I believe my poetics have aspects that are widely shared by others. I’m still interested in composing poems that give readers pleasure, for instance, and that awaken new thoughts and feelings.

Why write computational poems?

Computation, along with language, is an essential medium of my art. Just as painters work with paint, I work with computation.

This allows me to investigate the intersection of computing, language, and poetry, much as composing poems allows me to explore language.

Why write tiny computational poems?

Often, although not always, I write small poems. I’ve even organized my computational poetry page by size.

Writing very small-scale computational poems allows me to learn more about computing and its intersection with language and poetry. Not computing in the abstract, but computing as embodied in particular platforms, which are intentionally designed and have platform imaginaries and communities of use and practice surrounding them.

For instance, consider the modern-day Web browser. Browsers can do pretty much anything that computers can. They’re general-purpose computing platforms and can run Unity games, mine Bitcoin, present climate change models, incorporate the effects of Bitcoin mining into climate change models, and so on and so on. But it takes a lot of code for browsers to do complex things. By paring down the code, limiting myself to using only a tiny bit, I’m working to see what is most native for the browser, what this computational platform can most **essentially* accomplish.

Is the browser best suited to let us configure a linked universe of documents? It’s easy to hook pages together, yes, although now, social media sites prohibit linking outside their walled gardens. Does it support prose better than anything else, even as flashy images and videos assail us? Well, the Web is predisposed to that: One essential HTML element is the paragraph, after all. When boiled down as much as possible, there might be something else that HTML5 and the browser is really equipped to accomplish. What if one of the browser’s most essential capabilities is that of … a poetry machine?

One can ask the same questions of other platforms. I co-authored a book about the Atari VCS (aka Atari 2600), and while one can develop all sorts of things for it (a BASIC interpreter, artgames, demos, etc.), and I think it’s an amazing platform for creative computing, I’m pretty sure it’s not inherently a poetry machine. The Atari VCS doesn’t even have built-in characters, a font in which to display text. On the other hand, the Commodore 64 allows programmers to easily manipulate characters; change the colors of them individually; make them move around the screen; replace the built-in font with one of their own; and mix letters, numbers, and punctuation with an set of other glyphs specific to Commodore. This system can do lots of other things — it’s a great music machine, for instance. But visual poetry, with potentially characters presented on a grid, is also a core capability of the platform, and very tiny programs can enact such poetry.

I’ve written at greater length about this in “A Platform Poetics / Computational Art, Material and Formal Specificities, and 101 BASIC POEMS.” In that article, I focus on a specific, ongoing project that involves the Commodore 64 and Apple II. More generally, these are the reasons I continue to pursue to composition of very small computational poems on several different platforms.

The Engagements of Difference Machines

Insufficent Memory with two viewers/readers behind the hanging photos

It’s been a while since I stopped over in Buffalo, but I’m finally unfrozen, and I’m unfreezing my blog, too, to comment a bit on the exhibit I saw — this was the purpose of my brief wintry sojourn — Difference Machines: Technology and Identity in Contemporary Art at the Albright-Knox Northland. I visited the show with my spouse, Flourish; Tina Rivers Ryan (who curated the exhibit with Paul Vanouse) was kind enough to give us a big chunk of her day and provide a detailed tour.

When we speak of “identity,” we speak of difference. This is true whether we are philosophers like John Perry, who has interrogated what it is that makes objects identical to one another, or are focused on the social world. The works in Difference Machines explore how, in the context of computer and network technologies, people’s identities persist, rather than being erased as some imagined would have happened. This means that some can be grouped together and identified in stereotypical, harmful, even lethal ways — but there are also glimpses of how, more positively, people can identify with one another.

I got to see Difference Machines just before it closed on January 16, so I have to settle for telling you about what you missed. One of the more remarkable aspects of the exhibit is that it was light-flooded and in a space where sound could call out invitingly from some of the pieces without derailing one’s experience of artworks nearby. While I would exhaust myself (and you, dear reader) were I to try to thoroughly review the show and relate much of what was so compelling about it, I’ll at least write some about three of the works in it, to give an idea of what machines were running and how they engaged with shared themes.

Many of the artworks spoke against the concept of a flattened, egalitarian cyberspace (metaverse?), but the photos and texts by Sean Fader in his 2020 Insufficient Memory go beyond this. They document hate crimes against LGBTQ+ people, including many murders and instances where people have been provoked to kill themselves. As a viewer approaches, the low-res photos, taken on a very early consumer digital camera, have a beauty that inheres in the often natural scenes, is intensified by how they are framed, and becomes even more compelling because of the lossy, “cool” (McLuhan’s term) nature of these highly compressed images. Walking around to the back, the viewer, become reader, discovers how each photo is the scene of a brutal crime. The victims did not find positive community through common identity; they were marked as different and in most cases directly killed because of their difference.

‘Ye or Nay at Difference Machines, two computers set up with the game
‘Ye or Nay, A.M. Darky, 2020 (Photo by Tina Rivers Ryan)

To given an idea of the range of this show, turn to ‘Ye or Nay by A.M. Darky (2020). This artwork is a game for two that invites a chat as each player tries to pick out the card that is showing on the other’s screen. It’s not some antigame or disorientation machine, but an actual fun game with a compelling soundtrack, graphics, and interface. (Go play it online!) The cards all display portraits of Black male celebrities. Part of the concept is that some will be better equipped to play this game for various reasons — they will have a more extensive vocabulary to describe the hairstyles shown, for instance, or they will know more about who was born where. The game/artwork playfully tickles players to consider what they’re able to articulate (or not). My only critique is that the piece is already showing its age in one minor way: The apostrophe at the beginning should now be removed!

Level of Confidence’s face-recognition software finds a match for Flourish
Level of Confidence, Rafael Lozano-Hemmer, 2015 (Photo by Tina Rivers Ryan)

The last piece I’ll turn to is by a well-known digital media artist, Rafael Lozano-Hemmer. His Level of Confidence (2015) is a free and open source software project in which biometric software matches the face of the viewer (also the viewed, in this case) to one of 43 students who were kidnapped from the Ayotzinapa normalista school in Iguala, Guerrero, Mexico. The project memorializes this event and exposes the working of a face-recognition system which, it seems, is doomed to never make a match. As I read the piece, though, this artwork also uses computer technology to present the viewer with someone who looks like them, making the connection to this kidnapping more personal and acute. This does not result in some sort of naïve empathy machine. A museum visitor in Buffalo is not likely to suddenly feel, “ah! It could have been me being kidnapped!” But the piece is also not purely a slam on surveillance technology, as I see it. The face-recognition system that is central to this interactive artwork is used to invite a novel viewing and works to help keep an event alive in memory.

Well, I could go on! There were many other great works in the show. But I can’t write a catalogic discussion of them all, so I’ll have to let those three stand as examples of the different approaches artists in Difference Machines took.

A 6 byte Commodore 64 Demo

What if I told you ... 7e 00 8d 20 d0 50 is a Commodore 64 demo

If you thought my last post about a 32 byte (plus 2 byte load address) Commodore 64 demo was esoteric, wait until you burrow into this one.

Back in March at Lovebyte I released a C64 demo that is a total of 6 bytes. I contrived this one so that the 4b of code ends up overwriting part of a zero-page routine that runs every time RETURN is pressed. The effect is a pulsing pattern on the border. (You can just as easily make the screen pulse, which I personally find less aesthetically pleasing because the pulsing in that case happens over any text that is on the screen. It’s also a bit more eye watering and more likely to trigger seizures.) While it’s a very simple effect, I don’t know of any demo at all for this platform that has this file size or any smaller one. Some extensive trickery was involved in injecting my code into existing memory contents to produce this effect.

You can download the demo, NONMONOCHROME.

For my several readers who enjoy reading 6502 assembly, here’s what I did:

; NONMONOCHROME
; 6b C64 demo (2b header + 4b)
; by nom de nom/TROPE

; RETURN to begin.
;
; This demo loops about every 1.45 seconds (on an NTSC
; machine).
;
; Holding down a key while this runs will produce an extra
; effect.
;
; RUN STOP - RESTORE will stop the program, but as soon as
; RETURN is pressed the demo will just start again. To
; restore normal function, it's necessary to power-cycle
; the C64.

.outfile    "nonmonochrome"

.word $007e  ; Wedge the code into CHRGET on the zero page.
.org  $007e  ; Note that CHRGET itself begins at $0073.

sta $d020    ; Set the border color with whatever's in the
; accumulator. The value varies as the code from $73
; through $7e runs. It oscillates between black and white
; for one phase and colorful for another phase. A detailed
; explanation of why is provided below.

.byte $50    ; This makes the next instruction bvc, clobbering
; $20. The following value in memory, $f0, had been used as
; beq. $50 $f0 = bvc $73, which (infinitely) takes us back to
; the beginning of CHRGET at $0073.

; A disassembly of CHRGET, left, and how it's been modified,
; right:
;
; .org  $0073                 .org  $0073
;
; chrget   inc txtptr         nonmono  inc txtptr
;          bne chrgot                  bne chrgot
;          inc txtptr+1                inc txtptr+1
; chrgot   lda                chrgot   lda
; txtptr   .word $0207        txtptr   .word $0207
; pointb   cmp #$3a                    cmp #$3a
;          bcs exit                    sta $d020
;          cmp #$20                    bvc nonmono
;          beq chrget
;          sec
;          sbc #$30
;          sec
;          sbc #$d0
; exit     rts

; CHRGET keeps increasing TXTPTR until it reaches the end of
; whatever BASIC input it's reading -- whether in immediate
; mode or when reading a BASIC program.
;
; NONMONO, however, loops forever and keeps increasing TXTPTR
; until it overflows past $ffff back to $0000.
;
; Because of the LDA TXTPTR, the accumulator is being
; consecutively loaded with each of the bytes in the C64's
; 64kb of accessible RAM and ROM. Then, after the CMP
; (which does nothing but slow the demo down by two cycles
; per loop), the contents of the accumulator are stored
; so as to set the border color.
;
; A large region of the C64's memory has $0 or $1 as the
; low nibble -- at least at power on, with no BASIC program
; loaded. Thus, black or white. Then, another large region
; (including ROM and the zeropage) has more "interesting"
; contents which manifest themselves as colors.

My demo was also taken up as an object of discussion in the first 7 minutes and 30 seconds of this YouTube video, where some of this explanation is provided as the demo runs on a C64c. This a later model of the Commodore 64, not the system I used in testing it, so the pulsing effect is slightly different. Among other things, my name for the demo, NONMONOCHROME, makes less sense when it’s running on this computer!

It could be an interesting challenge for others to try writing a Commodore 64 demo of only 6 bytes total, or of fewer bytes. For reasons I’d be glad to discuss, it seems to me that injecting the code into some productive context (an existing routine such as CHRGET or elsewhere in memory) is the only workable approach.

C64 Coding Under (Many) Constraints

Screenshot from Tyger Tyger; black and white border, scattering of orange and black characters on blue

Yesterday I wrote a little demoscene production, an intro, called “Tyger Tyger.” It’s a Commodore 64 machine language program with 32 bytes of code and the requisite 2 byte header, found on all C64 PRG files. It only garnered third place out of five entries in the 256b compos at @party 2021, behind two impressive entries that were for a different platform (DOS) and went to the limit of allowable code (eight times as much).

I wrote this intro under a formal constraint (32 bytes of machine language code) and several process constraints. Specifically, I wrote it all yesterday, mostly on a Amtrak train, finishing up the sound once I got to the party itself in Somverville. I also exclusively used a hardware Commodore 64 running Turbo Macro Pro v1.2, rather than cross-assembling the code on a contemporary computer and testing it on an emulator. To be specific, I used an unofficial hardware version of the Commodore 64 called the Ultimate 64, which is a modern FPGA implementation of Commodore’s hardware—not, however, an emulator. I placed a SID chip (a 6581) in the machine, so the only analog component that would otherwise need to be emulated was an authentic original.

Writing the code exclusively on the train provided me with some additional challenges, because the power kept cutting out and my system (which has to be plugged into AC power) shut off each time.

I’d never used any version of Turbo Macro Pro before, neither the C64 assembler nor TMPx, the cross-assembler. I figured out the basics of how to use the editor and learned the syntax the assembler used. It’s quite an excellent piece of software—thanks, Style!

And tremendous thanks to Dr. Claw, who put on a safe, responsible, demoparty—masks required when not eating, full vaccination required for all. It was a tiny one, yes, but it was a party! The event continues the important social and artistic traditions of the North American demoscene.

Golem and My Other Seven Computer-Generated Books in Print

Dead Alive Press has just published my Golem, much to my delight, and I am launching the book tonight in a few minutes at WordHack, a monthly event run by the NYC community gallery Babycastles.

This seems like a great time to credit the editors and presses I have worked with to publish several of these books, and to let you all know where they can be purchased, should you wish to indulge yourselves:

  • Golem, 2021, Dead Alive’s New Sight series. Thank you, Augusto Corvalan!
  • Hard West Turn, 2018, published by my Bad Quarto thanks to John Jenkins’s work on the Espresso Book Machine at the MIT Press Bookstore.
  • The Truelist, 2017, Counterpath. This book was the first in the Using Electricity series which I edit, and was selected and edited by Tim Roberts—thanks! Both Counterpath publications and my book from Les Figues are distributed by the nonprofit Small Press Distribution.
  • Autopia, 2016, Troll Thread. Thank you, Holly Melgard!
  • 2×6, 2016, Les Figues. This book is a collaboration between me and six others: Serge Bouchardon, Andrew Campana, Natalia Fedorova, Carlos León, Aleksandra Ma?ecka, and Piotr Marecki. Thank you, Teresa Carmody!
  • Megawatt, 2014, published by my Bad Quarto thanks to Jeff Mayersohn’s Espresso Book Machine at the Harvard Book Store.
  • #!, 2014, Counterpath. Thank you, Tim Roberts!
  • World Clock, 2013, published by my Bad Quarto thanks to Jeff Mayersohn’s Espresso Book Machine at the Harvard Book Store.

The code and text to these books are generally free, and can be found on nickm.com, my site. They are presented in print for the enjoyment of those who appreciate book objects, of course!

Generative Unfoldings, Opening April 1, 2021

Generative Unfoldings, 14 images from 14 generative artworks

Generative Unfoldings is an online exhibit of generative art that I’ve curated. The artworks run live in the browser and are entirely free/libre/open-source software. Sarah Rosalena Brady, D. Fox Harrell, Lauren Lee McCarthy, and Parag K. Mital worked with me to select fourteen artworks. The show features:

  • Can the Subaltern Speak? by Behnaz Farahi
  • Concrete by Matt DesLauriers
  • Curse of Dimensionality by Philipp Schmitt
  • Gender Generator by Encoder Rat Decoder Rat
  • Greed by Maja Kalogera
  • Hexells by Alexander Mordvintsev
  • Letter from C by Cho Hye Min
  • Pac Tracer by Andy Wallace
  • P.S.A.A. by Juan Manuel Escalante
  • Seedlings_: From Humus by Qianxun Chen & Mariana Roa Oliva
  • Self Doubting System by Lee Tusman
  • Someone Tell the Boyz by Arwa Mboya
  • Songlines by Ágoston Nagy
  • This Indignant Page: The Politics of the Paratextual by Karen ann Donnachie & Andy Simionato

There is a (Screen) manifestation of Generative Unfoldings, which lets people run the artworks in their browsers. In addition, a (Code) manifestation provides a repository of all of the free/libre/open-source source code for these client-side artworks. This exhibit is a project of MIT’s CAST (Center for Art, Science & Technology) and part of the Unfolding Intelligence symposium. The opening, remember, is April 1, 2021! See the symposium page, where you can register (at no cost) and find information about joining us.

Amazing Quest Q&A

Amazing Quest should be completely open to the interpretation of players, to their appreciation of it, and, if they choose, to their rejection of it.

I refrained from discussing anything about the game during the IF Comp. Now that it’s over, I am glad to answer some questions that have arisen—with the earnest hope that my answers don’t preclude people from coming up with their own interpretations and responses.

These aren’t really frequently asked questions, but they are all actually questions that have been asked at least once. When I quote directly, the quotations are from anonymous feedback from IF Comp players. Whether quoted or in paraphrase, all of these are real questions or responses that I’ve gotten.

Q: Are you trolling? Making a joke? Playing a prank?

A: No.

Q: Why did you enter this thing, which isn’t very much like IF as we understand it, in the IF Comp?

A: Because I hoped some people would enjoy it and be provoked by it (in a positive way) when they encountered this game in the context of the Comp. That may have only happened twelve times, based on the ratings that were greater than 5, but perhaps I provided some interest and joy to these twelve players that outweighed the other players’ confusion and disappointment.

Q: As a computer program, what exactly is Amazing Quest?

A: A quasi-spoiler here, but: it is a 12-line Commodore 64 BASIC program, with each line being of the maximum length that can be typed in: 80 characters, using all keyword abbreviations and other shortcuts. That makes it the maximal Commodore 64 BASIC program that will fit on one screen. On the second half of the last logical line (line 11), which is the last physical line of the screen, I included a sort of informal all-permissive free software license.

Q: Is this an experiment?

A: I don’t find it interesting to produce any IF, other digital games, other digital literature, or other digital art, unless what I’m doing is an experiment. So, of course.

Q: Is this a parody?

A: I don’t consider it to be, since you’re asking me. If you have thoughtfully considered the game and that’s what you take away from it, I respect your view.

Q: What am I supposed to do when playing this?

A: Since you’ve asked me, I’ve tried to explain this quite explicitly in the introduction: “If you allow your imagination to help you elaborate each stop on your journey, and if you truly get into the mindset of the returning wanderer, Amazing Quest will offer you rewards as you play it again and again.” You can read that, and the game, however you want, but I’d say that Amazing Quest prompts you to imagine, from the standpoint of the main character. So, imagine.

Q: “Oh hey, it’s A Space Odyssey!”

A: For me at least, I did consider Amazing Quest to be a serious engagement with Homer’s Odyssey, and that was one of the things that motivated my work on the project. I’m glad that some people saw this aspect of the project. I hope that enriched some people’s experience of it.

Q: “I found the intro and strategy guide more compelling than the game itself.”

A: Personally I would have preferred that all elements of Amazing Quest (the introduction, the strategy guide, the BASIC game itself) had worked together to good effect for you, but I’m glad that you liked something about the project. My development of the short framing texts was meant to relate to the way that early games had similar supporting materials that were essential to the experience. In any case, I am glad someone liked these texts, because it took me a long time to type them up on my Smith Corona Classic 12 without making any mistakes.

Q: “I don’t suspect that you’re in it for the ratings.”

Only one of more than 100 games was going to win the Comp. (Well, this year it happens to be two, because of a tie—but you get my point.) I made this game for the IF Comp so that players would encounter Amazing Quest and play it in that context, in case they found it compelling in that context.

Q: “I guess the point was go ‘behind the scenes’ and read the program in BASIC? That isn’t a particularly interesting goal…”

A: It wasn’t interesting to you, but there are many people in the world. One player ported the game to BBC Micro BASIC, so it seems like the nature of this game as a BASIC program was somehow interesting to that person. Even apparently simple projects like this may have many complex aspects to them which aren’t evident at first. And perhaps only a very few people will be interested in particular aspects. So in this case, perhaps this “behind the scenes” aspect is important to the person who ported it to the BBC Micro, and maybe it will be interesting to people who know Commodore 64 BASIC very well. I’m frankly surprised that someone engaged with the BASIC program so thoroughly during the Comp. It easily could have taken a few decades for anyone to really become interested in the game’s code, if that was ever going to happen.

Q: SPOILER, select the following text to read: The player’s input has no effect on the outcome, and that’s stupid.

A: Although this isn’t a question, I’ll mention: If you understand a little more about Commodore 64 BASIC, you’d find that the user’s input does have an effect on the outcome.

Q: SPOILER, select the following text to read: Okay, but whether you answer yes or no has no effect on the outcome.

A: This, while also not a question, is true. So, let’s begin with whether this is fair to players of the game. Does that contradict anything said on the main page (“I must decide as if it all depends on me, trust as if it all depends on the gods”), within the game itself (“The gods grant victory”), in the introduction, or in the strategy guide? And in terms of how this game relates to the Odyssey, in which a character is fated to return home, alone, from the beginning, and is then brought home by the will of the gods—is there any contradiction there? To continue along these lines, even understanding this aspect of the game, if you decided to go on raids at every opportunity, plundering away, would that be any different than if you always declined to raid? Is your intentional choice irrelevant, even if the outcome is “random”? With all of this in mind, consider something more concrete and immediate. Let’s consider people who live in the United States who voted in the 2020 election. Why would they do that? Realistically, an individual’s vote had no more effect than any one particular Y/N response in Amazing Quest. Let’s heap one more thing on here, purely related to what one might call gameplay. If you want to imagine what’s going on—a journey home—why would this particular property of the game in any way stifle your imagination?

Q: Was this project motivated by anything besides the Odyssey?

A: Yes. I’ll be discussing this and other matters related to Amazing Quest at the Seattle area IF meetup, which will take place online on December 13, 2020 at 2pm PST. If you want to join, you’ll need to email the organizers; see the intfiction.org forum for more information. I hope this group doesn’t regret their plan to host the author of the 98th place IF Comp 2020 game! I’m certainly still looking forward to discussing Amazing Quest.

“Peaceful Protesters” but no “Peaceful Police”

About four million Google hits for “peaceful protesters,” only about 55,000 for “peaceful police.” Anyone who has been reading the news will have seen the phrase “peaceful protesters” again and again—and probably will not have seen this other phrase. Does that mean peaceful protesters outnumber peaceful police 80 to 1? Or at least that we think and speak as if this is the case?

Linguistics does not support this conclusion. In her 1949 book The Second Sex, Simone De Beauvoir gave us the basis for understanding how maleness is the norm in society and language. The phenomenon here is that of markedness, having a default form and a marked form. “Actor” can be a generic term for anyone who acts, but “actress” is used only for the special, marked case—women. As Edwin L. Battistella discusses in The Logic of Markedness, there are exceptions: “male nurse” is the marked case for this profession, because of “the social fact that nurses are most commonly female.”

“Peaceful protesters” is the marked case. It’s understood implicitly that “protesters” are not generally peaceful.

So when the news media speaks or writes about “peaceful protesters,” they are using the marked case. It’s understood implicitly that “protesters” are not generally peaceful. The exceptional ones are the peaceful ones, like the small percentage of male nurses. This is quite evidently false, but doesn’t prevent journalists from using the phrase again and again.

Amirite? Let’s check to see approximately how many Google search results there are for “violent protesters.” In my filter bubble, and admitting that these searches cover all English-language discussion of all protesters globally and historically, it’s 445,000 results, a tiny sliver compared to the “peaceful” ones.

I admit that there are other reasons people would use an adjective such as “peaceful.” It can be used for emphasis rather than to indicate the marked case. But if that’s what’s going on, that’s a huge amount of emphasis. And, I would expect such emphasis to often be accompanied by some sort of marker, an adverb such as “just” or “only” or something along those lines, which I seldom see in recent news.

Now, if you don’t buy my argument about markedness and that think “peaceful” and “violent” just represent how many protesters we think are peaceful and how many we think are violent, this still makes no sense at all. Watch the videos. Watch the livestreams. If you can, go out on the streets. One in ten protesters are not violent in any objective sense.

If you do agree that “peaceful protesters” is being used as the marked case, as if these protesters were in a slim minority, that is an extraordinary and bizarre confusion, truly unhinged from reality.

Why not just call the great mass of so-called peaceful protesters “protesters,” explaining—if for some reason it needs to be explained—that we are lawfully exercising our rights to speak and assemble?

Post Hoc, An Online Art Show

Please enjoy Post Hoc, a show I’ve put together with generous contributions from a baker’s dozen artists and eight writers. There was no pre-established theme for Post Hoc, which was prompted by our inability to get to IRL galleries and museums. Artists were simply asked for digital images, any digital image they considered an artwork. (Several works in the show do have other manifestations.) The work in the show is all from 2020. I solicited 1000–1200 character responses to each piece.

Agnieszka Kurant   response by Mary Flanagan

Christian Bök   response by Paul Stephens

Daniel Temkin   response by Craig Dworkin

Derek Beaulieu   response by Amaranth Borsuk

Forsyth Harmon   response by Simon Morris & Valérie Steunou

Lauren Lee McCarthy   response by Daniel Temkin

Lilla LoCurto & Bill Outcault   response by Fox Harrell

Olia Lialina   response by Mary Flanagan

Manfred Mohr   response by Craig Dworkin

Mark Klink   response by Daniel Temkin

Renée Green   response by Paul Stephens

Sly Watts   response by Fox Harrell

Susan Bee   response by Amaranth Borsuk

You can scroll through the entire Post Hoc show as a single page. However, you’ll only see the images at their original size, and be able to read the responses, if you go to each post individually.

WordHack Book Table

This May 21, 2020 at 7pm Eastern Time is another great WordHack!

A regular event at Babycastles here in New York City, this WordHack will be fully assumed into cyberspace, hosted as usual by Todd Anderson but this time with two featured readings (and open mic/open mouse) viewable on Twitch. Yes, this is the link to the Thursday May 21, 2020 WordHack!

There are pages for this event up on Facebook and withfriends.

I’m especially enthusiastic about this one because the two featured readers will be sharing their new, compelling, and extraordinary books of computer-generated poetry. This page is a virtual “book table” linking to where you can buy these books (published by two nonprofit presses) from their nonprofit distributor.

Travesty Generator coverLillian-Yvonne Bertram will present Travesty Generator, just published by Noemi Press. The publisher’s page for Travesty Generator has more information about how, as Cathy Park Hong describes, “Bertram uses open-source coding to generate haunting inquiring elegies to Trayvon Martin, and Eric Garner, and Emmett Till” and how the book represents “taking the baton from Harryette Mullen and the Oulipians and dashing with it to late 21st century black futurity.”

Data Poetry coverJörg Piringer will present Data Poetry, just published in his own English translation/recreation by Counterpath. The publisher’s page for Data Poetry offers more on how, as Allison Parrish describes it, Jörg’s book is a “wunderkammer of computational poetics” that “not only showcases his thrilling technical virtuosity, but also demonstrates a canny sensitivity to the material of language: how it looks, sounds, behaves and makes us feel.”

Don’t Venmo me! Buy Travesty Generator from Small Press Distribution ($18) and buy Data Poetry from Small Press Distribution ($25).

SPD is well equipped to send books to individuals, in addition to supplying them to bookstores. Purchasing a book helps SPD, the only nonprofit book distributor in the US. It also gives a larger share to the nonprofit publishers (Noemi Press and Counterpath) than if you were to get these books from, for instance, a megacorporation.

Because IRL independent bookstores are closed during the pandemic, SPD, although still operating, is suffering. You can also support SPD directly by donating.

I also suggest buying other books directly from SPD. Here are several that are likely to interest WordHack participants, blatantly including several of my own. The * indicates an author who has been a featured presenter at WordHack/Babycastles; the books next to those asterisks happen to all be computer-generated, too:

Thanks for those who want to dig into these books as avid readers, and thanks to everyone able to support nonprofit arts organizations such as Babycastles, Small Press Distribution, Noemi Press, and Counterpath.

Sonnet Corona

Sonnet Corona, detail from a particular generated poem in the browser

“Sonnet Corona” is a computer-generated sonnet, or if you look at it differently, a sonnet cycle or very extensive crown of sonnets. Click here to read some of the generated sonnets.

The sonnets generated are in monometer. That is, each line is of a single foot, and in this case, is of strictly two syllables.

They are linked not by the last line of one becoming the first line of the next, but by being generated from the same underlying code: A very short web page with a simple, embedded JavaScript program.

Because there are three options for each line, there are 314 = 4,782,969 possible sonnets.

I have released this (as always) as free software, so that anyone may share, study, modify, or make use of it in any way they wish. To be as clear as possible, you should feel free to right-click or Command-click on this link to “Sonnet Corona,” choose “Save link as…,” and then edit the file that you download in a text editor, using this file as a starting point for your own project.

This extra-small project has as its most direct antecedent the much more extensive and elaborate Cent mille milliards de poèmes by Raymond Queneau.

My thanks go to Stephanie Strickland, Christian Bök, and Amaranth Borsuk for discussing a draft of this project with me, thoroughly and on short notice.

Against “Epicenter”

New York City, we are continually told, is now the “epicenter” of the COVID-19 pandemic in the United States. Italy is the world’s “epicenter.” This term is used all the time in the news and was recently deployed by our mayor here in NYC.

I’m following up on a February 15 Language Log post by Mark Liberman about why this term is being used in this way. Rather than asking why people are using the term, I’m going to discuss how this word influences our thinking. “Epicenter” leads us to think about the current global pandemic in some unhelpful ways. Although less exciting, simply saying something like “New York City has the worst outbreak” would actually improve our conceptual understanding of this crisis.

“Epicenter” (on the center) literally means the point on the surface of the earth nearest to the focus of a (below-ground) earthquake. It can be used figuratively — Sam did not keep the apartment very tidy; Upon entering the kitchen, we found that it was the epicenter — but there’s only the one literal meaning.

One effect of the term is a sort of morphological pun: There’s a COVID-19 “epi-center” because this is an “epi-demic,” a disease which is “on the people.” But on March 11, the World Health Organization said that COVID-19 is worse than an epidemic, it’s a pandemic. Indeed, it is a global pandemic, spreading everywhere. So what might have been a useful pun back in February is now an understatement.

Beyond that, “epicenter” is metaphorical in the sense of directing us to a particular conceptual metaphor (see George Lakoff and Mark Johnson’s Metaphors We Live By, 1980, and Lakoff’s article “The Contemporary Theory of Metaphor,” 1993). This sort of metaphor is not just a rhetorical figure or flourish, not a surface feature of language like the “epi-” pun. It is a fundamental way of understanding a target domain (the pandemic) in terms of a source domain (an earthquake).

To give this complex metaphorical mapping a name, we can call it A HEALTH DISASTER IS A SEISMOLOGICAL DISASTER or more simply A PANDEMIC IS AN EARTHQUAKE. But these are just names; we’d need to explore what is being mapped from our earthquake-schema to our pandemic-schema to really think about what’s going on there.

I will note that this metaphor usefully emphasizes some things about the pandemic: its unexpected onset, the extensive devastation, and the cost to human life. While such mappings are always incomplete, if we try to make a more extensive mapping, we can find ourselves more confused than helped.

Earthquakes are localized to a certain place (unlike a global pandemic) and they occur during a short period of time (unlike a global pandemic). So the metaphor incorrectly suggests that our current disaster is happening once, in one place, and thus we will be able to clean up from this localized, short-term event with appropriate disaster relief.

The most critical aspect of our current crisis is not part of the earthquake metaphor at all. There is no entailment or suggestion from the earthquake metaphor that we are dealing with something that can be transmitted or is communicable. Instead of rallying to an earthquake meeting point, we now need to remain apart from each other to slow the spread of disease.

I’d going to go even deeper in thinking about the “epicenter” concept. Why does a global pandemic (a disease affecting “all the people”) have any sort of center at all?

Metaphor, as it is now understood, is based on ways of thinking that are grounded in bodily experience, including those cognitive structures called image schemas. One of these, detailed by Mark Johnson in The Body in the Mind, 1987 and also discussed by George Lakoff in Women, Fire, and Dangerous Things, 1987, is the CENTER-PERIPHERY image schema. It relates to body, and our recognition of the heart, for instance, as being central and one of our toes as being more peripheral. We worry less if we’ve cut a toe than if we’ve cut our heart. Even if lose a toe, we can keep living, which we can’t do without our heart.

So, since this pandemic has one or more CENTERS, does that mean that it’s not so important to worry about the PERIPHERIES of COVID-19? Do we need to be concerned about the center but, if we are somewhere on the margins, is it okay to have parties or get into other situations that may foster transmission of the virus? Is that the way to think about a global pandemic, where outbreaks are occurring everywhere? Obviously, I feel that it’s not best.

The alternative image schemas we can use to develop alternative metaphors are CONTAINMENT and LINER SCALE. “Outbreak” is pretty clearly based on the CONTAINMENT image schema. Some places do have outbreaks that are worse and more serious than other places. Hence, LINEAR SCALE. This would mean saying that, for instance:

Italy has the “worst outbreak of the global pandemic”
NYC has the “worst US outbreak of the global pandemic”

These statements indicate that COVID-19 is a global outbreak that must be CONTAINED, and the implication is that it must be contained everywhere. It isn’t something that hits one place at one time, and doesn’t have a CENTER people can simply flee from in order to be safe. It also admits that the various outbreaks around the world are on a SCALE and can be worse in some places, as of course they are.

I shouldn’t need to explain that I have no expertise or background in public health; What I know, and the information I trust, comes from reading official public health sources (the WHO and CDC). It may seem silly to some (even if you’ve read this far) that I’ve gone off at such length about a single word that’s in the current discourse. I’ve bothered to write this because I’m a poet and have been studying metaphor (in the sense of conceptual metaphor) for many years. I believe the metaphors we live by are very important.

In George Lakoff and Mark Turner’s More Than Cool Reason, 1989, they make the case that metaphor is not what it was assumed to be in poetry discussions for many centuries. It is completely different, certainly not restricted to literature, and indeed is central to everyday thinking. However, in their view, the role of poets is extremely important: “Poets are artists of the mind.” They argue that we (poets) can help to influence our culture and open up more productive and powerful ways of thinking about matters of crucial importance, via developing and inflecting metaphors. I believe this, and hope that other poets will, too.

Sea and Spar Between 1.0.2

When it rains, it pours, which matters even on the sea.

Thanks to bug reports by Barry Rountree and Jan Grant, via the 2020 Critical Code Studies Working Group (CCSWG), there is now another new version of Sea and Spar Between which includes additional bug fixes affecting the interface as well as the generation of language.

As before, all the files in this version 1.0.2.are available in a zipfile, for those who care to study or modify them.

Sea and Spar Between 1.0.1

Stephanie Strickland and I published the first version of Sea and Spar Between in 2010, in Dear Navigator, a journal no longer online. In 2013 The Winter Anthology republished it. That year we also provided another version of this poetry system for Digital Humanities Quarterly (DHQ), cut to fit the toolspun course, identical in terms of how it functions but including, in comments within the code, what is essentially a paper about the detailed workings of the system. In those comments, we wrote:

The following syllables, which were commonly used as words by either Melville or Dickinson, are combined by the generator into compound words.

However, due to a programming error, that was not the case. In what we will now have to call Sea and Spar Between 1, the line:

syllable.concat(melvilleSyllable);

does not accomplish the purpose of adding the Melville one-syllable words to the variable syllable. It should have been:

syllable = syllable.concat(melvilleSyllable);

I noticed this omission only years later. As a result, the compound or kenning “toolspun” never was actually produced in any existing version of Sea and Spar Between, including the one available here on nickm.com. This was a frustrating situation, but after Stephanie and I discussed it briefly, we decided that we would wait to consider an updated version until this defect was discovered by someone else, such as a critic or translator.

It took a while, but a close reading of Sea and Spar Between by Aaron Pinnix, who considered the system’s output rather than its code, has finally brought this to the surface. Pinnix is writing a critique of several ocean-based works in his Fordham dissertation. We express our gratitude to him.

The result of adding 11 characters to the code (obviously a minor sort of bug fix, from that perspective) makes a significant difference (to us, at least!) in the workings of the system and the text that is produced. It restores our intention to bring Dickinson’s and Melville’s language together in this aspect of text generation. We ask that everyone reading Sea and Spar Between use the current version.

Updated 2020-02-02: Version 1.0.2 is now out, as explained in this post.

We do not have the ability to change the system as it is published in The Winter Anthology or DHQ, so we are presenting Sea and Spar Between 1.0.1 1.0.2 here on nickm.com. The JavaScript and the “How to Read” page indicate that this version, which replaces the previous one, is 1.0.1 1.0.2.

Updated 2020-02-02: Version 1.0.2 is the current one now and the one which we endorse. If you wish to study or modify the code in Sea and Spar Between and would like the convenience of downloading a zipfile, please use this version 1.0.2.

Previous versions, not endorsed by us: Version 1 zipfile, and version 1.0.1 zipfile. These would be only of very specialized interest!

Incidentally, there was another mistake in the code that we discovered after the 2010 publication and before we finished the highly commented DHQ version. We decided not to alter this part of the program, as we still approved of the way the system functioned. Those interested are invited to read the comments beginning “While the previous function does produce such lines” in cut to fit the toolspun course.

Nano-NaNoGenMo or #NNNGM

Ah, distinctly I remember it was in the bleak November;
And each separate bit and pixel wrought a novel on GitHub.

April may be the cruelest month, and now the month associated with poetry, but November is the month associated with novel-writing, via NaNoWriMo, National Novel Writing Month. Now, thanks to an offhand comment by Darius Kazemi and the work of Hugo van Kemenade, November is also associated with the computer-generation of novels, broadly speaking. Any computer program and its 50,000 word+ output qualifies as an entry in NaNoGenMo, National Novel Generation Month.

NaNoGenMo does have a sort of barrier to entry: People often think they have to do something elaborate, despite anyone being explicitly allowed to produce a novel consisting entirely of meows. Those new to NaNoGenMo may look up to, for instance, the amazingly talented Ross Goodwin. In his own attempt to further climate change, he decided to code up an energy-intensive GPT-2 text generator while flying on a commercial jet. You’d think that for his next trick this guy might hop in a car, take a road trip, and generate a novel using a LSTM RNN! Those who look up so such efforts — and it’s hard not to, when they’re conducted at 30,000 feet and also quite clever — might end up thinking that computer-generated novels must use complex code and masses of data.

And yet, there is so much that can be done with simple programs that consume very little energy and can be fully understood by their programmers and others.

Because of this, I have recently announced Nano-NaNoGenMo. On Mastodon and Twitter (using #NNNGM) I have declared that November will also be the month in which people write computer programs that are at most 256 characters, and which generate 50,000 word or more novels. These can use Project Gutenberg files, as they are named on that site, as input. Or, they can run without using any input.

I have produced three Nano-NaNoGenMo (or #NNNGM) entries for 2019. In addition to being not very taxing computationally, one of these happens to have been written on an extremely energy-efficient electric train. Here they are. I won’t gloss each one, but I will provide a few comments on each, along with the full code for you to look at right in this blog post, and with links to both bash shell script files and the final output.

OB-DCK; or, THE (SELFLESS) WHALE


perl -0pe 's/.?K/**/s;s/MOBY(.)DI/OB$1D/g;s/D.r/Nick Montfort/;s/E W/E (SELFLESS) W/g;s/\b(I ?|me|my|myself|am|us|we|our|ourselves)\b//gi;s/\r\n\r\n/
/g;s/\r\n/ /g;s//\n\n/g;s/ +/ /g;s/(“?) ([,.;:]?)/$1$2/g;s/\nEnd .//s’ 2701-0.txt #NNNGM

WordPress has mangled this code despite it being in a code element; Use the following link to obtain a runnable version of it:

OB-DCK; or, THE (SELFLESS) WHALE code

OB DCK; or, THE (SELFLESS) WHALE, the novel

The program, performing a simple regular expression substitution, removes all first-person pronouns from Moby-Dick. Indeed, OB-DCK is “MOBY-DICK” with “MY” removed from MOBY and “I” from DICK. Chapter 1 begins:

Call Ishmael. Some years ago—never mind how long precisely—having little or no money in purse, and nothing particular to interest on shore, thought would sail about a little and see the watery part of the world. It is a way have of driving off the spleen and regulating the circulation. Whenever find growing grim about the mouth; whenever it is a damp, drizzly November in soul; whenever find involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral meet; and especially whenever hypos get such an upper hand of , that it requires a strong moral principle to prevent from deliberately stepping into the street, and methodically knocking people’s hats off—then, account it high time to get to sea as soon as can. This is substitute for pistol and ball. With a philosophical flourish Cato throws himself upon his sword; quietly take to the ship. There is nothing surprising in this. If they but knew it, almost all men in their degree, some time or other, cherish very nearly the same feelings towards the ocean with .

Because Ishmael is removed as the “I” of the story, on a grammatical level there is (spoiler alert!) no human at all left at the end of book.

consequence


perl -e 'sub n{(unpack"(A4)*","backbodybookcasedoorfacefacthandheadhomelifenamepartplayroomsidetimeweekwordworkyear")[rand 21]}print"consequence\nNick Montfort\n\na beginning";for(;$i<12500;$i++){print" & so a ".n;if(rand()<.6){print n}}print".\n"' #NNNGM

consequence code

consequence, the novel

Using compounding of the sort found in my computer-generated long poem The Truelist and my “ppg 256-3,” this presents a sequence of things — sometimes formed from a single very common four-letter word, sometimes from two combined — that, it is stated, somehow follow from each other:

a beginning & so a name & so a fact & so a case & so a bookdoor & so a head & so a factwork & so a sidelife & so a door & so a door & so a factback & so a backplay & so a name & so a facebook & so a lifecase & so a partpart & so a hand & so a bookname & so a face & so a homeyear & so a bookfact & so a book & so a hand & so a head & so a headhead & so a book & so a face & so a namename & so a life & so a hand & so a side & so a time & so a yearname & so a backface & so a headface & so a headweek & so a headside & so a bookface & so a bookhome & so a lifedoor & so a bookyear & so a workback & so a room & so a face & so a body & so a faceweek & so a sidecase & so a time & so a body & so a fact […]

Too Much Help at Once


python -c "help('topics')" | python -c "import sys;print('Too Much Help at Once\nNick Montfort');[i for i in sorted(''.join(sys.stdin.readlines()[3:]).split()) if print('\n'+i+'\n') or help(i)]" #NNNGM

Too Much Help at Once code

Too Much Help at Once, the novel

The program looks up all the help topics provided within the (usually interactive) help system inside Python itself. Then, it asks for help on everything, in alphabetical order, producing 70k+ words of text, according the GNU utility wc. The novel that results is, of course, an appropriation of text others have written; it arranges but doesn’t even transform that text. To me, however, it does have some meaning. Too Much Help at Once models one classic mistake that beginning programmers can make: Thinking that it’s somehow useful to read comprehensively about programming, or about a programming language, rather than actually using that programming language and writing some programs. Here’s the very beginning:

Too Much Help at Once
Nick Montfort

ASSERTION

The “assert” statement
**********************

Assert statements are a convenient way to insert debugging assertions
into a program:

assert_stmt ::= “assert” expression [“,” expression]

A plot

So far I have noted one other #NNNGM entry, A plot by Milton Läufer, which I am reproducing here in corrected form, according to the author’s note:


perl -e 'sub n{(split/ /,"wedding murder suspicion birth hunt jealousy death party tension banishment trial verdict treason fight crush friendship trip loss")[rand 17]}print"A plot\nMilton Läufer\n\n";for(;$i<12500;$i++){print" and then a ".n}print".\n"'

Related in structure to consequence, but with words of varying length that do not compound, Läufer’s novel winds through not four weddings and a funeral, but about, in expectation, 735 weddings and 735 murders in addition to 735 deaths, leaving us to ponder the meaning of “a crush” when it occurs in different contexts:

and then a wedding and then a murder and then a trip and then a hunt and then a crush and then a trip and then a death and then a murder and then a trip and then a fight and then a treason and then a fight and then a crush and then a fight and then a friendship and then a murder and then a wedding and then a friendship and then a suspicion and then a party and then a treason and then a birth and then a treason and then a tension and then a birth and then a hunt and then a friendship and then a trip and then a wedding and then a birth and then a death and then a death and then a wedding and then a treason and then a suspicion and then a birth and then a jealousy and then a trip and then a jealousy and then a party and then a tension and then a tension and then a trip and then a treason and then a crush and then a death and then a banishment […]

Share, enjoy, and please participate by adding your Nano-NaNoGenMo entries as NaNoGenMo entries (via the GitHub site) and by tooting & tweeting them!

Gomringer’s Untitled Poem [“silencio”], an Unlikely Sonnet

The untitled poem by Eugen Gomringer that we can only call “silencio” is a classic, perhaps the classic, concrete poem. According to Marjorie Perloff’s Unoriginal Genius, the “silencio” version of the poem dates from 1953. In my 1968 edition of The Book of Hours and Constellations I find the German manifestation of this poem (with the word “schweigen”) and the English poem (with the word “silence”), on the same page at the very beginning of the book — but no “silencio.” The place where I do find “silencio” is An Anthology of Concrete Poetry from 1967, edited by Emmett Williams. My copy is the re-issue by Primary Information.

Williams mentions tendencies and tries not to too strongly characterize any particular poets in the anthologies when he writes, in the introduction:

The visual element of their poetry [the concrete poets’ poetry] tended to be structural, a consequence of the poem, a “picture” of the lines of force of the work itself, and not merely textural. It was poetry beyond paraphrase … the word, not words, words, words or expressionistic squiggles …

There are several essential points here about the project of concrete poetry and how it differs from, for instance, the shapes of “Easter Wings” and the other poems in George Herbert’s The Altar, as well as the way Lewis Carroll presented the image of a mouse’s tail in words that tell the mouse’s tale in Alice’s Adventures in Wonderland. However brilliant these two writers were, in these cases they were using language to make pictures; the concrete poets, beginning with Gomringer, worked to create structures. Their poems are not just verse (lineated language), but made from lines of force. In many cases, as with the unnamed poem I must call “silencio,” an entire concrete poem can be understood to cohere as a word.

There are other interpretations of Gomringer’s poem that situate it in history, but I will give a simple one that situates it within the project of concrete poetry — followed by another that places it in a different and much longer-lived poetic tradition.

The lines of force of this poem are, most obviously, those that allow for the gap in the middle where the ground (the absence of text, the absence of “silencio”) becomes figure. As ink declares silence, or, if we read the text aloud, as our voice declares silence, attentive readers can’t help but notice a truer silence in the middle of the page.

At the next stage, there is silence between each “silencio,” horizontally and vertically. We overlook this gap, which is seen even when text is not presented on a grid. It too will be represented if we read the poem aloud, however, between each spoken word.

We can go further, although ear and eye would not agree about the silences. There are spaces, and thus silences of a visual sort, between each of the letters in “silencio,” too.

Fascinating, isn’t it, that John Cage’s 4’33” was composed and presented in 1952, preceding this poem? This poem, too, seems to structurally show, through its lines of force, that silence can take center stage.

In any case, without offering more than a brief appreciation, I mean to make it clear that this is a quintessential concrete poem. One can read it out loud, but that does not provide the listener with the effect of apprehending the structure of the poem on the page. The poem is not a picture of anything. It is a structure. And it is not squiggles or simply a bunch of words, even if the single lexeme “silencio” is repeated fourteen times. It is fitting to apprehend and read the whole poem as a word, not a bunch of words.

Accepting this, I would like to offer an interpretation of this poem that may seem perverse, but which I believe shows this poem’s radical versatility: It can be seen in the light of a poetic tradition that long predates concrete poetry. This poem is not only a concrete poem, but also a sonnet. Specifically, I’ll argue that although the repeated word is a Spanish word, it fits into the English-language tradition of the sonnet. Because concrete poetry is a transnational phenomenon and Gomringer writes in English as well as German and Spanish, this disjunction may be less unusual that it otherwise would be.

Consider that the poem consists of fourteen occurrences of “silencio,” which despite their unusual arrangement on the page can be read aloud as fourteen lines. It would be hard not to read them this way.

Because each word is the same, the poem follows the rhyme scheme of a sonnet — any rhyme scheme, including the Petrarchan or Shakespearean in English, including those typical in Spanish.

If some reader finds it impossible for the same line to be repeated fourteen times in a sonnet, I refer this reader to the 2002 “Sonnet” by Terrance Hayes, which consists of fourteen repetitions of the line “We sliced the watermelon into smiles.”

But is it metrical? The word “silencio” pronounced by itself has two metrical feet ( x / | x / ) and is in perfectly regular iambic dimeter. This is also the meter of Elizabeth Bishop’s last poem, “Sonnet,” which begins:

Caught — the bubble
in the spirit level,
a creature divided;
and the compass needle

There’s much more variation in Bishop’s poem, but the metrical regularity of Gomringer’s poem shouldn’t preclude it from being in this particular form. While I don’t have an example of a sonnet with repeated lines (like the one by Hayes) from before 1953, there are earlier sonnets in dimeter, or one, at least: a piece of light verse by Arthur Guiterman, published in The New Yorker on July 7, 1939.

Sonnets can be about anything, although the form does have a heritage. Reading the poem as a sonnet allows us to make a connection to the sonnet tradition if we wish. We can, for instance, ask whether this sonnet has anything to do with love, whether in the most traditional sense of love for a woman or, in John Donne and Herbert’s senses, religious love. Could the silence of this sonnet be that of being understood, and of not needing to say anything aloud?

Seeing this Gomringer poem as a sonnet also allows us to put it into conversation with other one-word texts (those that have several tokens but repeat a single type) that can also be viewed as sonnets, because they have fourteen tokens.

The one I know of, and which fascinates me, is Dance, a typing by Christoper Knowles that I saw contextualized as visual art in his 2015 solo show at the Philadelphia ICA. The page of this work is blank except for a line at the top that repeats the word “DANCE” (in capital letters) fourteen times, with a space between each occurrence. This makes for 83 characters: 5 × 14 = 70 for the word DANCE, plus the 13 spaces that go between each pair of words. While a sheet of paper is typically thought to accommodate 80 typewritten characters across its width, Knowles found that by beginning at the extreme left edge of the page and typing to the extreme right edge, he could fit exactly 83 onto it.

The typing Dance can be read as a sonnet in hemimeter — a term used by George Starbuck for “half-feet,” and associated with light verse. Where “silencio” offers a more static and contemplative structure, I can’t help but imagine Knowles typing DANCE repeatedly, his hands dancing on the typewriter, as he also produced a text that is a score, instructing us to dance. Not so much a structure, it seems to me, but an exhortation and a trace of its making. And, of course, a text that can be read in the sonnet tradition, asking us to consider how dance, repeated, insistent, filling the width of the page completely, relates to love.

A Bit about Alphabit

During Synchrony 2019, on the train from New York City to Montreal, two of us (nom de nom and shifty) wrote a 64 byte Commodore 64 program which ended up in the Old School competition. (It could have also gone into the Nano competition for <=256 byte productions.) Our Alphabit edged out the one other fine entry in Old School, a Sega Genesis production by MopeDude also written on the train.

The small program we wrote is not a conventional or spectacular demo; like almost all of the work by nom de nom, it uses character graphics exclusively. But since we like sizecoding on the Commodore 64, we wanted to explain this small program byte by byte. We hope this explanation will be understandable to interested people who know how to program, even if they may not have much assembly or C64 experience.

To get Alphabit itself, download the program from nickm.com and run it in a C64 emulator or on some hardware Commodore 64. You can see a short video of Alphabit running on Commodore 64 and CRT monitor, for the first few seconds, for purposes of illustration.

              starting here,
              these bytes load
at:     02 08 01 00 00 9E 32 30
$0808   36 31 00 00 00 20 81 FF
$0810   C8 8C 12 D4 8C 14 D4 C8
$0818   8C 20 D0 AD 12 D0 9D F4
$0820   D3 8C 18 D4 D0 F5 8A 8E
$0828   0F D4 AE 1B D4 E0 F0 B0
$0830   F6 9D 90 05 9D 90 D9 AA
$0838   88 D0 E0 E8 E0 1B D0 DB

Load address. Commodore 64 programs (PRG files) have a very simple format: a two-byte load address, least significant byte first, followed by the machine code which will be loaded at that address. So this part of the file says to load at $0802. The BASIC program area begins at $0801, but as explained next, it’s possible to cheat and load the program one byte higher in memory, saving one byte in the PRG file.

BASIC bootloader, $0802–$080c: This program starts with a tiny BASIC program that will run when the user types RUN and presses ENTER. When run, this program, a bootloader, will execute the main machine code. In this case the program is “0 SYS2061” with the line number represented as 00 00, the BASIC keyword SYS represented by a single byte, 9E, and its argument “2061” represented by ASCII-encoded digits: 32 30 36 31. When run, this starts the machine code program at decimal address 2061, which is $080D, the beginning of the next block of bytes.

Advanced note: Normally a BASIC program would need at least one more byte, because two bytes at $0801 and $0802 are needed to declare the “next line number.” You would have to specify where to go after the first line has finished executing. But for our bootloader, any non-null next line number will work as the next line number. Our program is going to run the machine code at $080d (decimal 2061) and then break. So we only need to fulfill one formal requirement: Some nonzero value has to be written to either $0801 or $0802. For our purposes, whatever is already in $0801 can stay there. That’s what allows this program to load at $0802, saving us one byte.

On the 6502: There are three “variables” provided by this processor, the accumulator (a general-purpose register, which can be used with arithmetic operations) and the x and y registers (essentially counters, which can be incremented and decremented).

Initialization, $080d–$081a: This sets up two aspects of the demo, sound and graphics. Actually, after voice 3 is initialized, it is used not only to make sound, but also to generate random numbers for putting characters on screen. This is a special facility of the C64’s sound chip; when voice 3 is set to generate noise, one can also retrieve random numbers from the chip.

The initialization proceeds by clearing the screen using the Kernal’s SCINIT routine. When SCINIT finishes, the y register has $84 in it. It turns out that for our purposes the noise waveform register and the sustain-decay register can both be set to $85, so instead of using two bytes to load a new value into y (ldy #$85), the program can simply increment y (iny), which takes only one byte. After storing $85 in those two registers, the goal is to set the border color to the same as the default screen color, dark blue, $06. Actually any value with 6 for a second hex digit will work, so again the program can increment y to make it $86 and then use this to set the border color. Finally, the y register is going to count down the number of times each letter (A, B, C … until Z) will be written onto the screen. Initially, the program puts ‘A’ on screen $86 times (134 decimal); for every subsequent letter, it puts the letter on screen 256 times — but that comes later. The original assembly for this initialization:
    iny         ; $85 works for the next two...
    sty $d412   ; voice 3 noise waveform
    sty $d414   ; voice 3 SR
    iny         ; $86 works; low nybble needs to be $6
    sty $d020   ; set the border color to dark blue
Each letter loop, first part, $081b–$0826: This loop counts through each of the 26 letters. The top part of the loop has a loop within it in which some of the sound is produced; then there is just a single instruction after that.

Fortunately, the x register already is set up with $01, the screen code of the letter ‘A’, thanks to SCINIT. In this loop, the value of the current raster line (the lowest 8 bits of a 9-bit value, to be precise) is loaded into the accumulator. The next instruction stores that value in a memory location indexed by x; as x increases during the run of the program, this memory location will eventually be mapped to the sound chip registers for voices 1 and 2, starting at $d400, and this will make some sounds. This is what gives some higher-level structure to the sound in the piece, which would otherwise be completely repetitive. After this instruction, however many characters are left to put onto the screen (counting down from 255 to 0) goes into the volume register, which causes the volume to quickly drop and then spike to create a rhythmic effect. With the noise turned on it makes a percussive sound. All of this takes place again and again until that raster line value is 0, which happens twice per frame, 120 times a second.

After all of this, the value in x (which letter, A–Z, is the current one) is transferred into the accumulator, necessary because of how the rest of the outer loop is written. The original assembly for the beginning of the outer loop:
raster:
    lda $d012   ; get raster line (lowest 8 bits)
    sta $d3f4,x ; raster line --> some sound register
    sty $d418   ; # of chars left to write --> volume
    bne raster
    txa
Get random, $0827–$0830: This code does a bit more sound work, using the x register to set the frequency. Since this is the current letter value, it increases throughout the run of the program, and the pitch generally rises. Then, a random value (well, not truly random, but “noisy” and produced by the sound chip’s noise generator) is loaded in that x register, with the program continuing to get the value until it is in the range $00–$ef (decimal 0–239). If the value has to be obtained multiple times, frequency gets set multiple times, too, adding some glitchiness to the sound. Because the random value is bounded, the program will place the characters in a 40 character × 6 line (240 character) region.
random:
    stx $d40f       ; current letter --> freq
    ldx $d41b       ; get random byte from voice 3
    cpx #240
    bcs random
Each letter loop, last part, $0831–$083a: In the bottom part of this loop, the characters are put onto the screen by writing to screen memory and color memory. Screen memory starts at $0400, and $0590 is the starting point of our 6-line rectangle in the middle of the screen. The corresponding point in color memory is $d990. Our current character (A–Z) is in the accumulator at this point, while the x register, used to offset from $0590 and $d990, has a random value. After putting the accumulator’s value (as a letter) into screen memory and (as a color) into color memory, the accumulator is transferred back into the x register, a counter. Then the y register (counting down to 0) is decremented. The program keeps doing this whole process, the “each letter loop,” until y reaches 0.
    sta $0590,x  ; jam the current letter on screen
    sta $d990,x  ; make some colors with the value
    tax
    dey
    bne raster
Outer loop, $083b–$083f: This is the code for counting from 1 to 26, A to Z. Since the x register stores the current letter, it is incremented here. It is compared with decimal 27; if the register has that value, the program is done and it will fall through to whatever is next in memory … probably $00, which will break the program, although anything might be in memory there. It would have been nice to have an explicit brk as part of this PRG, but hey, this is a 64-byte demo with a BASIC bootloader, written one day on a train. If the program has more letters to go through, it branches all the way back up to the beginning of the “each letter loop.”
    inx
    cpx #27     ; have we gotten past ‘Z’?
    bne raster