Domifare back under active development!

I’m very exciting to be submitting a proposal to do a performance in the tuba-entered live coding language Domifare.

I’ve been wanting to pick this back up for a while and it seems like the main thing that motivates me is a deadline, so now I’ve got a deadline for version 1.0.

The initial specification of the language is quite modest to implement and my teaching term ends next week, so I’m confident this will be playable by the time the gig arrives. It’s always going to be chaotic because tuba pitch tracking, but it will be a joyful chaos!

More here as I get to active developing.

Peer Work

There is a very handy Moodle plugin called peer work, which you can use to allow students doing group work to assess each other’s contributions and scale the group marks accordingly. In a document authored by Dr Sean Williams, he notes that benefits for students include “a greater engagement with critical thinking; greater awareness of marking criteria; more perceived fairness in assessment”. This plugin saves a lot of paperwork and spreadsheet wrangling.

The upsides of this plugin are clear, but unfortunately, the documentation for it is sometimes less clear, alas. Although, it does cover some aspects of it’s use very well. This blog post is meant to cover some gaps.


As this plugin is for group work, you’ll need to create groups on your moodle, which is well-documented.

Using Likert scales

In this plugin, students are asked to rate each other’s skill and/or participation according to a Likert scale. Dr. Williams suggests this should be 0-5. You will first need to create a scale, which has a good moodle documentation page. Open your course in moodle. In the left hand column, click grades. Under grades, click scales. Under scales, at the bottom, click “the “Add a new scale” button. You will have to provide a name for their scale and commas separated list of scale values from low to high. The values I have used are: No contribution, Minimal Contribution, Reasonable contribution, Very good contribution, Excellent Contribution. The name I chose for this scale is “Peer Assessment Scale.”

When you create a new Peer Work item on the moodle page, it should look familiar to regular moodle users. The questions for peer evaluation go in the “Assesment Criteria Settings” section of the settings. You will set several criteria, eg “How was this student’s attendance at group meetings?” Each criteria has a description and a “scoring type”. For the scoring type, pick the scale that you made.

Using my new scale with the peer assessment questions

Students should see your Likert scale for the question. You must set the scale per question. You can use the one scale you made, or if you feel it’s not a good fit for the question, you can make custom scales for each item. For this criteria, I could have a specific scale that started with: Never attended, Attended Rarely, … etc.

Calculator Settings

When you are setting up the plugin, you’ll need to set the calculator setting. This sets how much the students marks are effected by their peer evaluations. Dr Williams says, “By default this is set to 50%, meaning that 50% of the group mark is given directly, and 50% is subject to the multiplier. If this gives a spread of marks judged to be too narrow, then it can be adjusted. Normally this shouldn’t be more than 60% or less than 40%.”

There’s also a penalty for non-submission, where they get dinged if they fail to evaluate each other. The default is 20%. Dr. Williams suggests students should be told this early.

The calculator settings

How this multiplier works is explained in a PDF buried in the plugin’s source code which is a copy of this web page. The student’s peer scores are used to calculate a multiplier for the group grade. This is done so that nobody is penalised if a peer’s marks are missing, skew low or skew high.

Each student gets a percentage mark – the multiplier. If the peer weighting is 50% and you’ve given them a score of 100, they get 50 marks from the group grade (as in 50% is directly the group grade) and the other half of the mark is calculated by multiplying it by their personal percentage mark. So if the student Bob gets an 80 for his personal percentage mark, his overall mark is 50 + (50 * 0.8) = 90.

The percentage mark can exceed 100% in some cases. If Alice’s group has gotten a 90, and Alice has gotten a percentage of 115, her score would be 45 + (45 * 1.15) = 96.75.

Student marks are capped at 100.

Running an online student concert

I wanted to come up with the most straightforward possible setup, so that students would be able to copy it and run their own events with minimal fuss.

