/[svn]/libgig/trunk/src/gig.cpp
ViewVC logotype

Diff of /libgig/trunk/src/gig.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3324 by schoenebeck, Fri Jul 21 13:05:39 2017 UTC revision 3350 by schoenebeck, Tue Oct 3 17:35:02 2017 UTC
# Line 1736  namespace { Line 1736  namespace {
1736          // Gigasampler/GigaStudio !          // Gigasampler/GigaStudio !
1737          RIFF::Chunk* lsde = _3ewl->GetSubChunk(CHUNK_ID_LSDE);          RIFF::Chunk* lsde = _3ewl->GetSubChunk(CHUNK_ID_LSDE);
1738          if (lsde) {          if (lsde) {
1739              unsigned char byte = lsde->ReadUint8();              eg_opt_t* pEGOpts[2] = { &EG1Options, &EG2Options };
1740              EGOptions.AttackCancel     = byte & 1;              for (int i = 0; i < 2; ++i) {
1741              EGOptions.AttackHoldCancel = byte & (1 << 1);                  unsigned char byte = lsde->ReadUint8();
1742              EGOptions.Decay1Cancel     = byte & (1 << 2);                  pEGOpts[i]->AttackCancel     = byte & 1;
1743              EGOptions.Decay2Cancel     = byte & (1 << 3);                  pEGOpts[i]->AttackHoldCancel = byte & (1 << 1);
1744              EGOptions.ReleaseCancel    = byte & (1 << 4);                  pEGOpts[i]->Decay1Cancel     = byte & (1 << 2);
1745                    pEGOpts[i]->Decay2Cancel     = byte & (1 << 3);
1746                    pEGOpts[i]->ReleaseCancel    = byte & (1 << 4);
1747                }
1748          }          }
1749    
1750          pVelocityAttenuationTable = GetVelocityTable(VelocityResponseCurve,          pVelocityAttenuationTable = GetVelocityTable(VelocityResponseCurve,
# Line 1931  namespace { Line 1934  namespace {
1934          SRLZ(MSDecode);          SRLZ(MSDecode);
1935          //SRLZ(SampleStartOffset);          //SRLZ(SampleStartOffset);
1936          SRLZ(SampleAttenuation);          SRLZ(SampleAttenuation);
1937          SRLZ(EGOptions);          SRLZ(EG1Options);
1938            SRLZ(EG2Options);
1939    
1940          // derived attributes from DLS::Sampler          // derived attributes from DLS::Sampler
1941          SRLZ(FineTune);          SRLZ(FineTune);
# Line 2246  namespace { Line 2250  namespace {
2250              // only add this "LSDE" chunk if the EG options do not match the              // only add this "LSDE" chunk if the EG options do not match the
2251              // default EG behavior              // default EG behavior
2252              eg_opt_t defaultOpt;              eg_opt_t defaultOpt;
2253              if (memcmp(&EGOptions, &defaultOpt, sizeof(eg_opt_t))) {              if (memcmp(&EG1Options, &defaultOpt, sizeof(eg_opt_t)) ||
2254                  lsde = pParentList->AddSubChunk(CHUNK_ID_LSDE, 1);                  memcmp(&EG2Options, &defaultOpt, sizeof(eg_opt_t)))
2255                {
2256                    lsde = pParentList->AddSubChunk(CHUNK_ID_LSDE, 2);
2257                  // move LSDE chunk to the end of parent list                  // move LSDE chunk to the end of parent list
2258                  pParentList->MoveSubChunk(lsde, (RIFF::Chunk*)NULL);                  pParentList->MoveSubChunk(lsde, (RIFF::Chunk*)NULL);
2259              }              }
2260          }          }
2261          if (lsde) {          if (lsde) {
2262              unsigned char* pByte = (unsigned char*) lsde->LoadChunkData();              unsigned char* pData = (unsigned char*) lsde->LoadChunkData();
2263              *pByte =              eg_opt_t* pEGOpts[2] = { &EG1Options, &EG2Options };
2264                  (EGOptions.AttackCancel     ? 1 : 0) |              for (int i = 0; i < 2; ++i) {
2265                  (EGOptions.AttackHoldCancel ? (1<<1) : 0) |                  pData[i] =
2266                  (EGOptions.Decay1Cancel     ? (1<<2) : 0) |                      (pEGOpts[i]->AttackCancel     ? 1 : 0) |
2267                  (EGOptions.Decay2Cancel     ? (1<<3) : 0) |                      (pEGOpts[i]->AttackHoldCancel ? (1<<1) : 0) |
2268                  (EGOptions.ReleaseCancel    ? (1<<4) : 0);                      (pEGOpts[i]->Decay1Cancel     ? (1<<2) : 0) |
2269                        (pEGOpts[i]->Decay2Cancel     ? (1<<3) : 0) |
2270                        (pEGOpts[i]->ReleaseCancel    ? (1<<4) : 0);
2271                }
2272          }          }
2273      }      }
2274    
# Line 2300  namespace { Line 2309  namespace {
2309      // get the corresponding velocity table from the table map or create & calculate that table if it doesn't exist yet      // get the corresponding velocity table from the table map or create & calculate that table if it doesn't exist yet
2310      double* DimensionRegion::GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling)      double* DimensionRegion::GetVelocityTable(curve_type_t curveType, uint8_t depth, uint8_t scaling)
2311      {      {
2312            // sanity check input parameters
2313            // (fallback to some default parameters on ill input)
2314            switch (curveType) {
2315                case curve_type_nonlinear:
2316                case curve_type_linear:
2317                    if (depth > 4) {
2318                        printf("Warning: Invalid depth (0x%x) for velocity curve type (0x%x).\n", depth, curveType);
2319                        depth   = 0;
2320                        scaling = 0;
2321                    }
2322                    break;
2323                case curve_type_special:
2324                    if (depth > 5) {
2325                        printf("Warning: Invalid depth (0x%x) for velocity curve type 'special'.\n", depth);
2326                        depth   = 0;
2327                        scaling = 0;
2328                    }
2329                    break;
2330                case curve_type_unknown:
2331                default:
2332                    printf("Warning: Unknown velocity curve type (0x%x).\n", curveType);
2333                    curveType = curve_type_linear;
2334                    depth     = 0;
2335                    scaling   = 0;
2336                    break;
2337            }
2338    
2339          double* table;          double* table;
2340          uint32_t tableKey = (curveType<<16) | (depth<<8) | scaling;          uint32_t tableKey = (curveType<<16) | (depth<<8) | scaling;
2341          if (pVelocityTables->count(tableKey)) { // if key exists          if (pVelocityTables->count(tableKey)) { // if key exists
# Line 3225  namespace { Line 3261  namespace {
3261              if (file->GetAutoLoad()) {              if (file->GetAutoLoad()) {
3262                  for (uint i = 0; i < DimensionRegions; i++) {                  for (uint i = 0; i < DimensionRegions; i++) {
3263                      uint32_t wavepoolindex = _3lnk->ReadUint32();                      uint32_t wavepoolindex = _3lnk->ReadUint32();
3264                      if (file->pWavePoolTable) pDimensionRegions[i]->pSample = GetSampleFromWavePool(wavepoolindex);                      if (file->pWavePoolTable && pDimensionRegions[i])
3265                            pDimensionRegions[i]->pSample = GetSampleFromWavePool(wavepoolindex);
3266                  }                  }
3267                  GetSample(); // load global region sample reference                  GetSample(); // load global region sample reference
3268              }              }
# Line 4106  namespace { Line 4143  namespace {
4143          if ((int32_t)WavePoolTableIndex == -1) return NULL;          if ((int32_t)WavePoolTableIndex == -1) return NULL;
4144          File* file = (File*) GetParent()->GetParent();          File* file = (File*) GetParent()->GetParent();
4145          if (!file->pWavePoolTable) return NULL;          if (!file->pWavePoolTable) return NULL;
4146            if (WavePoolTableIndex + 1 > file->WavePoolCount) return NULL;
4147          // for new files or files >= 2 GB use 64 bit wave pool offsets          // for new files or files >= 2 GB use 64 bit wave pool offsets
4148          if (file->pRIFF->IsNew() || (file->pRIFF->GetCurrentFileSize() >> 31)) {          if (file->pRIFF->IsNew() || (file->pRIFF->GetCurrentFileSize() >> 31)) {
4149              // use 64 bit wave pool offsets (treating this as large file)              // use 64 bit wave pool offsets (treating this as large file)
# Line 4732  namespace { Line 4770  namespace {
4770          RegionList::iterator end  = pRegions->end();          RegionList::iterator end  = pRegions->end();
4771          for (; iter != end; ++iter) {          for (; iter != end; ++iter) {
4772              gig::Region* pRegion = static_cast<gig::Region*>(*iter);              gig::Region* pRegion = static_cast<gig::Region*>(*iter);
4773              for (int iKey = pRegion->KeyRange.low; iKey <= pRegion->KeyRange.high; iKey++) {              const int low  = std::max(int(pRegion->KeyRange.low), 0);
4774                const int high = std::min(int(pRegion->KeyRange.high), 127);
4775                for (int iKey = low; iKey <= high; iKey++) {
4776                  RegionKeyTable[iKey] = pRegion;                  RegionKeyTable[iKey] = pRegion;
4777              }              }
4778          }          }

Legend:
Removed from v.3324  
changed lines
  Added in v.3350

  ViewVC Help
Powered by ViewVC