{{include unfinished_page}} ,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}← [[4.3 拡張BIOS|4.3 MSX-AUDIO 拡張BIOS]] ,{BSIZE:0|RIGHT} [[4.5 Y8950(MSX-AUDIO)]] → {{outline}} !!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レジスタの内容を設定します。 ,BUF,IXレジスタの下位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 ,3000H,64 ,FM音源チャンネル0データ ,CHDB1 ,3040H,64 ,FM音源チャンネル1データ ,CHDB2 ,3080H,64 ,FM音源チャンネル2データ ,CHDB3 ,30C0H,64 ,FM音源チャンネル3データ ,CHDB4 ,3100H,64 ,FM音源チャンネル4データ ,CHDB5 ,3140H,64 ,FM音源チャンネル5データ ,CHDB6 ,3180H,64 ,FM音源チャンネル6データ ,CHDB7 ,31C0H,64 ,FM音源チャンネル7データ ,CHDB8 ,3200H,64 ,FM音源チャンネル8データ ,MIDB_M,3280H,64 ,ミュージックインスツルメンツデータ(マスターチャンネル) ,MDIB_S,32C0H,64 ,ミュージックインスツルメンツデータ(スレーブチャンネル) ,UVL ,3700H,1024,ユーザー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_ON,36 ,指定された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〜0,MULTIPLE(マルチプル) , , , ,実際に発生される周波数と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と6,KSL(レベルキースケール) , , ,ビット5〜0,トータルレベル ,18 ,VO0_AR(オペレータ0) ,Y8950のレジスタ番号60H(チャンネル0)〜75H(チャンネル8)に設定するデータを指定 , , ,ビット7〜4,AR(アタックレート) , , ,ビット3〜0,DR(ディケイレート) ,19 ,VO0_RR(オペレータ0) ,Y8950のレジスタ番号80H(チャンネル0)〜95H(チャンネル8)に設定するデータを指定 , , ,ビット7〜4,SL(サスティンレベル) , , ,ビット3〜0,RR(リリースレート) ,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 ミュージックキーボードバッファの内容一覧''' , ,ビット , , ,7,6 ,5 ,4 ,3 ,2 ,1 ,0 , ,0 ,0,C ,B ,A#,0 ,A ,G#,G , ,1 ,0,F#,F ,E ,0 ,D#,D ,C# ,オ,2 ,0,C ,B ,A#,0 ,A ,G#,G ,フ,3 ,0,F#,F ,E ,0 ,D#,D ,C# ,セ,4 ,0,C ,B ,A#,0 ,A ,G#,G ,ッ,5 ,0,F#,F ,E ,0 ,D#,D ,C# ,ト,6 ,0,C ,B ,A#,0 ,A ,G#,G , ,7 ,0,F#,F ,E ,0 ,D#,D ,C# , ,8 ,0,C ,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〜36H,16個 ,0800H〜0FFFH ,37H〜42H,32個 ,1000H〜17FFH ,43H〜4EH,64個 ,1800H〜1FFFH ,4FH〜5AH,128個 ,コール手順 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つのブロックデータはいくつかのフレームデータからなります。 {{svg 図7.36.svg,,size:600x640}} ''' 図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_IRQ38,3300H,ハードウェア割り込みフック ,HK_VDPIRQ,3308H,VDP割り込み処理指定 ,HKLUSERIRQ,3310H,アプリケーション割り込みフック ,HK_VRAM,3318H,VRAM操作フック ,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_TIM1,3340H,タイマ1割り込み,OOOOH ,IRQ_TIM2,3344H,タイマ2割り込み,SV_TEMPO ,IRQ_VDP,3348H,VDP割り込み,OO0OH ,IRQ_USER,334CH,ユーザー割り込み,OOOOH ,ZIRQ_ADP_M,3350H,ADPCM終了割り込み(マスタ),OOOOH ,ZIRQLADP_S,3354H,ADPCM終了割り込み(スレーブ),GOOOH ■UISV優先順位テーブル 1回のUISVで処理される割り込みは1つだけなので、同時に2つ以上の割り込みが起きたときにどの割り込みを優先させるかをこのテーブルに登録します。具体的には、UISVベクタテーブルのアドレスを保存しておきます。 '''表7.77 UISV優先順位テーブル一覧''' ,ラベル,アドレス,優先順位,初期値 ,IRQ_PRIO1,3360H,1(最高優先),IRQ_TIM2 ,IRQ_PRIO2,3362H,2,IRQ_TIM1 ,IRQ_PRIO3,3364H,3,IRQ_VDP ,IRQ_PRIO4,3366H,4(最低優先),IRQ_USER ■非同期割り込み 非同期割り込み機能はMBIOSにあらかじめ登録し、ある事象が起きたときにMBIOSからアプリケーションを呼び出す機能です。 MBIOSがアプリケーションを呼び出すときには、インタースロットコールではなく通常のコール命令が使われるので、MBIOSと同じCPUアドレス領域(0000H〜3FFFH)にある別のスロットのプログラムは呼び出せません。 アプリケーションが呼び出された時点では、MBIOSを直接コール命令で呼び出すことができます。アプリケーションからMBIOSに戻るときは通常のリターン命令を使用します。 非同期割り込みサービスには以下のようなものがあります。 '''表7.78 非同期割り込み一覧''' ,ラベル,アドレス,機能 ,AST_MK,3370H,ミュージックキーボード割り込み ,AST_ADPCM_M,3372H,ADPCM終了割り込み ,AST_ADPCM_S,3374H,ADPCM終了割り込み ,SV_TEMPO,00B7H,自動キーオフ処理 ここでは以下のように説明します。 ,アドレス 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_FILTER,39 ,ADPCM・PCM録音再生時のフィルタ設定を保存します。 , , , ビット7〜3 ,無効 , , , ビット2 ,自動フィルタ設定フラグ , , , ,0 発声対象によって自動的にフィルタを設定する , , , ,1 アプリケーションの設定を使用する , , , ビット1 ,無効 , , , ビット0 ,フィルタの設定(ビット2が0のときは無効) , , , ,0 フィルタ特性A{{br}}ADPCM・PCM録音再生のときに使用するフィルタ , , , ,1 フィルタ特性B{{br}}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_STAT,52 ,タイマ割り込み時に、以上に述べたどのレートを使用するかのステータスとして使用します。 , , , ,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〜10,1〜10倍 , , , ,11 ,10倍 , , , ,12 ,12倍 , , , ,13 ,12倍 , , , ,14 ,15倍 , , , ,15 ,15倍 ,レベルキースケール,YCAO0_LS,(operator 0),1, , ,YCAO1_LS,(operator 1),9,Y8950の各レジスタ40H(チャンネル0)〜55H(チャンネル8)に設定されているデータを保存します。ただし下位6ビットは無効で、上位2ビットのKSLだけが意味を持ちます。 , , ,ビット7、6 , ,KSL(レベルキースケール) , , ,ビット5〜0 , ,無効 ,アタック、ディケイレート,YCAO0_AR,(operator 0),2 , , ,YCAO1_AR,(operator 1),10,Y8950の各レジスタ60H(チャンネル0)〜75H(チャンネル8)に設定されているデータを保存します。 , , ,ビット7〜4 , ,AR(アタックレート) , , ,ビット3〜0 , ,DR(ディケイレート) ,サスティンレベル、,YCAO0_RR,(operator 0),3 , ,リリースレート ,YCAO1_RR,(operator 1),11,Y8950の各レジスタ80H(チャンネル0)〜95H(チャンネル8)に設定されているデータを保存します。 , , ,ビット7〜4 , ,SL(サスティンレベル) , , ,ビット3〜0 , ,RR(リリースレート) ,ベロシティ ,YCAO0_RR,(operator 0),4 , ,センシティビティ ,YCAO1_RR,(operator 1),12,MBIOSではY8950が持っていない音の強弱をソフトウェアで実現していますが、その強弱を指定に対する実際の強弱の変化の度合いを保存します。この値が大きければ、強弱の指定がより有効となります。小さければ、実際の強弱の変化が少なくなり、0の場合は強弱の変化は無効となります。 , , ,ビット7〜4 , ,無効 , , ,ビット3〜0 , ,ベロシティセンシティビティ ,トータルレベル,YCAO0_VTL,(operator 0),5, , ,YCAO1_VTL,(operator 1),13,Y8950の各レジスタ40H(チャンネル0)〜55H(チャンネル8)に設定されるデータの元になるトータルレベルを保存します。ただし下位6ビットのみが意味を持ち、上位2ビットは無効です。音量の計算方法は下記を参照して下さい。 , , ,ビット7、6 , ,無効 , , ,ビット5〜0 , ,トータルレベル ,未使用 , , ,6 ,未使用領域です。 ,未使用 , , ,7 ,未使用領域です。 ,未使用 , , ,14 ,未使用領域です。 ,未使用 , , ,15 ,未使用領域です。 ,ボイストランスポーズ,YCA_VTRANS,16(下位8ビット), , , ,17(上位8ビット), ,音程を計算するとき、トランスポーズ値として用います.また、固定音程の音色データはこの値のみがY8950に設定されています。音程の計算方法は下記を参照して下さい。 ,トランスポーズ,YCA_TRANS,18(下位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_OP,29, ,Y8950の各オペレータにデータを書き込むとき、そのオペレータのレジスタ番号を指定するために使用されます。このデータは初期化のときに1度だけ設定されます。 , , , , ,以下のデータで初期化されます。 , , ,チャンネル0,00H , , ,チャンネル1,01H , , ,チャンネル2,02H , , ,チャンネル3,08H , , ,チャンネル4,09H , , ,チャンネル5,0AH , , ,チャンネル6,10H , , ,チャンネル7,11H , , ,チャンネル8,12H ,デュレーションカウント,ZC_COUNT,30(下位8ビット),, , , ,31(上位8ビット), ,FM音源チャンネルに対して発音を指示したときにデュレーション(鍵盤で表すと、鍵盤を押している時間を意味する)を設定しますが、その時間経過を記憶しています。この値はSV_TEMPO(自動キーオフ処理)が呼ばれるたびに減ってゆき、Oになるとそのチャンネルに対してキーオフが発生されます。 ■音程の計算方法  MBIOSがY8950に対して設定するBlock-NumberとF-Numberの計算方法を示します。  YCA_FBのビット4が0のとき(固定音程音色でないとき)音程を決定するデータは以下の4つです。 , , ,, ,YCA_PITCH ,ビット15 ,常に0 , ,ビット14〜18,Key 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〜18,Key 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の介入を必要としないためバックグラウンド処理で扱うことができます。 ,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}← [[4.3 拡張BIOS|4.3 MSX-AUDIO 拡張BIOS]] ,{BSIZE:0|RIGHT} [[4.5 Y8950(MSX-AUDIO)]] →