音ゲー分科会

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

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と完成版、完成間近に発生した不具合について記事にしたいと思います。
~おわり~

Pythonで打鍵音シミュレータを作る1 ~構想編~

Pythonで打鍵音シミュレータを作る ~構想編~

Pythonを使って打鍵音シミュレータを作ってみたいと思います。今回は構想編になります。

今回はPythonの勉強やシステム構想の練習も兼ねているので、実際に作っていく段階で構想通りにいかない部分は都度修正していきます。


まず作りたいもののコンセプトから

keysim_slide1

システムの構想を練ります。
どういうデータを準備するか、それぞれどう処理するか考えます。
うまく表現できているかわかりませんがオブジェクト指向を意識してみました。(仕事でもないので細かくやってません)
①音を再生するモジュール
②ノーツ情報を出力信号に置き換えるモジュール
をそれぞれ構築し、②から0/1の2値信号を出力→①でその信号に従って音を出す構成で考えています。

keysim_slide2

今回はノーツ情報をプレイ動画、打鍵音データはmp3かwavをSource Dataとして扱うものを想定します。
譜面の画像等も活用できると良いのですが、キー音なしのBGMを入手するにはプレイ動画が必要になるのでプレイ動画を使うことにしました。


次にそれぞれの処理をどのプログラムやライブラリで処理するか構想してみました。
(実際に作ってみると音の再生のライブラリが無かったりと、構想段階では不備だらけでした)

keysim_slide3

メインはPythonOpenCV、動画の処理でffmpegを使用します。
ffmpegは動画準備で使用するのみでpythonのプログラムには含まない計画でした。
(制作段階でffmpeg-pythonにして組み合わせる構成に変更しました)


大まかに構築内容を決めたので、作成順序を考えます。

keysim_slide4

まずはキーボードを操作したら(0/1信号を生成し)音を出すモジュールを作っていきます。
次にノーツ情報を取得し0/1信号を生成するモジュールを作って組み合わせます。
※モジュールとかかっこつけて呼んでいますが、プログラムはクラス化やモジュール分けはせず1つにまとめるつもりです。


次回は音を出すモジュールの作成編の予定です。
~おわり~

音ゲーの不調の原因を探る

今回は音ゲーにおける命題である、不調の原因を探ってみます。

今回は前回のプレイ動作の無意識下の内容から「無意識下で動作できていたものがうまくいかなくなった状態が不調ではないか」
という仮説が浮かんできたので
「1.どう言うシーンで動作が無意識下に移行できなくなるか」
「2.どのような状態なら無意識化できるか・しやすいか(=不調を避けられるか)」
の二本立てで考えてみることにしました。

また、前提としては
不調 = 本来の実力を出せていない状態
であって、そもそもスキル的に不足しているものと混同しないように気を付けます。

1.どう言うシーンで動作を無意識下に移行できなくなるか

まず、音ゲーに関係なく無意識だった動作が意識しないといけなくなる瞬間を探してみます。
・眠い時
 手から物を落としたり、顔を真っ直ぐあげていられなくなったりします。
 普段は手の力加減や、顔の位置は無意識化にあり、意識することはほぼないかと思います。
・お酒を飲んで酔っている時
 真っ直ぐ立ったりすぐに歩いたりできなくなりますね。
 普段は真っ直ぐ立つことはほとんど意識していないと思います。
疲労が溜まっている時
 普段できる簡単な足し算や操作(靴を履いたり脱いだりとか)を間違えたりすることがあります。
 普段は暗算して計算式は考えず無意識下にあるような気がします。
・別の動作をしている時
 集中している時に呼吸を忘れたり、画面を凝視していると眩きを忘れたりしますね。
 これらも普段意識しませんし、意識するとどうやって無意識下に移行するか分からなくなったりします。

これらのキーワードや共通点
・意識が鮮明であるか
・集中しないと動作できないことが存在しているか
だと考えられます。さらに
・無意識下の行動も意識しないといけない状態
・普段意識しないと動作できないことはさらにできなくなっている状態
 →脳の処理に余裕がない状態
