ワタナベ書店

読んだ本の感想とか美味しかったお店の紹介とかLinuxの知見とか好きなことを好きなだけ書くブログです。

Raspberry PiでSpotifyプレイヤーを作った話

この記事はIoTLT Advent Calendar 2016 - Qiita 16日目の記事です。

昨日はマインクラフトのTNTを現実世界から爆発させてみる(Wio Nodeを使います) - ぐるなびをちょっと良くするエンジニアブログでした。

成果物

手っ取り早く成果物の動画です。 音声を聞ける状態でご査収ください。

Raspberry Pi(Volumio) + PowerMate + NFCリーダー + NFCカードで構成されています。

音量の調整、音楽の一時停止/再生が可能です。

ポストカードに仕込んだnfcSpotifyのプレイリストが紐付けられており、
ポストカードをプレイヤーの上にのせることで再生中のプレイリストを変えることができます。

いい感じにオサレっぽい雰囲気が出ていて満足です。

おしまい。
以下、技術的に興味がある人向けの解説です。

解説

音楽サービス Spotify

Spotifyというのは音楽ストリーミングサービスのひとつで、いろんな音楽が無料で聞けたりします(途中で広告が入ったりするけど)

おすすめの使い方として、公式のSpotifyアカウントや、ユーザーが作ったプレイリストをフォローして、聴くという使い方があります。

プレイリストはテーマとかジャンルでまとめられていて、プレイリスト作成者が曲をアップデートするとフォローした自分のプレイリストもアップデートされます。
なので、好きなアーティストを追っかけてるプレイリストをフォローしておくだけで新曲がプレイリストに入ってきたり、素敵な曲がテーマのプレイリストがいつの間にか収録されてる曲が変わっていたりして、同じプレイリストでも、いつでも新鮮な気持ちで聴けます。

そんな素敵サービスSpotifyですが、毎月980円支払うことで実質無料でRaspberry Piで視聴可能になります。やったね!!
PREMIUMアカウントになることでいろんな機器で聴けるようになるよ!

音楽専用OS Volumio

Volumioという音楽再生に特化したOSがあります。
現在も順調に開発されており、いろんな機能が追加されたり、DACに対応したり、バグが潰されています。

インストールはとても簡単で、OSイメージファイルをダウンロードして、SDカード書き込みソフト使ってSDカードに書き込んでRaspberry Piにさしてやれば使えるようになるという簡単さ。

Raspberry Pi 3であればRaspberry PiからWi-Fiスポットが出て接続が可能になりますし、LANケーブルを有線で繋げばそれだけでOK。
あとはブラウザからhttp://volumio.local/ にアクセスすれば↓のようなWEBUIが表示されます。

f:id:iuyui:20161216031614p:plain

そんな素敵OS Volumioはプラグインで機能を拡張でき、Spotifyを再生することができます。やったね!http://volumio.local/plugin-manager からSpotify プラグインがインストールできるよ!

ハードウェア

そんな感じで素敵サービスと素敵OSで音楽を楽しめるようになりましたが、Raspberry Pi のイヤホンジャックの音質は控えめに言っても残念なのでUSBアンプから出力するようにしました。
DigiFiって雑誌で話題になったOlasonic設計のデジタルパワーアンプです。
Volumioは音声の出力先をWEBUIから選ぶことが可能で、コマンドによる切り替えは不要です。とても便利。

スピーカーは部屋に転がっていたDALIのZENSOR1にしました。ZENSOR1 はいいぞ。

DALI スピーカーシステム  ZENSOR 1 ライトウォールナット ZENSOR1

DALI スピーカーシステム ZENSOR 1 ライトウォールナット ZENSOR1

あと、WEBUIがオシャレでも再生や一時停止、Spotifyのプレイリストを再生するのにいちいちWEBブラウザをぽちぽちするのも面倒なので物理的に操作できるようにしました。

SONY 非接触ICカードリーダーライター  P RC-S380

