Madame Leota

ElectronicsSeptember 2024

A happy haunt

My favorite attraction at Disney World is The Haunted Mansion. I love how an attraction built more than 50 years ago still feels fresh and magical. I love the Omnimover ride system. And I love the constant stream of gags that make the ride magical.

My favorite scene is the séance with Madame Leota appearing in her crystal ball as she summons the mansion's ghosts with a spell. It marks the transition from creepy happenings to full blown ghost hijinks.

For several years now, we have undertaken elaborate Halloween costume projects. This year, we decied to take a break. Instead, we did an elaborate Halloween display: a tabletop version of the Madame Leota scene.

Pre-production

There's a wonderful history to Madame Leota in all of her various incarnations (heh). The effect has seen several revisions over the years including the current version which uses internal digital projection to allow the crystal ball to float. If you're interested in the history, check out Doombuggies and Long Forgotten for a way, way, WAYYY more in-depth look.

The basic method for the original version is a 16mm film loop of Leota Toombs projected onto the surface of a white sculpted head. I decided to attempt a version of that effect.

I tested the basic projection in June of 2024. I 3D-printed a human head model and projected an archive video of the original seancé speech (voiced by Eleanor Audley) onto it to see if it would work.



The results were very compelling. Even just by holding the projector by hand, in broad daylight, with no other decoration, the effect worked. You could see Madame Leota right there in front of you. I started planning the whole project in earnest.

One of my first tasks was to put together a mockup in Blender. This was based on projector throw measurements I took during the first test and on the size of a long table we had available.

I continued to update this mockup as the project continued so I could visualize and design various components like the globe stand.

The Plan

To make my Leota display I needed a few basic things:

  • a projector and head (which I had from the test)
  • a wig
  • a clear globe
  • a stand for the globe
  • a table
  • something to hide the projector
  • other decorations as needed

When I started, it wasn't totally clear what all of these things would be, how "ride accurate" they needed to be, and how expensive they might end up being.

Goals

To guide the process I established some early goals.

  1. This was supposed to be a break from crazy costumes, so the whole build should be as low stress as possible. This meant starting early, planning carefully, and saying no to some things to keep the scope reasonable.
  2. Similarly, I wanted to keep the cost reasonable. This meant using materials and supplies that we already had from past projects, and spending as little as possible on new items.
  3. Be as "ride accurate" as possible while meeting the first two goals.
  4. I wanted the display to be at full scale. No Little Leotas here.

A note on "ride accuracy"

The Haunted Mansion is not one ride, it's many different rides in both a geographic and historic sense. Attempting to pin down one specific version of the séance scene is tricky. Matching it exactly was never really on the table, so to speak. However, wherever possible, I tried to capture the details as closely as I could.

The Board

My wife, Sarah, was a great partner with this project and together we built out a Trello board to track the various tasks that needed to be done to complete it.

The Crystal Ball

The key component of the effect is Madame Leota's face glowing from inside of a clear ball, surrounded by a wild tangle of hair. The ball sits on an ornate metal stand.

Globe

There are not many places to get a clear globe big enough for a human-sized head. Some ideas I considered included using two clear salad bowls glued together or finding some sort of spherical fish bowl, or to get a vacuum former and make one myself. None of the options fit the quality level or price limit I had set for the project.

While it ended up being the most expensive single item of the build, I bit the bullet and bought a 16" clear acrylic globe used for street lamps. It was large, perfectly spherical, and had no marks, blemishes, or seam lines.

The globe's hole was only 5" in diameter so I enlarged it with a foam cutter (after destroying my rotary tool trying to cut it).

The head was a 3D print which I sanded and painted with white acrylic. Notably, the model I used has very soft features. This works great for the projection as it does not cast sharp shadows around the eye or mouth area, which is an issue with other human head models. The model did have a sharp line around the bottom of the neck so we glued a bit of folded fabric there to soften it.

Stand

In order do initial testing of the whole assembly I needed something to hold the globe up. I quickly threw together a 3D-printed stand for it.

While it did support the globe, it failed at all of the other things I needed it do:

  • Look good, ideally like the stand featured in the ride
  • Hold the globe and head high enough for the projector to hit it from a low angle
  • Provide support for the head

I went back to Blender and designed a new stand based on the curled metal shapes seen in the ride. The legs surround a central core which is positioned so it can provide direct support to the head and wig assembly.

