MSX Datapack wiki化計画

4.4 MSX-AUDIO MBIOS

※
※ このページは書きかけです。以下の可能性があります。
※ ・誤字、脱字等のチェックをおこなっていません。
※ ・テキスト、表などフォーマットがされていない。
※ ・画像が抜けている。
※

 4.4.1 はじめに

MBIOS(Music Basic Input Output System)はMSX-AUDIOが持っているFM音源の演奏やADPCM/PCMの録音再生、ミュージックキーボードのスキャンなどをコントロールするプログラム群で、拡張BIOSを通じてアプリケーションプログラムからアクセスすることができます。サポートする機能には大きく分けて以下のようなものがあります。

  • FM音源に対する音色の設定、発声
  • リズム音に対する音色の設定、発声
  • ADPCM/PCM方式による音声の録音、再生
  • ADPCMデータとPCMデータの相互変換
  • CSM方式による音声の発声
  • ミュージックキーボードのスキャン
  • 割り込みのハンドリング

なお、この章を読むにあたっては、「4.5 Y8950」も併読して下さい。

 4.4.2 MBIOSのコール手順

MBIOSはY8950を直接アクセスするためのサブルーチン群です。MBIOSをコールするときは、拡張BIOSコールのMBIOS(MBIOSを呼びだすためのエントリ)を使用します。実際の呼び出しは、以下のような手順で行います。

1. MBIOSのエントリアドレスをHLレジスタに設定する。
2. 各MBIOSの指定により、その他のレジスタを設定する。
3. 【BUF(F55EH)】にIX、IYレジスタの内容を設定します。

BUFIXレジスタの下位8ビット
+1 IXレジスタの上位8ビット
+2 IYレジスタの下位8ビット
+3 IYレジスタの上位8ビット

4. MSX-AUDIO拡張BIOSジャンプテーブルのオフセット3(MBIOSの呼び出し)をインタースロットコールなどにより呼びだす。

 4.4.3 ワークエリア

MBIOSはマスターチャンネル/スレーブチャンネル2つのY8950を制御します。また各々のY8950の9チャンネルのFM音源を制御します。アプリケーションプログラムはMBIOSに対してどのチャンネルを使用するかを、以下の該当するチャンネルのワークエリアのアドレスをMBIOSに渡すとこで指定します。

表7.60 チャンネルのワークエリア一覧

ラベルアドレス大きさ(バイト)用途
CHDB0 3000H64 FM音源チャンネル0データ
CHDB1 3040H64 FM音源チャンネル1データ
CHDB2 3080H64 FM音源チャンネル2データ
CHDB3 30C0H64 FM音源チャンネル3データ
CHDB4 3100H64 FM音源チャンネル4データ
CHDB5 3140H64 FM音源チャンネル5データ
CHDB6 3180H64 FM音源チャンネル6データ
CHDB7 31C0H64 FM音源チャンネル7データ
CHDB8 3200H64 FM音源チャンネル8データ
MIDB_M3280H64 ミュージックインスツルメンツデータ(マスターチャンネル)
MDIB_S32C0H64 ミュージックインスツルメンツデータ(スレーブチャンネル)
UVL 3700H1024ユーザーFM音源データ

たとえば、キーオン(RC_KON)は

コール手順
IX     FM音源チャンネルを指定するためのCHDBのアドレス

となっています。もし、FM音源チャンネル2番に対して指定するなら、

rcqkon   equ      35
chdb2    equ      3080h

         ld       a, rcqkon           ; set function code
         ld       ix, chdb2           ; set channel number
         ld       de, 3c00h           ; center 'C'
         ld       c, 8                , medium velocity
         call     sv_real

となります。このキーオンにはマスターチャンネル、スレーブチャンネルの指定がありません。指定がない機能はマスターチャンネル、スレーブチャンネルりょうほうに対して同じ動作をします。
ワークエリアは3000H〜3FFFHの4Kバイトですが、7000H〜7FFFHにもイメージを持ち、どちらのアドレスでも同じように指定できます。

1.MIDB

MIDB(Music Instrument Data Block)はマスターチャンネル、スレーブチャンネルそれぞれに用意されており(MIDB-M(3280H)とMIDB-S(32C0H))、アプリケーションソフトウェアはMBIOSを呼びだすときに、どちらのチャンネルに対する機能要求であるのかを示すために該当するチャンネルのMIDBの内容を参照することができますが、内容を変更してはいけません。
MIDBの内容は以下のとおりです。MIDBの詳細な内容については、「4.4.5 ワークエリアの詳細」を参照して下さい。

表7.61 MIDB内容一覧

オフセット名称
0 未使用
1 未使用
2 YM_TIM1
3 YM_TIM2
4〜17 未使用
18 YMA_BIAS
19〜24未使用
25 YMA_AUDIO
26〜31未使用
32 YMA_TRANS(下位8ビット)
33 YMA_TRANS(上位8ビット)
34 YMA_LFO
35 YMA_RAM
36 ZMA_FLAG
37 YMA_PDB(下位8ビット)
38 YMA_PDB(上位8ビット)
39 ZMA_PH_FILTER
40 ZMA_PH_TL
41 ZMA_PH_AR(下位8ビット)
42 ZMA_PH_AR(上位8ビット)
43 ZMA_PH_DIR(下位8ビット)
44 ZMA_PH_DIR(上位8ビット)
45 ZMA_PH_SL
46 ZMA_PH_D2R(下位8ビット)
47 ZMA_PH_D2R(上位8ビット)
48 ZMA_PH_RR(下位8ビット)
49 ZMA_PH_RR(上位8ビット)
50 ZMA_PH_EG(下位8ビット)
51 ZMA_PH_EG(上位8ビット)
52 ZMA_PH_STAT
53〜63未使用

2.CHDB

CHDB(CHannel Data Block)はFM音源の9つの各チャンネルごとに用意されており、MBIOSにより各音源チャンネルの制御のために使用します。
アプリケーションソフトウェアはMBIOSを呼び出すときに、どのチャンネルに対する機能要求であるかを示すために該当するチャンネルのCHDBのアドレスを指定します。
Y8950が持っている各レジスタは書き込みのみで、設定した内容を読み出すことができないので、MBIOSはレジスタに書き込んだ値をCHDBにコピーして保存しています。アプリケーションプログラムはCHDBの内容を参照することができますが、内容を変更してはいけません。
CHDBの内容は以下のとおりです。CHDBの詳細な内容については、「4.4.5 ワークエリアの詳細」を参照して下さい。

表7.62 CHDB内容一覧

オフセット名称
0 YCAO0_MULTI
1 YCAO0_LS
2 YCAO0_AR
3 YCAO0_RR
4 YCAO0_VELS
5 YCAO0_VTL
6 未使用
7 未使用
8 YCAO1_MULTI
9 YCAO1_LS
10 YCAO1_AR
11 YCAO1_RR
12 YCAO1_VELS
13 YCAO1_VTL
14 未使用
15 未使用
16 YCA_VTRANS(下位8ビット)
17 YCA_VTRANS(上位8ビット)
18 YCA_TRANS(下位8ビット)
19 YCA_TRANS(上位8ビット)
20 YCA_TRIG
21 YCA_VOL
22 YCA_FB
23 YCA_VEL
24 YCA_PITCH(下位8ビット)
25 YCA_PITCH(上位8ビット)
26 YCA_VOICE
27 ZCA_FLAG
28 ZC_CH
29 ZC_OP
30 ZC_COUNT(下位8ビット)
31 ZC_COUNT(上位8ビット)

 4.4.4 各エントリの解説

1.MBIOSの初期化

SV_RESET(0090H)
機能

MBIOSを初期化します。

コール手順

なし

戻り値

なし

変更レジスタ

すべて

解説

Y8950とMBIOS全体を初期状態に設定します。MBIOSのほとんどの機能はこのファンクションを実行した後、SM_AUDIOをコールすると使用できるようになります。

注意

この機能を呼んだ後は、割り込みは禁止状態(DI)になっています。割り込みを許可する前には、MBIOSの各フックエリアをアプリケーションが設定しなければなりません(4.4.4 9.割り込みサービス 割り込み処理用ワークエリア参照)。

2.ユーザー割り込みサービスの禁止

SV_DI(0093H)
機能

ユーザー割り込みを禁止します。

コール手順

なし

戻り値

なし

変更レジスタ

なし

解説

ユーザー割り込み許可カウンタを1増やします。このカウンタが0の時に限り、ユーザー割り込み処理が行われます。

注意

このカウンタは8ビットなので、255回以上連続しての呼び出しはできません。ユーザー割り込みに関しては、「4.4.4 9.割り込みサービス MBIOSの割り込み処理」を参照して下さい。

3.ユーザー割り込みサービスの許可

SV_EI(0096H)
機能

ユーザー割り込みを許可します。

コール手順

なし

戻り値

なし

変更レジスタ

なし

解説

ユーザー割り込み許可カウンタが0でなければ1減らします。このカウンタが0のときに限りユーザー割り込みの処理が行われます。

注意

ユーザー割り込みに関しては、「4.4.4 9.割り込みサービス MBIOSの割り込み処理」を参照して下さい。

4.Y8950への書き込み

SV_ADW(0099H)
機能

Y8950のレジスタにデータを書き込みます。

コール手順
IY    マスター、スレーブのどちらに対する操作かをMIDBのアドレスで指定します。
A     書き込むデータ
C     レジスタ番号
戻り値
CYフラグ   存在しないスレーブチャンネルのY8950に対しての書き込みをした場合は1にセットされます。
変更レジスタ
IY以外のすべてのレジスタ
注意

処理の間、割り込みは禁止され、処理の後に許可されます。

5.Y8950への書き込み(割り込み禁止状態)

SV_ADW_DI(009CH)
機能

Y8950のレジスタにデータを書き込みます。

コール手順
IY    マスター、スレーブのどちらに対する操作かをMIDBのアドレスで指定します。
A     書き込むデータ
C     レジスタ番号
戻り値
CYフラグ   存在しないスレーブチャンネルのY8950に対しての書き込みをした場合は1にセットされます。
変更レジスタ

IY以外のすべてのレジスタ

注意

処理の間、割り込みは禁止され、処理の後も禁止のままです。

6.諸機能の初期設定

SV_SETUP(00ABH)
機能

諸機能の初期設定

コール手順
A      機能コード
       その他のパラメータは機能によって異なります。
戻り値

非同期割り込み機能によって呼びだされたプログラムやユーザー割り込み機能によって呼びだされたプログラムから呼びだされた場合は初期設定は行われずキャリーフラグが1になります。

変更レジスタ
IX、IY以外のレジスタ(他のレジスタは各機能により異なる)。
解説