This plan uses Twitch, which has two tremendous advantages. It has a performance rights society license, so everyone is free to do covers with no copyright consequences. (Just don’t save the stream to twitch.) The other is that the platform is designed around liveness, so if there are gaps in the stream, it’s not a problem. This means that no stream switching is required.

Student skills required

The students need to be able to get their audio into a computer. This might entail using a DAW, such as Reaper, or some sort of performance tool. They need to be able to use their DAW or tool in a real-time way, so that performing with it makes sense. If they can create a piece of music or a performance with software that they are capable of recording, then they have adequate skills.

This checklist covers all the skills and tools that a Mac or Linux user will need to play their piece. It will work for many, but not all, Windows users. This is because Windows setups can vary enormously.

Once everyone is able to stream to their own Twitch channel, they have the skills required to do the concert.

Setup and Organisation

You will need a twitch account dedicated to your class or organisation. You will also need a chatroom or other text-based chat application to use as a “backstage”. Many students are familiar with Discord, which makes it an obvious choice. Matrix chat is another good possibility. If you go with discord, students will need to temporarily disable the audio features of that platform.

As the students are already able to stream to Twitch, the only thing that will change for them is the stream key. Schedule tech rehearsals the day of the concert. Arrange that the students should “show up” in your backstage chat. At those rehearsals, give out the stream key for your channel’s stream. Give the students a few minutes to do a test stream and test that their setup is working.

The students should be instructed to wait until instructed to start their streams and to announce in the chat when they stop. If they get disconnected due to any kind of crash, they should check in in the chat before restarting. Once they finish their performance, they should quit OBS so they do not accidentally restart their stream.

When it’s call time for the concert, they also need to show up in the backstage chat. They should be aware of the concert order, but this may also change as students encounter technical challenges. You or a colleague should broadcast a brief welcome, introductory message which should mention that there will be gaps between performances as the stream switches.

As you stop broadcasting, tell the first student to start and the next student to be ready (but not go yet). The first student will hopefully remember to tell you when done and stop their stream. As their stream ends, you can tell the next student to go. You should be logged into the Twitch web interface so you can post in the chat who is playing or about to play.

After the concert ends, reset the stream key. This will make sure their next twitch stream doesn’t accidentally come out of your organisation’s channel.


The downsides of this steup is that there will be gaps in the stream. If a student goes wildly over time, it’s hard to cut them off. However, the tech requirements do not need any investment from your institution and, again, they should be able to organise their own events in a similar way using the skills they learned from participating in this event.

Performance Disasters

Some of my students have stage fright and don’t want to perform. This circumstance is highly relatable. I thought it might be helpful to share some stories of stage fight and performance gone wrong.

I used to get terrible stage fright. The way I got over it was to keep going on stage, a lot, despite being absolutely terrified every time. As a youth, I got relatively used to playing in front of strangers, but one time, in a youth group, I was playing trumpet in front of my peers and got so alarmed, I couldn’t get my lips to buzz.

More recently, I wrote a piece performed with a gamepad and when I went to perform it, found my hands were shaking too much to play it!

For me, just giving it ago, despite the fear, was got me through it. But, perhaps for some, an exercise in “what’s the worst that could happen”? will help.

Let’s watch a John Cage performance. Do you think the audience’s reaction indicates success or failure?

John Cage performs Water Walk on the TV show I Have a Secret

Ok, so the audience laughed but he said he was ok with that and his performance got broadcast out on national television, so perhaps the exposure was worth the mirth. But did you notice anything wrong with the performance?

Things that I noticed going wrong included

  • The radios were being plugged in. This was due to disagreement in the unions about who’s job it was to plug them in. (The moral of that story is to keep the union on side. Solidarity. Also, if you’re doing something weird, be patient while they go through the normal setup process. They’re used to being talked down to, so don’t offer instructions or suggestions unless their normal setup doesn’t work.)
  • The blender caught fire.
  • The rubber ducky was completely inaudible.

