音感トレーニングのアプリを作っていて、プレイ中の画面に「いま合わせているのは、この和音の中で何の音か」を出すバッジを付けました。ルート、3度、5度、といったあれです。基準の音に自分の声(というか指で動かす音)を重ねる練習をしていても、それが音楽的に何をしているのかは、意外と分からないまま終わってしまう。そこを埋めたかったのです。

作り始めてすぐ、素朴な方法が通らないことに気づきました。「この音は何度か」を機械に判定させたい。ならば基準の音から何半音上かを数えればいい ── そう思うでしょう。私も一瞬そう思いました。これが通らないのです。
ドから8半音上の音は、ひとつではない
ドから8半音上がったところに音を置いてみます。書き方は2通りあります。ソ♯と書けば増5度、ラ♭と書けば短6度です。

ピアノで押す鍵は、どちらも同じ1つの黒鍵です。

いま普通に使われている平均律では、鳴る高さも完全に同じ。つまり音として聞いても、鍵盤を見ても、この2つは区別できません。それでも名前は2つに分かれます。
分かれる理由は、度数の数え方にあります。度数は「音の距離」ではなく、ド・レ・ミ・ファ・ソ・ラ・シという音名の階段を何段またいだかで決まります。ドを1段目として数えると、ソは5段目だから5度。ラは6段目だから6度。ソ♯はあくまでソの仲間なので5度の系統、ラ♭はラの仲間なので6度の系統です。そのうえで、5度が半音広がっているから「増5度」、6度が半音狭まっているから「短6度」。
だから譜面の上でも、この2つは違う場所に書かれます。上の楽譜を見比べてください。ソ♯は下から2本目の線をまたぐ位置に、ラ♭はそのすぐ上の空間に置かれています。玉が一段ぶんずれているのです。音は同じでも、書かれる場所と名前が違う。
同じことは6半音でも起こります。ファ♯と書けば増4度、ソ♭と書けば減5度です。

どちらの名前かは、周りが決める
では実際にはどちらで呼べばいいのか。それは、その音が置かれた文脈が決めます。
ド・ミ・ソ♯という3つの音が同時に鳴っているなら、これは3度ずつ積み上がった増三和音で、いちばん上は5度が広がったもの、つまり増5度です。一方、ラ♭の和音(ラ♭・ド・ミ♭)を、下からド・ミ♭・ラ♭と積み替えた形の中に出てくるドとラ♭なら、話が変わります。根っこはあくまでラ♭ですが、いちばん下にいるのはド。そのドから見上げたラ♭までが、6度が半音狭まった短6度になります。
同じ「8半音の隔たり」でも、周りに何があるかで役割が変わる。名前はその役割に付いています。ここが、音の距離だけを見ていると絶対に決まらない部分です。
2音だけだと、決め手がない
さて、私のアプリの話に戻ります。
ここで扱っているのは重音、つまり2つの音を重ねるだけの練習です。文脈にあたる3つ目の音がありません。ド と ソ♯(=ラ♭)の2つしか鳴っていないとき、これが増5度なのか短6度なのかは、音そのものからは決められないのです。
実際、半音の数だけで名前を決める方式にすると、増4度と短6度がどちらも「5度」に化けます(6・7・8半音をまとめて5度と扱うため)。長2度や長6度にいたっては、対応する役割が無くてバッジそのものが消えてしまう。「短6度の重音」という名前のステージを練習しているのに、画面には「5度」と出る、という間抜けなことになります。
結局どうしたかというと、出題データがすでに答えを持っていました。このアプリの重音の問題は、そもそも「完全5度」「短6度」といった音程ごとにステージが分かれています。つまりデータ側に音程名が書いてある。あとはどちらの音が根っこかさえ分かればいいので、それもデータに持たせました。音から推測するのをやめて、最初から決まっているものを使う、というだけの話です。
3つ以上の音なら、そこまで気にしなくていい
面白いのは、和音(3〜4音)のステージでは、半音を数える素朴な方式のままで困らないことです。理由が2つあります。
ひとつは、和音で出しているのが「ルート・3度・5度・7度」の4種類だけだからです。減三和音の5度は6半音、増三和音の5度は8半音ですが、どちらも画面には「5度」としか出しません。その細かい違いは、ステージ名の「減三和音」「増三和音」がすでに言っている。表示に出ない差は、化けようがないわけです。

もうひとつは、さっき書いたとおり、3つ音がそろえば文脈が自分で決まることです。ド・ミ・ソ♯まで見えていれば、いちばん上はもう増5度としか読めない。和音は自分で文脈を持っているのに対して、重音は持っていない。同じアプリの中に、判定の方針が2つある理由はここにあります。
おまけ:ユーザーからの指摘が、古いバグを掘り当てた
ここは私の手柄ではないので、順番どおりに書きます。発端は、アプリを使ってくださっている方からの「増三和音の問4〜6が短三和音になっている」という指摘でした。調べたらそのとおりで、しかも同じ種類の誤りが和音データに計6件ありました。根音を1文字打ち間違えた類のものです。
それを直したあと、バッジの実装でiOS版とAndroid版の判定を揃えるために出題データを全問突き合わせたところ、和音では見ていなかった重音のほうにも1件見つかりました。285問のうち1問です。

「短3度の重音」というステージの中に、長3度の問題が1問だけ紛れていたのです。表示だけの問題ではありません。このデータは鳴らす周波数の元にもなっているので、短3度を練習しているつもりで、その1問だけ長3度を合わせさせられていたことになります。しかもこの重音のデータは月面ステージでも共有しているので、そちらにも同じ問題が出ていました。
この1問がいつから紛れていたのかは、もう分かりません。ステージを作ったときからそのままだった可能性が高く、そうだとすればずいぶん長いあいだ、誰も気づかないまま出題され続けていたことになります。私自身も気づいていませんでした。3半音と4半音の差は、耳が育っていなければ「なんだか合わせにくい問題だな」で流れてしまいます。
見落としの本体は、データ1件そのものより、テストの守備範囲でした。以前に和音のデータについては「ステージ名が名乗る和音と、実際に鳴る音程が一致しているか」を全問検査する仕組みを入れていたのに、重音のデータは検査対象に入れていなかったのです。今回それを重音にも広げて、両OSとも修正しました。ユーザーに指摘されるまで気づけなかったわけで、データの正しさは、目視や自分の耳ではなく機械に見張らせるものだと、あらためて思い知らされました。
まとめ
音程の名前は、鍵盤の上の距離では決まりません。音名の階段を何段またいだか(度数)と、そこから半音ぶん広いか狭いか(完全・長・短・増・減)の組み合わせで決まります。だからソ♯とラ♭のように、同じ鍵を押しても違う名前になる音が出てきます。
耳で聞き分けられない違いに名前を付けるのは、一見わずらわしいのですが、その音が和音の中で何をしている音なのかを書き残すための仕掛けなのだと思います。増5度と書いてあれば、増三和音の広がった5度として置かれている。短6度と書いてあれば、ラ♭の和音を積み替えた形の中にいる。どちらへ動くかまでが決まるわけではありませんが、少なくともどういう役割で置かれた音なのかは読み取れます。楽譜は音の高さだけでなく、役割まで書いている、ということです。
アプリのほうは、この判定を組み込んで、練習中の画面に「いま合わせる音」を出せるようになりました。重音や和音を、ただ合わせるだけの作業から、いま自分が何をしているのか分かる練習にしたいと思っています。
