# Ulyd v3 – p5.js Recreation
This project is a recreation of the original Flash-based `ulyd-v3.swf` interactive sound art piece, made in 2005, rebuilt using modern web technologies (p5.js). Also expanded to include Spatial Audio, changing pitch based on placement of the samples.
## About the Project
Ulyd v3 is an interactive sound sequencer. It features a vertical scanning line that triggers sounds when it passes over objects placed in the main area.
### Features
– **Scanner**: A white line scans down the screen, triggering sounds.
– **Pool**: A collection of sound objects on the right side.
– **Drag & Drop**: Users can drag objects from the pool into the scanner area.
– **Spatial Audio**: Sounds are modulated based on their horizontal position:
– **Left**: Lower pitch, panned left.
– **Center**: Normal pitch, centered.
– **Right**: Higher pitch, panned right.
– **Reactive Backgrounds**: The background atmosphere shifts and fades randomly when sounds are triggered.
– **Sound Groups**:
– **Yellow Icons**: Bright ping sounds.
– **Silver Icons**: Glass/Sonar sounds.
## Technical Details
– **Library**: [p5.js](https://p5js.org/) for graphics and interaction.
– **Audio**: [p5.sound](https://p5js.org/reference/#/libraries/p5.sound) for audio playback and effects.
– **Compatibility**: Works in all modern browsers (Chrome, Safari, Firefox). Includes fixes for Safari’s strict audio autoplay policies.
## How to Embed
1. Upload the contents of this folder to your web server.
2. Use an `<iframe>` to embed `index.html` on your page.
3. Ensure the `allow=”autoplay”` attribute is set on the iframe.
“`html
<iframe src=”path/to/index.html” width=”100%” height=”600″ style=”border:none;” allow=”autoplay”></iframe>
Script to decompile all .swf in a folder using ffdec:
extract_all_swfs.sh
#!/usr/bin/env bash
# --- Usage ---
# ./extract_all_swfs.sh /path/to/swf_folder
# Output will go inside subfolders: swf_folder/<filename_without_ext>/
SWF_DIR="$1"
if [ -z "$SWF_DIR" ]; then
echo "Usage: $0 /path/to/folder_with_swfs"
exit 1
fi
if [ ! -d "$SWF_DIR" ]; then
echo "Error: '$SWF_DIR' is not a directory."
exit 1
fi
# --- Check for Java ---
if ! command -v java &> /dev/null; then
echo "Error: Java is not installed or not in PATH."
echo "Please install Java (e.g., 'brew install openjdk')."
exit 1
fi
# --- Download JPEXS Free Flash Decompiler (jar only) ---
JAR="ffdec.jar"
ZIP="ffdec.zip"
if [ ! -f "$JAR" ]; then
echo "Downloading JPEXS Free Flash Decompiler..."
curl -L -o "$ZIP" \
"https://github.com/jindrapetrik/jpexs-decompiler/releases/download/version24.1.1/ffdec_24.1.1.zip"
echo "Extracting JPEXS Free Flash Decompiler..."
unzip -o -q "$ZIP"
rm "$ZIP"
# Clean up unused files from the zip
rm -f CHANGELOG.md Icon.icns com.jpexs.decompiler.flash.metainfo.xml \
ffdec ffdec-cli.exe ffdec-cli.jar ffdec.bat ffdec.exe ffdec.sh \
icon.ico icon.png license.txt soleditor.bat soleditor.sh \
translator.bat translator.sh
fi
echo "Starting batch extraction..."
echo
# --- Loop through all SWF files ---
for SWF_FILE in "$SWF_DIR"/*.swf; do
[ -e "$SWF_FILE" ] || continue # Skip if no SWF files found
BASENAME=$(basename "$SWF_FILE" .swf)
OUT_DIR="$SWF_DIR/$BASENAME"
echo "Processing: $BASENAME.swf"
mkdir -p "$OUT_DIR"
# Extract scripts
java -jar "$JAR" \
-export script \
"$OUT_DIR/script" \
"$SWF_FILE"
# Extract images
java -jar "$JAR" \
-export image \
"$OUT_DIR/images" \
"$SWF_FILE"
# Extract sounds
java -jar "$JAR" \
-export sound \
"$OUT_DIR/sounds" \
"$SWF_FILE"
# Extract all resources
java -jar "$JAR" \
-export all \
"$OUT_DIR/all" \
"$SWF_FILE"
echo " → Extracted into: $OUT_DIR"
echo
done
echo "Batch extraction complete!"