Two of these three things were huge problems. Radios are a key part of the piece. The blender situation was also quite alarming and changed the flow of the piece, as the crushed ice used later on was not available. Cage had to be adaptable and think on his feet in a performance situation that had numerous disasters before and duing.

Most people don’t notice the problems because he kept his cool throughout. This kind of composure is the product of experience. Things go wrong, but the show must go on. For people unused to performance, it’s likely that you will seem nervous. You are nervous. But with practice and experience, you too can keep your cool. After all, what’s the worst that can go wrong?

Angie’s Persimmon Cookies (again)

Eleven years ago, I posted a treasured persimmon cookie recipe to this blog. But I held something back from you, dear readers. My mother made those cookies many times, but I’m not sure I ever did. Also, the metric conversions were from an online calculator, so potentially dodgy.

Biscuits / Cookies

Today, I have finally made these. They took just as much time as I feared. My mum had a special tool for pulping things, but I don’t, so it took 40+ minutes to shove the flesh of a less-ripe-than-ideal persimmon through my wire strainer, by mushing it with a rubber scraper.

Biscuits / Cookies

While making them, I measured all the ingredients with my American cup measure and then weighed them with a kitchen scale. Some of them differ significantly from the calculated version. In this case of the sugar, this may be explained because the Hackney City Farm is only selling an unusual type of raw sugar (date sugar?) that seems more like brown sugar.

I’ve also made steps to veganise it.

The new, metric measurements are:

  • 150 g sugar
  • 90g margarine
  • 2 tsp chickpea flour
  • 300g persimmon pulp
  • 1 tsp bicarb
  • 225g plain flour
  • 1 tsp (5 mL) salt (I still use less than Angie did)
  • 1/2 tsp cinnamon
  • 1/2 tsp cloves
  • 1/8 tsp nutmeg

Cream the sugar and the margarine. Add all dry ingredients except for the bicarb. Strain the pulp. Mix everything together. Make sure it’s properly mixed. The margarine-sugar will tend to stay in clumps, which can make the biscuits stodgy.

Spoon the batter on to a biscuit sheet with a soup spoon and bake at 190 C (375 F, gas mark 5) for 10-15 minutes. They will raise as you bake them.

I’ve left off the nuts because somebody on my list is allergic. I used chickpea flour to replace the egg, but any emulsifier will work. I didn’t add liquid because the pulp is already pretty wet, but you could add a few teaspoons of water or soy milk or the like.

Previously, I said that Chris and Angie were an elderly couple over the road. They were Sicilian. Chris was in his late 90s and had worked on the construction of the Golden Gate Bridge before spending the rest of his working life as a gardener for the city of San Francisco. Like many Sicilians, they had summer houses in the hottest part of Cupertino. That community would typically build two buildings – one would be the house and the other would be the kitchen and a semi- outdoor eating area. My neighbours retired to that summer house and it was (one of?) the last of those still standing with that configuration.

Chris taught us a lot about gardening and looking after plants and trees. Even in his late 90s and nearly blind, he would come talk to my mum about looking after the roses and would sometimes just prune them because he loved them. (He also had ulterior motives with regards to my mum, so he wasn’t totally blind.) Angie made amazing cookies and was very generous in sharing her food and her recipes. Neither of them could drive, so my mum would take her around to the shops. Sometimes several shops, as she’d snip coupons from the papers.

A plate of cookies

Chris was sprightly for a 97 year old man, but had several health problems. Angie used to buy him exotic multivitamins that came in gigantic pills which resembled submarines. When my mum confessed Chris’s proposition to my dad, she was worried he’d be angry, but instead my dad started taking the same vitamins!

A biscuit
A biscuit

Running a festival fast with less Google

One day, a little while into lockdown, I rang up my friend Shelly Knotts and suggested we reboot the Network Music Festival, which had last run 6 years earlier. “Leaving aside all the reasons this is a terrible idea,” I began and she revealed that she’d had the same thought. We were in.

