Raspberry PiでSpotifyプレイヤーを作った話
追記
作り直しました。
この記事はIoTLT Advent Calendar 2016 - Qiita 16日目の記事です。
昨日はマインクラフトのTNTを現実世界から爆発させてみる(Wio Nodeを使います) - ぐるなびをちょっと良くするエンジニアブログでした。
成果物
手っ取り早く成果物の動画です。
音声を聞ける状態でご査収ください。
Raspberry Pi(Volumio) + PowerMate + NFCリーダー + NFCカードで構成されています。
音量の調整、音楽の一時停止/再生が可能です。
ポストカードに仕込んだnfcにSpotifyのプレイリストが紐付けられており、
ポストカードをプレイヤーの上にのせることで再生中のプレイリストを変えることができます。
いい感じにオサレっぽい雰囲気が出ていて満足です。
おしまい。
以下、技術的に興味がある人向けの解説です。
解説
音楽サービス Spotify
Spotifyというのは音楽ストリーミングサービスのひとつで、いろんな音楽が無料で聞けたりします(途中で広告が入ったりするけど)
おすすめの使い方として、公式のSpotifyアカウントや、ユーザーが作ったプレイリストをフォローして、聴くという使い方があります。
プレイリストはテーマとかジャンルでまとめられていて、プレイリスト作成者が曲をアップデートするとフォローした自分のプレイリストもアップデートされます。
なので、好きなアーティストを追っかけてるプレイリストをフォローしておくだけで新曲がプレイリストに入ってきたり、素敵な曲がテーマのプレイリストがいつの間にか収録されてる曲が変わっていたりして、同じプレイリストでも、いつでも新鮮な気持ちで聴けます。
そんな素敵サービスSpotifyですが、毎月980円支払うことで実質無料でRaspberry Piで視聴可能になります。やったね!!
PREMIUMアカウントになることでいろんな機器で聴けるようになるよ!
音楽専用OS Volumio
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
- この商品を含むブログ (4件) を見る
Volumioという音楽再生に特化したOSがあります。
現在も順調に開発されており、いろんな機能が追加されたり、DACに対応したり、バグが潰されています。
インストールはとても簡単で、OSイメージファイルをダウンロードして、SDカード書き込みソフト使ってSDカードに書き込んでRaspberry Piにさしてやれば使えるようになるという簡単さ。
Raspberry Pi 3であればRaspberry PiからWi-Fiスポットが出て接続が可能になりますし、LANケーブルを有線で繋げばそれだけでOK。
あとはブラウザからhttp://volumio.local/ にアクセスすれば↓のようなWEBUIが表示されます。
そんな素敵OS Volumioはプラグインで機能を拡張でき、Spotifyを再生することができます。やったね!http://volumio.local/plugin-manager からSpotify プラグインがインストールできるよ!
ハードウェア
そんな感じで素敵サービスと素敵OSで音楽を楽しめるようになりましたが、Raspberry Pi のイヤホンジャックの音質は控えめに言っても残念なのでUSBアンプから出力するようにしました。
DigiFiって雑誌で話題になったOlasonic設計のデジタルパワーアンプです。
Volumioは音声の出力先をWEBUIから選ぶことが可能で、コマンドによる切り替えは不要です。とても便利。
DigiFi Crafts USB DAC内蔵デジタルパワーアンプ アクリルカバー仕様 DF13A
- 出版社/メーカー: ステレオサウンド
- 発売日: 2015/12/01
- メディア: エレクトロニクス
- この商品を含むブログを見る
スピーカーは部屋に転がっていたDALIのZENSOR1にしました。ZENSOR1 はいいぞ。
DALI スピーカーシステム ZENSOR 1 ライトウォールナット ZENSOR1
- 出版社/メーカー: ダリ
- 発売日: 2011/09/20
- メディア: エレクトロニクス
- クリック: 1回
- この商品を含むブログを見る
あと、WEBUIがオシャレでも再生や一時停止、Spotifyのプレイリストを再生するのにいちいちWEBブラウザをぽちぽちするのも面倒なので物理的に操作できるようにしました。
Griffin Technology NA16029 PowerMate 【カスタマイズ可能なUSBマルチメディアコントローラー】 並行輸入品
- 出版社/メーカー: Griffin Technology
- メディア: Personal Computers
- 購入: 3人 クリック: 31回
- この商品を含むブログ (1件) を見る
ソニー SONY 非接触ICカードリーダー/ライター PaSoRi RC-S380
- 出版社/メーカー: ソニー(SONY)
- 発売日: 2012/10/10
- メディア: Personal Computers
- 購入: 5人 クリック: 9回
- この商品を含むブログ (18件) を見る
マイフェア ICカード (Mifare Ultralight, マイフェアウルトラライト) 業務用, TU-C1 (3枚)
- 出版社/メーカー: 株式会社オレンジタグス
- メディア: エレクトロニクス
- この商品を含むブログを見る
ということでPowerMateという高級オーディオのボリュームツマミ部分を別売したようなものと、NFCリーダーとNFCカードを買いました。
PowerMateで音量調整
しました。
こんなの作った pic.twitter.com/bplcTQGiL1
— せにょ (@senyoltw) 2016年11月26日
初めは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なんかでデーモン化しておきましょう。
NFCでSpotifyのプレイリストを再生する
しました。
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)プレイリストが追加される
完成とまとめ
ということで、これが完成した姿です!ダサい!
ネットワークオーディオプレイヤー自作したのだけど基板がみえてダサオブダサいので何か適当なカバーつけたい。 pic.twitter.com/MmeOQQW8NQ
— せにょ (@senyoltw) 2016年12月14日
どうにかそれを見栄え良くしたものが次のものとなります。
写真の加工的に北欧暮らしの道具店っぽさが出ています。
— せにょ (@senyoltw) 2016年12月16日
IoT機器は基板が見えたりすると、どうしても無骨な感じがしますし、ただのネットにつながるよくわからない『何か』にしかみえないです。
そのあたり、うまくデザインや仕組みで隠蔽化してインターネットに繋がる良さだけを具現化させてやることで実用的なIoT機器が作れるのではないでしょうか。
今回作ったSpotifyプレイヤーは基盤をアクリルと箱で隠し、Spotifyのプレイリストという仮想的な物をポストカードという実物に変え隠蔽化し、Spotifyという大量の音楽を再生することができるサービスをいい感じに具現化させた機器を作れたのではないかなと思っており結構満足です。
さて、明日(17日)はゆとり👲 (@yutori_828) | Twitterさんです!!
いろんなイベントに出たり、発表をしたりしており、彼女のブログはとても面白いですよ!
明日も楽しみですね。
終わり。