「サクラ」のしおり機能
ちょっとプログラムが長くなってくると、
指定行にジャンプする機能が欲しくなる。これを実現してくれるのが「
サクラ」の
しおり機能だ。
左側タブで、しおりを選ぶと、~の行という選択ボックスが出る。ここで、プログラムの区切りになりそうな語句(例えばコメント行やCH、TRといった語句)を選択できる。
下の画像はTRを選択しているところだ。左の列挙ボタンを押すと、TRが書いてある行の一覧が出る。
ここで、ジャンプしたい所を選択(クリック)すると、その行へカーソルが移動する。これは、プログラムの編集に便利だ。
「サクラ」の雛形入力機能
「
サクラ」には、プログラムの雛形を登録しておき、この雛形を一覧表示して
選択した雛形をエディタ画面に入力できる機能がある。頻繁に使うルーチンや、覚え書き、自分の著作権情報などを登録しておくと便利だ。
この雛形は、「サクラ」をインストールしたフォルダの、/tools/template/ フォルダにテキストファイルとして保存しておく。
例えば、夢限さんが音源をチェックするために使う下のようなプログラムがある。
//---------- ここから ----------
TR(1)
CH(1) [100 n(Random(50,80))(RandomSelect(4,8))]
TR(2)
CH(1) [100 n(Random(50,80))(RandomSelect(4,8))]
//---------- ここまで ----------
これを、音源テスト.txt という名前で/tools/template/フォルダに保存しておくと、左側タブの雛形を選択した時に、下の画像のように一覧に表示される。ということは、テキストファイルのファイル名が一覧表示されるのだ。
このファイル名を選択(ダブルクリック)すれば、エディタ画面に雛形が入力される。これもなかなか便利な機能だ。
「サクラ」の単語入力補完機能
「
サクラ」のエディタには、MMLを書くための便利な機能が満載なのだが、
カーソル語の単語補完機能なんていうのも、いかにもプログラマー好みの機能だ。
MMLの仕様を大体理解していて、左側タブなんて使わなくてもスラスラ書ける人にはものすごく便利なのだ。
例えば、Random とか RandomSelect とかの単語を入力したい場合、Ra まで入力して、これを選択状態にして、
Ctrl+Space を押してみる。すると、下のような画像になるのだ。
Raで始まる単語の候補が出る。簡単なMMLの説明もあるので、後は入力したいものを選択すればよい。超便利!
「サクラ」で音色名を使う便利機能
MIDIで曲を作る場合、演奏させる楽器の種類の指定は必ずといっていいほど行う。これを@(音色番号)のように指定してもいいのだが、音源がGM音源の場合は「
サクラ」で簡単にこれを参照することができる仕組みがある。
「サクラ」の標準のインクルードファイル(stdmsg.h)には、次のような形で音色番号を音色名で参照するための定義がされている。
//_GMレベルの楽器定義
Int GrandPiano = 1 ;
Int BrightPiano = 2 ;
....
ここで定義してある音色名を、音色を確認しながら簡単に自動入力することができるのだ。
「サクラ」の左側タブにある、音色タブを選ぶと下の画像のような画面になる。ここで上の方のエリアの****系というのを選ぶと対応する音色名が下の方のエリアにずらっと表示される。
この音色名の表示をマウスでクリックすると音色を確認することができるのだ。
左ボタン・・・・・音を短く発音
中央ボタン・・・・もう一度クリックするまで発音
右ボタン・・・・ランダムな音列を発音
これは、なかなかすばらしい機能です。そして、この
音色名を右のエディタ画面にドラッグすれば、画像のように
音色名が自動入力される。
実はこの機能、サクラをインストールしたフォルダにある、/tools/voice.txt というテキストファイルを参照している。ということで、このファイルの内容を変更すれば自分仕様の音色名を使うこともできます。
「サクラ」のコマンド入力支援機能
たくさんあるる「
サクラ」のプログラム入力支援機能で、ベースになるのが
コマンド入力支援機能だ。
メニューから、
表示→左側タブの表示を選択すると、エディタ画面の左側に6つのタブが並んだ画面が表示される。ここの
システムタブを選ぶと、「サクラ」で使える全てのコマンドが参照できるようになっている。
試しに音源リセット命令のところを選んでみる。下の画像はResetGSを選択したところだ。ステータスバーには、コマンドの仕様が簡潔に表示されるのでとてもわかりやすい。
ここで、
コマンド名をダブルクリックすれば、画像のようにエディタ画面に選択したコマンドが自動入力される。「サクラ」は、本当に今風のプログラム開発環境です。
「サクラ」にMIDIキーボードで入力
「
サクラ」は本当にすばらしいソフトだ。特に、
プログラムの入力を支援する機能がたくさんある。
今日は、MIDIキーボードを使って
鍵盤で弾いた音をエディタに入力するというのをやってみる。
MIDIキーボードというのは、言っていればMIDI信号を発生させるためのマシンだ。製品としては、RolandのPCRシリーズなどが有名だ。
MIDIキーボード・コントローラー
http://www.roland.co.jp/products/dtm/PCR-M.html「サクラ」のメニューの
設定のところに、
プレーヤーと外見の設定というのがある。ここの
MIDI入力のタブのところを下の画像のよに設定する。
ここで、MIDIキーボードの鍵盤で、ドから半音毎に弾いてみる。すると、下の画像のように「サクラ」のエディタ画面に弾いた音が自動的に入力されていく。
MIDI録音の機能ではないので、ベロシティーの値などは入力されないが、「サクラ」はあくまでプログラム言語なのだから、これはこれでMMLの打ち込みには結構便利かもしれない。
「サクラ」でタイムポインタを戻す
MMLで書いた音を出していけば、音の長さの分だけタイムポインタが前に進んでいくわけなのだが、「
サクラ」には、この
タイムポインタを前に戻すというコマンドがある。
Sub{(mml)} mmlを書き込み後タイムポインタをSubの前に戻す
もう一つの方法は、マイナスの休符を作るという方法だ。休符(r)の音符属性としてマイナスの長さを指定すると、この分だけ時間を戻すことができる。
それでは早速試してみることにする。まず、Subコマンドを使って和音を作ってみる。次に同じように和音をマイナスの休符時間を使って作ってみる。最後に、ちょっとだけ時間を戻して同じフレーズを繰り返してみる。
//---------- ここから ----------
l4 Sub{cccc} Sub{eeee} bbbb
l4 cccc [4 r-4] eeee [4 r-4] aaaa
[4 l16 cdefgab`c [6 r-16] cdefgab`c [6 r-16] cdefgab`c]
//---------- ここまで ----------
進んだ時間を戻せるなんて、なんか素敵じゃないですか。これはいろんな応用ができそうです。
「サクラ」のタイムポインタ機能
五線譜というのは、ちょっと考えるとグラフになっているのがわかる。横(X軸)方向が時間で縦(Y軸)方向が音の高さだ。
で、この五線譜、Y軸は3度単位、X軸は小節単位に目盛り線が入っているので、非常に見やすい構造になっている。だから、楽譜を見て演奏をする場合は、何小節目から始めるというようなことが簡単にできるのだ
「
サクラ」には、
タイムポインタという仕組みがあり、この時間軸(X軸)の位置を直接指定できるという機能がある。
例えば、何小節目の、何拍目からといった指定を次のような書式で指定できる。
Time(小節:拍:ステップ数)また、Time(総ステップ数)という書き方も可能だ。
では、次のように書いたらどうなるかを試して見る。
//---------- ここから ----------
Time(3:1:1)
ララシー ララシー
//---------- ここまで ----------
演奏モニターには、小節:拍:ステップ数という形式でタイムポインタが表示されるので、ここを見ていると確かに3小節目から音が出る。また、エディタ画面の左下のステータスバーには、現在のタイムポインタが総ステップ数で表示される。
ちなみに、これをMIDI形式で保存して楽譜にしたのが下の画像だ。
これは、複数のパートの音楽を作る時にとても便利な機能だ。
「サクラ」で時間がどう進むか確認する
音楽の時間の進み方は、1つの音符あたりの時間を音符の数だけ合計したものだ。
「
サクラ」では、標準では
音符は4部音符(l=4)、
1音符当たりの時間は60/120秒(Tempo=120)だから、cd と書けば「ドレ」と音が鳴って時間が1秒進む。
Tempoコマンドは1分間の拍数(4部音符の数(BPM))を決める。Tempo(60)のように記述すれば、60拍で1分だから、4部音符の長さは1秒になる。
テンポ
http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%9Dさらに、この4部音符(拍)をいくつに分けるか(分解能)を
TimeBaseコマンドで指定することができる。標準では、TimeBase=96になっている。この分解能単位を
ステップタイムといい、これが「サクラ」で指定できる時間の最小単位だ。
例えば、Tempo(60)、TimeBase(100)とすれば、時間を1/100秒単位で指定できることになる。
このステップタイムで音符の長さ(時間)を指定する場合は、次のように書く。
%ステップタイムでは、ここでちょっと実験してみよう。TimeBase(100);Tempo(60)のように設定して、時計の1秒単位と同期がとりやすいようにしてみる。
最初の30秒間は、1秒毎(10秒単位)にテンポを刻み、次の30秒間は、0.1秒毎(1秒単位)に同じようにテンポを刻んでみる。これで、ちょうど1分になるはずだ。
//---------- ここから ----------
TimeBase(100);Tempo(60)
CH(10)
$b{n(34)};$c{n(33)}
Rhythm{
[3 b [9 c]]
[3 [10 b%10 [9 c%10]]]
}
//---------- ここまで ----------
こんな感じで「サクラ」でメトロノームも簡単に作れてしまう。
「サクラ」で同時に音を出すもう一つの方法
昨日は、和音を作る方法で同時に音を出してみたのだが、「
サクラ」にはもう一つ同時に音を出す方法がある。
それは、重ねる
音の長さを0にするというものだ。長さが0の音は時間が進まないので、長さが0でない音が出てくるまでの間、音が重なって出る。
それでは早速試してみよう。昨日のプログラムをちょっと修正して、ランダムな3つの音の最初の2つの音の長さを0にしてみる。最初にTinkleBell、続けてAgogoの音で演奏させてみよう。
//---------- ここから ----------
CH(1) @(TinkleBell)
l8 [10 [8 n(Random(35,81))0 n(Random(35,81))0 n(Random(35,81))]]
CH(1) @(Agogo)
l8 [10 [8 n(Random(35,81))0 n(Random(35,81))0 n(Random(35,81))]]
//---------- ここまで ----------
実は、曲を作る場合、音楽は時間でできているという概念は非常に重要なポイントだ。美術が空間の芸術だとすれば、音楽は時間の芸術なのだ。
「サクラ」のMMLで和音の機能を使ってみる
いままで「
サクラ」で複数の音を出す場合、トラックを分けてパートを作って音を出していたのだが、和音を作るMMLを使っても複数の音が出せる。
和音を作る場合は、音を'
'で囲む。例えば、cegと書けばドミソと鳴るのだが、'ceg'と書けばドミソの音が同時に鳴る。
それでは早速試してみよう。ランダムな3つの音を同時に出してみる。最初にマリンバの音、続けてパーカッションのチャンネルで演奏してみる。
//---------- ここから ----------
CH(1)
@(Marimba)
l8 [10 [8 'n(Random(35,81))n(Random(35,81))n(Random(35,81))']]
CH(10)
l8 [10 [8 'n(Random(35,81))n(Random(35,81))n(Random(35,81))']]
//---------- ここまで ----------
複数の音が同時に鳴ると、なかなかにぎやかな演奏になる。
「サクラ」のリズムモード
「
サクラ」には、パーカッションパートのMMLを書きやすくするために
リズムモードという仕組みがある。
リズムモードというのは、
任意のアルファベット1文字に、マクロ文字列を割り当てることができるというものだ。楽器名をイメージしやすい1文字に、そのパーカッションの音を出すためのノート番号を割り当てれば、格段にプログラムが書きやすくなる。
リズムモードにするには、次のようなブロックを作る。
Rhythm{ ~~ }それでは、楽器名でノート番号を参照して、これを1文字に割り当ててリズムモードにして演奏させてみる。
//---------- ここから ----------
CH(10)
$b{n(Kick1)};$s{n(Snare1)};$h{n(ClosedHiHat)};$c{n(CrashCymbal1)}
Rhythm{
l8 [4 cccc ssss hhhh bbbb]
}
//---------- ここまで ----------
プログラムが書きやすいだけでなく、プログラムの視認性も格段に上がる。
「サクラ」で複数のドラムセットを使う
実は、パソコンの内蔵音源(
Microsoft GS Wavetable SW Synth)は、ドラムセットを
同時に2つまで使うことができる。
「
サクラ」では、
gs.hという名前のインクルードファイルに、この機能を実現するための
GS_RHYTHM()という関数が定義されている。
GS_RHYTHM(n) ・・・・ n = 0~2
また、ResetGSと同様に、この
コマンドの後には必ずある程度の休符が必要だ。
それでは、CH(10)とCH(11)を使って、StandardSetとStandardSetの音を同時に出してみる。
//---------- ここから ----------
Include(gs.h)
ResetGS r4
TR(1) CH(10) GS_RHYTHM(1) r4
@(StandardSet) For(Int I=27; I=<88; I++){[4 n(I)]}
TR(2) CH(11) GS_RHYTHM(2) r4
@(OrchestraSet) For(Int I=27; I=<88; I++){[4 n(I)]}
//---------- ここまで ----------
「サクラ」でGS音源のパーカッションを聴く
前にも書いてみたのだが、パソコンの内蔵音源(
Microsoft GS Wavetable SW Synth)には、標準のドラムセットの他、
GS音源で使われる全部で
9種類のドラムセットの音色が入っている。これらのドラムセット番号の一部は次のような名前で参照できる。
StandardSet(#1)
RoomSet(#9)
PowerSet(#17)
ElectronicSet(#25)
AnalogSet(#26)
JazzSet(#33)
BrushSet(#41)
OrchestraSet(#49)
9種類のドラムセットの中から、#25のELECTRONICセット、#49のORCHESTRAセット、#57のSFXセットの音を「サクラ」で聴いてみる。
//---------- ここから ----------
ResetGS r4
CH(10)
@(ElectronicSet) For(Int I=27; I=<87; I++){[4 n(I)]}
@(OrchestraSet) For(Int I=27; I=<87; I++){[4 n(I)]}
@(57) For(Int I=27; I=<87; I++){[4 n(I)]}
//---------- ここまで ----------
各セットで微妙に違うが、StandardSetと同じ音色のノート番号もあるようだ。
「サクラ」で内蔵音源のパーカッションを聴く
昨日は「
サクラ」でGM音源で定義されているパーカッションの音を聴いてみたのだが、パソコンの内蔵音源(
Microsoft GS Wavetable SW Synth)には、
ノート番号27~87まで楽器が定義されている。
GM音源(35~81)以外の楽器は、次のようになっている。
Note# 27 High Q
Note# 28 Slap
Note# 29 Scratch Push
Note# 30 Scratch Pull
Note# 31 Sticks
Note# 32 Square Click
Note# 33 Metronome Click
Note# 34 Metronome Bell
Note# 82 Shaker
Note# 83 Jingle Bell
Note# 84 Bell Tree
Note# 85 Castanets
Note# 86 Mute Surdo
Note# 87 Open Surdo
それでは、GM音源で定義されている以外のパーカッションがどんな音がするかを全部の楽器について順に聴いてみることにする。
//---------- ここから ----------
CH(10)
For(Int I=27; I=<34; I++){[4 n(I)]}
For(Int I=82; I=<87; I++){[4 n(I)]}
//---------- ここまで ----------
なお、ノート番号はパーカッション名で呼べるように「サクラ」で定義されている。
ドラムノート番号を定義
http://oto.chu.jp/doc/command/index2.htm#cmd19
「サクラ」でパーカッションの音を出すには
GM音源では、
チャンネル10がリズム楽器チャンネルに設定されている。「
サクラ」でも、10チャンネルに音を出すと、ノート番号毎に定義されているパーカッション楽器の音が出る。
ノート番号(35~81)と楽器の対応は、次のようになっている。また、パーカッションは予めパンの位置が決まっている。
GMパーカッション音色とノート・ナンバー対応一覧
http://dspss.iamas.ac.jp/files/GM-percussions.pdfそれでは、GM音源のパーカッションがどんな音がするかを全部の楽器について順に聴いてみることにする。
//---------- ここから ----------
CH(10)
For(Int I=35; I=<81; I++){
[4 n(I)]
}
//---------- ここまで ----------
結構いろんなパーカッション楽器が定義されている。
「サクラ」の音符属性のRandomオプション
「
サクラ」の音符属性オプションには、ランダムな値を指定することにより演奏表現を曖昧にする
.Randomオプションというのがある。
値をランダムで曖昧にする(.Random)
http://oto.chu.jp/doc/reference/note-option.htm#.Randomコマンド.Random(n)nを0以上に設定すると、nの値に応じてそれ以降の値がランダムに変化する。
早速試してみよう。最初の8小節をRandomなし、次の8小節をRandomありて演奏してみる。
//---------- ここから ----------
v.Random(0) @(Violin)
[8 [4 n(Random(50,80))]]
v.Random(80) @(Violin)
[8 [4 n(Random(50,80))]]
//---------- ここまで ----------
Randomありでは、機械が演奏している感じがなくなり、人が演奏しているようにに聞こえてしまう。
「サクラ」の音符属性のonTimeオプション
昨日は、「
サクラ」の音符属性の.onNoteオプションを試してみたのだが、今日は、音符属性オプションの.onTimeを試してみることにする。
onTimeというのは、指定された時間単位の間で、指定の範囲の値を連続的に変化させるというもだのだ。
時間ごとの先行指定(.onTime)
http://oto.chu.jp/doc/reference/note-option.htm#.onTimeコマンド.onTime(低値, 高値, ステップ値)n分音符時間指定がしたいときは、!nのように指定する。
早速試してみよう。音量を1小節毎に小→大に順次変えて演奏してみる。次に、逆に大→小に順次変えてみる。
//---------- ここから ----------
v.onTime(40,120,!1)
[6 [4 n(Random(50,80))]]
v.onTime(120,40,!1)
[6 [4 n(Random(50,80))]]
//---------- ここまで ----------
なかなかいいですねー。動かす範囲をなめらかにしたい場合はonNoteよりも便利かもしれない。
「サクラ」の音符属性オプションを使ってみる
昨日は、「
サクラ」のコントロールチェンジの先行指定という機能を試してみたのだが、この
先行指定という考え方は音符属性でも使うことができる。
音符属性オプション
http://oto.chu.jp/doc/reference/note-option.htm音符属性といのは、音符毎にボリュームやゲートタイムを指定できるというものだ。
音符属性
http://oto.chu.jp/doc/command/index2.htm#cmd1音符属性オプションでは、このうち、
o l q v t についてオプション指定ができる。
今日は、
ノートオン毎の値の先行指定を試してみる。
ノートオンごとの先行指定(.onNote)
http://oto.chu.jp/doc/reference/note-option.htm#.onNote音量を4段階に順次変えて演奏してみる。
//---------- ここから ----------
v.onNote(60,80,100,120)
[8 [4 n(Random(40,90))]]
//---------- ここまで ----------
「サクラ」のコントロールチェンジオプション
今日は、
コントロールチェンジの値を一定のロジックで変化させる「
サクラ」のコマンドを試してみる。
例えば、音の定位を決める
パンポットの値を細かく動かせば結構面白い効果が出せるような気がする。しかし、この値を、音符毎に指定するのはかなり面倒だ。
そんな時に役に立つのが、「サクラ」の
コントロールチェンジオプションだ。
コントロールチェンジオプション
http://oto.chu.jp/doc/reference/cc-option.htmこの中で、コントロールチェンジの値の
先行指定というのを試してみる。先行指定というのは、
値を変えるロジックをあらかじめ指定しておくといものだ。
発音している音毎に値を指定する場合の書き方
コマンド名.onNote( 値1,値2,値3... ) 一定間隔ごとに値を指定する場合の書き方
コマンド名.onCycle( 周期, 値1,値2,値3... )コマンド名
http://oto.chu.jp/doc/reference/cc.htm周期はステップ時間を指定するのだが、、
!nと書くとn分音符の時間がステップ時間に変換される。
値は、各コマンド毎に決められている範囲の値を指定する。
それでは、早速試してみる。最初に音の定位を音毎に左右に振って、8小節演奏する。次に、1小節(1部音符)毎に、音の定位を左、中央、右と変化させながら、8小節演奏する。
//---------- ここから ----------
Panpot.onNote(0,127)
[8 [4 n(Random(40,90))]]
Panpot.onCycle(!1,0,64,127)
[8 [4 n(Random(40,90))]]
//---------- ここまで ----------
モニター画面で確認すると、PANの値が指定通りに変化するのがわかる。「サクラ」の先行指定という考え方は、プログラミングのテクニックとしてとても良いアイデアだと思う。
「サクラ」のメタイベント記述コマンド
MIDIファイルには、演奏の他に、曲のタイトルや著作権情報などの付加情報を記録できる。これらの情報は、
メタイベントと呼ばれる。
「
サクラ」では、このメタイベントを次のようなコマンドで指定できる。
メタイベント
http://oto.chu.jp/doc/command/index2.htm#cmd5このうちのいくつかは、昨日試してみた楽譜印刷ソフト「Score Grapher View」に反映させることができる。
拍子記号を設定
http://oto.chu.jp/doc/command/57.htm曲名を書き込む
http://oto.chu.jp/doc/command/61.htm早速、この二つをプログラムに追加して「
Score Grapher View」でどんな感じに表示されるか試してみる
//---------- ここから ----------
TimeSignature=4,4
TrackName={"夢限作品集 No.1"}
TR(1) @(Violin)
[100 n(Random(60,90))(RandomSelect(4,8))]
TR(2) @(Flute)
[100 n(Random(60,90))(RandomSelect(4,8))]
//---------- ここまで ----------
「Score Grapher View」で表示させてみたのが下の画像だ。
これで少しかっこいい楽譜になってきた。この楽譜、表示されている通りにきれいに印刷することができる。また、パート毎に表示・印刷することも可能だ。
実はこの「Score Grapher View」、表示されている楽譜を演奏させることもできるのだ。パート毎の音色も表示されるし、ミュートやソロ、ボリュームや定位を変更して演奏させることも可能だ。
「Score Grapher View」は、MIDIプレーヤーとして使っても面白い。
「サクラ」のMIDIデータで楽譜を作成
ここ暫く「サクラ」を使った音楽プログラミングシリーズをやっている訳だが、この「
サクラ」で作曲?した作品を楽譜にできたらなんか楽しい。
「
Score Grapher View」というソフトを使えば、「サクラ」で作った曲を簡単に楽譜にすることができる。
http://www.rimshot.co.jp/download/sgvdl.htmlまず、このプログラムを「サクラ」に入力して、
MIDI形式で保存する。
//---------- ここから ----------
[100 n(Random(60,90))(RandomSelect(4,8))]
//---------- ここまで ----------
「Score Grapher View」を立ち上げて、保存したMIDIファイルを「Score Grapher View」の画面にドラッグすると、下のような楽譜が表示される。
なんか、これは本当に作曲したような気分になります。
「サクラ」でGSのドラムセットを使う
GM音源では
チャンネル10をドラム専用に使うことになっている。GS音源でも標準ではチャンネル10がドラムになる。
さらに、GM音源ではドラムセットが1つしかないのだが、GS音源では
9つのドラムセットががある。ドラムセットというのは、いくつかのパーカッションの楽器をまとめたもので、
どのパーカッションの音を出すかはノート番号で指定する。(従って、パーカッションには音程がないということになる)また、
どのドラムセットを使うかは音色番号で指定できる。
内蔵MIDI音源(Microsoft GS Wavetable SW Synth)にも9つのドラムセットが用意されていて、「
サクラ」で各ドラムセットを指定する場合は次のようにする。。
@1 //STANDARD
@9 //ROOM
@17 //POWER
@25 //ELECTRONIC
@26 //TR-808
@33 //JAZZ
@41 //BRUSH
@49 //ORCHESTRA
@57 //SFX
ところで、@49のORCHESTRAセットのノート番号41~53には、Fから1オクターブ上のFまで、半音毎のティンパニーの音が入っている。(ティンパニーには音程があるから複数のノート番号を使う)
今日はこのティンパニーの音を聴いてみることにする。
//---------- ここから ----------
Include(gs.h)
ResetGS r4
CH(10)
@49 [100 n(Random(41,53))]
//---------- ここまで ----------
確かにティンパニーの音が鳴り響く。しかもなかなかいい音だ。
「サクラ」でGSの音色定義を使う
GM規格の128音色というのは、資料がたくさんあったりMIDI関係のソフトで確認できたりするのだが、内蔵MIDI音源(Microsoft GS Wavetable SW Synth)が持っている256音色がどんな音色セットになっているのかは詳しい資料がない。
内蔵MIDI音源(Microsoft GS Wavetable SW Synth)は、GS音源の規格を作ったRolandとマイクロソフトとが提携して開発した音源で、Windows95が出た頃にRolandが発売した
VSC-55というソフトシンセが元になっているという。
ところで、「
サクラ」をインストールしたフォルダの中にある Include フォルダ に
voice-gs-sc55.h というファイルがある、
このファイルをみると、Roland SC-55 音色リスト とコメントされている。この定義ファイルを使えば、GSモードの256音色を簡単に使えそうだ。
早速、いくつかの音色を試してみることにする。
//---------- ここから ----------
Include(voice-gs-sc55.h)
ResetGS r4
@(SC55_ChoirAahs2) l2 cdefg^
@(SC55_AnalogBrs1) l2 cdefg^
@(SC55_EchoPan) l2 cdefg^
@(SC55_TaishoKoto) l2 cdefg^
@(SC55_Rain) l2 cdefg^
@(SC55_Wind) l2 cdefg^
@(SC55_Dog) l2 cdefg^
@(SC55_WindChimes) l2 cdefg^
@(SC55_Laughing) l2 cdefg^
@(SC55_Footsteps) l2 cdefg^
//---------- ここまで ----------
犬の鳴き声や人の笑い声といった、ちょっと面白い音色も入っている。
「サクラ」でGSの256音色を使う
WIndowに標準でついている内蔵MIDI音源(Microsoft GS Wavetable SW Synth)を
GSモードにすると可能がことが他にもある。GM規格の128音色を
256音色に拡張できるのだ。
音色の指定はコントロールチェンジ#0(
バンクセレクト)を使い次のようにして行う。
y0,msb @voice次のように省略形で書くこともできる、
@voice,msb早速音色番号81(Square Wave)と82(Sine Wave)で試してみる。
//---------- ここから ----------
ResetGS r4
@81,0 l2 cdefg^
@81,8 l2 cdefg^
@82,0 l2 cdefg^
@82,8 l2 cdefg^
//---------- ここまで ----------
バンク0では、81(Square Wave)82(Sine Wave)なのだが、バンク8では、81(Sine Wave)82(Doctor Solo)になる。
ResetGSコマンドを書かなかった場合は、両方とも81(Square Wave)82(Sine Wave)になる。
「サクラ」で内蔵音源をGSモードにする
昨日試したスケールチューニングの機能について、WIndowに標準でついている内蔵MIDI音源では使えないと書いてしまったのだが、実は使えることがわかった。
というのは、WIndowに標準でついている内蔵MIDI音源(
Microsoft GS Wavetable SW Synth)は、
初期状態ではGMモードになっているのだという。
GSって名前が付いているからGSモードかと思っていたのだが、さすがというか世界標準のGMになっているのだ。(GSはRolandの基準)
ということで、GSモードにする方法なのだが、GSをリセットするシステム・エクスクルーシブ・メッセージを送ればGSモードにすることができる。
「
サクラ」では次のコマンドを書けば良い。
ResetGS昨日のプログラムの先頭にResetGSコマンドを入れて、音源をGSモードにして、スケールチューイングのシステム・エクスクルーシブ・メッセージが有効になるか確認してみる。
//---------- ここから ----------
ResetGS r4
TR(1) l2 cdefgab>c<
TR(2) l2 cdefgab>c<
SysEx$=F0,41,10,42,12,40,12,40,40,22,44,50,32,3E,36,42,24,30,4E,34,3B,F7
TR(1) l2 cdefgab>c
TR(2) l2 cdefgab>c
//---------- ここまで ----------
確かに音程がずれる。トラック2は純正律にチューニングされたようだ。
ResetGS の後に書いてある休符 r4 は、実は重要だ。ResetGSコマンドの処理にはMIDI音源の方で多少の時間が必要なのだ。ということで、音を出す前に休符を書いておくというのがプログラミングの定石だ。(休符を入れないとリセットコマンドが有効にならなかった)
「サクラ」でスケールチューニング
昨日は、
システム・エクスクルーシブ・メッセージを使ってMIDI音源の「マスターチューニング」の実験をしてみたのだが、このシステム・エクスクルーシブ・メッセージを使うと、MIDI音源を純正律などにトラック単位で調律(
スケールチューニング)することができる。
この方法は前に試したピッチベンドを使う場合と違い、音源の機能に依存するので汎用的とは言えないが、コマンド一つでスケールを変えることができるというのは魅力的だ。
スケールチューニングの System Exclusive Code の作り方
http://forum.nifty.com/fmidicla/htmls/kotenj.html#scale早速「
サクラ」で試してみよう。トラック2を純正律にするシステム・エクスクルーシブ・メッセージを送り、トラック1の平均律と一緒に鳴らして、純正律と平均律ではどのぐらのずれがあるのかを聴いてみることにする。
//---------- ここから ----------
TR(1) l2 cdefgab>c<
TR(2) l2 cdefgab>c<
SysEx$=F0,41,10,42,12,40,12,40,40,22,44,50,32,3E,36,42,24,30,4E,34,3B,F7
TR(1) l2 cdefgab>c
TR(2) l2 cdefgab>c
//---------- ここまで ----------
WIndowに標準でついている内蔵MIDI音源やVSTiには、スケールチューニングの機能がない。
そこで、この機能も手持ちのソフトGS音源、バーチャル・サウンド・キャンバス(VSC-88)で試してみた。
確かに、EとAの音が純正律と平均律ではかなり違っているのがわかる。
ところで、このスケールチューニング用のシステム・エクスクルーシブ・メッセージ、昨日のマスターチューニング用のシステム・エクスクルーシブ・メッセージよりさらにプログラムするのが難しいのだが、「 MIDIスケールチューナー」というソフトを使えば簡単に作ることができる。
MIDIスケールチューナー
http://www1.plala.or.jp/tete009/software.html#SCALETUNE
「サクラ」でマスターチューニング
MIDI規格には、MIDI音源にメーカー固有のデータを送るために
システム・エクスクルーシブ・メッセージという規格がある。
このエクスクルーシブメッセージを使うことにより、音源をリセットしたり、エフェクトの種類を決めたり、そのエフェクトに用意されているパラメータの値を設定したりする等、その音源特有の機能を利用できる。
エクスクルーシブメッセージは、F0Hから始まりF7Hで終わる。F0Hの次にメーカーIDの情報があり、データの長さは決まっていない。
エクスクルーシブ メッセージ
http://www.pluto.dti.ne.jp/~daiki/Midi/AboutMidi_Exclusive.html例えばRoland社の「GS音源をリセット」するシステムエクスクルーシブメッセージは次のようなものだ。
F0 41 10 42 12 40 00 7F 00 41 F7
「サクラ」にも、このシステム・エクスクルーシブ・メッセージをMIDI音源に送るためのコマンドが用意されている。
SysExを書き込む
http://oto.chu.jp/doc/command/44.htm確かに「サクラ」の標準のIncludeファイル(stdmsg.h)を見ると、ResetGSコマンドは次のように定義されている。
Function ResetGS(){
SysEx$=F0,41,(DeviceNumber),42,12,40,00,7F,00,41,F7;
SoundType = 1;
}
ところで、MIDI音源によっては、このシステム・エクスクルーシブ・メッセージを送ることにより標準のピッチ(440Hz)を任意に変える(
マスターチューニング)ことができるようになっている。「MIDI音源によっては・・・」というところがポイントで、要するに機種に依存している機能だ。
さて、マスターチューニング用のシステム・エクスクルーシブ・メッセージをどうやって作る(プログラムする)かだがこれが結構難しい。
ところが、こんな面倒なプログラミングの悩みを解決してくれるソフトを作ってくれた人がいる。
MIDIマスターチューナー
http://www1.plala.or.jp/tete009/software.html#MASTERTUNE早速、このソフトを利用してマスターチューニング用のシステム・エクスクルーシブ・メッセージを作ってみた。
MIDI音源のピッチは標準で440Hzになっている。そこで、ピッチを430Hzにするシステム・エクスクルーシブ・メッセージを送り、実際に音が下がるかどうか確かめてみる。
//---------- ここから ----------
TR(1) l2 cdefgab>c<
SysEx$=F0,41,10,42,12,40,00,00,00,02,07,02,35,F7
TR(1) l2 cdefgab>c
//---------- ここまで ----------
ところで、WIndowに標準でついている内蔵MIDI音源は、このマスターチューニングの機能がない。sfzなどのVSTインストゥルメントも、VSTiの仕様によりシステム・エクスクルーシブ・メッセージを扱うことはできない。
そこで、手持ちのソフトGS音源、バーチャル・サウンド・キャンバス(VSC-88)で試してみることにする。
バーチャル・サウンド・キャンバス3
http://www.roland.co.jp/products/dtm/VSC-88H3.html
http://www.roland.co.jp/products/dtm/VSC-MP1.html
確かに指定したピッチで演奏される。これで、どんなピッチの楽器ともシンセを合奏させることができる。
「サクラ」でダンパーを使ってみる
ピアノには、
ダンパーペダルといのが付いている。ダンパーペダルというのは、踏み込むとダンパーが弦から離れるという極めて簡単な機構なのだが、これを上手く使うとピアノという楽器に無限の音の変化が生まれる。
このダンパーペダルの機能は、MIDIのコントロールチェンジ番号64(ホールド)を使うことによりMIDI音源でも実現できる。
コントロールチェンジ早見表
http://oto.chu.jp/doc/reference/cc.htm「
サクラ」のコマンドでは次のように指定する。
y64,n (n=0~127)
0がペダルを踏んでいない状態、127がもっとも踏み込んだ状態になる。
それでは、早速試してみることにする。最初の20音がペダルを踏んでない状態、次の20音がペダルを踏み込んだ状態、次にペダルを踏んだり離したりした状態で演奏させてみる。
//---------- ここから ----------
[20 @(GrandPiano) y64,0 n(Random(40,80))]
r1[20 @(GrandPiano) y64,127 n(Random(40,80))]
r1[60 @(GrandPiano) y64,(RandomSelect(0,64,64,127,127)) n(Random(40,80))]
//---------- ここまで ----------
何か急に本当にピアノを弾いている感じになる。
「サクラ」で音の長さをステップで指定
「
サクラ」で音の長さを指定する場合、今までは音符の長さで指定してきた。
音の長さをn分音符で指定
http://oto.chu.jp/doc/command/0.htmしかし、これだと付点16部音符までは指定できるのだが、それより細かい指定や全音符より長い音の指定ができない。
ところで、「サクラ」には
ステップ値指定で長さを指定する方法がある。
ステップ
http://oto.chu.jp/doc/faq/help17.htmこれを使えば、エフェクトのような特殊効果でn分音符では表現できない中途半端な長さを表現したりできる。
ステップの音符あたりの分解能は、標準では
四分音符=96ステップになっている。ということは、下の2つは同じ長さを指定したこといなる。
c2 d2 e2 f2 g2
c%(96*2) d%(96*2) e%(96*2) f%(96*2) g%(96*2)
この、四分音符=96ステップという分解能力は次のコマンドで変更することも可能だ。
タイムベース(四分音符分解能)を設定
http://oto.chu.jp/doc/command/68.htm四分音符で96ステップの分解能があれば、標準の設定で十分な感じだ。
では、早速試してみよう。ステップ数をランダムな値にして、わざと騒々しさを作ってみる。
//---------- ここから ----------
TR(1) @(2) [100 n(Random(40,80))%(Random(60,120))]
TR(2) @(2) [100 n(Random(40,80))%(Random(60,120))]
TR(3) @(2) [100 n(Random(40,80))%(Random(60,120))]
TR(4) @(2) [100 n(Random(40,80))%(Random(60,120))]
//---------- ここまで ----------
思わず、ウルサーイ!って叫びたくなる。ランダムさ加減も絶好調だ。
「サクラ」で音にエコーをかけてみる
昨日は、GM音源にあるリバーブの機能を使って音に残響をかけてみたのだが、リバーブ機能がない音源の場合でもエコーが付けられるテクニックがある。
方法は、同じ音をちょっとタイミングをずらして出せばよい。この場合、エコーになる方の音量を相対的に小さくしたり、出る音の位置(パン)をずらしたりすればそれっぽい感じになる。
3~4つのトラックを使ってエコーになる音を微妙にずらせば、より複雑な残響を付けられると思うが、とりあえずエコーになるトラックを一つだけにして実験してみる。
最初20個の音は残響なしにして、エコーの効果がどのぐらい出るか試してみる。
//---------- ここから ----------
Function Compose(Nno,Nmin,Nmax){
System.RandomSeed=2006
For(Int I=1; I<=Nno; I=I+1){
n(Random(Nmin,Nmax))(RandomSelect(4,8))
}
}
TR(1) @(Flute) P(000) v(120) Compose(20,60,90) r00 Compose(80,60,90)
TR(2) @(Flute) P(127) v(80) Compose(20,60,90) r16 Compose(80,60,90)
//---------- ここまで ----------
1つのエコーだけでも結構きれいな残響に聞こえる。音源のリバーブ機能を使っていないので、このテクニックならWindosパソコンの内蔵MIDI音源でも使える。