MIDI FunctionsJ

print

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人の演奏者に対応します。 CindyScriptmidiaddtrack(...) 関数は、トラックをシーケンサに追加します。追加されたトラックは 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);


修飾子: いくつかの修飾子がありますが、ほとんどはその名前から意味がわかるでしょう。

修飾子: 値の型 効果:
velocity0.0 ... 1.0音量(ピアノの鍵盤を叩くときの速度)
amp0.0 ... 1.0 velocity と同じ
duration<実数>音の長さ。秒単位。
channel0..15演奏するチャンネル
reverb0.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(...) はリストをシーケンサに加えてすぐに演奏します。この関数が呼ばれるとき、他のトラックはシーケンサから削除されることを知っておくことは大切です。

修飾子: チャンネル、楽器、速度などのための修飾子があります。

修飾子: 値の型 効果:
channel0..15演奏するチャンネルの設定
instrument1 ... 123楽器の選択
speed<実数>1分間あたりの拍数を設定
loop0,1,2,3,4 ...旋律の繰り返し
start<実数>開始位置 (拍数で)


修飾子 loop は演奏が終わったあとの巻き戻しを指定します。この修飾子に続く数は巻き戻しの回数です。したがって、 loop->3 とすると、旋律は4回演奏されます。 loop->-1 は無限ループと解釈されます。これが呼ばれたあとは、新しい旋律(空の旋律playmelody([])も可)を加えたときにループが終わります。 あるいは、midistop() 命令を使うこともできます。





シーケンサにトラックを追加する: midiaddtrack(<list>)



説明: playmelody(...) とは対照的に、この関数はシーケンサに旋律を追加しますがすぐに演奏はしません。これによって、複数の声部よりなる、より複雑な楽曲を演奏できるようになります。シーケンサの開始は midistart() 命令によって行われます。シーケンサが演奏を始めたら、トラックを追加してもシーケンサは演奏をやりなおしません。トラックはそのまま置き換えられます。これにより、論理的な手順で旋律を変えていくことが可能になります。さらに、シーケンサと比較して追加されたトラックのタイミングを変えていくいくつかの修飾子があります。これによって、旋律を引き伸ばしたり、縮めたり、ずらしたりすることができます。詳細は以下で解説します。

修飾子: つぎの修飾子があります。:

修飾子: 値の型 効果:
channel0..15演奏するチャンネルを選ぶ
instrument1 ... 123楽器を選ぶ
speed<実数l>1分間あたりの拍数
track0..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分間あたりの拍数
loop0,1,2,3,4 ...旋律の繰り返し
start<実数>開始位置 (拍)






シーケンサの停止: midistop()



説明: MIDI シーケンサを直ちに停止します。





シーケンサの速度の設定: midispeed(<real>)



説明: この関数によってシーケンサの演奏速度を変えることができます。 速度は1分あたりの拍数を実数で与えます。初期値は60です。1秒に1拍ですが、多くの楽曲のなかでは遅い方です。シーケンサがすでに動いていても速度を変えることができます。これによって、ある点で速度を変えることができるようになります。





シーケンサの速度を問い合わせる: midispeed()



説明: 現在のシーケンサの速度を返します。




シーケンサの位置を設定する: midiposition(<real>)



説明: この関数によって、シーケンサの位置を特定の位置に設定できます。これによって CindyScript は演奏開始位置を明確にコントロールすることができます。





シーケンサの開始位置を問い合わせる: midiposition()



説明: この関数はシーケンサの現在の位置を返します。シーケンサが動いているとき、この値は連続的に変化します。





音色


次の関数によって、楽器を選んでチャンネルに割り当て、音色を作ることができます。



楽器を選ぶ: instrument(<int>)



説明: この関数によってチャンネルに楽器を割り当てます。チャンネルが指定されなければ初期値のチャンネルが使われます。各楽器には、 1から128までのコードが割り当てられています。楽器とコードの対応については、次の instrumentnames() で説明します。修飾子によってチャンネルを指定すれば、そのチャンネルの楽器が変更されます。

