空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

NULL値を条件にしてSELECTする

Androidの概念が存在するより昔、まだファイルベースDBとしてはBerkeley DBのほうがメジャーであった頃から、SQLiteをデスクトップアプリの内部フォーマットとして採用して細々と使い続けてきた。十年以上使って、一度たりとも互換性の問題もデータが壊れたり失われたこともなかったことは、このDBの品質の証であろうと思う。長らく単純に「安定したシリアライズフォーマット」としての利点を利用してきたが、ここに来て、もう少し積極的にRDBの機能を使って行こうという流れになってきている。

FOREIGN KEY拘束や、関数、トリガーなどを駆使して、RDBをデスクトップアプリのデータモデルの中心に置くと、色々嬉しいことがある反面、アプリから見たらブラックボックスであるRDB独自の仕様に引きずられてしまうこともある。そんなわけで、ちょくちょく学んだことをメモして行こうと思う。

さて、早速だけど、以下のようなテーブルを作成する

CREATE TABLE File (
    ID INTEGER PRIMARY KEY,
    Name TEXT NOT NULL,
    ConfigA TEXT,
    ConfigB TEXT
);

このとき、ConfigA、ConfigB は空文字だったり、NULLだったりする。さて、ここでFile テーブルに対して、Name、ConfigA、ConfigB の組み合わせで定まるファイルのIDを取得するための、再利用可能なパラメータ化されたステートメントを作成したい。

私が最初に書いたSQLがこちら

SELECT ID FROM File WHERE Name=? AND ConfigA=? AND ConfigB=?

結論から言うと、これはConfigA、ConfigB がNULLのエントリを見つけることが出来なかった。SQLにはNULLかどうかを判定するためにIS NULLという演算子があり、それを使わなければならないようだ。したがって、たとえば ConfigA、ConfigB が両方とも空文字かNULLであるようなエントリを見つけるには

SELECT ID FROM File WHERE Name=? AND (ConfigA='' OR ConfigA IS NULL) AND (ConfigB='' OR ConfigB IS NULL);

とする必要がある。この方法の問題点は、ConfigA、ConfigB が空文字の時にだけ、SQLを別途用意しなければならない点。そのロジックをSQLの外部に書くこともできるが、そこを何とかパラメータ化されたステートメントを1つだけ作って解決できないものだろうか。

で、最終的に行き着いたのがこちら

SELECT ID FROM File WHERE Name=? AND ifnull(ConfigA,'')=ifnull(?,'') AND ifnull(ConfigB,'')=ifnull(?,'');

ifnull関数は、第一引数がNULLのときに、第二引数に指定した値を返す関数。この関数を介することにより、NULLと空文字を、SELECTする側で等価に扱えるようになる。

SQL側に少しだけロジックを移動させることで、C/C++等で利用する側のコードが少しシンプルになるという話でした。

おしまい

The Wagtail

Burgmüller 25 Progressive Pieces, Op. 100 の 11 曲目。とても高度な曲のように聴こえたが、楽譜を見ると、ドミソとラドミの転回系を左右両方の手でひたすら練習する曲のように見える。9曲目の The Chase でもその片鱗は既にあった。子供っぽい曲なので、オジサンが弾いてもあまり様にならないのが難点。

この曲の難しいのは、ソミド、ミドソ、ドソミを左右の手で逆から弾くところ。「ドミソ(左手)⇔ ソミド(右手)」は白鍵を1つ置きに弾く左右対称の運動なので問題ない。「ソドミ(左手)⇔ ミドソ(右手)」はソから、その上のドまで、白鍵が2つ空いている。楽譜の指示によると、左手では、その部分を3番→1番の指で、右手では5番→2番の指でそれぞれ弾くことになっている。したがって「ソドミ(左手)⇔ ミドソ(右手)」は「521(左手)⇔ 531(右手)」と弾く。続く「ミソド(左手)⇔ ドソミ(右手)」は「531(左手)⇔ 521(右手)」といった具合だ。最初の2小節の真ん中のたった6音、これがなかなか難しいのである。通してみると