MBIOSの各機能を初期設定します。この機能はコード指定によりいくつかの機能にわかれています。
SV_SETUPには表7.63の機能があります。以下では、その機能について説明します。
なお、コードとはSV_SETUPのAレジスタに入れる機能コードを、変更レジスタとはIX、IY以外の壊されるレジスタを意味します。

表7.63 SV_SETUPの機能一覧

ラベル コード機能
SM_AUDIO 0 楽音機能の設定
SC_CHDB 1 CHDBワークエリアの初期化
SM_INST 2 インスツルメント機能の初期化
SM_MK 3 ミュージックキーボードスキャナーの初期化

SM_AUDIO
コード

0

機能

楽音機能を設定します。モードは以下の中から選択し設定します。

  • FM9音同時発生モード
  • FM6音、リズム5音モード
  • CSMモード

またCSMモード以外の時は、どのFM音源チャンネルをインスツルメントに割り当てるかを指定します。

コール手順
C    目的によって、以下の設定をします。
     ビット7〜3      0
     ビット2         リズムモードの指定
                     0       FM9音同時発声モード
                     1       FM6音、リズム5音モード
     ビット1         マスターチャンネルCSMモード
                     0       FM音源モード
                     1       CSMモード
     ビット0         スレーブチャンネルCSMモード
                     0       FM音源モード
                     1       CSMモード

FM音源モードを指定する場合、FM音源のチャンネル番号に相当するDEレジスタのビットを1にすることにより、そのFM音源チャンネルをインスツルメントに割り当てます。
例えば、DEレジスタに0101Bを入れると、FM音源チャンネル0番と2番がインスツルメントに使われます。リズム音を使用するときは、FM音源チャンネル6番〜8番がリズム専用になるので、他の用途には使用できません。

戻り値

なし

変更レジスタ

すべて

注意

この機能は内部でSC_CHDBとSM_INSTを呼び出しています。

SC_CHDB
コード

1

機能

CHDBワークエリアを初期化します。音色データは音色番号0番のデータに初期化されます。

コール手順
IX      初期化するCHDBのアドレス
戻り値

なし

変更レジスタ

すべて

SM_INST
コード

2

機能

インスツルメント機能の初期化します。インスツルメントの音色は音色番号0番になります。

コール手順

なし

戻り値

なし

変更レジスタ

すべて

SM_MK
コード

3

機能

ミュージックキーボードスキャナーを初期化します。

コール手順
B     1             ミュージックキーボードをインスツルメントに接続する
      0             ミュージックキーボードをインスツルメントに接続しない
C     0〜15         ミュージックキーボードが押されたときのベロシティ範囲
                    0が最弱で15が最強です。このベロシティはSV_MK(ミュージックキーボードのスキャン)で参照されます。
戻り値

なし

変更レジスタ

すべて

7.リアルタイムオペレーション

SV_REAL(00AEH)
機能

リアルタイムオペレーション(実際の音声の発声など)を行います。この機能はコード指定によりいくつかの機能にわかれています。

コール手順
A      機能コード
       その他のパラメータは機能によって異なります。
戻り値
CYフラグ    正しくない入力パラメータで呼ばれた場合は1にセットされます。
変更レジスタ
IX、IY以外のレジスタ(他のレジスタは各機能により異なる)。
注意

SV_REALが実行されている間、UISVは禁止され(DI状態になっているわけではありません)、戻るときに許可されます。
SV_REALには表7.64〜表7.68の機能があります。以下で、その機能について説明します。なお、コードとはSV_REALのAレジスタに入れる機能コードを、変更レジスタとはIX、IY以外の壊されるレジスタを意味します。

表7.64 SV_SETUPの機能一覧(チャンネルオペレーション)

ラベル コード機能
RC_NOTE 32 指定されたFM音源チャンネルのキーオン、キーオフ
RC_LEGATO 33 指定されたFM音源チャンネルのレガートオン、レガートオフ
RC_DAMP 34 発音中のFM音源チャンネルを強制的に停止
RC_KON 35 指定されたFM音源チャンネルをキーオン
RC_LEGATO_ON36 指定されたFM音源チャンネルをレガートオン
RC_KOFF 37 発音中のFM音源チャンネルをキーオフ
RCA_PARAM 38 FM音源チャンネルへのリアルタイムパラメータの設定
RCA_VOICE 39 FM音源チャンネルへのボイスの設定(音色番号指定)
RCA_VPARAM 40 FM音源チャンネルへのボイスパラメータの設定
RCA_VOICEP 41 FM音源チャンネルへのボイスの設定(音色データ指定)

表7.65 SV_SETUPの機能一覧(マスターインスツルメント)

ラベル コード機能
RM_TIMER 16 タイマ割り込みの禁止・許可
RM_TIM1 17 タイマ1の周期の設定
RM_TIM2 18 タイマ2の周期の設定
RM_TEMPO 19 タイマ2の周期をテンポで設定
RM_DAMP 20 発音中の全てのFM音源チャンネルを強制的に停止
RM_PVEL 44 各リズム音のベロシティを設定
RM_PERC 21 リズム音を発声
RMA_MK 22 ミュージックキーボードをスキャンし、その状態を返す
RMA_LFO 23 振幅変調やビブラートの深さの設定
RMA_TRANS 24 現在発音中の音および以降の音のトランスポーズの設定
RM_UTEMPR 28 平均律の音程を設定されている音律の音程への変換
RM_CTEMPR 29 音律の設定
RM_PITCH 30 現在発音中の音および以降の音のピッチの設定
RM_TSRAN 31 現在発音中の音および以降の音のトランスポーズの設定

表7.66 SV_SETUPの機能一覧(インスツルメント)

ラベル コード機能
RI_DAMP 48 割り当てられたFM音源チャンネルすべての強制的な停止
RI_ALLOFF 49 割り当てられたFM音源チャンネルすべてのキーオフ
RI_EVENT 50 指定された音程を音律の変換をしてキーオン、キーオフ
RI_PCHB 51 ピッチベンダーの位置の設定
RI_PCHBR 52 ピッチベンダーが音程に与える度合の設定
RIA_PARAM 53 FM音源チャンネルへのリアルタイムパラメータの設定
RIA_VOICE 54 FM音源チャンネルへの音色番号でのボイスの設定
RIA_VPARAM 55 FM音源チャンネルへのボイスパラメータの設定
RIA_VOICEP 56 FM音源チャンネルへの音色データでのボイスの設定

表7.67 SV_SETUPの機能一覧(ADPCM/PCM)

ラベル コード機能
RM_MOVE_DI 0 各デバイス間のADPCM/PCMデータの転送
RM_READ_DI 26 デバイスのADPCM/PCMデータのメインRAMへの256バイト転送
RM_WRITE_DI 27 メインRAMの256バイトのADPCM/PCMデータのデバイスへの転送
RM_TRACE_DI 1 初期の予測値と量子化幅を元にしたADPCMデータのトレース
RM_CONV_PCM_DI 2 初期の予測値と量子化幅を元にしたADPCMデータのPCMデータへの変換
RM_CONV_ADPCM_DI 3 初期の予測値と量子化幅を元にしたPCMデータのADPCMデータへの変換
RMA_DAC_BIAS 4 PCM再生を行うときの音量(Y8950のレジスタ17H)の設定
RMA_DAC_DI 5 PCMデータの再生
RMA_ADC_DI 6 PCMデータの録音
RMA_ADPCM_BIAS 7 ADPCM再生を行うときのん量の設定
RMA_ADPLAY_DI 8 非ローカルモードでのADPCMデータの再生
RMA_ADREC_DI 9 非ローカルモードでのADPCMデータの録音
RMA_ADPLY_SAMPLE 43 ローカルモード再生中サンプリング周波数の変更
RMA_BREAK 10 ローカルモードでの再生・録音の中断
RMA_ADPLAY 11 ローカルモードでのADPCMデータの再生
RMA_ADREC 12 ローカルモードでのADPCMデータの録音
RMA_ADPLAYLP 42 ローカルモードでのADPCMデータの再生(繰り返し)
RMA_PHASE_SET_DI 13 メインRAM内の256バイトのPCMデータのADPCMデータへの変換
RMA_PHASE_EG 14 エンベロープデータの設定
RMA_PHASE_EVENT 15 指定された音程のサンプリングキーボードシミュレーションでのキーオン、キーオフ

表7.68 SV_SETUPの機能一覧(CSM再生)

ラベル コード機能
RMA_CSM_DI 25 CSMデータの再生

■チャンネルオペレーション

 チャンネルオペレーションは各FM音源チャンネルに対して処理を行います。IXレジスタでCHDBのアドレスを渡すことにより、どのFM音源チャンネルに対する処理化を指定します。また、チャンネルオペレーションはマスターチャンネルとスレーブチャンネルの両方に対して同じ処理をします。

RC_NOTE
コード

32

機能
指定されたFM音源チャンネルをキーオンし、指定時間経過後自動的にキーオフします。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
DE    音程(0〜32767)
      中央Cが15360(3C00H)で、256の変化で半音変化します。
C     キーを押す速さ(0〜15)
      0が最弱、15が最強です。
B     キーオンの時間(1から255)
      SV_TEMPO(自動キーオフ処理)がこの回数呼ばれるとキーオフします。
戻り値

なし

変更レジスタ
すべて

RC_LEGATO
コード

33

機能
指定されたFM音源チャンネルをレガートオンし、指定時間経過後自動的にキーオフします。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
DE    音程(0〜32767)
      中央Cが15360(3C00H)で、256の変化で半音変化します。
B     キーオンの時間(1から255)
      SV_TEMPOがこの回数呼ばれるとキーオフします。
戻り値

なし

変更レジスタ
すべて
注意
レガートオンはキーオンと違い、エンベロープの開始を行わないので、一度キーオンした音の音程や強さを変化させるために使用します。

RC_DAMP
コード

34

機能
発音中のFM音源チャンネルを強制的に停止します。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
戻り値

なし

変更レジスタ
すべて

RC_KON
コード

35

機能
指定されたFM音源チャンネルをキーオンします。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
DE    音程(0〜32767)
      中央Cが15360(3C00H)で、256の変化で半音変化します。
C     キーを押す速さ(0〜15)
      0が最弱、15が最強です。
戻り値

なし

変更レジスタ
すべて

RC_LEGATO_ON
コード

36

機能
指定されたFM音源チャンネルをレガートオンします。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
DE    音程(0〜32767)
      中央Cが15360(3C00H)で、256の変化で半音変化します。
戻り値

なし

変更レジスタ
すべて
注意
レガートオンはキーオンと違い、エンベロープの開始を行わないので、一度キーオンした音の音程や強さを変化させるために使用します。

RC_KOFF
コード

37

機能
発音中のFM音源チャンネルをキーオフします。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
戻り値