She made a Gantt chart, a drawing that shows dependencies for scheduling, and said the soonest reasonable time to do it was roughly three months in future. So we set that date and set out. Our goals were to do an all-telematic festival with an open call, a few invited acts and no use of google. We were not to achieve all these goals, but we did put on a festival!

Shelly made a budget and asked me for some estimates. My first mistake was not taking that step seriously enough. We’d applied for funding previously and never gotten it, so I did not put in any pay for myself and I did not spend enough time looking at how much streaming would actually cost assuming we could just buy two months of a vimeo subscription. It turns out you can’t sign up for less than a year.

We already had a wordpress site with a minor malware problem, a google mailing list and a gmail account. I removed the malware and installed bunch of security software on wordpress, but didn’t have time to upgrade or replace the theme. I tried to setup a mailman list, but ran into some weird problem with the anti-spam features. And as a temporary measure, I set the new email address to direct to the old one. All of these things are still on my todo list.

To run the open call, I looked at all the conference management systems widely used. Like many of the formerly no-cost solutions I remembered from 2014, these charge money now. I wasn’t sure how much response we would get, but I was worried about capping it at the free tier. All of these systems are also designed for science conferences, not artistic events. I decided to use Ninja Forms.

To test Ninja Forms, I put up a default wordpress installation at a subdomain and put Ninja Forms on it. My mistake as that this was not a duplication of our existing site – it had many of the same plugins but not the same theme and certainly not the same content. It wasn’t a proper testing server. So as the open call was running, I got some email form people who were unable to submit their forms. I couldn’t submit them either – something about the content was screwing up and it wasn’t the post length or anything I could pin down. It worked fine on the testing site. We quickly recreated the forms on Google.

Meanwhile, rather than use Google sheets or their online text editor, we started using Cryptpad because Fossbox has an account there. Their spreadsheet glitched and lost a lot of data. We filed a bug report and they said they fixed the problem, but we did not return to them for spreadsheets. We did use their rich text documents, which work beautifully.

When it came time to combine all the data from the open call forms, I put both batches of data into CSVs and used Libre Office to create a giant set of sheets. I assigned entries IDs. By hand. This was a mistake. And broke them up into a bunch of sheets associated with submission types. I also looked for duplicates and removed them – sorting them by title and email to look for matches. I used a mail merge operation to product a bunch of html documents with anonymised submissions for our reviewers. Because I sorted them after assigning IDs, the names of the documents and the ID numbers didn’t match. Only one reviewer noticed.

Meanwhile, we’d been collecting potential reviewers into an excel sheet. We tried to have equal numbers of men and people who are not men (read: women and enbies, a group that otherwise should not be lumped in together). We found that men were way more likely to agree to do reviews and ended up asking about twice as many women. It’s extremely fortunate that I decided not to use the free tier of Easy Chair as we had more than double the number of submissions they allow. It was a real scramble trying to find reviewers. I returned to facebook and leaned on friends for recommendation.

I used the UNO bridge from libre office to python to email all the reviewers their agreed number of reviews. Each item was to get double reviewed, once by a man and once not by a man. Every item did get reviewed at least twice. A few got additional reviews. Reviews went to another google sheet.

Collating the submissions with the reviews is too much to reasonably to in a spreadsheet, so I imported all the submissions and all the review CSVs into sqlite3. I wrote some python scripts to spit out submissions coupled with reviews so we could use them to figure out what to accept and reject. These were sorted by score. We decided that everything with a score of 4 or 5 should probably be accepted and anything at a 2 or lower should probably be rejected. However, we did both look at every single one of the submissions and decide to take them or not, sometimes overriding a low score, but never a high score. We put our decisions into a spreadsheet and then had a meeting to discuss only our disagreements.

