Published using Google Docs
Jenga-Speaker Report
Updated automatically every 5 minutes

Jenga-Speaker

By

Samuel Brian Courtney

Final Project Report

MUE 601: Transducer Theory

May 6th, 2026

©


Section I - Design

Seeking ideas for unique entries to the AES student competition, I decided to build a staggered looking hifi speaker tower, resembling Jenga-blocks. The build out was not completed in time for its submission to the competition. The build continued on for its original purpose: The final project for MUE 601 (Transducer Theory) at the University of Miami.

Restricting the baffle to the Jenga-look meant specific design constraints:

From those constraints, an initial hand-drawing was performed for visualization:

Simulations

The bulk of the design process was completed via matlab simulation & python scripting. This subsection will describe what each script provided.

I - scrape_pe.py

Scraped the part’s express website for all parameters and info such as in-stock/price.

II - scrape_lsdb.py

Scraped the loud speaker database. For future students who want a more updated csv, I’d recommend just reaching out to them and asking for the data. The PE scrape ended up being more useful anyways, since even when I’d find a nice driver for my enclosure dimensions from the LSDB, it wouldn’t be purchasable.

III - choose_drivers.m 

Given I put a hard aesthetic constraint, this script assisted in choosing enclosure dimensions, driver sizes, and then giving an immediate two dimensional mock up of said dimensions.

Utilizing the parts express database, all driver’s that meet user’s set size, type, and price, have their QTC’s calculated for the enclosure they qualify for. The best QTC’s, woofer f3 frequency are then presented in the script output. Additionally, woofer & mid & tweeter drivers are paired if they’re within 3 spl of each other. Finally, a combined price for the combo is calculated.


A visualization of potential crossover for the best driver combination is also provided.

Tweaking different parameters, and seeing the 2d visualization change in real time, is how I ended up with:

Sizes (W×H×D in inches):

Low Baffle: 17×17×14

Mid Baffle: 15×12×14

High Baffle: 12.5×9×14

Drivers:

Woofer: Dayton DC300-8, 12", $63, fs=22.9 Hz, Qts=0.33, Vas=181.5 L, Qtc=0.71 in 39 L sealed

Mid: Visaton BG17-8, 6.5", $29, fs=120 Hz, Qts=0.74, Qtc=0.84 in 19 L sealed

Tweeter: Visaton G25FFL8, 1", $98, fs=1600 Hz

3/4" MDF was chosen for its increased acoustic damping over both standard and baltic birch plywood.

IV - ported_design.m

Meant to extend choose_drivers into porting, but I opted to stick with my sealed enclosure.

V - cut_list_drawing.m

Generates a visual of the cutting list for the wood.

VI - Assembly Visualizer

Shows what an assembled version of the speaker would look like with my cut dimensions

VII - calculate_stuffing.m

Meant to calculate how much stuffing is needed for each enclosure. The result I got for the mid enclosure ended up being physically unrealistic (25oz). I was able to fit about 15.2oz instead, dropping mid effective Vb from 29.0 L to 38.0L,  QTC from 0.84 to ~0.82, and fc from 142 Hz to ~133hz.

VIII - wire_path_visualizer_v2

A script for visualizing how I might place my wires, and where I may place window braces

IX - Time_alignment_calculation.m

Script for considering forward and backward box offsets to counter delay from different driver distances. Opted for DSP delay instead.

X - dsp_delay_calculation.m

Calculates how much each driver is to be delayed based on distances to listening position. The horizontal offsets of each baffle are also considered in this calculation.

Bracing

Each enclosure gets one window brace: a flat MDF panel with a center hole, glued flush to all four interior walls at mid-depth (D/2 = 7"). The single panel does two jobs in one piece. It ties the four walls together so the side and top/bottom flex modes both get killed, and it breaks the 14" depth into two 7" sections. The rule of thumb I used was 8–10" max unsupported wall span before resonance becomes audible in the passband; 7" sits under that. The DC300-8's motor depth is 5.18", which leaves about 1" of clearance at the brace plane. I checked that before fixing the brace position. Strips for the braces came from offcuts ripped to 2" × 3/4", so the cabinet shop didn't need to order extra MDF.

Electronics

Signal path inside each tower: AC mains comes in through a Qualtek 719W-UEL3BR51 IEC C14 inlet with integrated 2 A slow-blow fuse and switch, runs to a Mean Well LRS-150-24 SMPS, and feeds 24 V DC into the KABD-430's J6 Molex connector. Audio comes in via a Neutrik XLR-female panel mount and runs internally to the KABD's J13 line input on RCA. Stereo gets split at the source instead of inside the tower: the left tower carries L only, the right tower carries R only, so each tower has one balanced mono input. The KABD-430 has an ADAU1701 DSP and a 4-channel class-D amp (TPA3118D2) on one board, rated 30 W/channel into 8 Ω at 24 V. Three of the four output channels drive woofer, mid, tweeter (BTL output, so each driver needs its own two-wire run with no shared grounds), and the fourth channel sits unused. Programming runs over the Dayton KPX USB programmer with SigmaStudio on a Windows machine. The original plan was a custom PCB with an INA134 balanced-input stage, the ADAU1701, a TPA3251 power amp, and separate ±15 V and 36 V rails. I swapped to the KABD after losing several days to the custom layout and not seeing a way to make the deadline.

Time Alignment

Driver centers from the floor: woofer 8.5", mid 23", tweeter 33.5". Horizontally measured from the woofer center: woofer 0, mid −3", tweeter +3", so the mid and tweeter are 6" apart. The 3D path lengths from each driver to the listening seat aren't equal, which means arrival times aren't either. There's no way to make them physically identical since the drivers can't share a point in space. Two ways to compensate: physically slide one or two of the enclosures backward in the stack so the path lengths come out equal, or apply per-channel delay in DSP. I went with DSP delay because shifting individual enclosures backward would break the front-face line of the stack and hurt the look. I'd only displace an enclosure physically if the offset added something to the aesthetic, and the offsets I'd need don't.

Section II - Analysis

Enclosed Driver Measurements

All drivers were measured within their respective enclosures after full assembly of the speaker. The towers were measured in place. The UMIK-1 measurement microphone was placed on-axis to each driver, 1 cm from the cone. Measuring this close keeps the driver's direct output far above the noise floor, so the computer's cooling fan and the need to stay quiet for neighbors don't corrupt the result and the source can be run at a low level. Source level was re-checked per driver rather than held constant, so each sweep sits at a different SPL; level trims were taken from spec-sheet sensitivities instead. The crossover frequencies and the per-driver EQ settings were all read off these measurements.

Right Bass Driver

Left Bass Driver

Note the strong break up towards 400hz. A peaking EQ (PEQ)  of −2 dB, Q = 4 @ 211 Hz was decided from this measurement.

Right Mid Driver

Left Mid Driver

Note the erratic activity towards 3k. A PEQ  of +3 dB, Q = 1.75 @ 886 Hz was decided from this measurement.

Right High Driver

Left High Driver

A PEQ  of -3 dB, Q = 7.5 @ 15 kHz was decided from this measurement.

A gated speaker measurement could have also been employed, though measuring in place for this DIY project made more sense, as the speaker towers had climbed to 100+ lbs at this point. So the measurements above 1 kHz can be considered loose.

Crossover Programming

The crossover ended up active 4th-order Linkwitz-Riley (−24 dB/oct), running as cascaded biquads in the ADAU1701 via SigmaStudio. Both points were picked from REW Phase 1 measurements of the drivers in the finished cabinets. Woofer-to-mid landed at 220 Hz; mid-to-tweeter at 2 kHz. The original plan had targeted ~300 Hz and somewhere in the 2.5–4 kHz range, but the actual clean regions from the sweeps were tighter than expected: the woofer ran clean up to about 270 Hz, the mid was clean from 209 Hz to roughly 2.7 kHz, and the tweeter only became clean from about 2 kHz up. 220 Hz puts the woofer at −12 dB by the time it hits its bad region; 2 kHz puts the mid at about −14 dB by 2.88 kHz. Both points fall inside the overlap of two clean driver regions.

SigmaStudio Signal Flow

The program loaded onto each KABD-430's ADAU1701 is one mono-in, three-out chain built in SigmaStudio. The J13 line input enters as a single channel, goes through a master gain block at 0 dB, then splits into three parallel driver paths. Each path starts with its crossover filter: a low-pass for the woofer, a high-pass and a low-pass for the mid, a high-pass for the tweeter. After the filter comes a PEQ that was tuned based on the measurements. The woofer and tweeter paths then carry an output level block based on the spec sheets, while the mid has none, since it sits at 0 dB as the level reference. The mid and tweeter paths carry a delay block, while the woofer has none, since it is the delay reference. Each path then ends with a bypassed polarity-inversion block before its DAC channel. All filter and PEQ blocks run as double-precision biquads, and the filter slopes, EQ settings, delays, and levels match the values in the Crossover and Time alignment subsections. The program is compiled and written to the board's EEPROM over the KPX programmer.

Final Sweep From Listening Position

Left Jenga-Speaker

Right Jenga-Speaker

The full-range sweep was captured at the listening position (~4 m). This is the in-room response: the loudspeaker's direct sound plus the room's modal and reflected field. The result is visibly noisy for two reasons. Below the room's transition frequency, the large peaks and nulls are room modes (standing waves), which are position-dependent and inherent to the room, not the loudspeaker. Across the rest of the band, resolution is limited by the measurement signal-to-noise ratio: the sweep reached ~74.5 dB at the microphone against a ~50 dB ambient noise floor, leaving roughly 24.5 dB of usable range, so deep nulls and the frequency extremes sit in the noise.

Build-out progression photos