なし

変更レジスタ
すべて

RCA_PARAM
コード

38

機能
FM音源チャンネルへのリアルタイムパラメータの設定します。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
C     リアルタイムパラメータのCHDB先頭からのオフセット
DE    設定データ

この機能で設定できるデータは、以下の通りです。

YCA_TRANS
YCA_VOL
YCA_TRIG
YCA_VEL
YCA_PITCH
戻り値

なし

変更レジスタ
すべて

RCA_VOICE
コード

39

機能
FM音源チャンネルに音色番号でボイスを設定します。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
C     音色番号(0〜63)
戻り値

なし

変更レジスタ
すべて

RCA_VPARAM
コード

40

機能
FM音源チャンネルにボイスパラメータを設定します。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
C     リアルタイムパラメータのCHDB先頭からのオフセット
DE    設定データ

この機能で設定できるデータは、以下の通りです。

YCAO0_MULTI    CAO1_MULTI
CAO0_LS        CAO1_LS
CAO0_AR        YCAO1_AR
CAO0_RR        YCAO1_RR
CAO0_VELS      YCAO1_VELS
CAO0_VTL       YCAO1_VTL
YCA_VTRANS
YCA_FB
戻り値

なし

変更レジスタ
すべて

RCA_VOICEP
コード

41

機能
FM音源チャンネルに音色データでボイスを設定します。

コール手順
IX    FM音源チャンネルを指定するためのCHDBのアドレス
BC    音色データのアドレス
戻り値

なし

変更レジスタ
すべて

FM音源(オペレータ)データの構造

FM音源の音色を設定するときに使用するデータは、32バイトで構成されています。

表7.69 FM音源データ内容一覧

オフセットラベル意味
0〜7 V_NAME 音色の名称を8バイトの文字列で設定
8 V_TRANS(下位8ビット) 音程を計算するときのトランスポーズ値の設定
9 V_TRANS(上位8ビット)
10 V_ARG ビット7 振幅変調の深さ
0 1dB
1 4.8dB
ビット6 ビブラートの深さ
0 7セント
1 14セント
ビット5 振幅変調/ビブラートの深さ
Y8950では各チャンネルごとに深さを設定することができません。そのため、どれか音色を設定したときに深さを設定できます。このビットはビット6、7の深さをY8950に対して設定することを指定します。
0 設定しない
1 設定する
ビット4 固定音程音色
このビットはY8950にはなく、MBIOSで実現している固定音程音色であることを指定します。
0 通常の音色
1 固定音程音
ビット3〜1フィードバック量の指定
0〜7
ビット0 コネクション
2つのオペレータの結合を指定します。
0 直列周波数変調モード
1 並列サインは合成モード
11〜15 未使用
16 VO0_MULTI(オペレータ0) Y8950のレジスタ番号20H(チャンネル0)〜35H(チャンネル8)に設定されるデータを指定
ビット7 AM(振幅変調指定)
0 振幅変調なし
1 振幅変調あり
ビット6 VIB(ビブラート指定)
0 ビブラートなし
1 ビブラートあり
ビット5 EG-TYP(エンベロープタイプ)
0 減衰音
1 持続音
ビット4 KSR(キースケールレート)
0 キースケールレートなし
1 キースケールレートあり
ビット3〜0MULTIPLE(マルチプル)
実際に発生される周波数とB-number、F-numberとのばいりつを指定します。この値が大きくなれば、同じB-number、F-numberでも実際に発生される周波数は高くなります。
0 0.5倍
1〜10 1倍〜10倍
11 10倍
12 12倍
13 12倍
14 15倍
15 15倍
17 VO0_TL(オペレータ0) Y8950のレジスタ番号40H(チャンネル0)〜55H(チャンネル8)に設定するデータを指定
ビット7と6KSL(レベルキースケール)
ビット5〜0トータルレベル
18 VO0_AR(オペレータ0) Y8950のレジスタ番号60H(チャンネル0)〜75H(チャンネル8)に設定するデータを指定
ビット7〜4AR(アタックレート)
ビット3〜0DR(ディケイレート)
19 VO0_RR(オペレータ0) Y8950のレジスタ番号80H(チャンネル0)〜95H(チャンネル8)に設定するデータを指定
ビット7〜4SL(サスティンレベル)
ビット3〜0RR(リリースレート)
20 VO0_VELS(オペレータ0) MBIOSではY8950が持っていない音の強弱をソフトウェアで実現していますが、その強弱の指定に対する実際の強弱の変化の度合を設定します。この値が大きければ、強弱の指定がより有効になります。小さければ、実際の強弱の変化が少なくなり、0の場合は強弱の指定は無効になります。
ビット7〜4無効
ビット3〜0ベロシティセンシティビティ
21〜23 未使用
24 VO0_MULTI(オペレータ1) オペレータ0と同じ
25 VO0_TL(オペレータ1)
26 VO0_AR(オペレータ1)
27 VO0_RR(オペレータ1)
28 VO0_VELS(オペレータ1)
29〜31 未使用

音色一覧

略号は音源データに登録されているものです。

表7.70 システム音色ライブラリ(SVL)一覧

音色番号音色名 略号
0 Piano 1 Piano 1
1 Piano 2 Piano 2
2 Violin Violin
3 Flute 1 Flute
4 Clarinet Clarinet
5 Oboe Oboe
6 Trumpet Trumpet
7 Pipe Organ 1 PipeOrgn
8 Xylophone Xylophon
9 Organ Organ
10 Guitar Guitar
11 Santool 1 Santool
12 Electric Piano 1 Elecpian
13 Clavicode 1 Clavicod
14 Harpsicode 1 Harpsicd
15 Harpsicode 2 Harpscd2
16 Vibraphone Vibraphn
17 Koto 1 Koto
18 Taiko Taiko
19 Engine 1 Engine
20 UFO UFO
21 Synthesizer bell SynBell
22 Chime Chime
23 Synthesizer bass SynBass
24 Synthesizer Synthsiz
25 Synthesizer Percussion SynPercu
26 Synthesizer Rhythm SynRhyth
27 Harm Drum HarmDrum
28 Cowbell Cowbell
29 Close Hi-hat ClseHiht
30 Snare Drum SnareDrm
31 Bass Drum BassDrum
32 Piano 3 Piano 3
33 Electric Piano 2 Elecpia2
34 Santool 2 Santool2
35 Brass Brass
36 Flute 2 Flute 2
37 Clavicode 2 Clavicd2
38 Clavicode 3 Clavicd3
39 Koto 2 Koto 2
40 Pipe Organ 2 PipeOrg2
41 PohdsPLA PohdsPLA
42 RohdsPRA PohdsPRA
43 Orch L Orch L
44 Orch R Orch R
45 Synthesizer Violin SynViol
46 Synthesizer Organ SynOrgan
47 Synthesizer Brass SynBrass
48 Tube Tube
49 Shamisen Shamisen
50 Magical Magical
51 Huwawa Huwawa
52 Wander Flat WnderFlt
53 Hardrock Hardrock
54 Machine Machine
55 Machine V MachineV
56 Comic Comic
57 SE-Comic SE-Comic
58 SE-Laser SE-Laser
59 SE-Noise SE-Noise
60 SE-Star 1 SE-Star
61 SE-Star 2 SE-Star2
62 Engine 2 Engine 2
63 Silence Silence

■マスターインスツルメント

マスターインスツルメントはマスターチャンネルまたはスレーブチャンネルのどちらかに対して処理を行います。IYレジスタでMIDBのアドレスを渡すことにより、マスターチャンネル、スレーブチャンネルのどちらかに対する処理かを指定します。ただし、タイマ関連の処理とRM_DUMP、および、リズム関連の処理はマスターチャンネル、スレーブチャンネル両方に対して処理を行います。

RM_TIMER
コード

16

機能
タイマ割り込みを禁止・許可します。

コール手順
C     モード
      ビット7〜2     無効
      ビット1        タイマ2の禁止・許可
                     0    禁止
                     1    許可
      ビット0        タイマ1の禁止・許可
                     0    禁止
                     1    許可
戻り値

なし

変更レジスタ
すべて

RM_TIM1
コード

17

機能
タイマ1の周期を設定します。

コール手順
C     周期
      分解能80μSのタイマです。0で20.48mS、255で80μSです。
戻り値

なし

変更レジスタ
すべて

RM_TIM2
コード

18

機能
タイマ2の周期の設定

コール手順
C     周期
      分解能80μSのタイマです。0で20.48mS、255で80μSです。
戻り値

なし

変更レジスタ
すべて

RM_TEMPO
コード

19

機能
タイマ2の周期をテンポで設定します。

コール手順
C     テンポ
      1分間の四分音符の数で指定します。
戻り値

なし

変更レジスタ
すべて

RM_DAMP
コード

20

機能
発音中のすべてのFM音源チャンネルを強制的に停止します。
コール手順
なし
戻り値
なし
変更レジスタ
すべて
注意
RC_DUMPを使えば個別のチャンネルをダンプできますが、RM_DUMPでは全てのチャンネルを同時にダンプします。

RM_PVEL
コード

44

機能
各リズム音のベロシティを設定します。

コール手順
C     リズムの種類指定
      設定する以下のリズム楽器のビットを1にします。同時に2つ以上の設定ができます。
      
      ビット7〜5     無効
      ビット4        バスドラム
      ビット3        スネアドラム
      ビット2        タムタム
      ビット1        トップシンバル
      ビット0        ハイハット
E     ベロシティ(0〜31)
      0が最強で31が最弱です。
戻り値

なし

変更レジスタ
すべて
注意
選択されなかったリズム音のベロシティは変化しません。

RM_PERC
コード

21

機能
リズム音を発声します。

コール手順
C     リズムの種類指定
      設定する以下のリズム楽器のビットを1にします。同時に2つ以上の設定ができます。
      
      ビット7〜5     無効
      ビット4        バスドラム
      ビット3        スネアドラム
      ビット2        タムタム
      ビット1        トップシンバル
      ビット0        ハイハット
E     ベロシティ(0〜31)
      0が最強で31が最弱です。
戻り値

なし

変更レジスタ
すべて

RMA_MK
コード

22

機能
ミュージックキーボードをスキャンし、その状態を返します。

コール手順
DE     バッファ(9バイト)のアドレス
IY     マスター、スレーブどちらのキーボードを読むかをMIDBのアドレスで指定します。
戻り値

指定された バッファに以下のように状態が返されます。

表7.72 ミュージックキーボードバッファの内容一覧

ビット
76 5 4 3 2 1 0
0 0C B A#0 A G#G
1 0F#F E 0 D#D C#
2 0C B A#0 A G#G
3 0F#F E 0 D#D C#
4 0C B A#0 A G#G
5 0F#F E 0 D#D C#
6 0C B A#0 A G#G
7 0F#F E 0 D#D C#
8 0C 0 0 0 0 0 0

キーが押されていればそのビットに1が入ります。オフセット8のCがオクターブ2、オフセット0のCがオクターブ6です。

変更レジスタ
すべて

RMA_LFO
コード

23

機能
振幅変調やビブラートの深さの設定

コール手順
C     深さ指定
      ビット7        振幅変調の深さの指定
                     0    1dB
                     1    4.8dB
      ビット6        ビブラートの深さの指定
                     0    7セント
                     1    14セント
      ビット5〜0     無効
IY    マスター、スレーブどちらのY8950に対して設定するかをMIDBのアドレスで指定します。
戻り値

なし

変更レジスタ
すべて

RMA_TRANS
コード

24

機能
現在発音中の音および以降の音のトランスポーズを設定します。

コール手順
DE     トランスポーズ値
       単位は100/256セントです。
IY     マスター、スレーブどちらのY8950に対して設定するかをMIDBのアドレスで指定します。
戻り値

なし

変更レジスタ
すべて
注意
この機能を呼び出した後にRM_PITCH(ピッチの設定)やRM_TSRAN(トランスポーズの設定2)を呼び出すと後からの設定のみが有効になります。

テンペラメント(音律)

 MBIOSは平均律を扱っていますが、その平均律の音程をいろいろな音律の音程に変換することができます。1オクターブ内の12音の各音程が、平均律の音程から何セント離れているかを12バイトのテーブルで記憶しています。テーブルのアドレスがワークエリアの3479Hにあり、ここは通常347BHからは実際のテーブルがあり、以下の音程と対応しています。

RM_UTEMPR
コード

28

機能
平均律の音程を設定されている音律の音程への変換します。

コール手順
D     音程(中央Cが60)
戻り値
DE    変換された音程
変更レジスタ

すべて

RM_CTEMPR
コード

29

機能
音律を設定します。

コール手順
C       音律コード
        0     ピタゴラス
        1     ミーントーン
        2     ヴェルクマイスター
        3     ヴェルクマイスター(修正)
        4     ヴェルクマイスター(別)
        5     キルンベルガー
        6     キルンベルガー(修正)
        7     ヴァロッティ・ヤング
        8     ラモー
        9     完全平均律(初期値)
        10    純正律 c メジャー(a マイナー)
        11    純正律 cis メジャー(b マイナー)
        12    純正律 d メジャー(h マイナー)
        13    純正律 es メジャー(c マイナー)
        14    純正律 e メジャー(cis マイナー)
        15    純正律 f メジャー(d マイナー)
        16    純正律 fis メジャー(es マイナー)
        17    純正律 g メジャー(e マイナー)
        18    純正律 gis メジャー(f マイナー)
        19    純正律 a メジャー(fis マイナー)
        20    純正律 b メジャー(g マイナー)
        21    純正律 h メジャー(gis マイナー)
戻り値

なし

変更レジスタ
すべて

RM_PITCH
コード

30

機能
現在発音中の音および以降の音のピッチを設定します。

コール手順
BC     マスターチャンネルのピッチ
DE     スレーブチャンネルのピッチ
       ピッチは中央Cのすぐ上のAの周波数で指定します。範囲は410〜459で、単位はHzです。初期値は440Hzです。
戻り値

なし

変更レジスタ
すべて
注意
この機能は内部でRMA_TRANS(トランスポーズの設定1)を実行していますので、この機能とトランスポーズと同時に使用する場合には、次のRM_TSRANでトランスポーズを設定して下さい。

RM_TSRAN
コード

31

機能
現在発声中の音および以降の音のトランスポーズを設定します。

コール手順
BC     マスターチャンネルのトランスポーズ値
DE     スレーブチャンネルのトランスポーズ値
       トランスポーズ値は-12799〜12799の範囲で指定します。、単位はセントで、初期値は0です。
戻り値

なし

変更レジスタ
すべて

■インスツルメント

RI_DAMP
コード
48
機能
割り当てられたFM音源チャンネルすべてを強制的に停止します。
コール手順
なし
戻り値
なし
変更レジスタ
すべて

RI_ALLOFF
コード

49

機能
割り当てられたFM音源チャンネルすべてをキーオフします。
コール手順
なし
戻り値
なし
変更レジスタ
すべて

RI_EVENT
コード

50

機能
指定された音程を音律の変換をしてキーオン、またはキーオフします。

コール手順
■キーオンの時
D      音程(中央Cが60)+80H
E      ベロシティ(0が最弱、15が最強)
■キーオフの時
D      音程(中央Cが60)
戻り値

なし

変更レジスタ
すべて
注意
インスツルメントは楽器をシミュレートしているので、同じ音程を2度続けてキーオンすると、その音が1度キーオフされて再びキーオンされます。

RI_PCHB
コード

51

機能
ピッチベンダーの位置の設定を与えます。

コール手順
DE     ピッチベンダーの位置
       16ビットの符号付き(負数は2の補数表現)です。7FFFHが最上位置、0が中央、8000Hが最下位置です。
戻り値

なし

変更レジスタ
すべて
注意
この機能は内部でRCA_PARAM(リアルタイムパラメータの設定)を呼び出しています。

RI_PCHBR
コード

52

機能
ピッチベンダーが音程に与える度合を設定します。

コール手順
C    度合(0〜12)
     単位は100セントです。例えばこの値を4にし、ピッチベンダーの位置を7FFFHにした場合、音程は約+400セント変化します。
戻り値

なし

変更レジスタ
すべて

RIA_PARAM
コード

53

機能
割り当てられたFM音源チャンネルにリアルタイムパラメータを設定します。

コール手順
IY     マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C      リアルタイムパラメータのCHDB先頭からのオフセット
DE     設定データ
       この機能で設定できるパラメータは以下の通りです。
       
       YCA_TRANS
       YCA_VOL
戻り値

なし

変更レジスタ
すべて

RIA_VOICE
コード

54

機能
割り当てられたFM音源チャンネルに音色番号でボイスを設定します。

コール手順
IY     マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C      音色番号(0〜63)
戻り値

なし

変更レジスタ
すべて

RIA_VPARAM
コード

55

機能
割り当てられたFM音源チャンネルにボイスパラメータを設定します。

コール手順
IY     マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C      リアルタイムパラメータのCHDB先頭からのオフセット
DE     設定データ
       この機能で設定できるパラメータは以下の通りです。
YCAO0_MULTI    CAO1_MULTI
CAO0_LS        CAO1_LS
CAO0_AR        YCAO1_AR
CAO0_RR        YCAO1_RR
CAO0_VELS      YCAO1_VELS
CAO0_VTL       YCAO1_VTL
YCA_VTRANS
YCA_FB
戻り値

なし

変更レジスタ
すべて

RIA_VOICEP
コード

56

機能
FM音源チャンネルに音色データでボイスを設定します。

コール手順
IY     マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
BC     音色データのアドレス
戻り値

なし

変更レジスタ
すべて

■ADPCM・PCM
 ADPCM・PCMの録音、再生、転送およびADPCM、PCM間での変換などを行います。これらの操作のためにアプリケーションはPDB(PCM Data Block)を用意し、IXレジスタによってその領域をポイントします。
 ローカルメモリに対してADPCMで録音や再生を行う場合をローカルモードと呼び、Y8950がCPUの途中介在なしに録音・再生ができます。MBIOSはこのモードをサポートし、しかも、CPUに対して非同期割り込み機能を用いて録音や再生の終了を知らせることもできます。
 ADPCMの録音・再生時には、操作対象となるデバイスによってエントリが以下のように異なることに注意して下さい。

■ローカルメモリに対して操作を行う場合

録音時  RMA_ADREC
再生時  RMA_ADPLAY

■内部メモリに対して操作を行う場合

録音時  RMA_ADREC_DI
再生時  RMA_ADPLAY_DI

 ローカルモードでない録音・再生動作の最中にCTRL+STOPキーが押された場合、その動作は中断されます。ただしMSXのワークエリア【BASROM(FBB1H)】が0でなければ中断されません。

■ADPCM・PCM録音時の同期スタート
 音声録音するとき、通常はMBIOSが呼び出された時点から録音が開始されます。しかし、同期スタートモードを指定すると、入力音声がある程度の大きさになってから録音を開始させることができます。同期スタートモードを指定するには、アプリケーションがMBIOSを呼び出す前に【SYNCRF(3488H)】に0でない値を書き込みます。

ADPCM・PCM再生時のリピート再生

 音声を再生するとき、1つのデータを繰り返して再生することができます。この動作をリピート再生といいます。アプリケーションがMBIOSを呼び出す前に【REPFLG(3489H)】に0でない値を書き込むと、リピート再生ができます。
 また、リピート再生を停止するには、モードによって以下の方法があります。

■ローカルモードの場合

RMA_BREAK(ローカルモード再生・録音の中断)を呼び出す。

■非ローカルモードの場合

CTRL+STOPキーを押す。

PDBの詳細

 PDBは16バイトで構成されています。このデータブロックはアプリケーションプログラムがADPCM・PCM操作をするときにその領域を用意します。

表7.74 PDB内容一覧

オフセットラベル意味
0 PDB_DEV ADPCM・PCM操作の対象となるデータが保存されているデバイスを設定します。
1 未使用
2 PDB_ADDR(下位8ビット) ADPCM・PCM操作の対象となるデータの開始アドレスを設定します。単位は256バイトですが、デバイスがメインRAMの場合に限り、1バイトになります。
3 PDB_ADDR(上位8ビット)
4 PDB_SIZE(下位8ビット) ADPCM・PCM操作の対象となるデータ長さを設定します。単位はデバイスに関わらず256バイトです。
5 PDB_SIZE(上位8ビット)
6 PDB_SAMPLE(下位8ビット) ADPCM・PCM操作の録音・再生時のサンプリング周波数を設定します。単位は1Hzです。範囲はADPCMのとき1800〜16000、PCMのとき1800〜12000です。
7 PDB_SAMPLE(上位8ビット)
8 PDB_PCM(下位8ビット) ADPCMのトレース時およびPCMへの変換をするときにADPCMの初期予測値として用いられます。この値はオフセットバイナリで表され、8000Hが0です。通常、8000H(つまり0)を設定します。
9 PDB_PCM(上位8ビット)
10 PDB_STEP(下位8ビット) ADPCMのトレース時およびPCMへの変換をするときにADPCMの初期量子化幅として用いられます。この値は絶対値で表され、範囲は007EHを設定します。
11 PDB_STEP(上位8ビット)
12〜15未使用

次にADPCM・PCMの各機能について説明します。

RM_MOVE_DI
コード

0

機能
各デバイス間のADPCM/PCMデータを転送します。

コール手順
IX     転送元を示すPDBのアドレス
       転送元を示すPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(転送するサイズ)
IY     転送先を示すPDBのアドレス
       転送先を示すPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
戻り値
CYフラグ転送元、転送先のどちらであれ、指定されたデバイスがローカルモードによる動作中である場合には、転送は行われずに1にセットされ戻ります。転送が行われた場合、転送元のPDB_SIZEが転送先のPDB_SIZEにコピーされます。
変更レジスタ

すべて

RM_READ_DI
コード

26

機能
デバイスのADPCM・PCMデータをメインRAMに256バイト転送します。

コール手順
IX     転送元を示すPDBのアドレス
DE     転送先を示すメモリアドレス
       転送先を示すPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
戻り値
CYフラグ      転送先のデバイスがローカルモードによる動作中である場合には、行われず1がセットされ戻ります。
変更レジスタ

すべて

RM_WRITE_DI
コード

27

機能
メインRAMの256バイトのADPCM・PCMデータをデバイスへに転送します。

コール手順
DE     転送元のメモリアドレス
IY     転送先を示すPDBのアドレス
       転送先を示すPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
戻り値

CYフラグ,転送元のデバイスがローカルモードによる動作中である場合には、転送は行われず1がセットされ戻ります。

変更レジスタ
すべて

RM_TRACE_DI
コード

1

機能
初期の予測値と量子化幅を元にADPCMデータをトレースし、次の予測値と量子幅を求めます。

コール手順
C     開始モード
      0     初期予測値を8000H、量子化幅を007FHで開始します。
      1     初期予測値、量子化幅はPDBの値を使用します。
IX    トレースするデータを示すPDBのアドレス
      PDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(転送するサイズ)
      開始モードが1の場合、次の項目も設定します。
              PDB_PCM(初期予測値)
              PDB_STEP(初期量子化幅)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中である場合には、トレースは行われず1がセットされ戻ります。
            トレースが行われた場合、PDBに以下の項目データが設定されます。
                 PDB_ADDR(次の開始アドレス)
                 PDB_PCM(次の予測値)
                 PDB_STEP(次の量子化幅)
            これらのデータを次のトレースに使用して、大きなADPCMのデータを幾度かに分割してトレースすることができます。
変更レジスタ

すべて

RM_CONV_PCM_DI
コード

2

機能
初期の予測値と量子化幅を元にADPCMデータをPCMのデータに変換します。

コール手順
C     開始モード
      0     初期予測値を8000H、量子化幅を007FHで開始します。
      1     初期予測値、量子化幅はPDBの値を使用します。
IX    変換元のADPCMデータを示すPDBのアドレス
IY    変換先のPCMデータを示すPDBのアドレス
      変換元のPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(変換量)
              PDB_SAMPLE(サンプリング周波数)
      開始モードが1の場合、次の項目も設定します。
              PDB_PCM(初期予測値)
              PDB_STEP(初期量子化幅)
      変換先のPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中である場合には、変換は行われず1がセットされ戻ります。変換が行われた場合、PDBに以下の項目のデータが返されます。
            
            ■変換元のPDB
                 PDB_PCM(次の予測値)
                 PDB_STEP(次の量子化幅)
            これらのデータを次の変換に使用して、大きなADPCMのデータを幾度かに分割して変換することができます。

            変換先のPDB
              PDB_SIZE(変換後の量)
              PDB_SAMPLE(変換元のサンプリング周波数のコピー)
変更レジスタ

すべて

注意
この変換はデータ量が2倍になるので、変換先のデータ領域の大きさに注意して下さい。

RM_CONV_ADPCM_DI
コード

3

機能
初期の予測値と量子化幅を元にしたPCMデータをADPCMのデータへに変換します。

コール手順
C     開始モード
      0     初期予測値を8000H、量子化幅を007FHで開始します。
      1     初期予測値、量子化幅はPDBの値を使用します。
IX    変換元のPCMデータを示すPDBのアドレス
IY    変換先のADPCMデータを示すPDBのアドレス
      変換元のPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(変換量)
              PDB_SAMPLE(サンプリング周波数)
      変換先のPDBに以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
      開始モードが1の場合、次の項目も設定します。
              PDB_PCM(初期予測値)
              PDB_STEP(初期量子化幅)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中である場合には、変換は行われず1がセットされ戻ります。変換が行われた場合、変換先のPDBに以下の項目のデータが返されます。
              PDB_SIZE(変換後の量)
              PDB_SAMPLE(変換元のサンプリング周波数のコピー)
              PDB_PCM(次の予測値)
              PDB_STEP(次の量子化幅)
            これらのデータを次の変換に使用して、大きなADPCMのデータを幾度かに分割して変換することができます。
変更レジスタ

すべて

注意
この変換はデータ量が2分の1になるので、変換元のデータ領域の大きさは偶数でなければなりません。

RMA_DAC_BIAS
コード

4

機能
PCM再生を行うときの音量(Y8950のレジスタ17H)を設定します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       音量(指数)
        範囲は1〜7で、7が最大音量です。
戻り値

なし

変更レジスタ
すべて

RMA_DAC_DI
コード

5

機能
PCMデータを再生します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
              PDB_の以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中である場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADC_DI
コード

6

機能
PCMデータを録音します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
              PDB_の以下の項目を設定します。
              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中である場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADPCM_BIAS
コード

7

機能
ADPCM再生を行うときの音量を設定します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       音量
        範囲は0〜63で、63が最大音量です。
戻り値

なし

変更レジスタ
すべて

RMA_ADPLAY_DI
コード

8

機能
ADPCMデータを非ローカルモードで再生します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
        PDB_の以下の項目を設定します。

              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中であったり、外部デバイスである場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADREC_DI
コード

9

機能
ADPCMデータを非ローカルモードで録音します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
        PDB_の以下の項目を設定します。

              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中であったり、外部デバイスである場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADPLY_SAMPLE
コード

43

機能
ローカルモードの再生を行っている最中にサンプリング周波数を変更します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
DE      サンプリング周波数
戻り値

なし

変更レジスタ
すべて

RMA_BREAK
コード

10

機能
ローカルモードの再生や録音の動作を中断します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
戻り値

なし

変更レジスタ
すべて

RMA_ADPLAY
コード

11

機能
ADPCMデータをローカルモードで再生します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
        PDB_の以下の項目を設定します。

              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中であったり、非外部デバイスである場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADREC
コード

12

機能
ADPCMデータをローカルモードで録音します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
        PDB_の以下の項目を設定します。

              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中であったり、非外部デバイスである場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_ADPLAYLP
コード

42

機能
ADPCMデータをローカルモードで再生します。データの終わりまで再生が終了すると先頭から再び再生を開始し、中断されるまでその動作を続けます。中断するにはRMA_BREAK(ローカルモード再生・録音の中断)を再生します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
IX      再生・録音の対象となるPDBのアドレス
        PDB_の以下の項目を設定します。

              PDB_DEV(デバイス番号)
              PDB_ADDR(開始アドレス)
              PDB_SIZE(サイズ)
              PDB_SAMPLE(サンプリング周波数)
戻り値
CYフラグ    指定されたデバイスがローカルモードによる動作中であったり、非外部デバイスである場合には、動作は行われず1がセットされて戻ります。
変更レジスタ

すべて

RMA_PHASE_SET_DI
コード

13

機能
メインRAM内の256バイトのPCMデータを1つの波形データと見なし以下のようなADPCMデータに変換して外部RAM内に記憶します。
外部RAMアドレス音程番号波形数
0000H〜07FFH 24H〜36H16個
0800H〜0FFFH 37H〜42H32個
1000H〜17FFH 43H〜4EH64個
1800H〜1FFFH 4FH〜5AH128個

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
DE      PCMデータのアドレス
戻り値

なし

変更レジスタ
すべて
注意
変換に先立って、RMA_BREAK(ローカルモード再生・録音の中断)が実行されます。

RMA_PHASE_EG
コード

14

機能
エンベロープデータを設定します。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
DE      エンベロープデータ(7バイト)のアドレス
        エンベロープデータの内容(「4.4.5 ワークエリアの詳細 サンプリングキーボードシミュレーション」参照)
オフセット内容
0タイマ1に設定する値
1トータルレベル
2アタックレート
3ディケイレート1
4サスティンレベル
5ディケイレート2
6リリースレート
戻り値

なし

変更レジスタ
すべて

RMA_PHASE_EVENT
コード

15

機能
指定された音程をサンプリングキーボードシミュレーションでキーオン、またはキーオフします。

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。

■キーオンの時
D        音程(中央Cが60)+80H

■キーオフの時
D        音程(中央Cが60)
戻り値

なし

変更レジスタ
すべて
注意
仕様できる音程はキーコードで24H〜5AHです。

RMA_CSM_DI
コード

25

機能
CSMデータの再生

コール手順
IY      マスター・スレーブどちらのチャンネルかをMIDBのアドレスで指定します。
B       再生音量
        範囲は0〜127で、0が最大音量です。
C       フィルタ指定(表7.79中のZMA_PH_FILTER参照)
DE      再生対象となるCSMデータのアドレス
戻り値

なし

変更レジスタ
すべて

■CSMデータ
 1つのデータはいくつかのブロックデータからなり、1つのブロックデータはいくつかのフレームデータからなります。


図7.36 CSMデータの形式

*1 インターバル
   タイマ2に設定されるデータで、0が81.9mS、255が0.32mSです。
*2 ピッチ
   タイマ1に設定されるデータで、0が20.9ms、255が0.08mSです。
*3 トータルレベル
   各チャンネルの音量データです。0がサイダ音量で127が最小音量です。
*4 NOTE
   各チャンネルの音程データです。上位4ビットでオクターブを0〜7の範囲で、下位4ビットで音階を指定します。

音階データ

0         C#
1         D
2         D#
3         なし
4         E
5         F
6         F#
7         なし
8         G
9         G#
10        A
11        なし
12        A#
13        B
14        C
15        なし

8. ミュージックキーボードのスキャン

SV_MK(00B1H)
機能

ミュージックキーボードをスキャンして、前回のスキャン結果と比較し変化があればAST_MK(ミュージックキーボード非同期割り込み)を呼び出します。

コール手順
なし

戻り値
CYフラグ     非同期割り込み機能によって呼び出されたプログラムからの呼び出しの場合、スキャンはされずに1がセットされます。
変更レジスタ

すべて

注意
マスターチャンネルとスレーブチャンネルのキーボードの状態は論理的にORがなされています。

9. 割り込みサービス

SV_lRQ(00B4H)
機能