Like all our meetings, this was held on Jitsi Meet, one of the platforms we were considering for workshops. And, indeed, it was not just one meeting, but several. We started out imagining getting around 50 submissions and accepting around 25. We got 164 and accepted 101.

After we came to an agreement about who to programme, I spit out sheets with just the reviews and emailed them to all the submitters. It was here that an error came to light. I’d assigned the same ID to two different groups and they both got back a mixture of reviews meant for both of them. Because I’d exported the submissions via a mail merge in libre office, it hadn’t cared about the duplicated ID. It made a file for every single row of the spreadsheet. So everything had been reviewed, but the reviews had been jumbled up. We got an email from one of the groups saying they thought they’d received the wrong reviews. I double checked everything then and this only happened to one group.

Once we knew who we were accepting, we asked accepted groups to verify if they would perform and to use a free web meeting calendar to track their availability. We also asked them if they want to correct any of their information. I wrote another python script to copy everyone who accepts into a new sqlite3 database, and replacing their information where they offered corrections. Only a tiny number of groups wrote “no” in those forms, so it worked mostly without a hitch.

I wrote yet another script to upload every database record to our website. While I was doing that and uploading the late responders, Shelly was proofreading everyone’s programme notes and biographies. We shared the database on Dropbox. My internet connection is quite slow and big databases are big and also not text, so automated merging of file changes went catastrophically wrong. Shelly lost most of her edits. We moved our database back to google sheets.

It was then I found out that the meeting-scheduling website would only export a CSV if you bought a year long subscription. I signed up for an account and tried to get the calendar to associate with my new account and it wouldn’t, so at least I was spared the expense. I used google sheets to create a date field incrementing hour by hour for the full duration. I cut and pasted this list into a plain text document and followed every line with a comma. As I moused over every single separate square of the 100 and some possible festival hours, a little popup appeared with a list of everyone who said they were available at that time. I copied and pasted these lines into the text document. This gave me a bunch of lines starting with a date and time, followed by a bunch of identifiers.

I uploaded my new file as a CSV back to google sheets. Each row started with a time and the subsequent cells identified which groups were available. It was a perfect triangle wave of availability. Shelly had made a draft programme and it did not correspond to the listed availabilities. Worse, many of the groups had put their names in the form rather than the submission ID number, so I had to do a lot of database searching to figure out who “Joe Bloggs” was and eventually resolve everyone to an ID.

Then, once I knew who was who, it looked NP complete to figure out how and when to programme them. I found the least available bands and made graphs of when they could play. I started looking into what algorithms might cope with this completely intractable problem. It was then that Shelly put her foot down and demanded she take charge of this creative, curatorial problem. She came back the next day with a working schedule. I still have no idea how she did it.

Our old paypal account still existed and I started seeing notices of donations. But what was the password? The bank account it was linked to was long dead, but an old email with the account information contained enough detail that paypal let me back into the account. Thank goodness.

Around then, I went virtually to the Art Meets Radical Openness conference, which went extremely well, so I decided we should copy them as much as possible. They used BigBlueButton, which I liked, so we began looking for a BigBlueButton host. runs a server, so we asked them and because life is uncertain, I also asked a bunch of other people, two of whom agreed. One was senf call, which was great, but in German and the other was nixnet in North America. One thing we didn’t know was how many people could be in a single BBB meeting, so I read the FAQ for the software and it said it should be stress tested by getting some volunteers to all open five browser tabs to the service. I rounded up some friends and found definitively that if anyone opens five browser tabs to BigBlueButton, their laptop will crash. Later, our North American host laughed and said he regularly has groups of 100 people!

AMRO had backchannel chat in Matrix, so we did as well. They ran their own server, which it made it work way better than using the regular Matrix server. The invite link for that service leads to what looks exactly like an error page. I ended up putting a screenshot of that page on our website with an arrow showing where to click.

