PS2SDK
PS2 Homebrew Libraries
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 
13 void _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 
65 void _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 
122 int _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 }
libsnd2_sequence_struct_
Definition: libsnd2_internal.h:47