アプリケーションプログラムがハードウェアの割り込みを検出したときにH.KEYI(FD9AH】を設定することにより可能)、MBIOSに対してそれを知らせるためのエントリです。このエントリの内部でY8950に対する割り込み処理を行い、非同期割り込みなどのサービスを実現しています。

コール手順
なし
戻り値
なし
変更レジスタ
なし
注意
このエントリが呼ばれない限り、MBIOSはすべての割り込みサービスを行うことはできません。ハードウェアの割り込みによりアプリケーションに制御が渡った時点ではY8950のステータスレジスタはCPUに読まれていないので、割り込みのリクエストはかかったままなので、ハードウェア割り込みを許可する命令(EIなど)を実行してはなりません。

■MBIOSの割り込み処理

MBIOSにおいて割り込みは次のように処理されます。
 1. ハードウェアの割り込みによって0038H番地が呼ばれる。
 2. OO38H番地からHK_IRQ38にジャンプする。
 3. HK_IRQ38はSV_IRQをコールする。
 4. SV_IRQでは、
  ■MSX-AUDIOのステータスを読み込んで、リクエストのあった割り込みの割り込み要求回数を1増やす。
  ■次にHK_VDPIRQをコールし、帰ってきたときのキャリーフラグが0であればVDPのステータスを読み、割り込みリクエストがあれば割り込み要求回数を1増やす。
  ■次にHK_USERIRQをコールする。帰ってきたらユーザー割り込みが許可されているか調べ、許可されていれば(ユーザー割り込みカウントが0のとき)UISV(User Interrupt SerVice)をコールする。禁止されていたら6.へ行く。
 5. UISVでは次の順に割り込み要求回数を調べ、1番最初にその回数がOでないベクタを見つけるとそのベクタで示されているプログラムをコールし(この際に割り込み要求回数がAレジスタで渡されます)、戻る。
  ADPCM終了(マスターチャンネル)ベクタ
  ADPCM終了(スレーブチャンネル)ベクタ
  IRQ-PRIO1で示されるベクタ
  IRQ_PRI02で示されるベクタ
  IRQ-PRIO3で示されるベクタ
  IRQ_PRIO4で示されるベクタ
 6. SV_IRQの中に戻る。
 7. HK_JRQ38の中に戻る。
 8. ハードウェア割り込みがかかったプログラムに戻る。
なお、MBIOSのスロットが表に出ていないときはMSXのBIOSにはいるため、アプリケーションはH.KEYIのフックを使用してMBIOSのOO38H番地を呼び出さなければなりません。

■拡張BASICの割り込み使用法

MSX-AUDIOの拡張BASICにおいて割り込み処理は次のように設定されます。
 1. H.KEYIを設定してすべてのハードウェア割り込みを拡張BASICのプログラムに向けている。そのプログラムの中からMBIOSのSV_IRQをコールする。
 2. HK_IRQ38を拡張BASICのプログラムに向けている。そのプログラムはレジスタをすべてセーブした後、MSXのBIOSの0038H番地をインタースロットコールする.
 3. ADPCM終了割り込みを拡張BASICに向けている。
 4. IRQ_PRIOは初期値で使用。
 5. HK_VRAMは初期値で使用。
 6. HK_USERIRQは初期値で使用。
 7. HK.VDPIRQはキャリーをセットするプログラムを設定。

■割り込み処理用ワークエリア

各々8バイトのフックエリアです。MBIOSの内部から呼び出されるプログラムが置かれており、以下のエントリがあります,

表7.75 割り込み処理用ワークエリアー覧

ラベルアドレス機能
HK_IRQ383300Hハードウェア割り込みフック
HK_VDPIRQ3308HVDP割り込み処理指定
HKLUSERIRQ3310Hアプリケーション割り込みフック
HK_VRAM3318HVRAM操作フック
UISVベクタテーブル3340H〜ユーザー割り込みサービスのベクタテーブル

HK_IRQ38(3300H)
機能

MBIOSのスロットが表に出ていて割り込みがかかったときに、0038H番地からこのフック(プログラム)にジャンプします。

SV_RESETで初期設定されるプログラム

hk_irq38:
  call   sv_irq
  ei
  ret
  defs   3
注意

SV_RESETを呼び出した後にすぐEI命令を実行し、VDPからの割り込みがかかると暴走します。EI命令を実行する前に、HK_IRQ38を以下のように書き換えて下さい。

hk_irq38:
  call   sv_irq
  ret
  defs   4
HK_VDPIRQ(3308H)
機能

SV_IRQが呼ばれたときにVDPのステータスレジスタを読んでその処理をするかどうかを返すフック(プログラム)です。
このフックがリターンするときにキャリーフラグが1であるならばVDPのステータスは読まれません。Oであるならば読まれます。

SV_RESETで初期設定されるプログラム

hk _vdpirq:   ;clear carry flag
  xor   a
  ret
  defs   6
注意

MSXの通常動作においては、VDPのステータスをMSXのBIOS以外が読み込むと本体のキーボードなどの割り込み処理が行われなくなります。

HK_USERIRQ(3310H)
機能

SV_IRQが呼ばれたときにその中からアプリケーションプログラムを呼びたい場合に使用するフックです。

SV_RESETで初期設定されるプログラム

hk_userirq:
  ret
  defs   7
HK_VRAM(3318H)
機能

ADPCM・PCM操作においてVRAMをアクセスする前に呼ばれるフックです。このフックがリターンするときにキャリーフラグが1であるならばVRAMに対する動作は行われません。0であるならば行われます。

SV_RESETで初期設定されるプログラム

hk_vram:
  xor   a    ;clear carry flag
  ret
  defs   6

■UISVベクタテーブル

SV_IRQが呼ばれてY8950のステータスを読んだ後、各々の割り込み原因別に呼び出すアプリケーションのアドレスのテーブルです。このアプリケーションを呼び出す機能をUISV(User InterruptSerVice)と呼びます。MBIOSの内部を実行中はUISVは禁止され、ハードウェアの割り込みがあった場合にはその回数が記憶されます。UISVが許可され、次のハードウェア割り込みがあるとアプリケーションを呼ぶときに今までの回数をAレジスタで知らせます。各々のベクタは3バイトで構成され、最初の1バイトは割り込み回数の記憶に使われています。次の2バイトが呼び出すアプリケーションのアドレスです。
OOOOHが設定してあると呼び出しは行われません。

表7.76 UISVベクタテープルー覧

ラベルアドレス内容初期値
IRQ_TIM13340Hタイマ1割り込みOOOOH
IRQ_TIM23344Hタイマ2割り込みSV_TEMPO
IRQ_VDP3348HVDP割り込みOO0OH
IRQ_USER334CHユーザー割り込みOOOOH
ZIRQ_ADP_M3350HADPCM終了割り込み(マスタ)OOOOH
ZIRQLADP_S3354HADPCM終了割り込み(スレーブ)GOOOH

■UISV優先順位テーブル

1回のUISVで処理される割り込みは1つだけなので、同時に2つ以上の割り込みが起きたときにどの割り込みを優先させるかをこのテーブルに登録します。具体的には、UISVベクタテーブルのアドレスを保存しておきます。

表7.77 UISV優先順位テーブル一覧

ラベルアドレス優先順位初期値
IRQ_PRIO13360H1(最高優先)IRQ_TIM2
IRQ_PRIO23362H2IRQ_TIM1
IRQ_PRIO33364H3IRQ_VDP
IRQ_PRIO43366H4(最低優先)IRQ_USER

■非同期割り込み

非同期割り込み機能はMBIOSにあらかじめ登録し、ある事象が起きたときにMBIOSからアプリケーションを呼び出す機能です。
MBIOSがアプリケーションを呼び出すときには、インタースロットコールではなく通常のコール命令が使われるので、MBIOSと同じCPUアドレス領域(0000H〜3FFFH)にある別のスロットのプログラムは呼び出せません。
アプリケーションが呼び出された時点では、MBIOSを直接コール命令で呼び出すことができます。アプリケーションからMBIOSに戻るときは通常のリターン命令を使用します。
非同期割り込みサービスには以下のようなものがあります。

表7.78 非同期割り込み一覧

ラベルアドレス機能
AST_MK3370Hミュージックキーボード割り込み
AST_ADPCM_M3372HADPCM終了割り込み
AST_ADPCM_S3374HADPCM終了割り込み
SV_TEMPO00B7H自動キーオフ処理

ここでは以下のように説明します。

アドレス

MBIOSが呼び出すアドレスを記億しているアドレスです。この内容が0のときは呼び出しは行われません。

コール手順

アプリケーションが呼び出されるときに設定される値です。

戻り値

アプリケーションがMBIOSに返す値です、

変更レジスタ

アプリケーションが破壊してもかまわないレジスタです。

AST_MK(3370H)
機能

ミュージックキーボードの変化を検出したときに呼び出されます。アプリケーションがキーボードの記録などをするときに使用できます。

コール手順
■キーが押されたとき
D  7 6  5  4  3  2  1  0
   1 × × × × × × ×
         キーコード

E  キーを押した速さ
ただし、現在のMBIOSはキー速度検出機能を持っていないのでSM_MK(ミュージックキーボードスキャナーの初期化)で設定された値が入ります。
■キーが離されたとき
D  7 6  5  4  3  2  1  0
   0 × × × × × × ×
         キーコード
戻り値

なし

変更レジスタ
IX、IY以外のすべて

注意

この機能によって呼び出されたアプリケーションは、以下のMBIOSエントリを呼び出すことはできません。

SV_MK(ミュージックキーボードのスキャン)
SV_SETUP(諸機能の初期設定)

AST_ADPCM_M(3372H)
機能

マスターチャンネルで、外部デバイスを使用したADPCMの再生や録音が終了したときに呼び出されます。

コール手順
IX  再生・録音に使用されたPDBのアドレス
戻り値

なし

変更レジスタ
IX以外のすべて

注意

この機能によって呼び出されたアプリケーションは、以下のMBIOSエントリを呼び出すことはできません。

SV_MK(ミュージックキーボードのスキャン)
SV_SETUP(諸機能の初期設定)

AST_ADPCM_S(3374H)
機能

スレーブチャンネルで、外部デバイスを使用したADPCMの再生や録音が終了したときに呼び出されます。

コール手順
IX  再生・録音に使用されたPDBのアドレス
戻り値

なし

変更レジスタ
IX以外のすべて

注意

この機能によって呼び出されたアプリケーションは、以下のMBIOSエントリを呼び出すことはできません。

SV_MK(ミュージックキーボードのスキャン)
SV_SETUP(諸機能の初期設定)

10.自動キーオフ処理

SV_TEMPO(00B7H)
機能

各々のFM音源チャンネルのZC_COUNT(デュレーションカウント)を調べ、O以外のときには1減らします。そして、値がOになったときにそのチャンネルに対してキーオフします。

