音声の再生
何回か前の投稿で画像を表示することはできているので、
今回はそれに合わせて音を出して見ようと思います。
音声ファイルの準備
M5stackのフラッシュは具体的な容量はよくわからなかったんですが、
サイズがあまり大きくないらしく、音声ファイルもある程度サイズがあると溢れてしまいそうなので、
SDカードに保存しておきます。フォーマットとかは何も考えずに、買ってきた奴をそのままMacにブッ刺して
ルートのディレクトリに音声を放り込でおきます。
今回は super-dry.wav
というファイルを保存しておきます。
wavファイルを再生する関数を用意。
↑ここにwavを再生する関数があったので丸パクリしてmain.pyに書き写します。
from m5stack import lcd, buttonC, speaker
from machine import I2S
import os, wave
# スーパードライの画像表示
lcd.clear()
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)
# lcd.print("Hello world!")
lcd.image(0,0,'super-dry.jpg')
i2s = I2S( mode = I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_DAC_BUILT_IN,
rate = 16000,
bits = 16,
channel_format = I2S.CHANNEL_ONLY_RIGHT,
data_format = I2S.FORMAT_I2S_MSB)
# 音声の再生
def wav_player(fname):
wav = wave.open(fname)
i2s.set_dac_mode(I2S.DAC_RIGHT_EN)
i2s.sample_rate(wav.getframerate())
i2s.bits(wav.getsampwidth() * 8)
i2s.nchannels(wav.getnchannels())
i2s.volume(20)
while True:
data = wav.readframes(1024)
if len(data) > 0:
i2s.write(data)
print('.', end='')
else:
wav.close()
break
if buttonC.isPressed():
wav.close()
break;
os.mountsd()
# Playing WAV audio file
wav_player('/sd/super-dry.wav')
i2s.volume(0)
i2s.stop()
lcd.setBrightness(0)
wav再生のコード自体はちょっとよく理解していませんが、
SDをマウントしてルートディレクトリに置いてあるwavを再生する関数を呼ぶだけなので、
全体としては簡単な作りにはなっています。
I2SというのはInter-IC SoundといってIC間でデジタル音声データをシリアル転送するための規格みたいです。
(出典: Wikipedia)
勉強になりますね。さっぱり理解できてないですが。
再生中、再生後のボリュームがうるさかったので、
再生する際のボリュームと終わった後のボリュームを調整していたり、
終わった後のlcdの明るさを0にして真っ黒にしているのは再生後にボリュームを0にしているのに
何か音がなっているのを抑えようとして失敗した跡だったりするので、あんまり気にしなくても良いです。
ファイルをアップロード
できたmain.pyをampyを使ってアップロードし、音声を入れて置いたSDカードをM5stackに刺して
電源ボタンを押して再起動すると、うまいこと再生されました。
無事に音が鳴った
— 中鉢 洋介 (@cyubachi) 2018年5月4日
次はボタンを押して何かさせたい pic.twitter.com/1ME2OpVaPQ