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

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

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

revision 1301 by persson, Sat Aug 25 09:59:53 2007 UTC revision 1416 by schoenebeck, Sun Oct 14 12:06:32 2007 UTC
# Line 239  namespace DLS { Line 239  namespace DLS {
239       * @param list - pointer to a list chunk which contains an INFO list chunk       * @param list - pointer to a list chunk which contains an INFO list chunk
240       */       */
241      Info::Info(RIFF::List* list) {      Info::Info(RIFF::List* list) {
242          FixedStringLengths = NULL;          pFixedStringLengths = NULL;
243          pResourceListChunk = list;          pResourceListChunk = list;
244          if (list) {          if (list) {
245              RIFF::List* lstINFO = list->GetSubList(LIST_TYPE_INFO);              RIFF::List* lstINFO = list->GetSubList(LIST_TYPE_INFO);
# Line 268  namespace DLS { Line 268  namespace DLS {
268      Info::~Info() {      Info::~Info() {
269      }      }
270    
271        /**
272         * Forces specific Info fields to be of a fixed length when being saved
273         * to a file. By default the respective RIFF chunk of an Info field
274         * will have a size analogue to its actual string length. With this
275         * method however this behavior can be overridden, allowing to force an
276         * arbitrary fixed size individually for each Info field.
277         *
278         * This method is used as a workaround for the gig format, not for DLS.
279         *
280         * @param lengths - NULL terminated array of string_length_t elements
281         */
282        void Info::SetFixedStringLengths(const string_length_t* lengths) {
283            pFixedStringLengths = lengths;
284        }
285    
286      /** @brief Load given INFO field.      /** @brief Load given INFO field.
287       *       *
288       * Load INFO field from INFO chunk with chunk ID \a ChunkID from INFO       * Load INFO field from INFO chunk with chunk ID \a ChunkID from INFO
# Line 295  namespace DLS { Line 310  namespace DLS {
310       */       */
311      void Info::SaveString(uint32_t ChunkID, RIFF::List* lstINFO, const String& s, const String& sDefault) {      void Info::SaveString(uint32_t ChunkID, RIFF::List* lstINFO, const String& s, const String& sDefault) {
312          int size = 0;          int size = 0;
313          if (FixedStringLengths) {          if (pFixedStringLengths) {
314              for (int i = 0 ; FixedStringLengths[i].length ; i++) {              for (int i = 0 ; pFixedStringLengths[i].length ; i++) {
315                  if (FixedStringLengths[i].chunkId == ChunkID) {                  if (pFixedStringLengths[i].chunkId == ChunkID) {
316                      size = FixedStringLengths[i].length;                      size = pFixedStringLengths[i].length;
317                      break;                      break;
318                  }                  }
319              }              }
# Line 487  namespace DLS { Line 502  namespace DLS {
502              SamplerOptions = wsmp->ReadUint32();              SamplerOptions = wsmp->ReadUint32();
503              SampleLoops    = wsmp->ReadUint32();              SampleLoops    = wsmp->ReadUint32();
504          } else { // 'wsmp' chunk missing          } else { // 'wsmp' chunk missing
505              uiHeaderSize   = 0;              uiHeaderSize   = 20;
506              UnityNote      = 60;              UnityNote      = 60;
507              FineTune       = 0; // +- 0 cents              FineTune       = 0; // +- 0 cents
508              Gain           = 0; // 0 dB              Gain           = 0; // 0 dB
# Line 512  namespace DLS { Line 527  namespace DLS {
527          if (pSampleLoops) delete[] pSampleLoops;          if (pSampleLoops) delete[] pSampleLoops;
528      }      }
529    
530        void Sampler::SetGain(int32_t gain) {
531            Gain = gain;
532        }
533    
534      /**      /**
535       * Apply all sample player options to the respective RIFF chunk. You       * Apply all sample player options to the respective RIFF chunk. You
536       * have to call File::Save() to make changes persistent.       * have to call File::Save() to make changes persistent.
# Line 519  namespace DLS { Line 538  namespace DLS {
538      void Sampler::UpdateChunks() {      void Sampler::UpdateChunks() {
539          // make sure 'wsmp' chunk exists          // make sure 'wsmp' chunk exists
540          RIFF::Chunk* wsmp = pParentList->GetSubChunk(CHUNK_ID_WSMP);          RIFF::Chunk* wsmp = pParentList->GetSubChunk(CHUNK_ID_WSMP);
541            int wsmpSize = uiHeaderSize + SampleLoops * 16;
542          if (!wsmp) {          if (!wsmp) {
543              uiHeaderSize = 20;              wsmp = pParentList->AddSubChunk(CHUNK_ID_WSMP, wsmpSize);
544              wsmp = pParentList->AddSubChunk(CHUNK_ID_WSMP, uiHeaderSize + SampleLoops * 16);          } else if (wsmp->GetSize() != wsmpSize) {
545                wsmp->Resize(wsmpSize);
546          }          }
547          uint8_t* pData = (uint8_t*) wsmp->LoadChunkData();          uint8_t* pData = (uint8_t*) wsmp->LoadChunkData();
548          // update headers size          // update headers size
# Line 913  namespace DLS { Line 934  namespace DLS {
934      }      }
935    
936      /**      /**
937         * Modifies the key range of this Region and makes sure the respective
938         * chunks are in correct order.
939         *
940         * @param Low  - lower end of key range
941         * @param High - upper end of key range
942         */
943        void Region::SetKeyRange(uint16_t Low, uint16_t High) {
944            KeyRange.low  = Low;
945            KeyRange.high = High;
946    
947            // make sure regions are already loaded
948            Instrument* pInstrument = (Instrument*) GetParent();
949            if (!pInstrument->pRegions) pInstrument->LoadRegions();
950            if (!pInstrument->pRegions) return;
951    
952            // find the r which is the first one to the right of this region
953            // at its new position
954            Region* r = NULL;
955            Region* prev_region = NULL;
956            for (
957                Instrument::RegionList::iterator iter = pInstrument->pRegions->begin();
958                iter != pInstrument->pRegions->end(); iter++
959            ) {
960                if ((*iter)->KeyRange.low > this->KeyRange.low) {
961                    r = *iter;
962                    break;
963                }
964                prev_region = *iter;
965            }
966    
967            // place this region before r if it's not already there
968            if (prev_region != this) pInstrument->MoveRegion(this, r);
969        }
970    
971        /**
972       * Apply Region settings to the respective RIFF chunks. You have to       * Apply Region settings to the respective RIFF chunks. You have to
973       * call File::Save() to make changes persistent.       * call File::Save() to make changes persistent.
974       *       *

Legend:
Removed from v.1301  
changed lines
  Added in v.1416

  ViewVC Help
Powered by ViewVC