になっているかと考えました。

自分の体感やイメージとしては、脳のキャパ・メモリが不足したら無意識下の行動ができなくなってくと思っていますが、
意識の鮮明さも脳のキャパに影響しているのかもしれませんね。脳の処理速度(メモリ開放が早い)という感じでしょうか。

2.どのような状態なら無意識化できるか・しやすいか(=不調を避けられるか)

基本的な無意識化までのフローは前回の記事で考えたので、どういう状態でプレーしたら良いか考えてみます。

無意識→意識が必要 になる要素から考えると
・意識が鮮明
・疲れがたまっておらずケガもしていない(=身体を動かす際にズレを補正しなくてよい)
・集中したい動作以外の動作や外乱が少ない(=脳の処理に余裕がある)
という身体のコンディションや意識が必要と考えられます。

具体例で言うと
[身体のコンディション]
・眠気が無い
・酒酔いも無い
疲労もしていない
・水分不足ではない
・ストレスがない
・空腹ではない(血糖値が低くも高くもない)
・ケガしていない
・身体が冷えていたり暑すぎたりしない

[意識(外乱の除去)]
・身体の姿勢が安定している(バランスを取らなくて良い)
・外乱(音、振動、眩しさ、匂いなど)がない
・尿意、便意がない
・不安感、ストレスがない
がありたい状態かと思いました。

また、自律神経の乱れと脳の疲れも関係していると言われているようなので、交感神経と副交感神経のバランスも大切そうです。

ここで本題の音ゲーへの落とし込みですが、
不調だと感じたら疑うこと
・ちゃんと寝たか、眠気はないか
疲労は溜まってないか 
・ちゃんと水分はとったか
・いつもと姿勢が変わってないか
・いつもと目線が変わっていないか
・プレー中でないときに打鍵動作をやってみてイメージとズレがないか
・別の事を考えていてプレイに集中できなくなっていないか
・空腹で血糖値が落ちてないか
・食べ過ぎて血糖値が上がってないか
・ストレスが溜まってないか
・リラックスしすぎてないか
・眼が疲れていないか
・暑くないか、寒くないか

不調にならないように管理したいこと
・睡眠時間や質
・空腹度合い
・水分
・身体の疲労
・プレイ姿勢
・プレイ環境
・ストレス
・目の疲れ
・プレイ中にスマホゲーをやらない

常にコンディションをよく保って、体調による不調は避けたいですね。
私の経験としては体調による不調よりもプレイ中に集中できているか の方が調子に大きく影響するので
・体調面は万全にして疑わなくてよくする
・曲が始まったらプレーに集中する意識付けをする
・姿勢やアップのルーティーンを決めて基準を作る
・疲れてきたら早めに休憩を挟む
という風に工夫しています。

~終わり~

ジストニアっぽい症状を改善させた話@iidx

今回は私が陥ったジストニアっぽい症状の話です。

実際に診断を受けたわけでもなく、ジストニアの人の症状は明確にでていないのでおそらくジストニアではないのですが、
ジストニアの改善方法をいろいろ試したところ症状が解消したので一例として記事にすることにしました。

[先に結論]
・手の動かし方を意識することはせず、鍵盤を底まで押す(スイッチを押す)ことだけイメージする
・譜面の速度を大幅に落として反応押しに頼る量を減らす
で、解消しました。
・手の動かし方を意識して解消しようとすると大幅に悪化した
というところもポイントです。

[陥った状態]
・5鍵がとにかく押せない。見えているのに押せない状態であることに気づく
・プレー中に手が硬直して指が動かなくなり、手首の回転や腕で無理やり押している状態になる
・プレー前に手の動作をリセットして動きやすい形を作っても、プレーが始まると手が硬直する
・調子が良い状態でも、譜面認識が追い付かなくなると手が硬直する
・手が異常に疲れる
・ばね指・腱鞘炎の手前まで手を痛める

とにかく力んだ状態が続き、やればやるほど下手になっていきました。
モチベーションだけは高く、結果的に手を痛める→さらに下手になりました。

[最初にやったこと]
譜面認識が不足していると力んで脱力できない という説が原因と考え、
譜面の速度を大幅に下げてみました。
→結果的に力みは減ったものの、5鍵盤の親指が絡むと硬直する状態は変わらずでした。

[次にやったこと]
そもそも力まない手の動かし方が頭でわかっていないのではないかという説
ゲームを起動せず手を動かしてみてスムーズに動く動作を理解したうえでプレーに入るルーティーンを取り入れました。
→GET READYが消えた瞬間から手が硬直し、全く改善せず

[次にやったこと]
条件に応じて手が硬直する という症状が ジストニア的なものと共通していたので、ジストニアの解消方法を調べてみました。
最初に出てきた手の拮抗筋の強化を実践
→症状が改善せず

[次にやったこと]
ジストニアのリハビリの一つにある「動作をイメージするのではなく、動作によって操作したい内容をイメージする」
を参考に、鍵盤を底まで押し込む意識で手を動かしてみました。
→大幅に改善したが、時々再発する

[次にやったこと]
改善のヒントがつかめたので、安定化させる方法を考えることにしました。
ゲームを起動する前に鍵盤を押し込むイメージを定着させる を毎回じっくりやる
→症状が解消した。 または再発の兆候があってもすぐ治せるようになった。

ということで、ジストニアっぽい症状を解消した話でした。
無意識下での操作を意識することで本来の動作ができなくなることがある という教訓でした。
~終わり~

音ゲーの操作や動作の無意識化

今回は音ゲープレイ中の動作と意識・無意識について考えてみます。

この記事では「無意識化した操作」とは、プレイヤーの動作のうち
譜面認識→譜面変換→打鍵操作 の譜面変換の処理を無意識的に行い高速化させる ことを指しています

操作の無意識化

わかりやすいイメージとしては、九九の計算で、2x3という形が来たら6、7x8という形が来たら56 のようにパターン暗記・認識して処理している感じです。
(7x8は、7が8個あるから7+7+... という計算はしませんね。)

無意識化した操作の練度や精度を上げられれば処理を行うサイクルタイムが短縮され、単位時間あたりの譜面処理量が増えると考えています。
=地力が高いと言えそうです。

まずはプレイヤーがどのように操作を無意識下に移行しているか考えてみることにしました。

無意識下に移行するまでの流れ

操作の無意識化までの流れ

・まず自分のやりたい動作や理想をイメージする
・イメージに合わせて動作してみる
・イメージに対して出来ていない動作があることを認知する
・どこがイメージに対しズレているか分解して考える
・分解した内容に対し対応する動作を考える
・対応する動作をやってみる
最初に戻る)
・イメージに対し出来ていない動作が減るにつれて、できてないことに対する認知が減る(忘れるに近い?)
・動作イメージに対し結果の誤差がなくなると考えなくなる(考える必要が無くなる)
・考えずに操作を繰り返すと無意識に操作ができるようになってくる
・無意識下で動作するようになる

という仮説です。

この仮説から、実際にどういうステップを踏めば動作を無意識下に移行できるか落とし込んでみます。
(基本的に上記のフローを言い換えただけです。)
・最初はいつも通りプレイする
・判定から押せていない譜面の形や鍵盤位置を認知する
・押せていない理由を考える
 手がイメージ通り動いていないのか
 認識した譜面の配置を誤解しているのか
・押せる方法を新たに考える
 打鍵方法や運指を変える
 譜面認識方法を変える
・新たな方法を試す
・結果を再び認知する
・イメージ通りに操作できるようになったら反復練習し、無意識下で操作できるようにする
このような流れかと考えました。

ここで、押せていない理由が二種類でてきます。
・譜面認識
・操作精度
どちらが上手くいっていないか認知できていないと対処を誤ります。

これらを正しく認知するには、二つの要素のうち片方が無意識下における余裕があると考えています。
音ゲーの動作フローから考察すると
・認識力が十分な譜面で操作が上手くできているか判定する (判定も目で確認する為、認識力に余裕が必要)
・上手く操作できている前提で、認識が難しい譜面をプレイし認識不足箇所を認知する
・さらに、譜面の見落としによるものか譜面の形を誤解しているものなのか分析する
というプロセスが良い気がします。