AMRO had a stream out via DorfTV and an audio-only stream via a radio station, so we decided to try to have a produced stream and an audio stream. The audio-only component was especially important to me, since my home internet quality is variable and I ended up replying on the audio stream to be able to listen to concerts. I’ll talk more about how we did the AV in another post.

AMRO had a website for the conference that had large portions that were just flat files. No caching. No overhead. Fast to load. No trackers. Holger Ballweg, Shelly’s partner, built a flat site for us that had a video player, a link to the audio player, a chat widget and a scrolling schedule that changed times based on your submitted time zone and told you what was coming when. He also made a bunch of pages for our exhibition of web installations.

I was trying to get something similar on the wordpress site, but the calendar plugins did not do what I wanted. We finally ended up making a bunch of Event Bright events and told people to use those to get their time zone. Those events also export in very few clicks to facebook, so we put up a a facebook event for every concert and workshop.

I exported all those events to a google calendar and then used IFFT to post about the events as they started to our official twitter account. I hope this drew people over. Most of our promotion of the open call and the festival was twitter and facebook. We also had a presence on mastodon, which cross-posed to my personal twitter account. I’d never deleted it, so I also turned Cheap Bots Done Quick on to it with some sincere left wing content and a bunch of posts about the festival. Shelly also wrote a press release and subsequently we were included in some concert listings as well as the Other Minds mailings, which certainly helped.

As the festival drew ever closer, my attention turned to the streaming process and also providing tech support to people inexperienced with streaming. We had “new to networking” categories and “student” categories and hoped to help people get into telematic performance who might not have done it before. After a long Jitsi meeting with someone new to networking, I wrote the conversation up in a blog post for fossbox. I learned how to do weird things with system audio in BigBlueButton.

I also started trying to harden the WordPress site against heavy traffic with SuperCache. This says it can’t cache the mobile site without Jetpack, so I installed the Jetpack plugin to find it has spyware in it. I set about trying to disable it, something their privacy policy notes the site owner can do. Their privacy policy doesn’t note that it requires either patching the source code or installing yet another plugin to patch the source code. Otherwise, it merrily ignores Do Not Track settings, sharing the data with their parent company. Alas, all of WordPress seems to be this kind of dodgy grift these days.

In the end, we presented 97 groups. We raised more than £1000 in donations. These are meant to go to the independent artists in the festival, of which I don’t yet have a count – they’ve got yet another form to fill out. I don’t know how many people passed on stage and backstage but it was a lot. We streamed roughly two terabytes of festival.

My todo list now is: Get away from wordpress to a lower-carbon system such as Hugo. Find and deploy a database with a Google-sheets-like interface, so I can do SQL while Shelly edits. Get rid of Google forever for real.

We’re planning on repeating the festival next year, so we really should start getting on funding applications. I felt a real sense of camaraderie in the VR algoraves, so it would be nice if the entire festival was in VR next time. Mozilla hubs is still kind of buggy, but hopefully it will be better by next year. Of course, Second Life supports audio streams, so there’s always a dual option for the overly old school among us.

It’s been a week and a half since the festival ended and I still feel slightly tired out after it. This post mostly only covers what I did for the festival but not Shelly. It would be more than twice as long if it included all of her intense work. There will be forthcoming a more how-to post on running the data admin. I’m not sure anyone would want to copy us, but it did work and I think a documented process is valuable. I’d like to see an AGPL solution that can be customisable for the arts. And, as promised, I’ll talk in detail about how we managed the streaming, as that ended up working really well.

If you want to make a donation, all of the money raised via paypal before 10 August will go to our independent artists.

Data Wrangling

I decided to roll our own form and review management for the Network Music Festival despite how much work this was the last time I did it. I also wanted to stop using Google and to have more flexibility.

So we deployed Ninja Forms, which has high ratings and worked great on a test website.

But then we started getting some emails. Some forms would not submit. There were no error messages in the logs. I tried a lorem ipsum generator and it wasn’t the amount of text. It wasn’t the special symbols. It worked great on the test website!

