GeistHaus
log in · sign up

Chris Lowis

Part of feedburner.com

stories
2026-10
Show full content
  • I’ve been waiting for the plum tree in our garden to bloom since we moved in last year. This week it did.

    The white blossom of a plum tree, cropped tight with shallow depth of focus. A garden shed, wall and wood pile are visible, but blurred, in the background

  • I went to see York City play away at Boreham Wood on Tuesday evening. As is customary when I attend a game, we lost. In this case also ending a 24-game unbeaten streak. On the plus side I got to spend some quality time with my oldest friend.

  • I spent most of the day at Royal Brompton on Wednesday as part of the clinical trial I’m involved in. I’ve written a lot about what this involves in the past and there’s not much to add (I’m doing OK!).

  • Chelsea’s weird innit? If misfortune lands you in that part of West London have lunch at unassuming noodle bar Phât Phúc. It’s one of my favourite places to eat.

  • Chris and James travelled in to London on Friday. It was great to catch up - we sorted out some (r)admin, caught up on life, put the world to rights and ate some lunch. Restorative stuff all round.

  • In order to bribe reward the kids for being generally great while A- was away earlier this year we promised to take them back to Coral Reef Waterworld in Bracknell. It’s a bit of a shlep just to go swimming. But there’s no pool like it closer to home. We all had a lot of fun on the 5(!) waterslides, pirate ships and water volcano.

  • The Colonization of Confidence by Robert Kingett is a fantastic short story about writers fighting back against AI slop.

    So the Tech Bros, in their infinite mediocrity, decided to bypass the human element entirely. They built a machine that scrapes our work—our pain, our joy, our very souls—without consent, grinds it into a mathematical slurry, and extrudes it as a flavorless, inoffensive paste that can be sold by the bucket

https://chrislowis.co.uk/weeknotes/2026/03/08/weeknotes
2026-09
Show full content
  • I spent Thursday lunchtime doing some phone banking to help get the (Green) vote out in the Gorton and Denton by-election. It was inspiring to see so many people involved and fantastic to wake up on Friday to news of a successful result.

  • While F- was at music centre on Saturday I went along to the start of the Green Party “day of action” - a campaigning event across Islington for the upcoming local elections. It was really well attended, but Zack Polanski’s speech was cut short by some protesters who’d gate-crashed the event. I’m feeling hope again in national politics for the first time in a long time but I’ve seen before how the fractured nature of everything makes it tough for left insurgent movements.

  • I played a first game of kid-friendly RPG Hero Kids with F- and N-. They got quite involved in the story (rescuing the local tavern-keepers sun from a giant-rat infested cellar), and the rules were simple enough to keep the game moving. I found the scenario a bit procedural (lots of similar fights with giant rats), but I threw in a puzzle for them to solve (how to scale a large wall) to keep things interesting. The final battle with the rat king was nail biting stuff! I think some terrain and miniatures might be more appealing to them than the paper maps and characters I used (and give me an excuse to build and paint more stuff).

  • I stayed in the office on Friday evening to hang out with Animorph and friends. We’re giving up our shared office soon so it’s the end of an era - I’ve really appreciated sharing the space with them especially during the weird socially-distanced pandemic years.

  • I’ve been watching a couple of trashy Netflix series with A-. I thought The Night Agent was a good thriller with some strong performances - in particular Stephen Moyer’s unnamed contract killer who is also raising an 8 year old son. I also enjoyed the sets and costumes in Bridgerton. The story and acting, not so much.

https://chrislowis.co.uk/weeknotes/2026/03/03/weeknotes
2026-08
Show full content
  • Sprinkles of good news (the arrest of “Prince” Andrew, the sort-of-overturning of the palestine action proscription) this week to compliment the improving weather and early signs of spring.

  • I went to my first Green Party meeting on Wednesday night after joing up last year. It was a more serious debate than I’d expected (and apparently this is somewhat unusual) but the high spirits and diversity of the members attending made me feel quite hopeful.

  • I had a pretty productive week at work and enjoyed doing a bit of prototyping/data analysis again. But I’m continuing to struggle with the current state of the industry. I spent a bit of time on lobste.rs again. It’s less slop-ridden than elsewhere but still not that enjoyable. I’m thankful my RSS feeds keep coming up with uplifting things to read, and James does the same in one of our Slack channels. I think I just want Computation Club back. And the time before all this happened.

  • A- bought me a laser-cut MDF old west saloon kit from AQS Games to sit alongside the two scratch built buildings I’ve made for my slowly-expanding Spaghetti Western town. It was quite good fun to put together, although I think laser-cut plywood would be nicer to work with - the MDF absorbs glue like a sponge so you have to work quite quickly when gluing things together. I’m looking forward to getting them painted up and eventually playing a game of Dead Man’s Hand with the kids.

https://chrislowis.co.uk/weeknotes/2026/02/22/weeknotes
2026-06
Show full content
  • For the first time in ages I went for lunch and came out feeling well-fed and not ripped off. So many places seem to be cutting quality and putting prices up. Kami in Kentish Town served up a big bowl of rice, lots of crispy tempura, a tasty sesame salad and miso soup for an entirely-reasonable-for-2026 £15.

  • We then took the kids to the Tate Modern and spent a good couple of hours in the Uniqlo Tate Play. Essentially this was a big table with paper and paints, but we really enjoyed it. N- drew the Sutton Hoo helmet which he’s been learning about at school. We talked about how drawing helps you see things in more detail and sometimes that’s worth more than the end result. I then showed him how to draw things using 1-point perspective and some different shading techniques with a soft pencil. He really enjoyed coming up with scenes (a street at night, a desert road) and drawing them using the same techniques. “When I get home I’m going to do loads more of these instead of playing Stardew Valley!”.

  • When we got home he played Stardew Valley.

  • I met up with a few of the “dads” from our school on Thursday night - stayed nattering until last orders. It was good to get out of the house and we might make a thing of it. We went to the uninspiring Garden Gate because the much better Magdala had an unspecified technical fault.

  • The Brooklyn Brewery Special Effects Hoppy Lager is nothing like a lager, but is one of the best AF beers I’ve had so far. I also really enjoyed a bottle of Adnam’s Ghost Ship.

  • On Friday I spent longer than planned making some tweaks and improvements to the CoTech website. I’m taking some pride in trying to make the site as light-weight as possible, and have been experimenting again with different CSS approaches. I’m still not comfortable deciding how to split code between utility and component classes - I certainly couldn’t explain my logic to anyone else. I suspect by the time I have this figured out it’ll all be for nought.

  • I’m getting very tired of dealing with mountains of AI slop and the lazy non-thinkers who produce it.

https://chrislowis.co.uk/weeknotes/2026/02/08/weeknotes
2026-05
Show full content
  • I was completely wiped out on Tuesday and Wednesday, having contracted whatever lurgy F- had had the previous Friday. Oddly, on Thursday I felt better than I have for a long time, leaping out of bed full of energy.

  • I spent some time at the weekend making an Old West-style building out of bits of cardboard. I’m not really sure why, but I found it very relaxing and it took me to a similar place as making furniture used to do (but requires a lot less space and dust removal). It now needs painting.

  • I’m going to have to move out of my office soon. I’ve been spoilt by having a separate room off the main office space - and I need to decide what to do next. Working at home = too few people, working in an open plan office = too many people.

https://chrislowis.co.uk/weeknotes/2026/02/04/weeknotes
2026-04
Show full content
  • A- arrived home safely. We were all very happy to see her and decided to travel to Heathrow to meet her in arrivals. Although the giant orange nonce’s attentions seem to have drifted from South America for a little while, having her home and safe reduced my 😬 a fair amount.

  • Harry Hill’s new /podscarf/ with Stewart Lee was an unexpected joy. I particularly appreciated the 15 minute serious diversion into the history of castles. I see the next episode features Nish Kumar. The man, if nothing else, knows his audience.

  • I had to collect F- early from school on Friday. Thankfully we’ve got to know some of parents who live a similar train ride away from school and one of them was able to collect N- for me. Finn spent the afternoon with bad stomach pain, sitting on me and coughing in my face. These weeknotes are late. Are those two things related? Reader, you’ll find out next week.

https://chrislowis.co.uk/weeknotes/2026/01/29/weeknotes
2026-03
Show full content
  • A- was away all week, so there’s been even more routine (getting kids to school, home, doing chores) than usual.

  • We’ve got a leaky gutter that’s causing water to seep through the brickwork. As we live in a fairly high building we first need scaffolders to construct safe platforms for the roofers to do their work. I spent a couple of days letting them in and out and upping my swearing game to fit in.

  • I sat in on some user research sessions at work on Thursday. I really enjoy this process when I get chance to do it, it’s great to see how things really work and I hugely admire the stamina it takes for my research colleagues to run a whole day of these sessions.

  • I found this Introduction to screen-readers tutorial that you can follow with along with a screen reader very useful. The default screen-reader on Ubuntu is pretty terrible though, so if anyone has suggestions of how to improve that I’m all ears. There’s no comments on my blog but mailto:blog@chrislowis.co.uk.

  • I spent a couple of evenings gluing card and various junk together. I’m drawn to the dystopian sci-fi terrain/modelling of Eric’s Hobby Workshop but I think I mostly just need excuses to do something with my hands rather than on a screen.

  • N- and I continue to play some Stardew Valley together. He loves it and some intricacy of the rules is usually the first thing he asks about when he gets up. We built a shed full of preserving jars to give us some “passive income”. You gotta learn to love the grind. Because life IS the grind, kids.

https://chrislowis.co.uk/weeknotes/2026/01/19/weeknotes
2026-02
Show full content
  • A- left for Colombia on Wednesday evening. I’m gritting my teeth because of that-part-of-the-world events but I’m really happy she’ll be able to spend time with her parents for their golden wedding anniversary.
  • Not unrelated to this change in routine, I managed to lock myself out. Fortunately our kind downstairs neighbours kept the kids warm and entertained while 1st Metro Locksmiths performed open door surgery.
  • I met Murray for lunch on Thursday - a restorative catch-up over falafel, chips and Hibiscus tea at Palmyra’s Kitchen.
  • My brother visited at the weekend. He played a lot of Stardew Valley with N- while I took F- to music centre. We sheltered from the cold for most of the rest of the weekend, dipping in and out of various third-round FA Cup matches on a plethora of seemingly unrelated media streaming services.
  • I’ve been pretty impressed with my new desktop computer - a GEEKOM A6. It’s very fast, running test suites for a couple of projects I’m working on at least as fast as my M2 Macbook.
  • I was up-and-running with my emacs config, Dropbox and 1Password pretty quickly. I also grabbed a couple of Greg’s amazing desktop images. The painful part has been video conferencing. Google Meet makes the fans spin in both Firefox and Chrome, while Pop doesn’t allow screen sharing (something to do with “Wayland” 🤷‍♀️). To be fair, none of this stuff works particularly well on OS X either.
  • I watched an episode of Camden on Disney+ - in particular the one featuring The Roots. I remembered reading in an old interview that they’d lived on the Queen’s Crescent while working on Things Fall Apart and this episode confirmed it was above the (pretty good) Blue Sea Fish Bar. As A- will confirm, I bore anyone who’ll listen about my “campaign” to get them a Blue Plaque. The letter writing continues.
https://chrislowis.co.uk/weeknotes/2026/01/12/weeknotes
Yearnotes 2025
Show full content
Moving

Moving house took up a good chunk of the first half of 2025. We’d decided to keep our kids at the same primary school - they’re happy there, it’s great - and look for a new place within a sensible journey.

We found a larger, older place in Archway. It’s a short overground train ride away from the school. We completed at the end of March. We came to a great arrangement with the person who bought our old flat allowing us to stay for a few weeks, and were able to get some decorating done in the new house before moving in. We moved in at the end of April.

It’s certainly started to feel like home for me - having family from Colombia come to stay in the summer and being able to make them comfortable made the whole process feel worth-while. We also spent Christmas here with my side of the family which was a special time.

Kids

The kids are happy and settled at school. N- is in year 4 and F- in year 1. Their teachers say positive things and I think they really enjoy being there. I often feel guilty that they have such long days (they go to the after school club most days until 6pm), but we don’t really have an option and they always seem to have fun “just playing” once the formal school day is over.

I volunteered for a couple of school trips with them this year, to London Zoo and the panto with F- and swimming lessons with N-.

I take F- on Saturday mornings to music centre in Camden. He seems to love it and is learning how to read music and clap our rhythms. He sings and makes up little songs all the time when we’re out-and-about.

N- loves games and puzzles. We sometimes play chess together but he’s also keen on Pandemic, Catan and card games. We’re enjoying playing Stardew Valley together, but I need to keep an eye on the amount of time we spend playing it - I find it addictive, and I can tell he does too.

We discovered a huge board game cafe near us, and N-‘s eyes lit up looking at some of the larger tabletop games. I picked up a PDF of some simpler tabletop gaming rules and we’ve played a couple of Star Wars skirmish-type games using a bunch of lego figures. N- asked for a box of Space Marines for Christmas which I “volunteered” to paint up. Another slippery slope, I think!

Health

I continue my visits to Royal Brompton as part of a long-term open label trial of a new medicine for my genetic heart condition. I only need to go there for a day every 6 months or so now and I look forward to the visits. I feel a lot better on the medicine and can mostly manage any symptoms I do have (occasional breathlessness and chest pain). I still can’t quite believe my luck that I’m a) alive to see the development of this medicine and b) have a clinical team that encouraged and helped me to sign up for the trial.

I stopped drinking in November (40 days today). There’s some backstory to this, but it feels a bit early in the journey to get into it in detail here (although I’m very happy to talk about it). In general I’m sleeping better, feel happier and have successfully tackled a few “firsts” without alcohol that I was worried about (trip to the pub with a friend after work, Christmas party, gig).

Work

We spent a large part of the year working with the Raspberry Pi Foundation buidling a new service called Experience CS. This includes a great curriculum of classroom activities to teach programming and an integrated, “classroom-safe” version of MIT Scratch.

I spent quite a lot of time on the front-end (particularly CSS) aspects of the project and really enjoyed that part of it. I feel like I learned a lot about structuring CSS, new (to me) features and working with a designer on a shared design system.

As with most post-pandemic work I wish more of the project could have been spent working together rather than remotely. A lot of technical aspects of project reminded me of my early days at FutureLearn and I think that made the remote/in-person working contrast starker for me.

After that project came to an end we decided to spend some time working together on jam.coop our co-op music store. I’ve really enjoyed getting half-formed ideas out of my head and seeing Chris and James run with them. We’ve been writing a bit about what we’re working on in a newsletter.

Hobbies

I’ve done some music-making this year but it’s been restricted by house-moving. I’m playing guitar more regularly and learning some fingerstyle jazz standards again. I’ve also enjoyed messing around with scripts on my monome norns in particular a sample-chopping granular thing with an amazing UI.

I’m trying to be disciplined with chess study, playing focussed rapid games on lichess and doing puzzles “properly” with a pencil and paper. I also play far too much 3+2 blitz. I really enjoy the chess nights at Coffee Zee and want to make it along more often in 2026.

I’m also sketching and painting. Watercolours are a battle, but I enjoy working with ink and markers a lot. I find the compendium of sketches in The Art of Urban Sketching endlessly inspiring. Most of these artists have instagram, YouTube or other accounts to help distract me from the absolute f–king state of things.

2026

Seeing people and doing things makes me feel loads better, so I’d like to do as much as that as I can fit in. If you’re reading this, I’m always up for gigs, lunch, walks, food, games, chats in the pub etc!

I might need to find a new office in the next few months. My current place has been amazing for keeping me connected so I’d like to stay nearby if I can.

And maybe this year will be the year I get fit and lose weight…

https://chrislowis.co.uk/weeknotes/2026/01/04/yearnotes
Dear David
Show full content

Dear David,

Ruby has brought me immense joy during my life and I’ve made many close friends thanks to a shared love of the language. Rails, thanks to the contributions of you and hundreds of others, has allowed me to experience that joy at work too.

However, I can’t describe how disappointed I was to read your recent blog post “As I remember London”.

I remember when you visited the London Ruby User Group. We didn’t speak but you came to the after-talk drinks at a packed Lamb and Flag pub. I’m sure when you looked around that pub you saw, like me, a couple of hundred rubyists of many different nationalities, backgrounds, ethnicities. I’m sure several of those rubyists shook your hand, welcomed you to London and made sure you had a drink. That, to me as a Londoner, is London in microcosm.

Stephen Yaxley-Lennon (aka Tommy Robinson) does not campaign for “Britain for the Brits”. He campaigns, as I’m sure you’re aware from the Wikipedia page you cited as evidence, for Britain for White Brits.

As a White Brit he doesn’t make me feel proud, or patriotic. He makes me feel scared - scared for my wife, my non-White British friends, my neighbours, the teachers of all races and religions who teach my kids.

But we won’t give up. We did survive the Blitz (my grandparents fought the Nazis). Britain hasn’t gone anywhere.

Minaswan,

Chris

https://chrislowis.co.uk/2025/09/17/dear-david
No Exceptions
Show full content

No Exceptions

Excellent advice to keep on top of exceptions in production:

I have absolutely no tolerance for exceptions in production. Your error monitoring system should hit Inbox Zero every day. No exceptions.

Like flossing my teeth, it’s advice that I know is right but find it really hard to do every day. There’s the exceptions raised by code I’ve written for a client, the exceptions raised by code I depend on but have little control over and the exceptions raised by the various side projects that I create but have no time to work on. But the feeling of a no-noise environment that really lets me know when something is wrong is worth striving for.

https://chrislowis.co.uk/link/2025/06/10/no-exceptions
Quoting Jason Gorman
Show full content

Quoting Jason Gorman

Most managers see teams as vehicles for delivering software. This misses the bigger picture. The value of any iteration of the software is ephemeral, and the code itself is a liability: it has negative value.

What has far more value over the lifetime of a software product or system is the capability of the dev team to keep hitting a moving target - to rapidly, reliably and sustainably adapt the software.

I see software delivery as a vehicle for building teams. The team is the real product.

https://chrislowis.co.uk/link/2025/04/28/quoting-jason-gorman
Emacs Lisp Elements
Show full content

Emacs Lisp Elements

The fun part is how you go about writing the code. There are no duties you have to conform with. None! You program for the sake of programming. It is a recreational activity that expands your horizons.

https://chrislowis.co.uk/link/2025/04/18/emacs-lisp-elements
Photographs of Old Japan
Show full content

Photographs of Old Japan

These pictures, the work of several different photographers,1 were assembled by a pair of collectors named Henry and Nancy Rosin. They were originally shot in black and white, then hand-coloured by artists — a technique common at the time. All were taken between the years 1860-1900, meaning the earliest of them just predates the Meiji Restoration, when the last shōgun still ruled Japan.

Daibutsu at Kamakura, Japan

I visited the Daibutsu statue in Kamakura a long time again. I remember thinking at the time that for the rest of my life it would also be there, sitting. These photos were taken long before then, between 1860-1900.

https://chrislowis.co.uk/link/2025/04/18/photographs-of-old-japan
The composer still making music four years after his death
Show full content

The composer still making music four years after his death

Under a magnifying lens sit two white blobs, like a tiny pair of jellyfish. Together, they form the lab-grown “mini-brain” of the late US musician Alvin Lucier – composing a posthumous score in real time.

Artists grow stem cells taken from Alvin Lucier and incorporate it into an artwork. There’s always a lot of “AI will destroy us all” commentary around stories like this, in practice I suspect whatever is in the petri-dish is behaving more-or-less as a random number generator. I love Lucier’s collection of lectures on contemporary music Music 109 and I’m sure he intended this project to be thought-provoking and make for a good yarn.

https://chrislowis.co.uk/link/2025/04/18/the-composer-still-making-music-four-years-after-his-death
CSS Naked Day
Show full content

CSS Naked Day

The idea behind CSS Naked Day is to promote web standards. Plain and simple. This includes proper use of HTML, semantic markup, a good hierarchy structure, and of course, a good old play on words. In the words of 2006, it’s time to show off your <body> for what it really is.

On or around April 9th a little bit of code disables CSS on our co-op’s website. The web, and the world, has changed a lot since 2006 but traditions like this still make me feel part of something. A reminder of a gentler web, but one that still exists if we want it to.

https://chrislowis.co.uk/link/2025/04/08/css-naked-day
Comradery - co-op run Patreon alternative
Show full content

Comradery - co-op run Patreon alternative

Comradery is a digital platform where creators can receive monthly payments from supporters, and optionally give those supporters exclusive access to posts and media.

What makes Comradery different is we are a worker cooperative democratically owned and controlled equally by all the creators in our organization (that means you!).

Interesting Patreon-like service run as a co-operative. It seems like they are considering the governance and co-op structure up-front which is something we talked about when starting jam.coop but decided to iterate on as we grow. I really like

Comradery rejects the “hypergrowth” paradigm of the tech industry

I don’t think Patreon creators (or supporters) really want it to keep growing and changing. It’s infrastructure, not a product in itself.

/via James

https://chrislowis.co.uk/link/2025/04/07/comradery---co-op-run-patreon-alternative
Against the Cozy Web
Show full content

Against the Cozy Web

The latter annoys me: the assumption that the internet is a terrible place, a dark forest where all the good people and spirits have left the public sphere and are now hiding in private, cozy spaces.

This is the first time I’ve heard the phrase “the cozy web” but Kristoffer Tjalve (of the excellent Naive Weekly blog/newsletter) hits a nerve. I’m a long-time believer in the power of the open web, despite all the bad stuff out there, but I do have a couple of cozy places I like to hang out in too.

https://chrislowis.co.uk/link/2025/04/06/against-the-cozy-web
Automated Visual Regression Testing With Playwright
Show full content

Automated Visual Regression Testing With Playwright

