この記事は B4UT Advent Calendar 2022 参加記事です。他の記事はリンク先からご覧ください。
b4utmzi.wixsite.com
初めまして、駆け出しDPerの るーく といいます。
今回はAC音ゲーの beatmania IIDX 及び、そのプレースタイルの1つである「ダブルプレー(DP)」について紹介し、DPで重要となる片手運指について考察してみたいと思います。
DPのプレー人口がSPに比べて少ないこともあり、本記事を通してDPの世界をより多くの方に知ってほしいと思っています。一方で、本稿ではDPのみ扱うのではなく、部分ごとにSPに絡めた話の展開をしようと思っています。
筆者はIIDXをシングルプレー(SP)から始め、SPが一区切りついた段階でDPの上達を志しました。*1 実力はCastHour皆伝に単曲対策でギリギリ合格する程度といったところです。(RESIDENTでDP皆伝取れるのかな…)
DPを遊んでいるうちに現状の認識力や運指に限界を感じ、譜面の攻略方法について1度整理しプレーを見直したいと思ったのが本稿執筆の動機になります。
また、本稿では beatmania IIDX 譜面集 TexTage 様の譜面画像を使用させて頂いております。
textage.cc
(本稿の内容は紹介及び軽い考察であり、上達法などは一切扱っておりませんのでどうかご留意下さい。)
・目次
1. IIDX 及び ダブルプレー(DP) の紹介
1. 概要
早速ですが、みなさん beatmania IIDX という音楽ゲームをご存知でしょうか?「IIDX」(ツーディーエックス)との略称で呼ばれることが多いため、以下ではこの表記を用います。
IIDXは7個の鍵盤とターンテーブルが両側に左右対称に配置されたデバイスを操作する音ゲーです。SP(シングルプレー)では左右どちらかのプレーサイドを選択し、以降基本的にそのプレーサイドを使用し続けます。
1P側の正規譜面は2P側ではレーンオプション「MIRROR」を用いることで左右対称の同様の譜面を遊ぶことができるため、左右どちらが良いかは完全に好みの問題です。
音ゲーマーの方でIIDXを触ることに抵抗のある方がしばしば「レーン数が多い」という理由を挙げられます。確かに 鍵盤7レーン + スクラッチ1レーン = 8レーン であるため多いと思うかも知れませんね。
しかしよく考えれば maimai も8レーン(+ 画面中央部の操作もあるためむしろIIDXより多い!)であり、チュウニズムも16レーンの音ゲーですよね?(無理矢理こちらの土俵に引きずり込む) ボルテもボタン及びアナログデバイスを合計8個操作しているはず。結局のところ認識は慣れですので心配ご無用です。
SPでは基本的にどの指でどの鍵盤を押すかを予め決めておく「固定運指」が用いられます。*3 スクラッチが降ってくると運指を適宜崩す場合もありますが、固定運指の場合は概ね使う指と鍵盤は1対1に対応します。
さて、SPでは左右どちらかのデバイスを選んで演奏していたのを、なんと左右両方のデバイスを同時に操作して演奏しようというのがダブルプレー(DP)というモードになります。
IIDXをプレーすると初期設定ではSPが選択されているため、DPに切り替えたい場合はモード選択画面や選曲画面でテンキーの[3]を押すとDPに、もう一度[3]を押すとSPに戻ります。
操作するデバイスの数が2倍*4 であり、当然視認するレーン数も2倍になります(とはいえざっくりSPの譜面を左右に半分ずつ降らせているくらいの密度感であり、左右合計の総ノーツ数はSPとDPで大まかに同じです)。
基本的には左側の鍵盤とターンテーブルは左手で、右側の鍵盤とターンテーブルは右手で操作します。
DPの魅力と言えば何といっても演奏感の高さでしょう。DP譜面には性質上、左右の手でそれぞれ異なるフレーズを押す「混フレ(混合フレーズ)」が頻繁に登場します。デバイスを幅広く操作、スクラッチが来れば一旦手を鍵盤から離しターンテーブルを回します。
鍵盤と指をほとんど1対1対応させ固定運指を丹念に磨き上げるSPと、指や腕を様々に動かしてノーツの取り方を考え、スクラッチをダイナミックに回す動きの激しいDPの関係は、しばしば「静」と「動」の対比で表現されます。*6
IIDXのシステム面や基本操作に関してはより詳しい記事がたくさんありますので、ぜひそちらをあたってください。
2. SPer がDPを始めるメリット
実体験としても、SPをメインにプレーしている方がDPを始めて上達すると、徐々にDPの技術をSPに活かせる場面が多くなっていきます。
DPは左右それぞれの鍵盤を片手で操作するため、次第に片手力が向上していきます。この「片手力」がSPで最も生きる場面としては、やはりスクラッチが大量に配置されている「皿譜面」が筆頭に挙げられます。
皿譜面をプレーする際、SPer の多くはスクラッチを小指皿あるいは手首皿で取ります。基本的には鍵盤に対応できるこれらの運指のまま連皿を回すのが正しい構えであると思います。
一方で皿譜面はしばしば やや抑えめな鍵盤 + たくさんスクラッチ の構図であることが多いため、ターンテーブルを片手を完全に割いて回す片手鍵盤ができれば安定感が増してスクラッチの取りこぼしが減り、スクラッチ部分のスコアも狙いやすくなります。また小指を痛めにくいという利点もありますね。
(注意点として、DPの片手力をSPに活かそうとする場合緑数字(ノーツ視認時間)の設定に差がある場合は認識が追いつかない場合があるため微調整を要します)
以下に、片手力が活かせそうな皿譜面の一例をいくつか挙げてみようと思います。
・The Chase (SPA 12)
何といってもこれです。
本楽曲はSP LEVEL12の中で6番目に総ノーツ数が少なく、一方スクラッチは464枚(全体の40%)も降り注ぐという強烈なスクラッチ特化型譜面です。
しかしBPMは142と遅く、上図で取り上げている小節の鍵盤はほとんど8分音符の単押しで構成されているため、DPを始めてLEVEL 7, 8 周辺を安定して押せるようになれば早速片手運指を試せそうだと思いませんか?
(ただ、63小節と65小節は「スクラッチは24分音符を回し、鍵盤は16分音符のトリルを打鍵させる」という非常に困難な箇所であり、しばしばS-RANDOM(ノーツ単位でレーンがランダムに入れ替わるオプション)を用いてガチ押し的に打鍵するプレーが見られます)
・SAMURAI-Scramble (SPL 12)
怒られそう…
本楽曲にはスクラッチが690枚(全体の43%)もあり、SPでは灼熱 Pt.2に続き全譜面中2番目にスクラッチの枚数が多いというおぞましい譜面となっています。
BPMは150ですが、画像の通り曲中には随所に24分間隔で大量のスクラッチが配置されており、スクラッチの枚数や間隔の正しい把握とターンテーブルの正確な操作技術が要求されます。
一方、鍵盤部分は大人しめで、4分音符や8分音符が単調に配置されています。38小節からは3個同時押しが多くなるためやや難易度が上がりますが、正規譜面はほとんどホームポジション(後述)で対処可能な配置となっており、片手力の有無で体感難易度が大幅に変わる譜面であると思います。
もちろんANOTHER譜面にも片手力が活きます。
あとはBLACK.by X-Cross Fadeのこことか
(ブラックは8分主体なので上記の理由同様おすすめ。ただ乱をかけてホームポジションから外れると同時押し対処の要求地力がかなり上がる)
Caterpillarのこことか
雪上断火のこことか
水鏡の異界のこことか
片手力は有名な連皿譜面に限らず、鍵盤主体でも少し連皿パートが入り混じる譜面などでも活躍します。
他の利点としては、DPは様々な運指を複合的に用いてプレーするため、SPでメインに使用していないようなあらゆる運指が上達します。またDPでの感覚そのままに、左手で6鍵を押す、右手で2鍵を押すといった自由運指的なプレーが自然にできるようになります。
次に、DPは基本的に左右の全ての指をフル活用し鍵盤を操作するため、プレーするうちにどんどん指の柔軟性が上がっていきます。SP/DPによらず指が柔軟になり打鍵がスムーズになることは多いにメリットであるといえます。
他には16レーンもの横に広がる画面の認識に慣れることにより自然と横認識力が強化されるといったメリットもあります。
・・・
とはいえ、SPの上達を志す方がこういった利点のためにDPをプレーすることが効率的かというと疑問が残ります。柔軟性獲得のためにピアノをやるべきか、持久力向上のために筋トレをやるべきかといった類似の議論もありますが、やはりSP上達にはSPをやるのが一番かも知れません。
また、個人的な思想で恐縮ではありますが、このようなSPに活きるメリットはあくまで副産物的に捉え、まずはDPをエンジョイして楽しさを分かって頂きたいなあと常日頃思うところであります。
2. 運指の概要
以下、あらゆる運指の話は全て右手基準で行い、鍵盤は左から1鍵(白鍵), 2鍵(黒鍵), 3鍵(白鍵), … 7鍵(白鍵)とラベルします。
1. ホームポジション
個人的に、DPを遊んでいると「指足りねえな〜」と思うことがよくあります。
それもそのはず、DPはSPと異なり操作するボタンの数が指の本数を上回るので、必然的にいずれかの指を複数の鍵盤に対応させる必要があります。しかし、どのような運指を用いるかは先人達によって既に体系化が進められています。
DPを始めると、基本的には次に示す「ホームポジション(ホムポジ)」なるものを練習することになります。ホムポジとは5本の指の役割を固定し、
・親指:1 鍵
・人差し指:2, 3 鍵
・中指:4 鍵
・薬指:5, 6 鍵
・小指:7 鍵
のように押す運指です。手を広げて鍵盤の上に乗せると自然と指が順に 1, 2, 4, 6, 7 鍵の上に来ることから最も自然な運指であるといえます。
DPを遊んでいるとホムポジで押しやすいように配置しているんだなと感じる譜面を多く見かけます。実は多くのDP譜面は正規が当たっています。下手にランダムをかけるとホムポジ配置から外れてしまい、後述するようなやや習熟の難しい運指を使う必要があるからです。*7
DPは運指が難しいと敬遠される方もいると聞きますが、基本的にはこのホムポジで大半の譜面は楽しく遊べます。著名なDPerで「ホムポジで皆伝までは取れる、運指はそれから」と仰る方もいます。
しかし、2, 3鍵を人差し指のみに、5, 6鍵を薬指のみに割り当てるため、完全にホムポジだけとなると23トリルや56トリルなどの偏った配置に非常に弱くなってしまいます。そこで、このホムポジを出発点として徐々に使える運指を増やしていくというのがセオリーとなっています。
以下に、ホムポジ以外の代表的な運指を説明したいと思います。
2. ホームポジション以外の運指の代表例
親3
まずは3鍵のフォローを考えます。親指の担当エリアを増やして人差し指の担当エリアを補強してみます。
2鍵, 3鍵が同時に降ってきた際は、2鍵を人差し指・3鍵を親指で同時押しします。
親3は非常に重要度の高い運指です。親指は他の指との独立性が高く、親指がよく動くだけで配置耐性が非常に高くなります。
中5, 中6
続いて5鍵, 6鍵を補強することを考えます。
5鍵周辺のフォローは様々な方法があり、親5, 中5, 小5 などがあります。ここでは中指の移動を紹介します。
5鍵, 6鍵が同時に降ってきた際は、5鍵を中指・6鍵を薬指で同時押し、あるいは5鍵を薬指・6鍵を中指で同時押しします。
中指を内側に折り曲げて5鍵、あるいは薬指と中指をクロスさせて中指で6鍵を押す動作はやや窮屈であり難しい運指ですが、上達にあたって習得が必須とされている運指の1つです。正直筆者もまだ慣れていません。
中5と中6はどちらか一方が使えればフォローには十分とされています。
(中5, 中6は移動は難しいため九段から十段くらいまでは覚えなくとも良いとの意見もあります)
階段
DP譜面ではしばしば階段配置(1234567, 7654321)が降ってきますが、これにも主要な取り方があります。
階段配置はあらゆる難易度で登場します。階段の取り方の例としては、1鍵から順に
①親人親人中薬小
②親人親中親薬小
のような取り方があり、①の場合は人4を、 ②の場合は親5を使うことになります。この運指以外でもプレイヤーごとに各々様々な方法があり、どれか1つを選択してひたすら慣れていくという流れになります。
筆者は①を練習しているのですが、今でも階段が上手く出ずについ
・親人親中薬薬小
のように薬指を連続して使ってしまうことが多いです。低速・中速譜面はそれでも申し分ないのですが、高速・高密度になるにつれて次第に指が追いつかずミスを量産してしまうといった具合です。
以上、ホムポジを除く主要な運指を紹介しました。実際、ホムポジに加え3, 5鍵のフォローと階段用の運指を取り入れれば運指としては概ね完成であり、これで大半のDP譜面は楽しく遊べます。しかしながら運指をうまく工夫しないと行き詰まってノーツを取りこぼしてしまう場面に遭遇することも非常に多いです。
DPでは運指の引き出しは譜面への対応能力に直結します。普段から様々な運指を取り込み、その中から最適な運指を選択してあらゆる配置を打鍵できることこそがDPの実力であるように思います。
そこで、3章以降では普段使わないような運指も含めて様々な運指を取り上げ、最適な運指を決定するための方法について考察していきたいと思います。
(一方で、ホームポジションと親3, 中5, ベチャ押しのみで X-DEN(DPA) をEXHしたり QUANTUM TELEPORTATION(DPA)*8 をF-COMBOしたりといった方も存在します。本稿の趣旨とは外れてしまうため掘り下げませんが、同時押し用の最低限の運指のみを備え後はひたすら運指を磨き上げるといった固定運指的上達方式を採ることも可能であるように思います。)
3. 運指行列のアイデア
もし2章までお読み頂きDPに少しでも興味を持って頂けた方がおられましたら、私としましては十分に嬉しい思いです。
本稿の最大の主張はあくまで、
DP楽しいよ!ホムポジと親3だけで楽しく遊べるよ!
ということです。お帰りの前にこれだけは押さえて頂きたい。
さて、ここからは片手運指について考察を進めていきます。まだお付き合い頂ける方のみ3章以降をお読み頂ければと思います。ただし、予め強調させて頂きたいのは、
以下の内容は極端な理想論です。
また、以下の議論で登場する用語は本記事のみの用語を多く含み、DPで一般に用いられてはいないものも含まれるということと、それに付随して誤植や間違いなどを大いに含みうることをご留意頂きたく思います。
といったところで、今回の目標は「一重乱打(ノーツが1個ずつ降り複数ノーツの同時押しが存在しない)を片手で同一の指を連続して用いずに打鍵する運指を見つける」ことです。この条件を満たす運指を「滑らかな運指」と呼ぶことにします。
一重乱打だけかよとお思いの方もいらっしゃるかと思いますが、DP最上位の譜面であっても一重乱打は頻繁に登場するため、正確に打てることの意義は大きいと考えています。
なお、「行列」という仰々しいワードがありますがこれはカッコつけるためであり、数学的で難解な操作は一切登場しませんのでご安心ください。
1. 定義
以下の片手運指についての話は全て右手で論じるものとし、スクラッチも無視して7つの鍵盤のみについて扱います。また、ここでは縦連(同一の鍵盤にノーツが2連続以上で降ってくること)は想定しません。
さらに、ここでは鍵盤は指先のみで押すこととします。*9
それでは、ここから出発点として思いついたアイデアを紹介させて頂きます。
まず、 の運指行列 を定義します。 の各要素は か であり、 であることは、そのプレイヤーが 番目の指(親指から小指にかけて順に 番目とラベルする)で 鍵を押す運指を採用しており、 は採用していないことを意味します。
以下に、運指行列の例を示します。
ex1. ホームポジション(親1, 人2, 人3, 中4, 薬5, 薬6, 小7)のみを使用している場合
ex2. ホムポジ + 親3, 中5 を使用している場合
ex3. 筆者の採用している運指の場合
つまり、運指行列はプレイヤーの運指を視覚的に示すための表に過ぎません。
指と鍵盤の対応から 要素となっていますが、親指で7鍵を押したり小指で1鍵を押したりすることは滅多にないため、この行列の要素が全て となることはまずありません。別にしてもいいんですけど…
行列の定義から分かるように、運指行列 の行ベクトルの要素 の個数(本章では負担と呼ぶことにします)は各指ごとの担当エリアの広さを表し、列ベクトルの要素 の個数(本章では安全度と呼ぶことにします)は各鍵盤ごとのカバーされ度合いを表します。
ex3 の筆者の運指で例えると、親指は1, 3, 5鍵の3つの鍵盤を担当しているため、親指の負担は です。また、3鍵は親指、人差し指、中指の3つの指によってカバーされているため、3鍵の安全度は です。
もし安全度が の鍵盤が存在すれば、その鍵盤を打鍵できる指がないことになります。しかし、なんと2, 4, 6鍵の安全度が となるような運指でも最初から最後まで取りこぼし無く遊べる譜面も存在します。
2節で上記の運指行列をより詳細に見ていきましょう。
2. 運指行列の評価
続いて、ex1(ホムポジのみ)の運指行列の場合に人差し指で2鍵を押している状況を想定します。今回は縦連は考えないため、この次は2鍵以外に降ってくる次のノーツを人差し指以外で押すことになります。
よって、運指行列 の第 行と第 列を除いた残りの要素について考えます。
使う指と押さえる鍵盤が交わっている を と表し、右側には第 行と第 列を除いた 行列を表示しました。
見ての通り、右側の行列の第 列(元の運指行列の3鍵にあたる列ベクトル)の安全度が となっており、次にノーツが3鍵に降ってきた際に対応できる指は残されていません。
ホームポジションのみの運指の場合に2, 3鍵が連続して降ってきた際は人差し指を連続で動かして対応するほかなく、2章で説明したように偏った配置に弱い理由が視覚的にわかります。
一方で、ex2(ホムポジ + 親3, 中5)の運指行列の場合に同様の状況を考えたときの 行列は次のようになります。
この場合は右側の行列に安全度が であるような列ベクトルは存在しません。次にノーツが3鍵に降ってきた際は第 行に対応する指(親指)で押せばよく、先程の運指の弱点は補強されたといえます。
このような例からも、運指のバリエーションが多いことの効果が実感できるのではないでしょうか。
というような議論に沿いつつ一般化を考えます。
運指行列のうち であるような任意の要素に対応する箇所を押さえた場合の、 から第 行と第 列を除いた 行列で安全度が の列ベクトルが存在しないための条件から、「滑らかな運指行列であるための条件(強)」を述べたいと思います。
(後述しますが、この条件を満たす運指行列は現実的でなく理想的な運指とは言い難いため、あえて(強)と表記しています)
②運指行列 に要素 が つのみの列ベクトルが存在する場合(安全度が の鍵盤が存在する場合),その要素 を含む行ベクトルの他の要素が全て である場合(その鍵盤を押す指の負担が である場合)に限り,は滑らかな運指行列である.
ええ…(困惑) 読むのやめよ…(やめないで…)
少し現実的ではありませんが具体例を持ち出して考えます。
①について解説します。例えば、次のような運指行列のプレイヤーがいたとします。ホムポジに加えて親3, 人1, 人4, 中2, 中5, 薬7, 小6 が採用されています(流石に多すぎてあまり実用的ではありません)。
さて、ある鍵盤を何らかの指で押さえることは、運指行列 上で要素 の箇所を含む行と列を取り除く操作に対応させられました。すなわち、1回の打鍵によって減少する各鍵盤の安全度は高々 であり、①の条件を満たす運指行列の場合は各鍵盤の安全度が 以上であるため、 が1行無くなろうとも何らかの列ベクトルの安全度が になってしまうようなことは有り得ません。
すなわち、1つの鍵盤に対して指を2本以上対応させていればひとまず滑らかに打鍵するに差し支えないことがわかりました(実はこの主張は運指を増やしすぎてしまうため欠点が生じうることを後述します)。
続いて②について解説します。上記の運指行列から薬7, 小6 を消去し、代わりに中6を導入した運指行列を考えます。
この運指行列 の第 列(7鍵)の安全度は であり、先の①の条件は満たしません。しかし、この要素 が属する第 行には他に要素 が存在せず、 は 上の他の要素 と行に関しても列に関しても独立しています。鍵盤上では小指と7鍵は完全な対応関係にあるため、他の6鍵盤及び4本の指との競合を一切考慮しなくてよくなります。
換言すれば、他の鍵盤には指を2本以上割り当てていれば、ある鍵盤専用の指の決め打ちができるということになります。
筆者はここに、「小5 不要論」を強く提唱いたします!!!(いや練習しろよ)
3. 改善点
ここまで運指行列の定義から話を広げてきました。「運指行列」の枠組みは運指のバリエーションの多さを視覚化し、連続する2ノーツの取り方を考察する手始めとして有用なアイデアだったのではないかと思います。
しかし、条件を色々考えてみたところやや現実から乖離してきてしまいました。具体的には、あまりにも使用する運指が多いために、次第に相性が悪い運指どうしの組合せが生じてしまいました。
DPerの方なら読んでいてお分かりのように、「そんなに運指要らねえよ!!!」と思いますよね。
この「運指行列」論は以下の2つの制約に基づく議論でした。
・同一の指を連続で用いてはならない
・現在のノーツを取るために何らかの指で鍵盤を押した次の瞬間に判明する、次の6通りのノーツ全てに対応できなければならない(ゆえ、上の議論ではどの運指を用いた際も安全度が の鍵盤が存在してはならなかった)
1つ目の制約はノーツを滑らかに取るための制約であるため、今後もある程度は保持したい制約です。
しかし、2つ目の制約は一考の価値ありです。
運指行列はその性質上、現在押している鍵盤とその次の鍵盤の2ノーツだけに注目します。下のイメージ図のように、1番目のノーツを押した次の瞬間に判明する2番目の全てのノーツに対応できるような運指を用意しようというのが2つ目の制約でした。
2つ目の制約を満たすため、例えば上図の右のような状態でも滑らかな運指を残すために、人3を押しながら次に2鍵に対応できるようにわざわざ中2を用意する必要があったので、先の条件を強いと表記したわけです。「相性が悪い運指の組合せが生じた」とはこのようなことです。
それでは、2番目だけでなく3番目以降のノーツの情報が既に分かっていたとするとどうでしょうか?
つまり、先の議論ほど運指のバリエーションが多くなくとも、行き詰まって押せなくなってしまうような運指を事前に察知して回避できれば滑らかな押し方を決定できるのではないでしょうか。
4. 探索による運指の構成
もし3章を読んでさらに4章も読んでみようかなと思って下さっている聖人のような方がいらっしゃれば、心からの感謝を申し上げます。(ありがとうございます;;)
しかしながら、散々運指の話をして「DPってやっぱり難しいのかな」「色んな運指を練習しなきゃいけないのかな」というような思いをされている方がいるかもしれないため念には念を入れて強調しますが、3章以降の議論は極端な理想論です。改めて本稿の最大の主張を強調させて頂きます。
DP楽しいよ!ホムポジと親3だけで楽しく遊べるよ!
さて、3.3節から「今後降ってくるノーツを幅広く見ることで、運指のバリエーションが少ないとしても行き詰まらないようなノーツの取り方を見つける」という方針を引き継ぎ、4章では異なる視点でノーツの取り方を考えてみました。
引き続き、「一重乱打(ノーツが1個ずつ降り複数ノーツの同時押しが存在しない)を片手で同一の指を連続して用いずに打鍵する運指を見つける」すなわち「滑らかな運指」の発見を目指します。再び縦連は無いものとし、鍵盤は指先のみで押すこととします。
1. 方針
以降、連続するノーツの列は鍵盤の番号の羅列で表します。(ex. 1鍵→4鍵→6鍵→2鍵: )
ここからやりたいことはこのようなことです。例えば3.3節で持ち出したノーツ列の例 の取り方を考えます。
最初の5鍵はホムポジに従い薬指で良いでしょう。次の3鍵もホムポジに従って人差し指を使いたいのですが、そうすると次に降ってくる2鍵を滑らかに押すには人差し指以外を使う必要があり、人2以外の運指を持っていないと行き詰まりです。
それでは3鍵を人差し指ではなく親指で取るとどうでしょうか。すると次の2鍵を取るための人差し指が余っているため、無事滑らかに打鍵することができました。
ここでは「5鍵を薬指で押している状態」かつ「次の次に2鍵が降ってくることが分かっている」ため次の3鍵を親指で取るという回避行動を取ることができました。このような回避は3章の運指行列の枠組みでは考えていませんでした。
これを、木構造を走査するアルゴリズムになぞらえて考えてみたいと思います。
現在のノード「薬5」から次に3鍵が降ってくることが分かっているので、ノード(運指)の中から「人3」か「親3」のどちらかを選択したいとします。初めは人3を選択しますが、先程の通り次に2鍵を押せるようなノードは残されていません。
そこで、人3に向かうルートは走査済みとして再びノード「薬5」に戻ります。先程は選択しなかった「親3」のノードが残されているので、次はこちらを走査します。親3の次にはノード「人2」があるため、そちらを走査して無事2鍵を滑らかに打鍵できそうです。
このようにプレイヤーの用いる運指をノードとして、行き詰まらないようにノード間を適切に上り続け、枝がなくなるまで(譜面が終わるまで)木の走査をしようという算段です。
なお、3.3節の問題点で取り上げたように運指行列の枠組みでは運指どうしの相性を無視していたため、ここからはプレイヤーが連続して使う2つの運指の組合せを全てリストアップし、これを運指要素と呼ぶことにします。
以下に運指要素の例を挙げてみます。(スマホだと見にくいかも)
# 運指要素(一例) # 使用運指: ホムポジ + 親(3, 5), 中(3, 5) # (個人的に)連続して押しにくい(相性の悪い)組合せ(例えば '人3' -> '親5')などは除外しています W = { '親1': ['人2', '人3', '中4', '薬5', '薬6', '小7', '中5', '中3'], '人2': ['親1', '中4', '薬5', '薬6', '小7', '親3', '中5', '中3'], '人3': ['親1', '中4', '薬5', '薬6', '小7', '中5'], '中4': ['親1', '人2', '人3', '薬5', '薬6', '小7', '親3', '親5'], '薬5': ['親1', '人2', '人3', '中4', '小7', '親3', '中3'], '薬6': ['親1', '人2', '人3', '中4', '小7', '親3', '親5', '中5', '中3'], '小7': ['親1', '人2', '人3', '中4', '薬5', '薬6', '親3', '親5', '中5', '中3'], '親3': ['人2', '中4', '薬5', '薬6', '小7', '中5'], '親5': ['中4', '薬6', '小7'], '中5': ['親1', '人2', '人3', '薬6', '小7', '親3'], '中3': ['親1', '人2', '薬5', '薬6', '小7'], }
辞書のキーには親ノードに当たる運指を表す文字列、キーに対応する値には子ノードになりうる運指を表す文字列の組合せ(配列)が入っています。
上の例だと、例えば親1からは「親1→人2」「親1→人3」「親1→中4」「親1→薬5」…「親1→中3」の8通りが連続する運指としてあり得るということになるわけです。
当然、運指要素はプレイヤー任意であり多種多様となり得ます。
なお、ここでは「滑らかな運指を1つでも見つける」ことを目標として深さ優先探索を採用し、ノーツ列を最後まで走査できたらすぐに出力するようにしています。そのため、なるべく優先的に使いたい運指(ここではホムポジを優先)を運指要素の辞書中の早い位置に置いています(これもプレイヤー任意)。*11
2. 実装
ということで書いてはみたんですが、筆者は別に実装ガチ勢でも競プロer でもありませんのでお手柔らかに…
・実装例(Python)
# ノード(ノーツとその取り方)のクラス class Node: def __init__(self, parent, finger, depth): self.parent = parent self.finger = finger if parent: self.depth = parent.depth + 1 else: self.depth = 0 # 運指の探索 def search(): while branch: node = branch.pop() if (node.depth + 1 == len(notes)): print("運指を構成できた") n = node fingering = [] while n: fingering.append(n.finger) n = n.parent fingering.reverse() return fingering candidate = [] for i in W[node.finger]: if i[1] == notes[node.depth+1]: candidate.append(Node(node, i, node.depth)) candidate.reverse() branch.extend(candidate) print("運指を構成できなかった") return None # 最初の運指をきめる def make_branch(notes): branch = [] for i in W: if i[1] == notes[0]: branch.append(Node(None, i, 0)) branch.reverse() return branch # 押し方を考えたいノーツ列 notes = " ... " # これから調べるノードのリスト branch = make_branch(notes) # 実行 print(search())
先程のアイデアにならい、ノーツ列を入れると運指の例を出力してくれるプログラムを作成できました。
試しにノーツ列を として実行してみます。
# 押し方を考えたいノーツ列 notes = "532"
・実行結果
運指を構成できた ['薬5', '親3', '人2']
となり、無事行き詰まりを回避して親3を出力してくれました。
・階段
# 押し方を考えたいノーツ列 notes = "1234567654321"
・実行結果
運指を構成できた ['親1', '人2', '親3', '中4', '親5', '薬6', '小7', '薬6', '親5', '中4', '親3', '人2', '親1']
今回は運指要素から人4を排除したため、このプログラムは階段親5派です。うまく運指要素を調節すれば人4派にできそうです。
# 押し方を考えたいノーツ列 notes = "1231321"
・実行結果
運指を構成できた ['親1', '人2', '中3', '親1', '中3', '人2', '親1']
運指要素に中3を入れた理由は、このような親指側に集中する配置に対応するためです。
以上より、3章の議論とは異なる主義として「運指要素であって、この探索方法によって任意のノーツ列に対し1通り以上の運指を割り当てられるようなもの」を「滑らかな運指」と定義することができそうです(先程の「滑らかな運指行列であるための条件(強)」を満たす運指は全てこちらの条件も満たします)。
3章の強い条件の時と比べて運指のバリエーションが圧倒的に少なくなっていますが、ちゃんと滑らかな運指を構成できました。
しかし、強い条件との違いとして「ある程度先のノーツを見越して行き詰まりを回避できる」能力をプレイヤーに仮定しているという点に注意が必要です。
3. ケーススタディ
せっかくなのでこのプログラムに少し頑張ってもらい、譜面の事例研究をしてみようと思います。以下、DP譜面を扱う際は、左手側に降ってくる譜面は右側の左右対称の譜面に置き換えて検証します。
・LASER CRUSTER (DPA 12)*12
DP非公式難易度表では12.3に位置付けられ、複数個のパターンの片手乱打が繰り返し降ってくる譜面です。
左手側に小節ごとに同様のパターンが置かれていますね。
細かく見ると完全な一重乱打ではなく所々に2個同時押しがありますが大まかに一重乱打と見なし、6小節の左手側の譜面を左右対称に右側に移して(DPer 向けに言い直すと FLIP右MIRROR をかけて)ノーツ列をプログラムに入れてみます。
# 押し方を考えたいノーツ列 notes = "1234543524567642"
・実行結果
運指を構成できた ['親1', '人2', '親3', '中4', '薬5', '中4', '人3', '薬5', '人2', '中4', '親5', '薬6', '小7', '薬6', '中4', '人2']
までは特に行き詰まるポイントはありませんが、続く ではホムポジ的に押すとつい中指や薬指が連続してしまいそうな場面です。ここでは親5に頼ることで滑らかな打鍵が可能となっています。
46-53小節にはこのような繰り返し配置もあります。筆者の腕前ではつい取りこぼしをしてしまい嫌らしい配置に感じています。
# 押し方を考えたいノーツ列 notes = "1535757646535424"
・実行結果
運指を構成できた ['親1', '薬5', '人3', '薬5', '小7', '薬5', '小7', '薬6', '中4', '薬6', '中5', '人3', '薬5', '中4', '人2', '中4']
まではホムポジ配置ですが、その次の5鍵は中5を使い、 の最初の を中指で押すために敢えて 中5→人3→薬5 というトリッキーな取り方を出力しています。
トリルを取る指を途中で変えるのは通常プレーではまず見かけませんが、滑らかに押す制約のもとで生じる特徴的な取り方だと思います。
・Dr. Chemical & Killing Machine (DPA 12)
DP非公式難易度表では12.5に位置付けられ、ラストには徐々に重くなっていく乱打が16小節休みなく降ってきます。そのうち最初の4小節(64-67小節)は両手に一重乱打が降ってくる構成となっており、この箇所を取り上げてみたいと思います。
今更ですが、DP非公式難易度表とは「DP全譜面を正規譜面(逆正規譜面*13 )でノーマルゲージクリアする際の目安となる表」と定義されており(細かい定義はURL先のREADMEをご覧ください)、有志の手による投票と集計が行われています。
2018年7月以降の設定基準では、最高難易度であるLEVEL 12 の譜面は「11.6, 11.8, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7」の10段階に分類されています。
つまり、3番目に難関とされている区分の譜面ですら片手一重乱打力は重要ということがお分かり頂けるかと思います。
# 押し方を考えたいノーツ列 notes = "1526374612451346726152432457346724352617345724567261526312473624"
・実行結果
運指を構成できた ['親1', '薬5', '人2', '薬6', '人3', '小7', '中4', '薬6', '親1', '人2', '中4', '薬5', '親1', '人3', '中4', '薬6', '小7', '人2', '薬6', '親1', '薬5', '人2', '中4', '親3', '人2', '中4', '薬5', '小7', '人3', '中4', '薬6', '小7', '人2', '中4', '人3', '薬5', '人2', '薬6', '親1', '小7', '人3', '中4', '薬5', '小7', '人2', '中4', '親5', '薬6', '小7', '人2', '薬6', '親1', '薬5', '人2', '薬6', '人3', '親1', '人2', '中4', '小7', '人3', '薬6', '人2', '中4']
ノーツ列を64ノーツ連続で入力しましたがこのように出力してくれます。1回ずつ登場する親3, 親5を除いてほとんどホムポジ配置が出力されていますね。
DPはホムポジと親3だけでほとんど楽しく遊べるんですよ!!!!!!!!(うるさい)
・灼熱Beach Side Bunny (SPA 12)
調子に乗ってSP譜面への適用も考えてみます。本楽曲はスクラッチが667枚(全体の38%)も降り注ぐ皿譜面であり、例年SP段位認定「皆伝」の2曲目に配置され挑戦者を阻む譜面です。
この譜面のラスト(74-77小節)は次のような配置になっています。
皿部分に注目が行きがちですが、鍵盤部分を見ると(2個同時押しはあれど)ほとんど一重乱打で構成されています。これを少し単純化して…
notes = "351526371424153526273516372535463725262514163726352637364621"
・実行結果
運指を構成できた ['人3', '薬5', '親1', '薬5', '人2', '薬6', '人3', '小7', '親1', '中4', '人2', '中4', '親1', '薬5', '人3', '薬5', '人2', '薬6', '人2', '小7', '人3', '薬5', '親1', '薬6', '人3', '小7', '人2', '薬5', '人3', '薬5', '中4', '薬6', '人3', '小7', '人2', '薬5', '人2', '薬6', '人2', '薬5', '親1', '中4', '親1', '薬6', '人3', '小7', '人2', '薬6', '人3', '薬5', '人2', '薬6', '人3', '小7', '人3', '薬6', '中4', '薬6', '人2', '親1']
片手鍵盤を採用する場合、このように正規譜面はほとんどホムポジ配置で攻略できます。SPの場合は片手鍵盤はあくまで選択肢の1つに過ぎませんので、参考程度に捉えて頂ければ。
というように、探索法を様々な譜面に適用してみました。もちろんここで紹介したケーススタディはあくまで全体のごく一部に過ぎませんし、プレイヤーごとに多様な運指要素とその選好度を指定することで出力される運指もさらに多様化すると考えられます。
4. 改善点
しかし、まだまだ改善の余地は残されています。具体的には以下のような点があります。
・以前までは「乱打には縦連がない」という制約をかけていましたが、運指要素を工夫すれば縦連込みの乱打にも対応できるようになります。
# 運指要素(一部) W = { '親1': ['親1', '人2', '人3', '中4', '薬5', '薬6', '小7', '中5', '中3'], ... }
のようにすれば、親ノード「親1」から子ノード「親1」へと連続で走査できるため のようなノーツ列にも対応できるようになります。
# 押し方を考えたいノーツ列 notes = "11111"
実行結果
運指を構成できた ['親1', '親1', '親1', '親1', '親1']
・ここまでひたすら「同一の指を連続して用いずに打鍵する」という制約を強調してきましたが、クラスで親ノード(1つ前の運指)の情報を保持できるため、そちらを参照することで例えば「2回連続までであれば同一の指を用いても良い」といった条件での探索も可能になります。
・これまで散々信頼してきたホームポジションですが、ホムポジだけでは当然5鍵と7鍵のトリルや6鍵と7鍵のトリルに対しては薬指と小指のトリルを適用するしかありません。この記事をお読みの皆様、薬小トリルってできますか?
僕はできません。できる人っているんですかね…
このような場合は、57トリルは例えば親指を5鍵に持ってきて親小トリルとすれば、67トリルは中小か中薬トリルとすれば多少は押しやすくなります。しかし、上記の方式だとホムポジに準拠して薬5が親5より優先されてしまいます。
そこで、出力された運指のうち薬指と小指が連続で使われている箇所が存在したら、滑らかさを損なわない範囲で薬指を別の指(親指など)に変更するといった対応ができそうです。
また、ご存知の方も多いとは思いますが木構造にはエッジ(ノードをつなぐ辺)ごとに重みを持たせることができます。例えば「薬指→小指」及び「小指→薬指」のエッジの走査には他の指よりもやや大きなコストがかかることにし、複数通り出力された運指の中から最もコストが少ないものを最適な運指として選択するという方法も考えられそうです。
ここでは簡単に、出力された運指を評価するための評価関数を用意し、滑らかな条件を満たす全ての運指の評価値を算出することを考えました。
fingering = [ ['薬5', '小7', '薬5', '小7'], ['薬5', '小7', '親5', '小7'], ['薬5', '小7', '親5', '薬7'], ['薬5', '小7', '中5', '小7'], ['薬5', '小7', '中5', '薬7'], ... ] def evaluation(fingering): ans = [] # ホムポジ, なるべくこれを使いたい homepos = ['親1', '人2', '人3', '中4', '薬5', '薬6', '小7'] # 親指は優先的に使いたい sub1 = ['親3', '親5'] # それ以外 sub2 = ['中5', '中3', '中6', '薬7'] for i in range(len(fingering)): # 点数 score = 0 for j in range(len(notes)): # 加点部 if fingering[i][j] in homepos: score += 1.0 elif fingering[i][j] in sub1: score += 0.8 else: score += 0.4 # 減点部 if (j > 1): # 薬小トリル有無の判別, あれば減点 check1 = (fingering[i][j][0] == '薬' and fingering[i][j-1][0] == '小' and fingering[i][j-2][0] == '薬') check2 = (fingering[i][j][0] == '小' and fingering[i][j-1][0] == '薬' and fingering[i][j-2][0] == '小') if (check1 or check2): score -= 0.4 # トリルを取る指を途中で変更していたら減点 check3 = (fingering[i][j][1] == fingering[i][j-2][1]) check4 = (fingering[i][j][0] != fingering[i][j-2][0]) if (check3 and check4): score -= 0.4 ans.append([round(score, 1), fingering[i]]) ans.sort(reverse=True) return ans
スコアは良い運指ほど高い値とし1ノーツ単位で加点減点処理をします。
ホムポジに従っていれば1.0点、ホムポジ以外の親指なら0.8点、残りは0.4点を加点。
3ノーツ分の薬小トリルがあればその都度0.4点減点(この処理を1ノーツごとに行うため、例えば6ノーツ分の薬小トリルがあれば計1.6点減点となるます)、トリルを取る指を変更していたら(ex. を 中5→人3→薬5 で取る)同様にその都度0.4点減点としました。
(もちろん評価関数の評価方法や点数は微調整でありプレイヤー任意です)
前述の探索によって出力された運指を全てこの方法で評価しまとめて出力します。
早速、問題のノーツ列 を調べてみます。
# 押し方を考えたいノーツ列 notes = "5757"
・実行結果
[3.6, ['親5', '小7', '親5', '小7']] [3.4, ['薬5', '小7', '親5', '小7']] [3.2, ['薬5', '小7', '薬5', '小7']] [3.0, ['親5', '小7', '薬5', '小7']] [3.0, ['薬5', '小7', '中5', '小7']] [2.8, ['親5', '小7', '中5', '小7']] [2.8, ['中5', '小7', '親5', '小7']] [2.8, ['中5', '小7', '中5', '小7']] [2.6, ['親5', '薬7', '親5', '小7']] [2.6, ['親5', '小7', '親5', '薬7']] [2.6, ['中5', '小7', '薬5', '小7']] [2.4, ['親5', '薬7', '親5', '薬7']] [2.4, ['薬5', '小7', '親5', '薬7']] [2.0, ['薬5', '小7', '中5', '薬7']] [1.8, ['親5', '薬7', '中5', '小7']] [1.8, ['親5', '小7', '中5', '薬7']] [1.8, ['中5', '薬7', '親5', '小7']] [1.8, ['中5', '薬7', '中5', '小7']] [1.8, ['中5', '小7', '親5', '薬7']] [1.8, ['中5', '小7', '中5', '薬7']] [1.6, ['親5', '薬7', '中5', '薬7']] [1.6, ['中5', '薬7', '親5', '薬7']] [1.6, ['中5', '薬7', '中5', '薬7']]
深さ優先探索により探索を打ち切らないと、簡単なトリル4ノーツ分でさえ 通りもの運指を出力してしまいますが、この方法によりそれらが評価値ごとにソートされ、良さそうな運指が上から順に並んでいます(願望)。
ホムポジ準拠の薬小トリルは 点ですが、代わりの親小トリルが 点と高く評価され、上記の問題点をなんとか解決できたように思います。
(ただし、当然この方法はそのまま用いると膨大な数の運指を相手にするため時間空間計算量の増大により破綻します。恐らく評価は探索と同時に行い、探索を8ノーツ単位あたりで打ち切って一旦評価するなどして逐次的に運指を決定していくのが良さそうです)
・・・
といったところで、以上のような発展性はありますが、概ね一重乱打についての考察は3, 4章でカバーできたのかなと考えています。
筆者としても ホムポジ + 親3, 5 + 中3, 5 であらゆる一重乱打を指を連続して用いずに打鍵できることが判明して割と安心するところがあります。
しかしながら、当然これでDPのあらゆる譜面の考察が済んだわけではありません。むしろ以上の議論は一重乱打に的を絞った非常に限定的なものです。DPにはもちろん二重以上の乱打も登場し、それらは上記の意味で一般に滑らかに打鍵できるはずもありません。また今回はスクラッチも無視しましたが、いっそのこと鍵盤とスクラッチの絡みこそがDPの重要な魅力ですらあります。
DPはSPと比べて譜面の表現の自由度が高く、高難易度譜面といっても一概にノーツ数が多いだけの譜面ばかりではなく様々に尖っています。最強格の譜面には2000ノーツ超えのものが軒を連ねる中、1300ノーツ程度で非公式難易度「12.7」に属する譜面や、1000ノーツにも満たないのに「12.6」に属する譜面も存在します。*16
筆者の私も冒頭で触れたような程度の腕前であり、まだまだDPの奥深い世界の途中にいるに過ぎません。この記事を一部でも読んでIIDXやDP(ダブルプレー)への関心が深まったという方が少しでもいるならこの上ない喜びです。
5. 終わりに
本記事ではAC音ゲー beatmania IIDX と DP(ダブルプレー) のご紹介および片手鍵盤で使う主要な運指について取り上げました。また、少し調子に乗って3, 4章では片手鍵盤の理論化に挑戦しましたが、筆者の不勉強ゆえ拙い内容になってしまったことをお詫び申し上げます。
繰り返しますが 3, 4章の議論は極端な理想論であり、実際のプレーで実行するにはいわゆる座学のようなある程度の準備が必要になるかと思います。しかし、譜面の密度に対しプレイヤーの認識力が非常に高い場合は、落ち着いて上記のような回避行動及び最適な運指の選択ができるでしょう。
どの場面においても地力の高さは身を助けるものであり、最終的にはプレー時間及び練習量の次元に帰着されるものと思います。
DPer の方からすれば恐らく現実に即さない結論にやきもきされているかも知れません。本稿執筆にあたって様々な方のプレー手元動画を漁ったのですが、観測範囲においては(特にクリアラーの方で)通常の一重乱打で親5を使っている方はあまり見受けられず、薬指を連続で用いている方が多かったように思います。
しかしながら、筆者としては(あくまで条件や制約の中で限定的なものであったとしても)運指を考える手立てとしてやりたかったことをやれたことに満足しています。
また、IIDX及びDPを知らなかったという方へ、本文中では散々「滑らかに押す」ことを重視してきましたが、実際に少し同じ指が連続することがあっても全く問題ありません。
こんなことを延々書いておいて恐縮ではありますが、DPを始める際はホームポジションのことさえ頭に入れておいて頂ければ十分過ぎます。なんなら最初はホムポジも無視して完全に自由に押して頂いても楽しく遊べるモードです。
SPに比べて動きが激しいため、ケガには十分注意して遊んで頂きたく思います。
本当にここまで全て読んで下さっている方がいるとしたら、最大級の感謝を表明いたします。誠にありがとうございます。
ここまで読めるような方には絶対にDPの素質があります。次にゲームセンターに向かった際には、ぜひIIDXをプレーし、モード選択画面や選曲画面でテンキーの[3]を押してみてください。
DP楽しいよ!ホムポジと親3だけで楽しく遊べるよ!
引用・参考文献
・beatmania IIDX 譜面集 TexTage
textage.cc
textage.cc
IIDX(SP/DP) の譜面データが全て保管され、譜面がシート上に表示されるサイト。日々お世話になっております。
・beatmania IIDX DP非公式難易度表 SNJ@KMZS
zasa.sakura.ne.jp
IIDX DP譜面の難易度細分化を行っているサイト。
・ereter's dp laboratory
ereter.net
DP界のレジェンドの名を冠する、DP プレイヤーの記録が保管され一覧表示されるサイト。各曲のクリア者数や全一記録などが細かく掲載されている。
本記事を読んで頂きありがとうございました。
この記事は B4UT Advent Calendar 2022 参加記事です。他の記事はリンク先からご覧ください。
b4utmzi.wixsite.com
脚注
*1:とはいえSPに区切りがつかなくともいつでもDPを始めるべき!
*2:段位合格時の曲ごとの達成率は40%が最低値
*3:対となる「自由運指」は、概念的には譜面ごとに即興的に運指を考えて押すスタイルのことを指します
*4:中央部分のeffectボタン及びVEFXボタンは除く
*5:CHECKING YOU OUT (DPH 11) 同難易度のANOTHER譜面より難しいとされる それぞれ左側は左手、右側は右手で普通に取って F-COMBO している動画を見つけて困惑
*6:正直に言って全く多用されているわけではありませんが、1度どこかの記事で見かけたこの表現が気に入っています
*7:逆に、非常に地力の高いプレイヤーはホムポジ配置よりも崩れた配置の方がスコアを出しやすいため、SP同様ランダムをかけることがよくあるようです
*8:DP最強格の物量譜面。ラストは同楽曲のSPA譜面を片手で打鍵させる構成になっている。なおLEGGENDARIA譜面も存在するがDPではANOTHER譜面の方が難しい
*9:つまりベチャ押し(指の付け根を使ってボタンをおすこと)を無視しますが、実用上は難解な同時押しに対しベチャ押しを用いることは上級者でもよくあることのようです
*10:KAMIKAZE (DPA 10) 鍵盤部分は最初から最後まで左右両方1, 3, 5, 7鍵のノーツのみで構成される
*11:走査するノードのうち、良さそうなものを見込んで次にいち早く展開するノードを決めることは知識あり探索(発見的探索)と呼ばれます。ここでは優先的に使いたい運指を早い位置に置いているだけですが、この部分はプレイヤーの知識依存です
*12:"CRUSTER"…?とお思いの非IIDXerの方、鋭いですね… 誤植ではないかとされています
*13:正規譜面を左右対称にした譜面。譜面オプション「FLIP MIRROR/MIRROR」をかけた譜面のこと
*14:One More Lovely (DPA 12) 正規譜面 87-90小節 DP中伝1曲目の常連