MIDI FunctionsJMIDI 関数Cinderella-MIDI の使い方MIDI は Musical Instrumental Digital Interface の略で、コンピュータなどで扱う電子楽器の音楽データの標準的な規格です。 MIDI はそれぞれの楽器で演奏した音色、音量、旋律など音楽を構成する多くのデータからなります。 CindyScript MIDI インターフェースでは、簡単で柔軟な方法で音楽や音響効果を作るための一連のデータを作ることができます。そのための方法を述べる前に、MIDI について少し解説しておきましょう。それにより、シンデレラとの関係を理解しやすくなります。そのなかで、CindyScript でどのように扱うかについても言及します。 楽譜、チャンネル、楽器大雑把に言って、MIDIで最も基本的な機能は、情報を音楽シンセサイザに送信して、楽譜として処理させることです。その最も簡単な形は 0 から 127 までの数を使ってシンセサイザに演奏させることです。標準的なMIDIの記述では、中央のCの音を60とします。そこから半音ずつ数を増減します。したがって、C# は61、Dは62となります。次の表は、2オクターブ分の対応表です。
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 のチャンネルには事前に楽器が割り当てられています。次の表がその割当表です。 (楽器名の後ろの数字が対応する楽器の番号です。):
音についてのその他の要素(残響、バランスなど)には修飾子でアクセスできます。詳しくは別に述べることにして、ここでは最も重要な'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 番号は特定の打楽器に割り当てられています。次の表でそれを示します。
これによって、リズムトラックを伴う音楽を作ることが簡単になります。打楽器は、音楽以外の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 とします。単音サウンド関数の説明を、まず単音を鳴らす関数から始めます。音の特徴を出すために、いくつかの修飾子があります。 単音を鳴らす:
|
修飾子: | 値の型 | 効果: |
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半音まで上下できます。stoptone(...)
で止められるまで鳴り続けます。stoptone(<int>)
playfrequency(<real>)
playtone
とよく似ています。しかし、こちらは引数を周波数 (Hz) (実数)で渡します。より物理的な playsin(...)
を使う方がよい場合もあります。playfrequency(440)
で 440 Hz の音を、現在選択されているチャンネルの楽器で鳴らします。 playfrequency
関数は、インドのラーガやジャワのガムラン音楽のような非ヨーロッパ系の音階をシミュレートするときに必要でしょう。playtone(...)
と同様ですが bend
修飾子はここでは無効です。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]])
midispeed(...)
関数の修飾子で変更できます。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]])
[<音程>,<長さ>]
という形で表されます。ここで、 <音程>
は音名か整数で、 <長さ>
は正の実数で表します。次の表は中央のオクターブについて音名と音コードの対応を示します。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]])
"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)
["||:"]
: 繰り返し記号の始め
[":||"]
: 繰り返し記号の終わり
["1."]
: 第1カッコ
["2."]
: 第2カッコ
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->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 | <実数> | 旋律がどのくらい追加されるか |
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()
midispeed(<real>)
midispeed()
midiposition(<real>)
midiposition()
instrument(<int>)
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(...)
と同じ).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()
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>)
修飾子: | 値の型 | 効果: |
channel | 0 ..15 あるいは "all" | チャンネルを選択 |
midicontrol(<int>,<int>)
midivolume
と同様です。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" 音を作り、スクリプトを書き込みます。次の図をごらん下さい。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.