■歩行に同期したサウンド
歩行動作に合わせてサウンドを鳴らす(足音効果音)ようにしてみます。リスト5-6 walk.pyを元に、動作配列データにサウンド用の列を追加します。
リスト11-1 step_sound.py(部分)
angle = [
[75, 95, 90,110,110, 90, 90,110,110, 90, 95, 95, 8, 0],
[80, 90, 90,110,110, 80, 80,100,100, 90, 90,100, 8, 0],
[85, 85, 90, 90, 90, 90, 80, 90, 90, 90, 85,105, 4, 1],
[90, 80, 90, 70, 70, 90, 80, 80, 80, 90, 80,110, 4, 1],
[85, 85, 90, 70, 70, 90, 90, 70, 70, 90, 85,105, 8, 0],
[80, 90, 90, 80, 80,100, 100, 70, 70, 90, 90,100, 8, 0],
[75, 95, 90, 90, 90,100, 90, 90, 90, 90, 95, 95, 4, 2],
[70,100, 90,100,100,100, 90,110,110, 90, 100, 90, 4, 2]
]
buz = PWM(Pin(14))
while True: # 繰り返し
# キーフレームを更新
div_counter += 1
if div_counter >= angle[next_key_frame][12]:
div_counter = 0
key_frame = next_key_frame
next_key_frame += 1
if next_key_frame > rows-1:
next_key_frame = 0 #angle 0行に戻る
if angle[next_key_frame][13] == 0: #無音
buz.duty_u16(0)
elif angle[next_key_frame][13] == 1: #「ド」
buz.duty_u16(int(MAX_DUTY/2))
buz.freq(262)
elif angle[next_key_frame][13] == 2: #「ソ」
buz.duty_u16(int(MAX_DUTY/2))
buz.freq(392)
# 角度計算
for i in range(12):
temp_angle[i] = angle[key_frame][i] +\
(angle[next_key_frame][i] - angle[key_frame][i])\
* div_counter / angle[next_key_frame][12]
# サーボ駆動
for i in range(12):
servo[i].duty_u16(get_pulse_width(int(temp_angle[i]) + correction[i]))
time.sleep(0.03) # 0.03秒待ち
動作配列に追加したサウンド用データは、 0 : サウンド無し 1 : 「ド」発音 2 : 「ソ」発音 となっています。while Trueの中でフレームが次の行に移ったタイミングでサウンド列 (angle[ next_key_frame ][ 13 ])をチェックし、発音を実行、停止しています。
*動作を停止するタイミングによっては音が鳴り続ける場合があります。
コメント