WM8960
-- WM8960 コーデック用ドライバ¶
このドライバは、WM8960コーデックチップを制御するためのものです。これは NXP/Freescale が i.MX RT シリーズの MCU 向けに提供したCコードをPythonに変換したものです。追加された内容はほとんどありませんが、MicroPython の命名スタイルに合わせるためにAPIに関連する名前をいくつか変更/追加しています。
このドライバの主な目的は、コーデックの初期化と動作モードの設定です。コーデックのオーディオデータ処理は、このドライバでは行いません。それは別のドライバの役割となります。
WM8960 は、オーディオインターフェースに加えて I2C インターフェースをサポートしています。接続は使用するインターフェースやシステム内のデバイス数によって異なります。I2Cインターフェースの場合、SCL と SDA が接続される必要があり、もちろん GND と Vcc も接続する必要があります。I2Cのデフォルトアドレスは0x1Aです。
コンストラクタ¶
- class WM8960(i2c, sample_rate, *, bits=16, swap=SWAP_NONE, route=ROUTE_PLAYBACK_RECORD, left_input=INPUT_MIC3, right_input=INPUT_MIC2, sysclk_source=SYSCLK_MCLK, mclk_freq=None, primary=False, adc_sync=SYNC_DAC, protocol=BUS_I2S, i2c_address=WM8960_I2C_ADDR)¶
WM8960 ドライバオブジェクトを作成し、デバイスをデフォルト設定で初期化して WM8960 オブジェクトを返します。
最初の2つの引数のみが必須です。それ以外の引数はオプションです。引数は次のとおりです:
i2c は、I2C バスオブジェクトです。
sample_rate はオーディオのサンプルレートです。指定できる値は 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, 192000, 384000 です。ただし、すべての I2S ハードウェアがこれらのすべての値をサポートするわけではありません。
bits はオーディオワードごとのビット数です。指定できる値は 16, 20, 24, 32 です。
swap* を指定した場合、左右のチャンネルを入れ替えます。指定できる値については後述します。
route は、コーデック内のオーディオパスの設定です。指定できる値については後述します。
left_input は左入力チャンネルのオーディオソースを設定します。指定できる値については後述します。
right_input は右入力チャンネルのオーディオソースを設定します。指定できる値については後述します。
play_source は出力オーディオのターゲットを設定します。指定できる値については後述します。
sysclk_source は、内部マスタークロックである "sysclk" を MCLK 入力から直接取得するか、内部 PLL を使って導出するかを制御します。通常、これを変更する必要はありません。
mclk_freq は、コーデックの MCLK ピンに適用される mclk 周波数を設定します。設定しない場合、デフォルト値が適用されます。
primary は、WM8960 をプライマリまたはセカンダリデバイスとして動作させるかを指定します。デフォルトは
False
です。False
の場合、 sample_rate と bits は MCU によって制御されます。adc_sync は、ADC 同期信号に使う入力を設定します。デフォルトでは DACLRC ピンを使います。
protocol は通信プロトコルを指定します。デフォルトは I2S です。指定できる値については後述します。
i2c_address は、WM8960 の I2C アドレスを指定します。デフォルトは
0x1A
です。
mclk_freq を指定しない場合、次のデフォルト値が適用されます:
sysclk_source == SYSCLK_PLL の場合: サンプルレートが 44100, 22050, 11025 Hz のときは 11.2896 MHz、サンプルレートが 48000 未満のときは 12.288 MHz、それ以外の場合は sample_rate * 256 になります。
sysclk_source == SYSCLK_MCLKの場合: sample_rate * 256 になります。
別のオシレーターなどを使って MCLK 信号が適用される場合、正しい動作のためにはその周波数を指定する必要があります。
引数に指定できる値の表¶
値 |
名前 |
---|---|
0 |
SWAP_NONE |
1 |
SWAP_INPUT |
2 |
SWAP_OUTPUT |
値 |
名前 |
---|---|
2 |
BUS_I2S |
1 |
BUS_LEFT_JUSTIFIED |
0 |
BUS_RIGHT_JUSTIFIED |
3 |
BUS_PCMA |
19 |
BUS_PCMB |
値 |
名前 |
方式 |
---|---|---|
0 |
INPUT_CLOSED |
|
1 |
INPUT_MIC1 |
シングルエンド信号 |
2 |
INPUT_MIC2 |
差動信号 |
3 |
INPUT_MIC3 |
差動信号 |
4 |
INPUT_LINE2 |
|
5 |
INPUT_LINE3 |
値 |
名前 |
---|---|
0 |
ROUTE_BYPASS |
1 |
ROUTE_PLAYBACK |
2 |
ROUTE_PLAYBACK_RECORD |
5 |
ROUTE_RECORD |
値 |
名前 |
---|---|
0 |
SYSCLK_MCLK |
1 |
SYSCLK_PLL |
値 |
名前 |
---|---|
0 |
MODULE_ADC |
1 |
MODULE_DAC |
2 |
MODULE_VREF |
3 |
MODULE_HEADPHONE |
4 |
MODULE_MIC_BIAS |
5 |
MODULE_MIC |
6 |
MODULE_LINE_IN |
7 |
MODULE_LINE_OUT |
8 |
MODULE_SPEAKER |
9 |
MODULE_OMIX |
10 |
MODULE_MONO_OUT |
値 |
名前 |
---|---|
1 |
PLAY_HEADPHONE_LEFT |
2 |
PLAY_HEADPHONE_RIGHT |
4 |
PLAY_SPEAKER_LEFT |
8 |
PLAY_SPEAKER_RIGHT |
値 |
名前 |
---|---|
0 |
SYNC_ADC |
1 |
SYNC_DAC |
メソッド¶
初期化に加えて、このドライバは操作を制御するためのいくつかの便利なメソッドを提供します。
- WM8960.set_left_input(input_source)¶
左入力のソースを指定します。入力ソース名は上記に記載されています。
- WM8960.set_right_input(input_source)¶
右入力のソースを指定します。入力ソース名は上記に記載されています。
- WM8960.volume(module, volume_l=None, volume_r=None)¶
特定のモジュールの音量を設定または取得します。
音量値が指定されていない場合、現在の音量のタプルを返します。
1つまたは2つの値を指定した場合、特定のモジュールの音量を設定します。2つの値を指定した場合、最初の値は左チャンネルに、2番目の値は右チャンネルに適用します。1つの値しか指定しない場合、両方のチャンネルに同じ値が使用されます。値の範囲は、対数スケールで 0.0〜100.0 に正規化されます。
適切なモジュールおよび db/step のリストについては、次の表を参照してください。
dB/Step |
名前 |
---|---|
1.28 |
MODULE_ADC |
1.28 |
MODULE_DAC |
0.8 |
MODULE_HEADPHONE |
0.475 |
MODULE_LINE_IN |
0.8 |
MODULE_SPEAKER |
- WM8960.mute(module, mute, soft=True, ramp=wm8960.MUTE_FAST)¶
出力をミュートまたはミュート解除します。 mute が True の場合は出力をミュートし、
False
の場合はミュート解除します。soft を True にした場合、ミュートはソフトな遷移で行われます。遷移の時間は ramp で指定し、
MUTE_FAST
またはMUTE_SLOW
を選択できます。
- WM8960.set_data_route(route)¶
オーディオデータのルートを設定します。パラメータ値/名前については、上記の表を参照してください。
- WM8960.set_module(module, active)¶
モジュールを有効または無効にします。 active には
False
またはTrue
を指定します。モジュール名のリストについては、上記の表を参照してください。MODULE_MONO_OUT
を有効にすることは、WM8960.mono
メソッドとは異なることに注意してください。前者は出力3を有効にし、WM8960.mono
メソッドはモノラルミックスを左と右の出力に送ります。
- WM8960.enable_module(module)¶
モジュールを有効にします。モジュール名のリストについては、上記の表を参照してください。
- WM8960.disable_module(module)¶
モジュールを無効にします。モジュール名のリストについては、上記の表を参照してください。
- WM8960.expand_3d(level)¶
ステレオ3D拡張を有効にします。 level は 0 から 15 の数値で、0 を指定すると拡張が無効になります。
- WM8960.mono(active)¶
active が
True
の場合、モノラルミックスが左と右の出力チャンネルに送られます。これはMODULE_MONO_MIX
を有効にすることとは異なり、後者は出力3を有効にします。
- WM8960.alc_mode(channel, mode=ALC_MODE)¶
ALCモードを有効または無効にします。パラメータは次のとおりです:
channel は ALC を有効にし、チャンネルを設定します。パラメータの値は次のとおりです:
ALC_OFF: ALC をオフ
ALC_RIGHT: 右入力チャンネルを使用
ALC_LEFT: 左入力チャンネルを使用
ALC_STEREO: 両方の入力チャンネルを使用
mode は ALC モードを設定します。入力値は次のとおりです:
ALC_MODE: ALC として動作
ALC_LIMITER: リミッターとして動作
- WM8960.alc_gain(target=-12, max_gain=30, min_gain=-17.25, noise_gate=-78)¶
ターゲットレベル、最大および最小のゲインレベル、ノイズゲートを dB レベルで設定します。許可される範囲は次のとおりです:
target: -22.5 dB から -1.5 dB
max_gain: -12 dB から 30 dB
min_gain: -17 dB から 25 dB
noise_gate: -78 dB から -30 dB
超過した値は許可された範囲に制限されます。 noise_gate の値が -78 dB以下の場合、ノイズゲート機能は無効になります。
- WM8960.alc_time(attack=24, decay=192, hold=0)¶
ALC のダイナミック特性を設定します。時間はミリ秒単位で指定します。指定できる範囲は次のとおりです:
attack: 6 から 6140
decay: 24 から 24580
hold: 0 から 43000
超過した値は許可された範囲内に制限されます。
- WM8960.deemphasis(active)¶
再生用のディーミファシスフィルタを有効または無効にします。 active には
False
またはTrue
を指定します。このフィルタは、32000, 44100, 48000 のサンプルレートに対してのみ適用されます。他のサンプルレートの場合、フィルタ設定は無視されます。
- WM8960.deinit()¶
すべてのモジュールを無効にします。
サンプルコード¶
セカンダリーモード(デフォルト)で WM8960 を動作:
# Micro_python WM8960 コーデックドライバ
#
# デフォルト設定を使ってドライバをスレーブモードに設定
#
from machine import Pin, I2C
import wm8960
i2c = I2C(0)
wm=wm8960.WM8960(i2c, 32000, left_input=wm8960.INPUT_MIC1)
wm.set_volume(wm8960.MODULE_HEADPHONE, 100)
プライマリーモード(デフォルト)で WM8960 を動作:
# Micro_python WM8960 コーデックドライバ
#
# 特定のオーディオフォーマット設定を使ってドライバをマスターモードに設定
#
from machine import Pin, I2C
import wm8960
i2c = I2C(0)
wm=wm8960.WM8960(i2c, 44100, primary=True, bits=16)
セカンダリーモード(デフォルト)で MIMXRT10xx_DEV ボード上の WM8960 を動作:
# Micro_python WM8960 コーデックドライバ
#
# デフォルト設定を使ってドライバをスレーブモードに設定すると、入力チャンネルが
# 入れ替わり、右入力に接続された MIMXRT Dev ボードのマイクが左オーディオ
# チャンネルに割り当てられます。
#
from machine import Pin, I2C
import wm8960
i2c = I2C(0)
wm=wm8960.WM8960(i2c, sample_rate=16_000,
adc_sync=wm8960.SYNC_DAC,
swap=wm8960.SWAP_INPUT,
sysclk_source=wm8960.SYSCLK_MCLK)
セカンダリーモード(デフォルト)で Teensy と Sparkfun WM8960 ブレイクアウトボードによる録音:
# Micro_python WM8960 コーデックドライバ
#
# ブレイクアウトボードは固定の24MHz MCLKを使っています。したがって、内部 PLLを
# sysclk として使用する必要があります。これはマスターオーディオクロックです。
# Sparkfun ボードには、RX および TX 用の WS ピンがボード上で接続されています。
# したがって、adc_sync は sync_adc に設定する必要があり、これにより ADCLRC
# ピンが入力として構成されます。
#
from machine import Pin, I2C
import wm8960
i2c = I2C(0)
wm=wm8960.WM8960(i2c, sample_rate=16_000,
adc_sync=wm8960.SYNC_ADC,
sysclk_source=wm8960.SYSCLK_PLL,
mclk_freq=24_000_000,
left_input=wm8960.INPUT_MIC1,
right_input=wm8960.INPUT_CLOSED)
セカンダリーモード(デフォルト)で Teensy と Sparkfun WM8960 ブレイクアウトボードによる再生:
# ブレイクアウトボードは固定の24MHz MCLKを使っています。したがって、内部 PLLを
# sysclk として使用する必要があります。これはマスターオーディオクロックです。
# Sparkfun ボードには、RX および TX 用の WS ピンがボード上で接続されています。
# したがって、adc_sync は sync_adc に設定する必要があり、これにより ADCLRC
# ピンが入力として構成されます。
from machine import I2C
i2c=I2C(0)
import wm8960
wm=wm8960.WM8960(i2c, sample_rate=44_100,
adc_sync=wm8960.SYNC_ADC,
sysclk_source=wm8960.SYSCLK_PLL,
mclk_freq=24_000_000)
wm.set_volume(wm8960.MODULE_HEADPHONE, 100)