ざっくりしたプレイ方針としては
・アップの段階で認識に余裕がある曲で打鍵方法を無意識下に移行させる
・極端に実力が不足している譜面は何か出来ていないか認知できないので極力やめておく
・打鍵に余裕がありすぎる曲は打鍵方法が実力の上限に近い曲をプレイ中の打鍵方法と異なることがあるので注意する
・譜面認識が不足して打鍵できてない場合に誤って打鍵方法を疑わないようにする。運指力優位を保つ。
かなと考えます。

今回はプレー中の操作の無意識化について考えてみました。
この考え方を用いることで「限界的練習」のうちの「良質なフィードバック」が得られると信じています。

次回は無意識化と不調の関係について考えてみようかと思います。
~終わり~

音ゲープレー中の動作とフロー

音ゲープレー中の動作とフローについて考える

今回は音ゲーをプレーしている人がどういうことを認知し操作・フィードバックしているか考えてみます。

プレイヤーが行っている動作・フロー

音ゲーのプレー中の動作をフローチャート風に表現してみました。

音ゲー動作フロー

暗記してリズム押しする場面を覗いては、

譜面を見る → どのタイミングでどうやって押すか判断する → 操作する

という動作フローになると思います。

 

フローごとにどういうことを認知・判断・操作しているか考えてみます。

1.譜面を見る・音を聞く

曲が始まるとBGMが流れて、画面上にノーツが降ってくるので、その情報を目や耳で認識します。

見る → 目から情報が取得する

聞く → 耳から情報を取得する

これらについてはシンプルに身体の機能ですね。

これらの情報を次のフローで譜面として認知します。

2.譜面の配置を認識する

見えたものがどういう配置なのか認識する という動作が次に来ます。

iidxの場合は一般的に縦認識・横認識・ブロック認識 などの認識方法があり、認知→判断までのサイクルタイム(サンプルレートみたいなもの)が認識方法で変わってくると考えられます。

また、音を聞いたりリズムを頭の中でイメージすることで譜面の間隔や配置(同時なのか、ずれているのか)などの補正も行っています。

事前に譜面を予習をすることで目や耳からの情報に頼る割合を減らすこともできると思われます。誤った形で譜面を覚えてしまうといわゆる”癖”になります。

3.どのタイミングで打鍵するか判断する・打鍵までの猶予時間を把握

次に認知した譜面をどのタイミングで押すか判断します。

譜面を認知したタイミング(いわゆる「目線」や「見切りライン」)から、実際に打鍵するまでの時間がどれだけあるか判断します。

この時に自分の身体の状態についても認知し、どれだけ力を入れればどういう操作ができるかも合わせて判断しています。

4.判断に従って打鍵方法を決める

認知→打鍵までの猶予時間を判断し、次に打鍵方法・譜面処理方法を判断します。

・鍵盤の場合は腕押し・スナップ押し・指押し・手の甲ひねりなどなど

・スクラッチの場合は押し引き、たたき皿や、指の本数、手首皿などなど

 

ここまでが認知→判断 になります。

5.打鍵操作を手に加える(筋肉を動かす)

判断の結果に応じて操作を行います。

身体がちゃんと動いているかは次の動作の結果によって認知しフィードバックします。

6.結果を指の感覚や目、耳で認知

・打鍵操作の後は手の感覚や打鍵音などで正しく身体が動かせたか判断します。

・ほとんどの音ゲーの場合は打鍵直後にGREATやPerfectなどの判定やfast/slow表示などが画面に表示されるため、それらを目から認知します。

・ゲーム側から出力される音や、鍵盤の打鍵音などは耳から認知しています。

 

ここまでが一連のサイクルになりますが、

判定結果や感覚に応じて次の打鍵タイミングや譜面を補正する場合は、譜面認知や打鍵までの猶予時間の把握 にフィードバック情報が加わるかと思います。

 

ざっとイメージで書きましたが、今回はプレー中の動作とフローについて考えてみました。