#!/usr/bin/env bash # test-e2e.sh — End-to-end: send MIDI note → Pd → audio output # Usage: ./scripts/test-e2e.sh [board_ip] [note] [duration] set -euo pipefail BOARD="${1:-192.168.9.167}" NOTE="${2:-60}" DURATION="${3:-3}" SSH_KEY="/home/david/.ssh/unoq_deploy_key" SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i $SSH_KEY" echo "=== End-to-End Test: MIDI → Pd → Audio ===" echo "Board: $BOARD" echo "Note: $NOTE, Duration: ${DURATION}s" # 1. Check Pd is running echo "" echo "--- Step 1: Verify Pd is running ---" PID=$(ssh $SSH_OPTS "arduino@$BOARD" "pgrep -f 'pd.*synth.pd' | head -1 || true") if [ -z "$PID" ]; then echo "[FAIL] Pd is not running!" exit 1 fi echo "[OK] Pd running (PID: $PID)" # 2. Check audio device status before echo "" echo "--- Step 2: ALSA status before MIDI ---" ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null || echo 'No status'" # 3. Send MIDI note-on echo "" echo "--- Step 3: Send MIDI note-on ---" python3 -c "import socket; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.sendto(b'midi 144 $NOTE 100;', ('$BOARD', 8081)); s.close()" echo "[OK] Note-on sent" # 4. Monitor audio device during note echo "" echo "--- Step 4: Monitor ALSA during note (${DURATION}s) ---" for i in $(seq 1 "$DURATION"); do STATUS=$(ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null | head -1 || echo 'unknown'") echo " [${i}/${DURATION}s] $STATUS" sleep 1 done # 5. Send note-off echo "" echo "--- Step 5: Send MIDI note-off ---" python3 -c "import socket; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.sendto(b'midi 128 $NOTE 0;', ('$BOARD', 8081)); s.close()" echo "[OK] Note-off sent" # 6. Check ALSA after sleep 0.5 echo "" echo "--- Step 6: ALSA status after note-off ---" ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null || echo 'No status'" echo "" echo "=== E2E Test Complete ===" echo "If ALSA showed 'RUNNING' during step 4, the MIDI→Pd→Audio pipeline works." echo "Connect headphones to JMISC: GND=35, HPH_L=36, HPH_R=38"