SONY 非接触ICカードリーダーライター P RC-S380

ということでPowerMateという高級オーディオのボリュームツマミ部分を別売したようなものと、NFCリーダーとNFCカードを買いました。

PowerMateで音量調整

しました。

初めはnode-powermateというnpmパッケージを使おうとしたのですが、node-powermateに対応していないpowermateを手に入れてしまったので、node-powermateが参照しているnode-hidという、HIDデバイスをjsから触れるパッケージを使用しました。powermateを扱うライブラリも存在し、使用可能だったのでそれをもとにコードを書きました。

var PowerMate = require('./powermate');

var io=require('socket.io-client');
var socket= io.connect('http://localhost:3000');

var powerMate;

for (var i = 0; i < PowerMate.deviceCount(); i++) {
    socket.emit('getState', '');
    status = "null";
    console.log('opening powermate', i);

    powerMate = new PowerMate.PowerMate(i);

    socket.on('pushState',function(data){
        console.log(data.status);
        status = data.status ;
    });

    powerMate.on('buttonDown', function () {
        console.log('button down');
        if (status == "play") {
            socket.emit('pause');
        } else {
            socket.emit('play');
        }
    });

    powerMate.on('turn', function (delta, position) {
        console.log('delta', delta, 'position', position);
        socket.emit('volume', position);
    });
}

このコードをVolumio で実行すれば音量調整と再生/停止が可能になります。適時必要なパッケージを入れたりOS内でプロセスが落ちても上がるようにSupervisorなんかでデーモン化しておきましょう。

NFCSpotifyのプレイリストを再生する

しました。

nfcはnfcpyを利用しスキャンするようにしています。
その結果をgrepして、プログラムにハードコードされたNFCカードのタグ情報とマッチングさせるという汚い方法でどうにかしてます。

それぞれのnfcカードのIDと再生したいプレイリストを紐付けたかったのですが、どうやらVolumio 内部でSpotifyのプレイリストを再生するときのAPIは、プレイリストを上から数えた順番で指定するらしく、プレイリスト名での再生はできないようでした。まじか。
一度、Spotifyのプレイリストを全出力した後、grepかなにかで上から何番目か調べるという手もあったのですが、面倒だったので Spotifyのプレイリストを手動で調整して、再生したいプレイリストを任意の順番に移動させるというアナログな手段にすることにしました。

var io=require('socket.io-client');
var socket= io.connect('http://localhost:3000');

var playlist = 'spotify/playlists/' + process.argv[2];

console.log('play', playlist);

socket.emit('addToQueue',{
   "uri":playlist,
   "service":"spop"
});

プレイリストを再生するnode.jsスクリプトは上のようになります。引数に再生したいプレイリストを上から数えた数字を指定してやれば、Volumio の再生キューに追加されます。

node play.js 1 #上から数えて1番目の(EGOIST)プレイリストが追加される

完成とまとめ

ということで、これが完成した姿です!ダサい!

どうにかそれを見栄え良くしたものが次のものとなります。
写真の加工的に北欧暮らしの道具店っぽさが出ています。

IoT機器は基板が見えたりすると、どうしても無骨な感じがしますし、ただのネットにつながるよくわからない『何か』にしかみえないです。
そのあたり、うまくデザインや仕組みで隠蔽化してインターネットに繋がる良さだけを具現化させてやることで実用的なIoT機器が作れるのではないでしょうか。

今回作ったSpotifyプレイヤーは基盤をアクリルと箱で隠し、Spotifyのプレイリストという仮想的な物をポストカードという実物に変え隠蔽化し、Spotifyという大量の音楽を再生することができるサービスをいい感じに具現化させた機器を作れたのではないかなと思っており結構満足です。

さて、明日(17日)はゆとり (@yutori_828) | Twitterさんです!! いろんなイベントに出たり、発表をしたりしており、彼女のブログはとても面白いですよ!
明日も楽しみですね。

終わり。