自分の作品でつくっている音について、説明します。
自分は音楽を専門に学んだことがなく、どちらかというと音符も読めず苦手だったのですが、音が数と関係あることを知って、プログラムで音を考えています。
なので音楽としての知識は浅いのですが、数で音を考えるのも面白く、センサから数値をとってきて、どう音で表現するか考えるときに、何かヒントになればいいなと思ってます。
今回は、ある「スケール」をもとに、音階をつくる考え方です。
西洋音階は、ピアノの鍵盤でいうと、1オクターブの中に、白鍵黒鍵あわせて12個あります。
基準とする音階を「0」番目とすると、1オクターブ上は「12」番目、になります。
参考サイト:
「C・D・E・F・G・A・B」が「ド・レ・ミ・ファ・ソ・ラ・シ」になります(音階の英国表記)。
参考:音名・階名表記
好きなスケールを決めます。以下にあるだけではなく、たくさんあるので「ギター スケール」などで検索し調べてみてください。今回は絵がわかりやすいので、以下から選びます。
「メジャーペンタトニック」スケールにしてみました。
数字にすると、
「0, 2, 4, 7, 9」となり、5個の配列と考えられます。
基準の「C」を、MIDIの音階で考えてみると、「0」は低すぎて聞こえないので、中間の「C」を選びます。どのくらいの中間を選ぶかは、自由に決めてください。
自分は3オクターブの「C」を選びました。
「音階 MIDI」などで検索して、調べると、3オクターブの「C」は、MIDIの音階にすると「48」になります。これは暫定でOKです。
「0, 2, 4, 7, 9」の全体に、48を足します。
「48, 50, 52, 55, 57」 が、3オクターブの「ド・レ・ミ・ソ・ラ」となります。
これを基準に、全体を1オクターブ上にするには「+12」、1オクターブ下げるには「-12」と考えます。
この音階を、Pdで生成し、ランダムに鳴らしてみます。
最初に、スケールの5つの数をもとに、任意(ここでは4オクターブ分の20個)の連続した配列を作ります。
Arrayをつくり、音を鳴らすことができたら、エフェクトをつけたり、和音にしたり、発展させてみます。
0 , 2 , 4 , 7 , 9
↓
0 , 2 , 4 , 7 , 9 , 12 , 14 , 16 , 19 , 21 , 24 , 26 , 28 , 31 , 33 , 36 , 38 , 40 , 43 , 45
ここでは、全体に「+ 48」するのは、あとから行います。
Processing風に書くと以下のようになります。
int[] scale = { 0, 2, 4, 7, 9 };
int[] note = new int[20];
for ( int i=0; i<20; i++) {
note[i] =scale[i%5] + (i/5)*12;
print(note[i]+" , ");
}
「 scale 」という名前でArrayをつくり、最初に5つの数値を手入力します。
手入力するには、
Arrayを右クリックしProperties..を表示し、「Size」を5にします。
次に「Open List View .. 」をクリックします。
「scale ( list view )」というウィンドウが現れ、Arrayの中に5つの領域ができているはずです。
ここで数値を入力しEnterで確定します。
「 note」という名前でArrayをつくりますが、これは
サイズを20とします。値は空っぽのままにし、「scale」Arrayをもとに「note」Arrayの値を自動的に生成します。
すべての音階を手入力してもよいのですが、最小限のArrayから計算したほうが、あとでスケールを変えたい時に便利です。
forループのような繰り返しを使いたい時、Pdでは [ until ]を使います。
一瞬に、数をあたえるとその回数分の「bang」を一瞬で出力します。
[ f ] には最初に初期値として「0」が入ります。
次に [ until ] から送られる「bang」によって、
[ f ] のあと [ + 1 ]され、その数値が再帰的に [ f ] の初期値として設定されます。
これで、forループのカウントのように振る舞うことができます。
for ( int i=0; i<20; i++) {
..
}
そのカウントされる数を、3つの計算につかうので、[ t f f f ] で分けています。
note[i] =scale[i%5] + (i/5)*12;
これで、メッセージ「20」をクリックすると、「note」Arrayに自動的に値が設定されます。
ランダムに選ばれた「note」Arrayの値を、「+48」することで、任意のオクターブを基準にした音階となります。
また、そのあと、「-2」「-1」「1」「2」などを足すと、全体のスケールの比率を保ったまま、半音下げたり半音上げたりできます。
うまく使うと「転調」に聞こえます。
「scale1」「scale2」Arrayを用意し、[ tabread ] のArray名を変更しています。
メッセージ「20」をクリックして、スケールを切り替えることができます。
音の出力のまえに、「ディレイ」エフェクトをつけてみました。
サブパッチになっていて、内部で 1000ミリ秒のディレイテーブルをつくり、500ミリ秒のディレイがかかるようにしています。
スライダーは、フィードバックするときの音量を0.0〜1.0まで調整できます。
いつも作品で使っている、出力のサブパッチです。
緑色のスライダーで、音量、
水色のスライダーで、freeverbのかかり具合を、調整することができます。
[ counter 0 0 3 ] で、0、1、2、3というカウンター変数を生成し、[ pack ]を使って、
「note」Arrayからつくられる音階の数値と、対になるようにします。
配列のイメージでいうと、2次元配列になります。
{ 0 , 音階0 } , { 1 , 音階1 } , { 2 , 音階2 } , { 3 , 音階3 }
この先頭の番号によって、音源を振り分けます。
[ route 0 1 2 3 ] を使うことで、
先頭番号が「0のとき」「1のとき」「2のとき」「3のとき」を振り分け、対になった音階を振り分けることができます。
その音階で外部パッチ「ongen」をそれぞれ呼び出すことで、音の処理がそれぞれ行われ、和音をつくることができます。
そのまま出力すると、音が割れる可能性があるので、音源の数分、足し算しておきます。
参考:
p5js(PrpcessingのWEB版)で、数で音を表現した例
https://www.fal-works.com/creative-coding-posts/exotic-melody-generator