12#include "irx_imports.h"
25IRX_ID(
"Sound_Data_SQ", 2, 1);
33 unsigned int chunkSize;
45 unsigned int chunkSize;
46 unsigned int fileSize;
47 unsigned int songChunkAddr;
48 unsigned int midiChunkAddr;
49 unsigned int seSequenceChunkAddr;
50 unsigned int seSongChunkAddr;
57 unsigned int chunkSize;
58 unsigned int maxMidiNumber;
59 unsigned int midiOffsetAddr[];
66 unsigned int chunkSize;
67 unsigned int maxSongNumber;
68 unsigned int songOffsetAddr[];
75 unsigned int chunkSize;
76 unsigned int maxSeSequenceSetNumber;
77 unsigned int tableOffset;
78 u8 seSequenceMasterVolume;
79 char seSequenceMasterPanpot;
80 u16 seSequenceMasterTimeScale;
83 unsigned int seSequenceSetOffsetAddr[];
104 dinfo->m_vers = indata;
105 if ( indata->Creator != 0x53434549 || indata->Type != 0x56657273 )
110 if ( (indata->chunkSize & 0x80000000) )
116 if ( dinfo->m_sequ->Creator != 0x53434549 || dinfo->m_sequ->Type != 0x53657175 )
125static unsigned int do_get_midi_chunk(
void *indata,
struct sdsq_info *dinfo)
127 if ( dinfo->m_sequ->midiChunkAddr == 0xFFFFFFFF )
129 if ( (dinfo->m_sequ->midiChunkAddr & 0x80000000) )
131 dinfo->m_midi = (
sceSeqMidiChunk *)((
char *)indata + dinfo->m_sequ->midiChunkAddr);
132 if ( dinfo->m_midi->Creator != 0x53434549 || dinfo->m_midi->Type != 0x4D696469 )
140static unsigned int do_get_song_chunk(
void *indata,
struct sdsq_info *dinfo)
142 if ( dinfo->m_sequ->songChunkAddr == 0xFFFFFFFF )
144 if ( (dinfo->m_sequ->songChunkAddr & 0x80000000) )
146 dinfo->m_song = (
sceSeqSongChunk *)((
char *)indata + dinfo->m_sequ->songChunkAddr);
147 if ( dinfo->m_song->Creator != 0x53434549 || dinfo->m_song->Type != 0x536F6E67 )
155static unsigned int do_get_midi_data_block(
void *indata,
unsigned int idx,
sceSeqMidiDataBlock **datablk)
163 result = do_get_midi_chunk(indata, &dinfo);
166 if ( dinfo.m_midi->maxMidiNumber < idx )
168 if ( dinfo.m_midi->midiOffsetAddr[idx] == 0xFFFFFFFF )
170 *datablk = (
sceSeqMidiDataBlock *)((
char *)dinfo.m_midi + dinfo.m_midi->midiOffsetAddr[idx]);
174int sceSdSqGetMaxMidiNumber(
void *addr)
182 result = (int)do_get_midi_chunk(addr, &dinfo);
185 return (
int)dinfo.m_midi->maxMidiNumber;
188int sceSdSqGetMaxSongNumber(
void *addr)
196 result = (int)do_get_song_chunk(addr, &dinfo);
199 return (
int)dinfo.m_song->maxSongNumber;
202int sceSdSqInitMidiData(
void *addr, u32 midiNumber,
SceSdSqMidiData *midiData)
210 result = (int)do_get_midi_chunk(addr, &dinfo);
213 if ( dinfo.m_midi->maxMidiNumber < midiNumber )
214 return (
int)0x81049026;
215 if ( dinfo.m_midi->midiOffsetAddr[midiNumber] == 0xFFFFFFFF )
216 return (
int)0x81049026;
217 midiData->readStatus = 0;
218 midiData->midiNumber = midiNumber;
219 midiData->midiData = (
sceSeqMidiDataBlock *)((
char *)dinfo.m_midi + dinfo.m_midi->midiOffsetAddr[midiNumber]);
220 midiData->offset = 0;
221 midiData->nextOffset = midiData->midiData->sequenceDataOffset;
222 midiData->division = midiData->midiData->Division;
223 midiData->compMode = (midiData->nextOffset == 6) ? 0 : 1;
224 midiData->compTableSize = (midiData->nextOffset == 6) ? 0 : midiData->midiData->compBlock[0].compTableSize;
225 midiData->deltaTime = 0;
226 midiData->lastStatus = 0;
227 midiData->reserve[0] = 0;
228 midiData->reserve[1] = 0;
229 midiData->reserve[2] = 0;
230 midiData->messageLength = 1;
231 midiData->message[0] = 0;
232 midiData->message[1] = 0;
233 midiData->message[2] = 0;
234 midiData->message[3] = 0;
235 midiData->message[4] = 0;
236 midiData->message[5] = 0;
237 midiData->message[6] = 0;
238 midiData->message[7] = 0;
239 midiData->originalMessageLength = 1;
240 midiData->originalMessage[0] = 0;
241 midiData->originalMessage[1] = 0;
242 midiData->originalMessage[2] = 0;
243 midiData->originalMessage[3] = 0;
244 midiData->originalMessage[4] = 0;
245 midiData->originalMessage[5] = 0;
246 midiData->originalMessage[6] = 0;
247 midiData->originalMessage[7] = 0;
248 midiData->originalMessage[8] = 0;
249 midiData->originalMessage[9] = 0;
250 midiData->originalMessage[10] = 0;
251 midiData->originalMessage[11] = 0;
263 u32 midiData_curval1_1;
265 const u8 *midiData_offs_plusone;
266 u32 nextMessageLength;
273 if ( midiData->readStatus )
274 return (
int)0x81048001;
275 if ( !midiData->originalMessageLength )
277 midiData->readStatus = 2;
278 return (
int)0x8104002F;
280 cur_message = midiData->originalMessage[midiData->originalMessageLength - 1];
281 midiData_1 = midiData->midiData;
282 nextOffset = midiData->nextOffset;
283 lastStatus = midiData->lastStatus;
284 midiData->originalMessageLength = 0;
285 midiData->messageLength = 0;
286 midiData_offs = (u8 *)midiData_1 + nextOffset;
287 midiData->offset = nextOffset;
288 midiData_curval1_1 = 0;
289 if ( !(cur_message & 0x80) || lastStatus == 255 )
293 midiData_curval1 = *midiData_offs;
294 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
295 midiData->originalMessageLength += 1;
297 midiData_curval1_1 = midiData_curval1 & 0x7F;
298 while ( midiData_curval1 & 0x80 )
300 midiData_curval1 = *midiData_offs;
302 midiData->originalMessage[midiData->originalMessageLength] = midiData_curval1;
303 midiData->originalMessageLength += 1;
304 midiData_curval1_1 = (midiData_curval1_1 << 7) + (midiData_curval1 & 0x7F);
307 midiData->deltaTime = midiData_curval1_1;
308 midiData_curval2 = *midiData_offs;
309 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
310 if ( (midiData_curval2 & 0x80) )
313 midiData->originalMessageLength += 1;
317 midiData_curval2 = lastStatus;
319 midiData->message[0] = midiData_curval2;
320 midiData->lastStatus = midiData_curval2;
321 midiData_offs_plusone = 0;
322 switch ( midiData_curval2 & 0xF0 )
339 if ( !midiData->compMode )
347 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
348 midiData->message[1] = midiData->originalMessage[midiData->originalMessageLength];
349 midiData->message[2] = 8 * (midiData->originalMessage[midiData->originalMessageLength] & 0xF);
350 midiData->originalMessageLength = midiData->originalMessageLength + 1;
351 someoffsx = 2 * ((midiData->message[0] & 0xF) | (midiData->message[1] & 0x70));
352 midiData->message[1] = midiData->message[1] & 0x7F;
353 midiData_offs_plusone = midiData_offs + 1;
354 midiData->message[0] = *((u8 *)&midiData->midiData->compBlock[1].compOption + someoffsx);
355 midiData->message[1] = *((u8 *)&midiData->midiData->compBlock[1].compOption + someoffsx + 1);
356 midiData->messageLength = 3;
367 if ( midiData_curval2 != 255 )
369 midiData->readStatus = 2;
370 return (
int)0x8104002F;
372 midiData->messageLength = 1;
373 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
374 midiData->message[1] = midiData->originalMessage[midiData->originalMessageLength];
375 midiData->messageLength = midiData->messageLength + 1;
376 midiData->originalMessageLength = midiData->originalMessageLength + 1;
377 someaddoffsone = midiData_offs + 1;
378 midiData_curval7 = *someaddoffsone;
379 midiData->originalMessage[midiData->originalMessageLength] = *someaddoffsone;
380 midiData->message[2] = midiData->originalMessage[midiData->originalMessageLength];
381 midiData->messageLength = midiData->messageLength + 1;
382 midiData_offs_plusone = someaddoffsone + 1;
383 midiData->originalMessageLength += 1;
384 msg2ew = midiData_curval7;
385 for ( i = 1; msg2ew >= i; i += 1 )
387 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs_plusone;
388 midiData_offs_plusone += 1;
389 midiData->message[i + 2] = midiData->originalMessage[midiData->originalMessageLength];
390 msg2ew = midiData->message[2];
391 midiData->messageLength += 1;
392 midiData->originalMessageLength += 1;
395 if ( midiData->message[0] == 0xFF && midiData->message[1] == 0x2F && midiData->message[2] == 0x00 )
396 midiData->readStatus = 1;
402 midiData->readStatus = 2;
403 return (
int)0x8104002F;
406 nextMessageLength = 0;
409 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
410 midiData->message[1] = *midiData_offs;
411 midiData->originalMessageLength = midiData->originalMessageLength + 1;
412 currofssplusone = midiData_offs + 1;
413 midiData->originalMessage[midiData->originalMessageLength] = *currofssplusone;
414 midiData_offs_plusone = currofssplusone + 1;
415 midiData->message[2] = midiData->originalMessage[midiData->originalMessageLength];
416 nextMessageLength = 3;
421 midiData->originalMessage[midiData->originalMessageLength] = *midiData_offs;
422 midiData_offs_plusone = midiData_offs + 1;
423 midiData->message[1] = midiData->originalMessage[midiData->originalMessageLength];
424 nextMessageLength = 2;
428 midiData->messageLength = nextMessageLength;
429 midiData->originalMessageLength = midiData->originalMessageLength + 1;
432 midiData->message[midiData->messageLength - 1] &= ~0x80u;
433 midiData->nextOffset = (u32)(midiData_offs_plusone - (u8 *)midiData->midiData);
437int sceSdSqInitSongData(
void *addr, u32 songNumber,
SceSdSqSongData *songData)
445 result = (int)do_get_song_chunk(addr, &dinfo);
448 if ( dinfo.m_song->maxSongNumber < songNumber )
449 return (
int)0x81049027;
450 if ( dinfo.m_song->songOffsetAddr[songNumber] == 0xFFFFFFFF )
451 return (
int)0x81049027;
452 songData->readStatus = 0;
453 songData->songNumber = songNumber;
454 songData->topAddr = (
char *)(dinfo.m_song) + dinfo.m_song->songOffsetAddr[songNumber];
455 songData->offset = 0;
456 songData->nextOffset = 0;
457 songData->message[0] = 0;
458 songData->message[1] = 0;
459 songData->message[2] = 0;
460 songData->reserve = 0;
468 if ( songData->readStatus )
469 return (
int)0x81048001;
470 curOffset = (u8 *)songData->topAddr + songData->nextOffset;
471 if ( (*curOffset & 0xF0) != 160 || (curOffset[1] & 0x80u) )
473 songData->readStatus = 2;
474 return (
int)0x8104002F;
476 songData->offset = songData->nextOffset;
477 songData->message[0] = *curOffset;
478 songData->message[1] = curOffset[1];
479 songData->message[2] = curOffset[2];
480 if ( songData->message[0] == 0xA0 && songData->message[1] == 0x7F && songData->message[2] == 0x7F )
481 songData->readStatus = 1;
483 songData->nextOffset += 3;
487int sceSdSqGetMaxCompTableIndex(
void *addr, u32 midiNumber)
492 result = (int)do_get_midi_data_block(addr, midiNumber, &dblk);
495 if ( dblk->sequenceDataOffset == 6 )
496 return (
int)0x81049028;
497 return dblk->compBlock[0].compTableSize >> 1;
500int sceSdSqGetCompTableOffset(
void *addr, u32 midiNumber, u32 *offset)
505 result = (int)do_get_midi_data_block(addr, midiNumber, &dblk);
508 if ( dblk->sequenceDataOffset == 6 )
509 return (
int)0x81049028;
510 *offset = (u32)((
char *)dblk - (
char *)addr) - 10;
514int sceSdSqGetCompTableDataByIndex(
void *addr, u32 midiNumber, u32 compTableIndex,
SceSdSqCompTableData *data)
519 result = (int)do_get_midi_data_block(addr, midiNumber, &dblk);
522 if ( dblk->sequenceDataOffset == 6 )
523 return (
int)0x81049028;
524 if ( dblk->compBlock[0].compTableSize >> 1 < compTableIndex )
525 return (
int)0x81049029;
526 data->status = *((u8 *)&dblk->compBlock[1].compOption + (compTableIndex << 1));
527 data->data = *((u8 *)&dblk->compBlock[1].compOption + (compTableIndex << 1) + 1);
531int sceSdSqGetNoteOnEventByPolyKeyPress(
538 if ( (pData->status & 0xF0) != 160 )
539 return (
int)0x8104902A;
540 compTableIndex = (pData->status & 0xF) + (pData->data & 0xF0);
541 if ( compTableIndex >= 0x80 )
542 return (
int)0x8104902A;
543 result = sceSdSqGetCompTableDataByIndex(addr, midiNumber, compTableIndex, &data);
546 kData->status = data.status;
547 kData->note = data.data;
548 kData->velocity = 8 * (pData->data & 0xF);
567int _start(
int ac,
char *av[],
void *startaddr,
ModuleInfo_t *mi)
577 regres = ReleaseLibraryEntries(&_exp_sdsq);
579 return (!regres) ? MODULE_NO_RESIDENT_END : MODULE_REMOVABLE_END;
582 regres = RegisterLibraryEntries(&_exp_sdsq);
585 return MODULE_NO_RESIDENT_END;
587 return MODULE_REMOVABLE_END;
589 if ( mi && ((mi->
newflags & 2) != 0) )
591 return MODULE_RESIDENT_END;
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)