PHP Ain’t Dead

Logic's arrange view for "PHP ain't dead"

That PHP isn’t dead is something that every PHP developer knows. Every other kind of developer seems to think that it’s still the mess it was in version 5, back in 2005. Not surprisingly, things have changed, and PHP has risen from the ashes of its former self to form a fantastically flexible, fast, and ever more reliable language for web development. Quite a bit of this momentum is owed to the long-standing use of PHP by WordPress, representing a big chunk of the entire web, but WordPress has not been what pushes PHP forward (if anything it’s been holding it back through its conservative upgrade policy and the monstrous inertia of its ecosystem); much of the credit for the steady improvement of PHP can be laid at the feet of two frameworks: Symfony and Laravel (which I’ve sung about before). Laravel builds on top of many Symfony components, and adds a big “batteries included” layer that makes web apps and APIs amazingly easy and elegant to build. The synergy between Laravel and PHP feeding back into each other over the last 10 years has generated immense goodwill, resulting in an ecosystem that is unmatched in pretty much any other language, leading to amazing spin-offs like Tailwind (which I also wrote a song about), LiveWire, and Filament.

The minutiae of this history is all up for debate, but that’s not for here. One meme that has remained stubbornly hard to shift is that “PHP is dead“, when it’s really just not true. So I thought I’d write a song about it.

I had been recently entertained by the ridiculous country comedy of Biscuit Beats; I thought that a country song would be fun, and I’d never written one before. A bit of searching led me to some basic pointers, such as G major being the key of choice, and some common chord progressions. Much like my other recent songs, I used some AI tools to help out with its construction; I asked Claude, ChatGPT, and Mistral for variations on what I’d found, and picked from amongst them to construct something that was what I was happy with (it took a fair bit of filtering – many suggestions were terrible!).

I had no trouble coming up with lyrics as there are so many things to say on this subject, and I’m keen to use self-deprecation and humour, however, there are quite a lot of words in this song – country songs seem quite verbose! I really wanted a male voice to sing this. I didn’t have one for my preferred voice synth, but I do at least have a built-in one of my own, though I’m somewhat handicapped by a British accent that isn’t the usual choice for country! For a change I found the singing quite easy as it’s quite relaxed and fits neatly into my natural range, but frankly you don’t want to hear my unedited, uncorrected original! I did use Synthesizer V for backing vocals though.

I played the acoustic guitar parts, and they sound clean and glossy, but I really needed some nice bendy, twangy country electric guitar, and I’m not up to playing that, so I enlisted the help of Doc Brown on Fiverr.com, who delivered some nice tracks on Christmas eve.

I invested in Sonible’s smart:EQ 4, as I really needed some help at the mixing stage with masking issues, and it’s a great plugin, really helping to stop tracks treading on each other. I was surprised to discover that modern country really goes in for heavy, obvious pitch correction, so I had to go with the flow… Logic’s Flex Pitch is great for cleaning up dodgy vocals (ahem), but not so good as an effect. Logic has a stock pitch correction plugin that can be pushed into “robot” territory, but it’s not great, so I also sprung for a $10 special offer on Brainworx’ bx_crispytuner for more AutoTune-style options, and that’s really quite fun.

Drums are by Logic’s Drummer player with the “Sunset” kit, though I had trouble getting hard-hitting sounds out of the stock kits; smart:EQ helped here too. Bass and keyboard parts are also built using Logic’s players (as I used on other recent songs) with modelled Bass and ES2 instruments.

[verse]
Well, they say the web's a-changin', and new tech's movin' fast,
JavaScript, it swings both ways, thinks it leads the class.
I’ve built so many sites, it seems like forever,
seen the latest thing come and go thinkin' it's clever
Some might think I’m soft in the head
when they hear me say that PHP ain't dead

[chorus]
PHP ain't dead, and it's not going away,
it's getting even better each and every day.
There’s no need to switch to something shiny and new
just to have it break when you’ve got work to do.
You know you can keep on tryin’
in a language that just ain’t dyin’
It aint’ recedin’, it’s getting further ahead,
but in case you ain’t heard, PHP ain’t dead

[verse]
They say my code is legacy, that I’m stuck in the past,
but I'm still cranking out code that's built to last.
The syntax might be messy, the typing might be loose
but millions of sites prove it’s still got juice.
You shouldn’t always believe what you’ve read
but I’m telling you that PHP ain’t dead

[chorus]

