PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
midiread.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 _SsSeqPlay(s16 sep_no, s16 seq_no)
14{
15 libsnd2_sequence_struct_t *score_struct;
16 int m_unk54;
17 int m_delta_value;
18 int diff1;
19
20 score_struct = &_ss_score[sep_no][seq_no];
21 m_unk54 = score_struct->m_unk54;
22 m_delta_value = score_struct->m_delta_value;
23 diff1 = m_delta_value - m_unk54;
24 if ( diff1 <= 0 )
25 {
26 int v10;
27 int v11;
28 int v15;
29
30 v11 = score_struct->m_delta_value;
31 if ( m_unk54 < m_delta_value )
32 return;
33 do
34 {
35 int v14;
36
37 do
38 {
39 _SsGetSeqData(sep_no, seq_no);
40 v14 = score_struct->m_delta_value;
41 } while ( !v14 );
42 v15 = score_struct->m_unk54;
43 v11 += v14;
44 v10 = v11 - v15;
45 } while ( v11 < v15 );
46 score_struct->m_delta_value = v10;
47 }
48 else
49 {
50 if ( score_struct->m_unk52 > 0 )
51 {
52 score_struct->m_unk52 -= 1;
53 return;
54 }
55 if ( score_struct->m_unk52 )
56 {
57 score_struct->m_delta_value = diff1;
58 return;
59 }
60 score_struct->m_unk52 = score_struct->m_unk54;
61 score_struct->m_delta_value -= 1;
62 }
63}
64
65void _SsSeqGetEof(s16 sep_no, s16 seq_no)
66{
67 libsnd2_sequence_struct_t *score_struct;
68 int m_l_count;
69 u8 *m_unk04;
70
71 score_struct = &_ss_score[sep_no][seq_no];
72 m_l_count = score_struct->m_l_count;
73 score_struct->m_unk21 += 1;
74 if ( m_l_count != SSPLAY_INFINITY )
75 {
76 if ( score_struct->m_unk21 >= m_l_count )
77 {
78 score_struct->m_flags &= ~1u;
79 score_struct->m_flags &= ~8u;
80 score_struct->m_flags &= ~2u;
81 score_struct->m_flags |= 0x200u;
82 score_struct->m_flags |= 4u;
83 score_struct->m_play_mode = SSPLAY_PAUSE;
84 if ( (score_struct->m_flags & 0x400) != 0 )
85 score_struct->m_unk08 = score_struct->m_unk0C;
86 else
87 score_struct->m_unk08 = score_struct->m_unk04;
88 if ( score_struct->m_next_sep != -1 )
89 {
90 score_struct->m_play_mode = SSPLAY_PAUSE;
91 _SsSndNextSep(score_struct->m_next_sep, score_struct->m_next_seq);
92 _SsVmSeqKeyOff(sep_no | (seq_no << 8));
93 }
94 _SsVmSeqKeyOff(sep_no | (seq_no << 8));
95 score_struct->m_delta_value = score_struct->m_unk54;
96 }
97 else
98 {
99 score_struct->m_unk88 = 0;
100 score_struct->m_unk1C = 0;
101 score_struct->m_delta_value = 0;
102 if ( (score_struct->m_flags & 0x400) != 0 )
103 m_unk04 = score_struct->m_unk0C;
104 else
105 m_unk04 = score_struct->m_unk04;
106 score_struct->m_seq_ptr = m_unk04;
107 score_struct->m_unk08 = m_unk04;
108 }
109 }
110 else
111 {
112 score_struct->m_unk88 = 0;
113 score_struct->m_unk1C = 0;
114 score_struct->m_delta_value = 0;
115 if ( (score_struct->m_flags & 0x400) != 0 )
116 score_struct->m_seq_ptr = score_struct->m_unk0C;
117 else
118 score_struct->m_seq_ptr = score_struct->m_unk04;
119 }
120}
121
122int _SsGetSeqData(s16 sep_no, s16 seq_no)
123{
124 libsnd2_sequence_struct_t *score_struct;
125 u8 midi_byte;
126 u8 midi_byte_1;
127 u8 midi_byte_2;
128
129 score_struct = &_ss_score[sep_no][seq_no];
130 midi_byte = *(score_struct->m_seq_ptr);
131 score_struct->m_seq_ptr += 1;
132 if ( (score_struct->m_flags & 0x401) == 0x401 )
133 {
134 if ( score_struct->m_seq_ptr == score_struct->m_unk10 + 1 )
135 {
136 _SsSeqGetEof(sep_no, seq_no);
137 return -1;
138 }
139 }
140 if ( (midi_byte & 0x80) != 0 )
141 {
142 score_struct->m_channel_idx = midi_byte & 0xF;
143 switch ( midi_byte & 0xF0 )
144 {
145 case 0x90:
146 {
147 u8 midi_byte_next_1;
148
149 score_struct->m_running_status = 0x90;
150 midi_byte_next_1 = *(score_struct->m_seq_ptr);
151 score_struct->m_seq_ptr += 1;
152 midi_byte_1 = *(score_struct->m_seq_ptr);
153 score_struct->m_seq_ptr += 1;
154 score_struct->m_delta_value = _SsReadDeltaValue(sep_no, seq_no);
155 SsFCALL.noteon(sep_no, seq_no, midi_byte_next_1, midi_byte_1);
156 break;
157 }
158 case 0xB0:
159 score_struct->m_running_status = 0xB0;
160 score_struct->m_seq_ptr += 1;
161 SsFCALL.control[CC_NUMBER](sep_no, seq_no, midi_byte);
162 break;
163 case 0xC0:
164 score_struct->m_running_status = 0xC0;
165 score_struct->m_seq_ptr += 1;
166 SsFCALL.programchange(sep_no, seq_no, midi_byte);
167 break;
168 case 0xE0:
169 score_struct->m_running_status = 0xE0;
170 score_struct->m_seq_ptr += 1;
171 SsFCALL.pitchbend(sep_no, seq_no);
172 break;
173 case 0xF0:
174 score_struct->m_running_status = -1;
175 midi_byte_2 = *(score_struct->m_seq_ptr);
176 score_struct->m_seq_ptr += 1;
177 if ( midi_byte_2 == 0x2F )
178 {
179 _SsSeqGetEof(sep_no, seq_no);
180 return 1;
181 }
182 SsFCALL.metaevent(sep_no, seq_no, midi_byte);
183 break;
184 default:
185 break;
186 }
187 }
188 else
189 {
190 switch ( score_struct->m_running_status )
191 {
192 case 0x90:
193 {
194 u8 midi_byte_3;
195
196 midi_byte_3 = *(score_struct->m_seq_ptr);
197 score_struct->m_seq_ptr += 1;
198 score_struct->m_delta_value = _SsReadDeltaValue(sep_no, seq_no);
199 SsFCALL.noteon(sep_no, seq_no, midi_byte, midi_byte_3);
200 break;
201 }
202 case 0xB0:
203 SsFCALL.control[CC_NUMBER](sep_no, seq_no, midi_byte);
204 break;
205 case 0xC0:
206 SsFCALL.programchange(sep_no, seq_no, midi_byte);
207 break;
208 case 0xE0:
209 SsFCALL.pitchbend(sep_no, seq_no);
210 break;
211 case 0xFF:
212 if ( midi_byte == 0x2F )
213 {
214 _SsSeqGetEof(sep_no, seq_no);
215 return 1;
216 }
217 SsFCALL.metaevent(sep_no, seq_no, midi_byte);
218 break;
219 default:
220 break;
221 }
222 }
223 return 0;
224}