Now that we have a better idea of the requirements, it’s time for internal CSS refactoring … However … I needed something to guard against visual regressions while refactoring.

I’ve been considering a similar strategy on my current project. I don’t feel that my implementation of designs is good enough that there’s a “right” answer that I can rely on in a visual regression test. But being able to quickly convince myself that a CSS refactoring hasn’t made things worse could be very useful.

https://chrislowis.co.uk/link/2025/04/04/automated-visual-regression-testing-with-playwright
DIY Synths Database
Show full content

DIY Synths Database

Curated collection of 75 DIY-friendly hardware synthesizers and related standalone musical equipment. All open source.

Mike Sannikov has put together this directory / gallery of DIY synth projects. Projects must be open source, have schematics and a video demonstration. This means the directory looks great and rewards exploring.

I really like these curated collections - see also the proliforation of “awesome lists” on github. They’re particularly valuable now that finding this kind of thing in Google Search is practically impossible.

https://chrislowis.co.uk/link/2025/04/04/diy-synths-database
Yearnotes 2024
Show full content

For Christmas 2023 I bought A- some more rollerskating lessons. On the first lesson back in 2024 she fell and broke her leg in two places. This had a pretty big impact on the first half of 2024! The surgery went well and she was able to make it home to us after a week in hospital. As soon as her Mum heard she flew over to us and stayed for several weeks. We were extremely grateful for this as handling the day-to-day with the boys as well as looking after A- was a lot for me to take on. It was really hard to watch A- in pain, and as the pain gave way to the frustration of being immobile it was hard to find things to keep spirits up. But as the year went on with some physiotherapy and a hard work on A-‘s part she started to become more mobile and able to handle the day-to-day routine. Her parents visited us during the school summer holidays and we were able to explore Cornwall together for a week.

I spent a lot more time indoors in the first part of the year than I would otherwise. I spent some of that time working on jam.coop and made a little progress, but I soon got quite burned out. I find it mentally harder now to work on “serious” side projects alongside the (programming) day job. I think the reality of jam.coop is that it is only likely to gain traction if there is a serious move away from Bandcamp. In the meantime, there’s features I know I need to build and conversations I know I need to have, but finding the motivation is hard. Despite this, I’m proud that it more-or-less runs without too much intervention. Later in the year I found some time to improve the design and make some other improvements.

Another consequence of spending time indoors was that I fell into a chess rabbit hole. N- had started to show a bit of interest in the game and I decided to “brush up” a bit so that I didn’t pass on too many bad habits. Soon I’d started playing regularly myself on chess.com (and later on lichess). I even played a tournament at the local chess club where I was roundly humbled by a parade of kids. I really enjoy solving chess puzzles, and that - combined with a less helpful interest in chess drama - turned out to be surprisingly useful when I needed a distraction from global events.

I spent less time making music this year, but still kept up a bit of a habit. I’ve been enjoying a few music-making apps on the iPad - in particular Samplr and Borderlands which really make the most of the touch screen.

Work was mostly enjoyable too. We worked with the Government Digital Service and the Raspberry Pi Foundation again, as well as a fun shorter project doing some client-side-only prototyping. It was a more stressful end to the year than we’d hoped when work dried up and it seemed very hard to find something new. Fortunately we agreed a new project for 2025 just as we broke up for Christmas.

I’ve continued to make regular visits to the hospital as part of the clinical trial and on the whole I feel well. The new medicine is proving to be very effective in a scientific sense, and is also working well for me personally.

I spent the Christmas holiday’s in Colombia visiting family. A- and I were able to sneak away for a fun couple of days in Medellín and the whole family had a relaxing few days just outside Bogotá in Anapoima. I say relaxing. F-‘s first action upon arriving at the holiday house was to take his clothes off and jump into the swimming pool. F- can’t swim. After an unscheduled, fully-clothed dip to rescue him I was grateful of the glass of whisky my father-in-law passed me.

https://chrislowis.co.uk/weeknotes/2025/01/17/yearnotes
Yearnotes 2023
Show full content

Dealing with my heart condition (obstructive hypotrophic cardiomyopathy) has been a big part of my year. I was invited to take part in a randomised controlled trial of a new medicine. This has involved frequent trips to Royal Brompton hospital in Chelsea where I’ve been looked after by a wonderful and talented team of nurses, doctors and researchers. The trial itself was double blinded so we’ll never know which branch of was in.

That said, I felt very good while on the trial and when I abruptly stopped the treatment at the end of the trial I started to feel as bad as I ever have again. Frequent breathlessness and chest pain, and difficulty in handling some everyday tasks (getting the kids to school on time in particular).

I found this emotionally challenging at times, the sense of mortality, of not being able to do some things my kids want me to do and knowing that I’ll never be the same as I was. However I’ve been accepted on to a long term study of the same medicine now and it seems to be working pretty well. I already have a lot more energy and a lot less discomfort.

I also had a genetic test this year and found that I have a “pathogenic variant in MYBPC3”. The upshot of this is that my immediate family may also be affected. For now, there’s nothing I can do about that - but the kids will be screened occasionally at GOSH as they get older and at some point they may have a genetic test too. I have to think through the implications of that.

I’m incredibly lucky to receive the care I do, I’ve been really enjoying being part of the scientific process to develop a new treatment and I’m thankful for the health I do have.

It’s been a pretty successful year work-wise. I’ve been consistently busy with projects - first joining a team of Unthinkable folks prototyping new things for a university and then with dwx working on various bits of the GOV.UK codebase.

It continues to be a pleasure working with my Go Free Range friends, we’re good at supporting each other through various ups- and downs- and while I think we find it hard to be deliberate about the future, we’re very good at making the most of the present. Having regular days together really helps as I still find working on my own pretty isolating. Having a small office at Space4 works well for me (I still don’t like working from home) and I need to make more of the opportunity to hang out with other people who are based there.

My family have been mostly healthy and happy this year. N- moved from Year 1 to Year 2 in September and has gone from carefully sounding out words to independently reading. I love fielding all the questions he has about the things he’s learning. F- has gone from toddler to little boy, he’s speaking a lot, telling “jokes” and is very physically active.

We spent the school summer holidays in Colombia visiting family. I really enjoyed the trip. Compared to the last visit I struggled a lot less being at altitude - likely because the medication I’m taking was working very well. I particularly enjoyed hiring a bike and cycling with N- through the closed streets of Bogotá on Sundays.

I decided not to work on client projects during that time and instead spent some time handling GFR admin tasks and starting work on jam.coop. The latter is an idea we’ve been kicking around since Bandcamp was taken over by Epic games and the management tried to prevent the formation of a workers’ union. We think our co-operatively-owned online record shop is a viable alternative.

At the start of the year I resolved to record and release some of my own music. I spent most of my free time in January and February finishing up an EP of ambient music and later in the year had a track included on a compilation. The process took a lot out of me creatively and I haven’t had the same dedication since - but I do regularly sit down in the evening to just make sounds and relax.

I’ve enjoyed getting out with friends to gigs this year. End of the Road festival with my brother and N- was really good fun. I saw Sylvan Esso with Adri in Brixton, Kronos Quartet with Tom at the Barbican, Hainbach, Look Mum No Computer and Tim Hecker with friends from the internet, Hainbach again at Iklektic with Paul and Pedro, and a few other things I can’t remember right now (this is why we need weeknotes, Chris).

I read some actual paperback books in the first half of the year - Ursula K. Le Guin’s Hainish Cycle. A lot of people have recommended these to me over the years. I particularly (and somewhat predictably) enjoyed the anarchist utopia “The Dispossessed” but the whole series was great and reading them back-to-back has meant that the world they created has stuck with me. I enjoyed buying old paperbacks from Camden Market at Joel’s Ethical Book Search.

Very little cinema this year but Adri and I did take a day off to watch Past Lives and eat food in Brixton. It’s a wonderful film.

https://chrislowis.co.uk/weeknotes/2024/01/01/yearnotes
Weeknotes 57
Show full content

We had a good Easter weekend visiting my parents. Is it possible to eat too much chocolate? The answer is yes. Easter Monday was my birthday but as that largely involved driving back to London, A- and I took the day off on Tuesday and went for a mooch around Soho. Shopping, and eating tasty snacks at The Colombian Coffee Company.

Normal service resumed on Wednesday with James, Chris and I tackling our first larger bit of work at GDS. We’ve been trying to make sense of the /world/embassies page and how to tease apart the business logic (and a myriad of edge cases) from the presentational code to allow both parts to be worked on more easily. This isn’t particularly interesting, I know, but it’s such a wonderful novelty to be able to link to code I’m working on (most of the code that makes up GOV.UK is open-source) that I’m taking the opportunity.

On Thursday I met a friend after work to catch up and see Look Mum No Computer play at The Lower Third. Unpredictable home-made synth and stand-up comedy with support from the wonderful Clementine Blue.

My brother was in town on Friday, so I finished work early, had a couple of pints at the Southampton Arms before heading to Hackney EartH for the welcome return of Stornoway. They’re a very uplifting band to see live - lots of warm, funny chat between songs, and usually some kind of audience participation. On Friday this involved a conga line around the venue and a mid-song game of musical statues.

I met a friend to drink coffee and go record shopping for his birthday in Soho (again!) on Saturday morning. Sunday was spent taking the kids swimming, to a soft play and then a family day at ORA Brewing’s tap room in Tottenham. Bouncy-castles and beer, what could go wrong? Surprisingly, no one died.

https://chrislowis.co.uk/weeknotes/2023/04/17/weeknotes
Weeknotes 56
Show full content

I spent most of the day on Monday at Royal Brompton hospital receiving my first dose of a new medicine/placebo. I’m taking part in a stage three clinical trial of a new drug for treating obstructive hypertrophic cardiomyopathy. It was an uneventful and slightly drawn out day that culminated in me taking 4 tiny white pills that may, or may not, be the drug. I spent most of the rest of the week trying to guess which branch of the test I’m in. I have no idea! I feel fine I think. Is that good?

On Tuesday I pressed the “publish” button in Bandcamp and released my first EP. I’d been fiddling with the details of the page for about a week for no good reason and eventually decided to go for it. I don’t really know why it’s so difficult to put creative things out into the world. I had no expectations that anyone would listen, but I did make an effort to promote it via Mastodon, Instagram and a couple of forums. As of today Bandcamp tells me over 200 people have listened and tracks have been played 700 times. It even got a bit of radio play in Luxembourg. This is much more than I expected and very humbling.

Mostly it’s been touching to hear people have enjoyed it or played it as part of their day to day activities. The good thing about ambient music is that if someone tells you they fell asleep while listening or had it on in the background while they did something else, that’s a strong signal of approval.

I’m already working on ideas (in my head) for my next project and looking forward to spending time making music again.

It was good to write some code and do some pair programming this week, but I’m feeling a bit rusty, it’s been a while since I had to spend all day reading and writing code.

We’re spending the Easter weekend with my parents, the kids have enjoyed Easter egg hunting, a soft play visit, chasing the cat and trying not to break my Dad’s model railway.

https://chrislowis.co.uk/weeknotes/2023/04/09/weeknotes
Weeknotes 55
Show full content

I started a new work project properly this week. We’re back at the Government Digital Service working on the publishing platform. It’s been really fun meeting the current developers and doing a little bit of pairing. Their docker based development environment made getting everything running locally fairly painless. I’m also enjoying having 2-factor authentication via a Yubikey hardware key. When I unplug the key almost all services fail to authenticate, and I am truly disconnected from work.

This week I finished up the data support project with Sports England governing bodies. Over the last 2 months I’ve spoken to data professionals at 8 different SGBs, some on several occasions, and it’s been a joyful and enriching experience.

We celebrated F-‘s birthday on Sunday at the Peggy Jay Centre on Hampstead Heath. A- and I spent two days baking and decorating the cake which F- greeted with studied indifference. It was lovely to have a room full of friends and family though. It wasn’t really possible for us to do this kind of thing for the first couple of years of his life, so I plan to make up for it now.

N-‘s school broke up at lunchtime today for the Easter holiday, so we went to the garish Babylon Park amusement arcade in Camden. The best value-for-money game I’ve found is air-hockey: we get to play against each other and each game lasts for a good 10 minutes or more. Sadly, N- is quite taken with the robot-claw machines which offer a scant 5 seconds of entertainment for the same price. I will impart my Yorkshire-man monetery values upon him if it’s the last thing I do.

I got accepted onto the clinical trial I mentioned in last week’s notes. This followed an exercise capability test at a swanky Harley Street facility last Friday. I’m due to take my first dose next week. If the next time you see me I’m sporting 3 arms and glowing fluorescently, keep it to yourself yeah?

I’ve told some friends that I’ll be releasing an EP of music next week, so am now on the hook to do so.

Late to the party, I took up Tom’s recommendation to watch Bobby Fingers. Most of the week has been spent watching Bobby Fingers or telling other people to watch Bobby Fingers. WATCH BOBBY FINGERS.

https://chrislowis.co.uk/weeknotes/2023/03/31/weeknotes
Weeknotes 54
Show full content

A fairly quiet week at work as we wait for a large, new project to start. I’m still providing some support/mentoring/coaching to data people with sports governing bodies so spent some time preparing to talk to England Netball about sample sizes and survey data.

N-‘s school was closed for two days due to NEU strike action (✊), and A- agreed to look after him this time, so I took F- on his usual Monday “at home” day. We went to his swimming lesson in the morning, had a cake afterwards then home for lunch and a nap, followed by Tempo Tots at Kentish Town City Farm. Perfect.

LRUG on Monday night was well-attended, I enjoyed both talks and catching up with some ex-FutureLearn colleagues afterwards.

I’ve been invited to take part in a clinical trial for a new drug specifically developed for the heart condition I have. This is exciting because although I may receive the placebo/killer bees during the trial I should be eligible in any case for the real drug after the trial concludes. I’m definitely not “my old self” so the promise of something that can help that doesn’t involve invasive surgery is welcome. I’ve had the first of a few screening tests to see if I’m eligible and I’m waiting to see if I’ve been accepted.

I’ve sent some music I’ve been working on to a friend who offered to master it for me and I’m now thinking about all the things I’ll need to do (artwork, promotion, streaming services etc) to self-release it. I find it really hard to build up the courage to just let this music go and move on. The book “Art & Fear” (amazon, ethical alternatives) has been a very useful reminder for why I should.

https://chrislowis.co.uk/weeknotes/2023/03/22/weeknotes
Weeknotes 53
Show full content

We needed a “quick” prototype to test with some research participants this week. I wasn’t sure what technology to use - I’ve been favouring static stites with a bit of JavaScript lately, but after staring at the wireframes for a bit and asking #roos for some reckons I decided I’d be better off building some of the trickier parts (persistance, authentication) rather than trying to fake them out.

I started a new Rails 7 project and its been pretty smooth sailing so far. The passwordless engine gave me a basic authentication system fairly quickly (although faffing with SendGrid and Heroku to send the magic link email took the bulk of the time). I’ve been able to use the rails scaffolds to get started quickly on some of the other forms and pages. It feels good to be writing some code and familiarising myself with some recent Rails features.

F-‘s nursery was closed on Wednesday so we put our wellies on and headed down to London Zoo for a bit. There’s three young Sumatran tiger cubs at the moment and it was wonderful to watch them playing and learning how to hunt with their mother. We also enjoyed an extended stop in the butterfly house. F- really liked looking at the “spotters guide” cards and trying to find each butterfly.

A-‘s parents flew home on Thursday. It was very sad to see them go and the kids have been a bit unsettled since. It’s quite a change of pace when 2 extra adults leave our small flat!

N-‘s been asking a lot of questions about death and dying recently, and getting sad about the concept that other people (or himself) won’t be around for ever. For fairly obvious reasons I don’t have any particularly comforting words of wisdom or insight into what comes next, but it does feel good to have “grown up” conversations with him about these things and share some moments of sadness or reflection. Essentially I boiled it down to: “we’re all going to die, but hopefully not for a long time, and we’ll have some good times while we wait”. Justin Welby’s probably safe in his job for a bit.

Some of N-‘s questions might be prompted by the school’s discussions about Rememberence Day. According to N- “one hundred and sixty soldiers died in the war”, I didn’t have the heart to tell him the horrible truth.

https://chrislowis.co.uk/weeknotes/2022/11/20/weeknotes
Weeknotes 52
Show full content

I travelled to Glasgow this week for a gathering of the Co-operative Technologists network. It was a restorative and fun couple of days. As well as hanging out with some old and new friends I also spent some time writing a couple of how to guides to get some things out of our collective brains and onto paper. I worked with some colleagues to form a proposal to trial hiring a coordinator for the network and updated the accounts. It was an expertly-organised event from our friends in media co-op and it reminded me again why I decided to work in this way.

Travelling was made much easier by having A-s parents over to stay for a few weeks. They were able to help out with the kids while I was away, although F- takes very badly to me being away. It was great to see them all when I made it back on Friday night.

I awakened my dormant ruby.social account to join in the exodus from Twitter. I wasn’t a heavy user of twitter, and have long-since unfollowed politicians and news outlets on there, but the vibe of my local instance has reminded me of what twitter used to be like 14(!) years ago when I created my account.

I’m currently working with the folks at Unthinkable. We’re helping a university incorporate some practices from product teams into the design of their new courses. This week that’s mostly involved prototyping a interface for transcribed lectures that allows students to ask each other questions about the content. I’ve been blown away by how accurate the automated transcriptions from OpenAI’s Whisper are. I worked quite a lot with automated transcriptions back at BBC R&D 10 years ago and this is really a step-change from what was possible then.

https://chrislowis.co.uk/weeknotes/2022/11/13/weeknotes
Weeknotes 51
Show full content

This week’s Song Exploder podcast about Different Trains by Steve Reich was wonderful. Hrishikesh Hirway interviews Reich about the 1st movement “America, before the war”. I enjoyed the fun technical details (early use of samplers and “more overdubs than The Beatles”) of course, but Reich’s recollections of his childhood travels between the East and West coast, his descriptions of the melodic character of the voices he used and why he didn’t want to “fix them”, and his explanation of why he chose to talk about the 1st movement instead of either of the other 2 were incredibly moving.

We started a small project with a startup, helping them build a basic data pipeline and some dashboards. I really enjoy this kind of work, I find the process of moving data around and cleaning it up very peaceful and satisying, and it’s great to be able to do a bit of analysis too. As the data gets tidier and more organised the analysis becomes easier and more powerful. I’ve been doing this kind of project for years now, but the tooling available now really makes a lot of things easier. I’m particularly impressed with dbt’s command line tooling and the way fivetran just does its thing and keeps out of the way.

On Saturday night I met some internet friends in real life. We went for a pizza and then to see Hainbach at Cafe OTO. I really enjoyed his set but the best bit was the opportunity to talk to people, make new friends and be out late in that London. I had a chat with Stefan (Hainbach) before the show, and one with Sam (Look Mum no Computer) after. I tried to pluck up the courage to talk to Steve Davis, who was also in the audience, but failed myself, and you.

https://chrislowis.co.uk/weeknotes/2022/03/27/weeknotes
Weeknotes 50
Show full content

The war in Ukraine continues to depress and morbidly grip me in equal measure. I feel as though everything else is pointless while at the same time I want to grab hold of any joy in daily normality and not let go.

F-‘s nursery was closed on Thursday so I took him to the zoo. We laughed, made animal noises and chased each other around.

https://chrislowis.co.uk/weeknotes/2022/03/13/weeknotes
Weeknotes 49
Show full content

Things have been broadly uneventful for a bit, and to be honest, it can continue for a while. After living with the constant threat of a school closing, a kid getting COVID, us getting COVID or some plans being cancelled because of COVID, it’s been nice to have a bit of time where everything has settled into a bit of routine.

We haven’t had much work on in the last week so I’ve been busy trying to drum something up - mostly by working on proposals for small projects with some of our co-op friends.

I donated my workbench to the local Men’s shed to make space for a desk to use for music-making, and working from home. It was a bit sad to see the bench I’d built go, but realistically I wasn’t using it to do any meaningful furniture making and I can always build another in the future when the kids are a bit older. So far I’ve loved having a dedicated space to make music with everything plugged in and ready to go.

I tidied up some Supercollider code from some of my musical experiments in January and turned it into a script for norns. It’s been lovely to see a few other people using it to make things too.

Went to the football on Saturday for the first time in a long time. Overdid the festivities a bit, but it was fun to be back. There’s quite a positive atmosphere there at the moment which makes a difference.

https://chrislowis.co.uk/weeknotes/2022/02/22/weeknotes
Weeknotes 48
Show full content

A fairly quiet week work-wise, which was helpful given that N-‘s after-school club is still closed. We thought we had arranged work for the next 3 months, but unfortunately it’s been scaled back to 2 weeks. Still, it’ll be good to get stuck into something. I enjoyed revisiting old projects and writing supporting evidence for our R&D tax credits claim, it felt good to reflect on what we’d achieved as its easy to miss doing that at the time.

I spent the day with my brother on Monday, met Tom for lunch on Wednesday and had my parents over on Saturday - these all really helped to lift my mood.

Tuesday was a bit of a write-off, I had a scheduled MRI scan with the cardiology team at St. Thomas’s late in the afternoon. I’d been told not to drink caffeine during the day, which meant by lunchtime I had a headache. The scan itself went fine, but I had forgotten how uncomfortable it gets after about half an hour of confinement. I was ready to come out when it finished (about 50mins total).

I made a jam for #jamuary almost every day this week. It feels good to have the creative habit. I’m quite pleased with number 15 and 18 and had fun recording some acoustic guitar on Monday morning.

https://chrislowis.co.uk/weeknotes/2022/01/30/weeknotes
Weeknotes 47
Show full content

