PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
vm_key.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
13int _SsVmKeyOn(int seq_sep_no, s16 vab_id, s16 prog, s16 note, s16 voll, s16 unknown27)
14{
15 int on_keys_mask_1;
16 libsnd2_sequence_struct_t *score_struct;
17 int on_keys_mask_2;
18 const ProgAtr *prog_attr_Ptr;
19 u8 selected_vag_count;
20 const VagAtr *vag_attr_ptr;
21 int v16;
22 u8 vag_nums[128];
23 u8 vag_index_nums[128];
24
25 score_struct = NULL;
26 if ( seq_sep_no != 33 )
27 {
28 score_struct = &_ss_score[(u8)seq_sep_no][(seq_sep_no & 0xFF00) >> 8];
29 }
30 on_keys_mask_1 = 0;
31 on_keys_mask_2 = -1;
32 if ( _SsVmVSetUp(vab_id, prog) != 0 )
33 {
34 return on_keys_mask_2;
35 }
36 _svm_cur.m_seq_sep_no = seq_sep_no;
37 _svm_cur.m_note = note;
38 _svm_cur.m_fine = 0;
39 if ( score_struct != NULL )
40 _svm_cur.m_voll = (u16)voll * score_struct->m_vol[score_struct->m_channel_idx] / 127;
41 else
42 _svm_cur.m_voll = voll;
43 _svm_cur.m_unk05 = unknown27;
44 prog_attr_Ptr = &_svm_pg[prog];
45 _svm_cur.m_mvol = prog_attr_Ptr->mvol;
46 _svm_cur.m_mpan = prog_attr_Ptr->mpan;
47 _svm_cur.m_sep_sep_no_tonecount = prog_attr_Ptr->tones;
48 if ( _svm_cur.m_fake_program >= (int)_svm_vh->ps )
49 {
50 return -1;
51 }
52 if ( !voll )
53 return _SsVmKeyOff(seq_sep_no, vab_id, prog, note);
54 selected_vag_count = _SsVmSelectToneAndVag(vag_index_nums, vag_nums);
55 for ( v16 = 0; (u8)v16 < (unsigned int)selected_vag_count; v16 += 1 )
56 {
57 _svm_cur.m_vag_idx2 = (u8)vag_nums[(u8)v16];
58 _svm_cur.m_tone = vag_index_nums[(u8)v16];
59 vag_attr_ptr = &_svm_tn[(u16)(_svm_cur.m_tone + 16 * _svm_cur.m_fake_program)];
60 _svm_cur.m_prior = vag_attr_ptr->prior;
61 _svm_cur.m_vol = vag_attr_ptr->vol;
62 _svm_cur.m_pan = vag_attr_ptr->pan;
63 _svm_cur.m_centre = vag_attr_ptr->center;
64 _svm_cur.m_shift = vag_attr_ptr->shift;
65 _svm_cur.m_mode = vag_attr_ptr->mode;
66 _svm_cur.m_voice_idx = (u8)_SsVmAlloc();
67 if ( _svm_cur.m_voice_idx >= _SsVmMaxVoice )
68 {
69 on_keys_mask_1 = -1;
70 }
71 else
72 {
73 libsnd2_spu_voice_t *voice_struct;
74
75 voice_struct = &_svm_voice[_svm_cur.m_voice_idx];
76 voice_struct->m_unk1d = 1;
77 voice_struct->m_unk02 = 0;
78 voice_struct->m_seq_sep_no = seq_sep_no;
79 voice_struct->m_vab_id = _svm_cur.m_vab_id;
80 voice_struct->m_fake_program = _svm_cur.m_fake_program;
81 voice_struct->m_prog = prog;
82 if ( score_struct != NULL )
83 {
84 voice_struct->m_voll1 = voll;
85 voice_struct->m_channel_idx = score_struct->m_channel_idx;
86 }
87 voice_struct->m_pan = unknown27;
88 voice_struct->m_voll2 = _svm_cur.m_voll;
89 voice_struct->m_tone = _svm_cur.m_tone;
90 voice_struct->m_note = note;
91 voice_struct->m_priority = _svm_cur.m_prior;
92 voice_struct->m_vag_idx = _svm_cur.m_vag_idx2;
93 _SsVmDoAllocate();
94 if ( _svm_cur.m_vag_idx2 == 255 )
95 {
96 vmNoiseOn(_svm_cur.m_voice_idx);
97 }
98 else
99 {
100 _SsVmKeyOnNow(selected_vag_count, note2pitch());
101 }
102 on_keys_mask_1 |= 1 << (_svm_cur.m_voice_idx & 0xFF);
103 }
104 }
105 return on_keys_mask_1;
106}
107
108int _SsVmKeyOff(int seq_sep_no, s16 vab_id, s16 prog, s16 note)
109{
110 int v4;
111 int v5;
112
113 v5 = 0;
114 for ( v4 = 0; (u8)v4 < _SsVmMaxVoice; v4 += 1 )
115 {
116 const libsnd2_spu_voice_t *voice_struct;
117
118 voice_struct = &_svm_voice[v4];
119 if ( !((_snd_vmask & (1 << v4)) != 0 || voice_struct->m_note != note || voice_struct->m_prog != prog
120 || voice_struct->m_seq_sep_no != (s16)seq_sep_no || voice_struct->m_vab_id != vab_id) )
121 {
122 v5 += 1;
123 if ( voice_struct->m_vag_idx == 255 )
124 {
125 vmNoiseOff(v4);
126 }
127 else
128 {
129 _svm_cur.m_voice_idx = (u8)v4;
130 _SsVmKeyOffNow();
131 }
132 }
133 }
134 return v5;
135}
136
137int _SsVmSeKeyOn(s16 vab_id, s16 prog, u16 note, int pitch, u16 voll, u16 volr)
138{
139 s16 unknown27;
140 u16 voll_;
141
142 (void)pitch;
143
144 if ( voll == volr )
145 {
146 unknown27 = 64;
147 voll_ = voll;
148 }
149 else if ( volr >= (unsigned int)voll )
150 {
151 voll_ = volr;
152 unknown27 = 127 - (voll << 6) / volr;
153 }
154 else
155 {
156 voll_ = voll;
157 unknown27 = (volr << 6) / voll;
158 }
159 return _SsVmKeyOn(33, vab_id, prog, note, voll_, unknown27);
160}
161
162int _SsVmSeKeyOff(s16 vab_id, s16 prog, s16 note)
163{
164 return _SsVmKeyOff(33, vab_id, prog, note);
165}
166
167void KeyOnCheck(void)
168{
169 ;
170}