Raspberry Pi 3/4/5をシンセサイザーとして使うための設定スクリプト

毎回毎回やるのでさすがにスクリプトにした。

## 前提条件
* Raspberry Pi 3/4/5
* HiFiBerry DACまたはPCM5102Aボードを直結
  * 3.3V -> VIN、GND -> GNDとSCK、GPIO18 -> BCK、GPIO21 -> DOUT、GPIO19 -> LCK
* MIDI I/OはGPIO14 (TXD) と GPIO15 (RXD) を使用
* アプリは起動時に全画面で起動（Kioskモード）

## 使い方
SDカード焼いてRaspberry Piに挿して起動したら、このスクリプトを実機に置いて実行属性つけて実行。いくつかアプリ名とかデバイス名などの変更は必要。

```setup.sh
#!/bin/bash

# Raspberry Pi Audio Setup Script
# 対応機種: Raspberry Pi 3/4/5
# 前提条件: Raspberry Pi Imagerで焼かれたSDカードから起動済み

set -e

echo "=== Raspberry Pi Audio Setup Script ==="
echo "対応機種: Raspberry Pi 3/4/5"
echo "現在のユーザー: $USER"
echo ""

# 基本システムアップデート
echo "1. システムアップデート中..."
sudo apt update
sudo apt upgrade -y

# SWAP無効化
echo "2. SWAP無効化中..."
sudo swapoff -a
sudo dphys-swapfile swapoff
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

# SWAP設定ファイルの更新
echo "3. SWAP設定ファイル更新中..."
sudo sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=0/' /etc/dphys-swapfile

# CPU設定とconfig.txt更新
echo "4. CPU設定とconfig.txt更新中..."
# /boot/firmware/config.txtを指定内容で完全に置き換え
sudo tee /boot/firmware/config.txt > /dev/null << 'EOF'
# For more options and information see
# http://rptl.io/configtxt
# Some settings may impact device functionality. See link above for details

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
dtparam=i2s=on
dtparam=spi=on

# Disable audio (loads snd_bcm2835)
dtparam=audio=off

# Additional overlays and parameters are documented
# /boot/firmware/overlays/README

# Automatically load overlays for detected cameras
#camera_auto_detect=1

# Automatically load overlays for detected DSI displays
display_auto_detect=1

# Automatically load initramfs files, if found
auto_initramfs=1

# Enable DRM VC4 V3D driver with audio disabled
dtoverlay=vc4-kms-v3d,noaudio
max_framebuffers=2

# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1

# Run in 64-bit mode
arm_64bit=1

# Disable compensation for displays with overscan
disable_overscan=1

# Run as fast as firmware / board allows
arm_boost=1

# CPU設定
governor=performance
arm_freq_min=1000

[cm4]
# Enable host mode on the 2711 built-in XHCI USB controller.
# This line should be removed if the legacy DWC2 controller is required
# (e.g. for USB device mode) or if USB support is not required.
otg_mode=1

[cm5]
dtoverlay=dwc2,dr_mode=host

[all]
dtoverlay=hifiberry-dac
dtoverlay=dwc2
dtoverlay=midi-uart0
EOF

# cmdline.txt更新（USB MIDI Gadget用）
echo "5. cmdline.txt更新中..."
sudo sed -i 's/$/ modules-load=dwc2,g_midi/' /boot/firmware/cmdline.txt

# USB MIDI Gadget設定
echo "6. USB MIDI Gadget設定中..."
sudo mkdir -p /etc/modprobe.d
sudo tee /etc/modprobe.d/g_midi.conf > /dev/null << 'EOF'
options g_midi iManufacturer="Your Manufacturer Name" iProduct="Your Product Name" iSerialNumber="123456789"
EOF

# ALSA設定
echo "7. ALSA設定中..."
cat > ~/.asoundrc << 'EOF'
pcm.!default {
    type hw
    card 0
    device 0
}
ctl.!default {
    type hw
    card 0
}
EOF

# limits.conf設定
echo "8. リアルタイム優先度設定中..."
cat << EOF | sudo tee -a /etc/security/limits.conf
$USER - rtprio 99
$USER - memlock unlimited
@audio - rtprio 99
@audio - memlock unlimited
EOF

# audioグループに現在のユーザーを追加
sudo usermod -a -G audio $USER

# labwcを既定のセッションに設定（raspi-configと同等の処理）
echo "9. labwc を既定セッションに設定中..."
# raspi-config の do_boot_behaviour に相当するコマンドライン処理
sudo raspi-config nonint do_boot_behaviour B4  # Desktop Autologin
sudo raspi-config nonint do_wayland W1         # labwc

# デスクトップ自動ログイン設定
echo "10. デスクトップ自動ログインを設定中..."
sudo raspi-config nonint do_boot_behaviour B4  # Desktop Autologin

# オーディオ関連の追加パッケージインストール
echo "11. オーディオ関連パッケージインストール中..."
sudo apt install -y alsa-utils pulseaudio-utils jackd2

# unclutter-xfixesインストール（カーソル非表示用）
echo "12. unclutter-xfixes インストール中..."
sudo apt-get install -y unclutter-xfixes

# labwc設定ファイル作成
echo "13. labwc設定ファイル作成中..."
mkdir -p ~/.config/labwc
cat > ~/.config/labwc/rc.xml << 'EOF'
<?xml version="1.0"?>
<labwc_config>
  <windowRules>
    <!-- identifier は Wayland ネイティブなら app_id、 XWayland なら WM_CLASS のトリミング後の文字列 -->
    <!-- （自分のアプリ名に合わせて書き換える） -->
    <windowRule identifier="YOURAPPNAME" event="onMap">
      <!-- フルスクリーン化 -->
      <action name="ToggleFullscreen"/>
      <!-- タイトルバーなど装飾を完全にオフ -->
      <action name="ToggleDecorations" decorations="none"/>
    </windowRule>
  </windowRules>
</labwc_config>
EOF

# labwc autostart設定
echo "14. labwc autostart設定中..."
cat > ~/.config/labwc/autostart << 'EOF'
#!/bin/sh
# Labwc 起動後に実行するアプリ
# 必要に応じて数秒ほど待ってから起動すると安定する。早すぎるとフルスクリーンにならない様子。
sleep 5
unclutter-xfixes --hide-on-touch &
~/YOURAPPNAME &
EOF

chmod +x ~/.config/labwc/autostart

# 設定完了メッセージ
echo ""
echo "=== セットアップ完了 ==="
echo "以下の設定が適用されました:"
echo "✓ システムアップデート完了"
echo "✓ SWAP無効化"
echo "✓ CPU設定とconfig.txt更新 (HiFiBerry DAC + USB MIDI Gadget対応)"
echo "✓ cmdline.txt更新 (USB MIDI Gadget用)"
echo "✓ USB MIDI Gadget設定"
echo "✓ ALSA設定 (~/.asoundrc)"
echo "✓ リアルタイム優先度設定"
echo "✓ labwc を既定セッションに設定"
echo "✓ オーディオ関連パッケージインストール"
echo "✓ unclutter-xfixes インストール (カーソル非表示)"
echo "✓ labwc設定ファイル作成 (~/.config/labwc/rc.xml)"
echo "✓ labwc autostart設定 (~/.config/labwc/autostart)"
echo ""
echo "注意事項:"
echo "- 再起動後に設定が完全に有効になります"
echo "- audioグループへの追加は再ログイン後に有効になります"
echo "- labwcはWaylandベースのコンポジターです"
echo ""
echo "再起動しますか？ (推奨)"
read -p "再起動する場合は 'y' を入力してください: " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "再起動中..."
    sudo reboot
else
    echo "設定を有効にするため、後で再起動してください。"
fi
```