It’s fair to say that adjusting back to life in London this week has been pretty hard. N-‘s after school club closed on his first day back for two weeks (due to too many cases of Covid in his year), so we’ve had to adjust our working arrangements already. F- made it through his first week back at nursery, but became ill on Friday afternoon. A LFT says its not Covid, so hopefully just teething or another virus. He’s lost his voice!

We really miss family and sunshine. The feeling of loneliness is compounded by the fact that our closest friends in London are now serious about leaving the city and have put their flat on the market.

On the bright side, we’ve got some work lined up with a new client and its been fun catching up with James this week and working on our R&D tax credit application together (don’t say we don’t know how to party). It’ll be good to get stuck into some client work again, and hopefully get back into Space4.

I also created 5 “jams” for jamuary, had a big sort out of a book case, hung out with F- and then went for lunch at a friend’s place.

I’ve lost a bit over 2kg so far this year. Ambitiously, I’d like to lose 10kg by my birthday in April.

https://chrislowis.co.uk/weeknotes/2022/01/23/weeknotes
Weeknotes 46
Show full content

We arrived home. The trip to Barranquilla was relaxing, we had an impromptu extra night in the city itself because we missed our flight back to Bogotá (3am != 3pm, for reference). The last few days in Bogotá were fun, N- had a “sleep over” at his cousin’s house, and we caught up with the extended family a bit. We’d arranged an evening out with one of A-‘s school friends but unfortunately they’d caught COVID and had to postpone. There wasn’t much sign of the new varient when we arrived, but I suspect it’s a matter of time.

The flight back to London went fairly well. N- slept almost the whole of the first 10 hour leg. F- slept a reasonable amount but mostly on top of me which meant I didn’t get much rest. The connection in Madrid was mercifully short and stress-free and we had a taxi waiting for us in Heathrow. We isolated at home for 2 days and have been able to go out today after our (paid-for) LFTs were negative.

We’ve binged the first 6 episodes of Cobra Kai over the (jetlagged) weekend. I was nervous that it wouldn’t live up to the high artistic bar set by the previous series, but after a slow start a spectacular training montage in episode 5 has redeemed it. I’m going to savour the final four episodes like a fine wine.

I’ve made a few bits of music for #jamuary. So far, they’ve all been an excuse for me to learn more about SuperCollider and in particular its pattern language for sequencing musical events. Rather than stressing myself out coming up with videos to go along with each one for Instagram, I’ve instead been dumping the mp3s and some notes in the sketches category on this site. I’ve been sharing them in a private discord server I’m a member of which means I don’t miss out on the hashtag-driven community aspect of the project too much.

https://chrislowis.co.uk/weeknotes/2022/01/16/weeknotes
Weeknotes 45
Show full content

We’ve travelled to Barranquilla for a few days by the sea. It’s around an hour flight from Bogotá and F- fell asleep before we took off and woke up after we’d landed. We’re staying in a small resort that seems to specialise in watersports. I’ll know more when I’ve had chance to explore tomorrow.

We saw New Year in at my brother and sister in-laws house, a few extended family joined us too. It was a nice, quiet affair (to be honest, with F- typically waking up at 5am on a good day, I probably wouldn’t have stayed up past midnight at home).

I’ve deployed a few changes to this site that I’ve been hacking on over the last few weeks. I’ve added a section for notes to see if it helps me write more without the pressure of “publishing”. I’ve also roughly hacked something together to hold my musical sketches. I’m hoping to create a few SuperCollider things for #jamuary.

It’s been a vintage week for Weeknotes. Despite their protestations I’ve really enjoyed reading Tom, Simon and Paul’s yearnotes. I’ve not managed to write every week this year, but I am glad I’ve managed to keep writing them. If nothing else, it’s my offering to a collective practice that gives me a huge amount in return.

https://chrislowis.co.uk/weeknotes/2022/01/02/weeknotes
Weeknotes 44
Show full content

We spent Christmas week in Villa de Leyva a beautiful old town about 3 hours drive from Bogotá. We rented a house on the edge of the town, and the boys loved playing on the provided trampoline with anyone who would join them.

The Parque Gondava dinosaur park was a hit with the kids. Lots of life-size model dinosaurs spread around a lake. Including an animatronic T-rex and a Brachiosaurus you could climb inside.

On Boxing day we visited the Cascadas La Periquera waterfalls. It was a fairly gentle hike down the valley and back up again, but the first time N- had done something like that. He did really well. We stopped for lunch at a fun Italian restaurant nearby.

Merry Christmas and a happy New Year!

https://chrislowis.co.uk/weeknotes/2021/12/27/weeknotes
Weeknotes 43
Show full content

Altitude sickness hit me harder than it has done in the past this week. I started to feel more normal today, a week after we arrived in Bogotá (2,640m). The kids took a few days to adjust to the time zone change too, meaning some broken nights sleep and early starts. But some bright, sunny weather helped a lot with the jetlag.

My brother-in-law’s family have a new dog. A beautiful Australian Shepherd called Bucky. N- is scared of dogs generally, having had a run in with a couple when he was younger (and projecting a lot of anxiety during the 1st lockdown at dogs). The family have been brilliant though, introducing him very slowly and showing him how to ask the dog to sit and stay still. While he’s still not picked up the courage to actively play with Bucky, N- spent this afternoon in the same room together and was a lot less on edge than earlier in the week. It’s really positive.

We went to the city branch of famous Colombian steakhouse Andres yesterday to meet one of A-‘s university friends. We never got around to ordering any steak having filled up on cheese-covered patacones and snacks. While not as extensive as the massive ranch-style original, the Bogotá branch of Andres still has a lot of activities for children. F- enjoyed painting, while N- made popcorn, painted his nails and did some woodwork.

There’s not a lot of wildlife to be seen in the city, but I did spot a small hummingbird drinking from a flower outside A-‘s parents window.

https://chrislowis.co.uk/weeknotes/2021/12/19/weeknotes
Weeknotes 42
Show full content

We arrived in Colombia for a family visit. It took around 24 hours door-to-door yesterday (with a 4am start). To be honest, I’ve been dreading the journey, particularly because F- is at the age where being stuck anywhere for too long drives him a bit mad. I’m not going to say it was an easy journey, but the two boys were great. The only time F- cried was when he couldn’t get his big plastic dinosaur into a small plastic box. Otherwise he travelled really well.

It was exhausting keeping him entertained particularly towards the end when we were tired ourselves, but a few things helped. We wrapped up some little toys in wrapping paper (and kept aside a few gifts from friends to unwrap too). Bringing one of those out every half hour or so was fun. Lots of snacks (airline food is generally bad and Avianca seem to be cost-cutting hard in these pandemic times). We got quite a lot of milage out of a reusable sticker book too.

N- enjoyed some games of magnetic tick-tack-toe and a spot-the-difference book. I also loaded a tablet with some of his favourite programmes1 and that kept him busy of course.

The jetlag and altitude sickness has hit us pretty hard, but the sun’s shining and the abuelitos are so happy so it feels like mission accomplished.

  1. I recently rescued an older Lenovo android tablet from a pile of abandoned computers in my office. It runs an older version of android, but has an SD card reader and runs VLC fine. It turns out you can use youtube-dl to download programes from the iplayer. I used the link extractor firefox extension to create text files of episode links, and then the -a flag to youtube-dl to download them in batches. The resultant files were quite large (around 500MB for an episode of Hey Duggee) so I ran them through ffmpeg with the -preset veryfast -vcodec libx264 -crf 28 flags to reencode them with a lower bitrate. This made the files about 10 times smaller and the quality was fine. It made it easier to move them and store them all on an SD card. 

https://chrislowis.co.uk/weeknotes/2021/12/13/weeknotes
Weeknotes 41
Show full content

We went on a suprisingly smooth Sunday train ride to Chertsey today to meet some friends for a “mini Christmas” before we (hopefully) travel to Colombia for Christmas next weekend. The pub we chose met the criteria of being roughly equidistant from the three families, having more than one choice of veggie/vegan food and having a garden for the kids to play in. The log fire and Christmas tree was a nice bonus.

I spent the week remote mobbing with my GFR collegues. We had a short project with the Daylight Academy via a University of Oxford researcher we’ve worked with in the past. It was fun to build a client-side only prototype (in React). We deployed to Netlify which has a handy built-in bit of “serverless” code for doing the OAuth dance with Github. So we were able to build an app that lets users create Github repositories and add files to them all from a “static” site. Feels a bit like magic.

I shared some more of my music-making on Instagram this week. I rigged up a Heath Robinson wood-and-metal contraption to hold my digital camera so I could shoot overhead video. I find Instagram quite baffling and the constant ads, weird recommedations and Facebook ownership are quite unpleasant. But I’ve also had some really fun and helpful conversations about music on there too, which I think I’d lose if/when I go full IndieWeb.

https://chrislowis.co.uk/weeknotes/2021/12/05/weeknotes
Weeknotes 40
Show full content

N- finished his second full week at his new school. It’s been a really big change for him and us, but he’s settling in well and (as far as I can tell from his minimal dispatches) enjoying it. We’re still not into a routine because the drop off and pick up times are very different to before. Also F- returned to nursery, got ill and, yada-yada-yada (cf. every previous f–king weeknote).

I took Thursday and Friday away from client work to attend the CoTech gathering at Space4 in Finsbury Park (where I have an office). It was really comforting and helpful to just spend some time with some other people who’ve been through the last 18 months and decompress. We had a couple of good sessions on working together and developing business, and also a few pints in the pub.

The thing we’ve been working on with the Raspberry Pi foundation got a wider release this week (with a switch away from a beta. subdomain). I’m going to talk more about that on the GFR blog soon. Recently I’ve been doing a bit of sound design for the music activity which has been a welcome change and a lot of fun.

I finished up a track that seemed good enough to share (a lot of them are not good enough) and started another. I’ve been sharing work-in-progress music with a friend of mine, and it’s been really useful and motivating.

It’s our anniversary tomorrow and I get to celebrate spending 7 years married to the most amazing person I know. We’re going to try and find some Greek food for lunch.

https://chrislowis.co.uk/weeknotes/2021/09/26/weeknotes
Weeknotes 39
Show full content

I’ve been on holiday for the last two weeks. First a week in Norfolk and then a week with my parents in Berkshire.

We arrived in Norwich too early to check in to our accomodation. Fortunately everyone’s favourite plaster cast dinosaur Dippy was visiting Norwich cathedral so we paid it a visit. Dippy’s visit meant that the city also had a Meet the T-rex trail, and N- loved walking around the city ticking off all of the T-Rex’s on his map (it also meant we had an excuse to see the city ourselves). We saw “Afternoon Tea Rex”, “Hulkasaurus” and “T Pot”. I pity the fool that missed the opportunity to design a “Mr. T Rex”.

The weather improved for the second half of the week, so we made a trip to Great Yarmouth. It’s probably the definition of a town that has “seen better days”. I was quite excited to take N- to the arcades and play some games - while less smokey than I remember as a kid, these arcades now seem to have massive fixed-odds slot machine rooms in the back and watching some despondent looking folks shuffle in and out as we played was a bit depressing. We did however have an excellent, great value lunch (including a massive bowl of clams) at Portugese restaurant A Varina Petisqueira.

A day trip to “curious treehouse adventure” BeWILDerwood on Thursday was an unexpected highlight. N- loved the zip wires, slides and massive treehouses (including a huge tree “maze”), F- and I built “dens” by dragging sticks around. It was a suprisingly peaceful place, with a story-time stage, a cafe and really friendly staff.

Cromer was a much nicer seaside town. We visited the small South American zoo Amazona in the morning and went to the beach in the afternoon. N- immediately made some friends on the beach and spent a couple of hours chasing waves backwards and forwards. F- and I had a nap.

Back at my parents A- had to work again for a few days, but I’d taken the week off. I was able to take a couple of trips out with my parents and the kids (most notably to the magnificant RHS Wisley gardens) but mostly we spent some quality time with the grandparents at home. My Dad and N- had several happy hours building LEGO city models at the dining room table, my Mum had fun with F- in the garden, and I got to spend some time with my Dad in his workshop making a second chair.

https://chrislowis.co.uk/weeknotes/2021/08/30/weeknotes
Weeknotes 38
Show full content

We’re currently camping in Norfolk. This is our first time camping with the kids and we started panicking a bit in the week when some very unfair coverage appeared in the press. Turns out the internet is wrong and it’s fine. We’ve had a great time, there’s been enough to do to keep N- entertained (unlimited bouncy castles) and it’s a safe environment for F- to run around in. They pitched the tent for us and it’s massive. I bought a mini keg of Adnams Ghost Ship. Several boxes ticked.

Before arriving on Friday we’d spent the week with my parents. It was amazing to see them have a decent amount of time with the kids after the last year and a half. A- and I were also trying to work (me from 7am-1pm and A- from 1pm to 6pm). I love being able to get an early start as I’m much more productive in the morning, but it meant the days were long and tiring.

On to Norwich this morning. We’re staying in an Airbnb in the city centre and hoping to make some trips to the coast.

https://chrislowis.co.uk/weeknotes/2021/08/16/weeknotes
Weeknotes 37
Show full content

School’s out for summer. Unfortunately N- missed his last day at his nursery, because F- had a temperature the day before and they both got sent home pending a PCR test. Since then A- and I have been taking turns looking after them. A trip to the Zoo on Monday and a trip bowling on Friday. F- is so fast on his feet now that both of these activities were exhausting, but also fun.

I’ve been battling a heavy cold (thanks kids) for a couple of weeks. My running has really taken a hit and I’ve been missing it. I tried to run on Wednesday and had to stop, but managed 3km on Saturday. Hopefully on the mend now.

We’ve travelled to my parents for a week so A- and I can work a bit before we go on holiday to Norfolk next week.

When I’ve had a bit of free time I’ve been spending it learning how to use Reaper and writing music. I’ve been trying to finish songs as best as I can, to get practice at all of the different parts of the process. I’m considering finding a tutor or mentor in the autumn, because I think I’d learn faster with some regular feedback and deadlines.

https://chrislowis.co.uk/weeknotes/2021/08/09/weeknotes
Weeknotes 36
Show full content

I’m fairly settled into a routine of three days in the office and two at home now. It’s working well, I really enjoy having a few more people around even if I’m not directly working with them. I caught up with some co-op friends on Thursday as Outlandish were having a bit of a get-together in the park.

I’ve also been fitting some running into the schedule. A run home from the nursery drop-off on Monday, from the office on Wednesday and round Finsbury park today. I’ve been averaging about 16km a week for the last 3 weeks which is a step up. The Garmin Coach is working out quite well, it gives me a bit of variety and some motivating stats and graphs.

I started making a custom supercollider engine for my long-running norns project. Supercollider is a bit esoteric but a lot of fun. I’m fairly close to releasing a first version. I don’t expect anyone else to use it, but it’s useful to have the idea of shipping something in mind to help me to decide what to work on next.

The boys’ nursery is closed in August so we’ve been busy planning what to do for the month. A- and I are going to split the parenting by working slightly shorter hours and starting or finishing later. We’ll do about of that from my parents, which I’m really looking forward to. We’ve also booked a few nights in Norwich and a few camping (or glamping?) in Norfolk. It’s expensive and booked up everywhere but somehow not having to pay the nursery fees for a month makes it feel slightly more affordable.

I miss my GFR colleagues, I’m really hoping we can get together soon.

https://chrislowis.co.uk/weeknotes/2021/07/02/weeknotes
Weeknotes 35
Show full content

Took the kids to play in the fountains at Granary Square today. For me, it’s better than being on a beach - they get to splash around, but there’s also shade and a big supermarket. I remember taking N- when he was the age F- is now, and it took us a long time to convince him to dip a toe in the water. F- was straight in there although he did get cold fairly quickly. The nursery is closed on Friday for a training day, so I might take them both their again if the weather is good - I imagine it’ll be a lot quieter than it was today.

We’ve been watching The Last Kingdom. It’s not an overly complicated story, but like most TV it’s a bit much for my brain. I really appreciate how each episode opens with some drawn out exposition. I generally have no recollection of what happened in the last episode, so this helps a lot.

Ripcord is an alternative client for Slack and Discord. It’s primary advertised feature is “not made from a web browser”. Might be a keeper.

https://chrislowis.co.uk/weeknotes/2021/06/13/weeknotes
Weeknotes 34
Show full content

Another week of childcare disruptions. N- had a temperature on Wednesday lunchtime, so the nursery sent him and F- home pending a coronavirus PCR test. I was able to book a test at a “mobile test centre” in Kentish Town. This turned out to be a white van parked in a carpark near the Forum. There was no tables, chairs or hand sanitiser, but after several frustrating attempts we managed to take a valid test. High fives all round (so much for social distancing) and we had a negative result by the next morning. N- was perfectly fine after a nap and recovered from whatever he had, but unfortunately F- was pretty grumpy and snotty for the rest of the week. I spent two days at home with him while he felt sorry for himself and slept on top of me.

By Sunday both boys were back on form, so yesterday we decided to take a sponteneous trip to Brighton (along with the rest of London, it seemed). I haven’t seen that many people in one place for a long time. F- has barely left North London in his short life, so it was great to see his eyes wide open at the sight of a fairground ride, or a beach full of stones to eat.

I’m into my final week of Couch to 5k although I stuggled with the heat on my run this morning. I’ve heard good things about the Garmin Coach system from a couple of friends and enjoy being told what to do on runs by a machine, so I’m thinking of buying a “Forerunner 45” to give me some structure after the end of the C25K plan.

https://chrislowis.co.uk/weeknotes/2021/06/01/weeknotes
Weeknotes 33
Show full content

N-‘s language skills are now at the bants level. “F- keeps pulling my hair, daddy! If he keeps doing that, I’ll have no hair. Like you!”. And (after watching me give some money to a rather dishevelled looking gentleman on the overground) “Is that your Dad?”.

I appreciate the previous paragraph is in the “kids say the funniest things” genre. What can I say? Slow news week.

The Mirror reported “Brit punters will ‘need to drink 124 pints each’ in order to save UK pubs after lockdown”. After rising early on Monday to put on my drinking trousers, a friend pointed out that this figure was based on the additional spending required in the next 12 months. I still had a couple this week, I’m not going to lie.

I’m in week 8 of the couch to 5k plan. I had a good run on Wednesday, felt like I’d set off a bit quick but managed to keep the pace until the end. I haven’t managed to repeat that this week, but as Michael Johnson keeps telling me (through the app, he’s not my mate), it’s about the distance not the speed.

I bought a new pair of shoes (online, natch) a couple of weeks ago. I’ve been limping around waiting for the right one to soften ever since. Yesterday I realised there was a big bit of plastic inside the toe that I hadn’t removed.

Nae Pasaran!, the documentary about Glaswegian Rolls Royce workers who refused to service engines for Pinochet’s jets, is on iplayer for the next 18 days (if the BBC survives that long). It’s great.

https://chrislowis.co.uk/weeknotes/2021/05/23/weeknotes
Weeknotes 32
Show full content

F- is teething. Which means he gets a fever quite often. Which means we get asked to collect him from nursery. Which means he needs to have a negative PCR test before he can go back. The nearest walk in test centre is now 3 miles away, and you’re asked to walk or drive. He did not enjoy over an hour of being pushed in the push chair and then having a swab stuffed up his nose. The test was negative.

We also went through this same routine with N- on Monday.

I had my second vaccine shot on Wednesday. A lot less pain in the arm this time, but developed fever and a sore throat after 24 hours. Glad to be doing my bit to stop transmission, and the folks at the St Thomas vaccination centre were typically wonderful.

I was on leave this week. In between all of the above I did manage to finally paint the chair I made, and also the bench stool I brought home from my class with Chris Schwarz 18 months ago. I like painted furniture, but I don’t like painting furniture. I used some black milk paint and finished with a top coat of Osmo.

Painted chair

I’ve played Nothing Less by Awon & Phoniks so much since it came out last month. If you like jazzy, sampled, Golden Era boom-bap you will love this.

Back to work on Tuesday. As much as I’m enjoying the current project, I could really do with a proper break. When the kids leave home perhaps?

https://chrislowis.co.uk/weeknotes/2021/05/03/weeknotes
Weeknotes 31
Show full content

My brother came to visit on Friday. We haven’t seen each other since August, which is also more than half of F-‘s life. We had a pint in the beer garden at The Southampton Arms then picked the boys up from nursery for a very excitable trip to the playground, before heading out for a couple more beers. It was great.

A- is watching Twin Peaks and while I’m trying not to get sucked into another TV Series I am enjoying the soundtrack in the background, it’s a banger.

We’re getting ready to launch the thing we’ve been working on for the Raspberry Pi Foundation - it’s been a fun but busy week tidying up a lot of loose ends.

Paul recommended the post Embrace the Grind about how sometimes doing large amounts of tedious work produces results that are magical. Some of the most inspiring people I’ve worked with share that trait in common, but I hadn’t seen it expressed in such a clear way before.

https://chrislowis.co.uk/weeknotes/2021/04/18/weeknotes
Weeknotes 30
Show full content

I celebrated my birthday yesterday. I was able to do more than last year, but things are still quite restricted. Nevertheless, we had a round of crazy golf in Acton Park with my friend Dan and his family. We picked up a couple of pizzas from a local pizza place too. Good times.

As well as some delicious birthday beers, I got another nice surprise in the post this week:

Certificate from W3C

The Web Audio API was reached “candidate recommendation” status in January so I think the W3C have been thanking everyone who was involved along the way. I was really touched to receive this certificate, especially given the small part I played in the whole thing - it was a very nice gesture.

We’ve been busy getting the thing we’re making with the Raspberry Pi Foundation ready to share more widely. We’re aiming to invite some people to use it on the 20th April and having a deadline has focussed our prioritisation a bit. It’ll be great to be able to talk about it in more concrete terms.

