Common Lisp製Audio File Player “REPLAYER” の紹介。

Introduction.

Twitterでこのようなやりとりがあってですね。 残念ながらCommon Lispは選ばれなかったっぽいので見切り発車で勝手にCommon Lisp製のAudio File Playerを作り始めてみた訳です。

一通り必要とされているらしい機能は実装できたぽいので簡単に紹介だけ。

REPLAYER

名前は「REPL」での「PLayer」から。 特に深い意味はありません。

Installation.

俺々ライブラリを使っているのでroswellでのインストール推奨です。

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

現時点ではwavmp3のみサポートされてます。

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:allNILのいずれかが入ります。 既定値はNILです。

Stop

停止させるにはSTOPを呼びます。

* (replayer:stop)

Skip

次の曲へ飛ばすにはSKIPを呼びます。

* (replayer:skip)

紹介を終えて。

ros-scriptをサポートしているのでシェルからの操作もできますが、その紹介はまた気が向いたら。 (README に書いてあります。)

まだまだ機能は足りないとは思うのですが、まぁとりあえずはこんなところで。

自分で使うぶんには割と満足しているので、このあと何をしたらいいのかよく分かってない。