Skip to content

Xia7an/Nyancat-Beep

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

MIDI PC Speaker Player

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 は簡略化されます

必要パッケージ

Debian / Ubuntu

apt update
apt install build-essential pkg-config libglib2.0-dev libsmf-dev

NixOS

pkgs.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

capability を利用する場合

毎回 root を使いたくない場合は実行ファイルへ capability を付与できます。

sudo setcap cap_sys_tty_config+ep ./speaker_midi

確認:

getcap ./speaker_midi

以降は通常ユーザーで実行できます。

./speaker_midi music.mid

※ ディストリビューションやカーネル設定によっては動作しない場合があります。

PC Speaker の仕組み

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);

トラブルシューティング

glib.h が見つからない

以下を確認してください。

pkg-config --cflags glib-2.0

パッケージ名は

glib-2.0

です。

以下は誤りです。

glib2.0

Package 'libsmf' not found

パッケージ名は

smf

です。

確認:

pkg-config --list-all | grep smf

正しいビルド例:

gcc speaker_midi.c \
    $(pkg-config --cflags --libs glib-2.0 smf) \
    -lm \
    -o speaker_midi

音が鳴らない

modprobe pcspkr

を実行してください。

それでも鳴らない場合は PC Speaker が存在しない可能性があります。

ライセンス

MIT License

About

No description, website, or topics provided.

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages