Building a MIDI-over-Bluetooth app using Expo Modules
Key Points
- Custom Expo Module adds MIDI-over-Bluetooth
- Cross-platform parity via matching native APIs
- Real-device testing with WIDI Jack and motorized faders
Summary
A community-built React Native app (Expo) that manages and shares presets for Chase Bliss guitar pedals. The team implemented a custom Expo Module to add MIDI-over-Bluetooth so presets can be sent directly to pedals (tested with a WIDI Jack). The work covers a Proof-of-Concept on iOS, a port to Android with matching APIs, and a polished UI built with Reanimated + Skia + Gesture Handler.
Key Points
- Built a custom Expo Module to expose MIDI-over-Bluetooth native APIs to JavaScript; started with an iOS PoC then matched Android behavior.
- Used Expo plugins/modules to change native code while keeping the benefits of managed Expo workflows (no permanent native folders to maintain).
- Hardware tested with a WIDI Jack and Chase Bliss pedals (motorized faders demonstrated fast, observable state changes).
- UI uses Reanimated, React Native Skia and Gesture Handler for performant, animated knob/fader controls; values stay bound to reanimated values to remain smooth under JS load.
- Practical tips: keep native function names and behavior consistent across platforms, test all MIDI commands with real hardware, and provide clear onboarding for Bluetooth pairing and permissions.
- Ongoing work: finalize UX for getting started, complete MIDI-command coverage and testing, and prioritize feature roadmap without overcomplicating the interface.
Engineering considerations
- Use Expo modules and plugins to implement and ship native features while retaining the managed workflow.
- Ensure cross-platform parity by designing a stable native API surface and mirroring function names/behaviors.
- Validate with physical devices early and exhaustively (MIDI spec edge cases, timing, pairing flows).
- Keep telemetry minimal and privacy-first; collect only necessary anonymous insights.
Next steps before release
- Complete thorough MIDI command testing across pedal models.
- Add clear in-app onboarding and pairing instructions for users.
- Polish error handling, edge cases (lost connections, permission denials) and UX for discoverability.