Files
tokyo-wangan-racing/docs/ROTARY_SOUND.md
T
jesse 1891f3f11d
CI / quality (push) Successful in 49s
RX-7 rotary loops: extracted from the owner's real car footage
- Sourced from c-finished-videos/2026-07-10 sessions (the actual FD)
- Scanned 6 min of audio per-second for RMS/dominant-freq/spectral
  flatness; picked the most tonally-stable stretches (idle: 272-288s
  @ ~99Hz flatness<0.02; rev: 319.5-327s @ ~105Hz, louder)
- Zero-crossing trim + 150ms equal-power tail-to-head crossfade =
  seamless loops (seam jump 0.001 / 0.005); normalized to -3dBFS
- Shipped as assets/audio/rx7_idle_loop.ogg + rx7_rev_loop.ogg (236KB);
  wav masters mirrored to NAS 001-1993 Mazda RX-7/sound/
- ROTARY_SOUND.md updated: only Studio upload + 2 asset IDs remain
2026-07-22 01:59:29 -04:00

101 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Status: loops are BUILT ✅ — awaiting Studio upload
Real 13B loops were extracted from the owner's own drive footage
(`/mnt/user/data/c-finished-videos/2026-07-10/`, same car) and processed on the
workstation. They live at:
- `assets/audio/rx7_idle_loop.ogg` — 15.9 s steady idle (~99 Hz fundamental,
scanned as the most tonally stable stretch of the session; seam jump 0.001)
- `assets/audio/rx7_rev_loop.ogg` — 7.4 s held higher-RPM pull (~105 Hz,
louder section; seam jump 0.005)
- Masters (`.wav` + `.ogg`) mirrored to the NAS:
`.../001-1993 Mazda RX-7/sound/`
**Remaining (owner, in Studio): upload the two `.ogg` files** (Asset Manager →
Import, or Creator Dashboard → Audio), wait for moderation, then paste the two
asset IDs into `CAR_SOUNDS.rx7_fc` in `src/client/SoundController.luau`.
If a longer/angrier rev is wanted later, more source material exists in the
other sessions under `c-finished-videos/` — the extraction is repeatable
(method below).
---
# Pipeline reference (how the loops were made / how to redo them)
The RX-7 must sound like a rotary. The pipeline: the owner's own recordings →
processed into two seamless loops on this workstation → uploaded in Studio →
IDs pasted into `SoundController.CAR_SOUNDS`.
## What the game needs (two loops)
| Loop | Content | Length |
|---|---|---|
| **Idle** | Engine idling, steady. The rotary lope/brap at rest. | 5–10 s |
| **Rev** | Held at steady mid-high RPM (~4–6k), NOT a sweep. | 5–10 s |
Steady-state matters: the game pitch-shifts and crossfades these, so a loop
recorded during rising RPM will "wander" audibly. A long recording containing
steady sections is fine — the good seconds get cut out in processing.
## Step 1 — Record (or use existing video)
Any source works: phone video, GoPro footage, a Zoom H5 recording. Existing
videos of the car are fine — audio gets extracted. Best results:
- Record OUTSIDE the car, mic a few feet from the exhaust.
- Get ≥10 s of steady idle and ≥5 s of held revs.
- Avoid wind over the mic and people talking.
Drop the files on the NAS next to the reference photos:
```
unraid-1:/mnt/user/data/yy-roblox-games/0-fast-n-furious-sim/001-1993 Mazda RX-7/sound/
```
## Step 2 — Process into seamless loops (this workstation)
Hermes does this — the box already has ffmpeg + numpy/scipy (`avsync-research`
venv). Ask and it happens; for reference the recipe is:
1. Extract audio: `ffmpeg -i clip.mp4 -vn -ac 1 -ar 48000 raw.wav`
2. Find a steady window (visually via spectrogram, or scripted RMS/pitch scan).
3. Cut the loop at zero-crossings and apply a short equal-power crossfade from
the tail onto the head so the seam is inaudible:
loop-body + (last ~150 ms faded out, overlaid on first ~150 ms faded in).
4. Normalize to about -3 dBFS peak, export `.ogg` (smaller upload, Roblox-native):
`ffmpeg -i loop.wav -c:a libvorbis -q:a 6 rx7_idle_loop.ogg`
5. Verify: play the file on repeat (`ffplay -loop 0`) — no click, no wander.
Outputs: `rx7_idle_loop.ogg` + `rx7_rev_loop.ogg`, copied back to the NAS
`sound/` folder and kept in `assets/audio/` locally (small enough to commit).
## Step 3 — Upload in Studio (owner)
1. Studio → **View → Asset Manager → Import** (or the Creator Dashboard →
Development Items → Audio) → upload both `.ogg` files.
2. Audio uploads require an ID/phone-verified account; private audio uploaded
to YOUR account is playable in YOUR experiences — exactly our case.
3. Copy each asset ID after moderation clears (usually minutes).
## Step 4 — Wire in
In `src/client/SoundController.luau`, uncomment and fill:
```lua
local CAR_SOUNDS: { [string]: EngineSounds } = {
rx7_fc = {
Idle = "rbxassetid://<idle id>",
Rev = "rbxassetid://<rev id>",
},
}
```
Rebuild, playtest, adjust `IDLE_PITCH_*` / `REV_PITCH_*` / `CROSSFADE_*` to
taste. Done — the RX-7 braps.
## Why not a toolbox rotary?
Searched; candidates exist (e.g. "13B ROTARY ENGINE SOUND", id 118059219867199)
but can't be auditioned outside Roblox (asset downloads require auth), most are
short unloopable rips, and rights are murky. The owner HAS the real car — its
actual engine is strictly better than any stranger's rip. Toolbox is the
fallback only if recording proves impractical: audition in Studio before
committing to one.