Linux の PC Speaker (マザーボード上のブザー) を利用して MIDI ファイルを再生するプログラムです。
このプログラムは Linux の KIOCSOUND ioctl を利用し、PC Speaker に任意の周波数を出力して MIDI ファイルを演奏します。
一般的なオーディオデバイス (ALSA/PulseAudio/PipeWire) は使用しません。
- MIDI ファイルを再生
- PC Speaker のみで動作
- Linux 専用
- 軽量
- GUI 不要
- Linux
- PC Speaker を搭載したマシン
- カーネルモジュール
pcspkr - root 権限または適切な capability
PC Speaker は物理的に単音しか出力できません。
そのため、
- 和音は再現できません
- 音色は変更できません
- ドラムトラックは再現できません
- 複数トラックの MIDI は簡略化されます
apt update
apt install build-essential pkg-config libglib2.0-dev libsmf-devpkgs.mkShell {
buildInputs = with pkgs; [
gcc
pkg-config
glib
libsmf
];
}gcc speaker_midi.c \
$(pkg-config --cflags --libs glib-2.0 smf) \
-lm \
-o speaker_midiまず PC Speaker が利用可能か確認します。
modprobe pcspkr以下のコマンドでブザーが鳴ることを確認してください。
echo -e "\a"または
beep -f 440 -l 500音が鳴らない場合、
- PC Speaker が無効化されている
- ノート PC で PC Speaker が存在しない
- 仮想マシンで仮想化されていない
可能性があります。
sudo ./speaker_midi music.mid毎回 root を使いたくない場合は実行ファイルへ capability を付与できます。
sudo setcap cap_sys_tty_config+ep ./speaker_midi確認:
getcap ./speaker_midi以降は通常ユーザーで実行できます。
./speaker_midi music.mid※ ディストリビューションやカーネル設定によっては動作しない場合があります。
Linux の PC Speaker は /dev/console に対して ioctl(KIOCSOUND) を送ることで制御されます。
int timer = 1193180 / frequency;
ioctl(fd, KIOCSOUND, timer);ここで使用される 1193180 は PC の Programmable Interval Timer (PIT) のクロック周波数です。
例えば 440Hz を鳴らす場合:
int timer = 1193180 / 440;
ioctl(fd, KIOCSOUND, timer);停止する場合:
ioctl(fd, KIOCSOUND, 0);以下を確認してください。
pkg-config --cflags glib-2.0パッケージ名は
glib-2.0
です。
以下は誤りです。
glib2.0
パッケージ名は
smf
です。
確認:
pkg-config --list-all | grep smf正しいビルド例:
gcc speaker_midi.c \
$(pkg-config --cflags --libs glib-2.0 smf) \
-lm \
-o speaker_midimodprobe pcspkrを実行してください。
それでも鳴らない場合は PC Speaker が存在しない可能性があります。
MIT License