--- tags: Old Version --- :::info Ch.7: Vocable code (https://gitlab.com/aesthetic-programming/book/-/tree/master/source/7-VocableCode) ::: # Ch.7: 語音程式碼(Vocable Code) ![](https://gitlab.com/aesthetic-programming/book/-/raw/master/source/7-VocableCode/ch7_0.svg) ## setup() 在本章的標題中使用「Vocable Code」旨在確立程式寫作如何不能簡單地化約至它的功能。相反,我們想強調的是,程式碼反映了人類語言先天地在表達言語自身與被詮釋方面的不穩定性。程式碼既是腳本(script)又是效能(performance),從這個意義上說,它總是準備好執行某事:它說它要做什麼,同時也執行。這種與言說的相似性,或者更具體地說,是「言語-行為理論」的類比,在軟體研究中(尤其是在口語程式碼中)得到了很好的建構,並幫助巧妙地展示我們如何用字詞「和」程式碼來做事。[^speech] Using the phase “Vocable Code” for this chapter’s title aims to make explicit how the act of coding cannot simply be reducible to its functional aspects. Rather we would like to emphasize that code mirrors the instability inherent in human language in terms of how it expresses itself, and is interpreted. Code is both script and performance, and in this sense is always ready to do something: it says what it will do, and does it at the same time. This analogy to speech, or more specifically to “speech-act theory” is well established in software studies (not least in Speaking Code) and helps us to neatly demonstrate how we can to do things with words “and” code. 1 的確,如果程式碼有點像說話,那麼它也像詩歌。因為詩歌具有表演性,可以被閱讀和理想地大聲朗讀。[^cox1] 書面程式碼的句法品質與程式碼的執行效能之間有明顯的相似之處。如果我們像讀一首詩一樣大聲朗讀原始碼,這種對比就會變得明顯。一個很好的例子是哲學家 Franco Bifo Berardi,他大聲朗讀了“我愛你”病毒的程式碼,確立弗洛里安·克萊默 (Florian Cramer) 的說法,即計算機病毒可以被認為是一種詩歌形式。[^language] 這個例子更廣泛地引用了藝術家表達語言作為現成物的概念,像是達達主義者們同步朗誦不同語言文本組成的詩歌,藉以表達聲韻的表現性而非字面意義。軟體由語言構成,並通過由原始碼做為符號組成的計算程序進行處理。[^love] 程式碼就像詩歌一樣,也作弄語言的結構,在“聲音”與即將到來的“聲音”之間時序的相互作用。透過連接人類語言和聲音,我們強調所有程式碼的不穩定性以及特定意圖或涵義如何被誤讀和重新解釋。 Indeed, if coding is somewhat like speaking, then it is also like poetry inasmuch as poems operate performatively inasmuch as they can be read and ideally spoken aloud.2 There are clear similarities between the syntactic qualities of written code and the execution of code in its performance. The parallel becomes evident if you read the source code aloud, as if it were a poem. A good example is the philosopher Franco Bifo Berardi who read the code for the “I Love You” virus aloud, enacting Florian Cramer’s claim that the computer virus might be considered to be a form of poetry.3 This example makes broader reference to artists expressing language as found objects, including the Dadaist simultaneous poems which consisted of texts in different languages read aloud at the same time to expose the expressive tonality of the words as opposed to their meaning. Software is constructed from language, and is processed with and via computational procedures consisting of source code as symbols.4 Code is like poetry then, inasmuch as it plays with language’s structures, setting up temporal interplay between the “voice” that is, and the “voice” that is to come. By connecting to human language and the voice, we stress the instability of all codes and how particular intentions or meanings are open to misinterpretation and reinvention. 各種學者和藝術家探索言說與編碼之間的關聯,不僅將程式設計視為生產程式碼與文學混種形式的美學工具,並且尋求兩者之間的物質聯繫和創作張力。[^examples] 由活人身體發出的言語更進一步提醒我們,編碼實踐也有身體,而該編碼只能尤其更為廣泛的基礎架構與製作脈絡來理解(或“poiesis”,如果你願意的話)。在本章中,我們將探討這一思路,以及人類主體的聲音如何在編碼中實踐的方式,以及編碼本身如何替更廣泛的政治問題“發聲”,特別是與性有關的問題。我們將聚焦於孫詠怡製作的軟體藝術作品 Vocable Code,是如何成為與技術和美學品質互動的一種方式。 Various scholars and artists have explored these connections between speaking and coding, not only to consider programming as an aesthetic tool for producing hybrid programming-literary forms, but also to explore the material connections and creative tensions between the two.5 That speech comes from living human bodies further reminds us that coding practices have bodies too, and that coding can only be understood in terms of wider infrastructures, and the context of its making (or “poiesis” if you will). In this chapter we explore this line of thinking, and the ways in which the voice of the human subject is implicated in coding practices, and how coding itself can “voice” wider political issues, particularly concerning sexuality. We will focus on the software artwork Vocable Code made by Winnie Soon, as a means to engage with these technical and aesthetic qualities. ![](https://gitlab.com/aesthetic-programming/book/-/raw/master/source/7-VocableCode/ch7_1.jpg) *圖 7.1:Vocable Code 的現場裝置細節 Figure 7.1: The installation of Vocable Code, detail* ## start() Vocable Code 既是軟體藝術作品(做為藝術的軟體,而不是製作藝術的軟體),也是體現“酷兒程式碼”的“程式碼作品”(原始碼和批判性寫作一起運作)。作品收集以“酷兒是”開頭的句子的聲音和陳述,由重複的文本和聲音組成,並被數學運算上的混亂打斷,創造出動態的藝術作品,藉以探索程式碼、主體性和語言的表現性。在網頁介面背後,程式碼本身是計算機程式設計語言和人類語言的混合體,用以凸顯(非)二元詩歌與酷兒計算機程式碼的背景下在寫作和閱讀之間物質與語言的張力。 [^soon1] Vocable Code is both a work of software art (software as art, not software to make art) and a “codework” (in which the source code and critical writing operate together) to embody “queer code.” Collecting voices and statements that complete the sentence starting with “Queer is,” the work is composed of texts and voices that are repeated, and disrupted by mathematical chaos, to create a dynamic artwork to explore the performativity of code, subjectivity and language. Behind the web interface, the code itself is a mixture of computer programming language and human language, and aims to expose the material and linguistic tensions between writing and reading within the context of (non)binary poetry and queer computer code.6 作品以雙螢幕呈現:一側顯示原始碼(codework),另一側顯示程式碼如何運行和執行的視覺化介面(見圖 7.1 和 7.2)。在這種特殊安排中,原始碼不再像大多數軟體的慣例那樣在用戶前被隱藏,而是完整顯示以破壞程式碼及其結果之間的隱含的層次結構。酷兒程式碼的概念既是工作的主題,也是工作的過程,透過多個層面顯示出來,將軟體及其使用規範的約定俗成「酷兒化」:強調對前端介面的預設值,以及它如何規範地被執行。我們所體驗的是程式碼在人類和非人執行方面的表演特質。當程式碼變得可執行時,它融合了「形式和功能」 [^execute],成為可以讀取、闡釋、執行和呈現效能。我們看到程式碼並聽到參與者的口頭宣示,這些宣示與程式碼一同允許程式與我們對話。 The work is presented in a dual screen format: one side displaying the source code (codework), and the other the visual interface of how the code is run and executed (see Figures 7.1 and 7.2). In this particular arrangement, the source code is no longer, as in the convention of most software, hidden from the user and is instead displayed in full to undermine the implied hierarchy between the source and its results. The notion of queer code is both the subject and the process of the work, and this operates on multiple levels, “queering” what would be considered to be the normative conventions of software and its use: addressing what a front-end interface is expected to be, and how it performs normatively. What we experience are the performative qualities of code in terms of both its human and nonhuman execution. When code becomes executable, it blends “form and function,”7 and becomes something which can be read, interpreted, executed and performed. We see the code and we hear contributor’s spoken statements that, together, allow the program to speak to us. 構建 Vocable Code 的核心方法是使用限制或規則,可以在原始碼以及表達不同韻律和涵義的語句的發音規則中被辨別。[^constraints] 以下是其中一些限制條件: The core method for structuring Vocable Code is the use of constraints or rules. These are discernible in both the source code, as well as the rules for voicing the statements that themselves express different rhythms and meanings.8 Below are some of these constraints: - 編寫原始碼時,不要使用二進制的 0 或 1(例如宣告變數的值)、單個 X 或 Y(例如變數名的常見用法)、單個“>”或“<”運算符(例如,在條件語句中通常使用單個運算符)。 When writing the source code, do not use the binary 0 or 1 (e.g. declaring the value of a variable), a single X or Y (e.g. the common use of variable names), a single operator of “>” or “<” (e.g. the common use of a single operator in a conditional statement). - 編寫原始碼時,請注意變數、陣列和函式的命名。 When writing the source code, be mindful of the naming of variables, arrays, and functions. - 句子對於每個特定的聲音,都以短語開頭:“酷兒是...。” For each specific voice, the sentence starts with the phrase: “Queer is.” - 對於每個特定的聲音,每個句子至少包含一個單詞,總共不超過五個。 For each specific voice, each sentence contains a minimum of one word, but no more than five in total. ## 課堂練習(解碼)Exercise in class (Decode) RunMe, https://dobbeltdagger.net/publication/vocable-code-educational ![](https://gitlab.com/aesthetic-programming/book/-/raw/master/source/7-VocableCode/ch7_6.jpg) *圖 7.2:Vocable Code 的即時編碼/教育版本 Figure 7.2: The live coding/educational version of Vocable Code* **任務 1(解碼文本對象):** Task 1 (Decoding text objects): 查看 Vocable Code 的教育版,並注意右側顯示的動態文本。觀察文本對象的一些特徵: Look at the education version of Vocable Code and focus on the right-hand side with the dynamic text display. Observe some of the characteristics of the text objects: 1. 黑屏/畫布上總是有文字。 There is always text on the black screen/canvas. 2. 文本向上移動,大部分向下移動,但有時也會在兩者之間緩慢擺動。 The text moves upwards and mostly downwards, but also sometimes slowly oscillates between the two. 3. 隨著時間的推移,文字逐漸消失。 The text fades over time. 4. 文字大小不一。 The text varies in size. 5. 部分文本內容重疊,至少有十個不同或獨特的文本。 Some of the text’s content overlaps, but there are at least ten different or unique texts. 6. 對於螢幕上顯示的每批新文本,都可以聽到一個語音說出其中一個文本。 For each new batch of text shown on screen, you can hear a voice speaking one of the texts. 7. 螢幕上同時出現的文本有最大限制。 (與之前的物件導向方法類似,如果滿足某些條件,文本會在螢幕上連續生成。) There is a maximum limit of the text appearing simultaneously on screen. (Similar to the previous object-oriented approach, the text is continuously generated on screen if certain conditions are met.) 8. 你能繼續這個名單嗎? Can you continue the list? *Vocable Code* 程式使用物件導向的程式設計來構造類別和文本對象。回想一下我們在上一章學到的東西,並且不看原始碼: The Vocable Code program uses object-oriented programming to construct the class and the text objects. Recall what we learnt in the previous chapter, and without looking at the source code: 1. 在文本上描述類的屬性和方法?Describe the properties and methods of the class on text? 2. 解讀創建/刪除(新)文本對象的時間和方式? Decode when and how (new) text objects are created/removed? **任務 2(推測和映射):** Task 2 (Speculation and Mapping): 根據所見所聞,程式中還實現了哪些其他功能/特性,尤其是與文本和語音相關,可以描述一下嗎? Based on what you see and hear, what are the other functions/features that have been implemented in the program, especially in relation to text and voice, and can you describe them? 現在查看原始碼,特別是類別對象塊`function notNew(getQueer){}`。能否將原始碼映射到之前對文本物件的描述? Now look at the source code particularly the class-object block `function notNew(getQueer){}`. Can you map the source code to your earlier description of text objects? **任務 3(思考):** Task 3 (Thinking): 通過閱讀原始碼,可能會發現某些程式風格與我們目前所學的不同,例如`notTrue` 和 `notFalse` 的布林邏輯而非「True/False」,使用可重複小數,使用函式 `abs`,以及使用帶有回調的 `loadSound` 代替預先加載函式`preload`,等等。 By reading the source code, you might discover that some of the coding styles are different from what we have learnt thus far, e.g. the Boolean logic of notTrue and notFalse instead of “True/False,” the use of repeatable decimals, the use of the function abs, as well as the use of loadSound with a callback instead of the preload function, and so on. 1. 可以看出不同的風格嗎? Can you spot the different styles? 2. 可以大聲朗誦這些程式碼嗎? Can you read these blocks of code aloud? 3. 在指定的閱讀中,這些表現性和表演性如何?[^cox2] 你能用 Vocable Code 做為例子來描述和闡明這些品質嗎? How are these expressive and performative qualities described in the assigned reading?9 Can you describe and articulate these qualities using Vocable Code as an example? ## 文本性 Textuality 在 *Vocable Code* 中,語音和文本是相互關聯的。該程式一次僅選擇一個文本進行朗讀/播放,而其他文本則動態顯示在螢幕上。你可以探索單詞的涵義,但它們的位置和其他設計屬性會進一步改變您感知和闡釋語句的方式。這些是隨機地被選擇、呈現、播放和朗讀,同時以數學亂數進一步打亂。 In *Vocable Code*, both voice and text are interlinked. The program picks only one selected text to speak/play at a time, whilst others are displayed dynamically on screen. You can explore the meaning of the words, but their placement and other design attributes further change the way you perceive and interpret the statements. These are selected, presented, played, and spoken randomly, and at the same time further disrupted by mathematical chaos. 這是工作中使用的與文本相關的語法(程式碼片段): Here is the text-related syntax (code snippets) that has been used in the work: ```javascript let withPride; //字型 function preload() { withPride = loadFont('Gilbert_TypeWithPride.otf'); } … function notNew(getQueer){ this.size = random(20.34387, 35.34387); this.time = random(2.34387, 4.34387); this.yyyyy = random(height/3.0, height+10.3437); this.xxxxx = width/2.0; this.gradient = 240.0; } … this.acts = function() { textFont(withPride); textSize(this.size); textAlign(CENTER); this.gradient-=0.5; noStroke(); fill(this.gradient); text(getQueer, this.xxxxx, this.yyyyy); } ``` ### 字體 Type `loadFont`(在第 4 行)支援 opentype 字體樣式(.otf 和 .ttf)並透過上面的 `withPride` 回傳一個 PFont 物件。 loadFont (in Line 4) supports opentype font style (.otf and .ttf) and returns a PFont object through withPride above. 「Gilbert_TypeWithPride.otf」是在知識共享署名-相同方式共享 4.0 國際許可下獲得許可的免費字體,可以從網路下載 [^font] (www.typewithpride.com) 。旨在紀念 2017 年去世的標誌性彩虹旗的創造者吉爾伯特貝克。 “Gilbert_TypeWithPride.otf” is a free font licensed under a Creative Commons Attribution-ShareAlike 4.0 International License, and can be downloaded from the Internet10 (www.typewithpride.com). It is designed to honor the memory of Gilbert Baker the creator of the iconic Rainbow Flag who died in 2017. ![](https://gitlab.com/aesthetic-programming/book/-/raw/master/source/7-VocableCode/ch7_2.jpg) *圖 7.3:帶有 Pride 的字體類型。圖片來自 https://www.typewithpride.com/ Figure 7.3: The font Type with Pride. Image from https://www.typewithpride.com/* `textFont()`(在第 16 行)表示準備好打印出或使用所選字體寫入文本,在這種情況下,之前是通過回傳的 PFont 對象 withPride 定義的。 textFont() (in Line 16) means to get ready to print out or write the text with the chosen font, and in this case was previously defined through the returned PFont object withPride. `textSize()`(在第 17 行)設置要使用的字體大小。對於此草圖,採用 20.34387 和 35.34387 之間的隨機值。 textSize() (in Line 17) sets the font size for use. For this sketch it takes a random value between 20.34387 and 35.34387. `textAlign()`(在第 18 行)採用水平對齊的第一個參數。它包含選項 LEFT、RIGHT 和 CENTER。句子的長度根據使用的單詞數量而變化。在 Vocable Code 中,無論句子的長度如何,文本都居中對齊。 textAlign() (in Line 18) takes the first argument for the horizontal alignment. It contains the options LEFT, RIGHT and CENTER. The length of sentences varies according to the number of words used. In Vocable Code, the text is aligned CENTER regardless of the sentence’s length. `noStroke()` 和 `fill()`(在第 20-21 行)對形狀做類似的處理。前者禁用繪製筆觸(輪廓),而後者設置文本顏色。 `fill()` 接受 RGB 值以及其他顏色格式。 noStroke() and fill() (in Lines 20-21) do similar things for shapes. The former disables drawing the stroke (outline), while the latter sets the text color. fill() accepts RGB values as well as other color formats. `text()`(在第 22 行)在螢幕上用特定的詞和位置(文本的水平和垂直協調)繪製文本,例如`text(getQueer,this.xxxxx,this.yyyyy);` text() (in Line 22) draws the text on screen with specific words and in positions (both horizontal and vertical coordination of the text), e.g. text(getQueer, this.xxxxx, this.yyyyy); ## 條件結構 Conditional structure *Vocable Code* 中使用了各式的 `if` 語句。 Different if statements are implemented in Vocable Code. 關於第一個條件結構的程式碼片段: The snippets of code concerning the first conditional structure: ```javascript= if (queers[WhoIsQueer].myStatement == "null" || makingStatements == int(2.34387)) { queerRights.push(new notNew(queers[WhoIsQueer].yourStatement)); makingStatements = 2.0; }else{ queerRights.push(new notNew(queers[WhoIsQueer].myStatement)); } ``` 第一個語句使用稱為 **OR** (`||`) 的關係運算來檢查兩個條件(關係運算的完整列表在第 2 章「變數幾何」的「關係運算」一節中介紹)。 如果兩者之一為真,程式將執行接下來的兩行程式碼(參見第 3-4 行)。當然,這兩個條件有可能都不成立,在這種情況下,將會執行 `else` 後的程式碼。以上程式碼片段決定哪個新文字物件該顯示。因為每個人只能提供兩個口頭/文字語句,而有些人可能已經提供了一個,因此,需要實作一些檢查邏輯才能顯示文字。 The first statement uses the relational operator called OR (||) to check against the two conditions (the full list of relational operations is covered in the section of “Relational operations” in Chapter 2, “Variable geometry”). If either of the two is true the program will execute the next two lines of code (see Lines 3-4). Naturally, the two conditions might not be met, and, in that case, else is used. This block of code determines which new text object should be selected for display as each person can only contribute two spoken/text statements, and some may have provided one. As such, some checking logic needs to be implemented in order to display the text. 關於第二個條件結構的程式碼片段: Snippets of code concerning the second conditional structure: ```javascript if (gender == abs(2)) { //which statement to speak - ref the json file SpeakingCode(queers[WhoIsQueer].iam, makingStatements); } ``` 第二個程式碼片段只使用`if`語句,這意味著它會在條件滿足時運行`SpeakingCode`函式。它不會有替代路徑,意味著程式將退出條件結構,直接從右大括號後繼續執行。 The second one only uses the if statement and that means it will run the function SpeakingCode when the condition is met and it won’t have an alternative route, meaning that the program will just exit the conditional structure, and continue the execution after the closing curly bracket. 第二個條件結構是關於確定要大聲朗讀的文本。每一批新的文本包含兩到四個文本(參見後面完整原始碼中的第 19 行),程式選擇第三個(知道陣列以 [0] 索引開始並指向第三項,當索引為是 [2])。程式將根據選擇的文本播放相應的語音文件。 `abs` 是來自 p5 的語法和函式,它計算一個數字的“絕對”值並且只返回一個正值。 The second conditional structure is about identifying which text to speak aloud. Every new batch of text contains between two and four texts (see Line 19 in the later full source code), and the program picks the third one (knowing that an array starts with [0] index and points to the third item when the index is [2]). Based on the selected text, the program will play the corresponding voice file. abs is a syntax and function from p5 which calculates the “absolute” value of a number and only returns a positive value. 當然,選定的程式碼是專門圍繞在更為廣泛關於性別和性認同的政治問題構建的,並試圖表達關於酷兒程式碼的想法。大聲朗讀,程式碼塊可能翻譯為:“如果性別等於絕對的二元,說程式碼,酷兒,誰是酷兒,我正在,發表宣示。”從技術上講,使用 `abs` 函式是不必要的,也可以寫成另一個陣列的索引來選擇。程式碼是由語言構成的,並且可以富有詩意。程式設計師可以操弄結構、試驗符號和句法邏輯。由於 Vocable Code 也被認為是程式碼作品或程式詩,它邀請觀眾和機器大聲(並自豪地)朗誦出程式碼。 Of course, the selected line of code is specifically structured around wider political issues concerning gender and sexuality, and attempts to express ideas about queering code. Read aloud, the block of code might translate as: “If gender equals absolute two, speaking code, queers, who is queer, I am, making statements.” Technically speaking, using the abs function is unnecessary and it could be also written to select another array’s index. Code is constructed from language and can be poetic as the programmer can play with the structure, and experiment with symbols, and the syntactic logic. Since Vocable Code is also considered to be codework or code poetry, it invites both the audience and the machine to speak the code aloud (and proud). 關於第三個條件結構的程式碼片段: Snippets of code concerning the third conditional structure: ``` javascript function draw() { … if (support == "notFalse") { queerRights.splice(non_binary, int(1.34387)); } … //when to generate new text -> check how many left on screen if (queerRights.length <= 2.0) { makeVisible(); } } ``` 函式 `draw()` 中有兩個條件語句。 第一個 if 語句檢查畫布外的文本。這必須連續完成,因為螢幕外的文本事件(物件)將被刪除(使用`splice`函數)以避免不需要的元素/物件繼續存在於程式中(就像第 6 章「物件抽象化」中的吃豆腐遊戲一樣)。 第二個 if 語句檢查螢幕上剩餘的文本數量。 如果螢幕包含少於或等於兩個文本,那麼它將使用函式 `makeVisible()` 生成新文本。 There are two conditional statements in the function draw(). The first if-statement checks for texts that are off canvas. This has to be done continuously because the off-screen text instances (objects) will be removed (using splice) to avoid unwanted elements/objects continuing to exist in the program (as was the case with the Eating-tofu game in Chapter 6, “Object abstraction”). The second if-statement checks how many texts remain on screen. If the screen contains less than or equal to two texts, then it will generate new texts with the function makeVisible(). 關於第四個條件結構的程式碼片段: Snippets of code concerning the fourth conditional structure: ```javascript //檢查消失的物件 this.shows = function() { let status; if (this.yyyyy <= 4.34387 || this.yyyyy >= height+10.34387) { status = "notFalse"; } else { status = "notTrue"; } return status; }; ``` 最後一個“if-else”條件結構在類別方法中設置,並檢查文本是否在畫布之外,特別是沿 y 軸。在類別方法 `this.shows=function()` 中,條件語句包含關係運算符“OR”(`||`),其中兩個條件都不需要為“真”(`if (this.yyyyy <= 4.34387 || this. yyyyy >= height+10.34387)`)。此外,還有一個 `else` 語句來處理檢查條件是否滿足的結果(見第 6 行)。因此,它被讀取,就好像兩個條件之一已經滿足,變數`status` 將被分配為 `notFalse`(這意味著文本在頂部或底部的螢幕外),否則如果文本仍然保留在螢幕上,變數`status` 將被分配為 `notTrue`。值 `notFalse` 和 `notTrue` 屬於字串類型的狀態變數。然而,在一般的程式設計實踐中,布林邏輯(具有“布林”類型)往往被理解為“真”或“假”的絕對二元現實。最初,這似乎是計算邏輯的基礎,並且可以減少訊息量將其與機器語言的零和一聯繫起來。然而,概念上可以以解釋為,`notFalse` 和 `notTrue` 暗示摧毀二元關係。 The last “if-else” conditional structure is set within the class method, and checks if the text is off canvas, particularly along the y-axis. Within the class’s method this.shows=function(), the conditional statement incorporates the relational operator “OR” (||), in which neither condition needs to be “true” (if (this.yyyyy <= 4.34387 || this.yyyyy >= height+10.34387)). Additionally, there is also an else statement to handle the results of checking whether the conditions have been met (see Line 6). Therefore, it is read as if either one of the two conditions has been met, the variable status will be assigned as notFalse (this means the text is off screen at the top or bottom), and else if the text still remains on screen, the variable status will be assigned as notTrue. The values notFalse and notTrue belong to the status variable of the “String” type. However, in general programming practice, Boolean logic (with the “Boolean” type) tends to be understood as an absolute binary reality of “true” or “false.” Initially, this seems fundamental to computational logic and can be relate this to the zeros and ones to which information is reduced in machine code. However, arguably and conceptually, notFalse and notTrue suggest an undoing of binary relations. ## JSON 除了核心原始碼之外,*Vocable Code* 還利用一個(JSON 格式的)純文字檔案來存儲來自所有語音捐贈者的數據,包括他們的書面宣言(參見下面的 JSON 檔案片段)。 使用 JSON(JavaScript 物件表示法),允許透過 JSON 檔案更新數據,而無需更動 JavaScript 原始碼。 Beyond the core source code, Vocable Code utilizes a text-based file (in JSON format) to store the data from all voice donors, including their written statements (see below snippets of the JSON file). Using JSON (Javascript Object Notation), allows all the data in a JSON file to be updated without changing anything at JavaScript source code level. JSON 檔案的片段: Snippets of the JSON file: ``` json { "description": "This file contains the meta data of queer text", "condition": "yourStatement cannot be null", "copyLeft": "Creative Common Licence BY 4.0", "lastUpdate": "Apr, 2019", "queers": [ { "iam": "WinnieSoon", "yourStatement": "not fixed not null", "myStatement": "not null not closed" },{ "iam": "GeoffCox", "yourStatement": "queer and that means queer", "myStatement": "null" },{ "iam": "GoogleAlgorithm", "yourStatement": "not a manifesto", "myStatement": "here" } } ``` JSON 是一種開放標準的獨立檔案格式,廣泛用於網際網路與軟體應用中的數據存儲和通訊。這種格式可以被許多程式設計語言(例如 JavaScript)讀取和處理。一個軟體可以使用計算邏輯來操作數據,例如檢索與以任何顏色、大小和速度在螢幕上顯示數據。這種數據和計算邏輯的分離在軟體開發中很常見。例如,谷歌使用其應用程式程式設計介面 (API) 以 JSON 格式提供網絡或圖像搜索結果。下一章將詳細介紹 API。 JSON is an open-standard, independent file format, which is widely used for data storage and communication on the internet, and in software applications. This format can be read and processed by many programming languages such as JavaScript. A piece of software implements computational logic to manipulate data, such as retrieving and displaying data on a screen in any color, size, and at any tempo. This kind of separation of data and computational logic is common in software development. Google, for example, offers its web or image search results in JSON format using its Application Programming Interfaces (APIs). More on APIs in the next chapter. JSON 在矩陣和物件的使用方面與 JavaScript 相似,但它們的格式不同。其中的一些規則是: JSON looks similar to JavaScript in terms of its use of arrays and objects, but they are formatted differently. Some of the rules are: * 數據以名稱/值配對儲存,例如 `"copyLeft": "Creative Common License BY 4.0"` ,用冒號分隔。 Data is stored in name/value pairs, e.g. "copyLeft": "Creative Common Licence BY 4.0" and the pair are separated by a colon. * 所有屬性名稱/值配對都必須用雙引號括起來。 All property name/value pairs have to be surrounded by double quotes. * 每個數據項用逗號分隔。 Each data item is separated by commas. * 方括號“[]”保存陣列。 Square brackets “[]” hold arrays. * 花括號“{}”保存物件。因為有許多共享相同結構的物件事件。 Curly braces “{}” hold objects as there are many object instances that share the same structure. * 不允許使用註解功能。 Comments are not allowed. * 不能使用其他計算邏輯,如條件結構或 for 迴圈。 No other computational logics like conditional structures or for-loop can be used. 要處理 JSON 文件,您需要使用 p5.js 中的語法 `loadJSON()`。 看看下面的快速示範: To process the JSON file, you need to use the syntax loadJSON() in p5.js. See how this is put together in a sketch: **第一步:loadJSON(加載具體文件和路徑) Step 1: loadJSON (to load the specific file and path)** ```javascript let whatisQueer; function preload() { whatisQueer = loadJSON('voices.json'); } ``` **第 2 步:處理 JSON 文件(部分段落) Step 2: Process the JSON file (selected lines)** ```javascript function makeVisible() { //get the json txt queers = whatisQueer.queers; //which statement to speak - ref the json file SpeakingCode(queers[WhoIsQueer].iam, makingStatements); } ``` ![](https://gitlab.com/aesthetic-programming/book/-/raw/master/source/7-VocableCode/ch7_4.png) *圖 7.4:有關讀取 JSON 的 Vocable 程式碼片段 Figure 7.4: Snippets of Vocable Code concerning reading JSON* 加載 JSON 文件 `voices.json` 後,程式(參見圖 7.4)指向 `queers` 陣列並從隨機選擇的可能語句中查找名稱/值配對 `iam` 和 `MakingStatements` 進行呼叫(在 `yourStatement` 和 `myStatement` 中)。 最後,調用函式`SpeakingCode`。 圖 7.4 說明了原始碼(左側)和 JSON 文件(右側)之間的通訊,傳遞數據(在 JSON 文件和程式之間)以便它可以顯示在螢幕上。 After loading the JSON file voices.json the program (see Figure 7.4) then points at the queers array and looks for the name/value pairs iam and makingStatements from the randomly selected possible statements to call (among yourStatement and myStatement). Lastly, the function SpeakingCode is called. Figure 7.4 illustrates how communication is affected between the source code (on the left) and the JSON file (on the right), passing the data (between the JSON file and the program) so it can be displayed on screen. **步驟 3. 定位並加載聲音文件 Step 3. Locating and loading the sound file** ```javascript= //應載入與播放哪個聲音 which voice to speak and load the voice function SpeakingCode(iam, makingStatements) { let getVoice = "voices/" + iam + makingStatements + ".wav"; speak = loadSound(getVoice, speakingNow); } ``` **步驟 4. 播放聲音文件 Step 4. Play the sound file** ```javascript= function speakingNow() { speak.play(); } ``` 所有的語音文件都以“wav”聲音文件格式存儲。這些文件是根據 JSON 文件中的字段 `iam` 之後的值命名的。通過這種方式,我們可以使用運算符 + 的鏈接或“連接”(以程式設計術語來說)所有片段,以便檢索和播放特定的語音文件: `let getVoice = "voices/" + iam + MakingStatements + ".wav ";` (請參閱第 3 步中的第 3 行)。如上所述,選擇的語音與螢幕上的文本同步。 All the voice files are stored in the “wav” sound file format. The files are named according to a specific convention that follows the field iam in the JSON file. In this way, we can link, or “concatenate” (in programming terms), all the pieces using the operator + so the specific voice file is retrieved and played: let getVoice = "voices/" + iam + makingStatements + ".wav"; (see Line 3 in Step 3). As discussed above, the voice selected is synchronized with the text on screen. p5.sound 函式庫,使用網路語音功能擴展 p5 以處理聲音檔,或者在我們的範例中是用以播放語音文件。在許多聲音相關的功能中,例如從聲音輸入輸入中捕獲/收聽(正如我們在第 4 章「數據採集」中所演示的),我們在這裡只需要讀取和播放聲音文件的方法。為此,在呼叫函式 `speak.play()` 之前,將 `loadSound()` 回傳以確保聲音檔案完全讀取(這需要時間,因為涉及檔案大小、記憶體容量和硬體)(請參閱行步驟 4 中的 2)。 There is a p5.sound library which extends p5 with web audio functionality to deal with sound, or, in this case, to play a voice file. Among many sound-related functions like capturing/listening from an audio input (as we have demonstrated in Chapter 4, “Data capture”), we simply need methods to load and play the sound files. To do so, loadSound() is used as a callback to make sure the sound is fully loaded (it takes time as it also involves file size issues, memory, and hardware) before the function speak.play() is invoked (see Line 2 in Step 4). `loadSound()` 可以在 `Preload()` 函式中使用,可以提前讀取指定路徑的檔案的路徑。然而,*Vocable Code* 背後的想法更富有詩意,保持 JavaScript 原始碼做為核心語料庫是概念的一部分。該程式沒有使用 `Preload()`,而是使用「回呼函式」[^callback] 來加載聲音檔,這可能不是最有效的方式,有可能在動態讀取檔案時引發緩衝問題。但是這種處理程式碼的方式啟動對語言結構的思考,即時與重複讀取和播放/朗讀文件/語音意味著什麼,以及觸發哪些不穩定的形式表達。 loadSound() can be used in the Preload() function where files can be loaded in advance by specifying the files’ paths. However, the idea behind Vocable Code is more poetic, and keeping the JavaScript source code as the core corpus is part of the concept. Instead of using Preload(), the program uses the “callback function”11 to load the sound which might not be the most efficient way as it incurs buffering problems while loading the files on-the-fly. But this way of working with code opens up thinking about language structures, what it means to load, and play/speak the files/voices in real-time and repeatedly, and which forms of instability of expression are invoked. ## 原始碼 Source code ```javascript= // CC BY 4.0 - https://creativecommons.org/licenses/by/4.0/ let withPride; //font let whatisQueer; let queerRights = []; let makingStatements; let speak; let voices = []; let queers = []; function preload() { withPride = loadFont('Gilbert_TypeWithPride.otf'); //only works on old p5.js whatisQueer = loadJSON('voices.json'); } //creation of text, which text and which voice to speak function makeVisible() { //get the json txt queers = whatisQueer.queers; //add no. of statements on screen let addQueers = int(random(2.34387, 4.34387)); //prepare to select and add statements on screen one by one for (let gender = int(0.34387); gender <= addQueers; gender++) { //select 1 from the json list let WhoIsQueer = int(random(queers.length)); makingStatements = int(random(2.34387, 3.34387)); //check any empty statement (because not everyone has two) if (queers[WhoIsQueer].myStatement == "null" || makingStatements == int(2.34387)) { queerRights.push(new notNew(queers[WhoIsQueer].yourStatement)); makingStatements = 2.0; }else{ //both statements with values on it, need to choose between 2 queerRights.push(new notNew(queers[WhoIsQueer].myStatement)); } //each batch of adding new text will only select the first voice to speak if (gender == abs(2)) { //which statement to speak - ref the json file SpeakingCode(queers[WhoIsQueer].iam, makingStatements); } } } //which voice to speak and load the voice function SpeakingCode(iam, makingStatements) { let getVoice = "voices/" + iam + makingStatements + ".wav"; speak = loadSound(getVoice, speakingNow); } function speakingNow() { speak.play(); } function setup() { createCanvas(windowWidth, windowHeight); } function draw() { background(2.34387); //movement and display of text for (let non_binary in queerRights) { queerRights[non_binary].worldWide(); queerRights[non_binary].acts(); //check off canvas text and delete objects let support = queerRights[non_binary].shows(); if (support == "notFalse") { queerRights.splice(non_binary, int(1.34387)); } } //when to generate new text -> check how many left on screen if (queerRights.length <= 2.0) { makeVisible(); } } //for every creation of new text (class-object) function notNew(getQueer) { //attributes of text this.size = random(20.34387, 35.34387); this.time = random(2.34387, 4.34387); this.yyyyy = random(height/3.0, height+10.3437); this.xxxxx = width/2.0; this.gradient = 240.0; this.worldWide = function() { this.yyyyy -= this.time; this.time += sin(radians((frameCount%360.0)*this.time)) - 0.009; }; this.acts = function() { textFont(withPride); textSize(this.size); textAlign(CENTER); this.gradient-=0.5; noStroke(); fill(this.gradient); text(getQueer, this.xxxxx, this.yyyyy); }; //check disappeared objects this.shows = function() { let status; if (this.yyyyy <= 4.34387 || this.yyyyy >= height+10.34387){ status = "notFalse"; } else { status = "notTrue"; } return status; }; } ``` ### 課堂練習 Exercise in class 1. 組成一個工作小組。 Work as a group. 2. 下載整個 Vocable Code 程式( https://gitlab.com/aesthetic-programming/book/-/tree/master/public/p5_SampleCode/ch7_VocableCode )並在自己的電腦上運行它。 Download the whole Vocable Code program ( https://gitlab.com/aesthetic-programming/book/-/tree/master/public/p5_SampleCode/ch7_VocableCode ), and run it on your own computer. 3. 簡要地討論各種運算結構和語法以暸解一般情況下的工作原理,然後針對語音檔案命名與 JSON 檔案結構之間的關係進行檢查。 Briefly discuss the various computational structures and syntax to understand how things generally work, then specifically examine the relationship between voice file naming and the JSON file structure. 4. 按照說明用電腦或手機錄製自己的聲音。 (程式只接受 .wav 文件格式) Follow the instructions and record your own voice with your computer or mobile phone. (The program only accepts the .wav file format) * 找一張白紙,準備寫一個句子。 Find a blank sheet of paper and prepare to write a sentence. * 用給定的起始詞完成句子:“Queer is。” Complete the sentence with the starting given words: “Queer is.” * 每個句子包含不超過 5 個單字(不包含開始的兩個單字“queer is”)。只加一個單字也可以。 Each sentence contains no more than 5 words (the first words “queer is” don’t count). It is ok to add just one word. * 最多產生兩個句子/聲音。 Produce a maximum of two sentences/voices. * 在智慧型手機上下載/找到錄音應用程式(例如 Android 上的 Voice Recorder 或 iOS 上的 Voice Memos)。Download/locate a voice recording app on your smartphone (e.g. Voice Recorder on Android or Voice Memos on iOS). * 試著找一個安靜的環境,錄下你的聲音,看看應用程式是否有效(控制錄音的開始和結束)。 Try to find a quiet environment, record your voice, and see if the app works (controlling the start and end the recording). * 準備記錄自己寫下的句子。 Prepare to record yourself reading your written sentence(s). * 可以自行決定時間和節奏。 You may decide the temporality and rhythm. * 可以用不同的語調說出完整的單字或完整的句子。 You may either speak the full word or full sentence with different intonation. * 錄製聲音,然後將錄音轉換為 .wav 文件。 Audacity 是可以做到這一點的一款免費軟體。 Record your voice, then convert the recording into a .wav file. Audacity is an example of free software that can do so. 5. 將聲音檔儲存,更新 JSON 檔案,並且將聲音檔放在 voices 資料夾中。更新程式,看看在聲音中能不能聽到自己的聲音。 Add your voice/s and update the JSON file and put your voice files in the voices folder. Refresh the program and see if you can hear your own voice among the voices. 6. 進階:嘗試修改文本呈現,例如它的顏色或其動畫行為。 Advanced: Try to change the text presentation, e.g. its color or its animated behavior. 7. 討論酷兒程式碼的不同層面的批判與美學。 Discuss the different critical and aesthetic aspects of queer code. ## While() 像 JavaScript 這樣的進階程式設計語言中,原始碼向機器發送指令以及與人類溝通。透過這種方式,編寫原始碼不僅僅涉及使用指示和符號,包括語義上和句法上的,同時也橫跨程式設計和自然語言的運用。除了前面提到的作為詩歌的潛力之外,還有其他介入語言的可能。黃凌東開發了一種基於文言文的相對冷僻的程式設計語言“文言朗”,謹遵中國古典文學的語法和語氣。[^Wenyan] 使用指示和符號,同時結合形式邏輯和詩意表達是理解語音程式碼的雙重邏輯的關鍵。 In high-level programming languages like JavaScript, the source code sends both instructions to machines as well as communicating with humans. In this way, writing source code involves the use of signs and symbols, both semantics and syntactics, and operates across both programming and natural languages. Beyond the potential for poetry previously mentioned, there are other possible interventions. Lingdong Huang has developed an esoteric programming language based on ancient Chinese called “wenyan-lang,” that closely follows the grammar and tone of classical Chinese literature.12 Using signs and symbols as well as combining formal logic and poetic expression are the starting points for understanding the double logic of vocable code. 正如我們之前所提,抽象化是軟體開發的一個關鍵基本概念,它不同於機器操作,因此注重將抽象化作為物件處理。使用類別/物件結構(文本做為物件事件)、條件結構、程序和子例程是呈現和執行原始碼的一些方式,像是 for 迴圈。然而,在機器執行的上下文中,變數名稱與語義層之間的關係被剝離,迴避掉這種人類可讀的信息。這種“二級標記”除了內存大小之外不會影響程式的執行,提供了其他潛在用途。[^Andersen] 因此,選擇有意義的標記名稱更多的是為了表達和交流的目的,如上例清楚地表明。這是我們聽到程式設計師聲音的地方。 As we learnt previously, abstraction is a concept fundamental to software development, which differs from machine operations, thereby focusing on building abstractions as objects. The use of class/object structures (text as object instances), conditional structures, procedures, and subroutines, such as the for-loop, are some of the ways of presenting and executing the source code. However, in the context of machine execution, variable names — the semantic layer — are stripped away and this human-readable information is avoided. This “secondary notation” does not affect the execution of the program apart from memory size, but does provide other potential uses.13 In this way, choosing meaningful identifier names is more for the purpose of expression and communication, as the example above clearly demonstrates. This is where we hear the programmer’s voice. 此外,考量原始碼對於理解軟體操作的重要性時,重要的是要認識到原始碼並沒有顯示機器如何使用RAM(例如儲存、讀取、新增和停止操作),如何運行將符號操作轉換為實際位址,或者如何像低階程式設計語言那樣公開操作序列。原始僅僅描述可以聽到/看到的內容,但不能促進有關機器如何運行原始碼等其他形式的知識。具體來說,*語音程式碼* 並排顯示兩個界面。一個顯示原始碼,另一個顯示執行時會發生什麼,但兩者之間存在著斷裂,你看到的並不是它的實際運行方式。或許可以從以下兩種方式來理解。 Furthermore, when thinking about the importance of source code for understanding the operations of software, it is important to recognize that source code does not show how a machine operates with physical memory (such as store, load, add and halt actions), how it translates symbolic actions into real addresses, or how it discloses operation sequences as low-level programming languages would do. The point is the source code only describes what might be visible to hear/see, but it does not facilitate other forms of knowledge about how a machine operates from the source code. To be specific, Vocable Code displays the two interfaces side by side. One displays the source code, the other what happens when it is executed, but there is a discrepancy as what you see is not literally how it operates. This could perhaps be understood in two ways, as follows. 首先,原始碼是被呈現的,但是原始碼到機器程式碼的轉換過程仍然是隱藏的,而且並非所有的命令都被執行。全喜卿將此過程稱為“魔法”,並且將問題歸結為:“高階程式設計語言——或者說自動化程式設計——可能替程式設計師提供了更多、更容易的控制,但它們也需要對實際運作進行更多的黑盒處理。[^Chun] 因此,我們需要對原始碼實際上按照它所說的執行這一宣示進行細緻的分析。當人們談論原始碼時,它的表現與機器的表現不同。然而,更準確地說,人類也是如此,面相和行動之間也有界面和轉換。 Firstly, the source code is made available, but the process of translation from source code to machine code is still hidden, and not all the lines are executed. Wendy Hui Kyong Chun refers to this as a process of “sorcery” and summarizes the problem: “Higher level programming languages — automatic programming — may have been sold as offering the programmer more and easier control, but they also necessitated blackboxing even more the operations of the machine they supposedly instructed.”14 Accordingly, we would need to nuance the statement that source code actually does what it says. When one speaks the source code, it performs differently than how a machine performs. Yet it should be said that this is the case with humans too in that there is also an interface and translation between physiognomy and action. 其次,原始碼的執行結果(通常透過螢幕呈現),應該被視為原始碼的譯文而不是原始碼本身。這正是「所見即所得」的介面原則(WYSIWYG, what-you-see-is-what-what-you-get)。在 *Vocable Code* 中,移動文本只是原始碼運行結果的一部分,並不能完全捕捉其操作的複雜性。通過這種方式,藝術作品可能會挑戰通常的、突出的前端界面和從一個來源到另一個來源的意義傳遞,通過向前端和後端發出聲音,甚至是奇怪的分界。這破壞了狀態之間的任何二元關係以及因果的層次邏輯,在這方面,我們會援引 Karen Barad 和她的斷言,即因果關係通過「內動化成」(酷兒的因果關係)起作用。[^Barad] Secondly, source code and its execution, usually in the form of screen interface, should be considered as translations rather than equivalents of each other, and this points to the veracity of the interface-principle WYSIWYG (what-you-see-is-what-you-get). In Vocable Code, the moving text is only part of the result of the source code running, and is not able to fully capture the complexity of its operations. In this way, the artwork perhaps challenges the usual, prominent front-end interfaces and the transmission of meaning from one source to another by giving voice to both the front and back ends, or even queering the demarcation. This undermines any binary relation between states and the hierarchical logic of cause and effect, and in this respect we would invoke Karen Barad and her assertion that causes and effects work through “intra-actions” (queering causality).15 *Vocable Code* 與身體實踐、表達某事的行為以及聲音如何與政治實踐產生共鳴有直接關係。程式或程式設計師的聲音以及人類的聲音與其他社會機構相結合,產生超越簡單表示或解釋的意義。換句話說,計算不能被簡化為輸入和輸出的簡單形式邏輯,也不能簡單地將說話機器與說話人並列在一起,因為它們顯然更加糾纏不清。[^entangle] 人類不會單獨說話,因為也有非人類行為者例如變數、參數、原始碼和機器程式碼也會說話——舉個例子,帶有函式 `speak.play()` 的聲音庫加入了合唱團。這是有政治原因的,因為有些聲音比其他聲音大,有些則被邊緣化或完全壓制。在執行函式`SpeakingCode(iam,makingStatements)` 時,我們詢問誰在說話,對誰說話,在什麼條件下說話?我們想讓這些關係變得更奇怪。 Vocable Code has a direct relation to bodily practices, the act of voicing something, and how the voice resonates with political practices. The voices of the program or programmer, and humans voices, combine with other social bodies in producing meaning that goes beyond simple representation or interpretation. In other words, computation cannot be just reduced to the simplistic formal logic of input and output, and nor can speaking machines simply be juxtaposed to speaking humans as clearly they are more deeply entangled.16 Humans do not speak alone as there are also nonhuman actants such as variables, arguments, source code, and machine code that speak too — to be specific with an example, the sound library with the function speak.play() joins the chorus. There is a politics to this as some voices are louder than others, and some are marginalized or suppressed altogether. In executing the function SpeakingCode(iam, makingStatements), we question who is speaking, to whom, and under what conditions? We want to make these relations more queer. 如果 1 和 0 在數學中被認為是同等地位的數字,那麼在基本層面上,計算中存在明顯的動力動態。在 *Zeros + Ones* (1997) 中,Sadie Plant 確認所有計算機都將信息轉換為機器程式碼的 0 和 1,這反映了潛在的“西方現實秩序”: There are clear power dynamics at work in computing, at a fundamental level, if 1s and 0s are considered to be numbers of equivalent status in mathematics. In Zeros + Ones (1997), Sadie Plant confirms that all computers translate information into the zeros and ones of machine code and this reflects the underlying “orders of Western reality”: >“無論是 [...] 收集信息、電信、運行洗衣機、計算還是製作視頻,所有數字計算機都將信息轉換為機器程式碼的 0 和 1。這些二進制數字稱為位,並以 8 個字節串在一起。機器碼的 0 和 1 似乎是西方現實秩序的完美象徵,古老的邏輯程式碼決定了開與關、左右、光明與黑暗、形式與物質、我的與身體之間的區別,白與黑、善與惡、對與錯、生與死、有與無、此與彼、此彼彼、里里外外、主動與被動、真與假、是與否、理智與瘋狂、健康和病,上下,理與廢,西與東,北與南。在性方面,他們結成了一對可愛的情侶。男人和女人,男人和女人,陽剛和陰柔:一和零看起來恰到好處,相得益彰:1,確定的,直立的線條; 0,什麼都沒有的圖:陰莖和陰道,東西和洞 [...] 手牽手。完美匹配。”[^Plant1] “Whether […] gathering information, telecommunicating, running washing machines, doing sums, or making videos, all digital computers translate information into zeros and ones of machine code. These binary digits are known as bits and strung together in bytes of eight. The zeros and ones of machine code seems to offer themselves as perfect symbols of the orders of Western reality, the ancient logical codes which make the difference between on and off, right and left, light and dark, form and matter, mine and body, white and black, good and evil, right and wrong, life and death, something and nothing, this and that, here and there, inside and out, active and passive, true and false, yes and no, sanity and madness, health and sickness, up and down, sense and nonsense, west and east, north and south. And they made a lovely couple when it came to sex. Man and woman, male and female, masculine and feminine: one and zero looked just right, made for each other: 1, the definite, upright line; the 0, the diagram of nothing at all: penis and vagina, thing and hole […] hand in glove. A perfect match.”17 雖然需要兩個人才能形成一個二元(並建立異性戀範式),但顯然權力的不平等表現在對一方(主和奴隸,[^master] 父母和孩子,人和機器,等等)的偏愛。 )。正如第 5 章“自動發電機”中所討論的,以及本書最後一章中進一步討論的,圖靈測試與這些功率動態產生共鳴。普蘭特引用圖靈的話說:“建造這些機器的初衷是將它們視為奴隸,只給它們經過詳細考慮的工作,使機器的用戶在原則上完全理解什麼是工作。[^Plant2] 普蘭特關於這種統治幻想的另一個例子是科幻電影 *《銀翼殺手》*(1984 年),這是一項先進的圖靈測試,其中唯一的人工跡像是非人類眼睛虹膜中的微小閃爍有針對性地回答問題。在電影的敘述中,非人類的工人奴隸開始質疑他們的處境是正確的。這些例子清楚地表明,以不同方式想像條件的能力嵌入在系統本身中,如果不合理,則可能無法執行規定的指令或命令。 Although it takes two to make a binary (and set up the heterosexist paradigm), clearly inequalities of power are expressed in the tendency to privilege one side of the pairing (master and slave,18 parent and child, human and machine, and so on). As discussed in Chapter 5, “Auto-generator,” and further discussed in the final chapter of this book, the Turing Test resonates with these power dynamics. Plant quotes Turing as saying: “the intention in constructing these machines in the first instance is to treat them as slaves, giving them only jobs which have been thought out in detail, jobs such that the user of the machine fully understands in principle what is going on all the time.”19 Plant’s further example of this fantasy of domination is the sci-fi film Bladerunner (1984) as an advanced Turing Test in which the only indication of artificiality is a tiny flicker in the non-human eye’s iris in response to targeted questioning. In the film’s narrative, the non-human worker-slaves have rightly begun to question their conditions. Such examples make it clear that the ability to imagine conditions differently is embedded in the system itself, in the potential failure to carry out prescribed instructions or commands if unreasonable. 圖靈做為同性戀者的傳記,當時同性戀在英國仍然是一種刑事犯罪,[^Hodges] 增加了拒絕不合理要求的主張。人類不一定遵循或同意社會規定的規則,儘管圖靈的性行為在戰爭努力的背景下是可以容忍的,但在“正常”(和平時期)條件下,它被認為是一個問題,他被認定犯有嚴重罪行1952。[^Plant3] 下流 在這裡,正如普蘭特所描述的,歷史事實坍塌為離奇的寓言。首先,根據他是女性的可疑邏輯,給他開了雌激素以減少他的性衝動。這是對先前強迫男同性戀者服用睾丸激素以使他們更男性化的判斷的逆轉,但具有諷刺意味的是,這使他們更容易激發荷爾蒙。普蘭特總結圖靈的故事:“兩年後他死了。桌子旁邊有一個蘋果,已經被咬了好幾口了。而這個奇怪的故事並沒有就此結束。每台 Apple Macintosh 機器上都有帶有圖靈缺失字節的彩虹標誌。”[^Plant4] The biography of Turing as a gay man, at a time when homosexuality was still a criminal offense in the UK,20 adds weight to claims to reject unreasonable demands. Humans do not necessarily follow or agree with rules as prescribed by society, and although Turing’s sexuality was tolerated in the context of the war effort, under “normal” (peacetime) conditions it was perceived to be a problem and he was found guiltily of gross indecency in 1952.21 Here, as Plant describes, the historical facts collapse into bizarre allegory. First of all, he was prescribed estrogen to reduce his sexual urge, on the basis of the dubious logic that to all intents and purposes he was female. This was a reversal of prior judgements forcing gay men to take testosterone to make them more male, yet ironically making them more aroused hormonally. Plant concludes the Turing story: “Two years later he was dead. By the side of the table was an apple, out of which several bites had been taken. And this queer tale does not end here. There are rainbow logos with Turing’s missing bytes on every Apple Macintosh machine.”22 總結本章,以及我們對於 *Vocable Code* 的「酷兒評論」[^berlant],包含使用了奇怪的語法(例如 notFalse 和 notTrue)和許多的重複小數來製作,都強調了:酷兒使得 […]二進制變得奇怪。 To conclude this chapter, and our “queer commentary”23 on the making of Vocable Code with its strange syntax - such as notFalse and notTrue - as well as its many repetitive decimals, and suchlike, by emphasizing that: Queer is […] making binaries strange. ## 迷你習作:數位文學 MiniX: E-lit **目標: Objective:** * 了解 JSON 在技術上的工作原理、存儲數據以及如何使用程式碼檢索數據。 To understand how JSON works technically, in terms of storing data, and how data can be retrieved using code. * 反思程式碼和語言的美學,以及數位文學(e-lit)的音頻維度。 To reflect upon the aesthetics of code and language, as well as the audio dimensions of electronic literature (e-lit). **獲得額外的靈感: Get additional inspiration:** * Lai-Tze Fan & Nick Montfort, *Dial* (2020),http://thenewriver.us/dial/ ,JavaScript 原始碼 https://nickm.com/fan_montfort/dial/ 。 * Amira Hanafi *〈在加拿大的墨西哥人〉* (2020),http://amiraha.com/mexicansincanada/ 。 * 艾莉森·諾爾斯 (Alison Knowles) 和詹姆斯·坦尼 (James Tenney) 的 *〈塵埃之屋〉* (1967),由尼克·蒙特福特 (Nick Montfort) 為 Memory Slam (2014) 重新實現,https://nickm.com/memslam/a_house_of_dust.html 。 * Corpora - Darius Kazemi(未註明日期)的 JSON 文件存儲庫,https://github.com/dariusk/corpora/tree/master/data 。 * e-lit collection 1,http://collection.eliterature.org/1/ 。 * e-lit collection2, http://collection.eliterature.org/2/ 。 * e-lit collection3, http://collection.eliterature.org/3/ 。 * Daniel Howe 的 RiTa library(2006 年至今),https://rednoise.org/rita/ 。 **任務(RunMe):** Tasks (RunMe): 1. 設計一款以文本為主要媒介的電子照明(但要認識到文本可以採取多種形式,包括程式碼和語音)。 To design a piece of e-lit that utilizes text as the main medium (but in recognition that text can take various forms, including code and voice). 2. 實現用於文本組織、存儲和檢索的 JSON 文件。 To implement JSON file(s) for text organization, storage, and retrieval. * * * **要考慮的問題(自述文件): Questions to think about (ReadMe):** * **提供**您作品的標題和簡短描述(1,000 個字符或更少)。 Provide a title of your work and a short description (1,000 characters or less). * **描述**您的程式是如何工作的,以及您使用和學習了哪些語法? Describe how your program works, and what syntax you have used, and learnt? **分析並闡明**您的工作: Analyze and articulate your work: * 使用文本 Vocable Code 和/或 The Aesthetics of Generative Code(或其他處理程式碼/語音/語言的文本)分析您自己的數位文學作品。 Analyze your own e-lit work by using the text Vocable Code and/or The Aesthetics of Generative Code (or other texts that address code/voice/language). * 您如何看待您在 *Vocable Code* 方面的工作? How would you reflect on your work in terms of Vocable Code? ## 必讀 Required reading * Geoff Cox 和 Alex McLean,“Vocable Code”,《口語程式碼》(馬薩諸塞州劍橋:麻省理工學院出版社,2013 年),17-38。 Geoff Cox and Alex McLean, “Vocable Code,” in Speaking Code (Cambridge, MA: MIT Press, 2013), 17-38. * Allison Parrish,“文本和類型”(2019 年),https://creative-coding.decontextualize.com/text-and-type/ 。 Allison Parrish, “Text and Type” (2019), https://creative-coding.decontextualize.com/text-and-type/ . * Daniel Shiffman,“10.2:什麼是 JSON? 第 I 部分 - p5.js 教程”(2017 年),https://www.youtube.com/playlist?list=PLRqwX-V7Uu6a-SQiI4RtIwuOrLJGnel0r 。 Daniel Shiffman, “10.2: What is JSON? Part I - p5.js Tutorial” (2017), https://www.youtube.com/playlist?list=PLRqwX-V7Uu6a-SQiI4RtIwuOrLJGnel0r. * Daniel Shiffman,“10.2:什麼是 JSON? 第二部分 - p5.js 教程”(2017 年),https://www.youtube.com/playlist?list=PLRqwX-V7Uu6a-SQiI4RtIwuOrLJGnel0r 。 Daniel Shiffman, “10.2: What is JSON? Part II - p5.js Tutorial” (2017), https://www.youtube.com/playlist?list=PLRqwX-V7Uu6a-SQiI4RtIwuOrLJGnel0r. ## 延伸閱讀 Further reading * Geoff Cox、Alex McLean 和 Adrian Ward,“生成程式碼的美學”,生成藝術會議論文集,米蘭(2001 年)。 Geoff Cox, Alex McLean, and Adrian Ward, “The Aesthetics of Generative Code,” Proceedings of Generative Art Conference, Milan (2001). * Liz W. Faber,*《電腦的聲音:從星際迷航到 Siri》(The Computer’s Voice: From Star Trek to Siri)*(Minneapolis, MN: University of Minnesota Press, 2020)。 * Rita Raley,“干擾:網絡寫作和程式碼工作實踐”,電子書評(2002 年),http://electronicbookreview.com/essay/interferences-net-writing-and-the-practice-of-codework/。 Rita Raley, “Interferences: Net.Writing and the Practice of Codework,” Electronic Book Review (2002), http://electronicbookreview.com/essay/interferences-net-writing-and-the-practice-of-codework/. * Margaret Rhee,“反思機器人、愛情和詩歌”,XRDS:Crossroads 24,沒有。 2,十二月(2017 年):44–46,https://dl.acm.org/doi/pdf/10.1145/3155126?download=true。 Margaret Rhee, “Reflecting on Robots, Love, and Poetry,” XRDS: Crossroads 24, no. 2, December (2017): 44–46, https://dl.acm.org/doi/pdf/10.1145/3155126?download=true. ## 筆記 Notes [^speech]: 在這裡,我們參考了 John Langshaw Austin 的 How To Do Things With Words,以及 Geoff Cox 和 Alex McLean 的口語程式碼(馬薩諸塞州劍橋:麻省理工學院出版社 2013 年)。自由軟體基金會將自由軟體比喻為言論自由:自由軟體意味著用戶擁有運行、複製、分發、研究、更改和改進軟體的自由。 「因此,『自由軟體』是一個自由問題,而不是價格問題。要理解這個概念,應該將『Free』視為『言論自由』中的自由,而不是『免費啤酒』中的免費。」請參閱 https://www.gnu.org/philosophy/free-sw.html 。 Here we reference John Langshaw Austin’s How To Do Things With Words, and by extension, Geoff Cox and Alex McLean’s Speaking Code (Cambridge, MA: MIT Press 2013). The analogy of free software to free speech is explicitized in the Free Software Foundation’s definition: Free software means that the users have the freedom to run, copy, distribute, study, change and improve the software. “Thus, ‘free software’ is a matter of liberty, not price. To understand the concept, you should think of ‘free’ as in ‘free speech’, not as in ‘free beer’.” See https://www.gnu.org/philosophy/free-sw.html. [^cox1]: 考克斯,口語程式碼,17. Cox, Speaking Code, 17. [^language]: Florian Cramer,*《軟體研究中的語言》(Language in Software Studies)*,2008 年,168-173;另請參閱 Warren Sack,*《軟體藝術》(The Software Arts)*(Cambridge, Mass.: MIT Press, 2019) [^love]: 弗洛里安・克萊默 (Florian Cramer) 的宣示是在我愛你展覽 (2002-4) 的背景下提出的,該展覽是由 digitalcraft.org Kulturbüro 開發的正在進行的作品展覽,請參閱 http://www.digitalcraft.org/iloveyou/ 。 Florian Cramer’s claim was made in the context of the I Love You exhibition (2002-4) a work in progress-exhibition developed by digitalcraft.org Kulturbüro, see http://www.digitalcraft.org/iloveyou/. [^examples]: 與此討論相關的是唐納德·克努斯 (Donald Knuth) 所說的“文學程式設計”,這是一種將程式視為文學作品的方法,面向人類而非計算機。有關更多信息,請參閱 Donald Knuth 的“Literate Programming”,The Computer Journal 27, no.2 (1984): 97–111,https://academic.oup.com/comjnl/article/27/2/97/343244 ; https://doi.org/10.1093/comjnl/27.2.97 。更多的例子可能包括 Mez Breeze (1994)、John Cayley (2002)、Michael Mateas 和 Nick Montfort (2005)、Florian Cramer (2008)、Graham Harwood (2008)、Daniel Temkin (2011)、Zach Blas 和 Micha Cárdenas (2012、2013)、Geoff Cox 和 Alex McLean(2013)、Allison Parrish(2015)、Ian Hatcher(2015、2016)和 Winnie Soon & Geoff Cox(2018),僅舉幾例。 Relevant to this discussion is what Donald Knuth calls “literate programming,” a methodology that treats a program like a piece of literature, addressed to human beings rather than to a computer. For more on this, see Donald Knuth’s “Literate Programming,” The Computer Journal 27, no.2 (1984): 97–111, https://academic.oup.com/comjnl/article/27/2/97/343244; https://doi.org/10.1093/comjnl/27.2.97. Further examples might include those by Mez Breeze (1994), John Cayley (2002), Michael Mateas and Nick Montfort (2005), Florian Cramer (2008), Graham Harwood (2008), Daniel Temkin (2011), Zach Blas and Micha Cárdenas (2012, 2013), Geoff Cox & Alex McLean (2013), Allison Parrish (2015), Ian Hatcher (2015, 2016) and Winnie Soon & Geoff Cox (2018), to name only a few. [^soon1]: Winnie Soon,“語音程式碼,MAI:女權主義和視覺文化 2(2018 年 11 月 10 日),https://maifeminism.com/vocable-code/ 。 Winnie Soon, “Vocable Code, MAI: Feminism and Visual Culture 2 (November 10, 2018), https://maifeminism.com/vocable-code/. [^execute]: Roopika Risam,可執行程式碼之詩(2015),http://jacket2.org/commentary/poetry-executable-code 。 Roopika Risam, The Poetry of Executable Code (2015), http://jacket2.org/commentary/poetry-executable-code. [^constraints]: 有關基於約束的 Vocable Code 編寫的討論,請參閱 Eva Heisler,“Winnie Soon,時間、程式碼和詩歌”,Asymptote Journal,1 月(2020 年),https://www.asymptotejournal.com/visual/winnie-soon-time-code-and-poetry/ . For a discussion around the constraint-based writing of Vocable Code, see Eva Heisler, “Winnie Soon, Time, Code, and Poetry,” Asymptote Journal, Jan (2020), https://www.asymptotejournal.com/visual/winnie-soon-time-code-and-poetry/. [^cox2]: 考克斯,口語程式碼,24。 Cox, Speaking Code, 24. [^font]: 同時,你還可以在網上找到很多免費和開源的字體下載。例如,請參見 https://www.1001freefonts.com/ 。 At the same time, you can also find a lot of free and open source fonts to download online. See, for instance, https://www.1001freefonts.com/ [^callback]: 請參閱可用作 preload() 和回調的 loadSound() 函式,https://p5js.org/reference/#/p5/loadSound 。 See the loadSound() function that can be used as both preload() and callback, https://p5js.org/reference/#/p5/loadSound. [^Wenyan]: 請參閱 https://wy-lang.org/ 。 [^Andersen]: Peter Bøgh Andersen 提出了一個符號學框架來研究做為符號載體的計算機系統,以了解符號是如何產生和解釋的。該框架強調與本章相關的形式/技術結構和非形式/可解釋符號的組合,參見 Peter Bøgh Andersen,“計算機符號學”,斯堪的納維亞信息系統雜誌 4,第 1 期,(1992 年):1 , https://aisel.aisnet.org/sjis/vol4/iss1/1/ 。 Peter Bøgh Andersen suggests a semiotic framework to study computer systems as sign-vehicles in order to understand how signs are produced and interpreted. The framework emphasizes the combination of formal/technical structures and non-formal/interpretable signs which is relevant to this chapter, see Peter Bøgh Andersen, “Computer Semiotics,” Scandinavian Journal of Information Systems 4, no.1, (1992): 1, https://aisel.aisnet.org/sjis/vol4/iss1/1/ . [^Chun]: Wendy Hui Kyong Chun, *Programmed Visions: Software and Memory* (Cambridge, MA: MIT Press, 2011), 45. [^Barad]: Karen Barad,《中途遇見宇宙:量子物理學和物質與意義的糾纏》(北卡羅來納州達勒姆:杜克大學出版社,2007 年)。 Karen Barad, Meeting the Universe Halfway: Quantum Physics and the Entanglement of Matter and Meaning (Durham, North Carolina: Duke University Press, 2007). [^entangle]: 我們再次指出巴拉德在這裡的工作,以及她強調的是「內動化成」人類和非人類實踐的糾纏。參見巴拉德,中途遇見宇宙。 We again point to Barad’s work here, and what she would stress to be entanglements of “intra-acting” human and non-human practices. See Barad, Meeting the Universe Halfway. [^Plant1]: Sadie Plant,Zeros + Ones:數字女性和新技術文化(倫敦:Forth Estate,1997),34-35。 Sadie Plant, Zeros + Ones: Digital Women and the New Technoculture (London: Forth Estate, 1997), 34-35. [^master]: 這已在第 1 章「準備開始吧!」中討論過。 This has been discussed in Chapter 1, “Getting started.” [^Plant2]: 植物,零 + 一個,88。 Plant, Zeros + Ones, 88. [^Hodges]: 有關歷史事件的更詳細版本,請參閱 Andrew Hodges 的 Alan Turing: The Enigma(倫敦:Burnett Books,1983 年)。 For a more detailed version of historical events, see Andrew Hodges’s Alan Turing: The Enigma (London: Burnett Books, 1983). [^Plant3]: 植物,零 + 一個,98-99。有關酷兒與計算之間聯繫的更多信息,請參閱 https://queercomputing.info/ 。 Plant, Zeros + Ones, 98-99. For more on the connections between queer people and computing, see https://queercomputing.info/ . [^Plant4]: 植物,零 + 一個,102。 Plant, Zeros + Ones, 102. [^berlant]: Lauren Berlant 和 Michael Warner 討論了酷兒理論的有用性以及他們更喜歡將「酷兒評論」稱為學術界之外更有用和更公開的術語。參見 Lauren Berlant 和 Michael Warner,「客座專欄:酷兒理論教給我們什麼關於 X」,PMLA 110,不。 3(1995 年 5 月):343-49。 Vocable code 是一種已在畫廊和藝術節中展出的藝術品,但它也不僅僅是一件始終考慮實用和教學語境的藝術品。首次公開發佈時,Vocable Code 是在一個獨立的藝術空間中表演的,做為“p5.js 中的女性主義編碼研討會”的一部分。參見 Winnie Soon,“關於 p5.js 中的女性主義編碼研討會的報告”,美學程式設計,最後更新於 2017 年 11 月 30 日,http://aestheticprogramming.siusoon.net/articles/a-report-on-the-feminist-coding-workshop-in-p5-js/ 。 Lauren Berlant and Michael Warner discuss the usefulness of queer theory and what they prefer to call “queer commentary” as a more useful and public term outside of academia. See Lauren Berlant and Michael Warner, “Guest Column: What Does Queer Theory Teach Us about X,” PMLA 110, no. 3 (May 1995): 343–49. Vocable code is an artwork that has been exhibited in galleries and festivals, but it is also more than an artwork that considers the pragmatic and pedegogical context throughout. When it first launched in public, Vocable Code was performed in an independent art space as part of the “Feminist Coding Workshop in p5.js.” See Winnie Soon, “A Report on the Feminist Coding Workshop in p5.js,” Aesthetic Programming, last updated November 30, 2017, http://aestheticprogramming.siusoon.net/articles/a-report-on-the-feminist-coding-workshop-in-p5-js/. ↩