09_演奏アプリ

【09_演奏アプリ】簡単コード鍵盤〔解説編 Vol.1〕オープンソースの音楽ライブラリ「Tone.js」を使う

(アイキャッチ画像:Photo by Omid Armin on Unsplash )

記事概要

この記事は、GASによる以下の簡単シンセサイザーアプリの解説記事になります。

(操作の動画です。再生の場合は音が出ますのでご注意!)

今回は、WEBアプリで便利に音を扱える「Tone.js」の導入と、それを用いて簡単に発音させる方法についてご説明します。

 

Tone.jsの導入~CDNで導入~

今回の解説は、テンプレートに関する記述です。GASのプロジェクトを作成したら、テンプレート(INDEXなどの名称のHTMLファイル)を新規追加し、そこに今回ご説明の内容をここに記述します。

 

前の記事で説明した様に、このWEBアプリではTone.jsというオープンソースのライブラリを使います。

このライブラリは、Web Audio API という、WEB上で音声を操作する仕組みを簡単に扱える様にするものです。

CDNというリンク先を指定するだけで導入できるよう提供されていますので、以下の様なコードをテンプレートのヘッドセクションに記載するだけで導入が完了します。

また、今回はJQueryという、HTML上のオブジェクト選択などを簡単にするライブラリも使います。導入は、この両者を併せて以下の様に記載するだけで完了します。

<head>

<!—JQueryのライブラリ—->
    <script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js“></script>
    <!—Tone.jsのライブラリ—->
    <script src=https://cdnjs.cloudflare.com/ajax/libs/tone/13.1.25/Tone.js“></script>

</head>

なお、JQueryについてご存じない方は、以下の記事で少し触れているので宜しければご参考にしてください。

簡単に言いますと、JQueryとはWEBサイト中の要素へ自在にアクセスできる関数群を提供するライブラリです。今回はサイト中の音名へのアクセスに使用しています。

 

さて、次にいよいよTone.jsによる簡単なコードの記載方法をご説明します。

単音を鳴らす

Tone.jsは、多くのライブラリがそうである様に、<scripu>~</script>セクションを設けて、その中に Javscript のコードで記載するようになっています。

まずはごくごく基本的な内容として、音を ♪ポーン、とひとつ鳴らすだけのコードのを実装してみることにします。

//音源を設定する

var 音源要素 = new Tone.Synth().toMaster();

//指定の音階を指定の長さで発音
 音源要素.triggerAttackRelease(‘音階‘ , ‘長さ‘);
狙った音をひとつだけ鳴らすのでしたら、もうこれだけで鳴ります!
そして、このスクリプト全体を、たとえばボタン要素をクリックした時だけ実行される様にしておけば、簡単な音出しアプリになります!
少しコードを解説します。
まず、音源要素に関して。
Tone.Synth() 
「Tone.js」が提供する単音を出すシンセサイザー要素です。
.toMaster() 
シンセサイザー要素の子要素で音源要素です。
次に、音源からの音出しに関して。
.triggerAttackRelease(‘音階’ , ‘長さ’) 
音源要素の関数で、指定の音階・長さで1回発音します。

ここで音階の表現は、「ド」「レ」「ミ」というよくあるイタリア式表記ではなく、「C4」「D4」「E4」などと、ドイツ式で表します。(音楽に詳しい方はな見慣れた表記だと思います)

音階名の補足です。(音楽に詳しい方はスルーしてください)

ドイツ式音階表記は、別に難しいものではなく。ラからはじまる音階にA、B、C・・・を当てはめただけのものです。(なぜか「ラ」から始まっています)

すなわち、「ラ、シ、ド、レ、ミ、ファ、ソ」 を、「A、B、C、D、E、F、G」 と、言い換えただけのものです。 これにオクターブ高さを示す数字を添えて「C4」などと表現します。

ちなみに、オクターブは、ピアノでちょうど真ん中あたりの音域になります。(C4だとピアノの真ん中あたりのドの音です。)

また半音階を示すシャープ(#)も使う事ができ、「C#4」などと表現します。ただしフラット(♭)は無いので、これを用いた表現は使えません。

また、音の長さの表現は、4分音符(♩)だと4n、8分音符(♪)だと8nといった風に特殊な記号で表します。

この、4nなどの表現は、Tone.js の固有のもので、特に音楽的な背景はありません。

なんとも素朴なコードですが、Tone.js を使わないで同じ機能を実現、つまり「WEB Audio API」を通常の Javascript だけで表現しようとすると、かなり長いコードになってしまいます。

つまり、この素朴さこそ、Tone.js の威力なのです

ここで、和音について少しばかりのご説明・・・

この節は、音楽に詳しいい方はスルー頂いて結構です。

和音とは、大体3~4ケの音階を同時に鳴らした音を言います。

音階の集まりは適当な訳ではなくて、「ド(C)」から始まり、響きが明るい和音(メジャーコードと言います)だと、「ド・ミ・ソ」などと、和音でどの音階を使うかは、基本的には決められています。

今回は、「ド(C)」「ド#(C#)」「レ(D)」で始まる明るい和音(メジャーコード)を鳴らす事にしました。具体的には以下の音を鳴らします。

  • ド(C)」で始まるメジャーコード :ド(C)ミ(E)ソ(G)
  • ド#(C#)」で始まるメジャーコード :ド#(C#)・ファ(F)・ソ#(G#)
  • レ(D)」で始まるメジャーコード :レ(D)・ファ#(F#)・ラ(A)

英語だと「コード(chord)」といいますが、日本語の「和音」の方が意味の解りやすい言葉だと思います。この言葉を導入した先人に感謝!

再びプログラムに戻り、和音を鳴らす方法の解説

さて、では先にご説明した、Tone.Synth() で要素で和音を鳴らすにはどうするのでしょうか。

実は、Tone.Synth() は和音を扱えないのです!

ではどうするかというと、Tone.Synth()を3つ用意、それぞれ単音を鳴らす事で、結果として和音にしています。

この方法は、3つの音が微妙にずれて発音する場合があるので、実はあまりお奨めできない方法です。その代わりプログラムは平易なので利用した次第です。

 

プログラムを抜き出すと、以下の様になっています。

<script>
   function onClick(link){
        //—- Tone.jsの処理—-
          //和音3つ分の音源を生成
          var 音源1 = new Tone.Synth().toMaster();
           var 音源2 = new Tone.Synth().toMaster();
           var 音源3 = new Tone.Synth().toMaster();
          //それぞれの音を「2分音符」で発音
          音源1.triggerAttackRelease(和音の構成音1, ‘2n‘);
           音源2.triggerAttackRelease(和音の構成音2, ‘2n‘);
           音源3.triggerAttackRelease(和音の構成音3, ‘2n);
    }
</script>

 

function onClick(link){}

リンク要素をクリックすると発動する関数です。

var 音源1 = new Tone.Synth().toMaster();

シンセサイザーを準備します。プログラムでは3つ用意しています。

③ 音源1.triggerAttackRelease(和音の構成音1, ‘2n‘);
      音源2.triggerAttackRelease(和音の構成音2, ‘2n‘);
      音源3.triggerAttackRelease(和音の構成音3, ‘2n);
3つをほぼ同時に鳴らすと、見事!和音が聞こえました。
実は、Tone.js には和音を扱う専用の要素が設定されています。しかし、実装がやや複雑化するので今回は敢えて使いませんでした。

次回は テンプレートファイルの続きですが、鍵盤風のビジュアルや、クリックした箇所のテキストを利用して目的の音を出す部分ついて、ご説明する予定です。