zmc2/zmc3の拡張部分

 zmc2とzmc3では、オリジナルのZ-MUSIC V2/V3で不便だった部分をいくつか拡張してあります。以下、具体的に拡張部分の説明をいたします。
 zmc3のみでの拡張については、[zmc3]という但し書きがついています。
 なお、一部を除きzmdフォーマット自体の拡張は行っておりませんので、 従来のzmdプレーヤやコンバータなどはそのまま お使いいただけるはずです。

既に実装済みのもの

qコマンドによるゲートタイムの先行指定
 ベロシティシーケンスのゲートタイム版。 ベロシティシーケンスと同様に、 q8,7,5,-2,*20などと ゲートタイムのレートを先行指定出来ます。 (q-2 は gateは stepの2/8増の意味(V3と同じ)で、 *20は gate ← 20とみなす。ただしV2ベースなので step < gateな指定は意味なし)
ベロシティシーケンスの先行個数の制限解除
 まんまです。
ポルタメントを行頭で利用可能
 V2でポルタメントを行頭で使って怒られて、 カチンと来たのは私だけではないはず。
(注) さすがにこれはV3では改善されていますけどね。
和音のベロシティ指定の拡張
 従来'...'という和音コマンドがありましたが、 構成音のベロシティを別々に指定することができず、 凝ったデータを作ろうとする場合にはまったく使いものになりませんでした。
# z100,+10,+10 c*0&e*0&gなどとする必要があった。
 zmc2では新たに"..."という和音コマンドを追加しており、 例えばz100,+10,+10 "ceg" などとすればc,e,gそれぞれに 別々のベロシティが 割り当てられます。なお、↓な指定法も同様に有効です。
ディレイ付き和音の鳴らし方の拡張
 和音のディレイ値に負の値を指定できるようにしました。その場合、 構成音が指定の逆順に発音されます。つまり、'c4eg',-3 とすると'g4ec',3 と同じ鳴り方となります。ギターのストロークプレイにどうぞ。
@g12以外の環境でのポルタメントやオートベンドの辻褄合わせ
 @g12以外の時、 本家ではポルタメントが正しく機能しませんでしたが、 勝手に不都合が生じないようにしちゃいました。 (我孫子さんthanks!)
# この部分は本家とは非互換となりますが、 問題となるような既存データはほとんどないと思っています。
GS音源使用時の @e の第3パラメータ
 従来@eの第3パラメータは、 zmdには反映されるものの演奏ドライバが無視していました (ZMDフォーマットの該当部分は「未使用」となっている)。 今回これをエフェクタのディレイパラメータとして使用するようにしました。 (これに伴いZtoMも修正しました)
# まあ、ZMDを拡張したといえばそういう事になるかなぁ...
ループコマンドの不具合修正
 従来 |: c | :| とすると、 |: c |: | と解釈されておりましたが、 これを修正してあります。 ついでに、ネストの段数制限も解除してあります。
マクロ
 zmc2でも、 V3相当程度のマクロを利用できます。
全音符の分解能の拡張
 V2では全音符の分解能を最大255までしか指定できませんでしたが、 (ztomと併用するという前提で)それ以上の数も指定できるようにしました。 384,480,960などの一般的な分解能がが指定可能です。
 ただし、この拡張を利用するとzmdのバージョンが0xF0となり、 オリジナルのZ-MUSICとコンパチでなくなります。
 なお、V3では最初から1〜32767が指定できるため特に問題とはなりません。
{}(連符)で使用できる音符の数の制限解除
 従来は、48連符以上細かくすることは出来なかったようです。 しかし、無制限にしたところであまり意味はないかも。
{{..}}による総利用音長の予約
 例えば {{ c4e4g4<c4 }}*192 などとすると、 {{ .. }} の中にある音符が全部あわせて全音符分になるかをチェックしてくれるという機能です。 {{..}}内の総音長(c4e4g4<c4)と予約音長(*192)が一致しない場合はWarningを出力します。
 {{c4e4g4<c4}}1 という表記や、 {{c4e4g4<c4e4}}1^4 と言う表記も可能です。 ネストも出来ます。和音や連符、ループを中に入れても構いません。

 ギターソロ等を入力していると途中で何tick分入力したか分からなくなってしまうといったことが多いかと思いますが、 この機能を使うことにより、 他のトラックとずれが生じるのを簡単に、未然に防ぐことが出来ます。

 更に[zmc3]では、 予約音長に利用音長が満たない場合に限り自動で休符を補うようにもできるようになりました。

 この拡張は我孫子さんの非常に有用な提案により実装されました。 感謝!

ベロシティの揺らぎ
 ベロシティ指定を拡張して、u100:20 とすると、 100±20のベロシティがその時々でランダムにアサインされるようにしました。 揺らぎをオフにする場合には例えば u100:0 と指定して下さい。 勿論ベロシティシーケンスでも同様の方法で利用可能です。 デフォルトでは揺らぎオフです。