So we switched to google docs.

So then, when the call ended, I had to merge a bunch of spreadhseets together and then break them up again by what sort of performance people submitted. This is tedious and there’s always a risk of clobbering somebody’s data.

Then everything must get an ID. Rather than write a macro, I did it by hand. Which, again, is risky.

Finally, that done, I need to generate documents or whatever for reviewers to look at. In this case, I did write a macro. But then I wanted to convert all the URLs into clickable links. So I learned a little bit about how the python API works with LibreOffice.

I generally think of myself as fairly intelligent, but I found the documentation extremely hard to navigate. It definitely would have been faster and easier to also do this by hand, but by then the time reading the documents was a sunk cost.

So here’s how I’ve done it. I did a merge with the spreadsheets and a template, which is also a convoluted process that tends to crash things, because why wouldn’t it? I generated a large number of .odf files, one for each submission.

In open office, I went to Tools → AutoCorrect Options... → Options tab →
☑ ☑ URL Recognition

I turned off everything else in autocorrect. I don’t want to mangle anybody’s spelling capitalisation, etc.

Then I wrote a Python script:

# import socket  # only needed on win32-OOo3.0.0
import uno

# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
				"", localContext )

# connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager

# get the central desktop object
desktop = smgr.createInstanceWithContext( "",ctx)

# access the current writer document
model = desktop.getCurrentComponent()

# get the dispatcher
dispatcher = smgr.createInstanceWithContext( "", ctx)
doc = model.getCurrentController()

# run the commands
dispatcher.executeDispatch(doc, ".uno:AutoFormatApply", "", 0, ())
dispatcher.executeDispatch(doc, ".uno:Save",  "", 0, ())
dispatcher.executeDispatch(doc, ".uno:Quit", "", 0, ())

I found a lot of useful documentation for this at:

Now, obviously, that connects to a running version of libreoffice which has the document you want already open. Obviously. There’s a command line for libreoffice that does a few things, including opening a port to listen for python commands. It also does file conversions.

Before I go, I /know/ I could have done a file conversion in the python script, but sometimes, when evaluating time save shortcuts, it’s important to make a note of how long it would take to figure out the shortcut. None of the commands called in my python script take arguments. I’m sure passing arguments is straightforward and also not documented anywhere on the official site. (If this is wrong, I’m sorry, but yikes, you guys.)

So I wrote a bash script that traverses a directory and also calls the python script


for file in *.odt
    soffice $file --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" --headless &
    sleep 3
    python3 ../
    wait $pid
    soffice --headless --convert-to htm:HTML $file
    rm $file

That sleep is in there because you have to wait for writer to get going and allocate a port or else the python script hangs and everything goes to hell.

The next step is to allocate 2 reviewers (one from column A and one from column B) to every item, making sure that every reviewer gets no more than 5 items, mark this in a spreadsheet and email them off.

I expect this will also take about 5 times as long as doing it by hand.

Collaborative Live Coding via Jitsi Meet for Linux Users

Jitsi Meet works best in Chromium, so these instructions are for that browser. It also assumes that your live coding language uses Jack Audio.

Jack and Pulse

The first thing you need to do is to get Pulse Audio and Jack Audio running at the same time and talking to each other. For me, I was able to solve this in Qjackctl. In settings, under the option tab, go to Execute Script after startup. Paste in “pactl load-module module-jack-sink channels=2; pactl load-module module-jack-source channels=2; pacmd set-default-sink jack_out” without the quotes.

You can test if both are running at once by starting jack and then playing audio from a normal system program like your web browser. If you hear sounds, it worked.

More information about getting both running is here.

Jack Audio – Pulse Sink

Make Connections

You get two sinks. One of them is going to be used to send audio into Jitsi and the other will be used to get audio out.

Jack with two Pulse sinks and the system in/out

