/[svn]/linuxsampler/trunk/src/engines/gig/InstrumentScriptVMFunctions.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/InstrumentScriptVMFunctions.cpp

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

revision 2611 by schoenebeck, Mon Jun 9 19:20:37 2014 UTC revision 2630 by schoenebeck, Fri Jun 13 15:01:06 2014 UTC
# Line 22  namespace LinuxSampler { namespace gig { Line 22  namespace LinuxSampler { namespace gig {
22      {      {
23      }      }
24    
25        bool InstrumentScriptVMFunction_gig_set_dim_zone::acceptsArgType(int iArg, ExprType_t type) const {
26            return type == INT_EXPR || type == INT_ARR_EXPR;
27        }
28    
29      VMFnResult* InstrumentScriptVMFunction_gig_set_dim_zone::exec(VMFnArgs* args) {      VMFnResult* InstrumentScriptVMFunction_gig_set_dim_zone::exec(VMFnArgs* args) {
30          int id   = args->arg(0)->asInt()->evalInt();          EngineChannel* pEngineChannel =
31                static_cast<EngineChannel*>(m_vm->m_event->cause.pEngineChannel);
32    
33          int dim  = args->arg(1)->asInt()->evalInt();          int dim  = args->arg(1)->asInt()->evalInt();
34          int zone = args->arg(2)->asInt()->evalInt();          int zone = args->arg(2)->asInt()->evalInt();
35    
36          if (id < 0) {          if (args->arg(0)->exprType() == INT_EXPR) {
37              wrnMsg("gig_set_dim_zone(): argument 1 may not be a negative event ID");              int id  = args->arg(0)->asInt()->evalInt();
38              return successResult();              if (id < 0) {
39          }                  wrnMsg("gig_set_dim_zone(): argument 1 may not be a negative event ID");
40                            return successResult();
41          EngineChannel* pEngineChannel =              }
             static_cast<EngineChannel*>(m_vm->m_event->cause.pEngineChannel);  
42    
43          RTList<Event>::Iterator itEvent = pEngineChannel->pEngine->EventByID(id);              RTList<Event>::Iterator itEvent = pEngineChannel->pEngine->EventByID(id);
44          if (!itEvent) {              if (!itEvent) {
45              dmsg(2,("gig_set_dim_zone(): no active event with ID %d\n", id));                  dmsg(2,("gig_set_dim_zone(): no active event with ID %d\n", id));
46              return successResult();                  return successResult();
47          }              }
48    
49          int note = itEvent->Param.Note.Key;              int note = itEvent->Param.Note.Key;
50    
51          ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note);              ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note);
52          if (!pRegion) {              if (!pRegion) {
53              dmsg(2,("gig_set_dim_zone(): no region for key %d\n", note));                  dmsg(2,("gig_set_dim_zone(): no region for key %d\n", note));
54              return successResult();                  return successResult();
55          }              }
56    
57          int idx = -1, baseBits = 0;              int idx = -1, baseBits = 0;
58          for (int i = 0; i < pRegion->Dimensions; ++i) {              for (int i = 0; i < pRegion->Dimensions; ++i) {
59              if (pRegion->pDimensionDefinitions[i].dimension == dim) {                  if (pRegion->pDimensionDefinitions[i].dimension == dim) {
60                  idx = i;                      idx = i;
61                  break;                      break;
62                    }
63                    baseBits += pRegion->pDimensionDefinitions[i].bits;
64                }
65                if (idx < 0) {
66                    dmsg(2,("gig_set_dim_zone(): no such gig dimension %d\n", dim));
67                    return successResult(); // no such dimension found
68              }              }
             baseBits += pRegion->pDimensionDefinitions[i].bits;  
         }  
         if (idx < 0) {  
             dmsg(2,("gig_set_dim_zone(): no such gig dimension %d\n", dim));  
             return successResult(); // no such dimension found  
         }  
69    
70          int bits = pRegion->pDimensionDefinitions[idx].bits;              int bits = pRegion->pDimensionDefinitions[idx].bits;
71          int mask = 0;              int mask = 0;
72          for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i));              for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i));
73    
74                itEvent->Format.Gig.DimMask |= mask;
75                itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask;
76    
77                dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits));
78            } else if (args->arg(0)->exprType() == INT_ARR_EXPR) {
79                VMIntArrayExpr* ids = args->arg(0)->asIntArray();
80                for (int i = 0; i < ids->arraySize(); ++i) {
81                    int id = ids->evalIntElement(i);
82                    if (id < 0) continue;
83    
84                    RTList<Event>::Iterator itEvent = pEngineChannel->pEngine->EventByID(id);
85                    if (!itEvent) continue;
86    
87                    int note = itEvent->Param.Note.Key;
88    
89                    ::gig::Region* pRegion = pEngineChannel->pInstrument->GetRegion(note);
90                    if (!pRegion) continue;
91    
92                    int idx = -1, baseBits = 0;
93                    for (int i = 0; i < pRegion->Dimensions; ++i) {
94                        if (pRegion->pDimensionDefinitions[i].dimension == dim) {
95                            idx = i;
96                            break;
97                        }
98                        baseBits += pRegion->pDimensionDefinitions[i].bits;
99                    }
100                    if (idx < 0) continue;
101    
102                    int bits = pRegion->pDimensionDefinitions[idx].bits;
103                    int mask = 0;
104                    for (int i = 0; i < bits; ++i) mask |= (1 << (baseBits + i));
105    
106          itEvent->Format.Gig.DimMask |= mask;                  itEvent->Format.Gig.DimMask |= mask;
107          itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask;                  itEvent->Format.Gig.DimBits |= (zone << baseBits) & mask;
108    
109          dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits));                  dmsg(3,("gig_set_dim_zone(): success, mask=%d bits=%d\n", itEvent->Format.Gig.DimMask, itEvent->Format.Gig.DimBits));
110                }
111            }
112    
113          return successResult();          return successResult();
114      }      }

Legend:
Removed from v.2611  
changed lines
  Added in v.2630

  ViewVC Help
Powered by ViewVC