1617 |
pData[44] = eg1ctl; |
pData[44] = eg1ctl; |
1618 |
|
|
1619 |
const uint8_t eg1ctrloptions = |
const uint8_t eg1ctrloptions = |
1620 |
(EG1ControllerInvert) ? 0x01 : 0x00 | |
(EG1ControllerInvert ? 0x01 : 0x00) | |
1621 |
GIG_EG_CTR_ATTACK_INFLUENCE_ENCODE(EG1ControllerAttackInfluence) | |
GIG_EG_CTR_ATTACK_INFLUENCE_ENCODE(EG1ControllerAttackInfluence) | |
1622 |
GIG_EG_CTR_DECAY_INFLUENCE_ENCODE(EG1ControllerDecayInfluence) | |
GIG_EG_CTR_DECAY_INFLUENCE_ENCODE(EG1ControllerDecayInfluence) | |
1623 |
GIG_EG_CTR_RELEASE_INFLUENCE_ENCODE(EG1ControllerReleaseInfluence); |
GIG_EG_CTR_RELEASE_INFLUENCE_ENCODE(EG1ControllerReleaseInfluence); |
1627 |
pData[46] = eg2ctl; |
pData[46] = eg2ctl; |
1628 |
|
|
1629 |
const uint8_t eg2ctrloptions = |
const uint8_t eg2ctrloptions = |
1630 |
(EG2ControllerInvert) ? 0x01 : 0x00 | |
(EG2ControllerInvert ? 0x01 : 0x00) | |
1631 |
GIG_EG_CTR_ATTACK_INFLUENCE_ENCODE(EG2ControllerAttackInfluence) | |
GIG_EG_CTR_ATTACK_INFLUENCE_ENCODE(EG2ControllerAttackInfluence) | |
1632 |
GIG_EG_CTR_DECAY_INFLUENCE_ENCODE(EG2ControllerDecayInfluence) | |
GIG_EG_CTR_DECAY_INFLUENCE_ENCODE(EG2ControllerDecayInfluence) | |
1633 |
GIG_EG_CTR_RELEASE_INFLUENCE_ENCODE(EG2ControllerReleaseInfluence); |
GIG_EG_CTR_RELEASE_INFLUENCE_ENCODE(EG2ControllerReleaseInfluence); |
1805 |
const uint8_t eg1hold = (EG1Hold) ? 0x80 : 0x00; // bit 7 |
const uint8_t eg1hold = (EG1Hold) ? 0x80 : 0x00; // bit 7 |
1806 |
pData[131] = eg1hold; |
pData[131] = eg1hold; |
1807 |
|
|
1808 |
const uint8_t vcfcutoff = (VCFEnabled) ? 0x80 : 0x00 | /* bit 7 */ |
const uint8_t vcfcutoff = (VCFEnabled ? 0x80 : 0x00) | /* bit 7 */ |
1809 |
(VCFCutoff & 0x7f); /* lower 7 bits */ |
(VCFCutoff & 0x7f); /* lower 7 bits */ |
1810 |
pData[132] = vcfcutoff; |
pData[132] = vcfcutoff; |
1811 |
|
|
1812 |
pData[133] = VCFCutoffController; |
pData[133] = VCFCutoffController; |
1813 |
|
|
1814 |
const uint8_t vcfvelscale = (VCFCutoffControllerInvert) ? 0x80 : 0x00 | /* bit 7 */ |
const uint8_t vcfvelscale = (VCFCutoffControllerInvert ? 0x80 : 0x00) | /* bit 7 */ |
1815 |
(VCFVelocityScale & 0x7f); /* lower 7 bits */ |
(VCFVelocityScale & 0x7f); /* lower 7 bits */ |
1816 |
pData[134] = vcfvelscale; |
pData[134] = vcfvelscale; |
1817 |
|
|
1818 |
// next byte unknown |
// next byte unknown |
1819 |
|
|
1820 |
const uint8_t vcfresonance = (VCFResonanceDynamic) ? 0x00 : 0x80 | /* bit 7 */ |
const uint8_t vcfresonance = (VCFResonanceDynamic ? 0x00 : 0x80) | /* bit 7 */ |
1821 |
(VCFResonance & 0x7f); /* lower 7 bits */ |
(VCFResonance & 0x7f); /* lower 7 bits */ |
1822 |
pData[136] = vcfresonance; |
pData[136] = vcfresonance; |
1823 |
|
|
1824 |
const uint8_t vcfbreakpoint = (VCFKeyboardTracking) ? 0x80 : 0x00 | /* bit 7 */ |
const uint8_t vcfbreakpoint = (VCFKeyboardTracking ? 0x80 : 0x00) | /* bit 7 */ |
1825 |
(VCFKeyboardTrackingBreakpoint & 0x7f); /* lower 7 bits */ |
(VCFKeyboardTrackingBreakpoint & 0x7f); /* lower 7 bits */ |
1826 |
pData[137] = vcfbreakpoint; |
pData[137] = vcfbreakpoint; |
1827 |
|
|
2312 |
for (int i = 0; i < iMaxDimensions; i++) { |
for (int i = 0; i < iMaxDimensions; i++) { |
2313 |
pData[4 + i * 8] = (uint8_t) pDimensionDefinitions[i].dimension; |
pData[4 + i * 8] = (uint8_t) pDimensionDefinitions[i].dimension; |
2314 |
pData[5 + i * 8] = pDimensionDefinitions[i].bits; |
pData[5 + i * 8] = pDimensionDefinitions[i].bits; |
2315 |
pData[6 + i * 8] = shift; |
pData[6 + i * 8] = pDimensionDefinitions[i].dimension == dimension_none ? 0 : shift; |
2316 |
pData[7 + i * 8] = (1 << (shift + pDimensionDefinitions[i].bits)) - (1 << shift); |
pData[7 + i * 8] = (1 << (shift + pDimensionDefinitions[i].bits)) - (1 << shift); |
2317 |
pData[8 + i * 8] = pDimensionDefinitions[i].zones; |
pData[8 + i * 8] = pDimensionDefinitions[i].zones; |
2318 |
// next 3 bytes unknown, always zero? |
// next 3 bytes unknown, always zero? |
2334 |
break; |
break; |
2335 |
} |
} |
2336 |
} |
} |
|
if (iWaveIndex < 0) throw gig::Exception("Could not update gig::Region, could not find DimensionRegion's sample"); |
|
2337 |
} |
} |
2338 |
store32(&pData[iWavePoolOffset + i * 4], iWaveIndex); |
store32(&pData[iWavePoolOffset + i * 4], iWaveIndex); |
2339 |
} |
} |
2817 |
store32(&pData[2], Attenuation); |
store32(&pData[2], Attenuation); |
2818 |
store16(&pData[6], FineTune); |
store16(&pData[6], FineTune); |
2819 |
store16(&pData[8], PitchbendRange); |
store16(&pData[8], PitchbendRange); |
2820 |
const uint8_t dimkeystart = (PianoReleaseMode) ? 0x01 : 0x00 | |
const uint8_t dimkeystart = (PianoReleaseMode ? 0x01 : 0x00) | |
2821 |
DimensionKeyRange.low << 1; |
DimensionKeyRange.low << 1; |
2822 |
pData[10] = dimkeystart; |
pData[10] = dimkeystart; |
2823 |
pData[11] = DimensionKeyRange.high; |
pData[11] = DimensionKeyRange.high; |
2928 |
} |
} |
2929 |
RIFF::List* _3gnl = _3gri->GetSubList(LIST_TYPE_3GNL); |
RIFF::List* _3gnl = _3gri->GetSubList(LIST_TYPE_3GNL); |
2930 |
if (!_3gnl) _3gnl = _3gri->AddSubList(LIST_TYPE_3GNL); |
if (!_3gnl) _3gnl = _3gri->AddSubList(LIST_TYPE_3GNL); |
2931 |
|
|
2932 |
|
if (!pNameChunk && pFile->pVersion && pFile->pVersion->major == 3) { |
2933 |
|
// v3 has a fixed list of 128 strings, find a free one |
2934 |
|
for (RIFF::Chunk* ck = _3gnl->GetFirstSubChunk() ; ck ; ck = _3gnl->GetNextSubChunk()) { |
2935 |
|
if (strcmp(static_cast<char*>(ck->LoadChunkData()), "") == 0) { |
2936 |
|
pNameChunk = ck; |
2937 |
|
break; |
2938 |
|
} |
2939 |
|
} |
2940 |
|
} |
2941 |
|
|
2942 |
// now store the name of this group as <3gnm> chunk as subchunk of the <3gnl> list chunk |
// now store the name of this group as <3gnm> chunk as subchunk of the <3gnl> list chunk |
2943 |
::SaveString(CHUNK_ID_3GNM, pNameChunk, _3gnl, Name, String("Unnamed Group"), true, 64); |
::SaveString(CHUNK_ID_3GNM, pNameChunk, _3gnl, Name, String("Unnamed Group"), true, 64); |
2944 |
} |
} |
3115 |
|
|
3116 |
/** @brief Delete a sample. |
/** @brief Delete a sample. |
3117 |
* |
* |
3118 |
* This will delete the given Sample object from the gig file. You have |
* This will delete the given Sample object from the gig file. Any |
3119 |
* to call Save() to make this persistent to the file. |
* references to this sample from Regions and DimensionRegions will be |
3120 |
|
* removed. You have to call Save() to make this persistent to the file. |
3121 |
* |
* |
3122 |
* @param pSample - sample to delete |
* @param pSample - sample to delete |
3123 |
* @throws gig::Exception if given sample could not be found |
* @throws gig::Exception if given sample could not be found |
3129 |
if (SamplesIterator != pSamples->end() && *SamplesIterator == pSample) ++SamplesIterator; // avoid iterator invalidation |
if (SamplesIterator != pSamples->end() && *SamplesIterator == pSample) ++SamplesIterator; // avoid iterator invalidation |
3130 |
pSamples->erase(iter); |
pSamples->erase(iter); |
3131 |
delete pSample; |
delete pSample; |
3132 |
|
|
3133 |
|
// remove all references to the sample |
3134 |
|
for (Instrument* instrument = GetFirstInstrument() ; instrument ; |
3135 |
|
instrument = GetNextInstrument()) { |
3136 |
|
for (Region* region = instrument->GetFirstRegion() ; region ; |
3137 |
|
region = instrument->GetNextRegion()) { |
3138 |
|
|
3139 |
|
if (region->GetSample() == pSample) region->SetSample(NULL); |
3140 |
|
|
3141 |
|
for (int i = 0 ; i < region->DimensionRegions ; i++) { |
3142 |
|
gig::DimensionRegion *d = region->pDimensionRegions[i]; |
3143 |
|
if (d->pSample == pSample) d->pSample = NULL; |
3144 |
|
} |
3145 |
|
} |
3146 |
|
} |
3147 |
} |
} |
3148 |
|
|
3149 |
void File::LoadSamples() { |
void File::LoadSamples() { |
3448 |
RIFF::Chunk* ck = lst3gnl->GetFirstSubChunk(); |
RIFF::Chunk* ck = lst3gnl->GetFirstSubChunk(); |
3449 |
while (ck) { |
while (ck) { |
3450 |
if (ck->GetChunkID() == CHUNK_ID_3GNM) { |
if (ck->GetChunkID() == CHUNK_ID_3GNM) { |
3451 |
|
if (pVersion && pVersion->major == 3 && |
3452 |
|
strcmp(static_cast<char*>(ck->LoadChunkData()), "") == 0) break; |
3453 |
|
|
3454 |
pGroups->push_back(new Group(this, ck)); |
pGroups->push_back(new Group(this, ck)); |
3455 |
} |
} |
3456 |
ck = lst3gnl->GetNextSubChunk(); |
ck = lst3gnl->GetNextSubChunk(); |
3500 |
for (; iter != end; ++iter) { |
for (; iter != end; ++iter) { |
3501 |
(*iter)->UpdateChunks(); |
(*iter)->UpdateChunks(); |
3502 |
} |
} |
3503 |
|
|
3504 |
|
// v3: make sure the file has 128 3gnm chunks |
3505 |
|
if (pVersion && pVersion->major == 3) { |
3506 |
|
RIFF::List* _3gnl = pRIFF->GetSubList(LIST_TYPE_3GRI)->GetSubList(LIST_TYPE_3GNL); |
3507 |
|
RIFF::Chunk* _3gnm = _3gnl->GetFirstSubChunk(); |
3508 |
|
for (int i = 0 ; i < 128 ; i++) { |
3509 |
|
if (i >= pGroups->size()) ::SaveString(CHUNK_ID_3GNM, _3gnm, _3gnl, "", "", true, 64); |
3510 |
|
if (_3gnm) _3gnm = _3gnl->GetNextSubChunk(); |
3511 |
|
} |
3512 |
|
} |
3513 |
} |
} |
3514 |
|
|
3515 |
// update einf chunk |
// update einf chunk |