163ad4145b
- prometheus-exporter.py: stdlib-only HTTP metrics on :9090/metrics - Exposes: ALSA status, hw_ptr rate, service health, mixer controls - MIDI counters: notes_on, notes_off, errors - test-unit.py: 10-test suite covering full MIDI→Pd→Audio pipeline - test-tone.pd, test-midi-log.pd: minimal debug patches - systemd service for exporter - install.sh/deploy updated to include exporter
62 lines
2.1 KiB
Bash
Executable File
62 lines
2.1 KiB
Bash
Executable File
#!/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"
|