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;
54} sceHardSynthHeaderChunk;
60 unsigned int chunkSize;
61 unsigned int maxProgramNumber;
62 unsigned int programOffsetAddr[];
63} sceHardSynthProgramChunk;
69 unsigned int chunkSize;
70 unsigned int maxSampleSetNumber;
71 unsigned int sampleSetOffsetAddr[];
72} sceHardSynthSampleSetChunk;
78 unsigned int chunkSize;
79 unsigned int maxSampleNumber;
80 unsigned int sampleOffsetAddr[];
81} sceHardSynthSampleChunk;
87 unsigned int chunkSize;
88 unsigned int maxVagInfoNumber;
89 unsigned int vagInfoOffsetAddr[];
94 sceHardSynthVersionChunk *m_vers;
95 sceHardSynthHeaderChunk *m_head;
96 sceHardSynthProgramChunk *m_prog;
97 sceHardSynthSampleSetChunk *m_sset;
98 sceHardSynthSampleChunk *m_smpl;
106static unsigned int do_get_vers_head_chunk(sceHardSynthVersionChunk *indata,
struct sdhd_info *dinfo)
114 dinfo->m_vers = indata;
115 if ( indata->Creator != 0x53434549 || indata->Type != 0x56657273 )
120 if ( (indata->chunkSize & 0x80000000) )
125 dinfo->m_head = (sceHardSynthHeaderChunk *)((
char *)indata + indata->chunkSize);
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) )
141 dinfo->m_prog = (sceHardSynthProgramChunk *)((
char *)indata + dinfo->m_head->programChunkAddr);
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) )
156 dinfo->m_sset = (sceHardSynthSampleSetChunk *)((
char *)indata + dinfo->m_head->sampleSetChunkAddr);
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) )
171 dinfo->m_smpl = (sceHardSynthSampleChunk *)((
char *)indata + dinfo->m_head->sampleChunkAddr);
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 )
195static void do_copy_to_sdhd_program_param(SceSdHdProgramParam *dst,
const sceHardSynthProgramParam *src)
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;
223static void do_copy_to_sdhd_split_block(SceSdHdSplitBlock *dst,
const sceHardSynthSplitBlock *src)
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;
244static void do_copy_to_sdhd_set_param(SceSdHdSampleSetParam *dst,
const sceHardSynthSampleSetParam *src)
246 dst->velCurve = src->velCurve;
247 dst->velLimitLow = src->velLimitLow;
248 dst->velLimitHigh = src->velLimitHigh;
249 dst->nSample = src->nSample;
252static void do_copy_to_sdhd_sample_param(SceSdHdSampleParam *dst,
const sceHardSynthSampleParam *src)
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;
290static void do_copy_to_sdhd_vag_info_param(SceSdHdVAGInfoParam *dst,
unsigned int sz,
const sceHardSynthVagParam *src)
292 dst->vagOffsetAddr = src->vagOffsetAddr;
293 dst->vagSampleRate = src->vagSampleRate;
295 dst->vagAttribute = src->vagAttribute;
298static unsigned int do_get_vag_size(sceHardSynthVersionChunk *indata,
const unsigned int *vagoffsaddr)
301 unsigned int bodySize;
302 const sceHardSynthVagParam *vagparam;
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,
384 sceHardSynthSplitBlock *p_splitblock;
386 sceHardSynthProgramParam *p_programparam;
387 sceHardSynthSampleSetParam *p_samplesetparam;
388 sceHardSynthSampleParam *p_sampleparam;
389 sceHardSynthVagParam *p_vagparam;
393 sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam) || p_programparam->splitBlockAddr == 0xFFFFFFFF )
397 for ( i = 0; i < p_programparam->nSplit; i += 1 )
399 p_splitblock = (sceHardSynthSplitBlock *)((
char *)p_programparam + p_programparam->splitBlockAddr
400 + p_programparam->sizeSplitBlock * i);
401 if ( noteNumber < (p_splitblock->splitRangeLow & 0x7Fu) || noteNumber > (p_splitblock->splitRangeHigh & 0x7Fu) )
413 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
417 do_copy_to_sdhd_split_block((SceSdHdSplitBlock *)ptr, p_splitblock);
418 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdSplitBlock));
422 p_splitblock->sampleSetIndex == 0xFFFF
423 || sceSdHdGetSampleSetParamAddr(buffer, p_splitblock->sampleSetIndex, &p_samplesetparam) )
434 *ptr = p_samplesetparam;
435 ptr = (
void **)(((
char *)ptr) +
sizeof(
void *));
439 do_copy_to_sdhd_set_param((SceSdHdSampleSetParam *)ptr, p_samplesetparam);
440 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdSampleSetParam));
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 *));
470 do_copy_to_sdhd_sample_param((SceSdHdSampleParam *)ptr, p_sampleparam);
471 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdSampleParam));
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(
493 (SceSdHdVAGInfoParam *)ptr,
494 do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr),
496 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdVAGInfoParam));
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 *));
527 do_copy_to_sdhd_sample_param((SceSdHdSampleParam *)ptr, p_sampleparam);
528 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdSampleParam));
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(
550 (SceSdHdVAGInfoParam *)ptr,
551 do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr),
553 ptr = (
void **)(((
char *)ptr) +
sizeof(SceSdHdVAGInfoParam));
574static int do_get_common_block_ptr(
576 unsigned int sampleSetNumber,
578 unsigned int velocity,
584 sceHardSynthSampleSetParam *p_samplesetparam;
585 sceHardSynthSampleParam *p_sampleparam;
586 sceHardSynthVagParam *p_vagparam;
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 *));
615 do_copy_to_sdhd_sample_param((SceSdHdSampleParam *)param, p_sampleparam);
616 param = (
void **)(((
char *)param) +
sizeof(SceSdHdSampleParam));
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(
638 (SceSdHdVAGInfoParam *)param,
639 do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr),
641 param = (
void **)(((
char *)param) +
sizeof(SceSdHdVAGInfoParam));
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 *));
670 do_copy_to_sdhd_sample_param((SceSdHdSampleParam *)param, p_sampleparam);
671 param = (
void **)(((
char *)param) +
sizeof(SceSdHdSampleParam));
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(
691 (SceSdHdVAGInfoParam *)param,
692 do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr),
694 param = (
void **)(((
char *)param) +
sizeof(SceSdHdVAGInfoParam));
709int sceSdHdGetMaxProgramNumber(
void *buffer)
714 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
717 result = (int)do_get_prog_chunk(buffer, &dinfo);
720 return (
int)dinfo.m_prog->maxProgramNumber;
723int sceSdHdGetMaxSampleSetNumber(
void *buffer)
728 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
731 result = (int)do_get_sset_chunk(buffer, &dinfo);
734 return (
int)dinfo.m_sset->maxSampleSetNumber;
737int sceSdHdGetMaxSampleNumber(
void *buffer)
742 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
745 result = (int)do_get_smpl_chunk(buffer, &dinfo);
748 return (
int)dinfo.m_smpl->maxSampleNumber;
751int sceSdHdGetMaxVAGInfoNumber(
void *buffer)
756 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
759 result = (int)do_get_vagi_chunk(buffer, &dinfo);
762 return (
int)dinfo.m_vagi->maxVagInfoNumber;
765int sceSdHdGetProgramParamAddr(
void *buffer,
unsigned int programNumber, sceHardSynthProgramParam **ptr)
770 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
773 result = (int)do_get_prog_chunk(buffer, &dinfo);
776 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x50726F67u, programNumber);
779 *ptr = (sceHardSynthProgramParam *)((
char *)dinfo.m_prog + dinfo.m_prog->programOffsetAddr[programNumber]);
783int sceSdHdGetProgramParam(
void *buffer,
unsigned int programNumber, SceSdHdProgramParam *param)
786 sceHardSynthProgramParam *p_programparam;
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)
799 sceHardSynthProgramParam *p_programparam;
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;
808 *theParamPtr = (sceHardSynthSplitBlock *)((
char *)p_programparam + p_programparam->splitBlockAddr
809 + p_programparam->sizeSplitBlock * splitBlockNumber);
813int sceSdHdGetSplitBlock(
814 void *buffer,
unsigned int programNumber,
unsigned int splitBlockNumber, SceSdHdSplitBlock *param)
817 sceHardSynthSplitBlock *p_splitblock;
819 result = sceSdHdGetSplitBlockAddr(buffer, programNumber, splitBlockNumber, &p_splitblock);
822 do_copy_to_sdhd_split_block(param, p_splitblock);
826int sceSdHdGetSampleSetParamAddr(
void *buffer,
unsigned int sampleSetNumber, sceHardSynthSampleSetParam **ptr)
831 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
834 result = (int)do_get_sset_chunk(buffer, &dinfo);
837 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x53736574, sampleSetNumber);
840 *ptr = (sceHardSynthSampleSetParam *)((
char *)dinfo.m_sset + dinfo.m_sset->sampleSetOffsetAddr[sampleSetNumber]);
844int sceSdHdGetSampleSetParam(
void *buffer,
unsigned int sampleSetNumber, SceSdHdSampleSetParam *param)
847 sceHardSynthSampleSetParam *p_samplesetparam;
849 result = sceSdHdGetSampleSetParamAddr(buffer, sampleSetNumber, &p_samplesetparam);
852 do_copy_to_sdhd_set_param(param, p_samplesetparam);
856int sceSdHdGetSampleParamAddr(
void *buffer,
unsigned int sampleNumber, sceHardSynthSampleParam **ptr)
861 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
864 result = (int)do_get_smpl_chunk(buffer, &dinfo);
867 result = (int)do_check_chunk_in_bounds(buffer, &dinfo, 0x536D706C, sampleNumber);
870 *ptr = (sceHardSynthSampleParam *)((
char *)dinfo.m_smpl + dinfo.m_smpl->sampleOffsetAddr[sampleNumber]);
874int sceSdHdGetSampleParam(
void *buffer,
unsigned int sampleNumber, SceSdHdSampleParam *param)
877 sceHardSynthSampleParam *p_sampleparam;
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)
891 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
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)
907 sceHardSynthVagParam *p_vagparam;
909 result = sceSdHdGetVAGInfoParamAddr(buffer, vagInfoNumber, &p_vagparam);
912 do_copy_to_sdhd_vag_info_param(
913 param, do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr), p_vagparam);
917int sceSdHdCheckProgramNumber(
void *buffer,
unsigned int programNumber)
922 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
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(
937 void *buffer,
unsigned int programNumber,
unsigned int noteNumber, sceHardSynthSplitBlock **ptr)
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(
954 void *buffer,
unsigned int programNumber,
unsigned int noteNumber, sceHardSynthSampleSetParam **ptr)
956 return do_get_common_block_ptr_note(buffer, programNumber, 4, noteNumber, 0, 0, (
void **)ptr);
959int sceSdHdGetSampleSetParamByNote(
960 void *buffer,
unsigned int programNumber,
unsigned int noteNumber, SceSdHdSampleSetParam *param)
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,
977 sceHardSynthSampleParam **ptr)
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,
988 SceSdHdSampleParam *param)
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,
1005 sceHardSynthVagParam **ptr)
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,
1016 SceSdHdVAGInfoParam *param)
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)
1060 sceHardSynthSampleParam *p_sampleparam;
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)
1073 sceHardSynthVagParam *p_vagparam;
1075 result = sceSdHdGetVAGInfoParamAddrBySampleNumber(buffer, sampleNumber, &p_vagparam);
1078 do_copy_to_sdhd_vag_info_param(
1079 param, do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr), p_vagparam);
1083int sceSdHdGetSplitBlockNumberBySplitNumber(
void *buffer,
unsigned int programNumber,
unsigned int splitNumber)
1087 sceHardSynthSplitBlock *splitblock;
1088 sceHardSynthProgramParam *p_programparam;
1090 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
1093 if ( p_programparam->splitBlockAddr == 0xFFFFFFFF )
1094 return (
int)0x81039009;
1095 splitblock = (sceHardSynthSplitBlock *)((
char *)p_programparam + p_programparam->splitBlockAddr);
1096 for ( i = 0; i < p_programparam->nSplit; i += 1 )
1098 if ( splitNumber == splitblock->splitNumber )
1100 splitblock = (sceHardSynthSplitBlock *)((
char *)splitblock + p_programparam->sizeSplitBlock);
1102 return (
int)0x81039020;
1105int sceSdHdGetVAGSize(
void *buffer,
unsigned int vagInfoNumber)
1108 sceHardSynthVagParam *p_vagparam;
1110 result = sceSdHdGetVAGInfoParamAddr(buffer, vagInfoNumber, &p_vagparam);
1113 return (
int)do_get_vag_size((sceHardSynthVersionChunk *)buffer, &p_vagparam->vagOffsetAddr);
1116int sceSdHdGetSplitBlockCount(
void *buffer,
unsigned int programNumber)
1119 sceHardSynthProgramParam *p_programparam;
1121 result = sceSdHdGetProgramParamAddr(buffer, programNumber, &p_programparam);
1124 return p_programparam->nSplit;
1127int sceSdHdGetMaxSplitBlockCount(
void *buffer)
1130 unsigned int retres;
1135 sceHardSynthProgramParam *p_programparam;
1136 sceHardSynthSplitBlock *p_splitblock;
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;
1169 sceHardSynthProgramParam *p_programparam;
1170 sceHardSynthSplitBlock *p_splitblock;
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;
1206 sceHardSynthProgramParam *p_programparam;
1207 sceHardSynthSplitBlock *p_splitblock;
1208 sceHardSynthSampleSetParam *p_samplesetparam;
1209 sceHardSynthSampleParam *p_sampleparam;
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;
1264 sceHardSynthProgramParam *p_programparam;
1265 sceHardSynthSplitBlock *p_splitblock;
1266 sceHardSynthSampleSetParam *p_samplesetparam;
1267 sceHardSynthSampleParam *p_sampleparam;
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)
1454 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
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)
1476 result = (int)do_get_vers_head_chunk((sceHardSynthVersionChunk *)buffer, &dinfo);
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)
1496 sceHardSynthSampleSetParam *p_samplesetparam;
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)
struct _ModuleInfo ModuleInfo_t