【コラム】

日本語で10行プログラミング

27 ギターコードの構成音を表示

    くじらクジラ飛行机  [2005/08/05]

    なでしこの公式ガイドブック発売決定

    ついに、なでしこの公式ガイドブックの発売が決まりました。ゼロからプログラミングを始めるところから、実際にプログラムを作って趣味や仕事に活用するところまで、一通り網羅しています。

    前半では、変数や制御構文などプログラミングの基本を解説し、後半では、実務に役立つバッチ処理のプログラムや、ゲームやチャット・ニュースリーダーといった本格的なプログラムを作ります。

    なんと言っても、なでしこの魅力はお手軽プログラミングです。日本語の分かりやすいプログラムで、いろいろな処理をこなすことができます。この本のサンプルプログラムでも、その魅力がいかんなく発揮されています。ぜひ、本を手にとって、プログラミングの楽しさ、便利さを実感してください。

    さて、今回は、ギターの伴奏に使うコードの構成音を表示するプログラムを作ります。「Em」や「G7」といった、コードの構成音を計算によって求めて画面に表示します。

    ギターコードの構成音を表示

    夏といえばキャンプ、キャンプといえば、キャンプファイヤー、そして火を囲んですることと言えば、ギターの弾き語りです。また、駅周辺にもギターの弾き語りをする人が多くなります。懐メロから最新の流行曲まで、コードさえ知っていれば、どんな曲の伴奏でも弾いて歌うことができるのがギターとコードの魅力です。書店でも歌詞の上に、「C」とか「Em」とかコードの書かれたコードブックが売られています。

    今回はギターなどで使われるコードを指定すると、その構成音を調べるプログラムを作ってみようと思います。コードとには、和音の意味です。例えば、「Am」というコードは、ラドミの和音を、「CM7」なら、ドミソシの和音を表しているのです。それぞれのコード名ごとに、和音の構成が決まっています。このコード名とその構成音は、でたらめに決められているわけではなく、整然と並んでいるので、計算で求めることができます。

    蛇足ですが、音楽と数学の関係はとても興味深いものです。古くは、数学で習った「ピタゴラスの定義」で有名なギリシアの哲学者ピタゴラスは、弦の長さを半分にすると1オクターブ高くなるという「ピタゴラス音階」を発案し、音楽の発展にも貢献しました。他にも、数学と音楽を組み合わせた試みとして、円周率の数字に音階を割り振ったり、フラクタル図形の一部分を切り取ってたりして音楽にするなどがあります。これはネット上でも多くの人が挑戦している試みですので興味があれば検索してみてください。

    コード名の規則

    例えば、「Em」というコードは、「E」と「m」の2つの部分に分けることができます。左側の「E」はルート(基本的な音)を表し、右側の「m」が和音の種類を表します。まず「E」というのはドレミの「ミ」のことです。日本で言う「ドレミファソラシ」は、「CDEFGAB」とも表されるのです。そして、種類の「m」とはマイナーコードの意味で、音の響きが暗く寂しげな印象を受ける構成音となります。

    また、「C」というコードは左側のルート(基本的な音)のCだけなのかと言えば、これは右側のM(メジャーコード)が省略されたもので、これは明るく朗らかな和音となります。

    よく、12音階と言いますが、音階には、「ド、ド#、レ、レ#、ミ、ファ、ファ#、ソ、ソ$#、ラ、ラ#、シ」の12個しかありません。ピアノの鍵盤を思い出してみると分かるのですが、これは半音ごとに並んでいます。和音を考えるときも、この半音を単位として考えると分かりやすいのです。

    そこで、ドを0番、ド#を1番、レを2番...... と番号を振ってみるとコードの正体が見えてきます。コード「C」の構成音は、ドミソです。これを番号で表すと、0-4-7です。コード「D」の構成音はレファ#ラなのですが、これを番号にすると、2-6-9です。コード「E」はミソ#シで、4-8-11です。構成の間隔を調べてみると、全て等間隔です。「D」は「C」の構成音に全て2を足したもの、「E」は「C」の構成音に4を足したものになってます。

    次に、暗い和音のマイナーコードを番号に置き換えてみます。「Cm」(ドミ♭ソ=ドレ#ソ)を置き換えると、0-3-7です。そして「Em」はミソシなので、4-7-11で、「Cm」の構成音の全てに4を足したものとなっています。

    つまり、和音構成を表す数値に、ルート音(基本となる音)の番号を足すと、そのコードの構成音を調べることができるのです。但し、12音階なので、足した結果が12を超えた場合は、12を引きます。

    12音階に0番から番号を振ったもの :
    ド(0)、ド#(1)、レ(2)、レ#(3)、ミ(4)、ファ(5)、ファ#(6)、ソ(7)、ソ#(8)、ラ(9)、ラ#(10)、シ(11)

    10行でコードの構成音を表示するプログラム

    コードの構成音を計算する方法が分かったところで、プログラムを組み立ててみましょう。それでは、プログラム作成の手順をまとめてみます。

    1. 音名やコード構成音の組み合わせを設定
    2. ユーザーにルート音とコード種類を選んでもらう
    3. コード種類から構成音の番号を取り出す
    4. 構成音の番号の1つずつについて以下の5から6を繰り返す
    5.   対象となる番号とルート音の番号から、構成音を得る
    6.   得た番号を和名で表示する

    プログラムを実行したところ、コード名を指定して調査ボタンを押すとコードの構成音を表示します

    以下が、なでしこのプログラムです。(バージョン1.393で動作を確認しています)

    # --- 音名、和名、コード構成の設定
    音名は「C,C#,D,D#,E,F,F#,G,G#,A,A#,B」を「,」で区切ったもの #1
    和名は「ド,ド#,レ,レ#,ミ,ファ,ファ#,ソ,ソ#,ラ,ラ#,シ」を「,」で区切る #2
    構成は「_,0-4-7{?}7,0-4-7-10{?}M7,0-4-7-11{?}m,0-3-7{?}m7,0-3-7-10」#3
    # --- 見た目(GUI)とその動作の設定
    ルートコンボとはコンボ。そのアイテムは音名。その値は0。#4
    構成コンボとはコンボ。そのアイテムは構成の0を表列取得。その値は0。#5
    調査ボタンとはボタン。そのテキストは「調査」。#6
    これをクリックした時は~ #7
      # --- 構成音の計算と表示
      結果は空。構成【構成コンボの値,1】を「-」で区切って反復 #8
        結果=結果&和名【(対象+ルートコンボの値)%12】&「 」。#9
      結果を言う。#10

    プログラムの1行目から3行目では、音名・和名(日本語の読み方)・コード構成音を設定します。次に、4行目から6行目では、ユーザーからの入力を得るために、コンボボックスを2つとボタンを1つ作ります。ここではカンマ区切りのデータを「,」で区切っていますが、これは設定した値を配列変数に代入しているためです。

    7行目以降の部分では、調査ボタンをクリックした時の動作を設定しています。

    8行目では、コンボボックスで選ばれた値を見て、配列変数「構成」からコードの構成音の番号を取り出します。コードの構成音は、0-4-7のように「-」で区切られているので、これを「-」で区切って各番号について計算を行います。

    9行目では、対象となる番号にルート音の番号を足します。足し算の結果を「%12」としているのは、12以上の値が出たときに12以下になるようにするためです。「%」の記号は、割り算の余りを求める演算子です。

    そして最後10行目では、コードの構成音が代入されている変数「結果」を画面に表示します。

    改造のヒント

    さて、せっかく音楽のプログラムなのですから、構成音が演奏されればいうことなしです。音楽を演奏させるには、ドレミのテキストをMIDIファイルに変換できる、テキスト音楽「サクラ」を使うのも良いでしょう。これは私が「なでしこ」を開発する以前に作った音楽製作ソフトです。

    テキスト音楽「サクラ」

    サクラをダウンロードすると、plug-insフォルダがあります。このplug-insフォルダの中に、dSakura.dllというファイルがあります。これが、MIDIファイルへの変換エンジンです。そこで、これをなでしこと同じフォルダにコピーしてから、以下のプログラムを実行してみてください。

    DLLファイルはエクスプローラーの設定で見えないようになっていることがあるので、エクスプローラーのメニューにあるフォルダオプションで、[表示]タブにある、ファイルとフォルダの表示で[すべてのファイルとフォルダを表示する]にチェックを入れてください。

    #-----------------------------------------------------------------------
    # dSakura.dll を利用してMIDI作成の例
    #-----------------------------------------------------------------------
    # エラー情報が代入される
    エラー情報とは文字列
    ●MMLtoMIDI(MML,FILE,{参照渡し}MSG)=DLL("dSakura.dll",
      "function MMLtoMIDI(MMLText: PChar; FileName: PChar; ErrMsg: PChar): Boolean")
    # MMLtoMIDIを使いやすくラップしたもの
    ●MMLコンパイル(MMLをFILEへ|MMLでFILEに)
      ERRとは文字列
      ERRに1024を確保
      MMLtoMIDI(MML,FILE,ERR)
      エラー情報はERR
      ERR="" # 確保したメモリを開放
    #-----------------------------------------------------------------------
    # 音名、和名、コード構成の設定
    音名は「C,C#,D,D#,E,F,F#,G,G#,A,A#,B」を「,」で区切ったもの
    和名は「ド,ド#,レ,レ#,ミ,ファ,ファ#,ソ,ソ#,ラ,ラ#,シ」を「,」で区切る
    構成は「_,0-4-7{?}7,0-4-7-10{?}M7,0-4-7-11{?}m,0-3-7{?}m7,0-3-7-10」
    MIDIファイルは「{母艦パス}play.mid」
    # 見た目(GUI)とその動作の設定
    ルートコンボとはコンボ。そのアイテムは音名。その値は0。
    構成コンボとはコンボ。そのアイテムは構成の0を表列取得。その値は0。
    調査ボタンとはボタン。そのテキストは「調査」。
    これをクリックした時は~
      # --- 構成音の計算と表示
      結果は空。構成【構成コンボの値,1】を「-」で区切って反復
        結果は結果&和名【(対象+ルートコンボの値)%12】。
      結果は「{[}{結果}{]}」
      結果エディタは結果。
      停止。# 再生の前に停止する
      結果&「1」をMIDIファイルへMMLコンパイル。
      MIDIファイルを再生。
    結果エディタとはエディタ。

    また、他の改造のアイデアとしては、ギターのフレットを表示して押さえる場所を表示したりすると、より本格的になりますね。それでは、今回のプログラムを使って、コードの構成音を調べたり、また、作曲のお供に活用してみてください。

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン