月曜日, 9月 11, 2006

「サクラ」でMML演習3

「素敵な即興演奏講座」シリーズは、なかなか面白い。MMLの演習にとても良い教材になる。そんな訳で今日は「素敵な即興演奏講座3」をMMLで書いてみることにする。

====== 素敵な即興演奏講座3 ======

今日はかの有名な「チャルメラ」(著作権ナシ?)を使った講座です。

まずは基本のチャルメラ、真ん中あたりで弾きましょう。

ドレミーレド ドレミレドレ~♪

できましたか?

今日はこのチャルメラに和音をつけ、オリジナリティのある音楽にします。
ではまず、最初のドの音に左手の親指をおきます。そして左方向に1つとんでラの音に中指、また1つとんでファの音に小指をおきましょう。そしてこのファとラとドの3つの音を一緒に弾きます。
(明るい和音が鳴りましたね。これをコードネームでは「エフ?メイジャー」と呼び「F」と書きます。)

この5つ並んだ音に5本の指をおき、小指?中指?親指の場所にあたる音だけを弾く手の形を135形とします。
ではその135形のまま右へ1つずれて、次のレの音へ移動しましょう(ソ?シ?レ)。そして一緒に弾く。この和音は「ジー?メイジャー」(G)といいます。
今度はその135形のまま、次のミの音へ移動します。また一緒に弾きましょう。この和音は「エー?マイナー」(Am)です。

覚えましたか?

では少しゆっくりで良いので、チャルメラのリズムにのってこの和音を弾きます。

F G AmーG F F G Am G F G~♪

できましたか?ちょっと斬新なチャルメラになりました。

ではこれだけでは詰まらないので、右手でオマケをつけて更に素敵なチャルメラにしましょう。

今できたちょっと斬新なチャルメラをチャルメロとします。
まず1度チャルメロを弾きましょう。そして最後のGを鳴らしたまま、右手でその音よりちょっと右方向に離れた高い音域にあるソの音たちをランダムにパラパラと弾きます。
次にまたチャルメロを弾き、同様に最後のGを鳴らしたまま、先ほどと同じ高音域の適当な場所から、白鍵の上を左から右に手の甲で滑るように弾きます(この奏法をグリッサンドといいます)。
最後にまたチャルメロを弾き最後のGを鳴らしたまま、高音域にあるシの音を適当に選び、そのシの音からGのすぐ右側にあるシの音まで半音階(白鍵と黒鍵を順に全部弾く)で左方向に下がります。
ラスト締めとしてGの音から左手を離し、先ほど右手で下がってきたシのとなりドの音を少し長めに弾きます。

====== ==================== ======

今日は今まで使ったことのない(多分)関数を一つ使っている。MMLの音名をノート番号に変換する関数 NoteNo だ。

mml に書かれたノートのノート番号を返す
http://oto.chu.jp/doc/command/97.htm

サクラ」などのプログラム言語でロジックを作ろうとすると、どうしても数値にした方が便利な場合が多い。こんな時に、音名をノート番号に変換できればとても便利なのだ。

今回は「高音域にあるシの音を適当に選び、そのシの音からGのすぐ右側にあるシの音まで半音階(白鍵と黒鍵を順に全部弾く)で左方向に下がります」という部分の「シ」の音を求めるのに、この関数を使っている。

Int N=NoteNo(o7b) While(N>=NoteNo(o5b)){N-- n(N)32}

//---------- ここから ----------

#Chrmla={c8d8e2.d8.c8.r4c8d8e12d12c12d1^}
#F={'c"a"f'} #G={'d"b"g'} #Am={'ec"a'} #SP={l1r2}
Function Chrmlo(){
 #Chrm_3=Replace(#Chrmla,{c},{"a},on)
 #Chrm_3=Replace(#Chrm_3,{d},{"b},on)
 #Chrm_3=Replace(#Chrm_3,{e},{c},on)
 #Chrm_5=Replace(#Chrmla,{c},{"f},on)
 #Chrm_5=Replace(#Chrm_5,{d},{"g},on)
 #Chrm_5=Replace(#Chrm_5,{e},{"a},on)
 Play(o5+#Chrmla,#Chrm_3,#Chrm_5)
}

Tempo(96) @(GrandPiano)

#Chrmla #SP
l1 #F #G #Am #SP

Chrmlo #SP
Chrmlo r-1 [16 o(RandomSelect(5,6,7)) l12 g] #SP
Chrmlo r-1 l48 o5 defgab>cdefgab>cdefga #SP
Chrmlo r-1 Int N=NoteNo(o7b) While(N>=NoteNo(o5b)){N-- n(N)32} #SP
o6 l1 q100 c^

//---------- ここまで ----------



関数 Chrmlo() はもうちょっと上手く書けそうなのだが、とりあえず次の課題にします。