Commit Graph

190 Commits

Author SHA1 Message Date
b1rdmania 60a4b6af22 chore: add footer links
Add GitHub and author links (GitHub + X) to the bottom of the main page.

Made-with: Cursor
2026-03-15 10:48:21 +00:00
b1rdmania b37dd389a6 chore: remove MP3 download UI
Remove the Download MP3 button and all related client-side export logic.

Made-with: Cursor
2026-03-05 18:52:49 +00:00
b1rdmania bbaee43c74 fix: make mp3 export resilient to async gesture loss 2026-03-03 13:24:19 +00:00
b1rdmania 5dc9d026bc fix: simplify MP3 export to one-click download
Revert the multi-step save flow and export prompts. Always render the full song, encode to MP3, and trigger a direct download.

Made-with: Cursor
2026-03-03 12:21:17 +00:00
b1rdmania f9e2755721 fix: make prepared MP3 save work on macOS Safari
Avoid awaiting during the save click handler, and treat Safari desktop like iOS by opening the MP3 in a new tab instead of relying on <a download> for blob URLs.

Made-with: Cursor
2026-03-03 12:13:52 +00:00
b1rdmania 456db201e5 fix: make MP3 save work on iOS and allow full export
Offer full-song export via prompt and improve the fallback save path by using Share Sheet when available or opening the MP3 in a new tab on iOS, instead of relying on unreliable blob downloads.

Made-with: Cursor
2026-03-03 12:07:49 +00:00
b1rdmania 67dab9063a fix: make MP3 export feel responsive
Use the file save picker when available for a true single-click save, add encoding progress updates, and cap very long exports to avoid apparent stalls.

Made-with: Cursor
2026-03-03 11:58:07 +00:00
b1rdmania b2b8ebfd78 ux: clarify two-click MP3 download
Explain that MP3 export takes time and requires a second click to save, and make the ready-state button label explicit.

Made-with: Cursor
2026-03-03 11:55:50 +00:00
b1rdmania 9937f5a02a fix: make MP3 downloads reliable again
Use bundled lamejs instead of a CDN global, and avoid browser user-gesture download blocking by preparing the MP3 first and downloading on a follow-up click.

