#!/usr/bin/env bash # ── Pi Multi-FX Pedal — Bluetooth MIDI Setup ─────────────────────── # Enables Bluetooth MIDI (BLE-MIDI) so wireless controllers, # expression pedals, and phone apps can send MIDI to the pedal. # # Usage: # sudo bash scripts/setup-bt-midi.sh # Interactive setup # sudo bash scripts/setup-bt-midi.sh --disable # Remove BT MIDI service # sudo bash scripts/setup-bt-midi.sh --pair-only # Just make it discoverable # # Requirements: # Built-in RPi Bluetooth, or USB BT dongle # bluez, bluez-utils (installed by this script) # ──────────────────────────────────────────────────────────────────── set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" DISABLE=false PAIR_ONLY=false while [[ $# -gt 0 ]]; do case "$1" in --disable) DISABLE=true; shift ;; --pair-only) PAIR_ONLY=true; shift ;; --help|-h) echo "Usage: $0 [--disable] [--pair-only]"; exit 0 ;; *) echo "Unknown: $1"; exit 1 ;; esac done RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' info() { echo -e "${CYAN}[INFO]${NC} $1"; } ok() { echo -e "${GREEN}[OK]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } fail() { echo -e "${RED}[FAIL]${NC} $1"; } if [ "$DISABLE" = true ]; then echo "" info "Disabling Bluetooth MIDI..." sudo systemctl stop bluetooth-midi 2>/dev/null || true sudo systemctl disable bluetooth-midi 2>/dev/null || true sudo rm -f /etc/systemd/system/bluetooth-midi.service # Restart bluetooth in standard mode sudo systemctl restart bluetooth ok "Bluetooth MIDI disabled" exit 0 fi echo "" echo "╔═══════════════════════════════════════════════╗" echo "║ Pi Multi-FX Pedal — Bluetooth MIDI Setup ║" echo "╚═══════════════════════════════════════════════╝" echo "" # 1. Install bluez info "Installing Bluetooth packages..." sudo apt-get install -y -qq bluez bluez-utils bluez-tools 2>/dev/null || true ok "Bluetooth packages installed" # 2. Ensure BT hardware is on info "Enabling Bluetooth hardware..." sudo raspi-gpio set 28 a0 2>/dev/null || true # Enable BT on RPi sudo hciconfig hci0 up 2>/dev/null || true ok "Bluetooth hardware enabled" # 3. Enable BT MIDI plugin in bluez info "Configuring BlueZ for MIDI..." BLUEZ_CONF="/etc/bluetooth/main.conf" if [ -f "$BLUEZ_CONF" ]; then sudo sed -i 's/^#Class *= *0x000100/Class = 0x002300/' "$BLUEZ_CONF" 2>/dev/null || true sudo sed -i 's/^#DiscoverableTimeout *= *0/DiscoverableTimeout = 0/' "$BLUEZ_CONF" 2>/dev/null || true sudo sed -i 's/^#PairableTimeout *= *0/PairableTimeout = 0/' "$BLUEZ_CONF" 2>/dev/null || true fi ok "BlueZ configured for discoverable + pairable MIDI" # 4. Make device discoverable info "Making pedal discoverable as 'Pi-Pedal-MIDI'..." cat < /dev/null [Unit] Description=Pi Multi-FX Pedal — Bluetooth MIDI Service After=bluetooth.service Requires=bluetooth.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/bluetoothctl discoverable on ExecStartPost=/usr/bin/bluetoothctl pairable on ExecStartPost=/usr/bin/bluetoothctl name Pi-Pedal-MIDI ExecStop=/usr/bin/bluetoothctl discoverable off Restart=no [Install] WantedBy=multi-user.target SERVICE # 6. Register MIDI over BLE with ALSA (a2dp-midi bridge) # On modern BlueZ (5.50+), BLE-MIDI shows up as a sequencer port automatically # Verify with: aconnect -o -l | grep -i midi sudo systemctl daemon-reload sudo systemctl enable bluetooth-midi sudo systemctl start bluetooth-midi # 7. Also start the pedal's MIDI handler to accept BT MIDI # The MIDI handler already listens on ALSA sequencer ports info "MIDI handler will auto-detect BT MIDI sequencer ports on next pedal start" ok "Bluetooth MIDI service started" echo "" echo "╔═══════════════════════════════════════════════╗" echo "║ Bluetooth MIDI Setup Complete 🎸 ║" echo "╚═══════════════════════════════════════════════╝" echo "" echo " 📡 Name: Pi-Pedal-MIDI" echo " 🎛 Connect from: Phone, tablet, wireless footswitch" echo "" echo " From your phone:" echo " 1. Enable Bluetooth" echo " 2. Scan for 'Pi-Pedal-MIDI'" echo " 3. Pair" echo " 4. Open any MIDI controller app" echo "" echo " To disable later:" echo " sudo bash $0 --disable" echo ""