チープなDTMアプリLinuxへふと思うところがあって、5年近く以前に自作したDTMアプリを引っ張り出してきた。当時は、まだWindowsを使っていたっけなぁ。Rubyで書き、Cygwin上で動かし、実際に作曲に利用したアプリだ。プログラムの構成どころか、使い方も含めて、かなり記憶が曖昧になっているが、そういう場合こそブログの記録が役に立つ。自分のブログからパッケージをダウンロードして、説明を読みながらLinux上で動かしてみる。そのようなファイルやディレクトリはありません素直に動かネェだろうなぁ、と思ったら、いきなり動かネェ。そもそも/dev/dsp自体がネェってさ。/dev/dsp......って思ったら、思った通りだった。それっぽいモジュールをロードしたら、アッサリと/dev/dspが出現した。ちなみに/dev/dspは、音の波形(PCM)データを書き込むと音が鳴る、という概念のデバイスファイルだ。melodを起動する。./melod.org:17これだけじゃ動かネェだろうなぁ、と思ったら、やっぱり動かネェ。ioctlのパラメータがおかしいって?ioctlってのは、デバイスに対する「読み書き以外のアレコレ」を一手に引き受ける、ジャンク箱みたいなヤツだ。int)定義は見つかったが、マクロを噛んでてなんのこっちゃわからん。要るところだけ、頭を使わないで解決する。c004500ac0045002c0045005c00450068004500b8010500c解決。要求コードの上位バイトだけが、少し違っているようだ。melodのコードを修正し、改めて、melodを起動する。./melod:17ビジー出た。これも、やや想定通り。最近のLinuxはALSAの上にPulseAudioというサウンドデーモンが載っており、各アプリの音声出力をソフト的にミキシングしているので、直接に/dev/dspにアクセスするのはよろしくない。RubyでPulseAudioに対応するには......と調べたところ、OSS用のラッパーが用意されており、そいつを噛ませば、従来のOSS向けコードを、そのままPulseAudio対応にすることができるらしい。そんなわけないんだが......デバッグモードで走らせてみる。./melod:17なんか、頭に「f」がいっぱい付いてしまっている。勝手に64bit拡張して渡してしまうRubyもRubyだが、そのまま受け取って処理しようとするpadspもpadspって感じ。Ruby側でいろいろやってみたが、どうにもならない。どっちが原因かわからんが、どっちかをどうにかする必要がある。Rubyをイジるとオオゴトになりそうなので、padsp側をどうにかしてみることにする。要するに、padsp側のソースコードをイジって、処理の直前で32ビット幅で切ってしまうように修正し、パッケージを作り直すわけだ。ソースをダウンロードしてビルドする。rpmbuild/SPECS/pulseaudio.specソースビルドに必要なパッケージが大量に不足している。installで全部入れたら、ソースビルドに成功した。修正すべきコードを探す。}最後のところで32ビット幅で切ってしまおう。../SOURCES/0064-for-melod.patchパッケージビルドして、パッケージアップデートの形でインストール。../RPMS/x86_64/pulseaudio-*5度目の正直。./melodようやく、動いたっぽい。PCのキーボードを、そのままピアノのキーボード化する「konk」を立ち上げる。./konk音が出たッ......と思った矢先にmelod側が落ちた。バッファサイズが足りなかったらしい。リングバッファ(みたいに使う)ようやく、キーボードがキーボードとして動くようになった。音が途切れ途切れだが、音を採る分には不自由はない。★マギカとして、ClariSの「コネクト」の冒頭部分について「konk」を使って音を採ってみる。コードはここを参考にして......と、思ったら「C6」とか「Dsus4」とか未対応のコードがあるではないか。この辺りの概念を作ったのはずいぶん前のことなので、音に関する知識が脳からページアウトしてしまっている。Wikipediaを読んで和音や音程についての情報の再呼び出しを図る。脳へのページインが済んだところで、対応する修正を入れてみれば、ほんのちょっとの追加で済んだ。過去のオレ、ナイスジョブ。Array.newMMLにコードを追記して、MIDIファイルにエンコードする。./plexorと、MIDIファイルを生成したところでフト気づいた。試しにファイルをOperaにツッコんだところ、Totemらしいヤツが出てきてgstreamer-plugins-bad-free-extrasを入れろと言われた。gstreamer-plugins-bad-free-extrasこれまた、大量のパッケージが必要に。全部入れ......ようとしたら、gstreamer-plugins-goodと衝突して入らない。そっち方面をあきらめ、いろいろと探すと、timidityという単独のMIDIデコーダが見つかった。timidity++再生してみる。midi/connect.midおぉ、ちゃんと音が出た。