Pythonでノイズ音を永続的に生成してみた
ストリーミング再生風。
成果物
実行
$ cd src/ $ python main.py ... ========== Noise Player ========== [w]hite, [p]ink, brow[n], [b]lue, [v]iolet:
デフォルトではピンクノイズが再生される。途中で変更可能。
ポイント
- 各ノイズを生成できる(ホワイト、ピンク、ブラウン、ブルー、バイオレット)
- 再生中でもCUI入力を受け付ける。入力して数秒後、入力したノイズ音に切り替わる(マルチスレッド)
色々やってみた
ファイル | 概要 |
---|---|
main.py | ノイズを再生しつつ、ノイズ色を指定できる。スレッドを正常終了できない。 |
main_loop.py | 無限ループ版 |
main_async.py | 非同期版(音が汚く正常に再生されない) |
main_callback.py.py | コールバック版 |
main_callback_async.py | asyncを使ってみた。思い通りに動かない。 |
main_callback_class.py | コードを整えた。 |
main_callback_thread.py | スレッドを使うことで音声再生と入力受付を並列できそう。 |
main_callback_thread_2.py | 音声再生と入力受付を並列できたが正常終了できない。Pythonスレッドの仕様。これはひどい。 |
わからないことだらけなので試行錯誤しまくった。
問題
- スレッドが正常終了できない
- Pythonスレッドの仕様らしい……。どうすればいいのか……
- ノイズ音データ生成箇所でMemoryErrorになる
- 音声データの配列データを[start:end]で区切って生成しようとするとMemoryErrorが発生する
- なぜかfor文で1データずつ生成するとエラーにならない。コード的にカッコ悪いが仕方ない
- 音声データの配列データを[start:end]で区切って生成しようとするとMemoryErrorが発生する
私の知識と技術では手のうちようがない。
課題
- ノイズ音データは2秒間分生成しているが、その切れ目が気になる。とくにbrown
少ないメモリでやりくりするため2秒間ごとに新規生成している。切れ目をスムーズにしたいのだが、どうすればいいかわからない。
- 入力してから音が切り替わるまでのタイムラグが大きい
蓄えているデータを使いきるまでは前の音データを再生する仕組みだから。工夫すれば解決できそうだが、面倒そうなので放置。
所感
問題や課題がとても気になる。それに目をつぶれば、やりたいことは大体できた。あとはストリーミング再生用サーバでも作れたらいいかも。