MIDI 関数
Cinderella-MIDI の使い方
MIDI は
Musical
Instrumental
Digital
Interface の略で、コンピュータなどで扱う電子楽器の音楽データの標準的な規格です。 MIDI はそれぞれの楽器で演奏した音色、音量、旋律など音楽を構成する多くのデータからなります。
CindyScript MIDI インターフェースでは、簡単で柔軟な方法で音楽や音響効果を作るための一連のデータを作ることができます。そのための方法を述べる前に、MIDI について少し解説しておきましょう。それにより、シンデレラとの関係を理解しやすくなります。そのなかで、CindyScript でどのように扱うかについても言及します。
楽譜、チャンネル、楽器
大雑把に言って、MIDIで最も基本的な機能は、情報を音楽シンセサイザに送信して、楽譜として処理させることです。その最も簡単な形は 0 から 127 までの数を使ってシンセサイザに演奏させることです。標準的なMIDIの記述では、中央のCの音を60とします。そこから半音ずつ数を増減します。したがって、C# は61、Dは62となります。次の表は、2オクターブ分の対応表です。
C | C# | D | D# | E | F | F# | G | G# | A | B | H | c | c# | d | e# | e | f | f# | g | g# | a | b | h | c' |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
CindyScript では、たとえば
playtone(60)
とするだけでその高さの音を出すことができます。
しかしながら、楽譜は音の高さだけでできているわけではありません。楽器名や音の大きさなど、その他の内容を含んでいます。MIDIは音楽を構成する多くのものをコントロールします。たとえば、ピアノの演奏を想像してみてください。鍵盤を叩く速さによって音の大きさが変わるでしょう。これはピアノの特徴です。鍵盤の叩きかたによって音色も変わります。 MIDIは音量だけでなくこういった特徴を自動的に表現します。そのため、音量をコントロールするパラメータは「ボリューム」というより「速度」と呼ばれています。Cinderella では、このパラメータは0.0から1.0までの数で表されます。たとえば、
playtone(60,velocity->0.5)
とすると、 C 音を中間的な音量でならします。
Cinderella の初期状態では、ピアノのような音で演奏されます。音を鳴らすときに不可欠な MIDI の2つの要素があります。それは、
楽器 と
チャンネル です。ひとつの MIDI 装置で16人の演奏者からなる音を鳴らすことができます。そのために、MIDI は0から15までの16個のチャンネルを持っており、それぞれが128種類の楽器(管楽器、弦楽器、打楽器、ピアノ、アコーディオン、ギターなど)を受け持つことができます。
CindyScript で、ある楽器(たとえば、アコースティックギターは25番)を、チャンネル3に割り当てるには、
midichannel(3, intrument->25)
あるいは
instruments(25, channel->3)
と記述します。
playtone(...)
が演奏するのは標準的にはチャンネル 0 ですが、それは修飾子で次のようにして変更できます。
midichannel(3,instrument->25); //guitar
midichannel(2,instrument->12); //vibraphone
playtone(60);
playtone(64);
playtone(67,channel->3);
playtone(72,channel->2);
ハ長調の主和音を、下の2つの音はピアノで、上の音はヴィブラフォンとギターで鳴らすことを考えてみましょう。それぞれのチャンネルは完全に同時に使われます。ですから、ピアノが同時に2つの音を鳴らすことは問題にはなりません。
CindyScript MIDI では、主だった楽器がすぐ使えるように16 のチャンネルには事前に楽器が割り当てられています。次の表がその割当表です。 (楽器名の後ろの数字が対応する楽器の番号です。):
0: Acoustic Grand Piano (1) | 8: Synt. square wave (81) |
1: Glockenspiel (10) | 9: DRUMSET |
2: Vibraphone (12) | 10: FX 3, crystal (99) |
3: Marimba (13) | 11: Tinkle Bell (113) |
4: Xylophone (14) | 12: Flute (74) |
5: Woodblock (116) | 13: Acoustic Bass (33 |
6: Pizzicato Strings (46) | 14: Percussive Organ (18) |
7: Tremolo Strings (45) | 15: Alto Saxophone (66) |
音についてのその他の要素(残響、バランスなど)には修飾子でアクセスできます。詳しくは別に述べることにして、ここでは最も重要な'duration'について述べます。このパラメータは、音を鳴らす時間(秒)を指定します。 たとえば、
playtone(60,duration->0.1,velocity->1)
とすると、短く最音量の C 音を鳴らします。 修飾子で指定しないときの duration の初期値は1秒です。
タイミングとシーケンサ
ここまで、音を一つ鳴らす方法を示してきました。Cinderellaでメロディを演奏する方法が2つあります。CindyScriptの
wait(...)
関数を使ってタイミングをとるか MIDI シーケンサを使います。まず、シーケンサを使わない方法について述べます。そのためには、
wait(...)
関数を使って個々の音符を表現します。
playtone(60,duration->3); wait(500);
playtone(64,duration->2.5); wait(500);
playtone(67,duration->2); wait(500);
playtone(72,duration->1.5);
この例では、それぞれの音は同じ間隔で鳴ります。この方法を使ってメロディを作ればよいのです。次のコードを試してください。
halftones=[61,63,66,68,70,73,75,78,80,82,85,87,90];
forall(60..90,i,
playtone(i,velocity->if(contains(halftones,i),1,0.6),
channel->if(contains(halftones,i),3,5));
wait(100);
);
この方法には不便な点があります。第1に、タイミングを CindyScript で詳しく書かなければなりません。第2に、
wait(...)
関数によって他の CindyScript の命令の実行ができません。そのため、(他にも理由はありますが) MIDI シーケンサを使う方が簡単です。
MIDI シーケンサは、MIDIの第2の主要な特徴です。それは、MIDI でタイミングをとる小さなプログラムです。 CindyScript でこのシーケンサにアクセスするには
playmelody(...)
関数か
midiaddtrack(...);midistart()
関数を使います。最初の方法はシンプルで直感的です。2番目の方法は強力です。ここでは最初の方法を簡潔に述べます。
plamelody(...)
関数には MIDI イベントのリストを渡します。MIDIイベントの最も簡単な形式は、音と時間のリストからなるものです。ハ長調の分散和音は次のようになります。
playmelody([[60,1],[64,1],[67,1],[72,4]]);
次に示すように、音の高さは数ではなく文字で表すことも可能です。
playmelody([
["c",1],["e",1],["f",1],["g",5],["c",1],["e",1],["f",1],["g",5],
["c",1],["e",1],["f",1],["g",2],["e",2],["c",2],["e",2],["d",5],
["e",1],["e",1],["d",1],["c",3],["c",1],["e",2],["g",2],["g",1],
["f",4],["f",1],["e",1],["f",1],["g",2],["e",2],["c",2],["d",2],["c",5]
],speed->300,instrument->57)
このコードは「聖者が町にやってきた」を演奏します。この関数にも、いろいろな修飾子があります。たとえば、トランペットのような楽器を選んでいます。(本当のトランペット奏者の方はこんな音ですがご容赦願います)速度の 300 は1分間の"拍数"です。
拍数 はシーケンサでの基本的な時間の単位です。4分の4拍子であれば1小節に4つ、ワルツでは1小節に3つというようなものです。また、拍は分数でも許されます。8分の、とか3分の、とか4分の、という使われ方がされるかもしれません。
シーケンサによる、シンセサイザとのインターフェースは音楽の要素について多くの内容を表すことができます。詳細は後ほど述べます。
打楽器
Cinderella は
標準 MIDI と呼ばれる、あらかじめ設定された楽器の組合せを用います。標準 MIDI には、特別な(非常に役立つけれど)取り決めがあります。チャンネル 9 が打楽器のために予約されていて、ドラムセットを実行するのに使うことができます。ですから、チャンネル 9 を使うときにはこのことを念頭に置いてください。この場合に使う MIDI 番号は特定の打楽器に割り当てられています。次の表でそれを示します。
35 Bass Drum 2 | 47 Mid Tom 1 | 59 Ride Cymbal 2 | 71 Short Whistle |
36 Bass Drum 1 | 48 High Tom 2 | 60 High Bongo | 72 Long Whistle |
37 Side Stick | 49 Crash Cymbal 1 | 61 Low Bongo | 73 Short Guiro |
38 Snare Drum 1 | 50 High Tom 1 | 62 Mute High Conga | 74 Long Guiro |
39 Hand Clap | 51 Ride Cymbal 1 | 63 Open High Conga | 75 Claves |
40 Snare Drum 2 | 52 Chinese Cymbal | 64 Low Conga | 76 High Wood Block |
41 Low Tom 2 | 53 Ride Bell | 65 High Timbale | 77 Low Wood Block |
42 Closed Hi-hat | 54 Tambourine | 66 Low Timbale | 78 Mute Cuica |
43 Low Tom 1 | 55 Splash Cymbal | 67 High Agogo | 79 Open Cuica |
44 Pedal Hi-hat | 56 Cowbell | 68 Low Agogo | 80 Mute Triangle |
45 Mid Tom 2 | 57 Crash Cymbal 2 | 69 Cabasa | 81 Open Triangle |
46 Open Hi-hat | 58 Vibra Slap | 70 Maracas |
|
これによって、リズムトラックを伴う音楽を作ることが簡単になります。打楽器は、音楽以外のCinderellaのアプリケーションでも音響効果として有効に使えます。たとえば、卓球ゲームのではウッド・ブロック ( 76 番と 77 番 )を使えば球を打つときの効果音ができます。
次のコードはシーケンサを用いた簡単なロックリズムを示します。トラックを始めに巻き戻すのに、
playmelody(...)
の中で
"goto"
が使われているのをごらん下さい。
playmelody(channel->9,speed->500,loop->8,
[[35,3],[35,3],[35,3],[35,6],[35,1],["goto",0], //bass drum
[-1,2],[42,4],[42,4],[42,4],[42,2],["goto",0], //high-hat
[-1,4],[38,8],[38,4],["goto",0], //snare
[59,4],[59,4],[59,4],[59,4],["goto",0], //ride cymbal
[-1,13],[76,1],[62,1],[-1,2],["goto",0] //percussion
]);
このコードで、いくつかの打楽器が旋律や複雑なリズムパターンを演奏しています。
-1
は休符として使われています。
トラック
最後に、旋律を受け持つパートと打楽器リズムからなる短い音楽を作って、この簡単な紹介を終わります。MIDI はシーケンサのために多くのトラックを持つことができます。それぞれのトラックは1人の演奏者に対応します。
CindyScript の
midiaddtrack(...)
関数は、トラックをシーケンサに追加します。追加されたトラックは
midistart()
関数によって有効になります。次のコードは、よく知られた「聖者が町にやってきた」をロック風のリズムで演奏します。ここで使われている技法はこのあとで説明します。
midichannel(3,instrument->57);
midiaddtrack(channel->3,track->1,
[["c",1],["e",1],["f",1],["g",5],["c",1],["e",1],["f",1],["g",5],
["c",1],["e",1],["f",1],["g",2],["e",2],["c",2],["e",2],["d",5],
["e",1],["e",1],["d",1],["c",3],["c",1],["e",2],["g",2],["g",1],
["f",4],["f",1],["e",1],["f",1],["g",2],["e",2],["c",2],["d",2],["c",5]
]);
midiaddtrack(channel->9,track->2,stretch->1/2,offset->3,repeat->8,
[[35,3],[35,3],[35,3],[35,6],[35,1],["goto",0], //bass drum
[-1,2],[42,4],[42,4],[42,4],[42,2],["goto",0], //high-hat
[-1,4],[38,8],[38,4],["goto",0], //snare
[59,4],[59,4],[59,4],[59,4],["goto",0], //ride cymbal
[-1,13],[76,1],[62,1],[-1,1] //percussion
]);
midistart(speed->250);
まず、旋律とリズム用の2つのトラックをシーケンサに追加し
midistart()
で使えるようにします。修飾子で設定するタイミングと位置決めに関して少し問題があります。はじめに、先の例から「聖者が町にやってきた」のトラックをとります。それをトラック1としましょう。つぎに、先ほどのロックリズムパターンをトラック2に入れるのですが、ここでちょっとした問題があります。まず、タイミングが合いません。旋律の拍はリズムトラックの2倍あります。そこで
stretch->1/2
修飾子を使ってリズムトラックと合わせます。次に、「聖者が町にやってきた」の最初の3音はアウフタクトです。ですから、リズムは最初から始まってはいけません。そこで
offset->3
修飾子で始まりを合わせます。最後に、リズムパターンは8回繰り返します。そこで
repeat->8
とします。
単音
サウンド関数の説明を、まず単音を鳴らす関数から始めます。音の特徴を出すために、いくつかの修飾子があります。
単音を鳴らす: playtone(<int>)
説明: これは、音を鳴らすもっとも単純な方法です。この関数が実行されると音が鳴ります。修飾子がないとき、初期設定の楽器音が使われます。鳴る時間は1秒で、音量は
0.5
です。
例 次のコードはハ長調の分散和音を鳴らします。
playtone(60);
wait(1000);
playtone(64);
wait(1000);
playtone(67);
wait(1000);
playtone(72, duration->4);
修飾子: いくつかの修飾子がありますが、ほとんどはその名前から意味がわかるでしょう。
修飾子: | 値の型 | 効果:
|
velocity | 0.0 ... 1.0 | 音量(ピアノの鍵盤を叩くときの速度)
|
amp | 0.0 ... 1.0 | velocity と同じ
|
duration | <実数> | 音の長さ。秒単位。
|
channel | 0..15 | 演奏するチャンネル
|
reverb | 0.0 ... 1.0 | 残響効果
|
balance | -1.0 ... 1.0 | 左右のバランス
|
bend | -2.0 ... 2.0 | 半音の上げ下げ
|
bend
修飾子によって、音程が半音単位で2半音まで上下できます。
音の長さ duration が 0 以下のときは
stoptone(...)
で止められるまで鳴り続けます。
音を止める: stoptone(<int>)
説明: 特定のキーの音を止めます。音が鳴り続けるときに有効です。
特定の周波数で鳴らす: playfrequency(<real>)
説明: この関数は
playtone
とよく似ています。しかし、こちらは引数を周波数 (Hz) (実数)で渡します。より物理的な
playsin(...)
を使う方がよい場合もあります。
例: playfrequency(440)
で 440 Hz の音を、現在選択されているチャンネルの楽器で鳴らします。
playfrequency
関数は、インドのラーガやジャワのガムラン音楽のような非ヨーロッパ系の音階をシミュレートするときに必要でしょう。
説明: 修飾子は
playtone(...)
と同様ですが
bend
修飾子はここでは無効です。
旋律
Cinderella MIDI インターフェースは音符の列を演奏するための命令セットを豊富に提供します。原則として、各音符(もっと一般的にはそれぞれのMIDIイベント)はこれを演奏するためのシーケンサと関連します。演奏される音符は CindyScript のリストで与えられます。各音符は音程と長さを表す整数か文字列からなるリストで表されます。また、楽器や音量もこのリストの要素です。 CindyScript のすべての旋律に関する処理に共通するこのリストの構造について説明をします。
旋律リストの説明
CindyScript において、旋律はリストで表現されます。最も簡単なものは音の列です。次のコードでは、ハ長調の音階を演奏します。
playmelody([["C",1],["D",1],["E",1],["F",1],["G",1],["A",1],["H",1],["c",5]])
音名の代わりに、音の高さを表す整数のコードを使うこともできます。:
playmelody([[60,1],[62,1],[64,1],[65,1],[67,1],[69,1],[71,1],[72,5]])
各リストの2番目の数は音の長さを表します。音の長さは拍で数えられます。初期状態では1分につき60の速さで演奏されます。これは、
midispeed(...)
関数の修飾子で変更できます。
内部的には、旋律が演奏される間、次のようなことが起ります。旋律の最初に、シーケンサはその開始点をセットします。最初の音符が鳴らされるとシーケンサはその拍数だけ進みます。内部的には、各拍は各音符を正確に鳴らすための小ステップに分割されます。実際、一つの拍は5×3×2×2×2=240のステップに分けられます。これにより、8分音符、16分音符,32分音符、3連符、5連符を正確に演奏できます。実際にはこの小ステップはほとんど連続していると思えるくらいのものです。そのため、音の長さは実数で表すことができます。小ステップへの変換は自動的に行われます。次のコードでは、音階の各音が1拍分ずつ鳴りますが、8分音符、3連符・・というように細かく分割して鳴らされていきます。
playmelody([["C",1],
["D",1/2],["D",1/2],
["E",1/3],["E",1/3],["E",1/3],
["F",1/4],["F",1/4],["F",1/4],["F",1/4],
["G",1/6],["G",1/6],["G",1/6],["G",1/6],["G",1/6],["G",1/6],
["A",1/8],["A",1/8],["A",1/8],["A",1/8],["A",1/8],["A",1/8],["A",1/8],["A",1/8],
["H",1],["c",5]])
つぎに、旋律を構成する他の要素について説明します。
音程: 音程が音名か整数で表されることは既に述べました。1つの音は
[<音程>,<長さ>]
という形で表されます。ここで、
<音程>
は音名か整数で、
<長さ>
は正の実数で表します。次の表は中央のオクターブについて音名と音コードの対応を示します。
C | Cis | Des | D | Dis | Es | E | F | Fis | Ges | G | Gis | As | A | Ais | B | H | c |
48 | 49 | 49 | 50 | 51 | 51 | 52 | 53 | 54 | 54 | 55 | 56 | 56 | 57 | 58 | 58 | 59 | 60 |
次のオクターブはこうなります:
c | cis | des | d | dis | es | e | f | fis | ges | g | gis | as | a | ais | b | h | c' |
60 | 61 | 61 | 62 | 63 | 63 | 64 | 65 | 66 | 66 | 67 | 68 | 68 | 69 | 70 | 70 | 71 | 72 |
下のオクターブは同じようにシフトしていけばよいのです。つまり、
C''
は 24 です。上のオクターブも同様です。たとえば、
c'''
は 96 になります。
単音ではなく和音を演奏することもできます。そのためには、同時に鳴らす音をリストにします。その形式は
[[<音程1>,<音程2>,<音程3>,...],<長さ>]
です。次のコードは、次第に和音を構成する音を増やしながら演奏します。
playmelody([["C",1],
[["C","E"],1],
[["C","E","G"],1],
[["C","E","G","c"],5] ] )
最後に、
-1
か
"P"
または
"p"
を使うことで休符ができます。
ダイナミクスとフレージング: 旋律を演奏するために、次のようなダイナミクス(音の強弱)やフレージングがあります。それぞれ、その文字列だけのリストにします。現在、次のものが実行できます。:
-
"ppp"
: ピアノピアニッシモ
-
"pp"
: ピアニッシモ
-
"p"
: ピアノ
-
"mp"
: メゾピアノ
-
"mf"
: メゾフォルテ
-
"f"
: フォルテ
-
"ff"
: フォルテッシモ
-
"fff"
: フォルテフォルテッシモ
-
">"
: アクセント
-
"staccato"
: スタッカート
-
"st"
: スタッカート
-
"legato"
: レガート
-
"le"
: レガート
-
["velocity",<実数>]
: 音量を <実数>
にする。実数は 0.0 から 1.0
次のコードは、音階の演奏ををピアニッシモ・スタッカートで始めて、フォルテ・レガートで終わります。:
playmelody([["st"],["pp"],["C",1],["D",1],["E",1],["F",1],["le"],["f"],["G",1],["A",1],["H",1],["c",5]])
位置合わせ: シーケンサは内部的に演奏位置を表すポインタを持っています。通常、ポインタは演奏位置まで進みます。しかし、ポインタを直接操作して位置をコントロールする命令文があります。トラックが加えられたときはポインタは0に設定されます。
"goto"
と
"gorel"
によって、ポインタは絶対位置か相対位置に移動できます。その構文は次の通りです。:
-
["goto",<実数>]
: ポインタを、最初から測って <実数>
の位置に置きます。負の数は禁じられています。
-
["gt",<実数>]
: "goto"
と同じです。
-
["gorel",<実数>]
: ポインタの位置を相対的に計算してof <実数>
の位置に置きます。 <実数>
は負の値も取り得えます。ただし、結果として負になるような数は禁じられています。
-
["gr",<real>]
: "gorel"
と同じです。
次のコードは
goto(...)
命令を使って少し弱い音で第2声を鳴らしています。
playmelody([
["c",1],["e",1],["g",1],["a",1],["c'",4],["goto",0],["vel",0.3],
["g",1],["a",1],["c'",1],["e'",1],["a'",4],
],speed->100)
加えられる音符のタイミングをコントロールする、より高度な方法もあります。それは、普通の楽譜の表記法により近いものです。4つの命令があります:
-
["||:"]
: 繰り返し記号の始め
-
[":||"]
: 繰り返し記号の終わり
-
["1."]
: 第1カッコ
-
["2."]
: 第2カッコ
これらの命令を使えばリピートの音楽が簡単にできます。次の楽譜は「おお、スザンナ」です。
CindyScript で次のように書けば演奏できます。
playmelody([
["c",.5],["d",.5],
["||:"],["e",1],["g",1],["g",1.5],["a",.5],["g",1],["e",1],["c",1.5],["d",.5],
["1."],["e",1],["e",1],["d",1],["c",1],["d",3],["c",.5],["d",.5],[":||"],
["2."],["e",1],["e",1],["d",1],["d",1],["c",4]
],speed->200)
楽器のコントロール:
最後に、音色と楽器を選ぶ若干の命令があります。旋律リストの中で、楽器を変更することが可能です。次のような命令文があります。
-
["channel",<整数>]
: チャンネルを (0...15) の範囲で変更します。
-
["ch",<int~整数~]
: channel
と同じです。
-
["instrument",<整数>]
: チャンネルと関連して楽器を(1...128) の範囲で変更します。
-
["inst",<整数>]
: instrument
と同じです。
-
[<整数>,<整数>,<整数>,<整数>]
: この4つの整数からなる命令は、(詳しくは MIDI のマニュアルを参照のこと)楽器のコントロールにアクセスします。最初の数はコントロールコード、2番目はチャンネル、あとの2つはデータです。
トラックが再開されるときは、楽器は初期値にリセットされます。
旋律の演奏: playmelody(<list>)
説明: playmelody(...)
の使い方はすでに述べました。それは直接旋律を演奏するものでした。リストは旋律言語とのいうべきものです。
playmelody(...)
はリストをシーケンサに加えてすぐに演奏します。この関数が呼ばれるとき、他のトラックはシーケンサから削除されることを知っておくことは大切です。
修飾子: チャンネル、楽器、速度などのための修飾子があります。
修飾子: | 値の型 | 効果:
|
channel | 0..15 | 演奏するチャンネルの設定
|
instrument | 1 ... 123 | 楽器の選択
|
speed | <実数> | 1分間あたりの拍数を設定
|
loop | 0,1,2,3,4 ... | 旋律の繰り返し
|
start | <実数> | 開始位置 (拍数で)
|
修飾子 loop は演奏が終わったあとの巻き戻しを指定します。この修飾子に続く数は巻き戻しの回数です。したがって、
loop->3
とすると、旋律は4回演奏されます。
loop->-1
は無限ループと解釈されます。これが呼ばれたあとは、新しい旋律(空の旋律
playmelody([])
も可)を加えたときにループが終わります。 あるいは、
midistop()
命令を使うこともできます。
シーケンサにトラックを追加する: midiaddtrack(<list>)
説明: playmelody(...)
とは対照的に、この関数はシーケンサに旋律を追加しますがすぐに演奏はしません。これによって、複数の声部よりなる、より複雑な楽曲を演奏できるようになります。シーケンサの開始は
midistart()
命令によって行われます。シーケンサが演奏を始めたら、トラックを追加してもシーケンサは演奏をやりなおしません。トラックはそのまま置き換えられます。これにより、論理的な手順で旋律を変えていくことが可能になります。さらに、シーケンサと比較して追加されたトラックのタイミングを変えていくいくつかの修飾子があります。これによって、旋律を引き伸ばしたり、縮めたり、ずらしたりすることができます。詳細は以下で解説します。
修飾子: つぎの修飾子があります。:
修飾子: | 値の型 | 効果:
|
channel | 0..15 | 演奏するチャンネルを選ぶ
|
instrument | 1 ... 123 | 楽器を選ぶ
|
speed | <実数l> | 1分間あたりの拍数
|
track | 0..10 | シーケンサのトラックを選ぶ
|
start | <実数> | 開始位置(拍)
|
mode | "add", "replace", "append" | トラックを追加したときの動作
|
stretch | <実数> | 旋律を追加したときの伸縮(シーケンサと関連)
|
offset | <実数> | シーケンサと関連して、旋律を追加したときのシフト量
|
repeat | <実数> | 旋律がどのくらい追加されるか
|
いくつかの修飾子は、さらに説明が必要でしょう。Cinderella は、0から15まで、16個のトラックを扱います。それぞれのトラックは個々の声部のようなものです。旋律を追加するトラックは
track
修飾子で指定します。
トラックを追加したとき、
mode
修飾子はそれを既存のトラックと置き換えるのか、末尾に追加されるのか、加算されるのかを示します。
新しい旋律のタイミングは、シーケンサ内の既存のトラックに関連して調節することができます。
stretch
修飾子の数により、旋律のすべての拍について伸縮率を与えられます。
stretch->0.5
とすると、もとの速度の2倍で演奏します。 同様に
offset
は新しい旋律が追加される位置を決めます。
offset->8
とすると、開始から8拍後に追加します。最後に、 repeat は、トラックが連続してどのくらい繰り返されるかを示します。
stretch
,
offset
および
repeat
をつかうと、既存の旋律にリズムパターンを追加するときに非常に役に立つことがあります。
シーケンサの開始: midistart()
解説: この関数はシーケンサを開始します。トラックは
midiaddtrack(...)
によって事前に追加されていなければなりません。
修飾子: 修飾子は
playmelody(...)
と同様です。次の修飾子が使えます。
修飾子: | 値の型 | 効果:
|
speed | <実数> | 1分間あたりの拍数
|
loop | 0,1,2,3,4 ... | 旋律の繰り返し
|
start | <実数> | 開始位置 (拍)
|
シーケンサの停止: midistop()
説明: MIDI シーケンサを直ちに停止します。
シーケンサの速度の設定: midispeed(<real>)
説明: この関数によってシーケンサの演奏速度を変えることができます。 速度は1分あたりの拍数を実数で与えます。初期値は60です。1秒に1拍ですが、多くの楽曲のなかでは遅い方です。シーケンサがすでに動いていても速度を変えることができます。これによって、ある点で速度を変えることができるようになります。
シーケンサの速度を問い合わせる: midispeed()
説明: 現在のシーケンサの速度を返します。
シーケンサの位置を設定する: midiposition(<real>)
説明: この関数によって、シーケンサの位置を特定の位置に設定できます。これによって
CindyScript は演奏開始位置を明確にコントロールすることができます。
シーケンサの開始位置を問い合わせる: midiposition()
説明: この関数はシーケンサの現在の位置を返します。シーケンサが動いているとき、この値は連続的に変化します。
音色
次の関数によって、楽器を選んでチャンネルに割り当て、音色を作ることができます。
楽器を選ぶ: instrument(<int>)
説明: この関数によってチャンネルに楽器を割り当てます。チャンネルが指定されなければ初期値のチャンネルが使われます。各楽器には、 1から128までのコードが割り当てられています。楽器とコードの対応については、次の
instrumentnames()
で説明します。修飾子によってチャンネルを指定すれば、そのチャンネルの楽器が変更されます。
修飾子: この関数は、楽器によって音色を変えるいくつかの修飾子を持ちます。
修飾子: | 値の型 | 効果:
|
velocity | 0.0 ... 1.0 | 音量 (ピアノの鍵盤を叩く速さ)
|
duration | <実数> | 音の長さ
|
bend | -2.0 ... 2.0 | 半音単位で上げ下げ
|
channel | 0..15 | 演奏するチャンネル
|
reverb | 0.0 ... 1.0 | 残響効果
|
balance | -1.0 ... 1.0 | 左右のバランス
|
ここで
velocity
と
duration
は演奏の速さと音量に影響を与えます。 (
playtone(...)
と同じ).
例: 次のコードは、まず
Glockenspiel で、次にトランペットで、最後にピアノで、音量と長さを変えて音を出します。
instrument(10,velocity->0.2);
playtone(96);
wait(1000);
instrument(57,duration->0.1,velocity->1);
playtone(60);
wait(1000);
instrument(1,duration->2,velocity->.5);
playtone(60);
利用できる楽器を知る: instrumentnames()
説明: この関数は、あなたのコンピュータで利用できる楽器のリストを返します。標準 MIDI では (あなたのコンピュータにすでにインストールされているとして) 次の楽器が使えます。
Piano: | Bass: | Reed: | Synth Effects: |
1 Acoustic Grand Piano | 33 Acoustic Bass | 65 Soprano Sax | 97 FX 1 (rain) |
2 Bright Acoustic Piano | 34 Electric Bass (finger) | 66 Alto Sax | 98 FX 2 (soundtrack) |
3 Electric Grand Piano | 35 Electric Bass (pick) | 67 Tenor Sax | 99 FX 3 (crystal) |
4 Honky-tonk Piano | 36 Fretless Bass | 68 Baritone Sax | 100 FX 4 (atmosphere) |
5 Electric Piano 1 | 37 Slap Bass 1 | 69 Oboe | 101 FX 5 (brightness) |
6 Electric Piano 2 | 38 Slap Bass 2 | 70 English Horn | 102 FX 6 (goblins) |
7 Harpsichord | 39 Synth Bass 1 | 71 Bassoon | 103 FX 7 (echoes) |
8 Clavi | 40 Synth Bass 2 | 72 Clarinet | 104 FX 8 (sci-fi) |
|
Chromatic Percussion: | Strings: | Pipe: | Ethnic: |
9 Celesta | 41 Violin | 73 Piccolo | 105 Sitar |
10 Glockenspiel | 42 Viola | 74 Flute | 106 Banjo |
11 Music Box | 43 Cello | 75 Recorder | 107 Shamisen |
12 Vibraphone | 44 Contrabass | 76 Pan Flute | 108 Koto |
13 Marimba | 45 Tremolo Strings | 77 Blown Bottle | 109 Kalimba |
14 Xylophone | 46 Pizzicato Strings | 78 Shakuhachi | 110 Bagpipe |
15 Tubular Bells | 47 Orchestral Harp | 79 Whistle | 111 Fiddle |
16 Dulcimer | 48 Timpani | 80 Ocarina | 112 Shanai |
|
Organ: | Ensemble: | Synth Lead: | Percussive: |
17 Organ | 49 String Ensemble 1 | 81 Lead 1 (square) | 113 Tinkle Bell |
18 Percussive Organ | 50 String Ensemble 2 | 82 Lead 2 (sawtooth) | 114 Agogo Bells |
19 Rock Organ | 51 Synth Strings 1 | 83 Lead 3 (calliope) | 115 Steel Drums |
20 Church Organ | 52 Synth Strings 2 | 84 Lead 4 (chiff) | 116 Woodblock |
21 Reed Organ | 53 Voice Aahs | 85 Lead 5 (charang) | 117 Taiko Drum |
22 Accordion | 54 Voice Oohs | 86 Lead 6 (voice) | 118 Melodic Tom |
23 Harmonica | 55 Synth Voice | 87 Lead 7 (fifths) | 119 Synth Drum |
24 Tango Accordion | 56 Orchestra Hit | 88 Lead 8 (bass + lead) | 120 Reverse Cymbal |
|
Guitar: | Brass: | Synth Pad: | Sound effects: |
25 Acoustic Guitar (nylon) | 57 Trumpet | 89 Pad 1 (new age) | 121 Guitar Fret Noise |
26 Acoustic Guitar (steel) | 58 Trombone | 90 Pad 2 (warm) | 122 Breath Noise |
27 Electric Guitar (jazz) | 59 Tuba | 91 Pad 3 (polysynth) | 123 Seashore |
28 Electric Guitar (clean) | 60 Muted Trumpet | 92 Pad 4 (choir) | 124 Bird Tweet |
29 Electric Guitar (muted) | 61 French horn | 93 Pad 5 (bowed) | 125 Telephone Ring |
30 Overdriven Guitar | 62 Brass Section | 94 Pad 6 (metallic) | 126 Helicopter |
31 Distortion Guitar | 63 Synth Brass 1 | 95 Pad 7 (halo) | 127 Applause |
32 Guitar harmonics | 64 Synth Brass 2 | 96 Pad 8 (sweep) | 128 Gunshot |
チャンネルを選ぶ: midichannel(<int>)
説明: この関数は、 playmelody(...)
あるいは playtone(...)
で使うチャンネルを選びます。修飾子によって、選択したチャンネルの楽器や音色を買えることができます。
修飾子: この修飾子は instrument
の修飾子とよく似ています。
修飾子: | 値の型 | 効果:
|
velocity | 0.0 ... 1.0 | 音量(ピアノの鍵盤を叩く速さ)
|
duration | <real> | 音の長さ
|
bend | -2.0 ... 2.0 | 半音単位での音の上げ下げ
|
instrument | 0..15 | 演奏する楽器の指定
|
reverb | 0.0 ... 1.0 | 残響効果
|
balance | -1.0 ... 1.0 | 左右のバランス
|
チャンネルの音量を設定する: midivolume(<real>)
説明: この関数によって、チャンネルの音量を設定します。引数は0.0から1.0までの実数です。通常は初期値のチャンネルが対象になりますが、修飾子によってチャンネルは変更できます。
修飾子:
修飾子: | 値の型 | 効果:
|
channel | 0 ..15 あるいは "all" | チャンネルを選択
|
チャンネル番号は個々に指定しますが、"all" によって、すべてのチャンネルを指定することもできます。
チャンネルのコントローラを設定する: midicontrol(<int>,<int>)
説明: これにより MIDI コントローラが設定されます。第1の引数はコントローラの番号 (0..127)で、第2の引数はコントローラにセットする値 (0..127) です。コントローラは、残響効果やバランス、楽器に特有の音に影響します。詳細は標準MIDI のマニュアルを見てください。
修飾子: 修飾子の使い方は midivolume
と同様です。
3つの小品
この節の最後に、 CindyScript MIDI を使った3つの小品をお見せします。ユーザー諸氏は、これを例に、さらに実験をしてみてください。
キーボードピアノ
この例は、コンピュータのキーボードを鍵盤代わりにしたピアノです。次のコードを timer tickスロットに置いて、実行ボタンを押してください。
pairs=[[65,60],[83,62],[68,64],[70,65],[71,67],[72,69],[74,71],
[75,72],[76,74],[59,76],[222,77],[92,79],[87,61],[69,63]
,[84,66],[90,68],[85,70],[79,73],[80,75],[93,78]];
l=keydownlist();
forall(pairs,p,
if(contains(l,p_1)&!contains(ol,p_1),playtone(p_2,duration->-1,velocity->0.5));
if(contains(ol,p_1)&!contains(l,p_1),stoptone(p_2));
);
ol=l;
このコードでは keydownlist()
関数を利用しています。この関数は、押されたキーの内部コード番号のリストを返します。キーボードのコード番号は演奏される音に関連付けられます。 forall
ループによって、すべての可能なキーについて押されたか離されたかをチェックして playtone
と stoptone
関数に渡します。コンピュータが実際に楽器になるわけです。
サウンドつき卓球ゲーム
次の例は、適切なところでplaytone(...)
を使った本当に小さなプログラムです。サウンド効果付きの卓球ゲームを作ります。 CindyLab の物理シミュレーションを使って、インタラクティブな卓球台が簡単に作れます。卓球台は 反射壁 を使って作ります。インスペクタを用いて、それぞれの反射壁が質点を弾いたときに、スクリプトが実行されるようにします。 playtone
関数で "click" 音を作り、スクリプトを書き込みます。次の図をごらん下さい。

grooveの演奏
最後の例は、シーケンサのタイミング精度の実証になります。チャーリー・パーカーのジャズ曲 Ornithology の始めの部分です。(このタイトルはチャーリーのあだ名「バード」に由来します) ジャズの特徴はそのスイング感です。これは、基本となるビートに対してすこしずれたリズムです。次のコードでは、変数 g
がスイングのパラメータとして使われます。それは、2番目の音を基本ビートからすこしずらすのです。変数 g
を 0.0 から 1.0 の範囲で少し動かしてみるといいでしょう。 それによって、簡単にスイング感を変えられます。(0.5 から 0.7 の範囲では普通のスイングに聞こえます)。
g=.6;
mel=[[62,2-g],[67,2+g],[69,2-g],[71,2+g],[72,2-g],[74,2+g],[71,2-g],[72,2+g],[74,2-g],[71,2+g],[67,3],[-1,9],
[62,2-g],[67,2+g],[69,2-g],[70,2+g],[72,2-g],[74,2+g],[76,4],[77,4],[67,2-g],[69,2+g],[70,8],
[74,2-g],[72,2+g],[69,4],[65,2-g],[70,2+g],[68,2-g],[69,2+g],[65,13],[-1,3]
];
drum=44;
beat=[[-1,2-g]];
apply(1..11,beat=beat++[[-1,4],[drum,4]]);
beat=beat++[[-1,4],[drum,4-2+g]];
midiaddtrack(mel ,channel->2,track->2);
midiaddtrack(beat,channel->9,track->1,velocity->.5);
midistart(speed->800);