Strudel
JavaScriptのライブラリとして実装されていて、Webブラウザ上で動作する公式のREPLでは、JavaScriptに独自構文を追加した専用の構文のプログラムを記述して、実際に演奏させることができる。 基本的な構文
code:js
// //から始まる行は「コメント」。演奏時には無視されるので自由に記述でき、メモとして使うことができる。
// 行頭に$:を付けて文を記述すると、その文は演奏の対象になる。
$: sound("bd hh bd oh")
// $の前に_を付けて_$にすると、その文は演奏されない。
_$: sound("bd cp bd cp")
基本的な音の鳴らし方
参考にした資料
sound関数やnote関数に「パターン」を渡して呼び出すことで、音を鳴らすことができる。
code:js
$: sound("bd hh bd oh") // サンプルを鳴らす場合はsound関数にサンプル名のパターンを渡す
$: note("C4 E4 G4 F4 A4 C5") // 特定の音名の音を鳴らす場合はnote関数に音名を渡す。
普通にパターンを書くと、パターンの始めから終わりまでが、1サイクルかけて演奏される。
「サイクル」というのは小節のようなものである。mgn901.icon
1サイクルの速さを設定したい場合は、setcpm関数に1分間に何サイクル演奏させたいかを渡して呼び出す。
code:js
setcpm(40) // 1分間に40サイクル。4分の4拍子の場合は120bpmに見立てられる。
パターンの書き方
旋律やリズムはパターンとして記述するので、Strudelで音楽を記述するなら当然パターンの記法から押さえていくことになる。mgn901.icon
参考にした資料
休符は~や-で表す。
code:js
$: note("C4 E4 G4 - F4 A4 C5 -")
基本的には、記述した各音に平等に時間が配分される。上記の例では、パターンの中に8つの音が記述されているので、各音は8分の1サイクルの時間で演奏される。
ただし、パターンを[]で囲んで記述すると、[]で囲んだ部分(サブシーケンス)全体が、パターン全体における1つの音としてカウントされる。
code:js
[]の中身には3つの音が記述されているので、4分の1サイクルの時間をさらに3分割して、各音が12分の1サイクルの時間で演奏される。
パターンを<>で囲んで記述すると、サイクル毎に演奏されるパターンを変えることができる。楽譜における1番カッコ、2番カッコのようなことができる。
code:js
$: sound("bd <hh oh>") // "bd hh bd oh"と同じ順番で音が鳴るパターンだが、短く書ける。
$: note("<C4 E4 G4 ->") // 応用例として、各音に1サイクルずつかけたい場合にパターン全体を<>で囲む例がよく見られる。
パターンの末尾に*数値を付けると、その部分がその数値倍の速さで演奏される。
code:js
// "bd <hh oh>"の各音が2倍の速さで演奏される。
// *2を付ける前は1サイクル中の音が2音だったが、付けると倍速になって4音になるので、最初の"bd hh bd oh"と同じ順番かつ同じ時間配分で演奏される。
パターンの末尾に/数値を付けると、その部分がその数値分の1の速さで演奏される。
code:js
// []の中の各音が2分の1の速さで演奏される。本来各音は8分の1サイクルかけて演奏されるが、こうすると4分の1サイクルかけて演奏される。
// そうすると[]の中身は2分の1サイクルでは演奏が終わらない。残りは次のサイクルに持ち越される。
パターンの末尾に@数値を付けると、サイクルの中でその部分を引き伸ばしたり縮めたりすることができる。
code:js
// 1つ目の[]は4分の3サイクルかけて、2つ目の[]は4分の1サイクルかけて演奏される。
パターンの末尾に!数値を付けると、その部分をその数値回繰り返すことができる。
code:js
// 各[]が3回ずつ繰り返されて演奏される。
パターンを,で区切ると、各部分が同時に演奏される。
code:js
$: note("F4,A4,C5 G4,B4,D5 E4,G4,B4 A4,C5,E5") // (空白)は,よりも優先順位が高いので、上とは異なる。
$: sound("bd*3,bd*5") // 3/5拍子と5/5拍子を組み合わせたポリリズム
$: note("<C4 E4 G4 F4 A4 C5>*<2 3,5 7>")
和音を鳴らす
参考にした資料
,で構成音を並べる方法もあるが、
chord関数を使うと簡単に和音を鳴らせる。chord関数の戻り値のvoicingメソッドを呼ぶと、構成音を並べたパターンに変換してくれる。
code:js
$: chord("F G Em Am").voicing()
$: chord("F G Em Am").octave(1).voicing() // octaveメソッドを呼ぶと、構成音のオクターブを上げ下げできる。
addVoicings関数を使って、和音がスケールの何番目の音を鳴らすかを定義することもできる。
anchorメソッドやmodeメソッドを組み合わせると転回形を書ける。 code:js
$: chord("F G Em Am").anchor("C4 D4 B3 E3").mode("above").voicing()
スケール、移調、転調
n関数でスケールの何番目の音を鳴らすかを決めて、n関数の戻り値のscaleメソッドにスケール名を渡して呼ぶと、そのスケールの構成音を並べたパターンに変換してくれる。
code:js
$: n("0 2 4 3 5 7").scale("C4:major")
$: n("0 2 4 3 5 7").scale("<C4:major D4:major>") // scaleメソッドにはパターンを渡せるので、移調や転調を書くこともできる。
transposeメソッドでも転調ができる。
code:js
$: n("0 2 4 3 5 7").scale("C4:major").transpose("<0 2M>") // 2サイクル目で長2度上に転調する。
数字の後ろのアルファベットの意味: Mは長、mは短、Pは完全、Aは増、dは減
音源を変える
note関数の戻り値のsoundメソッドを呼んだり、
code:js
$: note("C4 E4 G4 F4 A4 C5").sound("gm_piano")
sound関数の戻り値のbankメソッドを呼んだりする。
code:js
$: sound("bd hh bd oh").bank("tr808")
同名のサンプルに複数の音色が登録されていることもある。サンプル名の後ろに:整数を付けることで音色を指定できる。
code:js
$: sound("bd:0 hh bd:1 oh")
引数にはバンク名やプログラム名を指定するが、REPLで指定できるバンク名やプログラム名の一覧や、サンプルに登録されている音色の数は、パネルのsoundsタブで参照できる。
オーディオエフェクトをかける
参考にした資料: ここに載せていない他のエフェクトについてもドキュメントを参照されたい。
エフェクトのためのメソッドを呼んでやる。
ADSR、ディレイ、リバーブ
code:js
$: note("C4 E4 G4 F4 A4 C5")
.sound("sine")
.attack(0)
.decay(0.5)
.sustain(0)
.release(0) // ディケイを短くしてサステインを0にすると、音価に関わらずポンポン鳴る音源を作れる。
.delay(1) // ディレイ効果の強さ。残響時間やフィードバックの強さが変わる。
.delays(2/11) // delaysメソッドを使うとディレイの間隔をサイクル単位で指定できる。
.room(1) // リバーブ。数値を大きくすると残響時間が長くなる。