コマンドラインでイコライザーを制御する方法は何ですか?

コマンドラインでイコライザーを制御する方法は何ですか?

したがって、Pulseaudioにはイコライザーが組み込まれています。

モジュールイコライザーレシーバー

~によるとhttp://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Equalizer、qpaeq GUIを使用して制御できます。

Xlessシステム(セッションモードで実行)でPAイコライザーを設定する方法はありますか?

ベストアンサー1

qpaeqPulseaudioに付属のスクリプトを適用した内容は次のとおりです。

#!/usr/bin/env python
# pulse-set-eq
import os,math,sys
import dbus

# Source adapted from utils/qpaeq of PulseAudio

def connect(): # copied from qpaeq
    try:
        if 'PULSE_DBUS_SERVER' in os.environ:
            address = os.environ['PULSE_DBUS_SERVER']
        else:
            bus = dbus.SessionBus() # Should be UserBus, but D-Bus doesn't implement that yet.
            server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
            address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface='org.freedesktop.DBus.Properties')
        return dbus.connection.Connection(address)
    except Exception as e:
        sys.stderr.write('There was an error connecting to pulseaudio, '
                         'please make sure you have the pulseaudio dbus '
                         'module loaded, exiting...\n')
        sys.exit(-1)

def get_sink(str):
    connection=connect()
    path='/org/pulseaudio/core1/sink%s'%str
    sink=connection.get_object(object_path=path)
    return sink

args = sys.argv[1:]
if len(args)<5:
    print("Usage: "+sys.argv[0]+" SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2...]")
    sys.exit()


sinknum = args.pop(0);
sink = get_sink(sinknum);

prop_iface='org.freedesktop.DBus.Properties'
eq_iface='org.PulseAudio.Ext.Equalizing1.Equalizer'
sink_props=dbus.Interface(sink,dbus_interface=prop_iface)

def get_eq_attr(attr):
    return sink_props.Get(eq_iface,attr)

sample_rate=get_eq_attr('SampleRate')
filter_rate=get_eq_attr('FilterSampleRate')
nchannels=get_eq_attr('NChannels')

sys.stderr.write('channels %d, sample rate: %f, filter sample rate: %f\n'%
    (nchannels, sample_rate, filter_rate))

channel = int(args.pop(0));
preamp = float(args.pop(0));

freqs = [];
coeffs = [];
while len(args) > 0:
    if len(args)==1:
        sys.stderr.write('Odd number of frequency/amplification arguments (%d)\n'%(len(freqs)*2+1))
        sys.exit(-1)
    sys.stderr.write('(%s, %s)\n'%(args[0],args[1]))
    freqs.append(float(args.pop(0)))
    coeffs.append(float(args.pop(0)))

#sys.stderr.write("freqs: "+str(freqs)+'\n');

freqs = list([int(round(x*filter_rate/sample_rate)) for x in freqs])
#sys.stderr.write("translated freqs: "+str(freqs)+'\n');

freqs = [0]+freqs+[filter_rate//2];
coeffs = [coeffs[0]]+coeffs+[coeffs[-1]];
#sys.stderr.write("proper freqs: "+str(freqs)+'\n');

# for some reason this fixes the types of the arguments to SeedFilter
sink=dbus.Interface(sink,dbus_interface=eq_iface)

# set the filter coefficients
sink.SeedFilter(channel,freqs,coeffs,preamp)

使用法:

pacmd list-sinks以下を使用して受信者番号を取得します。

./pulse-set-eq SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2 …]

CHANNEL_NUM 0 は最初のチャネルに対応し、1 は 2 番目のチャネルに対応するようです。実際のチャンネル数(たとえば、2つのチャンネルがある場合は2)を使用すると、すべてのチャンネルがイコライゼーションに設定されます。 。

を使用していつでもアプリの設定を確認できますqpaeq

前提条件:

まず、イコライザーモジュールとDBusプロトコルモジュールをロードする必要があります。

pactl load-module module-dbus-protocol
pactl load-module module-equalizer-sink sink_name=... sink_master=...
pactl set-default-sink ...

スクリプトでプレイ

それから音や音楽などを作りましょう。

play -n synth pinknoise gain -10

その後、受信機番号、イコライザーを適用するチャンネルインデックス、プリアンプ(スケーリング)要素、および(周波数、係数)ペアのリストを使用してスクリプトが呼び出されます。周波数リストはフィルタ係数を得るために補間されるので(参照seed_filter)、密度が高い必要はありません。pulseaudio/src/modules/module-equalizer-sink.cチャネルの総数をチャネルインデックスとして指定すると、更新はすべてのチャネルに適用されます。pacmd list-sinks受信者番号を取得するために使用されます。

たとえば、受信機番号が$ SINKNUMでチャンネルが2つの場合、イコライザーはすべて1にリセットされます。これは次の電源を入れることで確認できますqpaeq

./pulse-set-eq $SINKNUM 2 1.0    100 1.0

ここで、100Hzは任意です。リストは空にすることはできず、0から始めることはできません。頻度は0から32768の間でなければなりません(これは最大値です。設定可能かどうかはわかりません。filter_rate上記の変数を参照してください。半分です)。スクリプトは、対応する周波数以下の周波数に対してそれぞれ最小および最大周波数に対してコマンドラインで指定された増幅係数を使用するため、この場合、スペクトル全体に増幅係数1.0が割り当てられます。この設定では、イコライザーは信号を変更せずに維持します(少なくとも理論的には)。

スピーカーが損傷しないように注意してください。たとえば、ピンクノイズを生成し、イコライザーを単一周波数(500Hz)(100倍増幅)のスパイクに設定してみてください。

./pulse-set-eq $SINKNUM 2 1.0    499 0 500 100 501 0

これにより、フィルタ実装の連続DFTウィンドウに属すると仮定する500Hzで、さまざまなランダムボリュームの一連の個々のトーンを聞くことができます。やや楽しかったです。このフィルタで音楽を再生するのは楽しいです。コマンドラインバージョンを持たない一般的なグラフィックイコライザーを使用して、この明確な「帯域通過」を達成することは不可能です。

以下の例では、サイレンのように周波数が上下に移動するフィルタを作成します。明らかに効果を聞くには、音楽やノイズなどを再生する必要があります。

SINKNUM=12; NCHAN=2;
while true; do
    for i in $(seq 500 10 1500) $(seq 1500 -10 500); do
        ./pulse-set-eq $SINKNUM $NCHAN 1 \
            0 1 $(( $i - 300 )) 1 \
            $i 5 $(( $i + 300 )) 1 \
            32768 1;
    done;
done

おすすめ記事