/[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 1264 by persson, Sun Jul 29 10:51:09 2007 UTC revision 1266 by persson, Thu Aug 2 14:12:55 2007 UTC
# Line 1617  namespace { Line 1617  namespace {
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);
# Line 1627  namespace { Line 1627  namespace {
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);
# Line 1805  namespace { Line 1805  namespace {
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    
# Line 2312  namespace { Line 2312  namespace {
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?
# Line 2334  namespace { Line 2334  namespace {
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          }          }
# Line 2818  namespace { Line 2817  namespace {
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;
# Line 2929  namespace { Line 2928  namespace {
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      }      }
# Line 3118  namespace { Line 3128  namespace {
3128          if (SamplesIterator != pSamples->end() && *SamplesIterator == pSample) ++SamplesIterator; // avoid iterator invalidation          if (SamplesIterator != pSamples->end() && *SamplesIterator == pSample) ++SamplesIterator; // avoid iterator invalidation
3129          pSamples->erase(iter);          pSamples->erase(iter);
3130          delete pSample;          delete pSample;
3131    
3132            // remove all references to the sample
3133            for (Instrument* instrument = GetFirstInstrument() ; instrument ;
3134                 instrument = GetNextInstrument()) {
3135                for (Region* region = instrument->GetFirstRegion() ; region ;
3136                     region = instrument->GetNextRegion()) {
3137    
3138                    if (region->GetSample() == pSample) region->SetSample(NULL);
3139    
3140                    for (int i = 0 ; i < region->DimensionRegions ; i++) {
3141                        gig::DimensionRegion *d = region->pDimensionRegions[i];
3142                        if (d->pSample == pSample) d->pSample = NULL;
3143                    }
3144                }
3145            }
3146      }      }
3147    
3148      void File::LoadSamples() {      void File::LoadSamples() {
# Line 3422  namespace { Line 3447  namespace {
3447                  RIFF::Chunk* ck = lst3gnl->GetFirstSubChunk();                  RIFF::Chunk* ck = lst3gnl->GetFirstSubChunk();
3448                  while (ck) {                  while (ck) {
3449                      if (ck->GetChunkID() == CHUNK_ID_3GNM) {                      if (ck->GetChunkID() == CHUNK_ID_3GNM) {
3450                            if (pVersion && pVersion->major == 3 &&
3451                                strcmp(static_cast<char*>(ck->LoadChunkData()), "") == 0) break;
3452    
3453                          pGroups->push_back(new Group(this, ck));                          pGroups->push_back(new Group(this, ck));
3454                      }                      }
3455                      ck = lst3gnl->GetNextSubChunk();                      ck = lst3gnl->GetNextSubChunk();
# Line 3471  namespace { Line 3499  namespace {
3499              for (; iter != end; ++iter) {              for (; iter != end; ++iter) {
3500                  (*iter)->UpdateChunks();                  (*iter)->UpdateChunks();
3501              }              }
3502    
3503                // v3: make sure the file has 128 3gnm chunks
3504                if (pVersion && pVersion->major == 3) {
3505                    RIFF::List* _3gnl = pRIFF->GetSubList(LIST_TYPE_3GRI)->GetSubList(LIST_TYPE_3GNL);
3506                    RIFF::Chunk* _3gnm = _3gnl->GetFirstSubChunk();
3507                    for (int i = 0 ; i < 128 ; i++) {
3508                        if (i >= pGroups->size()) ::SaveString(CHUNK_ID_3GNM, _3gnm, _3gnl, "", "", true, 64);
3509                        if (_3gnm) _3gnm = _3gnl->GetNextSubChunk();
3510                    }
3511                }
3512          }          }
3513    
3514          // update einf chunk          // update einf chunk

Legend:
Removed from v.1264  
changed lines
  Added in v.1266

  ViewVC Help
Powered by ViewVC