Adding a Mozzie intermission

Freman

Uh Oh Elf
Generous elf
Joined
Aug 9, 2021
Messages
118
With the mysterious death of all our minty bushes over the past couple of years we seem to have become a welcome home for mosquitos, they're not super numerous but they are very aggressive... We burn 3 mozzie coils per night when it's not raining.

In order to provide extra protection I went ahead and knocked out a nice repellent spray post which is comprised of
PXL_20231126_085506771.jpg
Of course, this wasn't enough, I still had a couple of people ask me where it was when I mentioned it to them so I put together a little intermission sequence.

Step 1: A script.
I'm not exactly the most creative writer around so I thought I'd give something even more robotic than myself a shot and headed over to ChatGPT and had a really short but ultimately quite productive chat with it

After a couple of minor tweaks and adding notes for any humans I might one day get to read it I have this script.

Lumie: (flickering slightly, disgusted) Ugh, Wattson, have you noticed how relentless these mozzies are tonight?

Wattson: (humming, agreeable) Oh, absolutely, Lumie. It's like they've declared war on our little corner of town.

Lumie: (pulsing with irritation, playfully irritated) I mean, we're lightbulbs, not bug zappers! This is getting out of hand.

Wattson: (nodding, agreeable) Couldn't agree more. It's like they have a personal vendetta against us. Maybe they're attracted to our radiant personalities.

Lumie: (chuckles) More like our radiant bulbs. But seriously, I can't concentrate with all this buzzing in my filament.

Wattson: (looking around, thoughtful) Hey, what if we do something about it? Spread the word to our audience, so to speak.

Lumie: (brightening up) That's a bright idea, Wattson! Let's illuminate those poor folks out there getting eaten by mozzies.

Wattson: (gleaming, chearful) Alright, Lumie, let's shed some light on the solution. (pauses) Literally.

(Cue Lumie and Wattson addressing the audience)

Lumie: (addressing the audience) Attention, lovely people enjoying the lights tonight! Lumie and Wattson here. We've got a little public service announcement.

Wattson: (nodding, agreeable) Indeed! If you're feeling personally victimized by mosquitos, fear not! There's a solution.

Lumie: (sparkling) Right by the street tree, you'll find a magical potion called "Mozzie Repellent." Spray it on, and those pesky bloodsuckers will be out of your hair—or should I say, out of your skin.

Wattson: (grinning) So, dear audience, don't let the mozzies dull your night. Arm yourselves with the mozzie repellent, and tell those pests to buzz off

Lumie: (flickering with enthusiasm) We're here to brighten up your night, don't let those tiny vampires ruin it!

Step 2: Voice Talent.
Then it was off to find some voices, I can't afford human voices, not because they're unreasonably priced but this is not the wealthy end of the year for me, so I had to track down some reasonable sounding AI (I would like something elf like but... eeeeeh) I found some free AI time on a couple of websites (writesonic.com and elvenlabs.io) and abused that.