Made-with: Cursor
2026-02-27 15:41:07 +00:00
b1rdmania 5bd2493d90 docs: Update CLAUDE.md with security and UX improvements
- Document SSRF protection in scope
- Add security-first and deterministic behavior guidelines
- Update definition of done to include security validations
- Add Recent Improvements section (2026-02-05)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:30:38 +00:00
b1rdmania 5dddccb466 Merge security and parse fixes
- Add SSRF protection (block localhost/private IPs)
- Make MIDI parsing deterministic (real track analysis)
- Improve BitMidi outage UX (clear 503 + retry message)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:12:46 +00:00
b1rdmania 686c961fb3 ux: return clear BitMidi outage message and handoff notes 2026-02-02 23:39:29 +00:00
b1rdmania 5e81227907 security: block SSRF targets and make MIDI parse deterministic 2026-02-02 23:39:10 +00:00
b1rdmania 7a7a76a92b v2: Mute noise channel temporarily 2026-01-26 00:12:27 +00:00
b1rdmania f829e992c7 v2: Fix playback engine with progressive scheduling and gain tuning
- Add progressive note scheduling (2 seconds ahead) to prevent browser overwhelm
- Tune channel gains: pulse 0.12, wave 0.15, noise 0.02
- Reduce per-note noise gains for cleaner drums
- Re-enable arpeggiation for harmony tracks
- Limit to 8 channels max
- Add scheduler cleanup on stop
2026-01-26 00:10:48 +00:00
b1rdmania f095f9a2a7 Fix distortion with limiter and reduced gains
- Added DynamicsCompressorNode limiter at master output
- Reduced channel gains (pulse: 0.08, wave: 0.12, noise: 0.05)
- Disabled arranger by default (was adding overlapping notes)
- Total max gain now 0.66 with headroom for overlap
2026-01-20 20:05:32 +00:00
b1rdmania 5b294f2e5a Simplify audio chain - bypass all effects to fix distortion
- Bypass colorizer entirely (master -> destination directly)
- Remove wave channel lowpass filter
- Clean, direct audio path with no processing
- Should eliminate all distortion artifacts
2026-01-20 19:58:54 +00:00
b1rdmania 6dec8bf7cd Simplify v2 - remove GBC/GBA/Clean presets
- Removed sound mode buttons from UI
- Simplified colorizer to just one clean GB sound
- Less complexity, cleaner interface
2026-01-20 19:56:35 +00:00
b1rdmania dd4e1cfebd Fix clicky distortion - proper gain staging and reduced saturation
- Reduced channel gains: pulse 0.12, wave 0.18, noise 0.08
- Total max gain now ~1.0 instead of 2.7 (was clipping)
- More aggressive limiter: -12dB threshold, ratio 20
- Reduced saturation from 0.2-0.3 to 0.08-0.1 in all presets
- Should eliminate clicky distortion during playback
2026-01-20 19:55:03 +00:00
b1rdmania 9311e82538 Fix bass channel - warmer, less synthetic sound
- Use pure triangle wave for bass preset (warmest option)
- Reduce harmonics from 64 to 16 with gentle rolloff
- Add 2kHz low-pass filter to wave channel
- Route all wave sounds through filter for warmth
2026-01-20 19:50:55 +00:00
b1rdmania 42b65b2a30 Add STOP ALL button to v2-test.html with node tracking 2026-01-20 19:47:12 +00:00
b1rdmania 03738dd68c Disable phantom drum track and hi-hats in arranger 2026-01-20 19:45:37 +00:00
b1rdmania 7aa1d6f660 Fix stop button - track and stop all active audio nodes
- Track all oscillators/sources in APU activeNodes Set
- Add stopAll() method that immediately stops all tracked nodes
- Auto-remove nodes from tracking when they end naturally
- GameBoyPlayer.stop() now calls apu.stopAll()
2026-01-20 19:45:08 +00:00
b1rdmania e22431164f Add v2 pages to Vite build and Vercel routing 2026-01-20 19:38:59 +00:00
b1rdmania 5e127c3a3e Add v2 Game Boy sound engine (isolated from v1)
- Authentic DMG-CPU sound chip implementation:
  - 4 Pulse channels with duty cycle control (12.5%, 25%, 50%, 75%)
  - 2 Wave channels with 4-bit wavetables
  - 2 Noise channels with LFSR (7-bit and 15-bit modes)

- GameBoy Colorizer effect chain:
  - Low-pass filter (natural GB rolloff)
  - Bit-crushing (4-bit DAC simulation)
  - Sample rate reduction
  - Saturation and high-pass filter
  - Presets: DMG, GBC, GBA, Clean

- Intelligent MIDI processing:
  - Track analysis and role detection (bass, lead, drums, etc.)
  - Automatic channel mapping to GB channels
  - Chord arpeggiator for polyphony handling
  - GameBoy Arranger for fuller sound

