PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vm_seq.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libsnd2_internal.h"
12
13void _SsVmSetSeqVol(s16 seq_sep_num, s16 voll, s16 volr)
14{
15 libsnd2_sequence_struct_t *score_struct;
16 int v5;
17 int m_vab_id;
18 const VagAtr *vag_attr_ptr;
19 unsigned int vol_factor;
20 unsigned int voll_val;
21 unsigned int pan;
22 unsigned int volr_val;
23 unsigned int mpan;
24 unsigned int m_pan;
25
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 )
34 {
35 if ( (_snd_vmask & (1 << v5)) == 0 )
36 {
37 libsnd2_spu_voice_t *voice_struct;
38
39 voice_struct = &_svm_voice[(s16)v5];
40 if ( voice_struct->m_seq_sep_no == seq_sep_num )
41 {
42 m_vab_id = voice_struct->m_vab_id;
43 if ( m_vab_id == (char)score_struct->m_vab_id )
44 {
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;
53 if ( pan >= 0x40 )
54 voll_val = voll_val * (127 - pan) / 0x3F;
55 else
56 volr_val = volr_val * pan / 0x3F;
57 mpan = _svm_pg[voice_struct->m_prog].mpan;
58 if ( mpan >= 0x40 )
59 voll_val = (int)((u16)voll_val * (127 - mpan)) / 63;
60 else
61 volr_val = (unsigned int)((u64)(2181570691LL * (int)((u16)volr_val * mpan)) >> 32) >> 5;
62 m_pan = (u8)voice_struct->m_pan;
63 if ( m_pan >= 0x40 )
64 voll_val = (int)((u16)voll_val * (127 - m_pan)) / 63;
65 else
66 volr_val = (unsigned int)((u64)(2181570691LL * (int)((u16)volr_val * m_pan)) >> 32) >> 5;
67 if ( _svm_stereo_mono == 1 )
68 {
69 if ( (u16)voll_val >= (unsigned int)(u16)volr_val )
70 volr_val = voll_val & 0xFFFF;
71 else
72 voll_val = volr_val & 0xFFFF;
73 }
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;
77 }
78 }
79 }
80 }
81}
82
83void _SsVmGetSeqVol(s16 seq_sep_no, s16 *voll_ptr, s16 *volr_ptr)
84{
85 const libsnd2_sequence_struct_t *score_struct;
86
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;
91}
92
93int _SsVmGetSeqLVol(s16 seq_sep_no)
94{
95 const libsnd2_sequence_struct_t *score_struct;
96
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;
100}
101
102int _SsVmGetSeqRVol(s16 seq_sep_no)
103{
104 const libsnd2_sequence_struct_t *score_struct;
105
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;
109}
110
111void _SsVmSeqKeyOff(s16 seq_sep_no)
112{
113 u8 cur_voice_tmp;
114
115 for ( cur_voice_tmp = 0; cur_voice_tmp < _SsVmMaxVoice; cur_voice_tmp += 1 )
116 {
117 const libsnd2_spu_voice_t *voice_struct;
118
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 )
121 {
122 _svm_cur.m_voice_idx = cur_voice_tmp;
123 _SsVmKeyOffNow();
124 }
125 }
126}