サウンドプログラミング2021-05-04

サウンドプログラミングをやってみる。

前提

いろいろ簡単にやりたいのでPythonで。

環境

  • Python 3.9
  • python-sounddevice & python-soundfile
    • pyAudioという選択肢もあったが、waveファイルのオープンにPython標準モジュールを使っている&それがWAVE_FORMAT_IEEE_FLOATに対応しておらず苦しすぎたのでやめた

やったこと

サンプルを触る

python-sounddevice.readthedocs.io

  • Play a Sound File
    • 天才。ndarrayを渡して秒で終わり
  • Play a Very Long Sound File
    • 天才。コールバック形式もお手のもの
  • Play a Sine Signal
    • 天才。パラメーターで周波数設定できる優しさも好き

スロー再生

  • Play a Sound Fileをいじった
    • 元々のdataの倍の長さのarrayを作る。それをlongfileとする
    • longfileにdataを重複させながら入れる
      • 0,0,1,1,2,2,3,3,4,4, ...みたいに
    • 再生すると半分の速度になる
    # こうなっていたものを
    data, fs = sf.read(args.filename, dtype='float32')
    sd.play(data, fs, device=args.device)

    # こうした
    data, fs = sf.read(args.filename, dtype='float32')
    # expand start
    longdata = np.empty( (len(data)*2, 2), dtype='float32')
    for i, d in enumerate(data):
        longdata[2*i] = d
        longdata[2*i + 1] = d
    # expand end
    # sd.play(data, fs, device=args.device)
    sd.play(longdata, fs, device=args.device)

簡単だ。もっとクレバーな方法がありそうだがまあいいだろう。

さて次にやりたいことは…と固まってしまった。ソシャゲみたいに次やることが明確だったら楽なのに。
逆に考えると、次にやることをあらかじめ用意しておかないと、人間って動けないんだなと感じた。
ソシャゲの遊ばせ方はうまい。それを自分のやりたいことに応用できれば。

さて、明日やりたいこと

  • リアルタイムで速度を変化させる
    • ひとまずwaveを全部メモリに置いてループ再生する
    • キーボードの左右で速さを変える
  • 逆再生もできる
  • コールバックごとに再生速度を変えればいけそう
  • リサンプリング検討
    • 直前のやつではよくない。平均をとる