音ゲー分科会

音ゲー向けをテーマにいろいろ投稿していきます

Pythonで打鍵音シミュレータを作る2 ~音再生+ノーツ読み取りその1~

Pythonで打鍵音シミュレータを作る2 ~音再生+ノーツ読み取りその1~

前回の構想編に続き、今回は実際に打鍵音シミュレータを制作していきます。
otg-subcommittee.hatenablog.com

この記事を書いている時点でほぼ完成しているので、使用したライブラリ類をまとめました

keysim_slide5

初期段階では1レーンずつプログラム構築し、最後に並列処理にて組み合わせる予定 だったのですが
同時押し譜面での並列処理用の信号生成が難しそう(詳しく調べてない)だったので普通に8レーン同時にキー信号生成と音再生をする構成にしました。

初期段階では音再生をSimpleaudioにて構成していたものの、Simpleaudioでは並列再生ができないのでpygame.mixerに変更しています。

音再生 Simpleaudio + Threading

keysim_slide6

作り始めの頃のコードです。粗だらけです。
・ wait.done()を入れているので毎回遅延が発生する
・音再生時にThreadingする構成なのですべての鍵盤パターンを定義する必要がある
という大きな欠点がありました。

音再生 pygame.mixer

keysim_slide7

最終的にはこの構成になりました。
pygame.mixerは同時に8chまで音を再生できる為、特に工夫もなく8レーン分再生ができます。 ただ、BGM+8レーンとなる全押し時はchが不足する為、全押し時の配慮が必要になります。
(今回は打鍵音のタイミングを知りたいだけなのでどれか1つ削ればOK)


音再生のモジュールは完成したので、次はノーツ判定です。
初期構想では、実際にプレーした動画をそのまま使う予定でいました。
そのため、判定文字より上側でノーツを認識+ノーツの移動速度を計算 →判定ラインに到達するタイミングで音再生 という想定をしています。

keysim_slide8
keysim_slide9

このタイミングで”プレーしていない状態の動画があれば判定ライン付近でノーツを読み取れる”ということに気が付きます。(遅い)

keysim_slide10

ということでこれまでの構想を変更し、
・未プレーの動画からノーツ情報を取得する
・判定ライン付近でノーツを認識し音再生する
・全レーン同時に読み取り、読み取り情報に応じて音を再生する
ことにしました。

次回はノーツ読み取りその2と完成版、完成間近に発生した不具合について記事にしたいと思います。
~おわり~