Common Lisp製Audio File Player “REPLAYER” の紹介。
Introduction.
Twitterでこのようなやりとりがあってですね。 残念ながらCommon Lispは選ばれなかったっぽいので見切り発車で勝手にCommon Lisp製のAudio File Playerを作り始めてみた訳です。
一通り必要とされているらしい機能は実装できたぽいので簡単に紹介だけ。
REPLAYER
名前は「REPL」での「PLayer」から。 特に深い意味はありません。
Installation.
俺々ライブラリを使っているのでroswellでのインストール推奨です。
またデータベースとしてsqlite3を使用しているのでそちらも各自インストールしてください。
roswellとsqlite3をインストールし終わったら以下のコマンドを叩きます。
$ ros install hyotang666/r-iff hyotang666/wav-parser hyotang666/replayer
これで準備はおk。
Inside REPL.
quicklispでロードできます。
* (ql:quickload :replayer)
後は再生したいファイルを関数PLAY
に渡せばいいだけ。
* (replayer:play "~/Music/path/to/file")
現時点ではwav
とmp3
のみサポートされてます。
Play list
PLAY
は総称関数として実装されています。
リストを渡せば順繰りに再生してくれます。
* (replayer:play (uiop:directory-files "~/Music/" "*.wav"))
Saving play list
ファイルへのパスはpathnameオブジェクトでも文字列でもOkです。 保存したい場合は以下のようにすると取り回しが楽になるでしょう。
* (with-open-file (s "play-list" :direction :output :if-not-exist :create)
(format s "~{~A~%~}" (uiop:directory-files "~/Music/" "*.wav")))
保存したプレイリストを再生したい場合はUIOP:READ-FILE-LINES
が便利に使えます。
* (replayer:play (uiop:read-file-lines "play-list"))
保存されたプレイリストはただのtxtファイルなので共有もできますし(ディレクトリ構造が同じであれば。)表計算ソフトで開くこともできます。
Tagging
TAG
関数を使えばファイルとタグとを紐付けることができます。
* (tag "tag" (uiop:directory-files "~/Music/" "*.wav"))
Tagging example
* (loop :for tag :in (remove "" (ppcre:split "(\\()|(\\))|(,)|(&)|( )" "原村和(小清水亜美), 宮永咲(植田佳奈), 染谷まこ(白石涼子), 片岡優希(釘宮理恵) & 竹井久(伊藤静)"))
:do (tag tag "~/Music/四角い宇宙で待ってるよ"))
Filter
正規表現での検索には現時点では対応していませんが論理式によるタグ検索は可能です。
タグによる検索&再生には中間オブジェクトとしてTAG
オブジェクトを作成します。
* (replayer:play (replayer:make-tag :exp '(and "Death-metal" (not "America"))))
上記例ではDeath-metalというタグがついている音楽を再生しますがAmericaというタグがついている音楽は再生されません。
Shuffle
変数*shuffle*
はシャッフル再生するか否かを制御します。
既定値はNIL
です。
Repeat
変数*repeat*
はリピートモードを制御します。
:one
、:all
、NIL
のいずれかが入ります。
既定値はNIL
です。
Stop
停止させるにはSTOP
を呼びます。
* (replayer:stop)
Skip
次の曲へ飛ばすにはSKIP
を呼びます。
* (replayer:skip)
紹介を終えて。
ros-scriptをサポートしているのでシェルからの操作もできますが、その紹介はまた気が向いたら。 (README に書いてあります。)
まだまだ機能は足りないとは思うのですが、まぁとりあえずはこんなところで。
自分で使うぶんには割と満足しているので、このあと何をしたらいいのかよく分かってない。