Daniel Cho

Structural Dynamics / Vibro-Acoustics / Audio Hardware

I study how things vibrate, and how that turns into sound. My work sits between mechanical engineering, test engineering, and audio: experimental modal analysis, impact testing, and signal processing, applied to foams, guitars, and instruments I build myself.

About

I'm a Mechanical Engineering BS/MS student at WPI (Music Technology minor), working on structural dynamics, vibration testing, and signal processing. My thesis, advised by Prof. Zhu Mao, centers on statistical energy analysis (SEA) and shock response spectrum (SRS) model validation. I'm also helping him develop a graduate-level signal processing course.

This summer I was a LADSS Fellow at Los Alamos National Laboratory, where I designed experimental test methodology end to end for soft-material dynamic characterization: instrumentation, compression testing, impact excitation, full-field Digital Image Correlation, and post-processing to inform finite-element validation on Abaqus. Before that, I was an undergraduate research assistant on a PhD thesis project studying vibration damping in polymer foams, funded through Saint-Gobain. Under Prof. Mao at WPI's Laboratory of Intelligent Systems and Structural Dynamics (LISSD), I led guitar modal and acoustic analysis using impact hammers, modal shakers, accelerometers, and a Laser Doppler Vibrometer to understand how build quality, body deformities, and strings at different price points affect acoustic quality.

Outside the lab I lead Air Piano, a gesture-controlled MIDI instrument that began as a passion project and became my senior capstone.

Work

Air Piano

A gesture-controlled MIDI instrument, my senior capstone. I led mechanical and PCB design end to end: a parametric Onshape enclosure across multiple prototype revisions, and complete KiCad schematics for a Raspberry Pi Pico W, MCP3008 ADC, and USB-C MIDI interface.

Read more

As systems integrator across mechanical, electrical, firmware, and computer vision, I built real-time motion-to-MIDI mapping firmware with MediaPipe hand tracking (~14 FPS) and low-latency USB MIDI output, and worked through 12+ hardware and firmware failures along the way, mostly SPI timing and MIDI routing bugs.

Air Piano enclosure interior showing Raspberry Pi, display, potentiometers, and wiring Onshape CAD render of the Air Piano enclosure, solid view Onshape CAD render of the Air Piano enclosure, exploded view showing internal assembly
Published MQP paper

Guitar Acoustics & Modal Analysis

Led the full experimental workflow for guitar modal and acoustic analysis under Prof. Zhu Mao at WPI: configured impact hammer, modal shaker, accelerometers, and a Laser Doppler Vibrometer to measure structural vibrational response across body shapes, bracing, and tonewoods.

Read more

To understand how build quality affects acoustic quality, I bought guitars and strings at different price points, including instruments with cracks and deformities, and compared their frequency response functions and harmonic profiles. Extracted natural frequencies, damping ratios, and mode shapes with a Crystal Instruments DAQ and MATLAB (pwelch), the same vibro-acoustic techniques used in speaker, enclosure, and instrument design.

Acoustic guitar suspended in a free-free boundary rig for impact testing Guitar suspended under a Laser Doppler Vibrometer with a modal shaker attached Polytec PSV-500 scanning head aimed at a guitar body clamped for LDV scanning
Normalized power spectrum comparing nylon guitar strings at three price points on the low E note
View code
%% Impact test: normalized power spectrum across string price points%% === USER PARAMETERS === Fs = 40960; noverlap = 0; N_peaks_total = 10; %% === INPUT FILE === file = 'time_force241.mat', 'time_force243.mat','time_force247.mat'; %% === Load === data = load('time_force241.mat'); window_size = 265728; signal = data.(cell2mat(fieldnames(data))); signal = signal(2, :); % force row signal = signal(:); % column vector [pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs); figure; [pks, locs] = max(pxx); f(locs); y1= semilogy((2*f/(f(locs))),pxx, 'LineWidth', 2, 'DisplayName','$', 'color', '#0F33E0'); xlabel('Peak (#)'); ylabel('Power/Frequency (dB/Hz)'); title('Bad Guitar, Nylon String, Low E note'); grid on; xlim([0,10]); hold on %% === Load === data = load('time_force243.mat'); window_size = 236646; signal = data.(cell2mat(fieldnames(data))); signal = signal(2, :); % force row signal = signal(:); % column vector [pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs); [pks, locs] = max(pxx); f(locs); y2= semilogy((2*f/(f(locs))),pxx, 'LineWidth', 1.5, 'DisplayName','$$', 'color', '#FFEA00'); grid on; xlim([0,10]); %% === Load === data = load('time_force247.mat'); window_size = 236646; signal = data.(cell2mat(fieldnames(data))); signal = signal(2, :); % force row signal = signal(:); % column vector [pxx, f] = pwelch(signal, window_size, noverlap, window_size,Fs); [pks, locs] = max(pxx); f(locs); y3= semilogy((f/(f(locs))),pxx, 'LineWidth', 1, 'DisplayName','$$$', 'color', '#FF1901'); grid on; xlim([0,10]); hold off legend([y1 y2 y3],'$', '$$', '$$$');
LDV FRF magnitude with coherence overlay for guitar body modal testing
View code
%% LDV scan: FRF magnitude with coherence overlaymodal_data_good = readuff('Scan_modal_good_guitar_0721.uff'); figure; plot(modal_data{66}.x, abs(modal_data{66}.measData)); xlabel('Frequency (Hz)'); ylabel('Magnitude (mm/s^2/N)'); title('LDV Testing w/ Shaker on Good Guitar Body'); yyaxis right plot(modal_data{221}.x, abs(modal_data{221}.measData)); ylabel('Coherence'); ylim([0.55 1]);
Research poster