修飾子: この関数は、楽器によって音色を変えるいくつかの修飾子を持ちます。

修飾子: 値の型 効果:
velocity0.0 ... 1.0音量 (ピアノの鍵盤を叩く速さ)
duration<実数>音の長さ
bend-2.0 ... 2.0半音単位で上げ下げ
channel0..15演奏するチャンネル
reverb0.0 ... 1.0 残響効果
balance-1.0 ... 1.0左右のバランス


ここで velocityduration は演奏の速さと音量に影響を与えます。 ( 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 の修飾子とよく似ています。

修飾子: 値の型 効果:
velocity0.0 ... 1.0音量(ピアノの鍵盤を叩く速さ)
duration<real>音の長さ
bend-2.0 ... 2.0半音単位での音の上げ下げ
instrument0..15演奏する楽器の指定
reverb0.0 ... 1.0 残響効果
balance-1.0 ... 1.0左右のバランス





チャンネルの音量を設定する: midivolume(<real>)



説明: この関数によって、チャンネルの音量を設定します。引数は0.0から1.0までの実数です。通常は初期値のチャンネルが対象になりますが、修飾子によってチャンネルは変更できます。

修飾子:

修飾子: 値の型 効果:
channel0 ..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 ループによって、すべての可能なキーについて押されたか離されたかをチェックして playtonestoptone 関数に渡します。コンピュータが実際に楽器になるわけです。


サウンドつき卓球ゲーム


次の例は、適切なところで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);




Contributors to this page: Akira Iritani .
Page last modified on Saturday 17 of September, 2011 [09:58:08 UTC] by Akira Iritani.

The content on this page is licensed under the terms of the License.


Menu
free viagra samplehentai girlsmature pussymilfseeker cialis samplescam clip movie nude webcammother incest order viagra online cialis ukanime rapeparis hilton phone numbers viagra alternatives cialis forum cialis free samplehot girls in pantiesmonster of cocks discount cialis cilias free viagra samplesfree chat rooms cilia structurefree cartoon sex comics buy cialis order viagrafree adult videosplump girl gallerypantyhose gallerycum on her face cheapest cialisbisexual moviestampa bukakehuge black cock thumbnails buy cialis onlineporn star cialis drugwomen having sex cheap generic viagra alternative to viagra natural viagra cheap viagraoral sexteen webcam strip videosnude spanish girlserotic sex cams movies viagra side effectscartoon adultdisney sex animenude blonde hairygang bang swinger cialis viagrabisexual free moviesgay twinkswebcam chat live xxxyoung teens order cialislatina girls thongscum loversjapanese girl viagra cheapyoung japanese girlsmr chews asian beavergangbang squadshoshone indiansmature wiveslive webcam chat girlsfree ebony viagra on lineasian ladyboysteen boys viagra pillsself bondage techniques cailisincest familyfree ebony cheap cialisgay amateur cialis genericbusty asian viagra onlinemature breasts viagra for women free viagrabig boobies cialis generic viagragloryhole gaylatinas in thongs female viagraindian tits viagra 6 free samplesamateur upskirt viagra alternativefree xxx video cialis online discountgalleries of teen girls cialis dosage cheap generic cialisparis hilton pornopussy cat dollsbrutal sexgay peopleblack milfsno tits discount viagrablonde hairy pussyshemale animefree hardcore moviesmom strips for sonfat titscelebrity legsdouble anal levitra vs cialis cialis tadalafil cialis cheapgay bdsmcelebrities exposed viagra generic alternatives to viagra viagra canadabestialitypink porn stars viagra jokesclips of teen sexchicks suck horse cock online viagrasex with horsespainful analglory holes floridafree american bukkake cialis online buy viagrabig cock cum free cialisteen gay porn cialis side effects herbal viagra best price viagra purchase cialis cialis soft tabs cialis vs viagrafree fat girl webcamfree porn movie clipsoral penis suckingebony hardcore viagra pricepantyhose crossed legs cialis and levitralesbiennesblonde boobs buy viagra online