I spent a couple of evenings adding some more features to thunk my norns sequencer. I’ve been able to reuse some of the patterns I developed working on a Rust sequencer last year, and norns has some useful building blocks (e.g. MIDI grid i/o, a sampler library) that means things are going a bit faster. I implemented swing and allowed tracks to have up to 64 steps, and I’m already able to use that to make some longer and more interesting-sounding rhythms.

I’m looking forward to seeing my brother on Friday for the first time since August. We might even have a pint outside a pub.

https://chrislowis.co.uk/weeknotes/2021/04/11/weeknotes
Weeknotes 29
Show full content

It was F-‘s 1st birthday on Friday. For obvious reasons his first year has been very different to how we’d planned and imagined while A- was pregnant. But the important things are he’s healthy, happy and makes everything better. Happy birthday little chap.

We used our new-found freedom to celebrate with friends and family over the long weekend. Unfortunately not as one large party but rather 3 separate little picnics. It’s been over 6 months, more than half F-‘s life since my parents saw him. We visited them on Sunday and it was wonderful.

Whenever F- is upset looking at photos of people always seems to calm him down, so we made him a picture book with some of his favourite photos. We got it printed as a baby-friendly board book with captions in English and, so he can take one to nursery, in Spanish too. We also gave him a small steel tongue drum. This seems like a good instrument for his age. It responds well to being bashed with hands or the little beaters it comes with. And as it’s tuned with a pentatonic scale it sounds fine no matter which keys you hit together.

I spent most of the week at work working with CSS. I really love this stage of a project, starting to polish things up ready to share them and making a prototype feel more like a “real thing”. Doing CSS work also takes me back to the feeling I had when first building websites in the 90s, making a change to the code and seeing a visual result. Just with more indirection and compilers. Seriously though, SCSS and the module style we’re using for this project do make things much easier and more immediate. But trying to do things like applying an inset shadow on a single side of a div makes me realise why they call them CSS tricks.

I met Nigel for a walk on Wednesday night. We took a growler of beer from The Southampton Arms up to the heath and had a good natter. Happy days.

https://chrislowis.co.uk/weeknotes/2021/04/05/weeknotes
Weeknotes 28
Show full content
  • I had the most enjoyable week at work I can remember for a long time. We can’t talk about what we’re working on just yet, but last week I got to build something that combines Web Audio, computer music, programming languages and education. And to do that with a brilliant team. I was in my element!
  • F- had his first full day at nursery on Friday. He seems to be settling in well. I miss him being around during the day though. And as is customary he’s immediately caught a bunging cold.
  • Currently reading “Fear of music: why people get Rothko but don’t get Stockhausen” by David Stubbs. As well as trying to answer the central question about why “modern art” is so popular but the equivalent music is not, it also has a great art/music history of the 20th century.
  • Predictably my music making has taken a bit of a back seat in favour of music software making. But I really enjoy all aspects of this hobby.
  • I went for a run. It was so hard, being ill and in the house for months really takes it out of you it turns out. I thought I’d try 3km at 7:30/km which was a fairly easy pace and distance for me a year ago. I managed about 1km. Strava, while generally pretty awful, has two things going for it. Firstly, it continues to insist on calling me an athlete which amuses me no end. And secondly, it reminded me that with some effort I was able to improve and run a 5k last year.
  • I enjoyed Beer Hawk’s One way road to beer data visualisation. Or, as my friend dryly put it, 140 days until “unexpected circumstances” shut everything again. Having said that, have bike, will travel. If anyone fancies a beer in the park, give me a shout.
https://chrislowis.co.uk/weeknotes/2021/03/23/weeknotes
Weeknotes 27
Show full content
  • It was F-‘s first day at nursery on Wednesday. He’ll be going to the same Spanish-speaking nursery as his older brother 3 days a week. The settling in routine is a bit different this time around given the covid restrictions but A- was able to spend some time with him getting him used to the surroundings. By Friday he spent a few hours, including a nap and lunch. He seemed happy to be left there - on the one hand you want them to settle, but on the other it’d be quite nice if they cared when you left. He’ll have a 4 day break before his next visit so next week could be worse.
  • I had a spirit-lifting virtual cup of tea with Murray this week. For various reasons, I was in the office for the day and it was great to be able to a large monitor, decent camera and fast connection for the chat. Not the same as in-person, but much better than at home.
  • I’ve been doing a reasonable amount of business development (calls with potential clients) and account management (calls with current clients) recently. I’ve found myself enjoying and looking forward to this kind of work, and I like that it is largely self-directed. Maybe I’ll end up doing more of it?
  • I made my first change to a norns script. So far it’s been a fun environment to work in. Norns is effectively a custom Linux distribution running on a raspberry pi. Sound is created by engines written in SuperCollider, but rather than write Supercollider code directly, users write scripts in Lua. These scripts act as glue code between the inputs (3 encoders, 3 buttons, and any connected OSC/MIDI devices) and outputs (sound, LED screen, OSC/MIDI). You can edit the scripts using a web interface that runs on a web server on the pi, but as it’s “just Linux” you can also SSH in, pull git repositories etc. It’s very well thought-out platform for creative coding and there’s an active, welcoming community too.
  • My already fairly low opinion of the police was not helped by the events of the week. Heartbreaking, depressing stuff.
https://chrislowis.co.uk/weeknotes/2021/03/15/weeknotes
Weeknotes 26
Show full content
  • We watched Armando Iannucci’s The Personal History of David Copperfield on Thursday night. We really enjoyed it. Dev Patel is fantastic in the lead role, and other actors in the Iannucci-orbit such as Peter Capaldi, Hugh Laurie and Tilda Swinton play a host of wacky characters. Surreal, heart-warming, escapist fun.
  • I’ve been mostly doing front end work (React and CSS) for the last month on our project for the Raspberry Pi Foundation. CSS Flexbox and Grid are both new to me (almost all projects I’ve worked on where I’ve need to do frontend work in the last years have used some variation of bootstrap). Joel pointed me at the excellent CSS-Tricks cheatsheets for grid and flexbox. I’ve used React more recently so that’s not such tough going, but there’s still plenty of occassions when I don’t know how to solve a problem in React. This seems to happen quite a lot when trying to integrate some non-React library into a project (for example Chart.js in the project we did for Oxford Uni).
  • I recorded a piece of music everyday this week apart from Thursday. I’m mostly using Koala Sampler. I start by selecting some samples from a google drive folder and “sharing” them with Koala - this is a pretty quick way of getting them loaded in. I then create an 8 bar loop, I’ve mostly been writing lofi, house-y music at around 120BPM and I can just about tap in simple rhythms at that tempo. I use the piano editor to add extra percussion. I’ve been creating variations of the core pattern and then using the performance mode to do a “live” recording of the finished track. I only spend at most an hour on these, so they’re pretty unpolished, but it’s really interesting to listen back to them and think of ways to improve.
  • My norns shield arrived (4 days to ship from New York!). I’ve put it together (very straightforward) and had a little play. So far my favourite script has been mx.samples loaded with the Kawai Felt Piano that I was previously using in sforzando on my laptop. It’s great to have a dedicated device that lets me play a few chords quickly.
https://chrislowis.co.uk/weeknotes/2021/03/07/weeknotes
Weeknotes 25
Show full content
  • I had the coronavirus vaccine on Friday. I was invited by St. Thomas’s hospital (where I see the cardiology team) and attended the vaccine centre at Guy’s hospital. It was a pretty life-affirming experience to be honest, plenty of people there, well organised, cups of tea, blitz spirit etc. I felt a bit odd about being in an enclosed space (a big tent) with lots of other people (probably the largest gathering I’ve attended for over a year, ironically) but everything was being constantly sanitised. My arm was sore for a day, and I had chills/fever type symptoms for a few hours yesterday afternoon but back to normal now.
  • Afterwards I enjoyed a short walk along the Southbank in the sun.
  • When I got home and before any side effects kicked in I managed to do a bit of woodwork for the first time in months. I’m building a small cabinet on wheels for A- to store her sewing machine and overlocker in (hopefully making it easier to get started on sewing projects when she had an hour or two in the evening). Nothing special joinery wise, I’m using pocket screws to join poplar plywood. The top of the cabinet folds out to make a larger surface for the fabric being fed into the machine. I used bar-counter style flap hinges, which involved morticing into the ply. Poplar ply is pretty soft, so I was able to cut the curve with a sharp knife. I used my router plane to level the bottom of the mortice. Counter-flap hinges in poplar ply
  • I’m still enjoying making music. For a bit of discipline I’ve been trying to complete whole songs even if I have very limited time, to develop a workflow and some muscle memory. I’m putting them in a folder and hopefully listening back will give me some concrete things to work on. Koala Sampler is amazing, particularly with the recent update that enables piano-roll editing of sequences. Perfect for writing music while rocking F- to sleep, but it does involve a lot of staring at a screen, which I was trying to avoid. I’ve pulled the trigger on a Norns Shield which I’m hoping will be the right balance between hacking on music software and stand-alone music making. We’ll see.
https://chrislowis.co.uk/weeknotes/2021/02/28/weeknotes
Weeknotes 24
Show full content
  • Just when I was starting to feel a bit better, I managed to put my back out. It’s taken me several days to get over that. Spending the best part of 3 weeks in doors ill isn’t great for my strength, I’m looking forward to getting out and trying to do some exercise this week.
  • A- has been watching The Handmaid’s Tale and I’ve been trying to avoid getting pulled into it. It’s compelling and amazingly acted but also utterly, utterly depressing. And there’s 4 series of it. I’ve had to hide at the other side of the room (we only have one room when the kids are in bed) with my headphones on to avoid it.
  • I’ve been really enjoying the new project at the Raspberry Pi Foundation. It’s a great team, and I’m enjoying being part of the creative process as well as the technical/implemention one. I wish I didn’t have to do it all from an uncomfortable desk crammed into the corner of our bedroom, but at least the hours spent there have been fun so far.
  • I picked up a Gorilla flight case to hold some of my music equipment. The idea being that I can leave things connected together and it’ll be easier to start making some music once the kids have gone to bed. Bullet point 2 notwithstanding, it has worked fairly well so far. I’m really bad at cabling though, it always feels like a mess.

    A box of synths and other music making gear

    I have a 7” Waveshare screen hooked up to the Raspberry Pi (with pisound soundcard) - that’s running tidalcycles in this photo. There’s a Makie Mix8 mixer, and the Korg Volca Keys. A Korg nanokontrol2 is hidden under the massive apple keyboard.

https://chrislowis.co.uk/weeknotes/2021/02/21/weeknotes
Weeknotes 23
Show full content
  • We’re all just about recovered from our bout of Covid. I’m still very tired a lot of the time. A few friends have told me that it took them up to a month to feel 100% again so I’m prepared for a long haul. Still, we’re luck to be mostly out of the other side of it.
  • F- started to crawl while we were all sick. Not great timing, but cute in retrospect. He’s pretty pleased with himself.
  • I started a new project today at the Raspberry Pi Foundation. We’re working with my old FutureLearn friend Laura, which is absolutely brilliant. I’m hoping I can stay well enough, and the nursery stays open long enough, to get stuck into the project.
  • Shout out to Kropotkin on the 100th anniversary of his death.
https://chrislowis.co.uk/weeknotes/2021/02/08/weeknotes
Weeknotes 22
Show full content
  • All four of us came down with COVID this week.
  • A-, N- and I have all tested positive. We sent off a test for F- at the same time, but we haven’t got his results yet.
  • We haven’t been well. The boys have mostly had typical cough/cold symptoms. We’ve had high fevers and I’ve been having shortness of breath.
  • It’s hard looking after sick children when you’re sick yourself, and worse given the current situation. I’m thankful for my GFR colleagues and tuzz for taking the stress of work away.
  • My medium-term ambitions have gone from “it’d be nice to have a meal out with some friends” to “it’d be nice to take the bins out without feeling exhausted”.
  • I feel like I’m on the mend though and hopefully over the worst of it. Going to take a few days to rest up as best as I can and look after the family so they can do the same.
https://chrislowis.co.uk/weeknotes/2021/01/31/weeknotes
Weeknotes 21
Show full content
  • My inlaws returned to Colombia on Wednesday. It was very sad to see them leave, made more difficult by not quite knowing when we’ll be able to see them again. They both had a negative COVID test within 2 days of flying and I was happy at least that we’d managed to keep them safe and healthy while they were here.
  • We lost a family member in Colombia to Covid. A lovely man who had us to stay for Christmas in his house in Medellin when N- was 8 months old.
  • Having kept N- at home while A-s parents were here, on Wednesday we were able to send him back to nursery. He was excited to see his friends again and their little reunion when I dropped him off was touching. Because their access to outdoor space is a bit more limited than usual, they now have a trampolene inside. You can imagine the excitement!
  • On Thursday night we got the message that the nursery would have to close for 10 days due to 2 staff testing positive. Nursery staff are really putting themselves at risk at the moment, and Camden council have been offering regular tests. Given the prevalence of the virus at the moment, and the false positive rate for these tests I suspect short shutdowns might become more frequent. We’ve been trying to decide how best to work around this as A- is due to return to work in March.
  • It’s been a tough week, but I’m lucky to be able to spend time with my family. It snowed on Sunday and it was the first time N- had seen the snow. He loved being outside for around 10 minutes until he realised how cold it was!
  • For some light relief we’ve been enjoying the first season of Cobra Kai. Wonderfully silly, nostalgic fun.
https://chrislowis.co.uk/weeknotes/2021/01/25/weeknotes
Weeknotes 20
Show full content
  • F- is almost starting to crawl. I really enjoy watching his physical problem solving as he works out what combination of roll, shuffle or kamikaze dive will let him grab something he shouldn’t. His favourite place to practice this is the bath, I think the added boyuncy helps a lot. And no matter how many times he slips and ends up under water - after I fish him out he goes at it again.
  • We have agreed to start work on a new project in a few weeks time. I’m really glad. Even more than usual it feels risky to say no to certain work in order to take on something new. But taking a bit of a leap of faith has given me a lot of energy and optimism, which I need at the moment.
  • On Saturday I went on my first run since F- was born. It felt a lot better than I expected. Rafael Behr’s harrowing account of suffering a heart attack took me back to my own encounter with St. Thomas’s cardiac unit several years ago. The paramedic who took me in thought I’d had a heart attack at the time, but after a lot of investigation it turned out to be a heart defect I didn’t know I had. Still, I don’t want to end up back there - and I know that I can miss exercise when I’m doing it regularly enough, so that seems like a good place to get back to.
  • I had some fun chopping up breaks and slicing them back together in one of my Jamuary tidalcycle jams. Somewhat optimistically/recklessly I see LTJ Bukem and Roni Size are scheduled to play at the Forum in November. Who’s with me?
https://chrislowis.co.uk/weeknotes/2021/01/18/weeknotes
Weeknotes 19
Show full content
  • We returned to London this week. We’d accidentally turned off the fridge/freezer before we left, so that was a messy welcome home.
  • I’d planned to work with James on our project for Oxford University. We spent a bit of time remotely-together but I mostly ended up having business development calls, a workshop with Space4 and making an application for a potential project. And also staring slack-jawed at the TV while some fash broke/were let into the Capitol.
  • N- and I went for a short walk, and spent quite a bit of time watching two squirrels build a nest (or a drey, apparently).
  • Sam and Matt started writing weeknotes! Sam even added an RSS feed just for old, old me, thanks Sam.
  • I’ve been jamming (not the delicious kind, sadly) fairly regularly. Mostly with tidalcycles, and in particular with the Mutable Instruments Supercollider ports. I wrote a bit about one jam and shared some music in the tidalcycles club.
https://chrislowis.co.uk/weeknotes/2021/01/10/weeknotes
Weeknotes 18
Show full content
  • Happy New Year.
  • We’ve spent another week holed up in our rental house in Oxford. It’s good to have the extra space but I think N- is getting ready for a change of scene. The local playground is flooded and that’s about the extent of accessible, safe outdoor activities.
  • On Saturday I went for a walk with my friend Aaron from fellow co-op Agile Collective. It was good to catch up and try and be a bit hopeful for 2021.
  • I got a burst of enthusiasm to write last week so I decided to put together another issue of my newsletter. It was heart-warming to receive a few emails from readers thanking me and saying that they’d missed it. I’m going to try to keep a regular schedule for these again for a while.
  • I’ve managed to make a small amount of music each day for Jamuary. At the moment figuring out how to record and share them would mean I don’t bother making them, but I’m hoping to upload one or two this week when I get back home. I’m still enjoying learning the ins and outs of TidalCycles, mostly by translating sounds and techniques that I see others using on YouTube to the Tidal environment.
  • Arsenal are playing fairly well at the moment, which cheers me up.
  • Paul started writing weeknotes which has also cheered me up!
  • After my hair was described by A- as looking “a bit Doc Brown” it was time for a lockdown haircut. We borrowed my father-in-law’s beard trimmer (he has a very stylish beard) and A- hacked everything off. It’s now a much more respectable 3mm long. The kids thought this was hilarious. Rather than share a picture of my ugly mug, here’s N-‘s “before and after” rendition:

    Daddy

https://chrislowis.co.uk/weeknotes/2021/01/04/weeknotes
Weeknotes 17
Show full content
  • These weeknotes are a bit late, but given I have no idea what day of the week it is, I think I can style it out.
  • F- has started to say a couple of words including, gratifyingly, “dada”. He’s also finding the word “agua” (water) extremely useful when thirsty, but also as a stand in for “milk” and “bath”.
  • I’m really missing my family this Christmas.
  • N- is old enough to play games now. We’ve had fun playing Jenga, memory games and a one he invented called “Lego Skittles”. He’s quite competitve and always wants to be “the winnest”. This is proving quite handy when we want him to do something quickly - “who can put their shoes on the fastest N-, you or daddy?”.
  • I miss Chris Z’s weeknotes, but I see he’s recently started to publish an annotated collection of recipes which is a great idea.
  • I enjoyed Allison Parrish’s talk Programming is Forgetting: Toward a New Hacker Ethic which takes a critical look at Steven Levy’s book Hackers: Heroes of the Computer Revolution and revisits the “hacker ethic” a way that is more aware of structural inequalities

    Instead of saying access to computers should be unlimited and total, we should ask “Who gets to use what I make? Who am I leaving out? How does what I make facilitate or hinder access?”

  • Happy New Year. I very much hope you and your loved ones are well, and we can go for a coffee or a pint before too long.
https://chrislowis.co.uk/weeknotes/2020/12/29/weeknotes
Weeknotes 16
Show full content
  • My in-laws arrived and after a period of self-isolation and a negative COVID test, they finally got to meet F- for the first time.
  • 🥲
  • I finished up at work for the year. We managed to complete our piece of the project on time and along the way advocated for some more agile ways of working which I think helped the team as a whole.
  • I also finished my Barefoot Co-op Development training course. I’ve been meeting my 20 or so class mates via zoom every other Tuesday for the last 6 months and it was sad to say goodbye. I’m hoping we’ll all be able to get together as planned at some point next year. I now know a bit more about how to start and run a co-operative business and I’m thinking about how best to use this knowledge in 2021.
  • I made my first submission to the Disquiet Junto weekly composition challenge. It’s a very simple piano piece. I have very little time to make music but I enjoyed having a challenge and a self-imposed deadline (about an hour).
  • I’m tired and lonely and I wish I could be there for my family and friends who are having a harder year than I am.
Listening
https://chrislowis.co.uk/weeknotes/2020/12/21/weeknotes
Weeknotes 15
Show full content
  • My in-laws arrived from Colombia on Friday. One of the hardest things about this year has been the intense feeling of separation from them. They haven’t met F- yet (who was born in April) and we’ve known that if we needed to get to them at that would have been almost impossible (Bogota airport has been closed until very recently). Although they have to self-isolate now they have arrived, we have the joy of seeing them meet F- for the first time to look forward to.
  • I caught up with some friends this week. By video call on Wednesday night, over slack conversations during the week, and even in person(!) on Friday during a long walk over the Heath.
  • After catching up on admin tasks on Friday I spent some time thinking about if and how we might be able to grow Go Free Range next year. For a long time we’ve had a chicken-and-egg problem. Either we don’t have enough work to think about taking someone else on, or we have too much work and we don’t have enough time to do it. We’re thinking creatively about how to solve this, and I’m looking forward to chatting about it when we meet next week.
  • I got TidalCycles running on my Raspberry Pi this week. Someone has created an ansible role which helped me figure out some of the dependencies. I also made a couple of small tweaks to my emacs config so that would also run on the pi. I’m now able to use my phone as a terminal connected to the pi, and sequence MIDI events to my Volca Keys. The keys understands MIDI Control Change messages for many of its parameters, and I’ve had fun sequencing the filter cutoff while playing chords.

Raspberry Pi, Volca Keys

Listening

It was the last Bandcamp Friday (where Bandcamp passes on all of the purchase price to the artist). I picked up:

I’ve been enjoying the new Bahamas record Sad Hunk. This led me back to a wonderful live version of “Lost in the light” which is now on repeat:

https://chrislowis.co.uk/weeknotes/2020/12/06/weeknotes
Weeknotes 14
Show full content
  • Another quiet week. I’m busy with work at FutureLearn, it feels good to be writing and mostly shipping useful code. I’m really enjoying having a couple of days a week pairing with Chris and it’s also been great to work with Simon again.
  • I found out this week that large parts of the BBC /music site have been taken offline. Things have moved on, and BBC Sounds seems to be focus today. I moved to London to join the BBC in 2009 to work on /music. One of the wonderful things about /music was its commitment to have a page for every artist which collected all of their BBC connections (songs played on the radio, interviews, album reviews etc.) in one place. Rather than build a CMS to edit the artist biographies, we instead pulled changes from Wikipedia and Musicbrainz. This meant our editorial colleagues (we sat right next to them, which was another great thing about the team) were editing Wikipedia in order to edit /music, improving both at the same time. Patrick and others had written some scripts that used a Wikipedia IRC channel to get a stream of change events, filtered them for pages we cared about and then updated the artist biographies. It was elegant and janky and brilliant and I loved it. I mostly worked on /introducing, the BBC’s service for unsigned artists. We looked after a Rails app called Peel, and one of its jobs was to create a new page on /music when one of the introducing artists had been played on the radio for the first time. It was a small thing, but we got such great feedback from artists for that. Anyway, nostalgia isn’t what it used to be and URLs aren’t cool anymore. But I’m glad for the memories and the friendships I still have from that time.
  • We went shopping for a Christmas tree and decorated it today. N- is now at an age where this is very exciting for him, and given the year we’ve all had, I’m going to get stuck in. The Low Christmas Album made its first (of many) appearances.
  • I’ve given up on doom emacs. There were too many things that were slightly different to how I was used to them working, and I didn’t have enough time to learn them (or even to learn how to disable them). The final straw was when I had issues with some trailing whitespace not deleting reliably, and couldn’t work out how to fix it. It’s not been a lost cause though, I’ve found a few new packages that are great (vterm in particular) and know enough about doom to crib things from its code into my own config. I’ve started a new config from scratch and am pulling things from my old config, or from doom, as and when I need them. So far, so homely.
Listening
https://chrislowis.co.uk/weeknotes/2020/11/29/weeknotes
Weeknotes 13
Show full content
  • I started working at FutureLearn again this week. They’ve asked us to help with a couple of projects and it’s good to be back. It goes without saying that the working environment is dramatically different to the last time I was there - everyone is now fully remote. Chris has joined me to help out too, and it’s great to finally get chance to work with him.
  • Life is otherwise pretty quiet, there’s not a lot to do in lockdown London. We’ve been lucky to have the Heath and some reasonable weather. N- enjoyed a trip to the playground and the lido cafe makes something he’ll eat (and has a tasty falafel stand outside on weekends) so we had a wintery picnic.
  • With no travel to pay for I’ve been able to save a little bit in the last few months. I treated myself to a Koma Field Kit to use as a small mixer and because Hainbach has one. I’ve been able to connect my Volca Keys and PO-33 sampler to the built in mixer and mash that up with some radio static and buzzy noises from the LFO. The setup just puts a huge smile on my face. Not to sound like too much of an old man, but as a teenage music technology student I would have been blown away by the capabilities of these little instruments.
  • I had a couple of Zoom calls with friends. That tradition seemed to die away a bit over the summer, but I really enjoyed catching up. One of my friends has lived in Singapore for years so we scheduled a chat for Friday lunchtime UK time. That worked pretty well (although I was a bit jealous of his beer).
  • I’m down from around 93kg at the start of the year to just over 85kg now. I’d like random online calculators to stop calling me “overweight”, which I think means a BMI of 25 or less (< 81kg). A fairly plain diet and not too many beers isn’t a lot of fun during lockdown but it’s also not a bad time to do it. I’m pleased with my progress so far.
