User:Kiara/Special Issue 25: Difference between revisions

From XPUB & Lens-Based wiki
No edit summary
 
(25 intermediate revisions by the same user not shown)
Line 2: Line 2:


  Since everything seems to be a ''mise en abyme'', this page is going to be all about protocols, in order to be meta and in harmony with this Special Issue's title.
  Since everything seems to be a ''mise en abyme'', this page is going to be all about protocols, in order to be meta and in harmony with this Special Issue's title.
  General page: https://pzwiki.wdka.nl/mediadesign/Radio_WORM:_Protocols_for_Collective_Performance
  [[Radio_WORM:_Protocols_for_Collective_Performance|General page of the trimester]]


===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a field recording</span>===
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a field recording</span>===
Line 17: Line 17:
----
----
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a first radio show</span>===
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a first radio show</span>===
The very first show that took place at Radio WORM with [[User:Sevgi|Sevgi]], [[User:Wordfa|Fred]], [[User:Kim|Kim]] and [[User:Martina|Martina]] on 23<sup>rd</sup> September 2024.<br>
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">23-09-2024</span><br>
The very first show that took place at Radio WORM with [[User:Sevgi|Sevgi]], [[User:Wordfa|Fred]], [[User:Kim|Kim]] and [[User:Martina|Martina]].<br>
We used the field recordings, metadata and songs people put on their [[:Category:Field recording 2024|Field Recording]] wiki pages.<br>
[https://www.mixcloud.com/radiowormrotterdam/protocols-for-collective-performance-w-xpub-230924/ Listen to the show on Mixcloud!!]<br>
[https://www.mixcloud.com/radiowormrotterdam/protocols-for-collective-performance-w-xpub-230924/ Listen to the show on Mixcloud!!]<br>
We used the field recordings, metadata and songs people put on their Field Recording wiki pages.<br>
 
<gallery mode="nolines" heights="300" widths:200="" widths="200" style="text-align:center;">
 
<p style="font-weight: bold; text-transform: uppercase; text-align: right;">Dedicated wiki page: [[SI25 Broadcast 1: Soundmapping]]</p>
 
<gallery mode="nolines" heights="300" widths="200" style="text-align:center;">
File:Worm23092024.jpg
File:Worm23092024.jpg
File:Makingradio.jpg
File:Makingradio.jpg
Line 39: Line 44:
----
----
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocols for a Jam Session</span>===
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocols for a Jam Session</span>===
Jam Session of 24th September 2024 with Joesph: creating instruments with unusual objects<br>
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">24-09-2024</span><br>
Jam Session with Joseph: creating instruments with unusual objects<br>


'''Jam 1''' {{audio|mp3=https://pzwiki.wdka.nl/mw-mediadesign/images/7/7a/Jam-full-1.mp3|style=width:100%; border-radius:25px;}}
'''Jam 1''' {{audio|mp3=https://pzwiki.wdka.nl/mw-mediadesign/images/7/7a/Jam-full-1.mp3|style=width:100%; border-radius:25px;}}
Line 46: Line 52:


=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for Canon Music</span> ===
=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for Canon Music</span> ===
Session with Michael - 14/10/2024<br>
[[File:Clapping-music-sheet.jpg|frameless|right]]
[[File:Clapping-music-sheet.jpg|frameless|left]]
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">14-10-2024</span><br>
Session with Michael: Reading and acting the ''Clapping Music'' by Steve Reich.


Reading and acting the Clapping Music by Steve Reich<br>
<br>
The pattern is <code>3-2-1-2</code> and it's looping.<br>
The pattern is <code>3-2-1-2</code> and it's looping.<br>
''What happens when the second clapper enters and loops their part?''<br>
''What happens when the second clapper enters and loops their part?''<br>
Line 56: Line 61:
''What would be a better way of writing this partition?''<br>
''What would be a better way of writing this partition?''<br>
→ In a wheel!<br>
→ In a wheel!<br>
[[File:Rotate-the-pattern.jpg|frameless|right]]
It feels like unveiling a secret hidden in the partition - <span style="background-color:orange;">like solving a riddle!</span><br>
<br><br><br><br><br><br><br><br><br>


=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for organising an event</span> ===
It feels like unveiling a secret hidden in the partition - <span style="color: rgb(92, 58, 196); background-color: #F7FAFF;">like solving a riddle!</span>
Week from 28/10/2024 to 03/11/2024<br>
[[File:Rotate-the-pattern.jpg|frameless|center]]
<br><br>
 
=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a Delayed Radio Show</span>===
[[File:LostMusic InTheMaking.jpg|frameless|right|210x210px]]
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">04-11-2024</span><br>
with [[User:Chrissy|Chrissy]], [[User:aksellr|Tessa]], [[User:imina|Imina]], [[User:charlie|Charlie]] <br>
 
Today, we were supposed to host one of the best radio shows of the trimester. We worked super hard to make it perfect but...WORM faced technical issues and had to close down the radio for an unknown period of time.<br>
We really put our hearts into the making of this show: <br>
[[File:CD in the Wild (radio worm) (2).jpg|frameless|right|210x210px]]
:→ the theme is '''Lost Music''', we asked everybody to contribute by uploading songs from their teenage years onto [[SI25 Broadcast 8: Lost Music|this wiki page]]. From this, emerged also a [https://open.spotify.com/playlist/3VQHx4phiwFA5Pf0KVoxVt?si=78b2d2fa51f04b12 Spotify playlist]!! <br>
:→ we burned CDs with the songs, according to the themes we agreed on, the CD cases contain a poster and stickers!<br>
:→ we made a web page hosting the playlist (downloadable)<br>
:→ we thought about copyright, piracy and music that is lost through time by being present only on CDs that people kept (opposed to being present on streaming platforms); but also the fact that through streaming platforms we don't own music anymore, and if the platform goes down, we lose music...<br>
 
 
In the end, the show that was supposed to happen on Nov. 4th got pushed to Nov. 25th, and it was a <span style="font-weight: bold; font-family: 'Impact'; color: hotpink; font-size: 18px;">B L A S T</span>.
 
<p style="font-weight: bold; text-transform: uppercase; text-align: right;">Dedicated wiki page: [[SI25 Broadcast 8: Lost Music]]</p>
 
[[File:Lost Music Radio Group.jpg | center | frameless|265x265px]]
<br>
 
=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for a Non-Radio Show</span>===
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">18-11-2024</span><br>
with [[User:queenfeline|Feline]], [[User:shoebby|Lexie]], [[User:eleni|Eleni]], [[User:chrissy|Chrissy]]<br>
 
This is the Monday right before the Special Issue Public Event, we are not in a planning mindset. We thus decide to <span style="font-family: cursive; background-color: #F7FAFF;">improvise</span>.<br>
We gather vinyls, readings and discussion topics. Lexie and Feline are DJing, Chrissy, Eleni and I are improvising a podcast. We will start by planning the radio show we are actually broadcasting (''mise en abyme'' hehe).<br>
 
<p style="font-weight: bold; text-transform: uppercase; text-align: right;">Dedicated wiki page: [[SI25 Broadcast 7: Improvisation]]</p>
 
<p style="font-family: 'Impact'; color: rgb(92, 58, 196); font-size: 25px; text-align: center;">S M O O T H</p>
[[File:Dave 3.jpg|center|500x500px]]
<br>
 
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for organizing an event</span>===
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">28-10-2024 to 03-11-2024</span><br>


Having 3 meetings in 2 days about the task management, making working groups, deciding on what we do and how we do it.<br>
Having 3 meetings in 2 days about the task management, making working groups, deciding on what we do and how we do it.<br>
Line 69: Line 109:




; My project idea for the event: Inspired by [https://sarahgarcin.com/workshops/an-underground-radio-to-print/toolkit.html Sarah Garcin's ''Radio to Print'' workshops] 🠶 there's a python dependency to transform speech into printed text.  
;My project idea for the event:Inspired by [https://sarahgarcin.com/workshops/an-underground-radio-to-print/toolkit.html Sarah Garcin's ''Radio to Print'' workshops] 🠶 there's a python dependency to transform speech into printed text.
; Mixed with Eleni's idea of having a spoken input transformed into music via VCV Rack -- in the end we get:
;Mixed with Eleni's idea of having a spoken input transformed into music via VCV Rack -- in the end we get:
   spoken input => becomes music for the listeners + gets printed live (thermal or fax machine)
   spoken input => becomes music for the listeners + gets printed live (thermal or fax machine)
; Adding Zuhui's idea: To engage visitors in this performance, they can become part of the foundational text/speech material for the auditory output: One or two writers will be present in the room, live scripting as they observe the event. This observation can focus on the visitors —or anyone in the room— and may include fictional elements depending on the writers' interpretations and creative choices. Ideally, this live-scripting will be projected on a screen, allowing visitors to watch as they’re being observed and transformed into text, and then speech, which then becomes sound and then text again (in VCV+python) —all in real-time.
;Adding Zuhui's idea:To engage visitors in this performance, they can become part of the foundational text/speech material for the auditory output: One or two writers will be present in the room, live scripting as they observe the event. This observation can focus on the visitors —or anyone in the room— and may include fictional elements depending on the writers' interpretations and creative choices. Ideally, this live-scripting will be projected on a screen, allowing visitors to watch as they’re being observed and transformed into text, and then speech, which then becomes sound and then text again (in VCV+python) —all in real-time.
; Sevgi's idea: This script could also serve as a part of documentation(post-production) of the event. Because it’s the writing of the live observation made directly in the moment and setting of the performance.
;Sevgi's idea:This script could also serve as a part of documentation(post-production) of the event. Because it’s the writing of the live observation made directly in the moment and setting of the performance.


;Whole public needed
; Whole public needed
; Works best if not time framed but could maybe work if the frame is around 2h
;Works best if not time framed but could maybe work if the frame is around 2h


     '''Remaining questions to work on:'''
     '''Remaining questions to work on:'''
Line 83: Line 123:
     - Work on how to connect all the different processes (python + vcv + livescript)
     - Work on how to connect all the different processes (python + vcv + livescript)


[[Lost in Narration | Project page]]
=====<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Personal documentation of the project</span>=====
* '''WHAT IT IS'''
''Lost in Narration'' is a performative installation. It is a Text-to-Speech-to-Text-to-Music-and-Print set up. Meaning the whole installation takes a text input which, spoken into mics get translated back into text and music simultaneously, and printed on a thermal printer.
<p style="text-align: center; font-family: monospace; padding: 3px 5px; border: solid 1px black;">Written Text ---> Speech in mics ---> Speech back to text ---> Music + Print</p>
* '''WHAT IT DOES'''
It questions the purposes and outcomes of communication and story-telling. A livescript of the event gets misinterpreted by a python scripts as it is spoken into microphones, telling a totally different story from the one written by the narrators.
* '''HOW IT WORKS'''
Two narrators sit in front of keyboards and livescript whatever is happening around them. They can decide to twist the actual events, communicate with each other through that narration. The script is projected on a separate screen, in front of which sit two speakers, each one reading a narrator's voice.
<p style="color: gray; font-style: italic; text-align: center;">---- Add a drawing! ----</p>
When the speakers talk in the microphones, three things happen simultaneously:
:- A python script tries to transcribe the words into written text, mostly messing it up <br>
:- The same script is also printing this written output to a thermal printer<br>
:- An additional computer uses a VCV Rack 2 set up to translate the spoken words into music/sound as they are spoken<br>
When the speakers are done speaking, they can press <code>CTRL+C</code> on the keyboard to tell the printer to cut the paper.
* '''HOW IT IS MADE'''
:; Narration interface
Built in Unity, each narrator get a font and a colour. Two keyboards are plugged on the same computer and write. <br>
Controls: keys to write, TAB to switch fonts/voices, ENTER to start a new line<br>
A <code>.txt</code> file containing all the written lines is made and preserved during runtime, it acts as a log.<br>
[[File: Livescriptprogram.PNG]]
:; Text-to-Speech-to-Text-to-Print
Using python and python libraries.<br>
:: 1. Install and run the speech recognition (Windows)<br>
:::- create a dedicated folder on the computer, where you want to store the scripts and written files
:::- install sounddevice with <code>pip install sounddevice</code>
:::- install vosk with <code>pip install vosk</code>
:::- download [https://github.com/alphacep/vosk-api/blob/master/python/example/test_microphone.py this file] and put it in the folder
:::- cd in your folder through the terminal
:::- run <code>python test_microphone.py</code> <br>
:::- the program is stopped with <code>CTRL+C</code></span>
:::- (optional) you can go modify the <code>test_microphone.py</code> by commenting lines 80 and 81. This prevents the program to print the partial result of it trying to recognize what's being said
:::- if you want to print the content being recorder into a text file, run <code>python test_microphone.py ›› stderrout.txt</code>. The <code>››</code> means that it will append the new data in the file if you stop the program. If you want to overwrite everytime, simply use <code>›</code>. <br>
:: 2. Install the thermal printer
:::- install [https://github.com/walac/pyusb?tab=readme-ov-file pyusb] with <code>pip install pysub</code> and download the libusb-win32 packages [https://sourceforge.net/projects/libusb-win32/ here]
:::- install lib-usb and all the drivers through [https://zadig.akeo.ie/ Zadig]: in Options select ''List All Devices'' and from the dropdown select the printer device. Then, go through the list of drivers with the arrows and install the WCID Driver for each. '''IMPORTANT''': Replace the printer's driver with the <code>libusb-win32</code> driver, this is what allows the connection. Zadig will also give you the printer's id, which are needed in the <code>script.py</code> file we're creating later.
<gallery class="li-gallery" widths="350" style="text-align: center;" mode="nolines">
File:Zadig-og.png
File:Zadig-01.png
File:Zadig-02.png
File:Zadig-param-og.png
</gallery>
:::- install ESC/POS with <code>pip install python-escpos</code>
:::- create a new .py file in your folder, via the code editor, call it <code>script.py</code> and put the code below, don't forget to change the ids in the parenthesis. Now you can run <code>python script.py</code> to see the magic happening!
<syntaxhighlight lang=python>
from escpos.printer import Usb
iprinter = Usb(0x0483, 0x811E, in_ep=0x81, out_ep=0x02) #here you replace 0483 and 811E with the ids provided by Zadig
iprinter.text("hello world")
iprinter.qr("https://xpub.nl")
</syntaxhighlight>


:: 3. Merge the <code>test_microphone.py</code> and <code>script.py</code> scripts<br>
Here is the final code that gets the voice, writes it and prints it:
<syntaxhighlight lang=python>
import argparse
import queue
import sys
import sounddevice as sd
from vosk import Model, KaldiRecognizer
from escpos.printer import Usb
import json
import keyboard


=== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for wrapping up the Special Issue 25</span> ===
# Define the int_or_str function for argument parsing
Week from 25/11/2024 to ...<br>
def int_or_str(text):
    """Helper function for argument parsing to accept either an integer or string."""
    try:
        return int(text)
    except ValueError:
        return text
 
# Set up the queue for audio data
q = queue.Queue()
 
# Define callback to process audio in real-time
def callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(bytes(indata))
 
# Argument parsing for devices, samplerate, etc.
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("-l", "--list-devices", action="store_true", help="show list of audio devices and exit")
args, remaining = parser.parse_known_args()
 
# List audio devices if requested
if args.list_devices:
    print(sd.query_devices())
    parser.exit(0)
 
parser = argparse.ArgumentParser(description="Vosk microphone to printer", formatter_class=argparse.RawDescriptionHelpFormatter, parents=[parser])
parser.add_argument("-f", "--filename", type=str, metavar="FILENAME", help="audio file to store recording to")
parser.add_argument("-d", "--device", type=int_or_str, help="input device (numeric ID or substring)")
parser.add_argument("-r", "--samplerate", type=int, help="sampling rate")
parser.add_argument("-m", "--model", type=str, help="language model; default is en-us")
args = parser.parse_args(remaining)
 
# Set up the model and samplerate
try:
    if args.samplerate is None:
        device_info = sd.query_devices(args.device, "input")
        args.samplerate = int(device_info["default_samplerate"])
   
    if args.model is None:
        model = Model(lang="en-us")
    else:
        model = Model(lang=args.model)
 
    if args.filename:
        dump_fn = open(args.filename, "wb")
    else:
        dump_fn = None
 
    # Set up USB printer (adjust device IDs as necessary)
    # --- This is the small black printer ---
    # iprinter = Usb(0x0483, 0x811E, in_ep=0x81, out_ep=0x02)
 
    # --- This is the big black printer ---
    iprinter = Usb(0x04B8, 0x0E28, 0, profile="TM-T88III")
 
    # Start the raw input stream from the microphone
    with sd.RawInputStream(samplerate=args.samplerate, blocksize=4000, device=args.device, dtype="int16", channels=1, callback=callback):
        print("#" * 80)
        print("Press Ctrl+C to stop the recording")
        print("#" * 80)
 
        rec = KaldiRecognizer(model, args.samplerate)
       
        while True:
            data = q.get()  # Get the next audio chunk
 
            if rec.AcceptWaveform(data):
                result = rec.Result()
                result_json = json.loads(result)
                text = result_json.get('text', "")
               
                if text:  # If recognized text exists, print it
                    print(f"Recognized: {text}")
                    iprinter.text(text + '\n')  # Send recognized text to the printer
                   
            if keyboard.is_pressed('c'):
                iprinter.cut()
 
            # Optional: You can also use PartialResult for real-time feedback, uncomment to use:
            # else:
            #    print(rec.PartialResult(), flush=True)
 
            if dump_fn is not None:
                dump_fn.write(data)
 
except KeyboardInterrupt:
    print("\nDone")
    parser.exit(0)
 
except Exception as e:
    parser.exit(type(e).__name__ + ": " + str(e))
</syntaxhighlight>
 
:; VCV Rack 2
[[File: Vcv.png]]
 
* '''My part in the project'''
We collectively decided to merge our ideas to make a super-project. We found that messing with story-telling and translation was very interesting and ''à propos'' since everyone in the class speaks a different native language. It questions the topics of documentation, accuracy and meaning.
 
To that extent, I was managing a lot of the project, making sure every part was working, and especially working together. I made sure everyone had a role in the group.
 
* '''What I take from it'''
I tried my best to understand the python scripts, but couldn't get enough comprehension as to merge them. I need to step up and get better at this, python is cool!
 
I naturally tend to manage groups and assure the harmony of the working process.
 
The project could benefit from a better workflow, so that maybe it could travel without needing 3 different laptops. How can we achieve that?...
 
<p style="font-weight: bold; text-transform: uppercase; text-align: right;">Dedicated wiki page: [[Lost in Narration]]</p>
<br>
 
===<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">Protocol for wrapping up the Special Issue 25</span>===
<span style="font-family: monospace; font-weight: bold; font-size: 15px;">25-11-2024 to ...</span><br>


We gathered as a team and discussed the outcome we want for the Special Issue 25.<br>
We gathered as a team and discussed the outcome we want for the Special Issue 25.<br>
Line 99: Line 311:
So we divided tasks to work efficiently:
So we divided tasks to work efficiently:
* Design group: code + design
* Design group: code + design
** Feline + Kiara + Kim + Tessa  
** Feline + Kiara + Kim + Tessa
* Archive group: gathering all wikis and pages, gather pictures and select  
* Archive group: gathering all wikis and pages, gather pictures and select  
** Wiki: Charlie + Claudio  
** Wiki: Charlie + Claudio
** Pics: Chrissy + Zuhui
** Pics: Chrissy + Zuhui
** Video editing: Wyn
** Video editing: Wyn
Line 107: Line 319:
[https://pad.xpub.nl/p/Post-Prod_Sounds-of-Making Link to the pad]
[https://pad.xpub.nl/p/Post-Prod_Sounds-of-Making Link to the pad]


==== <span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF;">21-03-2025 UPDATE</span>====
=====<span style="border: dotted 1.5px rgb(92, 58, 196); padding: 5px 7px; background-color: #F7FAFF; font-size: smaller;">21-03-2025 UPDATE</span>=====
In the end, we decided to build an entirely *new* website. It uses a script to fetch data from wiki pages and insert them as content. We are still in the styling process, as this method brought many bugs and needs for hacks in order to work properly.<br>
In the end, we decided to build an entirely *new* website. It uses a script and the wiki API to fetch data from wiki pages and insert them as content.<br>
This method also pushes the content into a paged.js template to produce a printed archive of the trimester.
In order to do so, we decided on a very methodical approach that required a thorough exploration of all the wiki pages for the different Radio Shows and SI25 Projects in order to make sure they followed the same structure, the same naming procedure and eventually to add HTML classes where needed. We also gathered them in new '''Content Pages''' (see below) either by linking them or using the ''power of transclusion''.<br>
This way, we could also push the content into a paged.js template to produce a printed archive of the trimester.<br>
We are still in the styling process, as this method brought many bugs and needs for hacks in order to work properly.<br>


→ Here are the pages we use to create the content of both the print and website archives:
* '''HOW IT WORKS / HOW IT IS MADE
A [https://git.xpub.nl/kiara/Special-Issue-25/src/branch/main/js/view.js script] uses the Wiki API to fetch the content (see below) and put it in a HTML file.<br>
By adding classes and HTML tags inside the wiki pages, we can now target them in CSS to style the website and the print accordingly.
 
The print is generated using paged.js
 
We use various stylesheets for the website, allowing us to work remotely and simultaneously without overwriting each other's work. Kim and I have been doing some stylesheet cleaning and restructuring lately.
 
'''Wiki Pages (Content)'''
:;[[Special Issue 25 | Website homepage]]
:;[[Special Issue 25 | Website homepage]]
:;[[Special Issue 25 to print | The print content]]
:;[[Special Issue 25 to print | The print content]]
:;[[SI25 Radio Shows | Radio Shows]]
:;[[SI25 Radio Shows | Radio Shows]]
:;[[SI25: Sounds of Making | Public Event and pictures]] <br>
:;[[SI25: Sounds of Making | Public Event and Pictures]] <br>
→ [[SI25 WIKI COLLECTION | Here]] you can find the working spreadsheet made by Claudio and Charlie to make sure the content was up to date and ready to be pushed to the html source.
 
→ [[SI25 WIKI COLLECTION | The working spreadsheet]] made by Claudio and Charlie to make sure the content was up to date and ready to be pushed to the html source.
 
'''Preview Links'''<br>
:;[https://hub.xpub.nl/cerealbox/Special-Issue-25/view.html?pagename=Special%20Issue%2025 Website] (WIP)
:;[https://hub.xpub.nl/cerealbox/Special-Issue-25/print.html Print] (to be printed)
 
* '''MY PART IN THE PROJECT'''
I took care of all of the print. Some decisions were made collectively, such as choosing whether or not to display the audio players (I voted yes...).
Then, once Claudio and Charlie cleaned up the wiki pages, I did the whole print layout. I went back into the wiki pages to add some classes that were needed to hide content, and did some more cleaning (i.e. some image galleries had been left as tables...).
 
Once I was done, I went back to help with the website. We still have to finish it all and print the issue...
* '''WHAT I TAKE FROM IT'''
I am a paged.js advocate.
 
It starts to look like a cult and I am a guru '-'
 
We have some kind of difficulty to keep track of this project, everything was so chaotic in December...

Latest revision as of 14:38, 1 April 2025

▁▂▃Protocols for Collective Performance▃▂▁

Since everything seems to be a mise en abyme, this page is going to be all about protocols, in order to be meta and in harmony with this Special Issue's title.
General page of the trimester

Protocol for a field recording

3D satellite view of the place where the recording has been made


Audio file taken from aporee.org near the Balma-Gramont metro station in Toulouse.
Listen to the audio on the website

Map of France to locate Toulouse

Context

Map of Toulouse to locate the place of the recording

This precise place is actually one of the city's borders. It makes the connection between Toulouse and the city called Balma, which is in the North-East.
On the photo above, you can see the Hers[1] river, and a bridge, on which the metro passes (hear it at 01:49). Near this precise point on the map is a big commercial complex, lots of companies and an entrance to the highway. So this is obviously not the place you would expect to hear the birds. Yet, here they are! 🐦‍⬛

  1. pronounced “èrss” (or /ɛʁs/ according to the IPA audio chart and the IPA vowels audio chart)

Metadata

Memory from the place


A song that goes with the memory (kind of)
https://www.youtube.com/watch?v=AlwgC9yqNcw This is a song from my childhood.


Permission granted to share all the audios in the radio show for Sept. 23 2024




Protocol for mourning a database

See User:Kiara/mourning for pictures

  • Choose a date in the calendar, maybe the day you lost the DB :(( and set it as a holiday.
  • Tell your boss/clients/whoever you want you're in grief and need a mourning leave.
  • Rebuild the DB when grief is over :((
  • Learn to backup your DBs to prevent future griefs.



Protocol for a first radio show

23-09-2024
The very first show that took place at Radio WORM with Sevgi, Fred, Kim and Martina.
We used the field recordings, metadata and songs people put on their Field Recording wiki pages.
Listen to the show on Mixcloud!!


Dedicated wiki page: SI25 Broadcast 1: Soundmapping

We made a map tracing the different routes we took with the recordings!

Map radio.png



Protocols for Collective Reading

See the pages referenced below:



Protocols for a Jam Session

24-09-2024
Jam Session with Joseph: creating instruments with unusual objects

Jam 1

Jam 2 (chaos)

Jam 3 (quiet)


Protocol for Canon Music

Clapping-music-sheet.jpg

14-10-2024
Session with Michael: Reading and acting the Clapping Music by Steve Reich.

The pattern is 3-2-1-2 and it's looping.
What happens when the second clapper enters and loops their part?
→ It becomes a canon!
What would be a better way of writing this partition?
→ In a wheel!

It feels like unveiling a secret hidden in the partition - like solving a riddle!

Rotate-the-pattern.jpg



Protocol for a Delayed Radio Show

LostMusic InTheMaking.jpg

04-11-2024
with Chrissy, Tessa, Imina, Charlie

Today, we were supposed to host one of the best radio shows of the trimester. We worked super hard to make it perfect but...WORM faced technical issues and had to close down the radio for an unknown period of time.
We really put our hearts into the making of this show:

CD in the Wild (radio worm) (2).jpg
→ the theme is Lost Music, we asked everybody to contribute by uploading songs from their teenage years onto this wiki page. From this, emerged also a Spotify playlist!!
→ we burned CDs with the songs, according to the themes we agreed on, the CD cases contain a poster and stickers!
→ we made a web page hosting the playlist (downloadable)
→ we thought about copyright, piracy and music that is lost through time by being present only on CDs that people kept (opposed to being present on streaming platforms); but also the fact that through streaming platforms we don't own music anymore, and if the platform goes down, we lose music...


In the end, the show that was supposed to happen on Nov. 4th got pushed to Nov. 25th, and it was a B L A S T.

Dedicated wiki page: SI25 Broadcast 8: Lost Music

Lost Music Radio Group.jpg


Protocol for a Non-Radio Show

18-11-2024
with Feline, Lexie, Eleni, Chrissy

This is the Monday right before the Special Issue Public Event, we are not in a planning mindset. We thus decide to improvise.
We gather vinyls, readings and discussion topics. Lexie and Feline are DJing, Chrissy, Eleni and I are improvising a podcast. We will start by planning the radio show we are actually broadcasting (mise en abyme hehe).

Dedicated wiki page: SI25 Broadcast 7: Improvisation

S M O O T H

Dave 3.jpg


Protocol for organizing an event

28-10-2024 to 03-11-2024

Having 3 meetings in 2 days about the task management, making working groups, deciding on what we do and how we do it.
I am in the documentation team, to find ways to archive the whole event (websiteeeeeeeeee)

PfCP-112024-banner.jpg


My project idea for the event
Inspired by Sarah Garcin's Radio to Print workshops 🠶 there's a python dependency to transform speech into printed text.
Mixed with Eleni's idea of having a spoken input transformed into music via VCV Rack -- in the end we get
 spoken input => becomes music for the listeners + gets printed live (thermal or fax machine)
Adding Zuhui's idea
To engage visitors in this performance, they can become part of the foundational text/speech material for the auditory output: One or two writers will be present in the room, live scripting as they observe the event. This observation can focus on the visitors —or anyone in the room— and may include fictional elements depending on the writers' interpretations and creative choices. Ideally, this live-scripting will be projected on a screen, allowing visitors to watch as they’re being observed and transformed into text, and then speech, which then becomes sound and then text again (in VCV+python) —all in real-time.
Sevgi's idea
This script could also serve as a part of documentation(post-production) of the event. Because it’s the writing of the live observation made directly in the moment and setting of the performance.
Whole public needed
Works best if not time framed but could maybe work if the frame is around 2h
   Remaining questions to work on:
   - Is it live radio or a recording during the day? After thinking about it: with Zuhui's addition to the pitch, maybe recording makes more sense? (open question)
   - Ask Joseph/Manetta how to install the python dependencies because i can't make it
   - Work on how to connect all the different processes (python + vcv + livescript)
Personal documentation of the project
  • WHAT IT IS

Lost in Narration is a performative installation. It is a Text-to-Speech-to-Text-to-Music-and-Print set up. Meaning the whole installation takes a text input which, spoken into mics get translated back into text and music simultaneously, and printed on a thermal printer.

Written Text ---> Speech in mics ---> Speech back to text ---> Music + Print

  • WHAT IT DOES

It questions the purposes and outcomes of communication and story-telling. A livescript of the event gets misinterpreted by a python scripts as it is spoken into microphones, telling a totally different story from the one written by the narrators.

  • HOW IT WORKS

Two narrators sit in front of keyboards and livescript whatever is happening around them. They can decide to twist the actual events, communicate with each other through that narration. The script is projected on a separate screen, in front of which sit two speakers, each one reading a narrator's voice.

---- Add a drawing! ----

When the speakers talk in the microphones, three things happen simultaneously:

- A python script tries to transcribe the words into written text, mostly messing it up
- The same script is also printing this written output to a thermal printer
- An additional computer uses a VCV Rack 2 set up to translate the spoken words into music/sound as they are spoken

When the speakers are done speaking, they can press CTRL+C on the keyboard to tell the printer to cut the paper.

  • HOW IT IS MADE
Narration interface

Built in Unity, each narrator get a font and a colour. Two keyboards are plugged on the same computer and write.
Controls: keys to write, TAB to switch fonts/voices, ENTER to start a new line
A .txt file containing all the written lines is made and preserved during runtime, it acts as a log.
Livescriptprogram.PNG

Text-to-Speech-to-Text-to-Print

Using python and python libraries.

1. Install and run the speech recognition (Windows)
- create a dedicated folder on the computer, where you want to store the scripts and written files
- install sounddevice with pip install sounddevice
- install vosk with pip install vosk
- download this file and put it in the folder
- cd in your folder through the terminal
- run python test_microphone.py
- the program is stopped with CTRL+C
- (optional) you can go modify the test_microphone.py by commenting lines 80 and 81. This prevents the program to print the partial result of it trying to recognize what's being said
- if you want to print the content being recorder into a text file, run python test_microphone.py ›› stderrout.txt. The ›› means that it will append the new data in the file if you stop the program. If you want to overwrite everytime, simply use .
2. Install the thermal printer
- install pyusb with pip install pysub and download the libusb-win32 packages here
- install lib-usb and all the drivers through Zadig: in Options select List All Devices and from the dropdown select the printer device. Then, go through the list of drivers with the arrows and install the WCID Driver for each. IMPORTANT: Replace the printer's driver with the libusb-win32 driver, this is what allows the connection. Zadig will also give you the printer's id, which are needed in the script.py file we're creating later.
- install ESC/POS with pip install python-escpos
- create a new .py file in your folder, via the code editor, call it script.py and put the code below, don't forget to change the ids in the parenthesis. Now you can run python script.py to see the magic happening!
from escpos.printer import Usb
iprinter = Usb(0x0483, 0x811E, in_ep=0x81, out_ep=0x02) #here you replace 0483 and 811E with the ids provided by Zadig
iprinter.text("hello world")
iprinter.qr("https://xpub.nl")
3. Merge the test_microphone.py and script.py scripts

Here is the final code that gets the voice, writes it and prints it:

import argparse
import queue
import sys
import sounddevice as sd
from vosk import Model, KaldiRecognizer
from escpos.printer import Usb
import json
import keyboard

# Define the int_or_str function for argument parsing
def int_or_str(text):
    """Helper function for argument parsing to accept either an integer or string."""
    try:
        return int(text)
    except ValueError:
        return text

# Set up the queue for audio data
q = queue.Queue()

# Define callback to process audio in real-time
def callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(bytes(indata))

# Argument parsing for devices, samplerate, etc.
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("-l", "--list-devices", action="store_true", help="show list of audio devices and exit")
args, remaining = parser.parse_known_args()

# List audio devices if requested
if args.list_devices:
    print(sd.query_devices())
    parser.exit(0)

parser = argparse.ArgumentParser(description="Vosk microphone to printer", formatter_class=argparse.RawDescriptionHelpFormatter, parents=[parser])
parser.add_argument("-f", "--filename", type=str, metavar="FILENAME", help="audio file to store recording to")
parser.add_argument("-d", "--device", type=int_or_str, help="input device (numeric ID or substring)")
parser.add_argument("-r", "--samplerate", type=int, help="sampling rate")
parser.add_argument("-m", "--model", type=str, help="language model; default is en-us")
args = parser.parse_args(remaining)

# Set up the model and samplerate
try:
    if args.samplerate is None:
        device_info = sd.query_devices(args.device, "input")
        args.samplerate = int(device_info["default_samplerate"])
    
    if args.model is None:
        model = Model(lang="en-us")
    else:
        model = Model(lang=args.model)

    if args.filename:
        dump_fn = open(args.filename, "wb")
    else:
        dump_fn = None

    # Set up USB printer (adjust device IDs as necessary)
    # --- This is the small black printer ---
    # iprinter = Usb(0x0483, 0x811E, in_ep=0x81, out_ep=0x02)

    # --- This is the big black printer ---
    iprinter = Usb(0x04B8, 0x0E28, 0, profile="TM-T88III")

    # Start the raw input stream from the microphone
    with sd.RawInputStream(samplerate=args.samplerate, blocksize=4000, device=args.device, dtype="int16", channels=1, callback=callback):
        print("#" * 80)
        print("Press Ctrl+C to stop the recording")
        print("#" * 80)

        rec = KaldiRecognizer(model, args.samplerate)
        
        while True:
            data = q.get()  # Get the next audio chunk

            if rec.AcceptWaveform(data):
                result = rec.Result()
                result_json = json.loads(result)
                text = result_json.get('text', "")
                
                if text:  # If recognized text exists, print it
                    print(f"Recognized: {text}")
                    iprinter.text(text + '\n')  # Send recognized text to the printer
                    
            if keyboard.is_pressed('c'):
                iprinter.cut()

            # Optional: You can also use PartialResult for real-time feedback, uncomment to use:
            # else:
            #     print(rec.PartialResult(), flush=True)

            if dump_fn is not None:
                dump_fn.write(data)

except KeyboardInterrupt:
    print("\nDone")
    parser.exit(0)

except Exception as e:
    parser.exit(type(e).__name__ + ": " + str(e))
VCV Rack 2

Vcv.png

  • My part in the project

We collectively decided to merge our ideas to make a super-project. We found that messing with story-telling and translation was very interesting and à propos since everyone in the class speaks a different native language. It questions the topics of documentation, accuracy and meaning.

To that extent, I was managing a lot of the project, making sure every part was working, and especially working together. I made sure everyone had a role in the group.

  • What I take from it

I tried my best to understand the python scripts, but couldn't get enough comprehension as to merge them. I need to step up and get better at this, python is cool!

I naturally tend to manage groups and assure the harmony of the working process.

The project could benefit from a better workflow, so that maybe it could travel without needing 3 different laptops. How can we achieve that?...

Dedicated wiki page: Lost in Narration


Protocol for wrapping up the Special Issue 25

25-11-2024 to ...

We gathered as a team and discussed the outcome we want for the Special Issue 25.

The idea is the following:

  • event documentation
  • reflection on the radio, what we did in those 3 months

For this, we decided to make a website to print, that displays all the information about radio shows and the 20 nov. event.
The website will have two distinct sections, one for the radio and one for the event, built upon the already existing website.

So we divided tasks to work efficiently:

  • Design group: code + design
    • Feline + Kiara + Kim + Tessa
  • Archive group: gathering all wikis and pages, gather pictures and select
    • Wiki: Charlie + Claudio
    • Pics: Chrissy + Zuhui
    • Video editing: Wyn

Link to the pad

21-03-2025 UPDATE

In the end, we decided to build an entirely *new* website. It uses a script and the wiki API to fetch data from wiki pages and insert them as content.
In order to do so, we decided on a very methodical approach that required a thorough exploration of all the wiki pages for the different Radio Shows and SI25 Projects in order to make sure they followed the same structure, the same naming procedure and eventually to add HTML classes where needed. We also gathered them in new Content Pages (see below) either by linking them or using the power of transclusion.
This way, we could also push the content into a paged.js template to produce a printed archive of the trimester.
We are still in the styling process, as this method brought many bugs and needs for hacks in order to work properly.

  • HOW IT WORKS / HOW IT IS MADE

A script uses the Wiki API to fetch the content (see below) and put it in a HTML file.
By adding classes and HTML tags inside the wiki pages, we can now target them in CSS to style the website and the print accordingly.

The print is generated using paged.js

We use various stylesheets for the website, allowing us to work remotely and simultaneously without overwriting each other's work. Kim and I have been doing some stylesheet cleaning and restructuring lately.

Wiki Pages (Content)

Website homepage
The print content
Radio Shows
Public Event and Pictures

The working spreadsheet made by Claudio and Charlie to make sure the content was up to date and ready to be pushed to the html source.

Preview Links

Website (WIP)
Print (to be printed)
  • MY PART IN THE PROJECT

I took care of all of the print. Some decisions were made collectively, such as choosing whether or not to display the audio players (I voted yes...). Then, once Claudio and Charlie cleaned up the wiki pages, I did the whole print layout. I went back into the wiki pages to add some classes that were needed to hide content, and did some more cleaning (i.e. some image galleries had been left as tables...).

Once I was done, I went back to help with the website. We still have to finish it all and print the issue...

  • WHAT I TAKE FROM IT

I am a paged.js advocate.

It starts to look like a cult and I am a guru '-'

We have some kind of difficulty to keep track of this project, everything was so chaotic in December...