見出し画像

【GAS】スプレッドシートの数字譜を元にピアノの音で自動演奏~解説編(3)楽譜上の情報を読み取って、単純な文字列情報に変換する~

この記事は、外部ファイルとしてピアノの音源を用意し、それをスプレッドシートに用意した数字譜を元に自動演奏させる、以下にご紹介するGAS(Google Apps Script)アプリの説明記事です。

音楽を奏でるGASのプログラム41例の多くは、ピ・ポ・パ・・・という人工音によるものだと思いますが、本記事でご紹介する方法は、Googleドライブ上に音源ファイルを用意することで、ピアノの音色などを楽しめるのが特長です。


簡単なトイピアノ程度の機能ですが、インストール不要で、楽譜だけ編集するだけで、短い音楽をメンバーと共有できますので、簡単な合唱曲や合奏曲を練習するときの便利ツールなどに使えるかも知れません。

今回の記事は以下の先回までの記事の続きとなります。


このWEBアプリの起動直後の状態~MiDi番号のついたAudio要素が並んでいる~


このGAS(Google Apps Script)で作るWEBアプリでは、ピアノの各音階を鳴らすのに、音階毎の音源ファイルを利用します。

用意されたこれらの音源ファイルを「BASE64エンコード」を利用して、テンプレートのAudio要素に紐付けする所までを先回まででご説明しました。

この段階で、起動した直後のGASのテンプレートは以下の様に表示されます。

起動した直後のテンプレート

ずらっとAudio要素が並んでいます。これらは▲ボタンで鳴らす事ができ、それぞれG3などのテキスト表示された音階が1拍だけ鳴る事が解ります。

これらのAudio要素には、画面では見えませんが、idが設定されており、

sound[音階のMiDiノート番号]

という名前になっています。

このWEBアプリでは、画面の上にあるボタンをクリックすると、これらのAudio要素を、MiDiノート番号を含んだidを指定して、適切なタイミングで鳴らす事で音楽を奏でます。

この鳴らす音とそのタイミングは、楽譜から得ています。

楽譜の解説~譜面からメロディーの音階と発音タイミングを読み取る~


本アプリの楽譜を解説します。

このアプリでは楽譜をGoogleスプレッドシート上に、数字と文字を利用した数字譜で表記しています。

数字譜についてはこちらの記事を参照ください。

音階の処理


数字譜では、音階(ド・レ・ミ・・・)を次の様に表記します。

ドの音から 1・2・3・・・
オクターブ上下は数字の上下に●を表示

本アプリでは表記された上記の音階情報を、Audio要素を鳴らすためにMIDI番号に変換して利用しています。

変換されたMIDI番号は、この譜面の下側に表記しています。

この譜面本体の下側のスペースには、GASを実行させるための色々な情報を記載しており、本来は非表示にしておくものですが、あえて隠さず置いています。


譜面の下に各情報がある

この変換は、簡単に、スプレッドシートのvlookup()関数を利用して、シートの右側にある以下の変換表を参照して行っているだけです。(多彩な関数を利用できるのが、情報の記載手段にスプレッドシートを利用するメリットです!

この後に出てきますが、例外として、休符や長音記号「ー」の場合はブランクになります。



音長の処理

次に音の長さです。数字譜では、4分音符を基本として、

 2分音符は長音記号「-」
 8分音符はアンダーライン

で表記します。(その他の表現、例えば付点音符や3連符などは、数字譜としての表現はありますが、本プリでは未対応です)

本アプリでは、この情報は、if( )関数を利用して、特定の音符の次が「-」なら「2(2分音符=2拍)」、特待の音符の下側がアンダーラインがあれば「0.5(8分音符=0.5拍)」、それ以外はブランクでなければ「1(4分音符=1拍)」、という様に、長さを判断しています。

長さの情報



そのため、GASを作動させるための事前作業として、音源ファイルを、楽器や演奏アプリを鳴らして地道に採取する作業が必要になります。

休符の処理

数字譜では休符は音階「0」で表記します。

この場合は、音階はブランクです。

休符


和音

このアプリでは伴奏に以下の3音の和音(コード)を指定できます。

明るい響き
Cメジャー(ドミソ)
Gメジャー(シレソ)
Fメジャー(ドファラ)

悲しい響き
Aマイナー(ドミラ)
Dマイナー(レファラ)
Eマイナー(シミソ)

音域をなるべく集約するために選んだ音であり、3音の組み合わせは選べません。また、長さは1拍だけで、直上に音符がある所でのみ記載できます。

その他、Dメジャーも可能です。記号はメジャーなら大文字のM、マイナーなら小文字のmを組み合わせて、CMなどと表記します。(音楽の記号としては不正確です。このアプリの中だけの規約とお考えください)

記載は以下の様に和音とある行に表記します。

和音の表記


発音タイミング

メロディーを奏でるには、ある基準時間をスタートとして、決められたタイミングで発音される必要があります。

ある音を発音するタイミングは、「それまでの音や休符の長さの累計」時間直後となります。このアプリでは単純に、次のロジックで音を鳴らします。

・1拍の長さは1000μ秒(♩=60ですね)
・最初の音を鳴らす時刻は、ユーザが演奏ボタン押下後1000μ秒
・発音は、テンプレート内のscriptセクションで以下のコードを利用。
  setTimeout(関数※、遅延時間)
   ※関数は、Audio要素とplay()関数を利用したものを別途定義

拍の長さと第1音の開始時刻はスプレッドシートの右肩に記載しています。

楽譜の下側には、最初の音からの経過時間を累計した値も記されており、これが発音タイミング※となります。

※正確にはsettimeout()関数は、「この関数が有効化された時刻をゼロとする遅延時間」で作動しますので、正確で唯一のタイマーで時刻を計測している訳ではなく、関数個々が内蔵しているタイマーで動いています。ですので、曲が長くなるとズレが気になると思います。

本アプリの楽譜では、まず音の長さの累計を計算した後、全体が7桁になる様に意味の無い数字(100)を加えて、これを音符や和音の直下にのみ表示させて、これを発音時刻の情報としています。

音と時刻の組み合わせ(赤はメロディ、青は伴奏です)


メロディー全体の情報

楽譜の下側には、音と伴奏それぞれで、「音」「発音時刻」を洗わす文字を連結した文字を表示しています。(冒頭の「T」は意味の無い文字です)

楽譜が文字列に集約されました

曲全体で文字を連結したものは楽譜の上に表示させています。

セルに隠れていますが長い文字列です

つまるところ、これが、楽譜の音楽情報を集約した文字列となります。

スクリプト側では、この部分の情報を取得して、「音階」の情報は2文字ずつ、「発音時刻」の情報は7文字ずつ切り出して利用しています。

ここまで全てノンプログラムでできるのが、Goolgeスプレッドシートの有難さです。

ここで一端記事を切り、次回は、この文字列から音を鳴らすところと、本アプリのコード全体をご紹介します。




この記事が気に入ったらサポートをしてみませんか?