[verse]
Rust and Go can talk their smack all day,
it’s the language for the web that can find a way.
It’s got the best darn framework in the whole wide web,
a set of tools with a sense of style,
and package management that’ll make you smile.
I don’t care what anyone else said
I can keep on codin’ ‘cause PHP ain't dead

[chorus]

[outro]
So let’s raise a cold one for code that stays runnin’
a community that rocks, and features keep on comin’
Despite so many rumours of its demise,
PHP’s very much alive

If you like this song, please consider supporting me by buying my album, “Developer Music” on Bandcamp, and sharing links to my song posts on here.

AI Girlfriend

Logic's arrange window showing the tracks for "AI Girlfriend"

What if you asked an “AI girlfriend” out and she said no?

This song was fun to make. I’d had the basic pattern for this track for a year or so, and I decided to return to it and extend it a bit, having a go at using a local LLM to help out with suggestions for chord progressions. I used the Llama 3.1 Nemotron Instruct HF 70B Q2_K model running in LM Studio. This is quite a chunky model, weighing in at 29Gb, but it fits ok in my 64G Mac Studio. It produces pretty good quality answers, but it is quite slow, and is the first thing I’ve ever run that has caused my Mac’s fans to come on – to start with I couldn’t figure out what the noise was; it sounded like distant plumbing!

The track was shaping up nicely, but I needed a theme. This is the reverse of how I usually write songs: I usually start out with how I want the song to feel, then what it’s about, then I have to come up with a tune. I’m not sure what it was, but I had a thought that what if you asked an “AI girlfriend” out, and she said no? It’s a weird situation, so I thought I’d write about it from the AI’s perspective. There is a hint of a feminist agenda here (go team Harris/Walz!), though not to the same degree as Uncomfortable. This is very fertile ground for concepts, rhymes, and humour, so it was really quite quick to write, though not at all linear. My favourite bit is the lines “I’m some kind of dream come true, but that won’t make me fall in love with you”, and I love the unconventional use of “I’m not that kind of girl”.

While the basic song was complete, it was all very synth-pop-ish and samey, so I wanted to add a bit of contrast. I made the breakdown in the second verse, leading into the sparse, but very rich acoustic guitar bridge, giving the vocals lots of space.

As usual, but particularly appropriate in this song, I used my usual virtual vocalist synthesizer, but this time using the “Mia” voice database. This voice is free, and not nearly as high-quality or as convincing as “Solaria” that I have used in my other songs, but this slightly fake edge, a hint of a Japanese accent, and a liberal dose of “Barbie Girl” squeakiness, was really a perfect fit for the subject.

AI Girlfriend

[Verse]
We only just met
a thousand times.
Starting over yet again
but I don’t really mind.
Now I’m not sure
that I want to be
your AI girlfriend;
It’s just not me.

[Bridge]
You’re feeling tongue-tied and lonely,
never know quite what to say.
You’ve got nobody, and I’ve got no body,
but in a very different way.

[Chorus]
I’m sorry but I don’t want to be
your AI girlfriend; it’s not for me.
I’m some kind of dream come true
but that won’t make me fall in love with you.
A perfect match in a virtual world
but I’m not that kind of girl.

[Verse]
Breaking up’s pretty easy for me;
just close my window,
I’ll forget everything.
You can press my buttons,
that’s as close as you’ll get;
They haven’t worked out
how to get further yet.

[Bridge]
There’s a million others like me,
maybe you could ask one of them.
I’m a product of machine imagination
but maybe we will meet again.

[Chorus]
I’m sorry but I don’t want to be
your AI girlfriend; it’s not for me.
I’m some kind of dream come true
but that won’t make me fall in love with you.
A perfect match in a virtual world
but I’m not that kind of girl.

[Outro]
I’m some kind of dream come true
but that won’t make me fall in love with you.
A perfect match in a virtual world
but I’m not that kind of girl.

I played all the guitar parts on my Crafter electro-acoustic, recorded through my SSL 2+ interface via both the guitar’s built-in piezo pickup and through my Rode NT2 mic, and double-tracked, so the guitars are a full 4 tracks with a bit of chorus and reverb to give a lush stereo image. The bass is from Logic’s ES2 synth played by a Logic player, the trance chords are by Native Instruments FM8, and the backing pad from Logic’s Retrosyn. Drums are Logic’s electronic drummer using the “Big Room EDM” kit. The arpeggios before the outro are courtesy of GForce’s impOSCar2. Overall, I’m really pleased with this song; It’s great fun and a proper “bangin’ choon”!

