11#include "libsnd2_internal.h"
13void _SsVmKeyOnNow(s16 vag_count, s16 pitch)
18 unsigned int left_tmp2;
19 unsigned int right_tmp;
20 unsigned int left_tmp;
27 m_voice_idx = _svm_cur.m_voice_idx;
28 left = _svm_cur.m_voll * 0x3FFF * _svm_vh->mvol / 0x3F01 * _svm_cur.m_mvol * _svm_cur.m_vol / 0x3F01u;
31 if ( _svm_cur.m_seq_sep_no != 33 )
33 score_struct = &_ss_score[(_svm_cur.m_seq_sep_no & 0xFF)][(_svm_cur.m_seq_sep_no & 0xFF00) >> 8];
35 if ( score_struct != NULL )
37 left_tmp2 = left * (u16)score_struct->m_voll / 0x7F;
38 left = left * (u16)score_struct->m_volr / 0x7F;
40 if ( (u8)_svm_cur.m_pan >= 0x40u )
43 right_tmp = left_tmp2 * (127 - (u8)_svm_cur.m_pan) / 0x3F;
47 right_tmp = left_tmp2;
48 left_tmp = left * (u8)_svm_cur.m_pan / 0x3F;
50 if ( (u8)_svm_cur.m_mpan >= 0x40u )
51 right_tmp = right_tmp * (127 - (u8)_svm_cur.m_mpan) / 0x3F;
53 left_tmp = left_tmp * (u8)_svm_cur.m_mpan / 0x3F;
54 if ( (u8)_svm_cur.m_unk05 >= 0x40u )
55 right_tmp = right_tmp * (127 - (u8)_svm_cur.m_unk05) / 0x3F;
57 left_tmp = left_tmp * (u8)_svm_cur.m_unk05 / 0x3F;
58 if ( _svm_stereo_mono == 1 )
60 if ( right_tmp >= left_tmp )
65 if ( score_struct != NULL )
67 right_tmp = right_tmp * right_tmp / 0x3FFF;
68 left_tmp = left_tmp * left_tmp / 0x3FFF;
70 _svm_sreg_buf[m_voice_idx].m_pitch = pitch;
71 _svm_sreg_buf[m_voice_idx].m_vol_left = right_tmp;
72 _svm_sreg_buf[m_voice_idx].m_vol_right = left_tmp;
73 _svm_sreg_dirty[_svm_cur.m_voice_idx] |= 7u;
74 voice_struct = &_svm_voice[_svm_cur.m_voice_idx];
75 voice_struct->m_pitch = pitch;
76 if ( _svm_cur.m_voice_idx >= 16 )
79 bits_upper = 1 << ((_svm_cur.m_voice_idx & 0xFF) - 16);
83 bits_lower = 1 << (_svm_cur.m_voice_idx & 0xFF);
86 if ( (_svm_cur.m_mode & 4) != 0 )
88 _svm_orev1 |= bits_lower;
89 _svm_orev2 |= bits_upper;
93 _svm_orev1 &= ~(u16)bits_lower;
94 _svm_orev2 &= ~(u16)bits_upper;
96 _svm_onos1 &= ~(u16)bits_lower;
97 _svm_okon2 |= bits_upper;
98 _svm_onos2 &= ~(u16)bits_upper;
99 _svm_okon1 |= bits_lower;
100 _svm_okof1 &= ~_svm_okon1;
101 _svm_okof2 &= ~_svm_okon2;