この章では、MIDIの機能を使って音にさまざまな変化をつける方法を説明します。ただし、シンセサイザによってはこれらの機能に対応していないことがあります。
MIDI では、違う楽器の音色に切り替えることをプログラムチェンジと呼んでいます。Pytakt MML の中で $prog(値) と書くことでこの指示が可能です。値はプログラム番号と呼ばれる1〜128の整数で、番号での指定もできますが、下のように楽器名で指定する方が分かりやすいと思います(ただし、GM規格対応のシンセサイザでないと音色が楽器名と一致しない可能性があります)。
$prog(gm.Flute) C D E F $prog(gm.Piano1) G F E D
楽器名の一覧はこちらをご参照ください。
注意が必要なのは、プログラムチェンジはMIDIチャネル単位での指定となりますので、2つ以上の音色を同時に鳴らすためには、チャネルを別にしないといけないということです。たとえば、2声の曲に対して、各声部を別の音色で鳴らそうとして、
[{$prog(gm.Violin) C~ D~} {$prog(gm.Piano1) E F~ G}]
と書いても同じ音色でしか鳴りません。正しくは下のように各声部に対してチャネルを指定する必要があります (チャネル指定は $prog よりも先に指定してください)。
[{ch=1 $prog(gm.Violin) C~ D~} {ch=2 $prog(gm.Piano1) E F~ G}]
なお、多パートの音楽に対してパートごとにチャネルを割り当てる際のより効率的な記述法については、第8章で解説します。
音の高さを半音単位ではなく、より細かく上下させる機能としてピッチベンドがあります。Pytakt MML では、$bend(値) でこの指示が可能です。値は、-8192 から 8191 の範囲で指定し、0が中央 (本来の音の高さ)を意味します。多くのシンセサイザではデフォルトのピッチベンド範囲が +-2半音になっていますので、その場合 4096が半音に相当し、1セントあたりは約41となります。たとえば下の例では、微分音として、2番目のD#音を半音の1/2(四分音)に相当する分、ピッチを上げています。
C D D# $bend(2048) D# $bend(0) E
ピッチベンドはコンテキスト属性ではないため、{$bend(2048) D#} Eと書いても自動的に元のピッチベンド値へ戻りません。上のように $bend(0) で明示的に戻す必要があります。
プログラムチェンジと同様、ピッチベンドもMIDIチャネル単位での指定となりますので、同時に鳴る音に対して異なるピッチベンド値を指定したい場合には、チャネルを別にする必要があります。たとえば、和音のうちの1音だけピッチを少し下げたい場合は、
[C E(ch=2 $bend(-1024)) G]
のようにチャネル指定が必要です(“E(ch=2 $bend(-1024))” の部分は “{ch=2 $bend(-1024) E}” と書いても同じですが、こういう書き方も可能です)。
Pytaktでは、上で述べたプログラムチェンジ、ピッチベンドの他にも、MIDIで定義されたさまざまな音に変化をつけるための指示を提供しています(下表)。これらはすべてチャネル単位での指定となります。それぞれの詳細については、Pytakt API ドキュメントや一般的なMIDIの解説書をご覧ください。
| 指示 | 意味 |
|---|---|
$cpr(値) |
チャネルプレッシャー(アフタータッチ) |
$kpr(MIDIノート番号、値) |
キープレッシャー(アフタータッチ) |
$bank(値) |
バンクセレクト (コントロールチェンジ #0, #32) |
$mod(値) |
モジュレーションデプス (コントロールチェンジ #1, #33) |
$breath(値) |
ブレスコントローラ (コントロールチェンジ #2, #34) |
$foot(値) |
フットコントローラ (コントロールチェンジ #4, #36) |
$porta(値) |
ポルタメントタイム (コントロールチェンジ #5, #37) |
$vol(値) |
ボリューム (コントロールチェンジ #7, #39) |
$pan(値) |
パンポット (コントロールチェンジ #10, #42) |
$expr(値) |
エクスプレッション (コントロールチェンジ #11, #43) |
$reverb(値) |
リバーブデプス (コントロールチェンジ #91) |
$ped([値]) |
ダンパーペダル (コントロールチェンジ #64)。省略時の値は127 |
$pedoff() |
ダンパーペダルoff ($ped(0) と等価) |
$ped2([値]) |
ソフトペダル (コントロールチェンジ #67)。省略時の値は127 |
$ped2off() |
ソフトペダルoff ($ped2(0) と等価) |
$ped3([値]) |
ソステヌートペダル (コントロールチェンジ #66)。省略時の値は127 |
$ped3off() |
ソステヌートペダルoff ($ped3(0) と等価) |
$portaon([値]) |
ポルタメントon (コントロールチェンジ #65)。省略時の値は127 |
$portaoff() |
ポルタメントoff ($portaon(0) と等価) |
$ctrl(コントローラ番号、値) |
任意のコントロールチェンジ |
$all_sound_off() |
オール・サウンド・オフ (コントロールチェンジ #120) |
$reset_all_ctrls() |
リセット・オール・コントローラ (コントロールチェンジ #121) |
$all_notes_off() |
オール・ノート・オフ (コントロールチェンジ #123) |
“値” となっているところは、通常 0〜127 の値を埋めて使用しますが、バンクセレクトのように MSB (上位7ビット) と LSB (下位7ビット) を両方指定したいときもあると思います。そのようなときは、$bank((MSB値, LSB値)) のように書きます。
コントロールチェンジ等に対しても、時間シフトは有効ですので、たとえば、$ped()> あるいは $ped()(dt=10) のようにして少しタイミングを遅らせてペダルを踏むという指示が可能です。