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

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

        .include        "nsd.inc"

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

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

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

nsd_work_zp

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

変数の内容
変数名内容
__ptr 汎用変数(ポインター用)
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
__tmp 汎用変数(計算用)
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
channel 現在制御中のチャンネル
尚、内容を保持する必要はありません。
ユーザーがこの領域を一時的な変数領域として使用して構いませんが、 本音源ドライバのライブラリ関数を呼んだ場合、内容は破壊される旨、ご留意ください。
__flag 音源ドライバ全体のフラグ
__Tempo テンポ(tコマンドの数値)
__Tempo_ctr テンポカウンタ
__Sequence_ptr 演奏ポインタ
__Length_ctr 音長カウンタ
__Gate 現在の音符のゲートタイム
__Envelop_V 音色・音量エンベロープのホールドタイム用のカウンタ
__Envelop_F 音程・ノートエンベロープのホールドタイム用のカウンタ

以下は、実際の構造体定義です。

typedef struct NSD_work_zp {
    int     _ptr;
    int     _tmp;
    char    channel;
    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;

メモリ節約のため、一部の変数(__flag, __Tempo, __Tempo_ctr)は、 三角波トラック、凾oCMのトラックでは使われない領域を使用します。

構造体メンバーと、変数名の関係
メンバー名変数名ch1ch2ch3ch4ch5
_ptr __ptr
_tmp __tmp
channel __channel
Sequence_ptr[n] __Sequence_ptr
NSD_Length[n]_Cnt.counter __Length_ctr
NSD_Length[n]_Cnt.gate __Gate
NSD_Envelop[n].V __Envelop_V __flag __Tempo_ctr
NSD_Envelop[n].F __Envelop_F __Tempo

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

nsd_work

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

変数の内容
変数名内容
__chflag チャンネル毎のフラグ
__gatemode .... ..rr : ゲートモード(Rmコマンドの設定値)
.... e... : 音色エンベロープのスイッチ
vvvv .... : リリース時の音色(R@コマンドの数値)
__length 音長省略時の音長(lコマンドの設定値)
__tai スラー・タイ制御
__gate_q ゲートタイム(qコマンドの設定値)
__gate_u ゲートタイム(uコマンドの設定値)
__note 現在発音しているノートナンバー
__octave 現在のオクターブ(oコマンドの数値×12)
__detune_cent cent単位のディチューン(Dコマンドの数値)
__detune_fine レジスタ単位のディチューン(D%コマンドの数値)
__por_target ポルタメント制御用(目標値)
__por_depth ポルタメント制御用(一回の変化量)
__por_ctr ポルタメント制御用(カウンター)
__por_rate ポルタメント制御用(何フレームで変化するか?)
__por_now ポルタメント制御用(現在の変位)
__trans 移調(_コマンドの数値)
__trans_one 一回限りの移調(', "コマンド制御用)
__repeat_ctr リピートAのカウンタ
__repeat_ctr2 リピートBのカウンタ
__volume 音量(v, Rvコマンドの数値)
__env_vol_now 音量エンベロープの現在値
__env_freq_now 音程エンベロープの現在値
__env_note_now ノートエンベロープの現在値
__env_vol_ptr 音量エンベロープの推移制御用のポインタ
__env_voi_ptr 音色エンベロープの推移制御用のポインタ
__env_freq_ptr 音程エンベロープの推移制御用のポインタ
__env_note_ptr ノートエンベロープの推移制御用のポインタ
__env_volume 音量エンベロープ・テーブルのポインタ
__env_voice 音色エンベロープ・テーブルのポインタ
__env_frequency 周波数エンベロープ・テーブルのポインタ
__env_note ノートエンベロープ・テーブルのポインタ
__frequency 現在発音している音程(音程・ノートエンベロープ適用後)
__subroutine サブルーチンの戻りアドレス
__repeat2 リピートBでの次のジャンプ先アドレス
__dpcm_info 儕CM制御構造体のポインタ
__apu_voice_set1 APU ch1の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set2 APU ch2の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set4 APU ch4の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set1 SE ch1の音色(レジスタ書込みの為の論理演算用)
__apu_voice_set2 SE ch1の音色(レジスタ書込みの為の論理演算用)
__apu_frequency1 APU ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__apu_frequency2 APU ch2の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__apu_frequency3 APU ch3の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__se_frequency SE ch1の音程上位8bitの保存用(音程レジスタ上位8bit更新によるプチノイズ発生防止)。
__sweep_ch1 APU ch1のsweepレジスタの現在値
__sweep_ch2 APU ch2のsweepレジスタの現在値
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_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;

メモリ節約のため、一部の変数は、三角波トラック、凾oCMのトラックでは使われない領域を使用します。

構造体メンバーと、変数名の関係
メンバー名変数名ch1ch2ch3ch4ch5
Flag[n].flag __chflag
Flag[n].gatemode __gatemode
Length[n].length __length
Length[n].tai __tai
Gatetime[n].q __gate_q
Gatetime[n].u __gate_u
Note[n].note __note
Note[n].octave __octave
Detune[n].cent __detune_cent
Detune[n].fine __detune_fine
Por_Lv[n].target __por_target __apu_frequency1
Por_Lv[n].depth __por_depth __apu_frequency2
Por_Co[n].count __por_ctr __apu_frequency3
Por_Co[n].rate __por_rate __se_frequency
Por_now[n] __por_now __mmc5_frequency1
__mmc5_frequency2
Trans[n].trans __trans
Trans[n].onetime __trans_one
Repeat[n].count1 __repeat_ctr
Repeat[n].count2 __repeat_ctr2
Volume[n].volume __volume __sweep_ch1
Volume[n].volume_env __env_vol_now __sweep_ch2
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 (LSB)
Env_V_Ptr[n].Voice __env_voi_ptr __dpcm_info (MSB)
Env_F_Ptr[n].Frequency __env_freq_ptr __se_voice_set1
Env_F_Ptr[n].Note __env_note_ptr __se_voice_set2
Envelop_Volume[n] __env_volume __apu_voice_set1
__apu_voice_set2
Envelop_Voice[n] __env_voice __apu_voice_set4
Envelop_Freq[n] __env_frequency __mmc5_voice_set1
__mmc5_voice_set2
Envelop_Note[n] __env_note __vrc6_voice_set1
__vrc6_voice_set2
Frequency[n] __frequency
SubRoutine[n] __subroutine
Repeat2[n] __repeat2