音源ドライバーの制御用変数

音源ドライバーの制御用変数です。
本音源ドライバーを用いたアプリケーションを開発する際に、 音源ドライバーの制御状態を知りたい時にご参照ください。
尚、音源ドライバーの制御用変数にアクセスするには、アセンブリ言語中にて以下の通り外部宣言することで可能です。

        .include        "nsd.inc"

配列変数で記載されるメンバー変数は、構造体定義内容の通り2Byte毎に配置しています。
xレジスタ等に、(トラック番号−1)×2の値を書くと、アクセスに便利です。

尚、ヴァージョンアップにより、制御変数の構造体の構成が変わる場合がある旨、ご理解の程、宜しくお願い致します。
又、拡張音源用のメンバー変数は割愛します(拡張音源を使用しない場合は、拡張音源用のメンバー変数は構造体のメンバーに入りません)。

Segment "zeropage" に配置される変数

nsd_work_zp

Zeropageに置かれる制御用変数(構造体)です。
頻度に(1tick中で何度も)使用するため、アクセス速度の速いZeropage領域に配置しています。

typedef struct NSD_work_zp {
    int     _ptr;
    int     _tmp;
    char    channel;
    char    flag;
    int     Sequence_ptr[n];
    struct  NSD_Length_Cnt {
                char    counter;
                char    gate;
            } Length[n];
    struct  NSD_Envelop {
                char    V;
                char    F;
            } Envelop[n];
} nsd_work_zp;
構造体メンバー
メンバー名別名内容
_ptr __ptr 汎用変数(ポインター用)
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
_tmp __tmp 汎用変数(計算用)
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
channel __channel 現在制御中のチャンネル
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
flag __flag 音源ドライバ全体のフラグ
Sequence_ptr[n] __Sequence_ptr 演奏ポインタ
Length[n].counter __Length_ctr 音長カウンタ
Length[n].gate __Gate 現在の音符のゲートタイム
Envelop[n].V __Envelop_V
__Tempo
__Tempo_ctr
音色・音量エンベロープのホールドタイム用のカウンタ
但し、TR3(三角波)はテンポ(tコマンドの数値)、
TR5(儕CM)はテンポカウンタとして利用
Envelop[n].F __Envelop_F 音程・ノートエンベロープのホールドタイム用のカウンタ

Segment "bss" に配置される変数

nsd_work

通常のRAM領域に置かれる制御用変数(構造体)です。
音源ドライバーだけでzeropageを占有できないので、通常のRAM領域に配置します。

typedef struct NSD_work {
    struct  NSD_Flag {
                char    flag;
                char    gatemode;
            } Flag[n];
    struct  NSD_length {
                char    length;
                char    tai;
            } Length[n];
    struct  NSD_gatetime {
                char    q;
                char    u;
            } Gatetime[n];
    struct  NSD_note {
                char    note;
                char    octave;
            } Note[n];
    struct  NSD_Detune {
                char    cent;
                char    fine;
            } Detune[n];
    struct  NSD_Por_Lv {
                char    target;
                char    depth;
            } Por_Lv[n];
    struct  NSD_Por_Co {
                char    count;
                char    rate;
            } Por_Co[n];
    int     Por_now[n];
    struct   NSD_Trans{
                char    trans;
                char    onetime;
            } Trans[n];
    struct   NSD_Repeat{
                char    count1;
                char    count2;
            } Repeat[n];
    struct   NSD_volume{
                char    volume;
                char    volume_env;
            } Volume[n];
    struct   NSD_voice{
                char    voice;
                char    voice_set;
            } Voice[n];
    struct   NSD_Env_F_Now{
                char    Frequency;
                char    Note;
            } Env_F_Now[n];
    struct   NSD_Env_V_Ptr{
                char    Volume;
                char    Voice;
            } Env_V_Ptr[n];
    struct   NSD_Env_F_Ptr{
                char    Frequency;
                char    Note;
            } Env_F_Ptr[n];
    int     Envelop_Volume[n];
    int     Envelop_Voice[n];
    int     Envelop_Freq[n];
    int     Envelop_Note[n];
    int     Frequency[n];
    int     SubRoutine[n];
    int     Repeat2[n];
} nsd_work;
構造体メンバー
メンバー名別名内容
Flag[n].flag __chflag チャンネル毎のフラグ
Flag[n].gatemode __gatemode .... ..rr : ゲートモード(Rmコマンドの設定値)
.... e... : 音色エンベロープのスイッチ
vvvv .... : リリース時の音色(R@コマンドの数値)
Length[n].length __length 音長省略時の音長(lコマンドの設定値)
Length[n].tai __tai スラー・タイ制御
Gatetime[n].q __gate_q ゲートタイム(qコマンドの設定値)
Gatetime[n].u __gate_u ゲートタイム(uコマンドの設定値)
Note[n].note __note 現在発音しているノートナンバー
Note[n].octave __octave 現在のオクターブ(oコマンドの数値×12)
Detune[n].cent __detune_cent cent単位のディチューン(Dコマンドの数値)
Detune[n].fine __detune_fine レジスタ単位のディチューン(D%コマンドの数値)
Por_Lv[n].target __por_target
__apu_frequency1
ポルタメント制御用(目標値)
但し、TR5(儕CM)はAPU ch1の音程上位8bitの保存用に使う
(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
Por_Lv[n].depth __por_depth
__apu_frequency2
ポルタメント制御用(一回の変化量)
但し、TR5(儕CM)はAPU ch2の音程上位8bitの保存用に使う
(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
Por_Co[n].count __por_ctr
__apu_frequency3
ポルタメント制御用(カウンター)
但し、TR5(儕CM)はAPU ch3の音程上位8bitの保存用に使う
(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
Por_Co[n].rate __por_rate
__se_frequency
ポルタメント制御用(何フレームで変化するか?)
但し、TR5(儕CM)はSE ch1の音程上位8bitの保存用に使う
(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
Por_now[n] __por_now ポルタメント制御用(現在の変位)
Trans[n].trans __trans 移調(_コマンドの数値)
Trans[n].onetime __trans_one 一回限りの移調(', "コマンド制御用)
Repeat[n].count1 __repeat_ctr リピートAのカウンタ
Repeat[n].count2 __repeat_ctr2 リピートBのカウンタ
Volume[n].volume __volume 音量(v, Rvコマンドの数値)
Volume[n].volume_env __env_vol_now
__sweep_ch1
__sweep_ch2
音量エンベロープの現在値
但し、TR3(三角波)はAPU ch1のsweepレジスタの現在値、
TR5(儕CM)はAPU ch2のsweepレジスタの現在値として使用。
Voice[n].voice __voice 音色(R@コマンドの数値) ※移動のため廃止
Voice[n].voice_set __voice_set 現在発音している音色(音色エンベロープ適用後)※移動し廃止予定
Env_F_Now[n].Frequency __env_freq_now 音程エンベロープの現在値
Env_F_Now[n].Note __env_note_now ノートエンベロープの現在値
Env_V_Ptr[n].Volume __env_vol_ptr
__dpcm_info
音量エンベロープの推移制御用のポインタ
但し、TR5(儕CM)は、儕CM制御構造体のポインタとして使用する。
Env_V_Ptr[n].Voice __env_voi_ptr 音色エンベロープの推移制御用のポインタ
但し、TR5(儕CM)は、儕CM制御構造体のポインタとして使用する。
Env_F_Ptr[n].Frequency __env_freq_ptr 音程エンベロープの推移制御用のポインタ
Env_F_Ptr[n].Note __env_note_ptr ノートエンベロープの推移制御用のポインタ
Envelop_Volume[n] __env_volume 音量エンベロープ・テーブルのポインタ
Envelop_Voice[n] __env_voice 音色エンベロープ・テーブルのポインタ
Envelop_Freq[n] __env_frequency 周波数エンベロープ・テーブルのポインタ
Envelop_Note[n] __env_note ノートエンベロープ・テーブルのポインタ
Frequency[n] __frequency 現在発音している音程(音程・ノートエンベロープ適用後)
SubRoutine[n] __subroutine サブルーチンの戻りアドレス
Repeat2[n] __repeat2 リピートBでの次のジャンプ先アドレス