whistlegraph toolchain #
Pull a whistlegraph TikTok and read its musicality — the front of the pipeline that turns a whistled clip into a /pop track.
Usage #
cd toolchain/whistlegraph
node grab.mjs <tiktok-url> # download + analyze one clip
node grab.mjs --latest 3 # newest 3 from @whistlegraph
node grab.mjs --account @someone --latest
node grab.mjs <url> --redo # refetch + re-analyze
node grab.mjs --list # summarize downloads/INDEX.json
Each run:
yt-dlp→downloads/<account>-<id>.mp4ffmpeg→ mono 44.1k.wavanalyze.py(pop.venvlibrosa) → tempo, key, whistled-melody note sequence + onsets →<id>.analysis.json- updates
downloads/INDEX.json
What's tracked #
*.mp4 / *.wav are gitignored (reproducible from the URL). The small
*.analysis.json and INDEX.json are committed so the melody read
survives without re-pulling from TikTok.
→ /pop #
Take the key, tempoBPM, and melody[] from the analysis JSON and
compose bottom-up from AC instruments (never Suno end-to-end). See
pop/SCORE.md and pop/lib/.
⚠️ Re-posting these clips to Instagram #
grab.mjs pulls via yt-dlp, so the .mp4 usually carries the TikTok
watermark. As of Instagram's April 2026 originality expansion, visible
cross-platform watermarks make a Reel ineligible for recommendation to
non-followers — so a watermarked TikTok export posted to IG gets no
cold-start reach. If funnelling @whistlegraph clips to IG, re-render from a
clean (watermark-free) source, not the yt-dlp download. Background + sources:
social/research/instagram-official-guidance.md.