https://chrislowis.co.uk/weeknotes/2020/11/23/weeknotes
Weeknotes 12
Show full content
  • No weeknotes last week. My 7-month old baby faced some stiff competition in the “keeping Chris awake at night game” from bitter rival “the absolute state of the world”. The former won. In your face world!
  • I’ve been working on my own on two projects for Oxford University this week. After pairing with Paul last week it’s been good to force myself to consolidate what I’ve learnt about React by adding some features on my own.
  • One of the many things I learnt while working with Paul was the heroku local command. A handy shortcut for the dotenv and Procfile fiddling I was doing before.
  • N- decided he wanted to try wearing pants again on the same day our washing machine packed up. We tried to get it fixed (by the excellently-named and highly recommended Spin Doctor) but unfortunately it’s a gonner. Our new machine arrived yesterday and it connects to the internet. WHY?!
  • I found a bit more time to play with TidalCycles this week. First I wanted to make my drums bounce a little by adding some ghost notes - quieter hits played before or after a main hit. I came up with

      d1 $ superimpose (sometimes ((1/16) <~) . (# gain 0.5))
         $ sound "[kick ~ kick ~]"
    

    this sometimes plays a lower volume kick drum a 16th before the hit on the 1 or 3. Using superimpose means I can specify the pattern in terms of the “main” rhythm and let the function take care of creating the pre-delayed copy.

    In the tidalcycles tutorial that runs on Tidal Club I also learnt about chop for slicing and rearranging samples. Putting the two techniques together I made this loop:

    I’m enjoying Tidal. I’m not sure I’ll get into the whole algorave thing, but I can quickly make patterns that would take a lot of clicking and copy-pasting in a DAW. I’d still like to get some external MIDI control hooked up so that I can spend less time looking at the screen and more time “playing”.

Reading Listening
https://chrislowis.co.uk/weeknotes/2020/11/15/weeknotes
Weeknotes 11
Show full content
  • The halloween celebrations lasted all week at N-‘s nursery. We usually do something for halloween, because it’s also A-‘s birthday, so growing up it was always a big deal for her. Now with kids it’s also an excuse to have some silly fun. N- had his face painted most days this week. One attempt at painting a dinosaur didn’t last beyond a teary tantrum before we left the house. But the Spiderman and Hawaiian-shirt combo on Friday was a huge success!
  • I cooked a few new things this week:
    • A tofu and noodle bowl dish from Anna Jones’ A modern way to eat (h/t Tom). I used the Tofoo brand smoked tofu which was delicious. F- enjoyed eating a small piece too. Aw, babies.
    • A stir fry from the same book - the sauce (which includes maple syrup) will be very useful for lots of quick meals I think.
    • I improvised a sausage, bean and red cabbage casserole. I often make something like this but this time I added a good glass of red wine which made a big difference.
    • For A-‘s birthday I tried to help her homesickness by cooking some Colombian dishes. I made some empanadas based on this Jamie Oliver recipe. I used some pre-made filo pastry squares I picked up from Phoenicia. They were the highlight. I tried to make Ajiaco, but I couldn’t find guascas or any of the typical potatoes, so it was just a chicken and sweetcorn soup. It was ok. Finally I attempted a HidaMari no-bake cheesecake but using some Colombian mora fruit puree. It was a bit of a sloppy disaster, but again, tasted ok.
  • I continued to play around with Tidalcycles. I got it talking to my Volca Keys via MIDI fairly easily, although I haven’t quite figured out how to send clock messages that the Volca understands. The keys doesn’t have a built-in arpeggiator, so I had a lot of fun creating arpeggios in tidal while sweeping the filters on the keys by hand. The keys is polyphonic, but the little keyboard makes it hard to play bass and lead lines at the same time. This is easy to achieve in tidal.

    I also played around with “humanising” drums using swingBy and gain patterns. I made this simple boom bap style beat

    using the following code

    setcps (90/60/4)
    
    d1 $ swingBy (1/32) 4
       $ sound "closedhat(8,8)"
       # gain "[0.7 0.5]*4"
    
    d2 $ sound "~ snare ~ snare"
    
    d3 $ sound "[kick ~ kick kick ~ ~ ~ kick kick ~ ~ ~ ~ ~ ~ kick]"
       # gain "[1 0 0.7 0.6 0 0 0 0.7 1 0 0 0 0 0 0 0.7]"
    

    The code for the kick pattern in particular is pretty literal so I’m going to work out if there’s a more idiomatic way of writing it. I’d also like to play with creating variations of the pattern.

  • It’s looking like we’ll be spending a lot of time outdoors with the kids this winter. N- is still enjoying climbing trees and exploring Hampstead Heath which is a good sign. I need some new boots and waterproof clothes.
https://chrislowis.co.uk/weeknotes/2020/11/01/weeknotes
Weeknotes 10
Show full content
  • On Sunday morning both boys were up stupidly early (thanks daylight saving time), but last night was the first night F- has slept through without waking, so go figure.
  • We went on the Gruffalo Adventure at Kew Gardens on Saturday. Kew has generously extended our membership for a couple of months to make up for the time they were closed. N- enjoyed hunting for Gruffalo characters and filling in a nature-themed treasure hunt. As long as we can keep moving around the city, I think Kew might be a popular destination for us this winter, there’s plenty to do outdoors and the large glasshouses are warm and colourful.
  • I met Joel for a catch up on Monday night, it was really great to chat for a couple of hours.
  • I’ve been playing with TidalCycles a bit this week. It’s a lot of fun, and I’ve just started to scratch the surface. I hadn’t realised that it has a SuperCollider audio engine, so some of the things I’ve been learning this year should transfer over. I still don’t really want to sit in front of a keyboard and screen to make music, but I like the idea of being able to create little audio “applications” in Tidal that control external equipment and can be controlled by MIDI controllers.

    I enjoy the Attack Magazine series beat dissected. It shows how to create music in a variety of different styles, and also includes samples. Using Tidal I made a version of the lo-fi house beat:

    Tidal code is Haskell, which I’m not familiar with at all. But the Tidal language embedded in it seems to be usable even without any knowledge. The above snippet was created with this code:

    setcps (125/60/4)
    
    d1
      $ slow 2
      $ sound "lofi:2 lofi:2 lofi:2 lofi:2 lofi:2 [lofi:2 lofi:2 ~ ~] lofi:2 [lofi:2 ~ ~ lofi:2]"
      # hpf 30
      # note (-2)
      # release (0.4)
      # shape 0.4
    d2 $ (0.01 <~) $ sound "~ lofi:1 ~ lofi:1" # note (0)
    d3 $ (0.01 <~) $ sound "~ lofi:3 ~ ~" # release 0.2
    d4 $ randslice 4 $ sound "lofi:4" # hpf 150 # gain 0.7
    d5 $ swingBy (0.35) 4 $ "~ lofi ~ lofi" # release 0.1 # lpf 10000
    d6 $ swingBy (0) 4 $ sound "lofi:5(5,8,3)" # release 0.15 # lpf 5000 # gain 0.7
    d7 $ slow 4 $ n "f4'maj7 c4'maj7" # s "superfm" # gain 0.4 # attack 0.5 # release 2 # lpf 200
    

    d1 to d7 are equivalent to “tracks”. I’ve loaded the samples from the Attack magazine article into the unhelpfully-named lofi:n variables. lofi:2 is the kick drum, for example.

    SuperCollider has a built in “record to file” option and I imported the AIFF created by that into Audacity to add a fade-in and out and covert to OGG.

    I think I have everything I need to get this running on the raspberry pi and I’d like to explore using Tidal to output MIDI next.

https://chrislowis.co.uk/weeknotes/2020/10/26/weeknotes
Weeknotes 9
Show full content
  • On reflection, opening a weeknotes with “several years ago” is a bit of a cop-out.
  • I was out-and-about a bit this week. I met an old colleague on Tuesday afternoon, my GFR comrades on Wednesday and a friend on Friday night. The latter was the first time I’ve been out of the house after 7pm for several months. The beer garden felt safe, table service was a bit of a novelty and the 10pm curfew seemed dangerously arbitrary. But with a pint in hand I probably would say that.
  • These meetings all involved sitting outside and as the weather gets colder I need some more layers. Vest or tactical base-layer?
  • I had another session of the Barefoot Co-op Development training course on Tuesday. This time the topic was conflict resolution. In groups, we helped an imaginary co-op pub to handle some conflict between their staff. I found the (Zoom) group work quite tiring but very rewarding. In our group we had two members of an actual co-op community pub and I learnt a lot from discussing everyone’s real experiences.
  • Space4 have asked me to help run a workshop on legal structures as part of their plan to become a co-op in their own right. I’m excited but also nervous about putting some of what I’m learning into practice.
  • I received another couple of emails this week asking what happened to web audio weekly. I’ll try and get an issue out this week, but if you, dear reader, ever consider starting a newsletter my advice to you is to avoid using the millstone word “weekly” in its title.
  • So ends these weeknotes. Oh.
https://chrislowis.co.uk/weeknotes/2020/10/18/weeknotes
Weeknotes 8
Show full content
  • Several years ago I felt faint on the way to work, so decided to head to my GP instead. Shortly after I was admitted to St. Thomas’s cardiac ward. After a couple of days of investigation they discovered I had a thickening of the wall of my heart. Although this causes a slight obstruction, with medication I no longer have any symptoms. Although we don’t know the cause of this thickening one of the possibilities could be inheritable so when F- was born they referred him to Great Ormond Street. We had our (video) consultation this week, and they’ve asked to see N- too when it’s safe to attend in person. It’s rare for there to be any complications, but I’m happy that they want to keep on eye on the boys as they get older.

  • In other Zoom call news, we had a fun 10-way call with our Colombian family to celebrate the marriage of A-‘s cousin. We had family dialing in from two cities in Colombia, Australia, California, Japan and the UK. Later in the week we also managed to catch my father-in-law in a WhatsApp video call while he celebrated his birthday. It was odd to see the familar COVID-trappings (face masks, painted lines 2m apart on the floor) in the restaurant where he was having lunch.

  • I love Ethan Hein’s hip-hop education blog. His recent post on septuplet swing introduced me to this wonderful track from Noname

    I’ve played the whole album through at least half a dozen times this week, it’s great.

  • I found some time to get my sequencer/sampler project running on a Raspberry Pi. I’d attempted this earlier in the year and the MIDI-to-audio latency made it quite unplayable. With the Patchbox OS distribution the latency is much better (I haven’t measured it yet, but it is just barely detectable to me now). I only have a cheap USB sound card, and I think the pisound hat is likely to improve things a lot. I’m quite tempted.

  • N- and I have been talking about autumn and different types of tree on our way to and from nursery this week. Today we all took a walk on Hampstead Heath and he enjoyed climbing trees and talking about the colours of their leaves. We got confused by some larger acorns on what looked like a small oak tree. Google Lens identified it as a Northern Red Oak from a photo of its leaves. What a world, etc.

https://chrislowis.co.uk/weeknotes/2020/10/11/weeknotes
Weeknotes 7
Show full content
  • I’ve continued to work from the Outlandish office in Finsbury Park. It’s still very quiet with at most 4 other people on a busy day. Having a comfortable set up, fast internet connection and a quiet environment makes a huge difference.

  • Paul offered to work with me on a project we have with Oxford University. I’ve really enjoyed (remote) pairing and learned a huge amount about React. It’s made me want to find opportunities to work with other people more often (and Paul again).

  • F- turned 6 months this week. Things are getting slightly easier now N- is able to go to nursery. A couple of weeks ago we started helping F- to sleep on his own (a euphemistic way of saying “sitting outside his door crying while he cries”) following the method in The Happy Sleeper. It had got to the stage where neither A- nor I were getting much sleep at all, and F- was noticeably angry at our usual attempts to rock him to sleep. Within a few nights he’d learnt to fall asleep quietly on his own.

  • F- has also had a snotty cold. It’s a bit odd seeing him so grumpy as he’s usually of a very sunny disposition. Case in point, here he is in an unusual situation, with bright lights shining in his face after being given the explicit instruction not to smile:

Smile

  • I’m still getting a lot of enjoyment from the Kelly Lee Owens album I mentioned a few weeks ago. Her song “On” was recently featured on the song exploder podcast. I enjoyed her talking about leaving in some “mistakes” generated by her analogue modular synth and how those mistakes tie into the broader themes of the song.

  • I opened a news app this week to be confronted with a face I recognised. The spokesman for a far-right German political party was caught on mic talking like a Nazi. For some reason this surprised the party and they’ve sacked him. He was a class mate of my housemate when I lived in Berlin in the early 2000s and we’d spent quite a lot of time together. At the time he was active in the liberal party, but the last 20 years have clearly radicalised people both here and in Germany. My old housemate and I comforted ourselves via WhatsApp. We’d always thought he was an Arsch anyway.

https://chrislowis.co.uk/weeknotes/2020/10/03/weeknotes
Weeknotes 6
Show full content
  • We have a new bathroom!
  • Which means we’ve been able to move back home. I’ve really missed being able to find a sharp kitchen knife.
  • On Tuesday I decided to stop procrastinating and write an application for a really interesting-sounding opportunity on a popular government open tender site. A lot of companies that go for this kind of thing have people who write the applications, and a separate set of people that end up doing the work. At freerange we’re the same people. This has a bunch of downsides, but one of the main upsides (for our clients at least) is that when we apply for a project, we really want to do it. I was pleased with the application I put together, it took a couple of hours (plus some extra hours of faffing close to the deadline while I shuffled words around aimlessly). I’m fully anticipating having our hopes dashed.
  • Harry and Abi from Outlandish came by the office on Thursday and we went to the pub for a drink before heading home. That’s the first time I’ve sat in (outside) a pub with some friends for over 6 months. It might be the last time for a while too.
  • I really enjoyed this interview with Wendy Liu (Abolish Silicon Valley) on the Upstream Podcast
Upstream · Wendy Liu on Aboloshing Silicon Valley (In Conversation)
https://chrislowis.co.uk/weeknotes/2020/09/21/weeknotes
Weeknotes 5
Show full content
  • Avid readers of my domestic enumeration will recall that we’ve temporarily moved out of our flat while some brilliant builders rebuild our bathroom.
  • I find it even harder to work from the temporary accommodation than I did from home so this week I decided to take Outlandish up on the offer of a desk.

My desk at Outlandish

  • The office is mostly empty but there are people from two other co-ops working from there who I enjoy spending time with. We’re doing our best to keep social distance, and I am able to walk to and from the office. I feel so much happier having a bit of company and much more productive with a clearer separation between work and home. My wrists and back are thanking me too. On balance it’s a big improvement for me but I also can’t shake the feeling that I’m part of the problem.
  • I’ve had conversations with another co-op about how best to write policies and with Space4 about how they might become a co-op in their own right. I enjoy being able to spontaneously make time for these kind of things again.
  • My computing setup got some new-term love this week too. I started using doom emacs to replace my rag-tag old configuration files. I’d dismissed doom in the past because of its emphasis on vi-style key bindings (I’m too old to change now). But it turns out you can disable those. So far I’m impressed with the startup time and the fact that things like terminal emulation “just work”. Once I’d added some of my familiar key bindings it soon felt comfortable.
  • I’ve also started taking notes using org-roam. It gives me daily note pages and easy wiki-like linking (with backlinks!). This again feels like a step up from my homegrown note taking system.
  • I’ve never been a big fan of nightclubs, but I’ve been day dreaming about going to one. Being surrounded by 100s of happy people in a confined space and not worrying about anything feels fantastical at the moment. And I want it.
https://chrislowis.co.uk/weeknotes/2020/09/13/weeknotes
Weeknotes 4
Show full content
  • During lockdown our bath sprung a leak. The way the bath had been installed made it hard to get to and repair. And because our stopcock was seized we had to first turn off the water for the whole building and replace our stopcock. And because the stopcock for the whole building was seized we first had to turn off the water for the whole street to get that replaced. Understandably this took some time. While the leak was finally fixed (with the help of my wonderful and invested downstairs neighbour) it’s left our bathroom in a pretty bad shape. Our building insurance came through and they’ve paid for us to relocate for a couple of weeks so we’ve moved a mile away to Dartmouth Park while we have everything redecorated.
  • This would have been an opportunity to go a bit further afield for a change of scene but it’s helpful to be around when the builders have questions and N- started back at nursery on Thursday so we decided to stay close to home.
  • With N- back at nursery I had a bit of free time. I caught up with Tom for a coffee. I really miss seeing friends and it was a spirit-lifting couple of hours.
  • On Friday I caught up with my colleagues for coffee and lunch on the South Bank. Like a lot of small companies we’re facing some real challenges this year, and it’s made a lot worse by not having any face-to-face time together. It was really good to catch up and despite having some tough decisions to make we had an enjoyable day.
  • I’m really enjoying Bandcamp. I love how I can discover music by following specific record labels. Buying records on the strength of the label that released them was something I did a lot of when I was younger. But since switching to streaming services for most of my listening it’s not something I’ve thought much about. I’ve been listening to a lot more music as a result. On Friday Bandcamp were passing on 100% of the royalties to artists so I picked up new releases from Nubya Garcia (Camden-based jazz saxophonist), Kelly Lee Owens (synthy, lyrical) and Foreach (lo-fi, minimal house).
  • I was very sad to hear that David Graeber passed away. His writing was funny, inspiring and challenging. I took for granted that I’d be able to enjoy it for many more years to come. Paul Mason’s obituary made me sad I’d never seen David speak. James reminded me of Are you an anarchist? The answer may surprise you. It made me laugh (and thump the table a bit) again.
https://chrislowis.co.uk/weeknotes/2020/09/06/weeknotes
Weeknotes 3
Show full content
  • We spent this week in Dorset on holiday.
  • I rented a car from Sixt (who are great) at St. Pancras station. We don’t own a car, but the hassle of collecting it, fitting two car seats, and loading in all the luggage before leaving made me slightly reconsider this position. Everything takes a lot longer with two children.
  • We visited three beaches during the week: Charmouth, Lyme Regis and Hive beach at Burton Bradstock.
  • All three were great, but I think I enjoyed Hive the best. It is a National Trust property and feels unspoilt, but it also has a great cafe serving really tasty (if expensive) seafood. I enjoyed a brief swim in the sea on each visit, and N- really enjoyed chasing the waves and making sand castles.
  • We were at Hive the day before a large section of the cliffs collapsed.
  • The last time I visited this stretch of coastline was when I walked a stretch of the South West Coast path with some friends. It’s one of my favourite places.

Hive beach

  • We visited my eldest cousin Jen and her family on Sunday. It’s been far too long since I last saw her and her youngest daughter (who was just a baby when we last met) is now 8. We took her to Lyme Regis with us on Wednesday.
  • F- will be 5 months old in a couple of days. He still needs a lot of help settling to sleep, and spends a good part of every night nursing for comfort. This is exhausting for A-. At home we have an esoteric set of rituals to try and get the kids settled and maximise the amount of sleep we each get, but these are hard to keep up in unfamiliar surroundings. On the one hand I’m looking forward to this phase being over, but on the other, aw! babies.
  • We’ve got to move into yet another flat this week. Out bathroom sprang a leak during lockdown and fixing it caused so much damage that we’ve decided to get it completely refurbished. But that’s another exciting domestic story for another weeknotes. Until then, then.
https://chrislowis.co.uk/weeknotes/2020/08/30/weeknotes
Weeknotes 2
Show full content
  • Back in London this week. I’d hoped to visit a museum or two, but as it’s the first week they’ve reopened and they all require pre-booking it’s been hard to get a slot. Realistically I wasn’t very comfortable with the idea of travelling to Kensington from where we live in Camden, so we’ll leave it for a few weeks.
  • I would like to see Electronic: From Kraftwerk to the Chemical Brothers at the Design Museum.
  • We have membership at London Zoo so I took N- there instead. It’s been ages since just the two of us went. We’ve been reading The Ugly Five so had fun seeing the Warthog and talking about which animals are the ugliest.
  • N- suddenly seemed to work out how to use his scooter this week which made me very proud and somewhat terrified at the same time.
  • I’ve been listening to a lot of new music this year, mostly discovered by browsing around Bandcamp and subscribing to the pitchfork reviews RSS feed. The album. Out of the Valley by n-So is an album I keep playing.
  • I spent a little bit of time on my rust side-project. I wrote some code to allow me to trigger sounds immediately without sequencing them. What I’m finding interesting about this project is that it’s no longer really a programming problem it’s more of a UI challenge. I implement some features and then try and use it to make music. This always gives me a long list of new features to add or different ways to organise the interface.
  • We’ve decided to give up our office in Waterloo. This makes me sad. Not because I particularly miss the commute, or that it was a particularly pleasant physical space, rathe it’s made me think about what we’ve lost. I don’t know when I’ll next be able to sit and work in the same room as my colleagues and enjoy their company.
https://chrislowis.co.uk/weeknotes/2020/08/23/weeknotes
Weeknotes 1
Show full content
  • We’ve spent the week with my parents. N- is really enjoying playing in their garden and having more people to play with. During lockdown he said to me “Daddy, I want more people”. I could relate to that.
  • My parents’ garden is a joy. It’s not large but over the years they’ve developed it into separate zones (I’m not sure this is the right gardening term) and it feels much larger. I think there’s two things N- enjoys about it. Firstly it has a path looping around that he can run laps of. Secondly every time he looks at part of it, things have changed. The cats are in a different place, the fish in the pond have appeared, or there’s a new type of insect on a flower.
  • F- was born during the first week of lockdown. It’s really good to have some extra pairs of hands to help with things and the chance to take the odd break.
  • Unrelated bullet: Sit and Sip in Wokingham has a good selection of beers from local brewery Siren.
  • I’ve been working on a staked chair from Chris Schwarz’s The Anarchist’s Design Book on and off for about a year. I’d managed to make the seat and legs, and roughed out the spindles. I’d failed a couple of times to steam bend the crest rail, and when F- arrived I had to stop working on it. With Dad’s help and access to his lathe this week we turned the tenons on each end of the spindles and finished a band-sawed crest rail. Given that we’ve been sitting on it for a couple of days, I’m going to call it a chair. It’s made from London Plane sourced by Bruce Saunders from a park in Euston.

A chair I made

  • I have the material to make another and hopefully I’ll be able to get back to Blackhorse Workshop before too long.
  • I stripped out some stuff from this site including Google analytics (which I never looked at) and Disqus (which annoys me everywhere else I find it). I’m hoping to indiewebify things a bit more following m’comrade James’s example. I’m writing this post in iA Writer on my Android phone, having checked out the source using termux. This works ok, but I’d be interested to hear about alternative, carrying-a-sleeping-child-in-a-sling-friendly ways of working.
https://chrislowis.co.uk/weeknotes/2020/08/16/weeknotes
Refactoring with Emacs
Show full content

We’ve been busy refactoring the Manuals Publisher application that’s used by the UK government to publish things like The Highway Code. It’s quite an old Rails application who’s responsibilities have changed a lot since it was first written. To make it easier for people to work on we are pulling out some of the old code, reducing indirection, and renaming classes to better map to the terminology used in the domain.

I use Emacs for most of my day-to-day development, and thought I’d share a few tips I’ve picked up in the last few weeks. Most of these are quite general but a few are specific to working with Ruby and Rails applications.

Ack in project

I use projectile so that Emacs knows that the files under a checked out directory all belong to the same project. Projectile searches up the directory tree until it finds a .git or .projectile file and then considers all code under that directory to be part of the same project.

I can then run M-x projectile-ag to search the project for a string. This is very useful for finding all the references to a class before renaming, for example. I have projectile-ag bound to C-c p a.

Tag files

Emacs has great support for TAGS files. A TAGS file contains references to class and method definitions spread throughout the code which are derived by statically analysing the source. I generate a TAGS file by running

ripper-tags -Re -f TAGS

which uses the ripper-tags gem. ripper-tags uses Ripper the ruby source code parser from the Ruby standard library, so it understands the current syntax of the language.

With a TAGS file in place at the root of a project M-. jumps to the definition of whatever is under my cursor.

Global search and replace in a project

Performing global renaming refactors in a dynamic language like Ruby can be quite difficult. I’ve picked up a couple of tricks that can help. The first uses M-x projectile-replace-regexp which allows search and replace across the whole project, with support for Emacs regular expressions.

Finding references to code by running tests

As Ruby is a very dynamic language, sometimes a simple search and replace will miss references to something that has been renamed - for example when the call site generates the method name at run time. With a fairly comprehensive test suite, I can catch some of these references by making a rename, running the tests using rspec-mode and jumping directly to the source code where the method lookup fails.

Keeping commits small with Magit

When several developers are all refactoring an app at the same time, merging changes can be difficult. As James keeps reminding me, this is made much easier if we keep our commits as small and atomic as possible.

Magit, the git UI for Emacs, has a couple of features that help. The first is an interface on top of git commit -p which makes it easy to stage individual lines of a change.

The second is magit-instant-fixup which commits a change and then instantly performs a rebase to fixup the commit into a previous one. I really like this feature - choosing the commit to fixup into from the log is much easier than copying the SHA on the command line.

Diff ranges in Magit

Magit also provides a convenient way to diff an arbitrary range of commits directly from the log. Select the range and hit d r.

Git time machine

Sometimes in order to understand how to make a refactoring it is useful to see how the code got to the place it is in. git-timemachine lets you quickly flick back through the history of a file.

Renaming files in Dired

Rails has an autoloading mechanism which makes sure files are added to the LOAD_PATH and required. This relies on a concordance between the name of the class and the filename. Dired makes renaming multiple files easy. In a Dired view of a directory, M-x wdired-change-to-wdired-mode (bound to C-x C-q makes the view writable. Files can be renamed and then “committed” using C-c C-c.

ruby-refactor

I should also mention ruby-refactor a minor mode that makes certain simple refactorings easier. Selecting a block of code and calling M-x ruby-refactor-extract-to-method is used to create new methods, for example.

I did add (setq ruby-refactor-add-parens t) to my Emacs configuration to ensure that parentheses were always added to method signatures. I have only just started playing with this mode, and haven’t trained my fingers to remember to use it yet.

https://chrislowis.co.uk/2017/03/24/refactoring-with-emacs
Web Audio Weekly has moved
Show full content

I’ve created a new home for Web Audio Weekly www.webaudioweekly.com. I’ve set up some permanent redirects for the issues that used to live here on my blog, however the existing RSS feed intermingles my “regular” blog posts and WAW issues. If you want to continue reading Web Audio Weekly using RSS please use the new RSS feed.

I’ll still be posting the occasional Web Audio tutorial or blog post here on my blog, along with other topics.

https://chrislowis.co.uk/2016/12/05/web-audio-weekly-has-moved
Notes for my talk 'A brief history of synthesis with the Web Audio API'
Show full content
A brief history of synthesis with the Web Audio API

At ScotlandJS in May this year, I gave a talk about the history of sound synthesis with examples built using the Web Audio API.

A huge thanks to Pete and the entire ScotlandJS team for hosting a fantastic conference in a beautiful city, and for being such great hosts. The video of my talk is below, and I’ve linked to the code samples and slides too.

https://chrislowis.co.uk/2015/06/26/a-brief-history-of-synthesis
Notes for my talk 'The Origins Of Computer Music'
Show full content
The Origins Of Computer Music

At the 1st Web Audio Conference held at IRCAM in Paris in January 2015, I gave a talk on the Origins of Computer Music.

Here are some notes to accompany that talk.

MUSIC implementation in JavaScript

With the help of Tom Stuart, I developed a compiler for a subset of the MUSIC V language described by Max Mathews in his 1969 book “The Technology of Computer Music” (MIT Press). This compiler barely does enough to generate the first score in the tutorial given by Mathews in his book but it is flexible enough to be extended to do more if I, or any of you reading this, have the time and inclination to do so. We wrote a parser for the language using peg.js and it should be straightforward to extend that to support the missing unit generators. The implementation of the unit generators themselves is described in the book.

Further Reading

In writing the talk I found the following resources very useful:

Thank you

David, James, Sam, Seb and Tom provided fantastic feedback on an early version of this talk. I’m also very grateful to Samuel for inviting me to talk at IRCAM, an institution I’ve wanted to visit since I first started learning about electronic music as a teenager.

https://chrislowis.co.uk/2015/01/26/origins-of-computer-music
Creating dub delay effects with the Web Audio API
Show full content
Introduction
King Tubby sat at a mixing desk [credit]

Dub music is a sub-genre of reggae. Typical of the style is the remixing of reggae records, first stripping them down to the bass and drums and then applying swirling, psychedelic delay effects to what’s left. In this post we’ll take a look at the classic dub delay sound, and try to recreate some of its character using the web audio API.

You'll need a browser that supports the Web Audio API to play the embedded demos. Chrome 36 and above work well, but these demos rely on cycles in the Web Audio graph which Firefox 31 has some problems with. The chop

Dub delay can be applied to any element of a song, but often it’s applied to the “chop” - an off beat, minor-chord stab played on a keyboard or guitar. Here’s a chop

We’ve implemented it using a straight-forward HTML5 audio element wrapping an OGG-encoded file with the controls and looping enabled


<audio src="/demos/dub_delay/chop.ogg" controls="true" loop="true" />

Delay

The basis of the dub delay sound is, of course, the delay. You can think of a delay effect as simply taking the incoming sound and holding on to it for a pre-determined length of time, before letting it go again. Here’s how we create a delay using the Web Audio API


(function () {
  var ctx = new AudioContext();
  var audioElement = $('#delay audio')[0];

  audioElement.addEventListener('play', function() {
	var source = ctx.createMediaElementSource(audioElement);

	var delay = ctx.createDelay();
	delay.delayTime.value = 0.5;

	source.connect(delay);
	source.connect(ctx.destination);
	delay.connect(ctx.destination);
  });
})();

First we create an AudioContext to hold the nodes in our processing graph. The first node in our graph is the MediaElementSource node, which allows routes the audio from a HTML5 audio element into the graph. We have to wait for the play event to fire to be sure that the audio has loaded and has been decoded ready to hand off to the audio context.

We then create a Delay node, with a delay time of 0.5 seconds. Finally we connect the delay to the destination. Note here that we’ve also connected the source itself to the destination, if we don’t do that, we’ll just here the delayed version of the chop, and not the original - this way, we hear both:

Feedback

The delay on its own is a good start, but somehow it sounds a little too sterile. We need to add some feedback to start getting the swirling, psychedelic sounds of dub. To recreate this sound, we have to understand a little bit about how dub producers created it.

In an analogue studio, each mixing desk channel typically has an “auxiliary send” which allows some of the channel’s audio to be routed to an external effects unit, for example a analogue tape delay. If the return from that unit is sent back to another channel of the mixing desk - that channel too has an auxiliary send. By increasing the send on the return channel, the delayed sound can be routed through the delay unit again, and again, and again… creating what is known as feedback. Here’s how we do that in code


(function() {
  var ctx = new AudioContext();
  var audioElement = $('#feedback audio')[0];

  audioElement.addEventListener('play', function(){
	var source = ctx.createMediaElementSource(audioElement);

	var delay = ctx.createDelay();
	delay.delayTime.value = 0.5;

	var feedback = ctx.createGain();
	feedback.gain.value = 0.8;

	delay.connect(feedback);
	feedback.connect(delay);

	source.connect(delay);
	source.connect(ctx.destination);
	delay.connect(ctx.destination);
  });
})();

This is very similar to the code we saw above, but we’ve introduced a Gain node between the output of the delay node and the input of the delay node. Connecting the delay node to itself is enough to create the feedback loop, but without the gain node we’d be feeding 100% of the delayed sound back into the delay - creating a delay that grows forever. Introducing the gain node allows us to control this. Here’s how it sounds

Notice as the audio element itself loops, the tail of the feedback keeps playing - the original source and the feedback combine in interesting rhythmic ways depending on the amount of feedback and the length of the delay. This is a characteristic sound of dub.

Degradation in the audio chain

When working with the Web Audio API we are manipulating digital signals. Each echo in our feedback chain is a perfect copy of the original, just slightly quieter. It’s as close to “perfect” as we can get. Dub producers work with much less perfect equipment - analogue mixing desks and analogue-tape based delay units. Each time the signal passes through that processing chain it loses some fidelity - and this contributes to the sound of the dub delay. Creating a clone of this sound using digital signals is something of a holy grail, but to start you on that journey, lets introduce something to “dirty” up the feedback.


(function () {
  var ctx = new AudioContext();
  var audioElement = $('#filter audio')[0];

  audioElement.addEventListener('play', function(){
	var source = ctx.createMediaElementSource(audioElement);

	var delay = ctx.createDelay();
	delay.delayTime.value = 0.5;

	var feedback = ctx.createGain();
	feedback.gain.value = 0.8;

	var filter = ctx.createBiquadFilter();
	filter.frequency.value = 1000;

	delay.connect(feedback);
	feedback.connect(filter);
	filter.connect(delay);

	source.connect(delay);
	source.connect(ctx.destination);
	delay.connect(ctx.destination);
  });
})();

Here, we’ve introduced a BiquadFilter node. By default, this is a low-pass filter, which filters out frequencies above the frequency parameter. This is a simple way of adding some interest and it mimics the way an analogue signal chain would have a bigger effect on higher frequencies than lower ones.

As each echo decays away it also loses some of its high frequency content.

Putting it all together with knobs on!

Of course, most of the creative uses of dub delay don’t involve just the static application of the effect to the incoming sound. Instead the producer plays the equipment like an instrument, allowing the feedback to rise and dominate, stopping the original source to just play the echos, and adjusting the delay time and other filters in creative ways. Let’s try hooking up some simple sliders to some of the parameters of our dub delay effect.


(function () {
  var ctx = new AudioContext();
  audioElement = $('#sliders audio')[0]

  audioElement.addEventListener('play', function(){
	source = ctx.createMediaElementSource(audioElement);

	delay = ctx.createDelay();
	delay.delayTime.value = 0.5;

	feedback = ctx.createGain();
	feedback.gain.value = 0.8;

	filter = ctx.createBiquadFilter();
	filter.frequency.value = 1000;

	delay.connect(feedback);
	feedback.connect(filter);
	filter.connect(delay);

	source.connect(delay);
	source.connect(ctx.destination);
	delay.connect(ctx.destination);
  });

  var controls = $("div#sliders");

  controls.find("input[name='delayTime']").on('input', function() {
	delay.delayTime.value = $(this).val();
  });

  controls.find("input[name='feedback']").on('input', function() {
	feedback.gain.value = $(this).val();
  });

  controls.find("input[name='frequency']").on('input', function() {
	filter.frequency.value = $(this).val();
  });
})();

Now, try adjusting the values of the parameters and experiment with how they sound together. Starting and stopping the audio element is also possible, since the effects are happening “inside” the audio context.

delayTime: feedback: cutoff freq: Summary

We’ve used the Web Audio API to create a simple recreation of some classic dub delay sounds. Where next?

  • You might have noticed a small artifact when adjusting the delay time. The specification states “When the delay time is changed, the implementation must make the transition smoothly, without introducing noticeable clicks or glitches to the audio stream”. When a change is made to the delay time parameter, the implementations make a smooth transition to the new value (called “dezippering”). In this case the more rapid change in time creates an artifact, which an analogue tape recorder wouldn’t have due to the mechanical constraints of the device on the speed of the change. You can experiment with using .setValueAtTime(value, 0) to remove the dezippering effect.
  • Ping-pong delay is an effect where each echo is sent alternately to the left and right channels. You sometimes here this effect in use, and it is possible to implement it using an extra delay node together with the channel splitter and channel merger nodes.
References Thanks

It took me a long time to write this post, as I hit some pretty odd bugs along the way. A huge thanks to Tom, Chris and James for providing advice, space and for putting up with my noise.

Also thanks to Chris Wilson for pointing out the issue with artifacts/dezippering.

https://chrislowis.co.uk/2014/07/23/dub-delay-web-audio-api
Interview with Adrian Holovaty of Soundslice
Show full content

I recently spoke to Adrian Holovaty the founder of Soundslice, an interactive sheet music application, about how it was built and his experiences of using the Web Audio API for commercial development.

Could you tell me a bit about Soundslice, what the company does and what applications you’ve built?

Soundslice is a web site that helps musicians learn songs. Our ultimate goal is to be the easiest and highest-quality way to learn whatever song you’d like, on whatever instrument.

As part of this, we’ve built a web-based sheet-music and tablature player that makes it easy to explore a piece of music. It syncs the music notation with real recordings, so that you can hear how the music is supposed to sound as notes are highlighted, and it lets you loop, slow down and navigate the audio via the notation.

On the business side, we sell high-quality music transcriptions in this format, and we license our technology to other companies. I believe we’re one of the first companies to build production-quality sites - stuff that people actually pay money for! - using the Web Audio API.

Aside from the Web Audio API, we’re doing some quite advanced stuff with HTML5’s <canvas> , rendering music notation and tablature in an efficient, cross-platform way.

How have you used Web Audio in the application?

We use the API in two ways: “real” audio playback and “synthetic” playback. In the Soundslice interface, you can toggle the audio source to be either a real recording (an MP3) or a synthetic version (generated from the notation, MIDI-style).

For the real recordings, we use the Web Audio API to play and loop it with precise timing. We also use it to slow down the audio without changing pitch, using ScriptProcessorNodes.

For the synthetic audio, we use the Web Audio API to splice together instrument samples in real time, based on whatever notes are in the sheet music. For this, I use a single audio file that has every possible note in it – the same concept as CSS image sprites.

Fun fact: our “real” audio player actually has three audio backends, which are chosen based on the browser’s capabilities – Web Audio API, HTML5 <audio> and a Flash fallback. Obviously we prefer Web Audio API, but as anybody in this space knows, consistent audio performance across browsers still requires a lot of hoop-jumping.

What has been good about using the API, what’s been bad?

The best part about it is the precision and control. Looping can have perfect or near-perfect timing, you can easily play multiple audio sources at once, and you can use ScriptProcessorNodes to futz with the content of the audio.

The bad things: lack of support in all browsers (not really the API’s fault), and, to some extent, performance when doing crazy things in ScriptProcessorNodes (again, not really the API’s fault). Plus there are a few small bugs I’ve needed to hack around.

Oh, and I’d love for there to be a built-in way to adjust playback speed without changing pitch – the earlier <audio> tag API has that, so I don’t see why Web Audio API shouldn’t. It would make my job a lot easier, and Soundslice would perform better on slower machines if the slowdown algorithms were implemented directly in the browser.

How does developing with Web Audio compare to developing for other platforms or technologies?

I can only compare it to the HTML5 <audio> tag API and Flash/Actionscript. Overall, the Web Audio API is the nicest of the three. The HTML5 API starts to feel very hacky when you have multiple sounds playing at the same time, though its “playbackRate” API is convenient. I don’t remember liking the Actionscript APIs very much when I was using them a few years ago for an earlier version of Soundslice.

If you could make changes to the API or to audio in the browser in general, what would you do?

Number one priority would be to add a built-in way of changing speed without altering pitch, just as the HTML5 <audio> API already has.

Number two priority would be to add a callback/event when a piece of audio has stopped playing. Currently you have to use setTimeout!

Number three priority would be to fix playback bugs like the one I mentioned above.

And of course, magically upgrading every browser in the world to one that has a stable implementation of the API would be lovely.

https://chrislowis.co.uk/2014/05/30/interview-adrian-holovaty-soundslice
Writing tests for the Web Audio API
Show full content
Introduction

In this post I want to give a brief overview of how you can help the adoption of the Web Audio API by writing tests for the W3C’s official test suite. Writing tests helps the adoption of the API in three ways

  1. It makes it easier for a wider range of browser vendors to support the API
  2. It makes it easier for an individual vendor to implement the standard correctly
  3. It makes it easier for new additions to the specification to be included and approved

The test suite is still very incomplete, and there’s a lot of room for improvement of the testing process as well as increasing the test coverage. But, if you know a little JavaScript, it’s easy to help, so let’s get started!

Getting started

The W3C’s test suite for the “web platform” (the suite of technologies, Web Audio included, that make up the modern web) is on GitHub. So go ahead and clone it

git clone https://github.com/w3c/web-platform-tests

Or, if you think you might contribute, you may find it easier to fork the repository into your own GitHub account, and clone your fork.

The repository requires git submodules, which you can update within your checkout

git submodule update --init --recursive

The repo has the latest instructions for getting started.

Running a Web Audio test locally

You need to arrange for the contents of the repository to be served up by a local webserver. There’s some instructions for doing that using the included serve.py python script and some simple edits to your /etc/hosts file - or you may have your own preferred way. Once you have the server up and running, try and run the test for the Web Audio API GainNode, on my machine it was at http://web-platform.test:55521/webaudio/the-audio-api/the-gainnode-interface/test.html.

The test suite is also mirrored to w3c-test.org, including the GainNode test and the rest of the web audio tests.

Understanding the Web Audio API tests

The Web Audio API test suite is very minimal at the moment, but that’s where you can help.

The Web Audio API is under development, so that latest version of the editor’s draft of the specification is what we should be writing our tests against. Go and take a look at the specification if you’re not familiar with it.

Notice that the specification is grouped into sections, (for example §4.7 The GainNode interface). The directory structure of the tests repo reflects this structure, so we have /webaudio/the-audio-api/the-gainnode-interface.

Tests come in two different flavours:

  • Functional tests. These tests assert that the audio processing performed by a certain node does the right thing. For example, we might assert that the output of an OscillatorNode when the OscillatorType is sine actually produces a sine wave at the correct frequency.
  • IDL tests. These tests assert that the interface presented to the programmer conforms to that written in the specification, so, for example that, AudioContext has a method createOscillator.

We’ll look at both of these types of tests in turn.

Writing functional tests

Functional tests assert that a audio processing node performs its processing correctly. The process for writing a test is as follows:

  1. Find an area of the specification that doesn’t have tests.
  2. Read the specification and see if it could be tested as written. If you feel a test cannot be written against the current version of the spec, for example if there’s not enough information in the spec to determine precisely what the output should be, that’s great! You can help to improve the spec.
  3. Write the test

Let’s look at step 3 in more detail. Tests are written using the W3C’s testharness.js framework. Take a look at that documentation to familiarise yourself.

Don’t reinvent the wheel. If you’re considering writing a functional test for a node, both the Mozilla and Webkit source code already have a number of tests that you can port over, or use for inspiration:

As an example, consider the GainNode test in the W3C test suite. You’ll find it at /webaudio/the-audio-api/the-gainnode-interface/test.html, or here on w3c-test.org.

This test works as follows:

  1. Create an AudioBuffer with a series of sine wave ‘notes’ of gradually decreasing amplitude. This is the expected output.
  2. Recreate this using a GainNode with gradually decreasing gain value.
  3. Record the output of the audio graph created in 2. in an offlineAudioContext.
  4. Assert that recorded output matches the expected output.

This test was based on the corresponding test of the GainNode in the Webkit test suite, but uses a generated buffer rather than a WAVE file as the expected output. The reason for this is to allow the tests to run faster than real time. If we were to create a node graph in a regular AudioContext, and then capture the output in a buffer using a scriptProcessorNode, for example, the test would take at least as long to run as the audio generated. Using an offlineAudioContext allows the implementation to generate the output as fast as it can.

In some cases it will be impossible to use offlineAudioContext, such as when writing tests for the various streaming sources.

Writing IDL tests

The IDL tests generate automated tests from the Web IDL descriptions of the interfaces of each of the functions provided by the Web Audio API, and used in the specification.

In the W3C test suite we have a Ruby script (at /webaudio/refresh_idl.rb) which extracts the IDL descriptions from the specification, and updates the corresponding tests. It’s still quite a manual process at the moment, and I would appreciate any improvements you can suggest.

Contributing your test

The W3C test suite accepts contributions in the form of GitHub pull requests. Each pull request has to be reviewed by a peer. At the moment, I am the test coordinator for the Web Audio tests, so it is likely to be me that does the review and merge, but anyone who would like to help will be very welcome.

If you need any help, please get in touch with me in the comments below, on the public audio mailing list or by raising an issue with the webaudio label in GitHub.

Improve the specification

When starting to write a test for a part of the specification you may encounter a situation where there’s not enough information in the spec to determine precisely what the output should be. In these cases you can help to improve the specification:

  • Open an issue against the spec at the specification’s GitHub repo. Include the test case you have written so far, if you can - it’s easier to discuss concrete problems that are illustrated by code
  • You may need to ask the editors and other members on the W3C’s public audio mailing list for help. They really appreciate these questions as they do help to clarify complicated areas of the specification.
https://chrislowis.co.uk/2014/04/30/testing-web-audio
Synthesis with the Web Audio API - Envelopes
Show full content

When we looked at monophonic synthesis in an earlier post on this blog the notes we played were produced by simply turning a Sine wave on and off using a Voltage Controlled Amplifier (VCA). In this post, we’ll look at how to make this sound a little bit more interesting by varying the amplitude of the oscillator over time by applying what is known as an “envelope” to the VCA.

In the earlier monophonic synthesis example we directly modified the parameters of the nodes in the AudioContext graph based on key presses. As the number of nodes and the complexity of the synthesis increases though, the code can start to get unwieldy. Instead let’s start by introducing some reusable objects that can be combined together.

VCO

We start with a function that can be used to create Oscillators.

var VCO = (function(context) {
  function VCO(){
    this.oscillator = context.createOscillator();
    this.oscillator.type = 'sawtooth';
    this.setFrequency(440);
    this.oscillator.start(0);

    this.input = this.oscillator;
    this.output = this.oscillator;

    var that = this;
    $(document).bind('frequency', function (_, frequency) {
      that.setFrequency(frequency);
    });
  };

  VCO.prototype.setFrequency = function(frequency) {
    this.oscillator.frequency.setValueAtTime(frequency, context.currentTime);
  };

  VCO.prototype.connect = function(node) {
    if (node.hasOwnProperty('input')) {
      this.output.connect(node.input);
    } else {
      this.output.connect(node);
    };
  }

  return VCO;
})(context);

The Web Audio API calls in this function should look familiar. We create an sawtooth OscillatorNode, and tell it to start immediately. However the VCO object created by this class also does two new things. In the lines

...
    this.input = this.oscillator;
    this.output = this.oscillator;
...
  VCO.prototype.connect = function(node) {
    if (node.hasOwnProperty('input')) {
      this.output.connect(node.input);
    } else {
      this.output.connect(node);
    };
  }

we’re specifying what the ‘input’ and ‘output’ nodes are for our object, and defining a connect method that can behave in the same way as ‘native’ Web Audio nodes. In this way, our custom VCO can be a composition of a number of Web Audio Nodes but we’re still able to write code such as

var myOscillator = new VCO;
var gainNode = context.createGain();

myOscillator.connect(gainNode);

We’ll use this pattern again in the future.

The second new pattern in this function is the use of events to set parameters

...
    var that = this;
    $(document).bind('frequency', function (_, frequency) {
      that.setFrequency(frequency);
    });
...

This provides a simple way of triggering multiple oscillator notes from a single keypress, for example.

Envelopes

An Envelope Generator on an analogue synth will generate a voltage that smoothly varies over time. The variation begins when the generator receives a trigger (usually from pressing a key on the keyboard), and the smoothly varying voltage that is created can then be connect to, for example a Voltage Controlled Amplifier, to vary the amplitude of an oscillator with each key press. By doing this, we can turn the monotonous on-off sound of an oscillator into something that sounds a little bit more like the percussive ‘twang’ of a guitar string, for example.

As the Envelope Generator simply generates a varying voltage, we can in fact use this voltage to control any part of our synth - for example, the frequency of an oscillator, or the cutoff frequency of a filter. Most commercial analogue synthesisers allowed envelopes to be used in this way, and the more expressive the synth the more options it had.

Luckily, in the Web Audio API almost every parameter of every Node implements the AudioParam interface, which allows it to be varied in limitless ways.

To begin with though, let’s consider a vary simple envelope generator, one that generates an Attack-Release (AR) envelope. Here’s a sketch of the voltage generated by this generator as a function of time

When the generator receives a trigger, the voltage starts at zero, rises linearly to a maximum in TA seconds, then immediately falls to zero in TD seconds. The first portion of the curve is called the “attack”, the second part, the “release”.

The code for our Envelope Generator looks like this

var EnvelopeGenerator = (function(context) {
  function EnvelopeGenerator() {
    this.attackTime = 0.1;
    this.releaseTime = 0.1;

    var that = this;
    $(document).bind('gateOn', function (_) {
      that.trigger();
    });
    $(document).bind('setAttack', function (_, value) {
      that.attackTime = value;
    });
    $(document).bind('setRelease', function (_, value) {
      that.releaseTime = value;
    });
  };

  EnvelopeGenerator.prototype.trigger = function() {
    now = context.currentTime;
    this.param.cancelScheduledValues(now);
    this.param.setValueAtTime(0, now);
    this.param.linearRampToValueAtTime(1, now + this.attackTime);
    this.param.linearRampToValueAtTime(0, now + this.attackTime + this.releaseTime);
  };

  EnvelopeGenerator.prototype.connect = function(param) {
    this.param = param;
  };

  return EnvelopeGenerator;
})(context);

We have seen the event binding code before. The interesting part here is the trigger method. Taking it line by line, we first establish the current time

now = context.currentTime;

In the Web Audio API, the context has it’s own timer, and a clock which advances from the point the context is created. This clock is vital for accurate timing of audio events, and for maintaining the stability of those audio events even when, for example, there is a lot of other activity in the browser window.

Any parameter, such as gainNode.gain, that implements the AudioParam interface can have its value scheduled at a point in the future with reference to the currentTime of the context. In case we have already scheduled some changes to the value of the parameter we have connected to the EnvelopeGenerator we first cancel those scheduled events when we receive a new trigger

this.param.cancelScheduledValues(now);

Our AR envelope starts at zero, so we first schedule the value of the parameter to zero immediately

this.param.setValueAtTime(0, now);

The attack portion of our AR envelope is a linear increase to the maximum value (1, in this case). The linearRampToValueAtTime method handles the smooth transition for us, we just need to specify the value to ramp to, and the amount of time the ramp portion should last

this.param.linearRampToValueAtTime(1, now + this.attackTime);

And finally, we call the same method again to ramp the value to zero at the end of the envelope. Remember, we’re scheduling all of these changes for the future, so we need to specify the time at which the parameter should be ramped to zero, which is the sum of the attack time and the release time.

this.param.linearRampToValueAtTime(0, now + this.attackTime + this.releaseTime);

The linearRampToValueAtTime method is only one of several methods which can be used to create a variety of envelope shapes. Take a look at the spec for details.

Putting it all together

To add this envelope to our monophonic synth, we need to re-write the VCA to expose the gain parameter of the gainNode through an interface and then connect this up to the envelope. The VCA code looks like

var VCA = (function(context) {
  function VCA() {
    this.gain = context.createGain();
    this.gain.gain.value = 0;
    this.input = this.gain;
    this.output = this.gain;
    this.amplitude = this.gain.gain;
  };

  VCA.prototype.connect = function(node) {
    if (node.hasOwnProperty('input')) {
      this.output.connect(node.input);
    } else {
      this.output.connect(node);
    };
  }

  return VCA;
})(context);

And the connections between our objects is quite simple

var vco = new VCO;
var vca = new VCA;
var envelope = new EnvelopeGenerator;

vco.connect(vca);
envelope.connect(vca.amplitude);
vca.connect(context.destination);

Try out this simple monosynth with an AR envelope. I’ve used the jQuery Knob library to allow the attack and release of the envelope to be set. Take a look at the code of the demo to see how that’s done.

There are many more sophisticated envelope types that were commonly used on classic analogue synths, and many ways in which envelopes could be used to creatively modify sounds. We’ll look at this and more in future posts. Subscribe to the RSS feed or follow me on Twitter to find out when I’ve written some more!

References
https://chrislowis.co.uk/2013/06/17/synthesis-web-audio-api-envelopes
Playing notes with the Web Audio API Part 2 - Polyphonic Synthesis
Show full content

In my last post, I talked about playing notes with the Web Audio API using techniques inspired by monophonic synthesizers, such as the Minimoog. The advantage of this approach was in its simplicity and that by using a single oscillator as our source of sound we could easily slide between notes when playing.

The principle disadvantage was, of course, that with a single oscillator as our source of sound we could only play one note at a time. Fine for throaty, analogue sounding synth lines, or a flute simulator perhaps, but not so useful for creating lush string pads or simulating a piano or Hammond organ.

What is polyphony?

Simply put, polyphony is the simultaneous playing of independent melodies. A string quartet for example has 4 instruments playing at the same time. In synthesis, polyphony describes the ability of a single instrument to play multiple notes simultaneously, allowing you to play a chord or an arpeggio with overlapping notes.

A polyphonic synthesizer

Early synthesizer pioneers were incredibly creative at getting around the limitations and reliability of analogue circuits to produce a range of polyphonic, and nearly polyphonic synths. This great ‘Synth Secrets’ article on polyphony from Sound on Sound magazine gives a lot of historical detail of the development of various approaches. For our purposes though, let’s consider the synthesizers of Oberheim.

This is an Oberheim SEM monosynth module.

The control panel looks very much like the simple “monosynth” we talked about last time - an Oscillator (VCO) or two with something to control the amplitude, marked here ENV, for envelope, but also known as a VCA (Voltage Controlled Amplifier).

If you bought one of these modules and connected it to a standalone keyboard, you had a monosynth. But what if you could attach a module to each individual key on the keyboard? Then you’d be able to play multiple notes simultaneously: polyphony!

In practice, at the time, a synthesizer with so many modules would have been very expensive and unreliable. What Oberheim chose to do instead was to build synthesizers with a smaller number of these modules, and then use a bit of clever circuitry called a Voice Allocation Unit to allocate a key press to one of the individual modules - whichever one was “free” at the time. The Oberheim 2-Voice had two SEM modules, the 4-Voice four and the 8-Voice, well, you get the idea.

Polyphony with the Web Audio API

Nowadays with digital technology and the Web Audio API in particular, we are not limited to a fixed number of voices for cost or reliability reasons. Oscillators and Amplifiers are cheap to create, so we can in effect create a new Voice each time a key is pressed. We’ll use that example to convert our synth from the previous article into a polyphonic one.

To begin with let’s take the VCO and VCA from the previous article and wrap them in a “class” called Voice

  var Voice = (function(context) {
    function Voice(frequency){
      this.frequency = frequency;
    };

    Voice.prototype.start = function() {
      /* VCO */
      var vco = context.createOscillator();
      vco.type = vco.SINE;
      vco.frequency.value = this.frequency;

      /* VCA */
      var vca = context.createGain();
      vca.gain.value = 0.3;

      /* connections */
      vco.connect(vca);
      vca.connect(context.destination);

      vco.start(0);
    };

    return Voice;
  })(context);

This class takes a frequency parameter in its constructor and when the “start” method is called, constructs the =OscillatorNode= and GainNode from the monosynth example and connects them to the destination. If we modify the keyDown function to create a new Voice on each keypress, we have basic polyphony.

keyboard.keyDown(function (_, frequency) {
  var voice = new Voice(frequency);
  voice.start()
});

If you try this example you’ll notice straight away that we can now play multiple simultaneous notes on the keyboard. Now we just need to be able to stop them! This isn’t quite as straightforward as before as we don’t have a single VCA we can set to zero. Just as with the Oberheim SEM modules that are our inspiration, for each note we now have to control the parameters for that individual Voice.

We start by adding a stop method to Voice. This simply needs to stop() all of the active oscillators for this Voice. To achieve this, we need to keep track of the oscillators we add to the graph

var Voice = (function(context) {
  function Voice(frequency){
    this.frequency = frequency;
    this.oscillators = [];
  };

  Voice.prototype.start = function() {
    /* ... */

    vco.start(0);

    /* Keep track of the oscillators used */
    this.oscillators.push(vco);
  };

  /* ... */

And then to stop the Voice we can call stop() on each of the oscillators

/* ... */

Voice.prototype.stop = function() {
  this.oscillators.forEach(function(oscillator, _) {
    oscillator.stop();
  });
};

/* ... */

Then, if we keep track of which Voice is associated with each key pressed, we can call stop() when the key is released. This is straightforward if we store each Voice in an object

  active_voices = {};

  keyboard.keyDown(function (note, frequency) {
    var voice = new Voice(frequency);
    active_voices[note] = voice;
    voice.start();
  });

  keyboard.keyUp(function (note, _) {
    active_voices[note].stop();
    delete active_voices[note];
  });

So there we have it, a very simple polyphonic synthesizer. You’ll notice some clicking when the keys are pressed and also some distortion when too many notes are played. I’ll address these issues, and look at how to synthesise more exciting sounds in later posts.

https://chrislowis.co.uk/2013/06/10/playing-multiple-notes-web-audio-api
Playing notes with the Web Audio API Part 1 - Monophonic Synthesis
Show full content

The Web Audio API turns your browser into a powerful synthesizer. One question I’ve been asked about the Web Audio API is how to play single, one-shot sounds using the oscillators, in other words how to play notes or tunes. I’ll show one approach in this post and along the way we’ll look at how some early analogue monophonic synths worked.

If you’re new to the Web Audio API there’s a good introduction over on HTML5 Rocks. The first couple of sections should be all you need to follow this tutorial.

Playing a sound

We start by creating some sound. This could be considered the “hello world” of Web Audio applications - we’ll generate music’s purest tone, the sine wave, and make it play.

context = new AudioContext;
oscillator = context.createOscillator();
oscillator.frequency.value = 200;

oscillator.connect(context.destination);

oscillator.start(0);

If you open a javascript console on this page and enter the code above, assuming your browser supports the Web Audio API1, you should hear a tone at 200Hz. We’ve created an AudioContext, added an oscillator and told it to start playing immediately. If you don’t set the frequency the default is 440Hz, or an A above middle C. Why 440Hz? I thought you’d never ask!

We can stop the tone with

oscillator.stop(0);

At this point, you might be tempted to start the oscillator again

oscillator.start(0);

but you’ll find, if you try, that this doesn’t work. For performance reasons the Web Audio API is designed so that oscillator, and other nodes such as AudioBufferSourceNode can only be “used” once. So if we want to play a sequence of notes, or attach notes to the keys of a virtual keyboard, how do we proceed? To answer this question, let’s consider how analogue synth designers tackled the problem.

Monophonic Synthesis

One classic monophonic synthesizer is Robert Moog’s “Minimoog”. This was a monophonic synthesizer - that is, it could only play a single note at a time. Here’s the control panel from the Minimoog:

Minimoog Control Panel

The sections we are interested in here are the “oscillator bank”2 and the “loudness contour” controls, also known as the VCO (Voltage Controlled Oscillator) and VCA (Voltage Controlled Amplifier) respectively3.

The VCO, as it’s name suggests, is an oscillator whose frequency can be set by sending a specific voltage - typically from the keyboard of the instrument. In our code above, this is equivalent to the oscillator.frequency.value =.

The VCA is an amplifier which varies its gain depending on a supplied voltage. For simplicity, let’s assume that when it receives a positive voltage it sets its gain to 1, and when it receives a negative voltage it sets its gain to zero.

When a musician presses a key on the keyboard, two things happen. Firstly a voltage is sent to the VCO to set its frequency. Secondly, the same key press sets the gain of the VCA. The oscillator is connected to the amplifier so pressing the key makes a sound. When the key is released, the VCA is set to zero and the sound stops.

Armed with this knowledge, we can simulate this using the Web Audio API.

A simple Web Audio monosynth

To recreate the simple Minimoog described above we need two nodes from the Web Audio API, connected together like so:

Monosynth block diagram

We also need a mechanism to send messages to the nodes using key-presses. We’ll use Stuart Memo’s very useful Qwerty Hancock library for this. It turns a given DOM element into an interactive vector keyboard!

A little bit of glue code, and we have

var keyboard = qwertyHancock({id: 'keyboard'});

var context = new AudioContext();

/* VCO */
var vco = context.createOscillator();
vco.type = vco.SINE;
vco.frequency.value = this.frequency;
vco.start(0);

/* VCA */
var vca = context.createGain();
vca.gain.value = 0;

/* Connections */
vco.connect(vca);
vca.connect(context.destination);

keyboard.keyDown(function (_, frequency) {
  vco.frequency.value = frequency;
  vca.gain.value = 1;
});

keyboard.keyUp(function (_, _) {
  vca.gain.value = 0;
});
$(function() { var keyboard = qwertyHancock({id: 'keyboard'}); var context = new AudioContext(); /* VCO */ var vco = context.createOscillator(); vco.type = vco.SINE; vco.frequency.value = this.frequency; vco.start(0); /* VCA */ var vca = context.createGain(); vca.gain.value = 0; /* Connections */ vco.connect(vca); vca.connect(context.destination); keyboard.keyDown(function (_, frequency) { vco.frequency.value = frequency; vca.gain.value = 1; }); keyboard.keyUp(function (_, _) { vca.gain.value = 0; }); });

When a key on our virtual keyboard is pressed, the keyDown event is fired. We set the frequency of the oscillator and turn the gain of the amplifier up to 1. When the key is lifted we set the gain to zero.

Here’s the simple synthesiser in action:

There’s a few tweaks we should make here, as I’ve deliberately kept the code very simple. For example, if you press two keys at the same time and then release one, the gain will be set to zero. This can be avoided by keeping track of the keys that are pressed using an object

var isEmpty = function(obj) {
  return Object.keys(obj).length === 0;
}

depressed_keys = {};

keyboard.keyDown(function (note, frequency) {
  vco.frequency.value = frequency;
  vca.gain.value = 1;
  depressed_keys[note] = true;
});

keyboard.keyUp(function (note, _) {
  delete depressed_keys[note];
  if (isEmpty(depressed_keys)) {
	vca.gain.value = 0;
  }
});

The completed code is in this gist.

The other thing you might hear when playing with this demo is the “slide” between each note. When setting the value of some parameters directly in the API, as we do here with frequency, the spec recommends that changes are made smoothly to avoid clicks or glitches. We’ll see how to control this effect in a future post when we look at parameter automation and envelopes.

Next

We’ve seen how to play notes using the Web Audio API using code influenced by the design of classic monophonic synthesizers. Next time we’ll have a look at techniques for playing multiple notes at the same time: polyphonic synthesis.

Footnotes

AudioContext monkeypatch on this page so that I can use AudioContext instead of the vendor-prefixed webkitAudioContext on Chrome. The code examples here match the Web Audio spec and can work in non-webkit browsers, such as Firefox, as well. If you’re trying these examples in a page that doesn’t have the patch loaded, you’ll need to replace AudioContext with webkitAudioContext.

oscillators - the Minimoog could mix together the sound of three oscillators, but only to combine them into a single “note” - they couldn’t be triggered by independent keys on the keyboard.

  1. I’m using Chris Wilson’s 

  2. If you look closely at the oscillator bank you’ll see three 

  3. We’ll come back to some of the other sections in future posts. 

https://chrislowis.co.uk/2013/06/05/playing-notes-web-audio-api
Using YouTube videos in HTML5 presentations
Show full content

I recently gave a presentation at Bacon 2013. My presentation involved demoing some features of the Web Audio API, so I built it using deck.js so that I could present using Google Chrome.

I wanted to include some YouTube videos inside <video> elements in my deck. Here’s my process for creating those videos on OS X Mountain Lion using command line tools.

Downloading YouTube videos

To download the videos there’s a simple command-line tool called youtube-dl (install with brew install youtube-dl if you’re using homebrew). To download a youtube video you just pass in the url

$ youtube-dl http://www.youtube.com/watch?v=dQw4w9WgXcQ
Converting FLV to h264 with AAC audio

The best combination of video and audio codecs I found for displaying my slide deck in Google Chrome was h264 with AAC audio. FFmpeg (install with brew install ffmpeg) handles the conversion from FLV

$ ffmpeg -i input_file.flv -c:a aac -strict -2 -b:a 128k -c:v libx264 -profile:v baseline output_file.mp4
Extracting a segment of the video

If you only want a small part of a video file you can use FFmpeg to extract a segment

$ ffmpeg -i input_file.mp4 -acodec copy -vcodec copy -ss 00:04:00 -t 00:00:20  output_file.mp4

Where the first time stamp is the start of the segment and the -t option is the duration (in HH:MM:SS format).

The output file is now suitable for use in a <video> tag.

https://chrislowis.co.uk/2013/04/19/youtube-html5-presentations
Ruby Manor 2011
Show full content

The third Ruby Manor conference happened in London a few weeks ago. I thought I'd give my reflections on the event in the old-fashioned blog post style.

Philosophy

Ruby Manor is run according to a certain philosophy. Some of it was explained upfront by James, Murray and Tom (this year's organising team), and some of it is implicit - drawn largely from the way previous Manors and the monthly LRUG meetings are run. Ruby Manor is not an unconference, it doesn't have keynote speakers, swag, dinners or t-shirts. It costs less than £15. The speakers and topics are chosen by the attendees and contribution to the process is encouraged.

Organisation

Before last year's conference, speakers proposed their talks on a mailing list. We asked questions, and the organising team selected the final list of presentations. This year, this system was enhanced and formalised as Vestibule - a simple web application designed to encourage and facilitate engagement with the organisation of the conference. The most interesting section is the short motivations given by the attendees for participating. Quite soon after the site launched a number of talks were proposed. As an example, consider the (ultimately unsuccessful) talk I proposed. I gave an outline of the talk I wanted to give and asked for feedback and suggestions. I was encouraged by the level of support and worked further to add more information to the proposal based on the feedback. About 3 weeks before the event, the proposals were open to the vote and whittled down to a final selection.

Vestibule used a points-based "karma" system to rank the participants on their level of engagement. I'm not entirely sure what impact the score had, but I believe tickets were made available in batches to those with the highest scores first. James Adam talks more about the philosophy of conference ticketing on his blog.

I found the Vestibule system quite addictive - it was something I found myself checking each day, especially as new features were rolled out as the process went along. I'd be interested to see some analysis of the level of engagement too - did it demonstrate a typical split in engagement between active and passive, or did the presence of rewards encourage increased engagement?

Venue

The venue this year was the University of Westminster building on New Cavendish street. The lecture-theatre used had a raked seating arrangement with a large projector which meant that everyone got a good view of the talks. The venue was close to a large number of places to grab lunch and coffee during the breaks. I'm not sure what the WIFI was like as I didn't take a laptop, but I don't think people had too many problems. There was very little space at the back of the room which meant that you had to be in your seats in time for the talks and were essentially captive for the duration of the sessions, but the individual talks were of equal length which made shuffling around easy.

Lunch Ruby Manor Machine Learning Lunch

I experimented with organising "Birds of a Feather" lunches this year. The idea is to have lunch with people who share a common interest, and is organised by having people sign up to lunch-time groups on the day. Although I got a good-sized group of people together for a "machine-learning" themed lunch, I don't think many other topics formed. In retrospect I think it would have been good to organise lunch "champions" in advance to lead a group around a particular topic. Also as the conference was Ruby focussed, I guess people found it easy to find others with at least Ruby as a common interest.

The Talks

The talks were universally of a very high standard. There wasn't a single one that I didn't get something out of, and a couple were among the best I've ever seen at any conference. Keep an eye on the Ruby Manor website for the videos when they're released. For me the real standouts were:

Programming with Nothing by Tom Stuart

Tom introduced us to the Lambda Calculus by considering what is possible in Ruby if we strip the language right back to basics. He implemented a solution to the FizzBuzz problem using just Ruby's Proc object and the methods Proc.new and Proc#call. What started out as a curiosity turned into a discourse on the nature of computation and the power of functional programming. It ended with a roar of approval when the final code was run! The slides were superb, the delivery style was quirky enough to be at home at a Ruby conference but had a real depth - there's no surprise to learn Tom used to lecture Computer Science topics at Cambridge! A real treat.

A Random Walk by Ben Griffiths

I really enjoyed Ben Griffiths's talk on Randomness. He gave a grab-bag selection of slides on such topics as Monte Carlo analysis, Simulated Annealing and a thought experiment on what it would be like to have a CI system that deployed to your production environment randomly. Ben organised his talk as one "idea" per slide, illustrated with occasional Ruby code, and then randomised the order just to keep himself and us on our toes. A fun idea and one that would have tripped up most speakers, I think. Not Ben though, he's a fantastic speaker and one I always enjoy seeing.

The Joy of Text by Sean O'Halpin

I was looking forward to this talk - sitting next to Sean at work, I've seen it come together slowly off the back of a lot of research. Sean talked about text encodings, his ffi-ncurses library and the history of terminal interfaces. He attempted to explain some of the problems we programmers face everyday when we work with text and text-based interfaces. It was a talk which covered a lot of ground, and hid a lot of depth and knowledge of the subject under a veneer of amusing anecdotes and useful tips. I hope the content of the talk makes it out in a longer form (a series of blog articles would be great, if you're reading, Sean!) as there's a lot of very useful content for us all to learn in there.

Conclusion

I hope this post has given you some feel for how great again the Ruby Manor conference was this year, and has encouraged you to seek out the slides and videos when they appear (it looks like the lanyrd page might be a good place to find everything together). It was a conference as much about the people and the community as it was the talks and the programming language. An experiment in self-organisation which showed how difficult it is to get people to step out of the comfort zone and contribute to the shaping of their community, but also what can be achieved when a few of them do so.

Thanks to Murray, James, Tom and all the champs who contributed to this year's event. Well done all!

https://chrislowis.co.uk/2011/11/20/ruby-manor-2011
Great radio interviews
Show full content

I'm a big fan of radio, and one format I particularly enjoy is the long-form interview. Here are some of the interviews I've really enjoyed in recent months, available as podcasts or downloads, and some reasons why you might enjoy them too.

Philip Elmer-Dewitt interviewed by Dan Benjamin on The Pipeline

I'm a fan of Dan Benjamin's 5by5 radio network. I'm less keen on the wide ranging discussion-show formats but when he conducts one-on-one interviews with people he obviously respects his interviewing style really brings out the best in his guests.

Radio Daze

In this interview with Philip Elmer-Dewitt they discuss the long career of this prolific ex-Time writer. Elmer-Dewitt is remarkably self-effacing, but I was inspired by the tale of his transition from technical writer/programmer to eventually Science Editor of Time magazine. The day-to-day accounts of his working life and tales of the discipline he's cultivated are truly fascinating. There's a lot of wisdom in this interview!

Morrissey interviewed by Kirsty Young on Desert Island Discs

The recently-launched Desert Island Discs archive website has made hundreds of interviews from the long-running Radio 4 show's archive available to "download and keep". Throwing in some of my favourite band's names into the search box led to this gem from 2009.

Kirsty Young asks pointed, revealing questions often as simple statements to be refuted ("You're not traditionally romantic") but Morrissey is more willing to engage than usual ("I think I am"). He talks freely about his childhood, the cult of celebrity, why four years of the Smiths over-shadows the rest of his career and along the way gets chance to play some great records from The Ramones, Iggy & The Stooges and The Velvet Underground.

Ian Mackaye interviewed by Jesse Thorn on the Sound of Young America

I'd not heard of this show before Dan Benjamin interviewed Jesse Thorn on The Pipeline. It appears to be very popular across the Atlantic, being syndicated widely via NPR. As I clicked through the back-catalogue of shows I came across this interview with Ian Mackaye, guitarist in one of my favourite bands, Fugazi, and head of Dischord records.

In the interview Mackaye talks more about his personal philosophy rather than the music - what it's like to run a business with principles, how it feels to inspire an entire youth movement and the passion he has for the Washington DC community. Mackaye is a great talker with conviction and experience; he rarely gives interviews so this was a real treat.

Carsten Dominik interviewed by Randal Schwartz on FLOSS Weekly

I'm not quite the regular listener I once was to FLOSS weekly. Randal Schwartz is a knowledgeable and competent interviewer, but he doesn't have the easy-on-the ears style of former co-host Leo Laport. I still tune in when the topic or guest looks interesting though, and did so for this interview with Carsten Dominik, creator of org-mode for Emacs. I spend a good portion of my working life inside the venerable old editor, and organise my thoughts and projects using org-mode.

Org is on the surface a simple, useful piece of software, as Dominik makes clear its inception was certainly a case of scratching a personal itch, but its the community that has driven the development of its vast array of other features. Listening to Dominik's passion and theories on community management in open source software was very motivating, and the fact that he developed the software alongside a busy scientific life must say something about the power of org-mode as a time management tool!

Peter Buffet interviewed by Stephen Dubner on Freakonomics Radio

It's difficult to find radio programming that is not scared of numbers or the statistics behind news stories. Stephen Dubner has made a career out of asking the kind of questions that others seldom do, or at the very least presenting the research that others are doing to his audience in a compelling way. He's recently started a radio show too, and some of the episodes are interesting interviews. In this episode he talks to Peter Buffet - composer, musician and youngest son of Warren Buffet.

As you can expect, the topic of his famous father is never far away, but it was the discussion about his early family life that I enjoyed, and the conviction Peter Buffet had to follow his own path. It was an enjoyable interview, Dubner let his guest speak without the clever verbal tricks of some of his other episodes.

https://chrislowis.co.uk/2011/05/18/great-radio-podcast-interviews
Joining BBC Research and Development
Show full content

A couple of months ago I joined the Prototyping team in BBC R&D. It's a great chance to work on cutting edge technologies for broadcast and the web. And a great place to work with some really smart people.

The first thing I've been working on is the fledgling RadioTAG specification, part of the RadioDNS umbrella of technologies. We're looking at adding a button to radios or other radio-receiving devices that will allow a listener to register their interest in a broadcast. Maybe you've heard a track you'd like to listen to again, or you have to leave the house during the Today programme and want to carry on listening where you left off when you reach the office. Interesting stuff.

As my colleague Duncan said, we should all try to blog a little more this year. I've made a start over on our team's blog, but I'm going to try and do so here too.

https://chrislowis.co.uk/2011/04/06/joining-bbc-rd
Using Rake and Git to find out what I did yesterday
Show full content

At our daily stand-ups we have to answer the question "What did you do yesterday". I wrote a little Rake task for the project I am working on to help me answer:

desc "List of all commits commited in the previous 24hours"
task :yesterday do
  git_author = ENV['GIT_AUTHOR'] || "chris.lowis"
  cmd = "git --no-pager log --after=\"1 day ago\" --pretty=oneline --author=#{git_author}"
  puts "Commits in the last 24 hours for #{git_author}"
  system(cmd)
end

This simply shells out to git with the appropriate command line arguments giving me a simple list:

Commits in the last 24 hours for chris.lowis
6663b95b5832sda91998c05fea7970fe44da13af Adding a great new feature
677b2e8092406b3c2031e8f065fg5672d90b8108 Fixing someone elses bug

There's quite a lot of interesting options that you can pass to git log, see the documentation for a list of them.

https://chrislowis.co.uk/2010/11/24/what-did-I-do-yesterday
Laptop Driven Development (with Emacs)
Show full content

I read an interesting post over on Bernerd Schaefers blog the other day where he described his set up for coding when you only have a small screen. He talks about methods for switching between VIM and a terminal. If you're an emacs user, like me, it's more common to run your terminal inside emacs.

I use the homebrew package manager for OS X. One thing this allows me to do is compile emacs from source with support for true full-screen mode

$ brew install emacs --cocoa
$ ln -s /usr/local/Cellar/emacs/23.2/Emacs.app /Applications/Emacs.app

This gives me a recent emacs with a great, full-screen mode which I activate by running M-x ns-toggle-fullscreen

Emacs fullscreen screenshot

That's my entire screen - no menubars, docks or other OS paraphernalia. I can switch to a shell for running my unit tests by typing M-x eshell (or for a standard bash shell M-x shell)

Emacs terminal screenshot

Since the usable area of the screen is quite large, thanks to the fullscreen mode, I also have room to split the frame in two (M-x split-window-vertically) to see, for example, tests and implementation at the same time

Emacs terminal screenshot

Or, occasionally, to pop open the shell buffer for quickly issuing a command

Emacs terminal screenshot

I find emacs to be a great environment to work in on a smaller screen. You can see more of my emacs configuration on github.

https://chrislowis.co.uk/2010/10/26/laptop-driven-development-with-emacs
Setting Http Proxy when using the selenium-webdriver gem and Firefox
Show full content

I've been using the selenium-webdriver ruby gem to do some automated Cucumber testing of our application. Sadly, I'm sat behind a firewall which requires an HTTP proxy to access the outside world. Using the Chrome WebDriver bridge worked fine as it inherits the system preferences on OS X. However with Firefox I had to perform some trickery to get it to work:

require 'rubygems'
require 'selenium-webdriver'

include Selenium

profile = WebDriver::Firefox::Profile.new
profile["network.proxy.type"] = 1
profile["network.proxy.http"] = "www-cache.at.my.work.co.uk"
profile["network.proxy.http_port"] = 80

driver = WebDriver.for(:firefox, :profile => profile)
driver.navigate.to "http://google.com"

The []= method on Profile is setting the options that you find by typing 'about:config' in the Firefox URL bar. Take a look there in a working Firefox profile to see what variables you should set for your webdriver-specific profile in the code above.

https://chrislowis.co.uk/2010/07/14/http-proxy-selenium-webdriver-and-firefox
Growl notifications from Ruby on OS X
Show full content

I wanted to generate Growl notifications from a Ruby script on OSX and had a bit of trouble getting it to work. To save you the same hassle, here's the steps I took:

Install growl

Install Growl if you haven't already. I used version 1.2.

Set some growl preferences

In the growl preference plane (find it under System Preferences)

  • under network check "Listen for incoming notifications" and "Allow remote application registration"
  • restart growl
Install the ruby-growl gem

There's a couple of different ruby bindings for Growl but ruby-growl seemed to work for me

gem install ruby-growl
Send a growl notification from your Ruby script

You can now send notifications from Ruby

require 'rubygems'
require 'ruby-growl'

g = Growl.new "127.0.0.1", "ruby-growl", ["ruby-growl Notification"]

g.notify "ruby-growl Notification", "It Came From Ruby-Growl", "Greetings!"
https://chrislowis.co.uk/2010/07/06/growl-notifications-from-ruby-on-osx
Open-source rails apps to study and learn from
Show full content

If, like me, you learn best by studying other code here's five some open-source rails apps with something to teach. They're a great resource to study and improve your own code, or to use as the starting point for your own applications. All of these applications use Rails 2 but as they are open-source they are a great opportunity to get your feet wet in the Rails 3 world by helping to port them across.

Update: Thanks to the comments here and over on Hacker News, I've added two more applications and made some comments on the non-standard nature of the Loved by Less application code.

Gemcutter

A site familiar to all Ruby developers is Gemcutter - the recent replacement for the venerable Rubyforge. I wasn't aware that the source code of the site was open source until danieldon pointed it out to me, but you can study the code on github. The Gemcutter source is written in a very modern way featuring examples of using Cucumber for integration testing, a simple Rack middleware example and an interesting routes.rb file showing how to cleanly version an API.

Features
  • A very modern Rails application featuring the latest best practices.
  • Examples of metal and rack middleware.
Spot Us

Spot Us is a website that allows individuals to commission freelance journalists. It has many social-network type features which make the source code interesting reading.

Spot.us screenshot

The comprehensive test suite is written with rspec and the ruby-like templating system HAML is used for the views. It's also an example of how to use jQuery in a rails app instead of the default prototype through the use of the jrails plugin.

Features
  • Haml
  • rspec
  • jquery with the jrails plugin.
Loved by Less

Loved By Less is an open-source social network. I think many Rails freelancers have been asked to create a site with social network features - profiles, 'friending', photo sharing etc. Less Everything were no different and created this open-source platform to help ease the pain of getting started. The source code is available on github. It's unlikely that simply cloning the app will give you everything you need, but it's an amazing resource to read through and take the bits you need for your project.

The loved by less source code is starting to show it's age a bit, and does include some pretty extensive monkey patching which may confuse a newcomer. While I don't think this is bad in itself (it shows the flexibility of Ruby, and also the dangers of not following Rails conventions), it's something to be aware of. I think porting this to Rails 3 would give newcomers to Rails a great resource to learn from.

Features
  • Search with Thinking Sphinx
  • Flickr integration
  • Comprehensive email support
  • Paperclip for attachments
Saasy

If you're working on a Software as a Service application, take a look at Saasy . It's a template application designed to do billing and authentication tasks 'so you don't have to'.

Sassy screenshot

Studying the code base, you'll see examples of using SSL security and ActiveMerchant. I was also interested in the accounts model which uses the acts_as_state_machine plugin to simplify some of the logic.

Features
  • acts_as_state_machine
  • ActiveMerchant
Simply Agile

Simply Agile by Andrew Bruce is an open source agile software project management application. Think of a simple version of Pivotal Tracker. You can add story cards to a backlog, and then assign each card to a sprint. Each time a card is completed you can drag and drop it to the appropriate column in the Simply Agile task board. Andrew has a very dedicated approach to test-driven development and as a result the application is well covered by cucumber and rspec tests. The javascript in this application is written in an unobtrusive style and is a good example of using jQuery for "progressive enhancement". The app is fully functional in browsers without javascript, but where javascript is available so is the drag-and-drop interface.

Features
  • Cucumber integration tests
  • rspec coverage
  • Drag and drop interface powered by jQuery.
Typo

Typo is "the oldest and most powerful Ruby on Rails blogware" and is still under active development. While the 15 minute blog is still a fantastic demonstration of how powerful Rails is for rapid application development, anyone who has decided to take the project further and create their own fully-featured blog system will know how much extra work is needed. From comment systems, to anti-spam protection, restful routing to upload support there are many features that need to be added. Thankfully Typo has already implemented these and many other features, and the source code is available to help you learn how to do the same.

Features
  • rspec for testing
  • internationalisation support
  • email notification
  • admin and public-facing interfaces
Open Source Rails

Open source rails is a gallery of open-source rails projects. I selected this project for this list because although the code itself isn't well documented or tested, in many ways this is illustrates a great strenght of the Rails framework. It is a good project to study to realise how much can be achieved with a small amount of code and a handful of powerful plugins (not that I'd recommend starting your next Rails project without tests, of course!).

Features
  • OpenID integration
  • Paperclip for file uploads
  • A simple set of routes.
Conclusion

I hope you enjoyed this selection of Rails projects. This is far from a definitive list, and I encourage you to read some of the suggestions of other apps in the comments below and on the discussion over on Hacker News. With the upcoming Rails 3 release I think it's a good time to reflect how far the Rails framework has come, and also to remember to cater for people who are learning Rails for the first time - studying open-source code is a great way to learn.

Do you have a favourite open-source Rails project? Share it in the comments below.

https://chrislowis.co.uk/2010/05/31/five-rails-apps-to-study-and-learn-from
Unfilling regions in Emacs
Show full content

I have the habit of hitting M-q every 5 seconds or so when working with text in emacs. This key combination is bound to "fill-paragraph" and inserts line breaks into the current paragraph to keep the line width to approximately 80 characters.

If you're cutting and pasting the text into an email message or website form though, this is often not what you want. The way round this is to "unfill" the current paragraph or region. The following commands will help:

(defun unfill-paragraph ()
  (interactive)
  (let ((fill-column (point-max)))
    (fill-paragraph nil)))

(defun unfill-region (start end)
  (interactive "r")
  (let ((fill-column (point-max)))
    (fill-region start end nil)))

But now you have lines in your emacs buffer that wrap in an unusable way. Longlines-mode to the rescue (M-x longlines-mode). Longlines mode uses "soft newlines" which will not show up when yanked or saved to disk.

I've recently added my emacs config to github. Feel free to have a poke around and let me know what other emacs tricks I am missing!

https://chrislowis.co.uk/2010/03/03/unfill-region-emacs