コール手順
なし
戻り値
なし
変更レジスタ
すべて

11.スロットハンドリング

MSXのBIOSにあるスロット操作関連のプログラムはMBIOSにも用意されています。これらはアドレス、入出力条件ともに標準のMSXのBIOSと同等です。

RDSLT
WRSLT
CALSLT
ENASLT
CALLF

 4.4.5 ワークエリアの詳細

1.MIDBの詳細

 MIDB(Master Instrument Data Block)はMSX-AUDIO全体をコントロールするためにマスターチャンネル用とスレーブチャンネル用の2つがあります。1つのMIDBは64バイトで構成されています。マスターチャンネル用はMIDB_M、スレーブチャンネル用はMIDB_Sという名称です。
 表7.79でMIDBの内容について説明します。なお、オフセットとは、各MIDBの先頭からオフセットを意味します。

表7.79 MIDBの内容一覧(その1)

名称 ラベルオフセット意味
タイマ1 YM_TIM1 2 マスターチャンネル用のY8950に設定されたタイマ1の値を保存します。タイマ割り込みはマスターチャンネルにしか設定されないので、スレーブチャンネルのMIDBにはこの値はありません。
タイマ2 YM_TIM2 3 マスターチャンネル用のY8950に設定されたタイマ2の値を保存します。タイマ割り込みはマスターチャンネルにしか設定されないので、スレーブチャンネルのMIDBにはこの値はありません。
ADPCM再生ボリュームYMA_BIAS 18 ADPCM再生時の音量を保存します。範囲は0〜63です。
フィルタ設定 YMA_AUDIO 25 ADPCM・PCM録音再生時のフィルタ設定を保存します。
ビット7〜4 無効
ビット3 フィルタの設定
0 PCM/CSM音用フィルタ
1 FM音用フィルタ
ビット2〜0 無効
トランスポーズ YMA_TRANS 32(下位8ビット) 音程を計算するとき、トランスポーズ値として用いられます。全チャンネルに対して有効です。
33(上位8ビット)
LFO YMA_LFO 34 Y8950に設定された振幅変調およびビブラートの深さを保存します。
ビット7 振幅変調の深さ
0 1dB
1 4.8dB
ビット6 ビブラートの深さ
0 1セント
1 14セント
ビット5〜0 無効
RAMサイズ YMA_RAM 35 Y8950に接続されている外部RAMの容量をイニシャライズ時に256KbitのRAMがいくつかあるかを調べて、その個数を保存します。
フラグ ZMA_FLAG 36 そのチャンネルに関するフラグが保存されています。
ビット7〜3 無効
ビット2 フィルタの設定
0 PCM/CSM音用フィルタ
1 FM音用フィルタ
PDBアドレス ZMA_FLAG 37(下位8ビット) ADPCM・PCM操作の際のPDB(PCM Data Block)のアドレスを記憶しています。
38(上位8ビット)
フィルタ指定 ZMA_PH_FILTER39 ADPCM・PCM録音再生時のフィルタ設定を保存します。
ビット7〜3 無効
ビット2 自動フィルタ設定フラグ
0 発声対象によって自動的にフィルタを設定する
1 アプリケーションの設定を使用する
ビット1 無効
ビット0 フィルタの設定(ビット2が0のときは無効)
0 フィルタ特性A
ADPCM・PCM録音再生のときに使用するフィルタ
1 フィルタ特性B
FM音再生のときに使用するフィルタ

■サンプリングキーボードエミュレーション

 サンプリングキーボードエミュレーションとは、PCMの波形データをADPCMデータに変換して、エンベロープをつけながら音を発生する仕組みです。エンベロープはタイマ0をつかって割り込みをかけ、その割り込み毎にADPCM再生音量(Y8950のレジスタ12H)を書き換えて実現しています。
 表7.80はそれに関するデータの内容です。このデータはMIDBの後半部分です。

表7.80 MIDBの内容一覧(その2)

名称 ラベルオフセット意味
トータルレベル ZMA_PH_TL 40 再生時のレベル(音量)を保存します。範囲は0〜63で、63が最大レベルです。
アタックレート ZMA_PH_AR 41(下位8ビット) アタックレートを保持しています。タイマ割り込み時、そのときのレベルにこのアタックレートが加算され、和の上位8ビットがY8950に対して設定されます。その和の上位8ビットが63以上となったときはディケイレート1の処理に入ります。
42(上位8ビット)
ディケイレート1 ZMA_PH_D1R 43(下位8ビット) ディケイレート1を保存します。タイマ割り込み時、そのときのレベルにこのディケイレート1が加算され、和の上位8ビットがY8950に対して設定されます。その和の上位8ビットが次のサスティーンレベルになったときはディケイレート2の処理に入ります。
44(上位8ビット)
サスティーンレベル ZMA_PH_SL 45 ディケイレート1からディケイレート2に移るレベルであるサスティーンレベルを保持しています。範囲は0〜63で、63が最大レベルです。
ディケイレート2 ZMA_PH_D2R 46(下位8ビット) ディケイレート2を保存します。タイマ割り込み時、そのときのレベルにこのディケイレート2が加算され、和の上位8ビットがY8950に対して設定されます。その和の上位8ビットが0になるか、キーオフのイベントがあるまで割り込み毎に加算されます。
47(上位8ビット)
リリースレート ZMA_PH_RR 48(下位8ビット) リリースレートを保存します。タイマ割り込み時、そのときのレベルにこのリリースレートが加算され、和の上位8ビットがY8950に対して設定されます。その和の上位8ビットが0になるまで割り込み毎に加算されます。
49(上位8ビット)
カレントレベル ZMA_PH_EG 50(下位8ビット) エンベロープジェネレータを実現するため、そのときのレベルを保持するために使用されます。
51(上位8ビット)
エンベロープステータス ZMA_PH_STAT52 タイマ割り込み時に、以上に述べたどのレートを使用するかのステータスとして使用します。
0 音が発生されていない状態
1 アタックレート処理中
2 ディケイレート1処理中
3 ディケイレート2処理中
4 リリースレート処理中

2.CHDBの詳細

 CHDB(CHannel Data Block)はFM音源のオペレータをコントロールするためのデータブロックで、チャンネルの数と同じく9つあり、Y8950に設定したデータを保存します。これは、Y8950の各レジスタが書き込み専用であるためです。
 1つのCHDBは64バイトで構成され、そのうち32バイトはマスターチャンネル用で、残りの32バイトはスレーブチャンネル用です。各32バイトのうち、最初の8バイトはオペレータ0の、次の8バイトはオペレータ1のコントロールに使用されます。残りの16バイトは各オペレータに共通のデータに使用されます。
 表7.81でCHDBの内容について説明します。なお、オフセットとは、各CHDBの先頭からのオフセットを意味します。

表7.81 CHDBの内容一覧

名称ラベルオフセット意味
マルチプルYCAO0_MULTI(operator 0)0
YCAO1_MULTI(operator 1)8 Y8950のレジスタ番号20H(チャンネル0)〜35H(チャンネル8)に設定されている下記のようなデータを保存します。
ビット7 AM(振幅変調指定)
0 振幅変調なし
1 振幅変調あり
ビット6 VIB(ビブラート指定)
0 ビブラートなし
1 ビブラートあり
ビット5 EG-TYP(エンベロープタイプ)
0 減衰音
1 持続音
ビット4 KSR(キースケールレート)
0 キースケールレートなし
1 キースケールレートあり
ビット3〜0 MULTIPLE(マルチプル)
実際に発生される周波数とB-number、F-numberとの倍率です。この値が大きくなれば、同じB-number、F-numberでも実際に発生される周波数は高くなります。
0 0.5倍
1〜101〜10倍
11 10倍
12 12倍
13 12倍
14 15倍
15 15倍
レベルキースケールYCAO0_LS(operator 0)1
YCAO1_LS(operator 1)9Y8950の各レジスタ40H(チャンネル0)〜55H(チャンネル8)に設定されているデータを保存します。ただし下位6ビットは無効で、上位2ビットのKSLだけが意味を持ちます。
ビット7、6 KSL(レベルキースケール)
ビット5〜0 無効
アタック、ディケイレートYCAO0_AR(operator 0)2
YCAO1_AR(operator 1)10Y8950の各レジスタ60H(チャンネル0)〜75H(チャンネル8)に設定されているデータを保存します。
ビット7〜4 AR(アタックレート)
ビット3〜0 DR(ディケイレート)
サスティンレベル、YCAO0_RR(operator 0)3
リリースレート YCAO1_RR(operator 1)11Y8950の各レジスタ80H(チャンネル0)〜95H(チャンネル8)に設定されているデータを保存します。
ビット7〜4 SL(サスティンレベル)
ビット3〜0 RR(リリースレート)
ベロシティ YCAO0_RR(operator 0)4
センシティビティ YCAO1_RR(operator 1)12MBIOSではY8950が持っていない音の強弱をソフトウェアで実現していますが、その強弱を指定に対する実際の強弱の変化の度合いを保存します。この値が大きければ、強弱の指定がより有効となります。小さければ、実際の強弱の変化が少なくなり、0の場合は強弱の変化は無効となります。
ビット7〜4 無効
ビット3〜0 ベロシティセンシティビティ
トータルレベルYCAO0_VTL(operator 0)5
YCAO1_VTL(operator 1)13Y8950の各レジスタ40H(チャンネル0)〜55H(チャンネル8)に設定されるデータの元になるトータルレベルを保存します。ただし下位6ビットのみが意味を持ち、上位2ビットは無効です。音量の計算方法は下記を参照して下さい。
ビット7、6 無効
ビット5〜0 トータルレベル
未使用 6 未使用領域です。
未使用 7 未使用領域です。
未使用 14 未使用領域です。
未使用 15 未使用領域です。
ボイストランスポーズYCA_VTRANS16(下位8ビット)
17(上位8ビット)音程を計算するとき、トランスポーズ値として用います.また、固定音程の音色データはこの値のみがY8950に設定されています。音程の計算方法は下記を参照して下さい。
トランスポーズYCA_TRANS18(下位8ビット)
19(上位8ビット)音程を計算するとき、トランスポーズ値として用いられます。音程の計算方法は下記を参照して下さい。
トリガ YCA_TRIG 20 Y8950のレジスタ番号BOH(チャンネル0)〜B8H(チャンネル8)に設定されているデータのうち鍵盤のON・OFFのみをビット5に記憶しています。その他のビットは無効ですがOになっています。
ボリュームYCA_VOL 21 Y8950のレジスタ番号40H(チャンネル0)〜55H(チャンネル8)に設定されるデータの基になるボリュームを記憶しています。ただし下位6ビットのみが意味を持ち、上位2ビットは無効です。音量の計算方法は下記を参照して下さい。
ビット7、6 無効
ビット5〜0 ボリューム
フィードバックYCF_FB 22 Y8950のレジスタ番号C0H(チャンネル0)〜C8H(チャンネル8)に設定されているデータを保存します。
ビット7、6 無効
ビット4 固定音程音色
このビットはY8950にはなく、MBIOSで実現している固定音程音色であることが指定されていることを意味しています。
O 通常の音色
1 固定音程音
ビット3〜1 フィードバック
0〜7の値でフィードバック量を保存
ビット0 コネクション
2つのオペレータの結合を保存
O 直列周波数変調モード
1 並列サイン波合成モード
ベロシティYCA_VEL 23 MBIOSではY8950が持っていない音の強弱をソフトウェアで実現していますが、その強弱の指定を保存します。
ビット7〜4 無効
ビット3〜0 ベロシティ
ピッチ YCA_PITCH 24(下位8ビット)
25(上位8ビット)Y8950のレジスタ番号AOH(チャンネル0)〜A8H(チャンネル8)とBOH(チャンネルO)〜B8H(チャンネル8)に設定されるデータの元になる音程を保存します。音程の計算方法は下記を参照して下さい。
ボイス番号YCA_VOICE 26 Y8950に音色データを設定したときの音色番号が保存されます。
フラグ ZCA_FLAG 27 そのチャンネルに関するフラグを保存します。
ビット7〜3 無効
ビット2 そのチャンネルに対する操作の無効フラグ
0 操作を無効にする
0 操作を有効にする
ビット1 無効
ビット0 チャンネル指定
0 そのチャンネルはマスターチャンネル
1 そのチャンネルはスレーブチャンネル
チャンネル番号ZC_CH 28 そのチャンネルのチャンネル番号が0〜8の値で記憶されています.このデータは初期化のときに1度だけ設定されます。
オペレータレジスタオフセット番号ZC_OP29Y8950の各オペレータにデータを書き込むとき、そのオペレータのレジスタ番号を指定するために使用されます。このデータは初期化のときに1度だけ設定されます。
以下のデータで初期化されます。
チャンネル000H
チャンネル101H
チャンネル202H
チャンネル308H
チャンネル409H
チャンネル50AH
チャンネル610H
チャンネル711H
チャンネル812H
デュレーションカウントZC_COUNT30(下位8ビット)
31(上位8ビット)FM音源チャンネルに対して発音を指示したときにデュレーション(鍵盤で表すと、鍵盤を押している時間を意味する)を設定しますが、その時間経過を記憶しています。この値はSV_TEMPO(自動キーオフ処理)が呼ばれるたびに減ってゆき、Oになるとそのチャンネルに対してキーオフが発生されます。

