のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

世界で一番軽くてシンプル:mac用のシャッフル専用音楽プレーヤー

どうものらぬこです

今日は、とても軽くて、メモリーもほとんど食わないmacで使える音楽プレーヤ(?)を紹介するお話です。

少し前に購入した mac mini にもようやく慣れてきました。

ビデオキャプチャーボード挿してゲーム動画撮りたいとか、TV録画の為にPT3挿したいとか、心はいつまでも高@生の如くエ口ゲープレイを続けたいとか、そういう願望がないのであれば、Windowsmacも変わんないですね。

さて今回は、macで使える「世界で一番軽いかもしれないシャッフル専用音楽プレーヤー」を紹介してみます。

f:id:noranuk0:20170524222935p:plain

macには、iTuneというソフトウェアが最初から付いています。

音楽再生もできるし、写真の管理もできる、iPhoneiPodを持っていればそれらのデバイスとデータを動悸することもできる。

ただ、高機能ソフトウェアの宿命というかなんというか、とにかくメモリー容量を食います。

ライブラリに曲が何も登録されていない状態でも100Mb近くのメモリーを消費しています。

バックグラウンドで音楽再生したいだけなのであれば、もう少し軽いソフトウェアがほしいところです。

というわけで、今回は、超軽量音楽再生ソフトウェアの紹介です。

Windowsにしろmacにしろ、音楽ライブラリーと称してid3タグの情報をDB化して管理してくれる系のアプリが最近の流行りのようです。

でも、そんなのいらないからフォルダ指定したらそのフォルダ以下(サブフォルダ含めて)の曲を順番or適当に再生してくれればそれでいいという人もきっと多いと思います。

今回紹介するのは、そういった人向けのとっっても軽い音楽プレーヤーです。

この音楽プレーヤー、数千曲のmp3ファイルをシャッフル再生中でも消費メモリーは5〜10Mbほどです。

モリー消費が少ないうえ、作業のじゃまにも全くならないのですが、以下のような事はできません

  • ユーザインタフェースがありません。
    • プレイヤーのウィンドウもないし、メニューのステータス領域に常駐もしません。
    • コンソールアプリというわけでもないのでterminalも不要です。
    • 曲が流れていない状態でアプリを起動すると、曲の再生が始まります。
    • 曲が流れている状態でアプリをもう一度起動すると、曲の再生が止まります。
    • スキップや一時停止など、再生と停止以外の操作はできません。
  • 再生中の曲情報(タイトル、アルバム名、作曲者等)は表示できません。
  • もちろんアルバムアートも表示できません。
  • イコライザとかそんな高級機能ありません。
    • でも、音はそこそこいいと思います。
  • アプリダウンロードして実行するだけ、という訳にはいきません。
    • 自分で作ります。シェルスクリプトを書くところからはじめます。
      • 難しいことを知らなくても使えるように、この記事では(ほぼ)コピペでできるように手順を一つ一つ説明しています。

f:id:noranuk0:20181114004909p:plain

曲をBGMとして再生できればそれでいいよっていう方で、もし興味ありましたらこの先を読んでみてもよろしいかと思います。

逆に、シンプルでも見た目がきれいな普通の音楽プレーヤーをお探しの場合、この記事はちょっとお役に立てないと思います。

最初にネタばらし

そこそこなんか色々知っている人向けに先にタネ明かしをしてしまうと、中身は .app化した afplayer です。

ただし、afplayer は「曲を1回だけ再生する」という機能しか備わっていないません。シャッフル再生を実現するために、対象音楽ファイルのパス一覧が記載されたプレイリストファイルをランダムソートして、1曲毎にafplayer を起動する方法を取っています。

以下、手順と原理を簡単に説明します。細かい手順は次項で説明します。

  1. 再生したいmp3ファイル一覧が1行1ファイルの形で書かれたプレイリストファイルを作成します。
  2. 音楽プレーヤーの正体は「afplayer」というCUI(ターミナル上で動く)アプリです。
  3. afplayerには、複数の曲を再生する機能が備わっていないため、ランダム再生や曲リストの再生機能は、シェルスクリプト等で補ってやります。
  4. terminalからそのまま起動するとシェルを1つ専有して邪魔なので nohup ~~~ >/dev/null 2>&1 & で括ってプロセスをshellから切り離します。
  5. 音楽聞いてる時にスリープされると悲しいので、「caffeinate」というコマンドを利用して、再生中のスリープを抑制しておきます。
  6. 曲を止めたいときは killで止めちゃいます。
  7. 毎回コマンド叩くのめんどくさいので、音楽再生中なら停止、再生してなかったら再生開始するシェルスクリプトを作ります。
  8. terminal立ち上げるのもめんどくさいのでアプリ化して、ついでにいい感じのアイコンもつけてあげます。
  9. これをdockに載せて完成。アプリアイコン突っつくたびにシャッフル再生開始>停止 を繰り返します。

作ってみる

アプリを作る

アプリを作るといっても、別にプログラム書いたり開発ツール入れたりとかはいらないです。 なんかうまく動かなかったときのために、多少前提知識はあったほうがいいですが、多分コピペで動くように作ってあります。

というわけで、実作業を開始します。

作業は、ターミナルウィンドウ上でコマンドを叩きながら行うので、取り合えずターミナルを起動してください。

最初にプレイリストファイルを作成します。

諸般の事情により、プレイリストは ~/Music/playlist.txt という名前で用意します。

場所を変えたい方は、このあとで出て来る playlist.txt を参照している箇所をなんかいい感じに読み替えたり置き換えたりしてください。

$ cd ~/Music
$ find ~/mnt/share/MUSIC -name *.mp3 > ./playlist.txt
$ find ~/mnt/share/MUSIC -name *.flac >> ./playlist.txt
$ find ~/mnt/share/download -name *.mp3 >> ./playlist.txt

音楽ファイルの保存場所に合わせて、パスの指定は適切に変更してください。

いったんホームディレクトリに戻り、適当な作業ディレクトリを作ります。

$ cd ~
$ mkdir work
$ cd work

作成するアプリの雛形を作ります。

$ mkdir shufflePlay.app
$ cd shufflePlay.app
$ mkdir Contents
$ cd Contents
$ mkdir MacOS
$ mkdir Resources

大文字と小文字、全角と半角の区別に注意してください。

次に、./Contents/MacOS 内に以下の内容の shellscript を作成し、更に実行権限も与えます。

$ cd MacOS
$ pwd
$ vi play.sh
#!/bin/sh

cd ~/Music

kill `pgrep -lf /play.sh|awk '{print $1}'`
IS_KILLED=$?
pkill afplay

if [ "$IS_KILLED" -ne 0 ]
then
  echo play start
  nohup cat playlist.txt | while read x; do echo -e "$RANDOM\t$x"; done | caffeinate -i sort -k1,1n | cut -f 2- | while read x; do afplay -q 1 "$x"; done >/dev/null 2>&1 &
else
  echo play stoped
fi
$ chmod +x play.sh

なお、hdmiなどで接続したディスプレイの内蔵スピーカーから音を出している方は、「caffeinate -i ... 」の部分を「caffeinate -id ... 」としてください。

ここまでの作業まで完了すれば、作成したshell script を実行することで曲の再生が始まり、もう一度実行すれば曲の再生が停止するはずです。

$ ./play.sh

うまく動かない場合、これまでの手順の見直しや、スピーカー音量の確認などを行ってください。

アプリの挙動を記載した Info.plist というファイルを ./Contents 以下に作成します。

アプリが起動した時に、先ほど作成したシェルスクリプトを動作させるようにしています。

また、アプリのアイコンの指定もこの中で行っています。

$ cd ..
$ vi Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>play.sh</string>
    <key>CFBundleIconFile</key>
    <string>play.icns</string>
  </dict>
</plist>

最後に、アプリアイコンを作ります。

めんどくさかったらこの手順はスキップしても良いのですが、せっかくなのでアプリのアイコンもそれっぽやつを作りましょう。

絵心がある方は自分で描いてもいいですし、そういうのは先人の資産を活用したいという方は「音楽プレーヤ アイコン」などの検索ワードで検索すれば色々と出てきます。著作権には気をつけつつ、その辺利用するのも一つの手とお思います。

画像の形式は、png が使えればいいのですが、.icns というファイル形式にする必要があります。

下記のサイトを利用すれば、webブラウザで、png 形式の画像を icns ファイルに変換することができます。

ICON CONVERTER: Convert PNG to ICO and ICNS online - iConvert Icons

作成した.icns ファイルは、./Contents/Resources/ ディレクトリに play.icns という名前で保存します。

ここまでの作業で、shufflePlay.app ディレクトリの中はこんな感じになっているはずです

.
└── Contents
    ├── Info.plist
    ├── MacOS
    │   ├── nohup.out
    │   └── play.sh
    └── Resources
        └── play.icns

以上で完成です、作ったアプリを Finderなどでアプリケーションディレクトリに移動すれば LaunchPadにアプリが現れるはずです。もちろん アプリをdockにドラッグ&ドロップすれば、dockにも追加することもできます。

試しに、アプリを起動してみると音楽再生が始まります。もう一度起動すると停止します。

以後、アプリを起動するたびに、曲の再生開始>停止>再生開始>停止 が繰り返されるはずです。

参考サイト

今回、参考にさせていただいたサイト様です。

うまく動かない、ということがあれば、こちらのサイトも参考にしてみてください。

caffeinate - Macのスリープを抑制できる純正コマンド | ソフトアンテナブログ

技術/MacOSX/シェルスクリプトを".app"("Bundle")化する - Glamenv-Septzen.net

徹底的にソフトウェアで豊かな音を奏でてみよう - ザリガニが見ていた...。

テキストをランダムにソートする - 揮発性のメモ2

というわけで、今回の記事はここまでです。

この記事が、皆様の音楽ライフの一助となれば幸いです。

ちなみに、僕が使っているPC用のスピーカーがこちらです。若干低音強めですがいい音で鳴らしてくれます。

最後までお読みいただいてありがとうございました。