3x3 MIDI Grid

A smaller, 3x3-button MIDI controller I built before Air Piano, my first time coding and wiring a circuit outside of coursework. It was deliberately a sandbox: a lower-stakes place to break things and learn analog and digital signal basics before committing them to a much more complex build.

Read more
Finished 3x3 MIDI grid controller with nine buttons and two knobs
3x3 MIDI grid wiring connected to breadboard and Raspberry Pi Pico
View code
# CircuitPython: debounced button + smoothed pot MIDI firmwareimport time import board import digitalio import analogio import usb_midi import adafruit_midi from adafruit_midi.note_on import NoteOn from adafruit_midi.note_off import NoteOff from adafruit_midi.control_change import ControlChange BUTTON_PINS = [ board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8, board.GP9, board.GP10 ] PAD_NOTES = [ 45, 46, 47, 41, 42, 43, 37, 38, 39 ] NOTE_VELOCITY = 127 DEBOUNCE_S = 0.02 # 20 ms POT1 = analogio.AnalogIn(board.GP26) POT2 = analogio.AnalogIn(board.GP27) POT1_CC = 74 POT2_CC = 12 SMOOTH = 0.10 # lower = less lag DEADBAND = 6 # higher = no CC spam POT_DELAY = 0.01 # slower polling def adc_to_cc(v): return (v * 127) // 65535 midi = adafruit_midi.MIDI( midi_out=usb_midi.ports[1], out_channel=0 ) buttons = [] last_raw = [] stable = [] last_flip = [] t0 = time.monotonic() for pin in BUTTON_PINS: b = digitalio.DigitalInOut(pin) b.switch_to_input(pull=digitalio.Pull.UP) buttons.append(b) v = b.value last_raw.append(v) stable.append(v) last_flip.append(t0) p1 = adc_to_cc(POT1.value) p2 = adc_to_cc(POT2.value) last_p1 = p1 last_p2 = p2 while True: now = time.monotonic() # ---- Buttons (debounced) ---- for i, b in enumerate(buttons): raw = b.value if raw != last_raw[i]: last_raw[i] = raw last_flip[i] = now if (now - last_flip[i]) >= DEBOUNCE_S and raw != stable[i]: stable[i] = raw note = PAD_NOTES[i] if not stable[i]: # pressed midi.send(NoteOn(note, NOTE_VELOCITY)) else: # released midi.send(NoteOff(note, 0)) r1 = adc_to_cc(POT1.value) r2 = adc_to_cc(POT2.value) p1 = int((1 - SMOOTH) * p1 + SMOOTH * r1) p2 = int((1 - SMOOTH) * p2 + SMOOTH * r2) if abs(p1 - last_p1) >= DEADBAND: midi.send(ControlChange(POT1_CC, p1)) last_p1 = p1 if abs(p2 - last_p2) >= DEADBAND: midi.send(ControlChange(POT2_CC, p2)) last_p2 = p2 time.sleep(POT_DELAY)

Rice Husk Prescription Bottles

A biodegradable alternative to plastic pill bottles, made from rice husk composite. I designed and fabricated SolidWorks molds, FDM 3D-printed for casting, and the project was selected as the seminar's 2023 class winner for innovation in sustainable manufacturing.

Read more
CAD model of the prescription bottle mold used to cast the rice husk composite
Rice husk composite drying in the 3D-printed molds
Final molded rice husk composite disc, a biodegradable bottle material
Research poster Award announcement

Contact

Always happy to talk about structural dynamics, acoustics, or hardware. Feel free to reach out.