■音程の計算方法

 MBIOSがY8950に対して設定するBlock-NumberとF-Numberの計算方法を示します。
 YCA_FBのビット4が0のとき(固定音程音色でないとき)音程を決定するデータは以下の4つです。

YCA_PITCH ビット15 常に0
ビット14〜18Key Code Numberといい中央Cが60で、1変化することに半音変化します。
ビット7〜0 半音以下の細かい音程の指定です。1変化することに100/256セント変化します。
YCA_TRANS 2の補数表現のデータで、単位は100/256セントです。
YCA_VTRANS
YMA_TRANS 〃(MIDBのトランスポーズ参照)

 YCA_FBのビット4が1のとき(固定音程音色のとき)音程を決定するデータは以下の1つのみです。

YCA_VTRANSビット15 常に0
ビット14〜18Key Code Numberといい中央Cが60で、1変化することに半音変化します。
ビット7〜0 半音以下の細かい音程の指定です。1変化することに100/256セント変化します。

 これらのデータからF-NumberとB-Numberを求めるプログラム「FM.BAS」(固定音色でなく、マルチプルが1のとき)がフロッピーディスクに入っていますので、参照して下さい。

■ 音量の計算方法

 MBIOSがY8950に対して設定するトータルレベル計算方法を示します。
 オペレータ0に対して音量を決定するデータは以下の4つです。

YCA_VEL
YCAO0_VELS
YCAO0_VTL
YCA_VOL(YCA_FBのビット0が0のときは無視される)

 オペレータ1に対して音量を決定するデータは以下の4つです。

YCA_VEL
YCAO1_VELS
YCAO1_VTL
YCA_VOL

 これらのデータからトータルレベルを求めるプログラム「TOTAL.BAS」がフロッピーディスクに入っていますので、ご参照下さい。

 4.4.6 用語について

ADPCM

 ADPCMはAdaptive Differential Pulse Coded Modulationの略で、MSX-AUDIOではPCM化したデータを基に予測値と比較を行い、その差分を量子化幅によってコード化し、音質の低下を防ぎながら記億領域を少なくする方式です。MSX-AUDIOは量子化幅を符号ピット十3ビットでコード化します。

CSM
 複合正弦波合成の略。拡張BASICはこのモードに設定することのみをサポートしています。
MBIOS
 MSX-AUDIOのシステムソフトウェアは大きくわけて拡張BASICとMBIOSに区別することができます。MBIOSはMusic Basic Input Output Systemの略で、MSX-AUDIO LSIの機能を直接扱うソフトウェアです。MSX-AUDIO LSIの基本的な機能をサポートしているため他のアプリケーションソフトウェアはMBIOSに用意されている必要な機能を呼びだすことで容易にMSX-AUDIO LSIの機能を使うことができます。拡張BASICもこのMBIOSの機能を利用して動作しています。
MK
 Music Keyboardの略です。
MSX-AUDIO
 MSX-AUDIOは株式会社アスキーが開発したMSXパーソナルコンピュータのための音源LSIで、9チャンネルの2オペレータFM音源と1チャンネルの4ビットADPCM音源を持っています。ADPCMのために外部メモリと呼ぶ専用メモリを最大256Kバイトまで持っことができるためCPUの負担なしにADPCMの録音再生を行うことができます。
 MSX-AUDIOをサポートするシステムソフトウェアではこのLSIの持つ機能を容易に引き出すための機能を提f共しており、MSX、MSX2、MSX2+で動作します。
MSX-AUDIOのチャンネル
 MSX-AUDIOのシステムソフトウェアは、2つまでのMSX-AUDIO LSIを扱うことができるようになっています。
 番号の小さいスロットに置かれているMSX-AUDIO LSIが第1チャンネルに、あとの方のスロットに置かれているMSX-AUDIO LSIが第2チャンネルに割り当てられ、MBIOS、拡張BASICのいくつかの機能はこのチャンネル番号により2つのMSX-AUDIO LSIを区別して扱うことができます。
PCM/ADPCM
 PCMはPulse Coded Modulationの略で、MSX-AUDIOは8ビット符号付き(負数は2の補数表現)でコード化されたデータを扱います。ADPCMは適応差分PCMの略で、MSX-AUDIOは4bitのADPCMを扱います。拡張BASICはこれらの形式の音声の記録再生を、番号で指定する音ファイルとして扱うことができます。ADPCMとPCMのデータ形式の変換をする機能も用意されています。
Y8950
 MSX-AUDIO LSIです。
インスツルメント
 本来、楽器という意味ですが、ここではミュージックキーボード(MK)と結合されたFM音源を意味します。MSX-AUDIOのFM音源の9つのチャンネルのうちいくつかを同一の音色設定にしておき、ミュージックキーボードのキーのオン、オフによってそれらのチャンネルをオン、オフすることによってMSX-AUDIOを通常の鍵盤楽器と同じように扱えます。このようにミュージックキーボードとFM音源を関連づけた仕組みのことを指します。キーボードからはキーのオン、オフとキーコード番号(中央Cが60に対応)およびプログラムにより設定されたキーを押したときの強さ(ベロシティ)がインスツルメントに送られます。これらを総称してイベントと呼び、あるタイミングで発生したイベントを記録したり再生したりすることをMK記録と呼びます。
インスツルメント
 MSX-AUDIOのFM音源の9つのチャンネルのうちいくつかをひとまとめにして楽器をシミュレートする仕組みを指します。この仕組みを利用すると、音程を指定するだけでMBIOSが割り当てられた内から使用していないチャンネルを自動的に選択して発声します。
キーオフ
 鍵盤楽器で押していた鍵盤を離すことに例えた、音声出力を停止する動作を示します。キーオフをしても音はすぐには止まらず、ある時間余韻が残ります。
キーオン
 鍵盤楽器で鍵盤を押すことに例えた、音声出力を開始する動作を示します。
ダンプ
 音声出力をすぐに停止する動作を示します。キーオフとはダンプした瞬間に音が止まる点が異なります。
べロシティ
 キーオンするときに鍵盤が押された速さのことで、音の強弱を表し、FM音源の音量と音色に影響します。0〜15の16段階が用意されていますが、MSX-AUDIOのキーボードはタッチ速度を検出する機構を持たないので、常に同じ値を返します。
マスターチャンネル、スレーブチャンネル
 MSX-AUDIOカートリッジは1つのMSXに2つまで実装することができます。1つだけのときはそのカートリッジのことをマスターチャンネルといい、スレーブチャンネルは存在しません。2つのときはスロット番号の若いスロットに実装されているカートリッジをマスターチャンネルといい、別のカートリッジをスレーブチャンネルといいます。スレーブチャンネル側にある拡張BASICやMBIOSなどのプログラムはMSX立ち上がり時のみ動作し、それ以外はすべてマスターチャンネル側のプログラムがスレーブチャンネル側のY8950も制御します。
音色ライブラリ
 MSX-AUDIOのシステムソフトウェアはシステム組み込みのFM音源の音色パラメータのデータを64種類持っています。これを音色ライブラリとよびます。64種類のライブラリの内0〜31番目まではROMに置かれているため変更できませんが、32〜63番目のものはプログラムにより変更することができ、特にユーザー音色ライブラリと呼ぶことがあります。
システム音色ライブラリ(SVL)
 SVLはSystem Voice Libraryの略でROMにおさめたFM音源の音色データを意味します。FM音源音色番号で0番〜31番までがSVLです。データはROMにあるので変更はできません。
ユーザー音色ライブラリ(UVL)
 UVLはUser Voice Libraryの略でRAMにあるFM音源の音色データを意味します。FM音源音色番号で32番から63番までがUVLです。
音声ファイル
 PCM/ADPCMの音声データは番号をつけたファイルとして取り扱います。このファイルを音声ファイルとよびます。
外部メモリ
 MSX-AUDIO LSIがローカルにもつメモリのことをさします。
 ADPCMの録音と再生をこのメモリを対象として行うときにはローカルモードと言い、CPUの介入を必要としないためバックグラウンド処理で扱うことができます。