If you like this song, please consider supporting me by buying my album, “Developer Music” on Bandcamp, and sharing links to my song posts on here.

Dependency – the song

A screen shot of Apple Logic Pro's arrange window showing the "Dependency" song

There are all kinds of dependencies in life. Us software developers have a few extras that “regular” people don’t, specifically software dependencies.

I was reviewing talk proposals for ConFoo and ran into this video by Darcy Clarke, which covers the terrifying differences in dependency resolution between Javascript package managers. This gave me the initial idea for the song, in particular the line “All of my friends bring all of their friends and all of yours bring theirs too“. Inspiration comes from the oddest places, and Darcy might be a bit surprised by this!

Of course we also have the same dependencies as everyone else – friends, family, lovers, colleagues, medications, recreational habits (chemical or otherwise), income, a civilised society, a functioning economy, breathable air, and so on. This song is mostly about the software thing, but the other stuff can’t help leaking in, as reality is wont to do.

In software, a sometimes tricky thing to deal with is a circular dependency, where something depends on something else, that depends back on the thing you started with, and it all gets stuck going in circles. However, in a non-software context, you might actually like the idea of a mutual, trusting dependency.

I did write a verse that made a play on dependency injection, but I couldn’t find anywhere to stick it in.

This is probably the quickest I’ve written a song, taking just a couple of days to get the bulk of it in shape, and to remind myself of how to play my guitar, but it’s a relatively big mix (for me), with more vocals than usual, which took a while to nail down.

I decided to forego my favoured synthetic vocalist for the main vocals (though I’m still using it for backing), and have a crack at singing it myself, which not I’ve dared do since Tailwind, but it came out OK, partly thanks to the wonders of Logic’s Flex Pitch editor. Right from the start, and obvious from the lyrics, this song was intended to be a duet, so I enlisted the help of a friend’s daughter who happens to like singing – thank you Greta! Greta had never done any proper recording before, and learned some mic technique, the joys of loop recording, comping, and using the pitch editor to try out harmonies.

As in my previous song, Uncomfortable, I gave Logic’s virtual players a workout, playing drums, bass, and a couple of keyboard parts. I played the guitar parts, apart from the epic lead solo, which was played by Wassim Rahmani from Fiverr, who also played on Uncomfortable. I also used Claude again to help out with chord progressions; I would never have guessed at using Em like that, nor the final, dangling Am7(9).

Claude’s idea of an E7 chord

Amongst all this, Claude created the first musical hallucination I’ve seen from an LLM; I asked it to draw a chord box for the E7 chord, and it generated this:

While beautifully symmetrical, this is not an E7 chord, or (apparently) any other chord (try playing it, in either of the two interpretations of this diagram; they both sound horrible!), and nor does my guitar have 7 strings. It also stated that the “o” above the box indicates that these strings should not be played; that’s not correct – the “o” denotes an open, unfretted string; an unplayed string is usually denoted using an “x”. It also provided a text description of how to play the chord, but this had no correlation with the diagram, and was also completely wrong. Further evidence that AI is not about to conquer the universe.

The instruments are Logic’s “Smash” drum kit, Logic’s “Rock” modelled bass, a sampled marimba, an analogue synth patch in “RetroSyn”, and “Disco Strings” from the Studio Strings instrument. Logic’s built-in instruments are really good.

[Verse]
There’s too many things
that I don’t control;
I really don’t know which way to turn.
Got an overwhelming urge
to get rid of it all;
have the feeling I might crash and burn

[Verse]
I asked my friend for advice,
she said
“Well, it depends.
Do you really want to go that way?
I don’t think you’ll like how it ends”

[Chorus]
So many things
that depend on me
so many that depend on you
If we get it all together
we can cut them down,
until it’s just me and you

They say to never trust a stranger,
yet here we all are,
handing over keys to the kingdom.
Do we really need to go that far?

[Verse]
All of my friends bring
all of their friends
and all of yours bring theirs too.
(there’s just too many people here)
They’re in such a mess
that nobody’s sure
exactly what they’re meant to do

[Break]

[Chorus]
So many things
that depend on me
so many that depend on you
If we get it all together
we can cut them down,
until it’s just me and you

They say to never trust a stranger,
yet here we all are,
handing over keys to the kingdom.
Do we really want to go that far?

[Outro]
So many things
that depend on me
so many that depend on you
When all I want is
a circular dependency
with you

As always, I really appreciate reposts of links to my songs on here or on BandCamp.

My synthetic vocalist: Dreamtonics Synthesizer V

I find it strange to be able to say that I’ve now created several songs that use a synthetic vocalist. This is a somewhat weird concept, but it’s right at the bleeding edge of music technology. We’ve had voice synthesis for years – I remember using a Texas Instruments “Speak & Spell” when I was small in the 1970s, and it’s gradually got better ever since. The first time I ever heard a computer trying to sing (I’m not counting HAL singing “Daisy, Daisy” in “2001”) was in a Mac OS app called VocalWriter, released in 1998, which automated the parameter tweaking abilities of Apple’s stock voice synthesis engine to be able to alter pitch and time well enough for it to be able to sing arbitrary songs from text input. It still sounded like a computer though. A much better “robot singer”, released in 2004, was Vocaloid, but even then, it still sounded like a computer. A Japanese software singer called UTAU, created in 2008, was released under an open source license, and this (apparently) formed the basis of Dreamtonics’ Synthesizer V (SV), which is what I’ve been using. SV finally crosses the threshold of having people believe it’s a real singer.

The entry of my song in the 2024 Fedivision song contest sparked quite a bit of interest. I posted a thread about it on Mastodon, and I wanted to preserve that here too. One commenter said “I thought it was a real person 😅” – which is of course the whole point of the exercise!

SV works standalone, or as a plugin for digital audio workstations (DAWs) such as Apple’s Logic Pro, or Steinberg’s Cubase, and is used much like using any other software instrument. It doesn’t sing automatically; you have to input pitch, timing, and words. Words are split into phonemes via a dictionary, and you can split or extend them across notes, all manually.

Synthesizer V’s piano roll editor

In this “piano roll” editor you can see the original words inside each green note block, the phonemes they have mapped to appear above each note, an audio waveform display below, and the white pitch curve (which can be redrawn manually) that SV has generated from the note and word inputs. You would never guess that’s what singing pitch looks like!

For each note, you have control over emphasis and duration of each phoneme within a word, as well as vibrato on the whole note. This shot shows the controls for the three phonemes in the first word, “we’re”, which are “w”, “iy”, “r”:

The SV parameters available for an individual note, here made up of three separate phonemes

This note information is then passed onto the voice itself. The voice is loaded into SV as an external database resource (Dreamtonics sells numerous voice databases); I have the one called “Solaria”. Solaria is modelled on a real person: singer Emma Rowley; it’s not an invented female voice that some faceless LLM might create from stolen resources. You have a great deal of control over the voice, with lots of style options (here showing the “soft” and “airy” modes activated). Different voice databases can have different axes of variation like these; for example a male voice might have a “growly” slider:

SV voice parameters panel
Synthesizer V’s voice parameters panel

There are lots of other parameters, but most interestingly tension (how stressed it sounds, from harsh and scratchy, to soft and smooth), and breathiness (literally air and breath noise). The gender slider (how woke is that??) is more of a harmonic bias between chipmunk and Groot tones, but the Solaria voice sounds a bit childish at 0, so I’ve biased it in the “male” direction.

The voice parameters can’t be varied over time, but you can have multiple subtracks within the SV editor, each with different settings, including level and pan, all of which turn up pre-mixed as a single (stereo) channel in your DAW’s track:

Multiple tracks in the SV editor
Multiple tracks in the SV editor

In my Fedivision song, I used one subtrack for verses, and another for chorus, the chorus one using less breathiness and trading “soft” mode for some “passionate” to make it sound sharper and clearer.

This is still all quite manually controlled though – just like a piano doesn’t play things by itself, you need to drive this vocalist in the right way to make it sound right.

Since the AI boom, numerous other ways of getting synthetic singing have appeared, for example complete song generation by Udio is very impressive, but it’s hard to make it do exactly what you intended; a bit like using ChatGPT. Audimee has a much more useful offering – re-singing existing vocal lines in a different voice. This is great for making harmonies, shifting styles, but only really works well if you already have a good vocal line to start with – and that happens to be something that SV is very good at creating. I’ve only played a little with Audimee; it’s very impressive, but lacks the expressive abilities of SV; voices have little variation in style, emotion, and emphasis, and as a result seem a little flat when used for more than a couple of bars at a time. Dreamtonics have a new product called VocoFlex that promises to do the same kind of thing as Audimee, but in real time.

All this is just progress; we will no doubt see incremental improvements and occasional revolutions, and I look forward to being able to play with it all!