音楽再生

これも先人たちがたくさんたくさん記事にされているネタ。
備忘目的で、自分も書いておく。
たまーに、どうやるんだっけって思うんだよね。

音楽再生ソフト mpg321 インストール

まずはソフトウェアのインストール。
先人たちに倣い mpg321 を使う。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install mpg321

再生環境の整理

必須な作業ではないけど、音楽がならないような場合は出力先を確定する。


$ sudo raspi-config


すると、キャラクターベースで設定画面が出てくる。

以降の画面では、矢印キーで移動する。


[8 Advanced Options] を選択して Enter キーを押す。


[A9 Audio] を選択して Enter キーを押す。


[1 Force 3.5mm ('headphone') jack] を選択して Enter キーを押す。
これで 3.5mm のジャックから強制的に出力される。


最初の画面に戻るので、タブキーを2回押して を選択状態にしたら Enter キーを押す。


設定画面が閉じる。

音楽ファイルの取り込みと転送

手元にある CD を、Windows Media Player で mp3 として取り込む。


今回のサンプル。

エロゲ―ですが、何か?(威圧)


さて、エクスプローラーであれば、PC→ミュージック→歌手名→アルバム名の順番で辿れば、取り込んだファイルがあるはず。



さて Raspberry Pi で再生しようかと思ったとき、少し考え込んでしまった。
samba をインストールしてファイル共有からコピーしても良いんだけど、もっと手っ取り早い方法は無い物かと。
USBメモリで移動するくらいなら、samba 設定する方が早い (どこに置いたか探すところから)。


「はーい、SCP 転送〜」


どこからか、のぶ代さんの声が聞こえてきた。
その独特なドラ声に導かれて、mp3 ファイルを ssh 接続している TeraTermドラッグアンドドロップ
送付先ディレクトリが表示されるので、好みで変更して OK ボタンをクリック。



ちなみに、チルダ "~" はホームディレクトリを表すけど、この場合はログインアカウントのホームディレクトリだった。
ログイン後に su していると ls ~ コマンドを打ってもファイル名が表示されないので、一瞬焦る。


ホームディレクトリの配下に music ディレクトリを作って移動したあと…
(タイムスタンプは正確だけど気にしないこと)


転送できたことを確認したら、音楽を再生してみる。
$ ls -l ~pi/music
$ alias mm="mpg321"
$ mm ~pi/music/* &


ちなみにここで alias を使っているのは、単純に mpg321 と入力するのがイヤになってきただけで、深い意味はない。
キー入力しにくい並びなんだよね…自分的に…。
mpg と打とうとして、指が勝手に mpeg と打つとか、321 と打とうとして 123 と打つとか。


閑話休題


延々と再生情報が出力される様子。

これなら、標準出力を /dev/null にでもリダイレクトしたほうがヨサゲ。

HDMI での再生

上記ではヘッドホンジャックから強制的に出力されるように設定する方法を紹介しているけど、HDMI をサポートしているディスプレイだったら、そこから音楽を鳴らすことができる。
自分が使っている HDMI ディスプレイでは、HDMI 画面にしていないと音楽が出てこなかったけど…。
何を言っているのか分からないかもしれないが、Windows からは DVI で接続して使っているので、ディスプレイから音楽を出力させるには接続方法を合わせないとダメだったということだ。
個人的な感想を言うと、ディスプレイから出力させるだけあって、ある意味「貧弱」な音なんだけど、ある意味では最高な音…。


ノイズが乗らないのが素晴らしい。
テレビとかに繋げば、それなりに再生環境が整うんじゃないだろうか。


…テレビ、持ってないんだよね。

ヘッドホンジャックでの再生

ジャックにイヤホンでもスピーカーでも接続すれば、そのまま音楽を流せる。


手軽に再生できるのが素晴らしい。
なんだけど、コンピュータの設計上、どうしてもノイズが乗る。
それこそ、アナログなレコードを再生しているかのようにノイズが乗る。


これでもかというくらいに、ざざーぷちぷちずざーと小さく鳴る。
気になる人は、絶対ダメだろうなぁ…


.bashrc にコマンドを仕込んでおいて、ログインしたら初音ミクあたりで音声出力なんかしたらどうだろう。


Raspberry Pi「ログインを確認しました」
Raspberry Pi「あと 10 秒で自爆します...9...8...7...」


うん、つまらなかった。

オプション

基本的には man mpg321 を実行すれば出てくる情報を、意訳したもの。
間違ってるかもしれない。

機能 オプション
シャッフル再生 -z
ランダム再生 -Z
詳細表示 -v
ループ再生 -l (数値)


他にも機能があるけど、基本的にはこれくらい?
一応リスト再生もあるけど、これにちょっと手こずった。

pi@raspberrypi ~ $ cat ATLACH-NACHA.music.list
/home/pi/music/01 Information.mp3
/home/pi/music/02 Red tint.mp3
/home/pi/music/03 World.mp3
/home/pi/music/04 Voluptuous lips.mp3
/home/pi/music/05 Luring to insanity.mp3
/home/pi/music/06 Calm time.mp3
/home/pi/music/07 Weeping Cause.mp3
/home/pi/music/08 Throwing into the banquet.mp3
/home/pi/music/09 Running Clouds.mp3
/home/pi/music/10 Passing moment.mp3
/home/pi/music/11 Atlach_nacha~Going on.mp3
/home/pi/music/12 Atlach_nacha~Huge battle.mp3
/home/pi/music/13 Atlach_nacha~Adoption.mp3
/home/pi/music/14 Running Clouds(Music Box).mp3
/home/pi/music/15 Memorial day.mp3
pi@raspberrypi ~ $
pi@raspberrypi ~ $ mpg321 -@ ATLACH-NACHA.music.list
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.
Version 0.3.2-1 (2012/03/25). Written and copyrights by Joe Drew,
now maintained by Nanakos Chrysostomos and others.
Uses code from various people. See 'README' for more!
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
Title   : Information                    Artist : shade


ということで、どうやらスペースにエスケープは要らないみたい。
今回はフルパスで記載したけど、「カレントから」であれば相対パスでもいけた。


なので、指定するディレクトリの mp3 ファイルを総ざらいしてリスト化する方法し、mpg321 に読み込ませるには、次の通り。

$ find ~pi -name "*.mp3" | sort > all.mulic.list
$ mpg321 -@ all.mulic.list


これをシェルスクリプト化すると、こんな感じ?

#!/bin/sh

### Parameter
# List file
pListDir=/tmp
pListName=all.mulic.list
pList=${pListDir}/${pListName}

# search target
pWorkingDir=~pi/
pTargetMusic="*.mp3"

# player
pApp=/usr/bin/mpg321
pOption="-z"

### Listing
find ${pWorkingDir} -name ${pTargetMusic} | /usr/bin/sort > ${pList}

### Play
${pApp} ${pOption} -@ ${pList} > /dev/null


なんていうか、mpg321 をバックエンドに、シェルスクリプトでフロントエンドを開発している気になってきたので、この辺で終わりにする。
音楽再生部分をバックグラウンドで走らせたら、止めるのにプロセスを探して kill しなきゃだし、そうするとどこかでプロセスIDを管理しなきゃだし、プロセスIDの管理までするなら変数として外部設定ファイルにしたほうが良いし…


脱線するけど…
バックエンド/フロントエンドはひとつの対義語で、ユーザが操作するシステムをフロントエンド、その操作を実際に処理するシステムがバックエンド。
ATM をイメージすると、わかりやすいかもしれない。
ATM 自体はフロントエンドで、その操作結果を受けて実際に処理を行うのは、客から見えないサーバ部分だし。


バックグラウンド/フォアグランドはひとつの対義語で、ユーザが発行するコマンドを受け付けるシェル部分がフォアグランド、発行したコマンドを陰で走らせるのがバックグラウンド。
これは、ズバリ、シェルそのもの。


厳密には違うところもあるけど、ここではこんな感じで使っている。


それはともかく、目的に合わせたリストを作って mpg321 に読み込ませてあげれば、それなりに動いてくれそうな気配。