右 531 53*1 521 531
左 531 521 53*1 531

* ... 白鍵2つ

となる。人間の指の構造上、そのマッピングが最も適しているのだろうけど、鍵盤上を平行移動しながら、指番号を意識しつつ正しい鍵盤を押そうとすると、たったこれだけで発狂しそうになる。

曲自体は、C、Am、Dm のコードをなぞるだけなので、構造を理解するのはそれほどむつかしくはないと思うが、新たな情報処理の方法を脳内に構築しないと 120 bpm で弾くのは不可能。次々に大きな壁が立ちはだかる。

さて、どうするか。

今回の曲の難所では

「えーと、つぎはCのコード転回形で、左手はソドミ、右手はミドソ、ハイッ」
「えーと、つぎはCのコード転回形で、左手はミソド、右手はドソミ、ハイッ」

という意識内の情報処理が、120 bpm に追いついていないのが問題。そして大前提として「意識に処理できる情報量は増やすことは出来ない」。なので、やるべき事は1つ。

「情報圧縮」である。

右 531 53*1 521 531
左 531 521 53*1 531
* ... 白鍵2つ

この弾き方のを思い切って

0,1,2,0

のような符号化をする。結果として、

「次0120!ハイ!」

という情報処理で弾けるようになり、それがもう少し汎用的な脳内インストラクションセットとして、体に組み込まれた気がする。

Tender Flower

Burgmüller 25 Progressive Pieces, Op. 100 の 10 曲目。楽譜に#が2つも付いている。ニ長調である。ヘ長調(♭1つ)、ト長調(#1つ)くらいまでなら例外として黒鍵を受け入れられたし、今までの楽譜は、むしろ黒鍵を避けるために移調した結果の♭なり#であった。だがこの曲は黒鍵をちゃんと弾く。今後#や♭が増えていったときに、今のやり方のままでは挫折するのが目に見えている。一応、高校の選択科目で習った音楽で、長調短調、音階の仕組みなどは知ってはいるものの、楽譜でそれを見た後、指を動かして演奏するまでの情報処理の枠組みが脳内に構築されていない。その作業の入り口としてのニ長調。というのが Burgmüller 先生の導きであろうと思う。

絶対音感の持ち主であれば、音名で把握するのが近道だし、相対音感を頼りにするなら階名、あるいは相対的な度数で読み取っていくのもありだろうと思う。自分にとっての解を見つけられるほどの経験がまだないので、ひとまずは楽譜に正面からぶち当たっていくしかない。

CDを聴いた最初の印象では Sincerity のようなシンプルな曲?だと思って少し弾き始めると、全然難しくて、自分の音感の乏しさに絶望する。楽譜から音楽への情報処理もまだまだ修行が必要。音符が2個以上飛ぶと、初見では付いていけない。左手もト音記号からヘ音記号に変わったりして、前以上に揺さぶられてざわつく。ニ長調で初めて出てきたドの♯を脳内で時々レと思って弾いてしまうことがある。

大体通しでゆっくり弾けるようになるのに1日かかった。以前に比べると大分早くなってきた。

  • 主題A、中間部Bとすると、A→A→B→A→B→A という構造の全48小節だが、指の動きとしては18小節分しかない
  • dim. e poco riten. が付いているので、少し酔える
  • 透き通った旋律を際立たせるために、左手の休符をしっかり守る

調が変わっただけで、音が透き通って聴こえるのが不思議。真ん中のレと下のファを弾いたときに少し共振のような微かな振動を感じるので、もしかしてそろそろ調律が必要かもしれない。

The Chase

Burgmüller 25 Progressive Pieces の9曲目。3ページもある。ただ、A イントロ、B メインテーマ、C 短調1、D 短調2と分けて考えると A→B→C→B→D→B→A という構造になっているので、実質覚えるフレーズは4つだけである。

この楽譜を練習する前だったら、自分が弾けることを想像することも難しかったけれど、これまでの曲での経験を踏まえて楽譜をみると「読める!読めるぞ!」というムスカ大佐の気持ち。和音もリズムも単純。ただ音符の上下の幅が広い。1と3の指で5度離れたミとドを押さえる指示などもあるし、子供には難しそう。そのぶん、指の動きがダイナミックなのでしっかり引けると様になる。

