11#include "libsnd2_internal.h"
13void _SsVmSetSeqVol(s16 seq_sep_num, s16 voll, s16 volr)
18 const VagAtr *vag_attr_ptr;
19 unsigned int vol_factor;
20 unsigned int voll_val;
22 unsigned int volr_val;
26 score_struct = &_ss_score[(u8)seq_sep_num][(seq_sep_num & 0xFF00) >> 8];
27 score_struct->m_voll = voll;
28 score_struct->m_volr = volr;
29 if ( (u16)voll >= 0x7Fu )
30 score_struct->m_voll = 127;
31 if ( (u16)score_struct->m_volr >= 0x7Fu )
32 score_struct->m_volr = 127;
33 for ( v5 = 0; (s16)v5 < _SsVmMaxVoice; v5 += 1 )
35 if ( (_snd_vmask & (1 << v5)) == 0 )
39 voice_struct = &_svm_voice[(s16)v5];
40 if ( voice_struct->m_seq_sep_no == seq_sep_num )
42 m_vab_id = voice_struct->m_vab_id;
43 if ( m_vab_id == (
char)score_struct->m_vab_id )
45 _SsVmVSetUp(m_vab_id, voice_struct->m_fake_program);
46 vag_attr_ptr = &_svm_tn[16 * voice_struct->m_fake_program + voice_struct->m_tone];
47 vol_factor = _svm_vh->mvol * 0x3FFF
48 * (voice_struct->m_voll1 * score_struct->m_vol[voice_struct->m_channel_idx] / 127) / 0x3F01
49 * _svm_pg[voice_struct->m_prog].mvol * vag_attr_ptr->vol;
50 voll_val = vol_factor / 0x3F01 * (u16)score_struct->m_voll / 0x7F;
51 pan = vag_attr_ptr->pan;
52 volr_val = vol_factor / 0x3F01 * (u16)score_struct->m_volr / 0x7F;
54 voll_val = voll_val * (127 - pan) / 0x3F;
56 volr_val = volr_val * pan / 0x3F;
57 mpan = _svm_pg[voice_struct->m_prog].mpan;
59 voll_val = (int)((u16)voll_val * (127 - mpan)) / 63;
61 volr_val = (
unsigned int)((u64)(2181570691LL * (
int)((u16)volr_val * mpan)) >> 32) >> 5;
62 m_pan = (u8)voice_struct->m_pan;
64 voll_val = (int)((u16)voll_val * (127 - m_pan)) / 63;
66 volr_val = (
unsigned int)((u64)(2181570691LL * (
int)((u16)volr_val * m_pan)) >> 32) >> 5;
67 if ( _svm_stereo_mono == 1 )
69 if ( (u16)voll_val >= (
unsigned int)(u16)volr_val )
70 volr_val = voll_val & 0xFFFF;
72 voll_val = volr_val & 0xFFFF;
74 _svm_sreg_dirty[(s16)v5] |= 3u;
75 _svm_sreg_buf[(s16)v5].m_vol_left = (u16)voll_val * (u16)voll_val / 0x3FFF;
76 _svm_sreg_buf[(s16)v5].m_vol_right = (s16)(volr_val * volr_val) / 0x3FFF;
83void _SsVmGetSeqVol(s16 seq_sep_no, s16 *voll_ptr, s16 *volr_ptr)
87 _svm_cur.m_seq_sep_no = seq_sep_no;
88 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
89 *voll_ptr = score_struct->m_voll;
90 *volr_ptr = score_struct->m_volr;
93int _SsVmGetSeqLVol(s16 seq_sep_no)
97 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
98 _svm_cur.m_seq_sep_no = seq_sep_no;
99 return score_struct->m_voll;
102int _SsVmGetSeqRVol(s16 seq_sep_no)
106 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
107 _svm_cur.m_seq_sep_no = seq_sep_no;
108 return score_struct->m_volr;
111void _SsVmSeqKeyOff(s16 seq_sep_no)
115 for ( cur_voice_tmp = 0; cur_voice_tmp < _SsVmMaxVoice; cur_voice_tmp += 1 )
119 voice_struct = &_svm_voice[cur_voice_tmp];
120 if ( (_snd_vmask & (1 << cur_voice_tmp)) == 0 && voice_struct->m_seq_sep_no == seq_sep_no )
122 _svm_cur.m_voice_idx = cur_voice_tmp;