- BitMidi search integration
- Completely isolated from v1 (no changes to src/)
2026-01-20 19:36:13 +00:00
b1rdmania 63bd71202a Add share buttons to play.html (share page)
- Copy Link and Share to X buttons on the shared player page
- Consistent Game Boy styling with main page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 13:22:32 +00:00
b1rdmania 5528aef7f8 Add Download MP3 button, bump to v1.5
- Download MP3 alongside Copy Link and Share to X buttons
- Offline rendering for faster MP3 exports
- Version history updated with v1.4 and v1.5 changes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 13:20:42 +00:00
b1rdmania 39e1e357ac Make README About section actually fun this time
WAH!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 13:00:27 +00:00
b1rdmania 6708911ec7 Update README About section to be more fun and punchy
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 12:59:32 +00:00
b1rdmania dd880c358d Use lamejs CDN instead of npm package
ESM compatibility issues with lamejs npm package - load from CDN instead.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 12:25:07 +00:00
b1rdmania 6cc0938bbf Fix lamejs import for MP3 encoding
Use static import instead of dynamic import to fix MPEGMode undefined error.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 10:35:32 +00:00
b1rdmania 2492ab833a Add offline MP3 rendering, Game Boy styling for UX test, fix 16-bit → 8-bit
- Add renderOffline() to SynthesisEngine for faster-than-realtime audio rendering
- Add renderOffline() to MotifEngine wrapping the synthesis engine
- Update ux-test.html MP3 download to use offline rendering (no more real-time capture)
- Restyle ux-test.html with Game Boy LCD aesthetic to match main site
- Fix "16-Bit" to "8-Bit" across all titles and share cards (Game Boy is 8-bit!)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 10:32:27 +00:00
b1rdmania d43b3d5daf Add Wario sprite to play page footer
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:04:46 +00:00
b1rdmania 853dbaa345 Update Share to X tweet format
New format:
I made a Game Boy version of [song]
Using @b1rdmania's Wario Synthesis Midi Engine
Check it out here [link]

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 12:03:07 +00:00
b1rdmania 044182790e Update social share image to warioX.png (landscape)
New image optimized for Twitter cards (1472x704).
Updated all OG/Twitter meta tags across index, play, and server.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 11:58:51 +00:00
b1rdmania f5fdc546bc Update live demo link to www.wario.style
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:57:05 +00:00
b1rdmania 69094c9d86 Update branding: Wario Synthesis Engine 16-Bit Midi
Consistent title across README, page titles, and social previews.
Tagline: Turn any song into a Game Boy version.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:56:28 +00:00
b1rdmania f69a022afd Clean up repo for public release
Removed:
- Old planning docs (DEPLOYMENT.md, IMPLEMENTATION.md, etc.)
- Dev notes (thursday-aims-progress-problems.md)
- Old backup files (main-simple.ts, main-working.ts)
- Test file (test.html)
- Unused image (chiptune_blog_piece_1000x.webp)
- docs/ folder with old audit/plan docs

Updated:
- Renamed claude.md to CLAUDE.md
- Added .claude/ to gitignore

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:25:21 +00:00
b1rdmania a1ec61bf6e Tidy up README with images and correct links
- Add logo and Wario images
- Update to correct production URL
- Simplify and reorganize sections
- Add Game Boy sound chip explanation
- Add tech stack and credits

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:22:06 +00:00
b1rdmania e22ec74a14 Match FAQ style to Version History (dark bg, light text)
More consistent and easier to read.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:14:30 +00:00
b1rdmania 996bd6b3f9 Replace Bluetooth with Focus mode in iOS audio tips
Focus mode is more likely to cause unexpected audio silencing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:13:14 +00:00
b1rdmania 06063339c3 Expand iOS audio tips: silent, volume, Bluetooth
Covers the three most common reasons for no audio on iPhone.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:12:22 +00:00
b1rdmania ef6b5bde5f Update iOS audio banners to mention silent mode
Tells users to make sure iPhone is not on silent before enabling audio.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:11:21 +00:00
b1rdmania 0b952424c3 Add iOS audio unlock banner to play page
Shows "Tap to enable audio on iOS" banner on iOS devices.
Hides automatically once audio is unlocked via button or play.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:41:15 +00:00
b1rdmania dc1126bdc8 Add fallback for iOS share when copy fails
When clipboard copy fails, shows a text input with the share link
so users can manually select and copy it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:37:06 +00:00
b1rdmania 7dcc233445 Add immediate visual feedback on search click
Status updates to "Starting search..." immediately when button clicked,
before async operations. This will help diagnose if JS handler is running.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:35:14 +00:00
b1rdmania cb9ea7bcc9 Add debugging logs and error handling for iOS issue
Wraps app initialization in try/catch to display errors.
Adds console.log at key points to trace what's happening.
Catches and displays errors from search handler.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:33:46 +00:00
b1rdmania 602b36fc7a Add feedback when search clicked with empty input
Previously clicking Search with no input silently did nothing.
Now shows "Enter a song name to search." and focuses the input.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:32:07 +00:00
b1rdmania 5b51527e86 Reorder Version History: How it Works at top
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:29:49 +00:00
b1rdmania 8406966928 Update status message to be clearer and more concise
Changed from "Ready. Enter a song to run it through our Wario 16-Bit Engine and make a new version." to "Ready. Search any song to make a Game Boy version."

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 16:27:17 +00:00