12#include "irx_imports.h"
25IRX_ID(
"Sound_Data_HD", 2, 2);
33 unsigned int chunkSize;
46 unsigned int chunkSize;
47 unsigned int headerSize;
48 unsigned int bodySize;
49 unsigned int programChunkAddr;
50 unsigned int sampleSetChunkAddr;
51 unsigned int sampleChunkAddr;
52 unsigned int vagInfoChunkAddr;
53 unsigned int seTimbreChunkAddr;
60 unsigned int chunkSize;
61 unsigned int maxProgramNumber;
62 unsigned int programOffsetAddr[];
69 unsigned int chunkSize;
70 unsigned int maxSampleSetNumber;
71 unsigned int sampleSetOffsetAddr[];
78 unsigned int chunkSize;
79 unsigned int maxSampleNumber;
80 unsigned int sampleOffsetAddr[];
87 unsigned int chunkSize;
88 unsigned int maxVagInfoNumber;
89 unsigned int vagInfoOffsetAddr[];
114 dinfo->m_vers = indata;
115 if ( indata->Creator != 0x53434549 || indata->Type != 0x56657273 )
120 if ( (indata->chunkSize & 0x80000000) )
126 if ( dinfo->m_head->Creator != 0x53434549 || dinfo->m_head->Type != 0x48656164 )
135static unsigned int do_get_prog_chunk(
void *indata,
struct sdhd_info *dinfo)
137 if ( dinfo->m_head->programChunkAddr == 0xFFFFFFFF )
139 if ( (dinfo->m_head->programChunkAddr & 0x80000000) )
142 if ( dinfo->m_prog->Creator != 0x53434549 || dinfo->m_prog->Type != 0x50726F67 )
150static unsigned int do_get_sset_chunk(
void *indata,
struct sdhd_info *dinfo)
152 if ( dinfo->m_head->sampleSetChunkAddr == 0xFFFFFFFF )
154 if ( (dinfo->m_head->sampleSetChunkAddr & 0x80000000) )
157 if ( dinfo->m_sset->Creator != 0x53434549 || dinfo->m_sset->Type != 0x53736574 )
165static unsigned int do_get_smpl_chunk(
void *indata,
struct sdhd_info *dinfo)
167 if ( dinfo->m_head->sampleChunkAddr == 0xFFFFFFFF )
169 if ( (dinfo->m_head->sampleChunkAddr & 0x80000000) )
172 if ( dinfo->m_smpl->Creator != 0x53434549 || dinfo->m_smpl->Type != 0x536D706C )
180static unsigned int do_get_vagi_chunk(
void *indata,
struct sdhd_info *dinfo)
182 if ( dinfo->m_head->vagInfoChunkAddr == 0xFFFFFFFF )
184 if ( (dinfo->m_head->vagInfoChunkAddr & 0x80000000) )
187 if ( dinfo->m_vagi->Creator != 0x53434549 || dinfo->m_vagi->Type != 0x56616769 )
197 dst->nSplit = src->nSplit;
198 dst->progAttr = src->progAttr;
199 dst->common.volume = src->progVolume;
200 dst->common.panpot = src->progPanpot;
201 dst->common.transpose = src->progTranspose;
202 dst->common.detune = src->progDetune;
203 dst->keyFollow.pan = src->keyFollowPan;
204 dst->keyFollow.panCenter = src->keyFollowPanCenter;
205 dst->LFO.wavePitch = src->progLfoWave;
206 dst->LFO.waveAmp = src->progLfoWave2;
207 dst->LFO.startPhasePitch = src->progLfoStartPhase;
208 dst->LFO.startPhaseAmp = src->progLfoStartPhase2;
209 dst->LFO.phaseRandomPitch = src->progLfoPhaseRandom;
210 dst->LFO.phaseRandomAmp = src->progLfoPhaseRandom2;
211 dst->LFO.cyclePitch = src->progLfoFreq;
212 dst->LFO.cycleAmp = src->progLfoFreq2;
213 dst->LFO.pitchDepthUp = src->progLfoPitchDepth;
214 dst->LFO.pitchDepthDown = src->progLfoPitchDepth2;
215 dst->LFO.midiPitchDepthUp = src->progLfoMidiPitchDepth;
216 dst->LFO.midiPitchDepthDown = src->progLfoMidiPitchDepth2;
217 dst->LFO.ampDepthUp = src->progLfoAmpDepth;
218 dst->LFO.ampDepthDown = src->progLfoAmpDepth2;
219 dst->LFO.midiAmpDepthUp = src->progLfoMidiAmpDepth;
220 dst->LFO.midiAmpDepthDown = src->progLfoMidiAmpDepth2;
225 dst->sampleSetIndex = src->sampleSetIndex;
226 dst->splitNumber = src->splitNumber;
227 dst->range.low = src->splitRangeLow;
228 dst->range.crossFade = src->splitCrossFade;
229 dst->range.high = src->splitRangeHigh;
230 dst->bendRange.low = src->splitBendRangeLow;
231 dst->bendRange.high = src->splitBendRangeHigh;
232 dst->keyFollow.pitch = src->keyFollowPitch;
233 dst->keyFollow.pitchCenter = src->keyFollowPitchCenter;
234 dst->keyFollow.amp = src->keyFollowAmp;
235 dst->keyFollow.ampCenter = src->keyFollowAmpCenter;
236 dst->keyFollow.pan = src->keyFollowPan;
237 dst->keyFollow.panCenter = src->keyFollowPanCenter;
238 dst->common.volume = src->splitVolume;
239 dst->common.panpot = src->splitPanpot;
240 dst->common.transpose = src->splitTranspose;
241 dst->common.detune = src->splitDetune;
246 dst->velCurve = src->velCurve;
247 dst->velLimitLow = src->velLimitLow;
248 dst->velLimitHigh = src->velLimitHigh;
249 dst->nSample = src->nSample;
254 dst->vagIndex = src->VagIndex;
255 dst->spuAttr = src->sampleSpuAttr;
256 dst->lfoAttr = src->sampleLfoAttr;
257 dst->velRange.low = src->velRangeLow;
258 dst->velRange.crossFade = src->velCrossFade;
259 dst->velRange.high = src->velRangeHigh;
260 dst->velFollow.pitch = src->velFollowPitch;
261 dst->velFollow.pitchCenter = src->velFollowPitchCenter;
262 dst->velFollow.pitchVelCurve = src->velFollowPitchVelCurve;
263 dst->velFollow.amp = src->velFollowAmp;
264 dst->velFollow.ampCenter = src->velFollowAmpCenter;
265 dst->velFollow.ampVelCurve = src->velFollowAmpVelCurve;
266 dst->common.baseNote = src->sampleBaseNote;
267 dst->common.detune = src->sampleDetune;
268 dst->common.panpot = src->samplePanpot;
269 dst->common.group = src->sampleGroup;
270 dst->common.priority = src->samplePriority;
271 dst->common.volume = src->sampleVolume;
272 dst->ADSR.ADSR1 = src->sampleAdsr1;
273 dst->ADSR.ADSR2 = src->sampleAdsr2;
274 dst->keyFollow.ar = src->keyFollowAr;
275 dst->keyFollow.arCenter = src->keyFollowArCenter;
276 dst->keyFollow.dr = src->keyFollowDr;
277 dst->keyFollow.drCenter = src->keyFollowDrCenter;
278 dst->keyFollow.sr = src->keyFollowSr;
279 dst->keyFollow.srCenter = src->keyFollowSrCenter;
280 dst->keyFollow.rr = src->keyFollowRr;
281 dst->keyFollow.rrCenter = src->keyFollowRrCenter;
282 dst->keyFollow.sl = src->keyFollowSl;
283 dst->keyFollow.slCenter = src->keyFollowSlCenter;
284 dst->LFO.pitchLFODelay = src->samplePitchLfoDelay;
285 dst->LFO.pitchLFOFade = src->samplePitchLfoFade;
286 dst->LFO.ampLFODelay = src->sampleAmpLfoDelay;
287 dst->LFO.ampLFOFade = src->sampleAmpLfoFade;
292 dst->vagOffsetAddr = src->vagOffsetAddr;
293 dst->vagSampleRate = src->vagSampleRate;
295 dst->vagAttribute = src->vagAttribute;
301 unsigned int bodySize;
305 if ( do_get_vers_head_chunk(indata, &dinfo) || do_get_vagi_chunk(indata, &dinfo) )
307 bodySize = dinfo.m_head->bodySize;
308 for ( i = 0; dinfo.m_vagi->maxVagInfoNumber >= i; i += 1 )
310 if ( dinfo.m_vagi->vagInfoOffsetAddr[i] != 0xFFFFFFFF )
312 vagparam = (
sceHardSynthVagParam *)((
char *)(dinfo.m_vagi) + dinfo.m_vagi->vagInfoOffsetAddr[i]);
313 if ( *vagoffsaddr < vagparam->vagOffsetAddr && vagparam->vagOffsetAddr < bodySize )
314 bodySize = vagparam->vagOffsetAddr;
317 return bodySize - *vagoffsaddr;
321do_check_chunk_in_bounds(
void *indata,
const struct sdhd_info *dinfo,
unsigned int hdrmagic,
unsigned int idx)
329 if ( !dinfo->m_smpl )
331 if ( dinfo->m_smpl->maxSampleNumber < idx )
333 if ( dinfo->m_smpl->sampleOffsetAddr[idx] == 0xFFFFFFFF )
339 if ( !dinfo->m_sset )
341 if ( dinfo->m_sset->maxSampleSetNumber < idx )
343 if ( dinfo->m_sset->sampleSetOffsetAddr[idx] == 0xFFFFFFFF )
349 if ( !dinfo->m_vagi )
351 if ( dinfo->m_vagi->maxVagInfoNumber < idx )
353 if ( dinfo->m_vagi->vagInfoOffsetAddr[idx] == 0xFFFFFFFF )
359 if ( !dinfo->m_prog )
361 if ( dinfo->m_prog->maxProgramNumber < idx )
363 if ( dinfo->m_prog->programOffsetAddr[idx] == 0xFFFFFFFF )
373static int do_get_common_block_ptr_note(
375 unsigned int programNumber,
377 unsigned int noteNumber,
378 unsigned int velocity,
393 sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam) || p_programparam->splitBlockAddr == 0xFFFFFFFF )
397 for ( i = 0; i < p_programparam->nSplit; i += 1 )
400 + p_programparam->sizeSplitBlock * i);
401 if ( noteNumber < (p_splitblock->splitRangeLow & 0x7Fu) || noteNumber > (p_splitblock->splitRangeHigh & 0x7Fu) )
413 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
422 p_splitblock->sampleSetIndex == 0xFFFF
423 || sceSdHdGetSampleSetParamAddr(buffer, p_splitblock->sampleSetIndex, &p_samplesetparam) )
434 *ptr = p_samplesetparam;
435 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
446 if ( velocity < p_samplesetparam->velLimitLow || velocity > p_samplesetparam->velLimitHigh )
450 for ( j = 0; j < p_samplesetparam->nSample; j += 1 )
453 p_samplesetparam->sampleIndex[j] != 0xFFFF
454 && !sceSdHdGetSampleParamAddr(buffer, p_samplesetparam->sampleIndex[j], &p_sampleparam)
455 && velocity >= (p_sampleparam->velRangeLow & 0x7Fu)
456 && (p_sampleparam->velRangeHigh & 0x7Fu) >= velocity )
465 *ptr = p_sampleparam;
466 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
475 p_sampleparam->VagIndex == 0xFFFF
476 || sceSdHdGetVAGInfoParamAddr(buffer, p_sampleparam->VagIndex, &p_vagparam) )
488 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
492 do_copy_to_sdhd_vag_info_param(
507 for ( j = 0; j < p_samplesetparam->nSample; j += 1 )
510 p_samplesetparam->sampleIndex[j] != 0xFFFF
511 && !sceSdHdGetSampleParamAddr(buffer, p_samplesetparam->sampleIndex[j], &p_sampleparam)
512 && velocity >= (p_sampleparam->velRangeLow & 0x7Fu)
513 && (p_sampleparam->velRangeHigh & 0x7Fu) >= velocity )
522 *ptr = p_sampleparam;
523 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
532 p_sampleparam->VagIndex == 0xFFFF
533 || sceSdHdGetVAGInfoParamAddr(buffer, p_sampleparam->VagIndex, &p_vagparam) )
545 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
549 do_copy_to_sdhd_vag_info_param(
574static int do_get_common_block_ptr(
576 unsigned int sampleSetNumber,
578 unsigned int velocity,
589 if ( sceSdHdGetSampleSetParamAddr(buffer, sampleSetNumber, &p_samplesetparam) )
594 if ( velocity < p_samplesetparam->velLimitLow || velocity > p_samplesetparam->velLimitHigh )
596 for ( i = 0; i < p_samplesetparam->nSample; i += 1 )
599 p_samplesetparam->sampleIndex[i] != 0xFFFF
600 && !sceSdHdGetSampleParamAddr(buffer, p_samplesetparam->sampleIndex[i], &p_sampleparam)
601 && velocity >= (p_sampleparam->velRangeLow & 0x7Fu) && (p_sampleparam->velRangeHigh & 0x7Fu) >= velocity )
610 *param = p_sampleparam;
611 param = (
void **)(((
char *)param) +
sizeof(
void *));
620 p_sampleparam->VagIndex == 0xFFFF
621 || sceSdHdGetVAGInfoParamAddr(buffer, p_sampleparam->VagIndex, &p_vagparam) )
633 param = (
void **)(((
char *)param) +
sizeof(
void *));
637 do_copy_to_sdhd_vag_info_param(
651 for ( i = 0; i < p_samplesetparam->nSample; i += 1 )
654 p_samplesetparam->sampleIndex[i] != 0xFFFF
655 && !sceSdHdGetSampleParamAddr(buffer, p_samplesetparam->sampleIndex[i], &p_sampleparam)
656 && velocity >= (p_sampleparam->velRangeLow & 0x7Fu) && (p_sampleparam->velRangeHigh & 0x7Fu) >= velocity )
665 *param = p_sampleparam;
666 param = (
void **)(((
char *)param) +
sizeof(
void *));
675 p_sampleparam->VagIndex == 0xFFFF
676 || sceSdHdGetVAGInfoParamAddr(buffer, p_sampleparam->VagIndex, &p_vagparam) )
686 param = (
void **)(((
char *)param) +
sizeof(
void *));
690 do_copy_to_sdhd_vag_info_param(
709int sceSdHdGetMaxProgramNumber(
void *buffer)
717 result = (int)do_get_prog_chunk(buffer, &dinfo);
720 return (
int)dinfo.m_prog->maxProgramNumber;
723int sceSdHdGetMaxSampleSetNumber(
void *buffer)
731 result = (int)do_get_sset_chunk(buffer, &dinfo);
734 return (
int)dinfo.m_sset->maxSampleSetNumber;
737int sceSdHdGetMaxSampleNumber(
void *buffer)
745 result = (int)do_get_smpl_chunk(buffer, &dinfo);
748 return (
int)dinfo.m_smpl->maxSampleNumber;
751int sceSdHdGetMaxVAGInfoNumber(
void *buffer)
759 result = (int)do_get_vagi_chunk(buffer, &dinfo);
762 return (
int)dinfo.m_vagi->maxVagInfoNumber;
773 result = (int)do_get_prog_chunk(buffer, &dinfo);
776 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x50726F67u, programNumber);
783int sceSdHdGetProgramParam(
void *buffer,
unsigned int programNumber,
SceSdHdProgramParam *param)
788 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
791 do_copy_to_sdhd_program_param(param, p_programparam);
795int sceSdHdGetSplitBlockAddr(
796 void *buffer,
unsigned int programNumber,
unsigned int splitBlockNumber,
sceHardSynthSplitBlock **theParamPtr)
801 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
804 if ( p_programparam->splitBlockAddr == 0xFFFFFFFF )
805 return (
int)0x81039009;
806 if ( (
unsigned int)p_programparam->nSplit - 1 < splitBlockNumber )
807 return (
int)0x81039018;
809 + p_programparam->sizeSplitBlock * splitBlockNumber);
813int sceSdHdGetSplitBlock(
814 void *buffer,
unsigned int programNumber,
unsigned int splitBlockNumber,
SceSdHdSplitBlock *param)
819 result = sceSdHdGetSplitBlockAddr(buffer, programNumber, splitBlockNumber, &p_splitblock);
822 do_copy_to_sdhd_split_block(param, p_splitblock);
834 result = (int)do_get_sset_chunk(buffer, &dinfo);
837 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x53736574, sampleSetNumber);
844int sceSdHdGetSampleSetParam(
void *buffer,
unsigned int sampleSetNumber,
SceSdHdSampleSetParam *param)
849 result = sceSdHdGetSampleSetParamAddr(buffer, sampleSetNumber, &p_samplesetparam);
852 do_copy_to_sdhd_set_param(param, p_samplesetparam);
864 result = (int)do_get_smpl_chunk(buffer, &dinfo);
867 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x536D706C, sampleNumber);
874int sceSdHdGetSampleParam(
void *buffer,
unsigned int sampleNumber,
SceSdHdSampleParam *param)
879 result = sceSdHdGetSampleParamAddr(buffer, sampleNumber, &p_sampleparam);
882 do_copy_to_sdhd_sample_param(param, p_sampleparam);
886int sceSdHdGetVAGInfoParamAddr(
void *buffer,
unsigned int vagInfoNumber,
sceHardSynthVagParam **ptr)
894 result = (int)do_get_vagi_chunk(buffer, &dinfo);
897 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x56616769, vagInfoNumber);
900 *ptr = (
sceHardSynthVagParam *)((
char *)dinfo.m_vagi + dinfo.m_vagi->vagInfoOffsetAddr[vagInfoNumber]);
904int sceSdHdGetVAGInfoParam(
void *buffer,
unsigned int vagInfoNumber,
SceSdHdVAGInfoParam *param)
909 result = sceSdHdGetVAGInfoParamAddr(buffer, vagInfoNumber, &p_vagparam);
912 do_copy_to_sdhd_vag_info_param(
917int sceSdHdCheckProgramNumber(
void *buffer,
unsigned int programNumber)
925 result = (int)do_get_prog_chunk(buffer, &dinfo);
928 return (
int)do_check_chunk_in_bounds(buffer, &dinfo, 0x50726F67, programNumber);
931int sceSdHdGetSplitBlockCountByNote(
void *buffer,
unsigned int programNumber,
unsigned int noteNumber)
933 return do_get_common_block_ptr_note(buffer, programNumber, 0, noteNumber, 0, 0, 0);
936int sceSdHdGetSplitBlockAddrByNote(
939 return do_get_common_block_ptr_note(buffer, programNumber, 1, noteNumber, 0, 0, (
void **)ptr);
942int sceSdHdGetSplitBlockByNote(
943 void *buffer,
unsigned int programNumber,
unsigned int noteNumber,
SceSdHdSplitBlock *param)
945 return do_get_common_block_ptr_note(buffer, programNumber, 2, noteNumber, 0, 0, (
void **)param);
948int sceSdHdGetSampleSetParamCountByNote(
void *buffer,
unsigned int programNumber,
unsigned int noteNumber)
950 return do_get_common_block_ptr_note(buffer, programNumber, 3, noteNumber, 0, 0, 0);
953int sceSdHdGetSampleSetParamAddrByNote(
956 return do_get_common_block_ptr_note(buffer, programNumber, 4, noteNumber, 0, 0, (
void **)ptr);
959int sceSdHdGetSampleSetParamByNote(
962 return do_get_common_block_ptr_note(buffer, programNumber, 5, noteNumber, 0, 0, (
void **)param);
965int sceSdHdGetSampleParamCountByNoteVelocity(
966 void *buffer,
unsigned int programNumber,
unsigned int noteNumber,
unsigned int velocity,
unsigned int mode)
968 return do_get_common_block_ptr_note(buffer, programNumber, 6, noteNumber, velocity, mode, 0);
971int sceSdHdGetSampleParamAddrByNoteVelocity(
973 unsigned int programNumber,
974 unsigned int noteNumber,
975 unsigned int velocity,
979 return do_get_common_block_ptr_note(buffer, programNumber, 7, noteNumber, velocity, mode, (
void **)ptr);
982int sceSdHdGetSampleParamByNoteVelocity(
984 unsigned int programNumber,
985 unsigned int noteNumber,
986 unsigned int velocity,
990 return do_get_common_block_ptr_note(buffer, programNumber, 8, noteNumber, velocity, mode, (
void **)param);
993int sceSdHdGetVAGInfoParamCountByNoteVelocity(
994 void *buffer,
unsigned int programNumber,
unsigned int noteNumber,
unsigned int velocity,
unsigned int mode)
996 return do_get_common_block_ptr_note(buffer, programNumber, 9, noteNumber, velocity, mode, 0);
999int sceSdHdGetVAGInfoParamAddrByNoteVelocity(
1001 unsigned int programNumber,
1002 unsigned int noteNumber,
1003 unsigned int velocity,
1007 return do_get_common_block_ptr_note(buffer, programNumber, 0xA, noteNumber, velocity, mode, (
void **)ptr);
1010int sceSdHdGetVAGInfoParamByNoteVelocity(
1012 unsigned int programNumber,
1013 unsigned int noteNumber,
1014 unsigned int velocity,
1018 return do_get_common_block_ptr_note(buffer, programNumber, 0xB, noteNumber, velocity, mode, (
void **)param);
1021int sceSdHdGetSampleParamCountByVelocity(
1022 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode)
1024 return do_get_common_block_ptr(buffer, sampleSetNumber, 6, velocity, mode, 0);
1027int sceSdHdGetSampleParamAddrByVelocity(
1028 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode,
sceHardSynthSampleParam **ptr)
1030 return do_get_common_block_ptr(buffer, sampleSetNumber, 7, velocity, mode, (
void **)ptr);
1033int sceSdHdGetSampleParamByVelocity(
1034 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode,
SceSdHdSampleParam *param)
1036 return do_get_common_block_ptr(buffer, sampleSetNumber, 8, velocity, mode, (
void **)param);
1039int sceSdHdGetVAGInfoParamCountByVelocity(
1040 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode)
1042 return do_get_common_block_ptr(buffer, sampleSetNumber, 9, velocity, mode, 0);
1045int sceSdHdGetVAGInfoParamAddrByVelocity(
1046 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode,
sceHardSynthVagParam **ptr)
1048 return do_get_common_block_ptr(buffer, sampleSetNumber, 0xA, velocity, mode, (
void **)ptr);
1051int sceSdHdGetVAGInfoParamByVelocity(
1052 void *buffer,
unsigned int sampleSetNumber,
unsigned int velocity,
unsigned int mode,
SceSdHdVAGInfoParam *param)
1054 return do_get_common_block_ptr(buffer, sampleSetNumber, 0xB, velocity, mode, (
void **)param);
1057int sceSdHdGetVAGInfoParamAddrBySampleNumber(
void *buffer,
unsigned int sampleNumber,
sceHardSynthVagParam **ptr)
1062 result = sceSdHdGetSampleParamAddr(buffer, sampleNumber, &p_sampleparam);
1065 if ( p_sampleparam->VagIndex == 0xFFFF )
1066 return (
int)0x81039019;
1067 return sceSdHdGetVAGInfoParamAddr(buffer, p_sampleparam->VagIndex, ptr);
1070int sceSdHdGetVAGInfoParamBySampleNumber(
void *buffer,
unsigned int sampleNumber,
SceSdHdVAGInfoParam *param)
1075 result = sceSdHdGetVAGInfoParamAddrBySampleNumber(buffer, sampleNumber, &p_vagparam);
1078 do_copy_to_sdhd_vag_info_param(
1083int sceSdHdGetSplitBlockNumberBySplitNumber(
void *buffer,
unsigned int programNumber,
unsigned int splitNumber)
1090 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
1093 if ( p_programparam->splitBlockAddr == 0xFFFFFFFF )
1094 return (
int)0x81039009;
1096 for ( i = 0; i < p_programparam->nSplit; i += 1 )
1098 if ( splitNumber == splitblock->splitNumber )
1102 return (
int)0x81039020;
1105int sceSdHdGetVAGSize(
void *buffer,
unsigned int vagInfoNumber)
1110 result = sceSdHdGetVAGInfoParamAddr(buffer, vagInfoNumber, &p_vagparam);
1116int sceSdHdGetSplitBlockCount(
void *buffer,
unsigned int programNumber)
1121 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
1124 return p_programparam->nSplit;
1127int sceSdHdGetMaxSplitBlockCount(
void *buffer)
1130 unsigned int retres;
1139 retres = (
unsigned int)sceSdHdGetMaxProgramNumber(buffer);
1140 if ( (retres & 0x80000000) != 0 )
1142 for ( i = 0; i < retres; i += 1 )
1144 if ( !sceSdHdGetProgramParamAddr(buffer, i, &p_programparam) )
1146 for ( j = 0; j < p_programparam->nSplit; j += 1 )
1148 if ( !sceSdHdGetSplitBlockAddr(buffer, i, j, &p_splitblock) )
1150 curval1 = sceSdHdGetSplitBlockCountByNote(buffer, i, p_splitblock->splitRangeLow & 0x7F);
1151 curminval = (curminval < curval1) ? curval1 : curminval;
1152 curval2 = sceSdHdGetSplitBlockCountByNote(buffer, i, p_splitblock->splitRangeHigh & 0x7F);
1153 curminval = (curminval < curval2) ? curval2 : curminval;
1161int sceSdHdGetMaxSampleSetParamCount(
void *buffer)
1164 unsigned int retres;
1173 retres = (
unsigned int)sceSdHdGetMaxProgramNumber(buffer);
1174 if ( (retres & 0x80000000) != 0 )
1176 for ( i = 0; i < retres; i += 1 )
1178 if ( !sceSdHdGetProgramParamAddr(buffer, i, &p_programparam) )
1180 for ( j = 0; j < p_programparam->nSplit; j += 1 )
1182 if ( !sceSdHdGetSplitBlockAddr(buffer, i, j, &p_splitblock) )
1184 curval1 = sceSdHdGetSampleSetParamCountByNote(buffer, i, p_splitblock->splitRangeLow & 0x7F);
1185 curminval = (curminval < curval1) ? curval1 : curminval;
1186 curval2 = sceSdHdGetSampleSetParamCountByNote(buffer, i, p_splitblock->splitRangeHigh & 0x7F);
1187 curminval = (curminval < curval2) ? curval2 : curminval;
1195int sceSdHdGetMaxSampleParamCount(
void *buffer)
1198 unsigned int retres;
1212 retres = (
unsigned int)sceSdHdGetMaxProgramNumber(buffer);
1213 if ( (retres & 0x80000000) != 0 )
1215 for ( i = 0; i < retres; i += 1 )
1217 if ( !sceSdHdGetProgramParamAddr(buffer, i, &p_programparam) )
1219 for ( j = 0; j < p_programparam->nSplit; j += 1 )
1222 !sceSdHdGetSplitBlockAddr(buffer, i, j, &p_splitblock)
1223 && !sceSdHdGetSampleSetParamAddr(buffer, p_splitblock->sampleSetIndex, &p_samplesetparam) )
1225 for ( k = 0; k < p_samplesetparam->nSample; k += 1 )
1227 if ( !sceSdHdGetSampleParamAddr(
1229 (
unsigned int)sceSdHdGetSampleNumberBySampleIndex(buffer, p_splitblock->sampleSetIndex, k),
1232 curval1 = sceSdHdGetSampleParamCountByNoteVelocity(
1233 buffer, i, p_splitblock->splitRangeLow & 0x7F, p_sampleparam->velRangeLow & 0x7F, 1u);
1234 curminval = (curminval < curval1) ? curval1 : curminval;
1235 curval2 = sceSdHdGetSampleParamCountByNoteVelocity(
1236 buffer, i, p_splitblock->splitRangeLow & 0x7F, p_sampleparam->velRangeHigh & 0x7F, 1u);
1237 curminval = (curminval < curval2) ? curval2 : curminval;
1238 curval3 = sceSdHdGetSampleParamCountByNoteVelocity(
1239 buffer, i, p_splitblock->splitRangeHigh & 0x7F, p_sampleparam->velRangeLow & 0x7F, 1u);
1240 curminval = (curminval < curval3) ? curval3 : curminval;
1241 curval4 = sceSdHdGetSampleParamCountByNoteVelocity(
1242 buffer, i, p_splitblock->splitRangeHigh & 0x7F, p_sampleparam->velRangeHigh & 0x7F, 1u);
1243 curminval = (curminval < curval4) ? curval4 : curminval;
1253int sceSdHdGetMaxVAGInfoParamCount(
void *buffer)
1256 unsigned int retres;
1270 retres = (
unsigned int)sceSdHdGetMaxProgramNumber(buffer);
1271 if ( (retres & 0x80000000) != 0 )
1273 for ( i = 0; i < retres; i += 1 )
1275 if ( !sceSdHdGetProgramParamAddr(buffer, i, &p_programparam) )
1277 for ( j = 0; j < p_programparam->nSplit; j += 1 )
1280 !sceSdHdGetSplitBlockAddr(buffer, i, j, &p_splitblock)
1281 && !sceSdHdGetSampleSetParamAddr(buffer, p_splitblock->sampleSetIndex, &p_samplesetparam) )
1283 for ( k = 0; k < p_samplesetparam->nSample; k += 1 )
1285 if ( !sceSdHdGetSampleParamAddr(
1287 (
unsigned int)sceSdHdGetSampleNumberBySampleIndex(buffer, p_splitblock->sampleSetIndex, k),
1290 curval1 = sceSdHdGetVAGInfoParamCountByNoteVelocity(
1291 buffer, i, p_splitblock->splitRangeLow & 0x7F, p_sampleparam->velRangeLow & 0x7F, 1u);
1292 curminval = (curminval < curval1) ? curval1 : curminval;
1293 curval2 = sceSdHdGetVAGInfoParamCountByNoteVelocity(
1294 buffer, i, p_splitblock->splitRangeLow & 0x7F, p_sampleparam->velRangeHigh & 0x7F, 1u);
1295 curminval = (curminval < curval2) ? curval2 : curminval;
1296 curval3 = sceSdHdGetVAGInfoParamCountByNoteVelocity(
1297 buffer, i, p_splitblock->splitRangeHigh & 0x7F, p_sampleparam->velRangeLow & 0x7F, 1u);
1298 curminval = (curminval < curval3) ? curval3 : curminval;
1299 curval4 = sceSdHdGetVAGInfoParamCountByNoteVelocity(
1300 buffer, i, p_splitblock->splitRangeHigh & 0x7F, p_sampleparam->velRangeHigh & 0x7F, 1u);
1301 curminval = (curminval < curval4) ? curval4 : curminval;
1311int sceSdHdModifyVelocity(
unsigned int curveType,
int velocity)
1313 switch ( curveType )
1316 return 128 - velocity;
1318 velocity = velocity * velocity / 0x7F;
1319 return velocity ? velocity : 1;
1321 velocity = velocity * velocity / 0x7F;
1322 velocity = velocity ? velocity : 1;
1323 return 128 - velocity;
1325 velocity = (128 - velocity) * (128 - velocity);
1326 velocity = (velocity / 0x7F) & 0x3FFFFFF;
1327 velocity = velocity ? velocity : 1;
1328 return 128 - velocity;
1330 velocity = 128 - velocity;
1331 velocity = velocity * velocity / 0x7F;
1332 return velocity ? velocity : 1;
1338int sceSdHdModifyVelocityLFO(
unsigned int curveType,
int velocity,
int center)
1343 center = (center >= 0) ? ((center >= 128) ? 127 : center) : 0;
1344 velocity = (velocity >= 0) ? ((velocity >= 128) ? 127 : velocity) : 0;
1346 switch ( curveType )
1350 calc5 = (velocity - center) << 16;
1351 calc5 = (calc5 / 126) - (
int)((
unsigned int)calc5 >> 31);
1354 calc5 = (center - velocity) << 16;
1355 calc5 = (calc5 / 126) - (
int)((
unsigned int)calc5 >> 31);
1358 calc5 = ((velocity - 1) << 15) / 126 * (((velocity - 1) << 15) / 126)
1359 - ((center - 1) << 15) / 126 * (((center - 1) << 15) / 126);
1360 calc5 = (calc5 < 0) ? ((calc5 + 0x3FFF) >> 14) : (calc5 >> 14);
1363 calc5 = ((velocity - 1) << 15) / 126 * (((velocity - 1) << 15) / 126) / -16384
1364 - ((center - 1) << 15) / 126 * (((center - 1) << 15) / 126) / -16384;
1367 calc5 = (0x10000 - ((center - 1) << 15) / 126) * (0x10000 - ((center - 1) << 15) / 126) / 0x4000
1368 - (0x10000 - ((velocity - 1) << 15) / 126) * (0x10000 - ((velocity - 1) << 15) / 126) / 0x4000;
1371 calc5 = (0x10000 - ((velocity - 1) << 15) / 126) * (0x10000 - ((velocity - 1) << 15) / 126) / 0x4000
1372 - (0x10000 - ((center - 1) << 15) / 126) * (0x10000 - ((center - 1) << 15) / 126) / 0x4000;
1375 if ( velocity == center )
1377 calc5 = (center >= velocity) ? (center - 1) : (127 - center);
1378 calcb = (velocity - center) << 16;
1381 if ( calc5 == -1 && (
unsigned int)calcb == 0x80000000 )
1383 calc5 = calcb / calc5;
1386 if ( velocity == center )
1388 calc5 = (center >= velocity) ? (center - 1) : (127 - center);
1389 calcb = (center - velocity) << 16;
1392 if ( calc5 == -1 && (
unsigned int)calcb == 0x80000000 )
1394 calc5 = calcb / calc5;
1397 if ( velocity == center )
1399 calcb = (velocity - center) << 15;
1400 if ( center >= velocity )
1404 if ( !center && (
unsigned int)calcb == 0x80000000 )
1406 calc5 = calcb / (center - 1) * (calcb / (center - 1)) / -16384;
1410 calc5 = 127 - center;
1411 if ( 127 == center )
1413 if ( calc5 == -1 && (
unsigned int)calcb == 0x80000000 )
1415 calc5 = calcb / calc5 * (calcb / calc5);
1416 calc5 = (calc5 < 0) ? ((calc5 + 0x3FFF) >> 14) : (calc5 >> 14);
1420 if ( velocity == center )
1422 calcb = (velocity - center) << 15;
1423 if ( center >= velocity )
1427 if ( !center && (
unsigned int)calcb == 0x80000000 )
1429 calc5 = (calcb / (center - 1) + 0x8000) * (calcb / (center - 1) + 0x8000) / 0x4000 - 0x10000;
1433 calc5 = 127 - center;
1434 if ( 127 == center )
1436 if ( calc5 == -1 && (
unsigned int)calcb == 0x80000000 )
1438 calc5 = (0x8000 - calcb / calc5) * (0x8000 - calcb / calc5);
1439 calc5 = 0x10000 - ((calc5 < 0) ? ((calc5 + 0x3FFF) >> 14) : (calc5 >> 14));
1443 return (calc5 < -65536) ? -65536 : ((calc5 > 0xFFFF) ? 0xFFFF : calc5);
1446int sceSdHdGetValidProgramNumberCount(
void *buffer)
1457 result = (int)do_get_prog_chunk(buffer, &dinfo);
1460 for ( i = 0; dinfo.m_prog->maxProgramNumber >= i; i += 1 )
1462 if ( dinfo.m_prog->programOffsetAddr[i] != 0xFFFFFFFF )
1468int sceSdHdGetValidProgramNumber(
void *buffer,
unsigned int *ptr)
1479 result = (int)do_get_prog_chunk(buffer, &dinfo);
1482 for ( i = 0; dinfo.m_prog->maxProgramNumber >= i; i += 1 )
1484 if ( dinfo.m_prog->programOffsetAddr[i] != 0xFFFFFFFF )
1493int sceSdHdGetSampleNumberBySampleIndex(
void *buffer,
unsigned int sampleSetNumber,
unsigned int sampleIndexNumber)
1498 result = sceSdHdGetSampleSetParamAddr(buffer, sampleSetNumber, &p_samplesetparam);
1501 return ((
unsigned int)p_samplesetparam->nSample - 1 < sampleIndexNumber) ?
1503 p_samplesetparam->sampleIndex[sampleIndexNumber];
1507int _start(
int ac,
char *av[],
void *startaddr,
ModuleInfo_t *mi)
1517 regres = ReleaseLibraryEntries(&_exp_sdhd);
1519 return (!regres) ? MODULE_NO_RESIDENT_END : MODULE_REMOVABLE_END;
1522 regres = RegisterLibraryEntries(&_exp_sdhd);
1525 return MODULE_NO_RESIDENT_END;
1527 return MODULE_REMOVABLE_END;
1529 if ( mi && ((mi->
newflags & 2) != 0) )
1531 return MODULE_RESIDENT_END;
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)