11#include "libsnd2_internal.h"
13int _SsVmSetVol(s16 seq_sep_no, s16 vab_id, s16 prog, s16 voll, s16 volr)
20 const VagAtr *vag_attr_ptr;
22 unsigned int left_vol;
24 unsigned int right_vol;
26 unsigned int vol_selfmul;
30 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
31 _SsVmVSetUp(vab_id, prog);
32 _svm_cur.m_seq_sep_no = seq_sep_no;
37 for ( v13 = 0; (s16)v13 < _SsVmMaxVoice; v13 += 1 )
39 if ( (_snd_vmask & (1 << v13)) == 0 )
43 voice_struct = &_svm_voice[(s16)v13];
45 voice_struct->m_seq_sep_no == seq_sep_no && voice_struct->m_prog == prog && voice_struct->m_vab_id == vab_id )
47 v20 = score_struct->m_vol[score_struct->m_channel_idx];
48 if ( (v20 != 0) || (v20 != (u16)voll) )
50 vag_attr_ptr = &_svm_tn[16 * voice_struct->m_fake_program + voice_struct->m_tone];
51 volcalc = voice_struct->m_voll1 * (u16)voll / 127 * 0x3FFF * _svm_vh->mvol / 0x3F01 * _svm_pg[prog].mvol
53 left_vol = volcalc / 0x3F01 * (u16)score_struct->m_voll / 0x7F;
54 pan = vag_attr_ptr->pan;
55 right_vol = volcalc / 0x3F01 * (u16)score_struct->m_volr / 0x7F;
57 left_vol = left_vol * (127 - pan) / 0x3F;
59 right_vol = right_vol * pan / 0x3F;
60 mpan = _svm_pg[voice_struct->m_prog].mpan;
62 left_vol = left_vol * (127 - mpan) / 0x3F;
64 right_vol = right_vol * _svm_pg[voice_struct->m_prog].mpan / 0x3F;
65 if ( volr_tmp >= 0x40u )
66 left_vol = left_vol * (127 - volr_tmp) / 0x3F;
68 right_vol = right_vol * volr_tmp / 0x3F;
69 vol_selfmul = left_vol * left_vol;
70 if ( _svm_stereo_mono == 1 )
72 if ( left_vol >= right_vol )
76 vol_selfmul = left_vol * left_vol;
79 _svm_sreg_dirty[(s16)v13] |= 3u;
80 _svm_sreg_buf[(s16)v13].m_vol_left = vol_selfmul / 0x3FFF;
81 _svm_sreg_buf[(s16)v13].m_vol_right = right_vol * right_vol / 0x3FFF;
85 score_struct->m_vol[score_struct->m_channel_idx] = 1;