It was large, so I printed it in parts. I the glued them together with JB KwikWeld which is my go-to adhesive for 3D prints. It cures very fast and your print will break before the adhesive fails.

I gave the whole thing a coat of black acrylic then a layer of bronze. Finally, I weathered it using teal dry brushed in the cracks to show oxidation along with blots of more black acrylic. The result looks positively ancient.

I also printed a simple connector to marry the head to the stand. All three are joined with a single wooden dowel running through the whole thing which adds a lot of stability.

Wig

Madame Leota's wig is actually a pair of inexpensive "old lady" wigs stacked on top of each other. The bottom wig is glued on tight with upholstery adhesive while the top wig is pinned carefully to that. Sarah helped me style the hair. It took a surprising amount of work to fluff the wigs up appropriately so they filled up the globe. Also, shoving the globe down over them tended to flatten out any styling we did.

Our approach required first locking the styled hair down with costume wig spray then carefully pushing the globe down over it. Finally, we engaged in a sort of tag-team ship-in-bottle hair-fiddling to get things positioned properly. I bought a flexible plumber grabby-thing (sorry for all the technical jargon) which ended up being invaluable for this.

Fabric circle

The last part of the assembly is a simple black cloth skirt which surrounds the base of the globe. It is attached to the stand with some velcro. It serves to ensure that no errant wig hairs poke down through the bottom of the globe while still allowing access to the globe's interior, if needed.

The video

The key element of the visual effect is a projection of Leota Toombs' face delivering her iconic ghost summoning spell:

Serpents, and spiders, tail of a rat…
Call in the spirits, wherever they're at!

Rap on a table, it's time to respond…
Send us a message from somewhere beyond!

Goblins and ghoulies from last Halloween...
Awaken the spirits with your tambourines!

Creepies and crawlies, toads in a pond…
Let there be music from regions beyond!

Wizards and witches, wherever you dwell...
Give us a hint… by ringing a bell

A few different digitized versions of this are available online if you search. They generally feature Madame Leota on a black background and are of varying lengths. However, they weren't quite usable for our project right out of the box. Some have delays between the couplets, some add in their own special effects (for projects similar to ours), some loop the couplets many times for long-play formats.

To start, I chose a version which included all of the lines in a single pass of about 1 minute. This version featured no added effects apart form a very subtle crossfade between line deliveries.

I took this clip into DaVinci Resolve and performed several customizations.

Custom matte and stabilization

First, I added a custom matte around Madame Leota's face to remove the black background.

I also ran image stabilization to remove the camera jitter which is present in the original 16mm footage. Stabilization has a very noticeable effect on how real the resulting projection appears. It helps the image to appear locked onto the human head model.

Then, I carefully positioned and sized the plate so that it would line up precisely with the head model when projected from the desired throw.

Hair effects

I then added a background plate with several gradient layers merged together with animated noise and particles. This layer is projected onto the hair giving it a shimmery magical effect.

I added a custom matte to this layer so that I could limit the projection to just the head and hair and prevent any overspill behind the globe.

Audio cleanup

The video that I used had badly blown out audio which was unusable. I pulled a clean version of Madame Leota's speech from an archived version online. This version split the voice and the accompanying sound effects into the left and right audio channels which made it easy to separate them in the display by placing the speakers in different locations.

Video kiosk setup

To actually run the video I needed a device that could:

  • play a 1080p MP4 video over an HDMI port in fullscreen on a loop
  • download video updates over the network without having to swap SD cards or anything like that
  • fit on the table next to the projector
  • be gotten for cheap or for free

It was a simple choice, a Raspberry Pi was a perfect fit for this.

I setup a basic shell script on the Pi as a systemd service which plays the Madame Leota video on a loop using VLC.

#!/bin/bash
cvlc --no-video-title-show --aout=alsa --no-dbus -Rf /home/pi/leota/leota.mp4

All of the video elements were designed to be adjustable so I could tweak them as we completed various parts of the globe.

I included an additional script which fetches the latest version of the video from a specific location in an Amazon S3 bucket. This allowed me to easily update the video on the device remotely as soon as a new version was rendered. There was no need to mess with any of the installed hardware components.

Projector Mount

For early tests of the projection, I put the head and the projector on a pair of cheap gorilla-style camera mounts. This was fine for working out some basic metrics but they were not stable enough or adjustable enough to keep the projector aligned with the head properly.

The head position was handled by the improved globe stand. However, I needed something to keep the projector stable, while allowing for fine adjustments.

I tore apart one of the gorilla stands and designed a mounting plate to attach it to. I added four M4 bolts to the corners of the plate. These bolts act as friction points to prevent the mount from sliding on the tablecloth and they also allow for very fine adjustments of the projector's angle.

Bailey agrees that the gorilla mount is questionable, at best.

Speakers

I mounted a pair of inexpensive speakers under the table connected to the Raspberry Pi's 1/8" audio jack. One of them is below the globe and plays Madame Leota's speech. The other is below the plinth and plays the accompanying sound effects that punctuate her verses. The separated channels created an open soundscape and is very noticeable as you move around the display.

Everything is powered by a USB power bank with a single cable running under the table cloth out of sight.

The Spellbook and Plinth

The projector, Raspberry Pi, sound system, and power delivery all needed a place to sit, out of site of viewers. The projector especially needed to be hidden since it had to be placed directly in front of Madame Leota, between the viewer and the globe.

Different versions of the ride have tackled this in various ways. For our version, we decided to house the effect's guts underneath a strong visual element from the ride: Madame Leota's Spellbook.

Spellbook

Sarah crafted the spellbook more or less on her own. She started with a donor paperback which had been taking up shelf space for years. She wrapped it in craft paper and gave it a simple coat of brown acrylic to give it a vaguely leather-bound feel. Since the book was going to be displayed open, the outer cover did not need much detailing.

She then carefully sized and printed out the spellbook pages (1312 and 1313) in black and white. She hand colored them with colored pencil to match the reference photos.

Next, she weathered the pages and book together using a mix of coffee and tea. She tested several different staining methods first to find the best approach.

We sealed the whole thing in several layers of Mod Podge to protect it.

The final result is a gorgeous object in and of itself. However, the real magic is how it disguises the true purpose of the plinth.

Plinth

I built a box in the shape of a plinth out of spare cardboard and reinforced it with some corner bracing. I also reinforced the top and added a lip to the bottom edge so it could support the weight of the book. The top surface was hinged so it could lift up to reveal the electronics inside. I cut a hole in the back for the projector to shoot through. The bottom of the box was left open so that if it was bumped it would be less likely to mis-align the projector.

Finally, I wrapped the entire box in a dark wood grain contact paper and then blotted it all over with black acrylic to give it an old weathered look.

Gracey

A notable feature of the Haunted Mansion is the red-eyed raven that appears at several points along the ride. He is visible peering over Madame Leota's crystal ball from his perch atop her chair.

I had this creepy corvid in mind as we shopped for supplies at a local craft store. I stumbled upon a cool looking black raven decoration. As I held it in my hands I thought: "I can make this move!"

I spent the next few evenings hacking apart the poor bird and jamming him full of hot glue, servos, and wires. I didn't plan this guy out too much, just kinda felt it as I went. I used a spare Arduino Uno and servos to control the random motion of his head and body.

I also poked out his eyes and replaced them with glass raven eyes with red LEDs glued behind them.

Finally, I added an audio module with a speaker mounted inside of the plinth so he could squawk.

His code is a simple assortment of randomized timers controlling the head and body servos, blinking the eye LEDs, and triggering samples on the audio board.