今まで小さくコロコロリンと弾いてきたところで、Gracefulness、The Chase と、少しずつその制約を開放しつつある。

  • 198 bpm で1オクターブ離れた八分音符をスタッカートで弾く。最初は f、次は p。これは、最初の Imitating hunting horns の指示に続いて (echos) とあるので、p は山びこの反響を表現しているようだ。相当繊細に弾かないと表現できない
  • 原曲の速度で弾けるようになるには相当かかる
  • ハ長調の単純なフレーズの繰り返しなので、逆に聞かせる曲にするのが難しい
  • イ短調の中間部をつなげてひとつの曲にパッケージするのも表現力を必要とする作業なので、しっかり弾けるようになってから完成までにさらに時間がかかりそうな予感
  • 1オクターブ離れたスタッカートの付いた8分音符を連打するときに、離れているからといって、鍵盤の遠くから「バシッ!」と叩くような弾き方にならないように気をつける。左手の和音も結構飛ぶが、指番号の指示を参考に「ジャーン、ジャーン、ジャーン」と離れ離れに弾かないように気をつける。カタカナで言うと「ジャーャジャーャジャーャ」という風にCDの音源では聴こえる。力の加減が難しい。

Gracefulness

Burgmüller 25 Progressive Pieces の8曲目。これまでの7曲も自分の中では人前で引けるレベルに達していないけれども、いつまでも1つの曲ばかりだと特に初心者はスキルが育たないと思うので、次の曲に進む。

100 bpm の Moderato だけど、旋律は32分音符なので、単純計算で0.075秒に1音。これは The Clear Stream の三連符(0.11秒に1音)よりも、さらに速いということだ。今までで一番速い。楽譜を通して Burgmüller 先生のメッセージを受け取るならば、ここらでメカニカルな演奏技術をみっちりすべしということか。このシリーズを通して、1曲ごとが音楽として豊かだし、かつ初心者にとって新しいテクニックが無理のない程度に付け加えられいるので、個人的には1番から順番に、progressive に練習していくのが正しい使い方と感じている。

  • 32分音符は同じメロディの繰り返しで、1度、2度、3度とシフトしているだけであるが、半音があるので黒鍵の有無にバリエーションがある。転調のようなスキルの触りとも思える。不思議なことに何度も弾いていると感覚として分かってくる
  • 32音符の後の音が飛ぶ8分音符の練習も新しい
  • 左手の和音は、右手の演奏に合わせて変化するが、チロチロリンの後の8分音符を引き終わったときにどの和音に遷移するのか頭の中でイメージして準備しておくと音が上手に流れていく。ここは流れに身を任せ「感じる」聞き手と、流れを演出し「演奏する」弾き手で決定的に頭の使い方が違うところ
  • 付属のCDの演奏では前半の小節の最後のスタッカートを全部弾いていない。これは受け入れ難し
  • 前半、右手は、p から pp で、高速に弾く。今まで以上に正確な指の動きが必要。152 bpmアラベスクもまだ指が追いつかない程度だが、32分音符なので、アラベスクで言ったら 200 bpm で弾く計算になる
  • 後半は旋律が左右と移動。p から mf、f と、スタッカートの付いた和音の連打が入る。安定した和音の連打も、この曲で強調されているメカニカルの要素だと受け取った。

以上の構造を実際に弾く前に読み込んでおいたら、低速ではすぐに通して弾けるようになった。問題は 100 bpm で物理的に指が動くかという話。今のレベルだと、音楽的であることよりも、機械的にでも楽譜に忠実に弾けることを優先したほうがよいかもしれぬ。ハノンのスケールの練習にも励んだほうが良いかも。

ペダルも使わず、スタッカートを意識して楽譜に忠実だと思った音源はこちら

youtu.be

The Clear Stream

Burgmüller 25 Progressive Pieces の7曲目。