Lumie is played by Bella (https://app.writesonic.com/audiosonic)
Wattson by Harry (https://app.writesonic.com/audiosonic, https://elevenlabs.io/)

It was just a case of pasting each line into the page one at a time and tweaking with commas, exclamation points, and full stops to get the sound I wanted for each voice.

Step 3: Mixing.
Once I had my 13 spoken segments it was off to Audacity to mix the segments into one solid MP3.
  • Create a new project in Audacity
  • Create two new mono tracks (one for Lumie, one for Wattson)
  • Import each segment one after the other dragging them to the appropriate place in the appropriate track
  • I speed up a couple of the segments, just a fraction (5-7%) just cos we just don't speak as slow as they were speaking here.
  • I also opted to bias Lumie to the right speaker and Wattson to the left speaker by dragging the Balance slider appropriately (about 40%+/-)\
  • Save the project in case I hate it later it's easier to modify this way
  • Export as MP3 into my show directory

Step 4: Prepare the lyrics.
I just stripped off all the annotation from the lyrics to make it easier to import into xlights.

Code:
Ugh, Wattson, have you noticed how relentless these mozzies are tonight?
Oh, absolutely, Lumie. It's like they've declared war on our little corner of town.
I mean, we're lightbulbs, not bug zappers! This is getting out of hand.
Couldn't agree more. It's like they have a personal vendetta against us. Maybe they're attracted to our radiant personalities.
More like our radiant bulbs. But seriously, I can't concentrate with all this buzzing in my filament.
Hey, what if we do something about it? Spread the word to our audience, so to speak.
That's a bright idea, Wattson! Let's illuminate those poor folks out there getting eaten by mozzies.
Alright, Lumie, let's shed some light on the solution. Literally.
Attention, lovely people enjoying the lights tonight! Lumie and Wattson here. We've got a little public service announcement.
Indeed! If you're feeling personally victimized by mosquitos, fear not! There's a solution.
Right by the street tree, you'll find a magical potion called "Mozzie Repellent." Spray it on, and those pesky bloodsuckers will be out of your hair—or should I say, out of your skin.
So, dear audience, don't let the mozzies dull your night. Arm yourselves with the mozzie repellent, and tell those pests to buzz off
We're here to brighten up your night, don't let those tiny vampires ruin it!

Step 5: Sequencing.
This was the usual xLights affair, start a sequence, select the MP3, select FPS, create a timing track, import the lyrics - I chose to import them all into one timing track, get all the phrases lined up then split it into two timing tracks, one for Lumie, one for Watson before breaking down the phrases into words.

I noticed that when I got to breaking down the phrases that xLights was having troubles with a couple of the words, which resulted in this thread after a couple of hours digging.

I took some time to translate what few creative directions ChatGPT suggested into lighting effects and in my "all the things no matrix" group I added a couple of Shockwaves running in reverse cantered on the nearest prop to where the mozzie spray was placed timed to "Right by the street tree"



Step 6: FPP
This year I'm running my playlists fairly loosely grouped by age (That is Bluey vs Bublé) but each list is shuffled every play so it wasn't as simple as inserting this into a specific spot on the playlist. I've also noticed that most people miss at least part of the first song so I didn't want to just shove it in the Lead In section so what I ended up doing was creating an Intermission playlist and writing a little PHP script (I could have done it in pure bash using `fpp -s` but I have at least one track with commas in it and it just made it difficult to work with)

PHP:
#!/usr/bin/php
<?php
    /*
     * Args:
     *   -i Intermission playlist (Defaults to Intermission)
     *   -s Start index (defaults to -1)
     *   -e End index (defaults to -1)
     */
 
    $options = getopt("i:s:e:");

    $host  = "localhost";    # Host/ip of the FPP instance

    $intermissionPlaylist = isset($options["i"]) ? $options["i"] : "Intermission";
    $intermissionStartIndex = isset($options["s"]) ? $options["s"] : "-1";
    $intermissionEndIndex = isset($options["e"]) ? $options["e"] : "-1";

    $statusStr = do_get("http://$host/api/fppd/status");
    $status = json_decode($statusStr);

    if ($status->status == 1 && $status->current_playlist->index == 1 && $status->current_playlist->playlist != $intermissionPlaylist) {
        $json = json_encode([
            "command" => "Insert Playlist After Current",
            "args" => [
                $intermissionPlaylist,
                $intermissionStartIndex,
                $intermissionEndIndex,
                false,
            ]
        ]);

        echo do_post("http://$host/api/command", $json);
    }

    function do_get($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        return curl_exec($ch);
    }

    function do_post($url, $data) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        return curl_exec($ch);
    }

Briefly what this script does is checks if the currently playing sequence is in a playlist, is #1 in that playlist and the playlist isn't the Intermission playlist before injecting the intermission playlist after the current song. It's really cool, FPP jumps to that new playlist, plays the sequence then jumps back, if you have more than one sequence in the Intermission playlist you just pass -s and -e to limit it to playing whichever sequence(s) you want.

Once I uploaded the script to FPP I created a Command Preset for `SEQUENCE_STARTED` that runs the script
 
Last edited:

MikeKrebs

Full time elf
Joined
Dec 8, 2014
Messages
167
Cool!

But I hear Midwestern American accents. Maybe you could re-record with a little more Australian accent?
 

Freman

Uh Oh Elf
Generous elf
Joined
Aug 9, 2021
Messages
118
Top