//
// Gracey Raven Animatronic
// Jay Roberts
// 
#include <Servo.h>
// Pin definitions
const int HEAD_SERVO_PIN = 11;
const int BODY_SERVO_PIN = 12;
const int LED_PIN = 13;
const int SOUND_PIN = 8;
// Timing configurations (all in milliseconds)
const unsigned long HEAD_INTERVAL_MIN = 1000; 
const unsigned long HEAD_INTERVAL_MAX = 6000;
const unsigned long BODY_INTERVAL_MIN = 4000;
const unsigned long BODY_INTERVAL_MAX = 8000;
const unsigned long LED_INTERVAL = 3000;    // Time between LED blinks
const unsigned long LED_DURATION = 1000;    // How long the LED stays off when blinking
// Servo positions (in degrees)
const int HEAD_SERVO_MIN = 20;
const int HEAD_SERVO_MAX = 130;
const int BODY_SERVO_MIN = 0;
const int BODY_SERVO_MAX = 65;
Servo servoHead;
Servo servoBody;
unsigned long lastHeadServoMove = 0;
unsigned long currentHeadServoInterval = 1000;
unsigned long lastBodyServoMove = 0;
unsigned long currentBodyServoInterval = 1000;
int currentBodyPosition = 0;
unsigned long lastLedBlink = 0;
bool ledState = HIGH;
void setup() {
  randomSeed(analogRead(0));
  servoHead.attach(HEAD_SERVO_PIN);
  servoBody.attach(BODY_SERVO_PIN);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, ledState);
  pinMode(SOUND_PIN, OUTPUT);
  digitalWrite(SOUND_PIN, HIGH);
  servoHead.write(HEAD_SERVO_MIN);
  servoBody.write(BODY_SERVO_MAX);
  digitalWrite(SOUND_PIN, LOW);
  delay(500);
  digitalWrite(SOUND_PIN, HIGH);
  delay(5000);
}
void loop() {
  unsigned long currentMillis = millis();
  // Head turn
  if (currentMillis - lastHeadServoMove >= currentHeadServoInterval) {
    lastHeadServoMove = currentMillis;
    int newHeadPosition = random(HEAD_SERVO_MIN, HEAD_SERVO_MAX);
    servoHead.write(newHeadPosition);
    currentHeadServoInterval = random(HEAD_INTERVAL_MIN, HEAD_INTERVAL_MAX);
    // Blink eyes
    delay(random(500, 1000));
    digitalWrite(LED_PIN, LOW);
    delay(100);
    digitalWrite(LED_PIN, HIGH);
    // Sometimes, blink twice...
    if (random(0, 100) > 80) {
      delay(100);
      digitalWrite(LED_PIN, LOW);
      delay(100);
      digitalWrite(LED_PIN, HIGH);
    }
    // Sometimes squawk
    if (random(0, 100) > 80) {
      // Play crow sound
      digitalWrite(SOUND_PIN, LOW);
      delay(500);
      digitalWrite(SOUND_PIN, HIGH);
    }
  }
  // Body tilt
  if (currentMillis - lastBodyServoMove >= currentBodyServoInterval) {
    lastBodyServoMove = currentMillis;
    int targetBodyPosition = random(BODY_SERVO_MIN, BODY_SERVO_MAX);
    int step = (targetBodyPosition > currentBodyPosition) ? 1 : -1;
    while (currentBodyPosition != targetBodyPosition) {
      currentBodyPosition += step;
      servoBody.write(currentBodyPosition);
      delay(50); // Adjust this value to control the speed of movement
    }
    currentBodyServoInterval = random(BODY_INTERVAL_MIN, BODY_INTERVAL_MAX);
  }
}

I used black fabric with feathers cut into it to hide his various seams and holes. Sarah helped me make a cloth sleeve to hide his wires.

I mounted a custom-made shield onto the Arduino with a socket for an Adafruit Audio FX sound board. The sound board is loaded with archived samples from the original raven recordings done by Candy Candido.

I mounted the bird to a wooden plate covered in the same faux-wood contact paper as the plinth and there he sits offering a watchful eye and a warning "CAW!" to any foolish mortals passing by.

In the long tradition of the Haunted Mansion raven not having an agreed-upon name, I named ours "Gracey" after Yale Gracey, one of the Imagineers responsible for creating the ride's magical effects. Building raven-Gracey was one of my favorite parts of the project. I felt a small bit of kinship with, and a huge amount of respect for, the first Imagineers in the 1950s as I built my own audio-animatronic out of cheap, tiny, modern components.

Additional decorations

To round out the project we added a variety of low cost, low effort decorations in the spirit of the ride's presentation:

  • a victorian style table cloth with elaborate tassels
  • realistic (but safe, battery-operated) candles
  • a wall hanging adorned with the ride's iconic spooky purple wallpaper
  • a Haunted Mansion plaque

The table cloth was a particular area where we held to our goals and said "no". We started by looking for just the right material for a custom table cloth. We found some that was gorgeous and very close to our reference photos but the cost all together would have been twice that of the globe. We decided to go with a much cheaper and totally acceptable alternative.

Final result

The project was finished in under 75 hours spread out over a span of several months. The project was fully complete more than a month before Halloween. Additionally, the total cost was a fraction of last year's insane Godzilla costume. We consider our goals to have been fully met.

We are incredibly proud of the final result.



Come out to socialize

We're looking forward to giving out candy to all of the grim grinning ghosts that haunt our Madame Leota display on Halloween this year. Check back after to see how it ghouls..I mean goes.