ここまで1週間に1曲のペースで通して弾けるようにしてきた。毎回壁だと思っていた曲も、構造に分解すると単純なものが多かった。しかしこれは本当の壁。176 bpm で三連符が続く。前半は 0.11 秒に1音、後半は 0.17 秒に1音、よどみなく流れなければならない(無理!)。付属の CD の演奏は完璧で、清らかな水面の波紋が想起されるほどに滑らか。全部で24小節なので、テンポどおりに弾くと54秒で演奏が終わる。CD はほぼぴったり54秒。これはハノン方式で、確実に弾けるテンポを見つけて時間をかけて完成に持っていくしかなさそう。

  • 前半左手は G B の繰り返し。
  • 前半の三連符は、最初の音が旋律で、続く2音は装飾だと思って弾くと解説されていたが、2番目の音を軸にしたほうが綺麗に響いた。三連符の3音でハーモニーになっていることを頭の片隅に置く
  • 停滞→遷移の繰り返しの構造を理解すると、最初の8小節の指の形は3章節ぶんのヴァリエーションしかない
  • 1オクターブ下への遷移は自然にできるが、上への遷移がぎこちなくなってしまう。上への遷移の場合、三連符の最後の音が、次の三連符の最初の音になっているので、三連符の最初の音を弾き終わったら右手と右の1番の指は次の三連符を引く準備に入るために並行移動を開始する。三連符の最後の音を2番の指で引き終わるときには既にその場所に1番の指が準備できているようにするとスムーズにつながる。
  • 後半も、二連の8分音符は最初の音が旋律で、2番目の音符はずっと A。左手のベース音と、最初の音のカップリングを考えながら弾く

ピアニストのしもんさんの動画を参考にゆっくり練習。これに限らず、どの動画も示唆に富んでいてためになる。ピアノを「歌わせる」という感覚を頭の片隅に入れておくと、音質が本当に変わるのでおすすめ。

https://youtu.be/0AtX5uQI0Rc

ついでにもうひとつ、個人的におすすめなのが、ピアニストの森本麻衣さんのチャンネル

https://www.youtube.com/channel/UCM8GvC0PNfzPF5k50Fw-5XA

部活の先生のような雰囲気がある。何をするべきなのか、ポイントがロジカルで分かりやすい。それぞれの簡略化されたアドバイスは、それに続くスキルを習得するための入り口に立たせてもらうためのものなので、アドバイスをする際に捨象された部分を、練習する中で発見して付け加えていくような使い方をするとよいのではないかと思う。

ネットの発達で趣味の世界はずっと豊かになっていて、楽譜の解説などは以下のサイトでも読むことが出来る。

enc.piano.or.jp

これを1分以内に弾き終わるのをゴールに設定している。今のところは 104 bpm くらいが限界…。

2021/2/15 追記

驚くことに 176bpm で弾けるようになりしばらくたった半年後、18の練習曲の「Confidence」の譜読み中に、三連符の最初にヒゲが生えているのを発見した。よく見たら「Clear Stream」の三連符のいくつかも、最初の1音が四分音符だったので、修正して練習し直している。録音の音により近づいたので、これは嬉しい発見だった。

Progress

Burgmüller 25 Progressive Pieces の6曲目。右手と左手のシンクロ。右手がパラパラと移動するタイプ。新しいスキルを書き残しておくための語彙が無いのでそろそろしっかり勉強しないと。

  • 第3、7小節の6度離れた音をスタッカートで並行して弾く感覚を体で覚える
  • 後半の右手と左手の掛け合い C E A B、D F A 、D F B、C E G はなんかのコード進行をメロディでなぞっているのだろうなーという曖昧な理解
  • 第13小節から15小節までは、右手は E をベースにして音が動く構造。左手は右手に対して 「C と A」、「G# と A」の音が対になっている
  • 最終小節の同じ音の運指の指示が、右 2 3 4 5 左 1 3 2 1 となっているのがなぞ。Editor が練習しまくった末にたどり着いた最適解なのかもしれないけど、最初からやるには不自然な気がしている