-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzm14.txt
1338 lines (904 loc) · 49.6 KB
/
zm14.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
MEASURE14
効果音モードと外部プログラムとの同期
ここでは、ZMUSICの特殊機能である
「効果音モード」と「外部プログラムとの同期」に
ついての解説を行います。本章を理解するには
MPU680x0の機械語の知識が必要です。
通常の音楽演奏のみを行なうユーザーは読み
飛ばして構いません。
「効果音モード」の解説はオリジナル
ゲームプログラムで実際に使用することを想
定して具体的に解説します。
14.1. 効果音モード
14.1.1. ZMSC3.Xの組み込み
14.1.1.1.効果音トラックの確保
効果音モードを利用するにはZMSC3.Xを常駐させる時に、コマンドオプション'-F'を
設定し、効果音用のトラックを確保しなければならない。効果音用のトラックを確保
しない場合、ZMDを利用した効果音の演奏は一切行えない。
-------------------------------------------------------------------------------
-Fn
効果音モード用にトラックをn本確保する。効果音モードを利用する時は
nに1~65534を設定する。デフォルトではn=0で「効果音モードを利用しない」
設定となる。効果音トラックに何トラック割り当てても音楽演奏のトラック数の
最大数には影響無い。
例
A>ZMSC3 -F4 (効果音トラックに4トラック確保)
-------------------------------------------------------------------------------
14.1.1.2.組み込みメッセージの制御
ZMSC3.Xを組み込んだ後にZMUSICのロゴやバージョン番号、確保したバッファの
容量等の情報が画面に出力される。このスイッチを設定するとこれらを一切表示
しないようにすることができる。アプリケーションを起動する際の画面バランスに
気を使う場合は設定するとよい。
-------------------------------------------------------------------------------
-G
ZMSC3.X起動時のロゴ表示や常駐を報告するメッセージを表示しない。
-------------------------------------------------------------------------------
14.1.1.3.初期化処理の制御
ZMUSICでは通常、新たに演奏データを演奏する際、MIDI機器に初期化
メッセージを送信したりFM音源、ADPCM音源の初期化処理を実行している。この初期化
処理は新たに演奏する曲の都合を無視したものであり、かなり余計な処理を含んでい
る。たとえばMIDI音源の10以下(1~10)のチャンネルしか使用していない曲を
演奏しようという時も11以上(11~16)のチャンネルの初期化メッセージも送信してしま
う。これはゲームなどのBGMの切り替え時においてゲーム画面のスクロールの一時停止
といった目に見える症状になってしまう場合がある。
ZMSC3.X常駐時に'-N’オプションを設定すると、以後この初期化処理を必要最低限に
省略することができる。ただし全デバイスに対して、初期化メッセージ送信処理を
省いてしまうため、演奏データ(ZMD)側に必要な初期化メッセージを盛り込む必要が
出てくる(後述)。
-------------------------------------------------------------------------------
-N
初期化処理を簡略化する。この設定を行ってZMSC3.Xを常駐させると以後、
演奏開始時に最低限の初期化処理しか行わなくなる。ゲームなどのBGMを
機械語レベルで演奏制御する場合に、曲の変り目の処理を軽くする事が出来る。
通常は設定する必要はない。
-------------------------------------------------------------------------------
14.1.1.4.ZPDの組み込み
ゲームなどにおいて、用いるすべてのADPCM音が1つのZPDを用いてる場合は
'-Z'オプションを指定してZMSC3.X常駐時に組み込んでしまうとよい。
-------------------------------------------------------------------------------
-Zfilename
filenameで与えられるADPCM BLOCK DATA「ZPD」をZMSC3.X常駐時に読み込む。
ファイル名拡張子を省略すると自動的に'.ZPD'が添付される。
例
A>ZMSC3.X -Zstandard.zpd
-------------------------------------------------------------------------------
14.1.2. ゲームプログラムに負担をかけない演奏データとは?
演奏データ制作者はゲームプログラムに負担をかけないように心掛けて演奏データを
作成するよう留意すべきである。また、曲の切り替りに時間がかからないように工夫
しないと、ゲームの進行を一瞬停止させてしまう恐れがある。
例えばスクロールシューティングゲームでステージBGMからボス登場のBGMに切り替る
時に、スクロールが一瞬停止してしまってはスピード感を損ねてしまう。
そこで、まず大前提となるのは利用する演奏データ形式はZMDにべきであるという
点。ZMSでは演奏毎にコンパイラを呼び出してZMDへ変換する必要があるため、
ゲームプログラムへの負担は免れないからだ。
ここでは、ゲームプログラムに負担をかけないZMDの作成方法、曲の切り換えを
できるだけ早く行えるZMDの作成方法についてのべる。
14.1.2.1.ZMSコマンドは極力使わない
FM音源音色の定義コマンドやMIDIエクスクルーシブメッセージ送信コマンドなどの
トラックに依存しない、いわゆる「共通コマンド(ZMSコマンド)」は割り込みで処理され
ないために実行にはある程度のまとまった時間を要する。したがって、曲の切り替え時
などにウェイトになってしまう可能性がある。そこでゲームのBGMにはなるべくZMSコマ
ンドは用いないほうがよい。
MMLコマンドは割り込み処理されるので、ゲームプログラムの実行を完全に止めて
しまうことはない。そのため、もしMMLに置き換えられるならばZMSコマンドは
用いずに、MMLで代用したほうがよい。たとえば、ZMSコマンド
.ROLAND_EXCLUSIVE
(Xn1,n2,n3,…,ni)
などはMMLの
X
@X
に置き換えられる。
どうしても置き換わらない
FM音源音色登録
などは後述する方法で解決する。
なお、曲データである以上必要最低限となるものとして、チャンネルアサイン
ZMSコマンド
(A dev,trk,trkv,trkf,trks,trkm,cmnt)
.ASSIGN trk {dev,trkv,trkf,trks,trkm,cmnt}
があるが、これはコンパイル時に消化されてZMDには出力されないので、用いても
ゲームプログラム側の負担にはならない。
14.1.2.2.音色登録
演奏データには様々な音色が使用されるが、この音色データを1曲ごとに持たせて
演奏の開始時にいちいちZMUSICや音源側に登録していたのでは曲の切り替りが遅くなっ
てしまう(アクションゲームのような極端な高速切り替えが要求されていない、RPG
やアドベンチャーゲームなら別に構わないであろうが)。
ZMUSICではFM音源32768音色分(No.1~No.32768)の専用バッファを持っており、
ZMSC3.Xが解除されたりしなければ、この領域はいつまでも保存されている。よって、
そのゲーム中に使用されるFM音源音色をあらかじめZMD化しておき、これをZMSC3.X
常駐時にオプション'-S'を用いて設定してしまい、その後演奏させる演奏データ側には
一切FM音源音色データを持たせずに、あらかじめ登録した音色のみを使用するよう
にすれば、演奏毎の音色登録動作を省くことが出来る。また効果音データで用いる
FM音源音色も一緒に設定してしまうとよいだろう。
MIDI楽器の音色についてもFM音源音色の場合と同様である。そのゲームの
BGMで使用する音色データをあらかじめMIDI楽器へ送信してしまえばよい
(なんらかの初期化メッセージを受信すると設定した音色までも初期化してしまう
機種もあるので注意)。
音色のセットアップZMSファイルの例をリスト1に示す。このリスト1のような
ものをZMC.XでコンパイルしてZMD化しておき、
A>ZMSC3.X -sSETUP.ZMD
のようにしてZMSC3.X常駐とともに組み込んでしまえばよい。
複数のMIDI楽器に対応している場合はMUSICコンフィギュレーションの
ような場所で楽器機種をユーザーに選ばせ、その時点であらかじめ用意しておいた
その楽器の音色データを転送するようにすればよいだろう。
リスト1
-------------------------------------------------------------------------------
/ 効果音FM音色データ
(v1,0 /自機ミサイル
/ AF OM WF SY SP PMD AMD PMS AMS PAN
60, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0
/ AR DR SR RR SL OL KS ML DT1 DT2 AME
27, 15, 5, 2, 0, 0, 0, 0, 3, 1, 0
31, 18, 18, 6, 7, 0, 0, 0, 3, 2, 0
22, 31, 0, 10, 0, 42, 0, 7, 7, 0, 0
15, 31, 0, 8, 0, 0, 2, 1, 7, 0, 0)
:
:
:
:
(v20,0 /敵レーザー
/ AF OM WF SY SP PMD AMD PMS AMS PAN
58, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0
/ AR DR SR RR SL OL KS ML DT1 DT2 AME
12, 5, 1, 5, 5, 24, 1, 0, 0, 1, 0
16, 4, 1, 5, 2, 30, 1, 0, 3, 0, 0
29, 6, 5, 5, 2, 16, 2, 0, 3, 2, 0
9, 4, 31, 8, 10, 0, 2, 4, 3, 1, 0)
/ 楽器FM音色データ
/ AR 1DR 2DR RR 1DL TL RS MUL DT1 DT2 AME BASS 1
(@30, 21, 0, 0, 0, 1, 20, 1, 0, 7, 0, 0
21, 0, 0, 4, 0, 0, 1, 1, 7, 0, 0
21, 0, 0, 0, 0, 20, 1, 0, 3, 0, 0
21, 0, 0, 4, 0, 5, 1, 1, 3, 0, 0
/ AL FB OM
4, 5, 15)
:
:
:
:
/ AR 1DR 2DR RR 1DL TL RS MUL DT1 DT2 AME BRASS1
(@100, 19, 17, 0, 8, 1, 24, 1, 1, 1, 0, 0
19, 13, 0, 8, 15, 37, 1, 2, 0, 0, 0
19, 17, 0, 8, 1, 36, 1, 1, 0, 0, 0
19, 4, 5, 8, 2, 0, 1, 1, 2, 0, 0
/ AL FB OM
2, 7, 15)
/----------------------------------------------------------
/ MIDI楽器音色
/ Chord (Saw&Squ)
.roland_exclusive 16,22 ={8,0,0
67, 72, 79, 82, 68, 32, 32, 32, 32, 32
0, 0, 3, 0
/ ** PARTIAL1 **
36, 53, 11, 1, 2, 0, 36, 9
0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50
62, 23, 85
100, 23, 4, 39, 8, 24
100, 0, 0, 0, 13, 24, 77, 83,100, 89, 76, 72
94, 74, 91, 12, 27, 12
0, 0, 0, 0, 0, 9, 43,100,100,100, 99
/ ** PARTIAL2 **
36, 48, 11, 1, 3, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50
64, 23, 56
100, 23, 5,103, 6, 43
100, 0, 0, 0, 7, 22,100, 98,100, 94, 84, 79
94, 70, 91, 12, 27, 12
0, 0, 0, 4, 11, 14, 15,100, 96, 92, 91}
.mt32_patch 1,16 ={2,0,24,52,2,0,1}
/-----------------------------
/ Keyboard (Harpsichord)
.roland_exclusive 16,22 ={8,4,0
72, 65, 82, 80, 83, 73, 67, 79, 82, 68
2, 5, 3, 0
/ ** PARTIAL1 **
36, 46, 16, 1, 0, 43, 0, 7
0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50
0, 0, 0
0, 0, 3, 0, 7, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 77, 91, 6, 27, 12
3, 0, 0, 23, 60, 83, 0,100, 88, 88, 88
/ ** PARTIAL2 **
48, 51, 16, 1, 2, 0,100, 7
0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50
0, 0, 0
100, 16, 9,103, 8, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
100, 75, 27, 12, 15, 5
1, 1, 0, 23, 60, 92, 0,100, 88, 88, 88}
.mt32_patch 2,16 ={2,2,24,50,2,0,1}
:
:
:
:
-------------------------------------------------------------------------------
14.1.2.3.コメント
演奏データのタイトルや作者名を記述するのに使われている.comment文も演奏時には
文字列をスキップする動作を強いられるため、これがウェイトになりかねないので
用いないようにする。
14.1.2.4.初期化
14.1.1.3.で解説したように、ZMSC3.Xを'-N'オプションを付けて初期化処理簡略
モードで常駐させている場合、各演奏データに音源初期化等の設定を盛り込まないと、
音源は前に演奏していた演奏データの設定状態のまま次の曲を演奏してしまう。
ZMUSICでは、初期化簡略モードでない通常モードの場合、新たな演奏データの
演奏開始直前に以下のような処理を行っている。
-------------------------------------------------------------------------------
●FM音源部
ノイズモードオフ(Y15,0相当)
-------------------------------------------------------------------------------
●ADPCM音源
ADPCMのパンポット、再生周波数の初期化
-------------------------------------------------------------------------------
●MIDI音源部
リセット オール コントローラーズ($Bn,$79,$00)
オムニ モード オン($Bn,$7D,$00)
モノ モード オフ($Bn,$7F,$00)
ローカル オン($Bn,$7A,$7F)
ファインチューニングをニュートラルへ($Bn,$65,$00,$Bn,$64,$01,
$Bn,$06,$40,$Bn,$26,$00)
コースチューニングをニュートラルへ($Bn,$65,$00,$Bn,$64,$02,$Bn,$06,$40)
ピッチ・ベンドレンジ=1オクターブ($Bn,$65,$00,$Bn,$64,$00,$Bn,$06,$0C)
ボリューム=63($Bn,$07,$3F)
パンポット=中央($Bn,$0A,$40))
ピッチ・モジュレーション=0($Bn,$01,$00)
ダンパー オフ($Bn,$40,00)
ピッチ・ベンドをニュートラルへ($En,$00,$40)
※nはMIDIチャンネル内部表現($00-$0F)
-------------------------------------------------------------------------------
初期化なしモードとそうでない場合の違いは、これらの初期化動作が行われるか
行われないかの違いになってくる。
演奏データをゲームプログラムなどに取り込む前に一度、初期化簡略モードで
演奏してみるとよいだろう。それで演奏がおかしかったならば、どの初期化処理
が足りなかったのかを見極め、上で示した初期化処理を1つずつピックアップして
盛り込んでいくとよいだろう。
こうしてみるとFM音源とADPCM音源は初期化なしモードと通常モードの区別を特に
意識する必要はないかもしれない。
ところで、MIDI楽器の場合、ローランド系のDTM楽器(CM/SCシリーズなど)では
楽器の特定のメモリアドレスにダミーデータを書き込むと本体内の全パートを
初期化してくれる便利な機能を持っている。これを使えば上のような初期化メッセージ
をすべて送らなくても少ない手間で初期化が行える。いくつか例を挙げておく。
(初期化したあとの楽器の状態については各楽器マニュアルを参照し確認すること)
●MT32/CM32L/CM64/CM32P/CM500のLA音源部の場合
$7F,$00,$00にダミーデータを書き込む
例
共通コマンド….ROLAND_EXCLUSIVE $10,$16={$7F,$00,$00,$00}
MML…@I$41,$10,$16 X$7F,$00,$00,$00
●GS音源系の場合
$40,$00,$7Fにダミーデータを書き込む
例
共通コマンド….ROLAND_EXCLUSIVE $10,$42={$40,$00,$7F,$00}
MML…@I$41,$10,$42 X$40,$00,$7F,$00
(GS音源はこの方法で初期化するとベンドレンジが2半音とされてしまう点に注意)
14.1.3. 演奏開始ルーチン
演奏データ(ZMD)をゲームのメインプログラムから演奏するためには、簡単な演奏
マネージメント・プログラム(つまりは演奏開始ルーチン)が必要となる。さまざまな
演奏開始ルーチンが考えられるがサンプルとしてリスト2を示す。
この例では各演奏データがmusic0、music1、music2…とそれぞれ偶数番地に
読み込まれているとする。そこでmusic0を演奏したいならばd0.lに0、music1を
演奏したいならばd0.lに1を入れ、このルーチンplay_musicをサブルーチンコールする
ようにする。これで演奏が開始される。
ZMDの演奏にはZMUSIC Ver.3.0のファンクションZM_PLAY_ZMDを利用するが、この
ファンクションの「a1.lは演奏データの先頭8バイトヘッダの次のアドレスを指して
いなければならない」という仕様から演奏データテーブルの各要素には +8 が
加算してある点に注意。詳しくはファンクションZM_PLAY_ZMDの項を参照。
リスト2
-------------------------------------------------------------------------------
include zmcall.mac
Z_MUSIC macro func *ZMUSICへのファンクションコール
moveq.l func,d0
trap #3
endm
play_music:
* < d0.l=曲番号(0~16383)
movem.l d0-d2/a0-a1,-(sp)
add.l d0,d0
add.l d0,d0
movea.l music_data_tbl(pc,d0.l),a1
moveq.l #0,d2 *高速応答モード
Z_MUSIC #ZM_PLAY_ZMD
movem.l (sp)+,d0-d2/a0-a1
rts
music_data_tbl:
dc.l music0+8
dc.l music1+8
dc.l music2+8
dc.l music3+8
dc.l music4+8
dc.l music5+8
dc.l music6+8
dc.l music7+8
:
:
:
:
-------------------------------------------------------------------------------
14.1.4.効果音データの作成とその活用方法
ZMUSIC Ver.2.0以前では、効果音を演奏させるには、音楽演奏データ側のトラックと
チャンネルの関係を把握しておかなければならなかったが、Ver.3.0では音楽データと
効果音データの演奏はそれぞれ独立した処理系で演奏されるため、特に前準備は必要
としなくなっている。FM音源の音楽を演奏中にFM音源の効果音を演奏させても、チャン
ネル間の競合はZMUSIC側で処理するため、音楽演奏、効果音演奏、双方とも任意の
チャンネルを割り当てることが出来る。
また、テンポに関しても音楽側と効果音側で独立したテンポを設定することが出来
るようになった。
ここでは、効果音データの作成方法とその演奏方法について解説する。
14.1.4.1.効果音データ
効果音データは
1.完全な音楽データと同様の形態をとるもの
2.演奏データトラックのみで構成されるもの
の2通りがある。
1.のタイプは共通コマンド(ZMSコマンド)までも含んだ完全なZMDファイルで、通常の
ZMSをコンパイラでZMD化したものに相当する。2.のタイプは前者から演奏データ部分
だけを分離したものである。
1.のタイプの演奏はリスト2のZM_PLAY_ZMDをZM_PLAY_ZMD_SEにした流用ルーチンが
利用出来る。ただし、1.のタイプの演奏には共通コマンド部分の実行などの手間が
はいるため、効果音演奏まで一瞬のタイムラグが発生する可能性がある。そのため
高速応答が要求されるアクションゲームの効果音には向かない。
2.のタイプはZMDのトラック・チャンネル情報テーブル(MEASURE12参照)と実際の
トラック演奏データで構成される。こちらの効果音データの作成方法を以下に示す。
まず、リスト3のようなZMSがあったとする。
リスト3
-------------------------------------------------------------------------------
(v12,0 /音色データは事前に登録しておく
/ AF OM WF SY SP PMD AMD PMS AMS PAN
59, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0
/ AR DR SR RR SL OL KS ML DT1 DT2 AME
23, 8, 1, 8, 7, 31, 2, 1, 5, 3, 0
30, 8, 8, 7, 5, 20, 1, 2, 1, 2, 0
22, 3, 7, 8, 1, 20, 1, 1, 3, 0, 0
27, 0, 0, 9, 0, 0, 1, 2, 5, 1, 0)
(i)
.assign TR1 {FM8}
(t1)@12 o3 q8 v14 p3 @k0 @m60 @h24 @s3 (a16<a)&a4.&(a16>a)
(p)
-------------------------------------------------------------------------------
これをコンパイルしてZMD化するとリスト4のようになる。
リスト4
-------------------------------------------------------------------------------
00000000 1A 5A 6D 75 53 69 63 30 00 00 00 44 00 00 00 76 .ZmuSic0...D...v
00000010 00 00 00 00 00 00 00 D4 00 00 00 00 00 00 00 00 .......ヤ........
00000020 00 00 00 00 00 00 00 00 00 00 00 60 00 00 00 00 ...........`....
00000030 00 00 00 00 00 00 00 C0 00 78 00 00 00 00 00 41 .......タ.x.....A
00000040 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................
00000050 18 00 0B 00 00 80 00 78 FB 00 51 31 12 52 1F 14 ..... x..Q1.R..
00000060 14 00 97 56 5E 5B 08 03 08 00 C1 07 88 40 78 18 ..遊^[....チ..@x.
00000070 57 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 W.
00000080 20 20 00 00 FF FF 00 00 00 00 00 00 00 00 00 07 ..............
00000090 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000A0 00 00 00 00 00 00 00 00 C7 00 0B 90 8E A0 40 B9 ........ヌ..錘@ケ
000000B0 00 00 E2 01 01 00 3C E4 00 01 00 18 E3 01 00 06 ......<.........
000000C0 84 39 45 0C 80 00 80 45 48 80 00 80 84 45 39 0C .9E. E H ・E9.
000000D0 0C 80 FF FF . .
-------------------------------------------------------------------------------
トラック・チャンネル情報テーブルはオフセットz_trk_offset(MEASURE12参照)で表
される位置あるので、リスト4の場合は
$00000076+$10=$00000086
先頭から$00000086のところにあることになる。2.の方式の効果音データではこれより
前のデータが不要であるため削除してしまう。これがリスト5である。
リスト5
-------------------------------------------------------------------------------
00000000
00000010
00000020
00000030 削除してしまう
00000040
00000050
00000060
00000070
00000080 00 00 00 00 00 00 00 00 00 07 ..............
00000090 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000A0 00 00 00 00 00 00 00 00 C7 00 0B 90 8E A0 40 B9 ........ヌ..錘@ケ
000000B0 00 00 E2 01 01 00 3C E4 00 01 00 18 E3 01 00 06 ......<.........
000000C0 84 39 45 0C 80 00 80 45 48 80 00 80 84 45 39 0C .9E. E H ・E9.
000000D0 0C 80 FF FF . .
-------------------------------------------------------------------------------
これをプログラムソース形式に変換したものが、リスト6。これには参考までに
トラック・チャンネル情報テーブルのキャプションを添付してある。
リスト6
-------------------------------------------------------------------------------
.dc.b $00,$00 *ti_n_of_tracks(演奏トラック数-1)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$07 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$14 *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$00 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$0b,$90,$8e,$a0,$40,$b9 *演奏データ
.dc.b $00,$00,$e2,$01,$01,$00,$3c,$e4
.dc.b $00,$01,$00,$18,$e3,$01,$00,$06
.dc.b $84,$39,$45,$0c,$80,$00,$80,$45
.dc.b $48,$80,$00,$80,$84,$45,$39,$0c
.dc.b $0c,$80,$ff,$ff
-------------------------------------------------------------------------------
リスト7のように複数トラックで構成される効果音データも同様にして作成可能で
ある。これをコンパイルし同様の手続きにて変換してやるとリスト8のようになる。
リスト7
-------------------------------------------------------------------------------
(i)
.assign tr1 {FM7}
.assign tr2 {FM8}
(t1)@7 o7 q8 v15 p3 @k0 @l1e<g>>cd<<e>(f8<f)p0
(t2)@4 o7 q8 v12 p3 @k0 L32(c>c)&(c<e)r1
(p)
-------------------------------------------------------------------------------
リスト8
-------------------------------------------------------------------------------
.dc.b $00,$01 *ti_n_of_tracks(演奏トラック数-1)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$06 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$24 *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$10 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$07 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$4c *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$38 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$06,$90,$8f,$a0,$40,$b9 *第1トラックの演奏データ
.dc.b $00,$00,$64,$01,$01,$80,$73,$01
.dc.b $01,$80,$54,$01,$01,$80,$56,$01
.dc.b $01,$80,$70,$01,$01,$80,$84,$65
.dc.b $71,$18,$18,$80,$a0,$80,$ff,$ff
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$03,$90,$8c,$a0,$40,$b9 *第2トラックの演奏データ
.dc.b $00,$00,$84,$60,$54,$06,$80,$00
.dc.b $80,$84,$54,$64,$06,$06,$80,$80
.dc.b $80,$c0,$80,$c0,$ff,$ff,$ff,$ff
-------------------------------------------------------------------------------
14.1.4.2.効果音演奏形式
効果音を鳴らす場合には2通りの形式が存在する。
1つは効果音が鳴るチャンネルをあらかじめ空けておく形式である。つまり効果音を
演奏するチャンネルをあらかじめ決めておき音楽(BGM)側のデータを作成するわけで
ある。たとえばFM音源の1チャンネルから7チャンネルまでをBGM専用チャンネルとし、
8チャンネル目を効果音チャンネルと割り当てる。
2つ目はBGMを演奏しているチャンネルに割り込んで効果音を演奏する形式である。
たとえばFM音源の1から8チャンネルすべてのチャンネルでBGMを演奏し、そのうち
8チャンネルが効果音に切り換わったりする、という場合である。この場合では、
効果音が頻繁に演奏されると8チャンネル目はほとんど効果音しか鳴らなくなって
しまいBGMの一声分が欠けて聞こえることになる。よってBGMの作成設計をする際には、
効果音が被ってくるチャンネルにはメロディやベース等の重要なパートを割り当て
ないようにすべきである。
14.1.4.3.効果音の演奏
リスト9は効果音のマネージメント・プログラムの一例である(リスト9中の
サンプル効果音は、それぞれリスト6、リスト8とまったく同じもの)。
リスト9中のse_play1はd0.lに鳴らしたい効果音番号を代入して呼び出すと対応する
効果音が演奏されるルーチンである。
リスト9
-------------------------------------------------------------------------------
.include zmcall.mac
Z_MUSIC macro func *ZMUSICへのファンクションコール
moveq.l func,d0
trap #3
endm
se_play1:
* < d0.l=sound number(0-32767)
* - all
movem.l d0-d1/a0-a1,-(sp)
add.w d0,d0
move.w se_tbl(pc,d0.w),d0
lea se_tbl(pc,d0.w),a1
Z_MUSIC #ZM_SE_PLAY
movem.l (sp)+,d0-d1/a0-a1
rts
se_play2:
* < d0.l=sound number
* < d1.l=ch number
* - all
movem.l d0-d2/a0-a1,-(sp)
add.w d0,d0
move.w se_tbl(pc,d0.w),d0
lea se_tbl(pc,d0.w),a1
moveq.l #0,d2
move.w (a1),d0
@@:
move.l d1,6(a1,d2.l) *デバイス・チャンネルセット
addq.w #1,d1 *チャンネルのオーバーフローはノーチェック
add.l #16,d2
dbra d0,@b
Z_MUSIC #ZM_SE_PLAY
movem.l (sp)+,d0-d2/a0-a1
rts
se_tbl:
dc.w se0-se_tbl *$00
dc.w se1-se_tbl *$01
dc.w se2-se_tbl *$02
dc.w se3-se_tbl *$03
dc.w se4-se_tbl *$04
:
:
:
se0:
.dc.b $00,$00 *ti_n_of_tracks(演奏トラック数-1)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$07 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$14 *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$00 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$0b,$90,$8e,$a0,$40,$b9 *演奏データ
.dc.b $00,$00,$e2,$01,$01,$00,$3c,$e4
.dc.b $00,$01,$00,$18,$e3,$01,$00,$06
.dc.b $84,$39,$45,$0c,$80,$00,$80,$45
.dc.b $48,$80,$00,$80,$84,$45,$39,$0c
.dc.b $0c,$80,$ff,$ff
.even
se1:
.dc.b $00,$01 *ti_n_of_tracks(演奏トラック数-1)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$06 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$24 *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$10 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00 *ti_track_stat
.dc.b $00 *ti_track_mode
.dc.b $00 *ti_trkfrq
.dc.b $00 *dummy
.dc.b $00,$00 *ti_type(デバイスタイプ:0,1,$8000~$8003)
.dc.b $00,$07 *ti_ch(チャンネル番号:0-15)
.dc.b $00,$00,$00,$4c *ti_play_data(演奏データまでのオフセットアドレス)
.dc.b $00,$00,$00,$38 *ti_extra_info(トラック追加情報までのオフセット)
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$06,$90,$8f,$a0,$40,$b9 *第1トラックの演奏データ
.dc.b $00,$00,$64,$01,$01,$80,$73,$01
.dc.b $01,$80,$54,$01,$01,$80,$56,$01
.dc.b $01,$80,$70,$01,$01,$80,$84,$65
.dc.b $71,$18,$18,$80,$a0,$80,$ff,$ff
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $00,$00,$00,$00,$00,$00,$00,$00
.dc.b $c7,$00,$03,$90,$8c,$a0,$40,$b9 *第2トラックの演奏データ
.dc.b $00,$00,$84,$60,$54,$06,$80,$00
.dc.b $80,$84,$54,$64,$06,$06,$80,$80
.dc.b $80,$c0,$80,$c0,$ff,$ff,$ff,$ff
.even
:
:
:
:
-------------------------------------------------------------------------------
se_play1に対してd0.l=0としてコールすると効果音se0がFM音源第8チャンネルで
演奏される。なぜFM音源のチャンネル8かはse0のキャプションti_type,ti_chを
見ればわかる。もし、同内容の効果音を別のチャンネルで演奏したい場合は、
この部分を効果音演奏ルーチン側で書き換えればよい(演奏デバイス、チャンネルを
変えたZMDを別途用意しても構わないが、こちらの方法の方がメモリを節約出来る)。
リスト9のse_play2はその一例である。d0.lに効果音番号、d1.lに演奏デバイス、
チャンネルをパラメータとして与える。se_play2では効果音データのアドレスを得た
あと、そのアドレス+6に演奏デバイス・チャンネルを書き込んでいる。+6という
オフセットはse0の演奏デバイス・チャンネル情報がこの位置にあることからきている
(キャプションti_type,ti_ch)。
そしてd1.lに代入されている演奏デバイス・チャンネルのチャンネルの方を+1し、
d2.lを+16して、このあとループ制御を行っている。このループ制御によりルーチンは
演奏する効果音の構成トラック数の回数分ループするようになっている。これは効果音
データが複数トラックで構成されている場合に対応した部分である。例えば、se1の
場合ならば「se1のアドレス+6」と「se1のアドレス+22」に対しても演奏デバイス・
チャンネルを書き込む必要があるが、このループ制御でこれを行わせている。効果音
演奏チャンネルに対して+1しているのは、複数トラックから構成される効果音の各トラ
ックに1ずつ昇順に別々のチャンネルを割り当てる目的で、また、d2.lに対する+16は
次のトラック・チャンネル情報テーブルをポイントする目的でオフセット加算を行って
いる。
このように効果音のデータを直接書き換える手法を応用するとさまざまな効果を
実現することが出来る。ここで示した例は、演奏デバイス・チャンネルを書き換える
程度のものだが、効果音の演奏データそのものを直接書き換えたりすれば一層応用の
幅が広がる。たとえば3Dゲームならば、効果音の演奏データ部分のパンポットZMDや
音量ZMDのパラメータを、その3次元座標に合せて直接書き替えて演奏させてやれば
疑似立体音響のようなものも実現可能だ。
14.1.4.4.ADPCM音の効果音
ADPCM音の効果音も、これまでに解説してきた方法で演奏することが出来るが、
ZMUSIC Ver.3.0ではADPCM効果音専用のファンクションコールが設けてあり、これを
利用することでも演奏させることが出来る。
リスト10がこれらファンクションを用いたマネージメントプログラムの一例である。
リスト10
-------------------------------------------------------------------------------
.include zmcall.mac
Z_MUSIC macro func *ZMUSICへのファンクションコール
moveq.l func,d0
trap #3
endm
ADPCM_se_play1: *ADPCM効果音
*任意のアドレスに格納されたADPCM音を効果音として鳴らす
*
* < d0.l=効果音番号
*
movem.l d0-d2/d4/a0-a1,-(sp)
lsl.l #3,d0
movem.l adpcm_se_tbl1(pc,d0.w),d1-d2/d4/a1
Z_MUSIC #ZM_SE_ADPCM1
movem.l (sp)+,d0-d2/d4/a0-a1
rts
adpcm_se_tbl1:
*0 データ種類(.b)(MPCM.X常駐時のみ有効) -1:ADPCM,1:16bitPCM,2:8bitPCM
*1 音量(.b)(MPCM.X常駐時のみ有効) 0~127(64が原音量)
*2 パンポット(.b) 1:左 2:右 3:中央 または $80+(0~127)
*3 再生周波数(.b) 0~4
*4 データのサイズ(.l)
*8 優先レベル(.w) 0~255 (0が一番低い)
*10 演奏チャンネル(.w)(MPCM.X常駐時のみ有効) 0~15
*12 データアドレス(.l)
dc.l $ff_40_02_03,$0000_000f,2212,adpcm_se0
dc.l $ff_40_04_03,$0001_000f,3478,adpcm_se1
dc.l $ff_40_03_01,$0000_000f,5453,adpcm_se2
dc.l $ff_40_04_02,$0001_000f,1401,adpcm_se3
dc.l $ff_40_04_03,$0000_000f,8799,adpcm_se4
:
:
:
:
ADPCM_se_play2:
*ZMUSICに登録したADPCM音を効果音として鳴らす
*
* < d0.l=効果音番号
*
movem.l d0-d2/d4/a0,-(sp)
lsl.l #3,d0
movem.l adpcm_se_tbl2(pc,d0.w),d1-d2/d4
Z_MUSIC #ZM_SE_ADPCM2
movem.l (sp)+,d0-d2/d4/a0
rts
adpcm_se_tbl2:
*0 データ種類(.b)(MPCM.X常駐時のみ有効) -1:ADPCM,1:16bitPCM,2:8bitPCM
*1 音量(.b)(MPCM.X常駐時のみ有効) 0~127(64が原音量)
*2 パンポット(.b) 1:左 2:右 3:中央 または($80+0~127)
*3 再生周波数(.b) 0~4
*4 優先レベル(.w) 0~255 (0が一番低い)
*6 演奏チャンネル(.w)(MPCM.X常駐時のみ有効) 0~15
*8 登録トーン/音色番号(.l) 0~32767 または $8000+(0~32767)
dc.l $ff_40_02_03,$0000_0007,0,0
dc.l $ff_40_04_03,$0001_0007,1,0
dc.l $ff_40_03_01,$0000_0007,2,0
dc.l $ff_40_04_02,$0001_0007,3,0
dc.l $ff_40_04_03,$0000_0007,4,0
:
: