I was recently able to finish the process of porting (ability to run on different operating systems) so we’re now ready to announce this new possibility for audio live coding!
Some of you may have heard of this new thing called Syntə which is used by me under the artist name SYNTƏL8 for performing. I started developing this all the way back in 2022 as a hobby project, mostly just to see what would happen. Well, a lot of things happened! And I’ve experienced an amazing burst of creativity. Yay. Although the downside is that I’m more doubtful than ever that I know what live coding actually is hehe… Let’s plough on –
Why?
There are many, many live coding languages and platforms out there, for example there are more than 60 listed at https://github.com/toplap/awesome-livecoding. So why make another?
A first response is why not? It doesn’t really harm to add to the list, although I admit it can make it hard to decide on which one to try.
The two most popular audio languages are TIdalCycles (with sibling Strudel) and SonicPi, both of which are great options to get started with. Then there are things like Foxdot/Renardo, Gibber, SCLang, Trane, CLive, Glicol, ChucK – the list goes on…
Some have started on this make-your-own-language quest for fun and/or a learning exercise – which is a great motivation and I encourage anyone to get experimenting – it’s not as hard as it may look.
There is an argument in favour of consolidation – are our human resources better pooled together under fewer projects? That is compelling, but not straightforward, as it can be hard if not harder to familiarise yourself with an existing codebase. If that does appeal to you then strudel.cc and nudel.cc are well known for being particularly open to contributions. If anyone wants to get involved with this project please do reach out.
A big reason for me has been about providing a custom solution directly tailored to my own needs and is something I’m very glad to have embarked on. Monocultures are never healthy so it always helps to have options that have offer different conceptual models, so I feel that following my own path can only be a benefit in this way.
I didn’t make any music from 2017 until 2023, yet now with Syntə I have made more music than in the previous 15 years! So it has been an enormous boost to my creativity and self-expression, which was unexpected but very welcome.
There is another motivation, that of live performance. I wanted to automate away everything possible to streamline the process so I could focus purely on composition and sonic form.
What does Syntə bring to the table?
Previously I had used Pure Data which had fun moments and was a gateway drug to audio computing, yet also had many frustrations. I found it hard to do even simple things like play samples, alongside idiosyncrasies in the way some objects could be connected. More fundamentally there was a hard barrier between CV and audio signals (I think a legacy of when it made sense to have a less intensive computational path) and also no feedback was allowed – which is no fun at all!
In Syntə, feedback (literally feeding the output of something back into the input of something in some way) is very definitely allowed – in fact it’s a fundamental building block used in the most elementary of functions to create oscillation and filtering.
So one goal was to produce a text based interface alternative in which audio computing could be done live.
Other benefits include:
- auto-setting of internal levels for convenience
- controlling of output level for no loud surprises
- resilient self-contained high precision sound engine which is resistant to overload
- fairly simple install process, one single binary does everything
- will work on laptops, SBC’s and even mobile phones
- easily extensible by user-defined functions
- useful types for input values: hz (Hertz), bpm, ms (Milliseconds), s (Seconds), db (Decibels)
While the web is a great platform for a zero-install experience, there are great web-based options already such as Strudel and Glicol. One downside of the web is that the browser stack – despite a lot of effort – is always going to lag behind running code directly on your machine. For sequencing, web-based tools are always a good option, especially for collaboration which is an area Syntə doesn’t have much support for currently. However, the sound engine has proven to be reliable under pressure – which is important to me.
It’s also a self-contained solution – it doesn’t require plumbing up to anything else. Text in, audio out.
All you’ll need is a text editor and a terminal app, and they are pretty universally available.
The aim was never to replace anything else so features of other languages have not been replicated.
For example, there is no ‘mini notation’ like you get in Tidal/Strudel/Uzulangs. This is a great entry point for immediacy but I wanted to focus on other ways to generate pattern. In fact Syntə has no concept of sequencing, or even notes!
So you may be thinking what can you do with it then??
What you can do with it
Strangely enough, it all started as a somewhat arcane experiment in exposing the lowest level dsp operations to be used freely to compose in the most abstract way possible – away from any pre-conceived notions of what music should be. But after two years of learning and trying things out I have ended up getting some very promising results in terms of the kind of club or ambient performances I’ve always targeted, which to be honest was not wholly expected!
First off, audio synthesis (which is a major passion of mine) in Syntə is fun and reasonably straightforward. The conceptual model of the code is that each series of operations updates a float value in a chain, resulting in the next audio sample at the end. I find this model easier to reason about than more object-oriented ones (although your experience may differ!)
I’ve played with many different techniques in Syntə from traditional subtractive to FM to karplus-strong – I even was surprised and very pleased to discover that it’s possible to write your own sample time-stretching algorithms in the language! It was never anticipated but fell out of the atomic design quite nicely 🙂
You can also freely shape pitch, timbre, amplitude etc over time by composing and combining other waves at LFO frequencies. These can also be shaped using audio features such as filtering for novel shapes. This is nothing new, having long been available with electronic/digital modular synthesis, however having a succinct syntax makes larger patches more manageable.
Although as mentioned there are no explicit notes, envelopes or sequences, these can in fact be made and then further manipulated using audio rate effects such as filtering.
This means that pitch, amplitude and timbre can all flow separately from one another. Pitch also has no predefined values, being simply another float within the sound engine. So you are not constrained to western notions of scale and melody, these however can be used – equal temperament, just intonation or micro-tuning as you wish. For example to increase a pitch CV by a just-intonation fifth interval you simply multiply by 1.5 – awesome! This also helps demystify these concepts too.
Neither is there any fundamental concept of synchronisation, but it’s easy to use the built in functions designed for arranging beats over multiple listings. The underlying phasor (or sync pulse) can itself be patterned or even reversed! This can create some nice glitched out effects and interesting rhythms. You can have multiple timebases and freely combine them with un-synced waves.
Euclidean rhythms are generalised as a grid captured pulse wave, the frequency and pulsewidth of which can be further modulated, including the (optional) grid itself which is an ordinary signal.
The low end of the sound engine has had particular attention applied to it (some might say too much hehe) so deep rumbling kick drums and basses are only a few key-strokes away.
But how easy is it to use?
I don’t know – in the sense that it’s not possible for me to know. The language has been designed to fit the way my brain works which may be something entirely unique hehe. It’s also difficult to see it through the eyes of a newcomer.
It took me a long time to get used to it, but I think that’s the case with any language.
What I will say is that live coding isn’t always easy and synthesis can be challenging too. Within those constraints the language has been designed to be as beginner friendly as possible – whether that has been achieved or not, well I guess we’ll find out!
All that said, beginner friendliness was a design goal from the outset – in sympathy with my former self when I was trying to get to grips with code.
To give a feel for it, here is an example to demonstrate the expressive power of the language:
in 2hz, step 5.01, 8bit 12, base 2, mul 440hz, sino, mix
This generates an interference pattern of pitches which shift over time to make a pleasing arpeggio. This was an accidental discovery and a great moment for me. The listing can be further modified by, say, adding lpf 20hz
before base 2
to slew the notes. The commas are optional, purely for readability. There are fuller examples of what it can do on my bandcamp page which can be listened to for free. Although all sales help fund further development and fuel creative time. All of the tracks were recorded using only Syntə and simply level-normalised and uploaded.
I think algorave celebrated its tenth birthday in 2022? Suffice to say that some practitioners of the art have been doing this for a long time – and it does take time to get used to coding in front of an audience. I myself took over eighteen months of regular performances before I started getting results that I was consistently pleased with and I imagine (and hope) it will be years before I have more fully explored all the possibilities. That said, don’t be afraid to jump in and make stuff happen – the live code scene is generally very open and non-judgemental about the output of anyone, beginner or not. As summed up in the provocative mantra “bad code only”.
The future of Syntə
One main feature that may be added at some point is the ability to receive MIDI and/or OSC messages. This would have the benefit of being able to use it as an audio backend for sequencing based languages that generate a stream of events, such as Tidal.
As someone remarked recently, the code can be very dense sometimes, but this is improving as new abstractions (functions) are added – and it’s simple to add your own too! This is an ongoing process as I explore which things help performing and play well together, while not being overly restrictive.
Another future option is to further simplify the install process by providing pre-built binaries for different systems. This is a bit of a stretch goal depending on how useful that would be. Installation is already fairly pain-free. You will need the Go programming language installed, alongside Portaudio (and SDL2 on Mac – these both provide cross-platform sound). Git is also handy though not essential.
The code-base is like a narrative of my own journey into engineering – more recent code is fairly clean and tidy – older stuff not so much! So as time allows, the codebase will continue to be cleaned up and refactored to bring it closer to industry standards.
One person requested audio input for applying effects and manipulations to external sounds, so this may be added too.
As mentioned earlier, the ability to collaborate live could do with more support, this would be helped by adding midi/osc and also integrating with a collaborative editor such as flok.
Any other major features are highly unlikely, eg. no visual support is planned – I’m currently shader curious but will be using other methods to explore that when I get round to it.
The road to 1.0
Well, it works fine at the moment having been used for dozens of performances by me over the last two years. That said, I want to leave room for alterations so there may be changes along the way, especially those that facilitate ease of performing live. Luckily those will mostly take the shape of additions to the standard library of functions written in the language itself. As mentioned, these can be freely overridden and modified by any user.
There is a lot more to say about the language so I will leave it at that for now. It’s fully documented and I will continue to explain myself and why I made such a tar-pit delightful creation on my personal blog.
This has been an incredible journey which has resulted in many amazing opportunities to perform, meet others, and soon – to teach too.
And now you can also join in the fun 🙂
Try it out!
The code and instructions can be found here: https://github.com/syntelang/syntelang
Let me know what you think – all feedback is welcome – good or bad!