まず、bwb_guitar.hを使って、コードを鳴らす手順を説明をしたいと思います。
bwb_guitar.hのコードを鳴らす手順は基本的に以下のようになっています。
またサンプルと同時にbwb_guitar.hの注意点も挙げたいと思います。
Include(bwb_guitar.h);
TR(01) @25
GCm(1);BGD(!1);
まず、注意すべき点は、
コードフォームを押さえる動作とコードをかき鳴らす動作を別々に行うということです。
上のサンプルで言えば、GCmが押さえる動作、BGD(!1)が鳴らす動作になっています。
ちょうど左手の作業と右手の作業を別々に行わせる感じですね。
こうすることで、同じコードフォームで複数回鳴らす作業を行う場合、
Include(bwb_guitar.h);
TR(01) @25
GCm(1);BGD(!4);BGD(!4);BGD(!4);BGD(!4);
となります。
こうすることで、コードを変えるとき、修正点が一個で済むことになります。
ここはchord2.h等と違う部分なので、気をつけてください。
さて、これを踏まえて、bwb_guitar.hに含まれる関数(命令のこと)を説明したいと思います。
二つの関数を同時に行うことから、説明も二つ平行する形になってしまいますが、
じっくり読んで理解してくださいね。
まず、押さえる関数を説明したいと思います。これは、
G{ コードネーム }( コードポジション(1〜5) )
という関数になります。
ですから、上記のGCm(1)を改めて解析しなおしてみますと、
G{ コードネーム=Cm }( コードポジション=1 )
ということになります。
ですから、例えば、C(シーメジャー)の場合はGC。
C△7、もといCM7(シーメジャーセブンス)の場合はGCM7となります。
次に、コードポジションとはなんでしょうか?
2章でも述べましたが、bwb_guitar.hでは一つのコードにつき、
5つのコードフォームを用意してあると述べました。
このコードポジションとはそのコードフォームを選ぶための引数(ひきすう)なのです。
数字が小さければ小さいけど、全体的に音程の低いコードフォームになり、
数字が大きければ大きいほど、全体的に音程の高いコードフォームになります。
また、数字が省略すると、前回のコードポジション番号を受け継ぎます。
例を示しますと、
Include(bwb_guitar.h);
TR(01) @25
GCM7(4);BGD(!1);GC;BGD(!1);GCm(1);BGD(!1)
の場合、間のGCは前のGCM7(4)の4を受け継ぎ、GC(4)となります。
ではルート(根音)がC(ド)以外のコードを選ぶ場合はどうすればよいのでしょうか?
これは、CDEFGAB(ドレミファソラシド)に従って、書き換えればいいだけです。
D(ディメジャー)だったらGDという要領です。
ただし、D#m(ディーシャープマイナー)はGDpm、A♭m7(エーフラットマイナーセブンス)はGAbm7です。
♯はp,♭はbに置き換えてください。
次に一番上で紹介されたサンプルにあったBGD(!1)の解説です。
Function BGD(Int l , Int q , Int v , Int t , Int h , Int Z , Int F , Int E)
l:長さ |
機能がむちゃくちゃありますが、段階を踏んで解説していきます。
l,q,v,t
まず、l,q,v,tについて。これは普通の音を鳴らす作業と変わりません。例えば、
l1 q+20 v+20 t+3 c と c1,+20,+20,+3 は同じ音を鳴らせます。
それと同じようにBGDで表現する場合、BGD(!1,20,20,3)です。
注意すべきことは加算することが前提なので、+マークがいらないこと。
それと、長さの扱いだけ微妙に違うことでしょうか。
例えば1分音符でドを鳴らす時はc1ですが、
BGDの場合、BGD(!1)と、!(ビックリマーク)がつくことです。
ここで、!がつかないと、長さをティック(tick)単位で指定することになります。
もし、あなたがTimeBase等を含め、MIDIの仕様にある程度知識があるのなら、
どのような指定方法をとっても構いませんが、
見易さの点からも、!マークをつけ、X分音符という形で指定したほうがよいでしょう。
上記のMIDIの仕様に詳しくない人ならなおさらです。
ここではMIDIの仕様について解説しないので、興味を持った方は各自調べてみてください。
h:onだと、ゲート減算処理で同時に音を止める
次にh。これはon/offで指定します。
サンプルを見ると差がわかりやすいかと思われます。
hをonにしたもの↓
hをoffにしたもの↓
上の図はMIDIシーケンサのCherryでMIDIファイルのデータを見たものです。
ゲージの縦方向は音程を表し、ゲージの横方向は時間軸を表します。
つまり、ゲージが横に長ければ長いほど、音が長く鳴っている状態になるわけです。
それを踏まえて、改めて、二つの図を見比べて見ましょう。
hをonにした方(上の図)は、発音するタイミングはズレているものの、
音が鳴り止むタイミングは同時です。
それに対して、hをoffにした方(下の図)は音が鳴り止むタイミングもずれています。
この機能はどういう時に使えばいいのでしょうか?
例えば、左手を離し、新しいコードを押さえる時です。
例を示しますと、
Include(bwb_guitar.h);
TR(01) @25 q99
GCM7(3);BGD(!4);BGD(!2);BGD(!4,,,,on);
GFM7;BGD(!1);
これをCherryで確認してみよう。
F△7を押さえる時にはC△7は押さえていないのだから、
C△7の音をいったん全部止めなければならない。
そういうときに、hの機能をonにすることで音が鳴り止むタイミングが
発音が最も速いものに合わせ、止めることができます。
これが仮にhがデフォルトのまま、つまり機能をoffにした場合、
F△7が鳴り出す際に、C△7の構成音が一部鳴っていることになるので、おかしいことになります。
ですので、ぜひhの機能を活用しましょう。
Z:ストローク時のズレの加算値
まず、ギターの構造からお話しますが、
ギターというのは弦が6本張ってあり、
それを上から、ないしは下から、ピックや指をあて、弾くことで、
音を鳴らす楽器です。
ですから、その構造上、音が同時になるということは基本的にあり得ず、
先ほどの上の画像のように発音タイミングがずれるわけです。
それを踏まえてZの機能について話していきます。
まず、サンプルと実行結果を見ていただきましょう。
Include(bwb_guitar.h);
BG_LAG=!128;
TR(01) @25 q99
GEm7(1);
BGD(!1,,,,,0)
BGD(!1,,,,,!128)
BGD(!1,,,,,!64^128)
実行結果をCherryで表示
左部分をCherryで拡大
上の画像を見ると、ズレがだんだん大きくなってくるのがわかったでしょうか?
それが確認できたら、ソースコードを説明していきたいと思います。
2行目のBG_LAGというのは、ズレの初期値です。
BGDで鳴らすとき、ズレの加算値が0(ないしは値入力が省略された)時はこの値だけズレます。
ソースコード上では!128、つまり128分音符分だけズレることになります。
5行目のBGD(!1,,,,,0)はBGD(!1)と同じです。
ズレの加算値が0ですから、BG_LAGの値の分だけズレます。
それを下の画像でMIDIデータを数値で確認できます。
ここで鳴り出すタイミングを示す、tickの所を見てみると、3ずつズレているのがわかります。
128分音符のとき、TimeBaseが初期値である96だと3tickに相当します。(理解しなくても構いません。)
6行目のBGD(!1,,,,,!128)ではズレの加算値が128分音符分です。
ですから、BG_LAG=!128もあわせて、!128 × 2の値だけズレがおきます。つまり、64分音符分です。
128分音符が3tickですから、64分音符は128分音符の2倍、つまり6tickに相当します。
下の画像を見ると、確かに6tickずつズレていることがわかりますね。
7行目のBGD(!1,,,,,!64^128)はズレの加算値が!64^128ですが、!64^128とはなんでしょう。
これは64分音符+128分音符の長さを示すことになります。^は長さを足す記号だからです。
ここでさらにBG_LAGの値を考慮すると、
64分音符+128分音符の長さ+128分音符の長さ=32分音符の長さになります。
つまり128分音符が3tickなことを考えると、32分音符は4倍の12tickズレることになります。
ちなみに、全くズレをなくしたいというときは、
単純にBG_LAGのマイナスの値を加算してやればいいので、
BGD(!1,,,,,-BG_LAG)とすればOKです。
究極的には足し算引き算の世界です。
途中で出てきたTimeBaseはMIDI 分解能というワードで検索をかければ、
いろいろネット上で資料が出てくるので、興味を持ったかたは調べてみてください。
F:何番目の弦から(初期値6)、E:何番目までの弦を(初期値1)
これはギターの押さえている弦を何弦から何弦目までを弾くかという要素を入力できます。
またサンプルを見てみましょう。
Include(bwb_guitar.h);
TR(01) @25 q99
GEm7(1);
BGD(!1,,,,,,6,1)
BGD(!1,,,,,,5,1)
BGD(!1,,,,,,6,1)を鳴らすと、「ミシレソシミ」が鳴りますが、
BGD(!1,,,,,,5,1)では「シレソシミ」が鳴り、最も低い音であるミが鳴りません。
これは低音の弦である6弦を弾かなかったので、ミが鳴らなかったのです。
では、今度は鳴らさない弦があるときを考えてみましょう。
Include(bwb_guitar.h);
TR(01) @25 q99
GAm7(1);
BGD(!1,,,,,,6,1)
BGD(!1,,,,,,5,1)
Am7のコードポジション1では6弦は押さえず、5弦から1弦までしか押さえません。
このとき、BGDで6弦からと、指定しても押さえないコードフォームなので、
6弦の音は鳴りません。
以上、これがBGD関数の機能です。
これで、ダウンストロークの様々な表現ができるようになるでしょう。
アップストロークはBGU関数で表現できます。
Function BGU(Int l , Int q , Int v , Int t , Int h , Int Z , Int F , Int E)
l:長さ |
最後のFとEだけ初期値が入れ替わるので、そこは注意してください。
ここで、bwb_guitar.hに用意されているコード一覧を載せたいと思います。
下の表はルートにCをとった時のコードの表です。
コードネーム | 関数名 | 構成音(MML) | 構成音(ストトン) |
C | GC | c e g | ド ミ ソ |
CM7 | GCM7 | c e g b | ド ミ ソ シ |
C7 | GC7 | c e g b- | ド ミ ソ シ♭ |
C6 | GC6 | c e g a | ド ミ ソ ラ |
Cm | GCm | c e- g | ド ミ♭ ソ |
Cm7 | GCm7 | c e- g b- | ド ミ♭ ソ シ♭ |
CmM7 | GCmM7 | c e- g b | ド ミ♭ ソ シ |
Cm7(♭5) | GCm7b5 | c e- f- b- | ド ミ♭ ファ♭ シ♭ |
Csus4 | GCsus4 | c f g | ド ファ ソ |
C7sus4 | GC7sus4 | c f g b- | ド ファ ソ シ♭ |
Caug | GCaug | c e g+ | ド ミ ソ♯ |
Cdim | GCdim | c e- f+ a | ド ミ♭ ファ♯ ラ |
CM7(9) | GCM7_9 | c e g b `d | ド ミ ソ シ `レ |
C7(9) | GC7_9 | c e g b- `d | ド ミ ソ シ♭ `レ |
Cadd9 | GCadd9 | c d e g | ド レ ミ ソ |
Cm7(9) | GCm7_9 | c e- g b- `d | ド ミ♭ ソ シ♭ `レ |
C7(♭9) | GC7_b9 | c e g b- `d- | ド ミ ソ シ♭ `レ♭ |
C7(♯9) | GC7_p9 | c e g b- `e- | ド ミ ソ シ♭ `ミ♭ |
CM7(9,♯11) | GCM7_9_p11 | c e g b `d `f+ | ド ミ ソ シ `レ `ファ♯ |
Cm7(9,11) | GCm7_9_11 | c e- g b- `d `f | ド ミ♭ ソ シ♭ `レ `ファ |
C69 | GC6_9 | c e g a `d | ド ミ ソ ラ `レ |
C7(9,13) | GC7_9_13 | c e g b- `d `a | ド ミ ソ シ♭ `レ `ラ |
C7(9,♭13) | GC7_9_b13 | c e g b- `d `a- | ド ミ ソ シ♭ `レ `ラ♭ |
ここでオレンジがかった音についての注意事項を述べたいと思います。
ギターというのは最大6音しか同時に鳴らせず、また楽器の特性から、
同時に鳴らせる和音というのも限られます。
ここでテンションコードのような5音以上含まれる音を鳴らそうとすると、
一部の音を省略しなければなりません。
例えば、9thがテンションとして付加されたとき、
多くの場合ではルートか、5thの音が省略されます。
ここで、オレンジがかった色というのは、
コードを特徴付ける音として、絶対省略されない音です。
ただし、C7(9,13)のように、9th=レがテンションとして付加されていても、
実際に9th=レが鳴らないフォームであることもあります。
あくまでも、コードを最も特徴付ける13th=ラの音だけは絶対省略されないことだけを理解しておいてください。
強引に規則づけるならば、
最も大きな数字のテンションは省略されない
と覚えておいてください。