Start your live coding language audio server. (Ie Boot SuperCollider). Go back to Qjackctl. Click on connections. Go to the Audio tab. Make a connection from your live coding language output to Pulse Audio Jack Source-01 input. Do this by clicking on the language in the left column and the Source-01 in the right column so both are highlighted. Then click the “Connect” button on the lower left.

Disconnect the the system output from that Source’s input if you want to turn off your microphone. Do this by clicking on the system in the left column and Source-01 in the right column and clicking the “Disconnect” button.

Everything connected correctly

Chromium Settings

(These will also work for Chrome.)

First open your Jitsi Meet connection. If you are using the server at, you can skip this step.

For most other Jitsi servers, in Chromium, go to chrome://settings/content/microphone Change the mic input to Pulse Audio Jack Source-01.

Chromium Settings

Jitsi Settings

As we’re live coding, you’ll want to share your screens. Mouse over the screen so you can see the icons at the bottom appear. The one in the lower left corner looks like a screen. Click on it.

The farthest left is the screen

It lets you pick a video source. If you’re on Wayland, like most linux users have been for years now, you can share your entire screen, but you should be able to share a single window. If you don’t see your live coding language listed as a window, make sure Chromium and it are on the same virtual desktop.

Share Your Screen

Click the screen icon again to switch back to your webcam.

Fancy New Options

If you’re on a shiny new version of jitsi, such as the one at, You’ll see little carrots by the mic and video icons in the centre bottom of your browser window.

New Features!!

These allow you to pick your audio source without having to go into Chrom/ium settings. If you have more than one webcam, you can also pick which one you want to use there, without having to go into Chrom/ium settings for that either.

Be Careful of Levels!

Jitsi was made assuming that more or less one person would be talking at a time, so multiple streams at full volume can distort. Make sure to leave your output low enough to leave room for your collaborators. Your system volume controls will not work, so be sure to set the levels in your live coding language IDE.

Also be aware that while the compression sounds good for free improvisation on acoustic instruments, the transformations on digital audio will seem more pronounced. Go with it. This is your aesthetic now.

Scores for Quarantine 2: Homage to Norman Rockwell

For four or more players.


Players assign themselves positions in a virtual circle.

Using two different communications devices, players make an audio connection to the players on their left and right, but no other players.

Improvise in this trio.


One possible setup for this might be to use two phones and use one ear bud from each.

Using a mixer would also be possible, but heapdhones are still advised to prevent sounds from the distant players reaching each other.


Just using a real telephone is fine, but any audio software will work.


If everyone is using two mobile phones, call recording software running on every single one of them could potentially be mixed together to make a large piece, but it may be that this piece is only meaningful to participants.

This score is Creative Commons Share-a-like

Have you tried playing it? How did it go? Were you able to record it?

Telematic Performance and e-learning

I’ve put some resources up for my students and I’m going to copy them here in case they’re of wider interest. I’ve made instructional videos for using some of the tools.

Online Meetings / Online Jams

  • Jitsi Meet– Doesn’t spy on you or sell your data. Can be used via mobile device with a free app or accessed via a web browser on your computer. Users without either of these can call in using local numbers in several countries. Can record to Dropbox or stream to YouTube. Works best with chromium/chrome. Some people have good luck with Firefox. Safari has poor results.

Telematic Performance Software and Platforms

  • OBS Studio – Stream Audio and Video and/or record your desktop. (How to use on mac.)
  • Upstage – Cyber performance platform, mostly used by artists.
  • LNX Studio – Collaborative platform for making popular music across a network. Mac only. Last updated in 2016, so may not work with the newest macs.
  • Soundflower – Zero latency audio routing for mac. (Use it to get audio to and from jitsi meet and OBS.)
  • BlackHole – Even more zero latency audio routing for mac. (See above.)

Video Tutorials

Made by me. My students like videos. I’ll post text here later. All of these are for Mac.