ベロシティの補正
 [VELOCITY.REVISE type, power] とすると、 「音長が短くなればなるほどマイナス方向にベロシティを補正する」ようになります。 typeが補正曲線指定(0=log曲線補正 1=線形補正1 2=線形補正2)で、 powerが補正の強さ(0で補正オフ)です。
 デフォルトでは補正オフ。 ベロシティの揺らぎと併用すると効果的です。
 具体的な補正式は下記の通りです。(pがpower, Zが全音符の分解能)
type補正値計算式
0 -p * log_2(Z / step)
1 -p * Z / step
2 -(Z / step / p)
8 -p * log_2(Z / step / 4)
16 直前のstepが今のstepの半分より大きい時のみ type0の補正
24直前のstepが今のstepの半分より大きい時のみ type8の補正
 例えばZ=192,power=7の場合、以下の補正がかかります:
step1929648 24126
補正type00-7-14 -21-28-35
補正type10-7-28 -56-112-127
補正type20-7-14 -21-28-35
補正type8+14-70 -7-14-21
 その他のtypeについては、思い付き次第おいおい実装していきます(^^;
バックグラウンドでの演奏
 単一トラックで、 「このコードを鳴らしつつ別の主旋律を演奏する」 といった場合に用います。 わざわざ別トラックを確保してmmlを記述するのがおっくうな場合や、 2trk分の情報を1trkに詰め込んだ方が記述しやすい場合...例えばギターの演奏やキーボードの右手左手同時演奏など...に便利です。
[back 'c1eg'] gag<c
などとすると、演奏上は
(t1)gag<c
(t2)'c1eg'
のようになります。
 直前の[back...]の演奏が終わっていないのに次の[back...]が現れるとWarningを出します。 この場合期待される演奏とはなりませんのでご注意下さい。
例: [back c1] c4 [back d1] / c1の演奏終了前にd1が来る
# 内部的には、 ダミートラックとそこへの同期送信という形で実現されています。 従って、コンパイル後出力されるトラック数は増えます。
[back.repeat ...]コマンドの追加
 [back...]に関連して、 繰り返し等の演奏制御系コマンドを裏トラックにも出力します。
 パラメーターには1,0,ON,OFFを指定できます。パラメーター省略時 ([back.repeat])は1(on)とします。初期値は0(off)です。
 以下のコマンドが影響を受けます。
|: |n | :|
[d.c.][segno][$][d.s.][coda][tocoda][*][fine][^][do][loop]
[end][!][@]
例:
[back.repeat on] |: [back eg] ce :|

(t1) |: w2 ce :|
(t2) |: w eg :|
相当の出力が得られます。 (Mamiyaさんthanks!)
[gatetime_resolution n]の追加 [zmc3]
 共通コマンド部で.gatetime_resolution nが使用できるだけでなく、 トラック内の任意の箇所でゲートタイムレート? (MML Qの分解能) を変更できます。
# となると当然次は全音符の分解能を動的に変更したくなりますが、
# そこまではまだやってません。
[ARCCn.offset] [velocity.offset]の追加 [zmc3]
 ARCCの1/8モード時などで、 一旦@a100,90,80,70 などとやってしまった後で、 全体を10下げたいなどと言う場合がしばしばありますが、 従来は全パラメータを書き直す、もしくは2つ目の引数以降を相対指定し、 最初のパラメータのみ書き直す必要がありました。いずれにせよ、 非常に面倒です。
 そんなときに[ARCC1.offset -10]とすれば、 全体の指定値を-10できます。 [velocity.offset]も同様です。 (我孫子さんthanks!)
[ch_fader]の引数にALLをつけたときの動作 [zmc3]
 従来では単にALLとすると内蔵音源を含む全デバイスに対するフェーダ操作となりましたが、 zmc3/z2m3では単に全MIDI楽器に対する操作となります。
 また従来MIDI-ALLという指定はできませんでしたが、 zmc3ではそれを可能にしています。 (muteさんthanks!)
XG音源専用命令, MU100専用命令の追加 [zmc3]
 v0.79現在、以下の命令がすでに実装されており、 今後も随時追加されていく予定です。
# しかし作者はXG音源を持っていません・・・ (muteさんthanks!)
SC-88Pro専用命令の追加・・・・Coming soon [zmc3]
トラック宣言なしでの演奏トラック記述 [zmc3]
 いきなり演奏トラックのmmlを書き始めた場合、 (AMIDI1,1)(t1) が省略されているものと見なすようにしました。 つまり、いきなり
---ここから---
cdefg
---ここまで---
		
と書いてもエラーとならず、チャンネル1から音が鳴ると言うことです。

 同様に、(AMIDIn,n) (トラック番号とチャンネル番号が等しい)を省略できるようにもなっています。 つまり、いきなり

(t1)cdefg
(t2)ab<c
なんて書いても問題ないと言うことです。

 ただしちょっと制限があって、 このように(AMIDI..)が省略された場合は、 [back..]がうまく機能しません。とほほ。

音色指定を、音色名で行える [zmc3]
@"機種 音色" とか、 [PROGRAM 機種 音色] といった具合に、 音色名で直接音色指定ができます。いちいち音源のマニュアルを参照して、 音色名から音色番号に頭で変換する必要がなくなります。
(その代わりに、音色名を(マニュアル表記に沿って)正確に覚える 必要がでてきますが・・・)

 例えば、以下のように用います。

(省略名の代わりに、フルネームでも可)

 今のところ、機種名は8p/88/55/ mt/xg/mu100を受け付けます。 SC系については、8pとする以外に、 SC88ProとかSC-88 Proとかでも受け付けます。 ただし、CM64音色は未サポートです。(やたら音色名がだぶるので・・)

 大文字小文字やらスペースの有無やらハイフンの有無やら (Honky-tonkとHonky tonkなど)ピリオドの有無などの類は無視されます。 また、XG音色の場合は、省略名の指定・ フルネームの指定どちらでも受け付けます。

 機種名を省略した場合、@iで設定された機種情報をにらみつつ (でないと単に "Violin"と言われた場合GS/XGなどの区別ができないので)、 バンクセレクトのLSBを0にした音色を設定します ・・・となる予定なんですが、 v0.79現在ではエラーとしてはじいています(^_^;

 ちなみに、音色リストについては以下を参考にしました。

  その他XG周りはmuteさんに大変お世話になりました。
.octave_modeの追加 [zmc3]
 < > のどちらがオクターブアップで、 どちらがオクターブダウンかを設定できるようにしました。
# どーもこの辺がZ-MUSIC普及の妨げとなっているように思えるので・・・。

引数にはとりあえず以下を指定可能です。

HuBASIC, SHARP, X68k, NEC

NECを指定するとオクターブスイッチの意味が上下逆になります。 つまり、<でオクターブダウン、>でオクターブアップとなります。 残り3つはどれを指定しても同じで、こちらがデフォルトとなります。
# もう少しセンスのいい指定方法募集中・・・。

[PANPOT RND]の追加 [zmc3]
 見ての通りです。パンポットがランダムになります。 エクスクルーシブメッセージで実現しているため、 GS音源とXG音源でのみ対応。

 機種判別のために、事前に@Iなどで メーカーIDなどを設定しておく必要があります。 zmc3 v0.98.4以降、機種依存はなくなりました。

 XG周りは、 るてさんから 情報をいただきました。thanks!!

[AUTO_PANPOT]の追加 [zmc3]
 発音する音の高さに応じて、自動的にパンポットを動かすことが出来ます。

 例えば [AUTO_PANPOT on o4c, L32, o6c, R32] とすると、 o4cはパンポットL32で、o6cはパンポットR32で発音するようになります。 o4cからo6cの間の音は、 L32とR32を一次直線で補完した位置のパンポットで鳴らします。 (例えば、o5cは、o4cとo6cのちょうど真ん中であるため、 L32とR32のちょうど真ん中(つまり、センター)で発音します)

[EVENT META]の追加 [zmc3]
 [EVENT ... ] に、"META"というカテゴリを追加しました。 ZMS上で、メタイベントを記述できます。(テキスト系のみですが。)

 クラスのところにメタイベントの種類を書き、 データのところに内容を記述してください。
例えば、 [EVENT META, LYRICS, "歌詞かしかし"] のようになります。 LYRICS の他にも、クラス部には以下を記述可能です。

category = META の時の、 classdata
classdata
sequenceシーケンス番号
textテキスト
copyright著作権表示 (きちんと対応し切れてない(Conductor Trackに移動しない) ので使用禁止!)
titleシーケンス名
instrument楽器名
lyrics歌詞 (category=WORD,class=STRING,data=歌詞文字列 の場合と同じ)
markerマーカー
cueキューポイント
programプログラム名(音色名)
deviceデバイス名(音源名)

MIDIポート数の増加 [zmc3]
 MIDIで扱えるポート数を、4つから16まで拡張しました。 (ただし、2005年5月1日現在、z2m3側が対応していません。 しばらくお時間ください。)
パンポットシーケンスのサポート [zmc3]
 ベロシティシーケンスのパンポット版です。

 ベロシティーシーケンスに、 パンポット特有の指定方法(L/M/R/RND)を追加して、 スペシャルベロシティ相当の機能を除いたもの、とお考えください。


実装予定のもの

演奏素片のランダム選択
	[%
	    |%20 ccc
	    |%30 ddd
	    |%   eee
	%]
	
とすると、[%〜%]の中から、20%の確率でcccが、30%の確率で dddが、50%(=100-20-30)の確率でeeeが選ばれ、演奏されます。 どの素片が演奏されるかはコンパイル時に決定されます。
ローカル.define
 ローカル.defineは、例えば特定トラックでのみ有効な マクロであったり、特定区分でのみ有効なマクロであったりします。 実装検討中。
[自作プログラム紹介ページにもどる]
E-mail: