SimulRadio – 音量設定(mpc volume)

サイマルラジオはMPDによる接続も安定してずいぶん使い勝手も良くなりました。(数日前musicbirdのサーバーが怪しいときがありましたが…)

残る問題はラジオ局によって音量の違いがかなりあることだと思います。
流石にradikoはほとんど音量が揃っています。(NHKは若干低め)
サイマルラジオ局の音量はradikoと比較すると低めのところが多いようです。

自動化は無理としてもなんとか音量の違いをカバーする方法を考えてみたいと思います。
手順としてはpythonで外部プログラム(simul-vol.py)を作成
ラジオ局固有のボリューム情報を作成(vol)
操作しやすいように適当なメニューにボリュームボタンを配置
ラジオの再生を開始したらボリュームボタンを1回押すという想定をします。

作業にあたってpulseaudioの挙動を確認してみます。

Orange Pi 3


通常radikoの再生音量は20%で利用しています。このときpavucontrolの再生タブ(アプリケーション)と出力装置タブは同じ20%になります。SimulRadioを再生してmpd(mpc)の音量を上げていくと再生タブと出力タブは同じ値で上昇しますがそこから音量を下げていくと再生タブのみ追従します。実際の音量は再生タブの値ですね。再生タブ側はアプリケーションでコントロールする仕様と思います。新たにradikoなどを再生すると出力タブの音量で再生するので気をつけなければいけません。

Raspberry Pi 3

RaspberryPiのalsa環境を確認しようと切り替えたらいつの間にかpulseaudioが動いていますね。物心(pulse heart)付いた頃から常に~/.config/pulseにはclient.confを入れていたためいつどの時点で変更になったのか全く気が付きませんでした。lxsessionのpulseaudioのチェックは外れています。

確認手順としてはpulse server(moode)を停止、~/.config/mpd/mpd.confのaudio_outputをpulseからalsaに変更してmpd再起動、~/.config/pulse/client.confを削除した時点で切り替わりました。
pavucontrolをインストールしていないと通常はalsaと変わらないので気が付かないかもしれません。

mpc volume


音量の制御はmpc volumeコマンドを利用しています。
mpc playの状態でmpc volumeが適用されます。

ボリュームリスト(vol)の作成

サンプルはradikoの音量とほぼ同じかつしかFMを基準に実際に聴取して±の値を決めています。変更なしは+0を記載
最初は大雑把に決めていいと思います。またテスト用のIDだけでもいいです。
ファイルは一つにしていますが分けることも可能です。
/home/pi/radio/vol

JCB001 +3
JCB002 +3
JCB003 +6
JCB004 +0
---
30001 +2
30002 +10
30003 +10

simul-vol.py

default volumeの設定箇所はこのファイルと下のkillall.shの2箇所あります。環境に合わせて変更します。
最初にmpc volumeからボリューム値を取得しています。(vol_level)
値は0〜99を取得していますがここで使っているのはn/a以外を判断しています。
取得した値をなにかに利用する場合は文字列になっているのでint(vol_level)で数値にする必要があります。
プログラムの基本はON AIRの動作と全く一緒でmpc playlistからIDを取得、作成したボリュームリスト(vol)のIDを検索して設定値を取得、その値でmpc volume +nします。
NHKもurlを検索して少しUPしています。
~/bin/simul-vol.py

#!/usr/bin/python3
import subprocess
import re

# default volume
vol = "mpc volume 20"

# mpc volume
command = ("mpc volume | grep -oP 'volume.{4}'")
vol_level = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
vol_level = vol_level[8:]
vol_level = vol_level.strip()
#print(vol_level)
if vol_level != 'n/':
    subprocess.run(vol, shell=True)
    command = ("mpc playlist | grep -oP 'JCB.{0,3}' | grep -v {")
    proc = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
    if not (proc):
        command = ("mpc playlist | grep -oP 'jp/3.{0,4}' | grep -v {")
        proc = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
        # other
        if not (proc):
            command = ("mpc playlist | grep -oP 'nhk.{0,5}' | grep -v {")
            proc = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
            proc = proc.strip()
            # NHK
            if proc == 'nhkradio':
                subprocess.run("mpc volume +4", shell=True)
            else:
                subprocess.run("mpc volume +0", shell=True)

        # ListenRadio
        else:
            proc = proc.strip()
            proc = proc[3:]
            with open("/home/pi/radio/vol", 'r') as f:
                for id in f:
                    if re.search((proc), id):
                        v = id[5:]
                        command = ("mpc volume" + (v))
                        subprocess.run(command, shell=True)
    # JCBA
    else:
        proc = proc.strip()
        with open("/home/pi/radio/vol", 'r') as f:
            for id in f:
                if re.search((proc), id):
                    v = id[6:]
                    command = ("mpc volume" + (v))
                    subprocess.run(command, shell=True)
else:
    quit

killall.sh

ラジオ局の切り替えや終了時は一旦ポーズしてデフォルトボリューム値を設定、mpc clearを実行。clearするとstopも実行します。
simul.py起動時はmpc playしていないのでmpc volume はn/aになっています。起動時はOSに保存されているmpc volumeの値が使われるためここで保存します。(必ずしもここの設定だけが保存されるとは限りません)
またラジオ局の切替時もデフォルトボリューム値を再設定します。
~/bin/killall.sh

#!/bin/sh
mpc pause 1>/dev/null 2>/dev/null
# デフォルトボリューム値を設定
mpc volume 20 1>/dev/null 2>/dev/null
sleep 0.1 
mpc clear 1>/dev/null 2>/dev/null
killall -q mpv 
killall -q mplayer
killall -q ffplay


volumeの値はncmpcppにリアルタイムに表示されます。
ボタンはncmpcpp下のスピーカーアイコンを使っています。
デフォルトボリューム値からncmpcppで音量を変更確認してID volume値を編集保存、ボタンを押すと即座に反映します。

サイマルラジオの音量は番組やCMによってもかなりアバウトに感じます。修正を加えながらリストを育てると使いやすくなると思います。

これまで10%以上開きがあると聴く気にならなかったのですが今は普通に聴くことができます。音質の悪いラジオ局はNGですが。

作成したsimul-vol.pyは実行権限を付けてメニューボタンから実行します。

$ chmod 755 simul-vol.py

参考 無責任 無保証です。ボリュームリスト(vol)は環境によってデフォルトボリュームが違うと思うので勝手に作成してください。
app.py サンプルメニュー
simul-vol.py
simul.py ID Editはボリュームリスト(Vol Edit)に変更しました。
ListboxはOS,fontなどによって見え方が違ってくると思います。
font sizeやwidthなど適当にいじってください。

radikoは放送大学を除いて無料で受信できるラジオ局を全て登録しました。
radikoのホームページにアクセスするとエリアが表示されます。これプロバイダの接続点ですね。放送局をクリックするとurlの末尾にradikoスクリプトに指定するIDが見えます。

だいぶラジオ環境が充実してきました。